#!/bin/sh # A script to do basic network configuration. # Mostly written by Patrick Volkerding . # Modified to use /etc/rc.d/rc.inet1.conf Tue Aug 26 16:51:48 PDT 2003 write_config_files() { # ############################################################################ # The rc.inet1.conf file. ############################################################################ # # If we're doing loopback, we don't want 127.0.0.1 and 255.255.255.0 in # rc.inet1.conf... it's better to leave the values null. However, since # we use the IP in other places, we need to make a copy for here. RCIPCOPY=$IPADDR RCMASKCOPY=$NETMASK if [ "$RCIPCOPY" = "127.0.0.1" ]; then RCIPCOPY="" RCMASKCOPY="" fi # echo "Creating /$RC..." /bin/cat << ENDFILE > $RC # /etc/rc.d/rc.inet1.conf # # This file contains the configuration settings for network interfaces. # If USE_DHCP[interface] is set to "yes", this overrides any other settings. # If you don't have an interface, leave the settings null (""). # You can configure network interfaces other than eth0,eth1... by setting # IFNAME[interface] to the interface's name. If IFNAME[interface] is unset # or empty, it is assumed you're configuring eth. # Several other parameters are available, the end of this file contains a # comprehensive set of examples. # ============================================================================= # Config information for eth0: IPADDR[0]="$RCIPCOPY" NETMASK[0]="$RCMASKCOPY" USE_DHCP[0]="$USE_DHCP" DHCP_HOSTNAME[0]="$DHCP_HOSTNAME" # Config information for eth1: IPADDR[1]="" NETMASK[1]="" USE_DHCP[1]="" DHCP_HOSTNAME[1]="" # Config information for eth2: IPADDR[2]="" NETMASK[2]="" USE_DHCP[2]="" DHCP_HOSTNAME[2]="" # Config information for eth3: IPADDR[3]="" NETMASK[3]="" USE_DHCP[3]="" DHCP_HOSTNAME[3]="" # Default gateway IP address: GATEWAY="$GATEWAY" # Change this to "yes" for debugging output to stdout. Unfortunately, # /sbin/hotplug seems to disable stdout so you'll only see debugging output # when rc.inet1 is called directly. DEBUG_ETH_UP="no" ## Example config information for wlan0. Uncomment the lines you need and fill ## in your info. (You may not need all of these for your wireless network) #IFNAME[4]="wlan0" #IPADDR[4]="" #NETMASK[4]="" #USE_DHCP[4]="yes" #DHCP_HOSTNAME[4]="icculus-wireless" #DHCP_KEEPRESOLV[4]="yes" #DHCP_KEEPNTP[4]="yes" #DHCP_KEEPGW[4]="yes" #DHCP_IPADDR[4]="" #WLAN_ESSID[4]=BARRIER05 #WLAN_MODE[4]=Managed ##WLAN_RATE[4]="54M auto" ##WLAN_CHANNEL[4]="auto" ##WLAN_KEY[4]="D5AD1F04ACF048EC2D0B1C80C7" ##WLAN_IWPRIV[4]="AuthMode=WPAPSK EncrypType=TKIP WPAPSK=7B1ABEEB5D197741923ED26727569C365E31212096A0EAFAD563B268BAD01CAF TxRate=0" #WLAN_WPA[4]="wpa_supplicant" #WLAN_WPADRIVER[4]="ndiswrapper" ## Some examples of additional network parameters that you can use. ## Config information for wlan0: #IFNAME[4]="wlan0" # Use a different interface name nstead of # the default 'eth4' #HWADDR[4]="00:01:23:45:67:89" # Overrule the card's hardware MAC address #MTU[4]="" # The default MTU is 1500, but you might need # 1360 when you use NAT'ed IPSec traffic. #DHCP_KEEPRESOLV[4]="yes" # If you dont want /etc/resolv.conf overwritten #DHCP_KEEPNTP[4]="yes" # If you don't want ntp.conf overwritten #DHCP_KEEPGW[4]="yes" # If you don't want the DHCP server to change # your default gateway #DHCP_IPADDR[4]="" # Request a specific IP address from the DHCP # server #WLAN_ESSID[4]=DARKSTAR # Here, you can override _any_ parameter # defined in rc.wireless.conf, by prepending # 'WLAN_' to the parameter's name. Useful for # those with multiple wireless interfaces. #WLAN_IWPRIV[4]="AuthMode=WPAPSK EncrypType=TKIP WPAPSK=thekey TxRate=0" # Some drivers require a private ioctl to be # set through the iwpriv command. If more than # one is required, you can place them in the # IWPRIV parameter (space-separated, see the # example). ENDFILE chmod 644 $RC # ############################################################################ # The networks file. ############################################################################ # #echo "Creating /$ETCNETWORKS..." /bin/cat <$ETCNETWORKS # # networks This file describes a number of netname-to-address # mappings for the TCP/IP subsystem. It is mostly # used at boot time, when no name servers are running. # loopback 127.0.0.0 localnet $NETWORK # End of networks. EOF chmod 644 $ETCNETWORKS # ############################################################################ # The hosts file. ############################################################################ # #echo "Creating /$HOSTS..." /bin/cat << EOF > $HOSTS # # hosts This file describes a number of hostname-to-address # mappings for the TCP/IP subsystem. It is mostly # used at boot time, when no name servers are running. # On small systems, this file can be used instead of a # "named" name server. Just add the names, addresses # and any aliases to this file... # # By the way, Arnt Gulbrandsen says that 127.0.0.1 # should NEVER be named with the name of the machine. It causes problems # for some (stupid) programs, irc and reputedly talk. :^) # # For loopbacking. 127.0.0.1 localhost $IPADDR $HOSTNM.$DOMAIN $HOSTNM # End of hosts. EOF chmod 644 $HOSTS # ############################################################################ # The resolv.conf file. ############################################################################ # if [ ! "$NAMESERVER" = "" ]; then echo "search $DOMAIN" >$RESOLV echo "nameserver $NAMESERVER" >>$RESOLV else echo "search $DOMAIN" >$RESOLV fi if [ -f $RESOLV ]; then chmod 644 $RESOLV fi # ############################################################################ # The rc.netdevice file. ############################################################################ # if [ -r /cardfound ]; then if [ ! "`cat /cardfound`" = "" ]; then cat << EOF > etc/rc.d/rc.netdevice # Load module for network device. # This script is automatically generated during the installation. /sbin/modprobe `cat /cardfound` EOF chmod 755 etc/rc.d/rc.netdevice fi fi rm -f $TMP/tempmsg /cardfound } # end write_config_files TMP=/var/log/setup/tmp if [ ! -d $TMP ]; then mkdir -p $TMP chmod 700 $TMP fi # This checks IP address syntax. # usage: syntax_check ADDRESS #-OF-EXPECTED-SEGMENTS (up to 4) # example: syntax_check 123.22.43.1 4 # returns: 0=found correct 1=too many fields 2=non numeric field found syntax_check_color() { RET_CODE=0 SCRATCH=$1 SCRATCH=`echo $SCRATCH | tr "." "/"` INDEX=$2 while [ ! "$INDEX" = "0" ]; do # OK, so I'm a LISP-head :^) FIELD=`basename $SCRATCH` SCRATCH=`dirname $SCRATCH` if expr $FIELD + 1 1> /dev/null 2> /dev/null; then true else RET_CODE=2; # non-numeric field fi INDEX=`expr $INDEX - 1` done if [ ! "$SCRATCH" = "." ]; then RET_CODE=1; # too many arguments fi if [ "$3" = "WARN" -a ! "$RET_CODE" = "0" ]; then cat << EOF > $TMP/tempmsg The address you have entered seems to be non-standard. We were expecting $2 groups of numbers seperated by dots, like: 127.0.0.1 Are you absolutely sure you want to use the address $1? EOF dialog --title "WARNING" --yesno "`cat $TMP/tempmsg`" 9 72 if [ $? = 0 ]; then RET_CODE = 0; fi rm -r $TMP/tempmsg else if [ "$3" = "ECHO" ]; then echo $RET_CODE; fi fi return $RET_CODE; } # Figure out where we are... cheap hack. if [ ! -e etc/slackware-version -a ! -e /etc/installer -a ! -e bin/bash ]; then cd / fi; # IMPORTANT!!! NO LEADING '/' in the paths below, or this script will not # function from the bootdisk. RC=etc/rc.d/rc.inet1.conf # Where rc.inet1.conf file is. RESOLV=etc/resolv.conf # Where resolv.conf file is. HOSTS=etc/hosts # Where hosts file is. ETCNETWORKS=etc/networks # Where networks file is. USE_DHCP="" # Use DHCP? "" == no. DHCP_HOSTNAME="" # This is our DHCP hostname. # # defaults: NETWORK=127.0.0.0 IPADDR=127.0.0.1 NETMASK=255.255.255.0 # Main loop: while [ 0 ]; do cat << EOF > $TMP/tempmsg First, we'll need the name you'd like to give your host. Only the base hostname is needed right now. (not the domain) Enter hostname: EOF dialog --title "ENTER HOSTNAME" --inputbox "`cat $TMP/tempmsg`" 11 65 \ $HOSTNM 2> $TMP/SeThost if [ $? = 1 -o $? = 255 ]; then rm -f $TMP/SeThost $TMP/tempmsg exit fi HOSTNM="`cat $TMP/SeThost`" rm -f $TMP/SeThost $TMP/tempmsg if [ ! "$HOSTNM" = "" ]; then break; fi done while [ 0 ]; do cat << EOF > $TMP/tempmsg Now, we need the domain name for this machine, such as: example.org Do not supply a leading '.' Enter domain name for $HOSTNM: EOF dialog --title "ENTER DOMAINNAME FOR '$HOSTNM'" --inputbox \ "`cat $TMP/tempmsg`" \ 14 64 $DOMAIN 2> $TMP/SeTdom if [ $? = 1 -o $? = 255 ]; then rm -f $TMP/SeTdom $TMP/tempmsg exit fi DOMAIN="`cat $TMP/SeTdom`" rm -f $TMP/SeTdom $TMP/tempmsg if [ ! "$DOMAIN" = "" ]; then break; fi done echo $HOSTNM.$DOMAIN > etc/HOSTNAME dialog --title "SETUP IP ADDRESS FOR '$HOSTNM.$DOMAIN'" \ --default-item DHCP \ --menu \ "Now we need to know how your machine connects to the network.\n\ If you have an internal network card and an assigned IP address, gateway, \ and DNS, use the 'static IP' choice to enter these values. If your IP \ address is assigned by a DHCP server (commonly used by cable modem and DSL \ services), select 'DHCP'. If you do not have a network card, select \ the 'loopback' choice. 'loopback' is also the correct choice if your \ only connection to the network will be through a serial modem \ (with SLIP or PPP), or if you are using a laptop network card (these \ are configured in /etc/pcmcia/). What type of network connection \ best describes your machine?" 20 70 3 \ "static IP" "Use a static IP address to configure ethernet" \ "DHCP" "Use a DHCP server to configure ethernet" \ "loopback" "Set up a loopback connection (modem or no net)" 2> $TMP/reply if [ $? = 1 -o $? = 255 ]; then rm -f $TMP/reply exit fi REPLY=`cat $TMP/reply` rm -f $TMP/reply if [ "$REPLY" = "DHCP" ]; then USE_DHCP="yes" dialog --title "SET DHCP HOSTNAME" --inputbox "Some network providers require \ that the DHCP hostname be set in order to connect. If so, they'll have assigned \ a hostname to your machine, which may look something like CC-NUMBER-A (this \ depends on your ISP). If you were assigned a DHCP hostname, please enter it \ below. If you do not have a DHCP hostname, just hit ENTER or Cancel." 13 62 \ 2> $TMP/SeTDHCPHOST NEW_DHCPHOST="`cat $TMP/SeTDHCPHOST`" rm -f $TMP/SeTDHCPHOST # OK, if we actually got something, use it. DHCP_HOSTNAME="$NEW_DHCPHOST" elif [ "$REPLY" = "loopback" ]; then LOOPBACK="yes" else LOOPBACK="no" fi if [ "$LOOPBACK" = "no" -a ! "$USE_DHCP" = "yes" ]; then while [ 0 ]; do if [ -r $TMP/SeTIP ]; then IPADDR=`cat $TMP/SeTIP` fi cat << EOF > $TMP/tempmsg Enter your IP address for the local machine. Example: 111.112.113.114 Enter IP address for $HOSTNM (aaa.bbb.ccc.ddd): EOF dialog --title "ENTER IP ADDRESS FOR '$HOSTNM.$DOMAIN'" --inputbox \ "`cat $TMP/tempmsg`" \ 10 68 $IPADDR 2> $TMP/SeTlip if [ $? = 1 -o $? = 255 ]; then rm -f $TMP/SeTlip $TMP/tempmsg exit fi IPADDR="`cat $TMP/SeTlip`" rm -f $TMP/SeTlip $TMP/tempmsg if [ "$IPADDR" = "" ]; then continue; fi syntax_check_color $IPADDR 4 WARN if [ $? = 0 ]; then echo $IPADDR > $TMP/SeTIP break; fi done while [ 0 ]; do if [ -r $TMP/SeTnetmask ]; then NETMASK=`cat $TMP/SeTnetmask` fi cat << EOF > $TMP/tempmsg Enter your netmask. This will generally look something like this: 255.255.255.0 Enter netmask (aaa.bbb.ccc.ddd): EOF dialog --title "ENTER NETMASK FOR LOCAL NETWORK" --inputbox \ "`cat $TMP/tempmsg`" \ 10 65 $NETMASK 2> $TMP/SeTnmask if [ $? = 1 -o $? = 255 ]; then rm -f $TMP/SeTnmask $TMP/tempmsg exit fi NETMASK="`cat $TMP/SeTnmask`" rm -f $TMP/SeTnmask $TMP/tempmsg if [ "$NETMASK" = "" ]; then continue; fi syntax_check_color $NETMASK 4 WARN if [ $? = 0 ]; then echo $NETMASK > $TMP/SeTnetmask break; fi done # Set broadcast/network addresses automatically: BROADCAST=`ipmask $NETMASK $IPADDR | cut -f 1 -d ' '` NETWORK=`ipmask $NETMASK $IPADDR | cut -f 2 -d ' '` while [ 0 ]; do if [ -r $TMP/SeTgateway ]; then GATEWAY=`cat $TMP/SeTgateway` fi cat << EOF > $TMP/tempmsg Enter the address for the gateway on your network, such as: `echo $IPADDR | cut -f 1-3 -d .`.1 If you don't have a gateway on your network just hit ENTER without entering a gateway IP address. Enter gateway address (aaa.bbb.ccc.ddd): EOF dialog --title "ENTER GATEWAY ADDRESS" --inputbox "`cat $TMP/tempmsg`" \ 14 64 $GATEWAY 2> $TMP/SeTgate if [ $? = 1 -o $? = 255 ]; then rm -f $TMP/SeTgate $TMP/tempmsg exit fi GATEWAY="`cat $TMP/SeTgate`" rm -f $TMP/SeTgate $TMP/tempmsg if [ "$GATEWAY" = "" ]; then echo > $TMP/SeTgateway break; fi syntax_check_color $GATEWAY 4 WARN if [ $? = 0 ]; then echo $GATEWAY > $TMP/SeTgateway break; fi done fi if [ "$LOOPBACK" = "no" ]; then dialog --title "USE A NAMESERVER?" --yesno "Will you be accessing a \ nameserver?" 5 42 if [ $? = 0 ]; then if [ ! "`cat $TMP/SeTns 2> /dev/null`" = "" ]; then DNSSAMPLE="`cat $TMP/SeTns 2> /dev/null`" elif [ "$GATEWAY" = "" ]; then DNSSAMPLE=`echo $IPADDR | cut -f 1-3 -d .` else DNSSAMPLE=$GATEWAY fi while [ "$NAMESERVER" = "" ]; do cat << EOF > $TMP/tempmsg Here is your current IP address, full hostname, and base hostname: $IPADDR $HOSTNM.$DOMAIN $HOSTNM Please give the IP address of the name server to use, such as $DNSSAMPLE. You can add more Domain Name Servers later by editing /$RESOLV. Primary name server to use (aaa.bbb.ccc.ddd): EOF dialog --title "SELECT NAMESERVER" --inputbox \ "`cat $TMP/tempmsg`" 17 72 $DNSSAMPLE 2> $TMP/SeTns if [ $? = 1 -o $? = 255 ]; then rm -f $TMP/tempmsg $TMP/SeTns break fi NAMESERVER="`cat $TMP/SeTns`" rm -f $TMP/tempmsg $TMP/SeTns done fi fi # Check for existing network driver: unset DONOTPROBE if cat /proc/net/dev | grep eth0 1> /dev/null 2> /dev/null ; then DONOTPROBE=true fi # Really, this rc.netdevice thing is mostly obsolete except for # handmade local scripts anyway, these days with udev... # So, we'll skip it: DONOTPROBE=true if [ -d lib/modules/`uname -r` \ -a ! "$LOOPBACK" = "yes" \ -a ! -x etc/rc.d/rc.hotplug \ -a ! "$DONOTPROBE" = "true" \ -a ! -r /cardfound ]; then dialog --title "PROBE FOR NETWORK CARD?" --menu "If you like, we \ can look to see what kind of network card you have in your machine, and \ if we find one create an /etc/rc.d/rc.netdevice script to load the module \ for it at boot time. There's a slight bit of danger that the probing \ can cause problems, but it almost always works. If you'd rather configure \ your system manually, you can skip the probing process and edit \ /etc/rc.d/rc.modules or /etc/modules.conf later to have it load the right module." \ 16 68 2 \ "probe" "look for network cards to set up" \ "skip" "skip probe; edit /etc/rc.d/rc.modules later" 2> $TMP/reply if [ $? = 1 -o $? = 255 ]; then rm -f $TMP/reply exit fi REPLY=`cat $TMP/reply` rm -f $TMP/reply if [ ! "$REPLY" = "skip" ]; then for card in 3c59x 82596 dgrs eepro100 e1000 epic100 hp100 lance \ ne2k-pci olympic pcnet32 rcpci 8139too 8139cp tlan tulip via-rhine \ yellowfin natsemi ; do chroot . /sbin/modprobe $card 2> /dev/null if [ $? = 0 ]; then dialog --title "CARD DETECTED" --msgbox "A networking card using \ the $card.o module has been detected." 5 72 echo "$card" > /cardfound break; fi done if [ ! -r /cardfound ]; then # Don't probe for com20020, because it doesn't check and will always load. # Don't probe for arlan, because it needs irq= to work. # Don't probe for com90io or com90xx because they taint the kernel. for card in depca ibmtr 3c359 3c501 3c503 3c505 3c507 3c509 3c515 ac3200 \ abyss acenic at1700 cosa cs89x0 de4x5 de600 \ de620 dmfe dl2k e2100 eepro eexpress eth16i ewrk3 fealnx hamachi hostess_sv11 \ hp-plus hp lanstreamer ni5010 ni52 ni65 ns83820 sb1000 sealevel sis900 sk98lin skfp smc-ultra \ smc9194 smctr starfire sungem sunhme tg3 wd e100 iph5526 lp486e tmspci winbond-840 ; do chroot . /sbin/modprobe $card 2> /dev/null if [ $? = 0 ]; then dialog --title "CARD DETECTED" --msgbox "A networking card using \ the $card.o module has been detected." 5 72 echo "$card" > /cardfound break fi done fi if [ ! -r /cardfound ]; then dialog --title "NO CARD DETECTED" --msgbox "Sorry, but no network \ card could be probed for on your system. Some cards (like non-PCI NE2000s) \ must be supplied with the I/O address to use and can't be probed for safely. \ You'll have to try to configure the card later by editing \ /etc/rc.d/rc.modules or recompiling your kernel." 9 70 fi fi fi if [ "$LOOPBACK" = "yes" ]; then dialog --title "NETWORK SETUP COMPLETE" --yesno "Your networking \ system is now configured to use loopback: IP address: 127.0.0.1 Netmask: 255.255.255.0 Is this correct? Press 'Yes' to continue, or 'No' to reconfigure." 0 0 RETVAL=$? elif [ "$USE_DHCP" = "" ]; then while [ 0 ]; do dialog --title "CONFIRM NETWORK SETUP" \ --ok-label Accept \ --extra-label Edit \ --cancel-label Restart \ --inputmenu \ "These are the settings you have entered. To accept them and complete \ the networking setup, press enter. If you need to make any changes, you \ can do that now (or reconfigure later using 'netconfig')." \ 22 60 12 \ "Hostname:" "$HOSTNM" \ "Domain name:" "$DOMAIN" \ "IP address:" "$IPADDR" \ "Netmask:" "$NETMASK" \ "Gateway:" "$GATEWAY" \ "Nameserver:" "$NAMESERVER" 2> $TMP/tempmsg RETVAL=$? if [ "$RETVAL" = "3" ]; then FIELD=`cat $TMP/tempmsg | cut -f 1 -d : | cut -f 2- -d ' '` NEWVAL=`cat $TMP/tempmsg | cut -f 2 -d : | cut -f 2- -d ' '` if [ "$FIELD" = "Hostname" ]; then HOSTNM=$NEWVAL elif [ "$FIELD" = "Domain name" ]; then DOMAIN=$NEWVAL elif [ "$FIELD" = "IP address" ]; then IPADDR=$NEWVAL elif [ "$FIELD" = "Netmask" ]; then NETMASK=$NEWVAL elif [ "$FIELD" = "Gateway" ]; then GATEWAY=$NEWVAL elif [ "$FIELD" = "Nameserver" ]; then NAMESERVER=$NEWVAL fi else break fi done else # DHCP was used dialog --title "CONFIRM SETUP COMPLETE" \ --yesno "Your networking system is now configured to use DHCP: Hostname: $HOSTNM Domain name: $DOMAIN IP address: (use DHCP server) Netmask: (use DHCP server) Gateway: (use DHCP server) Nameserver: (use DHCP server) Is this correct? Press 'Yes' to continue, or 'No' to reconfigure." 0 0 RETVAL=$? fi if [ "$RETVAL" = "0" ]; then echo $HOSTNM.$DOMAIN > etc/HOSTNAME write_config_files if [ "$1" = "" ]; then dialog --msgbox "Settings accepted. Basic network configuration is complete." 6 40 fi else if [ "$1" = "" ]; then dialog --msgbox "Settings discarded. Run the 'netconfig' command again if you need to reconfigure your network settings." 6 60 fi fi exit $RETVAL