[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox
Subject:    [PATCH] sysklogd/sysklogd.c: add config FEATURE_ROTATE_NOTIFY, with -H PROG
From:       "Steffen (Daode) Nurpmeso" <steffen () sdaoden ! eu>
Date:       2016-02-22 15:54:46
Message-ID: c1e05aabf029fa650fc6053da9f74a0ae90abcc3.1456155509.git.steffen () sdaoden ! eu
[Download RAW message or body]

Signed-off-by: Steffen (Daode) Nurpmeso <steffen@sdaoden.eu>
---
 sysklogd/syslogd.c | 46 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 45 insertions(+), 1 deletion(-)

Maybe you find this useful.  I was wondering how to get my logs
mailed to me with the busybox syslog, in such a way that i can
create the mail directly after the log has been rotated.  Also log
file compression would be nice.  I'm used to logrotate(8), but all
i need with the Alpine/busybox default is effectively a hook.

So -H PROG will set a program that will be spawn()d, zombies are
avoided via signal(, SIG_IGN).  Using spawn_and_wait() doesn't
seem to be a good idea, just like a double fork for waiting
purposes.  And i never did anything with busybox, this is
a two-hour thing now.  Maybe there are better ways.
Especially: it would possibly be nice to go over "sh -c" instead
of requiring -H to be something real.

Ciao.

diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index 0ea557a..5bbac79 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -35,6 +35,14 @@
 //config:	  This enables syslogd to rotate the message files
 //config:	  on his own. No need to use an external rotatescript.
 //config:
+//config:config FEATURE_ROTATE_NOTIFY
+//config:	bool "Message file rotation notifications"
+//config:	default n
+//config:	depends on FEATURE_ROTATE_LOGFILE
+//config:	help
+//config:	  If enabled a program registered via -H will be executed
+//config:	  whenever a message file has been rotated.
+//config:
 //config:config FEATURE_REMOTE_LOG
 //config:	bool "Remote Log support"
 //config:	default y
@@ -138,6 +146,9 @@
 //usage:     "\n	-s SIZE		Max size (KB) before rotation (default:200KB, 0=off)"
 //usage:     "\n	-b N		N rotated logs to keep (default:1, max=99, 0=purge)"
 //usage:	)
+//usage:	IF_FEATURE_ROTATE_NOTIFY(
+//usage:     "\n	-H PROG		Run PROG after (the given) message file was rotated"
+//usage:	)
 //usage:     "\n	-l N		Log only messages more urgent than prio N (1-8)"
 //usage:     "\n	-S		Smaller output"
 //usage:	IF_FEATURE_SYSLOGD_DUP(
@@ -239,6 +250,9 @@ IF_FEATURE_ROTATE_LOGFILE( \
 	/* number of rotated message files */   \
 	unsigned logFileRotate;                 \
 ) \
+IF_FEATURE_ROTATE_NOTIFY( \
+	const char *logRotateNotifyHook;		\
+) \
 IF_FEATURE_IPC_SYSLOG( \
 	int shmid; /* ipc shared memory id */   \
 	int s_semid; /* ipc semaphore id */     \
@@ -293,6 +307,9 @@ static const struct init_globals init_data = {
 #if ENABLE_FEATURE_ROTATE_LOGFILE
 	.logFileSize = 200 * 1024,
 	.logFileRotate = 1,
+# if ENABLE_FEATURE_ROTATE_NOTIFY
+	.logRotateNotifyHook = NULL,
+# endif
 #endif
 #if ENABLE_FEATURE_IPC_SYSLOG
 	.shmid = -1,
@@ -318,6 +335,7 @@ enum {
 	OPTBIT_small, // -S
 	IF_FEATURE_ROTATE_LOGFILE(OPTBIT_filesize   ,)	// -s
 	IF_FEATURE_ROTATE_LOGFILE(OPTBIT_rotatecnt  ,)	// -b
+	IF_FEATURE_ROTATE_NOTIFY( OPTBIT_rotatehook ,)	// -H
 	IF_FEATURE_REMOTE_LOG(    OPTBIT_remotelog  ,)	// -R
 	IF_FEATURE_REMOTE_LOG(    OPTBIT_locallog   ,)	// -L
 	IF_FEATURE_IPC_SYSLOG(    OPTBIT_circularlog,)	// -C
@@ -332,6 +350,7 @@ enum {
 	OPT_small       = 1 << OPTBIT_small   ,
 	OPT_filesize    = IF_FEATURE_ROTATE_LOGFILE((1 << OPTBIT_filesize   )) + 0,
 	OPT_rotatecnt   = IF_FEATURE_ROTATE_LOGFILE((1 << OPTBIT_rotatecnt  )) + 0,
+	OPT_rotatehook  = IF_FEATURE_ROTATE_NOTIFY( (1 << OPTBIT_rotatehook )) + 0,
 	OPT_remotelog   = IF_FEATURE_REMOTE_LOG(    (1 << OPTBIT_remotelog  )) + 0,
 	OPT_locallog    = IF_FEATURE_REMOTE_LOG(    (1 << OPTBIT_locallog   )) + 0,
 	OPT_circularlog = IF_FEATURE_IPC_SYSLOG(    (1 << OPTBIT_circularlog)) + 0,
@@ -342,6 +361,7 @@ enum {
 #define OPTION_STR "m:nO:l:S" \
 	IF_FEATURE_ROTATE_LOGFILE("s:" ) \
 	IF_FEATURE_ROTATE_LOGFILE("b:" ) \
+	IF_FEATURE_ROTATE_NOTIFY( "H:" ) \
 	IF_FEATURE_REMOTE_LOG(    "R:" ) \
 	IF_FEATURE_REMOTE_LOG(    "L"  ) \
 	IF_FEATURE_IPC_SYSLOG(    "C::") \
@@ -356,6 +376,7 @@ enum {
 #define OPTION_PARAM &opt_m, &(G.logFile.path), &opt_l \
 	IF_FEATURE_ROTATE_LOGFILE(,&opt_s) \
 	IF_FEATURE_ROTATE_LOGFILE(,&opt_b) \
+	IF_FEATURE_ROTATE_NOTIFY( ,&(G.logRotateNotifyHook)) \
 	IF_FEATURE_REMOTE_LOG(    ,&remoteAddrList) \
 	IF_FEATURE_IPC_SYSLOG(    ,&opt_C) \
 	IF_FEATURE_SYSLOGD_CFG(   ,&opt_f)
@@ -680,6 +701,9 @@ static void log_to_kmsg(int pri UNUSED_PARAM, const char *msg UNUSED_PARAM) {}
 /* Print a message to the log file. */
 static void log_locally(time_t now, char *msg, logFile_t *log_file)
 {
+#if ENABLE_FEATURE_ROTATE_NOTIFY
+	bool donotify = 0;
+#endif
 #ifdef SYSLOGD_WRLOCK
 	struct flock fl;
 #endif
@@ -722,7 +746,7 @@ static void log_locally(time_t now, char *msg, logFile_t *log_file)
 				full_write(fd, msg, len);
 				if (fd != 2)
 					close(fd);
-				return;
+				goto jleave;
 			}
 #if ENABLE_FEATURE_ROTATE_LOGFILE
 			{
@@ -760,6 +784,9 @@ static void log_locally(time_t now, char *msg, logFile_t *log_file)
 			}
 			/* newFile == "f.0" now */
 			rename(log_file->path, newFile);
+# if ENABLE_FEATURE_ROTATE_NOTIFY
+			donotify = 1;
+# endif
 		}

 		/* We may or may not have just renamed the file away;
@@ -791,6 +818,18 @@ static void log_locally(time_t now, char *msg, logFile_t *log_file)
 	fl.l_type = F_UNLCK;
 	fcntl(log_file->fd, F_SETLKW, &fl);
 #endif
+
+jleave:;
+#if ENABLE_FEATURE_ROTATE_NOTIFY
+	if (donotify && G.logRotateNotifyHook != NULL) {
+		char const *argv[3] = { G.logRotateNotifyHook, log_file->path, NULL };
+		pid_t npid;
+
+		if ((npid = spawn((char**)argv)) == -1)
+			bb_error_msg("'%s': can't run rotation notifier '%s'",
+				log_file->path, G.logRotateNotifyHook);
+	}
+#endif
 }

 static void parse_fac_prio_20(int pri, char *res20)
@@ -1136,6 +1175,11 @@ int syslogd_main(int argc UNUSED_PARAM, char **argv)
 	if (opts & OPT_rotatecnt) // -b
 		G.logFileRotate = xatou_range(opt_b, 0, 99);
 #endif
+	/* Not waiting, avoid zombies */
+#if ENABLE_FEATURE_ROTATE_NOTIFY
+	if (G.logRotateNotifyHook != NULL)
+		signal(SIGCHLD, SIG_IGN);
+#endif
 #if ENABLE_FEATURE_IPC_SYSLOG
 	if (opt_C) // -Cn
 		G.shm_size = xatoul_range(opt_C, 4, INT_MAX/1024) * 1024;
--
2.7.1

_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic