void parse_query(void) { cgidata_t *cgidata, *cwalk; cgidata = cgi_request(); cwalk = cgidata; while (cwalk) { /* * cwalk->name points to the name of the setting. * cwalk->value points to the value (may be an empty string). */ if (strcmp(cwalk->name, "SORT") == 0) { sortstring = strdup(cwalk->value); if (strcmp(cwalk->value, "name") == 0) sorttype = S_NAME; else if (strcmp(cwalk->value, "sender") == 0) sorttype = S_SENDER; else if (strcmp(cwalk->value, "time") == 0) sorttype = S_TIME; } else if (strcmp(cwalk->name, "MAXAGE") == 0) { maxage = atoi(cwalk->value); if (maxage <= 0) maxage = 300; } else if (strcmp(cwalk->name, "TEXT") == 0) { outform = O_TXT; } cwalk = cwalk->next; } }
static void parse_query(void) { cgidata_t *cgidata = cgi_request(); cgidata_t *cwalk; cwalk = cgidata; while (cwalk) { if (strcasecmp(cwalk->name, "HOST") == 0) { hostname = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "SERVICE") == 0) { testname = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "ALLTESTS") == 0) { if (strcasecmp(cwalk->value, "on") == 0) testname = strdup("*"); } else if (strcasecmp(cwalk->name, "NOTE") == 0) { ackmsg = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "LEVEL") == 0) { /* Command line may override this */ if (level == -1) level = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "VALIDITY") == 0) { /* Command line may override this */ if (validity == -1) validity = atoi(cwalk->value); } cwalk = cwalk->next; } }
static void parse_query(void) { cgidata_t *cgidata = cgi_request(); cgidata_t *cwalk; int havemaxprio=0, havemaxage=0, havemincolor=0, havewantacked=0, haveevcount=0; cwalk = cgidata; while (cwalk) { if (strcasecmp(cwalk->name, "MAXPRIO") == 0) { selectenv(cwalk->name, cwalk->value); maxprio = atoi(cwalk->value); havemaxprio = 1; } else if (strcasecmp(cwalk->name, "MAXAGE") == 0) { selectenv(cwalk->name, cwalk->value); maxage = 60*atoi(cwalk->value); havemaxage = 1; } else if (strcasecmp(cwalk->name, "MINCOLOR") == 0) { selectenv(cwalk->name, cwalk->value); mincolor = parse_color(cwalk->value); havemincolor = 1; } else if (strcasecmp(cwalk->name, "OLDLIMIT") == 0) { selectenv(cwalk->name, cwalk->value); oldlimit = 60*atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "WANTACKED") == 0) { selectenv(cwalk->name, cwalk->value); wantacked = (strcasecmp(cwalk->value, "yes") == 0); havewantacked = 1; } else if (strcasecmp(cwalk->name, "EVCOUNT") == 0) { selectenv(cwalk->name, cwalk->value); evcount = atoi(cwalk->value); haveevcount = 1; } cwalk = cwalk->next; } if (!havemaxprio) selectenv("MAXPRIO", "3"); if (!havemaxage) selectenv("MAXAGE", "525600"); if (!havemincolor) selectenv("MINCOLOR", "yellow"); if (!havewantacked) selectenv("WANTACKED", "no"); if (!haveevcount) selectenv("EVCOUNT", "0"); }
static void parse_query(void) { cgidata_t *cgidata = cgi_request(); cgidata_t *cwalk; cwalk = cgidata; while (cwalk) { if (strcasecmp(cwalk->name, "HOST") == 0) { if (*(cwalk->value)) hostpattern = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "EXHOST") == 0) { if (*(cwalk->value)) hostpattern = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "PAGEMATCH") == 0) { if (*(cwalk->value)) pagepattern = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "EXPAGEMATCH") == 0) { if (*(cwalk->value)) expagepattern = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "STARTTIME") == 0) { if (*(cwalk->value)) starttime = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "ENDTIME") == 0) { if (*(cwalk->value)) endtime = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "CUSTOMRRD") == 0) { if (*(cwalk->value)) customrrd = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "CUSTOMDS") == 0) { if (*(cwalk->value)) customds = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "CSV") == 0) { outform = O_CSV; if (*(cwalk->value)) csvdelim = *(cwalk->value); } else if (strcasecmp(cwalk->name, "FORMAT") == 0) { if (strcmp(cwalk->value, "XML") == 0) outform = O_XML; else { outform = O_CSV; csvdelim = *(cwalk->value); } } cwalk = cwalk->next; } }
int main(int argc, char *argv[]) { int argi; char *envarea = NULL; for (argi = 1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } } redirect_cgilog("hobbit-notifylog"); load_hostnames(xgetenv("BBHOSTS"), NULL, get_fqdn()); fprintf(stdout, "Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); cgidata = cgi_request(); if (cgidata == NULL) { /* Present the query form */ sethostenv("", "", "", colorname(COL_BLUE), NULL); showform(stdout, "notify", "notify_form", COL_BLUE, getcurrenttime(NULL), NULL, NULL); return 0; } parse_query(); /* Now generate the webpage */ headfoot(stdout, "notify", "", "header", COL_GREEN); fprintf(stdout, "<center>\n"); do_notifylog(stdout, maxcount, maxminutes, fromtime, totime, pageregex, expageregex, hostregex, exhostregex, testregex, extestregex, rcptregex, exrcptregex); fprintf(stdout, "</center>\n"); headfoot(stdout, "notify", "", "footer", COL_GREEN); return 0; }
int parse_query(void) { cgidata_t *cgidata, *cwalk; int returnval = ACT_NONE; cgidata = cgi_request(); if (cgi_method != CGI_POST) return ACT_NONE; if (cgidata == NULL) errormsg(cgi_error()); cwalk = cgidata; while (cwalk) { /* * cwalk->name points to the name of the setting. * cwalk->value points to the value (may be an empty string). */ if (strcmp(cwalk->name, "USERNAME") == 0) { adduser_name = cwalk->value; } else if (strcmp(cwalk->name, "PASSWORD") == 0) { adduser_password = cwalk->value; } else if (strcmp(cwalk->name, "USERLIST") == 0) { deluser_name = cwalk->value; } else if (strcmp(cwalk->name, "SendCreate") == 0) { returnval = ACT_CREATE; } else if (strcmp(cwalk->name, "SendDelete") == 0) { returnval = ACT_DELETE; } cwalk = cwalk->next; } return returnval; }
int main(int argc, char *argv[]) { void *hostwalk, *clonewalk; int argi; char *envarea = NULL; strbuffer_t *outbuf; char msgline[4096]; char oneurl[10240]; int gotany = 0; enum { OP_INITIAL, OP_YES, OP_NO } gotonepage = OP_INITIAL; /* Tracks if all matches are on one page */ char *onepage = NULL; /* If gotonepage==OP_YES, then this is the page */ /*[wm] regex support */ #define BUFSIZE 256 regex_t re; char re_errstr[BUFSIZE]; int re_status; for (argi=1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } } redirect_cgilog("findhost"); cgidata = cgi_request(); if (cgidata == NULL) { /* Present the query form */ sethostenv("", "", "", colorname(COL_BLUE), NULL); printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); showform(stdout, "findhost", "findhost_form", COL_BLUE, getcurrenttime(NULL), NULL, NULL); return 0; } parse_query(); if ( (re_status = regcomp(&re, pSearchPat, re_flag)) != 0 ) { regerror(re_status, &re, re_errstr, BUFSIZE); print_header(); printf("<tr><td align=left><font color=red>%s</font></td>\n", pSearchPat); printf("<td align=left><font color=red>%s</font></td></tr>\n", re_errstr); print_footer(); return 0; } outbuf = newstrbuffer(0); load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); hostwalk = first_host(); while (hostwalk) { /* * [wm] - Allow the search to be done on the hostname * also on the "displayname" and the host comment * Maybe this should be implemented by changing the HTML form, but until than.. * we're supposing that hostname will NEVER be null */ char *hostname, *displayname, *comment, *ip; hostname = xmh_item(hostwalk, XMH_HOSTNAME); displayname = xmh_item(hostwalk, XMH_DISPLAYNAME); comment = xmh_item(hostwalk, XMH_COMMENT); ip = xmh_item(hostwalk, XMH_IP); if ( regexec (&re, hostname, (size_t)0, NULL, 0) == 0 || (regexec(&re, ip, (size_t)0, NULL, 0) == 0) || (displayname && regexec (&re, displayname, (size_t)0, NULL, 0) == 0) || (comment && regexec (&re, comment, (size_t)0, NULL, 0) == 0) ) { /* match */ addtobuffer(outbuf, "<tr>\n"); sprintf(msgline, "<td align=left> %s </td>\n", displayname ? displayname : hostname); addtobuffer(outbuf, msgline); sprintf(oneurl, "%s/%s/#%s", xgetenv("XYMONWEB"), xmh_item(hostwalk, XMH_PAGEPATH), hostname); sprintf(msgline, "<td align=left> <a href=\"%s\">%s</a>\n", oneurl, xmh_item(hostwalk, XMH_PAGEPATHTITLE)); addtobuffer(outbuf, msgline); gotany++; /* See if all of the matches so far are on one page */ switch (gotonepage) { case OP_INITIAL: gotonepage = OP_YES; onepage = xmh_item(hostwalk, XMH_PAGEPATH); break; case OP_YES: if (strcmp(onepage, xmh_item(hostwalk, XMH_PAGEPATH)) != 0) gotonepage = OP_NO; break; case OP_NO: break; } clonewalk = next_host(hostwalk, 1); while (clonewalk && (strcmp(xmh_item(hostwalk, XMH_HOSTNAME), xmh_item(clonewalk, XMH_HOSTNAME)) == 0)) { sprintf(msgline, "<br><a href=\"%s/%s/#%s\">%s</a>\n", xgetenv("XYMONWEB"), xmh_item(clonewalk, XMH_PAGEPATH), xmh_item(clonewalk, XMH_HOSTNAME), xmh_item(clonewalk, XMH_PAGEPATHTITLE)); addtobuffer(outbuf, msgline); clonewalk = next_host(clonewalk, 1); gotany++; } addtobuffer(outbuf, "</td>\n</tr>\n"); hostwalk = clonewalk; } else { hostwalk = next_host(hostwalk, 0); } } regfree (&re); /*[wm] - free regex compiled patern */ if (dojump) { if (gotany == 1) { printf("Location: %s%s\n\n", xgetenv("XYMONWEBHOST"), oneurl); return 0; } else if ((gotany > 1) && (gotonepage == OP_YES)) { printf("Location: %s%s/%s/\n\n", xgetenv("XYMONWEBHOST"), xgetenv("XYMONWEB"), onepage); return 0; } } print_header(); if (!gotany) { printf("<tr><td align=left>%s</td><td align=left>Not found</td></tr>\n", pSearchPat); } else { printf("%s", grabstrbuffer(outbuf)); } print_footer(); /* [wm] - Free the strdup allocated memory */ if (pSearchPat) xfree(pSearchPat); return 0; }
static int parse_query(void) { cgidata_t *cgidata = cgi_request(); cgidata_t *cwalk; cwalk = cgidata; while (cwalk) { if (strcasecmp(cwalk->name, "HOST") == 0) { hostname = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "SERVICE") == 0) { service = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "HOSTSVC") == 0) { /* For backwards compatibility */ char *p = strrchr(cwalk->value, '.'); if (p) { *p = '\0'; hostname = strdup(cwalk->value); service = strdup(p+1); for (p=strchr(hostname, ','); (p); p = strchr(p, ',')) *p = '.'; } } else if (strcasecmp(cwalk->name, "TIMEBUF") == 0) { /* Only for the historical logs */ tstamp = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "CLIENT") == 0) { char *p; hostname = strdup(cwalk->value); p = hostname; while ((p = strchr(p, ',')) != NULL) *p = '.'; service = strdup(""); outform = FRM_CLIENT; } else if (strcasecmp(cwalk->name, "SECTION") == 0) { service = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "NKPRIO") == 0) { nkprio = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "NKTTGROUP") == 0) { nkttgroup = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "NKTTEXTRA") == 0) { nkttextra = strdup(cwalk->value); } cwalk = cwalk->next; } if (!hostname || !service) { errormsg("Invalid request"); return 1; } if (outform == FRM_STATUS) { char *p, *req; req = getenv("SCRIPT_NAME"); clienturi = (char *)malloc(strlen(req) + 10 + strlen(hostname)); strcpy(clienturi, req); p = strchr(clienturi, '?'); if (p) *p = '\0'; else p = clienturi + strlen(clienturi); sprintf(p, "?CLIENT=%s", hostname); } return 0; }
int main(int argc, char *argv[]) { int argi; char *envarea = NULL; for (argi=1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (argnmatch(argv[argi], "--top")) { topcount = 10; webfile_hf = "topchanges"; webfile_form = "topchanges_form"; maxminutes = -1; maxcount = -1; } else if (strcmp(argv[argi], "--debug=")) { debug = 1; } } redirect_cgilog("eventlog"); load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); fprintf(stdout, "Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); cgidata = cgi_request(); if (cgidata == NULL) { /* Present the query form */ sethostenv("", "", "", colorname(COL_BLUE), NULL); showform(stdout, webfile_hf, webfile_form, COL_BLUE, getcurrenttime(NULL), NULL, NULL); return 0; } *periodstring = '\0'; parse_query(); if ((*periodstring == '\0') && (fromtime || totime)) { if (fromtime && totime) sprintf(periodstring, "Events between %s - %s", fromtime, totime); else if (fromtime) sprintf(periodstring, "Events since %s", fromtime); else if (totime) sprintf(periodstring, "Events until %s", totime); } /* Now generate the webpage */ headfoot(stdout, webfile_hf, "", "header", COL_GREEN); fprintf(stdout, "<center>\n"); if (topcount == 0) { do_eventlog(stdout, maxcount, maxminutes, fromtime, totime, pageregex, expageregex, hostregex, exhostregex, testregex, extestregex, colorregex, ignoredialups, NULL, NULL, NULL, NULL, counttype, summarybar, periodstring); } else { countlist_t *hcounts, *scounts; event_t *events; time_t firstevent, lastevent; do_eventlog(NULL, -1, -1, fromtime, totime, pageregex, expageregex, hostregex, exhostregex, testregex, extestregex, colorregex, ignoredialups, NULL, &events, &hcounts, &scounts, counttype, XYMON_S_NONE, NULL); lastevent = (totime ? eventreport_time(totime) : getcurrenttime(NULL)); if (fromtime) { firstevent = eventreport_time(fromtime); } else if (events) { event_t *ewalk; ewalk = events; while (ewalk->next) ewalk = ewalk->next; firstevent = ewalk->eventtime; } else firstevent = 0; show_topchanges(stdout, hcounts, scounts, events, topcount, firstevent, lastevent); } fprintf(stdout, "</center>\n"); headfoot(stdout, webfile_hf, "", "footer", COL_GREEN); return 0; }
void parse_query(void) { cgidata_t *cgidata, *cwalk; int sday = 0, smon = 0, syear = 0, eday = 0, emon = 0, eyear = 0; int smin = 0, shour = 0, ssec = 0, emin = -1, ehour = -1, esec = -1; int hostcount = 0, testcount = 0, alltests = 0; cgidata = cgi_request(); if (cgidata == NULL) return; cwalk = cgidata; while (cwalk) { /* * cwalk->name points to the name of the setting. * cwalk->value points to the value (may be an empty string). */ if ((strcmp(cwalk->name, "hostpattern") == 0) && cwalk->value && strlen(cwalk->value)) { hostpattern = strdup(cwalk->value); } else if ((strcmp(cwalk->name, "pagepattern") == 0) && cwalk->value && strlen(cwalk->value)) { pagepattern = strdup(cwalk->value); } else if ((strcmp(cwalk->name, "ippattern") == 0) && cwalk->value && strlen(cwalk->value)) { ippattern = strdup(cwalk->value); } else if ((strcmp(cwalk->name, "classpattern") == 0) && cwalk->value && strlen(cwalk->value)) { classpattern = strdup(cwalk->value); } else if (strcmp(cwalk->name, "DoReport") == 0) { action = A_GENERATE; } else if ((strcmp(cwalk->name, "hostname") == 0) && cwalk->value && strlen(cwalk->value)) { if (!hosts) hosts = (char **) malloc(sizeof(char *)); hosts = (char **)realloc(hosts, (hostcount+2) * sizeof(char *)); hosts[hostcount] = strdup(cwalk->value); hostcount++; hosts[hostcount] = NULL; } else if ((strcmp(cwalk->name, "testname") == 0) && cwalk->value && strlen(cwalk->value)) { if (!tests) tests = (char **) malloc(sizeof(char *)); if (strcmp(cwalk->value, "ALL") == 0) { alltests = 1; } else { tests = (char **)realloc(tests, (testcount+2) * sizeof(char *)); tests[testcount] = strdup(cwalk->value); testcount++; } tests[testcount] = NULL; } else if ((strcmp(cwalk->name, "start-day") == 0) && cwalk->value && strlen(cwalk->value)) { sday = atoi(cwalk->value); } else if ((strcmp(cwalk->name, "start-mon") == 0) && cwalk->value && strlen(cwalk->value)) { smon = atoi(cwalk->value); } else if ((strcmp(cwalk->name, "start-yr") == 0) && cwalk->value && strlen(cwalk->value)) { syear = atoi(cwalk->value); } else if ((strcmp(cwalk->name, "start-hour") == 0) && cwalk->value && strlen(cwalk->value)) { shour = atoi(cwalk->value); } else if ((strcmp(cwalk->name, "start-min") == 0) && cwalk->value && strlen(cwalk->value)) { smin = atoi(cwalk->value); } else if ((strcmp(cwalk->name, "start-sec") == 0) && cwalk->value && strlen(cwalk->value)) { ssec = atoi(cwalk->value); } else if ((strcmp(cwalk->name, "end-day") == 0) && cwalk->value && strlen(cwalk->value)) { eday = atoi(cwalk->value); } else if ((strcmp(cwalk->name, "end-mon") == 0) && cwalk->value && strlen(cwalk->value)) { emon = atoi(cwalk->value); } else if ((strcmp(cwalk->name, "end-yr") == 0) && cwalk->value && strlen(cwalk->value)) { eyear = atoi(cwalk->value); } else if ((strcmp(cwalk->name, "end-hour") == 0) && cwalk->value && strlen(cwalk->value)) { ehour = atoi(cwalk->value); } else if ((strcmp(cwalk->name, "end-min") == 0) && cwalk->value && strlen(cwalk->value)) { emin = atoi(cwalk->value); } else if ((strcmp(cwalk->name, "end-sec") == 0) && cwalk->value && strlen(cwalk->value)) { esec = atoi(cwalk->value); } cwalk = cwalk->next; } if (action == A_GENERATE) { struct tm tm; memset(&tm, 0, sizeof(tm)); tm.tm_mday = sday; tm.tm_mon = smon - 1; tm.tm_year = syear - 1900; tm.tm_hour = shour; tm.tm_min = smin; tm.tm_sec = ssec; tm.tm_isdst = -1; starttime = mktime(&tm); if (ehour == -1) ehour = 23; if (emin == -1) emin = 59; if (esec == -1) esec = 59; memset(&tm, 0, sizeof(tm)); tm.tm_mday = eday; tm.tm_mon = emon - 1; tm.tm_year = eyear - 1900; tm.tm_hour = ehour; tm.tm_min = emin; tm.tm_sec = esec; tm.tm_isdst = -1; endtime = mktime(&tm); } if (alltests) { if (tests) xfree(tests); testcount = 0; tests = (char **) calloc(8, sizeof(char *)); if (hostcount == 1) { tests[testcount] = strdup("cpu"); testcount++; tests[testcount] = strdup("disk"); testcount++; tests[testcount] = strdup("memory"); testcount++; tests[testcount] = strdup("conn"); testcount++; } else { tests[testcount] = strdup("cpu"); testcount++; tests[testcount] = strdup("ram"); testcount++; tests[testcount] = strdup("mem"); testcount++; tests[testcount] = strdup("swap"); testcount++; tests[testcount] = strdup("conn-multi"); testcount++; tests[testcount] = strdup("netstat3"); testcount++; tests[testcount] = strdup("apache3"); testcount++; } tests[testcount] = NULL; } if (hostcount > 1) { int i; for (i = 0; (i < testcount); i++) { if (strcmp(tests[i], "conn") == 0) tests[i] = strdup("conn-multi"); } } }
void parse_cgi(void) { cgidata_t *postdata, *pwalk; struct tm schedtm; struct tm endtm; struct tm nowtm; memset(&schedtm, 0, sizeof(schedtm)); memset(&endtm, 0, sizeof(endtm)); postdata = cgi_request(); if (cgi_method == CGI_GET) return; /* We only want to accept posts from certain pages: svcstatus (for info), and ourselves */ /* At some point in the future, moving info lookups to their own page would be a good idea */ { char cgisource[1024]; char *p; p = csp_header("enadis"); if (p) fprintf(stdout, "%s", p); snprintf(cgisource, sizeof(cgisource), "%s/%s", xgetenv("SECURECGIBINURL"), "enadis"); if (!cgi_refererok(cgisource)) { snprintf(cgisource, sizeof(cgisource), "%s/%s", xgetenv("CGIBINURL"), "svcstatus"); if (!cgi_refererok(cgisource)) { dbgprintf("Not coming from self or svcstatus; abort\n"); return; /* Just display, don't do anything */ } } } if (!postdata) { errormsg(cgi_error()); } pwalk = postdata; while (pwalk) { /* * When handling the "go", the "Disable now" and "Schedule disable" * radio buttons mess things up. So ignore the "go" if we have seen a * "filter" request already. */ if ((strcmp(pwalk->name, "go") == 0) && (action != ACT_FILTER)) { if (strcasecmp(pwalk->value, "enable") == 0) action = ACT_ENABLE; else if (strcasecmp(pwalk->value, "disable now") == 0) action = ACT_DISABLE; else if (strcasecmp(pwalk->value, "schedule disable") == 0) action = ACT_SCHED_DISABLE; else if (strcasecmp(pwalk->value, "cancel") == 0) action = ACT_SCHED_CANCEL; else if (strcasecmp(pwalk->value, "apply filters") == 0) action = ACT_FILTER; } else if ((strcmp(pwalk->name, "go2") == 0) && (action != ACT_FILTER)) { if (strcasecmp(pwalk->value, "Disable until") == 0) disableend = DISABLE_UNTIL; } else if (strcmp(pwalk->name, "duration") == 0) { duration = atoi(pwalk->value); } else if (strcmp(pwalk->name, "untilok") == 0) { if (strcasecmp(pwalk->value, "on") == 0) { duration = -1; scale = 1; } } else if (strcmp(pwalk->name, "scale") == 0) { scale = atoi(pwalk->value); } else if (strcmp(pwalk->name, "cause") == 0) { disablemsg = strdup(pwalk->value); } else if (strcmp(pwalk->name, "hostname") == 0) { if (hostnames == NULL) { hostnames = (char **)malloc(2 * sizeof(char *)); hostnames[0] = strdup(pwalk->value); hostnames[1] = NULL; hostcount = 1; } else { hostnames = (char **)realloc(hostnames, (hostcount + 2) * sizeof(char *)); hostnames[hostcount] = strdup(pwalk->value); hostnames[hostcount+1] = NULL; hostcount++; } } else if (strcmp(pwalk->name, "enabletest") == 0) { char *val = pwalk->value; if (strcmp(val, "ALL") == 0) val = "*"; if (enabletest == NULL) { enabletest = (char **)malloc(2 * sizeof(char *)); enabletest[0] = strdup(val); enabletest[1] = NULL; enablecount = 1; } else { enabletest = (char **)realloc(enabletest, (enablecount + 2) * sizeof(char *)); enabletest[enablecount] = strdup(val); enabletest[enablecount+1] = NULL; enablecount++; } } else if (strcmp(pwalk->name, "disabletest") == 0) { char *val = pwalk->value; if (strcmp(val, "ALL") == 0) val = "*"; if (disabletest == NULL) { disabletest = (char **)malloc(2 * sizeof(char *)); disabletest[0] = strdup(val); disabletest[1] = NULL; disablecount = 1; } else { disabletest = (char **)realloc(disabletest, (disablecount + 2) * sizeof(char *)); disabletest[disablecount] = strdup(val); disabletest[disablecount+1] = NULL; disablecount++; } } else if (strcmp(pwalk->name, "year") == 0) { schedtm.tm_year = atoi(pwalk->value) - 1900; } else if (strcmp(pwalk->name, "month") == 0) { schedtm.tm_mon = atoi(pwalk->value) - 1; } else if (strcmp(pwalk->name, "day") == 0) { schedtm.tm_mday = atoi(pwalk->value); } else if (strcmp(pwalk->name, "hour") == 0) { schedtm.tm_hour = atoi(pwalk->value); } else if (strcmp(pwalk->name, "minute") == 0) { schedtm.tm_min = atoi(pwalk->value); } /* Until start */ else if (strcmp(pwalk->name, "endyear") == 0) { endtm.tm_year = atoi(pwalk->value) - 1900; } else if (strcmp(pwalk->name, "endmonth") == 0) { endtm.tm_mon = atoi(pwalk->value) - 1; } else if (strcmp(pwalk->name, "endday") == 0) { endtm.tm_mday = atoi(pwalk->value); } else if (strcmp(pwalk->name, "endhour") == 0) { endtm.tm_hour = atoi(pwalk->value); } else if (strcmp(pwalk->name, "endminute") == 0) { endtm.tm_min = atoi(pwalk->value); } /* Until end */ else if (strcmp(pwalk->name, "canceljob") == 0) { cancelid = atoi(pwalk->value); } else if (strcmp(pwalk->name, "preview") == 0) { preview = (strcasecmp(pwalk->value, "on") == 0); } else if ((strcmp(pwalk->name, "hostpattern") == 0) && pwalk->value && strlen(pwalk->value)) { hostpattern = strdup(pwalk->value); } else if ((strcmp(pwalk->name, "pagepattern") == 0) && pwalk->value && strlen(pwalk->value)) { pagepattern = strdup(pwalk->value); } else if ((strcmp(pwalk->name, "ippattern") == 0) && pwalk->value && strlen(pwalk->value)) { ippattern = strdup(pwalk->value); } else if ((strcmp(pwalk->name, "classpattern") == 0) && pwalk->value && strlen(pwalk->value)) { classpattern = strdup(pwalk->value); } pwalk = pwalk->next; } schedtm.tm_isdst = -1; schedtime = mktime(&schedtm); endtm.tm_isdst = -1; endtime = mktime(&endtm); }
int main(int argc, char *argv[]) { int argi; char *envarea = NULL; int obeycookies = 1; char *accessfn = NULL; for (argi = 1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if (strcmp(argv[argi], "--no-pin") == 0) { nopin = 1; } else if (strcmp(argv[argi], "--no-cookies") == 0) { obeycookies = 0; } else if (argnmatch(argv[argi], "--access=")) { char *p = strchr(argv[argi], '='); accessfn = strdup(p+1); } } redirect_cgilog("ack"); cgidata = cgi_request(); if ( (nopin && (cgi_method == CGI_GET)) || (!nopin && (cgidata == NULL)) ) { /* Present the query form */ sethostenv("", "", "", colorname(COL_RED), NULL); printf("Content-Type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); if (!nopin) { showform(stdout, "acknowledge", "acknowledge_form", COL_RED, getcurrenttime(NULL), NULL, NULL); } else { char *cmd; char *respbuf = NULL; char *hostname, *pagename; int gotfilter = 0, filtererror = 0; sendreturn_t *sres = NULL; int col, firstcolor = 1, alertcolors = colorset(xgetenv("ALERTCOLORS"), ((1 << COL_GREEN) | (1 << COL_BLUE))); headfoot(stdout, "acknowledge", "", "header", COL_RED); cmd = (char *)malloc(1024); strcpy(cmd, "xymondboard fields=hostname,testname,cookie color="); for (col = 0; (col < COL_COUNT); col++) { if ((1 << col) & alertcolors) { if (!firstcolor) strcat(cmd, ","); strcat(cmd, colorname(col)); firstcolor = 0; } } // printf("<!-- cmd = %s -->\n", cmd); if (obeycookies && !gotfilter && ((hostname = get_cookie("host")) != NULL)) { if (*hostname) { pcre *dummy; char *re; re = (char *)malloc(3+strlen(hostname)); sprintf(re, "^%s$", hostname); dummy = compileregex(re); if (dummy) { /* Valid expression */ freeregex(dummy); cmd = (char *)realloc(cmd, 1024 + strlen(cmd) + strlen(re)); sprintf(cmd + strlen(cmd), " host=%s", re); gotfilter = 1; } else { filtererror = 1; printf("<p align=\"center\">Invalid hostname filter</p>\n"); } } } if (obeycookies && !gotfilter && ((pagename = get_cookie("pagepath")) != NULL)) { if (*pagename) { pcre *dummy; char *re; re = (char *)malloc(8 + strlen(pagename)*2); sprintf(re, "%s$|^%s/.+", pagename, pagename); dummy = compileregex(re); if (dummy) { /* Valid expression */ freeregex(dummy); cmd = (char *)realloc(cmd, 1024 + strlen(cmd) + strlen(re)); sprintf(cmd + strlen(cmd), " page=%s", re); gotfilter = 1; } else { filtererror = 1; printf("<p align=\"center\">Invalid pagename filter</p>\n"); } } } sres = newsendreturnbuf(1, NULL); if (!filtererror && (sendmessage(cmd, NULL, XYMON_TIMEOUT, sres) == XYMONSEND_OK)) { char *bol, *eoln; int first = 1; respbuf = getsendreturnstr(sres, 1); bol = respbuf; while (bol) { char *hname, *tname, *ackcode; eoln = strchr(bol, '\n'); if (eoln) *eoln = '\0'; hname = tname = ackcode = NULL; hname = strtok(bol, "|"); if (hname) tname = strtok(NULL, "|"); if (tname) ackcode = strtok(NULL, "|"); if (hname && tname && ackcode && (strcmp(hname, "summary") != 0)) { if (first) { fprintf(stdout, "<form method=\"POST\" ACTION=\"%s\">\n", getenv("SCRIPT_NAME")); fprintf(stdout, "<center><table cellpadding=5 summary=\"Ack data\">\n"); fprintf(stdout, "<tr><th align=left>Host</th><th align=left>Test</th><th align=left>Duration</th><th align=left>Cause</th><th>Ack</th><th>Ack Multiple</tr>\n"); first = 0; } generate_ackline(stdout, hname, tname, ackcode); } if (eoln) bol = eoln+1; else bol = NULL; } if (first) { fprintf(stdout, "<center><font size=\"+1\"><b>No active alerts</b></font></center>\n"); } else { generate_ackline(stdout, NULL, NULL, NULL); fprintf(stdout, "</table></center>\n"); fprintf(stdout, "</form>\n"); } } freesendreturnbuf(sres); headfoot(stdout, "acknowledge", "", "footer", COL_RED); } } else if ( (nopin && (cgi_method == CGI_POST)) || (!nopin && (cgidata != NULL)) ) { char *xymonmsg; char *acking_user = ""; acklist_t *awalk; strbuffer_t *response = newstrbuffer(0); int count = 0; /* We only want to accept posts from certain pages */ { char cgisource[1024]; char *p; p = csp_header("acknowledge"); if (p) fprintf(stdout, "%s", p); snprintf(cgisource, sizeof(cgisource), "%s/%s", xgetenv("SECURECGIBINURL"), "acknowledge"); if (!cgi_refererok(cgisource)) { fprintf(stdout, "Location: %s.sh?\n\n", cgisource); return 0; } } parse_query(); if (getenv("REMOTE_USER")) { char *remaddr = getenv("REMOTE_ADDR"); acking_user = (char *)malloc(1024 + strlen(getenv("REMOTE_USER")) + (remaddr ? strlen(remaddr) : 0)); sprintf(acking_user, "\nAcked by: %s", getenv("REMOTE_USER")); if (remaddr) sprintf(acking_user + strlen(acking_user), " (%s)", remaddr); } /* Load the host data (for access control) */ if (accessfn) { load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); load_web_access_config(accessfn); } addtobuffer(response, "<center>\n"); for (awalk = ackhead; (awalk); awalk = awalk->next) { char *msgline = (char *)malloc(1024 + (awalk->hostname ? strlen(awalk->hostname) : 0) + (awalk->testname ? strlen(awalk->testname) : 0)); if (!awalk->checked) continue; if (accessfn && (!web_access_allowed(getenv("REMOTE_USER"), awalk->hostname, awalk->testname, WEB_ACCESS_CONTROL))) continue; if ((reqtype == ACK_ONE) && (awalk->id != sendnum)) continue; if (reqtype == ACK_MANY) { if (!awalk->ackmsg) awalk->ackmsg = ackmsgall; if (!awalk->validity && validityall) awalk->validity = durationvalue(validityall); if (periodall) awalk->period = periodall; } if (strncmp(awalk->period, "hour", 4) == 0) awalk->validity *= 60; else if (strncmp(awalk->period, "day", 4) == 0) awalk->validity *= 60*24; count++; if (!awalk->ackmsg || !awalk->validity || !awalk->acknum) { if (awalk->hostname && awalk->testname) { sprintf(msgline, "<b>NO ACK</b> sent for host %s / test %s", htmlquoted(awalk->hostname), htmlquoted(awalk->testname)); } else { sprintf(msgline, "<b>NO ACK</b> sent for item %d", awalk->id); } addtobuffer(response, msgline); addtobuffer(response, ": Duration or message not set<br>\n"); continue; } xymonmsg = (char *)malloc(1024 + strlen(awalk->ackmsg) + strlen(acking_user)); sprintf(xymonmsg, "xymondack %d %d %s %s", awalk->acknum, awalk->validity, awalk->ackmsg, acking_user); if (sendmessage(xymonmsg, NULL, XYMON_TIMEOUT, NULL) == XYMONSEND_OK) { if (awalk->hostname && awalk->testname) { sprintf(msgline, "Acknowledge sent for host %s / test %s<br>\n", htmlquoted(awalk->hostname), htmlquoted(awalk->testname)); } else { sprintf(msgline, "Acknowledge sent for code %d<br>\n", awalk->acknum); } } else { if (awalk->hostname && awalk->testname) { sprintf(msgline, "Failed to send acknowledge for host %s / test %s<br>\n", htmlquoted(awalk->hostname), htmlquoted(awalk->testname)); } else { sprintf(msgline, "Failed to send acknowledge for code %d<br>\n", awalk->acknum); } } addtobuffer(response, msgline); xfree(xymonmsg); } if (count == 0) addtobuffer(response, "<b>No acks requested</b>\n"); addtobuffer(response, "</center>\n"); fprintf(stdout, "Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); headfoot(stdout, "acknowledge", "", "header", COL_RED); fprintf(stdout, "%s", STRBUF(response)); headfoot(stdout, "acknowledge", "", "footer", COL_RED); } return 0; }
void parse_cgi(void) { cgidata_t *postdata, *pwalk; struct tm schedtm; struct tm endtm; struct tm nowtm; memset(&schedtm, 0, sizeof(schedtm)); memset(&endtm, 0, sizeof(endtm)); postdata = cgi_request(); if (cgi_method == CGI_GET) return; if (!postdata) { errormsg(cgi_error()); } pwalk = postdata; while (pwalk) { /* * When handling the "go", the "Disable now" and "Schedule disable" * radio buttons mess things up. So ignore the "go" if we have seen a * "filter" request already. */ if ((strcmp(pwalk->name, "go") == 0) && (action != ACT_FILTER)) { if (strcasecmp(pwalk->value, "enable") == 0) action = ACT_ENABLE; else if (strcasecmp(pwalk->value, "disable now") == 0) action = ACT_DISABLE; else if (strcasecmp(pwalk->value, "schedule disable") == 0) action = ACT_SCHED_DISABLE; else if (strcasecmp(pwalk->value, "cancel") == 0) action = ACT_SCHED_CANCEL; else if (strcasecmp(pwalk->value, "apply filters") == 0) action = ACT_FILTER; } else if ((strcmp(pwalk->name, "go2") == 0) && (action != ACT_FILTER)) { if (strcasecmp(pwalk->value, "Disable until") == 0) disableend = DISABLE_UNTIL; } else if (strcmp(pwalk->name, "duration") == 0) { duration = atoi(pwalk->value); } else if (strcmp(pwalk->name, "untilok") == 0) { if (strcasecmp(pwalk->value, "on") == 0) { duration = -1; scale = 1; } } else if (strcmp(pwalk->name, "scale") == 0) { scale = atoi(pwalk->value); } else if (strcmp(pwalk->name, "cause") == 0) { disablemsg = strdup(pwalk->value); } else if (strcmp(pwalk->name, "hostname") == 0) { if (hostnames == NULL) { hostnames = (char **)malloc(2 * sizeof(char *)); hostnames[0] = strdup(pwalk->value); hostnames[1] = NULL; hostcount = 1; } else { hostnames = (char **)realloc(hostnames, (hostcount + 2) * sizeof(char *)); hostnames[hostcount] = strdup(pwalk->value); hostnames[hostcount+1] = NULL; hostcount++; } } else if (strcmp(pwalk->name, "enabletest") == 0) { char *val = pwalk->value; if (strcmp(val, "ALL") == 0) val = "*"; if (enabletest == NULL) { enabletest = (char **)malloc(2 * sizeof(char *)); enabletest[0] = strdup(val); enabletest[1] = NULL; enablecount = 1; } else { enabletest = (char **)realloc(enabletest, (enablecount + 2) * sizeof(char *)); enabletest[enablecount] = strdup(val); enabletest[enablecount+1] = NULL; enablecount++; } } else if (strcmp(pwalk->name, "disabletest") == 0) { char *val = pwalk->value; if (strcmp(val, "ALL") == 0) val = "*"; if (disabletest == NULL) { disabletest = (char **)malloc(2 * sizeof(char *)); disabletest[0] = strdup(val); disabletest[1] = NULL; disablecount = 1; } else { disabletest = (char **)realloc(disabletest, (disablecount + 2) * sizeof(char *)); disabletest[disablecount] = strdup(val); disabletest[disablecount+1] = NULL; disablecount++; } } else if (strcmp(pwalk->name, "year") == 0) { schedtm.tm_year = atoi(pwalk->value) - 1900; } else if (strcmp(pwalk->name, "month") == 0) { schedtm.tm_mon = atoi(pwalk->value) - 1; } else if (strcmp(pwalk->name, "day") == 0) { schedtm.tm_mday = atoi(pwalk->value); } else if (strcmp(pwalk->name, "hour") == 0) { schedtm.tm_hour = atoi(pwalk->value); } else if (strcmp(pwalk->name, "minute") == 0) { schedtm.tm_min = atoi(pwalk->value); } /* Until start */ else if (strcmp(pwalk->name, "endyear") == 0) { endtm.tm_year = atoi(pwalk->value) - 1900; } else if (strcmp(pwalk->name, "endmonth") == 0) { endtm.tm_mon = atoi(pwalk->value) - 1; } else if (strcmp(pwalk->name, "endday") == 0) { endtm.tm_mday = atoi(pwalk->value); } else if (strcmp(pwalk->name, "endhour") == 0) { endtm.tm_hour = atoi(pwalk->value); } else if (strcmp(pwalk->name, "endminute") == 0) { endtm.tm_min = atoi(pwalk->value); } /* Until end */ else if (strcmp(pwalk->name, "canceljob") == 0) { cancelid = atoi(pwalk->value); } else if (strcmp(pwalk->name, "preview") == 0) { preview = (strcasecmp(pwalk->value, "on") == 0); } else if ((strcmp(pwalk->name, "hostpattern") == 0) && pwalk->value && strlen(pwalk->value)) { hostpattern = strdup(pwalk->value); } else if ((strcmp(pwalk->name, "pagepattern") == 0) && pwalk->value && strlen(pwalk->value)) { pagepattern = strdup(pwalk->value); } else if ((strcmp(pwalk->name, "ippattern") == 0) && pwalk->value && strlen(pwalk->value)) { ippattern = strdup(pwalk->value); } pwalk = pwalk->next; } schedtm.tm_isdst = -1; schedtime = mktime(&schedtm); endtm.tm_isdst = -1; endtime = mktime(&endtm); }
int main(int argc, char *argv[]) { char histlogfn[PATH_MAX]; char tailcmd[PATH_MAX]; FILE *fd; time_t start1d, start1w, start4w, start1y; reportinfo_t repinfo1d, repinfo1w, repinfo4w, repinfo1y, dummyrep; replog_t *log1d, *log1w, *log4w, *log1y; char *p; int argi; char *envarea = NULL; for (argi=1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (strcmp(argv[argi], "--no-svcid") == 0) { wantserviceid = 0; } } redirect_cgilog("bb-hist"); envcheck(reqenv); cgidata = cgi_request(); parse_query(); /* Build our own URL */ sprintf(selfurl, "%s", histcgiurl(hostname, service)); p = selfurl + strlen(selfurl); sprintf(p, "&BARSUMS=%d", barsums); if (strlen(ip)) { p = selfurl + strlen(selfurl); sprintf(p, "&IP=%s", ip); } if (entrycount) { p = selfurl + strlen(selfurl); sprintf(p, "&ENTRIES=%d", entrycount); } else strcat(selfurl, "&ENTRIES=ALL"); if (usepct) { /* Must modify 4-week charts to be 5-weeks, or the last day is 19% of the bar */ /* * Percent-based charts look awful with 24 hours / 7 days / 28 days / 12 months as basis * because these numbers dont divide into 100 neatly. So the last item becomes * too large (worst with the 28-day char: 100/28 = 3, last becomes (100-27*3) = 19% wide). * So adjust the periods to something that matches percent-based calculations better. */ len1d = 25; bartitle1d = "25 hour summary"; len1w = 10; bartitle1w = "10 day summary"; len4w = 33; bartitle4w = "33 day summary"; len1y = 10; bartitle1y = "10 month summary"; } sprintf(histlogfn, "%s/%s.%s", xgetenv("BBHIST"), commafy(hostname), service); fd = fopen(histlogfn, "r"); if (fd == NULL) { errormsg("Cannot open history file"); } log1d = log1w = log4w = log1y = NULL; if (req_endtime == 0) req_endtime = time(NULL); /* * Calculate the beginning time of each colorbar. We go back the specified length * of time, except 1 second - so days are from midnight -> 23:59:59 etc. */ start1d = calc_time(req_endtime, -len1d, ALIGN_HOUR, END_UNCHANGED) + 1; start1w = calc_time(req_endtime, -len1w, ALIGN_DAY, END_UNCHANGED) + 1; start4w = calc_time(req_endtime, -len4w, ALIGN_DAY, END_UNCHANGED) + 1; start1y = calc_time(req_endtime, -len1y, ALIGN_MONTH, END_UNCHANGED) + 1; /* * Collect data for the color-bars and summaries. Multiple scans over the history file, * but doing it all in one go would be hideously complex. */ if (barsums & BARSUM_1D) { parse_historyfile(fd, &repinfo1d, NULL, NULL, start1d, req_endtime, 1, reportwarnlevel, reportgreenlevel, NULL); log1d = save_replogs(); } if (barsums & BARSUM_1W) { parse_historyfile(fd, &repinfo1w, NULL, NULL, start1w, req_endtime, 1, reportwarnlevel, reportgreenlevel, NULL); log1w = save_replogs(); } if (barsums & BARSUM_4W) { parse_historyfile(fd, &repinfo4w, NULL, NULL, start4w, req_endtime, 1, reportwarnlevel, reportgreenlevel, NULL); log4w = save_replogs(); } if (barsums & BARSUM_1Y) { parse_historyfile(fd, &repinfo1y, NULL, NULL, start1y, req_endtime, 1, reportwarnlevel, reportgreenlevel, NULL); log1y = save_replogs(); } if (entrycount == 0) { /* All entries - just rewind the history file and do all of them */ rewind(fd); parse_historyfile(fd, &dummyrep, NULL, NULL, 0, time(NULL), 1, reportwarnlevel, reportgreenlevel, NULL); fclose(fd); } else { /* Last 50 entries - we cheat and use "tail" in a pipe to pick the entries */ fclose(fd); sprintf(tailcmd, "tail -%d %s", entrycount, histlogfn); fd = popen(tailcmd, "r"); if (fd == NULL) errormsg("Cannot run tail on the histfile"); parse_historyfile(fd, &dummyrep, NULL, NULL, 0, time(NULL), 1, reportwarnlevel, reportgreenlevel, NULL); pclose(fd); } /* Now generate the webpage */ printf("Content-Type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); generate_history(stdout, hostname, service, ip, req_endtime, start1d, &repinfo1d, log1d, start1w, &repinfo1w, log1w, start4w, &repinfo4w, log4w, start1y, &repinfo1y, log1y, entrycount, reploghead); return 0; }
int main(int argc, char *argv[]) { char dirid[PATH_MAX]; char outdir[PATH_MAX]; char xymongencmd[PATH_MAX]; char xymonwebenv[PATH_MAX]; char xymongentimeopt[100]; char *xymongen_argv[20]; pid_t childpid; int childstat; char htmldelim[100]; char startstr[20]; int argi, newargi; char *envarea = NULL; char *useragent; int usemultipart = 1; newargi = 0; xymongen_argv[newargi++] = xymongencmd; xymongen_argv[newargi++] = xymongentimeopt; for (argi=1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else { xymongen_argv[newargi++] = argv[argi]; } } xymongen_argv[newargi++] = outdir; xymongen_argv[newargi++] = NULL; redirect_cgilog("snapshot"); cgidata = cgi_request(); if (cgidata == NULL) { /* Present the query form */ sethostenv("", "", "", colorname(COL_BLUE), NULL); printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); showform(stdout, "snapshot", "snapshot_form", COL_BLUE, getcurrenttime(NULL), NULL, NULL); return 0; } parse_query(); useragent = getenv("HTTP_USER_AGENT"); if (useragent && strstr(useragent, "KHTML")) { /* KHTML (Konqueror, Safari) cannot handle multipart documents. */ usemultipart = 0; } /* * Need to set these up AFTER putting them into xymongen_argv, since we * need to have option parsing done first. */ if (xgetenv("XYMONGEN")) sprintf(xymongencmd, "%s", xgetenv("XYMONGEN")); else sprintf(xymongencmd, "%s/bin/xymongen", xgetenv("XYMONHOME")); snprintf(xymongentimeopt, sizeof(xymongentimeopt), "--snapshot=%u", (unsigned int)starttime); sprintf(dirid, "%lu-%u", (unsigned long)getpid(), (unsigned int)getcurrenttime(NULL)); sprintf(outdir, "%s/%s", xgetenv("XYMONSNAPDIR"), dirid); if (mkdir(outdir, 0755) == -1) errormsg("Cannot create output directory"); sprintf(xymonwebenv, "XYMONWEB=%s/%s", xgetenv("XYMONSNAPURL"), dirid); putenv(xymonwebenv); if (usemultipart) { /* Output the "please wait for report ... " thing */ snprintf(htmldelim, sizeof(htmldelim)-1, "xymonrep-%lu-%u", (unsigned long)getpid(), (unsigned int)getcurrenttime(NULL)); printf("Content-type: multipart/mixed;boundary=%s\n", htmldelim); printf("\n"); printf("%s\n", htmldelim); printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); /* It's ok with these hardcoded values, as they are not used for this page */ sethostenv("", "", "", colorname(COL_BLUE), NULL); sethostenv_report(starttime, starttime, 97.0, 99.995); headfoot(stdout, "snapshot", "", "header", COL_BLUE); strftime(startstr, sizeof(startstr), "%b %d %Y", localtime(&starttime)); printf("<CENTER><A NAME=begindata> </A>\n"); printf("<BR><BR><BR><BR>\n"); printf("<H3>Generating snapshot: %s<BR>\n", htmlquoted(startstr)); printf("<P><P>\n"); fflush(stdout); } /* Go do the report */ childpid = fork(); if (childpid == 0) { execv(xymongencmd, xymongen_argv); } else if (childpid > 0) { wait(&childstat); /* Ignore SIGHUP so we don't get killed during cleanup of XYMONSNAPDIR */ signal(SIGHUP, SIG_IGN); if (WIFEXITED(childstat) && (WEXITSTATUS(childstat) != 0) ) { if (usemultipart) printf("%s\n\n", htmldelim); printf("Content-Type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); errormsg("Could not generate report"); } else { /* Send the browser off to the report */ if (usemultipart) { printf("Done...<P></BODY></HTML>\n"); fflush(stdout); printf("%s\n\n", htmldelim); } printf("Content-Type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); printf("<HTML><HEAD>\n"); printf("<META HTTP-EQUIV=\"REFRESH\" CONTENT=\"0; URL=%s/%s/\"\n", xgetenv("XYMONSNAPURL"), dirid); printf("</HEAD><BODY BGCOLOR=\"000000\"></BODY></HTML>\n"); if (usemultipart) printf("\n%s\n", htmldelim); fflush(stdout); } cleandir(xgetenv("XYMONSNAPDIR")); } else { if (usemultipart) printf("%s\n\n", htmldelim); printf("Content-Type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); errormsg("Fork failed"); } return 0; }
int main(int argc, char *argv[]) { char dirid[PATH_MAX]; char outdir[PATH_MAX]; char xymonwebenv[PATH_MAX]; char xymongencmd[PATH_MAX]; char xymongentimeopt[100]; char csvdelimopt[100]; char *xymongen_argv[20]; pid_t childpid; int childstat; char htmldelim[100]; char startstr[30], endstr[30]; int cleanupoldreps = 1; int argi, newargi; char *envarea = NULL; char *useragent = NULL; int usemultipart = 1; newargi = 0; xymongen_argv[newargi++] = xymongencmd; xymongen_argv[newargi++] = xymongentimeopt; for (argi=1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (strcmp(argv[1], "--noclean") == 0) { cleanupoldreps = 0; } else { xymongen_argv[newargi++] = argv[argi]; } } redirect_cgilog("report"); cgidata = cgi_request(); if (cgidata == NULL) { /* Present the query form */ sethostenv("", "", "", colorname(COL_BLUE), NULL); printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); showform(stdout, "report", "report_form", COL_BLUE, getcurrenttime(NULL)-86400, NULL, NULL); return 0; } useragent = getenv("HTTP_USER_AGENT"); if (useragent && strstr(useragent, "KHTML")) { /* KHTML (Konqueror, Safari) cannot handle multipart documents. */ usemultipart = 0; } envcheck(reqenv); parse_query(); /* * We need to set these variables up AFTER we have put them into the xymongen_argv[] array. * We cannot do it before, because we need the environment that the command-line options * might provide. */ if (xgetenv("XYMONGEN")) sprintf(xymongencmd, "%s", xgetenv("XYMONGEN")); else sprintf(xymongencmd, "%s/bin/xymongen", xgetenv("XYMONHOME")); snprintf(xymongentimeopt, sizeof(xymongentimeopt)-1,"--reportopts=%u:%u:1:%s", (unsigned int)starttime, (unsigned int)endtime, style); sprintf(dirid, "%u-%u", (unsigned int)getpid(), (unsigned int)getcurrenttime(NULL)); if (!csvoutput) { sprintf(outdir, "%s/%s", xgetenv("XYMONREPDIR"), dirid); mkdir(outdir, 0755); xymongen_argv[newargi++] = outdir; sprintf(xymonwebenv, "XYMONWEB=%s/%s", xgetenv("XYMONREPURL"), dirid); putenv(xymonwebenv); } else { sprintf(outdir, "--csv=%s/%s.csv", xgetenv("XYMONREPDIR"), dirid); xymongen_argv[newargi++] = outdir; sprintf(csvdelimopt, "--csvdelim=%c", csvdelim); xymongen_argv[newargi++] = csvdelimopt; } xymongen_argv[newargi++] = NULL; if (usemultipart) { /* Output the "please wait for report ... " thing */ snprintf(htmldelim, sizeof(htmldelim)-1, "xymonrep-%u-%u", (int)getpid(), (unsigned int)getcurrenttime(NULL)); printf("Content-type: multipart/mixed;boundary=%s\n", htmldelim); printf("\n"); printf("--%s\n", htmldelim); printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); /* It's ok with these hardcoded values, as they are not used for this page */ sethostenv("", "", "", colorname(COL_BLUE), NULL); sethostenv_report(starttime, endtime, 97.0, 99.995); headfoot(stdout, "repnormal", "", "header", COL_BLUE); strftime(startstr, sizeof(startstr), "%b %d %Y", localtime(&starttime)); strftime(endstr, sizeof(endstr), "%b %d %Y", localtime(&endtime)); printf("<CENTER><A NAME=begindata> </A>\n"); printf("<BR><BR><BR><BR>\n"); printf("<H3>Generating report for the period: %s", htmlquoted(startstr)); printf(" - %s ", htmlquoted(endstr)); printf("(%s)<BR>\n", htmlquoted(style)); printf("<P><P>\n"); fflush(stdout); } /* Go do the report */ childpid = fork(); if (childpid == 0) { execv(xymongencmd, xymongen_argv); } else if (childpid > 0) { wait(&childstat); /* Ignore SIGHUP so we dont get killed during cleanup of XYMONREPDIR */ signal(SIGHUP, SIG_IGN); if (WIFEXITED(childstat) && (WEXITSTATUS(childstat) != 0) ) { char msg[4096]; if (usemultipart) printf("--%s\n\n", htmldelim); sprintf(msg, "Could not generate report.<br>\nCheck that the %s/www/rep/ directory has permissions '-rwxrwxr-x' (775)<br>\n and that is is set to group %d", xgetenv("XYMONHOME"), (int)getgid()); errormsg(msg); } else { /* Send the browser off to the report */ if (usemultipart) { printf("Done...Report is <A HREF=\"%s/%s/%s\">here</a>.</P></BODY></HTML>\n", xgetenv("XYMONREPURL"), dirid, suburl); fflush(stdout); printf("--%s\n\n", htmldelim); } printf("Content-Type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); printf("<HTML><HEAD>\n"); if (!csvoutput) { printf("<META HTTP-EQUIV=\"REFRESH\" CONTENT=\"0; URL=%s/%s/%s\"\n", xgetenv("XYMONREPURL"), dirid, suburl); printf("</HEAD><BODY>Report is available <a href=\"%s/%s/%s\">here</a></BODY></HTML>\n", xgetenv("XYMONREPURL"), dirid, suburl); } else { printf("<META HTTP-EQUIV=\"REFRESH\" CONTENT=\"0; URL=%s/%s.csv\"\n", xgetenv("XYMONREPURL"), dirid); printf("</HEAD><BODY>Report is available <a href=\"%s/%s.csv\">here</a></BODY></HTML>\n", xgetenv("XYMONREPURL"), dirid); } if (usemultipart) printf("\n--%s\n", htmldelim); fflush(stdout); } if (cleanupoldreps) cleandir(xgetenv("XYMONREPDIR")); } else { if (usemultipart) printf("--%s\n\n", htmldelim); printf("Content-Type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); errormsg("Fork failed"); } return 0; }
int main(int argc, char *argv[]) { char histlogfn[PATH_MAX]; FILE *fd; char textrepfullfn[PATH_MAX], textrepfn[1024], textrepurl[PATH_MAX]; FILE *textrep; reportinfo_t repinfo; int argi; char *envarea = NULL; void *hinfo; for (argi=1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } } redirect_cgilog("reportlog"); cgidata = cgi_request(); parse_query(); load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); if ((hinfo = hostinfo(hostname)) == NULL) { errormsg("No such host"); return 1; } ip = xmh_item(hinfo, XMH_IP); displayname = xmh_item(hinfo, XMH_DISPLAYNAME); if (!displayname) displayname = hostname; sprintf(histlogfn, "%s/%s.%s", xgetenv("XYMONHISTDIR"), commafy(hostname), service); fd = fopen(histlogfn, "r"); if (fd == NULL) { errormsg("Cannot open history file"); } color = parse_historyfile(fd, &repinfo, hostname, service, st, end, 0, reportwarnlevel, reportgreenlevel, reportwarnstops, reporttime); fclose(fd); sprintf(textrepfn, "avail-%s-%s-%u-%u.txt", hostname, service, (unsigned int)getcurrenttime(NULL), (int)getpid()); sprintf(textrepfullfn, "%s/%s", xgetenv("XYMONREPDIR"), textrepfn); sprintf(textrepurl, "%s/%s", xgetenv("XYMONREPURL"), textrepfn); textrep = fopen(textrepfullfn, "w"); /* Now generate the webpage */ printf("Content-Type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); generate_replog(stdout, textrep, textrepurl, hostname, service, color, style, ip, displayname, st, end, reportwarnlevel, reportgreenlevel, reportwarnstops, &repinfo); if (textrep) fclose(textrep); return 0; }