Mercurial > prosody-modules
view mod_muc_members_json/mod_muc_members_json.lua @ 5668:ecfd7aece33b
mod_measure_modules: Report module statuses via OpenMetrics
Someone in the chat asked about a health check endpoint, which reminded
me of mod_http_status, which provides access to module statuses with
full details. After that, this idea came about, which seems natural.
As noted in the README, it could be used to monitor that critical
modules are in fact loaded correctly.
As more modules use the status API, the more useful this module and
mod_http_status becomes.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 06 Oct 2023 18:34:39 +0200 |
parents | 80abda15a1e9 |
children |
line wrap: on
line source
local http = require "net.http"; local json = require "util.json"; local json_url = assert(module:get_option_string("muc_members_json_url"), "muc_members_json_url required"); local managed_mucs = module:get_option("muc_members_json_mucs"); local mod_muc = module:depends("muc"); --[[ { xsf = { team_hats = { board = { id = "xmpp:xmpp.org/hats/board"; title = "Board"; }; }; member_hat = { id = "xmpp:xmpp.org/hats/member"; title = "XSF member"; }; }; iteam = { team_hats = { iteam = { id = "xmpp:xmpp.org/hats/iteam"; title = "Infra team"; }; }; }; } --]] local function get_hats(member_info, muc_config) local hats = {}; if muc_config.member_hat then hats[muc_config.member_hat.id] = { title = muc_config.member_hat.title; active = true; }; end if muc_config.team_hats and member_info.roles then for _, role in ipairs(member_info.roles) do local hat = muc_config.team_hats[role]; if hat then hats[hat.id] = { title = hat.title; active = true; }; end end end return hats; end function module.load() http.request(json_url) :next(function (result) return json.decode(result.body); end) :next(function (data) module:log("debug", "DATA: %s", require "util.serialization".serialize(data, "debug")); for name, muc_config in pairs(managed_mucs) do local muc_jid = name.."@"..module.host; local muc = mod_muc.get_room_from_jid(muc_jid); module:log("warn", "%s -> %s -> %s", name, muc_jid, muc); if muc then local jids = {}; for _, member_info in ipairs(data.members) do for _, member_jid in ipairs(member_info.jids) do jids[member_jid] = true; local affiliation = muc:get_affiliation(member_jid); if not affiliation then muc:set_affiliation(true, member_jid, "member", "imported membership"); muc:set_affiliation_data(member_jid, "source", module.name); end muc:set_affiliation_data(member_jid, "hats", get_hats(member_info, muc_config)); end end -- Remove affiliation from folk who weren't in the source data but previously were for jid, aff, data in muc:each_affiliation() do if not jids[jid] and data and data.source == module.name then muc:set_affiliation(true, jid, "none", "imported membership lost"); end end end end end):catch(function (err) module:log("error", "FAILED: %s", err); end); end