Remove unnecessary settings on checkisomd5@.service
[platform/upstream/dracut.git] / modules.d / 40network / ifup.sh
1 #!/bin/sh
2 # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
3 # ex: ts=8 sw=4 sts=4 et filetype=sh
4 #
5 # We don't need to check for ip= errors here, that is handled by the
6 # cmdline parser script
7 #
8 # without $2 means this is for real netroot case
9 # or it is for manually bring up network ie. for kdump scp vmcore
10 PATH=/usr/sbin:/usr/bin:/sbin:/bin
11
12 type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
13 type ip_to_var >/dev/null 2>&1 || . /lib/net-lib.sh
14
15 # Huh? No $1?
16 [ -z "$1" ] && exit 1
17
18 # $netif reads easier than $1
19 netif=$1
20 use_bridge='false'
21 use_vlan='false'
22
23 # enslave this interface to bond?
24 for i in /tmp/bond.*.info; do
25     [ -e "$i" ] || continue
26     unset bondslaves
27     unset bondname
28     . "$i"
29     for slave in $bondslaves ; do
30         if [ "$netif" = "$slave" ] ; then
31             netif=$bondname
32             break 2
33         fi
34     done
35 done
36
37 if [ -e /tmp/team.info ]; then
38     . /tmp/team.info
39     for slave in $teamslaves ; do
40         if [ "$netif" = "$slave" ] ; then
41             netif=$teammaster
42         fi
43     done
44 fi
45
46 if [ -e /tmp/vlan.info ]; then
47     . /tmp/vlan.info
48     if [ "$netif" = "$phydevice" ]; then
49         if [ "$netif" = "$bondname" ] && [ -n "$DO_BOND_SETUP" ] ; then
50             : # We need to really setup bond (recursive call)
51         elif [ "$netif" = "$teammaster" ] && [ -n "$DO_TEAM_SETUP" ] ; then
52             : # We need to really setup team (recursive call)
53         else
54             netif="$vlanname"
55             use_vlan='true'
56         fi
57     fi
58 fi
59
60 # bridge this interface?
61 if [ -e /tmp/bridge.info ]; then
62     . /tmp/bridge.info
63     for ethname in $ethnames ; do
64         if [ "$netif" = "$ethname" ]; then
65             if [ "$netif" = "$bondname" ] && [ -n "$DO_BOND_SETUP" ] ; then
66                 : # We need to really setup bond (recursive call)
67             elif [ "$netif" = "$teammaster" ] && [ -n "$DO_TEAM_SETUP" ] ; then
68                 : # We need to really setup team (recursive call)
69             elif [ "$netif" = "$vlanname" ] && [ -n "$DO_VLAN_SETUP" ]; then
70                 : # We need to really setup vlan (recursive call)
71             else
72                 netif="$bridgename"
73                 use_bridge='true'
74             fi
75         fi
76     done
77 fi
78
79 # disable manual ifup while netroot is set for simplifying our logic
80 # in netroot case we prefer netroot to bringup $netif automaticlly
81 [ -n "$2" -a "$2" = "-m" ] && [ -z "$netroot" ] && manualup="$2"
82 [ -z "$netroot" ] && [ -z "$manualup" ] && exit 0
83 [ -n "$manualup" ] && >/tmp/net.$netif.manualup
84
85 # Run dhclient
86 do_dhcp() {
87     # dhclient-script will mark the netif up and generate the online
88     # event for nfsroot
89     # XXX add -V vendor class and option parsing per kernel
90     echo "Starting dhcp for interface $netif"
91     dhclient "$@" -1 -q -cf /etc/dhclient.conf -pf /tmp/dhclient.$netif.pid -lf /tmp/dhclient.$netif.lease $netif \
92         || echo "dhcp failed"
93 }
94
95 load_ipv6() {
96     modprobe ipv6
97     i=0
98     while [ ! -d /proc/sys/net/ipv6 ]; do
99         i=$(($i+1))
100         [ $i -gt 10 ] && break
101         sleep 0.1
102     done
103 }
104
105 do_ipv6auto() {
106     load_ipv6
107     echo 0 > /proc/sys/net/ipv6/conf/$netif/forwarding
108     echo 1 > /proc/sys/net/ipv6/conf/$netif/accept_ra
109     echo 1 > /proc/sys/net/ipv6/conf/$netif/accept_redirects
110     linkup $netif
111     wait_for_ipv6_auto $netif
112
113     [ -n "$hostname" ] && echo "echo $hostname > /proc/sys/kernel/hostname" > /tmp/net.$netif.hostname
114
115     return 0
116 }
117
118 # Handle static ip configuration
119 do_static() {
120     strstr $ip '*:*:*' && load_ipv6
121
122     linkup $netif
123     [ -n "$macaddr" ] && ip link set address $macaddr dev $netif
124     [ -n "$mtu" ] && ip link set mtu $mtu dev $netif
125     if strstr $ip '*:*:*'; then
126         # note no ip addr flush for ipv6
127         ip addr add $ip/$mask ${srv+peer $srv} dev $netif
128     else
129         ip addr flush dev $netif
130         ip addr add $ip/$mask ${srv+peer $srv} brd + dev $netif
131     fi
132
133     [ -n "$gw" ] && echo ip route add default via $gw dev $netif > /tmp/net.$netif.gw
134     [ -n "$hostname" ] && echo "echo $hostname > /proc/sys/kernel/hostname" > /tmp/net.$netif.hostname
135
136     > /tmp/setup_net_${netif}.ok
137     return 0
138 }
139
140 # loopback is always handled the same way
141 if [ "$netif" = "lo" ] ; then
142     ip link set lo up
143     ip addr add 127.0.0.1/8 dev lo
144     exit 0
145 fi
146
147 # start bond if needed
148 if [ -e /tmp/bond.${netif}.info ]; then
149     . /tmp/bond.${netif}.info
150
151     if [ "$netif" = "$bondname" ] && [ ! -e /tmp/net.$bondname.up ] ; then # We are master bond device
152         modprobe bonding
153         echo "+$netif" >  /sys/class/net/bonding_masters
154         ip link set $netif down
155
156         # Stolen from ifup-eth
157         # add the bits to setup driver parameters here
158         for arg in $bondoptions ; do
159             key=${arg%%=*};
160             value=${arg##*=};
161             # %{value:0:1} is replaced with non-bash specific construct
162             if [ "${key}" = "arp_ip_target" -a "${#value}" != "0" -a "+${value%%+*}" != "+" ]; then
163                 OLDIFS=$IFS;
164                 IFS=',';
165                 for arp_ip in $value; do
166                     echo +$arp_ip > /sys/class/net/${netif}/bonding/$key
167                 done
168                 IFS=$OLDIFS;
169             else
170                 echo $value > /sys/class/net/${netif}/bonding/$key
171             fi
172         done
173
174         linkup $netif
175
176         for slave in $bondslaves ; do
177             ip link set $slave down
178             echo "+$slave" > /sys/class/net/$bondname/bonding/slaves
179             linkup $slave
180         done
181
182         # add the bits to setup the needed post enslavement parameters
183         for arg in $BONDING_OPTS ; do
184             key=${arg%%=*};
185             value=${arg##*=};
186             if [ "${key}" = "primary" ]; then
187                 echo $value > /sys/class/net/${netif}/bonding/$key
188             fi
189         done
190     fi
191 fi
192
193 if [ -e /tmp/team.info ]; then
194     . /tmp/team.info
195     if [ "$netif" = "$teammaster" ] && [ ! -e /tmp/net.$teammaster.up ] ; then
196         # We shall only bring up those _can_ come up
197         # in case of some slave is gone in active-backup mode
198         working_slaves=""
199         for slave in $teamslaves ; do
200             ip link set $slave up 2>/dev/null
201             if wait_for_if_up $slave; then
202                 working_slaves+="$slave "
203             fi
204         done
205         # Do not add slaves now
206         teamd -d -U -n -t $teammaster -f /etc/teamd/$teammaster.conf
207         for slave in $working_slaves; do
208             # team requires the slaves to be down before joining team
209             ip link set $slave down
210             teamdctl $teammaster port add $slave
211         done
212         ip link set $teammaster up
213     fi
214 fi
215
216 # XXX need error handling like dhclient-script
217
218 if [ -e /tmp/bridge.info ]; then
219     . /tmp/bridge.info
220 # start bridge if necessary
221     if [ "$netif" = "$bridgename" ] && [ ! -e /tmp/net.$bridgename.up ]; then
222         brctl addbr $bridgename
223         brctl setfd $bridgename 0
224         for ethname in $ethnames ; do
225             if [ "$ethname" = "$bondname" ] ; then
226                 DO_BOND_SETUP=yes ifup $bondname -m
227             elif [ "$ethname" = "$teammaster" ] ; then
228                 DO_TEAM_SETUP=yes ifup $teammaster -m
229             elif [ "$ethname" = "$vlanname" ]; then
230                 DO_VLAN_SETUP=yes ifup $vlanname -m
231             else
232                 linkup $ethname
233             fi
234             brctl addif $bridgename $ethname
235         done
236     fi
237 fi
238
239 get_vid() {
240     case "$1" in
241     vlan*)
242         echo ${1#vlan}
243         ;;
244     *.*)
245         echo ${1##*.}
246         ;;
247     esac
248 }
249
250 if [ "$netif" = "$vlanname" ] && [ ! -e /tmp/net.$vlanname.up ]; then
251     modprobe 8021q
252     if [ "$phydevice" = "$bondname" ] ; then
253         DO_BOND_SETUP=yes ifup $phydevice -m
254     elif [ "$phydevice" = "$teammaster" ] ; then
255         DO_TEAM_SETUP=yes ifup $phydevice -m
256     else
257         linkup "$phydevice"
258     fi
259     ip link add dev "$vlanname" link "$phydevice" type vlan id "$(get_vid $vlanname)"
260     ip link set "$vlanname" up
261 fi
262
263 # setup nameserver
264 namesrv=$(getargs nameserver)
265 if  [ -n "$namesrv" ] ; then
266     for s in $namesrv; do
267         echo nameserver $s
268     done
269 fi >> /tmp/net.$netif.resolv.conf
270
271 # No ip lines default to dhcp
272 ip=$(getarg ip)
273
274 if [ -z "$ip" ]; then
275     if [ "$netroot" = "dhcp6" ]; then
276         do_dhcp -6
277     else
278         do_dhcp -4
279     fi
280 fi
281
282
283 # Specific configuration, spin through the kernel command line
284 # looking for ip= lines
285 for p in $(getargs ip=); do
286     ip_to_var $p
287     # skip ibft
288     [ "$autoconf" = "ibft" ] && continue
289
290     case "$dev" in
291         ??:??:??:??:??:??)  # MAC address
292             _dev=$(iface_for_mac $dev)
293             [ -n "$_dev" ] && dev="$_dev"
294             ;;
295         ??-??-??-??-??-??)  # MAC address in BOOTIF form
296             _dev=$(iface_for_mac $(fix_bootif $dev))
297             [ -n "$_dev" ] && dev="$_dev"
298             ;;
299     esac
300
301     # If this option isn't directed at our interface, skip it
302     [ -n "$dev" ] && [ "$dev" != "$netif" ] && \
303     [ "$use_bridge" != 'true' ] && \
304     [ "$use_vlan" != 'true' ] && continue
305
306     # Store config for later use
307     for i in ip srv gw mask hostname macaddr; do
308         eval '[ "$'$i'" ] && echo '$i'="$'$i'"'
309     done > /tmp/net.$netif.override
310
311     case $autoconf in
312         dhcp|on|any)
313             do_dhcp -4 ;;
314         dhcp6)
315             do_dhcp -6 ;;
316         auto6)
317             do_ipv6auto ;;
318         *)
319             do_static ;;
320     esac
321
322     case $autoconf in
323         dhcp|on|any|dhcp6)
324             ;;
325         *)
326             if [ $? -eq 0 ]; then
327                 setup_net $netif
328                 source_hook initqueue/online $netif
329                 if [ -z "$manualup" ]; then
330                     /sbin/netroot $netif
331                 fi
332             fi
333             ;;
334     esac
335
336     break
337 done
338 exit 0