#!/bin/bash # # This script is triggered by udhcpc in stage3 and handle the # DHCP information given as parameters { # for debugging set -x NETWORK_CONF="/run/openslx/network.conf" . "$NETWORK_CONF" MAIN_NETIF="$SLX_PXE_NETIF" [ -n "$SLX_VLAN_ID" ] && MAIN_NETIF="${SLX_PXE_NETIF}.${SLX_VLAN_ID}" [ -n "$SLX_BRIDGE" ] && MAIN_NETIF="$SLX_BRIDGE" readonly MAIN_NETIF if [ "x$1" != "xbound" -a "x$1" != "xrenew" ] \ || [ "x$interface" != "x${MAIN_NETIF}" ] \ || [ -z "$ip" ]; then exit 0 fi ## ## CORE NETWORK CONFIGURATION ## ## > IP, subnet, route # If we already got an IP from KCL, see if it differs, and remove first if so # We just try to prevent everything from breaking if the DHCP server doesn't # objey the renew request by the client and hands out a new address if [ -n "$SLX_PXE_CLIENT_IP" ]; then #...some address is already configured... if [ "x${SLX_PXE_CLIENT_IP}" != "x${ip}" ]; then #...it's a different one, reconfigure... echo "..reconfiguring ${SLX_PXE_CLIENT_IP} to ${ip}.." # remove default route and let it be added again below, as it might get lost when changing the primary address on the interface ip route del default 2>/dev/null ip addr del "$SLX_PXE_CLIENT_IP" dev "${interface}" 2>/dev/null ip addr add "${ip}/$(ipcalc -s -p "${ip}" "${subnet}" | sed s/.*=//)" dev "${interface}" fi else #...no address configured yet, just add... echo "..adding ${ip}.." ip addr add "${ip}/$(ipcalc -s -p "${ip}" "${subnet}" | sed s/.*=//)" dev "${interface}" fi echo "SLX_DHCP_CLIENT_IP='$ip'" >> "$NETWORK_CONF" # Same procedure for default gateway if [ -n "${router}" ]; then if [ -s "$SLX_PXE_GATEWAY" ]; then if [ "x${SLX_PXE_GATEWAY}" != "x${router}" ]; then echo "..reconfiguring default gw from ${SLX_PXE_GATEWAY} to ${router}.." ip route replace default via "$router" fi else ip route add default via "$router" fi echo "SLX_DHCP_GATEWAY='$router'" >> "$NETWORK_CONF" fi ## ## ADDITIONAL NETWORK CONFIGURATION ## ## > DNS, domain, hostname rm -f -- "/etc/resolv.conf" # DNS/domain? if [ -n "$dns" ]; then echo "..got DNS.." echo "# From DHCP in stage 3.1" >> "$NETWORK_CONF" echo "SLX_DNS='$dns'" >> "$NETWORK_CONF" fi for srv in $dns; do echo "nameserver $srv" >> "/etc/resolv.conf" done if [ -z "$domain" ]; then # try to get domain via reverse lookup if empty echo "..trying to get domain via DNS, as DHCP didn't supply one.." fqdn=$(timeout -t 3 nslookup "$ip" | grep -E "^Address +[0-9]+: +$ip " | head -n 1 | awk '{print $4}') domain="${fqdn#*.}" fi # Add domain to list of search domains if not in there yet if [ -n "$domain" ] && [ -n "$search" ]; then FOUND=no for sd in $search; do [ "x$sd" = "x$domain" ] && FOUND=yes done [ "$FOUND" = "no" ] && search="$domain $search" elif [ -n "$domain" ]; then search="$domain" fi # Write out if [ -n "$domain" ]; then echo "domain $domain" >> "/etc/resolv.conf" echo "SLX_NET_DOMAIN='$domain'" >> "/run/openslx/network.conf" fi if [ -n "$search" ]; then echo "search $search" >> "/etc/resolv.conf" echo "SLX_NET_SEARCH='$search'" >> "/run/openslx/network.conf" fi if [ -n "$ntpsrv" ]; then echo "SLX_DHCP_NTP='$ntpsrv'" >> "/run/openslx/network.conf" fi # Hostname # Ignore hostname/fqdn it if hostname was forced per KCL. if [ -n "$SLX_PXE_HOSTNAME" ]; then echo "Hostname set via KCL, ignoring DHCP hostname: '$hostname'" hostname="$SLX_PXE_HOSTNAME" else if [ -z "$hostname" ]; then # as with domain, if there's no hostname, try to get via DNS echo "..trying to get hostname via DNS, as DHCP didn't supply one.." [ -z "$fqdn" ] && fqdn=$(timeout -t 3 nslookup "$ip" | grep -E "^Address +[0-9]+: +$ip " | head -n 1 | awk '{print $4}') hostname="${fqdn%%.*}" elif [ -n "$domain" ]; then fqdn="${hostname}.${domain%% *}" # in case domain is a list fi fi if [ -z "$hostname" ]; then # no fallback hostname from DNS, use IP address hostname="${ip//./-}" fi if [ -n "$hostname" ]; then [ -z "$fqdn" ] && fqdn="$hostname" echo "..setting hostname $hostname (fqdn: $fqdn).." echo "$hostname" > "/proc/sys/kernel/hostname" echo "$hostname" > "/etc/hostname" echo "127.0.0.1 localhost" > "/etc/hosts" echo "127.0.1.1 $fqdn $hostname" >> "/etc/hosts" echo "SLX_HOSTNAME='$hostname'" >> "/run/openslx/network.conf" fi touch /.network set +x } &>> "/run/openslx/initramfs-udhcpc.log.$$"