Sophie

Sophie

distrib > Mageia > 2 > i586 > media > core-release-src > by-pkgid > 18b72f1cde4ecca8dfe8b2249d62361b > files > 9

xymon-4.2.3-10.mga2.src.rpm

Index: hobbitd/rrd/do_devmon.c
===================================================================
--- hobbitd/rrd/do_devmon.c	(revision 6161)
+++ hobbitd/rrd/do_devmon.c	(revision 6221)
@@ -23,10 +23,14 @@
 	static pcre *exclpattern = NULL;
 	int in_devmon = 1;
 	int numds = 0;
+	char *rrdbasename;
+	int lineno = 0;
 
+	rrdbasename = NULL;
 	curline = msg;
 	while (curline)  {
-		char *fsline, *p;
+		char *fsline = NULL;
+		char *p;
 		char *columns[MAXCOLS];
 		int columncount;
 		char *ifname = NULL;
@@ -37,9 +41,16 @@
 		int i;
 
 		eoln = strchr(curline, '\n'); if (eoln) *eoln = '\0';
+		lineno++;
 
-		if(!strncmp(curline, "<!--DEVMON",10)) {
+		if(!strncmp(curline, "<!--DEVMON RRD: ",16)) {
 			in_devmon = 0;
+			/*if(rrdbasename) {xfree(rrdbasename);rrdbasename = NULL;}*/
+			rrdbasename = strtok(curline+16," ");
+			if (rrdbasename == NULL) rrdbasename = xstrdup(testname);
+			dbgprintf("DEVMON: changing testname from %s to %s\n",testname,rrdbasename);
+			numds = 0;
+			if(devmon_tpl) {xfree(devmon_tpl);devmon_tpl= NULL;}
 			goto nextline;
 		}
 		if(in_devmon == 0 && !strncmp(curline, "-->",3)) {
@@ -76,7 +87,7 @@
 
 		dbgprintf("Found %d columns in devmon rrd data\n",columncount);
 		if (columncount > 2) {
-			dbgprintf("Skipping line, found %d (max 2) columns in devmon rrd data, space in repeater name?\n",columncount);
+			dbgprintf("Skipping line %d, found %d (max 2) columns in devmon rrd data, space in repeater name?\n",lineno,columncount);
 			goto nextline;
 		}
 
@@ -85,26 +96,34 @@
 		 */
 		ifname = xstrdup(columns[0]);
 		dsval = strtok(columns[1],":");
+		if (dsval == NULL) {
+			dbgprintf("Skipping line %d, line is malformed\n",lineno);
+			goto nextline;
+		}
 		sprintf(rrdvalues, "%d:", (int)tstamp);
 		strcat(rrdvalues,dsval);
 		for (i=1;i < numds;i++) {
 			dsval = strtok(NULL,":");
+			if (dsval == NULL) {
+				dbgprintf("Skipping line %d, %d tokens present, expecting %d\n",lineno,i,numds);
+				goto nextline;
+			}
 			strcat(rrdvalues,":");
 			strcat(rrdvalues,dsval);
 		}
 		/* File names in the format if_load.eth0.0.rrd */
-		snprintf(rrdfn, sizeof(rrdfn)-1, "%s.%s.rrd", testname, ifname);
+		snprintf(rrdfn, sizeof(rrdfn)-1, "%s.%s.rrd", rrdbasename, ifname);
 		rrdfn[sizeof(rrdfn)-1] = '\0';
-		dbgprintf("Sending from devmon to RRD for %s %s: %s\n",testname,ifname,rrdvalues);
+		dbgprintf("Sending from devmon to RRD for %s %s: %s\n",rrdbasename,ifname,rrdvalues);
 		create_and_update_rrd(hostname, rrdfn, devmon_params, devmon_tpl);
 		if (ifname) { xfree(ifname); ifname = NULL; }
 
 		if (eoln) *eoln = '\n';
-		xfree(fsline);
 
 nextline:
+		if (fsline) { xfree(fsline); fsline = NULL; }
 		curline = (eoln ? (eoln+1) : NULL);
 	}
-
+	if(devmon_tpl) {xfree(devmon_tpl);devmon_tpl= NULL;}
 	return 0;
 }