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
parents 24dbad147aef
children 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