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