From: <st...@us...> - 2011-09-04 17:49:39
|
Revision: 6750 http://xymon.svn.sourceforge.net/xymon/?rev=6750&view=rev Author: storner Date: 2011-09-04 17:49:33 +0000 (Sun, 04 Sep 2011) Log Message: ----------- Allow loading of the full hosts.cfg from xymond. Allow xymongen to "read" hosts.cfg from xymond for both data and page layout. Modified Paths: -------------- trunk/lib/loadhosts.h trunk/lib/loadhosts_file.c trunk/xymond/xymond.c trunk/xymongen/loadlayout.c Modified: trunk/lib/loadhosts.h =================================================================== --- trunk/lib/loadhosts.h 2011-09-04 17:26:31 UTC (rev 6749) +++ trunk/lib/loadhosts.h 2011-09-04 17:49:33 UTC (rev 6750) @@ -82,6 +82,7 @@ extern int load_hostnames(char *hostsfn, char *extrainclude, int fqdn); extern int load_hostinfo(char *hostname); +extern char *hostscfg_content(void); extern char *knownhost(char *hostname, char *hostip, enum ghosthandling_t ghosthandling); extern int knownloghost(char *logdir); extern void *hostinfo(char *hostname); Modified: trunk/lib/loadhosts_file.c =================================================================== --- trunk/lib/loadhosts_file.c 2011-09-04 17:26:31 UTC (rev 6749) +++ trunk/lib/loadhosts_file.c 2011-09-04 17:49:33 UTC (rev 6750) @@ -45,24 +45,18 @@ } } -int load_hostnames(char *hostsfn, char *extrainclude, int fqdn) + +static strbuffer_t *contentbuffer = NULL; + +static int prepare_fromfile(char *hostsfn, char *extrainclude) { - /* Return value: 0 for load OK, 1 for "No files changed since last load", -1 for error (file not found) */ static void *hostfiles = NULL; FILE *hosts; - int ip1, ip2, ip3, ip4, groupid, pageidx; - char hostname[4096], *dgname; strbuffer_t *inbuf; - pagelist_t *curtoppage, *curpage, *pgtail; - namelist_t *nametail = NULL; - void * htree; - load_hostinfo(NULL); - /* First check if there were no modifications at all */ if (hostfiles) { if (!stackfmodified(hostfiles)){ - dbgprintf("No files modified, skipping reload of %s\n", hostsfn); return 1; } else { @@ -71,6 +65,97 @@ } } + if (!contentbuffer) contentbuffer = newstrbuffer(0); + clearstrbuffer(contentbuffer); + + hosts = stackfopen(hostsfn, "r", &hostfiles); + if (hosts == NULL) return -1; + + inbuf = newstrbuffer(0); + while (stackfgets(inbuf, extrainclude)) { + sanitize_input(inbuf, 0, 0); + addtostrbuffer(contentbuffer, inbuf); + addtobuffer(contentbuffer, "\n"); + } + + stackfclose(hosts); + freestrbuffer(inbuf); + + return 0; +} + +static int prepare_fromnet(void) +{ + static char contentmd5[33] = { '\0', }; + sendreturn_t *sres; + sendresult_t sendstat; + char *fdata, *fhash; + + sres = newsendreturnbuf(1, NULL); + sendstat = sendmessage("config hosts.cfg", NULL, XYMON_TIMEOUT, sres); + if (sendstat != XYMONSEND_OK) { + errprintf("Cannot load hosts.cfg from xymond, code %d\n", sendstat); + return -1; + } + + fdata = getsendreturnstr(sres, 1); + fhash = md5hash(fdata); + if (strcmp(contentmd5, fhash) == 0) { + /* No changes */ + xfree(fdata); + return 1; + } + + if (contentbuffer) freestrbuffer(contentbuffer); + contentbuffer = convertstrbuffer(fdata, 0); + strcpy(contentmd5, fhash); + + return 0; +} + + +char *hostscfg_content(void) +{ + return strdup(STRBUF(contentbuffer)); +} + +int load_hostnames(char *hostsfn, char *extrainclude, int fqdn) +{ + /* Return value: 0 for load OK, 1 for "No files changed since last load", -1 for error (file not found) */ + int prepresult; + int ip1, ip2, ip3, ip4, groupid, pageidx; + char hostname[4096], *dgname; + pagelist_t *curtoppage, *curpage, *pgtail; + namelist_t *nametail = NULL; + void * htree; + char *cfgdata, *inbol, *ineol, insavchar; + + load_hostinfo(NULL); + + if ((*hostsfn == '!') || extrainclude) + prepresult = prepare_fromfile(hostsfn+1, extrainclude); + else if ((*hostsfn == '@') || (strcmp(hostsfn, xgetenv("HOSTSCFG")) == 0)) { + prepresult = prepare_fromnet(); + if (prepresult == -1) { + errprintf("Failed to load from xymond, reverting to file-load\n"); + prepresult = prepare_fromfile(xgetenv("HOSTSCFG"), extrainclude); + } + } + else + prepresult = prepare_fromfile(hostsfn, extrainclude); + + /* Did we get the data ? */ + if (prepresult == -1) { + errprintf("Cannot load host data\n"); + return -1; + } + + /* Any modifications at all ? */ + if (prepresult == 1) { + dbgprintf("No files modified, skipping reload of %s\n", hostsfn); + return 1; + } + MEMDEFINE(hostname); MEMDEFINE(l); @@ -80,21 +165,26 @@ pageidx = groupid = 0; dgname = NULL; - hosts = stackfopen(hostsfn, "r", &hostfiles); - if (hosts == NULL) return -1; - - inbuf = newstrbuffer(0); htree = xtreeNew(strcasecmp); - while (stackfgets(inbuf, extrainclude)) { - sanitize_input(inbuf, 0, 0); + inbol = cfgdata = hostscfg_content(); + while (inbol && *inbol) { + inbol += strspn(inbol, " \t"); + ineol = strchr(inbol, '\n'); + if (ineol) { + while ((ineol > inbol) && (isspace(*ineol) || (*ineol == '\n'))) ineol--; + if (*ineol != '\n') ineol++; - if (strncmp(STRBUF(inbuf), "page", 4) == 0) { + insavchar = *ineol; + *ineol = '\0'; + } + + if (strncmp(inbol, "page", 4) == 0) { pagelist_t *newp; char *name, *title; pageidx = groupid = 0; if (dgname) xfree(dgname); dgname = NULL; - if (get_page_name_title(STRBUF(inbuf), "page", &name, &title) == 0) { + if (get_page_name_title(inbol, "page", &name, &title) == 0) { newp = (pagelist_t *)malloc(sizeof(pagelist_t)); newp->pagepath = strdup(name); newp->pagetitle = (title ? strdup(title) : NULL); @@ -106,13 +196,13 @@ curpage = curtoppage = newp; } } - else if (strncmp(STRBUF(inbuf), "subpage", 7) == 0) { + else if (strncmp(inbol, "subpage", 7) == 0) { pagelist_t *newp; char *name, *title; pageidx = groupid = 0; if (dgname) xfree(dgname); dgname = NULL; - if (get_page_name_title(STRBUF(inbuf), "subpage", &name, &title) == 0) { + if (get_page_name_title(inbol, "subpage", &name, &title) == 0) { newp = (pagelist_t *)malloc(sizeof(pagelist_t)); newp->pagepath = malloc(strlen(curtoppage->pagepath) + strlen(name) + 2); sprintf(newp->pagepath, "%s/%s", curtoppage->pagepath, name); @@ -126,14 +216,14 @@ curpage = newp; } } - else if (strncmp(STRBUF(inbuf), "subparent", 9) == 0) { + else if (strncmp(inbol, "subparent", 9) == 0) { pagelist_t *newp, *parent; char *pname, *name, *title; pageidx = groupid = 0; if (dgname) xfree(dgname); dgname = NULL; parent = NULL; - if (get_page_name_title(STRBUF(inbuf), "subparent", &pname, &title) == 0) { + if (get_page_name_title(inbol, "subparent", &pname, &title) == 0) { for (parent = pghead; (parent && !pagematch(parent, pname)); parent = parent->next); } @@ -151,13 +241,13 @@ curpage = newp; } } - else if (strncmp(STRBUF(inbuf), "group", 5) == 0) { + else if (strncmp(inbol, "group", 5) == 0) { char *tok, *inp; groupid++; if (dgname) xfree(dgname); dgname = NULL; - tok = strtok(STRBUF(inbuf), " \t"); + tok = strtok(inbol, " \t"); if ((strcmp(tok, "group-only") == 0) || (strcmp(tok, "group-except") == 0)) { tok = strtok(NULL, " \t"); } @@ -197,7 +287,7 @@ } } } - else if (sscanf(STRBUF(inbuf), "%d.%d.%d.%d %s", &ip1, &ip2, &ip3, &ip4, hostname) == 5) { + else if (sscanf(inbol, "%d.%d.%d.%d %s", &ip1, &ip2, &ip3, &ip4, hostname) == 5) { char *startoftags, *tag, *delim; int elemidx, elemsize; char clientname[4096]; @@ -211,7 +301,7 @@ (ip4 < 0) || (ip4 > 255)) { errprintf("Invalid IPv4-address for host %s (nibble outside 0-255 range): %d.%d.%d.%d\n", hostname, ip1, ip2, ip3, ip4); - continue; + goto nextline; } namelist_t *newitem = calloc(1, sizeof(namelist_t)); @@ -243,7 +333,7 @@ newitem->defaulthost = defaulthost; clientname[0] = downtime[0] = '\0'; - startoftags = strchr(STRBUF(inbuf), '#'); + startoftags = strchr(inbol, '#'); if (startoftags == NULL) startoftags = ""; else startoftags++; startoftags += strspn(startoftags, " \t\r\n"); newitem->allelems = strdup(startoftags); @@ -345,9 +435,20 @@ MEMUNDEFINE(clientname); MEMUNDEFINE(downtime); } + + +nextline: + if (ineol) { + *ineol = insavchar; + if (*ineol != '\n') ineol = strchr(ineol, '\n'); + + inbol = (ineol ? ineol+1 : NULL); + } + else + inbol = NULL; } - stackfclose(hosts); - freestrbuffer(inbuf); + + xfree(cfgdata); if (dgname) xfree(dgname); xtreeDestroy(htree); Modified: trunk/xymond/xymond.c =================================================================== --- trunk/xymond/xymond.c 2011-09-04 17:26:31 UTC (rev 6749) +++ trunk/xymond/xymond.c 2011-09-04 17:49:33 UTC (rev 6750) @@ -4824,6 +4824,11 @@ hostsfn = strdup(xgetenv("HOSTSCFG")); } + /* Make sure we load hosts.cfg file, and not via the network from ourselves */ + hostsfn = (char *)realloc(hostsfn, strlen(hostsfn) + 2); + memmove(hostsfn+1, hostsfn, strlen(hostsfn)); + *hostsfn = '!'; + if (listenport == 0) { if (xgetenv("XYMONDPORT")) listenport = atoi(xgetenv("XYMONDPORT")); Modified: trunk/xymongen/loadlayout.c =================================================================== --- trunk/xymongen/loadlayout.c 2011-09-04 17:26:31 UTC (rev 6749) +++ trunk/xymongen/loadlayout.c 2011-09-04 17:49:33 UTC (rev 6750) @@ -415,8 +415,6 @@ xymongen_page_t *load_layout(char *pgset) { - FILE *hostsfile; - strbuffer_t *inbuf; char pagetag[100], subpagetag[100], subparenttag[100], grouptag[100], summarytag[100], titletag[100], hosttag[100]; char *name, *link, *onlycols, *exceptcols; @@ -428,8 +426,12 @@ int ip1, ip2, ip3, ip4; char *p; int fqdn = get_fqdn(); + char *cfgdata, *inbol, *ineol, insavchar; - load_hostnames(xgetenv("HOSTSCFG"), "dispinclude", fqdn); + if (load_hostnames(xgetenv("HOSTSCFG"), "dispinclude", fqdn) != 0) { + errprintf("Cannot load host configuration\n"); + return NULL; + } dbgprintf("load_layout(pgset=%s)\n", textornull(pgset)); @@ -437,11 +439,6 @@ * load_hostnames() picks up the hostname definitions, but not the page * layout. So we will scan the file again, this time doing the layout. */ - hostsfile = stackfopen(xgetenv("HOSTSCFG"), "r", NULL); - if (hostsfile == NULL) { - errprintf("Cannot open the HOSTSCFG file '%s'\n", xgetenv("HOSTSCFG")); - return NULL; - } if (pgset == NULL) pgset = ""; sprintf(pagetag, "%spage", pgset); @@ -461,14 +458,22 @@ cursubparent = NULL; curtitle = NULL; - inbuf = newstrbuffer(0); - while (stackfgets(inbuf, "dispinclude")) { - sanitize_input(inbuf, 0, 0); if (STRBUFLEN(inbuf) == 0) continue; + inbol = cfgdata = hostscfg_content(); + while (inbol && *inbol) { + inbol += strspn(inbol, " \t"); + ineol = strchr(inbol, '\n'); + if (ineol) { + while ((ineol > inbol) && (isspace(*ineol) || (*ineol == '\n'))) ineol--; + if (*ineol != '\n') ineol++; - dbgprintf("load_layout: -- got line '%s'\n", STRBUF(inbuf)); + insavchar = *ineol; + *ineol = '\0'; + } - if (strncmp(STRBUF(inbuf), pagetag, strlen(pagetag)) == 0) { - getnamelink(STRBUF(inbuf), &name, &link); + dbgprintf("load_layout: -- got line '%s'\n", inbol); + + if (strncmp(inbol, pagetag, strlen(pagetag)) == 0) { + getnamelink(inbol, &name, &link); if (curpage == NULL) { /* First page - hook it on toppage as a subpage from there */ curpage = toppage->subpages = init_page(name, link); @@ -488,13 +493,13 @@ curhost = NULL; addtopagelist(curpage); } - else if (strncmp(STRBUF(inbuf), subpagetag, strlen(subpagetag)) == 0) { + else if (strncmp(inbol, subpagetag, strlen(subpagetag)) == 0) { if (curpage == NULL) { - errprintf("'subpage' ignored, no preceding 'page' tag : %s\n", STRBUF(inbuf)); - continue; + errprintf("'subpage' ignored, no preceding 'page' tag : %s\n", inbol); + goto nextline; } - getnamelink(STRBUF(inbuf), &name, &link); + getnamelink(inbol, &name, &link); if (cursubpage == NULL) { cursubpage = curpage->subpages = init_page(name, link); } @@ -511,13 +516,13 @@ curhost = NULL; addtopagelist(cursubpage); } - else if (strncmp(STRBUF(inbuf), subparenttag, strlen(subparenttag)) == 0) { + else if (strncmp(inbol, subparenttag, strlen(subparenttag)) == 0) { xymongen_page_t *parentpage, *walk; - getparentnamelink(STRBUF(inbuf), toppage, &parentpage, &name, &link); + getparentnamelink(inbol, toppage, &parentpage, &name, &link); if (parentpage == NULL) { - errprintf("'subparent' ignored, unknown parent page: %s\n", STRBUF(inbuf)); - continue; + errprintf("'subparent' ignored, unknown parent page: %s\n", inbol); + goto nextline; } cursubparent = init_page(name, link); @@ -537,10 +542,10 @@ curhost = NULL; addtopagelist(cursubparent); } - else if (strncmp(STRBUF(inbuf), grouptag, strlen(grouptag)) == 0) { - int sorthosts = (strstr(STRBUF(inbuf), "group-sorted") != NULL); + else if (strncmp(inbol, grouptag, strlen(grouptag)) == 0) { + int sorthosts = (strstr(inbol, "group-sorted") != NULL); - getgrouptitle(STRBUF(inbuf), pgset, &link, &onlycols, &exceptcols); + getgrouptitle(inbol, pgset, &link, &onlycols, &exceptcols); if (curgroup == NULL) { curgroup = init_group(link, onlycols, exceptcols, sorthosts); if (cursubparent != NULL) { @@ -566,7 +571,7 @@ if (curtitle) { curgroup->pretitle = curtitle; curtitle = NULL; } curhost = NULL; } - else if (sscanf(STRBUF(inbuf), "%3d.%3d.%3d.%3d %s", &ip1, &ip2, &ip3, &ip4, hostname) == 5) { + else if (sscanf(inbol, "%3d.%3d.%3d.%3d %s", &ip1, &ip2, &ip3, &ip4, hostname) == 5) { void *xymonhost = NULL; int dialup, nonongreen, crittime = 1; double warnpct = reportwarnlevel; @@ -579,7 +584,7 @@ char *hval; /* Check for ".default." hosts - they are ignored. */ - if (*hostname == '.') continue; + if (*hostname == '.') goto nextline; if (!fqdn) { /* Strip any domain from the hostname */ @@ -591,12 +596,12 @@ xymonhost = hostinfo(hostname); if (xymonhost == NULL) { errprintf("Confused - hostname '%s' cannot be found. Ignored\n", hostname); - continue; + goto nextline; } /* Check for no-display hosts - they are ignored. */ /* But only when we're building the default pageset */ - if ((strlen(pgset) == 0) && (xmh_item(xymonhost, XMH_FLAG_NODISP) != NULL)) continue; + if ((strlen(pgset) == 0) && (xmh_item(xymonhost, XMH_FLAG_NODISP) != NULL)) goto nextline; for (targetpagecount=0; (targetpagecount < MAX_TARGETPAGES_PER_HOST); targetpagecount++) targetpagelist[targetpagecount] = NULL; @@ -656,7 +661,7 @@ * 172.16.10.2 www.xymon.com # noconn * */ - if (strstr(STRBUF(inbuf), hosttag) == NULL) targetpagecount = 0; + if (strstr(inbol, hosttag) == NULL) targetpagecount = 0; } if (strlen(pgset) == 0) { @@ -782,28 +787,36 @@ } } } - else if (strncmp(STRBUF(inbuf), summarytag, strlen(summarytag)) == 0) { + else if (strncmp(inbol, summarytag, strlen(summarytag)) == 0) { /* summary row.column IP-ADDRESS-OF-PARENT http://xymon.com/ */ char sumname[MAX_LINE_LEN]; char receiver[MAX_LINE_LEN]; char url[MAX_LINE_LEN]; summary_t *newsum; - if (sscanf(STRBUF(inbuf), "summary %s %s %s", sumname, receiver, url) == 3) { + if (sscanf(inbol, "summary %s %s %s", sumname, receiver, url) == 3) { newsum = init_summary(sumname, receiver, url); newsum->next = sumhead; sumhead = newsum; } } - else if (strncmp(STRBUF(inbuf), titletag, strlen(titletag)) == 0) { + else if (strncmp(inbol, titletag, strlen(titletag)) == 0) { /* Save the title for the next entry */ - curtitle = strdup(skipwhitespace(skipword(STRBUF(inbuf)))); + curtitle = strdup(skipwhitespace(skipword(inbol))); } + +nextline: + if (ineol) { + *ineol = insavchar; + if (*ineol != '\n') ineol = strchr(ineol, '\n'); + + inbol = (ineol ? ineol+1 : NULL); + } + else + inbol = NULL; } - stackfclose(hostsfile); - freestrbuffer(inbuf); - + xfree(cfgdata); return toppage; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |