diff options
Diffstat (limited to 'source/installer/sources/initrd/usr/lib/setup/SeTnet')
-rwxr-xr-x | source/installer/sources/initrd/usr/lib/setup/SeTnet | 360 |
1 files changed, 360 insertions, 0 deletions
diff --git a/source/installer/sources/initrd/usr/lib/setup/SeTnet b/source/installer/sources/initrd/usr/lib/setup/SeTnet new file mode 100755 index 00000000..0caefa64 --- /dev/null +++ b/source/installer/sources/initrd/usr/lib/setup/SeTnet @@ -0,0 +1,360 @@ +#!/bin/sh +# This script will be called with the single argument of "boot" during the +# system startup, to allow for unattended network configuration. +# For this to work, all required information must be passed on the commandline. +# Two parameters, 'kbd=' and 'nic=' must be used to supply this information. +# kbd=<keyboard_layout> +# nic=<driver>:<interface>:<dhcp|static>[:ipaddr:netmask[:gateway]] + +TMP=/var/log/setup/tmp +T_PX="$(cat $TMP/SeTT_PX 2> /dev/null)" +if [ ! -d $TMP ]; then + mkdir -p $TMP +fi + +# Terminate the script now if we have an interface with an IP address: +# Running the script is not needed anymore in that case. +if `ip -f inet -o addr show | grep -v " lo " 1>/dev/null 2>/dev/null` ; then + exit 0 +fi + +# Function to convert the netmask from CIDR format to dot notation. +cidr_cvt() { + inform=$1 + if [ $inform -ge 32 ]; then outform='255.255.255.255' + elif [ $inform -ge 31 ]; then outform='255.255.255.254' + elif [ $inform -ge 30 ]; then outform='255.255.255.252' + elif [ $inform -ge 29 ]; then outform='255.255.255.248' + elif [ $inform -ge 28 ]; then outform='255.255.255.240' + elif [ $inform -ge 27 ]; then outform='255.255.255.224' + elif [ $inform -ge 26 ]; then outform='255.255.255.192' + elif [ $inform -ge 25 ]; then outform='255.255.255.128' + elif [ $inform -ge 24 ]; then outform='255.255.255.0' + elif [ $inform -ge 23 ]; then outform='255.255.254.0' + elif [ $inform -ge 22 ]; then outform='255.255.252.0' + elif [ $inform -ge 21 ]; then outform='255.255.248.0' + elif [ $inform -ge 20 ]; then outform='255.255.240.0' + elif [ $inform -ge 19 ]; then outform='255.255.224.0' + elif [ $inform -ge 18 ]; then outform='255.255.192.0' + elif [ $inform -ge 17 ]; then outform='255.255.128.0' + elif [ $inform -ge 16 ]; then outform='255.255.0.0' + elif [ $inform -ge 15 ]; then outform='255.254.0.0' + elif [ $inform -ge 14 ]; then outform='255.252.0.0' + elif [ $inform -ge 13 ]; then outform='255.248.0.0' + elif [ $inform -ge 12 ]; then outform='255.240.0.0' + elif [ $inform -ge 11 ]; then outform='255.224.0.0' + elif [ $inform -ge 10 ]; then outform='255.192.0.0' + elif [ $inform -ge 9 ]; then outform='255.128.0.0' + elif [ $inform -ge 8 ]; then outform='255.0.0.0' + elif [ $inform -ge 7 ]; then outform='254.0.0.0' + elif [ $inform -ge 6 ]; then outform='252.0.0.0' + elif [ $inform -ge 5 ]; then outform='248.0.0.0' + elif [ $inform -ge 4 ]; then outform='240.0.0.0' + elif [ $inform -ge 3 ]; then outform='224.0.0.0' + elif [ $inform -ge 2 ]; then outform='192.0.0.0' + elif [ $inform -ge 1 ]; then outform='128.0.0.0' + elif [ $inform -ge 0 ]; then outform='0.0.0.0' + fi + echo $outform +} + +# First, sane defaults: +INTERFACE="" +ENET_MODE="ask" +# Does the commandline have NIC information for us? +# Format is 'nic=driver:interface:<dhcp|static>:ip:mask:gw' +for CMDELEM in $(cat /proc/cmdline) ; do + if $(echo $CMDELEM | grep -q "^nic=") ; then + DRIVER=$(echo $CMDELEM | cut -f2 -d=) + INTERFACE=$(echo $DRIVER | cut -f2 -d:) + ENET_MODE=$(echo $DRIVER | cut -f3 -d:) + if [ "$ENET_MODE" = "static" ]; then + IPADDR=$(echo $DRIVER | cut -f4 -d:) + NETMASK=$(echo $DRIVER | cut -f5 -d:) + # We allow for CIDR notation of the netmask (0 < NETMASK < 25): + if [ "$(echo $NETMASK | tr -cd '\.')" != "..." ]; then + NETMASK=$(cidr_cvt $NETMASK) + fi + GATEWAY=$(echo $DRIVER | cut -f6 -d:) + fi + DRIVER=$(echo $DRIVER | cut -f1 -d:) + break + fi +done + +# If the script has an argument of 'boot' then we require all information for +# unattended network setup or else we silently exit. +if [ "$1" = "boot" ]; then + if [ "x$DRIVER" = "x" -o "x$INTERFACE" = "x" -o "$ENET_MODE" = "ask" ]; then + exit 2 + elif [ "$ENET_MODE" = "static" ] && [ "x$IPADDR" = "x" -o "x$NETMASK" = "x" ]; then + exit 2 + fi +fi + +# If the cmdline provided the name of a driver, load it; +# Alternatively check if the user ran "network" before running "setup"; +# We need an interface: +if [ `cat /proc/net/dev | grep ':' | sed -e "s/^ *//" | cut -f1 -d: | grep -v lo | wc -l` = 0 ]; then + if [ "x${DRIVER}" != "x" ]; then + # This takes silent care of 'DRIVER=auto' as well... + modprobe ${DRIVER} 1>/dev/null 2>/dev/null + else + while [ 0 ]; do + cat << EOF > $TMP/tempmsg + +You will now get a chance to probe your network interfaces. + +EOF + dialog --title "PROBING NETWORK DEVICES" --msgbox "`cat $TMP/tempmsg`" 7 68 + clear + rm -f $TMP/tempmsg + /bin/network --installer + read -p "Press any key..." JUNK + sleep 5 # Give dhcpcd a change to probe + unset JUNK + cat << EOF > $TMP/tempmsg + +Are you OK with the network interface which was detected? +If not, select 'No' to get back to the network probe program. +You can try to load another driver explicitly, +by using "P <driver_name>". + +If you are satisfied, select 'Yes' to continue with network configuration. +EOF + dialog --title "PROBING NETWORK DEVICES" --yesno "`cat $TMP/tempmsg`" 12 68 + if [ $? = 0 ]; then + rm -f $TMP/tempmsg + break + fi + clear + done + fi +fi + +# If we obtained information from a DHCP server, use it: +if [ "x$INTERFACE" = "x" -o "$INTERFACE" = "auto" ]; then + # the cmdline did not provide a nic or it's "auto" to let dhcpcd find out: + if [ "$INTERFACE" = "auto" ]; then + # hope that 3 seconds is enough for dhcpcd; + # if not then you had better specify the INTERFACE in the nic= parameter... + dialog --title "INITIALIZING NETWORK" --infobox \ + "\nWaiting a few seconds for DHCP polling to settle ..." 5 56 + sleep 3 + fi + clear + for I_I in \ + $(cat /proc/net/dev | grep ':' | sed -e "s/^ *//" | cut -f1 -d: | grep -v lo) ; + do + if [ -s /etc/dhcpc/dhcpcd-${I_I}.info ]; then + INTERFACE="${I_I}" + break + fi + done + unset I_I + if [ "$INTERFACE" = "auto" ]; then # failed to find a configured interface + INTERFACE="" + fi +fi + +while [ 0 ]; do + T_PX="$(cat $TMP/SeTT_PX 2> /dev/null)" + UPNRUN=1 + if [ "$T_PX" = "/" ]; then + cat << EOF > $TMP/tempmsg + +You're running off the hard drive filesystem. Is this machine +currently running on the network you plan to install from? If +so, we won't try to reconfigure your ethernet card. + +Are you up-and-running on the network? +EOF + dialog --title "NETWORK CONFIGURATION" --yesno "`cat $TMP/tempmsg`" 12 68 + UPNRUN=$? + clear + fi + if [ $UPNRUN = 1 ]; then + ENET_DEVICE=${INTERFACE:-"eth0"} + if [ "x$INTERFACE" != "x" ]; then # interface specified via cmdline or dhcpcd + if [ "$ENET_MODE" = "ask" ]; then + # Offer to install using DHCP: + cat << EOF > $TMP/tempmsg + +I can configure your network interface $ENET_DEVICE +fully automatically using DHCP. +If you want this, please select 'yes'. + +If you select 'no' instead, then you will be able to assign +the IP address, netmask and gateway manually. + +EOF + dialog --title "DHCP CONFIGURATION" --yesno "`cat $TMP/tempmsg`" 12 65 + if [ $? -eq 0 ]; then + rm -f $TMP/tempmsg + echo $ENET_DEVICE > $TMP/SeTdhcp + else + rm -f $TMP/SeTdhcp + fi + elif [ "$ENET_MODE" = "dhcp" ]; then # Don't ask, just use DHCP + echo $ENET_DEVICE > $TMP/SeTdhcp + fi + fi # End non-empty INTERFACE + clear + + if [ ! -r $TMP/SeTdhcp ]; then + # No DHCP configured, so use static IP. + # If we have all the values ready, don't ask any. + # Only if the script runs with the "boot" parameter will we silently accept + # an empty gateway address (if we came this far, we will have IP/netmask): + if [ "$1" = "boot" -a "x$GATEWAY" = "x" ]; then + HAVE_GATEWAY=1 + GATEWAY="unspec" + else + HAVE_GATEWAY=0 + fi + if [ "x$IPADDR" = "x" -o "x$NETMASK" = "x" -o "x$GATEWAY" = "x" ]; then + cat << EOF > $TMP/tempmsg + +You will need to enter the IP address you wish to +assign to this machine. Example: 111.112.113.114 + +What is your IP address? +EOF + if [ "$LOCAL_IPADDR" = "" ]; then # assign default + LOCAL_IPADDR=${IPADDR} + fi + dialog --title "ASSIGN IP ADDRESS" --inputbox "`cat $TMP/tempmsg`" 12 \ + 65 $LOCAL_IPADDR 2> $TMP/local + if [ ! $? = 0 ]; then + rm -f $TMP/tempmsg $TMP/local + exit + fi + LOCAL_IPADDR="`cat $TMP/local`" + rm -f $TMP/local + clear + cat << EOF > $TMP/tempmsg + +Now we need to know your netmask. +Typically this will be 255.255.255.0 +but this can be different depending on +your local setup. + +What is your netmask? +EOF + if [ "$LOCAL_NETMASK" = "" ]; then # assign default + LOCAL_NETMASK=${NETMASK:-255.255.255.0} + fi + dialog --title "ASSIGN NETMASK" --inputbox "`cat $TMP/tempmsg`" 14 \ + 65 $LOCAL_NETMASK 2> $TMP/mask + if [ ! $? = 0 ]; then + rm -f $TMP/tempmsg $TMP/mask + exit + fi + clear + LOCAL_NETMASK="`cat $TMP/mask`" + rm $TMP/mask + dialog --yesno "Do you have a gateway?" 5 30 + HAVE_GATEWAY=$? + clear + if [ "$HAVE_GATEWAY" = "0" ]; then + if [ "$LOCAL_GATEWAY" = "" ]; then + if [ "$GATEWAY" = "" ]; then + LOCAL_GATEWAY="`echo $LOCAL_IPADDR | cut -f1-3 -d '.'`." + else + LOCAL_GATEWAY=${GATEWAY} + fi + fi + dialog --title "ASSIGN GATEWAY ADDRESS" --inputbox \ + "\nWhat is the IP address for your gateway?" 9 65 \ + $LOCAL_GATEWAY 2> $TMP/gw + if [ ! $? = 0 ]; then + rm -f $TMP/tempmsg $TMP/gw + exit + fi + LOCAL_GATEWAY="`cat $TMP/gw`" + rm -f $TMP/gw + fi + clear + else + # Non-interactive run, so we use the values set on the commandline: + LOCAL_IPADDR=${IPADDR} + LOCAL_NETMASK=${NETMASK} + LOCAL_GATEWAY=${GATEWAY} + fi # end questions asked + fi # end static ip + + if [ "$ENET_MODE" = "ask" -a ! -r $TMP/SeTdhcp ]; then + cat << EOF > $TMP/tempmsg + +This is the proposed network configuration for $ENET_DEVICE - +If this is OK, then select 'Yes'. +If this is not OK and you want to configure again, select 'No'. + +* IP Address: $LOCAL_IPADDR +* Netmask: $LOCAL_NETMASK +EOF + if [ "$HAVE_GATEWAY" = 0 ]; then + echo "* Gateway: $LOCAL_GATEWAY" >> $TMP/tempmsg + fi + echo "" >> $TMP/tempmsg + dialog --no-collapse --title "NETWORK CONFIGURATION" --yesno "`cat $TMP/tempmsg`" 14 68 + if [ $? -eq 1 ]; then + continue # New round of questions + fi + fi # end ask approval for ip config + + #echo "Configuring ethernet card..." + dialog --title "INITIALIZING NETWORK" --infobox \ + "\nConfiguring your network interface $ENET_DEVICE ..." 5 56 + if [ -r $TMP/SeTdhcp ]; then + dhcpcd -k $ENET_DEVICE 1>/dev/null 2>&1 # Or else the '-T' will be used next: + sleep 3 + dhcpcd -L $ENET_DEVICE + else + dhcpcd -k $ENET_DEVICE 1>/dev/null 2>&1 # We don't need it now + # Broadcast and network are derived from IP and netmask: + LOCAL_BROADCAST=`ipmask $LOCAL_NETMASK $LOCAL_IPADDR | cut -f 1 -d ' '` + LOCAL_NETWORK=`ipmask $LOCAL_NETMASK $LOCAL_IPADDR | cut -f 2 -d ' '` + ifconfig $ENET_DEVICE $LOCAL_IPADDR netmask $LOCAL_NETMASK broadcast $LOCAL_BROADCAST + if [ "$HAVE_GATEWAY" = "0" ]; then + #echo "Configuring your gateway..." + route add default gw $LOCAL_GATEWAY metric 1 + fi + echo $LOCAL_IPADDR > $TMP/SeTIP + echo $LOCAL_NETMASK > $TMP/SeTnetmask + echo $LOCAL_GATEWAY > $TMP/SeTgateway + fi + fi # ! UPNRUN + clear + break + +done +echo $UPNRUN > $TMP/SeTupnrun + +# Basic initialisation completed. Let's see what the commandline has for us: +# If we know of a remote configuration file, get it now: +# Provide comma-separated values (protocol,remoteserver[:portnumber],configfile) +# like this example: 'cf=tftp,192.168.0.22,/slackware-12.1/configs/t43.cfg' +for CMDELEM in $(cat /proc/cmdline) ; do + if $(echo $CMDELEM | grep -q "^cf=") ; then + CONFIGFILE=$(echo $CMDELEM | cut -f2 -d=) + PROTO=$(echo $CONFIGFILE | cut -f1 -d,) + DLSERVER=$(echo $CONFIGFILE | cut -f2 -d,) + CONFIGFILE=$(echo $CONFIGFILE | cut -f3 -d,) + dialog --title "FETCHING CONFIGURATION" --infobox \ + "\nAttempting to fetch a remote configuration file using $PROTO ..." 54 56 + fi +done + +if [ -n "$CONFIGFILE" ]; then + if [ "$PROTO" = "tftp" ]; then + tftp -g -r $CONFIGFILE -l $TMP/Punattended $DLSERVER 1>/dev/null 2>&1 + elif [ "$PROTO" = "ftp" -o "$PROTO" = "http" ]; then + wget -q -P $TMP -O Punattended ${PROTO}://${DLSERVER}${CONFIGFILE} + fi +fi + +# Clear the screen, since it looks pretty messy due to some fun with the termcap +# over a serial console. +clear + |