Developing lightweight computation at the DSG edge

qmp_gw.sh 4.7 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/sh
#    Copyright (C) 2011 Fundacio Privada per a la Xarxa Oberta, Lliure i Neutral guifi.net
#
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License along
#    with this program; if not, write to the Free Software Foundation, Inc.,
#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
#    The full GNU General Public License is included in this distribution in
#    the file called "COPYING".
20
21
22
23
#
# Contributors:
#	Simó Albert i Beltran
#
24
25
26
27

QMP_PATH="/etc/qmp"
SOURCE_GW=1

28
29
30
31
32
if [ -z "$SOURCE_OPENWRT_FUNCTIONS" ]
then
	. /lib/functions.sh
	SOURCE_OPENWRT_FUNCTIONS=1
fi
33
[ -z "$SOURCE_COMMON" ] && . $QMP_PATH/qmp_common.sh
34
[ -z "$SOURCE_FUNCTIONS" ] && . $QMP_PATH/qmp_functions.sh
35

36
37
38
39
40
41
42
qmp_exists_gateway()
{
	local config=$1
	shift
	local ignore=0
	local exists

43
44
	args_key_values="$(echo $@ | awk -v RS=' ' 'NR % 2 == 1 && $0 !~ "^(ignore|(minB|b)andwidth)$" {a+=1} END {print a}')"
	uci_key_values=$(env | grep -v -e "^CONFIG_${config}_\(TYPE\|ignore\|\(minB\|b\)andwidth\)=" | grep -c "^CONFIG_${config}_")
45

46
	[ "$args_key_values" != "$uci_key_values" ] && return
47
48
49
50
51
52
53
54

	while [ $# -ge 2 ]
	do
		if [ "$1" = "ignore" ]
		then
			ignore="$2"
		else
			config_get exists "$config" $1
55
			if [ "$exists" != "$2" ]
56
57
58
59
60
61
62
63
			then
				return
			fi
		fi
		shift
		shift
	done

64
	uci_set gateways "$config" ignore "$ignore"
65
66
67
68
69
70
	uci_commit
	qmp_gateway_found=true
}

qmp_set_gateway()
{
71
	config_load gateways
72
73
74
75
76
	qmp_gateway_found=false
	config_foreach qmp_exists_gateway gateway $@
	if ! $qmp_gateway_found
	then
		local config
77
		config="$(uci add gateways gateway)"
78
79
		while [ $# -ge 2 ]
		do
80
			uci_set gateways "$config" "$1" "$2"
81
82
83
84
85
86
87
			shift
			shift
		done
		uci_commit
	fi
}

88
qmp_gw_search_default_ipv4() {
89
	qmp_set_gateway ignore 1 type offer network 0.0.0.0/0
90
	qmp_set_gateway ignore 0 type search network 0.0.0.0/0 maxPrefixLen 0
91
	qmp_gw_masq_wan 0
92
93
94
}

qmp_gw_search_default_ipv6() {
95
	qmp_set_gateway ignore 1 type offer network ::/0
96
	qmp_set_gateway ignore 0 type search network ::/0 maxPrefixLen 0
97
98
}

99
qmp_gw_offer_default_ipv4() {
100
	qmp_set_gateway ignore 1 type search network 0.0.0.0/0 maxPrefixLen 0
101
	qmp_set_gateway ignore 0 type offer network 0.0.0.0/0
102
	qmp_gw_masq_wan 1
103
104
105
}

qmp_gw_offer_default_ipv6() {
106
	qmp_set_gateway ignore 1 type search network ::/0 maxPrefixLen 0
107
	qmp_set_gateway ignore 0 type offer network ::/0
108
109
}

110
qmp_gw_disable_default_ipv4() {
111
	qmp_set_gateway ignore 1 type search network 0.0.0.0/0 maxPrefixLen 0
112
	qmp_set_gateway ignore 1 type offer network 0.0.0.0/0
113
114
115
116
	qmp_gw_masq_wan 0
}

qmp_gw_disable_default_ipv6() {
117
	qmp_set_gateway ignore 1 type search network ::/0 maxPrefixLen 0
118
	qmp_set_gateway ignore 1 type offer network ::/0
119
120
}

121
122
123
124
125
126
127
128
129
130
qmp_gw_default() {
	if [ -n "$2" ]
	then
		qmp_gw_$1_default_$2
	else
		qmp_gw_$1_default_ipv4
		qmp_gw_$1_default_ipv6
	fi
}

131
132
133
134
135
136
137
138
139
140
141
qmp_gw_add_interfaces_to_firewall_zone() {
	local cfg=$1
	local $virtual_interfaces
	for interface in $(qmp_get_devices wan)
	do
		[ -n "$virtual_interfaces" ] && virtual_interfaces="$virtual_interfaces "
		virtual_interfaces="$virtual_interfaces$(qmp_get_virtual_iface $interface)"
	done
	qmp_uci_set_raw firewall.$cfg.network="$virtual_interfaces"
}

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
qmp_gw_masq_wan() {
	#First parameter is 1/0 (enable/disable masquerade). Default is 1
	[ -z "$1" ] && masq=1 || masq=$1
	j=0
	v="nothing"
	wan=""

	#Looking for a firewall zone with name wan
	while [ ! -z "$v" ]; do
		v=$(qmp_uci_get_raw firewall.@zone[$j].name)
		[ "$v" == "wan" ] && { wan=$j; break; }
		j=$(( $j +1 ))
	done

	if [ -z "$wan" ]; then
	#if not found, we are going to create it
		cfg="$(qmp_uci_add_raw_get_cfg firewall zone)"
		qmp_uci_set_cfg firewall.$cfg.input=ACCEPT
		qmp_uci_set_cfg firewall.$cfg.output=ACCEPT
		qmp_uci_set_cfg firewall.$cfg.forward=ACCEPT
		qmp_uci_set_cfg firewall.$cfg.name=wan
		qmp_uci_set_cfg firewall.$cfg.masq=$masq
		qmp_uci_commit firewall

	else
	#if found we just change parameters
		qmp_uci_set_raw firewall.@zone[$wan].input=ACCEPT
		qmp_uci_set_raw firewall.@zone[$wan].output=ACCEPT
		qmp_uci_set_raw firewall.@zone[$wan].forward=ACCEPT
		qmp_uci_set_raw firewall.@zone[$wan].masq=$masq
172
		cfg=@zone[$wan]
173
	fi
174
175

	qmp_gw_add_interfaces_to_firewall_zone $cfg
176
177
178
179
}

qmp_gw_apply() {
	qmp_configure_bmx6
180
	bmx6 -c --configReload || /etc/init.d/bmx6 restart
181
182
183
	/etc/init.d/firewall restart
}