plugins/mod_scansion_record.lua
author Kim Alvefur <zash@zash.se>
Thu, 04 Nov 2021 01:00:06 +0100
branch0.11
changeset 12093 76b4e3f12b53
parent 9623 7172077c0a53
child 10722 d229e4d31598
permissions -rw-r--r--
mod_pep: Wipe pubsub service on user deletion Data is already wiped from storage, but this ensures everything is properly unsubscribed, possibly with notifications etc. Clears recipient cache as well, since it is no longer relevant.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9347
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
9358
a31e0d549b74 mod_scansion_record: Import util.filters
Kim Alvefur <zash@zash.se>
parents: 9357
diff changeset
     5
local filters = require "util.filters";
9347
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
local id = require "util.id";
9368
acb316319dc0 mod_scansion_record: Generate a header with hostname and timestamp
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
     7
local dt = require "util.datetime";
9364
3620f7b3517b mod_scansion_record: Split up construction of filename for reuse of parts later
Kim Alvefur <zash@zash.se>
parents: 9363
diff changeset
     8
local dm = require "util.datamanager";
9622
d6e6e1fb7ef0 mod_scansion_record: Discard from/to where these are implicitly the sessions full JID
Kim Alvefur <zash@zash.se>
parents: 9376
diff changeset
     9
local st = require "util.stanza";
9347
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
9364
3620f7b3517b mod_scansion_record: Split up construction of filename for reuse of parts later
Kim Alvefur <zash@zash.se>
parents: 9363
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: 9363
diff changeset
    12
local record_date = os.date("%Y%b%d"):lower();
9372
dd452f932b67 mod_scansion_record: Merge header and log into one file at shutdown
Kim Alvefur <zash@zash.se>
parents: 9371
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: 9371
diff changeset
    14
local record_file = dm.getpath(record_id, "scansion", record_date, "log", true);
9347
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
9367
62f9127ab493 mod_scansion_record: Open a related file for header entries
Kim Alvefur <zash@zash.se>
parents: 9366
diff changeset
    16
local head = io.open(header_file, "w");
9372
dd452f932b67 mod_scansion_record: Merge header and log into one file at shutdown
Kim Alvefur <zash@zash.se>
parents: 9371
diff changeset
    17
local scan = io.open(record_file, "w+");
9349
2946f2bd2bb5 mod_scansion_record: Open log file
Kim Alvefur <zash@zash.se>
parents: 9348
diff changeset
    18
9347
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
local function record(string)
9360
0ae20fb3d4c6 mod_scansion_record: Rename main file handle
Kim Alvefur <zash@zash.se>
parents: 9359
diff changeset
    20
	scan:write(string);
9351
e1de3245c696 mod_scansion_record: Finish function for writing data
Kim Alvefur <zash@zash.se>
parents: 9350
diff changeset
    21
end
9347
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    22
9367
62f9127ab493 mod_scansion_record: Open a related file for header entries
Kim Alvefur <zash@zash.se>
parents: 9366
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: 9366
diff changeset
    24
	head:write(string);
62f9127ab493 mod_scansion_record: Open a related file for header entries
Kim Alvefur <zash@zash.se>
parents: 9366
diff changeset
    25
end
62f9127ab493 mod_scansion_record: Open a related file for header entries
Kim Alvefur <zash@zash.se>
parents: 9366
diff changeset
    26
9371
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9370
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: 9370
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: 9370
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: 9370
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: 9370
diff changeset
    31
	end
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9370
diff changeset
    32
	head:write("\n");
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9370
diff changeset
    33
end
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9370
diff changeset
    34
9347
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    35
local function record_event(session, event)
9354
b37f131d68c2 mod_scansion_record: Complete stanza recording functions
Kim Alvefur <zash@zash.se>
parents: 9353
diff changeset
    36
	record(session.scansion_id.." "..event.."\n\n");
9347
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)
9623
7172077c0a53 mod_scansion_record: Split stanzas into multiple lines
Kim Alvefur <zash@zash.se>
parents: 9622
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: 9622
diff changeset
    41
	-- TODO Proper prettyprinting with indentation
7172077c0a53 mod_scansion_record: Split stanzas into multiple lines
Kim Alvefur <zash@zash.se>
parents: 9622
diff changeset
    42
	record(session.scansion_id.." "..verb..":\n\t"..flattened.."\n\n");
9347
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)
9361
bbc24fc734da mod_scansion_record: Only record stanzas in the default namespace
Kim Alvefur <zash@zash.se>
parents: 9360
diff changeset
    46
	if stanza.attr.xmlns == nil then
9622
d6e6e1fb7ef0 mod_scansion_record: Discard from/to where these are implicitly the sessions full JID
Kim Alvefur <zash@zash.se>
parents: 9376
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: 9376
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: 9376
diff changeset
    49
		record_stanza(copy, session, "sends")
9361
bbc24fc734da mod_scansion_record: Only record stanzas in the default namespace
Kim Alvefur <zash@zash.se>
parents: 9360
diff changeset
    50
	end
9354
b37f131d68c2 mod_scansion_record: Complete stanza recording functions
Kim Alvefur <zash@zash.se>
parents: 9353
diff changeset
    51
	return stanza;
9347
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)
9361
bbc24fc734da mod_scansion_record: Only record stanzas in the default namespace
Kim Alvefur <zash@zash.se>
parents: 9360
diff changeset
    55
	if stanza.attr.xmlns == nil then
9362
dc55d7d2798b mod_scansion_record: Avoid recording the resource binding stanza
Kim Alvefur <zash@zash.se>
parents: 9361
diff changeset
    56
		if not (stanza.name == "iq" and stanza:get_child("bind", "urn:ietf:params:xml:ns:xmpp-bind")) then
9622
d6e6e1fb7ef0 mod_scansion_record: Discard from/to where these are implicitly the sessions full JID
Kim Alvefur <zash@zash.se>
parents: 9376
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: 9376
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: 9376
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: 9376
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: 9376
diff changeset
    61
			record_stanza(copy, session, "receives");
9362
dc55d7d2798b mod_scansion_record: Avoid recording the resource binding stanza
Kim Alvefur <zash@zash.se>
parents: 9361
diff changeset
    62
		end
9361
bbc24fc734da mod_scansion_record: Only record stanzas in the default namespace
Kim Alvefur <zash@zash.se>
parents: 9360
diff changeset
    63
	end
9354
b37f131d68c2 mod_scansion_record: Complete stanza recording functions
Kim Alvefur <zash@zash.se>
parents: 9353
diff changeset
    64
	return stanza;
9347
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];
9357
b042aa047d80 mod_scansion_record: Correctly retrieve resource
Kim Alvefur <zash@zash.se>
parents: 9356
diff changeset
    77
	local device = user.devices[session.resource];
9347
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());
9357
b042aa047d80 mod_scansion_record: Correctly retrieve resource
Kim Alvefur <zash@zash.se>
parents: 9356
diff changeset
    81
		user.devices[session.resource] = device;
9347
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;
9353
07fd880905a3 mod_scansion_record: Remove extra "
Kim Alvefur <zash@zash.se>
parents: 9352
diff changeset
    85
	session.scansion_id = user.character..(device ~= "" and "'s "..device or device);
9347
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    86
9373
7872abb9fc1f mod_scansion_record: Record the full identity including device name
Kim Alvefur <zash@zash.se>
parents: 9372
diff changeset
    87
	record_object("Client", session.scansion_id, {
9371
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9370
diff changeset
    88
		jid = session.full_jid,
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9370
diff changeset
    89
		password = "password",
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9370
diff changeset
    90
	});
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9370
diff changeset
    91
9375
0e685b7ec039 mod_scansion_record: Lower log message to 'info' level
Kim Alvefur <zash@zash.se>
parents: 9374
diff changeset
    92
	module:log("info", "Connected: %s", session.scansion_id);
9355
0fdb70ad9fcc mod_scansion_record: Record session connecting
Kim Alvefur <zash@zash.se>
parents: 9354
diff changeset
    93
	record_event(session, "connects");
9347
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
9376
1a69803d5d5d mod_scansion_record: Record disconnection
Kim Alvefur <zash@zash.se>
parents: 9375
diff changeset
    99
module:hook("resource-unbind", function (event)
1a69803d5d5d mod_scansion_record: Record disconnection
Kim Alvefur <zash@zash.se>
parents: 9375
diff changeset
   100
	local session = event.session;
1a69803d5d5d mod_scansion_record: Record disconnection
Kim Alvefur <zash@zash.se>
parents: 9375
diff changeset
   101
	if session.scansion_id then
1a69803d5d5d mod_scansion_record: Record disconnection
Kim Alvefur <zash@zash.se>
parents: 9375
diff changeset
   102
		record_event(session, "disconnects");
1a69803d5d5d mod_scansion_record: Record disconnection
Kim Alvefur <zash@zash.se>
parents: 9375
diff changeset
   103
	end
1a69803d5d5d mod_scansion_record: Record disconnection
Kim Alvefur <zash@zash.se>
parents: 9375
diff changeset
   104
end)
1a69803d5d5d mod_scansion_record: Record disconnection
Kim Alvefur <zash@zash.se>
parents: 9375
diff changeset
   105
9368
acb316319dc0 mod_scansion_record: Generate a header with hostname and timestamp
Kim Alvefur <zash@zash.se>
parents: 9367
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: 9367
diff changeset
   107
acb316319dc0 mod_scansion_record: Generate a header with hostname and timestamp
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
   108
record[[
acb316319dc0 mod_scansion_record: Generate a header with hostname and timestamp
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
   109
-----
acb316319dc0 mod_scansion_record: Generate a header with hostname and timestamp
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
   110
acb316319dc0 mod_scansion_record: Generate a header with hostname and timestamp
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
   111
]]
acb316319dc0 mod_scansion_record: Generate a header with hostname and timestamp
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
   112
9363
0444e321b757 mod_scansion_record: Hook correct shutdown event
Kim Alvefur <zash@zash.se>
parents: 9362
diff changeset
   113
module:hook_global("server-stopping", function ()
9368
acb316319dc0 mod_scansion_record: Generate a header with hostname and timestamp
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
   114
	record("# recording ended on "..dt.datetime().."\n");
9372
dd452f932b67 mod_scansion_record: Merge header and log into one file at shutdown
Kim Alvefur <zash@zash.se>
parents: 9371
diff changeset
   115
	module:log("info", "Scansion recording available in %s", header_file);
9369
9472b4044fc6 mod_scansion_record: Close files in the cleanup stage of shutdown (fixes use after close)
Kim Alvefur <zash@zash.se>
parents: 9368
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: 9368
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: 9368
diff changeset
   118
prosody.events.add_handler("server-cleanup", function ()
9372
dd452f932b67 mod_scansion_record: Merge header and log into one file at shutdown
Kim Alvefur <zash@zash.se>
parents: 9371
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: 9371
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: 9371
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: 9371
diff changeset
   122
	end
9365
31317e8edbbc mod_scansion_record: Fix missed rename of file handle
Kim Alvefur <zash@zash.se>
parents: 9364
diff changeset
   123
	scan:close();
9372
dd452f932b67 mod_scansion_record: Merge header and log into one file at shutdown
Kim Alvefur <zash@zash.se>
parents: 9371
diff changeset
   124
	os.remove(record_file);
9367
62f9127ab493 mod_scansion_record: Open a related file for header entries
Kim Alvefur <zash@zash.se>
parents: 9366
diff changeset
   125
	head:close()
9350
9479523e209a mod_scansion_record: and close it on shutdown
Kim Alvefur <zash@zash.se>
parents: 9349
diff changeset
   126
end);