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