summaryrefslogtreecommitdiffhomepage
path: root/applications/luci-ffwizard/luasrc/tools/ffwizard.lua
diff options
context:
space:
mode:
Diffstat (limited to 'applications/luci-ffwizard/luasrc/tools/ffwizard.lua')
-rw-r--r--applications/luci-ffwizard/luasrc/tools/ffwizard.lua149
1 files changed, 149 insertions, 0 deletions
diff --git a/applications/luci-ffwizard/luasrc/tools/ffwizard.lua b/applications/luci-ffwizard/luasrc/tools/ffwizard.lua
new file mode 100644
index 000000000..217cd44bb
--- /dev/null
+++ b/applications/luci-ffwizard/luasrc/tools/ffwizard.lua
@@ -0,0 +1,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("olsrd", "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