Annotation of /trunk/dracut/patches/dracut-046-network-support-udhcpc-dhcpcd.patch
Parent Directory | Revision Log
Revision 2986 -
(hide annotations)
(download)
Thu Aug 31 10:06:55 2017 UTC (7 years ago) by niro
File size: 28732 byte(s)
Thu Aug 31 10:06:55 2017 UTC (7 years ago) by niro
File size: 28732 byte(s)
-rediffed against 046
1 | niro | 2986 | diff -Naur dracut-046/modules.d/40network/dhcpcd-script.sh dracut-046-udhcpc/modules.d/40network/dhcpcd-script.sh |
2 | --- dracut-046/modules.d/40network/dhcpcd-script.sh 1970-01-01 01:00:00.000000000 +0100 | ||
3 | +++ dracut-046-udhcpc/modules.d/40network/dhcpcd-script.sh 2017-08-31 12:00:08.307509302 +0200 | ||
4 | @@ -0,0 +1,258 @@ | ||
5 | +#!/bin/sh | ||
6 | + | ||
7 | +PATH=/usr/sbin:/usr/bin:/sbin:/bin | ||
8 | + | ||
9 | +type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh | ||
10 | +type ip_to_var >/dev/null 2>&1 || . /lib/net-lib.sh | ||
11 | + | ||
12 | +# We already need a set netif here | ||
13 | +netif=$interface | ||
14 | + | ||
15 | +setup_interface() { | ||
16 | + ip=$new_ip_address | ||
17 | + mtu=$new_interface_mtu | ||
18 | + mask=$new_subnet_mask | ||
19 | + bcast=$new_broadcast_address | ||
20 | + gw=${new_routers%%,*} | ||
21 | + domain=$new_domain_name | ||
22 | + search=$(printf -- "$new_domain_search") | ||
23 | + namesrv=$new_domain_name_servers | ||
24 | + hostname=$new_host_name | ||
25 | + [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time | ||
26 | + [ -n "$new_max_life" ] && lease_time=$new_max_life | ||
27 | + preferred_lft=$lease_time | ||
28 | + [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life | ||
29 | + | ||
30 | + [ -f /tmp/net.$netif.override ] && . /tmp/net.$netif.override | ||
31 | + | ||
32 | + # Taken from debian dhclient-script: | ||
33 | + # The 576 MTU is only used for X.25 and dialup connections | ||
34 | + # where the admin wants low latency. Such a low MTU can cause | ||
35 | + # problems with UDP traffic, among other things. As such, | ||
36 | + # disallow MTUs from 576 and below by default, so that broken | ||
37 | + # MTUs are ignored, but higher stuff is allowed (1492, 1500, etc). | ||
38 | + if [ -n "$mtu" ] && [ $mtu -gt 576 ] ; then | ||
39 | + if ! ip link set $netif mtu $mtu ; then | ||
40 | + ip link set $netif down | ||
41 | + ip link set $netif mtu $mtu | ||
42 | + linkup $netif | ||
43 | + fi | ||
44 | + fi | ||
45 | + | ||
46 | + ip addr add $ip${mask:+/$mask} ${bcast:+broadcast $bcast} dev $netif \ | ||
47 | + ${lease_time:+valid_lft $lease_time} \ | ||
48 | + ${preferred_lft:+preferred_lft ${preferred_lft}} | ||
49 | + | ||
50 | + if [ -n "$gw" ] ; then | ||
51 | + if [ "$mask" = "255.255.255.255" ] ; then | ||
52 | + # point-to-point connection => set explicit route to gateway | ||
53 | + echo ip route add $gw dev $netif > /tmp/net.$netif.gw | ||
54 | + fi | ||
55 | + | ||
56 | + echo "$gw" | { | ||
57 | + IFS=' ' read -r main_gw other_gw | ||
58 | + echo ip route replace default via $main_gw dev $netif >> /tmp/net.$netif.gw | ||
59 | + if [ -n "$other_gw" ] ; then | ||
60 | + for g in $other_gw; do | ||
61 | + echo ip route add default via $g dev $netif >> /tmp/net.$netif.gw | ||
62 | + done | ||
63 | + fi | ||
64 | + } | ||
65 | + fi | ||
66 | + | ||
67 | + if getargbool 1 rd.peerdns; then | ||
68 | + [ -n "${search}${domain}" ] && echo "search $search $domain" > /tmp/net.$netif.resolv.conf | ||
69 | + if [ -n "$namesrv" ] ; then | ||
70 | + for s in $namesrv; do | ||
71 | + echo nameserver $s | ||
72 | + done | ||
73 | + fi >> /tmp/net.$netif.resolv.conf | ||
74 | + fi | ||
75 | + # Note: hostname can be fqdn OR short hostname, so chop off any | ||
76 | + # trailing domain name and explicity add any domain if set. | ||
77 | + [ -n "$hostname" ] && echo "echo ${hostname%.$domain}${domain:+.$domain} > /proc/sys/kernel/hostname" > /tmp/net.$netif.hostname | ||
78 | +} | ||
79 | + | ||
80 | +setup_interface6() { | ||
81 | + domain=$new_domain_name | ||
82 | + search=$(printf -- "$new_domain_search") | ||
83 | + namesrv=$new_domain_name_servers | ||
84 | + hostname=$new_host_name | ||
85 | + [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time | ||
86 | + [ -n "$new_max_life" ] && lease_time=$new_max_life | ||
87 | + preferred_lft=$lease_time | ||
88 | + [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life | ||
89 | + | ||
90 | + [ -f /tmp/net.$netif.override ] && . /tmp/net.$netif.override | ||
91 | + | ||
92 | + ip -6 addr add ${new_ip6_address}/${new_ip6_prefixlen} \ | ||
93 | + dev ${netif} scope global \ | ||
94 | + ${lease_time:+valid_lft $lease_time} \ | ||
95 | + ${preferred_lft:+preferred_lft ${preferred_lft}} | ||
96 | + | ||
97 | + if getargbool 1 rd.peerdns; then | ||
98 | + [ -n "${search}${domain}" ] && echo "search $search $domain" > /tmp/net.$netif.resolv.conf | ||
99 | + if [ -n "$namesrv" ] ; then | ||
100 | + for s in $namesrv; do | ||
101 | + echo nameserver $s | ||
102 | + done | ||
103 | + fi >> /tmp/net.$netif.resolv.conf | ||
104 | + fi | ||
105 | + | ||
106 | + # Note: hostname can be fqdn OR short hostname, so chop off any | ||
107 | + # trailing domain name and explicity add any domain if set. | ||
108 | + [ -n "$hostname" ] && echo "echo ${hostname%.$domain}${domain:+.$domain} > /proc/sys/kernel/hostname" > /tmp/net.$netif.hostname | ||
109 | +} | ||
110 | + | ||
111 | +parse_option_121() { | ||
112 | + while [ $# -ne 0 ]; do | ||
113 | + mask="$1" | ||
114 | + shift | ||
115 | + | ||
116 | + # Is the destination a multicast group? | ||
117 | + if [ $1 -ge 224 -a $1 -lt 240 ]; then | ||
118 | + multicast=1 | ||
119 | + else | ||
120 | + multicast=0 | ||
121 | + fi | ||
122 | + | ||
123 | + # Parse the arguments into a CIDR net/mask string | ||
124 | + if [ $mask -gt 24 ]; then | ||
125 | + destination="$1.$2.$3.$4/$mask" | ||
126 | + shift; shift; shift; shift | ||
127 | + elif [ $mask -gt 16 ]; then | ||
128 | + destination="$1.$2.$3.0/$mask" | ||
129 | + shift; shift; shift | ||
130 | + elif [ $mask -gt 8 ]; then | ||
131 | + destination="$1.$2.0.0/$mask" | ||
132 | + shift; shift | ||
133 | + else | ||
134 | + destination="$1.0.0.0/$mask" | ||
135 | + shift | ||
136 | + fi | ||
137 | + | ||
138 | + # Read the gateway | ||
139 | + gateway="$1.$2.$3.$4" | ||
140 | + shift; shift; shift; shift | ||
141 | + | ||
142 | + # Multicast routing on Linux | ||
143 | + # - If you set a next-hop address for a multicast group, this breaks with Cisco switches | ||
144 | + # - If you simply leave it link-local and attach it to an interface, it works fine. | ||
145 | + if [ $multicast -eq 1 ]; then | ||
146 | + temp_result="$destination dev $interface" | ||
147 | + else | ||
148 | + temp_result="$destination via $gateway dev $interface" | ||
149 | + fi | ||
150 | + | ||
151 | + echo "/sbin/ip route add $temp_result" | ||
152 | + done | ||
153 | +} | ||
154 | + | ||
155 | + | ||
156 | +case $reason in | ||
157 | + PREINIT) | ||
158 | + echo "dhcp: PREINIT $netif up" | ||
159 | + linkup $netif | ||
160 | + ;; | ||
161 | + | ||
162 | + PREINIT6) | ||
163 | + echo "dhcp: PREINIT6 $netif up" | ||
164 | + linkup $netif | ||
165 | + wait_for_ipv6_dad_link $netif | ||
166 | + ;; | ||
167 | + | ||
168 | + BOUND) | ||
169 | + echo "dhcp: BOND setting $netif" | ||
170 | + unset layer2 | ||
171 | + if [ -f /sys/class/net/$netif/device/layer2 ]; then | ||
172 | + read layer2 < /sys/class/net/$netif/device/layer2 | ||
173 | + fi | ||
174 | + if [ "$layer2" != "0" ]; then | ||
175 | + if command -v arping2 >/dev/null; then | ||
176 | + if arping2 -q -C 1 -c 2 -I $netif -0 $new_ip_address ; then | ||
177 | + warn "Duplicate address detected for $new_ip_address while doing dhcp. retrying" | ||
178 | + exit 1 | ||
179 | + fi | ||
180 | + else | ||
181 | + if ! arping -f -q -D -c 2 -I $netif $new_ip_address ; then | ||
182 | + warn "Duplicate address detected for $new_ip_address while doing dhcp. retrying" | ||
183 | + exit 1 | ||
184 | + fi | ||
185 | + fi | ||
186 | + fi | ||
187 | + unset layer2 | ||
188 | + setup_interface | ||
189 | + set | while read line || [ -n "$line" ]; do | ||
190 | + [ "${line#new_}" = "$line" ] && continue | ||
191 | + echo "$line" | ||
192 | + done >/tmp/dhcpcd.$netif.dhcpopts | ||
193 | + | ||
194 | + { | ||
195 | + echo '. /lib/net-lib.sh' | ||
196 | + echo "setup_net $netif" | ||
197 | + if [ -n "$new_classless_static_routes" ]; then | ||
198 | + modify_routes add "$(parse_option_121 $new_classless_static_routes)" | ||
199 | + fi | ||
200 | + echo "source_hook initqueue/online $netif" | ||
201 | + [ -e /tmp/net.$netif.manualup ] || echo "/sbin/netroot $netif" | ||
202 | + echo "rm -f -- $hookdir/initqueue/setup_net_$netif.sh" | ||
203 | + } > $hookdir/initqueue/setup_net_$netif.sh | ||
204 | + | ||
205 | + echo "[ -f /tmp/net.$netif.did-setup ]" > $hookdir/initqueue/finished/dhcpcd-$netif.sh | ||
206 | + >/tmp/net.$netif.up | ||
207 | + if [ -e /sys/class/net/${netif}/address ]; then | ||
208 | + > /tmp/net.$(cat /sys/class/net/${netif}/address).up | ||
209 | + fi | ||
210 | + | ||
211 | + ;; | ||
212 | + | ||
213 | + RENEW|REBIND) | ||
214 | + unset lease_time | ||
215 | + [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time | ||
216 | + [ -n "$new_max_life" ] && lease_time=$new_max_life | ||
217 | + preferred_lft=$lease_time | ||
218 | + [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life | ||
219 | + ip -4 addr change ${new_ip_address}/${new_subnet_mask} broadcast ${new_broadcast_address} dev ${interface} \ | ||
220 | + ${lease_time:+valid_lft $lease_time} ${preferred_lft:+preferred_lft ${preferred_lft}} \ | ||
221 | + >/dev/null 2>&1 | ||
222 | + ;; | ||
223 | + | ||
224 | + BOUND6) | ||
225 | + echo "dhcp: BOND6 setting $netif" | ||
226 | + setup_interface6 | ||
227 | + | ||
228 | + set | while read line || [ -n "$line" ]; do | ||
229 | + [ "${line#new_}" = "$line" ] && continue | ||
230 | + echo "$line" | ||
231 | + done >/tmp/dhcpcd.$netif.dhcpopts | ||
232 | + | ||
233 | + { | ||
234 | + echo '. /lib/net-lib.sh' | ||
235 | + echo "setup_net $netif" | ||
236 | + echo "source_hook initqueue/online $netif" | ||
237 | + [ -e /tmp/net.$netif.manualup ] || echo "/sbin/netroot $netif" | ||
238 | + echo "rm -f -- $hookdir/initqueue/setup_net_$netif.sh" | ||
239 | + } > $hookdir/initqueue/setup_net_$netif.sh | ||
240 | + | ||
241 | + echo "[ -f /tmp/net.$netif.did-setup ]" > $hookdir/initqueue/finished/dhcpcd-$netif.sh | ||
242 | + >/tmp/net.$netif.up | ||
243 | + if [ -e /sys/class/net/${netif}/address ]; then | ||
244 | + > /tmp/net.$(cat /sys/class/net/${netif}/address).up | ||
245 | + fi | ||
246 | + ;; | ||
247 | + | ||
248 | + RENEW6|REBIND6) | ||
249 | + unset lease_time | ||
250 | + [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time | ||
251 | + [ -n "$new_max_life" ] && lease_time=$new_max_life | ||
252 | + preferred_lft=$lease_time | ||
253 | + [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life | ||
254 | + ip -6 addr change ${new_ip6_address}/${new_ip6_prefixlen} dev ${interface} scope global \ | ||
255 | + ${lease_time:+valid_lft $lease_time} ${preferred_lft:+preferred_lft ${preferred_lft}} \ | ||
256 | + >/dev/null 2>&1 | ||
257 | + ;; | ||
258 | + | ||
259 | + *) echo "dhcp: $reason";; | ||
260 | +esac | ||
261 | + | ||
262 | +exit 0 | ||
263 | diff -Naur dracut-046/modules.d/40network/ifup.sh dracut-046-udhcpc/modules.d/40network/ifup.sh | ||
264 | --- dracut-046/modules.d/40network/ifup.sh 2017-08-11 13:44:06.000000000 +0200 | ||
265 | +++ dracut-046-udhcpc/modules.d/40network/ifup.sh 2017-08-31 12:00:08.307509302 +0200 | ||
266 | @@ -10,6 +10,23 @@ | ||
267 | type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh | ||
268 | type ip_to_var >/dev/null 2>&1 || . /lib/net-lib.sh | ||
269 | |||
270 | +# load magellan settings | ||
271 | +[ -f /etc/conf.d/network ] && . /etc/conf.d/network | ||
272 | +# some sane defaults | ||
273 | +if [[ -n $DEFAULT_DHCP_PROG ]] | ||
274 | +then | ||
275 | + DHCP_PROG="$DEFAULT_DHCP_PROG" | ||
276 | +else | ||
277 | + DHCP_PROG="/sbin/dhcpcd" | ||
278 | +fi | ||
279 | +if [[ -n $DEFAULT_DHCP_START ]] | ||
280 | +then | ||
281 | + DHCP_START="$DEFAULT_DHCP_START" | ||
282 | +else | ||
283 | + DHCP_START="-t 10" | ||
284 | +fi | ||
285 | +DHCP_PROG_NAME="${DHCP_PROG##*/}" | ||
286 | + | ||
287 | # Huh? No $1? | ||
288 | [ -z "$1" ] && exit 1 | ||
289 | |||
290 | @@ -25,6 +42,9 @@ | ||
291 | |||
292 | # Run dhclient | ||
293 | do_dhcp() { | ||
294 | + local opts | ||
295 | + local timeoutswitch | ||
296 | + | ||
297 | # dhclient-script will mark the netif up and generate the online | ||
298 | # event for nfsroot | ||
299 | # XXX add -V vendor class and option parsing per kernel | ||
300 | @@ -41,20 +61,37 @@ | ||
301 | return 1 | ||
302 | fi | ||
303 | |||
304 | + case $DHCP_PROG_NAME in | ||
305 | + dhclient) | ||
306 | + opts="$@ -1 -q" | ||
307 | + opts+=" -cf /etc/dhclient.conf" | ||
308 | + opts+=" -pf /tmp/$DHCP_PROG_NAME.$netif.pid" | ||
309 | + opts+=" -lf /tmp/$DHCP_PROG_NAME.$netif.lease" | ||
310 | + timeoutswitch="-timeout" | ||
311 | + ;; | ||
312 | + | ||
313 | + dhcpcd) | ||
314 | + opts="$@ -q" | ||
315 | + timeoutswitch="--timeout" | ||
316 | + ;; | ||
317 | + | ||
318 | + udhcpc) | ||
319 | + opts="-q" | ||
320 | + opts+=" -p /tmp/$DHCP_PROG_NAME.$netif.pid" | ||
321 | + timeoutswitch="--timeout" | ||
322 | + ;; | ||
323 | + esac | ||
324 | + | ||
325 | while [ $_COUNT -lt $_DHCPRETRY ]; do | ||
326 | - info "Starting dhcp for interface $netif" | ||
327 | - dhclient "$@" \ | ||
328 | - ${_timeout:+-timeout $_timeout} \ | ||
329 | - -q \ | ||
330 | - -cf /etc/dhclient.conf \ | ||
331 | - -pf /tmp/dhclient.$netif.pid \ | ||
332 | - -lf /tmp/dhclient.$netif.lease \ | ||
333 | - $netif \ | ||
334 | + info "Starting dhcp ($DHCP_PROG_NAME) for interface $netif" | ||
335 | + $DHCP_PROG $opts \ | ||
336 | + ${_timeout:+$timeoutswitch $_timeout} \ | ||
337 | + $DHCP_START $netif \ | ||
338 | && return 0 | ||
339 | _COUNT=$(($_COUNT+1)) | ||
340 | [ $_COUNT -lt $_DHCPRETRY ] && sleep 1 | ||
341 | done | ||
342 | - warn "dhcp for interface $netif failed" | ||
343 | + warn "dhcp ($DHCP_PROG_NAME) for interface $netif failed" | ||
344 | return 1 | ||
345 | } | ||
346 | |||
347 | diff -Naur dracut-046/modules.d/40network/kill-dhcpcd.sh dracut-046-udhcpc/modules.d/40network/kill-dhcpcd.sh | ||
348 | --- dracut-046/modules.d/40network/kill-dhcpcd.sh 1970-01-01 01:00:00.000000000 +0100 | ||
349 | +++ dracut-046-udhcpc/modules.d/40network/kill-dhcpcd.sh 2017-08-31 12:00:08.307509302 +0200 | ||
350 | @@ -0,0 +1,15 @@ | ||
351 | +#!/bin/sh | ||
352 | + | ||
353 | +for f in /tmp/dhcpcd.*.pid; do | ||
354 | + [ -e $f ] || continue | ||
355 | + read PID < $f; | ||
356 | + kill $PID >/dev/null 2>&1 | ||
357 | +done | ||
358 | + | ||
359 | +sleep 0.1 | ||
360 | + | ||
361 | +for f in /tmp/dhcpcd.*.pid; do | ||
362 | + [ -e $f ] || continue | ||
363 | + read PID < $f; | ||
364 | + kill -9 $PID >/dev/null 2>&1 | ||
365 | +done | ||
366 | diff -Naur dracut-046/modules.d/40network/kill-udhcpc.sh dracut-046-udhcpc/modules.d/40network/kill-udhcpc.sh | ||
367 | --- dracut-046/modules.d/40network/kill-udhcpc.sh 1970-01-01 01:00:00.000000000 +0100 | ||
368 | +++ dracut-046-udhcpc/modules.d/40network/kill-udhcpc.sh 2017-08-31 12:00:08.307509302 +0200 | ||
369 | @@ -0,0 +1,15 @@ | ||
370 | +#!/bin/sh | ||
371 | + | ||
372 | +for f in /tmp/udhcpc.*.pid; do | ||
373 | + [ -e $f ] || continue | ||
374 | + read PID < $f; | ||
375 | + kill $PID >/dev/null 2>&1 | ||
376 | +done | ||
377 | + | ||
378 | +sleep 0.1 | ||
379 | + | ||
380 | +for f in /tmp/udhcpc.*.pid; do | ||
381 | + [ -e $f ] || continue | ||
382 | + read PID < $f; | ||
383 | + kill -9 $PID >/dev/null 2>&1 | ||
384 | +done | ||
385 | diff -Naur dracut-046/modules.d/40network/module-setup.sh dracut-046-udhcpc/modules.d/40network/module-setup.sh | ||
386 | --- dracut-046/modules.d/40network/module-setup.sh 2017-08-11 13:44:06.000000000 +0200 | ||
387 | +++ dracut-046-udhcpc/modules.d/40network/module-setup.sh 2017-08-31 12:05:05.384847794 +0200 | ||
388 | @@ -3,8 +3,9 @@ | ||
389 | # called by dracut | ||
390 | check() { | ||
391 | local _program | ||
392 | + . /etc/conf.d/network | ||
393 | |||
394 | - require_binaries ip dhclient || return 1 | ||
395 | + require_binaries ip ifconfig route $DEFAULT_DHCP_PROG || return 1 | ||
396 | require_any_binary arping arping2 || return 1 | ||
397 | |||
398 | return 255 | ||
399 | @@ -24,8 +25,13 @@ | ||
400 | # called by dracut | ||
401 | install() { | ||
402 | local _arch _i _dir | ||
403 | - inst_multiple ip dhclient sed awk | ||
404 | + local _dhcp_prog_name | ||
405 | + local _file | ||
406 | + . /etc/conf.d/network | ||
407 | + _dhcp_prog_name="${DEFAULT_DHCP_PROG##*/}" | ||
408 | |||
409 | + inst_multiple ip $_dhcp_prog_name sed awk | ||
410 | + inst_multiple ifconfig route | ||
411 | inst_multiple -o arping arping2 | ||
412 | strstr "$(arping 2>&1)" "ARPing 2" && mv "$initdir/bin/arping" "$initdir/bin/arping2" | ||
413 | |||
414 | @@ -34,10 +40,7 @@ | ||
415 | inst_simple /etc/libnl/classid | ||
416 | inst_script "$moddir/ifup.sh" "/sbin/ifup" | ||
417 | inst_script "$moddir/netroot.sh" "/sbin/netroot" | ||
418 | - inst_script "$moddir/dhclient-script.sh" "/sbin/dhclient-script" | ||
419 | inst_simple "$moddir/net-lib.sh" "/lib/net-lib.sh" | ||
420 | - inst_simple -H "/etc/dhclient.conf" | ||
421 | - cat "$moddir/dhclient.conf" >> "${initdir}/etc/dhclient.conf" | ||
422 | inst_hook pre-udev 50 "$moddir/ifname-genrules.sh" | ||
423 | inst_hook pre-udev 60 "$moddir/net-genrules.sh" | ||
424 | inst_hook cmdline 91 "$moddir/dhcp-root.sh" | ||
425 | @@ -48,7 +51,30 @@ | ||
426 | inst_hook cmdline 97 "$moddir/parse-bridge.sh" | ||
427 | inst_hook cmdline 98 "$moddir/parse-ip-opts.sh" | ||
428 | inst_hook cmdline 99 "$moddir/parse-ifname.sh" | ||
429 | - inst_hook cleanup 10 "$moddir/kill-dhclient.sh" | ||
430 | + case $_dhcp_prog_name in | ||
431 | + dhclient) | ||
432 | + inst_script "$moddir/dhclient-script.sh" "/sbin/dhclient-script" | ||
433 | + inst_simple -H "/etc/dhclient.conf" | ||
434 | + cat "$moddir/dhclient.conf" >> "${initdir}/etc/dhclient.conf" | ||
435 | + inst_hook cleanup 10 "$moddir/kill-dhclient.sh" | ||
436 | + ;; | ||
437 | + | ||
438 | + udhcpc) | ||
439 | + inst_script "$moddir/udhcpc-script.sh" "/usr/share/udhcpc/default.script" | ||
440 | + inst_hook cleanup 10 "$moddir/kill-udhcpc.sh" | ||
441 | + ;; | ||
442 | + | ||
443 | + dhcpcd) | ||
444 | + inst_simple "/etc/dhcpcd.conf" | ||
445 | + inst_script -o /usr/lib/dhcpcd/dhcpcd-run-hooks | ||
446 | + for _file in $(find /usr/lib/dhcpcd/dhcpcd-hooks -type f); do | ||
447 | + inst_simple -o $_file | ||
448 | + done | ||
449 | + inst_simple "$moddir/dhcpcd-script.sh" "/usr/lib/dhcpcd/dhcpcd-hooks/90-netroot" | ||
450 | + inst_hook cleanup 10 "$moddir/kill-dhcpcd.sh" | ||
451 | + ;; | ||
452 | + esac | ||
453 | + inst_simple /etc/conf.d/network | ||
454 | |||
455 | # install all config files for teaming | ||
456 | unset TEAM_MASTER | ||
457 | diff -Naur dracut-046/modules.d/40network/net-lib.sh dracut-046-udhcpc/modules.d/40network/net-lib.sh | ||
458 | --- dracut-046/modules.d/40network/net-lib.sh 2017-08-11 13:44:06.000000000 +0200 | ||
459 | +++ dracut-046-udhcpc/modules.d/40network/net-lib.sh 2017-08-31 12:00:08.307509302 +0200 | ||
460 | @@ -120,6 +120,8 @@ | ||
461 | [ -e /tmp/net.$netif.hostname ] && . /tmp/net.$netif.hostname | ||
462 | [ -e /tmp/net.$netif.override ] && . /tmp/net.$netif.override | ||
463 | [ -e /tmp/dhclient.$netif.dhcpopts ] && . /tmp/dhclient.$netif.dhcpopts | ||
464 | + [ -e /tmp/udhcpc.$netif.dhcpopts ] && . /tmp/udhcpc.$netif.dhcpopts | ||
465 | + [ -e /tmp/dhcpcd.$netif.dhcpopts ] && . /tmp/dhcpcd.$netif.dhcpopts | ||
466 | # set up resolv.conf | ||
467 | [ -e /tmp/net.$netif.resolv.conf ] && \ | ||
468 | awk '!array[$0]++' /tmp/net.$netif.resolv.conf > /etc/resolv.conf | ||
469 | @@ -196,6 +198,12 @@ | ||
470 | for f in /tmp/dhclient.$i.*; do | ||
471 | [ -f $f ] && cp -f $f /tmp/net.${f#/tmp/dhclient.} | ||
472 | done | ||
473 | + for f in /tmp/udhcpc.$i.*; do | ||
474 | + [ -f $f ] && cp -f $f /tmp/net.${f#/tmp/udhcpc.} | ||
475 | + done | ||
476 | + for f in /tmp/dhcpcd.$i.*; do | ||
477 | + [ -f $f ] && cp -f $f /tmp/net.${f#/tmp/dhcpcd.} | ||
478 | + done | ||
479 | done | ||
480 | echo $IFACES > /tmp/.net.ifaces.new | ||
481 | mv /tmp/.net.ifaces.new /tmp/net.ifaces | ||
482 | diff -Naur dracut-046/modules.d/40network/netroot.sh dracut-046-udhcpc/modules.d/40network/netroot.sh | ||
483 | --- dracut-046/modules.d/40network/netroot.sh 2017-08-11 13:44:06.000000000 +0200 | ||
484 | +++ dracut-046-udhcpc/modules.d/40network/netroot.sh 2017-08-31 12:00:08.307509302 +0200 | ||
485 | @@ -41,6 +41,8 @@ | ||
486 | if getarg "root=dhcp" || getarg "netroot=dhcp" || getarg "root=dhcp6" || getarg "netroot=dhcp6"; then | ||
487 | # Load dhcp options | ||
488 | [ -e /tmp/dhclient.$netif.dhcpopts ] && . /tmp/dhclient.$netif.dhcpopts | ||
489 | + [ -e /tmp/dhcpcd.$netif.dhcpopts ] && . /tmp/dhcpcd.$netif.dhcpopts | ||
490 | + [ -e /tmp/udhcpc.$netif.dhcpopts ] && . /tmp/udhcpc.$netif.dhcpopts | ||
491 | |||
492 | # If we have a specific bootdev with no dhcpoptions or empty root-path, | ||
493 | # we die. Otherwise we just warn | ||
494 | diff -Naur dracut-046/modules.d/40network/udhcpc-script.sh dracut-046-udhcpc/modules.d/40network/udhcpc-script.sh | ||
495 | --- dracut-046/modules.d/40network/udhcpc-script.sh 1970-01-01 01:00:00.000000000 +0100 | ||
496 | +++ dracut-046-udhcpc/modules.d/40network/udhcpc-script.sh 2017-08-31 12:00:08.308509289 +0200 | ||
497 | @@ -0,0 +1,278 @@ | ||
498 | +#!/bin/sh | ||
499 | + | ||
500 | +PATH=/usr/sbin:/usr/bin:/sbin:/bin | ||
501 | + | ||
502 | +type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh | ||
503 | +type ip_to_var >/dev/null 2>&1 || . /lib/net-lib.sh | ||
504 | + | ||
505 | +# We already need a set netif here | ||
506 | +netif=$interface | ||
507 | + | ||
508 | +# setup udhcp environment variables | ||
509 | +reason=$1 | ||
510 | +new_ip_address="$ip" | ||
511 | +new_interface_mtu="$mtu" | ||
512 | +new_subnet_mask="$mask" | ||
513 | +new_broadcast_address="$broadcast" | ||
514 | +new_routers="$router" | ||
515 | +new_domain_name="$domain" | ||
516 | +new_domain_search="" | ||
517 | +new_domain_name_servers="$dns" | ||
518 | +new_host_name="$hostname" | ||
519 | +new_dhcp_lease_time="$lease" | ||
520 | +new_max_life="" | ||
521 | +new_preferred_life="" | ||
522 | + | ||
523 | +setup_interface() { | ||
524 | + ip=$new_ip_address | ||
525 | + mtu=$new_interface_mtu | ||
526 | + mask=$new_subnet_mask | ||
527 | + bcast=$new_broadcast_address | ||
528 | + gw=${new_routers%%,*} | ||
529 | + domain=$new_domain_name | ||
530 | + search=$(printf -- "$new_domain_search") | ||
531 | + namesrv=$new_domain_name_servers | ||
532 | + hostname=$new_host_name | ||
533 | + [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time | ||
534 | + [ -n "$new_max_life" ] && lease_time=$new_max_life | ||
535 | + preferred_lft=$lease_time | ||
536 | + [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life | ||
537 | + | ||
538 | + [ -f /tmp/net.$netif.override ] && . /tmp/net.$netif.override | ||
539 | + | ||
540 | + # Taken from debian dhclient-script: | ||
541 | + # The 576 MTU is only used for X.25 and dialup connections | ||
542 | + # where the admin wants low latency. Such a low MTU can cause | ||
543 | + # problems with UDP traffic, among other things. As such, | ||
544 | + # disallow MTUs from 576 and below by default, so that broken | ||
545 | + # MTUs are ignored, but higher stuff is allowed (1492, 1500, etc). | ||
546 | + if [ -n "$mtu" ] && [ $mtu -gt 576 ] ; then | ||
547 | + if ! ip link set $netif mtu $mtu ; then | ||
548 | + ip link set $netif down | ||
549 | + ip link set $netif mtu $mtu | ||
550 | + linkup $netif | ||
551 | + fi | ||
552 | + fi | ||
553 | + | ||
554 | +# lease time stuff not compatible with busybox ip command | ||
555 | +# ip addr add $ip${mask:+/$mask} ${bcast:+broadcast $bcast} dev $netif \ | ||
556 | +# ${lease_time:+valid_lft $lease_time} \ | ||
557 | +# ${preferred_lft:+preferred_lft ${preferred_lft}} | ||
558 | + ip addr add $ip${mask:+/$mask} ${bcast:+broadcast $bcast} dev $netif | ||
559 | + | ||
560 | + if [ -n "$gw" ] ; then | ||
561 | + if [ "$mask" = "255.255.255.255" ] ; then | ||
562 | + # point-to-point connection => set explicit route to gateway | ||
563 | + echo ip route add $gw dev $netif > /tmp/net.$netif.gw | ||
564 | + fi | ||
565 | + | ||
566 | + echo "$gw" | { | ||
567 | + IFS=' ' read -r main_gw other_gw | ||
568 | + echo ip route replace default via $main_gw dev $netif >> /tmp/net.$netif.gw | ||
569 | + if [ -n "$other_gw" ] ; then | ||
570 | + for g in $other_gw; do | ||
571 | + echo ip route add default via $g dev $netif >> /tmp/net.$netif.gw | ||
572 | + done | ||
573 | + fi | ||
574 | + } | ||
575 | + fi | ||
576 | + | ||
577 | + if getargbool 1 rd.peerdns; then | ||
578 | + [ -n "${search}${domain}" ] && echo "search $search $domain" > /tmp/net.$netif.resolv.conf | ||
579 | + if [ -n "$namesrv" ] ; then | ||
580 | + for s in $namesrv; do | ||
581 | + echo nameserver $s | ||
582 | + done | ||
583 | + fi >> /tmp/net.$netif.resolv.conf | ||
584 | + fi | ||
585 | + # Note: hostname can be fqdn OR short hostname, so chop off any | ||
586 | + # trailing domain name and explicity add any domain if set. | ||
587 | + [ -n "$hostname" ] && echo "echo ${hostname%.$domain}${domain:+.$domain} > /proc/sys/kernel/hostname" > /tmp/net.$netif.hostname | ||
588 | +} | ||
589 | + | ||
590 | +setup_interface6() { | ||
591 | + domain=$new_domain_name | ||
592 | + search=$(printf -- "$new_domain_search") | ||
593 | + namesrv=$new_domain_name_servers | ||
594 | + hostname=$new_host_name | ||
595 | + [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time | ||
596 | + [ -n "$new_max_life" ] && lease_time=$new_max_life | ||
597 | + preferred_lft=$lease_time | ||
598 | + [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life | ||
599 | + | ||
600 | + [ -f /tmp/net.$netif.override ] && . /tmp/net.$netif.override | ||
601 | + | ||
602 | +# lease time stuff not compatible with busybox ip command | ||
603 | +# ip -6 addr add ${new_ip6_address}/${new_ip6_prefixlen} \ | ||
604 | +# dev ${netif} scope global \ | ||
605 | +# ${lease_time:+valid_lft $lease_time} \ | ||
606 | +# ${preferred_lft:+preferred_lft ${preferred_lft}} | ||
607 | + ip -6 addr add ${new_ip6_address}/${new_ip6_prefixlen} \ | ||
608 | + dev ${netif} scope global | ||
609 | + | ||
610 | + if getargbool 1 rd.peerdns; then | ||
611 | + [ -n "${search}${domain}" ] && echo "search $search $domain" > /tmp/net.$netif.resolv.conf | ||
612 | + if [ -n "$namesrv" ] ; then | ||
613 | + for s in $namesrv; do | ||
614 | + echo nameserver $s | ||
615 | + done | ||
616 | + fi >> /tmp/net.$netif.resolv.conf | ||
617 | + fi | ||
618 | + | ||
619 | + # Note: hostname can be fqdn OR short hostname, so chop off any | ||
620 | + # trailing domain name and explicity add any domain if set. | ||
621 | + [ -n "$hostname" ] && echo "echo ${hostname%.$domain}${domain:+.$domain} > /proc/sys/kernel/hostname" > /tmp/net.$netif.hostname | ||
622 | +} | ||
623 | + | ||
624 | +parse_option_121() { | ||
625 | + while [ $# -ne 0 ]; do | ||
626 | + mask="$1" | ||
627 | + shift | ||
628 | + | ||
629 | + # Is the destination a multicast group? | ||
630 | + if [ $1 -ge 224 -a $1 -lt 240 ]; then | ||
631 | + multicast=1 | ||
632 | + else | ||
633 | + multicast=0 | ||
634 | + fi | ||
635 | + | ||
636 | + # Parse the arguments into a CIDR net/mask string | ||
637 | + if [ $mask -gt 24 ]; then | ||
638 | + destination="$1.$2.$3.$4/$mask" | ||
639 | + shift; shift; shift; shift | ||
640 | + elif [ $mask -gt 16 ]; then | ||
641 | + destination="$1.$2.$3.0/$mask" | ||
642 | + shift; shift; shift | ||
643 | + elif [ $mask -gt 8 ]; then | ||
644 | + destination="$1.$2.0.0/$mask" | ||
645 | + shift; shift | ||
646 | + else | ||
647 | + destination="$1.0.0.0/$mask" | ||
648 | + shift | ||
649 | + fi | ||
650 | + | ||
651 | + # Read the gateway | ||
652 | + gateway="$1.$2.$3.$4" | ||
653 | + shift; shift; shift; shift | ||
654 | + | ||
655 | + # Multicast routing on Linux | ||
656 | + # - If you set a next-hop address for a multicast group, this breaks with Cisco switches | ||
657 | + # - If you simply leave it link-local and attach it to an interface, it works fine. | ||
658 | + if [ $multicast -eq 1 ]; then | ||
659 | + temp_result="$destination dev $interface" | ||
660 | + else | ||
661 | + temp_result="$destination via $gateway dev $interface" | ||
662 | + fi | ||
663 | + | ||
664 | + echo "/sbin/ip route add $temp_result" | ||
665 | + done | ||
666 | +} | ||
667 | + | ||
668 | + | ||
669 | +case $reason in | ||
670 | + PREINIT|preinit) | ||
671 | + echo "dhcp: PREINIT $netif up" | ||
672 | + linkup $netif | ||
673 | + ;; | ||
674 | + | ||
675 | + PREINIT6|preinit6) | ||
676 | + echo "dhcp: PREINIT6 $netif up" | ||
677 | + linkup $netif | ||
678 | + wait_for_ipv6_dad_link $netif | ||
679 | + ;; | ||
680 | + | ||
681 | + BOUND|bound) | ||
682 | + echo "dhcp: BOND setting $netif" | ||
683 | + unset layer2 | ||
684 | + if [ -f /sys/class/net/$netif/device/layer2 ]; then | ||
685 | + read layer2 < /sys/class/net/$netif/device/layer2 | ||
686 | + fi | ||
687 | + if [ "$layer2" != "0" ]; then | ||
688 | + if command -v arping2 >/dev/null; then | ||
689 | + if arping2 -q -C 1 -c 2 -I $netif -0 $new_ip_address ; then | ||
690 | + warn "Duplicate address detected for $new_ip_address while doing dhcp. retrying" | ||
691 | + exit 1 | ||
692 | + fi | ||
693 | + else | ||
694 | + if ! arping -f -q -D -c 2 -I $netif $new_ip_address ; then | ||
695 | + warn "Duplicate address detected for $new_ip_address while doing dhcp. retrying" | ||
696 | + exit 1 | ||
697 | + fi | ||
698 | + fi | ||
699 | + fi | ||
700 | + unset layer2 | ||
701 | + setup_interface | ||
702 | + set | while read line || [ -n "$line" ]; do | ||
703 | + [ "${line#new_}" = "$line" ] && continue | ||
704 | + echo "$line" | ||
705 | + done >/tmp/udhcpc.$netif.dhcpopts | ||
706 | + | ||
707 | + { | ||
708 | + echo '. /lib/net-lib.sh' | ||
709 | + echo "setup_net $netif" | ||
710 | + if [ -n "$new_classless_static_routes" ]; then | ||
711 | + modify_routes add "$(parse_option_121 $new_classless_static_routes)" | ||
712 | + fi | ||
713 | + echo "source_hook initqueue/online $netif" | ||
714 | + [ -e /tmp/net.$netif.manualup ] || echo "/sbin/netroot $netif" | ||
715 | + echo "rm -f -- $hookdir/initqueue/setup_net_$netif.sh" | ||
716 | + } > $hookdir/initqueue/setup_net_$netif.sh | ||
717 | + | ||
718 | + echo "[ -f /tmp/net.$netif.did-setup ]" > $hookdir/initqueue/finished/udhcpc-$netif.sh | ||
719 | + >/tmp/net.$netif.up | ||
720 | + if [ -e /sys/class/net/${netif}/address ]; then | ||
721 | + > /tmp/net.$(cat /sys/class/net/${netif}/address).up | ||
722 | + fi | ||
723 | + | ||
724 | + ;; | ||
725 | + | ||
726 | + RENEW|renew|REBIND|rebind) | ||
727 | + unset lease_time | ||
728 | + [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time | ||
729 | + [ -n "$new_max_life" ] && lease_time=$new_max_life | ||
730 | + preferred_lft=$lease_time | ||
731 | + [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life | ||
732 | + ip -4 addr change ${new_ip_address}/${new_subnet_mask} broadcast ${new_broadcast_address} dev ${interface} \ | ||
733 | + ${lease_time:+valid_lft $lease_time} ${preferred_lft:+preferred_lft ${preferred_lft}} \ | ||
734 | + >/dev/null 2>&1 | ||
735 | + ;; | ||
736 | + | ||
737 | + BOUND6|bound6) | ||
738 | + echo "dhcp: BOND6 setting $netif" | ||
739 | + setup_interface6 | ||
740 | + | ||
741 | + set | while read line || [ -n "$line" ]; do | ||
742 | + [ "${line#new_}" = "$line" ] && continue | ||
743 | + echo "$line" | ||
744 | + done >/tmp/udhcpc.$netif.dhcpopts | ||
745 | + | ||
746 | + { | ||
747 | + echo '. /lib/net-lib.sh' | ||
748 | + echo "setup_net $netif" | ||
749 | + echo "source_hook initqueue/online $netif" | ||
750 | + [ -e /tmp/net.$netif.manualup ] || echo "/sbin/netroot $netif" | ||
751 | + echo "rm -f -- $hookdir/initqueue/setup_net_$netif.sh" | ||
752 | + } > $hookdir/initqueue/setup_net_$netif.sh | ||
753 | + | ||
754 | + echo "[ -f /tmp/net.$netif.did-setup ]" > $hookdir/initqueue/finished/udhcpc-$netif.sh | ||
755 | + >/tmp/net.$netif.up | ||
756 | + if [ -e /sys/class/net/${netif}/address ]; then | ||
757 | + > /tmp/net.$(cat /sys/class/net/${netif}/address).up | ||
758 | + fi | ||
759 | + ;; | ||
760 | + | ||
761 | + RENEW6|renew6|REBIND6|rebind6) | ||
762 | + unset lease_time | ||
763 | + [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time | ||
764 | + [ -n "$new_max_life" ] && lease_time=$new_max_life | ||
765 | + preferred_lft=$lease_time | ||
766 | + [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life | ||
767 | + ip -6 addr change ${new_ip6_address}/${new_ip6_prefixlen} dev ${interface} scope global \ | ||
768 | + ${lease_time:+valid_lft $lease_time} ${preferred_lft:+preferred_lft ${preferred_lft}} \ | ||
769 | + >/dev/null 2>&1 | ||
770 | + ;; | ||
771 | + | ||
772 | + *) echo "dhcp: $reason";; | ||
773 | +esac | ||
774 | + | ||
775 | +exit 0 |