mod_pubsub_alertmanager/mod_pubsub_alertmanager.lua
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--
mod_pubsub_alertmanager: Add a plain text summary
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
});