summaryrefslogblamecommitdiffstats
path: root/source/installer/sources/initrd/usr/lib/setup/SeTnet
blob: 0caefa64ed1d295f00d71d07478d6b87ee1c74d4 (plain) (tree)







































































































































































































































































































































































                                                                                                     
#!/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