#!/bin/bash type emergency_shell >/dev/null 2>&1 || . /lib/dracut-lib.sh . /run/openslx/network.conf _logfile="/run/openslx/network.log" # for the boot interface? if [ ! -e "/sys/class/net/${SLX_PXE_NETIF}/device" ]; then exit 1 fi wait_for_iface() { local _iface="$1" local _timeout="${2:-50}" while [ "$_timeout" -ne 0 ]; do [ "$(cat /sys/class/net/${_iface}/operstate)" = "up" ] && break (( _timeout -- )) usleep 100000 done [ "$_timeout" -ne 0 ] } # For debugging... { set -x ip link set dev "$SLX_PXE_NETIF" up if ! wait_for_iface "$SLX_PXE_NETIF" 100; then warn "'$SLX_PXE_NETIF' still not up after 10sec ..." # TODO handle case where we waited for 10sec and it is still not up fi if [ -n "$SLX_BRIDGE" ]; then for try in 1 2 3 fail; do ( set -e brctl addbr "$SLX_BRIDGE" brctl stp "$SLX_BRIDGE" 0 brctl setfd "$SLX_BRIDGE" 0.000000000001 ip link set addr "$SLX_PXE_MAC" "$SLX_BRIDGE" brctl addif "$SLX_BRIDGE" "$SLX_PXE_NETIF" ip link set dev "$SLX_BRIDGE" up wait_for_iface "$SLX_BRIDGE" ) # success? [ "$?" -eq 0 ] && break # nope, handle if [ "$try" = "fail" ]; then emergency_shell "Failed to setup main network bridge, giving up!" fi warn "Failed to setup main network bridge on try $try. Retrying ..." # delete bridge, inc try and sleep 100ms before trying again [ -e "/sys/class/net/${SLX_BRIDGE}" ] && brctl delbr "$SLX_BRIDGE" try=$(( try + 1 )) usleep 100000 done fi # add the IP address on the bridge/boot if ip addr add \ "${SLX_PXE_CLIENT_IP}/$(ipcalc -s -p "$SLX_PXE_CLIENT_IP" "$SLX_PXE_NETMASK" | sed "s/.*=//")" \ broadcast "$(ipcalc -s -b "$SLX_PXE_CLIENT_IP" "$SLX_PXE_NETMASK" | sed "s/.*=//")" \ dev "${SLX_BRIDGE:-${SLX_PXE_NETIF}}" if [ "$USE_DHCP_UUID" = "yes" ] && [ -s "/run/system-uuid" ]; then UUID="$(cat /run/system-uuid)" fi # udhcpc for i in 1 1 1 fail; do [ "$i" = "fail" ] && emergency_shell "DHCP failed 3 times... cannot continue." udhcpc -t 4 -T 3 -f -n -q \ -i "${SLX_BRIDGE:-${SLX_PXE_NETIF}}" \ "${SLX_PXE_CLIENT_IP:+-r $SLX_PXE_CLIENT_IP}" \ "${UUID:+-x 0x3d:$UUID}" \ -O ntpsrv -O domain -O wpad -O search -O nisdomain \ -s "/usr/local/bin/udhcpc-trigger" # success? [ "$?" -eq 0 ] && break # nope, keep trying... warn "DHCP failed, retrying in 1sec..." sleep $i done set +x } &>> "${_logfile}.$$"