mod_listusers/mod_listusers.lua
author Kim Alvefur <zash@zash.se>
Mon, 07 Feb 2022 16:52:19 +0100
changeset 4891 806f7c8d830b
parent 1056 b307b72ae527
permissions -rw-r--r--
mod_ping_muc: Remove 'kick' status code The intent is "you fell off", not "you were kicked out", however older clients may not recognise the 333 code, but that will have to be an acceptable loss.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1055
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
     1
function module.command(args)
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
     2
  local action = table.remove(args, 1);
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
     3
  if not action then -- Default, list registered users
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
     4
    local data_path = CFG_DATADIR or "data";
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
     5
    if not pcall(require, "luarocks.loader") then
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
     6
      pcall(require, "luarocks.require");
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
     7
    end
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
     8
    local lfs = require "lfs";
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
     9
    function decode(s)
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    10
      return s:gsub("%%([a-fA-F0-9][a-fA-F0-9])", function (c)
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    11
        return string.char(tonumber("0x"..c));
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    12
      end);
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    13
    end
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    14
    for host in lfs.dir(data_path) do
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    15
      local accounts = data_path.."/"..host.."/accounts";
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    16
      if lfs.attributes(accounts, "mode") == "directory" then
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    17
        for user in lfs.dir(accounts) do
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    18
          if user:sub(1,1) ~= "." then
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    19
            print(decode(user:gsub("%.dat$", "")).."@"..decode(host));
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    20
          end
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    21
        end
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    22
      end
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    23
    end
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    24
  elseif action == "--connected" then -- List connected users
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    25
    local socket = require "socket";
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    26
    local default_local_interfaces = { };
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    27
    if socket.tcp6 and config.get("*", "use_ipv6") ~= false then
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    28
      table.insert(default_local_interfaces, "::1");
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    29
    end
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    30
    if config.get("*", "use_ipv4") ~= false then
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    31
      table.insert(default_local_interfaces, "127.0.0.1");
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    32
    end
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    33
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    34
    local console_interfaces = config.get("*", "console_interfaces")
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    35
      or config.get("*", "local_interfaces")
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    36
      or default_local_interfaces
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    37
    console_interfaces = type(console_interfaces)~="table"
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    38
      and {console_interfaces} or console_interfaces;
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    39
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    40
    local console_ports = config.get("*", "console_ports") or 5582
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    41
    console_ports = type(console_ports) ~= "table" and { console_ports } or console_ports;
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    42
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    43
    local st, conn = pcall(assert,socket.connect(console_interfaces[1], console_ports[1]));
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    44
    if (not st) then print("Error"..(conn and ": "..conn or "")); return 1; end
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    45
1056
b307b72ae527 mod_listusers: fixed banner skipping cycle
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 1055
diff changeset
    46
    local banner = config.get("*", "console_banner");
b307b72ae527 mod_listusers: fixed banner skipping cycle
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 1055
diff changeset
    47
    if (
b307b72ae527 mod_listusers: fixed banner skipping cycle
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 1055
diff changeset
    48
      (not banner) or
b307b72ae527 mod_listusers: fixed banner skipping cycle
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 1055
diff changeset
    49
      (
b307b72ae527 mod_listusers: fixed banner skipping cycle
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 1055
diff changeset
    50
        (type(banner) == "string") and
b307b72ae527 mod_listusers: fixed banner skipping cycle
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 1055
diff changeset
    51
        (banner:match("^|    (.+)$"))
b307b72ae527 mod_listusers: fixed banner skipping cycle
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 1055
diff changeset
    52
      )
b307b72ae527 mod_listusers: fixed banner skipping cycle
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 1055
diff changeset
    53
    ) then
b307b72ae527 mod_listusers: fixed banner skipping cycle
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 1055
diff changeset
    54
      repeat
b307b72ae527 mod_listusers: fixed banner skipping cycle
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 1055
diff changeset
    55
        local rec_banner = conn:receive()
b307b72ae527 mod_listusers: fixed banner skipping cycle
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 1055
diff changeset
    56
      until
b307b72ae527 mod_listusers: fixed banner skipping cycle
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 1055
diff changeset
    57
        rec_banner == "" or
b307b72ae527 mod_listusers: fixed banner skipping cycle
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 1055
diff changeset
    58
        rec_banner == nil; -- skip banner
b307b72ae527 mod_listusers: fixed banner skipping cycle
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 1055
diff changeset
    59
    end
b307b72ae527 mod_listusers: fixed banner skipping cycle
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 1055
diff changeset
    60
1055
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    61
    conn:send("c2s:show()\n");
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    62
    conn:settimeout(1); -- Only hit in case of failure
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    63
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    64
    repeat local line = conn:receive()
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    65
      if not line then break; end
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    66
      local jid = line:match("^|    (.+)$");
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    67
      if jid then
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    68
        jid = jid:gsub(" %- (%w+%(%d+%))$", "\t%1");
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    69
        print(jid);
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    70
      elseif line:match("^| OK:") then
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    71
        return 0;
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    72
      end
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    73
    until false;
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    74
  end
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    75
  return 0;
3dd909e87143 mod_listusers: added (+config support; -assert tracebacks; +user friendly connection errors; -unneded repeat-until cycle, which braked module)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
diff changeset
    76
end