net.http, net.http.server, mod_c2s, mod_s2s, mod_component, mod_admin_telnet, mod_net...
[prosody.git] / plugins / mod_admin_telnet.lua
index d8dd995121b675f0155dfb3fa9479ebe187b308a..e4b5a045ccbab2308b758c4f1f87556c4326929a 100644 (file)
@@ -23,8 +23,7 @@ local console_listener = { default_port = 5582; default_mode = "*a"; interface =
 
 local iterators = require "util.iterators";
 local keys, values = iterators.keys, iterators.values;
-local jid = require "util.jid";
-local jid_bare, jid_split = jid.bare, jid.split;
+local jid_bare, jid_split = import("util.jid", "bare", "prepped_split");
 local set, array = require "util.set", require "util.array";
 local cert_verify_identity = require "util.x509".verify_identity;
 local envload = require "util.envload".envload;
@@ -164,6 +163,10 @@ function console_listener.ondisconnect(conn, err)
        end
 end
 
+function console_listener.ondetach(conn)
+       sessions[conn] = nil;
+end
+
 -- Console commands --
 -- These are simple commands, not valid standalone in Lua
 
@@ -236,6 +239,7 @@ function commands.help(session, data)
        elseif section == "server" then
                print [[server:version() - Show the server's version number]]
                print [[server:uptime() - Show how long the server has been running]]
+               print [[server:memory() - Show details about the server's memory usage]]
                print [[server:shutdown(reason) - Shut down the server, with an optional reason to be broadcast to all connections]]
        elseif section == "port" then
                print [[port:list() - Lists all network ports prosody currently listens on]]
@@ -300,6 +304,26 @@ function def_env.server:shutdown(reason)
        return true, "Shutdown initiated";
 end
 
+local function human(kb)
+       local unit = "K";
+       if kb > 1024 then
+               kb, unit = kb/1024, "M";
+       end
+       return ("%0.2f%sB"):format(kb, unit);
+end
+
+function def_env.server:memory()
+       if not pposix.meminfo then
+               return true, "Lua is using "..collectgarbage("count");
+       end
+       local mem, lua_mem = pposix.meminfo(), collectgarbage("count");
+       local print = self.session.print;
+       print("Process: "..human((mem.allocated+mem.allocated_mmap)/1024));
+       print("   Used: "..human(mem.used/1024).." ("..human(lua_mem).." by Lua)");
+       print("   Free: "..human(mem.unused/1024).." ("..human(mem.returnable/1024).." returnable)");
+       return true, "OK";
+end
+
 def_env.module = {};
 
 local function get_hosts_set(hosts, module)
@@ -652,7 +676,7 @@ end
 -- I think there's going to be more confusion among operators if we
 -- break from that.
 local function print_errors(print, errors)
-       for depth, t in ipairs(errors) do
+       for depth, t in pairs(errors) do
                print(
                        ("    %d: %s"):format(
                                depth-1,
@@ -922,6 +946,9 @@ end
 
 function def_env.muc:create(room_jid)
        local room, host = check_muc(room_jid);
+       if not room_name then
+               return room_name, host;
+       end
        if not room then return nil, host end
        if hosts[host].modules.muc.rooms[room_jid] then return nil, "Room exists already" end
        return hosts[host].modules.muc.create_room(room_jid);
@@ -929,6 +956,9 @@ end
 
 function def_env.muc:room(room_jid)
        local room_name, host = check_muc(room_jid);
+       if not room_name then
+               return room_name, host;
+       end
        local room_obj = hosts[host].modules.muc.rooms[room_jid];
        if not room_obj then
                return nil, "No such room: "..room_jid;
@@ -958,7 +988,7 @@ function def_env.user:delete(jid)
        local username, host = jid_split(jid);
        if not hosts[host] then
                return nil, "No such host: "..host;
-       elseif um.user_exists(username, host) then
+       elseif not um.user_exists(username, host) then
                return nil, "No such user";
        end
        local ok, err = um.delete_user(username, host);
@@ -973,7 +1003,7 @@ function def_env.user:password(jid, password)
        local username, host = jid_split(jid);
        if not hosts[host] then
                return nil, "No such host: "..host;
-       elseif um.user_exists(username, host) then
+       elseif not um.user_exists(username, host) then
                return nil, "No such user";
        end
        local ok, err = um.set_password(username, password, host);
@@ -1032,12 +1062,12 @@ function def_env.dns:lookup(name, typ, class)
 end
 
 function def_env.dns:addnameserver(...)
-       dns.addnameserver(...)
+       dns._resolver:addnameserver(...)
        return true
 end
 
 function def_env.dns:setnameserver(...)
-       dns.setnameserver(...)
+       dns._resolver:setnameserver(...)
        return true
 end