Software /
code /
prosody-modules
Comparison
mod_admin_web/admin_web/mod_admin_web.lua @ 301:b241c79a0eb7
mod_admin_web: Add a live view for C2S connections
author | Florian Zeitz <florob@babelmonkeys.de> |
---|---|
date | Mon, 27 Dec 2010 04:19:41 +0100 |
parent | 295:e373de5907aa |
child | 303:0f53c88bab9a |
comparison
equal
deleted
inserted
replaced
300:b81e4f86a231 | 301:b241c79a0eb7 |
---|---|
1 -- Copyright (C) 2010 Florian Zeitz | 1 -- Copyright (C) 2010 Florian Zeitz |
2 -- | 2 -- |
3 -- This file is MIT/X11 licensed. Please see the | 3 -- This file is MIT/X11 licensed. Please see the |
4 -- COPYING file in the source package for more information. | 4 -- COPYING file in the source package for more information. |
5 -- | 5 -- |
6 | |
7 -- <session xmlns="http://prosody.im/streams/c2s" jid="alice@example.com/brussels"> | |
8 -- <encrypted/> | |
9 -- <compressed/> | |
10 -- </session> | |
6 | 11 |
7 -- <session xmlns="http://prosody.im/streams/s2s" jid="example.com"> | 12 -- <session xmlns="http://prosody.im/streams/s2s" jid="example.com"> |
8 -- <encrypted/> | 13 -- <encrypted/> |
9 -- <compressed/> | 14 -- <compressed/> |
10 -- <in/> / <out/> | 15 -- <in/> / <out/> |
20 local host = module:get_host(); | 25 local host = module:get_host(); |
21 local service = config.get("*", "core", "webadmin_pubsub_host") or ("pubsub." .. host); | 26 local service = config.get("*", "core", "webadmin_pubsub_host") or ("pubsub." .. host); |
22 | 27 |
23 local http_base = (prosody.paths.plugins or "./plugins/") .. "admin_web/www_files"; | 28 local http_base = (prosody.paths.plugins or "./plugins/") .. "admin_web/www_files"; |
24 | 29 |
25 local xmlns_sessions = "http://prosody.im/streams/s2s"; | 30 local xmlns_c2s_session = "http://prosody.im/streams/c2s"; |
31 local xmlns_s2s_session = "http://prosody.im/streams/s2s"; | |
26 | 32 |
27 local response_400 = { status = "400 Bad Request", body = "<h1>Bad Request</h1>Sorry, we didn't understand your request :(" }; | 33 local response_400 = { status = "400 Bad Request", body = "<h1>Bad Request</h1>Sorry, we didn't understand your request :(" }; |
28 local response_403 = { status = "403 Forbidden", body = "<h1>Forbidden</h1>You don't have permission to view the contents of this directory :(" }; | 34 local response_403 = { status = "403 Forbidden", body = "<h1>Forbidden</h1>You don't have permission to view the contents of this directory :(" }; |
29 local response_404 = { status = "404 Not Found", body = "<h1>Page Not Found</h1>Sorry, we couldn't find what you were looking for :(" }; | 35 local response_404 = { status = "404 Not Found", body = "<h1>Page Not Found</h1>Sorry, we couldn't find what you were looking for :(" }; |
30 | 36 |
35 css = "text/css"; | 41 css = "text/css"; |
36 }; | 42 }; |
37 | 43 |
38 local idmap = {}; | 44 local idmap = {}; |
39 | 45 |
46 function add_client(session) | |
47 local name = session.full_jid; | |
48 local id = idmap[name]; | |
49 if not id then | |
50 id = uuid_generate(); | |
51 idmap[name] = id; | |
52 end | |
53 local item = stanza.stanza("item", { id = id }):tag("session", {xmlns = xmlns_c2s_session, jid = name}):up(); | |
54 if session.secure then | |
55 item:tag("encrypted"):up(); | |
56 end | |
57 if session.compressed then | |
58 item:tag("compressed"):up(); | |
59 end | |
60 hosts[service].modules.pubsub.service:publish(xmlns_c2s_session, service, id, item); | |
61 module:log("debug", "Added client " .. name); | |
62 end | |
63 | |
64 function del_client(session) | |
65 local name = session.full_jid; | |
66 local id = idmap[name]; | |
67 if id then | |
68 local notifier = stanza.stanza("retract", { id = id }); | |
69 hosts[service].modules.pubsub.service:retract(xmlns_c2s_session, service, id, notifier); | |
70 end | |
71 end | |
72 | |
40 function add_host(session, type) | 73 function add_host(session, type) |
41 local name = (type == "out" and session.to_host) or (type == "in" and session.from_host); | 74 local name = (type == "out" and session.to_host) or (type == "in" and session.from_host); |
42 local id = idmap[name.."_"..type]; | 75 local id = idmap[name.."_"..type]; |
43 if not id then | 76 if not id then |
44 id = uuid_generate(); | 77 id = uuid_generate(); |
45 idmap[name.."_"..type] = id; | 78 idmap[name.."_"..type] = id; |
46 end | 79 end |
47 local item = stanza.stanza("item", { id = id }):tag("session", {xmlns = xmlns_sessions, jid = name}) | 80 local item = stanza.stanza("item", { id = id }):tag("session", {xmlns = xmlns_s2s_session, jid = name}) |
48 :tag(type):up(); | 81 :tag(type):up(); |
49 if session.secure then | 82 if session.secure then |
50 item:tag("encrypted"):up(); | 83 item:tag("encrypted"):up(); |
51 end | 84 end |
52 if session.compressed then | 85 if session.compressed then |
53 item:tag("compressed"):up(); | 86 item:tag("compressed"):up(); |
54 end | 87 end |
55 hosts[service].modules.pubsub.service:publish(xmlns_sessions, service, id, item); | 88 hosts[service].modules.pubsub.service:publish(xmlns_s2s_session, service, id, item); |
56 module:log("debug", "Added host " .. name .. " s2s" .. type); | 89 module:log("debug", "Added host " .. name .. " s2s" .. type); |
57 end | 90 end |
58 | 91 |
59 function del_host(session, type) | 92 function del_host(session, type) |
60 local name = (type == "out" and session.to_host) or (type == "in" and session.from_host); | 93 local name = (type == "out" and session.to_host) or (type == "in" and session.from_host); |
61 local id = idmap[name.."_"..type]; | 94 local id = idmap[name.."_"..type]; |
62 if id then | 95 if id then |
63 local notifier = stanza.stanza("retract", { id = id }); | 96 local notifier = stanza.stanza("retract", { id = id }); |
64 hosts[service].modules.pubsub.service:retract(xmlns_sessions, service, id, notifier); | 97 hosts[service].modules.pubsub.service:retract(xmlns_s2s_session, service, id, notifier); |
65 end | 98 end |
66 end | 99 end |
67 | 100 |
68 local function preprocess_path(path) | 101 local function preprocess_path(path) |
69 if path:sub(1,1) ~= "/" then | 102 if path:sub(1,1) ~= "/" then |
116 | 149 |
117 function module.load() | 150 function module.load() |
118 local host_session = prosody.hosts[host]; | 151 local host_session = prosody.hosts[host]; |
119 local http_conf = config.get("*", "core", "webadmin_http_ports"); | 152 local http_conf = config.get("*", "core", "webadmin_http_ports"); |
120 | 153 |
121 if not select(2, hosts[service].modules.pubsub.service:get_nodes(service))[xmlns_sessions] then | 154 if not select(2, hosts[service].modules.pubsub.service:get_nodes(service))[xmlns_s2s_session] then |
122 local ok, errmsg = hosts[service].modules.pubsub.service:create(xmlns_sessions, service); | 155 local ok, errmsg = hosts[service].modules.pubsub.service:create(xmlns_s2s_session, service); |
123 if not ok then | 156 if not ok then |
124 error("Could not create node: " .. tostring(errmsg)); | 157 module:log("warn", "Could not create node " .. xmlns_s2s_session .. ": " .. tostring(errmsg)); |
125 end | 158 end |
126 end | 159 end |
127 | 160 |
128 for remotehost, session in pairs(host_session.s2sout) do | 161 for remotehost, session in pairs(host_session.s2sout) do |
129 if session.type ~= "s2sout_unauthed" then | 162 if session.type ~= "s2sout_unauthed" then |
134 if session.to_host == host then | 167 if session.to_host == host then |
135 add_host(session, "in"); | 168 add_host(session, "in"); |
136 end | 169 end |
137 end | 170 end |
138 | 171 |
172 if not select(2, hosts[service].modules.pubsub.service:get_nodes(service))[xmlns_c2s_session] then | |
173 local ok, errmsg = hosts[service].modules.pubsub.service:create(xmlns_c2s_session, service); | |
174 if not ok then | |
175 module:log("warn", "Could not create node " .. xmlns_c2s_session .. ": " .. tostring(errmsg)); | |
176 end | |
177 end | |
178 | |
179 for username, user in pairs(host_session.sessions or {}) do | |
180 for resource, session in pairs(user.sessions or {}) do | |
181 add_client(session); | |
182 end | |
183 end | |
184 | |
139 httpserver.new_from_config(http_conf, handle_file_request, { base = "admin" }); | 185 httpserver.new_from_config(http_conf, handle_file_request, { base = "admin" }); |
140 end | 186 end |
187 | |
188 module:hook("resource-bind", function(event) | |
189 add_client(event.session); | |
190 end); | |
191 | |
192 module:hook("resource-unbind", function(event) | |
193 del_client(event.session); | |
194 end); | |
141 | 195 |
142 module:hook("s2sout-established", function(event) | 196 module:hook("s2sout-established", function(event) |
143 add_host(event.session, "out"); | 197 add_host(event.session, "out"); |
144 end); | 198 end); |
145 | 199 |