Comparison

plugins/mod_admin_socket.lua @ 10855:70ac7d23673d

mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
author Matthew Wild <mwild1@gmail.com>
date Mon, 01 Jun 2020 15:42:19 +0100
child 10862:1cfae9e85021
comparison
equal deleted inserted replaced
10854:472fe13a05f9 10855:70ac7d23673d
1 module:set_global();
2
3 local have_unix, unix = pcall(require, "socket.unix");
4
5 if not have_unix or type(unix) ~= "table" then
6 module:log_status("error", "LuaSocket unix socket support not available or incompatible, ensure it is up to date");
7 return;
8 end
9
10 local server = require "net.server";
11
12 local adminstream = require "util.adminstream";
13
14 local socket_path = module:get_option_string("admin_socket", prosody.paths.data.."/prosody.sock");
15
16 local sessions = module:shared("sessions");
17
18 local function fire_admin_event(session, stanza)
19 local event_data = {
20 origin = session, stanza = stanza;
21 };
22 local event_name;
23 if stanza.attr.xmlns then
24 event_name = "admin/"..stanza.attr.xmlns..":"..stanza.name;
25 else
26 event_name = "admin/"..stanza.name;
27 end
28 module:log("debug", "Firing %s", event_name);
29 return module:fire_event(event_name, event_data);
30 end
31
32 module:hook("server-stopping", function ()
33 for _, session in pairs(sessions) do
34 session:close("system-shutdown");
35 end
36 os.remove(socket_path);
37 end);
38
39 --- Unix domain socket management
40
41 local conn, sock;
42
43 local listeners = adminstream.server(sessions, fire_admin_event).listeners;
44
45 local function accept_connection()
46 module:log("debug", "accepting...");
47 local client = sock:accept();
48 if not client then return; end
49 server.wrapclient(client, "unix", 0, listeners, "*a");
50 end
51
52 function module.load()
53 sock = unix.stream();
54 sock:settimeout(0);
55 os.remove(socket_path);
56 assert(sock:bind(socket_path));
57 assert(sock:listen());
58 conn = server.watchfd(sock:getfd(), accept_connection);
59 end
60
61 function module.unload()
62 if conn then
63 conn:close();
64 end
65 if sock then
66 sock:close();
67 end
68 os.remove(socket_path);
69 end