From 333914c98df72a4feb622d35222f4f2b8a2afb51 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 15 Jan 2009 20:06:41 +0000 Subject: mod_posix: Support for logging to syslog (log = 'syslog' in config) --- plugins/mod_posix.lua | 12 ++++- util-src/pposix.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+), 1 deletion(-) diff --git a/plugins/mod_posix.lua b/plugins/mod_posix.lua index 7559d3ed..23757761 100644 --- a/plugins/mod_posix.lua +++ b/plugins/mod_posix.lua @@ -11,7 +11,17 @@ if not config_get("*", "core", "no_daemonize") then local logwriter; local logfilename = config_get("*", "core", "log"); - if logfilename then + if logfilename == "syslog" then + pposix.syslog_open("prosody"); + local syslog, format = pposix.syslog_log, string.format; + logwriter = function (name, level, message, ...) + if ... then + syslog(level, format(message, ...)); + else + syslog(level, message); + end + end; + elseif logfilename then local logfile = io.open(logfilename, "a+"); if logfile then local write, format, flush = logfile.write, string.format, logfile.flush; diff --git a/util-src/pposix.c b/util-src/pposix.c index 5e15ed76..eaf68a7b 100644 --- a/util-src/pposix.c +++ b/util-src/pposix.c @@ -28,7 +28,14 @@ #include #include +#include + +#include + #include "lua.h" +#include "lauxlib.h" + +/* Daemonization support */ static int daemonize(lua_State *L) { @@ -83,10 +90,132 @@ static int daemonize(lua_State *L) return 2; } +/* Syslog support */ + +char *facility_strings[] = { "auth", + "authpriv", + "cron", + "daemon", + "ftp", + "kern", + "local0", + "local1", + "local2", + "local3", + "local4", + "local5", + "local6", + "local7", + "lpr", + "mail", + "syslog", + "user", + "uucp", + NULL + }; +int facility_constants[] = { + LOG_AUTH, + LOG_AUTHPRIV, + LOG_CRON, + LOG_DAEMON, + LOG_FTP, + LOG_KERN, + LOG_LOCAL0, + LOG_LOCAL1, + LOG_LOCAL2, + LOG_LOCAL3, + LOG_LOCAL4, + LOG_LOCAL5, + LOG_LOCAL6, + LOG_LOCAL7, + LOG_LPR, + LOG_MAIL, + LOG_NEWS, + LOG_SYSLOG, + LOG_USER, + LOG_UUCP, + -1 + }; + +/* " + The parameter ident in the call of openlog() is probably stored as-is. + Thus, if the string it points to is changed, syslog() may start + prepending the changed string, and if the string it points to ceases to + exist, the results are undefined. Most portable is to use a string + constant. + " -- syslog manpage +*/ +char* syslog_ident = NULL; + +int syslog_open(lua_State* L) +{ + int facility = luaL_checkoption(L, 2, "daemon", &facility_strings); + facility = facility_constants[facility]; + + luaL_checkstring(L, 1); + + if(syslog_ident) + free(syslog_ident); + + syslog_ident = strdup(lua_tostring(L, 1)); + + openlog(syslog_ident, LOG_PID, facility); + return 0; +} + +char *level_strings[] = { + "debug", + "info", + "notice", + "warn", + "error", + NULL + }; +int level_constants[] = { + LOG_DEBUG, + LOG_INFO, + LOG_NOTICE, + LOG_WARNING, + LOG_EMERG, + -1 + }; +int syslog_log(lua_State* L) +{ + int level = luaL_checkoption(L, 1, "notice", &level_strings); + level = level_constants[level]; + + luaL_checkstring(L, 2); + + syslog(level, "%s", lua_tostring(L, 2)); + return 0; +} + +int syslog_close(lua_State* L) +{ + closelog(); + if(syslog_ident) + { + free(syslog_ident); + syslog_ident = NULL; + } + return 0; +} + int luaopen_util_pposix(lua_State *L) { lua_newtable(L); + lua_pushcfunction(L, daemonize); lua_setfield(L, -2, "daemonize"); + + lua_pushcfunction(L, syslog_open); + lua_setfield(L, -2, "syslog_open"); + + lua_pushcfunction(L, syslog_close); + lua_setfield(L, -2, "syslog_close"); + + lua_pushcfunction(L, syslog_log); + lua_setfield(L, -2, "syslog_log"); + return 1; }; -- cgit v1.2.3