|
From: Serge L. <ser...@gm...> - 2010-08-30 20:23:33
|
Update of /cvsroot/devil-linux/build/config/etc/init.d In directory sfp-cvsdas-3.v30.ch3.sourceforge.com:/tmp/cvs-serv22598/init.d Modified Files: network Log Message: - added configuration for all types of routes (closed bug #87) - added configuration for ip rules - added tunnel interface configuration example - fixed improper bradcast address assignment Index: network =================================================================== RCS file: /cvsroot/devil-linux/build/config/etc/init.d/network,v retrieving revision 1.48 retrieving revision 1.49 diff -u -d -r1.48 -r1.49 --- network 28 Aug 2010 14:39:13 -0000 1.48 +++ network 30 Aug 2010 19:59:02 -0000 1.49 @@ -129,6 +129,7 @@ MODULE= MAC= ROUTE= + RULE= BR_IF= BONDING_MASTER= BONDING_SLAVES= @@ -139,6 +140,7 @@ IPV6ADDR= IPV6ROUTE= + # Wireless WIRELESS= ESSID= NWID= @@ -148,6 +150,12 @@ RATE= KEY= + # Tunnel + TUNNEL= + LOCAL= + REMOTE= + TUN_OPTS= + # # Load the variables from interface config file # @@ -164,7 +172,6 @@ fi fi - if [ "$WIRELESS" = "yes" ]; then setup_wireless $DEVICE fi @@ -208,10 +215,22 @@ dhcp_client_start $DEVICE "$DHCP_OPTIONS" else - BCAST=""; test -n "$BROADCAST" && BCAST="broadcast $BROADCAST" + BCAST=""; test -n "$BROADCAST" && BCAST="broadcast $BROADCAST" || BCAST="broadcast +" NMASK=""; test -n "$NETMASK" && NMASK="/$NETMASK" + # Not elegant, but for code below $DEVICE sould be a tunnel name + if [ "$TUNNEL" = "yes" ]; then + if [ -n "$DEVICE" ] ; then + local TUN_DEVICE="dev $DEVICE" + fi + DEVICE=$IF + fi + echo -n "Starting interface $DEVICE "; ret=0 + if [ "$TUNNEL" = "yes" ]; then + ip tunnel add $DEVICE mode $MODE local $LOCAL remote $REMOTE $TUN_DEVICE $TUN_OPTS; let ret=$ret+$? + fi + ip link set $DEVICE up; let ret=$ret+$? if [ -n "$IP" ]; then # configure IPv4 address @@ -239,56 +258,37 @@ evaluate_retval fi + # + # Routes + # Add ipv4 routes if [ -n "$ROUTE" ]; then - for route_info in ${ROUTE} ; do - destination=$(echo $route_info | cut -f1 -d:) - gateway=$(echo $route_info | cut -f2 -d:) - target=$(echo $destination | cut -f1 -d/) - netmask=$(echo $destination | cut -f2 -d/) - - # filter bogus records - test -z "$destination" && continue - - # local route? - if [ -z "$gateway" -o "$gateway" = "$destination" ] ; then - # local route (gateway is empty or equal to destination) - gateway="" - # otherewise it's a route via a gateway - fi - - # host or network route? - if [ -z "$netmask" -o "$netmask" = "$target" ]; then - # a host route - CMD=host - netmask="" - else - # network route - CMD=net - fi - - # add the route - if [ -z "${netmask##*.*}" ]; then - echo " adding route to $CMD ${target}${netmask:+/$netmask}${gateway:+ via gateway $gateway} on $DEVICE" - route add -$CMD ${target} ${netmask:+netmask $netmask} ${gateway:+gw $gateway} dev $DEVICE - else - echo " adding route to -$CMD $destination ${gateway:+ via gateway $gateway} on $DEVICE" - route add -$CMD ${destination} ${gateway:+gw $gateway} dev $DEVICE - fi + grep "^ROUTE=" ${CONFIG_DIR}/${CONFIG_FILE}$IF | while read line; + do + eval $line + echo " adding route to \"$ROUTE\" on $DEVICE" + ip route add $ROUTE done fi - # IPv6 routing can be done with link-local addresses even without explicit address configuration + # Add ipv6 routes if [ -n "$IPV6ROUTE" ]; then - for route_info in ${IPV6ROUTE} ; do - destination=$(echo $route_info | cut -f1 -d\|) - gateway=$(echo $route_info | cut -f2 -d\|) - - # filter bogus records - test -z "$destination" && continue - + grep "^IPV6ROUTE=" ${CONFIG_DIR}/${CONFIG_FILE}$IF | while read line; + do + eval $line # add the route - echo " adding route to $destination ${gateway:+ via gateway $gateway} on $DEVICE" - ip -f inet6 route add $destination ${gateway:+via $gateway} dev $DEVICE + echo " adding route to \"$IPV6ROUTE\" on $DEVICE" + ip -f inet6 route add $IPV6ROUTE + done + fi + + # + # Rules (advanced routing) + if [ -n "$RULE" ]; then + grep "^RULE=" ${CONFIG_DIR}/${CONFIG_FILE}$IF | while read line; + do + eval $line + echo " adding rule \"$RULE\" on $DEVICE" + ip rule add $RULE done fi @@ -305,6 +305,8 @@ DEVICE= VLANID= BR_IF= + ROUTE= + RULE= # # Load the variables from interface config file @@ -321,6 +323,38 @@ DEVICE=$(get_vlan_name "$PHYDEV" "$VLANID") fi + # Rules (advanced routing) + if [ -n "$RULE" ]; then + echo "Removing rules from interface $DEVICE" + grep "^RULE=" ${CONFIG_DIR}/${CONFIG_FILE}$IF | while read line; + do + eval $line + echo " removing rule \"$RULE\" on $DEVICE" + ip rule del $RULE + done + fi + + # Routes + if [ -n "$ROUTE" ]; then + echo "Removing routes from interface $DEVICE" + grep "^ROUTE=" ${CONFIG_DIR}/${CONFIG_FILE}$IF | while read line; + do + eval $line + echo " removing route to \"$ROUTE\" on $DEVICE" + ip route del $ROUTE + done + fi + + if [ -n "$IPV6ROUTE" ]; then + grep "^IPV6ROUTE=" ${CONFIG_DIR}/${CONFIG_FILE}$IF | while read line; + do + eval $line + # add the route + echo " removing route to \"$IPV6ROUTE\" on $DEVICE" + ip -f inet6 route del $IPV6ROUTE + done + fi + # Bonding if [ "$BONDING_MASTER" = "yes" ]; then ifenslave -d $DEVICE $BONDING_SLAVES @@ -343,6 +377,12 @@ ip addr del $IP$NMASK $BCAST dev $DEVICE fi fi + + # Not elegant, but for code below $DEVICE sould be a tunnel name + if [ "$TUNNEL" = "yes" ]; then + DEVICE=$IF + fi + echo -n "Stopping interface $DEVICE" ip link set $DEVICE down 2>/dev/null evaluate_retval @@ -363,6 +403,13 @@ brctl delbr $DEVICE fi + # tunnel + if [ "$TUNNEL" = "yes" ]; then + echo -n "Removing tunnel $DEVICE" + ip tunnel del $DEVICE + evaluate_retval + fi + fi } @@ -431,9 +478,10 @@ # bring up the interface setup_interface $interface done -# -# Bonding Master -# + + # + # Bonding Master + # for interface in $(cd ${CONFIG_DIR}; ls -1 ${CONFIG_FILE}* 2>/dev/null | sed \ -e '/.sample/d' -e '/~/d' -e "s|${CONFIG_FILE}||" -e '/^lo$/d' -e '/^vlan/d' -e '/^eth/d' -ne '/^bond/p') do @@ -475,6 +523,20 @@ setup_interface $interface done + # + # tunnel interfaces + # + for interface in $(cd ${CONFIG_DIR}; ls -1 ${CONFIG_FILE}* 2>/dev/null | sed \ + -e '/.sample/d' -e '/~/d' -e "s|${CONFIG_FILE}||" -e '/^lo$/d' -e '/^vlan/d' -ne '/^tun/p') + do + # did user choose to only handle just one interface + # this time? + test -n "$ONLY_INTERFACE" -a "$ONLY_INTERFACE" != "$interface" \ + && continue + # bring up the interface + setup_interface $interface + done + # in single interface mode stop now test -n "$ONLY_INTERFACE" && exit |