[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [hobbit] [BUG] hobbitd_alert fails to execute script on large message



On Mon, Dec 17, 2007 at 04:43:51PM +0100, Charles Goyard wrote:
> Hi,
> 
> I encounter a serious problem when using the following rule in hobbit-alerts.cfg :
> 
> EXSERVICE=_site
>         SCRIPT=/usr2/hobbitlocal/bin/send_to foobar FORMAT=text RECOVERED REPEAT=6m
> 
> when BBALPHAMSG is large (ie a "procs" or "ports" on a very busy box),
> the log says : 
> 
> 2007-12-17 16:31:01 Could not launch paging script /usr2/hobbitlocal/bin/send_to: Argument list too long

The attached patch can be used to solve this, it puts an upper limit on
the size of the status message passed through the BBALPHAMSG environment
variable. The limit is defined at compile-time through a setting in the
top-level Makefile.

I think this will apply on top of 4.2.0 as well.


Henrik

--- build/Makefile.rules	2006/07/09 19:22:14	1.197
+++ build/Makefile.rules	2008/01/02 14:09:45
@@ -92,7 +92,7 @@
 	CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" RPATHOPT="$(RPATHOPT)" NETLIBS="$(NETLIBS)" BBHOME="$(BBHOME)" $(MAKE) -C bbproxy all
 
 hobbitd-build: lib-build build-build common-build 
-	CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" RPATHOPT="$(RPATHOPT)" RRDDEF="$(RRDDEF)" RRDINCDIR="$(RRDINCDIR)" PCREINCDIR="$(PCREINCDIR)" NETLIBS="$(NETLIBS)" RRDLIBS="$(RRDLIBS)" PCRELIBS="$(PCRELIBS)" BBTOPDIR="$(BBTOPDIR)" BBHOME="$(BBHOME)" BBVAR="$(BBVAR)" BBLOGDIR="$(BBLOGDIR)" BBHOSTNAME="$(BBHOSTNAME)" BBHOSTIP="$(BBHOSTIP)" BBHOSTOS="$(BBHOSTOS)" BBUSER="$(BBUSER)" CGIDIR="$(CGIDIR)" SECURECGIDIR="$(SECURECGIDIR)" BBHOSTURL="$(BBHOSTURL)" BBCGIURL="$(BBCGIURL)" SECUREBBCGIURL="$(SECUREBBCGIURL)" MAILPROGRAM="$(MAILPROGRAM)" FPING="$(FPING)" RUNTIMEDEFS="$(RUNTIMEDEFS)" INSTALLWWWDIR="$(INSTALLWWWDIR)" INSTALLETCDIR="$(INSTALLETCDIR)" $(MAKE) -C hobbitd all
+	CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" RPATHOPT="$(RPATHOPT)" RRDDEF="$(RRDDEF)" RRDINCDIR="$(RRDINCDIR)" PCREINCDIR="$(PCREINCDIR)" NETLIBS="$(NETLIBS)" RRDLIBS="$(RRDLIBS)" PCRELIBS="$(PCRELIBS)" BBTOPDIR="$(BBTOPDIR)" BBHOME="$(BBHOME)" BBVAR="$(BBVAR)" BBLOGDIR="$(BBLOGDIR)" BBHOSTNAME="$(BBHOSTNAME)" BBHOSTIP="$(BBHOSTIP)" BBHOSTOS="$(BBHOSTOS)" BBUSER="$(BBUSER)" CGIDIR="$(CGIDIR)" SECURECGIDIR="$(SECURECGIDIR)" BBHOSTURL="$(BBHOSTURL)" BBCGIURL="$(BBCGIURL)" SECUREBBCGIURL="$(SECUREBBCGIURL)" MAILPROGRAM="$(MAILPROGRAM)" FPING="$(FPING)" RUNTIMEDEFS="$(RUNTIMEDEFS)" INSTALLWWWDIR="$(INSTALLWWWDIR)" INSTALLETCDIR="$(INSTALLETCDIR)" MAXALERTMSGSZ="$(MAXALERTMSGSZ)" $(MAKE) -C hobbitd all
 
 web-build: lib-build build-build common-build 
 	CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" RPATHOPT="$(RPATHOPT)" RRDDEF="$(RRDDEF)" RRDINCDIR="$(RRDINCDIR)" PCREINCDIR="$(PCREINCDIR)" NETLIBS="$(NETLIBS)" RRDLIBS="$(RRDLIBS)" PCRELIBS="$(PCRELIBS)" BBTOPDIR="$(BBTOPDIR)" BBHOME="$(BBHOME)" BBVAR="$(BBVAR)" BBLOGDIR="$(BBLOGDIR)" BBHOSTNAME="$(BBHOSTNAME)" BBHOSTIP="$(BBHOSTIP)" BBHOSTOS="$(BBHOSTOS)" BBUSER="$(BBUSER)" CGIDIR="$(CGIDIR)" SECURECGIDIR="$(SECURECGIDIR)" BBHOSTURL="$(BBHOSTURL)" BBCGIURL="$(BBCGIURL)" SECUREBBCGIURL="$(SECUREBBCGIURL)" MAILPROGRAM="$(MAILPROGRAM)" RUNTIMEDEFS="$(RUNTIMEDEFS)" INSTALLWWWDIR="$(INSTALLWWWDIR)" INSTALLETCDIR="$(INSTALLETCDIR)" $(MAKE) -C web all
--- hobbitd/Makefile	2007/07/22 06:55:32	1.115
+++ hobbitd/Makefile	2008/01/02 14:10:13
@@ -52,7 +52,7 @@
 	$(CC) $(LDFLAGS) -o $@ $(RPATHOPT) $(RRDOBJS) $(LIBOBJS) $(RRDLIBS) $(PCRELIBS) $(NETLIBS)
 
 do_alert.o: do_alert.c
-	$(CC) $(CFLAGS) $(PCREINCDIR) -c -o $@ do_alert.c
+	$(CC) $(CFLAGS) $(PCREINCDIR) -DMAX_ALERTMSG_SCRIPTS=$(MAXALERTMSGSZ) -c -o $@ do_alert.c
 
 do_rrd.o: do_rrd.c do_rrd.h rrd/*.c
 	$(CC) $(CFLAGS) $(RRDINCDIR) $(PCREINCDIR) -c -o $@ do_rrd.c
--- hobbitd/do_alert.c	2007/07/18 21:20:15	1.98
+++ hobbitd/do_alert.c	2008/01/02 14:05:59
@@ -422,14 +422,21 @@
 					char *p;
 					int ip1=0, ip2=0, ip3=0, ip4=0;
 					char *bbalphamsg, *ackcode, *rcpt, *bbhostname, *bbhostsvc, *bbhostsvccommas, *bbnumeric, *machip, *bbsvcname, *bbsvcnum, *bbcolorlevel, *recovered, *downsecs, *eventtstamp, *downsecsmsg, *cfidtxt;
+					int msglen;
 
 					cfidtxt = (char *)malloc(strlen("CFID=") + 10);
 					sprintf(cfidtxt, "CFID=%d", recip->cfid);
 					putenv(cfidtxt);
 
 					p = message_text(alert, recip);
-					bbalphamsg = (char *)malloc(strlen("BBALPHAMSG=") + strlen(p) + 1);
-					sprintf(bbalphamsg, "BBALPHAMSG=%s", p);
+					msglen = strlen(p);
+					if (msglen > MAX_ALERTMSG_SCRIPTS) {
+						dbgprintf("Cropping large alert message from %d to %d bytes\n", msglen, MAX_ALERTMSG_SCRIPTS);
+						msglen = MAX_ALERTMSG_SCRIPTS;
+					}
+					msglen += strlen("BBALPHAMSG=");
+					bbalphamsg = (char *)malloc(msglen + 1);
+					snprintf(bbalphamsg, msglen, "BBALPHAMSG=%s", p);
 					putenv(bbalphamsg);
 
 					ackcode = (char *)malloc(strlen("ACKCODE=") + 10);
--- configure.server	2006/08/17 07:47:34	1.67
+++ configure.server	2008/01/02 14:14:49
@@ -463,6 +463,9 @@
 echo "# Large File Support settings"     >>Makefile
 echo "LFSDEF = $LFS"                     >>Makefile
 
+echo "# Limit the size of status message texts passed to external alert scripts" >>Makefile
+echo "MAXALERTMSGSZ = 4096"
+
 echo "" >>Makefile
 if test -r build/Makefile.`uname -s`
 then