aboutsummaryrefslogtreecommitdiff
path: root/contrib/scripts/netjail/netjail_setup_internet.sh
blob: 7ff25c014d9b756caab85931d204adb56e1bc741 (plain) (blame)
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
#!/bin/sh
. "./netjail_core.sh"

set -eu
set -x

export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

LOCAL_M=$1
GLOBAL_N=$2

# TODO: globally known peer?

shift 2

netjail_check $(($LOCAL_M * $GLOBAL_N))

# Starts optionally 'stunserver' on "92.68.150.$(($GLOBAL_N + 1))":
STUN=$(netjail_opt '--stun' $@)

if [ $STUN -gt 0 ]; then
	netjail_check_bin stunserver
	
	shift 1
	
	STUN_NODE=$(netjail_print_name "S" 254)
fi

netjail_check_bin $1

LOCAL_GROUP="192.168.15"
GLOBAL_GROUP="92.68.150"

echo "Start [local: $LOCAL_GROUP.0/24, global: $GLOBAL_GROUP.0/24, stun: $STUN]"

NETWORK_NET=$(netjail_print_name "n" $GLOBAL_N $LOCAL_M)

netjail_bridge $NETWORK_NET

for N in $(seq $GLOBAL_N); do
	ROUTER=$(netjail_print_name "R" $N)

	netjail_node $ROUTER 
	netjail_node_link_bridge $ROUTER $NETWORK_NET "$GLOBAL_GROUP.$N" 24

	ROUTER_NET=$(netjail_print_name "r" $N)

	netjail_bridge $ROUTER_NET
	
	for M in $(seq $LOCAL_M); do
		NODE=$(netjail_print_name "N" $N $M)

		netjail_node $NODE
		netjail_node_link_bridge $NODE $ROUTER_NET "$LOCAL_GROUP.$M" 24
	done

	ROUTER_ADDR="$LOCAL_GROUP.$(($LOCAL_M+1))"

	netjail_node_link_bridge $ROUTER $ROUTER_NET $ROUTER_ADDR 24
	netjail_node_add_nat $ROUTER $ROUTER_ADDR 24
	
	for M in $(seq $LOCAL_M); do
		NODE=$(netjail_print_name "N" $N $M)
		
		netjail_node_add_default $NODE $ROUTER_ADDR
	done
done

WAITING=""
KILLING=""

if [ $STUN -gt 0 ]; then
	netjail_node $STUN_NODE
	netjail_node_link_bridge $STUN_NODE $NETWORK_NET "$GLOBAL_GROUP.254" 24

	netjail_node_exec $STUN_NODE 0 1 stunserver &
	KILLING="$!"
fi

for N in $(seq $GLOBAL_N); do
	for M in $(seq $LOCAL_M); do
		NODE=$(netjail_print_name "N" $N $M)
		INDEX=$(($LOCAL_M * ($N - 1) + $M - 1))

		FD_X=$(($INDEX * 2 + 3 + 0))
		FD_Y=$(($INDEX * 2 + 3 + 1))

		netjail_node_exec $NODE $FD_X $FD_Y $@ &
		WAITING="$! $WAITING"
	done
done

for PID in $WAITING; do wait $PID; done
for PID in $KILLING; do netjail_kill $PID; done
wait

if [ $STUN -gt 0 ]; then
	STUN_NODE=$(netjail_print_name "S" 254)

	netjail_node_unlink_bridge $STUN_NODE $NETWORK_NET
	netjail_node_clear $STUN_NODE
fi

for N in $(seq $GLOBAL_N); do
	for M in $(seq $LOCAL_M); do
		netjail_node_clear $(netjail_print_name "N" $N $M)
	done
	
	netjail_bridge_clear $(netjail_print_name "r" $N)
	netjail_node_clear $(netjail_print_name "R" $N)
done

netjail_bridge_clear $NETWORK_NET

echo "Done"