summaryrefslogtreecommitdiffhomepage
path: root/applications/luci-ffwizard-leipzig/luasrc/tools/ffwizard.lua
blob: 60a240bf0ca95cc33307d69df0d1e94ded88d23c (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
144
145
146
147
148
149
--[[
LuCI - Lua Configuration Interface

Copyright 2008 Steven Barth <steven@midlink.org>
Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

$Id$

]]--

local uci = require "luci.model.uci"
local util = require "luci.util"
local table = require "table"

local type = type

module "luci.tools.ffwizard"

-- Deletes all references of a wifi device
function wifi_delete_ifaces(device)
	local cursor = uci.cursor()
	cursor:delete_all("wireless", "wifi-iface", {device=device})
	cursor:save("wireless")
end

-- Deletes a network interface and all occurences of it in firewall zones and dhcp
function network_remove_interface(iface)
	local cursor = uci.cursor()
	
	if not cursor:delete("network", iface) then
		return false
	end

	local aliases = {iface}
	cursor:foreach("network", "alias", 
		function(section)
			if section.interface == iface then
				table.insert(aliases, section[".name"])
			end
		end)
	
	-- Delete Aliases and Routes
	cursor:delete_all("network", "route", {interface=iface})
	cursor:delete_all("network", "alias", {interface=iface})
	
	-- Delete DHCP sections
	cursor:delete_all("dhcp", "dhcp",
		 function(section)
		 	return util.contains(aliases, section.interface)
		 end)
	
	-- Remove OLSR sections
	cursor:delete_all("olsr", "Interface", {Interface=iface})
	
	-- Remove Splash sections
	cursor:delete_all("luci-splash", "iface", {network=iface})
	
	cursor:save("network")
	cursor:save("olsr")
	cursor:save("dhcp")
	cursor:save("luci-splash")
end

-- Creates a firewall zone
function firewall_create_zone(zone, input, output, forward, masq)
	local cursor = uci.cursor()
	if not firewall_find_zone(zone) then
		local stat = cursor:section("firewall", "zone", nil, {
			input = input,
			output = output,
			forward = forward,
			masq = masq and "1",
			name = zone
		})
		cursor:save("firewall")
		return stat
	end
end

-- Adds interface to zone, creates zone on-demand
function firewall_zone_add_interface(name, interface)
	local cursor = uci.cursor()
	local zone = firewall_find_zone(name)
	local net = cursor:get("firewall", zone, "network")
	local old = net or (cursor:get("network", name) and name)
	cursor:set("firewall", zone, "network", (old and old .. " " or "") .. interface)
	cursor:save("firewall")
end

-- Removes interface from zone
function firewall_zone_remove_interface(name, interface)
	local cursor = uci.cursor()
	local zone = firewall_find_zone(name)
	if zone then
		local net = cursor:get("firewall", zone, "network")
		local new = remove_list_entry(net, interface)
		if new then
			if #new > 0 then
				cursor:set("firewall", zone, "network", new)
			else
				cursor:delete("firewall", zone, "network")
			end
			cursor:save("firewall")
		end
	end
end


-- Finds the firewall zone with given name
function firewall_find_zone(name)
	local find
	
	uci.cursor():foreach("firewall", "zone", 
		function (section)
			if section.name == name then
				find = section[".name"]
			end
		end)
		
	return find
end



-- Helpers --

-- Removes a listentry, handles real and pseduo lists transparently
function remove_list_entry(value, entry)
	if type(value) == "nil" then
		return nil
	end
	
	local result = type(value) == "table" and value or util.split(value, " ")
	local key = util.contains(result, entry)
	
	while key do
		table.remove(result, key)
		key = util.contains(result, entry)
	end
	
	result = type(value) == "table" and result or table.concat(result, " ")
	return result ~= value and result 
end