summaryrefslogblamecommitdiffstats
path: root/modules.d/slx-network/scripts/udhcpc-trigger.stage3
blob: 82a21f6f92a4626b1c5026cf8b91e218285cba07 (plain) (tree)
1
2
3
4
5
6
7
8
9



                                                             
 

               
      
                                        

                 




                                                                     
                                               
                                                  



                             




                             






                                                                             
                                                                         



                                                                                                                                               
                                                                  





                                                                                                

                                    




                                                                                       


                                                  
                                                            

  




                                   

                           


                               
                                                                                



                                                  


                          
                                                
  

                                                    
    
 


                                                





                                                                                        

                                             
                         
                                                                  

                           
 









                                                          
 


                                                   
                                                          
  
 

                                                   
                                                          


                         
                                                        


          


                                                                                     
                                                              

                                            




                                                                               
    














                                                                                   
                                                  



                                                                                   
          

  





                                                           
                                                          

  
               
      
                                            
#!/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}"
		echo "SLX_DHCP_CLIENT_IP='$ip'" >> "$NETWORK_CONF"
	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

# Same procedure for default gateway
if [ -n "$router" ]; then
	if [ -n "$SLX_PXE_GATEWAY" ] && [ "$SLX_PXE_GATEWAY" != "$router" ]; then
		echo "..reconfiguring default gw from '$SLX_PXE_GATEWAY' to '$router'."
		ip route del default 2>/dev/null
		ip route add default via "$router"
	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"

reverse_lookup() {
	[ -z "$dns" ] && return
	[ -z "$1" ] && return
	timeout 3 nslookup "$1" | awk '{if ($2 == "name") { print $4; exit; } }'
}

echo "# From DHCP in stage 3.1" >> "$NETWORK_CONF"

# DNS/domain?
if [ -n "$dns" ]; then
	echo "..got DNS.."
	echo "SLX_DNS='$dns'" >> "$NETWORK_CONF"
fi
for srv in $dns; do
	echo "nameserver $srv" >> "/etc/resolv.conf"
done

# always check DNS
echo "Checking DNS record for this host..."
[ -z "$fqdn" ] && fqdn="$(reverse_lookup "$ip")"
[ -z "$fqdn" ] && [ -n "$hostname" ] && [ -n "$domain" ] && fqdn="${hostname}.${domain}"
# Otherwise, retry DNS one time
if [ -z "$fqdn" ]; then
	sleep 1
	fqdn="$(reverse_lookup "$ip")"
fi
[ -n "$fqdn" ] && fqdn_hostname="${fqdn%%.*}"

if [ -z "$domain" ]; then
	echo "Getting domain via DNS, as DHCP didn't supply one.."
	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'" >> "$NETWORK_CONF"
fi

if [ -n "$search" ]; then
	echo "search $search" >> "/etc/resolv.conf"
	echo "SLX_NET_SEARCH='$search'" >> "$NETWORK_CONF"
fi

if [ -n "$ntpsrv" ]; then
	echo "SLX_DHCP_NTP='$ntpsrv'" >> "$NETWORK_CONF"
fi

# Hostname
if [ -n "$hostname" ]; then
	if [ -n "$SLX_PXE_HOSTNAME" ] && [ "$hostname" != "$SLX_PXE_HOSTNAME" ]; then
		echo "KCL and DHCP hostnames differ... assuming some KCL hack."
		echo " -> Prefering KCL: '$SLX_PXE_HOSTNAME'."
		hostname="$SLX_PXE_HOSTNAME"
	fi
	if [ -n "$fqdn_hostname" ] && [ "$hostname" != "$fqdn_hostname" ]; then
		echo "DHCP hostname differs from DNS hostname."
		echo " -> Prefering DNS: '$fqdn_hostname'."
		hostname="$fqdn_hostname"
	fi
else
	echo "No hostname specified in DHCP, checking DNS record."
	# We ignore the corner case where DHCP didn't supply a hostname but
	# there is a hardcoded one via KCL as it seems unlikely, log it nonetheless
	if [ -n "$SLX_PXE_HOSTNAME" ]; then
		echo "DHCP didn't supply a hostname but one was supplied by KCL?" \
			"This seems strange but using KCL hostname anyways."
		hostname="$SLX_PXE_HOSTNAME"
	else
		# regular fallback to DNS and noname-* if needed
		if [ -n "$fqdn_hostname" ]; then
			echo "Using DNS record hostname: $fqdn_hostname."
			hostname="$fqdn_hostname"
		else
			# no fallback hostname from DNS, use IP address
			hostname="noname-${ip//./-}"
			fqdn="${hostname}.invalid"
		fi
		if [ -n "$domain" ]; then
			fqdn="${hostname}.${domain%% *}" # in case domain is a list
		fi
	fi
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 "SLX_HOSTNAME='$hostname'" >> "$NETWORK_CONF"
fi

touch /.network
set +x
} &>> "/run/openslx/initramfs-udhcpc.log.$$"