3 let fw4 = require("fw4");
5 function read_state() {
6 let state = fw4.read_state();
9 warn("Unable to read firewall state - do you need to start the firewall?\n");
16 function reload_sets() {
17 let state = read_state(),
18 sets = fw4.check_set_types();
20 for (let set in state.ipsets) {
21 if (!set.loadfile && !length(set.entries))
24 if (!exists(sets, set.name)) {
25 warn(`Named set '${set.name}' does not exist - do you need to restart the firewall?\n`);
28 else if (fw4.concat(sets[set.name]) != fw4.concat(set.types)) {
29 warn(`Named set '${set.name}' has a different type - want '${fw4.concat(set.types)}' but is '${fw4.concat(sets[set.name])}' - do you need to restart the firewall?\n`);
34 let printer = (entry) => {
36 print(`add element inet fw4 ${set.name} {\n`);
40 print(` ${join(" . ", entry)},\n`);
43 print(`flush set inet fw4 ${set.name}\n`);
45 map(set.entries, printer);
48 fw4.parse_setfile(set, printer);
55 function render_ruleset(use_statefile) {
56 fw4.load(use_statefile);
58 include("templates/ruleset.uc", { fw4, type, exists, length, include });
61 function lookup_network(net) {
62 let state = read_state();
64 for (let zone in state.zones) {
65 for (let network in (zone.network || [])) {
66 if (network.device == net) {
67 print(zone.name, "\n");
76 function lookup_device(dev) {
77 let state = read_state();
79 for (let zone in state.zones) {
80 for (let rule in (zone.match_rules || [])) {
81 if (dev in rule.devices_pos) {
82 print(zone.name, "\n");
91 function lookup_zone(name, dev) {
92 let state = read_state();
94 for (let zone in state.zones) {
95 if (zone.name == name) {
97 map(zone.match_rules, (r) => push(devices, ...(r.devices_pos || [])));
100 if (dev in devices) {
109 print(join("\n", devices), "\n");
118 function run_includes() {
119 let state = read_state(),
122 for (let inc in state.includes) {
123 if (inc.type != 'script')
126 let path = replace(inc.path, "'", "'\\''");
129 `exec 1000>&-; config() { echo "You cannot use UCI in firewall includes!" >&2; exit 1; }; . '${path}'`
133 warn(`Include '${inc.path}' failed with exit code ${rc}\n`);
138 switch (getenv("ACTION")) {
140 return render_ruleset(true);
143 return render_ruleset(false);
146 return reload_sets();
149 return lookup_network(getenv("OBJECT"));
152 return lookup_device(getenv("OBJECT"));
155 return lookup_zone(getenv("OBJECT"), getenv("DEVICE"));
158 return run_includes();