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
parents d6a3201a65c0
children 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 });