diff options
Diffstat (limited to 'dgd/rc.uplink')
-rwxr-xr-x | dgd/rc.uplink | 88 |
1 files changed, 59 insertions, 29 deletions
diff --git a/dgd/rc.uplink b/dgd/rc.uplink index 239d85f..55b3242 100755 --- a/dgd/rc.uplink +++ b/dgd/rc.uplink @@ -26,6 +26,10 @@ END { echo "$n $1" >> $rt_tables fi ip rule add from $3 table $1 + ip rule add from $5 table $1 + if [ -n "$6" ]; then + ip rule add from $6 table $1 + fi ip route add default via $4 table $1 if [ -n "$7" ]; then ip route add $7 dev $2 src $3 table $1 @@ -40,6 +44,7 @@ gw=$4 ns=$5 $6 net=$7 EOF + /etc/rc.d/rc.dgd reload } readlinkinfo() { @@ -51,54 +56,79 @@ readlinkinfo() { linkcleanup() { test -f "$linkdir/$1" && rm "$linkdir/$1" ip route flush table $1 + /etc/rc.d/rc.dgd reload } -#linkup NAME +#linkup NAME [ IF IP GW NS1 NS2 [NET] ] linkup() { local name=$1 link_if link_ip link_gw link_ns link_net - shift - if [ -f "$linkdir/$name" ]; then - readlinkinfo "$linkdir/$name" - if [ -z "$link_gw" ]; then - echo >&2 "$0: $linkdir/$name: gw not set" + if [ $# -eq 1 ]; then + if [ -f "$linkdir/$name" ]; then + readlinkinfo "$linkdir/$name" + if [ -z "$link_gw" ]; then + echo >&2 "$0: $linkdir/$name: gw not set" + exit 1 + fi + else + echo >&2 "$0: $linkdir/$name: no such file" exit 1 fi - ip route add default via $link_gw - cat > $active <<EOT + elif [ $# -lt 6 ]; then + echo >&2 "$0: bad number of arguments to linkup" + exit 1 + else + link_if=$2 + link_ip=$3 + link_gw=$4 + link_ns="$5 $6" + link_net=$7 + fi + ip route add default via $link_gw + cat > $active <<EOT [core] active = $name EOT - echo "$link_ns" | awk ' + echo "$link_ns" | awk ' BEGIN { print "forwarders {" } { for (i = 1; i <= NF; i++) print " " $(i) ";"; } END { print "};" }' > $forwarders - rndc reload - else - echo >&2 "$0: $linkdir/$name: no such file" - exit 1 - fi + rndc reload || /etc/rc.d/rc.bind restart + export link_if + /etc/rc.d/rc.iptables -f nat start } -#linkdown NAME +#linkdown NAME [ IF IP GW NS1 NS2 [NET] ] linkdown() { local name=$1 link_if link_ip link_gw link_ns link_net link_active - shift - if [ -f "$linkdir/$name" ]; then - readlinkinfo "$linkdir/$name" - if [ -z "$link_gw" ]; then - echo >&2 "$0: $linkdir/$name: gw not set" - exit 1 - fi - ip route del default via $link_gw - if [ -r "$active" ]; then - readlinkinfo $active - if [ "$link_name" = "$name" ]; then - rm $active + if [ $# -eq 1 ]; then + if [ -f "$linkdir/$name" ]; then + readlinkinfo "$linkdir/$name" + if [ -z "$link_gw" ]; then + echo >&2 "$0: $linkdir/$name: gw not set" + exit 1 fi + else + echo >&2 "$0: $linkdir/$name: no such file" + exit 1 fi + elif [ $# -lt 6 ]; then + echo >&2 "$0: bad number of arguments to linkdown" + exit 1 else - echo >&2 "$0: $linkdir/$name: no such file" - exit 1 + link_if=$2 + link_ip=$3 + link_gw=$4 + link_ns="$5 $6" + link_net=$7 + fi + export link_if + /etc/rc.d/rc.iptables -f nat stop + ip route del default via $link_gw + if [ -r "$active" ]; then + readlinkinfo $active + if [ "$link_name" = "$name" ]; then + rm $active + fi fi } |