From 32322960234c8ec91e0d42835a3ec5ee63305070 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 2 Feb 2019 11:00:00 +0100 Subject: Adding upstream version 20190202. Signed-off-by: Daniel Baumann --- system-boot/components/9990-networking.sh | 179 ++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100755 system-boot/components/9990-networking.sh (limited to 'system-boot/components/9990-networking.sh') diff --git a/system-boot/components/9990-networking.sh b/system-boot/components/9990-networking.sh new file mode 100755 index 0000000..9cc3674 --- /dev/null +++ b/system-boot/components/9990-networking.sh @@ -0,0 +1,179 @@ +#!/bin/sh + +#set -e + +Device_from_bootif () +{ + # 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 + + # look for devices with matching mac address, and set DEVICE to + # appropriate value if match is found. + + 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 +} + +do_netsetup () +{ + modprobe -q af_packet # For DHCP + + udevadm trigger + udevadm settle + + [ -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 + # See if we can select the device from BOOTIF + Device_from_bootif + + # 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 + + for dev in $devlist + do + echo "Executing ipconfig -t $ETHDEV_TIMEOUT $dev" + ipconfig -t "$ETHDEV_TIMEOUT" "$dev" | tee -a /netboot.config + + # 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 -E 'inet.*addr:|inet [0-9][0-9]*.[0-9][0-9]*.[0-9][0-9]*.[0-9][0-9]*' + then + export DEVICE="$dev" + break + fi + done + else + for interface in ${DEVICE}; do + ipconfig -t "$ETHDEV_TIMEOUT" "${interface}" | tee "/netboot-${interface}.config" + + [ -e "/run/net-${interface}.conf" ] && . "/run/net-${interface}.conf" + + if [ "$IPV4ADDR" != "0.0.0.0" ] + then + break + fi + done + fi + + for interface in ${DEVICE} + do + # source relevant ipconfig output + OLDHOSTNAME=${HOSTNAME} + + [ -e "/run/net-${interface}.conf" ] && . "/run/net-${interface}.conf" + + [ -z "${HOSTNAME}" ] && HOSTNAME="${OLDHOSTNAME}" + export HOSTNAME + + if [ -n "${interface}" ] + then + HWADDR="$(cat "/sys/class/net/${interface}/address")" + fi + + # Only create /etc/hosts if FQDN is known (to let 'hostname -f' query + # this file). Otherwise DNS will be queried to determine the FQDN. + if [ ! -e "/etc/hosts" ] && [ -n "${DNSDOMAIN}" ] + then + echo "Creating /etc/hosts" + cat > /etc/hosts < /etc/resolv.conf + echo "search ${DNSDOMAIN}" >> /etc/resolv.conf + fi + + for i in ${IPV4DNS0} ${IPV4DNS1} ${IPV4DNS1} ${DNSSERVERS} + do + if [ -n "$i" ] && [ "$i" != 0.0.0.0 ] + then + echo "nameserver $i" >> /etc/resolv.conf + fi + done + fi + + # Check if we have a network device at all + if ! ls /sys/class/net/"$interface" > /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 + then + panic "No supported network device found, maybe a non-mainline driver is required." + fi + done +} -- cgit v1.2.3