]> git.ipfire.org Git - thirdparty/dracut.git/blame - modules.d/35network-legacy/dhclient-script.sh
network-legacy: split off from network module
[thirdparty/dracut.git] / modules.d / 35network-legacy / dhclient-script.sh
CommitLineData
3b403b32 1#!/bin/sh
7e9919b9 2
a9d30a40
HH
3PATH=/usr/sbin:/usr/bin:/sbin:/bin
4
5type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
6type ip_to_var >/dev/null 2>&1 || . /lib/net-lib.sh
7
8# We already need a set netif here
9netif=$interface
10
7e9919b9 11setup_interface() {
580bb541
PS
12 ip=$new_ip_address
13 mtu=$new_interface_mtu
14 mask=$new_subnet_mask
15 bcast=$new_broadcast_address
16 gw=${new_routers%%,*}
17 domain=$new_domain_name
b093aa2d 18 search=$(printf -- "$new_domain_search")
580bb541
PS
19 namesrv=$new_domain_name_servers
20 hostname=$new_host_name
8d09f493
HH
21 [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time
22 [ -n "$new_max_life" ] && lease_time=$new_max_life
23 preferred_lft=$lease_time
24 [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life
580bb541
PS
25
26 [ -f /tmp/net.$netif.override ] && . /tmp/net.$netif.override
27
d1dd6bb7
PS
28 # Taken from debian dhclient-script:
29 # The 576 MTU is only used for X.25 and dialup connections
30 # where the admin wants low latency. Such a low MTU can cause
31 # problems with UDP traffic, among other things. As such,
32 # disallow MTUs from 576 and below by default, so that broken
33 # MTUs are ignored, but higher stuff is allowed (1492, 1500, etc).
34 if [ -n "$mtu" ] && [ $mtu -gt 576 ] ; then
c6c704fd
HH
35 if ! ip link set $netif mtu $mtu ; then
36 ip link set $netif down
37 ip link set $netif mtu $mtu
6cb77ea9 38 linkup $netif
c6c704fd
HH
39 fi
40 fi
7e9919b9 41
0f89ec31
HH
42 ip addr add $ip${mask:+/$mask} ${bcast:+broadcast $bcast} dev $netif \
43 ${lease_time:+valid_lft $lease_time} \
44 ${preferred_lft:+preferred_lft ${preferred_lft}}
db815843 45
99ccbc30 46 if [ -n "$gw" ] ; then
78362bc5 47 if [ "$mask" = "255.255.255.255" ] ; then
99ccbc30
GE
48 # point-to-point connection => set explicit route to gateway
49 echo ip route add $gw dev $netif > /tmp/net.$netif.gw
50 fi
727e2a1d
DS
51
52 echo "$gw" | {
53 IFS=' ' read -r main_gw other_gw
54 echo ip route replace default via $main_gw dev $netif >> /tmp/net.$netif.gw
55 if [ -n "$other_gw" ] ; then
56 for g in $other_gw; do
57 echo ip route add default via $g dev $netif >> /tmp/net.$netif.gw
58 done
59 fi
60 }
99ccbc30 61 fi
db815843 62
df0bdd5a
HH
63 if getargbool 1 rd.peerdns; then
64 [ -n "${search}${domain}" ] && echo "search $search $domain" > /tmp/net.$netif.resolv.conf
65 if [ -n "$namesrv" ] ; then
66 for s in $namesrv; do
67 echo nameserver $s
68 done
69 fi >> /tmp/net.$netif.resolv.conf
70 fi
da55af47
ID
71 # Note: hostname can be fqdn OR short hostname, so chop off any
72 # trailing domain name and explicity add any domain if set.
ffc68f35 73 [ -n "$hostname" ] && echo "echo ${hostname%.$domain}${domain:+.$domain} > /proc/sys/kernel/hostname" > /tmp/net.$netif.hostname
7e9919b9
DD
74}
75
2ac599dc
HH
76setup_interface6() {
77 domain=$new_domain_name
78 search=$(printf -- "$new_domain_search")
79 namesrv=$new_domain_name_servers
80 hostname=$new_host_name
ebe74116
HH
81 [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time
82 [ -n "$new_max_life" ] && lease_time=$new_max_life
83 preferred_lft=$lease_time
84 [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life
2ac599dc
HH
85
86 [ -f /tmp/net.$netif.override ] && . /tmp/net.$netif.override
87
88 ip -6 addr add ${new_ip6_address}/${new_ip6_prefixlen} \
ebe74116
HH
89 dev ${netif} scope global \
90 ${lease_time:+valid_lft $lease_time} \
91 ${preferred_lft:+preferred_lft ${preferred_lft}}
2ac599dc 92
df0bdd5a
HH
93 if getargbool 1 rd.peerdns; then
94 [ -n "${search}${domain}" ] && echo "search $search $domain" > /tmp/net.$netif.resolv.conf
95 if [ -n "$namesrv" ] ; then
96 for s in $namesrv; do
97 echo nameserver $s
98 done
99 fi >> /tmp/net.$netif.resolv.conf
100 fi
2ac599dc
HH
101
102 # Note: hostname can be fqdn OR short hostname, so chop off any
103 # trailing domain name and explicity add any domain if set.
104 [ -n "$hostname" ] && echo "echo ${hostname%.$domain}${domain:+.$domain} > /proc/sys/kernel/hostname" > /tmp/net.$netif.hostname
105}
106
bcabe0fe 107parse_option_121() {
caf12d67
HH
108 while [ $# -ne 0 ]; do
109 mask="$1"
110 shift
111
112 # Is the destination a multicast group?
113 if [ $1 -ge 224 -a $1 -lt 240 ]; then
114 multicast=1
115 else
116 multicast=0
117 fi
118
119 # Parse the arguments into a CIDR net/mask string
120 if [ $mask -gt 24 ]; then
121 destination="$1.$2.$3.$4/$mask"
122 shift; shift; shift; shift
123 elif [ $mask -gt 16 ]; then
124 destination="$1.$2.$3.0/$mask"
125 shift; shift; shift
126 elif [ $mask -gt 8 ]; then
127 destination="$1.$2.0.0/$mask"
128 shift; shift
129 else
130 destination="$1.0.0.0/$mask"
131 shift
132 fi
133
134 # Read the gateway
135 gateway="$1.$2.$3.$4"
136 shift; shift; shift; shift
137
138 # Multicast routing on Linux
139 # - If you set a next-hop address for a multicast group, this breaks with Cisco switches
140 # - If you simply leave it link-local and attach it to an interface, it works fine.
141 if [ $multicast -eq 1 ]; then
142 temp_result="$destination dev $interface"
143 else
144 temp_result="$destination via $gateway dev $interface"
145 fi
146
147 echo "/sbin/ip route add $temp_result"
148 done
149}
150
151
7e9919b9
DD
152case $reason in
153 PREINIT)
cc02093d 154 echo "dhcp: PREINIT $netif up"
6cb77ea9 155 linkup $netif
cc02093d 156 ;;
2ac599dc 157
a9d30a40 158 PREINIT6)
7c5ec0f5 159 echo "dhcp: PREINIT6 $netif up"
a9d30a40 160 linkup $netif
811a070d 161 wait_for_ipv6_dad_link $netif
a9d30a40
HH
162 ;;
163
7e9919b9 164 BOUND)
cc02093d 165 echo "dhcp: BOND setting $netif"
8b88dc7f
HH
166 unset layer2
167 if [ -f /sys/class/net/$netif/device/layer2 ]; then
168 read layer2 < /sys/class/net/$netif/device/layer2
cc02093d 169 fi
8b88dc7f 170 if [ "$layer2" != "0" ]; then
9853791d 171 if command -v arping2 >/dev/null; then
00ca15ab 172 if arping2 -q -C 1 -c 2 -I $netif -0 $new_ip_address ; then
9853791d
HH
173 warn "Duplicate address detected for $new_ip_address while doing dhcp. retrying"
174 exit 1
175 fi
176 else
177 if ! arping -f -q -D -c 2 -I $netif $new_ip_address ; then
178 warn "Duplicate address detected for $new_ip_address while doing dhcp. retrying"
179 exit 1
180 fi
8b88dc7f
HH
181 fi
182 fi
183 unset layer2
3b403b32 184 setup_interface
6d58fa27 185 set | while read line || [ -n "$line" ]; do
cc02093d 186 [ "${line#new_}" = "$line" ] && continue
3b403b32 187 echo "$line"
cc02093d 188 done >/tmp/dhclient.$netif.dhcpopts
957bc5c9 189
c6c704fd
HH
190 {
191 echo '. /lib/net-lib.sh'
192 echo "setup_net $netif"
caf12d67 193 if [ -n "$new_classless_static_routes" ]; then
337a55eb
LN
194 OLDIFS="$IFS"
195 IFS=".$IFS"
cf9a4e0c 196 parse_option_121 $new_classless_static_routes
337a55eb 197 IFS="$OLDIFS"
caf12d67 198 fi
c6c704fd
HH
199 echo "source_hook initqueue/online $netif"
200 [ -e /tmp/net.$netif.manualup ] || echo "/sbin/netroot $netif"
32bd2fbb 201 echo "rm -f -- $hookdir/initqueue/setup_net_$netif.sh"
c6c704fd
HH
202 } > $hookdir/initqueue/setup_net_$netif.sh
203
43a85a73 204 echo "[ -f /tmp/net.$netif.did-setup ]" > $hookdir/initqueue/finished/dhclient-$netif.sh
2ac599dc 205 >/tmp/net.$netif.up
26fbe97b
HH
206 if [ -e /sys/class/net/${netif}/address ]; then
207 > /tmp/net.$(cat /sys/class/net/${netif}/address).up
208 fi
209
2ac599dc
HH
210 ;;
211
cf627b20
HH
212 RENEW|REBIND)
213 unset lease_time
214 [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time
215 [ -n "$new_max_life" ] && lease_time=$new_max_life
216 preferred_lft=$lease_time
217 [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life
e847a78b 218 ip -4 addr change ${new_ip_address}/${new_subnet_mask} broadcast ${new_broadcast_address} dev ${interface} \
cf627b20
HH
219 ${lease_time:+valid_lft $lease_time} ${preferred_lft:+preferred_lft ${preferred_lft}} \
220 >/dev/null 2>&1
221 ;;
222
2ac599dc
HH
223 BOUND6)
224 echo "dhcp: BOND6 setting $netif"
225 setup_interface6
226
6d58fa27 227 set | while read line || [ -n "$line" ]; do
2ac599dc
HH
228 [ "${line#new_}" = "$line" ] && continue
229 echo "$line"
230 done >/tmp/dhclient.$netif.dhcpopts
231
232 {
233 echo '. /lib/net-lib.sh'
234 echo "setup_net $netif"
235 echo "source_hook initqueue/online $netif"
236 [ -e /tmp/net.$netif.manualup ] || echo "/sbin/netroot $netif"
2ac599dc
HH
237 echo "rm -f -- $hookdir/initqueue/setup_net_$netif.sh"
238 } > $hookdir/initqueue/setup_net_$netif.sh
239
43a85a73 240 echo "[ -f /tmp/net.$netif.did-setup ]" > $hookdir/initqueue/finished/dhclient-$netif.sh
c6c704fd 241 >/tmp/net.$netif.up
26fbe97b
HH
242 if [ -e /sys/class/net/${netif}/address ]; then
243 > /tmp/net.$(cat /sys/class/net/${netif}/address).up
244 fi
cc02093d 245 ;;
cf627b20
HH
246
247 RENEW6|REBIND6)
248 unset lease_time
249 [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time
250 [ -n "$new_max_life" ] && lease_time=$new_max_life
251 preferred_lft=$lease_time
252 [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life
253 ip -6 addr change ${new_ip6_address}/${new_ip6_prefixlen} dev ${interface} scope global \
254 ${lease_time:+valid_lft $lease_time} ${preferred_lft:+preferred_lft ${preferred_lft}} \
255 >/dev/null 2>&1
256 ;;
257
9ab14265 258 *) echo "dhcp: $reason";;
0ac9584d 259esac
7e9919b9 260
7e9919b9 261exit 0