author | Kim Alvefur <zash@zash.se> |
Thu, 01 Jul 2021 00:07:27 +0200 | |
changeset 4623 | b11001bd915d |
parent 4622 | 48132b6e1b16 |
child 4624 | 9b253cce7d88 |
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"; |
4623
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
3 |
local filters = {}; |
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 |
|
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
7 |
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
|
8 |
|
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 |
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
|
10 |
|
3018
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
11 |
local error_mapping = { |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
12 |
["forbidden"] = 403; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
13 |
["item-not-found"] = 404; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
14 |
["internal-server-error"] = 500; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
15 |
["conflict"] = 409; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
16 |
}; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
17 |
|
3021
8e48c0b233e0
mod_pubsub_post: Factor out the 'actor' into an argument
Kim Alvefur <zash@zash.se>
parents:
3020
diff
changeset
|
18 |
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
|
19 |
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
|
20 |
:add_child(payload); |
3021
8e48c0b233e0
mod_pubsub_post: Factor out the 'actor' into an argument
Kim Alvefur <zash@zash.se>
parents:
3020
diff
changeset
|
21 |
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
|
22 |
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
|
23 |
if not ok then |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
24 |
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
|
25 |
end |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
26 |
return 202; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
27 |
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
|
28 |
|
3018
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
29 |
function handle_POST(event, path) |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
30 |
local request = event.request; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
31 |
|
4622
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
32 |
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
|
33 |
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
|
34 |
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
|
35 |
|
4622
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
36 |
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
|
37 |
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
|
38 |
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
|
39 |
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
|
40 |
end |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
41 |
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
|
42 |
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
|
43 |
end |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
44 |
item:tag("starts", { at = alert.startsAt}):up(); |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
45 |
if alert.endsAt then |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
46 |
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
|
47 |
end |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
48 |
if alert.generatorURL then |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
49 |
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
|
50 |
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
|
51 |
|
4622
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
52 |
local ret = publish_payload(path, request.ip, uuid_generate(), item); |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
53 |
if ret ~= 202 then |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
54 |
return ret |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
55 |
end |
3018
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3017
diff
changeset
|
56 |
end |
4622
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4556
diff
changeset
|
57 |
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
|
58 |
end |
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 |
|
4623
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
60 |
local template = [[ |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
61 |
*ALARM!* |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
62 |
Status: {status} |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
63 |
Starts at: {startsAt}{endsAt& |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
64 |
Ends at: {endsAt}} |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
65 |
Labels: {labels% |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
66 |
{idx}: {item}} |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
67 |
Annotations: {annotations% |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
68 |
{idx}: {item}} |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
69 |
]] |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
70 |
|
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
71 |
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
|
72 |
local payload = event.payload; |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
73 |
|
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
74 |
local data = { |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
75 |
status = payload.attr.status, |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
76 |
annotations = {}, |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
77 |
labels = {}, |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
78 |
endsAt = payload:find("ends/@at"), |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
79 |
startsAt = payload:find("starts/@at"), |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
80 |
}; |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
81 |
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
|
82 |
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
|
83 |
end |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
84 |
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
|
85 |
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
|
86 |
end |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
87 |
|
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
88 |
return render(template, data); |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
89 |
end); |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4622
diff
changeset
|
90 |
|
1623
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
91 |
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
|
92 |
route = { |
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
93 |
["POST /*"] = handle_POST; |
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
94 |
}; |
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
95 |
}); |