Support multiple devices (both manually as well as automatically) and timeout option...
authorMichael Prokop <mika@grml.org>
Tue, 29 Dec 2009 01:22:16 +0000 (02:22 +0100)
committerMichael Prokop <mika@grml.org>
Tue, 29 Dec 2009 21:04:45 +0000 (22:04 +0100)
debian/patches/10_support_ethdevice.dpatch

index 139f2b6..3e51781 100755 (executable)
@@ -2,23 +2,90 @@
 ## 10_support_ethdevice.dpatch by <mika@grml.org>
 ##
 ## All lines beginning with `## DP:' are a description of the patch.
-## DP: Support bootoption ethdevice
+## DP: Support bootoptions ethdevice and ethdevice-timeout for
+## DP: specifying from which device you want to boot from and
+## DP: using which timeout (being 30 seconds if unconfigured), if
+## DP: ethdevice is not specified try to get a working network
+## DP: configuration for each existing network device.
 
 @DPATCH@
-
-diff --git a/scripts/live b/scripts/live
-index db1d355..797a5da 100755
---- a/scripts/live
-+++ b/scripts/live
-@@ -66,6 +66,11 @@ Arguments ()
+diff -urNad live-initramfs-grml~/scripts/live live-initramfs-grml/scripts/live
+--- live-initramfs-grml~/scripts/live  2009-12-29 22:00:53.858638095 +0100
++++ live-initramfs-grml/scripts/live   2009-12-29 22:04:16.588656569 +0100
+@@ -66,6 +66,16 @@
                                set -x
                                ;;
  
 +                      ethdevice=*)
-+                              DEVICE="${ARGUMENT#ethdevice=}"
-+                              export DEVICE
++                              ETHDEVICE="${ARGUMENT#ethdevice=}"
++                              export ETHDEVICE
++                              ;;
++
++                      ethdevice-timeout=*)
++                              ETHDEV_TIMEOUT="${ARGUMENT#ethdevice-timeout=}"
++                              export ETHDEV_TIMEOUT
 +                              ;;
 +
                        fetch=*)
                                  FETCH="${ARGUMENT#fetch=}"
                                  export FETCH
+@@ -739,7 +749,48 @@
+               udevsettle
+       fi
+-      ipconfig ${DEVICE} | tee /netboot.config
++      # if ethdevice was not specified on the kernel command line
++      # make sure we try to get a working network configuration
++      # for *every* present network device (except for loopback of course)
++      if [ -z "$ETHDEVICE" ] ; then
++              echo "If you want to boot from a specific device use bootoption ethdevice=..."
++              for device in /sys/class/net/*; do
++                      dev=${device##*/} ;
++                      if [ "$dev" != "lo" ] ; then
++                              ETHDEVICE="$ETHDEVICE $dev"
++                      fi
++              done
++      fi
++
++      # split args of ethdevice=eth0,eth1 into "eth0 eth1"
++      for device in $(echo $ETHDEVICE | sed 's/,/ /g') ; do
++              devlist="$devlist $device"
++      done
++
++      [ -n "$ETHDEV_TIMEOUT" ] || ETHDEV_TIMEOUT=15
++      echo "Using timeout of $ETHDEV_TIMEOUT seconds for network configuration."
++
++      # this is tricky (and ugly) because ipconfig sometimes just hangs/runs into
++      # an endless loop; iff execution fails give it two further tries, that's
++      # why we use '$devlist $devlist $devlist' for the other for loop
++      for dev in $devlist $devlist $devlist ; do
++              echo "Executing ipconfig -t $ETHDEV_TIMEOUT $dev"
++              ipconfig -t "$ETHDEV_TIMEOUT" $dev | tee -a /netboot.config &
++              jobid=$!
++              sleep "$ETHDEV_TIMEOUT" ; sleep 1
++              if [ -r /proc/"$jobid"/status ] ; then
++                      echo "Killing job $jobid for device $dev as ipconfig ran into recursioni..."
++                      kill -9 $jobid
++              fi
++
++              # if configuration of device worked we should have an assigned
++              # IP address, iff so let's use the according as $DEVICE for later usage
++              # simple and primitive approach which seems to work fine
++              if ifconfig $dev | grep -q 'inet.*addr:' ; then
++                      export DEVICE="$dev"
++                      break
++              fi
++      done
+       # source relevant ipconfig output
+       OLDHOSTNAME=${HOSTNAME}
+@@ -748,7 +799,8 @@
+       export HOSTNAME
+       # Check if we have a network device at all
+-      if ! ls /sys/class/net/eth0 > /dev/null 2>&1 && \
++      if ! ls /sys/class/net/"$DEVICE" > /dev/null 2>&1 && \
++         ! ls /sys/class/net/eth0 > /dev/null 2>&1 && \
+          ! ls /sys/class/net/wlan0 > /dev/null 2>&1 && \
+          ! ls /sys/class/net/ath0 > /dev/null 2>&1 && \
+          ! ls /sys/class/net/ra0 > /dev/null 2>&1