Use quilt instead of dpatch
[live-boot-grml.git] / debian / patches / 27_support_static_ip.patch
diff --git a/debian/patches/27_support_static_ip.patch b/debian/patches/27_support_static_ip.patch
new file mode 100755 (executable)
index 0000000..f08e133
--- /dev/null
@@ -0,0 +1,165 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 27_support_staticip.dpatch by  <mru@grml.org>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: No description.
+
+@DPATCH@
+
+diff --git a/scripts/live b/scripts/live
+index 5681362..bf20cce 100755
+--- a/scripts/live
++++ b/scripts/live
+@@ -91,9 +91,8 @@ Arguments ()
+                               ;;
+
+                       ethdevice=*)
+-                              DEVICE="${ARGUMENT#ethdevice=}"
+-                              ETHDEVICE="${DEVICE}"
+-                              export DEVICE ETHDEVICE
++                              ETHDEVICE="${ARGUMENT#ethdevice=}"
++                              export ETHDEVICE
+                               ;;
+
+                       ethdevice-timeout=*)
+@@ -150,13 +149,9 @@ Arguments ()
+                               ;;
+
+                       ip=*)
+-                              STATICIP="${ARGUMENT#ip=}"
+-
+-                              if [ -z "${STATICIP}" ]
+-                              then
+-                                      STATICIP="frommedia"
+-                              fi
+-
++                              # copy complete ip=args into staticip, and
++                              # keep multiple uses.
++                              STATICIP="${STATICIP} ${ARGUMENT}"
+                               export STATICIP
+                               ;;
+
+@@ -598,6 +593,24 @@ copy_live_to ()
+       return 0
+ }
+
++get_ipconfig_para()
++{
++      if [ $# != 1 ] ; then
++              echo "Missin parameter for $0"
++              return
++      fi
++      devname=$1
++      for ip in ${STATICIP} ; do
++              case $ip in
++                      *:$devname:*)
++                      echo $ip
++                      return
++                      ;;
++              esac
++      done
++      echo $devname
++}
++
+ do_netsetup ()
+ {
+       modprobe -q af_packet # For DHCP
+@@ -608,9 +621,19 @@ do_netsetup ()
+       [ -n "$ETHDEV_TIMEOUT" ] || ETHDEV_TIMEOUT=15
+       echo "Using timeout of $ETHDEV_TIMEOUT seconds for network configuration."
+
+-      if [ -z "${NETBOOT}" ] && [ -z "${FETCH}" ] && \
+-         [ -z "${HTTPFS}" ] && [ -z "${FTPFS}" ]
+-      then
++      # Our modus operandi for getting a working network setup is this:
++      # * If ip=* is set, pass that to ipconfig and be done
++      # * Else, try dhcp on all devices in this order:
++      #   ethdevice= bootif= <all interfaces>
++
++      ALLDEVICES="$(cd /sys/class/net/ && ls -1 2>/dev/null | grep -v '^lo$' )"
++
++      # Turn on all interfaces before doing anything, to avoid timing problems
++      # during link negotiation.
++      echo "Net: Turning on all device links..."
++      for device in ${ALLDEVICES}; do
++              ipconfig -c none -d $device -t 1 2>/dev/null >/dev/null
++      done
+
+
+       # support for Syslinux IPAPPEND parameter
+@@ -653,7 +676,7 @@ do_netsetup ()
+
+                               if [ "$bootif_mac" = "$current_mac" ]
+                               then
+-                                      DEVICE=${device##*/}
++                                      ETHDEVICE="${device##*/},$ETHDEVICE" # use ethdevice
+                                       break
+                               fi
+                       fi
+@@ -665,12 +688,7 @@ do_netsetup ()
+       # 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
++        ETHDEVICE="$ALLDEVICES"
+       fi
+
+       # split args of ethdevice=eth0,eth1 into "eth0 eth1"
+@@ -678,38 +696,27 @@ do_netsetup ()
+               devlist="$devlist $device"
+       done
+
+-      # 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 recursion..."
+-                      kill -9 $jobid
++      for dev in $devlist ; do
++              param="$(get_ipconfig_para $dev)"
++              if [ -n "$NODHCP" ] && [ "$param" = "$dev" ] ; then
++                      echo "Ignoring network device $dev due to nodhcp." | tee -a /live-boot.log
++                      continue
+               fi
++              echo "Executing ipconfig -t $ETHDEV_TIMEOUT $param"
++              ipconfig -t "$ETHDEV_TIMEOUT" "$param" | tee -a /netboot.config
+
+               # 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
++              IPV4ADDR="0.0.0.0"
++              . /tmp/net-${device}.conf
++              if [ "${IPV4ADDR}" != "0.0.0.0" ]; then
++                      export DEVICE="$dev $DEVICE"
++                      # break  # exit loop as we just use the irst
+               fi
+-      done
+
+-      else
+-              for interface in ${DEVICE}; do
+-                      ipconfig -t "$ETHDEV_TIMEOUT" ${interface} | tee /netboot-${interface}.config
+-                      [ -e /tmp/net-${interface}.conf ] && . /tmp/net-${interface}.conf
+-                      if [ "$IPV4ADDR" != "0.0.0.0" ]
+-                      then
+-                              break
+-                      fi
+-              done
+-      fi
++      done
++      unset devlist
+
+       for interface in ${DEVICE}; do
+               # source relevant ipconfig output