]> TLD Linux GIT Repositories - rc-scripts.git/blob - lib/ifup
- version 0.5.4
[rc-scripts.git] / lib / ifup
1 #!/bin/sh
2 #
3 #
4 PATH=/sbin:/usr/sbin:/bin:/usr/bin
5
6 run_pre_up() { :; }
7
8 . /etc/sysconfig/network
9 . /etc/rc.d/init.d/functions
10 . /lib/rc-scripts/functions.network
11
12 # Will be removed in the future
13 if is_yes "$NETWORKING"; then
14         if [ -z "$IPV4_NETWORKING" ]; then
15                 echo "NETWORKING is set to YES, but IPV4_NETWORKING is empty!"
16                 echo "Please upgrade your config"
17                 echo "Assuming you want IPv4 networking"
18                 IPV4_NETWORKING=yes
19                 export IPV4_NETWORKING
20         fi
21 fi
22
23 need_hostname
24
25 # device name must be ifcfg-somename
26 DEV=$1
27
28 [ -z "$DEV" ] && {
29         nls "Usage: %s <device name>" "ifup" >&2
30         exit 1
31 }
32
33 if [ $(id -u) != 0 ]; then
34         if [ -x /sbin/usernetctl ]; then
35                 exec /sbin/usernetctl $DEV up
36         fi
37         nls "Users cannot control this device." >&2
38         exit 1
39 fi
40
41 if [ -f "/etc/sysconfig/interfaces/ifcfg-$DEV" ]; then
42         CONFIG="/etc/sysconfig/interfaces/ifcfg-$DEV"
43 elif [ -f "/etc/sysconfig/interfaces/$DEV" ]; then
44         CONFIG="/etc/sysconfig/interfaces/$DEV"
45 else
46         CONFIG="$DEV"
47 fi
48
49 source_config
50
51 if [ "foo$2" = "fooboot" ] && is_no "${ONBOOT}"; then
52         exit
53 fi
54
55 if [ "foo$2" = "foohotplug" ] && ! is_yes "${HOTPLUG}"; then
56         exit
57 fi
58
59 if [ "foo$2" = "foopcmcia-hotplug" ] && ! is_yes "${PCMCIA_HOTPLUG}"; then
60         exit
61 fi
62
63 IPSETUP=no
64
65 # set all major variables
66 setup_ip_param
67
68 SYSCTLDEVICE=$(echo ${DEVICE} | sed 's/\./\//g')
69
70 # anything you need done first
71 run_pre_up
72
73 OTHERSCRIPT="/lib/rc-scripts/ifup-${DEVICETYPE}"
74
75 if [ -x "$OTHERSCRIPT" ]; then
76         if is_yes "$DEFAULTHANDLING"; then
77                 HANDLING=1
78         fi
79         if [ "$HANDLING" = "0" ]; then
80                 exec $OTHERSCRIPT $CONFIG $2
81         elif [ "$HANDLING" = "1" ]; then
82                 $OTHERSCRIPT $CONFIG $2
83         fi
84 fi
85
86 if [ -n "$MACVLAN_DEV" -a -n "$MACVLAN_MACADDR" ]; then
87         ip link del link ${MACVLAN_DEV} ${DEVICE} type macvlan > /dev/null 2>&1
88         ip link add link ${MACVLAN_DEV} address ${MACVLAN_MACADDR} name ${DEVICE} type macvlan ${MACVLAN_MODE:+mode $MACVLAN_MODE}
89 fi
90
91 # is this device available? (this catches PCMCIA devices for us)
92 if ! /sbin/ip link set multicast ${MULTICAST} dev ${DEVICE} > /dev/null 2>&1; then
93         nls "Delaying %s initialization" ${DEVICE}
94         exit 1
95 fi
96
97 if [ -n "$MACADDR" ]; then
98         ip link set ${DEVICE} address ${MACADDR}
99 fi
100
101 ip link set ${DEVICE} multicast ${MULTICAST} ${ARP} down
102
103 if [ -n "$MTU" ]; then
104         ip link set ${DEVICE} mtu ${MTU}
105 fi
106
107 if is_yes "${IPV6_NETWORKING}" && is_yes "${IPV6_DISABLE_AUTOCONF}"; then
108         run_cmd "Disabling IPv6 autoconfiguration" sysctl -w net.ipv6.conf.${SYSCTLDEVICE}.autoconf=0
109 fi
110
111 if is_wireless_device "${DEVICE}"; then
112         is_yes "${WLAN_UPEARLY}" && ip link set ${DEVICE} up
113         wireless_param ${DEVICE}
114 fi
115
116 if is_yes "${WLAN_WPA}"; then
117         /usr/sbin/wpa_supplicant -D ${WLAN_WPA_DRIVER:-wext} -c ${WLAN_WPA_CONFIG:-/etc/wpa_supplicant.conf} -i ${DEVICE} ${WLAN_WPA_OPTIONS} -P "/var/run/wpa_supplicant-${DEVICE}.pid" -B
118         [ -z "$WLAN_WPA_WAIT_TIMEOUT" ] && WLAN_WPA_WAIT_TIMEOUT=15
119         # check_link_down sleeps for 0.5s
120         check_link_down ${DEVICE} $(( $WLAN_WPA_WAIT_TIMEOUT * 2 ))
121 fi
122
123 if [ -n "$ETHTOOL_OPTS" ] ; then
124     /sbin/ethtool -s $DEVICE $ETHTOOL_OPTS
125 fi
126
127 if is_yes "$SLAVE" && [ -n "$MASTER" ] ; then
128         # create master if it doesn't exist yet
129         [ ! -d "/sys/class/net/${MASTER}" ] && ip link add "${MASTER}" type bond
130
131         nls "Enslaving %s to %s" "${DEVICE}" "${MASTER}"
132         ip link set "${DEVICE}" master "${MASTER}"
133         ip link set "${DEVICE}" up
134
135         exit 0
136 fi
137
138 if [ "$HANDLING" = "2" ]; then
139         exit 0
140 fi
141
142 if [ -n "$BOOTPROTO" -a "$BOOTPROTO" != "none" -a "$BOOTPROTO" != "static" ]; then
143         if is_yes "$IPV4_NETWORKING"; then
144                 set_dhcpclient
145
146                 DHCP_ARGS=
147                 if [ -n "$DHCP_CLIENT" ]; then
148                         if [ -z "$DHCP_HOSTNAME" ]; then
149                                 # set DHCP_HOSTNAME only basename
150                                 DHCP_HOSTNAME=${HOSTNAME%%.*}
151                         fi
152                         case ${DHCP_CLIENT##*/} in
153                           pump)
154                                 [ -n "$DHCP_HOSTNAME" ] && DHCP_ARGS="-h $DHCP_HOSTNAME"
155                                 DHCP_ARGS="$DHCP_ARGS -i $DEVICE"
156                                 ;;
157                           dhcpcd)
158                                 [ -n "$DHCP_HOSTNAME" ] && DHCP_ARGS="-h $DHCP_HOSTNAME"
159                                 DHCP_ARGS="$DHCP_ARGS $DEVICE"
160                                 if is_no "$ZEROCONF"; then
161                                         DHCP_ARGS="$DHCP_ARGS --noipv4ll"
162                                 fi
163                                 ;;
164                           dhcpxd)
165                                 [ -n "$DHCP_HOSTNAME" ] && DHCP_ARGS="-H $DHCP_HOSTNAME"
166                                 DHCP_ARGS="$DHCP_ARGS $DEVICE"
167                                 ;;
168                           dhclient)
169                                 # Can't specify a host with dhclient ?
170                                 DHCP_ARGS="$DEVICE -pf /var/run/dhclient.$DEVICE.pid -lf /var/lib/dhclient/dhclient.$DEVICE.leases"
171                                 if [ -f /etc/dhclient.$DEVICE.conf ] ; then
172                                         DHCP_ARGS="$DHCP_ARGS -cf /etc/dhclient.$DEVICE.conf"
173                                 fi
174                                 ;;
175                           avahi-autoipd)
176                                 DHCP_ARGS="-D $DEVICE"
177                                 ;;
178                         esac
179                 fi
180                 DHCP_ARGS="$DHCP_OPTIONS $DHCP_ARGS"
181
182                 [ -z "$CHECK_LINK_WAIT_TIMEOUT" ] && CHECK_LINK_WAIT_TIMEOUT=5
183                 if check_link_down ${DEVICE} $(( $CHECK_LINK_WAIT_TIMEOUT * 2 )); then
184                         run_cmd "$(nls 'Determining IP information for %s (%s)' "$DEVICE" "${DHCP_CLIENT##*/}")" /bin/false
185                         nls '%s: Check cable/radio on-off switch?' "$DEVICE"
186                         exit 1
187                 fi
188
189                 if ! run_cmd "$(nls 'Determining IP information for %s (%s)' "$DEVICE" "${DHCP_CLIENT##*/}")" $DHCP_CLIENT $DHCP_ARGS; then
190                         exit 1
191                 fi
192
193                 # give time for determining IP information
194                 check_device_down && sleep 1 && check_device_down && sleep 3
195                 check_device_down && ip link set ${DEVICE} up
196         fi
197 else
198         # IPv4 in use ?
199         if is_yes "$IPV4_NETWORKING" && [ -n "${IP4ADDR}" ]; then
200                 # If broadcast is missing then autocalculate it
201                 if ! (echo $IP4ADDROPT | grep -qE "brd|broadcast"); then
202                         IP4ADDROPT="brd + ${IP4ADDROPT}"
203                 fi
204
205                 if [ -n "${SUBDEVICE}" ]; then
206                         ALIAS="label ${SUBDEVICE}"
207                 fi
208
209                 if [ -n "$REMIP" ]; then
210                         ip addr add ${IP4ADDR} peer ${REMIP} ${ALIAS} dev ${DEVICE} ${IP4ADDROPT}
211                 else
212                         ip addr add ${IP4ADDR} ${ALIAS} dev ${DEVICE} ${IP4ADDROPT}
213                 fi
214         fi
215
216         # Set device up
217         ip link set ${DEVICE} up
218
219         # IPv6 in use ?
220         if is_yes "$IPV6_NETWORKING" && [ -n "${IP6ADDR}" ]; then
221                 ip addr add ${IP6ADDR} dev ${DEVICE} ${IP6ADDROPT}
222                 if [ -n "${IP6ADDRLABEL}" ]; then
223                         ip addrlabel add prefix ${IP6ADDR} dev ${DEVICE} label ${IP6ADDRLABEL}
224                 fi
225         fi
226
227         if is_yes "$IPV4_NETWORKING" && [ -n "${IP4ADDR}" -a -x /sbin/arping ]; then
228                 # update ARP cache of neighbouring computers
229                 /sbin/arping -q -A -c 1 -I ${DEVICE} ${IP4ADDR%/*}
230                 { ( sleep 2; /sbin/arping -q -U -c 1 -I ${DEVICE} ${IP4ADDR%/*} ) & } > /dev/null 2>&1
231         fi
232
233         # IPv4/6 gateways and default routes
234         setup_ip_gw_ro
235 fi
236
237 # device have to have ip address set before
238 if is_yes "$PROXYARP"; then
239         run_cmd "$(nls 'Enabling proxy ARP on %s' "${DEVICE}")" sysctl -w net.ipv4.conf.${SYSCTLDEVICE}.proxy_arp=1
240 fi
241
242 if [ "$HANDLING" = "3" ]; then
243         exit 0
244 fi
245
246 if is_yes "$IPX"; then
247         /lib/rc-scripts/ifup-ipx $DEVICE
248 fi
249
250 if is_yes "$ENABLE_6TO4"; then
251         # find an usable IPv4 address for this device; might have been obtained by dhcp or ppp
252         for ipv4 in `/sbin/ip addr show dev $DEVICE | awk -F'[ /]+' '/ inet /{print $3}'`; do
253                 if [       `ipcalc -n $ipv4/8`  != "NETWORK=10.0.0.0"    \
254                         -a `ipcalc -n $ipv4/12` != "NETWORK=172.16.0.0"  \
255                         -a `ipcalc -n $ipv4/24` != "NETWORK=192.168.0.0" \
256                         -a `ipcalc -n $ipv4/24` != "NETWORK=169.254.0.0" ]; then
257                         local_ipv4=$ipv4
258                         local_ipv6=`printf "2002:%02x%02x:%02x%02x::1" $(echo $ipv4 | tr . ' ')`
259                         break
260                 fi
261         done
262         if [ -n "$local_ipv4" ]; then   # we have an usable IPv4 address; set up the tunnel
263                 tun6to4=tun6to4_$DEVICE
264                 /sbin/ip tunnel add $tun6to4 mode sit ttl 128 remote any local $local_ipv4
265                 /sbin/ip link set dev $tun6to4 up
266                 /sbin/ip -6 addr  add $local_ipv6/16 dev $tun6to4
267                 /sbin/ip -6 route add 2000::/3 via ::192.88.99.1 dev $tun6to4 metric 1
268         fi
269 fi
270
271 if [ "$HANDLING" = "4" ]; then
272         exit 0
273 fi
274
275 exec /lib/rc-scripts/ifup-post $CONFIG