plugins/mod_scansion_record.lua
author Matthew Wild <mwild1@gmail.com>
Wed, 27 Mar 2024 15:35:15 +0000
branch0.12
changeset 13469 54a936345aaa
parent 12114 b5b799a2a10c
child 12981 74b9e05af71e
permissions -rw-r--r--
prosodyctl check: Warn about invalid domain names in the config file This ensures that domain names of virtual hosts and components are valid in XMPP, and that they are encoded correctly.
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
12114
b5b799a2a10c util.id: Adjust entropy levels, with rationales
Kim Alvefur <zash@zash.se>
parents: 11258
diff changeset
    11
local record_id = id.short():lower();
9364
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);
11258
613035d6e5a0 mod_scansion_record: Flush after writes
Matthew Wild <mwild1@gmail.com>
parents: 10722
diff changeset
    21
	scan:flush();
9351
e1de3245c696 mod_scansion_record: Finish function for writing data
Kim Alvefur <zash@zash.se>
parents: 9350
diff changeset
    22
end
9347
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    23
9367
62f9127ab493 mod_scansion_record: Open a related file for header entries
Kim Alvefur <zash@zash.se>
parents: 9366
diff changeset
    24
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
    25
	head:write(string);
11258
613035d6e5a0 mod_scansion_record: Flush after writes
Matthew Wild <mwild1@gmail.com>
parents: 10722
diff changeset
    26
	head:flush();
9367
62f9127ab493 mod_scansion_record: Open a related file for header entries
Kim Alvefur <zash@zash.se>
parents: 9366
diff changeset
    27
end
62f9127ab493 mod_scansion_record: Open a related file for header entries
Kim Alvefur <zash@zash.se>
parents: 9366
diff changeset
    28
9371
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9370
diff changeset
    29
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
    30
	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
    31
	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
    32
		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
    33
	end
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9370
diff changeset
    34
	head:write("\n");
11258
613035d6e5a0 mod_scansion_record: Flush after writes
Matthew Wild <mwild1@gmail.com>
parents: 10722
diff changeset
    35
	head:flush();
9371
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9370
diff changeset
    36
end
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9370
diff changeset
    37
9347
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
local function record_event(session, event)
9354
b37f131d68c2 mod_scansion_record: Complete stanza recording functions
Kim Alvefur <zash@zash.se>
parents: 9353
diff changeset
    39
	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
    40
end
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    41
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
local function record_stanza(stanza, session, verb)
10722
d229e4d31598 mod_scansion_record: Indent stanzas in recordings
Kim Alvefur <zash@zash.se>
parents: 9623
diff changeset
    43
	local flattened = tostring(stanza:indent(2, "\t"));
9623
7172077c0a53 mod_scansion_record: Split stanzas into multiple lines
Kim Alvefur <zash@zash.se>
parents: 9622
diff changeset
    44
	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
    45
end
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    46
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    47
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
    48
	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
    49
		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
    50
		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
    51
		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
    52
	end
9354
b37f131d68c2 mod_scansion_record: Complete stanza recording functions
Kim Alvefur <zash@zash.se>
parents: 9353
diff changeset
    53
	return stanza;
9347
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    54
end
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    56
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
    57
	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
    58
		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
    59
			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
    60
			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
    61
				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
    62
			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
    63
			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
    64
		end
9361
bbc24fc734da mod_scansion_record: Only record stanzas in the default namespace
Kim Alvefur <zash@zash.se>
parents: 9360
diff changeset
    65
	end
9354
b37f131d68c2 mod_scansion_record: Complete stanza recording functions
Kim Alvefur <zash@zash.se>
parents: 9353
diff changeset
    66
	return stanza;
9347
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    67
end
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    68
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    69
module:hook("resource-bind", function (event)
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    70
	local session = event.session;
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    71
	if not users[session.username] then
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    72
		users[session.username] = {
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    73
			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
    74
			devices = {};
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    75
			n_devices = 0;
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    76
		};
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    77
	end
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    78
	local user = users[session.username];
9357
b042aa047d80 mod_scansion_record: Correctly retrieve resource
Kim Alvefur <zash@zash.se>
parents: 9356
diff changeset
    79
	local device = user.devices[session.resource];
9347
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    80
	if not device then
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    81
		user.n_devices = user.n_devices + 1;
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    82
		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
    83
		user.devices[session.resource] = device;
9347
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    84
	end
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    85
	session.scansion_character = user.character;
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    86
	session.scansion_device = device;
9353
07fd880905a3 mod_scansion_record: Remove extra "
Kim Alvefur <zash@zash.se>
parents: 9352
diff changeset
    87
	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
    88
9373
7872abb9fc1f mod_scansion_record: Record the full identity including device name
Kim Alvefur <zash@zash.se>
parents: 9372
diff changeset
    89
	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
    90
		jid = session.full_jid,
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9370
diff changeset
    91
		password = "password",
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9370
diff changeset
    92
	});
0c5177738ffd mod_scansion_record: Record connected clients as scansion Objects declarations
Kim Alvefur <zash@zash.se>
parents: 9370
diff changeset
    93
9375
0e685b7ec039 mod_scansion_record: Lower log message to 'info' level
Kim Alvefur <zash@zash.se>
parents: 9374
diff changeset
    94
	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
    95
	record_event(session, "connects");
9347
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    96
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    97
	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
    98
	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
    99
end);
d36fa7d164c0 mod_scansion_record: Unfinished code dump from Matthew
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   100
9376
1a69803d5d5d mod_scansion_record: Record disconnection
Kim Alvefur <zash@zash.se>
parents: 9375
diff changeset
   101
module:hook("resource-unbind", function (event)
1a69803d5d5d mod_scansion_record: Record disconnection
Kim Alvefur <zash@zash.se>
parents: 9375
diff changeset
   102
	local session = event.session;
1a69803d5d5d mod_scansion_record: Record disconnection
Kim Alvefur <zash@zash.se>
parents: 9375
diff changeset
   103
	if session.scansion_id then
1a69803d5d5d mod_scansion_record: Record disconnection
Kim Alvefur <zash@zash.se>
parents: 9375
diff changeset
   104
		record_event(session, "disconnects");
1a69803d5d5d mod_scansion_record: Record disconnection
Kim Alvefur <zash@zash.se>
parents: 9375
diff changeset
   105
	end
1a69803d5d5d mod_scansion_record: Record disconnection
Kim Alvefur <zash@zash.se>
parents: 9375
diff changeset
   106
end)
1a69803d5d5d mod_scansion_record: Record disconnection
Kim Alvefur <zash@zash.se>
parents: 9375
diff changeset
   107
9368
acb316319dc0 mod_scansion_record: Generate a header with hostname and timestamp
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
   108
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
   109
acb316319dc0 mod_scansion_record: Generate a header with hostname and timestamp
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
   110
record[[
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
acb316319dc0 mod_scansion_record: Generate a header with hostname and timestamp
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
   113
]]
acb316319dc0 mod_scansion_record: Generate a header with hostname and timestamp
Kim Alvefur <zash@zash.se>
parents: 9367
diff changeset
   114
9363
0444e321b757 mod_scansion_record: Hook correct shutdown event
Kim Alvefur <zash@zash.se>
parents: 9362
diff changeset
   115
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
   116
	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
   117
	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
   118
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
   119
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
   120
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
   121
	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
   122
	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
   123
		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
   124
	end
9365
31317e8edbbc mod_scansion_record: Fix missed rename of file handle
Kim Alvefur <zash@zash.se>
parents: 9364
diff changeset
   125
	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
   126
	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
   127
	head:close()
9350
9479523e209a mod_scansion_record: and close it on shutdown
Kim Alvefur <zash@zash.se>
parents: 9349
diff changeset
   128
end);