X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=scripts%2Fboot%2Fnetworking.sh;h=8c8d8403e4e70ab3f7a9891d50f67a86ddabd783;hb=1faa69ad4719944a3ea9c7a02da21f7b5d0170d5;hp=3d22a90ceba562e52de17afa20416d176b463bb0;hpb=23c2e9f4947a2d9be6b63f55cca8e633df3455a3;p=live-boot-grml.git diff --git a/scripts/boot/networking.sh b/scripts/boot/networking.sh index 3d22a90..8c8d840 100755 --- a/scripts/boot/networking.sh +++ b/scripts/boot/networking.sh @@ -12,98 +12,101 @@ 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}" ] + if [ -z "${NETBOOT}" ] && [ -z "${FETCH}" ] && [ -z "${HTTPFS}" ] && [ -z "${FTPFS}" ] then + # support for Syslinux IPAPPEND parameter + # it sets the BOOTIF variable on the kernel parameter + if [ -n "${BOOTIF}" ] + then + # pxelinux sets BOOTIF to a value based on the mac address of the + # network card used to PXE boot, so use this value for DEVICE rather + # than a hard-coded device name from initramfs.conf. this facilitates + # network booting when machines may have multiple network cards. + # pxelinux sets BOOTIF to 01-$mac_address + + # strip off the leading "01-", which isn't part of the mac + # address + temp_mac=${BOOTIF#*-} + + # convert to typical mac address format by replacing "-" with ":" + bootif_mac="" + IFS='-' + for x in $temp_mac + do + if [ -z "$bootif_mac" ] + then + bootif_mac="$x" + else + bootif_mac="$bootif_mac:$x" + fi + done + unset IFS - # support for Syslinux IPAPPEND parameter - # it sets the BOOTIF variable on the kernel parameter + # look for devices with matching mac address, and set DEVICE to + # appropriate value if match is found. - if [ -n "${BOOTIF}" ] - then - # pxelinux sets BOOTIF to a value based on the mac address of the - # network card used to PXE boot, so use this value for DEVICE rather - # than a hard-coded device name from initramfs.conf. this facilitates - # network booting when machines may have multiple network cards. - # pxelinux sets BOOTIF to 01-$mac_address - - # strip off the leading "01-", which isn't part of the mac - # address - temp_mac=${BOOTIF#*-} - - # convert to typical mac address format by replacing "-" with ":" - bootif_mac="" - IFS='-' - for x in $temp_mac + for device in /sys/class/net/* + do + if [ -f "$device/address" ] + then + current_mac=$(cat "$device/address") + + if [ "$bootif_mac" = "$current_mac" ] + then + DEVICE=${device##*/} + break + fi + fi + done + fi + + # 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 - if [ -z "$bootif_mac" ] - then - bootif_mac="$x" - else - bootif_mac="$bootif_mac:$x" - fi + devlist="$devlist $device" done - unset IFS - - # look for devices with matching mac address, and set DEVICE to - # appropriate value if match is found. - for device in /sys/class/net/* + # this is tricky (and ugly) because ipconfig sometimes just hangs/runs into + # an endless loop; if 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 - if [ -f "$device/address" ] + 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 - current_mac=$(cat "$device/address") - - if [ "$bootif_mac" = "$current_mac" ] - then - DEVICE=${device##*/} - break - fi + echo "Killing job $jobid for device $dev as ipconfig ran into recursion..." + kill -9 $jobid fi - done - fi - # 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" + # if configuration of device worked we should have an assigned + # IP address, if so let's use the device 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 - fi - - # split args of ethdevice=eth0,eth1 into "eth0 eth1" - for device in $(echo $ETHDEVICE | sed 's/,/ /g') ; do - devlist="$devlist $device" - done - - # this is tricky (and ugly) because ipconfig sometimes just hangs/runs into - # an endless loop; if 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 - fi - - # if configuration of device worked we should have an assigned - # IP address, if so let's use the device 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 - else for interface in ${DEVICE}; do ipconfig -t "$ETHDEV_TIMEOUT" ${interface} | tee /netboot-${interface}.config @@ -115,7 +118,8 @@ do_netsetup () done fi - for interface in ${DEVICE}; do + for interface in ${DEVICE} + do # source relevant ipconfig output OLDHOSTNAME=${HOSTNAME} [ -e /tmp/net-${interface}.conf ] && . /tmp/net-${interface}.conf