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[]) { int argi; char *argp, *p; testitem_t *thead = NULL; int timeout = 0; int concurrency = 0; if (xgetenv("XYMONNETSVCS") == NULL) putenv("XYMONNETSVCS="); init_tcp_services(); for (argi=1; (argi<argc); argi++) { if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if (strncmp(argv[argi], "--timeout=", 10) == 0) { p = strchr(argv[argi], '='); timeout = atoi(p+1); if (timeout < 0) timeout = 0; } else if (strncmp(argv[argi], "--concurrency=", 14) == 0) { p = strchr(argv[argi], '='); concurrency = atoi(p+1); if (concurrency < 0) concurrency = 0; } else if (strcmp(argv[argi], "--help") == 0) { printf("Run with\n~xymon/server/bin/xymoncmd ./contest --debug 172.16.10.2/25/smtp\n"); printf("I.e. IP/PORTNUMBER/TESTSPEC\n"); return 0; } else { char *ip; char *port; char *srcip; char *testspec; argp = argv[argi]; ip = port = srcip = testspec = NULL; ip = argp; p = strchr(argp, '/'); if (p) { *p = '\0'; argp = (p+1); p = strchr(argp, '/'); if (p) { port = argp; *p = '\0'; argp = (p+1); } else { port = "0"; } testspec = argp; srcip = strchr(testspec, '@'); if (srcip) { *srcip = '\0'; srcip++; } } if (ip && port && testspec) { if ( (strncmp(argp, "http", 4) == 0) || (strncmp(argp, "cont;", 5) == 0) || (strncmp(argp, "cont=", 5) == 0) || (strncmp(argp, "post;", 5) == 0) || (strncmp(argp, "post=", 5) == 0) || (strncmp(argp, "nocont;", 7) == 0) || (strncmp(argp, "nocont=", 7) == 0) || (strncmp(argp, "nopost;", 7) == 0) || (strncmp(argp, "nopost=", 7) == 0) || (strncmp(argp, "httpstatus;", 11) == 0) || (strncmp(argp, "httpstatus=", 11) == 0) || (strncmp(argp, "type;", 5) == 0) || (strncmp(argp, "type=", 5) == 0) ) { testitem_t *testitem = calloc(1, sizeof(testitem_t)); testedhost_t *hostitem = calloc(1, sizeof(testedhost_t)); http_data_t *httptest; hostitem->hostname = strdup("localhost"); testitem->host = hostitem; testitem->testspec = testspec; strcpy(hostitem->ip, ip); add_url_to_dns_queue(testspec); add_http_test(testitem); testitem->next = NULL; thead = testitem; httptest = (http_data_t *)testitem->privdata; if (httptest && httptest->tcptest) { printf("TCP connection goes to %s:%d\n", inet_ntoa(httptest->tcptest->addr.sin_addr), ntohs(httptest->tcptest->addr.sin_port)); printf("Request:\n%s\n", httptest->tcptest->sendtxt); } } else if (strncmp(argp, "dns=", 4) == 0) { strbuffer_t *banner = newstrbuffer(0); int result; result = dns_test_server(ip, argp+4, banner); printf("DNS test result=%d\nBanner:%s\n", result, STRBUF(banner)); } else { add_tcp_test(ip, atoi(port), testspec, NULL, srcip, NULL, 0, NULL, NULL, NULL, NULL); } } else { printf("Invalid testspec '%s'\n", argv[argi]); } } } do_tcp_tests(timeout, concurrency); show_tcp_test_results(); return 0; }