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