Comparison

mod_firewall/test.lib.lua @ 2585:02c6ae745c4f

mod_firewall: Add 'test' subcommand to read stanzas from stdin and test them against rules
author Matthew Wild <mwild1@gmail.com>
date Sun, 26 Feb 2017 09:58:07 +0000
child 2804:b50f7b9fdbbb
comparison
equal deleted inserted replaced
2584:d64fc9c3cffd 2585:02c6ae745c4f
1 local set = require "util.set";
2
3 local xmppstream = require "util.xmppstream";
4
5 local function stderr(...)
6 io.stderr:write("** ", table.concat({...}, "\t", 1, select("#", ...)), "\n");
7 end
8
9 return function (arg)
10 require "net.http".request = function (url, ex, cb)
11 stderr("Making HTTP request to "..url);
12 local body_table = {};
13 local ok, response_status, response_headers = require "ssl.https".request({
14 url = url;
15 headers = ex.headers;
16 method = ex.body and "POST" or "GET";
17 sink = ltn12.sink.table(body_table);
18 source = ex.body and ltn12.source.string(ex.body) or nil;
19 });
20 stderr("HTTP response "..response_status);
21 cb(table.concat(body_table), response_status, { headers = response_headers });
22 return true;
23 end;
24
25 local stats_dropped, stats_passed = 0, 0;
26
27 load_unload_scripts(set.new(arg));
28 local session = { notopen = true };
29 local stream_callbacks = { default_ns = "jabber:client" };
30
31 function stream_callbacks.streamopened()
32 session.notopen = nil;
33 end
34 function stream_callbacks.streamclosed()
35 end
36 function stream_callbacks.error(session, error_name, error_message)
37 stderr("Fatal error parsing XML stream: "..error_name..": "..tostring(error_message))
38 assert(false);
39 end
40 function stream_callbacks.handlestanza(session, stanza)
41 if not module:fire_event("firewall/chains/deliver", { origin = session, stanza = stanza }) then
42 stats_passed = stats_passed + 1;
43 print(stanza);
44 print("");
45 else
46 stats_dropped = stats_dropped + 1;
47 end
48 end
49
50 local stream = xmppstream.new(session, stream_callbacks);
51 stream:feed("<stream:stream xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client'>");
52 local line_count = 0;
53 for line in io.lines() do
54 line_count = line_count + 1;
55 local ok, err = stream:feed(line.."\n");
56 if not ok then
57 stderr("Fatal XML parse error on line "..line_count..": "..err);
58 return 1;
59 end
60 end
61
62 stderr("Summary");
63 stderr("-------");
64 stderr("");
65 stderr(stats_dropped + stats_passed, "processed");
66 stderr(stats_passed, "passed");
67 stderr(stats_dropped, "droppped");
68 stderr(line_count, "input lines");
69 stderr("");
70 end