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