]> git.pld-linux.org Git - projects/rc-scripts.git/blob - sysconfig/network-scripts/functions.network
- support $IPADDR + $NETMASK combination if no prefix in $IPADDR present
[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         # check if ipaddr doesn't contain network length -- use $NETMASK then
200         if [[ "$IP4ADDR" != */* ]] && [ "$NETMASK" ]; then
201                 IP4ADDR=$IP4ADDR/$(calcprefix $NETMASK)
202         fi
203
204         # check if we have ipv6 or ipv4 address
205         if [[ "${IP4ADDR}" = *:* ]]; then
206                 IP6ADDR=${IP4ADDR}
207                 IP4ADDR=""
208         else
209                 eval IP4ADDROPT="\$IP_AOPTS${IP4_PRIM_IF:-}"
210                 eval IP4ROUTEOPT="\$IP_ROPTS${IP4_PRIM_IF:-}"
211         fi
212         if [ -n "${IP6_PRIM_IF}" ] ; then
213                 eval IP6ADDR="\$IPADDR${IP6_PRIM_IF:-}"
214                 eval IP6ADDROPT="\$IPV6_AOPTS${IP6_PRIM_IF:-}"
215         fi
216         if [ -n "${IP4_SRC_IF}" ] ; then
217                 eval IP4SRCADDR="\$IPADDR${IP4_SRC_IF}"
218                 IP4SRCADDR=$(echo ${IP4SRCADDR} | awk ' { gsub(/\/.*/,NIL); print "src " $0; } ')
219         fi
220         if [ -n "${IP6_SRC_IF}" ] ; then
221                 eval IP6SRCADDR="\$IPADDR${IP6_SRC_IF}"
222                 IP6SRCADDR=$(echo ${IP6SRCADDR} | awk ' { gsub(/\/.*/,NIL); print "src " $0; } ')
223         fi
224
225         # new rc-scripts 0.4.x option
226         if [ -z "$HANDLING" ]; then
227                 HANDLING=0
228         fi
229
230         # set handling for bridge
231         case "$DEVICETYPE" in
232           br|atm|lec|irda|vlan)
233                 HANDLING=1
234                 ;;
235         esac
236
237         # Multicast ready devices
238         if is_yes "$MULTICAST"; then
239                 MULTICAST="on"
240         else
241                 case "$DEVICETYPE" in
242                   eth|br)
243                         MULTICAST="on"
244                         ;;
245                   *)
246                         MULTICAST="off"
247                         ;;
248                 esac
249         fi
250
251         # ARP ready devices
252         if [ -n "$ARP" ] ; then
253                 if is_yes "$ARP"; then
254                         ARP="arp on"
255                 else
256                         ARP="arp off"
257                 fi
258         fi
259 }
260
261 check_device_down ()
262 {
263         if (ip link show dev ${DEVICE} 2> /dev/null | grep -q UP); then
264                 return 1
265         else
266                 return 0
267         fi
268 }
269
270 setup_ip_gw_ro ()
271 {
272         # IPv4 gateway
273         if is_yes "$IPV4_NETWORKING"; then
274                 if [ -z "${GATEWAYDEV}" -o "${GATEWAYDEV}" = "${DEVICE}" ]; then
275                         # set up default gateway
276                         if [ -n "${GATEWAY}" ]; then
277                                 ip -4 route add default via ${GATEWAY} dev ${DEVICE} ${IP4SRCADDR} onlink 2>/dev/null
278                                 if [ $? = 0 ]; then
279                                         DEFGW=${GATEWAY}
280                                 else
281                                         # The default gateway could be set via eth0, while bringing up eth1 we shouldn't set default gateway again.
282                                         # To prevent this message just set GATEWAYDEV=eth0 in /etc/sysconfig/network.
283                                         nls "Warning: Default gateway already set proably via other interface. Do you need to setup GATEWAYDEV?"
284                                 fi
285                         elif [ "${GATEWAYDEV}" = "${DEVICE}" ]; then
286                                 ip -4 route add default dev ${DEVICE} ${IP4SRCADDR}
287                         fi
288                 fi
289         fi
290
291         # IPv6 gateway && IPv6 globalroute
292         if is_yes "$IPV6_NETWORKING"; then
293                 if [ -z "${GATEWAY6DEV}" -o "${GATEWAY6DEV}" = "${DEVICE}" ]; then
294                         # set up default gateway
295                         if [ -n "${GATEWAY6}" ]; then
296                                 ip -6 route add default via ${GATEWAY6} dev ${DEVICE} ${IP6SRCADDR} onlink
297                                 DEFGW6=${GATEWAY6}
298                         elif [ "${GATEWAY6DEV}" = "${DEVICE}" ]; then
299                                 ip -6 route add default dev ${DEVICE} ${IP6SRCADDR}
300                         fi
301                 fi
302                 if [ -z "${IPV6_GLOBALROUTEDEV}" -o "${IPV6_GLOBALROUTEDEV}" = "${DEVICE}" ]; then
303                         # set up default route
304                         if [ -n "${IPV6_GLOBALROUTEGW}" ]; then
305                                 ip -6 route add 2000::/3 via ${IPV6_GLOBALROUTEGW} dev ${DEVICE} ${IP6SRCADDR} onlink
306                         elif [ "${IPV6_GLOBALROUTEDEV}" = "${DEVICE}" ]; then
307                                 ip -6 route add 2000::/3 dev ${DEVICE} ${IP6SRCADDR}
308                         fi
309                 fi
310         fi
311 }
312
313 #
314 # following function sets up routes not associated to any device
315 # eg. unreachable or blackhole routes
316 # (c) 1999 Jacek Konieczny <jajcus@pld-linux.org>
317 #
318 setup_routes()
319 {
320         typeset args
321
322         if [ -f /etc/sysconfig/static-routes ]; then
323                 if [ "$1" = "on" -o "$1" = "yes" ] ; then
324                         egrep "^(none|any)[[:blank:]]" /etc/sysconfig/static-routes | while read device args; do
325                                 /sbin/ip route add $args
326                         done
327                 else
328                         egrep "^(none|any)[[:blank:]]" /etc/sysconfig/static-routes | while read device args; do
329                                 /sbin/ip route del $args 2>/dev/null
330                         done
331                 fi
332         fi
333 }
334
335 # Add ONLY IPv4 address (IPv6 address is added automaticly)
336 set_up_loopback()
337 {
338         if is_yes "$IPV4_NETWORKING"; then
339                 ip addr add 127.0.0.1/8 dev lo
340         fi
341         ip link set dev lo up
342 }
343
344 set_down_loopback()
345 {
346         ip addr flush dev lo 2>&1 | grep -v "Nothing to flush"
347         ip link set dev lo down
348 }
349
350 modprobe_net()
351 {
352         if is_yes "$IPV6_NETWORKING" && is_module "ipv6"; then
353                 _modprobe single -k ipv6
354         fi
355
356         if is_yes "$IPX" && is_module "ipx"; then
357                 _modprobe single -k ipx
358         fi
359 }
360
361 # calculate network prefix from given network mask
362 calcprefix()
363 {
364         typeset old_IFS netmask prefix endp
365
366         old_IFS=$IFS
367         IFS='.'
368         netmask=$(echo $1)
369         IFS=$old_IFS
370
371         prefix=0
372         endp=0
373         for n in $netmask ; do
374                 for i in 128 64 32 16 8 4 2 1 ; do
375                         if [ $(($n & $i)) -ne 0 ]; then
376                                 if [ $endp -eq 0 ]; then
377                                         prefix=$(($prefix + 1))
378                                 else
379                                         echo "32"
380                                         return
381                                 fi
382                         else
383                                 endp=1
384                         fi
385                 done
386         done
387         echo $prefix
388 }
389
390 # calculate network mask from given prefix
391 # (c) 1999 Grzegorz Stanislawski <stangrze@open.net.pl>
392 calcnetmask()
393 {
394         typeset prefix a MASK
395
396         MASK=""
397         if [ -n "${1##[0-9]*}" ]; then
398                 prefix=32
399         else
400                 typeset -i prefix=$1
401         fi
402         for i in 1 2 3 4; do
403                 case $prefix in
404                   7)    a=254 ;;
405                   6)    a=252 ;;
406                   5)    a=248 ;;
407                   4)    a=240 ;;
408                   3)    a=224 ;;
409                   2)    a=192 ;;
410                   1)    a=128 ;;
411                   *)
412                         [ $prefix -ge 8 ] && a=255
413                         [ $prefix -le 0 ] && a=0
414                         ;;
415                 esac
416
417                 prefix="$(( $prefix - 8))"
418                 if [ -z "$MASK" ]; then
419                         MASK=$a
420                 else
421                         MASK=$MASK.$a
422                 fi
423         done
424
425         echo $MASK
426         return
427 }
428
429 # Retrievies PPPD PID and real interface name from /var/run/ppp-*.pid
430 get_ppp_device_and_pid ()
431 {
432         if [ -f "/var/run/ppp-$DEVNAME.pid" ] ; then
433                 eval $(
434                 {
435                         read PID ; echo "PID='$PID'"
436                         read REALDEVICE ; echo "REALDEVICE=$REALDEVICE"
437                 } < "/var/run/ppp-$DEVNAME.pid")
438         fi
439
440         if [ -z "$REALDEVICE" ] ; then
441                 REALDEVICE=$DEVICE
442         fi
443 }
444
445 # following function setups advanced routing rules
446 # Olgierd Pieczul <wojrus@pld-linux.org>
447 setup_ip_rules ()
448 {
449         typeset args prio from src
450
451         if [ -f /etc/sysconfig/static-routes ] ; then
452                 if is_yes "$1"; then
453                         egrep "^(from|to|iif|tos|fwmark|dev|pref|priority|prio)[[:blank:]]" /etc/sysconfig/static-routes | while read args; do
454                                 /sbin/ip rule add $args
455                         done
456                 elif is_no "$1"; then
457                         /sbin/ip rule show | egrep -v -e "from all lookup (main|default|local) \$" -e " map-to " | while read prio from src args; do
458                                 [ "$src" == "all" ] && ip rule delete $args || ip rule delete $from $src $args
459                         done
460                 fi
461         fi
462 }
463
464 is_wireless_device ()
465 {
466         if [ -x /sbin/iwconfig ]; then
467                 LC_ALL=C iwconfig "${1}" 2>&1 | grep -q "no wireless extensions" || return 0
468         fi
469         return 1
470 }
471
472 wireless_param ()
473 {
474         device="$1"
475         if [ "$2" = "br" ]; then
476                 prefix="${device}_"
477         else
478                 prefix=""
479         fi
480
481         if [ -z "$(eval echo \$${prefix}WLAN_NICKNAME)" ]; then
482                  WLAN_NICKNAME="$(hostname -f 2>/dev/null || hostname 2>/dev/null || echo localhost)"
483         else
484                  WLAN_NICKNAME="$(eval echo \$${prefix}WLAN_NICKNAME)"
485         fi
486
487         # wlan mode needs to be first
488         [ -n "$(eval echo \$${prefix}WLAN_MODE)" ] && \
489                 iwconfig ${device} mode "$(eval echo \$${prefix}WLAN_MODE)"
490         iwconfig ${device} nick ${WLAN_NICKNAME}
491         [ -n "$(eval echo \$${prefix}WLAN_NWID)" ] && \
492                 iwconfig ${device} nwid "$(eval echo \$${prefix}WLAN_NWID)"
493         if [ -n "$(eval echo \$${prefix}WLAN_FREQ)" -a "$(eval echo \$${prefix}${WLAN_MODE})" != "Managed" ] ; then
494                 iwconfig ${device} freq "$(eval echo \$${prefix}WLAN_FREQ)"
495         elif [ -n "$(eval echo \$${prefix}WLAN_CHANNEL)" -a "$(eval echo \$${prefix}${WLAN_MODE})" != "Managed" ]; then
496                 iwconfig ${device} channel "$(eval echo \$${prefix}WLAN_CHANNEL)"
497         fi
498         [ -n "$(eval echo \$${prefix}WLAN_SENS)" ] && \
499                 iwconfig ${device} sens "$(eval echo \$${prefix}WLAN_SENS)"
500         [ -n "$(eval echo \$${prefix}WLAN_AP)" ] && \
501                 iwconfig ${device} ap "$(eval echo \$${prefix}WLAN_AP)"
502         [ -n "$(eval echo \$${prefix}WLAN_BITRATE)" ] && \
503                 iwconfig ${device} rate "$(eval echo \$${prefix}WLAN_BITRATE)"
504         [ -n "$(eval echo \$${prefix}WLAN_RTS_THRESHOLD)" ] && \
505                 iwconfig ${device} rts "$(eval echo \$${prefix}WLAN_RTS_THRESHOLD)"
506         [ -n "$(eval echo \$${prefix}WLAN_FRAGMENTATION_THRESHOLD)" ] && \
507                 iwconfig ${device} frag "$(eval echo \$${prefix}WLAN_FRAGMENTATION_THRESHOLD)"
508         if [ -n "$(eval echo \$${prefix}WLAN_KEY)" ]; then
509                 iwconfig ${device} key "$(eval echo \$${prefix}WLAN_KEY)"
510                 [ -n "$(eval echo \$${prefix}WLAN_ENCRYPTION)" ] && \
511                         iwconfig ${device} key "$(eval echo \$${prefix}WLAN_ENCRYPTION)"
512         fi
513         if is_no "$(eval echo \$${prefix}WLAN_ENCRYPTION)"; then
514                 iwconfig ${device} key off
515         fi
516         [ -n "$(eval echo \$${prefix}WLAN_POWER)" ] && \
517                 iwconfig ${device} power "$(eval echo \$${prefix}WLAN_POWER)"
518         [ -n "$(eval echo \$${prefix}WLAN_TXPOWER)" ] && \
519                 iwconfig ${device} txpower "$(eval echo \$${prefix}WLAN_TXPOWER)"
520         [ -n "$(eval echo \$${prefix}WLAN_RETRY)" ] && \
521                 iwconfig ${device} retry "$(eval echo \$${prefix}WLAN_RETRY)"
522         [ -n "$(eval echo \$${prefix}WLAN_NWID)" ] && iwconfig ${device} \
523                 nwid "$(eval echo \$${prefix}WLAN_NWID)"
524
525         # essid should be last due to network rescanning by wlan devices
526         [ -n "$(eval echo \$${prefix}WLAN_ESSID)" ] && iwconfig ${device} \
527                 essid "$(eval echo \$${prefix}WLAN_ESSID)"
528
529         if is_yes "$(eval echo \$${prefix}WLAN_COMMIT)"; then
530                 iwconfig ${device} commit
531         fi
532 }
533
534 check_mii_tool ()
535 {
536         [ -x /sbin/mii-tool ] || return 2
537         output=$(LC_ALL=C mii-tool $1 2>&1)
538         echo $output | LC_ALL=C grep -q "link ok" && return 1
539         echo $output | LC_ALL=C grep -q "no link" && return 0 || return 2
540 }
541
542 check_ethtool ()
543 {
544         [ -x /sbin/ethtool ] || return 2
545         output=$(LC_ALL=C ethtool $1 2>&1)
546         echo $output | LC_ALL=C grep -q "Link detected: yes" && return 1
547         echo $output | LC_ALL=C grep -q "Link detected: no" && return 0 || return 2
548 }
549
550 check_iwconfig ()
551 {
552         [ -x /sbin/iwconfig ] || return 2
553         output=$(LC_ALL=C iwconfig $1 2>&1)
554         echo $output | LC_ALL=C grep -q "radio off" && return 0 || return 2
555 }
556
557 check_link_down ()
558 {
559         if [ -x /sbin/mii-tool -o -x /sbin/ethtool -o -x /sbin/iwconfig ]; then
560                 if ! LC_ALL=C ip link show dev $1 2>/dev/null| grep -q UP ; then
561                         ip link set dev $1 up >/dev/null 2>&1
562                         timeout=0
563                         while [ $timeout -le 10 ]; do
564                                 check_mii_tool $1
565                                 m=$?
566                                 check_ethtool $1
567                                 e=$?
568                                 check_iwconfig $1
569                                 i=$?
570                                 if [ $m -eq 1 ] || [ $e -eq 1 ] ; then
571                                         return 1
572                                 fi
573                                 if [ $m -eq 2 ] && [ $e -eq 2 ] && [ $i -eq 2 ]; then
574                                         return 1
575                                 fi
576                                 usleep 500000
577                                 timeout=$((timeout+1))
578                         done
579                         return 0
580                 fi
581         fi
582         return 1
583 }
584
585 # This must be last line !
586 # vi:syntax=sh
This page took 0.144406 seconds and 4 git commands to generate.