int do_iishealth_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *iishealth_params[] = { "DS:realmempct:GAUGE:600:0:U", NULL }; static void *iishealth_tpl = NULL; char *bol, *eoln, *tok; if (iishealth_tpl == NULL) iishealth_tpl = setup_template(iishealth_params); bol = strchr(msg, '\n'); if (bol) bol++; else return 0; while (bol && *bol) { eoln = strchr(bol, '\n'); if (eoln) *eoln = '\0'; tok = strtok(bol, " \t\r\n"); /* Get color marker */ if (tok) tok = strtok(NULL, " \t\r\n"); /* Get keyword */ if (tok) { int havedata = 0; if (strcmp(tok, "Connections:") == 0) { tok = strtok(NULL, " \t\r\n"); if (tok == NULL) continue; setupfn2("%s.%s.rrd", "iishealth", "connections"); sprintf(rrdvalues, "%d:%lu", (int)tstamp, atol(tok)); havedata = 1; } else if (strcmp(tok, "RequestsQueued:") == 0) { tok = strtok(NULL, " \t\r\n"); if (tok == NULL) continue; setupfn2("%s.%s.rrd", "iishealth", "requestqueued"); sprintf(rrdvalues, "%d:%lu", (int)tstamp, atol(tok)); havedata = 1; } else if (strcmp(tok, "Sessions:") == 0) { tok = strtok(NULL, " \t\r\n"); if (tok == NULL) continue; setupfn2("%s.%s.rrd", "iishealth", "sessions"); sprintf(rrdvalues, "%d:%lu", (int)tstamp, atol(tok)); havedata = 1; } if (havedata) create_and_update_rrd(hostname, testname, classname, pagepaths, iishealth_params, iishealth_tpl); } bol = (eoln ? eoln+1 : NULL); } return 0; }
static int do_one_counts_rrd(char *counttype, char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp, char *params[], char *tpl) { char *boln, *eoln; boln = strchr(msg, '\n'); if (boln) boln++; while (boln && *boln) { char *fn, *countstr = NULL; eoln = strchr(boln, '\n'); if (eoln) *eoln = '\0'; fn = strtok(boln, ":"); if (fn) countstr = strtok(NULL, ":"); if (fn && countstr) { char *p; for (p=strchr(fn, '/'); (p); p = strchr(p, '/')) *p = ','; setupfn2("%s.%s.rrd", counttype, fn); sprintf(rrdvalues, "%d:%s", (int)tstamp, countstr); create_and_update_rrd(hostname, testname, classname, pagepaths, params, tpl); } boln = (eoln ? eoln+1 : NULL); } return 0; }
int do_getvis_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { char *p; char pid[4], jnm[9]; int j1, j2, j3, j4, j5, j6; /* All junk, don't need it here */ int used24p, usedanyp; if (strstr(msg, "z/VSE Getvis Map")) { p = strstr(msg, "PID "); if (!p) { return 0; } p = strtok(p, "\n"); /* Skip heading line */ if (p) { p = strtok(NULL, "\n"); } while (p != NULL) { sscanf(p, "%s %s %d %d %d %d %d %d %d %d", pid, jnm, &j1, &j2, &j3, &j4, &j5, &j6, &used24p, &usedanyp); setupfn2("%s.%s.rrd", "getvis", pid); sprintf(rrdvalues, "%d:%d:%d", (int)tstamp, used24p, usedanyp); create_and_update_rrd(hostname, testname, classname, pagepaths, getvis_params, getvis_tpl); p = strtok(NULL, "\n"); } } return 0; }
int do_beastat_exec_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *beastat_exec_params[] = { "DS:ExecThrCurrIdleCnt:GAUGE:600:0:U", "DS:ExecThrTotalCnt:GAUGE:600:0:U", "DS:PendReqCurrCnt:GAUGE:600:0:U", "DS:ServReqTotalCnt:DERIVE:600:0:U", NULL }; static void *beastat_exec_tpl = NULL; static char *checktest = "Type=ExecuteQueueRuntime"; char *curline; char *eoln; dbgprintf("beastat: host %s test %s\n",hostname, testname); if (strstr(msg, "beastat.pl")) { if (beastat_exec_tpl == NULL) beastat_exec_tpl = setup_template(beastat_exec_params); /* ---- Full Status Report ---- Type=ExecuteQueueRuntime - Location=admin - Name=weblogic.kernel.System */ curline=strstr(msg, "---- Full Status Report ----"); if (curline) { eoln = strchr(curline, '\n'); curline = (eoln ? (eoln+1) : NULL); } while (curline) { unsigned long currthr=0, totthr=0,currprq=0,totservrq=0; char *start=NULL, *execname=NULL, *nameptr=NULL; if ((start = strstr(curline,checktest))==NULL) break; if ((eoln = strchr(start, '\n')) == NULL) break; *eoln = '\0'; if ((nameptr=strstr(start,"Name=")) == NULL ) { dbgprintf("do_beastat.c: No name found in host %s test %s line %s\n", hostname,testname,start); goto nextline; } execname=xstrdup(nameptr+5); *eoln = '\n'; start=eoln+1; if ((eoln = strstr(start,checktest))==NULL) eoln=strstr(start,"dbcheck.pl"); if (eoln) *(--eoln)='\0'; setupfn2("%s,%s.rrd",testname,execname); currthr=get_long_data(start, "ExecuteThreadCurrentIdleCount"); totthr=get_long_data(start,"ExecuteThreadTotalCount"); currprq=get_long_data(start,"PendingRequestCurrentCount"); totservrq=get_long_data(start,"ServicedRequestTotalCount"); dbgprintf("beastat: host %s test %s name %s currthr %ld totthr %ld currprq %ld totservrq %ld\n", hostname, testname, execname, currthr, totthr, currprq, totservrq); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%ld:%ld:%ld:%ld", (int) tstamp, currthr, totthr, currprq, totservrq); create_and_update_rrd(hostname, testname, classname, pagepaths, beastat_exec_params, beastat_exec_tpl); if (execname) { xfree(execname); execname = NULL; } nextline: if (eoln) *(eoln)='\n'; curline = (eoln ? (eoln+1) : NULL); } } return 0; }
int do_asid_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { char *p; p=(strstr(msg, "Maxuser")); if (p) { long maxuser, maxufree, maxuused, rsvtstrt, rsvtfree, rsvtused, rsvnonr, rsvnfree, rsvnused; float maxupct, rsvtpct, rsvnpct; sscanf(p, "Maxuser: %ld Free: %ld Used: %ld %f", &maxuser, &maxufree, &maxuused, &maxupct); p=(strstr(p, "RSVTSTRT")); sscanf(p, "RSVTSTRT: %ld Free: %ld Used: %ld %f", &rsvtstrt, &rsvtfree, &rsvtused, &rsvtpct); p=(strstr(p, "RSVNONR")); sscanf(p, "RSVNONR: %ld Free: %ld Used: %ld %f", &rsvnonr, &rsvnfree, &rsvnused, &rsvnpct); setupfn2("%s.%s.rrd", "maxuser", "maxuser"); sprintf(rrdvalues, "%d:%d", (int)tstamp, (int)maxupct); create_and_update_rrd(hostname, testname, classname, pagepaths, asid_params, asid_tpl); setupfn2("%s.%s.rrd", "maxuser", "rsvtstrt"); sprintf(rrdvalues, "%d:%d", (int)tstamp, (int)rsvtpct); create_and_update_rrd(hostname, testname, classname, pagepaths, asid_params, asid_tpl); setupfn2("%s.%s.rrd", "maxuser", "rsvnonr"); sprintf(rrdvalues, "%d:%d", (int)tstamp, (int)rsvnpct); create_and_update_rrd(hostname, testname, classname, pagepaths, asid_params, asid_tpl); } p=(strstr(msg, "Nparts")); if (p) { char *fn = NULL; long nparts, partfree, partused; float partupct; sscanf(p, "Nparts: %ld Free: %ld Used: %ld %f", &nparts, &partfree, &partused, &partupct); setupfn("nparts.rrd", fn); sprintf(rrdvalues, "%d:%d", (int)tstamp, (int)partupct); create_and_update_rrd(hostname, testname, classname, pagepaths, asid_params, asid_tpl); } return 0; }
int do_bbproxy_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *bbproxy_params[] = { "DS:runtime:GAUGE:600:0:U", NULL }; static void *bbproxy_tpl = NULL; char *p; float runtime; if (bbproxy_tpl == NULL) bbproxy_tpl = setup_template(bbproxy_params); p = strstr(msg, "Average queue time"); if (p && (sscanf(p, "Average queue time : %f", &runtime) == 1)) { if (strcmp("bbproxy", testname) != 0) { setupfn2("%s.%s.rrd", "bbproxy", testname); } else { setupfn("%s.rrd", "bbproxy"); } sprintf(rrdvalues, "%d:%.2f", (int) tstamp, runtime); return create_and_update_rrd(hostname, testname, classname, pagepaths, bbproxy_params, bbproxy_tpl); } return 0; }
int do_devmon_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { #define MAXCOLS 20 char *devmon_params[MAXCOLS+7] = { NULL, }; char *eoln, *curline; static int ptnsetup = 0; static pcre *inclpattern = NULL; static pcre *exclpattern = NULL; int in_devmon = 1; int numds = 0; char *rrdbasename; int lineno = 0; rrdbasename = NULL; curline = msg; while (curline) { char *fsline = NULL; char *p; char *columns[MAXCOLS]; int columncount; char *ifname = NULL; int pused = -1; int wanteddisk = 1; long long aused = 0; char *dsval; int i; eoln = strchr(curline, '\n'); if (eoln) *eoln = '\0'; lineno++; 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; goto nextline; } if(in_devmon == 0 && !strncmp(curline, "-->",3)) { in_devmon = 1; goto nextline; } if (in_devmon != 0 ) goto nextline; for (columncount=0; (columncount<MAXCOLS); columncount++) columns[columncount] = ""; fsline = xstrdup(curline); columncount = 0; p = strtok(fsline, " "); while (p && (columncount < MAXCOLS)) { columns[columncount++] = p; p = strtok(NULL, " "); } /* DS:ds0:COUNTER:600:0:U DS:ds1:COUNTER:600:0:U */ if (!strncmp(curline, "DS:",3)) { dbgprintf("Looking for DS defintions in %s\n",curline); while ( numds < MAXCOLS) { dbgprintf("Seeing if column %d that has %s is a DS\n",numds,columns[numds]); if (strncmp(columns[numds],"DS:",3)) break; devmon_params[numds] = xstrdup(columns[numds]); numds++; } dbgprintf("Found %d DS definitions\n",numds); devmon_params[numds] = NULL; goto nextline; } dbgprintf("Found %d columns in devmon rrd data\n",columncount); if (columncount > 2) { dbgprintf("Skipping line %d, found %d (max 2) columns in devmon rrd data, space in repeater name?\n",lineno,columncount); goto nextline; } /* Now we should be on to values: * eth0.0 4678222:9966777 */ ifname = xstrdup(columns[0]); dsval = strtok(columns[1],":"); if (dsval == NULL) { dbgprintf("Skipping line %d, line is malformed\n",lineno); goto nextline; } snprintf(rrdvalues, sizeof(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 */ setupfn2("%s.%s.rrd", rrdbasename, ifname); dbgprintf("Sending from devmon to RRD for %s %s: %s\n",rrdbasename,ifname,rrdvalues); create_and_update_rrd(hostname, testname, classname, pagepaths, devmon_params, NULL); if (ifname) { xfree(ifname); ifname = NULL; } if (eoln) *eoln = '\n'; nextline: if (fsline) { xfree(fsline); fsline = NULL; } curline = (eoln ? (eoln+1) : NULL); } return 0; }
int do_beastat_jdbc_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *beastat_jdbc_params[] = { "DS:ActConnAvgCnt:GAUGE:600:0:U", "DS:ActConnCurrCnt:GAUGE:600:0:U", "DS:ActConnHighCnt:GAUGE:600:0:U", "DS:WtForConnCurrCnt:GAUGE:600:0:U", "DS:ConnDelayTime:GAUGE:600:0:U", "DS:ConnLeakProfileCnt:GAUGE:600:0:U", "DS:LeakedConnCnt:GAUGE:600:0:U", "DS:MaxCapacity:GAUGE:600:0:U", "DS:NumAvailable:GAUGE:600:0:U", "DS:NumUnavailable:GAUGE:600:0:U", "DS:HighNumAvailable:GAUGE:600:0:U", "DS:HighNumUnavailable:GAUGE:600:0:U", "DS:WaitSecHighCnt:GAUGE:600:0:U", "DS:ConnTotalCnt:DERIVE:600:0:U", "DS:FailToReconnCnt:DERIVE:600:0:U", "DS:WaitForConnHighCnt:GAUGE:600:0:U", NULL }; static void *beastat_jdbc_tpl = NULL; static char *checktest = "Type=JDBCConnectionPoolRuntime"; char *curline; char *eoln; dbgprintf("beastat: host %s test %s\n",hostname, testname); if (strstr(msg, "beastat.pl")) { if (beastat_jdbc_tpl == NULL) beastat_jdbc_tpl = setup_template(beastat_jdbc_params); /* ---- Full Status Report ---- Type=ExecuteQueueRuntime - Location=admin - Name=weblogic.kernel.System */ curline=strstr(msg, "---- Full Status Report ----"); if (curline) { eoln = strchr(curline, '\n'); curline = (eoln ? (eoln+1) : NULL); } while (curline) { unsigned long acac=0, accc=0, achc=0, wfccc=0, cdt=0, clpc=0, lcc=0; unsigned long mc=0, na=0, nu=0, hna=0, hnu=0, wshc=0, ctc=0, ftrc=0, wfchc=0; char *start=NULL, *execname=NULL, *nameptr=NULL; if ((start = strstr(curline,checktest))==NULL) break; if ((eoln = strchr(start, '\n')) == NULL) break; *eoln = '\0'; if ((nameptr=strstr(start,"Name=")) == NULL ) { dbgprintf("do_beastat.c: No name found in host %s test %s line %s\n", hostname,testname,start); goto nextline; } execname=xstrdup(nameptr+5); *eoln = '\n'; start=eoln+1; if ((eoln = strstr(start,checktest))==NULL) eoln=strstr(start,"dbcheck.pl"); if (eoln) *(--eoln)='\0'; setupfn2("%s,%s.rrd",testname,execname); acac=get_long_data(start,"ActiveConnectionsAverageCount"); accc=get_long_data(start,"ActiveConnectionsCurrentCount"); achc=get_long_data(start,"ActiveConnectionsHighCount"); wfccc=get_long_data(start,"WaitingForConnectionCurrentCount"); cdt=get_long_data(start,"ConnectionDelayTime"); clpc=get_long_data(start,"ConnectionLeakProfileCount"); lcc=get_long_data(start,"LeakedConnectionCount"); mc=get_long_data(start,"MaxCapacity"); na=get_long_data(start,"NumAvailable"); nu=get_long_data(start,"NumUnavailable"); hna=get_long_data(start,"HighestNumAvailable"); hnu=get_long_data(start,"HighestNumUnavailable"); wshc=get_long_data(start,"WaitSecondsHighCount"); ctc=get_long_data(start,"ConnectionsTotalCount"); ftrc=get_long_data(start,"FailuresToReconnectCount"); wfchc=get_long_data(start,"WaitingForConnectionHighCount"); dbgprintf("beastat: host %s test %s name %s acac %ld accc %ld achc %ld wfccc %ld cdt %ld clpc %ld lcc %ld\n", hostname, testname, execname, acac, accc, achc, wfccc, cdt, clpc, lcc); dbgprintf("beastat: host %s test %s name %s mc %ld na %ld nu %ld hna %ld hnu %ld wshc %ld ctc %ld ftrc %ld wfchc %ld\n",hostname, testname, execname, mc, na, nu, hna, hnu, wshc, ctc, ftrc, wfchc); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld", (int) tstamp, acac, accc, achc, wfccc, cdt, clpc, lcc, mc, na, nu, hna, hnu, wshc, ctc, ftrc, wfchc); create_and_update_rrd(hostname, testname, classname, pagepaths, beastat_jdbc_params, beastat_jdbc_tpl); if (execname) { xfree(execname); execname = NULL; } nextline: if (eoln) *(eoln)='\n'; curline = (eoln ? (eoln+1) : NULL); } } return 0; }
int do_temperature_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *temperature_params[] = { "DS:temperature:GAUGE:600:1:U", NULL }; static void *temperature_tpl = NULL; /* Sample input report: Device Temp(C) Temp(F) ----------------------------------- &green Motherboard#0 31 87 &green Motherboard#1 28 82 &green AMBIENT 25 77 &green CPU0 40 104 &green CPU1 40 104 &green CPU2 40 104 &green CPU3 40 104 &green Board 0 29 84 &green Board 1 35 95 &green Board 2 30 86 &green Board 3 37 98 &green Board 4 28 82 &green Board 6 28 82 &green Board CLK 27 80 &green MB 24 75 &green IOB 19 66 &green DBP0 19 66 &green CPU 0 Die 79 174 &green CPU 0 Ambient 27 80 &green CPU 1 Die 73 163 &green CPU 1 Ambient 26 78 ----------------------------------- Status green: All devices look okay */ char *bol, *eol, *comment, *p; int tmpC; if (temperature_tpl == NULL) temperature_tpl = setup_template(temperature_params); bol = eol = msg; while (eol && ((p = strstr(eol, "\n&")) != NULL)) { int gotone = 0; bol = p + 1; eol = strchr(bol, '\n'); if (eol) *eol = '\0'; /* See if there's a comment in parenthesis */ comment = strchr(bol, '('); /* Begin comment */ p = strchr(bol, ')'); /* End comment */ if (comment && p && (comment < p)) *comment = '\0'; /* Cut off the comment */ if (strncmp(bol, "&green", 6) == 0) { bol += 6; gotone = 1; } else if (strncmp(bol, "&yellow", 7) == 0) { bol += 7; gotone = 1; } else if (strncmp(bol, "&red", 4) == 0) { bol += 4; gotone = 1; } else if (strncmp(bol, "&clear", 6) == 0) { bol += 6; gotone = 1; } if (gotone) { char savech; bol += strspn(bol, " \t"); /* Strip off any leading bold and italic HTML tags */ if (strncasecmp(bol, "<i><b>", 6) == 0) { bol += 6; } else if (strncasecmp(bol, "<i>", 3) == 0) { bol += 3; } else if (strncasecmp(bol, "<b><i>", 6) == 0) { bol += 6; } else if (strncasecmp(bol, "<b>", 3) == 0) { bol += 3; } bol += strspn(bol, " \t"); p = bol + strlen(bol) - 1; while ((p > bol) && isspace((int)*p)) p--; while ((p > bol) && isdigit((int)*p)) p--; // tmpF = atoi(p); while ((p > bol) && isspace((int)*p)) p--; while ((p > bol) && isdigit((int)*p)) p--; tmpC = atoi(p); while ((p > bol) && isspace((int)*p)) p--; savech = *(p+1); *(p+1) = '\0'; setupfn2("%s.%s.rrd", "temperature", bol); *(p+1) = savech; snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, tmpC); create_and_update_rrd(hostname, testname, classname, pagepaths, temperature_params, temperature_tpl); } if (comment) *comment = '('; if (eol) *eol = '\n'; } return 0; }
int do_ifstat_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static int pcres_compiled = 0; static pcre **ifstat_linux_pcres = NULL; static pcre **ifstat_freebsd_pcres = NULL; static pcre **ifstat_openbsd_pcres = NULL; static pcre **ifstat_netbsd_pcres = NULL; static pcre **ifstat_darwin_pcres = NULL; static pcre **ifstat_solaris_pcres = NULL; static pcre **ifstat_aix_pcres = NULL; static pcre **ifstat_hpux_pcres = NULL; static pcre **ifstat_sco_sv_pcres = NULL; static pcre **ifstat_bbwin_pcres = NULL; enum ostype_t ostype; char *datapart = msg; char *outp; char *bol, *eoln, *ifname, *rxstr, *txstr, *dummy; int dmatch; if (pcres_compiled == 0) { pcres_compiled = 1; ifstat_linux_pcres = compile_exprs("LINUX", ifstat_linux_exprs, (sizeof(ifstat_linux_exprs) / sizeof(ifstat_linux_exprs[0]))); ifstat_freebsd_pcres = compile_exprs("FREEBSD", ifstat_freebsd_exprs, (sizeof(ifstat_freebsd_exprs) / sizeof(ifstat_freebsd_exprs[0]))); ifstat_openbsd_pcres = compile_exprs("OPENBSD", ifstat_openbsd_exprs, (sizeof(ifstat_openbsd_exprs) / sizeof(ifstat_openbsd_exprs[0]))); ifstat_netbsd_pcres = compile_exprs("NETBSD", ifstat_netbsd_exprs, (sizeof(ifstat_netbsd_exprs) / sizeof(ifstat_netbsd_exprs[0]))); ifstat_darwin_pcres = compile_exprs("DARWIN", ifstat_darwin_exprs, (sizeof(ifstat_darwin_exprs) / sizeof(ifstat_darwin_exprs[0]))); ifstat_solaris_pcres = compile_exprs("SOLARIS", ifstat_solaris_exprs, (sizeof(ifstat_solaris_exprs) / sizeof(ifstat_solaris_exprs[0]))); ifstat_aix_pcres = compile_exprs("AIX", ifstat_aix_exprs, (sizeof(ifstat_aix_exprs) / sizeof(ifstat_aix_exprs[0]))); ifstat_hpux_pcres = compile_exprs("HPUX", ifstat_hpux_exprs, (sizeof(ifstat_hpux_exprs) / sizeof(ifstat_hpux_exprs[0]))); ifstat_sco_sv_pcres = compile_exprs("SCO_SV", ifstat_sco_sv_exprs, (sizeof(ifstat_sco_sv_exprs) / sizeof(ifstat_sco_sv_exprs[0]))); ifstat_bbwin_pcres = compile_exprs("BBWIN", ifstat_bbwin_exprs, (sizeof(ifstat_bbwin_exprs) / sizeof(ifstat_bbwin_exprs[0]))); } if (ifstat_tpl == NULL) ifstat_tpl = setup_template(ifstat_params); if ((strncmp(msg, "status", 6) == 0) || (strncmp(msg, "data", 4) == 0)) { /* Skip the first line of full status- and data-messages. */ datapart = strchr(msg, '\n'); if (datapart) datapart++; else datapart = msg; } ostype = get_ostype(datapart); datapart = strchr(datapart, '\n'); if (datapart) { datapart++; } else { errprintf("Too few lines in ifstat report from %s\n", hostname); return -1; } /* Setup the update string */ outp = rrdvalues + sprintf(rrdvalues, "%d", (int)tstamp); dmatch = 0; ifname = rxstr = txstr = dummy = NULL; bol = datapart; while (bol) { eoln = strchr(bol, '\n'); if (eoln) *eoln = '\0'; switch (ostype) { case OS_LINUX22: case OS_LINUX: case OS_RHEL3: case OS_ZVM: case OS_ZVSE: case OS_ZOS: if (pickdata(bol, ifstat_linux_pcres[0], 1, &ifname)) { /* * Linux' netif aliases mess up things. * Clear everything when we see an interface name. * But we dont want to track the "lo" interface. */ if (strcmp(ifname, "lo") == 0) { xfree(ifname); ifname = NULL; } else { dmatch = 1; if (rxstr) { xfree(rxstr); rxstr = NULL; } if (txstr) { xfree(txstr); txstr = NULL; } } } else if (pickdata(bol, ifstat_linux_pcres[1], 1, &rxstr, &txstr)) dmatch |= 6; break; case OS_FREEBSD: if (pickdata(bol, ifstat_freebsd_pcres[0], 0, &ifname, &rxstr, &txstr)) dmatch = 7; break; case OS_OPENBSD: if (pickdata(bol, ifstat_openbsd_pcres[0], 0, &ifname, &rxstr, &txstr)) dmatch = 7; break; case OS_NETBSD: if (pickdata(bol, ifstat_netbsd_pcres[0], 0, &ifname, &rxstr, &txstr)) dmatch = 7; break; case OS_SOLARIS: if (pickdata(bol, ifstat_solaris_pcres[0], 0, &ifname, &txstr)) dmatch |= 1; else if (pickdata(bol, ifstat_solaris_pcres[1], 0, &dummy, &rxstr)) dmatch |= 6; if (ifname && dummy && (strcmp(ifname, dummy) != 0)) { /* They must match, drop the data */ errprintf("Host %s has weird ifstat data - device name mismatch %s:%s\n", hostname, ifname, dummy); xfree(ifname); xfree(txstr); xfree(rxstr); xfree(dummy); dmatch = 0; } break; case OS_AIX: if (pickdata(bol, ifstat_aix_pcres[0], 1, &ifname)) { /* Interface names comes first, so any rx/tx data is discarded */ dmatch |= 1; if (rxstr) { xfree(rxstr); rxstr = NULL; } if (txstr) { xfree(txstr); txstr = NULL; } } else if (pickdata(bol, ifstat_aix_pcres[1], 1, &txstr, &rxstr)) dmatch |= 6; break; case OS_HPUX: if (pickdata(bol, ifstat_hpux_pcres[0], 1, &ifname)) { /* Interface names comes first, so any rx/tx data is discarded */ dmatch |= 1; if (rxstr) { xfree(rxstr); rxstr = NULL; } if (txstr) { xfree(txstr); txstr = NULL; } } else if (pickdata(bol, ifstat_hpux_pcres[1], 1, &rxstr)) dmatch |= 2; else if (pickdata(bol, ifstat_hpux_pcres[2], 1, &txstr)) dmatch |= 4; break; case OS_DARWIN: if (pickdata(bol, ifstat_darwin_pcres[0], 0, &ifname, &rxstr, &txstr)) dmatch = 7; break; case OS_SCO_SV: if (pickdata(bol, ifstat_sco_sv_pcres[0], 0, &ifname, &rxstr, &txstr)) dmatch = 7; break; case OS_WIN32_BBWIN: if (pickdata(bol, ifstat_bbwin_pcres[0], 0, &ifname, &rxstr, &txstr)) dmatch = 7; break; default: break; } if ((dmatch == 7) && ifname && rxstr && txstr) { setupfn2("%s.%s.rrd", "ifstat", ifname); sprintf(rrdvalues, "%d:%s:%s", (int)tstamp, txstr, rxstr); create_and_update_rrd(hostname, testname, classname, pagepaths, ifstat_params, ifstat_tpl); xfree(ifname); xfree(rxstr); xfree(txstr); if (dummy) xfree(dummy); ifname = rxstr = txstr = dummy = NULL; dmatch = 0; } if (eoln) { *eoln = '\n'; bol = eoln+1; if (*bol == '\0') bol = NULL; } else { bol = NULL; } } if (ifname) xfree(ifname); if (rxstr) xfree(rxstr); if (txstr) xfree(txstr); if (dummy) xfree(dummy); return 0; }
int do_ifstat_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static int pcres_compiled = 0; static pcre **ifstat_linux_pcres = NULL; static pcre **ifstat_freebsd_pcres = NULL; static pcre **ifstat_freebsdV8_pcres = NULL; static pcre **ifstat_openbsd_pcres = NULL; static pcre **ifstat_netbsd_pcres = NULL; static pcre **ifstat_darwin_pcres = NULL; static pcre **ifstat_solaris_pcres = NULL; static pcre **ifstat_aix_pcres = NULL; static pcre **ifstat_hpux_pcres = NULL; static pcre **ifstat_sco_sv_pcres = NULL; static pcre **ifstat_bbwin_pcres = NULL; enum ostype_t ostype; char *datapart = msg; char *bol, *eoln, *ifname, *rxstr, *txstr, *dummy; int dmatch; void *xmh; pcre *ifname_filter_pcre = NULL; xmh = hostinfo(hostname); if (xmh) { char *ifname_filter_expr = xmh_item(xmh, XMH_INTERFACES); if (ifname_filter_expr && *ifname_filter_expr) ifname_filter_pcre = compileregex(ifname_filter_expr); } if (pcres_compiled == 0) { pcres_compiled = 1; ifstat_linux_pcres = compile_exprs("LINUX", ifstat_linux_exprs, (sizeof(ifstat_linux_exprs) / sizeof(ifstat_linux_exprs[0]))); ifstat_freebsd_pcres = compile_exprs("FREEBSD", ifstat_freebsd_exprs, (sizeof(ifstat_freebsd_exprs) / sizeof(ifstat_freebsd_exprs[0]))); ifstat_freebsdV8_pcres = compile_exprs("FREEBSD", ifstat_freebsdV8_exprs, (sizeof(ifstat_freebsdV8_exprs) / sizeof(ifstat_freebsdV8_exprs[0]))); ifstat_openbsd_pcres = compile_exprs("OPENBSD", ifstat_openbsd_exprs, (sizeof(ifstat_openbsd_exprs) / sizeof(ifstat_openbsd_exprs[0]))); ifstat_netbsd_pcres = compile_exprs("NETBSD", ifstat_netbsd_exprs, (sizeof(ifstat_netbsd_exprs) / sizeof(ifstat_netbsd_exprs[0]))); ifstat_darwin_pcres = compile_exprs("DARWIN", ifstat_darwin_exprs, (sizeof(ifstat_darwin_exprs) / sizeof(ifstat_darwin_exprs[0]))); ifstat_solaris_pcres = compile_exprs("SOLARIS", ifstat_solaris_exprs, (sizeof(ifstat_solaris_exprs) / sizeof(ifstat_solaris_exprs[0]))); ifstat_aix_pcres = compile_exprs("AIX", ifstat_aix_exprs, (sizeof(ifstat_aix_exprs) / sizeof(ifstat_aix_exprs[0]))); ifstat_hpux_pcres = compile_exprs("HPUX", ifstat_hpux_exprs, (sizeof(ifstat_hpux_exprs) / sizeof(ifstat_hpux_exprs[0]))); ifstat_sco_sv_pcres = compile_exprs("SCO_SV", ifstat_sco_sv_exprs, (sizeof(ifstat_sco_sv_exprs) / sizeof(ifstat_sco_sv_exprs[0]))); ifstat_bbwin_pcres = compile_exprs("BBWIN", ifstat_bbwin_exprs, (sizeof(ifstat_bbwin_exprs) / sizeof(ifstat_bbwin_exprs[0]))); } if (ifstat_tpl == NULL) ifstat_tpl = setup_template(ifstat_params); if ((strncmp(msg, "status", 6) == 0) || (strncmp(msg, "data", 4) == 0)) { /* Skip the first line of full status- and data-messages. */ datapart = strchr(msg, '\n'); if (datapart) datapart++; else datapart = msg; } ostype = get_ostype(datapart); datapart = strchr(datapart, '\n'); if (datapart) { datapart++; } else { errprintf("Too few lines in ifstat report from %s\n", hostname); return -1; } dmatch = 0; ifname = rxstr = txstr = dummy = NULL; bol = datapart; while (bol) { eoln = strchr(bol, '\n'); if (eoln) *eoln = '\0'; switch (ostype) { case OS_LINUX22: case OS_LINUX: case OS_RHEL3: case OS_ZVM: case OS_ZVSE: case OS_ZOS: if (pickdata(bol, ifstat_linux_pcres[0], 1, &ifname)) { /* * Linux' netif aliases mess up things. * Clear everything when we see an interface name. * But we dont want to track the "lo" interface. */ /* Strip off the last character if it is a colon (:) */ if (ifname[strlen(ifname)-1] == ':') ifname[strlen(ifname)-1] = '\0'; if (strcmp(ifname, "lo") == 0) { xfree(ifname); ifname = NULL; } else { dmatch = 1; if (rxstr) { xfree(rxstr); rxstr = NULL; } if (txstr) { xfree(txstr); txstr = NULL; } } } else if (pickdata(bol, ifstat_linux_pcres[1], 1, &rxstr, &txstr)) dmatch |= 6; else if (pickdata(bol, ifstat_linux_pcres[2], 1, &rxstr)) dmatch |= 2; else if (pickdata(bol, ifstat_linux_pcres[3], 1, &txstr)) dmatch |= 4; break; case OS_FREEBSD: /* * FreeBSD 8 added an "Idrop" counter in the middle of the data. * See if we match this expression, and if not then fall back to * the old regex without that field. */ if (pickdata(bol, ifstat_freebsdV8_pcres[0], 0, &ifname, &rxstr, &txstr)) dmatch = 7; else if (pickdata(bol, ifstat_freebsd_pcres[0], 0, &ifname, &rxstr, &txstr)) dmatch = 7; break; case OS_OPENBSD: if (pickdata(bol, ifstat_openbsd_pcres[0], 0, &ifname, &rxstr, &txstr)) dmatch = 7; break; case OS_NETBSD: if (pickdata(bol, ifstat_netbsd_pcres[0], 0, &ifname, &rxstr, &txstr)) dmatch = 7; break; case OS_SOLARIS: if (pickdata(bol, ifstat_solaris_pcres[0], 0, &ifname, &txstr)) dmatch |= 1; else if (pickdata(bol, ifstat_solaris_pcres[1], 0, &dummy, &rxstr)) dmatch |= 6; if (ifname && dummy && (strcmp(ifname, dummy) != 0)) { /* They must match, drop the data */ errprintf("Host %s has weird ifstat data - device name mismatch %s:%s\n", hostname, ifname, dummy); xfree(ifname); xfree(txstr); xfree(rxstr); xfree(dummy); dmatch = 0; } /* Ignore "mac" and "wrsmd" entries - these are for sub-devices for multiple nic's aggregated into one */ /* See http://www.xymon.com/archive/2009/06/msg00204.html for more info */ if (ifname && ((strcmp(ifname, "mac") == 0) || (strcmp(ifname, "wrsmd") == 0)) ) { xfree(ifname); xfree(txstr); dmatch = 0; } if (dummy && ((strcmp(dummy, "mac") == 0) || (strcmp(dummy, "wrsmd") == 0)) ) { xfree(dummy); xfree(rxstr); dmatch = 0; } break; case OS_AIX: if (pickdata(bol, ifstat_aix_pcres[0], 1, &ifname)) { /* Interface names comes first, so any rx/tx data is discarded */ dmatch |= 1; if (rxstr) { xfree(rxstr); rxstr = NULL; } if (txstr) { xfree(txstr); txstr = NULL; } } else if (pickdata(bol, ifstat_aix_pcres[1], 1, &txstr, &rxstr)) dmatch |= 6; break; case OS_HPUX: if (pickdata(bol, ifstat_hpux_pcres[0], 1, &ifname)) { /* Interface names comes first, so any rx/tx data is discarded */ dmatch |= 1; if (rxstr) { xfree(rxstr); rxstr = NULL; } if (txstr) { xfree(txstr); txstr = NULL; } } else if (pickdata(bol, ifstat_hpux_pcres[1], 1, &rxstr)) dmatch |= 2; else if (pickdata(bol, ifstat_hpux_pcres[2], 1, &txstr)) dmatch |= 4; break; case OS_DARWIN: if (pickdata(bol, ifstat_darwin_pcres[0], 0, &ifname, &rxstr, &txstr)) dmatch = 7; break; case OS_SCO_SV: if (pickdata(bol, ifstat_sco_sv_pcres[0], 0, &ifname, &rxstr, &txstr)) dmatch = 7; break; case OS_WIN32_BBWIN: if (pickdata(bol, ifstat_bbwin_pcres[0], 0, &ifname, &rxstr, &txstr)) dmatch = 7; break; default: break; } if ((dmatch == 7) && ifname && rxstr && txstr) { if (!ifname_filter_pcre || matchregex(ifname, ifname_filter_pcre)) { setupfn2("%s.%s.rrd", "ifstat", ifname); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%s:%s", (int)tstamp, txstr, rxstr); create_and_update_rrd(hostname, testname, classname, pagepaths, ifstat_params, ifstat_tpl); } xfree(ifname); xfree(rxstr); xfree(txstr); if (dummy) xfree(dummy); ifname = rxstr = txstr = dummy = NULL; dmatch = 0; } if (eoln) { *eoln = '\n'; bol = eoln+1; if (*bol == '\0') bol = NULL; } else { bol = NULL; } } if (ifname_filter_pcre) freeregex(ifname_filter_pcre); if (ifname) xfree(ifname); if (rxstr) xfree(rxstr); if (txstr) xfree(txstr); if (dummy) xfree(dummy); return 0; }
int do_iostatdisk_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { char *dataline; /* * This format is reported in the "iostatdisk" section: * * data HOSTNAME.iostatdisk * solaris * extended device statistics * device,r/s,w/s,kr/s,kw/s,wait,actv,svc_t,%w,%b, * dad0,a,0.0,0.7,0.0,5.8,0.0,0.0,4.3,0,0 * dad0,b,0.0,0.0,0.0,0.0,0.0,0.0,27.9,0,0 * dad0,c,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0 * dad0,e,0.0,0.6,0.0,4.1,0.0,0.0,3.7,0,0 * dad0,f,0.0,17.2,0.0,89.7,0.0,0.0,0.2,0,0 * dad0,h,0.0,0.5,0.0,2.7,0.0,0.0,2.2,0,0 * dad1,c,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0 * dad1,h,0.0,0.0,0.0,0.0,0.0,0.0,27.1,0,0 * nfs1,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0 * extended device statistics * device,r/s,w/s,kr/s,kw/s,wait,actv,svc_t,%w,%b, * dad0,a,0.0,0.6,0.0,5.1,0.0,0.0,4.2,0,0 * dad0,b,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0 * dad0,c,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0 * dad0,e,0.0,0.5,0.0,3.4,0.0,0.0,3.2,0,0 * dad0,f,0.0,12.6,0.0,65.6,0.0,0.0,0.2,0,0 * dad0,h,0.0,0.4,0.0,2.4,0.0,0.0,1.8,0,0 * dad1,c,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0 * dad1,h,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0 * nfs1,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0 * * There are two chunks of data: Like vmstat, we first get a * summary at the start of data collection, and then another * with the 5-minute average. So we must skip the first chunk. * * Note that real disks are identified by "dad0,a" whereas * NFS mounts show up as "nfs1" (no comma!). */ if (iostat_tpl == NULL) iostat_tpl = setup_template(iostat_params); dataline = strstr(msg, "\ndevice,r/s,w/s,kr/s,kw/s,wait,actv,svc_t,%w,%b,"); if (!dataline) return -1; dataline = strstr(dataline+1, "\ndevice,r/s,w/s,kr/s,kw/s,wait,actv,svc_t,%w,%b,"); if (!dataline) return -1; dataline++; while (dataline && *dataline) { char *elems[12]; char *eoln, *p, *id; int i, valofs; eoln = strchr(dataline, '\n'); if (eoln) *eoln = '\0'; memset(elems, 0, sizeof(elems)); p = elems[0] = dataline; i=0; do { p = strchr(p+1, ','); i++; if (p) { *p = '\0'; elems[i] = p+1; } } while (p); if (elems[9] == NULL) goto nextline; else if (elems[10] == NULL) { /* NFS "disk" */ id = elems[0]; valofs = 1; } else { /* Normal disk - re-instate the "," between elems[0] and elems[1] */ *(elems[1]-1) = ','; /* Hack! */ valofs = 2; } setupfn2("%s.%s.rrd", "iostat", id); sprintf(rrdvalues, "%d:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s", (int) tstamp, elems[valofs], /* r/s */ elems[valofs+1], /* w/s */ elems[valofs+2], /* kr/s */ elems[valofs+3], /* kw/s */ elems[valofs+4], /* wait */ elems[valofs+5], /* actv */ elems[valofs+6], /* wsvc_t - we use svc_t here */ "U", /* asvc_t not in this format */ elems[valofs+7], /* %w */ elems[valofs+8], /* %b */ "U", "U", "U", "U" /* sw, hw, trn, tot not in this format */ ); nextline: dataline = (eoln ? eoln+1 : NULL); } return 0; }
int do_iostat_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { /* * BEGINKEY * d0 / * d5 /var * d6 /export * ENDKEY * BEGINDATA * r/s w/s kr/s kw/s wait actv wsvc_t asvc_t %w %b s/w h/w trn tot device * 0.9 2.8 7.3 1.8 0.0 0.0 2.7 9.3 1 2 0 0 0 0 d0 * 0.1 0.3 0.8 0.5 0.0 0.0 5.2 11.0 0 0 0 0 0 0 d5 * 0.1 0.2 1.0 1.1 0.0 0.0 6.9 12.9 0 0 0 0 0 0 d6 * ENDDATA */ typedef struct iostatkey_t { char *key; char *value; struct iostatkey_t *next; } iostatkey_t; enum { S_NONE, S_KEYS, S_DATA } state; iostatkey_t *keyhead = NULL; iostatkey_t *newkey; char *eoln, *curline; char *buf, *p; float v[14]; char marker[MAX_LINE_LEN]; MEMDEFINE(marker); if (iostat_tpl == NULL) iostat_tpl = setup_template(iostat_params); curline = msg; state = S_NONE; while (curline) { eoln = strchr(curline, '\n'); if (eoln) *eoln = '\0'; if (strncmp(curline, "BEGINKEY", 8) == 0) { state = S_KEYS; } else if (strncmp(curline, "ENDKEY", 6) == 0) { state = S_NONE; } else if (strncmp(curline, "BEGINDATA", 9) == 0) { state = S_DATA; } else if (strncmp(curline, "ENDDATA", 7) == 0) { state = S_NONE; } else { switch (state) { case S_NONE: break; case S_KEYS: buf = xstrdup(curline); newkey = (iostatkey_t *)xcalloc(1, sizeof(iostatkey_t)); p = strtok(buf, " "); if (p) newkey->key = xstrdup(p); p = strtok(NULL, " "); if (p) { if (strcmp(p, "/") == 0) newkey->value = xstrdup(",root"); else { newkey->value = xstrdup(p); p = newkey->value; while ((p = strchr(p, '/')) != NULL) *p = ','; } } xfree(buf); if (newkey->key && newkey->value) { newkey->next = keyhead; keyhead = newkey; } else { if (newkey->key) xfree(newkey->key); if (newkey->value) xfree(newkey->value); xfree(newkey); } break; case S_DATA: buf = xstrdup(curline); if (sscanf(buf, "%f %f %f %f %f %f %f %f %f %f %f %f %f %f %s", &v[0], &v[1], &v[2], &v[3], &v[4], &v[5], &v[6], &v[7], &v[8], &v[9], &v[10], &v[11], &v[12], &v[13], marker) == 15) { /* Find the disk name */ for (newkey = keyhead; (newkey && strcmp(newkey->key, marker)); newkey = newkey->next) ; if (newkey) { setupfn2("%s.%s.rrd", "iostat", newkey->value); sprintf(rrdvalues, "%d:%.1f:%.1f:%.1f:%.1f:%.1f:%.1f:%.1f:%.1f:%.1f:%.1f:%.1f:%.1f:%.1f:%.1f", (int) tstamp, v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13]); create_and_update_rrd(hostname, testname, classname, pagepaths, iostat_params, iostat_tpl); } } xfree(buf); break; } } if (eoln) { *eoln = '\n'; curline = eoln + 1; } else { curline = NULL; } } /* Free the keylist */ while (keyhead) { newkey = keyhead; keyhead = keyhead->next; if (newkey->key) xfree(newkey->key); if (newkey->value) xfree(newkey->value); xfree(newkey); } MEMUNDEFINE(marker); return 0; }
int do_xymongen_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *xymon_params[] = { "DS:runtime:GAUGE:600:0:U", NULL }; static void *xymon_tpl = NULL; static char *xymon2_params[] = { "DS:hostcount:GAUGE:600:0:U", "DS:statuscount:GAUGE:600:0:U", NULL }; static void *xymon2_tpl = NULL; static char *xymon3_params[] = { "DS:redcount:GAUGE:600:0:U", "DS:rednopropcount:GAUGE:600:0:U", "DS:yellowcount:GAUGE:600:0:U", "DS:yellownopropcount:GAUGE:600:0:U", "DS:greencount:GAUGE:600:0:U", "DS:purplecount:GAUGE:600:0:U", "DS:clearcount:GAUGE:600:0:U", "DS:bluecount:GAUGE:600:0:U", "DS:redpct:GAUGE:600:0:100", "DS:rednoproppct:GAUGE:600:0:100", "DS:yellowpct:GAUGE:600:0:100", "DS:yellownoproppct:GAUGE:600:0:100", "DS:greenpct:GAUGE:600:0:100", "DS:purplepct:GAUGE:600:0:100", "DS:clearpct:GAUGE:600:0:100", "DS:bluepct:GAUGE:600:0:100", NULL }; static void *xymon3_tpl = NULL; char *p, *bol, *eoln; float runtime; int hostcount, statuscount; int redcount, rednopropcount, yellowcount, yellownopropcount, greencount, purplecount, clearcount, bluecount; double pctredcount, pctrednopropcount, pctyellowcount, pctyellownopropcount, pctgreencount, pctpurplecount, pctclearcount, pctbluecount; if (xymon_tpl == NULL) xymon_tpl = setup_template(xymon_params); if (xymon2_tpl == NULL) xymon2_tpl = setup_template(xymon2_params); if (xymon3_tpl == NULL) xymon3_tpl = setup_template(xymon3_params); runtime = 0.0; hostcount = statuscount = 0; redcount = rednopropcount = yellowcount = yellownopropcount = 0; greencount = purplecount = clearcount = bluecount = 0; pctredcount = pctrednopropcount = pctyellowcount = pctyellownopropcount = 0.0; pctgreencount = pctpurplecount = pctclearcount = pctbluecount = 0.0; bol = msg; do { int *valptr = NULL; double *pctvalptr = NULL; eoln = strchr(bol, '\n'); if (eoln) *eoln = '\0'; p = bol + strspn(bol, " \t"); if (strncmp(p, "TIME TOTAL", 10) == 0) sscanf(p, "TIME TOTAL %f", &runtime); else if (strncmp(p, "Hosts", 5) == 0) valptr = &hostcount; else if (strncmp(p, "Status messages", 15) == 0) valptr = &statuscount; else if (strncmp(p, "- Red (non-propagating)", 23) == 0) { valptr = &rednopropcount; pctvalptr = &pctrednopropcount; } else if (strncmp(p, "- Red", 5) == 0) { valptr = &redcount; pctvalptr = &pctredcount; } else if (strncmp(p, "- Yellow (non-propagating)", 26) == 0) { valptr = &yellownopropcount; pctvalptr = &pctyellownopropcount; } else if (strncmp(p, "- Yellow", 8) == 0) { valptr = &yellowcount; pctvalptr = &pctyellowcount; } else if (strncmp(p, "- Green", 7) == 0) { valptr = &greencount; pctvalptr = &pctgreencount; } else if (strncmp(p, "- Purple", 8) == 0) { valptr = &purplecount; pctvalptr = &pctpurplecount; } else if (strncmp(p, "- Clear", 7) == 0) { valptr = &clearcount; pctvalptr = &pctclearcount; } else if (strncmp(p, "- Blue", 6) == 0) { valptr = &bluecount; pctvalptr = &pctbluecount; } if (valptr) { p = strchr(bol, ':'); if (p) { *valptr = atoi(p+1); if (pctvalptr) { p = strchr(p, '('); if (p) *pctvalptr = atof(p+1); } } } bol = (eoln ? eoln+1 : NULL); } while (bol); if (strcmp("xymongen", testname) != 0) { setupfn2("%s.%s.rrd", "xymongen", testname); } else { setupfn("%s.rrd", "xymongen"); } snprintf(rrdvalues, sizeof(rrdvalues), "%d:%.2f", (int)tstamp, runtime); create_and_update_rrd(hostname, testname, classname, pagepaths, xymon_params, xymon_tpl); if (strcmp("xymongen", testname) != 0) { setupfn2("%s.%s.rrd", "xymon", testname); } else { setupfn("%s.rrd", "xymon"); } snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d:%d", (int)tstamp, hostcount, statuscount); create_and_update_rrd(hostname, testname, classname, pagepaths, xymon2_params, xymon2_tpl); if (strcmp("xymongen", testname) != 0) { setupfn2("%s.%s.rrd", "xymon2", testname); } else { setupfn("%s.rrd", "xymon2"); } snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d:%d:%d:%d:%d:%d:%d:%d:%5.2f:%5.2f:%5.2f:%5.2f:%5.2f:%5.2f:%5.2f:%5.2f", (int)tstamp, redcount, rednopropcount, yellowcount, yellownopropcount, greencount, purplecount, clearcount, bluecount, pctredcount, pctrednopropcount, pctyellowcount, pctyellownopropcount, pctgreencount, pctpurplecount, pctclearcount, pctbluecount); create_and_update_rrd(hostname, testname, classname, pagepaths, xymon3_params, xymon3_tpl); return 0; }
int do_ncv_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { char **params = NULL; int paridx; char dsdef[1024]; /* destination DS syntax for rrd engine */ char *l, *name, *val; char *envnam; char *dstypes = NULL; /* contain NCV_testname value */ int split_ncv = 0; int dslen; sprintf(rrdvalues, "%d", (int)tstamp); params = (char **)calloc(1, sizeof(char *)); paridx = 0; /* Get the NCV_* or SPLITNCV_* environment setting */ envnam = (char *)malloc(9 + strlen(testname) + 1); sprintf(envnam, "SPLITNCV_%s", testname); l = getenv(envnam); if (l) { split_ncv = 1; dslen = 200; } else { split_ncv = 0; dslen = 19; setupfn("%s.rrd", testname); sprintf(envnam, "NCV_%s", testname); l = getenv(envnam); } if (l) { dstypes = (char *)malloc(strlen(l)+3); sprintf(dstypes, ",%s,", l); } xfree(envnam); l = strchr(msg, '\n'); if (l) l++; while (l && *l && strncmp(l, "@@\n", 3)) { name = val = NULL; l += strspn(l, " \t\n"); if (*l) { /* See if this line contains a '=' or ':' sign */ name = l; l += strcspn(l, ":=\n"); if (*l) { if (( *l == '=') || (*l == ':')) { *l = '\0'; l++; } else { /* No marker, so skip this line */ name = NULL; } } else break; /* We've hit the end of the message */ } /* Skip any color marker "&COLOR " in front of the ds name */ if (name && (*name == '&')) { name++; name += strspn(name, "abcdefghijklmnopqrstuvwxyz"); name += strspn(name, " \t"); if (*name == '\0') name = NULL; } if (name) { val = l + strspn(l, " \t"); /* Find the end of the value string */ l = val; if ((*l == '-') || (*l == '+')) l++; /* Pass leading sign */ l += strspn(l, "0123456789.+-"); /* and the numbers. */ if( *val ) { int iseol = (*l == '\n'); *l = '\0'; if (!iseol) { /* If extra data after the value, skip to end of line */ l = strchr(l+1, '\n'); if (l) l++; } else { l++; } } else break; /* No value data */ } if (name && val && *val) { char *endptr; strtod(val, &endptr); if (isspace((int)*endptr) || (*endptr == '\0')) { char dsname[250]; /* name of ncv in status message (with space and all) */ char dskey[252]; /* name of final DS key (stripped) */ char *dstype = NULL; /* type of final DS */ char *inp; int outidx = 0; /* val contains a valid number */ /* rrdcreate(1) says: ds must be in the set [a-zA-Z0-9_] ... */ for (inp=name,outidx=0; (*inp && (outidx < dslen)); inp++) { if ( ((*inp >= 'A') && (*inp <= 'Z')) || ((*inp >= 'a') && (*inp <= 'z')) || ((*inp >= '0') && (*inp <= '9')) ) { dsname[outidx++] = *inp; } /* ... however, for split ncv, we replace anything else */ /* with an underscore, compacting successive invalid */ /* characters into a single one */ else if (split_ncv && ((outidx == 0) || (dsname[outidx - 1] != '_'))) { dsname[outidx++] = '_'; } } if ((outidx > 0) && (dsname[outidx-1] == '_')) { dsname[outidx-1] = '\0'; } else { dsname[outidx] = '\0'; } sprintf(dskey, ",%s:", dsname); if (split_ncv) setupfn2("%s,%s.rrd", testname, dsname); if (dstypes) { dstype = strstr(dstypes, dskey); if (!dstype) { strcpy(dskey, ",*:"); dstype = strstr(dstypes, dskey); } } if (dstype) { /* if ds type is forced */ char *p; dstype += strlen(dskey); p = strchr(dstype, ','); if (p) *p = '\0'; if(split_ncv) { sprintf(dsdef, "DS:lambda:%s:600:U:U", dstype); } else { sprintf(dsdef, "DS:%s:%s:600:U:U", dsname, dstype); } if (p) *p = ','; } else { /* nothing specified in the environnement, and no '*:' default */ if(split_ncv) { strcpy(dsdef, "DS:lambda:DERIVE:600:U:U"); } else { sprintf(dsdef, "DS:%s:DERIVE:600:U:U", dsname); } } if (!dstype || (strncasecmp(dstype, "NONE", 4) != 0)) { /* if we have something */ params[paridx] = strdup(dsdef); paridx++; params = (char **)realloc(params, (1 + paridx)*sizeof(char *)); params[paridx] = NULL; sprintf(rrdvalues+strlen(rrdvalues), ":%s", val); } } if (split_ncv && (paridx > 0)) { create_and_update_rrd(hostname, testname, classname, pagepaths, params, NULL); /* We've created one RRD, so reset the params for the next one */ for (paridx=0; (params[paridx] != NULL); paridx++) xfree(params[paridx]); paridx = 0; params[0] = NULL; sprintf(rrdvalues, "%d", (int)tstamp); } } } /* end of while */ if (!split_ncv && params[0]) create_and_update_rrd(hostname, testname, classname, pagepaths, params, NULL); for (paridx=0; (params[paridx] != NULL); paridx++) xfree(params[paridx]); xfree(params); if (dstypes) xfree(dstypes); return 0; }
int do_net_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *xymonnet_params[] = { "DS:sec:GAUGE:600:0:U", NULL }; static void *xymonnet_tpl = NULL; char *p; float seconds = 0.0; int do_default = 1; if (xymonnet_tpl == NULL) xymonnet_tpl = setup_template(xymonnet_params); if (strcmp(testname, "http") == 0) { char *line1, *url = NULL, *eoln; do_default = 0; line1 = msg; while ((line1 = strchr(line1, '\n')) != NULL) { line1++; /* Skip the newline */ eoln = strchr(line1, '\n'); if (eoln) *eoln = '\0'; if ( (strncmp(line1, "&green", 6) == 0) || (strncmp(line1, "&yellow", 7) == 0) || (strncmp(line1, "&red", 4) == 0) ) { p = strstr(line1, "http"); if (p) { url = xstrdup(p); p = strchr(url, ' '); if (p) *p = '\0'; } } else if (url && ((p = strstr(line1, "Seconds:")) != NULL) && (sscanf(p, "Seconds: %f", &seconds) == 1)) { char *urlfn = url; if (strncmp(urlfn, "http://", 7) == 0) urlfn += 7; p = urlfn; while ((p = strchr(p, '/')) != NULL) *p = ','; setupfn3("%s.%s.%s.rrd", "tcp", "http", urlfn); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%.2f", (int)tstamp, seconds); create_and_update_rrd(hostname, testname, classname, pagepaths, xymonnet_params, xymonnet_tpl); xfree(url); url = NULL; } if (eoln) *eoln = '\n'; } if (url) xfree(url); } else if (strcmp(testname, xgetenv("PINGCOLUMN")) == 0) { /* * Ping-tests, possibly using fping. */ char *tmod = "ms"; do_default = 0; if ((p = strstr(msg, "time=")) != NULL) { /* Standard ping, reports ".... time=0.2 ms" */ seconds = atof(p+5); tmod = p + 5; tmod += strspn(tmod, "0123456789. "); } else if ((p = strstr(msg, "alive")) != NULL) { /* fping, reports ".... alive (0.43 ms)" */ seconds = atof(p+7); tmod = p + 7; tmod += strspn(tmod, "0123456789. "); } if (strncmp(tmod, "ms", 2) == 0) seconds = seconds / 1000.0; else if (strncmp(tmod, "usec", 4) == 0) seconds = seconds / 1000000.0; setupfn2("%s.%s.rrd", "tcp", testname); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%.6f", (int)tstamp, seconds); return create_and_update_rrd(hostname, testname, classname, pagepaths, xymonnet_params, xymonnet_tpl); } else if (strcmp(testname, "ntp") == 0) { /* * sntp output: * 2009 Nov 13 11:29:10.000313 + 0.038766 +/- 0.052900 secs * ntpdate output: * server 172.16.10.2, stratum 3, offset -0.040324, delay 0.02568 * 13 Nov 11:29:06 ntpdate[7038]: adjust time server 172.16.10.2 offset -0.040324 sec */ char dataforntpstat[100]; char *offsetval = NULL; char offsetbuf[40]; char *msgcopy = strdup(msg); if (strstr(msgcopy, "ntpdate") != NULL) { /* Old-style "ntpdate" output */ char *p; p = strstr(msgcopy, "offset "); if (p) { p += 7; offsetval = strtok(p, " \r\n\t"); } } else if (strstr(msgcopy, " secs") != NULL) { /* Probably new "sntp" output */ char *year, *tm, *offsetdirection, *offset, *plusminus, *errorbound, *secs; tm = offsetdirection = plusminus = errorbound = secs = NULL; year = strtok(msgcopy, " "); tm = year ? strtok(NULL, " ") : NULL; offsetdirection = tm ? strtok(NULL, " ") : NULL; offset = offsetdirection ? strtok(NULL, " ") : NULL; plusminus = offset ? strtok(NULL, " ") : NULL; errorbound = plusminus ? strtok(NULL, " ") : NULL; secs = errorbound ? strtok(NULL, " ") : NULL; if ( offsetdirection && ((strcmp(offsetdirection, "+") == 0) || (strcmp(offsetdirection, "-") == 0)) && plusminus && (strcmp(plusminus, "+/-") == 0) && secs && (strcmp(secs, "secs") == 0) ) { /* Looks sane */ snprintf(offsetbuf, sizeof(offsetbuf), "%s%s", offsetdirection, offset); offsetval = offsetbuf; } } if (offsetval) { snprintf(dataforntpstat, sizeof(dataforntpstat), "offset=%s", offsetval); do_ntpstat_rrd(hostname, testname, classname, pagepaths, dataforntpstat, tstamp); } xfree(msgcopy); } if (do_default) { /* * Normal network tests - pick up the "Seconds:" value */ p = strstr(msg, "\nSeconds:"); if (p && (sscanf(p+1, "Seconds: %f", &seconds) == 1)) { setupfn2("%s.%s.rrd", "tcp", testname); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%f", (int)tstamp, seconds); return create_and_update_rrd(hostname, testname, classname, pagepaths, xymonnet_params, xymonnet_tpl); } } return 0; }
int do_xymond_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *xymond_params[] = { "DS:inmessages:DERIVE:600:0:U", "DS:statusmessages:DERIVE:600:0:U", "DS:combomessages:DERIVE:600:0:U", "DS:pagemessages:DERIVE:600:0:U", "DS:summarymessages:DERIVE:600:0:U", "DS:datamessages:DERIVE:600:0:U", "DS:notesmessages:DERIVE:600:0:U", "DS:enablemessages:DERIVE:600:0:U", "DS:disablemessages:DERIVE:600:0:U", "DS:ackmessages:DERIVE:600:0:U", "DS:configmessages:DERIVE:600:0:U", "DS:querymessages:DERIVE:600:0:U", "DS:boardmessages:DERIVE:600:0:U", "DS:listmessages:DERIVE:600:0:U", "DS:logmessages:DERIVE:600:0:U", "DS:dropmessages:DERIVE:600:0:U", "DS:renamemessages:DERIVE:600:0:U", "DS:statuschmsgs:DERIVE:600:0:U", "DS:stachgchmsgs:DERIVE:600:0:U", "DS:pagechmsgs:DERIVE:600:0:U", "DS:datachmsgs:DERIVE:600:0:U", "DS:noteschmsgs:DERIVE:600:0:U", "DS:enadischmsgs:DERIVE:600:0:U", NULL }; static void *xymond_tpl = NULL; struct { char *marker; unsigned long val; } xymond_data[] = { { "\nIncoming messages", 0 }, { "\n- status", 0 }, { "\n- combo", 0 }, { "\n- page", 0 }, { "\n- summary", 0 }, { "\n- data", 0 }, { "\n- notes", 0 }, { "\n- enable", 0 }, { "\n- disable", 0 }, { "\n- ack", 0 }, { "\n- config", 0 }, { "\n- query", 0 }, { "\n- xymondboard", 0 }, { "\n- xymondlist", 0 }, { "\n- xymondlog", 0 }, { "\n- drop", 0 }, { "\n- rename", 0 }, { "\nstatus channel messages", 0 }, { "\nstachg channel messages", 0 }, { "\npage channel messages", 0 }, { "\ndata channel messages", 0 }, { "\nnotes channel messages", 0 }, { "\nenadis channel messages", 0 }, { NULL, 0 } }; int i, gotany = 0; char *p; char valstr[10]; MEMDEFINE(valstr); if (xymond_tpl == NULL) xymond_tpl = setup_template(xymond_params); sprintf(rrdvalues, "%d", (int)tstamp); i = 0; while (xymond_data[i].marker) { p = strstr(msg, xymond_data[i].marker); if (p) { if (*p == '\n') p++; p += strcspn(p, ":\r\n"); if (*p == ':') { xymond_data[i].val = atol(p+1); gotany++; sprintf(valstr, ":%lu", xymond_data[i].val); strcat(rrdvalues, valstr); } else strcat(rrdvalues, ":U"); } else strcat(rrdvalues, ":U"); i++; } if (gotany) { if (strcmp("xymond", testname) != 0) { setupfn2("%s.%s.rrd", "xymond", testname); } else { setupfn("%s.rrd", "xymond"); } MEMUNDEFINE(valstr); return create_and_update_rrd(hostname, testname, classname, pagepaths, xymond_params, xymond_tpl); } MEMUNDEFINE(valstr); return 0; }