]> git.pld-linux.org Git - projects/rc-scripts.git/blob - sysconfig/network-scripts/functions.network
- use shell construct instead of grep in calcnetmask
[projects/rc-scripts.git] / sysconfig / network-scripts / functions.network
1 #!/bin/sh - keep it for file(1) to get bourne shell script result
2 #
3 # $Id$
4 #
5 # This is not a shell script; it provides functions to network scripts
6 # that source it.
7
8 source_config ()
9 {
10         DEVNAME=${CONFIG##*/}
11         DEVNAME=${DEVNAME##ifcfg-}
12         DEVNAME=${DEVNAME##tnlcfg-}
13
14         if [[ "$CONFIG" = /* ]]; then
15                 if [ -f "$CONFIG" ] ; then
16                         . "$CONFIG"
17                 fi
18         elif [ -f "/etc/sysconfig/interfaces/$CONFIG" ] ; then
19                 . "/etc/sysconfig/interfaces/$CONFIG"
20         fi
21
22         # This is sanity check so that if you've copied ifcfg-eth0 to ifcfg-eth1
23         # and forgot to alter DEVICE= line you won't accidentally bring down eth0
24         # while executing ifdown eth1.
25         if [ -n "$DEVICE" -a  "$DEVNAME" != "$DEVICE" ]; then
26                 echo >&2 "$0: DEVICE specified in $CONFIG does not match filename. Aborting!"
27                 exit 1
28         fi
29
30         if [ -n "${PREFIX}" ] && [[ "$IPADDR" != */* ]]; then
31                 IPADDR="$IPADDR/$PREFIX"
32         fi
33 }
34
35 do_netreport ()
36 {
37         # Notify programs that have requested notification
38         ( cd /var/run/netreport || exit
39         for i in * ; do
40                 [ -f $i ] && kill -SIGIO $i >/dev/null 2>&1 || \
41                         rm -f $i >/dev/null 2>&1
42         done
43         )
44 }
45
46 need_hostname()
47 {
48         local hostname=$(hostname)
49         if [ "$hostname" = "(none)" -o "$hostname" = "localhost" -o \
50              "$hostname" = "localhost.localdomain" ]; then
51                 NEEDHOSTNAME=yes
52         else
53                 unset NEEDHOSTNAME
54         fi
55 }
56
57 set_hostname()
58 {
59         typeset hostname domain
60
61         hostname=$(echo $1 | awk ' { gsub(/\..*$/,NIL); print $0; } ')
62         domain=$(echo $1 | awk ' { sub(/^[^\.]*\./,NIL); print $0; } ')
63
64         if [ -n "$hostname" ] ; then
65                 echo "$hostname" > /etc/HOSTNAME
66                 hostname $hostname
67         fi
68
69         if [ -n "$domain" ] ; then
70                 >/etc/resolv.conf.new
71                 if ! grep -q "search $domain" /etc/resolv.conf ; then
72                         echo "search $domain" >> /etc/resolv.conf.new
73                 fi
74                 echo "domain $domain" >> /etc/resolv.conf.new
75                 grep -v "^domain " /etc/resolv.conf >> /etc/resolv.conf.new
76                 mv -f /etc/resolv.conf.new /etc/resolv.conf
77         fi
78 }
79
80 set_dhcpclient()
81 {
82         if [ "$BOOTPROTO" = "bootp" -o "$BOOTPROTO" = "pump" ]; then
83                 DHCP_CLIENT=/sbin/pump
84         fi
85
86         if [ -z "$DHCP_CLIENT" ]; then
87                 if [ -x /sbin/dhcpcd ]; then
88                         DHCP_CLIENT=/sbin/dhcpcd
89                 elif [ -x /sbin/dhclient ]; then
90                         DHCP_CLIENT=/sbin/dhclient
91                 elif [ -x /sbin/dhcpxd ]; then
92                         DHCP_CLIENT=/sbin/dhcpxd
93                 elif [ -x /sbin/pump ]; then
94                         DHCP_CLIENT=/sbin/pump
95                 else
96                         nls "Can't find a dhcp client."
97                         exit 1
98                 fi
99         fi
100 }
101
102 # Setup Network Address Translation (NAT)
103 setup_nat()
104 {
105         typeset src via dst
106
107         if [ -r /etc/sysconfig/static-nat ]; then
108                 if [ "$1" = "on" ]; then
109                         grep "^[0-9]" /etc/sysconfig/static-nat | while read src via dst; do
110                                 /sbin/ip route add nat $dst via $src
111                                 /sbin/ip rule add from $src nat $dst
112                         done
113                 elif [ "$1" = "off" ]; then
114                         /sbin/ip route show table all | egrep "^nat[[:blank:]]" | while read nat dst via src args; do
115                                 /sbin/ip rule del from $src nat $dst
116                                 /sbin/ip route del nat $dst via $src
117                         done
118                 fi
119         fi
120 }
121
122 # Setup static ARP
123 static_arp()
124 {
125         typeset rc arpdev host hwaddr flags neflags
126
127         if is_yes "$STATIC_ARP" && [ -r /etc/ethers ]; then
128                 if [ -x /sbin/arp ]; then
129                         run_cmd "Setting static ARP entries" /sbin/arp -f /etc/ethers
130                 else
131                         show "Setting static ARP entries"; busy
132                         rc=0
133                         arpdev=$(ip link show | awk -F':' '(/UP/) && ! (/NOARP/) && ! (/lo:/) && ! (/NONE:/) { print $2; exit }')
134                         if [ -z "$arpdev" ]; then
135                                 rc=1
136                         else
137                                 # ip supports only ip addresses
138                                 grep "^[0-9]" /etc/ethers | \
139                                 while read host hwaddr flags; do
140                                         case "$flags" in
141                                           *temp*)
142                                                 neflags="nud stale"
143                                                 ;;
144                                           *)
145                                                 neflags="nud permanent"
146                                                 ;;
147                                         esac
148                                         if ! /sbin/ip neigh add $host lladdr $hwaddr $neflags dev $arpdev; then
149                                                 rc=1
150                                         fi
151                                 done
152                         fi
153                         if [ "$rc" -gt 0 ]; then
154                                 fail
155                         fi
156                 fi
157         fi
158 }
159
160 static_rarp()
161 {
162         if is_yes "$STATIC_RARP"; then
163                 if [ ! -e /proc/net/rarp ]; then
164                         _modprobe single -k rarp
165                 fi
166                 if [ -r /etc/ethers -a -x /sbin/rarp ]; then
167                         run_cmd "Setting static RARP entries" /sbin/rarp -f /etc/ethers
168                 fi
169         fi
170 }
171
172 vlan_setup()
173 {
174         if [ -x /sbin/vconfig -a -e /proc/net/vlan/config ] && `echo $DEVICE | grep -q ^eth`; then
175                 /sbin/vconfig set_name_type DEV_PLUS_VID_NO_PAD 2>&1 > /dev/null
176                 ETH_VLANS="yes"
177         else
178                 ETH_VLANS="no"
179         fi
180 }
181
182 # Set up all IP && IP parameter variables
183 setup_ip_param ()
184 {
185         # detect network device type (ie. dummy, eth for dummy0, eth0 ..)
186         if [ -z "$DEVICETYPE" ]; then
187                 DEVICETYPE=$(echo $DEVICE | awk ' { gsub(/[0-9]*\.?[0-9]*$/,NUL); print $0 } ')
188         fi
189
190         # Setup DEVICETYPE for special cases.
191         if (echo ${DEVICE} | LC_ALL=C egrep -q '^[a-z0-9]+\.[0-9]+$'); then
192                 DEVICETYPE=vlan
193         fi
194
195         # real name of device (ie. is eth0 for eth0,eth0:1,eth0:alias)
196         DEVICE=$(echo $DEVICE | awk ' { gsub(/:.*$/,NUL); print $0 } ')
197
198         eval IP4ADDR="\$IPADDR${IP4_PRIM_IF:-}"
199         if echo "${IP4ADDR}" | grep -q ":" ; then
200                 IP6ADDR=${IP4ADDR}
201                 IP4ADDR=""
202         else
203                 eval IP4ADDROPT="\$IP_AOPTS${IP4_PRIM_IF:-}"
204                 eval IP4ROUTEOPT="\$IP_ROPTS${IP4_PRIM_IF:-}"
205         fi
206         if [ -n "${IP6_PRIM_IF}" ] ; then
207                 eval IP6ADDR="\$IPADDR${IP6_PRIM_IF:-}"
208                 eval IP6ADDROPT="\$IPV6_AOPTS${IP6_PRIM_IF:-}"
209         fi
210         if [ -n "${IP4_SRC_IF}" ] ; then
211                 eval IP4SRCADDR="\$IPADDR${IP4_SRC_IF}"
212                 IP4SRCADDR=$(echo ${IP4SRCADDR} | awk ' { gsub(/\/.*/,NIL); print "src " $0; } ')
213         fi
214         if [ -n "${IP6_SRC_IF}" ] ; then
215                 eval IP6SRCADDR="\$IPADDR${IP6_SRC_IF}"
216                 IP6SRCADDR=$(echo ${IP6SRCADDR} | awk ' { gsub(/\/.*/,NIL); print "src " $0; } ')
217         fi
218
219         # new rc-scripts 0.4.x option
220         if [ -z "$HANDLING" ]; then
221                 HANDLING=0
222         fi
223
224         # set handling for bridge
225         case "$DEVICETYPE" in
226           br|atm|lec|irda|vlan)
227                 HANDLING=1
228                 ;;
229         esac
230
231         # Multicast ready devices
232         if is_yes "$MULTICAST"; then
233                 MULTICAST="on"
234         else
235                 case "$DEVICETYPE" in
236                   eth|br)
237                         MULTICAST="on"
238                         ;;
239                   *)
240                         MULTICAST="off"
241                         ;;
242                 esac
243         fi
244
245         # ARP ready devices
246         if [ -n "$ARP" ] ; then
247                 if is_yes "$ARP"; then
248                         ARP="arp on"
249                 else
250                         ARP="arp off"
251                 fi
252         fi
253 }
254
255 check_device_down ()
256 {
257         if (ip link show dev ${DEVICE} 2> /dev/null | grep -q UP); then
258                 return 1
259         else
260                 return 0
261         fi
262 }
263
264 setup_ip_gw_ro ()
265 {
266         # IPv4 gateway
267         if is_yes "$IPV4_NETWORKING"; then
268                 if [ -z "${GATEWAYDEV}" -o "${GATEWAYDEV}" = "${DEVICE}" ]; then
269                         # set up default gateway
270                         if [ -n "${GATEWAY}" ]; then
271                                 ip -4 route add default via ${GATEWAY} dev ${DEVICE} ${IP4SRCADDR} onlink 2>/dev/null
272                                 if [ $? = 0 ]; then
273                                         DEFGW=${GATEWAY}
274                                 else
275                                         # The default gateway could be set via eth0, while bringing up eth1 we shouldn't set default gateway again.
276                                         # To prevent this message just set GATEWAYDEV=eth0 in /etc/sysconfig/network.
277                                         nls "Warning: Default gateway already set proably via other interface. Do you need to setup GATEWAYDEV?"
278                                 fi
279                         elif [ "${GATEWAYDEV}" = "${DEVICE}" ]; then
280                                 ip -4 route add default dev ${DEVICE} ${IP4SRCADDR}
281                         fi
282                 fi
283         fi
284
285         # IPv6 gateway && IPv6 globalroute
286         if is_yes "$IPV6_NETWORKING"; then
287                 if [ -z "${GATEWAY6DEV}" -o "${GATEWAY6DEV}" = "${DEVICE}" ]; then
288                         # set up default gateway
289                         if [ -n "${GATEWAY6}" ]; then
290                                 ip -6 route add default via ${GATEWAY6} dev ${DEVICE} ${IP6SRCADDR} onlink
291                                 DEFGW6=${GATEWAY6}
292                         elif [ "${GATEWAY6DEV}" = "${DEVICE}" ]; then
293                                 ip -6 route add default dev ${DEVICE} ${IP6SRCADDR}
294                         fi
295                 fi
296                 if [ -z "${IPV6_GLOBALROUTEDEV}" -o "${IPV6_GLOBALROUTEDEV}" = "${DEVICE}" ]; then
297                         # set up default route
298                         if [ -n "${IPV6_GLOBALROUTEGW}" ]; then
299                                 ip -6 route add 2000::/3 via ${IPV6_GLOBALROUTEGW} dev ${DEVICE} ${IP6SRCADDR} onlink
300                         elif [ "${IPV6_GLOBALROUTEDEV}" = "${DEVICE}" ]; then
301                                 ip -6 route add 2000::/3 dev ${DEVICE} ${IP6SRCADDR}
302                         fi
303                 fi
304         fi
305 }
306
307 #
308 # following function sets up routes not associated to any device
309 # eg. unreachable or blackhole routes
310 # (c) 1999 Jacek Konieczny <jajcus@pld-linux.org>
311 #
312 setup_routes()
313 {
314         typeset args
315
316         if [ -f /etc/sysconfig/static-routes ]; then
317                 if [ "$1" = "on" -o "$1" = "yes" ] ; then
318                         egrep "^(none|any)[[:blank:]]" /etc/sysconfig/static-routes | while read device args; do
319                                 /sbin/ip route add $args
320                         done
321                 else
322                         egrep "^(none|any)[[:blank:]]" /etc/sysconfig/static-routes | while read device args; do
323                                 /sbin/ip route del $args 2>/dev/null
324                         done
325                 fi
326         fi
327 }
328
329 # Add ONLY IPv4 address (IPv6 address is added automaticly)
330 set_up_loopback()
331 {
332         if is_yes "$IPV4_NETWORKING"; then
333                 ip addr add 127.0.0.1/8 dev lo
334         fi
335         ip link set dev lo up
336 }
337
338 set_down_loopback()
339 {
340         ip addr flush dev lo 2>&1 | grep -v "Nothing to flush"
341         ip link set dev lo down
342 }
343
344 modprobe_net()
345 {
346         if is_yes "$IPV6_NETWORKING" && is_module "ipv6"; then
347                 _modprobe single -k ipv6
348         fi
349
350         if is_yes "$IPX" && is_module "ipx"; then
351                 _modprobe single -k ipx
352         fi
353 }
354
355 # calculate network prefix from given network mask
356 calcprefix()
357 {
358         typeset old_IFS netmask prefix endp
359
360         old_IFS=$IFS
361         IFS='.'
362         netmask=$(echo $1)
363         IFS=$old_IFS
364
365         prefix=0
366         endp=0
367         for n in $netmask ; do
368                 for i in 128 64 32 16 8 4 2 1 ; do
369                         if [ $(($n & $i)) -ne 0 ]; then
370                                 if [ $endp -eq 0 ]; then
371                                         prefix=$(($prefix + 1))
372                                 else
373                                         echo "32"
374                                         return
375                                 fi
376                         else
377                                 endp=1
378                         fi
379                 done
380         done
381         echo $prefix
382 }
383
384 # calculate network mask from given prefix
385 # (c) 1999 Grzegorz Stanislawski <stangrze@open.net.pl>
386 calcnetmask()
387 {
388         typeset prefix a MASK
389
390         MASK=""
391         if [ -n "${1##[0-9]*}" ]; then
392                 prefix=32
393         else
394                 typeset -i prefix=$1
395         fi
396         for i in 1 2 3 4; do
397                 case $prefix in
398                   7)    a=254 ;;
399                   6)    a=252 ;;
400                   5)    a=248 ;;
401                   4)    a=240 ;;
402                   3)    a=224 ;;
403                   2)    a=192 ;;
404                   1)    a=128 ;;
405                   *)
406                         [ $prefix -ge 8 ] && a=255
407                         [ $prefix -le 0 ] && a=0
408                         ;;
409                 esac
410
411                 prefix="$(( $prefix - 8))"
412                 if [ -z "$MASK" ]; then
413                         MASK=$a
414                 else
415                         MASK=$MASK.$a
416                 fi
417         done
418
419         echo $MASK
420         return
421 }
422
423 # Retrievies PPPD PID and real interface name from /var/run/ppp-*.pid
424 get_ppp_device_and_pid ()
425 {
426         if [ -f "/var/run/ppp-$DEVNAME.pid" ] ; then
427                 eval `{
428                         read PID ; echo "PID='$PID'"
429                         read REALDEVICE ; echo "REALDEVICE=$REALDEVICE"
430                 } < "/var/run/ppp-$DEVNAME.pid"`
431         fi
432
433         if [ -z "$REALDEVICE" ] ; then
434                 REALDEVICE=$DEVICE
435         fi
436 }
437
438 # following function setups advanced routing rules
439 # Olgierd Pieczul <wojrus@pld-linux.org>
440 setup_ip_rules ()
441 {
442         typeset args prio from src
443
444         if [ -f /etc/sysconfig/static-routes ] ; then
445                 if is_yes "$1"; then
446                         egrep "^(from|to|iif|tos|fwmark|dev|pref|priority|prio)[[:blank:]]" /etc/sysconfig/static-routes | while read args; do
447                                 /sbin/ip rule add $args
448                         done
449                 elif is_no "$1"; then
450                         /sbin/ip rule show | egrep -v -e "from all lookup (main|default|local) \$" -e " map-to " | while read prio from src args; do
451                                 [ "$src" == "all" ] && ip rule delete $args || ip rule delete $from $src $args
452                         done
453                 fi
454         fi
455 }
456
457 is_wireless_device ()
458 {
459         if [ -x /sbin/iwconfig ]; then
460                 LC_ALL=C iwconfig "${1}" 2>&1 | grep -q "no wireless extensions" || return 0
461         fi
462         return 1
463 }
464
465 wireless_param ()
466 {
467         device="$1"
468         if [ "$2" = "br" ]; then
469                 prefix="${device}_"
470         else
471                 prefix=""
472         fi
473
474         if [ -z "$(eval echo \$${prefix}WLAN_NICKNAME)" ]; then
475                  WLAN_NICKNAME="$(hostname -f 2>/dev/null || hostname 2>/dev/null || echo localhost)"
476         else
477                  WLAN_NICKNAME="$(eval echo \$${prefix}WLAN_NICKNAME)"
478         fi
479
480         # wlan mode needs to be first
481         [ -n "$(eval echo \$${prefix}WLAN_MODE)" ] && \
482                 iwconfig ${device} mode "$(eval echo \$${prefix}WLAN_MODE)"
483         iwconfig ${device} nick ${WLAN_NICKNAME}
484         [ -n "$(eval echo \$${prefix}WLAN_NWID)" ] && \
485                 iwconfig ${device} nwid "$(eval echo \$${prefix}WLAN_NWID)"
486         if [ -n "$(eval echo \$${prefix}WLAN_FREQ)" -a "$(eval echo \$${prefix}${WLAN_MODE})" != "Managed" ] ; then
487                 iwconfig ${device} freq "$(eval echo \$${prefix}WLAN_FREQ)"
488         elif [ -n "$(eval echo \$${prefix}WLAN_CHANNEL)" -a "$(eval echo \$${prefix}${WLAN_MODE})" != "Managed" ]; then
489                 iwconfig ${device} channel "$(eval echo \$${prefix}WLAN_CHANNEL)"
490         fi
491         [ -n "$(eval echo \$${prefix}WLAN_SENS)" ] && \
492                 iwconfig ${device} sens "$(eval echo \$${prefix}WLAN_SENS)"
493         [ -n "$(eval echo \$${prefix}WLAN_AP)" ] && \
494                 iwconfig ${device} ap "$(eval echo \$${prefix}WLAN_AP)"
495         [ -n "$(eval echo \$${prefix}WLAN_BITRATE)" ] && \
496                 iwconfig ${device} rate "$(eval echo \$${prefix}WLAN_BITRATE)"
497         [ -n "$(eval echo \$${prefix}WLAN_RTS_THRESHOLD)" ] && \
498                 iwconfig ${device} rts "$(eval echo \$${prefix}WLAN_RTS_THRESHOLD)"
499         [ -n "$(eval echo \$${prefix}WLAN_FRAGMENTATION_THRESHOLD)" ] && \
500                 iwconfig ${device} frag "$(eval echo \$${prefix}WLAN_FRAGMENTATION_THRESHOLD)"
501         if [ -n "$(eval echo \$${prefix}WLAN_KEY)" ]; then
502                 iwconfig ${device} key "$(eval echo \$${prefix}WLAN_KEY)"
503                 [ -n "$(eval echo \$${prefix}WLAN_ENCRYPTION)" ] && \
504                         iwconfig ${device} key "$(eval echo \$${prefix}WLAN_ENCRYPTION)"
505         fi
506         if is_no "$(eval echo \$${prefix}WLAN_ENCRYPTION)"; then
507                 iwconfig ${device} key off
508         fi
509         [ -n "$(eval echo \$${prefix}WLAN_POWER)" ] && \
510                 iwconfig ${device} power "$(eval echo \$${prefix}WLAN_POWER)"
511         [ -n "$(eval echo \$${prefix}WLAN_TXPOWER)" ] && \
512                 iwconfig ${device} txpower "$(eval echo \$${prefix}WLAN_TXPOWER)"
513         [ -n "$(eval echo \$${prefix}WLAN_RETRY)" ] && \
514                 iwconfig ${device} retry "$(eval echo \$${prefix}WLAN_RETRY)"
515         [ -n "$(eval echo \$${prefix}WLAN_NWID)" ] && iwconfig ${device} \
516                 nwid "$(eval echo \$${prefix}WLAN_NWID)"
517
518         # essid should be last due to network rescanning by wlan devices
519         [ -n "$(eval echo \$${prefix}WLAN_ESSID)" ] && iwconfig ${device} \
520                 essid "$(eval echo \$${prefix}WLAN_ESSID)"
521
522         if is_yes "$(eval echo \$${prefix}WLAN_COMMIT)"; then
523                 iwconfig ${device} commit
524         fi
525 }
526
527 check_mii_tool ()
528 {
529         [ -x /sbin/mii-tool ] || return 2
530         output=$(LC_ALL=C mii-tool $1 2>&1)
531         echo $output | LC_ALL=C grep -q "link ok" && return 1
532         echo $output | LC_ALL=C grep -q "no link" && return 0 || return 2
533 }
534
535 check_ethtool ()
536 {
537         [ -x /sbin/ethtool ] || return 2
538         output=$(LC_ALL=C ethtool $1 2>&1)
539         echo $output | LC_ALL=C grep -q "Link detected: yes" && return 1
540         echo $output | LC_ALL=C grep -q "Link detected: no" && return 0 || return 2
541 }
542
543 check_iwconfig ()
544 {
545         [ -x /sbin/iwconfig ] || return 2
546         output=$(LC_ALL=C iwconfig $1 2>&1)
547         echo $output | LC_ALL=C grep -q "radio off" && return 0 || return 2
548 }
549
550 check_link_down ()
551 {
552         if [ -x /sbin/mii-tool -o -x /sbin/ethtool -o -x /sbin/iwconfig ]; then
553                 if ! LC_ALL=C ip link show dev $1 2>/dev/null| grep -q UP ; then
554                         ip link set dev $1 up >/dev/null 2>&1
555                         timeout=0
556                         while [ $timeout -le 10 ]; do
557                                 check_mii_tool $1
558                                 m=$?
559                                 check_ethtool $1
560                                 e=$?
561                                 check_iwconfig $1
562                                 i=$?
563                                 if [ $m -eq 1 ] || [ $e -eq 1 ] ; then
564                                         return 1
565                                 fi
566                                 if [ $m -eq 2 ] && [ $e -eq 2 ] && [ $i -eq 2 ]; then
567                                         return 1
568                                 fi
569                                 usleep 500000
570                                 timeout=$((timeout+1))
571                         done
572                         return 0
573                 fi
574         fi
575         return 1
576 }
577
578 # This must be last line !
579 # vi:syntax=sh
This page took 0.077565 seconds and 4 git commands to generate.