Software /
code /
prosody
Diff
util/prosodyctl.lua @ 1087:5e9475bec571
prosodyctl, util.prosodyctl: New prosodyctl utility for managing Prosody servers
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Sat, 02 May 2009 17:03:19 +0100 |
child | 1123:da7ff11a03ee |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/util/prosodyctl.lua Sat May 02 17:03:19 2009 +0100 @@ -0,0 +1,113 @@ + +local config = require "core.configmanager"; +local encodings = require "util.encodings"; +local stringprep = encodings.stringprep; +local usermanager = require "core.usermanager"; +local signal = require "util.signal"; + +local nodeprep, nameprep = stringprep.nodeprep, stringprep.nameprep; + +local io, os = io, os; +local tostring, tonumber = tostring, tonumber; +module "prosodyctl" + +function adduser(params) + local user, host, password = nodeprep(params.user), nameprep(params.host), params.password; + if not user then + return false, "invalid-username"; + elseif not host then + return false, "invalid-hostname"; + end + + usermanager.create_user(user, password, host); + return true; +end + +function user_exists(params) + return usermanager.user_exists(params.user, params.host); +end + +function passwd(params) + if not _M.user_exists(params) then + return false, "no-such-user"; + end + + return _M.adduser(params); +end + +function deluser(params) + if not _M.user_exists(params) then + return false, "no-such-user"; + end + params.password = nil; + + return _M.adduser(params); +end + +function getpid() + local pidfile = config.get("*", "core", "pidfile"); + if not pidfile then + return false, "no-pidfile"; + end + + local file, err = io.open(pidfile); + if not file then + return false, "pidfile-read-failed", ret; + end + + local pid = tonumber(file:read("*a")); + file:close(); + + if not pid then + return false, "invalid-pid"; + end + + return true, pid; +end + +function isrunning() + local ok, pid, err = _M.getpid(); + if not ok then + if pid == "pidfile-read-failed" then + -- Report as not running, since we can't open the pidfile + -- (it probably doesn't exist) + return true, false; + end + return ok, pid; + end + return true, signal.kill(pid, 0) == 0; +end + +function start() + local ok, ret = _M.isrunning(); + if not ok then + return ok, ret; + end + if ret then + return false, "already-running"; + end + if not CFG_SOURCEDIR then + os.execute("./prosody"); + elseif CFG_SOURCEDIR:match("^/usr/local") then + os.execute("/usr/local/bin/prosody"); + else + os.execute("prosody"); + end + return true; +end + +function stop() + local ok, ret = _M.isrunning(); + if not ok then + return ok, ret; + end + if not ret then + return false, "not-running"; + end + + local ok, pid = _M.getpid() + if not ok then return false, pid; end + + signal.kill(pid, signal.SIGTERM); + return true; +end