summaryrefslogtreecommitdiffstats
path: root/builder/modules.d/slx-network/scripts/udhcpc-trigger.stage3
blob: ee8708734c78fb7a32f90a5daaa8f14454707f31 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#!/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 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"
fi

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

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.$$"