Mercurial > prosody-modules
comparison mod_s2s_status/mod_s2s_status.lua @ 4791:b86282953663
mod_s2s_status: Module to track status of s2s connections by domain
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Fri, 26 Nov 2021 10:10:02 +0000 |
parents | |
children | 31c331d05a75 |
comparison
equal
deleted
inserted
replaced
4790:bb66e87a3604 | 4791:b86282953663 |
---|---|
1 local status_out = module:shared("out"); | |
2 | |
3 local errors = require "util.error"; | |
4 | |
5 local function get_session_info(session) | |
6 local direction, peer_host = session.direction; | |
7 if direction == "outgoing" then | |
8 peer_host = session.to_host; | |
9 elseif direction == "incoming" then | |
10 peer_host = session.from_host; | |
11 end | |
12 return peer_host, direction, session.id; | |
13 end | |
14 | |
15 local function get_domain_log_out(peer_domain) | |
16 local domain_log = status_out[peer_domain]; | |
17 if not domain_log then | |
18 domain_log = {}; | |
19 status_out[peer_domain] = domain_log; | |
20 end | |
21 end | |
22 | |
23 local function get_connection_record(domain_log, id) | |
24 for _, record in ipairs(domain_log) do | |
25 if record.id == id then | |
26 return record; | |
27 end | |
28 end | |
29 -- No record for this connection yet, create it | |
30 local record = { id = id }; | |
31 table.insert(domain_log, 1, record); | |
32 return record; | |
33 end | |
34 | |
35 local function log_new_connection_out(peer_domain, id) | |
36 local domain_log = get_domain_log_out(peer_domain); | |
37 local record = get_connection_record(domain_log, id); | |
38 record.status, record.time_started = "connecting", os.time(); | |
39 end | |
40 | |
41 local function log_successful_connection_out(peer_domain, id) | |
42 local domain_log = get_domain_log_out(peer_domain); | |
43 local record = get_connection_record(domain_log, id); | |
44 record.status, record.time_connected = "connected", os.time(); | |
45 end | |
46 | |
47 local function log_ended_connection_out(peer_domain, id, reason) | |
48 local domain_log = get_domain_log_out(peer_domain); | |
49 local record = get_connection_record(domain_log, id); | |
50 | |
51 if record.status == "connecting" then | |
52 record.status = "failed"; | |
53 elseif record.status == "connected" then | |
54 record.status = "disconnected"; | |
55 end | |
56 if reason then | |
57 local e_reason = errors.new(reason); | |
58 record.error = { | |
59 type = e_reason.type; | |
60 condition = e_reason.condition; | |
61 text = e_reason.text; | |
62 }; | |
63 if not record.error.text and type(reason) == "string" then | |
64 record.error.text = reason; | |
65 end | |
66 end | |
67 local now = os.time(); | |
68 record.time_ended = now; | |
69 end | |
70 | |
71 local function s2sout_established(event) | |
72 local peer_domain, _, id = get_session_info(event.session); | |
73 log_successful_connection_out(peer_domain, id); | |
74 end | |
75 | |
76 local function s2sout_destroyed(event) | |
77 local peer_domain, _, id = get_session_info(event.session); | |
78 log_ended_connection_out(peer_domain, id); | |
79 end | |
80 | |
81 local function s2s_created(event) | |
82 local peer_domain, direction, id = get_session_info(event.session); | |
83 if direction == "outgoing" then | |
84 log_new_connection_out(peer_domain, id); | |
85 end | |
86 end | |
87 | |
88 module:hook("s2s-created", s2s_created); | |
89 module:hook("s2sout-established", s2sout_established); | |
90 module:hook("s2sout-destroyed", s2sout_destroyed); |