--- Prosody IM v0.1
--- Copyright (C) 2008 Matthew Wild
--- Copyright (C) 2008 Waqas Hussain
+-- Prosody IM v0.4
+-- Copyright (C) 2008-2009 Matthew Wild
+-- Copyright (C) 2008-2009 Waqas Hussain
--
--- This program is free software; you can redistribute it and/or
--- modify it under the terms of the GNU General Public License
--- as published by the Free Software Foundation; either version 2
--- of the License, or (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+-- This project is MIT/X11 licensed. Please see the
+-- COPYING file in the source package for more information.
--
+module.host = "*";
+
+local connlisteners_register = require "net.connlisteners".register;
+
+local console_listener = { default_port = 5582; default_mode = "*l"; };
+
+local commands = {};
+local def_env = {};
+local default_env_mt = { __index = def_env };
+
+console = {};
+
+function console:new_session(conn)
+ local w = function(s) conn.write(s:gsub("\n", "\r\n")); end;
+ local session = { conn = conn;
+ send = function (t) w(tostring(t)); end;
+ print = function (t) w("| "..tostring(t).."\n"); end;
+ disconnect = function () conn.close(); end;
+ };
+ session.env = setmetatable({}, default_env_mt);
+
+ -- Load up environment with helper objects
+ for name, t in pairs(def_env) do
+ if type(t) == "table" then
+ session.env[name] = setmetatable({ session = session }, { __index = t });
+ end
+ end
+
+ return session;
+end
+
+local sessions = {};
+
+function console_listener.listener(conn, data)
+ local session = sessions[conn];
+
+ if not session then
+ -- Handle new connection
+ session = console:new_session(conn);
+ sessions[conn] = session;
+ printbanner(session);
+ end
+ if data then
+ -- Handle data
+ (function(session, data)
+ if data:match("[!.]$") then
+ local command = data:lower();
+ command = data:match("^%w+") or data:match("%p");
+ if commands[command] then
+ commands[command](session, data);
+ return;
+ end
+ end
+
+ session.env._ = data;
+
+ local chunk, err = loadstring("return "..data);
+ if not chunk then
+ chunk, err = loadstring(data);
+ if not chunk then
+ err = err:gsub("^%[string .-%]:%d+: ", "");
+ err = err:gsub("^:%d+: ", "");
+ err = err:gsub("'<eof>'", "the end of the line");
+ session.print("Sorry, I couldn't understand that... "..err);
+ return;
+ end
+ end
+
+ setfenv(chunk, session.env);
+ local ranok, taskok, message = pcall(chunk);
+
+ if not ranok then
+ session.print("Fatal error while running command, it did not complete");
+ session.print("Error: "..taskok);
+ return;
+ end
+
+ if not message then
+ session.print("Result: "..tostring(taskok));
+ return;
+ elseif (not taskok) and message then
+ session.print("Command completed with a problem");
+ session.print("Message: "..tostring(message));
+ return;
+ end
+
+ session.print("OK: "..tostring(message));
+ end)(session, data);
+ end
+ session.send(string.char(0));
+end
+
+function console_listener.disconnect(conn, err)
+
+end
+
+connlisteners_register('console', console_listener);
+
+-- Console commands --
+-- These are simple commands, not valid standalone in Lua
+
+function commands.bye(session)
+ session.print("See you! :)");
+ session.disconnect();
+end
+
+commands["!"] = function (session, data)
+ if data:match("^!!") then
+ session.print("!> "..session.env._);
+ return console_listener.listener(session.conn, session.env._);
+ end
+ local old, new = data:match("^!(.-[^\\])!(.-)!$");
+ if old and new then
+ local ok, res = pcall(string.gsub, session.env._, old, new);
+ if not ok then
+ session.print(res)
+ return;
+ end
+ session.print("!> "..res);
+ return console_listener.listener(session.conn, res);
+ end
+ session.print("Sorry, not sure what you want");
+end
+
+-- Session environment --
+-- Anything in def_env will be accessible within the session as a global variable
+
+def_env.server = {};
+function def_env.server:reload()
+ dofile "prosody"
+ return true, "Server reloaded";
+end
+
+def_env.module = {};
+function def_env.module:load(name, host, config)
+ local mm = require "modulemanager";
+ local ok, err = mm.load(host or self.env.host, name, config);
+ if not ok then
+ return false, err or "Unknown error loading module";
+ end
+ return true, "Module loaded";
+end
+
+function def_env.module:unload(name, host)
+ local mm = require "modulemanager";
+ local ok, err = mm.unload(host or self.env.host, name);
+ if not ok then
+ return false, err or "Unknown error unloading module";
+ end
+ return true, "Module unloaded";
+end
+
+function def_env.module:reload(name, host)
+ local mm = require "modulemanager";
+ local ok, err = mm.reload(host or self.env.host, name);
+ if not ok then
+ return false, err or "Unknown error reloading module";
+ end
+ return true, "Module reloaded";
+end
+
+def_env.config = {};
+function def_env.config:load(filename, format)
+ local config_load = require "core.configmanager".load;
+ local ok, err = config_load(filename, format);
+ if not ok then
+ return false, err or "Unknown error loading config";
+ end
+ return true, "Config loaded";
+end
+
+function def_env.config:get(host, section, key)
+ local config_get = require "core.configmanager".get
+ return true, tostring(config_get(host, section, key));
+end
+
+def_env.hosts = {};
+function def_env.hosts:list()
+ for host, host_session in pairs(hosts) do
+ self.session.print(host);
+ end
+ return true, "Done";
+end
+
+function def_env.hosts:add(name)
+end
+
+-------------
+
+function printbanner(session)
+session.print [[
+ ____ \ / _
+ | _ \ _ __ ___ ___ _-_ __| |_ _
+ | |_) | '__/ _ \/ __|/ _ \ / _` | | | |
+ | __/| | | (_) \__ \ |_| | (_| | |_| |
+ |_| |_| \___/|___/\___/ \__,_|\__, |
+ A study in simplicity |___/
-\r
-local connlisteners_register = require "net.connlisteners".register;\r
-\r
-local console_listener = { default_port = 5582; default_mode = "*l"; };\r
-\r
-local commands = {};\r
-local def_env = {};\r
-local default_env_mt = { __index = def_env };\r
-\r
-console = {};\r
-\r
-function console:new_session(conn)\r
- local w = conn.write;\r
- local session = { conn = conn;\r
- send = function (t) w(tostring(t)); end;\r
- print = function (t) w("| "..tostring(t).."\r\n"); end;\r
- disconnect = function () conn.close(); end;\r
- };\r
- session.env = setmetatable({}, default_env_mt);\r
- \r
- -- Load up environment with helper objects\r
- for name, t in pairs(def_env) do\r
- if type(t) == "table" then\r
- session.env[name] = setmetatable({ session = session }, { __index = t });\r
- end\r
- end\r
- \r
- return session;\r
-end\r
-\r
-local sessions = {};\r
-\r
-function console_listener.listener(conn, data)\r
- local session = sessions[conn];\r
- \r
- if not session then\r
- -- Handle new connection\r
- session = console:new_session(conn);\r
- sessions[conn] = session;\r
- printbanner(session);\r
- end\r
- if data then\r
- -- Handle data\r
- \r
- if data:match("[!.]$") then\r
- local command = data:lower();\r
- command = data:match("^%w+") or data:match("%p");\r
- if commands[command] then\r
- commands[command](session, data);\r
- return;\r
- end\r
- end\r
- \r
- session.env._ = data;\r
- \r
- local chunk, err = loadstring("return "..data);\r
- if not chunk then\r
- chunk, err = loadstring(data);\r
- if not chunk then\r
- err = err:gsub("^%[string .-%]:%d+: ", "");\r
- err = err:gsub("^:%d+: ", "");\r
- err = err:gsub("'<eof>'", "the end of the line");\r
- session.print("Sorry, I couldn't understand that... "..err);\r
- return;\r
- end\r
- end\r
- \r
- setfenv(chunk, session.env);\r
- local ranok, taskok, message = pcall(chunk);\r
- \r
- if not ranok then\r
- session.print("Fatal error while running command, it did not complete");\r
- session.print("Error: "..taskok);\r
- return;\r
- end\r
- \r
- if not message then\r
- session.print("Result: "..tostring(taskok));\r
- return;\r
- elseif (not taskok) and message then\r
- session.print("Command completed with a problem");\r
- session.print("Message: "..tostring(message));\r
- return;\r
- end\r
- \r
- session.print("OK: "..tostring(message));\r
- end\r
-end\r
-\r
-function console_listener.disconnect(conn, err)\r
- \r
-end\r
-\r
-connlisteners_register('console', console_listener);\r
-\r
--- Console commands --\r
--- These are simple commands, not valid standalone in Lua\r
-\r
-function commands.bye(session)\r
- session.print("See you! :)");\r
- session.disconnect();\r
-end\r
-\r
-commands["!"] = function (session, data)\r
- if data:match("^!!") then\r
- session.print("!> "..session.env._);\r
- return console_listener.listener(session.conn, session.env._);\r
- end\r
- local old, new = data:match("^!(.-[^\\])!(.-)!$");\r
- if old and new then\r
- local ok, res = pcall(string.gsub, session.env._, old, new);\r
- if not ok then\r
- session.print(res)\r
- return;\r
- end\r
- session.print("!> "..res);\r
- return console_listener.listener(session.conn, res);\r
- end\r
- session.print("Sorry, not sure what you want");\r
-end\r
-\r
--- Session environment --\r
--- Anything in def_env will be accessible within the session as a global variable\r
-\r
-def_env.server = {};\r
-function def_env.server:reload()\r
- dofile "prosody"\r
- return true, "Server reloaded";\r
-end\r
-\r
-def_env.module = {};\r
-function def_env.module:load(name, host, config)\r
- local mm = require "modulemanager";\r
- local ok, err = mm.load(host or self.env.host, name, config);\r
- if not ok then\r
- return false, err or "Unknown error loading module";\r
- end\r
- return true, "Module loaded";\r
-end\r
-\r
-function def_env.module:unload(name, host)\r
- local mm = require "modulemanager";\r
- local ok, err = mm.unload(host or self.env.host, name);\r
- if not ok then\r
- return false, err or "Unknown error unloading module";\r
- end\r
- return true, "Module unloaded";\r
-end\r
-\r
-def_env.config = {};\r
-function def_env.config:load(filename, format)\r
- local config_load = require "core.configmanager".load;\r
- local ok, err = config_load(filename, format);\r
- if not ok then\r
- return false, err or "Unknown error loading config";\r
- end\r
- return true, "Config loaded";\r
-end\r
-\r
-function def_env.config:get(host, section, key)\r
- local config_get = require "core.configmanager".get\r
- return true, tostring(config_get(host, section, key));\r
-end\r
-\r
-def_env.hosts = {};\r
-function def_env.hosts:list()\r
- for host, host_session in pairs(hosts) do\r
- self.session.print(host);\r
- end\r
- return true, "Done";\r
-end\r
-\r
-function def_env.hosts:add(name)\r
-end\r
-\r
--------------\r
-\r
-function printbanner(session)\r
-session.print [[\r
- ____ \ / _ \r
- | _ \ _ __ ___ ___ _-_ __| |_ _ \r
- | |_) | '__/ _ \/ __|/ _ \ / _` | | | |\r
- | __/| | | (_) \__ \ |_| | (_| | |_| |\r
- |_| |_| \___/|___/\___/ \__,_|\__, |\r
- A study in simplicity |___/ \r
-\r
-]]\r
-session.print("Welcome to the Prosody administration console. For a list of commands, type: help");\r
-session.print("You may find more help on using this console in our online documentation at ");\r
-session.print("http://prosody.im/doc/console\n");\r
-end\r
+]]
+session.print("Welcome to the Prosody administration console. For a list of commands, type: help");
+session.print("You may find more help on using this console in our online documentation at ");
+session.print("http://prosody.im/doc/console\n");
+end