Software /
code /
prosody-modules
Comparison
mod_http_admin_api/mod_http_admin_api.lua @ 4576:cade5dac1003
mod_http_admin_api: Add endpoints for server maintenance
author | Jonas Schäfer <jonas@wielicki.name> |
---|---|
date | Thu, 27 May 2021 16:18:10 +0200 |
parent | 4517:d6a3201a65c0 |
child | 4714:bd83c9ada037 |
comparison
equal
deleted
inserted
replaced
4575:5b4f43b90766 | 4576:cade5dac1003 |
---|---|
1 local usermanager = require "core.usermanager"; | 1 local usermanager = require "core.usermanager"; |
2 | 2 |
3 local json = require "util.json"; | 3 local json = require "util.json"; |
4 local st = require "util.stanza"; | 4 local st = require "util.stanza"; |
5 local array = require "util.array"; | 5 local array = require "util.array"; |
6 local statsmanager = require "core.statsmanager"; | |
6 | 7 |
7 module:depends("http"); | 8 module:depends("http"); |
8 | 9 |
10 local announce = module:depends("announce"); | |
9 local invites = module:depends("invites"); | 11 local invites = module:depends("invites"); |
10 local tokens = module:depends("tokenauth"); | 12 local tokens = module:depends("tokenauth"); |
11 local mod_pep = module:depends("pep"); | 13 local mod_pep = module:depends("pep"); |
12 local mod_groups = module:depends("groups_internal"); | 14 local mod_groups = module:depends("groups_internal"); |
13 | 15 |
576 site_name = site_name; | 578 site_name = site_name; |
577 version = prosody.version; | 579 version = prosody.version; |
578 }); | 580 }); |
579 end | 581 end |
580 | 582 |
583 local function maybe_export_plain_gauge(mf) | |
584 if mf == nil then | |
585 return nil | |
586 end | |
587 return mf.data.value | |
588 end | |
589 | |
590 local function maybe_export_plain_counter(mf) | |
591 if mf == nil then | |
592 return nil | |
593 end | |
594 return { | |
595 since = mf.data._created, | |
596 value = mf.data.value, | |
597 } | |
598 end | |
599 | |
600 local function maybe_export_summed_gauge(mf) | |
601 if mf == nil then | |
602 return nil | |
603 end | |
604 local sum = 0; | |
605 for _, metric in mf:iter_metrics() do | |
606 sum = sum + metric.value; | |
607 end | |
608 return sum; | |
609 end | |
610 | |
611 local function get_server_metrics(event) | |
612 event.response.headers["Content-Type"] = json_content_type; | |
613 local result = {}; | |
614 local families = statsmanager.get_metric_registry():get_metric_families(); | |
615 result.memory = maybe_export_plain_gauge(families.process_resident_memory_bytes); | |
616 result.cpu = maybe_export_plain_counter(families.process_cpu_seconds); | |
617 result.c2s = maybe_export_summed_gauge(families["prosody_mod_c2s/connections"]) | |
618 return json.encode(result); | |
619 end | |
620 | |
621 local function post_server_announcement(event) | |
622 local request = event.request; | |
623 if request.headers.content_type ~= json_content_type | |
624 or (not request.body or #request.body == 0) then | |
625 return 400; | |
626 end | |
627 local body = json.decode(event.request.body); | |
628 if not body then | |
629 return 400; | |
630 end | |
631 | |
632 if type(body.recipients) ~= "table" and body.recipients ~= "online" and body.recipients ~= "all" then | |
633 return 400; | |
634 end | |
635 | |
636 if not body.body or #body.body == 0 then | |
637 return 400; | |
638 end | |
639 | |
640 local message = st.message():tag("body"):text(body.body):up(); | |
641 local host = module.host | |
642 message.attr.from = host | |
643 if body.recipients == "online" then | |
644 announce.send_to_online(message, host); | |
645 elseif body.recipients == "all" then | |
646 for username in usermanager.users(host) do | |
647 message.attr.to = username .. "@" .. host | |
648 module:send(st.clone(message)) | |
649 end | |
650 else | |
651 for _, addr in ipairs(body.recipients) do | |
652 message.attr.to = addr | |
653 module:send(message) | |
654 end | |
655 end | |
656 | |
657 return 201; | |
658 end | |
659 | |
581 module:provides("http", { | 660 module:provides("http", { |
582 route = check_auth { | 661 route = check_auth { |
583 ["GET /invites"] = list_invites; | 662 ["GET /invites"] = list_invites; |
584 ["GET /invites/*"] = get_invite_by_id; | 663 ["GET /invites/*"] = get_invite_by_id; |
585 ["POST /invites/*"] = create_invite_type; | 664 ["POST /invites/*"] = create_invite_type; |
595 ["POST /groups"] = create_group; | 674 ["POST /groups"] = create_group; |
596 ["PUT /groups/*"] = update_group; | 675 ["PUT /groups/*"] = update_group; |
597 ["DELETE /groups/*"] = delete_group; | 676 ["DELETE /groups/*"] = delete_group; |
598 | 677 |
599 ["GET /server/info"] = get_server_info; | 678 ["GET /server/info"] = get_server_info; |
679 | |
680 ["GET /server/metrics"] = get_server_metrics; | |
681 ["POST /server/announcement"] = post_server_announcement; | |
600 }; | 682 }; |
601 }); | 683 }); |