]> git.pld-linux.org Git - projects/rc-scripts.git/blob - sysconfig/network-scripts/functions.network
- allow tnlcfg- prefix in interface CONFIGs
[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 #
356 # folowing function calculates network prefix from given network mask
357 # (c) 1999 Grzegorz Stanislawski <stangrze@open.net.pl>
358 #
359 calcprefix()
360 {
361         typeset len olen bad prefix
362
363         prefix=0
364         olen=8
365         bad=0
366         for i in 1 2 3 4; do
367                 len=0
368                 j=$(echo "$1" | awk -F"." "{ print \$${i} }")
369                 case "$j" in
370                   255)  len=8 ;;
371                   254)  len=7 ;;
372                   252)  len=6 ;;
373                   248)  len=5 ;;
374                   240)  len=4 ;;
375                   224)  len=3 ;;
376                   192)  len=2 ;;
377                   128)  len=1 ;;
378                   0)    len=0 ;;
379                   *)    len=300 ;;
380                 esac
381                 [ "$len" -gt "$olen" ] && bad=1
382                 prefix=$(($prefix + $len))
383                 olen=$len
384         done
385
386         if [ "$bad" = "0" ]; then
387                 echo "$prefix"
388         else
389                 echo "32"
390         fi
391         return
392 }
393
394 #
395 # folowing function calculates network mask from given prefix
396 # (c) 1999 Grzegorz Stanislawski <stangrze@open.net.pl>
397 #
398 calcnetmask()
399 {
400         typeset prefix a MASK
401
402         MASK=""
403         if [ "`echo "${1}" | grep "^[0-9]"`" = "" ]; then
404                 prefix=32
405         else
406                 typeset -i prefix=$1
407         fi
408         for i in 1 2 3 4; do
409                 case $prefix in
410                   7)    a=254 ;;
411                   6)    a=252 ;;
412                   5)    a=248 ;;
413                   4)    a=240 ;;
414                   3)    a=224 ;;
415                   2)    a=192 ;;
416                   1)    a=128 ;;
417                   *)
418                         [ $prefix -ge 8 ] && a=255
419                         [ $prefix -le 0 ] && a=0
420                         ;;
421                 esac
422
423                 prefix="$(( $prefix - 8))"
424                 if [ -z "$MASK" ]; then
425                         MASK=$a
426                 else
427                         MASK=$MASK.$a
428                 fi
429         done
430
431         echo $MASK
432         return
433 }
434
435 # Retrievies PPPD PID and real interface name from /var/run/ppp-*.pid
436 get_ppp_device_and_pid ()
437 {
438         if [ -f "/var/run/ppp-$DEVNAME.pid" ] ; then
439                 eval `{
440                         read PID ; echo "PID='$PID'"
441                         read REALDEVICE ; echo "REALDEVICE=$REALDEVICE"
442                 } < "/var/run/ppp-$DEVNAME.pid"`
443         fi
444
445         if [ -z "$REALDEVICE" ] ; then
446                 REALDEVICE=$DEVICE
447         fi
448 }
449
450 # following function setups advanced routing rules
451 # Olgierd Pieczul <wojrus@pld-linux.org>
452 setup_ip_rules ()
453 {
454         typeset args prio from src
455
456         if [ -f /etc/sysconfig/static-routes ] ; then
457                 if is_yes "$1"; then
458                         egrep "^(from|to|iif|tos|fwmark|dev|pref|priority|prio)[[:blank:]]" /etc/sysconfig/static-routes | while read args; do
459                                 /sbin/ip rule add $args
460                         done
461                 elif is_no "$1"; then
462                         /sbin/ip rule show | egrep -v -e "from all lookup (main|default|local) \$" -e " map-to " | while read prio from src args; do
463                                 [ "$src" == "all" ] && ip rule delete $args || ip rule delete $from $src $args
464                         done
465                 fi
466         fi
467 }
468
469 is_wireless_device ()
470 {
471         if [ -x /sbin/iwconfig ]; then
472                 LC_ALL=C iwconfig "${1}" 2>&1 | grep -q "no wireless extensions" || return 0
473         fi
474         return 1
475 }
476
477 wireless_param ()
478 {
479         device="$1"
480         if [ "$2" = "br" ]; then
481                 prefix="${device}_"
482         else
483                 prefix=""
484         fi
485
486         if [ -z "$(eval echo \$${prefix}WLAN_NICKNAME)" ]; then
487                  WLAN_NICKNAME="$(hostname -f 2>/dev/null || hostname 2>/dev/null || echo localhost)"
488         else
489                  WLAN_NICKNAME="$(eval echo \$${prefix}WLAN_NICKNAME)"
490         fi
491
492         # wlan mode needs to be first
493         [ -n "$(eval echo \$${prefix}WLAN_MODE)" ] && \
494                 iwconfig ${device} mode "$(eval echo \$${prefix}WLAN_MODE)"
495         iwconfig ${device} nick ${WLAN_NICKNAME}
496         [ -n "$(eval echo \$${prefix}WLAN_NWID)" ] && \
497                 iwconfig ${device} nwid "$(eval echo \$${prefix}WLAN_NWID)"
498         if [ -n "$(eval echo \$${prefix}WLAN_FREQ)" -a "$(eval echo \$${prefix}${WLAN_MODE})" != "Managed" ] ; then
499                 iwconfig ${device} freq "$(eval echo \$${prefix}WLAN_FREQ)"
500         elif [ -n "$(eval echo \$${prefix}WLAN_CHANNEL)" -a "$(eval echo \$${prefix}${WLAN_MODE})" != "Managed" ]; then
501                 iwconfig ${device} channel "$(eval echo \$${prefix}WLAN_CHANNEL)"
502         fi
503         [ -n "$(eval echo \$${prefix}WLAN_SENS)" ] && \
504                 iwconfig ${device} sens "$(eval echo \$${prefix}WLAN_SENS)"
505         [ -n "$(eval echo \$${prefix}WLAN_AP)" ] && \
506                 iwconfig ${device} ap "$(eval echo \$${prefix}WLAN_AP)"
507         [ -n "$(eval echo \$${prefix}WLAN_BITRATE)" ] && \
508                 iwconfig ${device} rate "$(eval echo \$${prefix}WLAN_BITRATE)"
509         [ -n "$(eval echo \$${prefix}WLAN_RTS_THRESHOLD)" ] && \
510                 iwconfig ${device} rts "$(eval echo \$${prefix}WLAN_RTS_THRESHOLD)"
511         [ -n "$(eval echo \$${prefix}WLAN_FRAGMENTATION_THRESHOLD)" ] && \
512                 iwconfig ${device} frag "$(eval echo \$${prefix}WLAN_FRAGMENTATION_THRESHOLD)"
513         if [ -n "$(eval echo \$${prefix}WLAN_KEY)" ]; then
514                 iwconfig ${device} key "$(eval echo \$${prefix}WLAN_KEY)"
515                 [ -n "$(eval echo \$${prefix}WLAN_ENCRYPTION)" ] && \
516                         iwconfig ${device} key "$(eval echo \$${prefix}WLAN_ENCRYPTION)"
517         fi
518         if is_no "$(eval echo \$${prefix}WLAN_ENCRYPTION)"; then
519                 iwconfig ${device} key off
520         fi
521         [ -n "$(eval echo \$${prefix}WLAN_POWER)" ] && \
522                 iwconfig ${device} power "$(eval echo \$${prefix}WLAN_POWER)"
523         [ -n "$(eval echo \$${prefix}WLAN_TXPOWER)" ] && \
524                 iwconfig ${device} txpower "$(eval echo \$${prefix}WLAN_TXPOWER)"
525         [ -n "$(eval echo \$${prefix}WLAN_RETRY)" ] && \
526                 iwconfig ${device} retry "$(eval echo \$${prefix}WLAN_RETRY)"
527         [ -n "$(eval echo \$${prefix}WLAN_NWID)" ] && iwconfig ${device} \
528                 nwid "$(eval echo \$${prefix}WLAN_NWID)"
529
530         # essid should be last due to network rescanning by wlan devices
531         [ -n "$(eval echo \$${prefix}WLAN_ESSID)" ] && iwconfig ${device} \
532                 essid "$(eval echo \$${prefix}WLAN_ESSID)"
533
534         if is_yes "$(eval echo \$${prefix}WLAN_COMMIT)"; then
535                 iwconfig ${device} commit
536         fi
537 }
538
539 check_mii_tool ()
540 {
541         [ -x /sbin/mii-tool ] || return 2
542         output=$(LC_ALL=C mii-tool $1 2>&1)
543         echo $output | LC_ALL=C grep -q "link ok" && return 1
544         echo $output | LC_ALL=C grep -q "no link" && return 0 || return 2
545 }
546
547 check_ethtool ()
548 {
549         [ -x /sbin/ethtool ] || return 2
550         output=$(LC_ALL=C ethtool $1 2>&1)
551         echo $output | LC_ALL=C grep -q "Link detected: yes" && return 1
552         echo $output | LC_ALL=C grep -q "Link detected: no" && return 0 || return 2
553 }
554
555 check_iwconfig ()
556 {
557         [ -x /sbin/iwconfig ] || return 2
558         output=$(LC_ALL=C iwconfig $1 2>&1)
559         echo $output | LC_ALL=C grep -q "radio off" && return 0 || return 2
560 }
561
562 check_link_down ()
563 {
564         if [ -x /sbin/mii-tool -o -x /sbin/ethtool -o -x /sbin/iwconfig ]; then
565                 if ! LC_ALL=C ip link show dev $1 2>/dev/null| grep -q UP ; then
566                         ip link set dev $1 up >/dev/null 2>&1
567                         timeout=0
568                         while [ $timeout -le 10 ]; do
569                                 check_mii_tool $1
570                                 m=$?
571                                 check_ethtool $1
572                                 e=$?
573                                 check_iwconfig $1
574                                 i=$?
575                                 if [ $m -eq 1 ] || [ $e -eq 1 ] ; then
576                                         return 1
577                                 fi
578                                 if [ $m -eq 2 ] && [ $e -eq 2 ] && [ $i -eq 2 ]; then
579                                         return 1
580                                 fi
581                                 usleep 500000
582                                 timeout=$((timeout+1))
583                         done
584                         return 0
585                 fi
586         fi
587         return 1
588 }
589
590 # This must be last line !
591 # vi:syntax=sh
This page took 0.175678 seconds and 4 git commands to generate.