Mercurial > prosody-modules
annotate mod_s2s_keepalive/mod_s2s_keepalive.lua @ 3866:c0df50ce96f0
mod_rest: Handle internal http request errors early and then return
Skips over attempted parsing of the payload which usually failed since
the body is an error string like "connection refused", so this produced
useless errors.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 25 Jan 2020 20:22:12 +0100 |
parents | 580862decd77 |
children | c4002aae4ad3 |
rev | line source |
---|---|
1110
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1 local st = require "util.stanza"; |
3765
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
2 local watchdog = require "util.watchdog"; |
1110
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
3 |
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
4 local keepalive_servers = module:get_option_set("keepalive_servers"); |
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
5 local keepalive_interval = module:get_option_number("keepalive_interval", 60); |
3765
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
6 local keepalive_timeout = module:get_option_number("keepalive_timeout", 593); |
1110
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
7 |
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 local host = module.host; |
3764
07a1faa24261
mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents:
3723
diff
changeset
|
9 local s2sout = prosody.hosts[host].s2sout; |
1110
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
10 |
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 local function send_pings() |
3764
07a1faa24261
mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents:
3723
diff
changeset
|
12 local ping_hosts = {}; |
07a1faa24261
mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents:
3723
diff
changeset
|
13 |
07a1faa24261
mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents:
3723
diff
changeset
|
14 for remote_domain, session in pairs(s2sout) do |
3771
98e1e3ce307d
mod_s2s_keepalive: Invert check to work with bidi connections
Kim Alvefur <zash@zash.se>
parents:
3770
diff
changeset
|
15 if session.type ~= "s2sout_unauthed" |
1110
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
16 and (not(keepalive_servers) or keepalive_servers:contains(remote_domain)) then |
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 session.sends2s(st.iq({ to = remote_domain, type = "get", from = host, id = "keepalive" }) |
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 :tag("ping", { xmlns = "urn:xmpp:ping" }) |
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
19 ); |
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 end |
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
21 end |
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 |
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 for session in pairs(prosody.incoming_s2s) do |
3771
98e1e3ce307d
mod_s2s_keepalive: Invert check to work with bidi connections
Kim Alvefur <zash@zash.se>
parents:
3770
diff
changeset
|
24 if session.type ~= "s2sin_unauthed" |
3772
22f02716819f
mod_s2s_keepalive: Isolate source host of pings
Kim Alvefur <zash@zash.se>
parents:
3771
diff
changeset
|
25 and session.to_host == host |
1110
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 and (not(keepalive_servers) or keepalive_servers:contains(session.from_host)) then |
3764
07a1faa24261
mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents:
3723
diff
changeset
|
27 if not s2sout[session.from_host] then ping_hosts[session.from_host] = true; end |
1264
2db2c03dfb95
mod_s2s_keepalive: Don't send directly on the connection, use sends2s
Kim Alvefur <zash@zash.se>
parents:
1110
diff
changeset
|
28 session.sends2s " "; |
1110
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
29 -- If the connection is dead, this should make it time out. |
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 end |
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
31 end |
3764
07a1faa24261
mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents:
3723
diff
changeset
|
32 |
07a1faa24261
mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents:
3723
diff
changeset
|
33 -- ping remotes we only have s2sin from |
07a1faa24261
mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents:
3723
diff
changeset
|
34 for remote_domain in pairs(ping_hosts) do |
07a1faa24261
mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents:
3723
diff
changeset
|
35 module:send(st.iq({ to = remote_domain, type = "get", from = host, id = "keepalive" }) |
07a1faa24261
mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents:
3723
diff
changeset
|
36 :tag("ping", { xmlns = "urn:xmpp:ping" }) |
07a1faa24261
mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents:
3723
diff
changeset
|
37 ); |
07a1faa24261
mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents:
3723
diff
changeset
|
38 end |
07a1faa24261
mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents:
3723
diff
changeset
|
39 |
1110
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
40 return keepalive_interval; |
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
41 end |
97e238ce37ce
mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
42 |
3765
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
43 module:hook("s2sin-established", function (event) |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
44 local session = event.session; |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
45 if session.watchdog_keepalive then return end -- in case mod_bidi fires this twice |
3833
580862decd77
mod_s2s_keepalive: Respect keepalive_servers when creating watchdogs
Kim Alvefur <zash@zash.se>
parents:
3772
diff
changeset
|
46 if keepalive_servers and not keepalive_servers:contains(session.from_host) then return end |
3765
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
47 session.watchdog_keepalive = watchdog.new(keepalive_timeout, function () |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
48 session.log("info", "Keepalive ping timed out, closing connection"); |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
49 session:close("connection-timeout"); |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
50 end); |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
51 end); |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
52 |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
53 module:hook("s2sout-established", function (event) |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
54 local session = event.session; |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
55 if session.watchdog_keepalive then return end -- in case mod_bidi fires this twice |
3833
580862decd77
mod_s2s_keepalive: Respect keepalive_servers when creating watchdogs
Kim Alvefur <zash@zash.se>
parents:
3772
diff
changeset
|
56 if keepalive_servers and not keepalive_servers:contains(session.from_host) then return end |
3765
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
57 session.watchdog_keepalive = watchdog.new(keepalive_timeout, function () |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
58 session.log("info", "Keepalive ping timed out, closing connection"); |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
59 session:close("connection-timeout"); |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
60 end); |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
61 end); |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
62 |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
63 module:hook("iq-result/host/keepalive", function (event) |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
64 local origin = event.origin; |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
65 if origin.watchdog_keepalive then |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
66 origin.watchdog_keepalive:reset(); |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
67 end |
3766
f547eafb5a6d
mod_s2s_keepalive: Fix s2sout watchdog reset
Kim Alvefur <zash@zash.se>
parents:
3765
diff
changeset
|
68 if s2sout[origin.from_host] and s2sout[origin.from_host].watchdog_keepalive then |
f547eafb5a6d
mod_s2s_keepalive: Fix s2sout watchdog reset
Kim Alvefur <zash@zash.se>
parents:
3765
diff
changeset
|
69 s2sout[origin.from_host].watchdog_keepalive:reset(); |
3765
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
70 end |
3770
ae34ee0867f0
mod_s2s_keepalive: Mark ping response event as handled
Kim Alvefur <zash@zash.se>
parents:
3769
diff
changeset
|
71 return true; |
3765
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
72 end); |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
73 |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
74 module:hook("iq-error/host/keepalive", function (event) |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
75 local origin = event.origin; |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
76 if origin.dummy then return end -- Probably a sendq bounce |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
77 |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
78 if origin.type == "s2sin" or origin.type == "s2sout" then |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
79 -- An error from the remote means connectivity is ok, |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
80 -- so treat it the same as a result |
3769
ce1a32aa8bca
mod_s2s_keepalive: Include event payload in re-fired event (fix traceback)
Kim Alvefur <zash@zash.se>
parents:
3766
diff
changeset
|
81 return module:fire_event("iq-result/host/keepalive", event); |
3765
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
82 end |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
83 end); |
11878130f266
mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents:
3764
diff
changeset
|
84 |
3723
427879b46061
mod_s2s_keepalive: Remove support for obsolete Prosody 0.8
Kim Alvefur <zash@zash.se>
parents:
1264
diff
changeset
|
85 module:add_timer(keepalive_interval, send_pings); |