Mercurial > prosody-modules
comparison mod_listusers/mod_listusers.lua @ 1055:3dd909e87143
mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
| author | Vadim Misbakh-Soloviov <mva@mva.name> |
|---|---|
| date | Fri, 07 Jun 2013 08:43:03 +0700 |
| parents | |
| children | b307b72ae527 |
comparison
equal
deleted
inserted
replaced
| 1054:432dc4056114 | 1055:3dd909e87143 |
|---|---|
| 1 function module.command(args) | |
| 2 local action = table.remove(args, 1); | |
| 3 if not action then -- Default, list registered users | |
| 4 local data_path = CFG_DATADIR or "data"; | |
| 5 if not pcall(require, "luarocks.loader") then | |
| 6 pcall(require, "luarocks.require"); | |
| 7 end | |
| 8 local lfs = require "lfs"; | |
| 9 function decode(s) | |
| 10 return s:gsub("%%([a-fA-F0-9][a-fA-F0-9])", function (c) | |
| 11 return string.char(tonumber("0x"..c)); | |
| 12 end); | |
| 13 end | |
| 14 for host in lfs.dir(data_path) do | |
| 15 local accounts = data_path.."/"..host.."/accounts"; | |
| 16 if lfs.attributes(accounts, "mode") == "directory" then | |
| 17 for user in lfs.dir(accounts) do | |
| 18 if user:sub(1,1) ~= "." then | |
| 19 print(decode(user:gsub("%.dat$", "")).."@"..decode(host)); | |
| 20 end | |
| 21 end | |
| 22 end | |
| 23 end | |
| 24 elseif action == "--connected" then -- List connected users | |
| 25 local socket = require "socket"; | |
| 26 local default_local_interfaces = { }; | |
| 27 if socket.tcp6 and config.get("*", "use_ipv6") ~= false then | |
| 28 table.insert(default_local_interfaces, "::1"); | |
| 29 end | |
| 30 if config.get("*", "use_ipv4") ~= false then | |
| 31 table.insert(default_local_interfaces, "127.0.0.1"); | |
| 32 end | |
| 33 | |
| 34 local console_interfaces = config.get("*", "console_interfaces") | |
| 35 or config.get("*", "local_interfaces") | |
| 36 or default_local_interfaces | |
| 37 console_interfaces = type(console_interfaces)~="table" | |
| 38 and {console_interfaces} or console_interfaces; | |
| 39 | |
| 40 local console_ports = config.get("*", "console_ports") or 5582 | |
| 41 console_ports = type(console_ports) ~= "table" and { console_ports } or console_ports; | |
| 42 | |
| 43 local st, conn = pcall(assert,socket.connect(console_interfaces[1], console_ports[1])); | |
| 44 if (not st) then print("Error"..(conn and ": "..conn or "")); return 1; end | |
| 45 | |
| 46 conn:send("c2s:show()\n"); | |
| 47 conn:settimeout(1); -- Only hit in case of failure | |
| 48 | |
| 49 repeat local line = conn:receive() | |
| 50 if not line then break; end | |
| 51 local jid = line:match("^| (.+)$"); | |
| 52 if jid then | |
| 53 jid = jid:gsub(" %- (%w+%(%d+%))$", "\t%1"); | |
| 54 print(jid); | |
| 55 elseif line:match("^| OK:") then | |
| 56 return 0; | |
| 57 end | |
| 58 until false; | |
| 59 end | |
| 60 return 0; | |
| 61 end |
