int main(int argc, char *argv[]) { int argi; char *envarea = NULL; char *critconfig = NULL; char *hffile = "critical"; for (argi = 1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if (strcmp(argv[argi], "--tooltips") == 0) { usetooltips = 1; } else if (argnmatch(argv[argi], "--acklevel=")) { char *p = strchr(argv[argi], '='); critacklevel = atoi(p+1); } else if (argnmatch(argv[argi], "--config=")) { char *p = strchr(argv[argi], '='); critconfig = strdup(p+1); } else if (argnmatch(argv[argi], "--hffile=")) { char *p = strchr(argv[argi], '='); hffile = strdup(p+1); } } redirect_cgilog("criticalview"); setdocurl(hostsvcurl("%s", xgetenv("INFOCOLUMN"), 1)); parse_query(); load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); load_critconfig(critconfig); load_all_links(); fprintf(stdout, "Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); if (loadstatus(maxprio, maxage, mincolor, wantacked) == 0) { use_recentgifs = 1; generate_critpage(stdout, hffile); } else { fprintf(stdout, "Cannot load Xymon status\n"); } return 0; }
int main(int argc, char *argv[]) { int argi; char *envarea = NULL; char **critconfig = NULL; int cccount = 0; char *hffile = "critical"; critconfig = (char **)calloc(1, sizeof(char *)); for (argi = 1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if (strcmp(argv[argi], "--tooltips") == 0) { usetooltips = 1; } else if (argnmatch(argv[argi], "--acklevel=")) { char *p = strchr(argv[argi], '='); critacklevel = atoi(p+1); } else if (argnmatch(argv[argi], "--config=")) { char *p = strchr(argv[argi], '='); critconfig[cccount] = strdup(p+1); cccount++; critconfig = (char **)realloc(critconfig, (1 + cccount)*sizeof(char *)); critconfig[cccount] = NULL; } else if (argnmatch(argv[argi], "--hffile=")) { char *p = strchr(argv[argi], '='); hffile = strdup(p+1); } } if (!critconfig[0]) { critconfig = (char **)realloc(critconfig, 2*sizeof(char *)); critconfig[0] = (char *)malloc(strlen(xgetenv("XYMONHOME")) + strlen(DEFAULT_CRITCONFIGFN) + 2); sprintf(critconfig[0], "%s/%s", xgetenv("XYMONHOME"), DEFAULT_CRITCONFIGFN); critconfig[1] = NULL; } redirect_cgilog("criticalview"); setdocurl(hostsvcurl("%s", xgetenv("INFOCOLUMN"), 1)); parse_query(); load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); load_all_links(); fprintf(stdout, "Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); use_recentgifs = 1; if (getboard(mincolor) == 0) { int i; char *oneconfig, *onename; int *partcolor = NULL, *partprio = NULL; xtreePos_t hhandle; for (i=0; (critconfig[i]); i++) { oneconfig = strchr(critconfig[i], ':'); load_critconfig(oneconfig ? oneconfig+1 : critconfig[i]); loadstatus(maxprio, maxage, mincolor, wantacked); /* Determine background color and max. priority */ if (i == 0) { partcolor = (int *)malloc(sizeof(int)); partprio = (int *)malloc(sizeof(int)); } else { partcolor = (int *)realloc(partcolor, (i+1)*sizeof(int)); partprio = (int *)realloc(partprio, (i+1)*sizeof(int)); } partcolor[i] = COL_GREEN; partprio[i] = 0; for (hhandle = xtreeFirst(rbstate[i]); (hhandle != xtreeEnd(rbstate[i])); hhandle = xtreeNext(rbstate[i], hhandle)) { hstatus_t *itm; itm = (hstatus_t *)xtreeData(rbstate[i], hhandle); if (itm->color > partcolor[i]) partcolor[i] = itm->color; if (itm->config->priority > partprio[i]) partprio[i] = itm->config->priority; } if (partcolor[i] > pagecolor) pagecolor = partcolor[i]; } for (i=0; (critconfig[i]); i++) { oneconfig = strchr(critconfig[i], ':'); if (oneconfig) { *oneconfig = '\0'; oneconfig++; onename = (char *)malloc(strlen("DIVIDERTEXT=") + strlen(critconfig[i]) + 1); sprintf(onename, "DIVIDERTEXT=%s", critconfig[i]); putenv(onename); } else { oneconfig = critconfig[i]; putenv("DIVIDERTEXT="); } generate_critpage(rbstate[i], hostsonpage[i], stdout, (i == 0) ? (critconfig[1] ? "critmulti" : hffile) : "divider", (critconfig[i+1] == NULL) ? hffile : "divider", partcolor[i], partprio[i]); } } else { fprintf(stdout, "Cannot load Xymon status\n"); } 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"); }
void do_netscape_sidebar(char *nssidebarfilename, host_t *hosts) { FILE *fd; char tmpfn[PATH_MAX]; char destfn[PATH_MAX]; int ttlvalue; host_t *h; int anyshown; if (nssidebarfilename == NULL) return; if (xgetenv("BBRSSTITLE")) rsstitle = strdup(xgetenv("BBRSSTITLE")); ttlvalue = (xgetenv("BBSLEEP") ? atoi(xgetenv("BBSLEEP")) : 300); if (*nssidebarfilename == '/') { sprintf(tmpfn, "%s.tmp", nssidebarfilename); sprintf(destfn, "%s", nssidebarfilename); } else { sprintf(tmpfn, "%s/www/%s.tmp", xgetenv("BBHOME"), nssidebarfilename); sprintf(destfn, "%s/www/%s", xgetenv("BBHOME"), nssidebarfilename); } fd = fopen(tmpfn, "w"); if (fd == NULL) { errprintf("Cannot create Netscape sidebar outputfile %s\n", tmpfn); return; } fprintf(fd, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"); fprintf(fd, "<HTML>\n"); fprintf(fd, " <HEAD>\n"); fprintf(fd, " <TITLE>%s</TITLE>\n", rsstitle); fprintf(fd, " <META NAME=\"Generator\" CONTENT=\"bbgen - generator for Hobbit\">\n"); fprintf(fd, " <META HTTP-EQUIV=\"Refresh\" CONTENT=\"%d; URL=%s/%s\">\n", ttlvalue, xgetenv("BBWEBHOSTURL"), nssidebarfilename); fprintf(fd, " </HEAD>\n"); fprintf(fd, " <BODY>\n"); fprintf(fd, " <FONT SIZE=\"-2\">Last updated:<BR>%s<BR></FONT>\n", timestamp); fprintf(fd, " <UL>\n"); for (h=hosts, anyshown=0; (h); h=h->next) { entry_t *e; if (h->color >= nssidebarcolorlimit) { for (e=h->entries; (e); e=e->next) { if (e->color >= nssidebarcolorlimit) { anyshown = 1; fprintf(fd, " <LI>\n"); if (generate_static()) { /* * Dont use htmlextension here - the .html files are * generated by bbd. */ fprintf(fd, "\t<A TARGET=\"_content\" HREF=\"%s/html/%s.%s.html\">", xgetenv("BBWEBHOSTURL"), h->hostname, e->column->name); } else { fprintf(fd, "\t<A TARGET=\"_content\" HREF=\"%s%s\"", xgetenv("BBWEB"), hostsvcurl(h->hostname, e->column->name, 1)); } fprintf(fd, "%s (%s)</A>\n", h->hostname, e->column->name); fprintf(fd, " </LI>\n"); } } } } if (!anyshown) { fprintf(fd, " <LI>\n"); fprintf(fd, " <A TARGET=\"_content\" HREF=\"%s/\">No Critical Alerts</A>\n", xgetenv("BBWEBHOSTURL")); fprintf(fd, " </LI>\n"); } fprintf(fd, " </UL>\n"); fprintf(fd, " </BODY>\n"), fprintf(fd, "</HTML>\n"); fclose(fd); if (rename(tmpfn, destfn) != 0) { errprintf("Cannot move file %s to destination %s\n", tmpfn, destfn); } return; }
void do_rss_item(FILE *fd, host_t *h, entry_t *e) { if (fd == NULL) return; if (h->color < rsscolorlimit) return; if (e->color < rsscolorlimit) return; anyshown = 1; switch (rssver) { case RSS091: case RSS092: case RSS20: fprintf(fd, " <item>\n"); break; case RSS10: fprintf(fd, " <item rdf:about=\"%s/bb2%s\">\n", xgetenv("BBWEBHOSTURL"), htmlextension); break; } fprintf(fd, " <title>%s (%s)</title>\n", h->hostname, e->column->name); fprintf(fd, " <link>"); if (generate_static()) { /* * Dont use htmlextension here - the .html files are generated by bbd. */ fprintf(fd, "%s/html/%s.%s.html", xgetenv("BBWEBHOSTURL"), h->hostname, e->column->name); } else { fprintf(fd, "%s%s", xgetenv("BBWEBHOST"), hostsvcurl(h->hostname, e->column->name, 1)); } fprintf(fd, "</link>\n"); if (e->shorttext) { char *inpos = e->shorttext; int len; char savech; fprintf(fd, "<description>"); /* Must escape any '&', '<' and '>' -characters, or RSS readers will choke on them */ while (*inpos) { len = strcspn(inpos, "&<>"); savech = *(inpos+len); *(inpos+len) = '\0'; fprintf(fd, "%s", inpos); *(inpos+len) = savech; inpos += len; if (savech != '\0') { switch (savech) { case '&': fprintf(fd, "&"); break; case '>': fprintf(fd, ">"); break; case '<': fprintf(fd, "<"); break; } inpos++; /* Skip the escaped char we just output */ } } fprintf(fd, "</description>\n"); } fprintf(fd, " </item>\n"); }
int main(int argc, char *argv[]) { char *envarea = NULL; char *server = NULL; char *cookie, *pagefilter = ""; char *filter = NULL; char *heading = NULL; int showcolors = 1; int showcolumn = 0; int addlink = 0; int allhosts = 0; int summary = 0; int embedded = 0; char *req, *board, *l; int argi, res; sendreturn_t *sres; init_timestamp(); 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], "--column=") || argnmatch(argv[argi], "--test=")) { char *p = strchr(argv[argi], '='); int needed; needed = 10 + strlen(p); if (filter) needed += strlen(filter); filter = (char *)(filter ? realloc(filter, needed) : calloc(1, needed)); sprintf(filter + strlen(filter), " test=%s", p+1); if (!heading) { heading = (char *)malloc(1024 + strlen(p) + strlen(timestamp)); sprintf(heading, "%s report on %s", p+1, timestamp); } } else if (argnmatch(argv[argi], "--filter=")) { char *p = strchr(argv[argi], '='); int needed; needed = 10 + strlen(p); if (filter) needed += strlen(filter); filter = (char *)(filter ? realloc(filter, needed) : calloc(1, needed)); sprintf(filter + strlen(filter), " %s", p+1); } else if (argnmatch(argv[argi], "--heading=")) { char *p = strchr(argv[argi], '='); heading = strdup(p+1); } else if (strcmp(argv[argi], "--show-column") == 0) { showcolumn = 1; } else if (strcmp(argv[argi], "--show-test") == 0) { showcolumn = 1; } else if (strcmp(argv[argi], "--show-colors") == 0) { showcolors = 1; } else if (strcmp(argv[argi], "--show-summary") == 0) { summary = 1; } else if (strcmp(argv[argi], "--show-message") == 0) { summary = 0; } else if (strcmp(argv[argi], "--link") == 0) { addlink = 1; } else if (strcmp(argv[argi], "--no-colors") == 0) { showcolors = 0; } else if (strcmp(argv[argi], "--all") == 0) { allhosts = 1; } else if (strcmp(argv[argi], "--embedded") == 0) { embedded = 1; } } if (!allhosts) { /* Setup the filter we use for the report */ cookie = get_cookie("pagepath"); if (cookie && *cookie) { pcre *dummy; char *re = (char *)malloc(8 + 2*strlen(cookie)); sprintf(re, "^%s$|^%s/.+", cookie, cookie); dummy = compileregex(re); if (dummy) { freeregex(dummy); pagefilter = malloc(10 + strlen(re)); sprintf(pagefilter, "page=%s", re); } } } sres = newsendreturnbuf(1, NULL); req = malloc(1024 + strlen(pagefilter) + strlen(filter)); sprintf(req, "xymondboard fields=hostname,testname,color,msg %s %s", pagefilter, filter); res = sendmessage(req, server, XYMON_TIMEOUT, sres); board = getsendreturnstr(sres, 1); freesendreturnbuf(sres); if (res != XYMONSEND_OK) return 1; if (!embedded) { printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); printf("<html><head><title>%s</title></head>\n", htmlquoted(heading)); printf("<body>"); printf("<table border=1 cellpadding=5><tr><th>%s</th><th align=left>Status</th></tr>\n", (showcolumn ? "Host/Column" : "Host")); } l = board; while (l && *l) { char *hostname, *testname = NULL, *colorstr = NULL, *msg = NULL, *p; char *eoln = strchr(l, '\n'); if (eoln) *eoln = '\0'; hostname = l; p = strchr(l, '|'); if (p) { *p = '\0'; l = testname = p+1; } p = strchr(l, '|'); if (p) { *p = '\0'; l = colorstr = p+1; } p = strchr(l, '|'); if (p) { *p = '\0'; l = msg = p+1; } if (hostname && testname && colorstr && msg) { char *msgeol; nldecode(msg); msgeol = strchr(msg, '\n'); if (msgeol) { /* Skip the first status line */ msg = msgeol + 1; } printf("<tr><td align=left valign=top><b>"); if (addlink) printf("<a href=\"%s\">%s</a>", hostsvcurl(hostname, xgetenv("INFOCOLUMN"), 1), htmlquoted(hostname)); else printf("%s", htmlquoted(hostname)); if (showcolumn) { printf("<br>"); if (addlink) printf("<a href=\"%s\">%s</a>", hostsvcurl(hostname, testname, 1), htmlquoted(testname)); else printf("%s", htmlquoted(testname)); } if (showcolors) printf(" - %s", colorstr); printf("</b></td>\n"); printf("<td><pre>\n"); if (summary) { int firstline = 1; char *bol, *eol; bol = msg; while (bol) { eol = strchr(bol, '\n'); if (eol) *eol = '\0'; if (firstline) { if (!isspace((int)*bol)) { printf("%s\n", bol); firstline = 0; } } else if ((*bol == '&') && (strncmp(bol, "&green", 6) != 0)) { printf("%s\n", bol); } bol = (eol ? eol+1 : NULL); } } else { printf("%s", msg); } printf("</pre></td></tr>\n"); } if (eoln) l = eoln+1; else l = NULL; } if (!embedded) printf("</table></body></html>\n"); return 0; }
int main(int argc, char *argv[]) { int argi; char *envarea = NULL; char *hffile = "ghosts"; int bgcolor = COL_BLUE; char *ghosts = 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], "--hffile=")) { char *p = strchr(argv[argi], '='); hffile = strdup(p+1); } } load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); parse_query(); switch (outform) { case O_HTML: fprintf(stdout, "Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); headfoot(stdout, hffile, "", "header", bgcolor); break; case O_TXT: fprintf(stdout, "Content-type: text/plain\n\n"); break; } sres = newsendreturnbuf(1, NULL); if (sendmessage("ghostlist", NULL, XYMON_TIMEOUT, sres) == XYMONSEND_OK) { char *bol, *eoln, *name, *sender, *timestr; time_t tstamp, now; int count, idx; ghost_t *ghosttable; ghosts = getsendreturnstr(sres, 1); /* Count the number of lines */ for (bol = ghosts, count=0; (bol); bol = strchr(bol, '\n')) { if (*bol == '\n') bol++; count++; } ghosttable = (ghost_t *)calloc(count+1, sizeof(ghost_t)); idx = count = 0; tstamp = now = getcurrenttime(NULL); bol = ghosts; while (bol) { name = sender = timestr = NULL; eoln = strchr(bol, '\n'); if (eoln) *eoln = '\0'; name = strtok(bol, "|"); if (name) sender = strtok(NULL, "|"); if (sender) timestr = strtok(NULL, "|"); if (timestr) tstamp = atol(timestr); if (name && sender && timestr && (tstamp > (now - maxage))) { int i1, i2, i3, i4; sscanf(sender, "%d.%d.%d.%d", &i1, &i2, &i3, &i4); ghosttable[idx].sender = sender; ghosttable[idx].senderval = (i1 << 24) + (i2 << 16) + (i3 << 8) + i4; ghosttable[idx].name = name; ghosttable[idx].tstamp = tstamp; find_candidate(&ghosttable[idx]); idx++; count++; } if (eoln) eoln++; bol = eoln; } switch (sorttype) { case S_NAME: qsort(&ghosttable[0], count, sizeof(ghost_t), hostname_compare); break; case S_SENDER: qsort(&ghosttable[0], count, sizeof(ghost_t), sender_compare); break; case S_TIME: qsort(&ghosttable[0], count, sizeof(ghost_t), time_compare); break; } if (outform == O_HTML) { fprintf(stdout, "<table align=center>\n"); fprintf(stdout, "<tr>"); fprintf(stdout, "<th align=left><a href=\"ghostlist.sh?SORT=name&MAXAGE=%d\">Hostname</a></th>", maxage); fprintf(stdout, "<th align=left><a href=\"ghostlist.sh?SORT=sender&MAXAGE=%d\">Sent from</a></th>", maxage); fprintf(stdout, "<th align=left>Candidate</th>"); fprintf(stdout, "<th align=right><a href=\"ghostlist.sh?SORT=time&MAXAGE=%d\">Report age</a></th>", maxage); fprintf(stdout, "</tr>\n"); } for (idx = 0; (idx < count); idx++) { if (!ghosttable[idx].name) continue; if (!ghosttable[idx].sender) continue; switch (outform) { case O_HTML: fprintf(stdout, "<tr><td align=left>%s</td><td align=left>%s</td>", ghosttable[idx].name, ghosttable[idx].sender); if (ghosttable[idx].candidate) { fprintf(stdout, "<td align=left><a href=\"%s\">%s</a></td>", hostsvcurl(xmh_item(ghosttable[idx].candidate, XMH_HOSTNAME), xgetenv("INFOCOLUMN"), 1), xmh_item(ghosttable[idx].candidate, XMH_HOSTNAME)); } else { fprintf(stdout, "<td> </td>"); } fprintf(stdout, "<td align=right>%ld:%02ld</td></tr>\n", (now - ghosttable[idx].tstamp)/60, (now - ghosttable[idx].tstamp)%60); break; case O_TXT: fprintf(stdout, "%s\t\t%s\n", ghosttable[idx].sender, ghosttable[idx].name); break; } } if (outform == O_HTML) { fprintf(stdout, "</table>\n"); fprintf(stdout, "<br><br><center><a href=\"ghostlist.sh?SORT=%s&MAXAGE=%d&TEXT\">Text report</a></center>\n", htmlquoted(sortstring), maxage); } } else fprintf(stdout, "<h3><center>Failed to retrieve ghostlist from server</center></h3>\n"); freesendreturnbuf(sres); if (outform == O_HTML) { headfoot(stdout, hffile, "", "footer", bgcolor); } return 0; }
void print_hoststatus(FILE *output, hstatus_t *itm, RbtHandle columns, int prio, int firsthost) { void *hinfo; char *dispname, *ip, *key; time_t now; RbtIterator colhandle; now = getcurrenttime(NULL); hinfo = hostinfo(itm->hostname); dispname = xmh_item(hinfo, XMH_DISPLAYNAME); ip = xmh_item(hinfo, XMH_IP); fprintf(output, "<TR>\n"); /* Print the priority */ fprintf(output, "<TD ALIGN=LEFT VALIGN=TOP WIDTH=25%% NOWRAP>"); if (firsthost) 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(strlen(itm->hostname) + 1024); for (colhandle = rbtBegin(columns); (colhandle != rbtEnd(columns)); colhandle = rbtNext(columns, colhandle)) { void *k1, *k2; char *colname; RbtIterator sthandle; fprintf(output, "<TD ALIGN=CENTER>"); rbtKeyValue(columns, colhandle, &k1, &k2); colname = (char *)k1; sprintf(key, "%s|%s", itm->hostname, colname); sthandle = rbtFind(rbstate, key); if (sthandle == rbtEnd(rbstate)) { fprintf(output, "-"); } else { hstatus_t *column; char *htmlalttag; char *htmlackstr; rbtKeyValue(rbstate, sthandle, &k1, &k2); column = (hstatus_t *)k2; 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"); }
static char *message_text(activealerts_t *alert, recip_t *recip) { static strbuffer_t *buf = NULL; char *eoln, *bom, *p; char info[4096]; MEMDEFINE(info); if (!buf) buf = newstrbuffer(0); else clearstrbuffer(buf); if (alert->state == A_NOTIFY) { sprintf(info, "%s:%s INFO\n", alert->hostname, alert->testname); addtobuffer(buf, info); addtobuffer(buf, alert->pagemessage); MEMUNDEFINE(info); return STRBUF(buf); } switch (recip->format) { case ALERTFORM_TEXT: case ALERTFORM_PLAIN: bom = msg_data(alert->pagemessage); eoln = strchr(bom, '\n'); if (eoln) *eoln = '\0'; /* If there's a "<-- flags:.... -->" then remove it from the message */ if ((p = strstr(bom, "<!--")) != NULL) { /* Add the part of line 1 before the flags ... */ *p = '\0'; addtobuffer(buf, bom); *p = '<'; /* And the part of line 1 after the flags ... */ p = strstr(p, "-->"); if (p) addtobuffer(buf, p+3); /* And if there is more than line 1, add it as well */ if (eoln) { *eoln = '\n'; addtobuffer(buf, eoln); } } else { if (eoln) *eoln = '\n'; addtobuffer(buf, bom); } addtobuffer(buf, "\n"); if (recip->format == ALERTFORM_TEXT) { sprintf(info, "See %s%s\n", xgetenv("XYMONWEBHOST"), hostsvcurl(alert->hostname, alert->testname, 0)); addtobuffer(buf, info); } MEMUNDEFINE(info); return STRBUF(buf); case ALERTFORM_SMS: /* * Send a report containing a brief alert * and any lines that begin with a "&COLOR" */ switch (alert->state) { case A_PAGING: case A_ACKED: sprintf(info, "%s:%s %s [%d]", alert->hostname, alert->testname, colorname(alert->color), alert->cookie); break; case A_RECOVERED: sprintf(info, "%s:%s RECOVERED", alert->hostname, alert->testname); break; case A_DISABLED: sprintf(info, "%s:%s DISABLED", alert->hostname, alert->testname); break; case A_NOTIFY: sprintf(info, "%s:%s NOTICE", alert->hostname, alert->testname); break; case A_NORECIP: case A_DEAD: break; } addtobuffer(buf, info); bom = msg_data(alert->pagemessage); eoln = strchr(bom, '\n'); if (eoln) { bom = eoln; while ((bom = strstr(bom, "\n&")) != NULL) { eoln = strchr(bom+1, '\n'); if (eoln) *eoln = '\0'; if ((strncmp(bom+1, "&red", 4) == 0) || (strncmp(bom+1, "&yellow", 7) == 0)) addtobuffer(buf, bom); if (eoln) *eoln = '\n'; bom = (eoln ? eoln+1 : ""); } } MEMUNDEFINE(info); return STRBUF(buf); case ALERTFORM_SCRIPT: sprintf(info, "%s:%s %s [%d]\n", alert->hostname, alert->testname, colorname(alert->color), alert->cookie); addtobuffer(buf, info); addtobuffer(buf, msg_data(alert->pagemessage)); addtobuffer(buf, "\n"); sprintf(info, "See %s%s\n", xgetenv("XYMONWEBHOST"), hostsvcurl(alert->hostname, alert->testname, 0)); addtobuffer(buf, info); MEMUNDEFINE(info); return STRBUF(buf); case ALERTFORM_PAGER: case ALERTFORM_NONE: MEMUNDEFINE(info); return ""; } MEMUNDEFINE(info); return alert->pagemessage; }