]> git.ipfire.org Git - thirdparty/dracut.git/blame - modules.d/35network-legacy/dhclient-script.sh
35network-legacy: using 'replace' instead of 'add' to add route
[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
11e1f680 129 elif [ $mask -gt 0 ]; then
caf12d67
HH
130 destination="$1.0.0.0/$mask"
131 shift
11e1f680
FD
132 else
133 destination="0.0.0.0/$mask"
caf12d67
HH
134 fi
135
136 # Read the gateway
137 gateway="$1.$2.$3.$4"
138 shift; shift; shift; shift
139
140 # Multicast routing on Linux
141 # - If you set a next-hop address for a multicast group, this breaks with Cisco switches
142 # - If you simply leave it link-local and attach it to an interface, it works fine.
11e1f680 143 if [ $multicast -eq 1 -o "$gateway" = "0.0.0.0" ]; then
caf12d67
HH
144 temp_result="$destination dev $interface"
145 else
146 temp_result="$destination via $gateway dev $interface"
147 fi
148
d5e818f3 149 echo "/sbin/ip route replace $temp_result"
caf12d67
HH
150 done
151}
152
153
7e9919b9
DD
154case $reason in
155 PREINIT)
cc02093d 156 echo "dhcp: PREINIT $netif up"
6cb77ea9 157 linkup $netif
cc02093d 158 ;;
2ac599dc 159
a9d30a40 160 PREINIT6)
7c5ec0f5 161 echo "dhcp: PREINIT6 $netif up"
a9d30a40 162 linkup $netif
811a070d 163 wait_for_ipv6_dad_link $netif
a9d30a40
HH
164 ;;
165
7e9919b9 166 BOUND)
cc02093d 167 echo "dhcp: BOND setting $netif"
8b88dc7f
HH
168 unset layer2
169 if [ -f /sys/class/net/$netif/device/layer2 ]; then
170 read layer2 < /sys/class/net/$netif/device/layer2
cc02093d 171 fi
8b88dc7f 172 if [ "$layer2" != "0" ]; then
9853791d 173 if command -v arping2 >/dev/null; then
00ca15ab 174 if arping2 -q -C 1 -c 2 -I $netif -0 $new_ip_address ; then
9853791d
HH
175 warn "Duplicate address detected for $new_ip_address while doing dhcp. retrying"
176 exit 1
177 fi
178 else
179 if ! arping -f -q -D -c 2 -I $netif $new_ip_address ; then
180 warn "Duplicate address detected for $new_ip_address while doing dhcp. retrying"
181 exit 1
182 fi
8b88dc7f
HH
183 fi
184 fi
185 unset layer2
3b403b32 186 setup_interface
6d58fa27 187 set | while read line || [ -n "$line" ]; do
cc02093d 188 [ "${line#new_}" = "$line" ] && continue
3b403b32 189 echo "$line"
cc02093d 190 done >/tmp/dhclient.$netif.dhcpopts
957bc5c9 191
c6c704fd
HH
192 {
193 echo '. /lib/net-lib.sh'
194 echo "setup_net $netif"
caf12d67 195 if [ -n "$new_classless_static_routes" ]; then
337a55eb
LN
196 OLDIFS="$IFS"
197 IFS=".$IFS"
cf9a4e0c 198 parse_option_121 $new_classless_static_routes
337a55eb 199 IFS="$OLDIFS"
caf12d67 200 fi
c6c704fd
HH
201 echo "source_hook initqueue/online $netif"
202 [ -e /tmp/net.$netif.manualup ] || echo "/sbin/netroot $netif"
32bd2fbb 203 echo "rm -f -- $hookdir/initqueue/setup_net_$netif.sh"
c6c704fd
HH
204 } > $hookdir/initqueue/setup_net_$netif.sh
205
43a85a73 206 echo "[ -f /tmp/net.$netif.did-setup ]" > $hookdir/initqueue/finished/dhclient-$netif.sh
2ac599dc 207 >/tmp/net.$netif.up
26fbe97b
HH
208 if [ -e /sys/class/net/${netif}/address ]; then
209 > /tmp/net.$(cat /sys/class/net/${netif}/address).up
210 fi
211
2ac599dc
HH
212 ;;
213
cf627b20
HH
214 RENEW|REBIND)
215 unset lease_time
216 [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time
217 [ -n "$new_max_life" ] && lease_time=$new_max_life
218 preferred_lft=$lease_time
219 [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life
e847a78b 220 ip -4 addr change ${new_ip_address}/${new_subnet_mask} broadcast ${new_broadcast_address} dev ${interface} \
cf627b20
HH
221 ${lease_time:+valid_lft $lease_time} ${preferred_lft:+preferred_lft ${preferred_lft}} \
222 >/dev/null 2>&1
223 ;;
224
2ac599dc
HH
225 BOUND6)
226 echo "dhcp: BOND6 setting $netif"
227 setup_interface6
228
6d58fa27 229 set | while read line || [ -n "$line" ]; do
2ac599dc
HH
230 [ "${line#new_}" = "$line" ] && continue
231 echo "$line"
232 done >/tmp/dhclient.$netif.dhcpopts
233
234 {
235 echo '. /lib/net-lib.sh'
236 echo "setup_net $netif"
237 echo "source_hook initqueue/online $netif"
238 [ -e /tmp/net.$netif.manualup ] || echo "/sbin/netroot $netif"
2ac599dc
HH
239 echo "rm -f -- $hookdir/initqueue/setup_net_$netif.sh"
240 } > $hookdir/initqueue/setup_net_$netif.sh
241
43a85a73 242 echo "[ -f /tmp/net.$netif.did-setup ]" > $hookdir/initqueue/finished/dhclient-$netif.sh
c6c704fd 243 >/tmp/net.$netif.up
26fbe97b
HH
244 if [ -e /sys/class/net/${netif}/address ]; then
245 > /tmp/net.$(cat /sys/class/net/${netif}/address).up
246 fi
cc02093d 247 ;;
cf627b20
HH
248
249 RENEW6|REBIND6)
250 unset lease_time
251 [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time
252 [ -n "$new_max_life" ] && lease_time=$new_max_life
253 preferred_lft=$lease_time
254 [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life
255 ip -6 addr change ${new_ip6_address}/${new_ip6_prefixlen} dev ${interface} scope global \
256 ${lease_time:+valid_lft $lease_time} ${preferred_lft:+preferred_lft ${preferred_lft}} \
257 >/dev/null 2>&1
258 ;;
259
9ab14265 260 *) echo "dhcp: $reason";;
0ac9584d 261esac
7e9919b9 262
7e9919b9 263exit 0