blob: 55b324277483aebb1bb2ec7aef763f1d3c7940c6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
#!/bin/bash
PATH=/sbin:/usr/sbin:$PATH
rt_tables=/etc/iproute2/rt_tables
confdir=/etc/dgd
linkdir=$confdir/links
active=$confdir/active
forwarders=/var/named/forwarders
# 1 2 3 4 5 6 7
# linksetup NAME IF IP GW NS1 NS2 [NET]
linksetup() {
n=$(awk '
BEGIN { i = -1 }
/^#/ { next }
/^$/ { next }
$2=="'$1'" { i = $1; exit(0) }
{ t[$1] = $2; if ($1>n) n = $1 }
END {
if (i == -1) {
for (i=0; i < n && t[i]; i++);
print i
}
}' $rt_tables)
if [ -n "$n" ]; then
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
fi
test -d $linkdir || mkdir -p $linkdir
cat > "$linkdir/$1" <<EOF
[link $1]
name=$1
if=$2
ip=$3
gw=$4
ns=$5 $6
net=$7
EOF
/etc/rc.d/rc.dgd reload
}
readlinkinfo() {
unset link_if link_ip link_gw link_ns link_net
eval `sed -r 's/^[[:space:]]+//;/^#/d;/^\[/d;s/(.[^=[:space:]]*)[[:space:]]*=[[:space:]]*(.*)/link_\1="\2"/' $1`
}
# linkcleanup NAME
linkcleanup() {
test -f "$linkdir/$1" && rm "$linkdir/$1"
ip route flush table $1
/etc/rc.d/rc.dgd reload
}
#linkup NAME [ IF IP GW NS1 NS2 [NET] ]
linkup() {
local name=$1 link_if link_ip link_gw link_ns link_net
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 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 '
BEGIN { print "forwarders {" }
{ for (i = 1; i <= NF; i++) print " " $(i) ";"; }
END { print "};" }' > $forwarders
rndc reload || /etc/rc.d/rc.bind restart
export link_if
/etc/rc.d/rc.iptables -f nat start
}
#linkdown NAME [ IF IP GW NS1 NS2 [NET] ]
linkdown() {
local name=$1 link_if link_ip link_gw link_ns link_net link_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
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
}
command=$1
shift
case $command in
setup) linksetup "$@";;
cleanup) linkcleanup "$@";;
up) linkup "$@";;
down) linkdown "$@";;
*) echo >&2 "$0: unrecognized command";;
esac
|