aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2012-04-12 05:26:27 +0000
committerKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2012-04-12 05:26:27 +0000
commit80c370796ccc7b5906aa6d79d3ce972ffdef8c7c (patch)
tree9fff4f6ee1c9fe7132e7353a83d230a1d20d430a
parent8ec3bbd36bb7350a4f056cd66fa2d9117f9ef4f6 (diff)
downloadawall-80c370796ccc7b5906aa6d79d3ce972ffdef8c7c.tar.bz2
awall-80c370796ccc7b5906aa6d79d3ce972ffdef8c7c.tar.xz
module metadata processing moved to awall.loadmodules
deterministic processing order within modules global classmap for dynamic module discovery
-rw-r--r--awall/init.lua35
-rw-r--r--awall/model.lua3
-rw-r--r--awall/modules/filter.lua3
-rw-r--r--awall/modules/nat.lua3
4 files changed, 29 insertions, 15 deletions
diff --git a/awall/init.lua b/awall/init.lua
index 8b4a0bd..6ed0553 100644
--- a/awall/init.lua
+++ b/awall/init.lua
@@ -17,9 +17,25 @@ require 'awall.object'
require 'awall.util'
-local modules = {package.loaded['awall.model']}
+local procorder
+local defrules
function loadmodules(path)
+ classmap = {}
+ procorder = {}
+ defrules = {}
+
+ local function readmetadata(mod)
+ for i, clsdef in ipairs(mod.classes) do
+ local path, cls = unpack(clsdef)
+ classmap[path] = cls
+ table.insert(procorder, path)
+ end
+ util.extend(defrules, mod.defrules)
+ end
+
+ readmetadata(model)
+
local cdir = lfs.currentdir()
if path then lfs.chdir(path) end
@@ -27,7 +43,7 @@ function loadmodules(path)
if stringy.endswith(modfile, '.lua') then
local name = 'awall.modules.'..string.sub(modfile, 1, -5)
require(name)
- table.insert(modules, package.loaded[name])
+ readmetadata(package.loaded[name])
end
end
@@ -146,18 +162,15 @@ function Config:init(confdirs, importdirs)
local locations = {}
- for i, mod in ipairs(modules) do
- for path, cls in pairs(mod.classmap) do
- if self.input[path] then
- util.map(self.input[path],
- function(obj) return cls.morph(obj, self) end)
- table.insert(locations, self.input[path])
- end
+ for i, path in ipairs(procorder) do
+ if self.input[path] then
+ util.map(self.input[path],
+ function(obj) return classmap[path].morph(obj, self) end)
+ table.insert(locations, self.input[path])
end
-
- for i, rule in ipairs(mod.defrules) do insertrule(rule) end
end
+ for i, rule in ipairs(defrules) do insertrule(rule) end
for i, location in ipairs(locations) do
for i, rule in ipairs(location) do
diff --git a/awall/model.lua b/awall/model.lua
index 0581843..381bd04 100644
--- a/awall/model.lua
+++ b/awall/model.lua
@@ -353,6 +353,5 @@ function Rule:newchain(base)
end
-classmap = {zone=Zone}
-
+classes = {{'zone', Zone}}
defrules = {}
diff --git a/awall/modules/filter.lua b/awall/modules/filter.lua
index 34dcce3..c335cd3 100644
--- a/awall/modules/filter.lua
+++ b/awall/modules/filter.lua
@@ -58,7 +58,8 @@ local Policy = model.class(Filter)
function Policy:servoptfrags() return nil end
-classmap = {policy=Policy, filter=Filter}
+classes = {{'filter', Filter},
+ {'policy', Policy}}
defrules = {}
for i, family in ipairs({'inet', 'inet6'}) do
diff --git a/awall/modules/nat.lua b/awall/modules/nat.lua
index b3edce1..09875f7 100644
--- a/awall/modules/nat.lua
+++ b/awall/modules/nat.lua
@@ -75,7 +75,8 @@ function SNATRule:target()
end
-classmap = {dnat=DNATRule, snat=SNATRule}
+classes = {{'dnat', DNATRule},
+ {'snat', SNATRule}}
-- TODO configuration of the ipset via JSON config
defrules = {{family='inet', table='nat', chain='POSTROUTING',