Patch to run_kannel_box to log to syslog.
On Wed, 2003-07-09 at 12:54, Andreas Fink wrote:
> On Dienstag, Juli 8, 2003, at 11:13 Uhr, Alan McNatty wrote:
>
> Hello,
>
> run_kannel_box is a strange beast (at least to me). It's
> purpose seems
> unclear (or more appropriately 'undocumented'). I understand
> it's part
> of the utils directory (out of main source) but it is part of
> standard
> build (eg: debian packages).
>
> Andres could you explain a bit about what it's function is ..
> the man
> page is brief. I have yet to review source code in detail -
> but if it's
> supposed to restarting failed services I would be interested
> in doing
> some work/testing with it (potentially adding syslog support
> to begin
> with).
>
> run_kannel_box starts up a process (either bearerbox, webbox orsmsbox)
> and make's sure that if it fails, it gets restartet.
>
> Here's how I start kannel on my computer from
> /etc/rc.d/init.d/kannel.I let the processes run as user "kannel" at
> the same time:
>
>
> RUN=/var/run/kannel
> BIN=/usr/local/sbin
> DELAY="1"
> CONF="/etc/kannel.conf"
>
> RUNBOX="${BIN}/run_kannel_box"
> BEARERBOX="${BIN}/bearerbox"
> SMSBOX="${BIN}/smsbox"
> WAPBOX="${BIN}/wapbox"
>
> PID_SMSBOX="$RUN/smsbox.pid"
> PID_BEARERBOX="$RUN/bearerbox.pid"
> PID_WAPBOX="$RUN/wapbox.pid"
>
> echo "Starting bearerbox"
> su -c "${RUNBOX} --pidfile ${PID_BEARERBOX} --min-delay
> ${DELAY}${BEARERBOX} ${CONF} &" kannel
> sleep 10
>
> echo "Starting smsbox"
> su -c "${RUNBOX} --pidfile ${PID_SMSBOX} --min-delay ${DELAY}${SMSBOX}
> ${CONF} &" kannel
> sleep 10
>
> echo "Starting wapbox"
> su -c "${RUNBOX} --pidfile ${PID_WAPBOX} --min-delay ${DELAY}${WAPBOX}
> ${CONF} &" kannel
>
>
> if you start a kannel box process with run_kannel_box it will keep
> theprocess restarting if it fails.
> Try it yourself and try to kill any of the box processes, and you
> willsee they restart. pretty much like safe_mysqld in mysql.
> to kill the processes, I kill the process of the PID file above
> whichis the corresponding run_kannel_box process.
>
>
>
>
>
> Andreas Fink
> Global Networks Switzerland AG
>
> ------------------------------------------------------------------
> Tel: +41-61-6666333 Fax: +41-61-6666334 Mobile: +41-79-2457333
> Global Networks, Inc. Clarastrasse 3, 4058 Basel, Switzerland
> Web: http://www.global-networks.ch/ [EMAIL PROTECTED]
> ------------------------------------------------------------------
--
Alan McNatty <[EMAIL PROTECTED]>
Index: utils/run_kannel_box.c
===================================================================
RCS file: /home/cvs/gateway/utils/run_kannel_box.c,v
retrieving revision 1.7
diff -u -r1.7 run_kannel_box.c
--- utils/run_kannel_box.c 26 Mar 2001 18:48:37 -0000 1.7
+++ utils/run_kannel_box.c 29 Jul 2003 01:14:54 -0000
@@ -1,3 +1,14 @@
+/*
+ * run_kannel_box.c - Kannel box wrapper
+ *
+ * run_kannel_box starts up a process (either bearerbox, wapbox
+ * or smsbox) and make's sure that if it fails, it gets restarted.
+ *
+ * Logs to syslog (if possible) with INFO message if a restart
+ * is required. Logs a ERR message if restart fails.
+ *
+ */
+
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
@@ -14,6 +25,24 @@
#include <fcntl.h>
#include <signal.h>
+/* require config to get HAVE_SYSLOG_H */
+#include "config.h"
+
+#if HAVE_SYSLOG_H
+#include <syslog.h>
+#else
+
+/*
+ * If we don't have syslog.h, then we'll use the following dummy definitions
+ * to avoid writing #if HAVE_SYSLOG_H everywhere.
+ */
+
+enum { LOG_PID, LOG_DAEMON, LOG_ERR, LOG_INFO };
+static void openlog(const char *ident, int option, int facility) { }
+static void syslog(int translog, const char *buf) { }
+
+#endif
+
static char *progname; /* The name of this program (for error messages) */
static char **box_arglist;
static int min_restart_delay = 60; /* in seconds */
@@ -205,11 +234,18 @@
* every time it dies. */
static int main_loop(char *boxfile)
{
+ /** A few variables for syslog-ing */
+ int size = 100; /* 100 bytes of log should be fine */
+ char message[size];
+
+ /** Open syslog for internal logging */
+ openlog(progname, LOG_PID, LOG_DAEMON);
+
time_t next_fork = 0;
- /* We can't report any errors here, because we are running
- * as a daemon and we have no logfile of our own. So we
- * exit with errno as the exit code, to offer a minimal clue. */
+ /* We are running as a daemon and we have no logfile of our
+ * own. So we log to syslog if we can and exit with errno
+ * as the exit code, to offer a minimal clue. */
for (;;) {
@@ -224,10 +260,18 @@
child_box = fork();
if (child_box < 0) {
+ snprintf(message, size,
+ "[ %s ] failed to fork child process - quitting.",
+ boxfile);
+ syslog(LOG_ERR, message);
return errno;
}
if (child_box == 0) {
/* child. exec the box */
+ snprintf(message, size,
+ "[ %s ] not running, restarting.",
+ boxfile);
+ syslog(LOG_INFO, message);
execvp(boxfile, box_arglist);
exit(127);
}
@@ -237,12 +281,20 @@
/* Something went wrong... we don't know what,
* but we do know that our child does not
* exist. So restart it. */
+ snprintf(message, size,
+ "[ %s ] restart failed (child process does not exist)",
+ boxfile);
+ syslog(LOG_ERR, message);
break;
}
if (errno == EINTR) {
continue;
}
/* Something weird happened. */
+ snprintf(message, size,
+ "[ %s ] failed to start child process, unknown error - quitting.",
+ boxfile);
+ syslog(LOG_ERR, message);
return errno;
}
}