diff options
author | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2012-04-12 05:26:27 +0000 |
---|---|---|
committer | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2012-04-12 05:26:27 +0000 |
commit | 80c370796ccc7b5906aa6d79d3ce972ffdef8c7c (patch) | |
tree | 9fff4f6ee1c9fe7132e7353a83d230a1d20d430a | |
parent | 8ec3bbd36bb7350a4f056cd66fa2d9117f9ef4f6 (diff) | |
download | awall-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.lua | 35 | ||||
-rw-r--r-- | awall/model.lua | 3 | ||||
-rw-r--r-- | awall/modules/filter.lua | 3 | ||||
-rw-r--r-- | awall/modules/nat.lua | 3 |
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', |