author | Matthew Wild <mwild1@gmail.com> |
Tue, 12 Mar 2024 14:07:00 +0000 | |
changeset 5868 | b5a110544fd4 |
parent 5489 | 67190744b1eb |
permissions | -rw-r--r-- |
1623
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 |
local st = require "util.stanza"; |
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 |
local json = require "util.json"; |
4629
f7e26c43a9bc
mod_pubsub_alertmanager: Add TODOs
Kim Alvefur <zash@zash.se>
parents:
4625
diff
changeset
|
3 |
local filters = { --[[ TODO what's useful? ]] }; |
4623
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
4 |
local render = require "util.interpolation".new("%b{}", tostring, filters); |
1623
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 |
local uuid_generate = require "util.uuid".generate; |
4622
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
6 |
|
4629
f7e26c43a9bc
mod_pubsub_alertmanager: Add TODOs
Kim Alvefur <zash@zash.se>
parents:
4625
diff
changeset
|
7 |
-- TODO alertmanager supports inclusion of HTTP auth and OAuth, worth looking |
f7e26c43a9bc
mod_pubsub_alertmanager: Add TODOs
Kim Alvefur <zash@zash.se>
parents:
4625
diff
changeset
|
8 |
-- into for using instead of request IP |
f7e26c43a9bc
mod_pubsub_alertmanager: Add TODOs
Kim Alvefur <zash@zash.se>
parents:
4625
diff
changeset
|
9 |
|
4622
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
10 |
module:depends("http"); |
1623
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 |
|
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 |
local pubsub_service = module:depends("pubsub").service; |
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 |
|
3018
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
14 |
local error_mapping = { |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
15 |
["forbidden"] = 403; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
16 |
["item-not-found"] = 404; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
17 |
["internal-server-error"] = 500; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
18 |
["conflict"] = 409; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
19 |
}; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
20 |
|
3021
8e48c0b233e0
mod_pubsub_post: Factor out the 'actor' into an argument
Kim Alvefur <zash@zash.se>
parents:
3020
diff
changeset
|
21 |
local function publish_payload(node, actor, item_id, payload) |
3018
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
22 |
local post_item = st.stanza("item", { xmlns = "http://jabber.org/protocol/pubsub", id = item_id, }) |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
23 |
:add_child(payload); |
3021
8e48c0b233e0
mod_pubsub_post: Factor out the 'actor' into an argument
Kim Alvefur <zash@zash.se>
parents:
3020
diff
changeset
|
24 |
local ok, err = pubsub_service:publish(node, actor, item_id, post_item); |
3018
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
25 |
module:log("debug", ":publish(%q, true, %q, %s) -> %q", node, item_id, payload:top_tag(), err or ""); |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
26 |
if not ok then |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
27 |
return error_mapping[err] or 500; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
28 |
end |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
29 |
return 202; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
30 |
end |
1623
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 |
|
5489
67190744b1eb
mod_pubsub_alertmanager: Support for per-path config overrides
Matthew Wild <mwild1@gmail.com>
parents:
4631
diff
changeset
|
32 |
local global_node_template = module:get_option_string("alertmanager_node_template", "{path?alerts}"); |
67190744b1eb
mod_pubsub_alertmanager: Support for per-path config overrides
Matthew Wild <mwild1@gmail.com>
parents:
4631
diff
changeset
|
33 |
local path_configs = module:get_option("alertmanager_path_configs", {}); |
4625
ebc2c099a11b
mod_pubsub_alertmanager: Allow templating the pubsub node to publish to
Kim Alvefur <zash@zash.se>
parents:
4624
diff
changeset
|
34 |
|
3018
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
35 |
function handle_POST(event, path) |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
36 |
local request = event.request; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
37 |
|
5489
67190744b1eb
mod_pubsub_alertmanager: Support for per-path config overrides
Matthew Wild <mwild1@gmail.com>
parents:
4631
diff
changeset
|
38 |
local config = path_configs[path] or {}; |
67190744b1eb
mod_pubsub_alertmanager: Support for per-path config overrides
Matthew Wild <mwild1@gmail.com>
parents:
4631
diff
changeset
|
39 |
local node_template = config.node_template or global_node_template; |
67190744b1eb
mod_pubsub_alertmanager: Support for per-path config overrides
Matthew Wild <mwild1@gmail.com>
parents:
4631
diff
changeset
|
40 |
local publisher = config.publisher or request.ip; |
67190744b1eb
mod_pubsub_alertmanager: Support for per-path config overrides
Matthew Wild <mwild1@gmail.com>
parents:
4631
diff
changeset
|
41 |
|
4622
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
42 |
local payload = json.decode(event.request.body); |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
43 |
if type(payload) ~= "table" then return 400; end |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
44 |
if payload.version ~= "4" then return 501; end |
3505
1df139b157fb
mod_pubsub_post: Add support for WebSub authentication
Kim Alvefur <zash@zash.se>
parents:
3259
diff
changeset
|
45 |
|
4622
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
46 |
for _, alert in ipairs(payload.alerts) do |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
47 |
local item = st.stanza("alerts", {xmlns = "urn:uuid:e3bec775-c607-4e9b-9a3f-94de1316d861:v4", status=alert.status}); |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
48 |
for k, v in pairs(alert.annotations) do |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
49 |
item:text_tag("annotation", v, { name=k }); |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
50 |
end |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
51 |
for k, v in pairs(alert.labels) do |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
52 |
item:text_tag("label", v, { name=k }); |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
53 |
end |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
54 |
item:tag("starts", { at = alert.startsAt}):up(); |
4630
285efde5e8a5
mod_pubsub_alertmanager: Exclude "ends at" timestamp for unresolved alerts
Kim Alvefur <zash@zash.se>
parents:
4629
diff
changeset
|
55 |
if alert.endsAt and alert.status == "resolved" then |
4622
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
56 |
item:tag("ends", { at = alert.endsAt }):up(); |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
57 |
end |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
58 |
if alert.generatorURL then |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
59 |
item:tag("link", { href=alert.generatorURL }):up(); |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
60 |
end |
3259
64d1dfbd1740
mod_pubsub_post: Ensure actor is non-nil (catch inability to determine IP or simliar)
Kim Alvefur <zash@zash.se>
parents:
3258
diff
changeset
|
61 |
|
4625
ebc2c099a11b
mod_pubsub_alertmanager: Allow templating the pubsub node to publish to
Kim Alvefur <zash@zash.se>
parents:
4624
diff
changeset
|
62 |
local node = render(node_template, {alert = alert, path = path, payload = payload, request = request}); |
5489
67190744b1eb
mod_pubsub_alertmanager: Support for per-path config overrides
Matthew Wild <mwild1@gmail.com>
parents:
4631
diff
changeset
|
63 |
local ret = publish_payload(node, publisher, uuid_generate(), item); |
4622
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
64 |
if ret ~= 202 then |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
65 |
return ret |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
66 |
end |
3018
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
67 |
end |
4622
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
68 |
return 202; |
1623
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 |
end |
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 |
|
4624
9b253cce7d88
mod_pubsub_alertmanager: Allow configuring template for <body> rendering
Kim Alvefur <zash@zash.se>
parents:
4623
diff
changeset
|
71 |
local template = module:get_option_string("alertmanager_body_template", [[ |
4623
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
72 |
*ALARM!* |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
73 |
Status: {status} |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
74 |
Starts at: {startsAt}{endsAt& |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
75 |
Ends at: {endsAt}} |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
76 |
Labels: {labels% |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
77 |
{idx}: {item}} |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
78 |
Annotations: {annotations% |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
79 |
{idx}: {item}} |
4624
9b253cce7d88
mod_pubsub_alertmanager: Allow configuring template for <body> rendering
Kim Alvefur <zash@zash.se>
parents:
4623
diff
changeset
|
80 |
]]); |
4623
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
81 |
|
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
82 |
module:hook("pubsub-summary/urn:uuid:e3bec775-c607-4e9b-9a3f-94de1316d861:v4", function(event) |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
83 |
local payload = event.payload; |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
84 |
|
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
85 |
local data = { |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
86 |
status = payload.attr.status, |
4631
adda872fa9e1
mod_pubsub_alertmanager: Include status booleans in template input
Kim Alvefur <zash@zash.se>
parents:
4630
diff
changeset
|
87 |
firing = "firing" == payload.attr.status, |
adda872fa9e1
mod_pubsub_alertmanager: Include status booleans in template input
Kim Alvefur <zash@zash.se>
parents:
4630
diff
changeset
|
88 |
resolved = "resolved" == payload.attr.status, |
4623
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
89 |
annotations = {}, |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
90 |
labels = {}, |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
91 |
endsAt = payload:find("ends/@at"), |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
92 |
startsAt = payload:find("starts/@at"), |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
93 |
}; |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
94 |
for label in payload:childtags("label") do |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
95 |
data.labels[tostring(label.attr.name)] = label:get_text(); |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
96 |
end |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
97 |
for annotation in payload:childtags("annotation") do |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
98 |
data.annotations[tostring(annotation.attr.name)] = annotation:get_text(); |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
99 |
end |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
100 |
|
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
101 |
return render(template, data); |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
102 |
end); |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
103 |
|
1623
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
104 |
module:provides("http", { |
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
105 |
route = { |
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
106 |
["POST /*"] = handle_POST; |
4625
ebc2c099a11b
mod_pubsub_alertmanager: Allow templating the pubsub node to publish to
Kim Alvefur <zash@zash.se>
parents:
4624
diff
changeset
|
107 |
["POST"] = handle_POST; |
1623
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
108 |
}; |
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
109 |
}); |