summaryrefslogblamecommitdiffstats
path: root/core/rootfs/rootfs-stage31/data/inc/udhcpc-trigger
blob: 818adf45e89d03d83a5f24971c3fef72817decf8 (plain) (tree)
1
2
3
4
5
6
7
8
9
10

          



                                                                                                  
                                                                          


              













                                                                    












                                                                                                                                               
                                                        



                                                  
                                                
  
                                  












                                                                                    
                                              












                                                        
                                          

                                                                          
                                                                                         

                           









                                                          

                                   
           

                                                   
                                                      


                                                   
                                                      

  


                                  




                                                                            
                                                                                                                            

                              





                                    

                           







                                                           
      
#!/bin/ash

exec 2>> /run/stderr
set -x

if [ "x$1" != "xbound" -a "x$1" != "xrenew" ] || [ "x$interface" != "xbr0" ] || [ -z "$ip" ]; then
	echo "Ignoring DHCP hook '$1' for interface '$interface' -> '$ip'"
	exit 0
fi

if [ "$ip" != "${ip#*/}" ]; then # CIDR
	cidr="$ip"
	ip="${ip%/*}"
elif [ -n "$mask" ]; then
	cidr="$ip/$mask"
else
	if [ -z "$subnet" ]; then
		echo "$1 event with missing subnet mask"
		exit 1
	fi
	# Non-CIDR + mask
	cidr="$ip/$( ipcalc -s -p "$ip" "$subnet" | sed 's/.*=//' )"
fi

# 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 [ -s "/run/firstip" ]; then
	#...some address is already configured...
	OLD=$(cat "/run/firstip")
	if [ "x${OLD}" != "x${ip}" ]; then
		#...it's a different one, reconfigure...
		echo "..reconfiguring ${OLD} 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
		rm -f -- "/run/firstgw"
		ip addr del "${OLD}" dev "${interface}" 2>/dev/null
		ip addr add "${cidr}" dev "${interface}"
	fi
else
	#...no address configured yet, just add...
	echo "..adding ${ip}.."
	ip addr add "${cidr}" dev "${interface}"
fi
printf "%s" "$ip" > "/run/firstip"

# Same procedure for default gateway
if [ -n "${router}" ]; then
	if [ -s "/run/firstgw" ]; then
		OLD=$(cat "/run/firstgw")
		if [ "x${OLD}" != "x${router}" ]; then
			echo "..reconfiguring default gw from ${OLD} to ${router}.."
			ip route del default 2>/dev/null
			ip route add default via "$router"
		fi
	else
		ip route add default via "$router"
	fi
	printf "%s" "$router" > "/run/firstgw"
fi

rm -f -- "/etc/resolv.conf"

# DNS/domain?
if [ -n "$dns" ]; then
	echo "..got DNS.."
	echo "# From DHCP in stage 3.1" >> "/run/config"
	echo "SLX_DNS='$dns'" >> "/run/config"
fi
for serv in $dns; do
	echo "nameserver $serv" >> "/etc/resolv.conf"
done
if [ -z "$domain" ] && [ -n "$dns" ]; 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 3 nslookup "$ip" | awk '{if ($2 == "name") { print $4; exit; } }')
	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
# Sanitize: domain must not be list
domain="${domain%% *}"
# Write out
if [ -n "$domain" ]; then
	echo "domain $domain" >> "/etc/resolv.conf"
	echo "SLX_NET_DOMAIN='$domain'" >> /run/config
fi
if [ -n "$search" ]; then
	echo "search $search" >> "/etc/resolv.conf"
	echo "SLX_NET_SEARCH='$search'" >> /run/config
fi

for i in $ntpsrv; do
	echo "$i" >> "/run/ntpsrv"
done

# Hostname
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" ] && [ -n "$dns" ] && fqdn=$(timeout 3 nslookup "$ip" | awk '{if ($2 == "name") { print $4; exit; } }')
	hostname="${fqdn%%.*}"
elif [ -n "$domain" ]; then
	fqdn="${hostname}.${domain}"
fi
# Fallback tp IP
if [ -z "$hostname" ]; then
	hostname="noname-${ip//./-}"
	fqdn="${hostname}.invalid"
fi
if [ -n "$hostname" ]; then
	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/config"
fi

exit 0