Software / code / prosody-modules
Comparison
mod_firewall/mod_firewall.lua @ 2574:f65c5927ee8e
mod_firewall: Factor out script loading
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Sat, 25 Feb 2017 15:46:27 +0000 |
| parent | 2573:24dbad147aef |
| child | 2578:6dbd07f9a868 |
comparison
equal
deleted
inserted
replaced
| 2573:24dbad147aef | 2574:f65c5927ee8e |
|---|---|
| 547 script_path = script_path:match("^module:(.+)$"); | 547 script_path = script_path:match("^module:(.+)$"); |
| 548 end | 548 end |
| 549 return resolve_relative_path(relative_to, script_path); | 549 return resolve_relative_path(relative_to, script_path); |
| 550 end | 550 end |
| 551 | 551 |
| 552 function load_script(script) | |
| 553 script = resolve_script_path(script); | |
| 554 local chain_functions, err = compile_firewall_rules(script) | |
| 555 | |
| 556 if not chain_functions then | |
| 557 module:log("error", "Error compiling %s: %s", script, err or "unknown error"); | |
| 558 else | |
| 559 for chain, handler_code in pairs(chain_functions) do | |
| 560 local new_handler, err = compile_handler(handler_code, "mod_firewall::"..chain); | |
| 561 if not new_handler then | |
| 562 module:log("error", "Compilation error for %s: %s", script, err); | |
| 563 else | |
| 564 local chain_definition = chains[chain]; | |
| 565 if chain_definition and chain_definition.type == "event" then | |
| 566 local handler = new_handler(chain_definition.pass_return); | |
| 567 for _, event_name in ipairs(chain_definition) do | |
| 568 module:hook(event_name, handler, chain_definition.priority); | |
| 569 end | |
| 570 elseif not chain:sub(1, 5) == "user/" then | |
| 571 module:log("warn", "Unknown chain %q", chain); | |
| 572 end | |
| 573 module:hook("firewall/chains/"..chain, new_handler(false)); | |
| 574 end | |
| 575 end | |
| 576 end | |
| 577 end | |
| 578 | |
| 552 function module.load() | 579 function module.load() |
| 553 if not prosody.arg then return end -- Don't run in prosodyctl | 580 if not prosody.arg then return end -- Don't run in prosodyctl |
| 554 active_definitions = {}; | 581 active_definitions = {}; |
| 555 local firewall_scripts = module:get_option_set("firewall_scripts", {}); | 582 local firewall_scripts = module:get_option_set("firewall_scripts", {}); |
| 556 for script in firewall_scripts do | 583 for script in firewall_scripts do |
| 557 script = resolve_script_path(script); | 584 load_script(script); |
| 558 local chain_functions, err = compile_firewall_rules(script) | |
| 559 | |
| 560 if not chain_functions then | |
| 561 module:log("error", "Error compiling %s: %s", script, err or "unknown error"); | |
| 562 else | |
| 563 for chain, handler_code in pairs(chain_functions) do | |
| 564 local new_handler, err = compile_handler(handler_code, "mod_firewall::"..chain); | |
| 565 if not new_handler then | |
| 566 module:log("error", "Compilation error for %s: %s", script, err); | |
| 567 else | |
| 568 local chain_definition = chains[chain]; | |
| 569 if chain_definition and chain_definition.type == "event" then | |
| 570 local handler = new_handler(chain_definition.pass_return); | |
| 571 for _, event_name in ipairs(chain_definition) do | |
| 572 module:hook(event_name, handler, chain_definition.priority); | |
| 573 end | |
| 574 elseif not chain:sub(1, 5) == "user/" then | |
| 575 module:log("warn", "Unknown chain %q", chain); | |
| 576 end | |
| 577 module:hook("firewall/chains/"..chain, new_handler(false)); | |
| 578 end | |
| 579 end | |
| 580 end | |
| 581 end | 585 end |
| 582 -- Replace contents of definitions table (shared) with active definitions | 586 -- Replace contents of definitions table (shared) with active definitions |
| 583 for k in it.keys(definitions) do definitions[k] = nil; end | 587 for k in it.keys(definitions) do definitions[k] = nil; end |
| 584 for k,v in pairs(active_definitions) do definitions[k] = v; end | 588 for k,v in pairs(active_definitions) do definitions[k] = v; end |
| 585 end | 589 end |