Mercurial > prosody-modules
comparison mod_adhoc_cmd_admin/mod_adhoc_cmd_admin.lua @ 133:8945153321a1
mod_adhoc_cmd_admin: Add "Shut Down Service" command
| author | Florian Zeitz <florob@babelmonkeys.de> |
|---|---|
| date | Thu, 25 Feb 2010 22:43:54 +0100 |
| parents | bdd1641c159d |
| children | b4f9518d5a00 |
comparison
equal
deleted
inserted
replaced
| 132:d4ff1cd414e5 | 133:8945153321a1 |
|---|---|
| 15 local usermanager_get_password = require "core.usermanager".get_password; | 15 local usermanager_get_password = require "core.usermanager".get_password; |
| 16 local usermanager_create_user = require "core.usermanager".create_user; | 16 local usermanager_create_user = require "core.usermanager".create_user; |
| 17 local is_admin = require "core.usermanager".is_admin; | 17 local is_admin = require "core.usermanager".is_admin; |
| 18 | 18 |
| 19 local st, jid, uuid = require "util.stanza", require "util.jid", require "util.uuid"; | 19 local st, jid, uuid = require "util.stanza", require "util.jid", require "util.uuid"; |
| 20 local timer_add_task = require "util.timer".add_task; | |
| 20 local dataforms_new = require "util.dataforms".new; | 21 local dataforms_new = require "util.dataforms".new; |
| 21 module:log("debug", module:get_name()); | 22 module:log("debug", module:get_name()); |
| 22 local adhoc_new = module:require "adhoc".new; | 23 local adhoc_new = module:require "adhoc".new; |
| 23 | 24 |
| 24 local add_user_layout = dataforms_new{ | 25 local add_user_layout = dataforms_new{ |
| 89 instructions = "Fill out this form to make an announcement to all\nactive users of this service."; | 90 instructions = "Fill out this form to make an announcement to all\nactive users of this service."; |
| 90 | 91 |
| 91 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" }; | 92 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" }; |
| 92 { name = "subject", type = "text-single", label = "Subject" }; | 93 { name = "subject", type = "text-single", label = "Subject" }; |
| 93 { name = "announcement", type = "text-multi", required = true, label = "Announcement" }; | 94 { name = "announcement", type = "text-multi", required = true, label = "Announcement" }; |
| 95 }; | |
| 96 | |
| 97 local shut_down_service_layout = dataforms_new{ | |
| 98 title = "Shutting Down the Service"; | |
| 99 instructions = "Fill out this form to shut down the service."; | |
| 100 | |
| 101 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" }; | |
| 102 { name = "delay", type = "list-single", label = "Time delay before shutting down", | |
| 103 value = { {label = "30 seconds", value = "30"}, | |
| 104 {label = "60 seconds", value = "60"}, | |
| 105 {label = "90 seconds", value = "90"}, | |
| 106 {label = "2 minutes", value = "120"}, | |
| 107 {label = "3 minutes", value = "180"}, | |
| 108 {label = "4 minutes", value = "240"}, | |
| 109 {label = "5 minutes", value = "300"}, | |
| 110 }; | |
| 111 }; | |
| 112 { name = "announcement", type = "text-multi", label = "Announcement" }; | |
| 94 }; | 113 }; |
| 95 | 114 |
| 96 function add_user_command_handler(self, data, state) | 115 function add_user_command_handler(self, data, state) |
| 97 if state then | 116 if state then |
| 98 if data.action == "cancel" then | 117 if data.action == "cancel" then |
| 242 else | 261 else |
| 243 return { status = "executing", form = get_online_users_layout }, "executing"; | 262 return { status = "executing", form = get_online_users_layout }, "executing"; |
| 244 end | 263 end |
| 245 end | 264 end |
| 246 | 265 |
| 266 function send_to_online(message, server) | |
| 267 if server then | |
| 268 sessions = { [server] = hosts[server] }; | |
| 269 else | |
| 270 sessions = hosts; | |
| 271 end | |
| 272 | |
| 273 local c = 0; | |
| 274 for domain, session in pairs(sessions) do | |
| 275 for user in pairs(session.sessions or {}) do | |
| 276 c = c + 1; | |
| 277 message.attr.from = domain; | |
| 278 message.attr.to = user.."@"..domain; | |
| 279 core_post_stanza(session, message); | |
| 280 end | |
| 281 end | |
| 282 | |
| 283 return c; | |
| 284 end | |
| 285 | |
| 247 function announce_handler(self, data, state) | 286 function announce_handler(self, data, state) |
| 248 if state then | 287 if state then |
| 249 if data.action == "cancel" then | 288 if data.action == "cancel" then |
| 250 return { status = "canceled" }; | 289 return { status = "canceled" }; |
| 251 end | 290 end |
| 252 | 291 |
| 253 local fields = announce_layout:data(data.form); | 292 local fields = announce_layout:data(data.form); |
| 254 | 293 |
| 255 module:log("info", "Sending server announcement to all online users"); | 294 module:log("info", "Sending server announcement to all online users"); |
| 256 local host_session = hosts[data.to]; | 295 local message = st.message({type = "headline"}, fields.announcement):up() |
| 257 local message = st.message({type = "headline", from = data.to}, fields.announcement):up() | |
| 258 :tag("subject"):text(fields.subject or "Announcement"); | 296 :tag("subject"):text(fields.subject or "Announcement"); |
| 259 | 297 |
| 260 local c = 0; | 298 local count = send_to_online(message, data.to); |
| 261 for user in pairs(host_session.sessions) do | |
| 262 c = c + 1; | |
| 263 message.attr.to = user.."@"..data.to; | |
| 264 core_post_stanza(host_session, message); | |
| 265 end | |
| 266 | 299 |
| 267 module:log("info", "Announcement sent to %d online users", c); | 300 module:log("info", "Announcement sent to %d online users", count); |
| 268 return { status = "completed", info = "Announcement sent." }; | 301 return { status = "completed", info = "Announcement sent." }; |
| 269 else | 302 else |
| 270 return { status = "executing", form = announce_layout }, "executing"; | 303 return { status = "executing", form = announce_layout }, "executing"; |
| 271 end | 304 end |
| 272 | 305 |
| 273 return true; | 306 return true; |
| 274 end | 307 end |
| 275 | 308 |
| 309 function shut_down_service_handler(self, data, state) | |
| 310 if state then | |
| 311 if data.action == "cancel" then | |
| 312 return { status = "canceled" }; | |
| 313 end | |
| 314 | |
| 315 local fields = shut_down_service_layout:data(data.form); | |
| 316 | |
| 317 if fields.announcement then | |
| 318 local message = st.message({type = "headline"}, fields.announcement):up() | |
| 319 :tag("subject"):text("Server is shutting down"); | |
| 320 send_to_online(message); | |
| 321 end | |
| 322 | |
| 323 timer_add_task(tonumber(fields.delay or "5"), prosody.shutdown); | |
| 324 | |
| 325 return { status = "completed", info = "Server is about to shut down" }; | |
| 326 else | |
| 327 return { status = "executing", form = shut_down_service_layout }, "executing"; | |
| 328 end | |
| 329 | |
| 330 return true; | |
| 331 end | |
| 332 | |
| 276 local add_user_desc = adhoc_new("Add User", "http://jabber.org/protocol/admin#add-user", add_user_command_handler, "admin"); | 333 local add_user_desc = adhoc_new("Add User", "http://jabber.org/protocol/admin#add-user", add_user_command_handler, "admin"); |
| 334 local announce_desc = adhoc_new("Send Announcement to Online Users", "http://jabber.org/protocol/admin#announce", announce_handler, "admin"); | |
| 277 local change_user_password_desc = adhoc_new("Change User Password", "http://jabber.org/protocol/admin#change-user-password", change_user_password_command_handler, "admin"); | 335 local change_user_password_desc = adhoc_new("Change User Password", "http://jabber.org/protocol/admin#change-user-password", change_user_password_command_handler, "admin"); |
| 278 local delete_user_desc = adhoc_new("Delete User", "http://jabber.org/protocol/admin#delete-user", delete_user_command_handler, "admin"); | 336 local delete_user_desc = adhoc_new("Delete User", "http://jabber.org/protocol/admin#delete-user", delete_user_command_handler, "admin"); |
| 279 local end_user_session_desc = adhoc_new("End User Session", "http://jabber.org/protocol/admin#end-user-session", end_user_session_handler, "admin"); | 337 local end_user_session_desc = adhoc_new("End User Session", "http://jabber.org/protocol/admin#end-user-session", end_user_session_handler, "admin"); |
| 280 local get_user_password_desc = adhoc_new("Get User Password", "http://jabber.org/protocol/admin#get-user-password", get_user_password_handler, "admin"); | 338 local get_user_password_desc = adhoc_new("Get User Password", "http://jabber.org/protocol/admin#get-user-password", get_user_password_handler, "admin"); |
| 281 local get_online_users_desc = adhoc_new("Get List of Online Users", "http://jabber.org/protocol/admin#get-online-users", get_online_users_command_handler, "admin"); | 339 local get_online_users_desc = adhoc_new("Get List of Online Users", "http://jabber.org/protocol/admin#get-online-users", get_online_users_command_handler, "admin"); |
| 282 local announce_desc = adhoc_new("Send Announcement to Online Users", "http://jabber.org/protocol/admin#announce", announce_handler, "admin"); | 340 local shut_down_service_desc = adhoc_new("Shut Down Service", "http://jabber.org/protocol/admin#shutdown", shut_down_service_handler, "admin"); |
| 283 | 341 |
| 284 module:add_item("adhoc", add_user_desc); | 342 module:add_item("adhoc", add_user_desc); |
| 343 module:add_item("adhoc", announce_desc); | |
| 285 module:add_item("adhoc", change_user_password_desc); | 344 module:add_item("adhoc", change_user_password_desc); |
| 286 module:add_item("adhoc", delete_user_desc); | 345 module:add_item("adhoc", delete_user_desc); |
| 287 module:add_item("adhoc", end_user_session_desc); | 346 module:add_item("adhoc", end_user_session_desc); |
| 288 module:add_item("adhoc", get_user_password_desc); | 347 module:add_item("adhoc", get_user_password_desc); |
| 289 module:add_item("adhoc", get_online_users_desc); | 348 module:add_item("adhoc", get_online_users_desc); |
| 290 module:add_item("adhoc", announce_desc); | 349 module:add_item("adhoc", shut_down_service_desc); |
