File: arabridge

package info (click to toggle)
aranym 0.9.4beta2-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 7,468 kB
  • ctags: 15,193
  • sloc: cpp: 69,881; ansic: 28,236; sh: 3,470; asm: 1,818; makefile: 706; perl: 492; objc: 225
file content (193 lines) | stat: -rwxr-xr-x 4,087 bytes parent folder | download | duplicates (2)
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
#!/bin/bash

# ARAnyM - bridging network
# STanda (c) 2004
#
# description: TUN/TAP driver using transparent bridge networking setup
#
# dependencies: tun module, tunctl (kernel-utils),
#               bridge module, brctl (bridge-utils)
#
# processname: arabridge 
# chkconfig: - 62 18


# source function library
# . /etc/rc.d/init.d/functions

# TO CHANGE!!!
USER=joy

TAPS=tap0
BRIDGE=br0
NIF=eth0

LOCK=/var/lock/subsys/arabridge

# make sure grep in ifconfig output works
LC_ALL=C

# defaultroute's nif
DR_NIF=$(/sbin/route -n 2>/dev/null | awk '/^0\.0\.0\.0/ {print $8}')
DEFGW=$(/sbin/route -n 2>/dev/null | awk '/^0\.0\.0\.0/ {print $2}')

# do we have the default route NIF?
DEF_ROUTE=0
if [ -n "$DR_NIF" -a "$NIF" = "$DR_NIF" -a -n "$DEFGW" ]; then
	DEF_ROUTE=1
	echo "Playing with default route at $DR_NIF with gateway to $DEFGW"
fi

success()
{
	echo "[OK]"
}

failure()
{
	echo "[FAILED]"
}

status()
{
	echo "status $1"
}

start_tap()
{
    TAP="$1"
    /sbin/ifconfig $TAP 1>/dev/null 2>/dev/null
    if [ $? -ne 0 ]; then
        echo "Creating device $TAP..."
        TAP=$(tunctl -t $TAP -u $USER)
    fi
}

case "$1" in
  start)
	echo -n "Starting TUN/TAP bridging: "

	# save the NIF name
	echo $NIF >$LOCK

	IP=$(/sbin/ifconfig $NIF | awk '/inet addr:/ {print substr($2, 6)}')
	BCAST=$(/sbin/ifconfig $NIF | awk '/inet addr:/ {print substr($3, 7)}')
	NETMASK=$(/sbin/ifconfig $NIF | awk '/inet addr:/ {print substr($4, 6)}')
	echo "NIF=$NIF IP=$IP, BCAST=$BCAST, NETMASK=$NETMASK, DEFGW=$DEFGW"

	/sbin/modprobe tun
	/sbin/modprobe bridge

	echo "Changing owner of /dev/net/tun..."
	[ -c /dev/net/tun ] && chown $USER /dev/net/tun

	echo "Setting up bridge $BRIDGE..."
	brctl addbr $BRIDGE
	brctl stp $BRIDGE off
	brctl setfd $BRIDGE 1
	brctl sethello $BRIDGE 1

	# add NIF to the bridge
	ifconfig $NIF 0.0.0.0
	brctl addif $BRIDGE $NIF 2>&1 | grep -qi "invalid"
        if [ $? -eq 0 ]; then
        	echo -n "... ERROR: wrong NIF type";
		failure; echo

		brctl delbr $BRIDGE
		rm -f $LOCK
		ifconfig $NIF $IP
		exit 1 
        fi
	echo

	# add all the tap devices
	for tap in $TAPS; do
		start_tap $tap
		brctl addif $BRIDGE $tap
		/sbin/ifconfig $tap 0.0.0.0 promisc up
	done

	# setup the bridge parameters
	/sbin/ifconfig $BRIDGE $IP netmask $NETMASK broadcast $BCAST

	# ifconfig needs to be called twice here after some delay
	# I don't really know what is going on :(
	# if not slept enough then the IP, NETMASK and BCAST setting
	# are cleared 8-| 
	sleep 1

	/sbin/ifconfig $NIF 0.0.0.0 promisc up

	# bring the bridge up
	/sbin/ifconfig $BRIDGE $IP netmask $NETMASK broadcast $BCAST up
	if [ $DEF_ROUTE -eq 0 ]; then
	   /sbin/route add default dev $BRIDGE
	   echo "adding normal route"
	else
	   /sbin/route add default dev $BRIDGE gw $DEFGW
	   echo "adding gateway route"
	fi

	echo
        success
	echo
	;;
  stop)
	echo -n "Shutting down arabridge: "

	NIF=$(cat $LOCK 2>/dev/null)
	if [ -z "$NIF" ]; then
        	echo -n "... already stopped";
		success;
		echo;
		exit 0
        fi
	echo

	IP=$(/sbin/ifconfig $BRIDGE 2>/dev/null| awk '/inet addr:/ {print substr($2, 6)}')
	BCAST=$(/sbin/ifconfig $BRIDGE 2>/dev/null| awk '/inet addr:/ {print substr($3, 7)}')
	NETMASK=$(/sbin/ifconfig $BRIDGE 2>/dev/null| awk '/inet addr:/ {print substr($4, 6)}')

	# if not slept long enough then the IP, NETMASK and BCAST setting
	# are not fetched properly 8-| 
	sleep 1

	echo "NIF=$NIF IP=$IP, BCAST=$BCAST, NETMASK=$NETMASK, DEFGW=$DEFGW"

	# bring the previous network nif back
	/sbin/ifconfig $NIF $IP netmask $NETMASK broadcast $BCAST up
	if [ $DEF_ROUTE -eq 0 ]; then
	   /sbin/route add default dev $NIF
	else
	   /sbin/route add default dev $NIF gw $DEFGW
	fi


	# get the bridge down
	/sbin/ifconfig $BRIDGE down

	for tap in $TAPS; do
		brctl delif $BRIDGE $tap
		/sbin/ifconfig $tap down
		echo
		tunctl -d $tap
	done
	brctl delbr $BRIDGE
	rm -f $LOCK
	echo
	;;
  restart)
        $0 stop
        $0 start
        ;;
  status)
        status arabridge
        ;;
  *)
	echo "Usage: arabridge {start|stop|restart|status}"
	exit 1
esac

exit 0