void init(fpsent *d, int at, int ocn, int sk, int bn, int pm, const char *name, const char *team) { loadwaypoints(); fpsent *o = newclient(ocn); d->aitype = at; bool resetthisguy = false; if(!d->name[0]) { if(aidebug) conoutf("%s assigned to %s at skill %d", colorname(d, name), o ? colorname(o) : "?", sk); else conoutf("connected: %s", colorname(d, name)); resetthisguy = true; } else { if(d->ownernum != ocn) { if(aidebug) conoutf("%s reassigned to %s", colorname(d, name), o ? colorname(o) : "?"); resetthisguy = true; } if(d->skill != sk && aidebug) conoutf("%s changed skill to %d", colorname(d, name), sk); } copystring(d->name, name, MAXNAMELEN+1); copystring(d->team, team, MAXTEAMLEN+1); d->ownernum = ocn; d->skill = sk; d->playermodel = chooserandomplayermodel(pm); if(resetthisguy) removeweapons(d); if(player1->clientnum == d->ownernum) create(d); else if(d->ai) destroy(d); }
/* This function defines colors for fonts */ static ELVBOOL vio_color(int fontcode, /* name of font being changed */ ELVCHAR *name, /* name of new color */ ELVBOOL isfg, /* ElvTrue for foreground, ElvFalse for background */ long *colorptr, /* where to store the color number */ unsigned char rgb[3]) /* color broken down into RGB components */ { DPRINTF (("vio_color (%d, %s, %d, %p, %x %x %x)\n", fontcode, name, isfg, colorptr, rgb[0], rgb[1], rgb[2])); /* Normal colors must be set first, so we have a way to switch back * from specialized colors. */ if (fontcode != COLOR_FONT_NORMAL && !(isfg ? fgcolored : bgcolored)) { colorset (COLOR_FONT_NORMAL, colorname (vio2ansi (VC_FG (vc_term))), ElvTrue); } /* Set the colors. */ if (!coloransi (fontcode, name, isfg, colorptr, rgb)) return ElvFalse; /* Success! Remember if we've set foreground or background */ if (isfg) fgcolored = ElvTrue; else bgcolored = ElvTrue; return ElvTrue; }
void save_checkpoint(char *filename) { char *subfn; FILE *fd = fopen(filename, "w"); activealerts_t *awalk; unsigned char *pgmsg, *ackmsg; if (fd == NULL) return; for (awalk = alistBegin(); (awalk); awalk = alistNext()) { if (awalk->state == A_DEAD) continue; pgmsg = ackmsg = ""; fprintf(fd, "%s|%s|%s|%s|%s|%d|%d|%s|", awalk->hostname, awalk->testname, awalk->location, awalk->ip, colorname(awalk->maxcolor), (int) awalk->eventstart, (int) awalk->nextalerttime, statename[awalk->state]); if (awalk->pagemessage) pgmsg = nlencode(awalk->pagemessage); fprintf(fd, "%s|", pgmsg); if (awalk->ackmessage) ackmsg = nlencode(awalk->ackmessage); fprintf(fd, "%s\n", ackmsg); } fclose(fd); subfn = (char *)malloc(strlen(filename)+5); sprintf(subfn, "%s.sub", filename); save_state(subfn); xfree(subfn); }
static int statuscolor_by_set(testedhost_t *h, long status, char *okcodes, char *badcodes) { int result = -1; char codestr[10]; pcre *ptn; /* Use code 999 to indicate we could not fetch the URL */ sprintf(codestr, "%ld", (status ? status : 999)); if (okcodes) { ptn = compileregex(okcodes); if (matchregex(codestr, ptn)) result = COL_GREEN; else result = COL_RED; freeregex(ptn); } if (badcodes) { ptn = compileregex(badcodes); if (matchregex(codestr, ptn)) result = COL_RED; else result = COL_GREEN; freeregex(ptn); } if (result == -1) result = statuscolor(h, status); dbgprintf("Host %s status %s [%s:%s] -> color %s\n", h->hostname, codestr, (okcodes ? okcodes : "<null>"), (badcodes ? badcodes : "<null>"), colorname(result)); return result; }
game_t::game_t(Fl_Color color) { my_color = color; printf("My color: %s\n", colorname(color)); grid_dim = BOARD_DIM; reset(); }
LUALIB_API int lua_client_getDisplayName(lua_State *L) { LUA_GETUSER(L); lua_pushstring(L, colorname(cref->ci)); return 1; }
static int getboard(int mincolor) { char msg[1024]; int i; sendreturn_t *sres; int xymondresult; if (!boardmaster) { sprintf(msg, "xymondboard acklevel=%d fields=hostname,testname,color,lastchange,logtime,validtime,acklist color=%s", critacklevel,colorname(mincolor)); for (i=mincolor+1; (i < COL_COUNT); i++) sprintf(msg+strlen(msg), ",%s", colorname(i)); sres = newsendreturnbuf(1, NULL); xymondresult = sendmessage(msg, NULL, XYMON_TIMEOUT, sres); if (xymondresult != XYMONSEND_OK) { boardmaster = ""; freesendreturnbuf(sres); errormsg("Unable to fetch current status\n"); return 1; } else { boardmaster = getsendreturnstr(sres, 1); freesendreturnbuf(sres); } } return 0; }
static void zvse_paging_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *pagingstr) { char *p; int ipagerate, pagingyellow, pagingred; float fpagerate=0.0; char pagingresult[100]; int pagingcolor = COL_GREEN; char msgline[4096]; strbuffer_t *upmsg; if (!pagingstr) return; /* * Looking for Paging rate in message * Page Rate=0.00 /sec */ *pagingresult = '\0'; ipagerate=0; p = strstr(pagingstr, "Page Rate=") + 10; if (p) { if (sscanf(p, "%f", &fpagerate) == 1) { ipagerate=fpagerate + 0.5; /* Rounding up */ sprintf(pagingresult, "z/VSE Paging Rate %d per second\n", ipagerate); } } else sprintf(pagingresult, "Can not find page rate value in:\n%s\n", pagingstr); get_paging_thresholds(hinfo, clientclass, &pagingyellow, &pagingred); upmsg = newstrbuffer(0); if (ipagerate > pagingred) { pagingcolor = COL_RED; addtobuffer(upmsg, "&red Paging Rate is CRITICAL\n"); } else if (ipagerate > pagingyellow) { pagingcolor = COL_YELLOW; addtobuffer(upmsg, "&yellow Paging Rate is HIGH\n"); } init_status(pagingcolor); sprintf(msgline, "status %s.paging %s %s %s %s\n", commafy(hostname), colorname(pagingcolor), (timestr ? timestr : "<no timestamp data>"), pagingresult, pagingstr); addtostatus(msgline); if (STRBUFLEN(upmsg)) { addtostrstatus(upmsg); addtostatus("\n"); } if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(upmsg); }
void init(fpsent *d, int at, int ocn, int sk, int bn, int pm, int pc, const char *name, const char *team) { loadwaypoints(); fpsent *o = newclient(ocn); d->aitype = at; bool resetthisguy = false; if(!d->name[0]) { if(aidebug) conoutf("%s assigned to %s at skill %d", colorname(d, name), o ? colorname(o) : "?", sk); else conoutf("\f0join:\f7 %s", colorname(d, name)); resetthisguy = true; } else { if(d->ownernum != ocn) { if(aidebug) conoutf("%s reassigned to %s", colorname(d, name), o ? colorname(o) : "?"); resetthisguy = true; } if(d->skill != sk && aidebug) conoutf("%s changed skill to %d", colorname(d, name), sk); } copystring(d->name, name, MAXNAMELEN+1); copystring(d->team, team, MAXTEAMLEN+1); d->ownernum = ocn; d->skill = sk; d->playermodel = chooserandomplayermodel(pm); if(pc < NUMPCS) d->pclass = pc; else conoutf("ERROR: %d", pc); if(resetthisguy) removeweapons(d); if(d->ownernum >= 0 && player1->clientnum == d->ownernum) { create(d); if(d->ai) { d->ai->views[0] = viewfieldx(d->skill); d->ai->views[1] = viewfieldy(d->skill); d->ai->views[2] = viewdist(d->skill); } } else if(d->ai) destroy(d); }
void print_header(void) { /* It's ok with these hardcoded values, as they are not used for this page */ sethostenv("", "", "", colorname(COL_BLUE), NULL); printf("Content-Type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); headfoot(stdout, "findhost", "", "header", COL_BLUE); printf("<br><br><CENTER><TABLE CELLPADDING=5 SUMMARY=\"Hostlist\">\n"); printf("<tr><th align=left>Hostname (DisplayName)</th><th align=left>Location (Group Name)</th></tr>\n"); }
void game_t::print_order() { int i; printf("order: {"); for (i = 0; i < num_in_order; i++) { printf("%s,", colorname(order[i])); } printf("}\n"); }
static void generate_histlog_table(FILE *htmlrep, char *hostname, char *service, int entrycount, replog_t *loghead) { char *bgcols[2] = { "\"#000000\"", "\"#000033\"" }; int curbg = 0; replog_t *walk; fprintf(htmlrep, "<TABLE BORDER=0 BGCOLOR=\"#333333\" CELLSPACING=3 SUMMARY=\"History logs\">\n"); fprintf(htmlrep, "<TR>\n"); if (entrycount) { fprintf(htmlrep, "<TD COLSPAN=3 ALIGN=CENTER><B>Last %d log entries</B> ", entrycount); fprintf(htmlrep, "<A HREF=\"%s&ENDTIME=%u&PIXELS=%d&ENTRIES=all\">(Full HTML log)</A></TD>\n", selfurl, (unsigned int)req_endtime, (usepct ? 0 : pixels)); } else { fprintf(htmlrep, "<TD COLSPAN=3 ALIGN=CENTER><B>All log entries</B></TD>\n"); } fprintf(htmlrep, "</TR>\n"); fprintf(htmlrep, "<TR BGCOLOR=\"#333333\">\n"); fprintf(htmlrep, "<TD ALIGN=CENTER><FONT %s><B>Date</B></FONT></TD>\n", xgetenv("MKBBCOLFONT")); fprintf(htmlrep, "<TD ALIGN=CENTER><FONT %s><B>Status</B></FONT></TD>\n", xgetenv("MKBBCOLFONT")); fprintf(htmlrep, "<TD ALIGN=CENTER><FONT %s><B>Duration</B></FONT></TD>\n", xgetenv("MKBBCOLFONT")); fprintf(htmlrep, "</TR>\n"); for (walk = loghead; (walk); walk = walk->next) { char start[30]; strftime(start, sizeof(start), "%a %b %d %H:%M:%S %Y", localtime(&walk->starttime)); fprintf(htmlrep, "<TR BGCOLOR=%s>\n", bgcols[curbg]); curbg = (1-curbg); fprintf(htmlrep, "<TD ALIGN=LEFT NOWRAP>%s</TD>\n", start); fprintf(htmlrep, "<TD ALIGN=CENTER BGCOLOR=\"#000000\">"); fprintf(htmlrep, "<A HREF=\"%s\">", histlogurl(hostname, service, 0, walk->timespec)); fprintf(htmlrep, "<IMG SRC=\"%s/%s\" ALT=\"%s\" TITLE=\"%s\" HEIGHT=%s WIDTH=%s BORDER=0>", xgetenv("BBSKIN"), dotgiffilename(walk->color, 0, 1), colorname(walk->color), colorname(walk->color), xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH")); fprintf(htmlrep, "</A></TD>\n"); fprintf(htmlrep, "<TD ALIGN=CENTER>%s</TD>\n", durationstr(walk->duration)); fprintf(htmlrep, "</TR>\n\n"); } fprintf(htmlrep, "</TABLE>\n"); }
static void zvm_paging_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *cpuutilstr) { char *p; int pagerate, pagingyellow, pagingred; char pagingresult[100]; int pagingcolor = COL_GREEN; char msgline[256]; strbuffer_t *upmsg; if (!cpuutilstr) return; /* * Looking for Paging rate info in 'IND' command response * PAGING-0000/SEC */ *pagingresult = '\0'; /* Skip past three newlines in message to the PAGING text */ p=strstr(cpuutilstr,"PAGING-") + 7; if (sscanf(p, "%d/SEC", &pagerate) == 1) { sprintf(pagingresult, "z/VM Paging Rate %d per second\n", pagerate); } get_paging_thresholds(hinfo, clientclass, &pagingyellow, &pagingred); upmsg = newstrbuffer(0); if (pagerate > pagingred) { pagingcolor = COL_RED; addtobuffer(upmsg, "&red Paging Rate is CRITICAL\n"); } else if (pagerate > pagingyellow) { pagingcolor = COL_YELLOW; addtobuffer(upmsg, "&yellow Paging Rate is HIGH\n"); } init_status(pagingcolor); sprintf(msgline, "status %s.paging %s %s %s %s\n", commafy(hostname), colorname(pagingcolor), (timestr ? timestr : "<no timestamp data>"), pagingresult, cpuutilstr); addtostatus(msgline); if (STRBUFLEN(upmsg)) { addtostrstatus(upmsg); addtostatus("\n"); } if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(upmsg); }
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; }
QMenu* EventCanvas::genItemPopup(CItem* item)/*{{{*/ { QMenu* notePopup = new QMenu(this); QMenu* colorPopup = notePopup->addMenu(tr("Part Color")); QMenu* colorSub; for (int i = 0; i < NUM_PARTCOLORS; ++i) { QString colorname(config.partColorNames[i]); if(colorname.contains("menu:", Qt::CaseSensitive)) { colorSub = colorPopup->addMenu(colorname.replace("menu:", "")); } else { if(item->part()->colorIndex() == i) { colorname = QString(config.partColorNames[i]); colorPopup->setIcon(partColorIcons.at(i)); colorPopup->setTitle(colorSub->title()+": "+colorname); colorname = QString("* "+config.partColorNames[i]); QAction *act_color = colorSub->addAction(partColorIcons.at(i), colorname); act_color->setData(20 + i); } else { colorname = QString(" "+config.partColorNames[i]); QAction *act_color = colorSub->addAction(partColorIcons.at(i), colorname); act_color->setData(20 + i); } } } notePopup->addSeparator(); for (unsigned i = 0; i < 9; ++i) { if ((_canvasTools & (1 << i)) == 0) continue; QAction* act = notePopup->addAction(QIcon(*toolList[i].icon), tr(toolList[i].tip)); act->setData(1 << i); } return notePopup; }/*}}}*/
static void dump_criteria(criteria_t *crit, int isrecip) { if (crit->pagespec) printf("PAGE=%s ", crit->pagespec); if (crit->expagespec) printf("EXPAGE=%s ", crit->expagespec); if (crit->dgspec) printf("DISPLAYGROUP=%s ", crit->dgspec); if (crit->exdgspec) printf("EXDISPLAYGROUP=%s ", crit->exdgspec); if (crit->hostspec) printf("HOST=%s ", crit->hostspec); if (crit->exhostspec) printf("EXHOST=%s ", crit->exhostspec); if (crit->svcspec) printf("SERVICE=%s ", crit->svcspec); if (crit->exsvcspec) printf("EXSERVICE=%s ", crit->exsvcspec); if (crit->classspec) printf("CLASS=%s ", crit->classspec); if (crit->exclassspec) printf("EXCLASS=%s ", crit->exclassspec); if (crit->groupspec) printf("GROUP=%s ", crit->groupspec); if (crit->exgroupspec) printf("EXGROUP=%s ", crit->exgroupspec); if (crit->colors) { int i, first = 1; printf("COLOR="); for (i = 0; (i < COL_COUNT); i++) { if ((1 << i) & crit->colors) { dbgprintf("first=%d, i=%d\n", first, i); printf("%s%s", (first ? "" : ","), colorname(i)); first = 0; } } printf(" "); } if (crit->timespec) printf("TIME=%s ", crit->timespec); if (crit->minduration) printf("DURATION>%d ", (crit->minduration / 60)); if (crit->maxduration) printf("DURATION<%d ", (crit->maxduration / 60)); if (isrecip) { switch (crit->sendrecovered) { case SR_UNKNOWN: break; case SR_WANTED: printf("RECOVERED "); break; case SR_NOTWANTED: printf("NORECOVERED "); break; } switch (crit->sendnotice) { case SR_UNKNOWN: break; case SR_WANTED: printf("NOTICE "); break; case SR_NOTWANTED: printf("NONOTICE "); break; } } }
void egoresult(int color, char *egocolumn) { char msgline[1024]; char *timestamps = NULL; init_timestamp(); combo_start(); init_status(color); sprintf(msgline, "status %s.%s %s snmpcollect %s\n\n", xgetenv("MACHINE"), egocolumn, colorname(color), timestamp); addtostatus(msgline); sprintf(msgline, "Variables : %d\n", varcount); addtostatus(msgline); sprintf(msgline, "PDUs : %d\n", pducount); addtostatus(msgline); sprintf(msgline, "Responses : %d\n", okcount); addtostatus(msgline); sprintf(msgline, "Timeouts : %d\n", timeoutcount); addtostatus(msgline); sprintf(msgline, "Too big : %d\n", toobigcount); addtostatus(msgline); sprintf(msgline, "Errors : %d\n", errorcount); addtostatus(msgline); show_timestamps(×tamps); if (timestamps) { addtostatus(timestamps); xfree(timestamps); } finish_status(); combo_end(); }
static void dump_eventtree(void) { void *hwalk; elist_t *lwalk; ed_t *ewalk; for (hwalk = first_host(); (hwalk); hwalk = next_host(hwalk, 0)) { printf("%s\n", xmh_item(hwalk, XMH_HOSTNAME)); lwalk = (elist_t *)xmh_item(hwalk, XMH_DATA); while (lwalk) { printf("\t%s\n", lwalk->svc->name); ewalk = lwalk->head; while (ewalk) { printf("\t\t%ld->%ld = %6ld %s\n", (long) ewalk->event->changetime, (long) ewalk->event->eventtime, (long) ewalk->event->duration, colorname(ewalk->event->oldcolor)); ewalk = ewalk->next; } lwalk = lwalk->next; } } }
int do_request(void) { int color = 0; char timesincechange[100]; time_t logtime = 0, acktime = 0, disabletime = 0; char *log = NULL, *firstline = NULL, *sender = NULL, *clientid = NULL, *flags = NULL; /* These are free'd */ char *restofmsg = NULL, *ackmsg = NULL, *dismsg = NULL, *acklist=NULL; /* These are just used */ int ishtmlformatted = 0; int clientavail = 0; char *ip, *displayname; if (parse_query() != 0) return 1; { char *s; s = xgetenv("CLIENTLOGS"); if (s) { hostdatadir = (char *)malloc(strlen(s) + strlen(hostname) + 12); sprintf(hostdatadir, "%s/%s", s, hostname); } else { s = xgetenv("BBVAR"); hostdatadir = (char *)malloc(strlen(s) + strlen(hostname) + 12); sprintf(hostdatadir, "%s/hostdata/%s", s, hostname); } } if (outform == FRM_CLIENT) { if (source == SRC_HOBBITD) { char *hobbitdreq; int hobbitdresult; hobbitdreq = (char *)malloc(1024 + strlen(hostname) + (service ? strlen(service) : 0)); sprintf(hobbitdreq, "clientlog %s", hostname); if (service && *service) sprintf(hobbitdreq + strlen(hobbitdreq), " section=%s", service); hobbitdresult = sendmessage(hobbitdreq, NULL, NULL, &log, 1, BBTALK_TIMEOUT); if (hobbitdresult != BB_OK) { char errtxt[4096]; sprintf(errtxt, "Status not available: Req=%s, result=%d\n", hobbitdreq, hobbitdresult); errormsg(errtxt); return 1; } } else if (source == SRC_HISTLOGS) { char logfn[PATH_MAX]; FILE *fd; sprintf(logfn, "%s/%s", hostdatadir, tstamp); fd = fopen(logfn, "r"); if (fd) { struct stat st; int n; fstat(fileno(fd), &st); log = (char *)malloc(st.st_size + 1); n = fread(log, 1, st.st_size, fd); if (n >= 0) *(log+n) = '\0'; else *log = '\0'; fclose(fd); } } restofmsg = (log ? log : strdup("<No data>\n")); } else if ((strcmp(service, xgetenv("TRENDSCOLUMN")) == 0) || (strcmp(service, xgetenv("INFOCOLUMN")) == 0)) { loadhostdata(hostname, &ip, &displayname); ishtmlformatted = 1; sethostenv(displayname, ip, service, colorname(COL_GREEN), hostname); sethostenv_refresh(600); color = COL_GREEN; logtime = time(NULL); strcpy(timesincechange, "0 minutes"); if (strcmp(service, xgetenv("TRENDSCOLUMN")) == 0) { log = restofmsg = generate_trends(hostname); } else if (strcmp(service, xgetenv("INFOCOLUMN")) == 0) { log = restofmsg = generate_info(hostname); } } else if (source == SRC_HOBBITD) { char hobbitdreq[1024]; int hobbitdresult; char *items[20]; int icount; time_t logage, clntstamp; char *sumline, *msg, *p; sprintf(hobbitdreq, "hobbitdlog host=%s test=%s fields=hostname,testname,color,flags,lastchange,logtime,validtime,acktime,disabletime,sender,cookie,ackmsg,dismsg,client,acklist,BBH_IP,BBH_DISPLAYNAME,clntstamp", hostname, service); hobbitdresult = sendmessage(hobbitdreq, NULL, NULL, &log, 1, BBTALK_TIMEOUT); if ((hobbitdresult != BB_OK) || (log == NULL) || (strlen(log) == 0)) { errormsg("Status not available\n"); return 1; } sumline = log; p = strchr(log, '\n'); *p = '\0'; msg = (p+1); p = strchr(msg, '\n'); if (!p) { firstline = strdup(msg); restofmsg = NULL; } else { *p = '\0'; firstline = strdup(msg); restofmsg = (p+1); *p = '\n'; } memset(items, 0, sizeof(items)); p = gettok(sumline, "|"); icount = 0; while (p && (icount < 20)) { items[icount++] = p; p = gettok(NULL, "|"); } /* * hostname, [0] * testname, [1] * color, [2] * flags, [3] * lastchange, [4] * logtime, [5] * validtime, [6] * acktime, [7] * disabletime, [8] * sender, [9] * cookie, [10] * ackmsg, [11] * dismsg, [12] * client, [13] * acklist [14] * BBH_IP [15] * BBH_DISPLAYNAME [16] * clienttstamp [17] */ color = parse_color(items[2]); flags = strdup(items[3]); logage = time(NULL) - atoi(items[4]); timesincechange[0] = '\0'; p = timesincechange; if (logage > 86400) p += sprintf(p, "%d days,", (int) (logage / 86400)); p += sprintf(p, "%d hours, %d minutes", (int) ((logage % 86400) / 3600), (int) ((logage % 3600) / 60)); logtime = atoi(items[5]); if (items[7] && strlen(items[7])) acktime = atoi(items[7]); if (items[8] && strlen(items[8])) disabletime = atoi(items[8]); sender = strdup(items[9]); if (items[11] && strlen(items[11])) ackmsg = items[11]; if (ackmsg) nldecode(ackmsg); if (items[12] && strlen(items[12])) dismsg = items[12]; if (dismsg) nldecode(dismsg); if (items[13]) clientavail = (*items[13] == 'Y'); acklist = ((items[14] && *items[14]) ? strdup(items[14]) : NULL); ip = (items[15] ? items[15] : ""); displayname = ((items[16] && *items[16]) ? items[16] : hostname); clntstamp = ((items[17] && *items[17]) ? atol(items[17]) : 0); sethostenv(displayname, ip, service, colorname(COL_GREEN), hostname); sethostenv_refresh(60); } else if (source == SRC_HISTLOGS) { char logfn[PATH_MAX]; struct stat st; int fd; /* * Some clients (Unix disk reports) dont have a newline before the * "Status unchanged in ..." text. Most do, but at least Solaris and * AIX do not. So just look for the text, not the newline. */ char *statusunchangedtext = "Status unchanged in "; char *receivedfromtext = "Message received from "; char *clientidtext = "Client data ID "; char *p, *unchangedstr, *receivedfromstr, *clientidstr, *hostnamedash; int n; if (!tstamp) errormsg("Invalid request"); loadhostdata(hostname, &ip, &displayname); hostnamedash = strdup(hostname); p = hostnamedash; while ((p = strchr(p, '.')) != NULL) *p = '_'; p = hostnamedash; while ((p = strchr(p, ',')) != NULL) *p = '_'; sprintf(logfn, "%s/%s/%s/%s", xgetenv("BBHISTLOGS"), hostnamedash, service, tstamp); xfree(hostnamedash); p = tstamp; while ((p = strchr(p, '_')) != NULL) *p = ' '; sethostenv_histlog(tstamp); if (stat(logfn, &st) == -1) { errormsg("Historical status log not available\n"); return 1; } fd = open(logfn, O_RDONLY); if (fd < 0) { errormsg("Unable to access historical logfile\n"); return 1; } log = (char *)malloc(st.st_size+1); n = read(fd, log, st.st_size); if (n >= 0) *(log+n) = '\0'; else *log = '\0'; close(fd); p = strchr(log, '\n'); if (!p) { firstline = strdup(log); restofmsg = NULL; } else { *p = '\0'; firstline = strdup(log); restofmsg = (p+1); *p = '\n'; } color = parse_color(log); p = strstr(log, "<!-- [flags:"); if (p) { p += strlen("<!-- [flags:"); n = strspn(p, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); flags = (char *)malloc(n+1); strncpy(flags, p, n); *(flags + n) = '\0'; } timesincechange[0] = '\0'; p = clientidstr = strstr(restofmsg, clientidtext); if (p) { p += strlen(clientidtext); n = strspn(p, "0123456789"); clientid = (char *)malloc(n+1); strncpy(clientid, p, n); *(clientid+n) = '\0'; } p = unchangedstr = strstr(restofmsg, statusunchangedtext); if (p) { p += strlen(statusunchangedtext); n = strcspn(p, "\n"); if (n >= sizeof(timesincechange)) n = sizeof(timesincechange); strncpy(timesincechange, p, n); timesincechange[n] = '\0'; } p = receivedfromstr = strstr(restofmsg, receivedfromtext); if (p) { p += strlen(receivedfromtext); n = strspn(p, "0123456789."); sender = (char *)malloc(n+1); strncpy(sender, p, n); *(sender+n) = '\0'; } /* Kill the "Status unchanged ..." and "Message received ..." lines */ if (unchangedstr) *unchangedstr = '\0'; if (receivedfromstr) *receivedfromstr = '\0'; } if (outform == FRM_CLIENT) { fprintf(stdout, "Content-type: text/plain\n\n"); fprintf(stdout, "%s", restofmsg); } else { if (clientid && (source == SRC_HISTLOGS)) { char logfn[PATH_MAX]; struct stat st; sprintf(logfn, "%s/%s", hostdatadir, clientid); clientavail = (stat(logfn, &st) == 0); if (clientavail) { sprintf(clienturi + strlen(clienturi), "&TIMEBUF=%s", clientid); } } fprintf(stdout, "Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); generate_html_log(hostname, displayname, service, ip, color, (sender ? sender : "Hobbit"), (flags ? flags : ""), logtime, timesincechange, (firstline ? firstline : ""), (restofmsg ? restofmsg : ""), acktime, ackmsg, acklist, disabletime, dismsg, (source == SRC_HISTLOGS), wantserviceid, ishtmlformatted, (source == SRC_HOBBITD), multigraphs, (clientavail ? clienturi : NULL), nkprio, nkttgroup, nkttextra, stdout); } /* Cleanup CGI params */ if (hostname) xfree(hostname); if (service) xfree(service); if (tstamp) xfree(tstamp); /* Cleanup main vars */ if (clientid) xfree(clientid); if (sender) xfree(sender); if (flags) xfree(flags); if (firstline) xfree(firstline); if (log) xfree(log); return 0; }
void send_summaries(summary_t *sumhead) { summary_t *s; for (s = sumhead; (s); s = s->next) { char *suburl; int summarycolor = -1; char *summsg; /* Decide which page to pick the color from for this summary. */ suburl = s->url; if (strncmp(suburl, "http://", 7) == 0) { char *p; /* Skip hostname part */ suburl += 7; /* Skip "http://" */ p = strchr(suburl, '/'); /* Find next '/' */ if (p) suburl = p; } if (strncmp(suburl, xgetenv("XYMONWEB"), strlen(xgetenv("XYMONWEB"))) == 0) suburl += strlen(xgetenv("XYMONWEB")); if (*suburl == '/') suburl++; dbgprintf("summ1: s->url=%s, suburl=%s\n", s->url, suburl); if (strcmp(suburl, "xymon.html") == 0) summarycolor = xymon_color; else if (strcmp(suburl, "index.html") == 0) summarycolor = xymon_color; else if (strcmp(suburl, "") == 0) summarycolor = xymon_color; else if (strcmp(suburl, "nongreen.html") == 0) summarycolor = nongreen_color; else if (strcmp(suburl, "critical.html") == 0) summarycolor = critical_color; else { /* * Specific page - find it in the page tree. */ char *p, *pg; xymongen_page_t *pgwalk; xymongen_page_t *sourcepg = NULL; char *urlcopy = strdup(suburl); /* * Walk the page tree */ pg = urlcopy; sourcepg = pagehead; do { p = strchr(pg, '/'); if (p) *p = '\0'; dbgprintf("Searching for page %s\n", pg); for (pgwalk = sourcepg->subpages; (pgwalk && (strcmp(pgwalk->name, pg) != 0)); pgwalk = pgwalk->next); if (pgwalk != NULL) { sourcepg = pgwalk; if (p) { *p = '/'; pg = p+1; } else pg = NULL; } else pg = NULL; } while (pg); dbgprintf("Summary search for %s found page %s (title:%s), color %d\n", suburl, sourcepg->name, sourcepg->title, sourcepg->color); summarycolor = sourcepg->color; xfree(urlcopy); } if (summarycolor == -1) { errprintf("Could not determine sourcepage for summary %s\n", s->url); summarycolor = pagehead->color; } /* Send the summary message */ summsg = (char *)malloc(1024 + strlen(s->name) + strlen(s->url) + strlen(timestamp)); sprintf(summsg, "summary summary.%s %s %s %s", s->name, colorname(summarycolor), s->url, timestamp); sendmessage(summsg, s->receiver, XYMON_TIMEOUT, NULL); xfree(summsg); } }
void do_wml_cards(char *webdir) { FILE *nongreenfd, *hostfd; char nongreenfn[PATH_MAX], hostfn[PATH_MAX]; hostlist_t *h; entry_t *t; int nongreenwapcolor; long wmlmaxchars = 1500; int nongreenpart = 1; /* Determine where the WML files go */ sprintf(wmldir, "%s/wml", webdir); /* Make sure the WML directory exists */ if (chdir(wmldir) != 0) mkdir(wmldir, 0755); if (chdir(wmldir) != 0) { errprintf("Cannot access or create the WML output directory %s\n", wmldir); return; } /* Make sure this is set sensibly */ if (xgetenv("WMLMAXCHARS")) { wmlmaxchars = atol(xgetenv("WMLMAXCHARS")); } /* * Cleanup cards that are too old. */ delete_old_cards(wmldir); /* * Find all the test entries that belong on the WAP page, * and calculate the color for the nongreen wap page. * * We want only tests that have the "onwap" flag set, i.e. * tests given in the "WAP:test,..." for this host (of the * "NK:test,..." if no WAP list). * * At the same time, generate the WML card for the tests, * corresponding to the HTML file for the test logfile. */ nongreenwapcolor = COL_GREEN; for (h = hostlistBegin(); (h); h = hostlistNext()) { h->hostentry->wapcolor = COL_GREEN; for (t = h->hostentry->entries; (t); t = t->next) { if (t->onwap && ((t->color == COL_RED) || (t->color == COL_YELLOW))) { generate_wml_statuscard(h->hostentry, t); h->hostentry->anywaps = 1; } else { /* Clear the onwap flag - makes testing later a bit simpler */ t->onwap = 0; } if (t->onwap && (t->color > h->hostentry->wapcolor)) h->hostentry->wapcolor = t->color; } /* Update the nongreenwapcolor */ if ( (h->hostentry->wapcolor == COL_RED) || (h->hostentry->wapcolor == COL_YELLOW) ) { if (h->hostentry->wapcolor > nongreenwapcolor) nongreenwapcolor = h->hostentry->wapcolor; } } /* Start the non-green WML card */ sprintf(nongreenfn, "%s/nongreen.wml.tmp", wmldir); nongreenfd = fopen(nongreenfn, "w"); if (nongreenfd == NULL) { errprintf("Cannot open non-green WML file %s\n", nongreenfn); return; } /* Standard non-green wap header */ wml_header(nongreenfd, "card", nongreenpart); fprintf(nongreenfd, "<p align=\"center\" mode=\"nowrap\">\n"); fprintf(nongreenfd, "%s</p>\n", timestamp); fprintf(nongreenfd, "<p align=\"center\" mode=\"nowrap\">\n"); fprintf(nongreenfd, "Summary Status<br/><b>%s</b><br/><br/>\n", colorname(nongreenwapcolor)); /* All green ? Just say so */ if (nongreenwapcolor == COL_GREEN) { fprintf(nongreenfd, "All is OK<br/>\n"); } /* Now loop through the hostlist again, and generate the nongreen WAP links and host pages */ for (h = hostlistBegin(); (h); h = hostlistNext()) { if (h->hostentry->anywaps) { /* Create the host WAP card, with links to individual test results */ sprintf(hostfn, "%s/%s.wml", wmldir, h->hostentry->hostname); hostfd = fopen(hostfn, "w"); if (hostfd == NULL) { errprintf("Cannot create file %s\n", hostfn); return; } wml_header(hostfd, "name", 1); fprintf(hostfd, "<p align=\"center\">\n"); fprintf(hostfd, "<anchor title=\"XYMON\">Overall<go href=\"nongreen.wml\"/></anchor><br/>\n"); fprintf(hostfd, "%s</p>\n", timestamp); fprintf(hostfd, "<p align=\"left\" mode=\"nowrap\">\n"); fprintf(hostfd, "<b>%s</b><br/><br/>\n", h->hostentry->hostname); for (t = h->hostentry->entries; (t); t = t->next) { if (t->onwap) { fprintf(hostfd, "<b><anchor title=\"%s\">%s%s<go href=\"%s.%s.wml\"/></anchor></b> %s<br/>\n", t->column->name, wml_colorname(t->color), (t->acked ? "x" : ""), h->hostentry->hostname, t->column->name, t->column->name); } } fprintf(hostfd, "\n</p> </card> </wml>\n"); fclose(hostfd); /* Create the link from the nongreen wap card to the host card */ fprintf(nongreenfd, "<b><anchor title=\"%s\">%s<go href=\"%s.wml\"/></anchor></b> %s<br/>\n", h->hostentry->hostname, wml_colorname(h->hostentry->wapcolor), h->hostentry->hostname, h->hostentry->hostname); /* * Gross hack. Some WAP phones cannot handle large cards. * So if the card grows larger than WMLMAXCHARS, split it into * multiple files and link from one file to the next. */ if (ftello(nongreenfd) >= wmlmaxchars) { char oldnongreenfn[PATH_MAX]; /* WML link is from the nongreenfd except leading wmldir+'/' */ strcpy(oldnongreenfn, nongreenfn+strlen(wmldir)+1); nongreenpart++; fprintf(nongreenfd, "<br /><b><anchor title=\"Next\">Next<go href=\"nongreen-%d.wml\"/></anchor></b>\n", nongreenpart); fprintf(nongreenfd, "</p> </card> </wml>\n"); fclose(nongreenfd); /* Start a new Nongreen WML card */ sprintf(nongreenfn, "%s/nongreen-%d.wml", wmldir, nongreenpart); nongreenfd = fopen(nongreenfn, "w"); if (nongreenfd == NULL) { errprintf("Cannot open Nongreen WML file %s\n", nongreenfd); return; } wml_header(nongreenfd, "card", nongreenpart); fprintf(nongreenfd, "<p align=\"center\">\n"); fprintf(nongreenfd, "<anchor title=\"Prev\">Previous<go href=\"%s\"/></anchor><br/>\n", oldnongreenfn); fprintf(nongreenfd, "%s</p>\n", timestamp); fprintf(nongreenfd, "<p align=\"center\" mode=\"nowrap\">\n"); fprintf(nongreenfd, "Summary Status<br/><b>%s</b><br/><br/>\n", colorname(nongreenwapcolor)); } } } fprintf(nongreenfd, "</p> </card> </wml>\n"); fclose(nongreenfd); if (chdir(wmldir) == 0) { /* Rename the top-level file into place now */ rename("nongreen.wml.tmp", "nongreen.wml"); /* Make sure there is the index.wml file pointing to nongreen.wml */ if (!symlink("nongreen.wml", "index.wml")) { errprintf("symlink nongreen.xml->index.wml failed: %s\n", strerror(errno)); } } return; }
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; }
void generate_replog(FILE *htmlrep, FILE *textrep, char *textrepurl, char *hostname, char *service, int color, int style, char *ip, char *displayname, time_t st, time_t end, double reportwarnlevel, double reportgreenlevel, int reportwarnstops, reportinfo_t *repinfo) { replog_t *walk; char *bgcols[2] = { "\"#000000\"", "\"#000033\"" }; int curbg = 0; if (!displayname) displayname = hostname; sethostenv(displayname, ip, service, colorname(color), hostname); sethostenv_report(st, end, reportwarnlevel, reportgreenlevel); headfoot(htmlrep, "replog", "", "header", color); fprintf(htmlrep, "\n"); fprintf(htmlrep, "<CENTER>\n"); fprintf(htmlrep, "<BR><FONT %s>", xgetenv("XYMONPAGEROWFONT")); fprintf(htmlrep, "<B>%s - ", htmlquoted(displayname)); fprintf(htmlrep, "%s</B></FONT>\n", htmlquoted(service)); fprintf(htmlrep, "<TABLE BORDER=0 BGCOLOR=\"#333333\" CELLPADDING=3 SUMMARY=\"Availability percentages\">\n"); fprintf(htmlrep, "<TR>\n"); if (repinfo->withreport) { fprintf(htmlrep, "<TD COLSPAN=3><CENTER><BR><B>Availability (24x7): %.2f%%</B></CENTER></TD>\n", repinfo->fullavailability); fprintf(htmlrep, "<TD> </TD>\n"); fprintf(htmlrep, "<TD COLSPAN=3><CENTER><B>Availability (SLA): %.2f%%</B></CENTER></TD>\n", repinfo->reportavailability); } else { fprintf(htmlrep, "<TD COLSPAN=7><CENTER><B><BR>Availability: %.2f%%</B></CENTER></TD>\n", repinfo->fullavailability); } fprintf(htmlrep, "</TR>\n"); fprintf(htmlrep, "<TR BGCOLOR=\"#000033\">\n"); fprintf(htmlrep, "<TD> </TD>\n"); fprintf(htmlrep, "<TD ALIGN=CENTER><IMG SRC=\"%s/%s\" ALT=\"%s\" TITLE=\"%s\" HEIGHT=%s WIDTH=%s BORDER=0></TD>\n", xgetenv("XYMONSKIN"), dotgiffilename(COL_GREEN, 0, 1), colorname(COL_GREEN), colorname(COL_GREEN), xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH")); fprintf(htmlrep, "<TD ALIGN=CENTER><IMG SRC=\"%s/%s\" ALT=\"%s\" TITLE=\"%s\" HEIGHT=%s WIDTH=%s BORDER=0></TD>\n", xgetenv("XYMONSKIN"), dotgiffilename(COL_YELLOW, 0, 1), colorname(COL_YELLOW), colorname(COL_YELLOW), xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH")); fprintf(htmlrep, "<TD ALIGN=CENTER><IMG SRC=\"%s/%s\" ALT=\"%s\" TITLE=\"%s\" HEIGHT=%s WIDTH=%s BORDER=0></TD>\n", xgetenv("XYMONSKIN"), dotgiffilename(COL_RED, 0, 1), colorname(COL_RED), colorname(COL_RED), xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH")); fprintf(htmlrep, "<TD ALIGN=CENTER><IMG SRC=\"%s/%s\" ALT=\"%s\" TITLE=\"%s\" HEIGHT=%s WIDTH=%s BORDER=0></TD>\n", xgetenv("XYMONSKIN"), dotgiffilename(COL_PURPLE, 0, 1), colorname(COL_PURPLE), colorname(COL_PURPLE), xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH")); fprintf(htmlrep, "<TD ALIGN=CENTER><IMG SRC=\"%s/%s\" ALT=\"%s\" TITLE=\"%s\" HEIGHT=%s WIDTH=%s BORDER=0></TD>\n", xgetenv("XYMONSKIN"), dotgiffilename(COL_CLEAR, 0, 1), colorname(COL_CLEAR), colorname(COL_CLEAR), xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH")); fprintf(htmlrep, "<TD ALIGN=CENTER><IMG SRC=\"%s/%s\" ALT=\"%s\" TITLE=\"%s\" HEIGHT=%s WIDTH=%s BORDER=0></TD>\n", xgetenv("XYMONSKIN"), dotgiffilename(COL_BLUE, 0, 1), colorname(COL_BLUE), colorname(COL_BLUE), xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH")); fprintf(htmlrep, "</TR>\n"); fprintf(htmlrep, "<TR BGCOLOR=\"#000033\">\n"); fprintf(htmlrep, "<TD ALIGN=LEFT><B>24x7</B></TD>\n"); fprintf(htmlrep, "<TD ALIGN=CENTER><B>%.2f%%</B></TD>\n", repinfo->fullpct[COL_GREEN]); fprintf(htmlrep, "<TD ALIGN=CENTER><B>%.2f%%</B></TD>\n", repinfo->fullpct[COL_YELLOW]); fprintf(htmlrep, "<TD ALIGN=CENTER><B>%.2f%%</B></TD>\n", repinfo->fullpct[COL_RED]); fprintf(htmlrep, "<TD ALIGN=CENTER><B>%.2f%%</B></TD>\n", repinfo->fullpct[COL_PURPLE]); fprintf(htmlrep, "<TD ALIGN=CENTER><B>%.2f%%</B></TD>\n", repinfo->fullpct[COL_CLEAR]); fprintf(htmlrep, "<TD ALIGN=CENTER><B>%.2f%%</B></TD>\n", repinfo->fullpct[COL_BLUE]); fprintf(htmlrep, "</TR>\n"); if (repinfo->withreport) { fprintf(htmlrep, "<TR BGCOLOR=\"#000033\">\n"); fprintf(htmlrep, "<TD ALIGN=LEFT><B>SLA (%.2f)</B></TD>\n", reportwarnlevel); fprintf(htmlrep, "<TD ALIGN=CENTER><B>%.2f%%</B></TD>\n", repinfo->reportpct[COL_GREEN]); fprintf(htmlrep, "<TD ALIGN=CENTER><B>%.2f%%</B></TD>\n", repinfo->reportpct[COL_YELLOW]); fprintf(htmlrep, "<TD ALIGN=CENTER><B>%.2f%%</B></TD>\n", repinfo->reportpct[COL_RED]); fprintf(htmlrep, "<TD ALIGN=CENTER>-</TD>\n"); fprintf(htmlrep, "<TD ALIGN=CENTER><B>%.2f%%</B></TD>\n", repinfo->reportpct[COL_CLEAR]); fprintf(htmlrep, "<TD ALIGN=CENTER>-</TD>\n"); fprintf(htmlrep, "</TR>\n"); } fprintf(htmlrep, "<TR BGCOLOR=\"#000000\">\n"); fprintf(htmlrep, "<TD ALIGN=CENTER COLSPAN=2><B>Event count</B></TD>\n"); fprintf(htmlrep, "<TD ALIGN=CENTER><B>%d</B></TD>\n", repinfo->count[COL_YELLOW]); fprintf(htmlrep, "<TD ALIGN=CENTER><B>%d</B></TD>\n", repinfo->count[COL_RED]); fprintf(htmlrep, "<TD ALIGN=CENTER><B>%d</B></TD>\n", repinfo->count[COL_PURPLE]); fprintf(htmlrep, "<TD ALIGN=CENTER><B>%d</B></TD>\n", repinfo->count[COL_CLEAR]); fprintf(htmlrep, "<TD ALIGN=CENTER><B>%d</B></TD>\n", repinfo->count[COL_BLUE]); fprintf(htmlrep, "</TR>\n"); fprintf(htmlrep, "<TR BGCOLOR=\"#000000\">\n"); fprintf(htmlrep, "<TD COLSPAN=7 ALIGN=CENTER>\n"); fprintf(htmlrep, "<FONT %s><B>[Total may not equal 100%%]</B></FONT></TD> </TR>\n", xgetenv("XYMONPAGECOLFONT")); if (strcmp(repinfo->fstate, "NOTOK") == 0) { fprintf(htmlrep, "<TR BGCOLOR=\"#000000\">\n"); fprintf(htmlrep, "<TD COLSPAN=7 ALIGN=CENTER>\n"); fprintf(htmlrep, "<FONT %s><B>[History file contains invalid entries]</B></FONT></TD></TR>\n", xgetenv("XYMONPAGECOLFONT")); } fprintf(htmlrep, "</TABLE>\n"); fprintf(htmlrep, "</CENTER>\n"); /* Text-based report start */ if (textrep) { char text_starttime[20], text_endtime[20]; fprintf(textrep, "Availability Report\n"); strftime(text_starttime, sizeof(text_starttime), "%b %d %Y", localtime(&st)); strftime(text_endtime, sizeof(text_endtime), "%b %d %Y", localtime(&end)); if (strcmp(text_starttime, text_endtime) == 0) fprintf(textrep, "%s\n", text_starttime); else fprintf(textrep, "%s - %s\n", text_starttime, text_endtime); fprintf(textrep, "\n"); fprintf(textrep, "\n"); fprintf(textrep, " %s - %s\n", displayname, service); fprintf(textrep, "\n"); if (repinfo->withreport) { fprintf(textrep, " Availability (24x7) : %.2f%%\n", repinfo->fullavailability); fprintf(textrep, " Availability (SLA) : %.2f%%\n", repinfo->reportavailability); } else { fprintf(textrep, " Availability: %.2f%%\n", repinfo->fullavailability); } fprintf(textrep, " Green Yellow Red Purple Clear Blue\n"); fprintf(textrep, " 24x7 %.2f%% %.2f%% %.2f%% %.2f%% %.2f%% %.2f%%\n", repinfo->fullpct[COL_GREEN], repinfo->fullpct[COL_YELLOW], repinfo->fullpct[COL_RED], repinfo->fullpct[COL_PURPLE], repinfo->fullpct[COL_CLEAR], repinfo->fullpct[COL_BLUE]); if (repinfo->withreport) { fprintf(textrep, " SLA %.2f%% %.2f%% %.2f%% - %.2f%% - \n", repinfo->reportpct[COL_GREEN], repinfo->reportpct[COL_YELLOW], repinfo->reportpct[COL_RED], repinfo->reportpct[COL_CLEAR]); } fprintf(textrep, " Events %d %d %d %d %d %d\n", repinfo->count[COL_GREEN], repinfo->count[COL_YELLOW], repinfo->count[COL_RED], repinfo->count[COL_PURPLE], repinfo->count[COL_CLEAR], repinfo->count[COL_BLUE]); fprintf(textrep, "\n"); fprintf(textrep, "\n"); fprintf(textrep, " Event logs for the given period\n"); fprintf(textrep, "\n"); fprintf(textrep, "Event Start Event End Status Duration (Seconds) Cause\n"); fprintf(textrep, "\n"); fprintf(textrep, "\n"); } fprintf(htmlrep, "<BR><BR>\n"); fprintf(htmlrep, "<CENTER>\n"); fprintf(htmlrep, "<TABLE BORDER=0 BGCOLOR=\"#333333\" CELLSPACING=3 SUMMARY=\"Event table\">\n"); fprintf(htmlrep, "<TR>\n"); fprintf(htmlrep, "<TD COLSPAN=5><CENTER>Event logs for the given period</CENTER></TD>\n"); fprintf(htmlrep, "</TR>\n"); fprintf(htmlrep, "<TR BGCOLOR=\"#333333\">\n"); fprintf(htmlrep, "<TD ALIGN=CENTER><FONT %s><B>Event Start</B></FONT></TD>\n", xgetenv("XYMONPAGECOLFONT")); fprintf(htmlrep, "<TD ALIGN=CENTER><FONT %s><B>Event End</B></FONT></TD>\n", xgetenv("XYMONPAGECOLFONT")); fprintf(htmlrep, "<TD ALIGN=CENTER><FONT %s><B>Status</B></FONT></TD>\n", xgetenv("XYMONPAGECOLFONT")); fprintf(htmlrep, "<TD ALIGN=CENTER><FONT %s><B>Duration</B></FONT></TD>\n", xgetenv("XYMONPAGECOLFONT")); fprintf(htmlrep, "<TD ALIGN=CENTER><FONT %s><B>Cause</B></FONT></TD>\n", xgetenv("XYMONPAGECOLFONT")); fprintf(htmlrep, "</TR>\n"); for (walk = reploghead; (walk); walk = walk->next) { int wanted = 0; switch (style) { case STYLE_CRIT: wanted = (walk->color == COL_RED); break; case STYLE_NONGR: wanted = (walk->color != COL_GREEN); break; case STYLE_OTHER: wanted = 1; } if (wanted) { char start[30]; char end[30]; time_t endtime; int angrygif = (repinfo->withreport && walk->affectssla); strftime(start, sizeof(start), "%a %b %d %H:%M:%S %Y", localtime(&walk->starttime)); endtime = walk->starttime + walk->duration; strftime(end, sizeof(end), "%a %b %d %H:%M:%S %Y", localtime(&endtime)); fprintf(htmlrep, "<TR BGCOLOR=%s>\n", bgcols[curbg]); curbg = (1-curbg); fprintf(htmlrep, "<TD ALIGN=LEFT NOWRAP>%s</TD>\n", start); fprintf(htmlrep, "<TD ALIGN=RIGHT NOWRAP>%s</TD>\n", end); fprintf(htmlrep, "<TD ALIGN=CENTER BGCOLOR=\"#000000\">"); fprintf(htmlrep, "<A HREF=\"%s\">", histlogurl(hostname, service, 0, walk->timespec)); fprintf(htmlrep, "<IMG SRC=\"%s/%s\" ALT=\"%s\" TITLE=\"%s\" HEIGHT=%s WIDTH=%s BORDER=0>", xgetenv("XYMONSKIN"), dotgiffilename(walk->color, 0, !angrygif), colorname(walk->color), colorname(walk->color), xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH")); fprintf(htmlrep, "</A></TD>\n"); fprintf(htmlrep, "<TD ALIGN=CENTER>%s</TD>\n", durationstr(walk->duration)); fprintf(htmlrep, "<TD>%s</TD>\n", walk->cause); fprintf(htmlrep, "</TR>\n\n"); /* And the text-report */ if (textrep) { fprintf(textrep, "%s %s %s %s %u ", start, end, colorname(walk->color), durationstr(walk->duration), (unsigned int)walk->duration); if (walk->cause) { char *p; for (p=walk->cause; (p && *p); ) { if (*p == '<') { p = strchr(p, '>'); if (p) p++; } else if (*p != '\n') { fprintf(textrep, "%c", *p); p++; } else p++; } fprintf(textrep, "\n"); } } } } fprintf(htmlrep, "<TR><TD ALIGN=RIGHT BGCOLOR=\"#000033\" COLSPAN=3>\n"); fprintf(htmlrep, "<B>Time Critical/Offline (24x7):</B></TD>\n"); fprintf(htmlrep, "<TD ALIGN=LEFT NOWRAP COLSPAN=2>%s</TD></TR>\n", durationstr(repinfo->fullduration[COL_RED])); if (style != STYLE_CRIT) { fprintf(htmlrep, "<TR><TD ALIGN=RIGHT BGCOLOR=\"#000033\" COLSPAN=3>\n"); fprintf(htmlrep, "<B>Time Non-Critical (24x7):</B></TD>\n"); fprintf(htmlrep, "<TD ALIGN=LEFT NOWRAP COLSPAN=2>%s</TD></TR>\n", durationstr(repinfo->fullduration[COL_YELLOW] + repinfo->fullduration[COL_PURPLE] + repinfo->fullduration[COL_CLEAR] + repinfo->fullduration[COL_BLUE])); } if (repinfo->withreport) { fprintf(htmlrep, "<TR><TD ALIGN=RIGHT BGCOLOR=\"#000033\" COLSPAN=3>\n"); fprintf(htmlrep, "<B>Time Critical/Offline (SLA):</B></TD>\n"); fprintf(htmlrep, "<TD ALIGN=LEFT NOWRAP COLSPAN=2>%s</TD></TR>\n", durationstr(repinfo->reportduration[COL_RED])); if (style != STYLE_CRIT) { fprintf(htmlrep, "<TR><TD ALIGN=RIGHT BGCOLOR=\"#000033\" COLSPAN=3>\n"); fprintf(htmlrep, "<B>Time Non-Critical (SLA):</B></TD>\n"); fprintf(htmlrep, "<TD ALIGN=LEFT NOWRAP COLSPAN=2>%s</TD></TR>\n", durationstr(repinfo->reportduration[COL_YELLOW])); } } /* And the text report ... */ if (textrep) { fprintf(textrep, "\n"); fprintf(textrep, "\n"); fprintf(textrep, " %s %s (%lu secs)\n", "Time Critical/Offline (24x7):", durationstr(repinfo->fullduration[COL_RED]), repinfo->fullduration[COL_RED]); if (style != STYLE_CRIT) { fprintf(textrep, " %s %s (%lu secs)\n", "Time Non-Critical (24x7):", durationstr(repinfo->fullduration[COL_YELLOW] + repinfo->fullduration[COL_PURPLE] + repinfo->fullduration[COL_CLEAR] + repinfo->fullduration[COL_BLUE]), (repinfo->fullduration[COL_YELLOW] + repinfo->fullduration[COL_PURPLE] + repinfo->fullduration[COL_CLEAR] + repinfo->fullduration[COL_BLUE])); } if (repinfo->withreport) { fprintf(textrep, "\n"); fprintf(textrep, "\n"); fprintf(textrep, " %s %s (%lu secs)\n", "Time Critical/Offline (SLA) :", durationstr(repinfo->reportduration[COL_RED]), repinfo->reportduration[COL_RED]); if (style != STYLE_CRIT) { fprintf(textrep, " %s %s (%lu secs)\n", "Time Non-Critical (SLA) :", durationstr(repinfo->reportduration[COL_YELLOW]), repinfo->fullduration[COL_YELLOW]); } } } fprintf(htmlrep, "</TABLE>\n"); fprintf(htmlrep, "<BR><BR>\n"); fprintf(htmlrep, "<BR><BR><CENTER><FONT COLOR=yellow>\n"); fprintf(htmlrep, "<A HREF=\"%s\">Click here for text-based availability report</A>\n", textrepurl); fprintf(htmlrep, "</FONT></CENTER><BR><BR>\n"); /* XYMONREPEXT extensions */ do_extensions(htmlrep, "XYMONREPEXT", "rep"); fprintf(htmlrep, "</CENTER>\n"); headfoot(htmlrep, "replog", "", "footer", color); }
int main(int argc, char *argv[]) { int argi, hosti, testi; char *pagepattern = NULL, *hostpattern = NULL; char *envarea = NULL, *cookie = NULL, *nexthost; char *hobbitcmd, *procscmd, *svcscmd; int alertcolors, alertinterval; char configfn[PATH_MAX]; char *respbuf = NULL, *procsbuf = NULL, *svcsbuf = NULL; hostlist_t *hwalk; htnames_t *twalk; hostlist_t **allhosts = NULL; htnames_t **alltests = NULL; int hostcount = 0, maxtests = 0; time_t now = getcurrenttime(NULL); sendreturn_t *sres; 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 (argnmatch(argv[argi], "--delimiter=")) { char *p = strchr(argv[argi], '='); coldelim = strdup(p+1); } else if (strcmp(argv[argi], "--critical") == 0) { nkonly = 1; } else if (strcmp(argv[argi], "--old-nk-config") == 0) { newnkconfig = 0; } } redirect_cgilog("hobbit-confreport"); load_hostnames(xgetenv("BBHOSTS"), NULL, get_fqdn()); load_nkconfig(NULL); /* Setup the filter we use for the report */ cookie = get_cookie("pagepath"); if (cookie && *cookie) pagepattern = strdup(cookie); cookie = get_cookie("host"); if (cookie && *cookie) hostpattern = strdup(cookie); /* Fetch the list of host+test statuses we currently know about */ if (pagepattern) { hobbitcmd = (char *)malloc(2*strlen(pagepattern) + 1024); procscmd = (char *)malloc(2*strlen(pagepattern) + 1024); svcscmd = (char *)malloc(2*strlen(pagepattern) + 1024); sprintf(hobbitcmd, "hobbitdboard page=^%s$|^%s/.+ fields=hostname,testname", pagepattern, pagepattern); sprintf(procscmd, "hobbitdboard page=^%s$|^%s/.+ test=procs fields=hostname,msg", pagepattern, pagepattern); sprintf(svcscmd, "hobbitdboard page=^%s$|^%s/.+ test=svcs fields=hostname,msg", pagepattern, pagepattern); } else if (hostpattern) { hobbitcmd = (char *)malloc(strlen(hostpattern) + 1024); procscmd = (char *)malloc(strlen(hostpattern) + 1024); svcscmd = (char *)malloc(strlen(hostpattern) + 1024); sprintf(hobbitcmd, "hobbitdboard host=^%s$ fields=hostname,testname", hostpattern); sprintf(procscmd, "hobbitdboard host=^%s$ test=procs fields=hostname,msg", hostpattern); sprintf(svcscmd, "hobbitdboard host=^%s$ test=svcs fields=hostname,msg", hostpattern); } else { hobbitcmd = (char *)malloc(1024); procscmd = (char *)malloc(1024); svcscmd = (char *)malloc(1024); sprintf(hobbitcmd, "hobbitdboard fields=hostname,testname"); sprintf(procscmd, "hobbitdboard test=procs fields=hostname,msg"); sprintf(svcscmd, "hobbitdboard test=svcs fields=hostname,msg"); } sres = newsendreturnbuf(1, NULL); if (sendmessage(hobbitcmd, NULL, BBTALK_TIMEOUT, sres) != BB_OK) { errormsg("Cannot contact the Hobbit server\n"); return 1; } respbuf = getsendreturnstr(sres, 1); if (sendmessage(procscmd, NULL, BBTALK_TIMEOUT, sres) != BB_OK) { errormsg("Cannot contact the Hobbit server\n"); return 1; } procsbuf = getsendreturnstr(sres, 1); if (sendmessage(svcscmd, NULL, BBTALK_TIMEOUT, sres) != BB_OK) { errormsg("Cannot contact the Hobbit server\n"); return 1; } svcsbuf = getsendreturnstr(sres, 1); freesendreturnbuf(sres); if (!respbuf) { errormsg("Unable to find host information\n"); return 1; } /* Parse it into a usable list */ nexthost = respbuf; do { char *hname, *tname, *eoln; int wanted = 1; eoln = strchr(nexthost, '\n'); if (eoln) *eoln = '\0'; hname = nexthost; tname = strchr(nexthost, '|'); if (tname) { *tname = '\0'; tname++; } if (nkonly) { void *hinfo = hostinfo(hname); char *nkalerts = bbh_item(hinfo, BBH_NK); if (newnkconfig) { if (strcmp(nkval(hname, tname, nkalerts), "No") == 0 ) wanted = 0; } else { if (!nkalerts) wanted = 0; } } if (wanted && hname && tname && strcmp(hname, "summary") && strcmp(tname, xgetenv("INFOCOLUMN")) && strcmp(tname, xgetenv("TRENDSCOLUMN"))) { htnames_t *newitem = (htnames_t *)malloc(sizeof(htnames_t)); for (hwalk = hosthead; (hwalk && strcmp(hwalk->hostname, hname)); hwalk = hwalk->next); if (!hwalk) { hwalk = (hostlist_t *)calloc(1, sizeof(hostlist_t)); hwalk->hostname = strdup(hname); hwalk->procs = get_proclist(hname, procsbuf); hwalk->svcs = get_proclist(hname, svcsbuf); hwalk->next = hosthead; hosthead = hwalk; hostcount++; } newitem->name = strdup(tname); newitem->next = hwalk->tests; hwalk->tests = newitem; hwalk->testcount++; } if (eoln) { nexthost = eoln+1; if (*nexthost == '\0') nexthost = NULL; } } while (nexthost); allhosts = (hostlist_t **) malloc(hostcount * sizeof(hostlist_t *)); for (hwalk = hosthead, hosti=0; (hwalk); hwalk = hwalk->next, hosti++) { allhosts[hosti] = hwalk; if (hwalk->testcount > maxtests) maxtests = hwalk->testcount; } alltests = (htnames_t **) malloc(maxtests * sizeof(htnames_t *)); qsort(&allhosts[0], hostcount, sizeof(hostlist_t **), host_compare); /* Get the static info */ load_all_links(); init_tcp_services(); pingcolumn = xgetenv("PINGCOLUMN"); pingplus = (char *)malloc(strlen(pingcolumn) + 2); sprintf(pingplus, "%s=", pingcolumn); /* Load alert config */ alertcolors = colorset(xgetenv("ALERTCOLORS"), ((1 << COL_GREEN) | (1 << COL_BLUE))); alertinterval = 60*atoi(xgetenv("ALERTREPEAT")); sprintf(configfn, "%s/etc/hobbit-alerts.cfg", xgetenv("BBHOME")); load_alertconfig(configfn, alertcolors, alertinterval); load_columndocs(); printf("Content-Type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); sethostenv("", "", "", colorname(COL_BLUE), NULL); headfoot(stdout, "confreport", "", "header", COL_BLUE); fprintf(stdout, "<table width=\"100%%\" border=0>\n"); fprintf(stdout, "<tr><th align=center colspan=2><font size=\"+2\">Hobbit configuration Report</font></th></tr>\n"); fprintf(stdout, "<tr><th valign=top align=left>Date</th><td>%s</td></tr>\n", ctime(&now)); fprintf(stdout, "<tr><th valign=top align=left>%d hosts included</th><td>\n", hostcount); for (hosti=0; (hosti < hostcount); hosti++) { fprintf(stdout, "%s ", allhosts[hosti]->hostname); } fprintf(stdout, "</td></tr>\n"); if (nkonly) { fprintf(stdout, "<tr><th valign=top align=left>Filter</th><td>Only data for the "Critical Systems" view reported</td></tr>\n"); } fprintf(stdout, "</table>\n"); headfoot(stdout, "confreport", "", "front", COL_BLUE); for (hosti=0; (hosti < hostcount); hosti++) { for (twalk = allhosts[hosti]->tests, testi = 0; (twalk); twalk = twalk->next, testi++) { alltests[testi] = twalk; } qsort(&alltests[0], allhosts[hosti]->testcount, sizeof(htnames_t **), test_compare); print_host(allhosts[hosti], alltests, allhosts[hosti]->testcount); } headfoot(stdout, "confreport", "", "back", COL_BLUE); print_columndocs(); headfoot(stdout, "confreport", "", "footer", COL_BLUE); 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; }
void do_eventlog(FILE *output, int maxcount, int maxminutes, char *fromtime, char *totime, char *pageregex, char *expageregex, char *hostregex, char *exhostregex, char *testregex, char *extestregex, char *colrregex, int ignoredialups, f_hostcheck hostcheck, event_t **eventlist, countlist_t **hostcounts, countlist_t **servicecounts, countsummary_t counttype, eventsummary_t sumtype, char *periodstring) { FILE *eventlog; char eventlogfilename[PATH_MAX]; time_t firstevent = 0; time_t lastevent = getcurrenttime(NULL); event_t *eventhead = NULL; struct stat st; char l[MAX_LINE_LEN]; char title[200]; /* For the PCRE matching */ const char *errmsg = NULL; int errofs = 0; pcre *pageregexp = NULL; pcre *expageregexp = NULL; pcre *hostregexp = NULL; pcre *exhostregexp = NULL; pcre *testregexp = NULL; pcre *extestregexp = NULL; pcre *colrregexp = NULL; countlist_t *hostcounthead = NULL, *svccounthead = NULL; if (eventlist) *eventlist = NULL; if (hostcounts) *hostcounts = NULL; if (servicecounts) *servicecounts = NULL; havedoneeventlog = 1; if ((maxminutes > 0) && (fromtime || totime)) { fprintf(output, "<B>Only one time interval type is allowed!</B>"); return; } if (fromtime) { firstevent = eventreport_time(fromtime); if(firstevent < 0) { if (output) fprintf(output,"<B>Invalid 'from' time: %s</B>", htmlquoted(fromtime)); return; } } else if (maxminutes == -1) { /* Unlimited number of minutes */ firstevent = 0; } else if (maxminutes > 0) { firstevent = getcurrenttime(NULL) - maxminutes*60; } else { firstevent = getcurrenttime(NULL) - 86400; } if (totime) { lastevent = eventreport_time(totime); if (lastevent < 0) { if (output) fprintf(output,"<B>Invalid 'to' time: %s</B>", htmlquoted(totime)); return; } if (lastevent < firstevent) { if (output) fprintf(output,"<B>'to' time must be after 'from' time.</B>"); return; } } if (!maxcount) maxcount = 100; if (pageregex && *pageregex) pageregexp = pcre_compile(pageregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (expageregex && *expageregex) expageregexp = pcre_compile(expageregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (hostregex && *hostregex) hostregexp = pcre_compile(hostregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (exhostregex && *exhostregex) exhostregexp = pcre_compile(exhostregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (testregex && *testregex) testregexp = pcre_compile(testregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (extestregex && *extestregex) extestregexp = pcre_compile(extestregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (colrregex && *colrregex) colrregexp = pcre_compile(colrregex, PCRE_CASELESS, &errmsg, &errofs, NULL); sprintf(eventlogfilename, "%s/allevents", xgetenv("XYMONHISTDIR")); eventlog = fopen(eventlogfilename, "r"); if (eventlog && (stat(eventlogfilename, &st) == 0)) { time_t curtime; int done = 0; int unlimited = (maxcount == -1); if (unlimited) maxcount = 1000; do { /* Find a spot in the eventlog file close to where the firstevent time is */ fseeko(eventlog, 0, SEEK_END); do { /* Go back maxcount*80 bytes - one entry is ~80 bytes */ if (ftello(eventlog) > maxcount*80) { unsigned int uicurtime; fseeko(eventlog, -maxcount*80, SEEK_CUR); if (fgets(l, sizeof(l), eventlog) && /* Skip to start of line */ fgets(l, sizeof(l), eventlog)) { sscanf(l, "%*s %*s %u %*u %*u %*s %*s %*d", &uicurtime); curtime = uicurtime; done = (curtime < firstevent); if (unlimited && !done) maxcount += 1000; } else { if (output) fprintf(output,"Error reading eventlog file %s: %s\n", eventlogfilename, strerror(errno)); return; } } else { rewind(eventlog); curtime = 0; done = 1; } } while (!done); if (unlimited) unlimited = ((curtime > firstevent) && (ftello(eventlog) > 0)); } while (unlimited); } eventhead = NULL; while (eventlog && (fgets(l, sizeof(l), eventlog))) { time_t eventtime, changetime, duration; unsigned int uievt, uicht, uidur; char hostname[MAX_LINE_LEN], svcname[MAX_LINE_LEN], newcol[MAX_LINE_LEN], oldcol[MAX_LINE_LEN]; char *newcolname, *oldcolname; int state, itemsfound, colrmatch; event_t *newevent; void *eventhost; struct htnames_t *eventcolumn; int ovector[30]; eventcount_t *countrec; itemsfound = sscanf(l, "%s %s %u %u %u %s %s %d", hostname, svcname, &uievt, &uicht, &uidur, newcol, oldcol, &state); eventtime = uievt; changetime = uicht; duration = uidur; oldcolname = colorname(eventcolor(oldcol)); newcolname = colorname(eventcolor(newcol)); /* For DURATION counts, we must parse all events until now */ if ((counttype != XYMON_COUNT_DURATION) && (eventtime > lastevent)) break; eventhost = hostinfo(hostname); eventcolumn = getname(svcname, 1); if ( (itemsfound == 8) && (eventtime >= firstevent) && (eventhost && !xmh_item(eventhost, XMH_FLAG_NONONGREEN)) && (wanted_eventcolumn(svcname)) ) { if (eventfilter(eventhost, svcname, pageregexp, expageregexp, hostregexp, exhostregexp, testregexp, extestregexp, ignoredialups, hostcheck) == 0) continue; /* For duration counts, record all events. We'll filter out the colors later. */ if (colrregexp && (counttype != XYMON_COUNT_DURATION)) { colrmatch = ( (pcre_exec(colrregexp, NULL, newcolname, strlen(newcolname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0) || (pcre_exec(colrregexp, NULL, oldcolname, strlen(oldcolname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0) ); } else colrmatch = 1; if (!colrmatch) continue; newevent = (event_t *) malloc(sizeof(event_t)); newevent->host = eventhost; newevent->service = eventcolumn; newevent->eventtime = eventtime; newevent->changetime = changetime; newevent->duration = duration; newevent->newcolor = eventcolor(newcol); newevent->oldcolor = eventcolor(oldcol); newevent->next = eventhead; eventhead = newevent; if (counttype != XYMON_COUNT_DURATION) { countrec = (eventcount_t *)xmh_item(eventhost, XMH_DATA); while (countrec && (countrec->service != eventcolumn)) countrec = countrec->next; if (countrec == NULL) { countrec = (eventcount_t *)calloc(1, sizeof(eventcount_t)); countrec->service = eventcolumn; countrec->next = (eventcount_t *)xmh_item(eventhost, XMH_DATA); xmh_set_item(eventhost, XMH_DATA, (void *)countrec); } countrec->count++; } } } /* Count the state changes per host */ svccounthead = hostcounthead = NULL; switch (counttype) { case XYMON_COUNT_EVENTS: count_events(&hostcounthead, &svccounthead); break; case XYMON_COUNT_DURATION: count_duration(firstevent, lastevent, pageregexp, expageregexp, hostregexp, exhostregexp, testregexp, extestregexp, ignoredialups, hostcheck, eventhead, &hostcounthead, &svccounthead); break; default: break; } if (hostcounthead) hostcounthead = msort(hostcounthead, record_compare, record_getnext, record_setnext); if (svccounthead) svccounthead = msort(svccounthead, record_compare, record_getnext, record_setnext); if (eventhead && (output != NULL)) { char *bgcolors[2] = { "#000000", "#000033" }; int bgcolor = 0; struct event_t *ewalk, *lasttoshow = eventhead; countlist_t *cwalk; unsigned long totalcount = 0; if (periodstring) fprintf(output, "<p><font size=+1>%s</font></p>\n", htmlquoted(periodstring)); switch (sumtype) { case XYMON_S_HOST_BREAKDOWN: /* Request for a specific service, show breakdown by host */ for (cwalk = hostcounthead; (cwalk); cwalk = cwalk->next) totalcount += cwalk->total; fprintf(output, "<table summary=\"Breakdown by host\" border=0>\n"); fprintf(output, "<tr><th align=left>Host</th><th colspan=2>%s</th></tr>\n", (counttype == XYMON_COUNT_EVENTS) ? "State changes" : "Seconds red/yellow"); fprintf(output, "<tr><td colspan=3><hr width=\"100%%\"></td></tr>\n"); for (cwalk = hostcounthead; (cwalk && (cwalk->total > 0)); cwalk = cwalk->next) { fprintf(output, "<tr><td align=left>%s</td><td align=right>%lu</td><td align=right>(%6.2f %%)</tr>\n", xmh_item(cwalk->src, XMH_HOSTNAME), cwalk->total, ((100.0 * cwalk->total) / totalcount)); } fprintf(output, "</table>\n"); break; case XYMON_S_SERVICE_BREAKDOWN: /* Request for a specific host, show breakdown by service */ for (cwalk = svccounthead; (cwalk); cwalk = cwalk->next) totalcount += cwalk->total; fprintf(output, "<table summary=\"Breakdown by service\" border=0>\n"); fprintf(output, "<tr><th align=left>Service</th><th colspan=2>%s</th></tr>\n", (counttype == XYMON_COUNT_EVENTS) ? "State changes" : "Seconds red/yellow"); fprintf(output, "<tr><td colspan=3><hr width=\"100%%\"></td></tr>\n"); for (cwalk = svccounthead; (cwalk && (cwalk->total > 0)); cwalk = cwalk->next) { fprintf(output, "<tr><td align=left>%s</td><td align=right>%lu</td><td align=right>(%6.2f %%)</tr>\n", ((htnames_t *)cwalk->src)->name, cwalk->total, ((100.0 * cwalk->total) / totalcount)); } fprintf(output, "</table>\n"); break; case XYMON_S_NONE: break; } if (sumtype == XYMON_S_NONE) { int count; count=0; ewalk=eventhead; do { count++; lasttoshow = ewalk; ewalk = ewalk->next; } while (ewalk && (count<maxcount)); if (ewalk) ewalk->next = NULL; /* Terminate list if any items left */ if (maxminutes > 0) { sprintf(title, "%d events received in the past %u minutes", count, (unsigned int)((getcurrenttime(NULL) - lasttoshow->eventtime) / 60)); } else { sprintf(title, "%d events received.", count); } } else { strcpy(title, "Events in summary"); } fprintf(output, "<BR><BR>\n"); fprintf(output, "<TABLE SUMMARY=\"$EVENTSTITLE\" BORDER=0>\n"); fprintf(output, "<TR BGCOLOR=\"#333333\">\n"); fprintf(output, "<TD ALIGN=CENTER COLSPAN=6><FONT SIZE=-1 COLOR=\"#33ebf4\">%s</FONT></TD></TR>\n", htmlquoted(title)); for (ewalk=eventhead; (ewalk); ewalk=ewalk->next) { char *hostname = xmh_item(ewalk->host, XMH_HOSTNAME); if ( (counttype == XYMON_COUNT_DURATION) && (ewalk->oldcolor < COL_YELLOW) && (ewalk->newcolor < COL_YELLOW) ) continue; if ( (counttype == XYMON_COUNT_DURATION) && (ewalk->eventtime >= lastevent) ) continue; fprintf(output, "<TR BGCOLOR=%s>\n", bgcolors[bgcolor]); bgcolor = ((bgcolor + 1) % 2); fprintf(output, "<TD ALIGN=CENTER>%s</TD>\n", ctime(&ewalk->eventtime)); if (ewalk->newcolor == COL_CLEAR) { fprintf(output, "<TD ALIGN=CENTER BGCOLOR=black><FONT COLOR=white>%s</FONT></TD>\n", hostname); } else { fprintf(output, "<TD ALIGN=CENTER BGCOLOR=%s><FONT COLOR=black>%s</FONT></TD>\n", colorname(ewalk->newcolor), hostname); } fprintf(output, "<TD ALIGN=LEFT>%s</TD>\n", ewalk->service->name); fprintf(output, "<TD><A HREF=\"%s\">\n", histlogurl(hostname, ewalk->service->name, ewalk->changetime, NULL)); fprintf(output, "<IMG SRC=\"%s/%s\" HEIGHT=\"%s\" WIDTH=\"%s\" BORDER=0 ALT=\"%s\" TITLE=\"%s\"></A>\n", xgetenv("XYMONSKIN"), dotgiffilename(ewalk->oldcolor, 0, 0), xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH"), colorname(ewalk->oldcolor), colorname(ewalk->oldcolor)); fprintf(output, "<IMG SRC=\"%s/arrow.gif\" BORDER=0 ALT=\"From -> To\">\n", xgetenv("XYMONSKIN")); fprintf(output, "<TD><A HREF=\"%s\">\n", histlogurl(hostname, ewalk->service->name, ewalk->eventtime, NULL)); fprintf(output, "<IMG SRC=\"%s/%s\" HEIGHT=\"%s\" WIDTH=\"%s\" BORDER=0 ALT=\"%s\" TITLE=\"%s\"></A></TD>\n", xgetenv("XYMONSKIN"), dotgiffilename(ewalk->newcolor, 0, 0), xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH"), colorname(ewalk->newcolor), colorname(ewalk->newcolor)); fprintf(output, "</TR>\n"); } fprintf(output, "</TABLE>\n"); } else if (output != NULL) { /* No events during the past maxminutes */ if (eventlog) sprintf(title, "No events received in the last %d minutes", maxminutes); else strcpy(title, "No events logged"); fprintf(output, "<CENTER><BR>\n"); fprintf(output, "<TABLE SUMMARY=\"%s\" BORDER=0>\n", title); fprintf(output, "<TR BGCOLOR=\"#333333\">\n"); fprintf(output, "<TD ALIGN=CENTER COLSPAN=6><FONT SIZE=-1 COLOR=\"#33ebf4\">%s</FONT></TD>\n", htmlquoted(title)); fprintf(output, "</TR>\n"); fprintf(output, "</TABLE>\n"); fprintf(output, "</CENTER>\n"); } if (eventlog) fclose(eventlog); if (pageregexp) pcre_free(pageregexp); if (hostregexp) pcre_free(hostregexp); if (testregexp) pcre_free(testregexp); if (colrregexp) pcre_free(colrregexp); /* Return the event- and count-lists, if wanted - or clean them up */ if (eventlist) { *eventlist = eventhead; } else { event_t *zombie, *ewalk = eventhead; while (ewalk) { zombie = ewalk; ewalk = ewalk->next; xfree(zombie); } } if (hostcounts) { *hostcounts = hostcounthead; } else { countlist_t *zombie, *hwalk = hostcounthead; while (hwalk) { zombie = hwalk; hwalk = hwalk->next; xfree(zombie); } } if (servicecounts) { *servicecounts = svccounthead; } else { countlist_t *zombie, *swalk = svccounthead; while (swalk) { zombie = swalk; swalk = swalk->next; xfree(zombie); } } }
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; }
/* Change attributes. The VIO interface is ANSI-like anyway, so this * code contains mostly OS/2 VIO interface code. */ static void change(long fg, /* new foreground color, fgcolored */ long bg, /* new background color, bgcolored */ int bits) /* attribute bits */ { static long currentfg; static long currentbg; static int currentbits; int resetting, setting; VCOLOR newfg = (VCOLOR)ansi2vio (fg); VCOLOR newbg = (VCOLOR)ansi2vio (bg); DPRINTF (("change (%d, %d, %x) -> %s, %s\n", fg, bg, bits, colorname (fg), colorname (bg))); DPRINTF (("fg: %d, newfg: %d, bg: %d, newbg: %d\n", fg, newfg, bg, newbg)); /* Termcap doesn't allow bold & italics to mix. If attempting to mix, * then use plain bold. This makes sense for VIO, too as dimming * (italic) and brightening (bold) are a bit contradictory... */ if ((bits & (COLOR_BOLD|COLOR_ITALIC)) == (COLOR_BOLD|COLOR_ITALIC)) { bits &= ~COLOR_ITALIC; } /* Okay, we are finally ready to begin outputting escape sequences. * This proceeds in three phases: First we turn off any attributes * that must be off, then we change colors, and finally we turn on * any attributes which should be on. We do it this way because * sometimes turning off an attribute will affect colors or other * attributes. */ /* We take care of the colors first as applying styles is being * simulating by color manipulations. This is why we handle real * color and styles separately. */ if (fgcolored && newfg != currentfg) { /*DPRINTF (("fg %s to %s\n", colorname (currentfg), colorname(newfg)));*/ vc_color = (vc_color & 0xf0) | newfg; currentfg = newfg; } if (bgcolored && newbg != currentbg) { /*DPRINTF (("bg %s to %s\n", colorname (currentbg), colorname (newbg)));*/ vc_color = (vc_color & 0x0f) | (newbg << 4); currentbg = newbg; } /* Decide which attributes to turn off. */ resetting = currentbits & ~bits; /* Bold is simulated as "brightening" colors. So we "unbright" * the Bold filter. */ if (resetting & COLOR_BOLD) { vc_bold = 0x00; currentbits &= ~COLOR_BOLD; } /* Italic is simulated as "dimming" colors. So now we "undim" * the Italic filter. */ if (resetting & COLOR_ITALIC) { vc_italic = 0xff; currentbits &= ~COLOR_ITALIC; } /* Underlining is simulated as "dimming" colors. So now we "undim" * the Underline filter. */ if (resetting & COLOR_UNDERLINED) { vc_underlined = 0xff; currentbits &= ~COLOR_UNDERLINED; } /* Boxing is simulated as color swapping. This has to be done on * the final color, so we don't care about this now. */ /*if (resetting & COLOR_BOXED|COLOR_LEFTBOX|COLOR_RIGHTBOX) */ if (resetting & (COLOR_BOXED|COLOR_LEFTBOX|COLOR_RIGHTBOX)) { currentbits &= ~COLOR_BOXED; } /* Set attributes */ setting = bits & ~currentbits; /* For bold we bright the current color of, if it is already bright * by choosing bright white. */ if (setting & COLOR_BOLD) { vc_bold = ((vc_color & 0x08) != 0)? 0x0f: 0x08; } /* Dimming is only being done if the result will still be visible. * Else we use a "neutral" filter. */ if (setting & COLOR_ITALIC) { vc_italic = (VC_FG (vc_color & 0x77) != VC_BG (vc_color & 0x77))? 0x77: 0xff; } /* Dimming is only being done if the result will still be visible. * Else we use a "neutral" filter. */ if (setting & COLOR_UNDERLINED) { vc_underlined = (VC_FG (vc_color & 0x77) != VC_BG (vc_color & 0x77))? 0x77: 0xff; } currentbits = bits; if (currentbits & (COLOR_BOXED|COLOR_LEFTBOX|COLOR_RIGHTBOX)) { vc_current = VC_BG (vc_color) | (VC_FG (vc_color) << 4); } else { vc_current = vc_color; } vc_current = ((vc_current & vc_italic) & vc_underlined) | vc_bold; }
int main(int argc, char *argv[]) { char *pagedir; bbgen_page_t *p; dispsummary_t *s; int i; char *pageset = NULL; char *nssidebarfilename = NULL; char *egocolumn = NULL; char *csvfile = NULL; char csvdelim = ','; int embedded = 0; int hobbitddump = 0; char *envarea = NULL; int do_normal_pages = 1; /* Setup standard header+footer (might be modified by option pageset) */ select_headers_and_footers("bb"); bb_color = bb2_color = bbnk_color = -1; pagedir = NULL; init_timestamp(); fqdn = get_fqdn(); /* Setup values from env. vars that may be overridden via commandline options */ if (xgetenv("MKBB2COLREPEAT")) { int i = atoi(xgetenv("MKBB2COLREPEAT")); if (i > 0) maxrowsbeforeheading = i; } for (i = 1; (i < argc); i++) { if ( (strcmp(argv[i], "--hobbitd") == 0) || (argnmatch(argv[i], "--purplelifetime=")) || (strcmp(argv[i], "--nopurple") == 0) ) { /* Deprecated */ } else if (argnmatch(argv[i], "--env=")) { char *lp = strchr(argv[i], '='); loadenv(lp+1, envarea); } else if (argnmatch(argv[i], "--area=")) { char *lp = strchr(argv[i], '='); envarea = strdup(lp+1); } else if (argnmatch(argv[i], "--hobbitddump")) { hobbitddump = 1; } else if (argnmatch(argv[i], "--ignorecolumns=")) { char *lp = strchr(argv[i], '='); ignorecolumns = (char *) malloc(strlen(lp)+2); sprintf(ignorecolumns, ",%s,", (lp+1)); } else if (argnmatch(argv[i], "--nk-reds-only")) { nkonlyreds = 1; } else if (argnmatch(argv[i], "--bb2-ignorecolumns=")) { char *lp = strchr(argv[i], '='); bb2ignorecolumns = (char *) malloc(strlen(lp)+2); sprintf(bb2ignorecolumns, ",%s,", (lp+1)); } else if (argnmatch(argv[i], "--bb2-colors=")) { char *lp = strchr(argv[i], '=') + 1; bb2colors = colorset(lp, (1 << COL_GREEN)); } else if (argnmatch(argv[i], "--bb2-ignorepurples")) { bb2colors = (bb2colors & ~(1 << COL_PURPLE)); } else if (argnmatch(argv[i], "--bb2-ignoredialups")) { bb2nodialups = 1; } else if (argnmatch(argv[i], "--includecolumns=")) { char *lp = strchr(argv[i], '='); includecolumns = (char *) malloc(strlen(lp)+2); sprintf(includecolumns, ",%s,", (lp+1)); } else if (argnmatch(argv[i], "--eventignore=")) { char *lp = strchr(argv[i], '='); eventignorecolumns = (char *) malloc(strlen(lp)+2); sprintf(eventignorecolumns, ",%s,", (lp+1)); } else if (argnmatch(argv[i], "--doccgi=")) { char *lp = strchr(argv[i], '='); char *url = (char *)malloc(strlen(xgetenv("CGIBINURL"))+strlen(lp+1)+2); sprintf(url, "%s/%s", xgetenv("CGIBINURL"), lp+1); setdocurl(url); xfree(url); } else if (argnmatch(argv[i], "--docurl=")) { char *lp = strchr(argv[i], '='); setdocurl(lp+1); } else if (argnmatch(argv[i], "--no-doc-window")) { /* This is a no-op now */ } else if (argnmatch(argv[i], "--doc-window")) { setdocurl("TARGET=\"_blank\""); } else if (argnmatch(argv[i], "--htmlextension=")) { char *lp = strchr(argv[i], '='); htmlextension = strdup(lp+1); } else if (argnmatch(argv[i], "--htaccess")) { char *lp = strchr(argv[i], '='); if (lp) htaccess = strdup(lp+1); else htaccess = ".htaccess"; } else if ((strcmp(argv[i], "--wml") == 0) || argnmatch(argv[i], "--wml=")) { char *lp = strchr(argv[i], '='); if (lp) { wapcolumns = (char *) malloc(strlen(lp)+2); sprintf(wapcolumns, ",%s,", (lp+1)); } enable_wmlgen = 1; } else if (argnmatch(argv[i], "--nstab=")) { char *lp = strchr(argv[i], '='); if (strlen(lp+1) > 0) { nssidebarfilename = strdup(lp+1); } else errprintf("--nstab requires a filename\n"); } else if (argnmatch(argv[i], "--nslimit=")) { char *lp = strchr(argv[i], '='); nssidebarcolorlimit = parse_color(lp+1); } else if (argnmatch(argv[i], "--rssversion=")) { char *lp = strchr(argv[i], '='); rssversion = strdup(lp+1); } else if (argnmatch(argv[i], "--rsslimit=")) { char *lp = strchr(argv[i], '='); rsscolorlimit = parse_color(lp+1); } else if (argnmatch(argv[i], "--rss")) { wantrss = 1; } else if (argnmatch(argv[i], "--rssextension=")) { char *lp = strchr(argv[i], '='); rssextension = strdup(lp+1); } else if (argnmatch(argv[i], "--reportopts=")) { char style[MAX_LINE_LEN]; unsigned int rstart, rend; int count = sscanf(argv[i], "--reportopts=%u:%u:%d:%s", &rstart, &rend, &dynamicreport, style); reportstart = rstart; reportend = rend; if (count < 2) { errprintf("Invalid --reportopts option: Must have start- and end-times\n"); return 1; } if (count < 3) dynamicreport = 1; if (count == 4) { if (strcmp(style, stylenames[STYLE_CRIT]) == 0) reportstyle = STYLE_CRIT; else if (strcmp(style, stylenames[STYLE_NONGR]) == 0) reportstyle = STYLE_NONGR; else reportstyle = STYLE_OTHER; } if (reportstart < 788918400) reportstart = 788918400; if (reportend > time(NULL)) reportend = time(NULL); if (xgetenv("BBREPWARN")) reportwarnlevel = atof(xgetenv("BBREPWARN")); if (xgetenv("BBREPGREEN")) reportgreenlevel = atof(xgetenv("BBREPGREEN")); if ((reportwarnlevel < 0.0) || (reportwarnlevel > 100.0)) reportwarnlevel = 97.0; if ((reportgreenlevel < 0.0) || (reportgreenlevel > 100.0)) reportgreenlevel = 99.995; select_headers_and_footers("bbrep"); sethostenv_report(reportstart, reportend, reportwarnlevel, reportgreenlevel); } else if (argnmatch(argv[i], "--csv=")) { char *lp = strchr(argv[i], '='); csvfile = strdup(lp+1); } else if (argnmatch(argv[i], "--csvdelim=")) { char *lp = strchr(argv[i], '='); csvdelim = *(lp+1); } else if (argnmatch(argv[i], "--snapshot=")) { char *lp = strchr(argv[i], '='); snapshot = atol(lp+1); select_headers_and_footers("bbsnap"); sethostenv_snapshot(snapshot); } else if (strcmp(argv[i], "--pages-first") == 0) { hostsbeforepages = 0; } else if (strcmp(argv[i], "--pages-last") == 0) { hostsbeforepages = 1; } else if (argnmatch(argv[i], "--subpagecolumns=")) { char *lp = strchr(argv[i], '='); subpagecolumns = atoi(lp+1); if (subpagecolumns < 1) subpagecolumns=1; } else if (argnmatch(argv[i], "--maxrows=")) { char *lp = strchr(argv[i], '='); maxrowsbeforeheading = atoi(lp+1); if (maxrowsbeforeheading < 0) maxrowsbeforeheading=0; } else if (strcmp(argv[i], "--recentgifs") == 0) { use_recentgifs = 1; } else if (argnmatch(argv[i], "--recentgifs=")) { char *lp = strchr(argv[i], '='); use_recentgifs = 1; recentgif_limit = 60*durationvalue(lp+1); } else if (strcmp(argv[i], "--sort-group-only-items") == 0) { sort_grouponly_items = 1; } else if (argnmatch(argv[i], "--page-title=")) { char *lp = strchr(argv[i], '='); defaultpagetitle = strdup(lp+1); } else if (argnmatch(argv[i], "--dialupskin=")) { char *lp = strchr(argv[i], '='); dialupskin = strdup(lp+1); } else if (argnmatch(argv[i], "--reverseskin=")) { char *lp = strchr(argv[i], '='); reverseskin = strdup(lp+1); } else if (strcmp(argv[i], "--pagetitle-links") == 0) { pagetitlelinks = 1; } else if (strcmp(argv[i], "--pagetext-headings") == 0) { pagetextheadings = 1; } else if (strcmp(argv[i], "--underline-headings") == 0) { underlineheadings = 1; } else if (strcmp(argv[i], "--no-underline-headings") == 0) { underlineheadings = 0; } else if (strcmp(argv[i], "--no-eventlog") == 0) { bb2eventlog = 0; } else if (argnmatch(argv[i], "--max-eventcount=")) { char *lp = strchr(argv[i], '='); bb2eventlogmaxcount = atoi(lp+1); } else if (argnmatch(argv[i], "--max-eventtime=")) { char *lp = strchr(argv[i], '='); bb2eventlogmaxtime = atoi(lp+1); } else if (argnmatch(argv[i], "--max-ackcount=")) { char *lp = strchr(argv[i], '='); bb2acklogmaxcount = atoi(lp+1); } else if (argnmatch(argv[i], "--max-acktime=")) { char *lp = strchr(argv[i], '='); bb2acklogmaxtime = atoi(lp+1); } else if (strcmp(argv[i], "--no-acklog") == 0) { bb2acklog = 0; } else if (strcmp(argv[i], "--no-pages") == 0) { do_normal_pages = 0; } else if (argnmatch(argv[i], "--noprop=")) { char *lp = strchr(argv[i], '='); nopropyellowdefault = (char *) malloc(strlen(lp)+2); sprintf(nopropyellowdefault, ",%s,", (lp+1)); errprintf("--noprop is deprecated - use --nopropyellow instead\n"); } else if (argnmatch(argv[i], "--nopropyellow=")) { char *lp = strchr(argv[i], '='); nopropyellowdefault = (char *) malloc(strlen(lp)+2); sprintf(nopropyellowdefault, ",%s,", (lp+1)); } else if (argnmatch(argv[i], "--nopropred=")) { char *lp = strchr(argv[i], '='); nopropreddefault = (char *) malloc(strlen(lp)+2); sprintf(nopropreddefault, ",%s,", (lp+1)); } else if (argnmatch(argv[i], "--noproppurple=")) { char *lp = strchr(argv[i], '='); noproppurpledefault = (char *) malloc(strlen(lp)+2); sprintf(noproppurpledefault, ",%s,", (lp+1)); } else if (argnmatch(argv[i], "--nopropack=")) { char *lp = strchr(argv[i], '='); nopropackdefault = (char *) malloc(strlen(lp)+2); sprintf(nopropackdefault, ",%s,", (lp+1)); } else if (strcmp(argv[i], "--bbpageONLY") == 0) { /* Deprecated */ errprintf("--bbpageONLY is deprecated - use --pageset=NAME to generate pagesets\n"); } else if (strcmp(argv[i], "--embedded") == 0) { embedded = 1; } else if (argnmatch(argv[i], "--pageset=")) { char *lp = strchr(argv[i], '='); pageset = strdup(lp+1); } else if (argnmatch(argv[i], "--template=")) { char *lp = strchr(argv[i], '='); lp++; select_headers_and_footers(lp); } else if (argnmatch(argv[i], "--purplelog=")) { char *lp = strchr(argv[i], '='); if (*(lp+1) == '/') purplelogfn = strdup(lp+1); else { purplelogfn = (char *) malloc(strlen(xgetenv("BBHOME"))+1+strlen(lp+1)+1); sprintf(purplelogfn, "%s/%s", xgetenv("BBHOME"), (lp+1)); } } else if (argnmatch(argv[i], "--report=") || (strcmp(argv[i], "--report") == 0)) { char *lp = strchr(argv[i], '='); if (lp) { egocolumn = strdup(lp+1); } else egocolumn = "bbgen"; timing = 1; } else if (argnmatch(argv[i], "--nklog=") || (strcmp(argv[i], "--nklog") == 0)) { char *lp = strchr(argv[i], '='); if (lp) { lognkstatus = strdup(lp+1); } else lognkstatus = "nk"; } else if (strcmp(argv[i], "--timing") == 0) { timing = 1; } else if (strcmp(argv[i], "--debug") == 0) { debug = 1; } else if (strcmp(argv[i], "--no-update") == 0) { dontsendmessages = 1; } else if (strcmp(argv[i], "--version") == 0) { printf("bbgen version %s\n", VERSION); printf("\n"); exit(0); } else if ((strcmp(argv[i], "--help") == 0) || (strcmp(argv[i], "-?") == 0)) { printf("bbgen for Hobbit version %s\n\n", VERSION); printf("Usage: %s [options] [WebpageDirectory]\n", argv[0]); printf("Options:\n"); printf(" --ignorecolumns=test[,test] : Completely ignore these columns\n"); printf(" --nk-reds-only : Only show red statuses on the NK page\n"); printf(" --bb2-ignorecolumns=test[,test]: Ignore these columns for the BB2 page\n"); printf(" --bb2-ignorepurples : Ignore all-purple hosts on BB2 page\n"); printf(" --includecolumns=test[,test]: Always include these columns on BB2 page\n"); printf(" --max-eventcount=N : Max number of events to include in eventlog\n"); printf(" --max-eventtime=N : Show events that occurred within the last N minutes\n"); printf(" --eventignore=test[,test] : Columns to ignore in bb2 event-log display\n"); printf(" --no-eventlog : Do not generate the bb2 eventlog display\n"); printf(" --no-acklog : Do not generate the bb2 ack-log display\n"); printf(" --no-pages : Generate only the bb2 and bbnk pages\n"); printf(" --docurl=documentation-URL : Hostnames link to a general (dynamic) web page for docs\n"); printf(" --no-doc-window : Open doc-links in same window\n"); printf(" --htmlextension=.EXT : Sets filename extension for generated file (default: .html\n"); printf(" --report[=COLUMNNAME] : Send a status report about the running of bbgen\n"); printf(" --reportopts=ST:END:DYN:STL : Run in Hobbit Reporting mode\n"); printf(" --csv=FILENAME : For Hobbit Reporting, output CSV file\n"); printf(" --csvdelim=CHARACTER : Delimiter in CSV file output (default: comma)\n"); printf(" --snapshot=TIME : Snapshot mode\n"); printf("\nPage layout options:\n"); printf(" --pages-first : Put page- and subpage-links before hosts (default)\n"); printf(" --pages-last : Put page- and subpage-links after hosts\n"); printf(" --subpagecolumns=N : Number of columns for links to pages and subpages\n"); printf(" --maxrows=N : Repeat column headings for every N hosts shown\n"); printf(" --recentgifs : Use xxx-recent.gif icons for newly changed tests\n"); printf(" --sort-group-only-items : Display group-only items in alphabetical order\n"); printf(" --page-title=TITLE : Set a default page title for all pages\n"); printf(" --dialupskin=URL : Use a different icon skin for dialup tests\n"); printf(" --reverseskin=URL : Use a different icon skin for reverse tests\n"); printf(" --pagetitle-links : Make page- and subpage-titles act as links\n"); printf(" --pagetext-headings : Use page texts as headings\n"); printf(" --no-underline-headings : Do not underline the page headings\n"); printf("\nStatus propagation control options:\n"); printf(" --noprop=test[,test] : Disable upwards status propagation when YELLOW\n"); printf(" --nopropred=test[,test] : Disable upwards status propagation when RED or YELLOW\n"); printf(" --noproppurple=test[,test] : Disable upwards status propagation when PURPLE\n"); printf("\nAlternate pageset generation support:\n"); printf(" --pageset=SETNAME : Generate non-standard pageset with tag SETNAME\n"); printf(" --template=TEMPLATE : template for header and footer files\n"); printf("\nAlternate output formats:\n"); printf(" --wml[=test1,test2,...] : Generate a small (bb2-style) WML page\n"); printf(" --nstab=FILENAME : Generate a Netscape Sidebar feed\n"); printf(" --nslimit=COLOR : Minimum color to include on Netscape sidebar\n"); printf(" --rss : Generate a RSS/RDF feed of alerts\n"); printf(" --rssextension=.EXT : Sets filename extension for RSS files (default: .rss\n"); printf(" --rssversion={0.91|0.92|1.0|2.0} : Specify RSS/RDF version (default: 0.91)\n"); printf(" --rsslimit=COLOR : Minimum color to include on RSS feed\n"); printf("\nDebugging/troubleshooting options:\n"); printf(" --timing : Collect timing information\n"); printf(" --debug : Debugging information\n"); printf(" --version : Show version information\n"); printf(" --purplelog=FILENAME : Create a log of purple hosts and tests\n"); exit(0); } else if (argnmatch(argv[i], "-")) { errprintf("Unknown option : %s\n", argv[i]); } else { /* Last argument is pagedir */ pagedir = strdup(argv[i]); } } /* In case they changed the name of our column ... */ if (egocolumn) setup_signalhandler(egocolumn); if (debug) { int i; printf("Command: bbgen"); for (i=1; (i<argc); i++) printf(" '%s'", argv[i]); printf("\n"); printf("Environment BBHOSTS='%s'\n", textornull(xgetenv("BBHOSTS"))); printf("\n"); } add_timestamp("Startup"); /* Check that all needed environment vars are defined */ envcheck(reqenv); /* Catch a SEGV fault */ setup_signalhandler("bbgen"); /* Set umask to 0022 so that the generated HTML pages have world-read access */ umask(0022); if (pagedir == NULL) { if (xgetenv("BBWWW")) { pagedir = strdup(xgetenv("BBWWW")); } else { pagedir = (char *) malloc(strlen(xgetenv("BBHOME"))+5); sprintf(pagedir, "%s/www", xgetenv("BBHOME")); } } if (xgetenv("BBHTACCESS")) bbhtaccess = strdup(xgetenv("BBHTACCESS")); if (xgetenv("BBPAGEHTACCESS")) bbpagehtaccess = strdup(xgetenv("BBPAGEHTACCESS")); if (xgetenv("BBSUBPAGEHTACCESS")) bbsubpagehtaccess = strdup(xgetenv("BBSUBPAGEHTACCESS")); /* * When doing alternate pagesets, disable some stuff: * No WML or RSS pages. */ if (pageset || embedded || snapshot) enable_wmlgen = wantrss = 0; if (embedded) { egocolumn = htaccess = NULL; /* * Need to have default SIGPIPE handling when doing embedded stuff. * We are probably run from a CGI script or something similar. */ signal(SIGPIPE, SIG_DFL); } /* Load all data from the various files */ load_all_links(); add_timestamp("Load links done"); pagehead = load_bbhosts(pageset); add_timestamp("Load bbhosts done"); if (!embedded) { /* Remove old acknowledgements */ delete_old_acks(); add_timestamp("ACK removal done"); } statehead = load_state(&dispsums); if (embedded || snapshot) dispsums = NULL; add_timestamp("Load STATE done"); if (hobbitddump) { dump_hobbitdchk(); return 0; } /* Calculate colors of hosts and pages */ calc_hostcolors(bb2ignorecolumns); calc_pagecolors(pagehead); /* Topmost page (background color for bb.html) */ for (p=pagehead; (p); p = p->next) { if (p->color > pagehead->color) pagehead->color = p->color; } bb_color = pagehead->color; if (xgetenv("SUMMARY_SET_BKG") && (strcmp(xgetenv("SUMMARY_SET_BKG"), "TRUE") == 0)) { /* * Displayed summaries affect the BB page only, * but should not go into the color we report to * others. */ for (s=dispsums; (s); s = s->next) { if (s->color > pagehead->color) pagehead->color = s->color; } } add_timestamp("Color calculation done"); if (debug) dumpall(pagehead); /* Generate pages */ if (chdir(pagedir) != 0) { errprintf("Cannot change to webpage directory %s\n", pagedir); exit(1); } if (embedded) { /* Just generate that one page */ do_one_page(pagehead, NULL, 1); return 0; } /* The main page - bb.html and pages/subpages thereunder */ add_timestamp("Hobbit pagegen start"); if (reportstart && csvfile) { csv_availability(csvfile, csvdelim); } else if (do_normal_pages) { do_page_with_subs(pagehead, dispsums); } add_timestamp("Hobbit pagegen done"); if (reportstart) { /* Reports end here */ return 0; } /* The full summary page - bb2.html */ bb2_color = do_bb2_page(nssidebarfilename, PAGE_BB2); add_timestamp("BB2 generation done"); /* Reduced summary (alerts) page - bbnk.html */ bbnk_color = do_bb2_page(NULL, PAGE_NK); add_timestamp("BBNK generation done"); if (snapshot) { /* Snapshots end here */ return 0; } /* Send summary notices - only once, so not on pagesets */ if (pageset == NULL) { send_summaries(sumhead); add_timestamp("Summary transmission done"); } /* Generate WML cards */ if (enable_wmlgen) { do_wml_cards(pagedir); add_timestamp("WML generation done"); } /* Need to do this before sending in our report */ add_timestamp("Run completed"); /* Tell about us */ if (egocolumn) { char msgline[4096]; char *timestamps; long bbsleep = (xgetenv("BBSLEEP") ? atol(xgetenv("BBSLEEP")) : 300); int color; /* Go yellow if it runs for too long */ if (total_runtime() > bbsleep) { errprintf("WARNING: Runtime %ld longer than BBSLEEP (%ld)\n", total_runtime(), bbsleep); } color = (errbuf ? COL_YELLOW : COL_GREEN); combo_start(); init_status(color); sprintf(msgline, "status %s.%s %s %s\n\n", xgetenv("MACHINE"), egocolumn, colorname(color), timestamp); addtostatus(msgline); sprintf(msgline, "bbgen for Hobbit version %s\n", VERSION); addtostatus(msgline); sprintf(msgline, "\nStatistics:\n Hosts : %5d\n Status messages : %5d\n Purple messages : %5d\n Pages : %5d\n", hostcount, statuscount, purplecount, pagecount); addtostatus(msgline); if (errbuf) { addtostatus("\n\nError output:\n"); addtostatus(errbuf); } show_timestamps(×tamps); addtostatus(timestamps); finish_status(); combo_end(); } else show_timestamps(NULL); return 0; }
void print_hoststatus(FILE *output, hstatus_t *itm, void * statetree, void * columns, int prio, int firsthost, int firsthostever) { char *key; time_t now; xtreePos_t colhandle; now = getcurrenttime(NULL); fprintf(output, "<TR>\n"); /* Print the priority */ fprintf(output, "<TD ALIGN=LEFT VALIGN=TOP WIDTH=10%% NOWRAP>"); if (firsthost) if (prio == 99) { if (firsthostever) /* Only non-prioritised hosts, so just drop that text */ fprintf(output, " "); else fprintf(output, "<FONT %s>No priority</FONT>", xgetenv("XYMONPAGEROWFONT")); } else { fprintf(output, "<FONT %s>PRIO %d</FONT>", xgetenv("XYMONPAGEROWFONT"), prio); } else fprintf(output, " "); fprintf(output, "</TD>\n"); /* Print the hostname with a link to the critical systems info page */ fprintf(output, "<TD ALIGN=LEFT>%s</TD>\n", hostnamehtml(itm->hostname, NULL, usetooltips)); key = (char *)malloc(1024); for (colhandle = xtreeFirst(columns); (colhandle != xtreeEnd(columns)); colhandle = xtreeNext(columns, colhandle)) { char *colname; xtreePos_t sthandle; fprintf(output, "<TD ALIGN=CENTER>"); colname = (char *)xtreeKey(columns, colhandle); key = (char *)realloc(key, 2 + strlen(itm->hostname) + strlen(colname)); sprintf(key, "%s|%s", itm->hostname, colname); sthandle = xtreeFind(statetree, key); if (sthandle == xtreeEnd(statetree)) { fprintf(output, "-"); } else { hstatus_t *column; char *htmlalttag; char *htmlackstr; column = (hstatus_t *)xtreeData(statetree, sthandle); if (column->config->priority != prio) fprintf(output, "-"); else { time_t age = now - column->lastchange; char *htmlgroupstr; char *htmlextrastr; htmlalttag = alttag(colname, column->color, 0, 1, agestring(age)); htmlackstr = (column->ackmsg ? column->ackmsg : ""); htmlgroupstr = strdup(urlencode(column->config->ttgroup ? column->config->ttgroup : "")); htmlextrastr = strdup(urlencode(column->config->ttextra ? column->config->ttextra : "")); fprintf(output, "<A HREF=\"%s&NKPRIO=%d&NKTTGROUP=%s&NKTTEXTRA=%s\">", hostsvcurl(itm->hostname, colname, 1), prio, htmlgroupstr, htmlextrastr); fprintf(output, "<IMG SRC=\"%s/%s\" ALT=\"%s\" TITLE=\"%s %s\" HEIGHT=\"%s\" WIDTH=\"%s\" BORDER=0></A>", xgetenv("XYMONSKIN"), dotgiffilename(column->color, (column->acktime > 0), (age > oldlimit)), colorname(column->color), htmlalttag, htmlackstr, xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH")); xfree(htmlgroupstr); xfree(htmlextrastr); } } fprintf(output, "</TD>\n"); } xfree(key); fprintf(output, "</TR>\n"); }