luci-0.11: merge outstanding trunk changes
[project/luci.git] / libs / core / luasrc / model / firewall.lua
index c13f5d6a1bbc4ac94c2d2dd5d2fdeaae4f8477ed..a9f6fdb7fc2c4b87d39657b6cd85bb17b89457d3 100644 (file)
@@ -20,7 +20,7 @@ limitations under the License.
 local type, pairs, ipairs, table, luci, math
        = type, pairs, ipairs, table, luci, math
 
-local lmo = require "lmo"
+local tpl = require "luci.template.parser"
 local utl = require "luci.util"
 local uci = require "luci.model.uci"
 
@@ -42,7 +42,7 @@ function _set(c, s, o, v)
                if type(v) == "boolean" then v = v and "1" or "0" end
                return uci_r:set(c, s, o, v)
        else
-               return uci_r:del(c, s, o, v)
+               return uci_r:delete(c, s, o)
        end
 end
 
@@ -64,14 +64,31 @@ function commit(self, ...)
        uci_r:load(...)
 end
 
+function get_defaults()
+       return defaults()
+end
+
+function new_zone(self)
+       local name = "newzone"
+       local count = 1
+
+       while self:get_zone(name) do
+               count = count + 1
+               name = "newzone%d" % count
+       end
+
+       return self:add_zone(name)
+end
+
 function add_zone(self, n)
        if _valid_id(n) and not self:get_zone(n) then
+               local d = defaults()
                local z = uci_r:section("firewall", "zone", nil, {
                        name    = n,
                        network = " ",
-                       input   = defaults:input()   or "DROP",
-                       forward = defaults:forward() or "DROP",
-                       output  = defaults:output()  or "DROP"
+                       input   = d:input()   or "DROP",
+                       forward = d:forward() or "DROP",
+                       output  = d:output()  or "DROP"
                })
 
                return z and zone(z)
@@ -137,7 +154,7 @@ function del_zone(self, n)
 
        if uci_r:get("firewall", n) == "zone" then
                local z = uci_r:get("firewall", n, "name")
-               r = uci_r:delete("firwall", n)
+               r = uci_r:delete("firewall", n)
                n = z
        else
                uci_r:foreach("firewall", "zone",
@@ -159,14 +176,14 @@ function del_zone(self, n)
 
                uci_r:foreach("firewall", "redirect",
                        function(s)
-                               if s.src == n then
+                               if s.src == n or s.dest == n then
                                        uci_r:delete("firewall", s['.name'])
                                end
                        end)
 
                uci_r:foreach("firewall", "forwarding",
                        function(s)
-                               if s.src == n then
+                               if s.src == n or s.dest == n then
                                        uci_r:delete("firewall", s['.name'])
                                end
                        end)
@@ -315,15 +332,15 @@ function zone.network(self)
 end
 
 function zone.input(self)
-       return self:get("input") or "DROP"
+       return self:get("input") or defaults():input() or "DROP"
 end
 
 function zone.forward(self)
-       return self:get("forward") or "DROP"
+       return self:get("forward") or defaults():forward() or "DROP"
 end
 
 function zone.output(self)
-       return self:get("output") or "DROP"
+       return self:get("output") or defaults():output() or "DROP"
 end
 
 function zone.add_network(self, net)
@@ -339,11 +356,8 @@ function zone.add_network(self, net)
 
                nets[#nets+1] = net
 
-               if #nets > 0 then
-                       self:set("network", table.concat(nets, " "))
-               else
-                       self:set("network", " ")
-               end
+               _M:del_network(net)
+               self:set("network", table.concat(nets, " "))
        end
 end
 
@@ -375,6 +389,10 @@ function zone.get_networks(self)
        return nets
 end
 
+function zone.clear_networks(self)
+       self:set("network", " ")
+end
+
 function zone.get_forwardings_by(self, what)
        local name = self:name()
        local forwards = { }
@@ -399,7 +417,7 @@ function zone.add_forwarding_to(self, dest)
                end
        end
 
-       if not exist and dest ~= self:name() then
+       if not exist and dest ~= self:name() and _valid_id(dest) then
                local s = uci_r:section("firewall", "forwarding", nil, {
                        src     = self:name(),
                        dest    = dest
@@ -419,7 +437,7 @@ function zone.add_forwarding_from(self, src)
                end
        end
 
-       if not exist and src ~= self:name() then
+       if not exist and src ~= self:name() and _valid_id(src) then
                local s = uci_r:section("firewall", "forwarding", nil, {
                        src     = src,
                        dest    = self:name()
@@ -432,11 +450,9 @@ end
 function zone.del_forwardings_by(self, what)
        local name = self:name()
 
-       uci_r:foreach("firewall", "forwarding",
+       uci_r:delete_all("firewall", "forwarding",
                function(s)
-                       if s.src and s.dest and s[what] == name then
-                               uci_r:delete("firewall", s['.name'])
-                       end
+                       return (s.src and s.dest and s[what] == name)
                end)
 end
 
@@ -462,7 +478,7 @@ function zone.get_color(self)
        elseif self and self:name() == "wan" then
                return "#f09090"
        elseif self then
-               math.randomseed(lmo.hash(self:name()))
+               math.randomseed(tpl.hash(self:name()))
 
                local r   = math.random(128)
                local g   = math.random(128)