Changeset

722:63456c9d0522

mod_posix: Support for logging to syslog (log = 'syslog' in config)
author Matthew Wild <mwild1@gmail.com>
date Thu, 15 Jan 2009 20:06:41 +0000
parents 721:51233a8ae3d4
children 723:c1e7d280c174
files plugins/mod_posix.lua util-src/pposix.c
diffstat 2 files changed, 140 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/plugins/mod_posix.lua	Thu Jan 15 20:02:28 2009 +0000
+++ b/plugins/mod_posix.lua	Thu Jan 15 20:06:41 2009 +0000
@@ -11,7 +11,17 @@
 		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;
--- a/util-src/pposix.c	Thu Jan 15 20:02:28 2009 +0000
+++ b/util-src/pposix.c	Thu Jan 15 20:06:41 2009 +0000
@@ -28,7 +28,14 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 
+#include <syslog.h>
+
+#include <string.h>
+
 #include "lua.h"
+#include "lauxlib.h"
+
+/* Daemonization support */
 
 static int daemonize(lua_State *L)
 {
@@ -83,10 +90,132 @@
 	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;
 };