Annotate

plugins/mod_scansion_record.lua @ 10446:5c2d1b13537c

util.stanza: Support the 'by' attribute on errors This is to be used when the entity generating the error is not the same as the one the stanza was directed to, e.g. an intermediate server.
author Kim Alvefur <zash@zash.se>
date Mon, 25 Nov 2019 20:59:36 +0100
parent 9619:7172077c0a53
child 10718:d229e4d31598
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9344
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 local names = { "Romeo", "Juliet", "Mercutio", "Tybalt", "Benvolio" };
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 local devices = { "", "phone", "laptop", "tablet", "toaster", "fridge", "shoe" };
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 local users = {};
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4
9355
a31e0d549b74 mod_scansion_record: Import util.filters
Kim Alvefur <zash@zash.se>
parents: 9354
diff changeset
5 local filters = require "util.filters";
9344
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 local id = require "util.id";
9365
acb316319dc0 mod_scansion_record: Generate a header with hostname and timestamp
Kim Alvefur <zash@zash.se>
parents: 9364
diff changeset
7 local dt = require "util.datetime";
9361
3620f7b3517b mod_scansion_record: Split up construction of filename for reuse of parts later
Kim Alvefur <zash@zash.se>
parents: 9360
diff changeset
8 local dm = require "util.datamanager";
9618
d6e6e1fb7ef0 mod_scansion_record: Discard from/to where these are implicitly the sessions full JID
Kim Alvefur <zash@zash.se>
parents: 9373
diff changeset
9 local st = require "util.stanza";
9344
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10
9361
3620f7b3517b mod_scansion_record: Split up construction of filename for reuse of parts later
Kim Alvefur <zash@zash.se>
parents: 9360
diff changeset
11 local record_id = id.medium():lower();
3620f7b3517b mod_scansion_record: Split up construction of filename for reuse of parts later
Kim Alvefur <zash@zash.se>
parents: 9360
diff changeset
12 local record_date = os.date("%Y%b%d"):lower();
9369
dd452f932b67 mod_scansion_record: Merge header and log into one file at shutdown
Kim Alvefur <zash@zash.se>
parents: 9368
diff changeset
13 local header_file = dm.getpath(record_id, "scansion", record_date, "scs", true);
dd452f932b67 mod_scansion_record: Merge header and log into one file at shutdown
Kim Alvefur <zash@zash.se>
parents: 9368
diff changeset
14 local record_file = dm.getpath(record_id, "scansion", record_date, "log", true);
9344
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15
9364
62f9127ab493 mod_scansion_record: Open a related file for header entries
Kim Alvefur <zash@zash.se>
parents: 9363
diff changeset
16 local head = io.open(header_file, "w");
9369
dd452f932b67 mod_scansion_record: Merge header and log into one file at shutdown
Kim Alvefur <zash@zash.se>
parents: 9368
diff changeset
17 local scan = io.open(record_file, "w+");
9346
2946f2bd2bb5 mod_scansion_record: Open log file
Kim Alvefur <zash@zash.se>
parents: 9345
diff changeset
18
9344
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 local function record(string)
9357
0ae20fb3d4c6 mod_scansion_record: Rename main file handle
Kim Alvefur <zash@zash.se>
parents: 9356
diff changeset
20 scan:write(string);
9348
e1de3245c696 mod_scansion_record: Finish function for writing data
Kim Alvefur <zash@zash.se>
parents: 9347
diff changeset
21 end
9344
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22
9364
62f9127ab493 mod_scansion_record: Open a related file for header entries
Kim Alvefur <zash@zash.se>
parents: 9363
diff changeset
23 local function record_header(string)
62f9127ab493 mod_scansion_record: Open a related file for header entries
Kim Alvefur <zash@zash.se>
parents: 9363
diff changeset
24 head:write(string);
62f9127ab493 mod_scansion_record: Open a related file for header entries
Kim Alvefur <zash@zash.se>
parents: 9363
diff changeset
25 end
62f9127ab493 mod_scansion_record: Open a related file for header entries
Kim Alvefur <zash@zash.se>
parents: 9363
diff changeset
26
9368
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
27 local function record_object(class, name, props)
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
28 head:write(("[%s] %s\n"):format(class, name));
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
29 for k,v in pairs(props) do
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
30 head:write(("\t%s: %s\n"):format(k, v));
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
31 end
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
32 head:write("\n");
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
33 end
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
34
9344
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35 local function record_event(session, event)
9351
b37f131d68c2 mod_scansion_record: Complete stanza recording functions
Kim Alvefur <zash@zash.se>
parents: 9350
diff changeset
36 record(session.scansion_id.." "..event.."\n\n");
9344
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37 end
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39 local function record_stanza(stanza, session, verb)
9619
7172077c0a53 mod_scansion_record: Split stanzas into multiple lines
Kim Alvefur <zash@zash.se>
parents: 9618
diff changeset
40 local flattened = tostring(stanza):gsub("><", ">\n\t<");
7172077c0a53 mod_scansion_record: Split stanzas into multiple lines
Kim Alvefur <zash@zash.se>
parents: 9618
diff changeset
41 -- TODO Proper prettyprinting with indentation
7172077c0a53 mod_scansion_record: Split stanzas into multiple lines
Kim Alvefur <zash@zash.se>
parents: 9618
diff changeset
42 record(session.scansion_id.." "..verb..":\n\t"..flattened.."\n\n");
9344
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43 end
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
45 local function record_stanza_in(stanza, session)
9358
bbc24fc734da mod_scansion_record: Only record stanzas in the default namespace
Kim Alvefur <zash@zash.se>
parents: 9357
diff changeset
46 if stanza.attr.xmlns == nil then
9618
d6e6e1fb7ef0 mod_scansion_record: Discard from/to where these are implicitly the sessions full JID
Kim Alvefur <zash@zash.se>
parents: 9373
diff changeset
47 local copy = st.clone(stanza);
d6e6e1fb7ef0 mod_scansion_record: Discard from/to where these are implicitly the sessions full JID
Kim Alvefur <zash@zash.se>
parents: 9373
diff changeset
48 copy.attr.from = nil;
d6e6e1fb7ef0 mod_scansion_record: Discard from/to where these are implicitly the sessions full JID
Kim Alvefur <zash@zash.se>
parents: 9373
diff changeset
49 record_stanza(copy, session, "sends")
9358
bbc24fc734da mod_scansion_record: Only record stanzas in the default namespace
Kim Alvefur <zash@zash.se>
parents: 9357
diff changeset
50 end
9351
b37f131d68c2 mod_scansion_record: Complete stanza recording functions
Kim Alvefur <zash@zash.se>
parents: 9350
diff changeset
51 return stanza;
9344
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
52 end
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
53
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 local function record_stanza_out(stanza, session)
9358
bbc24fc734da mod_scansion_record: Only record stanzas in the default namespace
Kim Alvefur <zash@zash.se>
parents: 9357
diff changeset
55 if stanza.attr.xmlns == nil then
9359
dc55d7d2798b mod_scansion_record: Avoid recording the resource binding stanza
Kim Alvefur <zash@zash.se>
parents: 9358
diff changeset
56 if not (stanza.name == "iq" and stanza:get_child("bind", "urn:ietf:params:xml:ns:xmpp-bind")) then
9618
d6e6e1fb7ef0 mod_scansion_record: Discard from/to where these are implicitly the sessions full JID
Kim Alvefur <zash@zash.se>
parents: 9373
diff changeset
57 local copy = st.clone(stanza);
d6e6e1fb7ef0 mod_scansion_record: Discard from/to where these are implicitly the sessions full JID
Kim Alvefur <zash@zash.se>
parents: 9373
diff changeset
58 if copy.attr.to == session.full_jid then
d6e6e1fb7ef0 mod_scansion_record: Discard from/to where these are implicitly the sessions full JID
Kim Alvefur <zash@zash.se>
parents: 9373
diff changeset
59 copy.attr.to = nil;
d6e6e1fb7ef0 mod_scansion_record: Discard from/to where these are implicitly the sessions full JID
Kim Alvefur <zash@zash.se>
parents: 9373
diff changeset
60 end
d6e6e1fb7ef0 mod_scansion_record: Discard from/to where these are implicitly the sessions full JID
Kim Alvefur <zash@zash.se>
parents: 9373
diff changeset
61 record_stanza(copy, session, "receives");
9359
dc55d7d2798b mod_scansion_record: Avoid recording the resource binding stanza
Kim Alvefur <zash@zash.se>
parents: 9358
diff changeset
62 end
9358
bbc24fc734da mod_scansion_record: Only record stanzas in the default namespace
Kim Alvefur <zash@zash.se>
parents: 9357
diff changeset
63 end
9351
b37f131d68c2 mod_scansion_record: Complete stanza recording functions
Kim Alvefur <zash@zash.se>
parents: 9350
diff changeset
64 return stanza;
9344
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
65 end
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
66
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
67 module:hook("resource-bind", function (event)
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
68 local session = event.session;
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
69 if not users[session.username] then
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
70 users[session.username] = {
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
71 character = table.remove(names, 1) or id.short();
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72 devices = {};
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
73 n_devices = 0;
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
74 };
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
75 end
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
76 local user = users[session.username];
9354
b042aa047d80 mod_scansion_record: Correctly retrieve resource
Kim Alvefur <zash@zash.se>
parents: 9353
diff changeset
77 local device = user.devices[session.resource];
9344
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
78 if not device then
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
79 user.n_devices = user.n_devices + 1;
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
80 device = devices[user.n_devices] or ("device"..id.short());
9354
b042aa047d80 mod_scansion_record: Correctly retrieve resource
Kim Alvefur <zash@zash.se>
parents: 9353
diff changeset
81 user.devices[session.resource] = device;
9344
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
82 end
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
83 session.scansion_character = user.character;
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
84 session.scansion_device = device;
9350
07fd880905a3 mod_scansion_record: Remove extra "
Kim Alvefur <zash@zash.se>
parents: 9349
diff changeset
85 session.scansion_id = user.character..(device ~= "" and "'s "..device or device);
9344
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
86
9370
7872abb9fc1f mod_scansion_record: Record the full identity including device name
Kim Alvefur <zash@zash.se>
parents: 9369
diff changeset
87 record_object("Client", session.scansion_id, {
9368
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
88 jid = session.full_jid,
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
89 password = "password",
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
90 });
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
91
9372
0e685b7ec039 mod_scansion_record: Lower log message to 'info' level
Kim Alvefur <zash@zash.se>
parents: 9371
diff changeset
92 module:log("info", "Connected: %s", session.scansion_id);
9352
0fdb70ad9fcc mod_scansion_record: Record session connecting
Kim Alvefur <zash@zash.se>
parents: 9351
diff changeset
93 record_event(session, "connects");
9344
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
94
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
95 filters.add_filter(session, "stanzas/in", record_stanza_in);
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
96 filters.add_filter(session, "stanzas/out", record_stanza_out);
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
97 end);
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
98
9373
1a69803d5d5d mod_scansion_record: Record disconnection
Kim Alvefur <zash@zash.se>
parents: 9372
diff changeset
99 module:hook("resource-unbind", function (event)
1a69803d5d5d mod_scansion_record: Record disconnection
Kim Alvefur <zash@zash.se>
parents: 9372
diff changeset
100 local session = event.session;
1a69803d5d5d mod_scansion_record: Record disconnection
Kim Alvefur <zash@zash.se>
parents: 9372
diff changeset
101 if session.scansion_id then
1a69803d5d5d mod_scansion_record: Record disconnection
Kim Alvefur <zash@zash.se>
parents: 9372
diff changeset
102 record_event(session, "disconnects");
1a69803d5d5d mod_scansion_record: Record disconnection
Kim Alvefur <zash@zash.se>
parents: 9372
diff changeset
103 end
1a69803d5d5d mod_scansion_record: Record disconnection
Kim Alvefur <zash@zash.se>
parents: 9372
diff changeset
104 end)
1a69803d5d5d mod_scansion_record: Record disconnection
Kim Alvefur <zash@zash.se>
parents: 9372
diff changeset
105
9365
acb316319dc0 mod_scansion_record: Generate a header with hostname and timestamp
Kim Alvefur <zash@zash.se>
parents: 9364
diff changeset
106 record_header("# mod_scansion_record on host '"..module.host.."' recording started "..dt.datetime().."\n\n");
acb316319dc0 mod_scansion_record: Generate a header with hostname and timestamp
Kim Alvefur <zash@zash.se>
parents: 9364
diff changeset
107
acb316319dc0 mod_scansion_record: Generate a header with hostname and timestamp
Kim Alvefur <zash@zash.se>
parents: 9364
diff changeset
108 record[[
acb316319dc0 mod_scansion_record: Generate a header with hostname and timestamp
Kim Alvefur <zash@zash.se>
parents: 9364
diff changeset
109 -----
acb316319dc0 mod_scansion_record: Generate a header with hostname and timestamp
Kim Alvefur <zash@zash.se>
parents: 9364
diff changeset
110
acb316319dc0 mod_scansion_record: Generate a header with hostname and timestamp
Kim Alvefur <zash@zash.se>
parents: 9364
diff changeset
111 ]]
acb316319dc0 mod_scansion_record: Generate a header with hostname and timestamp
Kim Alvefur <zash@zash.se>
parents: 9364
diff changeset
112
9360
0444e321b757 mod_scansion_record: Hook correct shutdown event
Kim Alvefur <zash@zash.se>
parents: 9359
diff changeset
113 module:hook_global("server-stopping", function ()
9365
acb316319dc0 mod_scansion_record: Generate a header with hostname and timestamp
Kim Alvefur <zash@zash.se>
parents: 9364
diff changeset
114 record("# recording ended on "..dt.datetime().."\n");
9369
dd452f932b67 mod_scansion_record: Merge header and log into one file at shutdown
Kim Alvefur <zash@zash.se>
parents: 9368
diff changeset
115 module:log("info", "Scansion recording available in %s", header_file);
9366
9472b4044fc6 mod_scansion_record: Close files in the cleanup stage of shutdown (fixes use after close)
Kim Alvefur <zash@zash.se>
parents: 9365
diff changeset
116 end);
9472b4044fc6 mod_scansion_record: Close files in the cleanup stage of shutdown (fixes use after close)
Kim Alvefur <zash@zash.se>
parents: 9365
diff changeset
117
9472b4044fc6 mod_scansion_record: Close files in the cleanup stage of shutdown (fixes use after close)
Kim Alvefur <zash@zash.se>
parents: 9365
diff changeset
118 prosody.events.add_handler("server-cleanup", function ()
9369
dd452f932b67 mod_scansion_record: Merge header and log into one file at shutdown
Kim Alvefur <zash@zash.se>
parents: 9368
diff changeset
119 scan:seek("set", 0);
dd452f932b67 mod_scansion_record: Merge header and log into one file at shutdown
Kim Alvefur <zash@zash.se>
parents: 9368
diff changeset
120 for line in scan:lines() do
dd452f932b67 mod_scansion_record: Merge header and log into one file at shutdown
Kim Alvefur <zash@zash.se>
parents: 9368
diff changeset
121 head:write(line, "\n");
dd452f932b67 mod_scansion_record: Merge header and log into one file at shutdown
Kim Alvefur <zash@zash.se>
parents: 9368
diff changeset
122 end
9362
31317e8edbbc mod_scansion_record: Fix missed rename of file handle
Kim Alvefur <zash@zash.se>
parents: 9361
diff changeset
123 scan:close();
9369
dd452f932b67 mod_scansion_record: Merge header and log into one file at shutdown
Kim Alvefur <zash@zash.se>
parents: 9368
diff changeset
124 os.remove(record_file);
9364
62f9127ab493 mod_scansion_record: Open a related file for header entries
Kim Alvefur <zash@zash.se>
parents: 9363
diff changeset
125 head:close()
9347
9479523e209a mod_scansion_record: and close it on shutdown
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
126 end);