From: <df...@us...> - 2010-07-09 22:58:03
|
Revision: 6327 http://xymon.svn.sourceforge.net/xymon/?rev=6327&view=rev Author: df7cb Date: 2010-07-09 22:57:53 +0000 (Fri, 09 Jul 2010) Log Message: ----------- Big merge of the Hobbit -> Xymon rename from the 4.4.0 branch to trunk. Revisions merged: r5976 | storner | 2008-11-27 14:12:12 +0100 (Do, 27. Nov 2008) | 3 Zeilen Documentation etc. updates for renaming project to Xymon. r5977 | storner | 2008-11-27 14:13:45 +0100 (Do, 27. Nov 2008) | 3 Zeilen Add standard stanza for daemon init scripts. r5978 | storner | 2008-11-27 14:23:39 +0100 (Do, 27. Nov 2008) | 3 Zeilen Rename "hobbit.7" to "xymon.7" as part of project rename r5980 | storner | 2008-11-27 14:25:03 +0100 (Do, 27. Nov 2008) | 3 Zeilen Renamed to xymon.7 r5981 | storner | 2008-11-27 14:27:10 +0100 (Do, 27. Nov 2008) | 3 Zeilen Actually updated the contents of the file for the Xymon rename. Modified Paths: -------------- trunk/CREDITS trunk/README trunk/README.CLIENT trunk/bbdisplay/bbgen.1 trunk/bbnet/bb-services.5 trunk/bbnet/bbretest-net.sh.1 trunk/bbnet/bbtest-net.1 trunk/bbnet/hobbitping.1 trunk/bbproxy/bbmessage.cgi.8 trunk/bbproxy/bbproxy.8 trunk/build/makedeb.sh trunk/build/makehtml.sh trunk/common/bb-hosts.5 trunk/common/bb.1 trunk/common/bbcmd.1 trunk/common/bbdigest.1 trunk/common/bbhostgrep.1 trunk/common/bbhostshow.1 trunk/common/clientlaunch.cfg.5 trunk/common/clientupdate.1 trunk/common/hobbitclient.cfg.5 trunk/common/hobbitlaunch.8 trunk/common/hobbitlaunch.cfg.5 trunk/common/hobbitserver.cfg.5 trunk/common/logfetch.1 trunk/common/msgcache.8 trunk/common/orcahobbit.1 trunk/configure trunk/configure.client trunk/configure.server trunk/debian/changelog trunk/debian/control trunk/debian/hobbit-client.init trunk/debian/hobbit-client.postinst trunk/debian/hobbit-client.preinst trunk/debian/hobbit.conffiles trunk/debian/hobbit.config trunk/debian/hobbit.init trunk/debian/hobbit.logrotate trunk/debian/hobbit.postinst trunk/debian/hobbit.preinst trunk/debian/rules trunk/docs/about.html trunk/docs/bb-to-hobbit.html trunk/docs/criticalsystems.html trunk/docs/hobbit-alerts.html trunk/docs/hobbit-config.html trunk/docs/hobbit-mrtg.html trunk/docs/howtograph.html trunk/docs/install.html trunk/docs/known-issues.html trunk/docs/man-index.html trunk/hobbitd/bbcombotest.1 trunk/hobbitd/bbcombotest.cfg.5 trunk/hobbitd/client-local.cfg.5 trunk/hobbitd/etcfiles/bb-hosts.DIST trunk/hobbitd/etcfiles/client-local.cfg trunk/hobbitd/etcfiles/columndoc.csv trunk/hobbitd/etcfiles/hobbit-apache-open.DIST trunk/hobbitd/etcfiles/hobbit-apache-secure.DIST trunk/hobbitd/etcfiles/hobbit-clients.cfg trunk/hobbitd/etcfiles/hobbitcgi.cfg.DIST trunk/hobbitd/etcfiles/hobbitlaunch.cfg.DIST trunk/hobbitd/etcfiles/hobbitserver.cfg.DIST trunk/hobbitd/hobbit-alerts.cfg.5 trunk/hobbitd/hobbit-clients.cfg.5 trunk/hobbitd/hobbit-mailack.8 trunk/hobbitd/hobbitd.8 trunk/hobbitd/hobbitd_alert.8 trunk/hobbitd/hobbitd_channel.8 trunk/hobbitd/hobbitd_client.8 trunk/hobbitd/hobbitd_filestore.8 trunk/hobbitd/hobbitd_history.8 trunk/hobbitd/hobbitd_hostdata.8 trunk/hobbitd/hobbitd_rrd.8 trunk/hobbitd/hobbitd_sample.8 trunk/hobbitd/hobbitfetch.8 trunk/hobbitd/hobbitweb.5 trunk/hobbitd/trimhistory.8 trunk/hobbitd/webfiles/acknowledge_header trunk/hobbitd/webfiles/bb2_header trunk/hobbitd/webfiles/bb_footer trunk/hobbitd/webfiles/bb_header trunk/hobbitd/webfiles/bbnk_header trunk/hobbitd/webfiles/bbrep_header trunk/hobbitd/webfiles/bbsnap2_header trunk/hobbitd/webfiles/bbsnap_header trunk/hobbitd/webfiles/bbsnapnk_header trunk/hobbitd/webfiles/columndoc_header trunk/hobbitd/webfiles/confreport_front trunk/hobbitd/webfiles/confreport_header trunk/hobbitd/webfiles/event_header trunk/hobbitd/webfiles/findhost_header trunk/hobbitd/webfiles/ghosts_header trunk/hobbitd/webfiles/graphs_header trunk/hobbitd/webfiles/hist_header trunk/hobbitd/webfiles/histlog_header trunk/hobbitd/webfiles/hobbitnk_footer trunk/hobbitd/webfiles/hobbitnk_header trunk/hobbitd/webfiles/hostgraphs_header trunk/hobbitd/webfiles/hostsvc_header trunk/hobbitd/webfiles/info_header trunk/hobbitd/webfiles/maint_header trunk/hobbitd/webfiles/maintact_header trunk/hobbitd/webfiles/nkedit_header trunk/hobbitd/webfiles/notify_header trunk/hobbitd/webfiles/replog_header trunk/hobbitd/webfiles/report_form trunk/hobbitd/webfiles/report_form_daily trunk/hobbitd/webfiles/report_form_monthly trunk/hobbitd/webfiles/report_form_weekly trunk/hobbitd/webfiles/report_header trunk/hobbitd/webfiles/snapshot_form trunk/hobbitd/webfiles/snapshot_header trunk/hobbitd/webfiles/zoom.js trunk/hobbitd/wwwfiles/menu/menu_items.js.DIST trunk/rpm/hobbit.spec trunk/web/bb-ack.cgi.1 trunk/web/bb-csvinfo.cgi.1 trunk/web/bb-datepage.cgi.1 trunk/web/bb-eventlog.cgi.1 trunk/web/bb-findhost.cgi.1 trunk/web/bb-hist.cgi.1 trunk/web/bb-rep.cgi.1 trunk/web/bb-replog.cgi.1 trunk/web/bb-snapshot.cgi.1 trunk/web/bb-webpage.cgi.1 trunk/web/hobbit-ackinfo.cgi.1 trunk/web/hobbit-confreport.cgi.1 trunk/web/hobbit-enadis.cgi.8 trunk/web/hobbit-ghosts.cgi.1 trunk/web/hobbit-hostgraphs.cgi.1 trunk/web/hobbit-nkedit.cgi.1 trunk/web/hobbit-nkview.cfg.5 trunk/web/hobbit-nkview.cgi.1 trunk/web/hobbit-statusreport.cgi.1 trunk/web/hobbitcgi.cfg.5 trunk/web/hobbitgraph.cfg.5 trunk/web/hobbitgraph.cgi.1 trunk/web/hobbitsvc.cgi.1 Added Paths: ----------- trunk/common/xymon.7 Removed Paths: ------------- trunk/common/hobbit.7 Modified: trunk/CREDITS =================================================================== --- trunk/CREDITS 2010-07-09 22:06:30 UTC (rev 6326) +++ trunk/CREDITS 2010-07-09 22:57:53 UTC (rev 6327) @@ -1,8 +1,8 @@ The following people have contributed to the development -of Hobbit, bbgen and the bbtest tools, by helping me with testing, -suggesting new features or improvements, pointing out bugs, -or even coming up with patches. I am very grateful for -their help. +of Xymon, Hobbit, bbgen and the bbtest tools, by helping me +with testing, suggesting new features or improvements, +pointing out bugs, or even coming up with patches. +I am very grateful for their help. Marco Avvisano Paul Backer Modified: trunk/README =================================================================== --- trunk/README 2010-07-09 22:06:30 UTC (rev 6326) +++ trunk/README 2010-07-09 22:57:53 UTC (rev 6327) @@ -1,15 +1,21 @@ -README file for Hobbit -====================== +README file for Xymon +===================== What is it ? ------------ -Hobbit is a system for monitoring your network servers and +Xymon is a system for monitoring your network servers and applications. It is heavily inspired by the Big Brother tool, but is a complete re-implementation with a lot of added functionality and performance improvements. A slightly more -detailed rationale for Hobbit is in the docs/about.html file. +detailed rationale for Xymon is in the docs/about.html file. +NOTE: On Nov 10 2008, Hobbit was officially renamed to +"Xymon". The name "Hobbit" is trademarked, and therefore +cannot be used without permission from the trademark +holders. The 4.2.1 release is an interim version where +the name change has not been fully implemented. + How to install -------------- Detailed installation instructions are in the @@ -25,32 +31,32 @@ Documentation ------------- The docs/ directory holds information about the basic -installation and configuration of Hobbit. All of the -tools and configuration files in Hobbit have man-pages -that are installed automatically when installing Hobbit. -The hobbit(7) man page provides an introduction to -Hobbit and has pointers to the other man-pages of the +installation and configuration of Xymon. All of the +tools and configuration files in Xymon have man-pages +that are installed automatically when installing Xymon. +The xymon(7) man page provides an introduction to +Xymon and has pointers to the other man-pages of the package. License ------- -Hobbit is copyrighted (C) 2002-2008 by Henrik Storner. +Xymon is copyrighted (C) 2002-2008 by Henrik Storner. -Hobbit is Open Source software, made available under the +Xymon is Open Source software, made available under the GNU General Public License (GPL) version 2, with the explicit exemption that linking with the OpenSSL libraries is permitted. See the file COPYING for details. -Hobbit is released under the GPL, and therefore available +Xymon is released under the GPL, and therefore available free of charge. However, if you find it useful and want to encourage further development, I do have an Amazon wishlist at http://www.amazon.co.uk/ - just search for my mail-address (he...@hs...). A contribution in the form of a book, CD or DVD is appreciated. -The following files are distributed with Hobbit and used -by Hobbit, but written by others and are NOT licensed under the GPL: +The following files are distributed with Xymon and used +by Xymon, but written by others and are NOT licensed under the GPL: * The lib/sha2.c file is (C) 2005 Olivier Gay <oli...@a3...>, available under a BSD license. See the file for details. It was @@ -59,7 +65,7 @@ * The lib/rmd160c.c, lib/rmdconst.h, lib/rmdlocl.h and lib/ripemd.h files are Copyright (C) 1995-1998 Eric Young (ea...@cr...). The license is BSD-like, but see these files for the exact license. - The version in Hobbit was taken from the FreeBSD CVS archive. + The version in Xymon was taken from the FreeBSD CVS archive. * The lib/md5.c and lib/md5.h files are (C) L. Peter Deutsch, available under a BSD-like license from @@ -67,7 +73,7 @@ * The lib/sha1.c file is originally written by by Steve Reid <st...@ed...> and placed in the public domain. The version - in Hobbit was taken from the "mutt" mail client sources, so + in Xymon was taken from the "mutt" mail client sources, so some changes were done by Thomas Roessler <roe...@do...>. * The lib/rbtr.c and lib/rbtr.h files are by Thomas Nieman, @@ -78,8 +84,8 @@ Support ------- -There is an open mailing list for discussing Hobbit, asking -questions about how to use Hobbit, reporting bugs etc. You +There is an open mailing list for discussing Xymon, asking +questions about how to use Xymon, reporting bugs etc. You can subscribe to the list by sending an e-mail to hob...@hs... @@ -97,5 +103,5 @@ hob...@hs... to be added to the mailing list. This is a moderated list, used -only for announcing new Hobbit releases. +only for announcing new Xymon releases. Modified: trunk/README.CLIENT =================================================================== --- trunk/README.CLIENT 2010-07-09 22:06:30 UTC (rev 6326) +++ trunk/README.CLIENT 2010-07-09 22:57:53 UTC (rev 6327) @@ -1,9 +1,9 @@ -Unix client for Hobbit +Unix client for Xymon ====================== -As of version 4.1, Hobbit ships with a native client for +As of version 4.1, Xymon ships with a native client for most Unix-based systems. -The Hobbit client will generate status columns for: +The Xymon client will generate status columns for: * cpu : CPU utilisation * disk : Filesystem (disk) utilisation * files : File- and directory attributes and sizes @@ -19,7 +19,7 @@ In the default setup, all configuration of disk thresholds, load limits, which processes to monitor etc. is done on the -Hobbit server, NOT on the client. This is to allow centralized +Xymon server, NOT on the client. This is to allow centralized configuration of the monitored systems. If you prefer to have the client configuration done locally @@ -30,7 +30,7 @@ client requires the PCRE libraries to be installed on the client host. -The Hobbit client is released under the GNU GPL, version 2 +The Xymon client is released under the GNU GPL, version 2 or later. See the file COPYING for details. @@ -38,22 +38,22 @@ ============ Building the client package requires a working C compiler and GNU make on the target platform. None of the extra libraries -needed for building Hobbit are used by the client - so a +needed for building Xymon are used by the client - so a plain C compiler installation with GNU make is all that is needed. To build the client: - - create a "hobbit" userid on the system + - create a "xymon" userid on the system (not required, but recommended). - - extract the Hobbit source archive - - cd to the hobbit-X.X directory + - extract the Xymon source archive + - cd to the xymon-X.X directory - run "./configure --client; make" - as root, run "make install" The client installation is kept entirely within -the "hobbit" users' home-directory. All client-related -files are in the ~hobbit/client/ directory. If convenient, +the "xymon" users' home-directory. All client-related +files are in the ~xymon/client/ directory. If convenient, this directory can be copied directly to other systems of the same type, so you need not build the client from source on all systems. @@ -61,7 +61,7 @@ Running it ========== -To start the client, su to the "hobbit" user, then run +To start the client, su to the "xymon" user, then run $HOME/client/runclient.sh start You should arrange for your boot-time scripts to run this @@ -70,14 +70,14 @@ Client configuration ==================== -All of the normal configuration is done on the Hobbit SERVER. +All of the normal configuration is done on the Xymon SERVER. See the hobbit-clients.cfg(5) and client-local.cfg(5) man- -pages on the Hobbit server. +pages on the Xymon server. Hostname detection ------------------ -The client reports to Hobbit using the hostname taken from +The client reports to Xymon using the hostname taken from the "uname -n" command output. Whether this provides a fully qualified DNS name (myserver.foo.com) or a simple hostname (myserver) varies a lot. If your client gets it wrong, you @@ -118,16 +118,16 @@ environment variables commonly used by Big Brother-based extensions are made available by hobbitlaunch for the scripts, so in most cases extensions written for the Big Brother client will work -without modifications on Hobbit. +without modifications on Xymon. Each script should have a separate section in the file, like the default one that runs the core client: [myextension] - ENVFILE /usr/lib/hobbit/client/etc/hobbitclient.cfg - CMD /usr/lib/hobbit/client/ext/myscript.sh + ENVFILE /usr/lib/xymon/client/etc/hobbitclient.cfg + CMD /usr/lib/xymon/client/ext/myscript.sh INTERVAL 5m - LOGFILE /usr/lib/hobbit/client/logs/myscript.log + LOGFILE /usr/lib/xymon/client/logs/myscript.log See the hobbitlaunch.cfg(5) man-page for a full description of this file. Modified: trunk/bbdisplay/bbgen.1 =================================================================== --- trunk/bbdisplay/bbgen.1 2010-07-09 22:06:30 UTC (rev 6326) +++ trunk/bbdisplay/bbgen.1 2010-07-09 22:57:53 UTC (rev 6327) @@ -1,6 +1,6 @@ -.TH BBGEN 1 "Version 4.2.0: 9 Aug 2006" "Hobbit Monitor" +.TH BBGEN 1 "Version 4.2.1: 27 Nov 2008" "Xymon" .SH NAME -bbgen \- Hobbit webpage generator +bbgen \- Xymon webpage generator .SH SYNOPSIS .B "bbgen -?" .br @@ -14,7 +14,7 @@ .SH DESCRIPTION \fBbbgen\fR -generates the overview webpages for the Hobbit monitor. These are the webpages +generates the overview webpages for the Xymon monitor. These are the webpages that show the overall status of your hosts, not the detailed status pages for each test. @@ -45,9 +45,9 @@ parameter is a formatting string with the name of the web page - you can put a "%s" in it which will be replaced by the hostname being accessed. E.g. if you use the bb-notes extension from www.deadcat.net, you would -enable this with "--docurl=/hobbit/admin/notes.php?host=%s". For the host +enable this with "--docurl=/xymon/admin/notes.php?host=%s". For the host www.storner.dk this will result in a link to -"/hobbit/admin/notes.php?host=www.storner.dk". +"/xymon/admin/notes.php?host=www.storner.dk". .sp .IP "--doccgi=URL" This option is deprecated; please use --docurl instead. @@ -55,7 +55,7 @@ .IP "--no-doc-window" By default, links to documentation for hosts and services cause a new window to appear with the information. With this option, the documentation -will appear in the same window as the Hobbit status. +will appear in the same window as the Xymon status. .sp .IP "--htmlextension=.EXTENSION" Sets the filename extension used for the webpages generated by bbgen. @@ -284,7 +284,7 @@ if ((typeof window.sidebar == "object") && (typeof window.sidebar.addPanel == "function")) .br - window.sidebar.addPanel ("Hobbit", + window.sidebar.addPanel ("Xymon", .br "http://your.server.com/nstab.html",""); .br @@ -325,7 +325,7 @@ warnings also, use "--nslimit=yellow". .IP "--rss -Generate RSS/RDF content delivery stream of your Hobbit +Generate RSS/RDF content delivery stream of your Xymon alerts. This output format can be dynamically embedded in other web pages, much like the live newsfeeds often seen on web sites. Two RSS files will be generated, one reflects the BB2 page, the other reflects the BBNK @@ -387,7 +387,7 @@ interpreting the delimiter character as a commandline delimiter. .sp .IP "--snapshot=TIME" -Generate a snapshot of the Hobbit pages, as they appeared at +Generate a snapshot of the Xymon pages, as they appeared at TIME. TIME is given as seconds since Jan 1st 1970 00:00 UTC. Normally used via the .I bb-snapshot.cgi(1) @@ -407,7 +407,7 @@ responsible for the run-time of bbgen. .br Note: This information is also provided in the output sent to the -Hobbit display when using the "--report" option. +Xymon display when using the "--report" option. .SH BUILDING ALTERNATE PAGESETS @@ -416,7 +416,7 @@ .br Suppose you have two groups of people looking at the BB webpages. Group A wants to have the hosts grouped by the client, -they belong to. This is how you have Hobbit set up - the default pageset. +they belong to. This is how you have Xymon set up - the default pageset. Now group B wants to have the hosts grouped by operating system - let us call it the "os" set. Then you would add the page layout to bb-hosts like this: @@ -474,23 +474,23 @@ .nf #!/bin/sh -BBWEB="/hobbit/os" $BBHOME/bin/bbgen \\ +BBWEB="/xymon/os" $BBHOME/bin/bbgen \\ --pageset=os --template=os \\ $BBHOME/www/os/ .fi .LP Save this to $BBHOME/ext/os-display.sh, and set this up to run as -a Hobbit extension; this means addng an extra section to hobbitlaunch.cfg +a Xymon extension; this means addng an extra section to hobbitlaunch.cfg to run it. This generates the pages. There are some important options used here: .br -* BBWEB="/hobbit/os" environment variable, and the +* BBWEB="/xymon/os" environment variable, and the "$BBHOME/www/os/" option work together, and places the new pageset HTML files in a subdirectory off the normal - Hobbit webroot. If you normally access the Hobbit pages as - "http://hobbit.acme.com/hobbit/", you will then access - the new pageset as "http://hobbit.acme.com/hobbit/os/" + Xymon webroot. If you normally access the Xymon pages as + "http://xymon.acme.com/xymon/", you will then access + the new pageset as "http://xymon.acme.com/xymon/os/" NB: The directory given as BBWEB must contain a symbolic link to the $BBHOME/www/html/ directory, or links to individual status messages will not work. Similar links @@ -511,11 +511,11 @@ .SH USING BBGEN FOR REPORTS bbgen reporting is implemented via drop-in replacements for the -standard Hobbit reporting scripts (bb-rep.sh and bb-replog.sh) installed +standard Xymon reporting scripts (bb-rep.sh and bb-replog.sh) installed in your webservers cgi-bin directory. These two shell script have been replaced with two very small -shell-scripts, that merely setup the Hobbit environment variables, +shell-scripts, that merely setup the Xymon environment variables, and invoke the .I bb-rep.cgi(1) or @@ -540,7 +540,7 @@ the links in the upper left corner (to bb-ack.html, bb2.html etc.) no longer works. To fix these, change your $BBHOME/web/bbrep_header file so these links do not refer to "&BBWEB" but to the normal -URL prefix for your Hobbit pages. +URL prefix for your Xymon pages. .SH SLA REPORTING @@ -566,7 +566,7 @@ calculation. If an outage occurs during the time defined as possible "DOWNTIME", then the failure is reported with a status of "blue". (The same color is used if you "disable" then host -using the Hobbit "disable" function). The time when the +using the Xymon "disable" function). The time when the test status is "blue" is not included in the SLA calculation, neither in the amount of time where the host is considered down, nor in the total amount of time that the report covers. So @@ -642,7 +642,7 @@ be made accessible from), and an output directory where the report files are saved. If you specify BBWEB, you should probably also define the BBHELPSKIN and BBNOTESSKIN environment variables. -These should point to the URL where your Hobbit help- and notes-files +These should point to the URL where your Xymon help- and notes-files are located; if they are not defined, the links to help- and notes-files will point inside the report directory and will probably not work. @@ -652,14 +652,14 @@ START=`date +%s --date="22 Jun 2003 00:00:00"` END=`date +%s --date="22 Jun 2003 23:59:59"` BBWEB=/reports/bigbrother/daily/2003/06/22 \\ - BBHELPSKIN=/hobbit/help \\ - BBNOTESSKIN=/hobbit/notes \\ + BBHELPSKIN=/xymon/help \\ + BBNOTESSKIN=/xymon/notes \\ bbgen --reportopts=$START:$END:1:crit \\ --subpagecolumns=2 \\ - /var/www/docroot/reports/hobbit/daily/2003/06/22 + /var/www/docroot/reports/xymon/daily/2003/06/22 The "BBWEB" setting means that the report will be available with -a URL of "http://www.server.com/reports/hobbit/daily/2003/06/22". +a URL of "http://www.server.com/reports/xymon/daily/2003/06/22". The report contains internal links that use this URL, so it cannot be easily moved to another location. @@ -674,5 +674,5 @@ .SH "SEE ALSO" bb-hosts(5), hobbitserver.cfg(5), hobbitlaunch.cfg(5), bb-rep.cgi(1), -bb-snapshot.cgi(1), hobbit(7) +bb-snapshot.cgi(1), xymon(7) Modified: trunk/bbnet/bb-services.5 =================================================================== --- trunk/bbnet/bb-services.5 2010-07-09 22:06:30 UTC (rev 6326) +++ trunk/bbnet/bb-services.5 2010-07-09 22:57:53 UTC (rev 6327) @@ -1,4 +1,4 @@ -.TH BB-SERVICES 5 "Version 4.2.0: 9 Aug 2006" "Hobbit Monitor" +.TH BB-SERVICES 5 "Version 4.2.1: 27 Nov 2008" "Xymon" .SH NAME bb-services \- Configuration of TCP network services Modified: trunk/bbnet/bbretest-net.sh.1 =================================================================== --- trunk/bbnet/bbretest-net.sh.1 2010-07-09 22:06:30 UTC (rev 6326) +++ trunk/bbnet/bbretest-net.sh.1 2010-07-09 22:57:53 UTC (rev 6327) @@ -1,12 +1,12 @@ -.TH BBRETEST-NET.SH 1 "Version 4.2.0: 9 Aug 2006" "Hobbit Monitor" +.TH BBRETEST-NET.SH 1 "Version 4.2.1: 27 Nov 2008" "Xymon" .SH NAME -bbretest-net.sh \- Hobbit network re-test tool +bbretest-net.sh \- Xymon network re-test tool .SH SYNOPSIS .B "bbretest-net.sh" .SH DESCRIPTION \fBbbretest-net.sh\fR -is an extension script for Hobbit that runs on the network +is an extension script for Xymon that runs on the network test server. It picks up the failing network tests executed by the .I bbtest-net(1) program, and repeats these tests with a faster test cycle @@ -36,5 +36,5 @@ Temporary file managed by bbtest-net with the hostnames that bbretest-net.sh should test. .SH "SEE ALSO" -bbtest-net(1), hobbit(7), hobbitlaunch.cfg(5) +bbtest-net(1), xymon(7), hobbitlaunch.cfg(5) Modified: trunk/bbnet/bbtest-net.1 =================================================================== --- trunk/bbnet/bbtest-net.1 2010-07-09 22:06:30 UTC (rev 6326) +++ trunk/bbnet/bbtest-net.1 2010-07-09 22:57:53 UTC (rev 6327) @@ -1,6 +1,6 @@ -.TH BBTEST-NET 1 "Version 4.2.0: 9 Aug 2006" "Hobbit Monitor" +.TH BBTEST-NET 1 "Version 4.2.1: 27 Nov 2008" "Xymon" .SH NAME -bbtest-net \- Hobbit network test tool +bbtest-net \- Xymon network test tool .SH SYNOPSIS .B "bbtest-net -?" .br @@ -14,7 +14,7 @@ .SH DESCRIPTION .I bbtest-net(1) -handles the network tests of hosts defined in the Hobbit configuration +handles the network tests of hosts defined in the Xymon configuration file, bb-hosts. It is normally run at regular intervals by .I hobbitlaunch(8) via an entry in the @@ -193,7 +193,7 @@ By default, bbtest-net sends some extra information in the status messages, called "flags". These are used by bbgen e.g. to pick different icons for reversed tests when -generating the Hobbit webpages. This option makes +generating the Xymon webpages. This option makes bbtest-net omit these flags from the status messages. @@ -237,7 +237,7 @@ .SH OPTIONS FOR HTTP (WEB) TESTS .IP --content=CONTENTTESTNAME -Determines the name of the column Hobbit displays for content checks. +Determines the name of the column Xymon displays for content checks. The default is "content". If you have used the "cont.sh" or "cont2.sh" scripts earlier, you may want to use "--content=cont" to report content checks using the same test name as these scripts do. @@ -245,7 +245,7 @@ .SH OPTIONS FOR SSL TESTS .IP --ssl=SSLCERTTESTNAME -Determines the name of the column Hobbit displays for the SSL certificate checks. +Determines the name of the column Xymon displays for the SSL certificate checks. The default is "sslcert". .IP --no-ssl Disables reporting of the SSL certificate check. @@ -460,7 +460,7 @@ Defines the maximum number of status messages that can be sent in one combo message. Default is 0 - no limit. .br -In practice, the maximum size of a single Hobbit message +In practice, the maximum size of a single Xymon message sets a limit - the default value for the maximum message size is 32 KB, but that will easily accomodate 100 status messages per transmission. So if you want to experiment @@ -506,7 +506,7 @@ utility. Used by bbtest-net for the "rpc" service checks. .SH FILES -.IP "~/server/etc/bb-services (Hobbit)" +.IP "~/server/etc/bb-services" This file contains definitions of TCP services that bbtest-net can test. Definitions for a default set of common services is built into bbtest-net, but these can be overridden or supplemented by @@ -527,7 +527,7 @@ .br Note that the machine-name must be the name you use in the http://machinename/ URL setting - it need not be the one you -use for the system-name in Hobbit. +use for the system-name in Xymon. .sp .IP "$BBHOME/etc/cookies" Modified: trunk/bbnet/hobbitping.1 =================================================================== --- trunk/bbnet/hobbitping.1 2010-07-09 22:06:30 UTC (rev 6326) +++ trunk/bbnet/hobbitping.1 2010-07-09 22:57:53 UTC (rev 6327) @@ -1,18 +1,18 @@ -.TH HOBBITPING 1 "Version 4.2.0: 9 Aug 2006" "Hobbit Monitor" +.TH HOBBITPING 1 "Version 4.2.1: 27 Nov 2008" "Xymon" .SH NAME -hobbitping \- Hobbit ping tool +hobbitping \- Xymon ping tool .SH SYNOPSIS .B "hobbitping [--retries=N] [--timeout=N] [IP-adresses]" .SH DESCRIPTION .I hobbitping(1) is used for ping testing of the hosts monitored by the -.I hobbit(7) +.I xymon(7) monitoring system. It reads a list of IP adresses from stdin, and performs a "ping" check to see if these hosts are alive. It is normally invoked by the .I bbtest-net(1) -utility, which performs all of the Hobbit network tests. +utility, which performs all of the Xymon network tests. Optionally, if a list of IP-adresses is passed as commandline arguments, it will ping those IP's instead of reading them @@ -89,5 +89,5 @@ Enable debug output. This prints out all packets sent and received. .SH "SEE ALSO" -hobbit(7), bbtest-net(1), fping(1) +xymon(7), bbtest-net(1), fping(1) Modified: trunk/bbproxy/bbmessage.cgi.8 =================================================================== --- trunk/bbproxy/bbmessage.cgi.8 2010-07-09 22:06:30 UTC (rev 6326) +++ trunk/bbproxy/bbmessage.cgi.8 2010-07-09 22:57:53 UTC (rev 6327) @@ -1,34 +1,34 @@ -.TH BBMESSAGE.CGI 8 "Version 4.2.0: 9 Aug 2006" "Hobbit Monitor" +.TH BBMESSAGE.CGI 8 "Version 4.2.1: 27 Nov 2008" "Xymon" .SH NAME -bbmessage.cgi \- CGI utility used for proxying Hobbit data over HTTP +bbmessage.cgi \- CGI utility used for proxying Xymon data over HTTP .SH SYNOPSIS .B "bbmessage.cgi" .SH DESCRIPTION .I bbmessage.cgi(8) -is the server-side utility receiving Hobbit messages sent by the +is the server-side utility receiving Xymon messages sent by the .I bb(1) utility over an HTTP transport. The \fBbb\fR utility normally sends data over a dedicated TCP protocol, but it may use HTTP to go through proxies or through restrictive firewalls. In that case, the webserver must have this CGI utility installed, which takes care of receiving the -message via HTTP, and forwards it to a local Hobbit server through the -normal Hobbit transport. +message via HTTP, and forwards it to a local Xymon server through the +normal Xymon transport. The CGI expects to be invoked from an HTTP "POST" request, with the POST-data being the status-message. \fBbbmessage.cgi\fR simply collects all of the POST data, and send it off as -a message to the Hobbit daemon running on IP 127.0.0.1. This +a message to the Xymon daemon running on IP 127.0.0.1. This destination IP currently cannot be changed. -The CGI will return any output provided by the Hobbit daemon +The CGI will return any output provided by the Xymon daemon back to the requestor as the response to the HTTP POST, -so this allows for all normal Hobbit commands to work. +so this allows for all normal Xymon commands to work. .SH SECURITY -\fBbbmesage.cgi\fR will only send data to a Hobbit server through the +\fBbbmesage.cgi\fR will only send data to a Xymon server through the loopback interface, i.e. IP-address 127.0.0.1. Access to the CGI should be restricted through webserver access controls, @@ -37,8 +37,8 @@ If possible, consider using the .I bbproxy(8) -utility instead for native proxying of Hobbit data between networks. +utility instead for native proxying of Xymon data between networks. .SH "SEE ALSO" -bb(1), bbproxy(8), hobbit(7) +bb(1), bbproxy(8), xymon(7) Modified: trunk/bbproxy/bbproxy.8 =================================================================== --- trunk/bbproxy/bbproxy.8 2010-07-09 22:06:30 UTC (rev 6326) +++ trunk/bbproxy/bbproxy.8 2010-07-09 22:57:53 UTC (rev 6327) @@ -1,20 +1,20 @@ -.TH BBPROXY 8 "Version 4.2.0: 9 Aug 2006" "Hobbit Monitor" +.TH BBPROXY 8 "Version 4.2.1: 27 Nov 2008" "Xymon" .SH NAME -bbproxy \- Hobbit message proxy +bbproxy \- Xymon message proxy .SH SYNOPSIS .B "bbproxy [options] --servers=IP" .SH DESCRIPTION .I bbproxy(8) -is a proxy for forwarding Hobbit messages from one +is a proxy for forwarding Xymon messages from one server to another. It will typically be needed if you have clients behind a firewall, so they cannot send status -messages to the Hobbit server directly. +messages to the Xymon server directly. bbproxy serves three purposes. First, it acts as a regular proxy server, allowing clients that cannot connect directly to -the Hobbit server to send messages to the Hobbit servers. +the Xymon server to send messages to the Xymon servers. Although bbproxy is optimized for handling status messages, it will forward all types of messages. .br @@ -22,27 +22,27 @@ Second, it acts as a buffer, smoothing out peak loads if many clients try to send status messages simultaneously. bbproxy can absorb messages very quickly, but will queue -them up internally and forward them to the Hobbit server +them up internally and forward them to the Xymon server at a reasonable pace. This helps even out the load on -your Hobbit server. +your Xymon server. .br Third, bbproxy merges small "status" messages into larger "combo" messages. This can dramatically decrease the number -of connections that need to go from bbproxy to the Hobbit +of connections that need to go from bbproxy to the Xymon server, and is a slightly more efficient way of transmitting -data to the Hobbit server. The merging of messages +data to the Xymon server. The merging of messages causes "status" messages to be delayed for up to 0.25 seconds -before being sent off to the Hobbit server. +before being sent off to the Xymon server. .SH OPTIONS .IP "--servers=SERVERIP[:PORT][,SERVER2IP[:PORT]]" Specifies the IP-address and optional portnumber where incoming messages are forwarded to. The default portnumber is 1984, the -standard Hobbit port number. Up to 3 servers can be specified; +standard Xymon port number. Up to 3 servers can be specified; incoming messages are sent to all of them (except "config", "query" and "download" messages, which go to the LAST server only). -If you have Hobbit clients sending their data via this proxy, +If you have Xymon clients sending their data via this proxy, note that the clients will receive their configuration data from the LAST of the servers listed here. This option is required. @@ -61,10 +61,10 @@ .IP "--report=[PROXYHOSTNAME.]PROXYSERVICE" If given, this option causes bbproxy to send a status report -every 5 minutes to the Hobbit server about itself. If you -have set the standard Hobbit environment, you can use +every 5 minutes to the Xymon server about itself. If you +have set the standard Xymon environment, you can use "--report=bbproxy" to have bbproxy report its status to a -"bbproxy" column in Hobbit. The default for PROXYHOSTNAME +"bbproxy" column in Xymon. The default for PROXYHOSTNAME is the $MACHINE environment variable, i.e. the hostname of the server running bbproxy. See REPORT OUTPUT below for an explanation of the report contents. @@ -98,7 +98,7 @@ .SH "REPORT OUTPUT" If enabled via the "--report" option, bbproxy will send a -status message about itself to the Hobbit server once +status message about itself to the Xymon server once every 5 minutes. The status message includes the following information: @@ -109,7 +109,7 @@ average number of messages per second over the past 5 minutes. .IP "Outbound messages" -The total number of messages sent to the Hobbit servers. +The total number of messages sent to the Xymon servers. Note that this is probably smaller than the number of incoming messages, since bbproxy merges messages before sending them. @@ -128,7 +128,7 @@ .IP "Incoming - Page messages" The number of "page" messages received from a client. These are discarded, they are generated by the old Big Brother clients, -but have no meaning in Hobbit. +but have no meaning in Xymon. .IP "Incoming - Other messages" The number of other messages (data, notes, ack, query, ...) @@ -149,11 +149,11 @@ .IP "Timeout details - connecting to server" The number of messages dropped, because a connection to the -Hobbit server could not be established. +Xymon server could not be established. .IP "Timeout details - sending to server" The number of messages dropped because the communication -to the Hobbit server timed out after a connection +to the Xymon server timed out after a connection was established. .IP "Timeout details - recovered" @@ -180,7 +180,7 @@ calculated from the messages that have passed through the proxy during the past 5 minutes. This number is computed from the messages that actually end up establishing a -connection to the Hobbit server, i.e. status +connection to the Xymon server, i.e. status messages that were combined into combo-messages do not go into the calculation - if they did, it would reduce the average time, since it is faster to merge messages than @@ -214,5 +214,5 @@ Toggles logging of individual messages. .SH "SEE ALSO" -bb(1), hobbitd(8), hobbit(7) +bb(1), hobbitd(8), xymon(7) Modified: trunk/build/makedeb.sh =================================================================== --- trunk/build/makedeb.sh 2010-07-09 22:06:30 UTC (rev 6326) +++ trunk/build/makedeb.sh 2010-07-09 22:57:53 UTC (rev 6327) @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash REL=$1 if [ "$REL" = "" ]; then Modified: trunk/build/makehtml.sh =================================================================== --- trunk/build/makehtml.sh 2010-07-09 22:06:30 UTC (rev 6326) +++ trunk/build/makehtml.sh 2010-07-09 22:57:53 UTC (rev 6327) @@ -8,7 +8,7 @@ VERSION="Exp" fi -cd ~/hobbit +# cd ~/hobbit rm -f docs/*~ docs/manpages/index.html* docs/manpages/man1/* docs/manpages/man5/* docs/manpages/man7/* docs/manpages/man8/* for DIR in bbdisplay bbnet bbproxy common hobbitd web @@ -21,7 +21,7 @@ then NAME=`head -n 1 $FILE | awk '{print $2}'`; SECTION=`head -n 1 $FILE | awk '{print $3}'`; - (echo ".TH $NAME $SECTION \"Version $VERSION: $DATE\" \"Hobbit Monitor\""; tail -n +2 $FILE) | \ + (echo ".TH $NAME $SECTION \"Version $VERSION: $DATE\" \"Xymon\""; tail -n +2 $FILE) | \ man2html -r - | tail -n +2 >docs/manpages/man$SECT/`basename $FILE`.html fi done @@ -29,5 +29,5 @@ done # Sourceforge update -cd ~/hobbit/docs && rsync -av --rsh=ssh --exclude=RCS ./ st...@sh...:/home/groups/h/ho/hobbitmon/htdocs/docs/ +# cd ~/hobbit/docs && rsync -av --rsh=ssh --exclude=RCS ./ st...@sh...:/home/groups/h/ho/hobbitmon/htdocs/docs/ Modified: trunk/common/bb-hosts.5 =================================================================== --- trunk/common/bb-hosts.5 2010-07-09 22:06:30 UTC (rev 6326) +++ trunk/common/bb-hosts.5 2010-07-09 22:57:53 UTC (rev 6327) @@ -1,6 +1,6 @@ -.TH BB-HOSTS 5 "Version 4.2.0: 9 Aug 2006" "Hobbit Monitor" +.TH BB-HOSTS 5 "Version 4.2.1: 27 Nov 2008" "Xymon" .SH NAME -bb-hosts \- Main Hobbit configuration file +bb-hosts \- Main Xymon configuration file .SH SYNOPSIS .IP bb-hosts @@ -9,8 +9,8 @@ The .I bb-hosts(5) file is the most important configuration file for all of the -Hobbit programs. This file contains the full list of -all the systems monitored by Hobbit, including the set +Xymon programs. This file contains the full list of +all the systems monitored by Xymon, including the set of tests and other configuration items stored for each host. .SH FILE FORMAT @@ -33,10 +33,10 @@ for availability reporting by .I bbgen(1) -An example of setting up the bb-hosts file is in the Hobbit on-line +An example of setting up the bb-hosts file is in the Xymon on-line documentation (from the Help menu, choose "Configuring Monitoring"). The following describes the possible settings in a bb-hosts -file supported by Hobbit. +file supported by Xymon. .SH TAGS RECOGNIZED BY ALL TOOLS @@ -69,7 +69,7 @@ Controls whether stale status messages go purple or clear when a host is down. Normally, when a host is down the client statuses ("cpu", "disk", "memory" etc) will stop updating - this would usually -make them go "purple" which can trigger alerts. To avoid that, Hobbit +make them go "purple" which can trigger alerts. To avoid that, Xymon checks if the "conn" test has failed, and if that is true then the other tests will go "clear" instead of purple so you only get alerts for the "conn" test. If you do want the stale statuses to go purple, @@ -97,7 +97,7 @@ .SH BBGEN DISPLAY OPTIONS These tags are processed by the .I bbgen(1) -tool when generating the Hobbit webpages or reports. +tool when generating the Xymon webpages or reports. .IP "page NAME [Page-title]" This defines a page at the level below the entry page. All @@ -111,7 +111,7 @@ .IP "subparent parentpage newpage [Page-title]" This is used to define subpages in whatever levels you may wish. Just like the standard "subpage" tag, "subparent" defines a -new Hobbit webpage; however with "subparent" you explicitly +new Xymon webpage; however with "subparent" you explicitly list which page it should go as a subpage to. You can pick any page as the parent - pages, subpages or even other subparent pages. So this allows you to define any tree @@ -150,7 +150,7 @@ with a single header-line listing all of the columns. Hosts following the "group" line appear inside the group, until a new "group" or page-line is found. The two group-directives -are handled identically by Hobbit and bbgen, but both forms +are handled identically by Xymon and bbgen, but both forms are allowed for backwards compatibility. .IP "group-sorted [group-title]" @@ -185,7 +185,7 @@ If a title tag precedes a page/subpage/subparent entry, the title text replaces the normal "Pages hosted -locally" heading normally inserted by Hobbit. This +locally" heading normally inserted by Xymon. This appears on the page that links to the subpages, not on the subpage itself. To get a custom heading on the subpage, you may want to use the "--pagetext-heading" @@ -201,7 +201,7 @@ Defines an alias for a host, which will be used when identifying status messages. This is typically used to accomodate a local client that sends in status reports with a different hostname, -e.g. if you use hostnames with domains in your Hobbit configuration, +e.g. if you use hostnames with domains in your Xymon configuration, but the client is a silly Window box that does not include the hostname. Or vice versa. Whatever the reason, this can be used to match status reports with the hosts you define in your @@ -211,7 +211,7 @@ .IP NOCOLUMNS:column[,column] Used to drop certain of the status columns generated by the -Hobbit client. \fBcolumn\fR is one of \fBcpu\fR, \fBdisk\fR, +Xymon client. \fBcolumn\fR is one of \fBcpu\fR, \fBdisk\fR, \fBfiles\fR, \fBmemory\fR, \fBmsgs\fR, \fBports\fR, \fBprocs\fR. This setting stops these columns from being updated for the host. Note: If the columns already exist, you must use the @@ -240,8 +240,8 @@ and .I hobbit-clients.cfg(5) to group logfile checks). Normally, class-names are controlled on the -client by starting the Hobbit client with the "--class=Classname" option. -If you specify it in the bb-hosts file on the Hobbit server, it overrides +client by starting the Xymon client with the "--class=Classname" option. +If you specify it in the bb-hosts file on the Xymon server, it overrides any classname that the client reports. .IP dialup @@ -256,7 +256,7 @@ host from the event-log display. .IP nodisp -Ignore this host completely when generating the Hobbit webpages. +Ignore this host completely when generating the Xymon webpages. Can be useful for monitoring a host without having it show up on the webpages, e.g. because it is not yet in production use. Or for hiding a host that is shown only on a second pageset. @@ -316,7 +316,7 @@ it is reported with status BLUE instead of yellow or red. Thus you can still see when the service was unavailable, but alarms will not be triggered and the downtime is not counted in the -availability calculations generated by the Hobbit reports. +availability calculations generated by the Xymon reports. The "columns" setting is optional - it may be a comma-separated list of status columns in which case the DOWNTIME setting only applies @@ -342,9 +342,9 @@ file is used. -.SH HOBBIT TAGS FOR THE CRITICAL SYSTEMS OVERVIEW PAGE +.SH XYMON TAGS FOR THE CRITICAL SYSTEMS OVERVIEW PAGE \fBNOTE:\fR The "NK" set of tags is deprecated. They will -be supported for Hobbit 4.x, but will be dropped in version 5. +be supported for Xymon 4.x, but will be dropped in version 5. It is recommended that you move your critical systems view to the .I hobbit-nkview.cgi(1) @@ -385,7 +385,7 @@ is identical to the one used for DOWNTIME specification. -.SH HOBBIT TAGS FOR THE WML (WAP) CARDS +.SH XYMON TAGS FOR THE WML (WAP) CARDS If bbgen is run with the "--wml" option, it will generate a set of WAP-format output "cards" that can be viewed with a WAP-capable device, e.g. a PDA or cell-phone. @@ -399,7 +399,7 @@ "NK:" tag is used if present. -.SH HOBBIT STATUS PROPAGATION OPTIONS +.SH XYMON STATUS PROPAGATION OPTIONS These tags affect how a status propagates upwards from a single test to the page and higher. This can also be done with the command-line options --nopropyellow and --nopropred, but the tags @@ -444,8 +444,8 @@ acknowledged status upwards. -.SH HOBBIT AVAILABILITY REPORT OPTIONS -These options affect the way the Hobbit availability +.SH XYMON AVAILABILITY REPORT OPTIONS +These options affect the way the Xymon availability reports are processed (see .I bb-rep.cgi(1) for details about availability reports). @@ -511,9 +511,9 @@ .SH NETWORK TEST SETTINGS .IP testip -By default, Hobbit will perform a name lookup of the hostname +By default, Xymon will perform a name lookup of the hostname to get the IP address it will use for network tests. This tag -causes Hobbit to use the IP listed in the bb-hosts file. +causes Xymon to use the IP listed in the bb-hosts file. .IP NET:location This tag defines the host as being tested from a specific location. @@ -759,9 +759,9 @@ is assigned to the host running the network tests. The name of the test also determines the columnname that the test -result will appear with in the Hobbit webpages. +result will appear with in the Xymon webpages. -By prefixing a test with "!" it becomes a reverse test: Hobbit will +By prefixing a test with "!" it becomes a reverse test: Xymon will expect the service NOT to be available, and send a green status if it does NOT respond. If a connection to the service succeeds, the status will go red. @@ -779,7 +779,7 @@ .IP "ftps telnets smtps pop3s imaps nntps" These tags are for testing of the SSL-tunneled versions of the standard ftp, telnet, smtp, pop3, imap and nntp protocols. -If Hobbit was configured with support for SSL, you can test these +If Xymon was configured with support for SSL, you can test these services like any other network service - bbtest-net will setup an SSL-encrypted session while testing the service. The server certificate is validated and information about @@ -789,7 +789,7 @@ .IP bbd Test that a Big Brother compatible daemon is running. This check -works both for the Hobbit +works both for the Xymon .I hobbitd(8) daemon, and the original Big Brother bbd daemon. @@ -908,7 +908,7 @@ if you have the PEM certificate in $BBHOME/certs/client.pem, you must put the pass phrase into the $BBHOME/certs/client.pass file. Make sure to protect this file with Unix permissions, -so that only the user running Hobbit can read it. +so that only the user running Xymon can read it. .IP "Forcing an HTTP or SSL version" Some SSL sites will only allow you to connect, if you use @@ -1151,13 +1151,13 @@ webpages. .IP browser=BROWSERNAME -By default, Hobbit sends an HTTP "User-Agent" header identifying -it a "Hobbit". Some websites require that you use a specific +By default, Xymon sends an HTTP "User-Agent" header identifying +it a "Xymon". Some websites require that you use a specific browser, typically Internet Explorer. To cater for testing of such sites, this tag can be used to modify the data sent in the User-Agent header. .br -E.g. to perform an HTTP test with Hobbit masquerading as an Internet +E.g. to perform an HTTP test with Xymon masquerading as an Internet Explorer 6.0 browser, use \fBbrowser="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"\fR. If you do not know what the User-Agent header should be, open up the browser that works with this particular site, and open the @@ -1213,7 +1213,7 @@ .I bbtest-net(1) collect performance statistics from the Apache webserver by querying the URL \fBhttp://IP.ADDRESS.OF.HOST/server-status?auto\fR. -The response is sent as a data-report and processed by the Hobbit +The response is sent as a data-report and processed by the Xymon hobbitd_rrd module into an RRD file and an "apache" graph. If your webserver requires e.g. authentication, or runs on a different URL for the server-status, you can provide the full URL needed to @@ -1258,15 +1258,15 @@ "badTEST" settings, and alternate pageset relations cannot be listed on the ".default." host. -.SH SENDING SUMMARIES TO REMOTE HOBBIT SERVERS +.SH SENDING SUMMARIES TO REMOTE XYMON SERVERS .IP "summary ROW.COLUMN IP URL" -If you have multiple Hobbit servers, the "summary" directive lets you +If you have multiple Xymon servers, the "summary" directive lets you form a hierarchy of servers by sending the overall status of this server -to a remote Hobbit server, which then displays this in a special summary +to a remote Xymon server, which then displays this in a special summary section. E.g. if your offices are spread over three locations, you can -have a Hobbit server at each office. These branch-office Hobbits have +have a Xymon server at each office. These branch-office Xymon have a "summary" definition in their bb-hosts file that makes them report -the overall status of their branch Hobbit to the central Hobbit server +the overall status of their branch Xymon to the central Xymon server you maintain at the corporate headquarters. Multiple "summary" definitions are allowed. @@ -1276,29 +1276,29 @@ heading for a summary line, and the COLUMN defines the name of the column where this summary is shown - like the hostname and testname used in the normal displays. The IP is the IP-address of the \fBremote\fR -(upstream) Hobbit server, where this summary is sent). The URL is the -URL of your \fBlocal\fR Hobbit server. +(upstream) Xymon server, where this summary is sent). The URL is the +URL of your \fBlocal\fR Xymon server. -The URL need not be that of your Hobbit server's main page - it could -be the URL of a subpage on the local Hobbit server. Hobbit will report +The URL need not be that of your Xymon server's main page - it could +be the URL of a subpage on the local Xymon server. Xymon will report the summary using the color of the page found at the URL you specify. -E.g. on your corporate Hobbit server you want a summary from the +E.g. on your corporate Xymon server you want a summary from the Las Vegas office - but you would like to know both what the overall status is, and what is the status of the servers on the critical Sales department back-office servers in Las Vegas. So you configure -the Las Vegas Hobbit server to send \fBtwo\fR summaries: +the Las Vegas Xymon server to send \fBtwo\fR summaries: .sp - summary Vegas.All 10.0.1.1 http://vegas.foo.com/hobbit/ + summary Vegas.All 10.0.1.1 http://vegas.foo.com/xymon/ .br - summary Vegas.Sales 10.0.1.1 http://vegas.foo.com/hobbit/sales/ + summary Vegas.Sales 10.0.1.1 http://vegas.foo.com/xymon/sales/ .sp This gives you one summary line for Las Vegas, with two columns: An "All" column showing the overall status, and a "Sales" column showing -the status of the "sales" page on the Las Vegas Hobbit server. +the status of the "sales" page on the Las Vegas Xymon server. Note: Pages defined using alternate pageset definitions cannot be used, -the URL must point to a webpage from the default set of Hobbit webpages. +the URL must point to a webpage from the default set of Xymon webpages. .SH OTHER TAGS @@ -1312,8 +1312,8 @@ .SH FILES -.BR ~hobbit/server/etc/bb-hosts +.BR ~xymon/server/etc/bb-hosts .SH "SEE ALSO" -bbgen(1), bbtest-net(1), bbdigest(1), hobbitserver.cfg(5), hobbit(7) +bbgen(1), bbtest-net(1), bbdigest(1), hobbitserver.cfg(5), xymon(7) Modified: trunk/common/bb.1 =================================================================== --- trunk/common/bb.1 2010-07-09 22:06:30 UTC (rev 6326) +++ trunk/common/bb.1 2010-07-09 22:57:53 UTC (rev 6327) @@ -1,17 +1,17 @@ -.TH BB 1 "Version 4.2.0: 9 Aug 2006" "Hobbit Monitor" +.TH BB 1 "Version 4.2.1: 27 Nov 2008" "Xymon" .SH NAME -bb \- Hobbit client communication program +bb \- Xymon client communication program .SH SYNOPSIS .B "bb [options] RECIPIENT message" .SH DESCRIPTION .I bb(1) is the client program used to communicate with a -Hobbit server. It is frequently used by Hobbit +Xymon server. It is frequently used by Xymon client systems to send in status messages and pager alerts on local tests. -In Hobbit, the bb program is also used for administrative +In Xymon, the bb program is also used for administrative purposes, e.g. to rename or delete hosts, or to disable hosts that are down for longer periods of time. @@ -26,11 +26,11 @@ server. .IP "--timeout=N" -Specifies the timeout for connecting to the Hobbit server, in +Specifies the timeout for connecting to the Xymon server, in seconds. The default is 5 seconds. .IP "--ssl[=CERTIFICATEFILE]" -Establish an SSL-encrypted connection to the Hobbit server. +Establish an SSL-encrypted connection to the Xymon server. If a certificate-file is specified, this is used as a client certificate which the server may use to verify that the client is allowed to talk to the server. CERTIFICATEFILE @@ -50,16 +50,16 @@ The \fBRECIPIENT\fR parameter may be a URL for a webserver that has the bbmessage.cgi or similar script installed. This -tunnels the Hobbit messages to the BBDISPLAY server +tunnels the Xymon messages to the BBDISPLAY server using standard HTTP protocol. The .I bbmessage.cgi(8) -CGI tool (included in Hobbit) must be installed on the webserver +CGI tool (included in Xymon) must be installed on the webserver for the HTTP transport to work. .br .IP MESSAGE The \fBmessage\fR parameter is the message to be sent across -to the Hobbit server. Messages must be enclosed in quotes, +to the Xymon server. Messages must be enclosed in quotes, but by doing so they can span multiple lines. The maximum size of a message is defined by the maximum allowed length of your shell's commandline, and is typically 8-32 KB. @@ -68,9 +68,9 @@ as the message: bb will then read the status message from its stdin. -.SH HOBBIT MESSAGE SYNTAX +.SH XYMON MESSAGE SYNTAX -This section lists the most commonly used messages in the Hobbit +This section lists the most commonly used messages in the Xymon protocol. .IP "status[+LIFETIME][/group:GROUP] HOSTNAME.TESTNAME COLOR <additional text>" @@ -79,7 +79,7 @@ name is valid except that using dots in the testname will not work. COLOR must be one of the valid colors: "green", "yellow", "red" or "clear". The colors "blue" and "purple" - although valid colors - should not be sent in a -status-message, as these are handled specially by the Hobbit server. +status-message, as these are handled specially by the Xymon server. .br The "additional text" normally includes a local timestamp and a summary of the test result on the first line. Any lines following the first one @@ -87,7 +87,7 @@ diagnose the problem being reported. .br The LIFETIME defines how long this status is valid after being received -by the Hobbit server. The default is 30 minutes, but you can set any +by the Xymon server. The default is 30 minutes, but you can set any period you like. E.g. for a custom test that runs once an hour, you will want to set this to at least 60 minutes - otherwise the status will go purple after 30 minutes. It is a good idea to set the LIFETIME to @@ -97,7 +97,7 @@ the number, e.g. "status+5h" for a status that is valid for 5 hours. .br The GROUP option is used to direct alerts from the status to a specific group. -It is currently used for status generated from the Hobbit clients' data, +It is currently used for status generated from the Xymon clients' data, e.g. to direct alerts for a "procs" status to different people, depending on exactly which process is down. @@ -114,11 +114,11 @@ .IP "data HOSTNAME.DATANAME<newline><additional text>" The "data" message allows tools to send data about a host, without -it appearing as a column on the Hobbit webpages. This +it appearing as a column on the Xymon webpages. This is used e.g. to report statistics about a host, e.g. vmstat data which does not in itself represent something that has a red, yellow or green identity. It is used by RRD bottom-feeder modules, among -others. In Hobbit, data messages are by default processed only by the +others. In Xymon, data messages are by default processed only by the .I hobbitd_rrd(8) module. If you want to handle data-messages by an external application, you may want to enable the @@ -145,17 +145,17 @@ first word on the line. Additional lines of text that might be present on the status-message cannot be retrieved. .br -This allows any Hobbit client to determine the status of a particular +This allows any Xymon client to determine the status of a particular test, whether it is one pertaining to the host where the client is running, some other host, or perhaps the result of a combined test from multiple hosts managed by .I bbcombotest(1) -This will typically be useful to Hobbit client extension scripts, that +This will typically be useful to Xymon client extension scripts, that need to determine the status of other hosts e.g. to decide if an automatic recovery action should be initiated. .IP "config FILENAME" -Retrieve one of the Hobbit configuration files from the +Retrieve one of the Xymon configuration files from the server. This command allows a client to pull files from the $BBHOME/etc/ directory on the server, allowing for semi-automatic updates of the client configuration. Since the configuration files @@ -179,7 +179,7 @@ Rename data about a single test (column). .IP "hobbitdlog HOSTNAME.TESTNAME" -Retrieve the Hobbit status-log for a single test. The first line of the +Retrieve the Xymon status-log for a single test. The first line of the response contain a series of fields separated by a pipe-sign: .sp .BR hostname @@ -231,10 +231,10 @@ .IP "hobbitdboard [CRITERIA] [fields=FIELDLIST]" Retrieves a summary of the status of all known tests available to -the Hobbit daemon. +the Xymon daemon. By default - if no CRITERIA is provided - it returns one line for all -status messages that are found in Hobbit. You can filter the response +status messages that are found in Xymon. You can filter the response by selecting a page, a host, a test or a color - wildcards are not supported, so you can pick only one page, host, test or color. .sp @@ -318,11 +318,11 @@ as for the "hobbitdboard" command. .IP "download FILENAME" -Download a file from the Hobbit servers' download directory. +Download a file from the Xymon servers' download directory. .IP "client HOSTNAME.OSTYPE [HOSTCLASS]" -Used to send a "client" message to the Hobbit server. Client messages -are generated by the Hobbit client; when sent to the Hobbit server they +Used to send a "client" message to the Xymon server. Client messages +are generated by the Xymon client; when sent to the Xymon server they are matched against the rules in the .I hobbit-clients.cfg(5) configuration file, and status messages are generated for the client-side @@ -333,7 +333,7 @@ "section" filter is used to select specific sections of the client data. .IP "ping" -Attempts to contact the Hobbit server. If successful, the Hobbit server version ID +Attempts to contact the Xymon server. If successful, the Xymon server version ID is reported. .IP "pullclient" @@ -341,16 +341,16 @@ .I hobbitfetch(8) and .I msgcache(8) -for clients that cannot connect directly to the Hobbit server. +for clients that cannot connect directly to the Xymon server. .IP "ghostlist" -Report a list of \fBghost\fR clients seen by the Hobbit server. Ghosts are systems -that report data to the Hobbit server, but are not listed in the bb-hosts file. +Report a list of \fBghost\fR clients seen by the Xymon server. Ghosts are systems +that report data to the Xymon server, but are not listed in the bb-hosts file. .IP "schedule [TIMESTAMP COMMAND]" -Schedules an command sent to the Hobbit server for execution at a later time. E.g. +Schedules an command sent to the Xymon server for execution at a later time. E... [truncated message content] |
From: <st...@us...> - 2011-03-08 10:33:54
|
Revision: 6646 http://xymon.svn.sourceforge.net/xymon/?rev=6646&view=rev Author: storner Date: 2011-03-08 10:33:47 +0000 (Tue, 08 Mar 2011) Log Message: ----------- trunk: Merge 4.3.0 back into trunk, part 1: Rename directories Added Paths: ----------- trunk/xymond/ trunk/xymongen/ trunk/xymonnet/ trunk/xymonproxy/ Removed Paths: ------------- trunk/bbdisplay/ trunk/bbnet/ trunk/bbproxy/ trunk/hobbitd/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <st...@us...> - 2011-03-08 17:36:10
|
Revision: 6651 http://xymon.svn.sourceforge.net/xymon/?rev=6651&view=rev Author: storner Date: 2011-03-08 17:36:04 +0000 (Tue, 08 Mar 2011) Log Message: ----------- trunk: Merge 4.3.0 back into trunk, part 5: Delete compression-related files (for later addition) Removed Paths: ------------- trunk/build/Makefile.test-zlib trunk/build/test-zlib.c trunk/build/zlib.sh trunk/lib/compression.c trunk/lib/compression.h Deleted: trunk/build/Makefile.test-zlib =================================================================== --- trunk/build/Makefile.test-zlib 2011-03-08 17:20:28 UTC (rev 6650) +++ trunk/build/Makefile.test-zlib 2011-03-08 17:36:04 UTC (rev 6651) @@ -1,11 +0,0 @@ -include Makefile.$(OS) - -test-compile: - @$(CC) $(CFLAGS) $(ZLIBINC) -o test-zlib.o -c test-zlib.c - -test-link: - @$(CC) $(CFLAGS) $(ZLIBLIB) -o test-zlib test-zlib.o -lz - -clean: - @rm -f test-zlib.o test-zlib - Deleted: trunk/build/test-zlib.c =================================================================== --- trunk/build/test-zlib.c 2011-03-08 17:20:28 UTC (rev 6650) +++ trunk/build/test-zlib.c 2011-03-08 17:36:04 UTC (rev 6651) @@ -1,33 +0,0 @@ -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <zlib.h> - -int main(int argc, char **argv) -{ - z_stream strm; - int n; - - strm.zalloc = Z_NULL; - strm.zfree = Z_NULL; - strm.opaque = Z_NULL; - n = inflateInit(&strm); - if (n == Z_VERSION_ERROR) { - printf("Version mismatch: Compiled with %s, runtime has %s\n", - ZLIB_VERSION, zlibVersion()); - } - else { - printf("zlib version %s\n", zlibVersion()); - if (ZLIB_VERNUM < 0x1230) { - char *override = getenv("IGNOREOLDZLIB"); - - printf("Your zlib version is too old, requires version 1.2.3 or later\n"); - if (override) printf("Ignoring this and continuing anyway\n"); - - return (override ? 0 : 1); - } - } - - return 0; -} - Deleted: trunk/build/zlib.sh =================================================================== --- trunk/build/zlib.sh 2011-03-08 17:20:28 UTC (rev 6650) +++ trunk/build/zlib.sh 2011-03-08 17:36:04 UTC (rev 6651) @@ -1,72 +0,0 @@ - echo "Checking for zlib ..." - - ZLIBINC="" - ZLIBLIB="" - for DIR in /opt/zlib* /usr/local/zlib* /usr/local /usr /usr/pkg /opt/csw /opt/sfw - do - if test -f $DIR/include/zlib.h - then - ZLIBINC=$DIR/include - fi - if test -f $DIR/include/zlib/zlib.h - then - ZLIBINC=$DIR/include/zlib - fi - - if test -f $DIR/lib/libz.so - then - ZLIBLIB=$DIR/lib - fi - if test -f $DIR/lib/libz.a - then - ZLIBLIB=$DIR/lib - fi - if test -f $DIR/lib64/libz.so - then - ZLIBLIB=$DIR/lib64 - fi - if test -f $DIR/lib64/libz.a - then - ZLIBLIB=$DIR/lib64 - fi - done - - if test "$USERZLIBINC" != ""; then - ZLIBINC="$USERZLIBINC" - fi - if test "$USERZLIBLIB" != ""; then - ZLIBLIB="$USERZLIBLIB" - fi - - if test -z "$ZLIBINC" -o -z "$ZLIBLIB"; then - echo "ZLIB include- or library-files not found." - echo "Support for compressed communication with hobbitd is disabled " - else - cd build - OS=`uname -s | tr '[/]' '[_]'` $MAKE -f Makefile.test-zlib clean - OS=`uname -s | tr '[/]' '[_]'` ZLIBINC="-I$ZLIBINC" $MAKE -f Makefile.test-zlib test-compile - if [ $? -eq 0 ]; then - echo "Found ZLIB include files in $ZLIBINC" - else - echo "ERROR: ZLIB include files found in $ZLIBINC, but compile fails." - exit 1 - fi - - OS=`uname -s | tr '[/]' '[_]'` ZLIBLIB="-L$ZLIBLIB" $MAKE -f Makefile.test-zlib test-link - if [ $? -eq 0 ]; then - echo "Found ZLIB libraries in $ZLIBLIB" - ./test-zlib - if [ $? -ne 0 ]; then - echo "ZLIB version too old, must be at least version 1.2.x" - exit 1 - fi - else - echo "ERROR: ZLIB library files found in $ZLIBLIB, but link fails." - exit 1 - fi - - OS=`uname -s | tr '[/]' '[_]'` $MAKE -f Makefile.test-zlib clean - cd .. - fi - - Deleted: trunk/lib/compression.c =================================================================== --- trunk/lib/compression.c 2011-03-08 17:20:28 UTC (rev 6650) +++ trunk/lib/compression.c 2011-03-08 17:36:04 UTC (rev 6651) @@ -1,211 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/* Hobbit monitor library. */ -/* */ -/* This is a library module, part of libbbgen. */ -/* It contains routines for interfacing to zlib compression routines. */ -/* */ -/* Copyright (C) 2008 Henrik Storner <he...@st...> */ -/* */ -/* This program is released under the GNU General Public License (GPL), */ -/* version 2. See the file "COPYING" for details. */ -/* */ -/*----------------------------------------------------------------------------*/ - -static char rcsid[] = "$Id$"; - -#include "config.h" - -#include <string.h> -#include <stdlib.h> - -#if defined(HOBBITZLIB) -#include <zlib.h> -#endif - -#include "libbbgen.h" - -char *compressionmarker = "DeFl"; -int compressionmarkersz = 4; - -void *uncompress_stream_init(void) -{ - z_stream *strm; - - strm = (z_stream *)malloc(sizeof(z_stream)); - strm->zalloc = Z_NULL; - strm->zfree = Z_NULL; - strm->opaque = Z_NULL; - strm->avail_in = 0; - strm->next_in = Z_NULL; - if (inflateInit(strm) != Z_OK) { - xfree(strm); - return NULL; - } - - return strm; -} - -strbuffer_t *uncompress_stream_data(void *s, char *cmsg, int clen) -{ - z_stream *strm = (z_stream *)s; - strbuffer_t *dbuf = NULL; - int n; - unsigned int nbytes; - - dbuf = newstrbuffer(4096); - strm->avail_in = clen; - strm->next_in = cmsg; - - do { - strm->avail_out = STRBUFSZ(dbuf) - STRBUFLEN(dbuf); - if (strm->avail_out < 4096) { - strbuffergrow(dbuf, 4096); - strm->avail_out = STRBUFSZ(dbuf) - STRBUFLEN(dbuf); - } - strm->next_out = STRBUF(dbuf) + STRBUFLEN(dbuf); - - n = inflate(strm, Z_NO_FLUSH); - switch (n) { - case Z_STREAM_ERROR: - case Z_NEED_DICT: - case Z_DATA_ERROR: - case Z_MEM_ERROR: - freestrbuffer(dbuf); - return NULL; - } - nbytes = STRBUFSZ(dbuf) - STRBUFLEN(dbuf) - strm->avail_out; - strbufferuse(dbuf, nbytes); - } while (strm->avail_out == 0); - - return dbuf; -} - - -void uncompress_stream_done(void *s) -{ - inflateEnd((z_stream *)s); - xfree(s); -} - - -strbuffer_t *uncompress_buffer(char *msg, int msglen, char *prestring) -{ -#if defined(HOBBITZLIB) - static z_stream *strm = NULL; - strbuffer_t *dbuf; - static int dbufmax = 0; - int n; - unsigned int nbytes, avbytes; - - if (!strm) { - strm = uncompress_stream_init(); - if (!strm) return NULL; - } - else { - inflateReset(strm); /* We'll reuse the strm struct */ - } - - if (dbufmax < 2*msglen) dbufmax = 2*msglen; - dbuf = newstrbuffer(dbufmax); - if (prestring) addtobuffer(dbuf, prestring); - - do { - strm->avail_in = msglen - compressionmarkersz; - strm->next_in = msg + compressionmarkersz; - - do { - avbytes = STRBUFSZ(dbuf) - STRBUFLEN(dbuf) - 1; /* -1 for the trailing \0 */ - if (strm->avail_out < 4096) { - strbuffergrow(dbuf, 4096); - avbytes = STRBUFSZ(dbuf) - STRBUFLEN(dbuf) - 1; - } - - strm->avail_out = avbytes; - strm->next_out = STRBUF(dbuf) + STRBUFLEN(dbuf); - n = inflate(strm, Z_NO_FLUSH); - - switch (n) { - case Z_STREAM_ERROR: - xfree(strm); strm = NULL; - freestrbuffer(dbuf); - return NULL; - case Z_NEED_DICT: - case Z_DATA_ERROR: - case Z_MEM_ERROR: - n = Z_DATA_ERROR; - goto done; - } - nbytes = avbytes - strm->avail_out; - strbufferuse(dbuf, nbytes); - } while (strm->avail_out == 0); - } while (n != Z_STREAM_END); - -done: - if (n == Z_STREAM_END) { - // errprintf("Inflated message from %d to %d bytes (%d %%)\n", msglen, STRBUFLEN(dbuf), 100*STRBUFLEN(dbuf)/msglen-100); - return dbuf; - } - else { - freestrbuffer(dbuf); - return NULL; - } - -#else - return NULL; -#endif -} - - - - -strbuffer_t *compress_buffer(char *msg, int msglen) -{ -#if defined(HOBBITZLIB) - static z_stream *strm = NULL; - int ret; - unsigned int sz; - strbuffer_t *cmsg; - - if (!strm) { - strm = (z_stream *)malloc(sizeof(z_stream)); - strm->zalloc = Z_NULL; - strm->zfree = Z_NULL; - strm->opaque = Z_NULL; - ret = deflateInit(strm, Z_DEFAULT_COMPRESSION); - - if (ret != Z_OK) { - xfree(strm); - return NULL; - } - } - else { - /* Use deflateReset() instead of deflateEnd() so we can re-use the zlib token */ - deflateReset(strm); - } - - strm->avail_in = msglen; - strm->next_in = msg; - - sz = deflateBound(strm, msglen); - cmsg = newstrbuffer(sz+compressionmarkersz); - addtobuffer(cmsg, compressionmarker); - strm->avail_out = sz; - strm->next_out = STRBUF(cmsg)+compressionmarkersz; - ret = deflate(strm, Z_FINISH); - if ((ret != Z_STREAM_ERROR) && (strm->avail_in == 0)) { - /* All was compressed OK */ - strbufferuse(cmsg, (sz - strm->avail_out)); - // errprintf("Compressed message from %d to %d bytes (%d %%)\n", msglen, STRBUFLEN(cmsg), 100 - (100*STRBUFLEN(cmsg)/msglen)); - } - else { - errprintf("Compression failed: ret=%d, avail_in=%u\n", ret, strm->avail_in); - freestrbuffer(cmsg); cmsg = NULL; - } - - return cmsg; - -#else - return NULL; -#endif -} - Deleted: trunk/lib/compression.h =================================================================== --- trunk/lib/compression.h 2011-03-08 17:20:28 UTC (rev 6650) +++ trunk/lib/compression.h 2011-03-08 17:36:04 UTC (rev 6651) @@ -1,25 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/* Hobbit monitor library. */ -/* */ -/* Copyright (C) 2008 Henrik Storner <he...@hs...> */ -/* */ -/* This program is released under the GNU General Public License (GPL), */ -/* version 2. See the file "COPYING" for details. */ -/* */ -/*----------------------------------------------------------------------------*/ - -#ifndef _COMPRESSION_H_ -#define _COMPRESSION_H_ - -extern char *compressionmarker; -extern int compressionmarkersz; - -extern void *uncompress_stream_init(void); -extern strbuffer_t *uncompress_stream_data(void *s, char *cmsg, int clen); -extern void uncompress_stream_done(void *s); - -extern strbuffer_t *uncompress_buffer(char *msg, int msglen, char *prestring); -extern strbuffer_t *compress_buffer(char *msg, int msglen); - -#endif - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: Henrik S. <he...@hs...> - 2011-03-08 17:57:01
|
Hi, just a quick note that the 4.3.0 branch is now CLOSED, and all of the 4.2.x/4.3.0 changes have been merged into "trunk". So development should now proceed in the usual manner, with new stuff going into "trunk". I'll setup a 4.3.1 branch for maintaining the 4.3.x version - that should be bug-fixes ONLY. Regards, Henrik |
From: <st...@us...> - 2011-03-14 06:46:56
|
Revision: 6660 http://xymon.svn.sourceforge.net/xymon/?rev=6660&view=rev Author: storner Date: 2011-03-14 06:46:50 +0000 (Mon, 14 Mar 2011) Log Message: ----------- xymond user messages: Improve error message for oversize messages. Document the MAXMSG_USER setting. Modified Paths: -------------- trunk/common/xymonserver.cfg.5 trunk/xymond/xymond.c Modified: trunk/common/xymonserver.cfg.5 =================================================================== --- trunk/common/xymonserver.cfg.5 2011-03-09 16:56:59 UTC (rev 6659) +++ trunk/common/xymonserver.cfg.5 2011-03-14 06:46:50 UTC (rev 6660) @@ -404,7 +404,13 @@ alert-colors, usually red, yellow and purple. There is no reason to change this setting. +.IP MAXMSG_USER +The maximum size of a "user" message in kB, default: 128. +"user" messages are for communication between custom Xymon +modules you have installed, it is not used directly by +Xymon. + .SH XYMOND_HISTORY SETTINGS .IP XYMONALLHISTLOG Modified: trunk/xymond/xymond.c =================================================================== --- trunk/xymond/xymond.c 2011-03-09 16:56:59 UTC (rev 6659) +++ trunk/xymond/xymond.c 2011-03-14 06:46:50 UTC (rev 6660) @@ -792,7 +792,10 @@ channelmarker, channel->seq, hostname, (int) tstamp.tv_sec, (int) tstamp.tv_usec, sender, hostname, msg); if (n > (bufsz-5)) { - errprintf("Oversize notes/user msg from %s for %s truncated (n=%d, limit=%d)\n", + char *source; + + errprintf("Oversize %s msg from %s for %s truncated (n=%d, limit=%d)\n", + ((channel->channelid == C_NOTES) ? "notes" : "user"), sender, hostname, n, bufsz); } *(channel->channelbuf + bufsz - 5) = '\0'; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <st...@us...> - 2011-04-03 09:58:23
|
Revision: 6666 http://xymon.svn.sourceforge.net/xymon/?rev=6666&view=rev Author: storner Date: 2011-04-03 09:58:15 +0000 (Sun, 03 Apr 2011) Log Message: ----------- Web UI: SECURITY FIX - fix potential cross-site scripting vulnerabilities. Initial report by David Ferrest (email April 1st 2011). Modified Paths: -------------- trunk/lib/eventlog.c trunk/lib/headfoot.c trunk/lib/htmllog.c trunk/lib/notifylog.c trunk/lib/reportlog.c trunk/lib/strfunc.c trunk/lib/strfunc.h trunk/web/ackinfo.c trunk/web/acknowledge.c trunk/web/criticaleditor.c trunk/web/enadis.c trunk/web/eventlog.c trunk/web/findhost.c trunk/web/history.c trunk/web/report.c trunk/web/showgraph.c trunk/web/snapshot.c trunk/web/statusreport.c trunk/web/svcstatus-info.c trunk/web/svcstatus.c Modified: trunk/lib/eventlog.c =================================================================== --- trunk/lib/eventlog.c 2011-04-03 09:25:05 UTC (rev 6665) +++ trunk/lib/eventlog.c 2011-04-03 09:58:15 UTC (rev 6666) @@ -544,7 +544,7 @@ if (fromtime) { firstevent = eventreport_time(fromtime); if(firstevent < 0) { - if (output) fprintf(output,"<B>Invalid 'from' time: %s</B>", fromtime); + if (output) fprintf(output,"<B>Invalid 'from' time: %s</B>", htmlquoted(fromtime)); return; } } @@ -562,7 +562,7 @@ if (totime) { lastevent = eventreport_time(totime); if (lastevent < 0) { - if (output) fprintf(output,"<B>Invalid 'to' time: %s</B>", totime); + if (output) fprintf(output,"<B>Invalid 'to' time: %s</B>", htmlquoted(totime)); return; } if (lastevent < firstevent) { @@ -715,7 +715,7 @@ countlist_t *cwalk; unsigned long totalcount = 0; - if (periodstring) fprintf(output, "<p><font size=+1>%s</font></p>\n", periodstring); + if (periodstring) fprintf(output, "<p><font size=+1>%s</font></p>\n", htmlquoted(periodstring)); switch (sumtype) { case XYMON_S_HOST_BREAKDOWN: @@ -778,7 +778,7 @@ 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", title); + 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); @@ -835,7 +835,7 @@ 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", title); + 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"); Modified: trunk/lib/headfoot.c =================================================================== --- trunk/lib/headfoot.c 2011-04-03 09:25:05 UTC (rev 6665) +++ trunk/lib/headfoot.c 2011-04-03 09:58:15 UTC (rev 6666) @@ -1577,7 +1577,7 @@ xfree(templatedata); } else { - fprintf(output, "<HTML><BODY> \n <HR size=4> \n <BR>%s is either missing or invalid, please create this file with your custom header<BR> \n<HR size=4>", filename); + fprintf(output, "<HTML><BODY> \n <HR size=4> \n <BR>%s is either missing or invalid, please create this file with your custom header<BR> \n<HR size=4>", htmlquoted(filename)); } /* Check for bulletin files */ Modified: trunk/lib/htmllog.c =================================================================== --- trunk/lib/htmllog.c 2011-04-03 09:25:05 UTC (rev 6665) +++ trunk/lib/htmllog.c 2011-04-03 09:58:15 UTC (rev 6666) @@ -78,7 +78,7 @@ <INPUT TYPE=HIDDEN NAME=\"IP\" VALUE=\"%s\"> \ <INPUT TYPE=HIDDEN NAME=\"DISPLAYNAME\" VALUE=\"%s\"> \ </FORM></CENTER>\n", - cgibinurl, btntxt, hostname, service, ip, displayname); + cgibinurl, htmlquoted(btntxt), htmlquoted(hostname), htmlquoted(service), htmlquoted(ip), htmlquoted(displayname)); } xfree(tmp2); @@ -159,7 +159,7 @@ hostsvc_setup(); if (!displayname) displayname = hostname; - sethostenv(displayname, ip, service, colorname(color), hostname); + sethostenv(htmlquoted(displayname), htmlquoted(ip), htmlquoted(service), colorname(color), htmlquoted(hostname)); if (logtime) sethostenv_snapshot(logtime); if (is_history) tplfile = "histlog"; @@ -252,9 +252,9 @@ strftime(untilstr, sizeof(untilstr)-1, "%Y-%m-%d %H:%M", localtime(&validuntil)); fprintf(output, "<tr>"); fprintf(output, "<td align=center><font %s>%d</font></td>", ackfont, level); - fprintf(output, "<td><font %s>%s</font></td>", ackfont, ackedby); + fprintf(output, "<td><font %s>%s</font></td>", ackfont, htmlquoted(ackedby)); fprintf(output, "<td><font %s>%s - %s</font></td>", ackfont, receivedstr, untilstr); - fprintf(output, "<td><font %s>%s</font></td>", ackfont, msg); + fprintf(output, "<td><font %s>%s</font></td>", ackfont, htmlquoted(msg)); fprintf(output, "</tr>\n"); } @@ -275,12 +275,12 @@ fprintf(output, "<CENTER><TABLE ALIGN=CENTER BORDER=0 SUMMARY=\"Detail Status\">\n"); - if (wantserviceid) fprintf(output, "<TR><TH><FONT %s>%s - %s</FONT><BR><HR WIDTH=\"60%%\"></TH></TR>\n", rowfont, displayname, service); + if (wantserviceid) fprintf(output, "<TR><TH><FONT %s>%s - %s</FONT><BR><HR WIDTH=\"60%%\"></TH></TR>\n", rowfont, htmlquoted(displayname), htmlquoted(service)); if (disabletime != 0) { fprintf(output, "<TR><TD ALIGN=LEFT><H3>Disabled until %s</H3></TD></TR>\n", (disabletime == -1 ? "OK" : ctime(&disabletime))); - fprintf(output, "<TR><TD ALIGN=LEFT><PRE>%s</PRE></TD></TR>\n", dismsg); + fprintf(output, "<TR><TD ALIGN=LEFT><PRE>%s</PRE></TD></TR>\n", htmlquoted(dismsg)); fprintf(output, "<TR><TD ALIGN=LEFT><BR><HR>Current status message follows:<HR><BR></TD></TR>\n"); fprintf(output, "<TR><TD ALIGN=LEFT>"); @@ -296,7 +296,7 @@ char *txt = skipword(firstline); if (dismsg) { - fprintf(output, "<TR><TD ALIGN=LEFT><H3>Planned downtime: %s</H3></TD></TR>\n", dismsg); + fprintf(output, "<TR><TD ALIGN=LEFT><H3>Planned downtime: %s</H3></TD></TR>\n", htmlquoted(dismsg)); fprintf(output, "<TR><TD ALIGN=LEFT><BR><HR>Current status message follows:<HR><BR></TD></TR>\n"); } @@ -350,12 +350,12 @@ if (ackedby) { *ackedby = '\0'; fprintf(output, "<font %s>Current acknowledgment: %s<br>%s<br>%s</font><br>\n", - ackfont, ackmsg, (ackedby+1), ackuntil); + ackfont, htmlquoted(ackmsg), (ackedby+1), ackuntil); *ackedby = '\n'; } else { fprintf(output, "<font %s>Current acknowledgment: %s<br>%s</font><br>\n", - ackfont, ackmsg, ackuntil); + ackfont, htmlquoted(ackmsg), ackuntil); } MEMUNDEFINE(ackuntil); Modified: trunk/lib/notifylog.c =================================================================== --- trunk/lib/notifylog.c 2011-04-03 09:25:05 UTC (rev 6665) +++ trunk/lib/notifylog.c 2011-04-03 09:58:15 UTC (rev 6666) @@ -120,7 +120,7 @@ if (fromtime) { firstevent = convert_time(fromtime); if(firstevent < 0) { - fprintf(output,"<B>Invalid 'from' time: %s</B>", fromtime); + fprintf(output,"<B>Invalid 'from' time: %s</B>", htmlquoted(fromtime)); return; } } @@ -134,7 +134,7 @@ if (totime) { lastevent = convert_time(totime); if (lastevent < 0) { - fprintf(output,"<B>Invalid 'to' time: %s</B>", totime); + fprintf(output,"<B>Invalid 'to' time: %s</B>", htmlquoted(totime)); return; } if (lastevent < firstevent) { @@ -314,7 +314,7 @@ fprintf(output, "<BR><BR>\n"); fprintf(output, "<TABLE SUMMARY=\"Notification log\" BORDER=0>\n"); fprintf(output, "<TR BGCOLOR=\"#333333\">\n"); - fprintf(output, "<TD ALIGN=CENTER COLSPAN=4><FONT SIZE=-1 COLOR=\"#33ebf4\">%s</FONT></TD></TR>\n", title); + fprintf(output, "<TD ALIGN=CENTER COLSPAN=4><FONT SIZE=-1 COLOR=\"#33ebf4\">%s</FONT></TD></TR>\n", htmlquoted(title)); fprintf(output, "<TR BGCOLOR=\"#333333\"><TH>Time</TH><TH>Host</TH><TH>Service</TH><TH>Recipient</TH></TR>\n"); for (walk=head; (walk != lasttoshow->next); walk=walk->next) { @@ -352,7 +352,7 @@ 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", title); + 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"); Modified: trunk/lib/reportlog.c =================================================================== --- trunk/lib/reportlog.c 2011-04-03 09:25:05 UTC (rev 6665) +++ trunk/lib/reportlog.c 2011-04-03 09:58:15 UTC (rev 6666) @@ -34,7 +34,7 @@ int curbg = 0; if (!displayname) displayname = hostname; - sethostenv(displayname, ip, service, colorname(color), hostname); + sethostenv(htmlquoted(displayname), htmlquoted(ip), htmlquoted(service), colorname(color), htmlquoted(hostname)); sethostenv_report(st, end, reportwarnlevel, reportgreenlevel); headfoot(htmlrep, "replog", "", "header", color); @@ -42,7 +42,7 @@ fprintf(htmlrep, "\n"); fprintf(htmlrep, "<CENTER>\n"); - fprintf(htmlrep, "<BR><FONT %s><B>%s - %s</B></FONT>\n", xgetenv("XYMONPAGEROWFONT"), displayname, service); + fprintf(htmlrep, "<BR><FONT %s><B>%s - %s</B></FONT>\n", xgetenv("XYMONPAGEROWFONT"), htmlquoted(displayname), htmlquoted(service)); fprintf(htmlrep, "<TABLE BORDER=0 BGCOLOR=\"#333333\" CELLPADDING=3 SUMMARY=\"Availability percentages\">\n"); fprintf(htmlrep, "<TR>\n"); Modified: trunk/lib/strfunc.c =================================================================== --- trunk/lib/strfunc.c 2011-04-03 09:25:05 UTC (rev 6665) +++ trunk/lib/strfunc.c 2011-04-03 09:58:15 UTC (rev 6666) @@ -177,3 +177,35 @@ *(buf->s+buf->used) = '\0'; } +char *htmlquoted(char *s) +{ + /* + * This routine converts a plain string into an html-quoted string + */ + + static strbuffer_t *result = NULL; + char *inp, *endp; + char c; + + if (!result) result = newstrbuffer(4096); + clearstrbuffer(result); + + inp = s; + do { + endp = inp + strcspn(inp, "\"&<> "); + c = *endp; + if (endp > inp) addtobufferraw(result, inp, endp-inp); + switch (c) { + case '"': addtobuffer(result, """); break; + case '&': addtobuffer(result, "&"); break; + case '<': addtobuffer(result, "<"); break; + case '>': addtobuffer(result, ">"); break; + case ' ': addtobuffer(result, " "); break; + default: break; + } + inp = (c == '\0') ? NULL : endp+1; + } while (inp); + + return STRBUF(result); +} + Modified: trunk/lib/strfunc.h =================================================================== --- trunk/lib/strfunc.h 2011-04-03 09:25:05 UTC (rev 6665) +++ trunk/lib/strfunc.h 2011-04-03 09:58:15 UTC (rev 6666) @@ -24,6 +24,7 @@ extern void strbufferrecalc(strbuffer_t *buf); extern void strbuffergrow(strbuffer_t *buf, int bytes); extern void strbufferuse(strbuffer_t *buf, int bytes); +extern char *htmlquoted(char *s); #endif Modified: trunk/web/ackinfo.c =================================================================== --- trunk/web/ackinfo.c 2011-04-03 09:25:05 UTC (rev 6665) +++ trunk/web/ackinfo.c 2011-04-03 09:58:15 UTC (rev 6666) @@ -122,7 +122,7 @@ fprintf(stdout, "Content-type: %s\n", xgetenv("HTMLCONTENTTYPE")); fprintf(stdout, "Location: %s\n", getenv("HTTP_REFERER")); fprintf(stdout, "\n"); - fprintf(stdout, "Sent to xymond:\n%s\n", xymonmsg); + fprintf(stdout, "Sent to xymond:\n%s\n", htmlquoted(xymonmsg)); return 0; } Modified: trunk/web/acknowledge.c =================================================================== --- trunk/web/acknowledge.c 2011-04-03 09:25:05 UTC (rev 6665) +++ trunk/web/acknowledge.c 2011-04-03 09:58:15 UTC (rev 6666) @@ -159,16 +159,16 @@ fprintf(output, "<tr>\n"); - fprintf(output, " <td align=left>%s</td>\n", (hname ? hname : " ")); - fprintf(output, " <td align=left>%s</td>\n", (tname ? tname : " ")); + fprintf(output, " <td align=left>%s</td>\n", (hname ? htmlquoted(hname) : " ")); + fprintf(output, " <td align=left>%s</td>\n", (tname ? htmlquoted(tname) : " ")); fprintf(output, " <TD><INPUT TYPE=TEXT NAME=\"DELAY_%s\" SIZE=8 MAXLENGTH=20></TD>\n", numstr); fprintf(output, " <TD><INPUT TYPE=TEXT NAME=\"MESSAGE_%s\" SIZE=60 MAXLENGTH=80></TD>\n", numstr); fprintf(output, " <TD>\n"); if (ackcode && hname && tname) { - fprintf(output, " <INPUT TYPE=\"HIDDEN\" NAME=\"NUMBER_%d\" VALUE=\"%s\">\n", num, ackcode); - fprintf(output, " <INPUT TYPE=\"HIDDEN\" NAME=\"HOSTNAME_%d\" VALUE=\"%s\">\n", num, hname); - fprintf(output, " <INPUT TYPE=\"HIDDEN\" NAME=\"TESTNAME_%d\" VALUE=\"%s\">\n", num, tname); + fprintf(output, " <INPUT TYPE=\"HIDDEN\" NAME=\"NUMBER_%d\" VALUE=\"%s\">\n", num, htmlquoted(ackcode)); + fprintf(output, " <INPUT TYPE=\"HIDDEN\" NAME=\"HOSTNAME_%d\" VALUE=\"%s\">\n", num, htmlquoted(hname)); + fprintf(output, " <INPUT TYPE=\"HIDDEN\" NAME=\"TESTNAME_%d\" VALUE=\"%s\">\n", num, htmlquoted(tname)); fprintf(output, " <INPUT TYPE=\"SUBMIT\" NAME=\"Send_%d\" VALUE=\"Send\" ALT=\"Send\">\n", num); } else { Modified: trunk/web/criticaleditor.c =================================================================== --- trunk/web/criticaleditor.c 2011-04-03 09:25:05 UTC (rev 6665) +++ trunk/web/criticaleditor.c 2011-04-03 09:58:15 UTC (rev 6666) @@ -231,7 +231,7 @@ if (rec) sethostenv_critedit(rec->updinfo, rec->priority, rec->ttgroup, rec->starttime, rec->endtime, rec->crittime, rec->ttextra); else sethostenv_critedit("", 0, NULL, 0, 0, NULL, NULL); - sethostenv(hostname, "", service, colorname(COL_BLUE), NULL); + sethostenv(htmlquoted(hostname), "", htmlquoted(service), colorname(COL_BLUE), NULL); *warnmsg = '\0'; if (!rec && nodatawarning) sprintf(warnmsg, "<SCRIPT LANGUAGE=\"Javascript\" type=\"text/javascript\"> alert('%s'); </SCRIPT>\n", nodatawarning); Modified: trunk/web/enadis.c =================================================================== --- trunk/web/enadis.c 2011-04-03 09:25:05 UTC (rev 6665) +++ trunk/web/enadis.c 2011-04-03 09:58:15 UTC (rev 6666) @@ -199,7 +199,7 @@ if (preview) { printf("<tr><td>Enabling host <b>%s</b> test <b>%s</b> : %s</td></tr>\n", - hostname, enabletest[i], ((result == XYMONSEND_OK) ? "OK" : "Failed")); + htmlquoted(hostname), htmlquoted(enabletest[i]), ((result == XYMONSEND_OK) ? "OK" : "Failed")); } } break; @@ -219,7 +219,7 @@ if (preview) { printf("<tr><td>Disabling host <b>%s</b> test <b>%s</b>: %s</td></tr>\n", - hostname, disabletest[i], ((result == XYMONSEND_OK) ? "OK" : "Failed")); + htmlquoted(hostname), htmlquoted(disabletest[i]), ((result == XYMONSEND_OK) ? "OK" : "Failed")); } } break; @@ -232,7 +232,7 @@ if (preview) { printf("<tr><td>Scheduling disable of host <b>%s</b> test <b>%s</b> at <b>%s</b>: %s</td></tr>\n", - hostname, disabletest[i], ctime(&schedtime), ((result == XYMONSEND_OK) ? "OK" : "Failed")); + htmlquoted(hostname), htmlquoted(disabletest[i]), ctime(&schedtime), ((result == XYMONSEND_OK) ? "OK" : "Failed")); } } break; Modified: trunk/web/eventlog.c =================================================================== --- trunk/web/eventlog.c 2011-04-03 09:25:05 UTC (rev 6665) +++ trunk/web/eventlog.c 2011-04-03 09:58:15 UTC (rev 6666) @@ -337,9 +337,9 @@ parse_query(); if ((*periodstring == '\0') && (fromtime || totime)) { - if (fromtime && totime) sprintf(periodstring, "Events between %s - %s", fromtime, totime); - else if (fromtime) sprintf(periodstring, "Events since %s", fromtime); - else if (totime) sprintf(periodstring, "Events until %s", totime); + if (fromtime && totime) sprintf(periodstring, "Events between %s - %s", htmlquoted(fromtime), htmlquoted(totime)); + else if (fromtime) sprintf(periodstring, "Events since %s", htmlquoted(fromtime)); + else if (totime) sprintf(periodstring, "Events until %s", htmlquoted(totime)); } /* Now generate the webpage */ Modified: trunk/web/findhost.c =================================================================== --- trunk/web/findhost.c 2011-04-03 09:25:05 UTC (rev 6665) +++ trunk/web/findhost.c 2011-04-03 09:58:15 UTC (rev 6666) @@ -163,7 +163,7 @@ regerror(re_status, &re, re_errstr, BUFSIZE); print_header(); - printf("<tr><td align=left><font color=red>%s</font></td>\n", pSearchPat); + printf("<tr><td align=left><font color=red>%s</font></td>\n", htmlquoted(pSearchPat)); printf("<td align=left><font color=red>%s</font></td></tr>\n", re_errstr); print_footer(); @@ -254,7 +254,7 @@ print_header(); if (!gotany) { - printf("<tr><td align=left>%s</td><td align=left>Not found</td></tr>\n", pSearchPat); + printf("<tr><td align=left>%s</td><td align=left>Not found</td></tr>\n", htmlquoted(pSearchPat)); } else { printf("%s", grabstrbuffer(outbuf)); Modified: trunk/web/history.c =================================================================== --- trunk/web/history.c 2011-04-03 09:25:05 UTC (rev 6665) +++ trunk/web/history.c 2011-04-03 09:58:15 UTC (rev 6666) @@ -510,14 +510,14 @@ int entrycount, /* Log entry maxcount */ replog_t *loghead) /* Eventlog for entrycount events back */ { - sethostenv(displayname, ip, service, colorname(COL_GREEN), hostname); + sethostenv(htmlquoted(displayname), htmlquoted(ip), htmlquoted(service), colorname(COL_GREEN), htmlquoted(hostname)); headfoot(htmlrep, "hist", "", "header", COL_GREEN); fprintf(htmlrep, "\n"); fprintf(htmlrep, "<CENTER>\n"); if (wantserviceid) { fprintf(htmlrep, "<BR><FONT %s><B>%s - %s</B></FONT><BR>\n", - xgetenv("XYMONPAGEROWFONT"), displayname, service); + xgetenv("XYMONPAGEROWFONT"), htmlquoted(displayname), htmlquoted(service)); } /* Create the color-bars */ Modified: trunk/web/report.c =================================================================== --- trunk/web/report.c 2011-04-03 09:25:05 UTC (rev 6665) +++ trunk/web/report.c 2011-04-03 09:58:15 UTC (rev 6666) @@ -288,7 +288,7 @@ 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 - %s (%s)<BR>\n", startstr, endstr, style); + printf("<H3>Generating report for the period: %s - %s (%s)<BR>\n", htmlquoted(startstr), htmlquoted(endstr), htmlquoted(style)); printf("<P><P>\n"); fflush(stdout); } Modified: trunk/web/showgraph.c =================================================================== --- trunk/web/showgraph.c 2011-04-03 09:25:05 UTC (rev 6665) +++ trunk/web/showgraph.c 2011-04-03 09:58:15 UTC (rev 6666) @@ -640,9 +640,9 @@ switch (action) { case ACT_MENU: fprintf(output, " <td align=\"left\"><img src=\"%s&action=view&graph=%s\" alt=\"%s graph\"></td>\n", - uri, grtype, grtype); + uri, htmlquoted(grtype), htmlquoted(grtype)); fprintf(output, " <td align=\"left\" valign=\"top\"> <a href=\"%s&graph=%s&action=selzoom&color=%s\"> <img src=\"%s/zoom.gif\" border=0 alt=\"Zoom graph\" style='padding: 3px'> </a> </td>\n", - uri, grtype, colorname(bgcolor), getenv("XYMONSKIN")); + uri, htmlquoted(grtype), colorname(bgcolor), getenv("XYMONSKIN")); break; case ACT_SELZOOM: @@ -650,7 +650,7 @@ if (graphstart == 0) gstart = gend - persecs; else gstart = graphstart; fprintf(output, " <td align=\"left\"><img id='zoomGraphImage' src=\"%s&graph=%s&action=view&graph_start=%u&graph_end=%u&graph_height=%d&graph_width=%d&", - uri, grtype, (int) gstart, (int) gend, graphheight, graphwidth); + uri, htmlquoted(grtype), (int) gstart, (int) gend, graphheight, graphwidth); if (haveupperlimit) fprintf(output, "&upper=%f", upperlimit); if (havelowerlimit) fprintf(output, "&lower=%f", lowerlimit); fprintf(output, "\" alt=\"Zoom source image\"></td>\n"); @@ -700,7 +700,7 @@ { /* This is special-handled, because we just want to generate an HTML link page */ fprintf(stdout, "Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); - sethostenv(displayname, "", service, colorname(bgcolor), hostname); + sethostenv(htmlquoted(displayname), "", htmlquoted(service), colorname(bgcolor), htmlquoted(hostname)); sethostenv_backsecs(backsecs); headfoot(stdout, "graphs", "", "header", bgcolor); @@ -882,7 +882,7 @@ char msg[8192]; snprintf(msg, sizeof(msg), "graphs.cfg error, PCRE pattern %s invalid: %s, offset %d\n", - gdef->fnpat, errmsg, errofs); + htmlquoted(gdef->fnpat), errmsg, errofs); errormsg(msg); } if (gdef->exfnpat) { @@ -892,7 +892,7 @@ snprintf(msg, sizeof(msg), "graphs.cfg error, PCRE pattern %s invalid: %s, offset %d\n", - gdef->exfnpat, errmsg, errofs); + htmlquoted(gdef->exfnpat), errmsg, errofs); errormsg(msg); } } @@ -1131,7 +1131,7 @@ void generate_zoompage(char *selfURI) { fprintf(stdout, "Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); - sethostenv(displayname, "", service, colorname(bgcolor), hostname); + sethostenv(htmlquoted(displayname), "", htmlquoted(service), colorname(bgcolor), htmlquoted(hostname)); headfoot(stdout, "graphs", "", "header", bgcolor); Modified: trunk/web/snapshot.c =================================================================== --- trunk/web/snapshot.c 2011-04-03 09:25:05 UTC (rev 6665) +++ trunk/web/snapshot.c 2011-04-03 09:58:15 UTC (rev 6666) @@ -218,7 +218,7 @@ 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", startstr); + printf("<H3>Generating snapshot: %s<BR>\n", htmlquoted(startstr)); printf("<P><P>\n"); fflush(stdout); } Modified: trunk/web/statusreport.c =================================================================== --- trunk/web/statusreport.c 2011-04-03 09:25:05 UTC (rev 6665) +++ trunk/web/statusreport.c 2011-04-03 09:58:15 UTC (rev 6666) @@ -129,7 +129,7 @@ if (!embedded) { printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); - printf("<html><head><title>%s</title></head>\n", heading); + 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")); @@ -157,16 +157,16 @@ printf("<tr><td align=left valign=top><b>"); if (addlink) - printf("<a href=\"%s\">%s</a>", hostsvcurl(hostname, xgetenv("INFOCOLUMN"), 1), hostname); + printf("<a href=\"%s\">%s</a>", hostsvcurl(hostname, xgetenv("INFOCOLUMN"), 1), htmlquoted(hostname)); else - printf("%s", hostname); + printf("%s", htmlquoted(hostname)); if (showcolumn) { printf("<br>"); if (addlink) - printf("<a href=\"%s\">%s</a>", hostsvcurl(hostname, testname, 1), testname); + printf("<a href=\"%s\">%s</a>", hostsvcurl(hostname, testname, 1), htmlquoted(testname)); else - printf("%s", testname); + printf("%s", htmlquoted(testname)); } if (showcolors) printf(" - %s", colorstr); Modified: trunk/web/svcstatus-info.c =================================================================== --- trunk/web/svcstatus-info.c 2011-04-03 09:25:05 UTC (rev 6665) +++ trunk/web/svcstatus-info.c 2011-04-03 09:58:15 UTC (rev 6666) @@ -225,7 +225,7 @@ char l[1024]; int i, rcount; - sprintf(l, "<table summary=\"%s Alerts\" border=1>\n", hostname); + sprintf(l, "<table summary=\"%s Alerts\" border=1>\n", htmlquoted(hostname)); addtobuffer(buf, l); addtobuffer(buf, "<tr><th>Service</th><th>Recipient</th><th>1st Delay</th><th>Stop after</th><th>Repeat</th><th>Time of Day</th><th>Colors</th></tr>\n"); @@ -273,7 +273,7 @@ holidayset = xmh_item(hi, XMH_HOLIDAYS); - sprintf(l, "<table summary=\"%s Holidays\" border=1>\n", hostname); + sprintf(l, "<table summary=\"%s Holidays\" border=1>\n", htmlquoted(hostname)); addtobuffer(buf, l); addtobuffer(buf, "<tr>"); @@ -457,7 +457,7 @@ sprintf(l, "<form name=\"disableform\" method=\"post\" action=\"%s/enadis.sh\">\n", xgetenv("SECURECGIBINURL")); addtobuffer(buf, l); - sprintf(l, "<table summary=\"%s disable\" border=1>\n", hostname); + sprintf(l, "<table summary=\"%s disable\" border=1>\n", htmlquoted(hostname)); addtobuffer(buf, l); addtobuffer(buf, "<tr>\n"); @@ -569,7 +569,7 @@ addtobuffer(buf, "</table>\n"); - sprintf(l, "<input name=\"hostname\" type=hidden value=\"%s\">\n", hostname); + sprintf(l, "<input name=\"hostname\" type=hidden value=\"%s\">\n", htmlquoted(hostname)); addtobuffer(buf, l); addtobuffer(buf, "</form>\n"); } @@ -580,7 +580,7 @@ char l[1024]; char *msg, *eoln; - sprintf(l, "<table summary=\"%s disabled tests\" border=1>\n", hostname); + sprintf(l, "<table summary=\"%s disabled tests\" border=1>\n", htmlquoted(hostname)); addtobuffer(buf, l); addtobuffer(buf, "<tr><th>Test</th><th>Disabled until</th><th>Cause</th><th> </th></tr>\n"); @@ -601,17 +601,17 @@ addtobuffer(buf, "<td>"); while ((eoln = strchr(msg, '\n')) != NULL) { *eoln = '\0'; - addtobuffer(buf, msg); + addtobuffer(buf, htmlquoted(msg)); addtobuffer(buf, "<br>"); msg = (eoln + 1); } - addtobuffer(buf, msg); + addtobuffer(buf, htmlquoted(msg)); addtobuffer(buf, "</td>\n"); addtobuffer(buf, "<td>"); sprintf(l, "<form method=\"post\" action=\"%s/enadis.sh\">\n", xgetenv("SECURECGIBINURL")); addtobuffer(buf, l); - sprintf(l, "<input name=\"hostname\" type=hidden value=\"%s\">\n", hostname); + sprintf(l, "<input name=\"hostname\" type=hidden value=\"%s\">\n", htmlquoted(hostname)); addtobuffer(buf, l); sprintf(l, "<input name=\"enabletest\" type=hidden value=\"%s\">\n", tnames[i].name); addtobuffer(buf, l); @@ -627,7 +627,7 @@ addtobuffer(buf, "<td>"); sprintf(l, "<form method=\"post\" action=\"%s/enadis.sh\">\n", xgetenv("SECURECGIBINURL")); addtobuffer(buf, l); - sprintf(l, "<input name=\"hostname\" type=hidden value=\"%s\">\n", hostname); + sprintf(l, "<input name=\"hostname\" type=hidden value=\"%s\">\n", htmlquoted(hostname)); addtobuffer(buf, l); sprintf(l, "<input name=\"enabletest\" type=hidden value=\"%s\">\n", "*"); addtobuffer(buf, l); @@ -647,7 +647,7 @@ sched_t *swalk; char *msg, *eoln; - sprintf(l, "<table summary=\"%s scheduled disables\" border=1>\n", hostname); + sprintf(l, "<table summary=\"%s scheduled disables\" border=1>\n", htmlquoted(hostname)); addtobuffer(buf, l); addtobuffer(buf, "<tr><th>ID</th><th>When</th><th>Command</th><th> </th></tr>\n"); @@ -665,17 +665,17 @@ addtobuffer(buf, "<td>"); while ((eoln = strchr(msg, '\n')) != NULL) { *eoln = '\0'; - addtobuffer(buf, msg); + addtobuffer(buf, htmlquoted(msg)); addtobuffer(buf, "<br>"); msg = (eoln + 1); } - addtobuffer(buf, msg); + addtobuffer(buf, htmlquoted(msg)); addtobuffer(buf, "</td>\n"); addtobuffer(buf, "<td>"); sprintf(l, "<form method=\"post\" action=\"%s/enadis.sh\">\n", xgetenv("SECURECGIBINURL")); addtobuffer(buf, l); - sprintf(l, "<input name=\"hostname\" type=hidden value=\"%s\">\n", hostname); + sprintf(l, "<input name=\"hostname\" type=hidden value=\"%s\">\n", htmlquoted(hostname)); addtobuffer(buf, l); sprintf(l, "<input name=\"canceljob\" type=hidden value=\"%d\">\n", swalk->id); addtobuffer(buf, l); @@ -727,10 +727,10 @@ val = xmh_item(hostwalk, XMH_DISPLAYNAME); if (val && (strcmp(val, hostname) != 0)) { sprintf(l, "<tr><th align=left>Hostname:</th><td align=left>%s (%s)</td></tr>\n", - val, hostname); + val, htmlquoted(hostname)); } else { - sprintf(l, "<tr><th align=left>Hostname:</th><td align=left>%s</td></tr>\n", hostname); + sprintf(l, "<tr><th align=left>Hostname:</th><td align=left>%s</td></tr>\n", htmlquoted(hostname)); } addtobuffer(infobuf, l); Modified: trunk/web/svcstatus.c =================================================================== --- trunk/web/svcstatus.c 2011-04-03 09:25:05 UTC (rev 6665) +++ trunk/web/svcstatus.c 2011-04-03 09:58:15 UTC (rev 6666) @@ -140,10 +140,10 @@ char *p, *req; req = getenv("SCRIPT_NAME"); - clienturi = (char *)malloc(strlen(req) + 10 + strlen(hostname)); + clienturi = (char *)malloc(strlen(req) + 10 + strlen(htmlquoted(hostname))); strcpy(clienturi, req); p = strchr(clienturi, '?'); if (p) *p = '\0'; else p = clienturi + strlen(clienturi); - sprintf(p, "?CLIENT=%s", hostname); + sprintf(p, "?CLIENT=%s", htmlquoted(hostname)); } return 0; @@ -241,7 +241,7 @@ else if ((strcmp(service, xgetenv("TRENDSCOLUMN")) == 0) || (strcmp(service, xgetenv("INFOCOLUMN")) == 0)) { if (loadhostdata(hostname, &ip, &displayname, &compacts) != 0) return 1; ishtmlformatted = 1; - sethostenv(displayname, ip, service, colorname(COL_GREEN), hostname); + sethostenv(htmlquoted(displayname), htmlquoted(ip), htmlquoted(service), colorname(COL_GREEN), htmlquoted(hostname)); sethostenv_refresh(600); color = COL_GREEN; logtime = getcurrenttime(NULL); @@ -387,7 +387,7 @@ flapping = (items[18] ? (*items[18] == '1') : 0); modifiers = (items[19] && *(items[19])) ? items[19] : NULL; - sethostenv(displayname, ip, service, colorname(COL_GREEN), hostname); + sethostenv(htmlquoted(displayname), htmlquoted(ip), htmlquoted(service), colorname(COL_GREEN), htmlquoted(hostname)); sethostenv_refresh(60); } else { @@ -417,8 +417,8 @@ icolor = parse_color(itmcolor); if (icolor > color) color = icolor; - sprintf(l, "<tr><td align=left>&%s <a href=\"%s\">%s</a></td></tr>\n", - itmcolor, hostsvcurl(hostname, testname, 1), testname); + snprintf(l, sizeof(l), "<tr><td align=left>&%s <a href=\"%s\">%s</a></td></tr>\n", + itmcolor, hostsvcurl(hostname, testname, 1), htmlquoted(testname)); addtobuffer(cmsg, l); row = strtok_r(NULL, "\n", &p_row); } @@ -426,7 +426,7 @@ addtobuffer(cmsg, "</table>\n"); ishtmlformatted = 1; - sethostenv(displayname, ip, service, colorname(color), hostname); + sethostenv(htmlquoted(displayname), htmlquoted(ip), htmlquoted(service), colorname(color), htmlquoted(hostname)); sethostenv_refresh(60); logtime = getcurrenttime(NULL); strcpy(timesincechange, "0 minutes"); @@ -553,9 +553,9 @@ errprintf("Cannot find hostdata files for host %s\n", hostname); } else { - clienturi = (char *)realloc(clienturi, strlen(cgiurl) + 40 + strlen(hostname) + strlen(clientid)); + clienturi = (char *)realloc(clienturi, strlen(cgiurl) + 40 + strlen(htmlquoted(hostname)) + strlen(clientid)); sprintf(clienturi, "%s/svcstatus.sh?CLIENT=%s&TIMEBUF=%s", - cgiurl, hostname, clientid); + cgiurl, htmlquoted(hostname), clientid); } } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <st...@us...> - 2011-04-03 10:03:37
|
Revision: 6667 http://xymon.svn.sourceforge.net/xymon/?rev=6667&view=rev Author: storner Date: 2011-04-03 10:03:31 +0000 (Sun, 03 Apr 2011) Log Message: ----------- 4.3.1 release Modified Paths: -------------- trunk/debian/changelog trunk/include/version.h Modified: trunk/debian/changelog =================================================================== --- trunk/debian/changelog 2011-04-03 09:58:15 UTC (rev 6666) +++ trunk/debian/changelog 2011-04-03 10:03:31 UTC (rev 6667) @@ -1,3 +1,26 @@ +xymon (4.3.1) unstable; urgency=medium + + rev 6667 + + * Web UI: SECURITY FIX - fix potential cross-site scripting vulnerabilities. + Initial report by David Ferrest (email April 1st 2011). + * Solaris Makefile: Drop guessing of what linker is being used, since we + get it wrong too often. + * configure: Add missing <string.h> include to fix compile failure on + some systems. + * get_ostype(): Check that we have a valid OS identifier. + Dont assume we can write to the string passed us. + * xymond user messages: Improve error message for oversize messages. + Document the MAXMSG_USER setting. + * combostatus: Make the set of error-colors configurable. Change default set so + BLUE and PURPLE are not considered errors (only RED is an error by default). + * xymon(1) manpage: Add missing description of some fields available in the + xymondboard command. + * hosts.cfg manpage: Fix wrong NOPROP interpretation. From Thomas Brand. + * Demotool: Change Hobbit->Xymon + + -- Henrik Stoerner <he...@hs...> Sun, 3 Apr 2011 12:03:00 +0200 + xymon (4.3.0) unstable; urgency=medium * Critical view and other webpages: Make the 'All systems OK' message Modified: trunk/include/version.h =================================================================== --- trunk/include/version.h 2011-04-03 09:58:15 UTC (rev 6666) +++ trunk/include/version.h 2011-04-03 10:03:31 UTC (rev 6667) @@ -11,7 +11,7 @@ #ifndef __VERSION_H__ #define __VERSION_H__ -#define VERSION "4.3.0" +#define VERSION "4.3.1" #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <st...@us...> - 2011-04-04 05:23:19
|
Revision: 6670 http://xymon.svn.sourceforge.net/xymon/?rev=6670&view=rev Author: storner Date: 2011-04-04 05:23:12 +0000 (Mon, 04 Apr 2011) Log Message: ----------- Web UI: Fix bug introduced with the 4.3.1 XSS-vulnerability changes, causing (among other things) the history display to break. Modified Paths: -------------- trunk/lib/headfoot.c trunk/lib/htmllog.c trunk/lib/reportlog.c trunk/web/criticaleditor.c trunk/web/enadis.c trunk/web/eventlog.c trunk/web/history.c trunk/web/report.c trunk/web/showgraph.c trunk/web/svcstatus.c Modified: trunk/lib/headfoot.c =================================================================== --- trunk/lib/headfoot.c 2011-04-03 10:13:34 UTC (rev 6669) +++ trunk/lib/headfoot.c 2011-04-04 05:23:12 UTC (rev 6670) @@ -106,10 +106,10 @@ if (hostenv_svc) xfree(hostenv_svc); if (hostenv_color) xfree(hostenv_color); - hostenv_hikey = (hikey ? strdup(hikey) : NULL); - hostenv_host = strdup(host); - hostenv_ip = strdup(ip); - hostenv_svc = strdup(svc); + hostenv_hikey = (hikey ? strdup(htmlquoted(hikey)) : NULL); + hostenv_host = strdup(htmlquoted(host)); + hostenv_ip = strdup(htmlquoted(ip)); + hostenv_svc = strdup(htmlquoted(svc)); hostenv_color = strdup(color); } Modified: trunk/lib/htmllog.c =================================================================== --- trunk/lib/htmllog.c 2011-04-03 10:13:34 UTC (rev 6669) +++ trunk/lib/htmllog.c 2011-04-04 05:23:12 UTC (rev 6670) @@ -71,14 +71,14 @@ sprintf(tmp1, ",%s,", xgetenv("NONHISTS")); sprintf(tmp2, ",%s,", service); if (strstr(tmp1, tmp2) == NULL) { - fprintf(output, "<BR><BR><CENTER><FORM ACTION=\"%s/history.sh\"> \ - <INPUT TYPE=SUBMIT VALUE=\"%s\"> \ - <INPUT TYPE=HIDDEN NAME=\"HISTFILE\" VALUE=\"%s.%s\"> \ - <INPUT TYPE=HIDDEN NAME=\"ENTRIES\" VALUE=\"50\"> \ - <INPUT TYPE=HIDDEN NAME=\"IP\" VALUE=\"%s\"> \ - <INPUT TYPE=HIDDEN NAME=\"DISPLAYNAME\" VALUE=\"%s\"> \ - </FORM></CENTER>\n", - cgibinurl, htmlquoted(btntxt), htmlquoted(hostname), htmlquoted(service), htmlquoted(ip), htmlquoted(displayname)); + fprintf(output, "<BR><BR><CENTER><FORM ACTION=\"%s/history.sh\">,", cgibinurl); + fprintf(output, "<INPUT TYPE=SUBMIT VALUE=\"%s\">", htmlquoted(btntxt)); + fprintf(output, "<INPUT TYPE=HIDDEN NAME=\"HISTFILE\" VALUE=\"%s", htmlquoted(hostname)); + fprintf(output, ".%s\">", htmlquoted(service)); + fprintf(output, "<INPUT TYPE=HIDDEN NAME=\"ENTRIES\" VALUE=\"50\">"); + fprintf(output, "<INPUT TYPE=HIDDEN NAME=\"IP\" VALUE=\"%s\">", htmlquoted(ip)); + fprintf(output, "<INPUT TYPE=HIDDEN NAME=\"DISPLAYNAME\" VALUE=\"%s\">", htmlquoted(displayname)); + fprintf(output, "</FORM></CENTER>\n"); } xfree(tmp2); @@ -159,7 +159,7 @@ hostsvc_setup(); if (!displayname) displayname = hostname; - sethostenv(htmlquoted(displayname), htmlquoted(ip), htmlquoted(service), colorname(color), htmlquoted(hostname)); + sethostenv(displayname, ip, service, colorname(color), hostname); if (logtime) sethostenv_snapshot(logtime); if (is_history) tplfile = "histlog"; @@ -275,7 +275,12 @@ fprintf(output, "<CENTER><TABLE ALIGN=CENTER BORDER=0 SUMMARY=\"Detail Status\">\n"); - if (wantserviceid) fprintf(output, "<TR><TH><FONT %s>%s - %s</FONT><BR><HR WIDTH=\"60%%\"></TH></TR>\n", rowfont, htmlquoted(displayname), htmlquoted(service)); + if (wantserviceid) { + fprintf(output, "<TR><TH><FONT %s>", rowfont); + fprintf(output, "%s - ", htmlquoted(displayname)); + fprintf(output, "%s", htmlquoted(service)); + fprintf(output, "</FONT><BR><HR WIDTH=\"60%%\"></TH></TR>\n"); + } if (disabletime != 0) { fprintf(output, "<TR><TD ALIGN=LEFT><H3>Disabled until %s</H3></TD></TR>\n", Modified: trunk/lib/reportlog.c =================================================================== --- trunk/lib/reportlog.c 2011-04-03 10:13:34 UTC (rev 6669) +++ trunk/lib/reportlog.c 2011-04-04 05:23:12 UTC (rev 6670) @@ -34,7 +34,7 @@ int curbg = 0; if (!displayname) displayname = hostname; - sethostenv(htmlquoted(displayname), htmlquoted(ip), htmlquoted(service), colorname(color), htmlquoted(hostname)); + sethostenv(displayname, ip, service, colorname(color), hostname); sethostenv_report(st, end, reportwarnlevel, reportgreenlevel); headfoot(htmlrep, "replog", "", "header", color); @@ -42,7 +42,9 @@ fprintf(htmlrep, "\n"); fprintf(htmlrep, "<CENTER>\n"); - fprintf(htmlrep, "<BR><FONT %s><B>%s - %s</B></FONT>\n", xgetenv("XYMONPAGEROWFONT"), htmlquoted(displayname), htmlquoted(service)); + 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"); Modified: trunk/web/criticaleditor.c =================================================================== --- trunk/web/criticaleditor.c 2011-04-03 10:13:34 UTC (rev 6669) +++ trunk/web/criticaleditor.c 2011-04-04 05:23:12 UTC (rev 6670) @@ -231,7 +231,7 @@ if (rec) sethostenv_critedit(rec->updinfo, rec->priority, rec->ttgroup, rec->starttime, rec->endtime, rec->crittime, rec->ttextra); else sethostenv_critedit("", 0, NULL, 0, 0, NULL, NULL); - sethostenv(htmlquoted(hostname), "", htmlquoted(service), colorname(COL_BLUE), NULL); + sethostenv(hostname, "", service, colorname(COL_BLUE), NULL); *warnmsg = '\0'; if (!rec && nodatawarning) sprintf(warnmsg, "<SCRIPT LANGUAGE=\"Javascript\" type=\"text/javascript\"> alert('%s'); </SCRIPT>\n", nodatawarning); Modified: trunk/web/enadis.c =================================================================== --- trunk/web/enadis.c 2011-04-03 10:13:34 UTC (rev 6669) +++ trunk/web/enadis.c 2011-04-04 05:23:12 UTC (rev 6670) @@ -198,8 +198,9 @@ } if (preview) { - printf("<tr><td>Enabling host <b>%s</b> test <b>%s</b> : %s</td></tr>\n", - htmlquoted(hostname), htmlquoted(enabletest[i]), ((result == XYMONSEND_OK) ? "OK" : "Failed")); + printf("<tr><td>Enabling host <b>%s</b>", htmlquoted(hostname)); + printf(" test <b>%s</b>", htmlquoted(enabletest[i])); + printf(": %s</td></tr>\n", ((result == XYMONSEND_OK) ? "OK" : "Failed")); } } break; @@ -218,8 +219,9 @@ } if (preview) { - printf("<tr><td>Disabling host <b>%s</b> test <b>%s</b>: %s</td></tr>\n", - htmlquoted(hostname), htmlquoted(disabletest[i]), ((result == XYMONSEND_OK) ? "OK" : "Failed")); + printf("<tr><td>Disabling host <b>%s</b>", htmlquoted(hostname)); + printf(" test <b>%s</b>", htmlquoted(disabletest[i])); + printf(": %s</td></tr>\n", ((result == XYMONSEND_OK) ? "OK" : "Failed")); } } break; @@ -231,8 +233,9 @@ result = (preview ? 0 : sendmessage(xymoncmd, NULL, XYMON_TIMEOUT, NULL)); if (preview) { - printf("<tr><td>Scheduling disable of host <b>%s</b> test <b>%s</b> at <b>%s</b>: %s</td></tr>\n", - htmlquoted(hostname), htmlquoted(disabletest[i]), ctime(&schedtime), ((result == XYMONSEND_OK) ? "OK" : "Failed")); + printf("<tr><td>Scheduling disable of host <b>%s</b>", htmlquoted(hostname)); + printf("test <b>%s</b>", htmlquoted(disabletest[i])); + printf(" at <b>%s</b>: %s</td></tr>\n", ctime(&schedtime), ((result == XYMONSEND_OK) ? "OK" : "Failed")); } } break; Modified: trunk/web/eventlog.c =================================================================== --- trunk/web/eventlog.c 2011-04-03 10:13:34 UTC (rev 6669) +++ trunk/web/eventlog.c 2011-04-04 05:23:12 UTC (rev 6670) @@ -337,7 +337,10 @@ parse_query(); if ((*periodstring == '\0') && (fromtime || totime)) { - if (fromtime && totime) sprintf(periodstring, "Events between %s - %s", htmlquoted(fromtime), htmlquoted(totime)); + if (fromtime && totime) { + sprintf(periodstring, "Events between %s ", htmlquoted(fromtime)); + sprintf(periodstring+strlen(periodstring), "- %s", htmlquoted(totime)); + } else if (fromtime) sprintf(periodstring, "Events since %s", htmlquoted(fromtime)); else if (totime) sprintf(periodstring, "Events until %s", htmlquoted(totime)); } Modified: trunk/web/history.c =================================================================== --- trunk/web/history.c 2011-04-03 10:13:34 UTC (rev 6669) +++ trunk/web/history.c 2011-04-04 05:23:12 UTC (rev 6670) @@ -510,14 +510,14 @@ int entrycount, /* Log entry maxcount */ replog_t *loghead) /* Eventlog for entrycount events back */ { - sethostenv(htmlquoted(displayname), htmlquoted(ip), htmlquoted(service), colorname(COL_GREEN), htmlquoted(hostname)); + sethostenv(displayname, ip, service, colorname(COL_GREEN), hostname); headfoot(htmlrep, "hist", "", "header", COL_GREEN); fprintf(htmlrep, "\n"); fprintf(htmlrep, "<CENTER>\n"); if (wantserviceid) { - fprintf(htmlrep, "<BR><FONT %s><B>%s - %s</B></FONT><BR>\n", - xgetenv("XYMONPAGEROWFONT"), htmlquoted(displayname), htmlquoted(service)); + fprintf(htmlrep, "<BR><FONT %s><B>%s", xgetenv("XYMONPAGEROWFONT"), htmlquoted(displayname)); + fprintf(htmlrep, " - %s</B></FONT><BR>\n", htmlquoted(service)); } /* Create the color-bars */ Modified: trunk/web/report.c =================================================================== --- trunk/web/report.c 2011-04-03 10:13:34 UTC (rev 6669) +++ trunk/web/report.c 2011-04-04 05:23:12 UTC (rev 6670) @@ -288,7 +288,9 @@ 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 - %s (%s)<BR>\n", htmlquoted(startstr), htmlquoted(endstr), htmlquoted(style)); + 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); } Modified: trunk/web/showgraph.c =================================================================== --- trunk/web/showgraph.c 2011-04-03 10:13:34 UTC (rev 6669) +++ trunk/web/showgraph.c 2011-04-04 05:23:12 UTC (rev 6670) @@ -634,15 +634,17 @@ void graph_link(FILE *output, char *uri, char *grtype, time_t seconds) { time_t gstart, gend; + char *grtype_s; fprintf(output, "<tr>\n"); + grtype_s = htmlquoted(grtype); switch (action) { case ACT_MENU: fprintf(output, " <td align=\"left\"><img src=\"%s&action=view&graph=%s\" alt=\"%s graph\"></td>\n", - uri, htmlquoted(grtype), htmlquoted(grtype)); + uri, grtype_s, grtype_s); fprintf(output, " <td align=\"left\" valign=\"top\"> <a href=\"%s&graph=%s&action=selzoom&color=%s\"> <img src=\"%s/zoom.gif\" border=0 alt=\"Zoom graph\" style='padding: 3px'> </a> </td>\n", - uri, htmlquoted(grtype), colorname(bgcolor), getenv("XYMONSKIN")); + uri, grtype_s, colorname(bgcolor), getenv("XYMONSKIN")); break; case ACT_SELZOOM: @@ -650,7 +652,7 @@ if (graphstart == 0) gstart = gend - persecs; else gstart = graphstart; fprintf(output, " <td align=\"left\"><img id='zoomGraphImage' src=\"%s&graph=%s&action=view&graph_start=%u&graph_end=%u&graph_height=%d&graph_width=%d&", - uri, htmlquoted(grtype), (int) gstart, (int) gend, graphheight, graphwidth); + uri, grtype_s, (int) gstart, (int) gend, graphheight, graphwidth); if (haveupperlimit) fprintf(output, "&upper=%f", upperlimit); if (havelowerlimit) fprintf(output, "&lower=%f", lowerlimit); fprintf(output, "\" alt=\"Zoom source image\"></td>\n"); @@ -700,7 +702,7 @@ { /* This is special-handled, because we just want to generate an HTML link page */ fprintf(stdout, "Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); - sethostenv(htmlquoted(displayname), "", htmlquoted(service), colorname(bgcolor), htmlquoted(hostname)); + sethostenv(displayname, "", service, colorname(bgcolor), hostname); sethostenv_backsecs(backsecs); headfoot(stdout, "graphs", "", "header", bgcolor); @@ -1131,7 +1133,7 @@ void generate_zoompage(char *selfURI) { fprintf(stdout, "Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); - sethostenv(htmlquoted(displayname), "", htmlquoted(service), colorname(bgcolor), htmlquoted(hostname)); + sethostenv(displayname, "", service, colorname(bgcolor), hostname); headfoot(stdout, "graphs", "", "header", bgcolor); Modified: trunk/web/svcstatus.c =================================================================== --- trunk/web/svcstatus.c 2011-04-03 10:13:34 UTC (rev 6669) +++ trunk/web/svcstatus.c 2011-04-04 05:23:12 UTC (rev 6670) @@ -241,7 +241,7 @@ else if ((strcmp(service, xgetenv("TRENDSCOLUMN")) == 0) || (strcmp(service, xgetenv("INFOCOLUMN")) == 0)) { if (loadhostdata(hostname, &ip, &displayname, &compacts) != 0) return 1; ishtmlformatted = 1; - sethostenv(htmlquoted(displayname), htmlquoted(ip), htmlquoted(service), colorname(COL_GREEN), htmlquoted(hostname)); + sethostenv(displayname, ip, service, colorname(COL_GREEN), hostname); sethostenv_refresh(600); color = COL_GREEN; logtime = getcurrenttime(NULL); @@ -387,7 +387,7 @@ flapping = (items[18] ? (*items[18] == '1') : 0); modifiers = (items[19] && *(items[19])) ? items[19] : NULL; - sethostenv(htmlquoted(displayname), htmlquoted(ip), htmlquoted(service), colorname(COL_GREEN), htmlquoted(hostname)); + sethostenv(displayname, ip, service, colorname(COL_GREEN), hostname); sethostenv_refresh(60); } else { @@ -426,7 +426,7 @@ addtobuffer(cmsg, "</table>\n"); ishtmlformatted = 1; - sethostenv(htmlquoted(displayname), htmlquoted(ip), htmlquoted(service), colorname(color), htmlquoted(hostname)); + sethostenv(displayname, ip, service, colorname(color), hostname); sethostenv_refresh(60); logtime = getcurrenttime(NULL); strcpy(timesincechange, "0 minutes"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <st...@us...> - 2011-05-14 13:59:45
|
Revision: 6689 http://xymon.svn.sourceforge.net/xymon/?rev=6689&view=rev Author: storner Date: 2011-05-14 13:59:38 +0000 (Sat, 14 May 2011) Log Message: ----------- Code cleanup: Fix confused RbtHandle / RbtIterator datatype usage Modified Paths: -------------- trunk/lib/loadcriticalconf.c trunk/lib/xymonrrd.c trunk/xymond/xymond.c trunk/xymond/xymond_rrd.c Modified: trunk/lib/loadcriticalconf.c =================================================================== --- trunk/lib/loadcriticalconf.c 2011-05-14 13:58:07 UTC (rev 6688) +++ trunk/lib/loadcriticalconf.c 2011-05-14 13:59:38 UTC (rev 6689) @@ -86,7 +86,7 @@ if (!firsttime) { /* Clean up existing datatree */ - RbtHandle handle; + RbtIterator handle; void *k1, *k2; for (handle = rbtBegin(rbconf); (handle != rbtEnd(rbconf)); handle = rbtNext(rbconf, handle)) { @@ -156,7 +156,7 @@ freestrbuffer(inbuf); if (debug) { - RbtHandle handle; + RbtIterator handle; handle = rbtBegin(rbconf); while (handle != rbtEnd(rbconf)) { @@ -170,9 +170,9 @@ return 0; } -static RbtHandle findrec(char *key) +static RbtIterator findrec(char *key) { - RbtHandle handle; + RbtIterator handle; handle = rbtFind(rbconf, key); if (handle == rbtEnd(rbconf)) { @@ -218,7 +218,7 @@ critconf_t *get_critconfig(char *key, int flags, char **resultkey) { - static RbtHandle handle; + static RbtIterator handle; static char *realkey = NULL; void *k1, *k2; critconf_t *result = NULL; @@ -339,7 +339,7 @@ struct stat st; struct utimbuf ut; - RbtHandle handle; + RbtIterator handle; FILE *fd; int result = 0; @@ -419,7 +419,7 @@ void addclone_critconfig(char *origin, char *newclone) { char *newkey; - RbtHandle handle; + RbtIterator handle; newkey = (char *)malloc(strlen(newclone) + 2); sprintf(newkey, "%s=", newclone); @@ -430,7 +430,7 @@ void dropclone_critconfig(char *drop) { - RbtHandle handle; + RbtIterator handle; char *key; void *k1, *k2; char *dropkey, *dropsrc; @@ -450,7 +450,7 @@ int delete_critconfig(char *dropkey, int evenifcloned) { - RbtHandle handle; + RbtIterator handle; void *k1, *k2; handle = rbtFind(rbconf, dropkey); Modified: trunk/lib/xymonrrd.c =================================================================== --- trunk/lib/xymonrrd.c 2011-05-14 13:58:07 UTC (rev 6688) +++ trunk/lib/xymonrrd.c 2011-05-14 13:59:38 UTC (rev 6689) @@ -152,7 +152,7 @@ xymonrrd_t *find_xymon_rrd(char *service, char *flags) { /* Lookup an entry in the xymonrrds table */ - RbtHandle handle; + RbtIterator handle; rrd_setup(); Modified: trunk/xymond/xymond.c =================================================================== --- trunk/xymond/xymond.c 2011-05-14 13:58:07 UTC (rev 6688) +++ trunk/xymond/xymond.c 2011-05-14 13:59:38 UTC (rev 6689) @@ -361,7 +361,7 @@ int i, clients; char bootuptxt[40]; char uptimetxt[40]; - RbtHandle ghandle; + RbtIterator ghandle; time_t uptime = (nowtimer - boottimer); time_t boottstamp = (now - uptime); char msgline[2048]; @@ -850,7 +850,7 @@ char *log_ghost(char *hostname, char *sender, char *msg) { - RbtHandle ghandle; + RbtIterator ghandle; ghostlist_t *gwalk; char *result = NULL; time_t nowtimer = gettimer(); @@ -922,7 +922,7 @@ void log_multisrc(xymond_log_t *log, char *newsender) { - RbtHandle ghandle; + RbtIterator ghandle; multisrclist_t *gwalk; char id[1024]; @@ -3936,7 +3936,7 @@ } else if (strncmp(msg->buf, "ghostlist", 9) == 0) { if (oksender(wwwsenders, NULL, msg->addr.sin_addr, msg->buf)) { - RbtHandle ghandle; + RbtIterator ghandle; ghostlist_t *gwalk; strbuffer_t *resp; char msgline[1024]; @@ -3961,7 +3961,7 @@ else if (strncmp(msg->buf, "multisrclist", 12) == 0) { if (oksender(wwwsenders, NULL, msg->addr.sin_addr, msg->buf)) { - RbtHandle mhandle; + RbtIterator mhandle; multisrclist_t *mwalk; strbuffer_t *resp; char msgline[1024]; Modified: trunk/xymond/xymond_rrd.c =================================================================== --- trunk/xymond/xymond_rrd.c 2011-05-14 13:58:07 UTC (rev 6688) +++ trunk/xymond/xymond_rrd.c 2011-05-14 13:59:38 UTC (rev 6689) @@ -165,7 +165,7 @@ char **get_rrd_definition(char *key, int *count) { - RbtHandle handle; + RbtIterator handle; handle = rbtFind(rrddeftree, key); if (handle == rbtEnd(rrddeftree)) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <st...@us...> - 2011-06-21 10:58:05
|
Revision: 6697 http://xymon.svn.sourceforge.net/xymon/?rev=6697&view=rev Author: storner Date: 2011-06-21 10:57:59 +0000 (Tue, 21 Jun 2011) Log Message: ----------- Webpages: Add new HOSTPOPUP setting to control what values from hosts.cfg are displayed as a "comment" to the hostname (either in pop-up's or next to the hostname). Modified Paths: -------------- trunk/common/xymonserver.cfg.5 trunk/lib/environ.c trunk/lib/htmllog.c Modified: trunk/common/xymonserver.cfg.5 =================================================================== --- trunk/common/xymonserver.cfg.5 2011-06-21 10:49:52 UTC (rev 6696) +++ trunk/common/xymonserver.cfg.5 2011-06-21 10:57:59 UTC (rev 6697) @@ -130,7 +130,21 @@ .IP XYMONBODYMENUCSS URL for the Xymon menu CSS file. Default: "$XYMONMENUSKIN/xymonmenu.css" +.IP HOSTPOPUP +Determines what is used as the host comment on the webpages. The comment +by default appears as a pop-up when the mouse hovers over the hostname, +and is also shown on the "info" status page. This setting must be one or +more of the letters "C" (COMMENT), "D" (DESCRIPTION) or "I" (IP-address). +Including "C" uses the COMMENT setting for the host, including "D" uses +the DESCR setting for the host, and "I" uses the IP-address of the host. +If more than one of these is set, then COMMENT takes precedence over +DESCR which again has precence over IP. +Note that DESCR and IP only appear in pop-up windows (if enabled), +whereas the COMMENT is always used - if pop-up's have been disabled, then +the COMMENT value is displayed next to the hostname on the webpages. +Default: CDI + .SH DIRECTORIES .IP XYMONSERVERROOT Modified: trunk/lib/environ.c =================================================================== --- trunk/lib/environ.c 2011-06-21 10:49:52 UTC (rev 6696) +++ trunk/lib/environ.c 2011-06-21 10:57:59 UTC (rev 6697) @@ -142,6 +142,7 @@ { "XYMONBODYHEADER", "file:$XYMONHOME/etc/xymonmenu.cfg" }, { "XYMONBODYFOOTER", "" }, { "XYMONALLOKTEXT", "<FONT SIZE=+2 FACE=\"Arial, Helvetica\"><BR><BR><I>All Monitored Systems OK</I></FONT><BR><BR>" }, + { "HOSTPOPUP", "CDI" }, { NULL, NULL } }; Modified: trunk/lib/htmllog.c =================================================================== --- trunk/lib/htmllog.c 2011-06-21 10:49:52 UTC (rev 6696) +++ trunk/lib/htmllog.c 2011-06-21 10:57:59 UTC (rev 6697) @@ -35,14 +35,47 @@ static char *documentationurl = NULL; static char *doctarget = NULL; +#define HOSTPOPUP_COMMENT 1 +#define HOSTPOPUP_DESCR 2 +#define HOSTPOPUP_IP 4 + +static int hostpopup = (HOSTPOPUP_COMMENT | HOSTPOPUP_DESCR | HOSTPOPUP_IP); + enum histbutton_t histlocation = HIST_BOTTOM; +static void hostpopup_setup(void) +{ + static int setup_done = 0; + char *val, *p; + + if (setup_done) return; + + val = xgetenv("HOSTPOPUP"); + if (val) { + /* Clear the setting, since there is an explicit value for it */ + hostpopup = 0; + + for (p = val; (*p); p++) { + switch (*p) { + case 'C': case 'c': hostpopup = (hostpopup | HOSTPOPUP_COMMENT); break; + case 'D': case 'd': hostpopup = (hostpopup | HOSTPOPUP_DESCR); break; + case 'I': case 'i': hostpopup = (hostpopup | HOSTPOPUP_IP); break; + default: break; + } + } + } + + setup_done = 1; +} + static void hostsvc_setup(void) { static int setup_done = 0; + char *dac; if (setup_done) return; + hostpopup_setup(); getenv_default("NONHISTS", "info,trends,graphs", NULL); getenv_default("CGIBINURL", "/cgi-bin", &cgibinurl); getenv_default("XYMONPAGEACKFONT", "COLOR=\"#33ebf4\" SIZE=-1\"", &ackfont); @@ -497,14 +530,19 @@ if (result) xfree(result); + hostpopup_setup(); + /* For summary "hosts", we have no hinfo record. */ if (!host) return hostname; hname = xmh_item(host, XMH_HOSTNAME); disp = xmh_item(host, XMH_DISPLAYNAME); - cmt = xmh_item(host, XMH_COMMENT); if (!cmt) cmt = xmh_item(host, XMH_DESCRIPTION); - if (!cmt && usetooltip) cmt = xmh_item(host, XMH_IP); + cmt = NULL; + if (!cmt && (hostpopup & HOSTPOPUP_COMMENT)) cmt = xmh_item(host, XMH_COMMENT); + if (!cmt && usetooltip && (hostpopup & HOSTPOPUP_DESCR)) cmt = xmh_item(host, XMH_DESCRIPTION); + if (!cmt && usetooltip && (hostpopup & HOSTPOPUP_IP)) cmt = xmh_item(host, XMH_IP); + if (disp == NULL) disp = hname; if (cmt) { @@ -514,8 +552,8 @@ sprintf(result, "<span title=\"%s\">%s</span>", cmt, disp); } else { - result = (char *)malloc(strlen(disp) + strlen(cmt) + 4); - sprintf(result, "%s (%s)", disp, cmt); + result = (char *)malloc(strlen(disp) + strlen(cmt) + 4); + sprintf(result, "%s (%s)", disp, cmt); } return result; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <st...@us...> - 2011-06-21 21:23:36
|
Revision: 6699 http://xymon.svn.sourceforge.net/xymon/?rev=6699&view=rev Author: storner Date: 2011-06-21 21:23:29 +0000 (Tue, 21 Jun 2011) Log Message: ----------- xymond + library: Switch to GNU libredblack library instead of the rbt implementation, to fix broken handling of node-deletions affecting cookies and host renaming. Modified Paths: -------------- trunk/build/Makefile.rules trunk/lib/Makefile trunk/xymond/Makefile trunk/xymond/xymond.c Added Paths: ----------- trunk/lib/libredblack-1.3.tar.gz Modified: trunk/build/Makefile.rules =================================================================== --- trunk/build/Makefile.rules 2011-06-21 13:31:55 UTC (rev 6698) +++ trunk/build/Makefile.rules 2011-06-21 21:23:29 UTC (rev 6699) @@ -126,11 +126,13 @@ ##################### distclean: allclean rm -f Makefile + rm -rf lib/libredblack rm -rf xymonnet/c-ares rm -rf debbuild rpmbuild allclean: clean (cd xymonnet/c-ares && $(MAKE) clean) || true + (cd lib/libredblack && $(MAKE) clean) || true clean: $(MAKE) -C build clean Modified: trunk/lib/Makefile =================================================================== --- trunk/lib/Makefile 2011-06-21 13:31:55 UTC (rev 6698) +++ trunk/lib/Makefile 2011-06-21 21:23:29 UTC (rev 6699) @@ -11,14 +11,14 @@ CFLAGS += -I. -I../include -all: test-endianness libxymon.a xymonclient.a loadhosts stackio availability md5 sha1 rmd160 locator +all: test-endianness libxymon.a libredblack.a redblack.h xymonclient.a loadhosts stackio availability md5 sha1 rmd160 locator client: test-endianness xymonclient.a test-endianness: test-endianness.c $(CC) $(CFLAGS) -o $@ $< -libxymon.a: $(XYMONLIBOBJS) +libxymon.a: redblack.h $(XYMONLIBOBJS) ar cr libxymon.a $(XYMONLIBOBJS) ranlib libxymon.a || echo "" @@ -26,6 +26,24 @@ ar cr xymonclient.a $(CLIENTLIBOBJS) ranlib xymonclient.a || echo "" +libredblack.a: libredblack/.libs/libredblack.a + cp libredblack/.libs/libredblack.a . + +redblack.h: libredblack/.libs/libredblack.a + cp libredblack/redblack.h . + +libredblack/.libs/libredblack.a: libredblack/Makefile + (cd libredblack && $(MAKE)) + +libredblack/Makefile: libredblack/configure + (cd libredblack && CFLAGS="$(CFLAGS)" ./configure --disable-shared --without-rbgen) + +libredblack/configure: libredblack-1.3.tar.gz + gzip -dc $< | tar xf - + mv libredblack-1.3 libredblack + # Must touch "configure", or it will trigger a rebuild because it is older than the tar.gz file. + touch libredblack/configure + loadhosts.o: loadhosts.c loadhosts_file.c $(CC) $(CFLAGS) -c -o $@ loadhosts.c @@ -84,5 +102,8 @@ $(CC) $(CFLAGS) -DSTANDALONE -o $@ locator.c ./libxymon.a $(NETLIBS) $(LIBRTDEF) clean: - rm -f *.o *.a *~ loadhosts stackio availability test-endianness md5 sha1 rmd160 locator + rm -f *.o *.a redblack.h *~ loadhosts stackio availability test-endianness md5 sha1 rmd160 locator +distclean: clean + rm -rf libredblack + Added: trunk/lib/libredblack-1.3.tar.gz =================================================================== (Binary files differ) Property changes on: trunk/lib/libredblack-1.3.tar.gz ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Modified: trunk/xymond/Makefile =================================================================== --- trunk/xymond/Makefile 2011-06-21 13:31:55 UTC (rev 6698) +++ trunk/xymond/Makefile 2011-06-21 21:23:29 UTC (rev 6699) @@ -1,7 +1,7 @@ PROGRAMS = xymon.sh xymond xymond_channel xymond_locator xymond_filestore xymond_history xymond_alert xymond_rrd xymond_sample xymond_client xymond_hostdata xymond_capture xymonfetch xymon-mailack trimhistory combostatus xymonreports.sh moverrd.sh convertnk rrdcachectl CLIENTPROGRAMS = ../client/xymond_client -LIBOBJS = ../lib/libxymon.a +LIBOBJS = ../lib/libxymon.a ../lib/libredblack.a XYMONDOBJS = xymond.o xymond_buffer.o xymond_ipc.o CHANNELOBJS = xymond_channel.o xymond_buffer.o xymond_ipc.o Modified: trunk/xymond/xymond.c =================================================================== --- trunk/xymond/xymond.c 2011-06-21 13:31:55 UTC (rev 6698) +++ trunk/xymond/xymond.c 2011-06-21 21:23:29 UTC (rev 6699) @@ -109,6 +109,11 @@ struct modifier_t *next; } modifier_t; +typedef struct cookie_t { + char *id; + void *log; +} cookie_t; + /* This holds all information about a single status */ typedef struct xymond_log_t { struct xymond_hostlist_t *host; @@ -126,7 +131,7 @@ unsigned char *message; int msgsz; unsigned char *dismsg, *ackmsg; - char *cookie; + struct cookie_t *cookie; time_t cookieexpires; struct xymond_meta_t *metas; struct modifier_t *modifiers; @@ -159,11 +164,11 @@ unsigned char *fdata; } filecache_t; -RbtHandle rbhosts; /* The hosts we have reports from */ -RbtHandle rbtests; /* The tests (columns) we have seen */ -RbtHandle rborigins; /* The origins we have seen */ -RbtHandle rbcookies; /* The cookies we use */ -RbtHandle rbfilecache; +struct rbtree *rbhosts; /* The hosts we have reports from */ +struct rbtree *rbtests; /* The tests (columns) we have seen */ +struct rbtree *rborigins; /* The origins we have seen */ +struct rbtree *rbcookies; /* The cookies we use */ +struct rbtree *rbfilecache; sender_t *maintsenders = NULL; sender_t *statussenders = NULL; @@ -221,14 +226,14 @@ char *sender; time_t tstamp, matchtime; } ghostlist_t; -RbtHandle rbghosts; +struct rbtree *rbghosts; typedef struct multisrclist_t { char *id; char *senders[2]; time_t tstamp; } multisrclist_t; -RbtHandle rbmultisrc; +struct rbtree *rbmultisrc; enum ghosthandling_t ghosthandling = GH_LOG; @@ -361,10 +366,12 @@ int i, clients; char bootuptxt[40]; char uptimetxt[40]; - RbtIterator ghandle; time_t uptime = (nowtimer - boottimer); time_t boottstamp = (now - uptime); char msgline[2048]; + RBLIST *treelist; + ghostlist_t *gwalk; + multisrclist_t *mwalk; dbgprintf("-> generate_stats\n"); @@ -430,27 +437,27 @@ sprintf(msgline, "clichg channel messages: %10ld (%d readers)\n", clichgchn->msgcount, clients); addtobuffer(statsbuf, msgline); - ghandle = rbtBegin(rbghosts); - if (ghandle != rbtEnd(rbghosts)) addtobuffer(statsbuf, "\n\nGhost reports:\n"); - for (; (ghandle != rbtEnd(rbghosts)); ghandle = rbtNext(rbghosts, ghandle)) { - ghostlist_t *gwalk = (ghostlist_t *)gettreeitem(rbghosts, ghandle); - + treelist = rbopenlist(rbghosts); + gwalk = rbreadlist(treelist); + if (gwalk) addtobuffer(statsbuf, "\n\nGhost reports:\n"); + for (; (gwalk); gwalk = rbreadlist(treelist)) { /* Skip records older than 10 minutes */ if (gwalk->tstamp < (nowtimer - 600)) continue; sprintf(msgline, " %-15s reported host %s\n", gwalk->sender, gwalk->name); addtobuffer(statsbuf, msgline); } + rbcloselist(treelist); - ghandle = rbtBegin(rbmultisrc); - if (ghandle != rbtEnd(rbmultisrc)) addtobuffer(statsbuf, "\n\nMulti-source statuses\n"); - for (; (ghandle != rbtEnd(rbmultisrc)); ghandle = rbtNext(rbmultisrc, ghandle)) { - multisrclist_t *mwalk = (multisrclist_t *)gettreeitem(rbmultisrc, ghandle); - + treelist = rbopenlist(rbmultisrc); + mwalk = rbreadlist(treelist); + if (mwalk) addtobuffer(statsbuf, "\n\nMulti-source statuses\n"); + for (; (mwalk); mwalk = rbreadlist(treelist)) { /* Skip records older than 10 minutes */ if (mwalk->tstamp < (nowtimer - 600)) continue; sprintf(msgline, " %-25s reported by %s and %s\n", mwalk->id, mwalk->senders[0], mwalk->senders[1]); addtobuffer(statsbuf, msgline); } + rbcloselist(treelist); if (errbuf) { addtobuffer(statsbuf, "\n\nLatest error messages:\n"); @@ -497,28 +504,28 @@ xymond_hostlist_t *create_hostlist_t(char *hostname, char *ip) { - xymond_hostlist_t *hitem; + xymond_hostlist_t *hitem, *res; hitem = (xymond_hostlist_t *) calloc(1, sizeof(xymond_hostlist_t)); hitem->hostname = strdup(hostname); strcpy(hitem->ip, ip); if (strcmp(hostname, "summary") == 0) hitem->hosttype = H_SUMMARY; else hitem->hosttype = H_NORMAL; - rbtInsert(rbhosts, hitem->hostname, hitem); + res = rbsearch((void *)hitem, rbhosts); - return hitem; + return res; } testinfo_t *create_testinfo(char *name) { - testinfo_t *newrec; + testinfo_t *newrec, *res; newrec = (testinfo_t *)calloc(1, sizeof(testinfo_t)); newrec->name = strdup(name); newrec->clientsave = clientsavedisk; - rbtInsert(rbtests, newrec->name, newrec); + res = rbsearch((void *)newrec, rbtests); - return newrec; + return res; } void posttochannel(xymond_channel_t *channel, char *channelmarker, @@ -752,7 +759,7 @@ sender, hostname, log->test->name, log->host->ip, (int) log->validtime, colnames[log->color], colnames[log->oldcolor], (int) log->lastchange[0], - pagepath, log->cookie, osname, classname, + pagepath, (log->cookie ? log->cookie->id : ""), osname, classname, (log->grouplist ? log->grouplist : "")); if (n < (bufsz-5)) { @@ -850,8 +857,7 @@ char *log_ghost(char *hostname, char *sender, char *msg) { - RbtIterator ghandle; - ghostlist_t *gwalk; + ghostlist_t *gwalk, gsrec; char *result = NULL; time_t nowtimer = gettimer(); @@ -865,8 +871,8 @@ if ((hostname == NULL) || (sender == NULL)) return NULL; - ghandle = rbtFind(rbghosts, hostname); - gwalk = (ghandle != rbtEnd(rbghosts)) ? (ghostlist_t *)gettreeitem(rbghosts, ghandle) : NULL; + gsrec.name = hostname; + gwalk = rbfind((void *)&gsrec, rbghosts); if ((gwalk == NULL) || ((gwalk->matchtime + 600) < nowtimer)) { int found = 0; @@ -900,7 +906,7 @@ gwalk->name = strdup(hostname); gwalk->sender = strdup(sender); gwalk->tstamp = gwalk->matchtime = nowtimer; - rbtInsert(rbghosts, gwalk->name, gwalk); + rbsearch((void *)gwalk, rbghosts); } else { if (gwalk->sender) xfree(gwalk->sender); @@ -922,24 +928,23 @@ void log_multisrc(xymond_log_t *log, char *newsender) { - RbtIterator ghandle; - multisrclist_t *gwalk; + multisrclist_t *gwalk, gsrec; char id[1024]; dbgprintf("-> log_multisrc\n"); snprintf(id, sizeof(id), "%s:%s", log->host->hostname, log->test->name); - ghandle = rbtFind(rbmultisrc, id); - if (ghandle == rbtEnd(rbghosts)) { + gsrec.id = id; + gwalk = rbfind((void *)&gsrec, rbmultisrc); + if (gwalk == NULL) { gwalk = (multisrclist_t *)calloc(1, sizeof(multisrclist_t)); gwalk->id = strdup(id); gwalk->senders[0] = strdup(log->sender); gwalk->senders[1] = strdup(newsender); gwalk->tstamp = gettimer(); - rbtInsert(rbmultisrc, gwalk->id, gwalk); + rbsearch((void *)gwalk, rbmultisrc); } else { - gwalk = (multisrclist_t *)gettreeitem(rbghosts, ghandle); xfree(gwalk->senders[0]); gwalk->senders[0] = strdup(log->sender); xfree(gwalk->senders[1]); gwalk->senders[1] = strdup(newsender); gwalk->tstamp = gettimer(); @@ -950,24 +955,24 @@ xymond_log_t *find_log(char *hostname, char *testname, char *origin, xymond_hostlist_t **host) { - RbtIterator hosthandle, testhandle, originhandle; - xymond_hostlist_t *hwalk; + xymond_hostlist_t *hwalk, hsrec; char *owalk = NULL; - testinfo_t *twalk; + testinfo_t *twalk, tsrec; xymond_log_t *lwalk; *host = NULL; if ((hostname == NULL) || (testname == NULL)) return NULL; - hosthandle = rbtFind(rbhosts, hostname); - if (hosthandle != rbtEnd(rbhosts)) *host = hwalk = gettreeitem(rbhosts, hosthandle); else return NULL; + hsrec.hostname = hostname; + hwalk = rbfind((void *)&hsrec, rbhosts); + if (!hwalk) return NULL; else *host = hwalk; - testhandle = rbtFind(rbtests, testname); - if (testhandle != rbtEnd(rbtests)) twalk = gettreeitem(rbtests, testhandle); else return NULL; + tsrec.name = testname; + twalk = rbfind((void *)&tsrec, rbtests); + if (!twalk) return NULL; if (origin) { - originhandle = rbtFind(rborigins, origin); - if (originhandle != rbtEnd(rborigins)) owalk = gettreeitem(rborigins, originhandle); + owalk = rbfind((void *)origin, rborigins); } for (lwalk = hwalk->logs; (lwalk && ((lwalk->test != twalk) || (lwalk->origin != owalk))); lwalk = lwalk->next); @@ -988,9 +993,8 @@ char *firstline, *p; char *hosttest, *hostname, *testname, *colstr, *grp; char hostip[IP_ADDR_STRLEN]; - RbtIterator hosthandle, testhandle, originhandle; - xymond_hostlist_t *hwalk = NULL; - testinfo_t *twalk = NULL; + xymond_hostlist_t *hwalk = NULL, hsrec; + testinfo_t *twalk = NULL, tsrec; char *owalk = NULL; xymond_log_t *lwalk = NULL; @@ -1056,11 +1060,10 @@ hostname = knownname; } - hosthandle = rbtFind(rbhosts, hostname); - if (hosthandle == rbtEnd(rbhosts)) hwalk = NULL; - else hwalk = gettreeitem(rbhosts, hosthandle); + hsrec.hostname = hostname; + hwalk = rbfind((void *)&hsrec, rbhosts); - if (createhost && (hosthandle == rbtEnd(rbhosts))) { + if (createhost && !hwalk) { hwalk = create_hostlist_t(hostname, hostip); hostcount++; } @@ -1071,8 +1074,8 @@ return; } - testhandle = rbtFind(rbtests, testname); - if (testhandle != rbtEnd(rbtests)) twalk = gettreeitem(rbtests, testhandle); + tsrec.name = testname; + twalk = rbfind((void *)&tsrec, rbtests); if (createlog && (twalk == NULL)) twalk = create_testinfo(testname); } else { @@ -1080,11 +1083,10 @@ } if (origin) { - originhandle = rbtFind(rborigins, origin); - if (originhandle != rbtEnd(rborigins)) owalk = gettreeitem(rborigins, originhandle); + owalk = rbfind((void *)origin, rborigins); if (createlog && (owalk == NULL)) { owalk = strdup(origin); - rbtInsert(rborigins, owalk, owalk); + rbsearch((void *)owalk, rborigins); } } @@ -1138,14 +1140,15 @@ /* * Find a cookie we have issued. */ + cookie_t *cwalk, csrec; xymond_log_t *result = NULL; - RbtIterator cookiehandle; dbgprintf("-> find_cookie\n"); - cookiehandle = rbtFind(rbcookies, cookie); - if (cookiehandle != rbtEnd(rbcookies)) { - result = gettreeitem(rbcookies, cookiehandle); + csrec.id = cookie; + cwalk = rbfind((void *)&csrec, rbcookies); + if (cwalk) { + result = (xymond_log_t *)cwalk->log; if (result->cookieexpires <= getcurrenttime(NULL)) result = NULL; } @@ -1156,16 +1159,18 @@ void clear_cookie(xymond_log_t *log) { - RbtIterator cookiehandle; + cookie_t csrec, *oldrec; if (!log->cookie) return; - cookiehandle = rbtFind(rbcookies, log->cookie); + csrec.id = log->cookie; + oldrec = rbdelete((void *)&csrec, rbcookies); + if (oldrec) { + xfree(oldrec->id); + xfree(oldrec); + } + log->cookie = NULL; log->cookieexpires = 0; - - if (cookiehandle == rbtEnd(rbcookies)) return; - - rbtErase(rbcookies, cookiehandle); } @@ -1448,6 +1453,7 @@ if (log->cookieexpires < now) { int newcookie; char scookie[10]; + cookie_t *newrec; clear_cookie(log); @@ -1458,8 +1464,10 @@ sprintf(scookie, "%d", newcookie); } while (find_cookie(scookie)); - log->cookie = strdup(scookie); - rbtInsert(rbcookies, log->cookie, log); + newrec = (cookie_t *)calloc(1, sizeof(cookie_t)); + newrec->id = strdup(scookie); + newrec->log = log; + log->cookie = rbsearch((void *)newrec, rbcookies); /* * This is fundamentally flawed. The cookie should be generated by @@ -1713,9 +1721,8 @@ char *hname = NULL, *tname = NULL; time_t expires = 0; int alltests = 0; - RbtIterator hosthandle, testhandle; - xymond_hostlist_t *hwalk = NULL; - testinfo_t *twalk = NULL; + xymond_hostlist_t *hwalk = NULL, hsrec; + testinfo_t *twalk = NULL, tsrec; xymond_log_t *log; char *p; char hostip[IP_ADDR_STRLEN]; @@ -1774,22 +1781,22 @@ hname = knownhost(hosttest, hostip, ghosthandling); if (hname == NULL) goto done; - hosthandle = rbtFind(rbhosts, hname); - if (hosthandle == rbtEnd(rbhosts)) { + hsrec.hostname = hname; + hwalk = rbfind((void *)&hsrec, rbhosts); + if (!hwalk) { /* Unknown host */ goto done; } - else hwalk = gettreeitem(rbhosts, hosthandle); if (!oksender(maintsenders, hwalk->ip, msg->addr.sin_addr, msg->buf)) goto done; if (tname) { - testhandle = rbtFind(rbtests, tname); - if (testhandle == rbtEnd(rbtests)) { + tsrec.name = tname; + twalk = rbfind((void *)&tsrec, rbtests); + if (!twalk) { /* Unknown test */ goto done; } - else twalk = gettreeitem(rbtests, testhandle); } if (enabled) { @@ -1990,7 +1997,6 @@ { char *chnbuf, *theclass; int msglen, buflen = 0; - RbtIterator hosthandle; clientmsg_list_t *cwalk, *chead, *ctail, *czombie; dbgprintf("->handle_client\n"); @@ -2003,11 +2009,11 @@ buflen += 6; if (clientsavemem) { - hosthandle = rbtFind(rbhosts, hostname); - if (hosthandle != rbtEnd(rbhosts)) { - xymond_hostlist_t *hwalk; - hwalk = gettreeitem(rbhosts, hosthandle); + xymond_hostlist_t *hwalk, hsrec; + hsrec.hostname = hostname; + hwalk = rbfind((void *)&hsrec, rbhosts); + if (hwalk) { for (cwalk = hwalk->clientmsgs; (cwalk && strcmp(cwalk->collectorid, collectorid)); cwalk = cwalk->next) ; if (cwalk) { if (strlen(cwalk->msg) >= msglen) @@ -2155,9 +2161,8 @@ void handle_dropnrename(enum droprencmd_t cmd, char *sender, char *hostname, char *n1, char *n2) { char hostip[IP_ADDR_STRLEN]; - RbtIterator hosthandle, testhandle; - xymond_hostlist_t *hwalk; - testinfo_t *twalk, *newt; + xymond_hostlist_t *hwalk, hsrec; + testinfo_t *twalk, *newt, tsrec; xymond_log_t *lwalk; char *marker = NULL; char *canonhostname; @@ -2223,15 +2228,15 @@ canonhostname = knownhost(hostname, hostip, ghosthandling); if (canonhostname) hostname = canonhostname; - hosthandle = rbtFind(rbhosts, hostname); - if (hosthandle == rbtEnd(rbhosts)) goto done; - else hwalk = gettreeitem(rbhosts, hosthandle); + hsrec.hostname = hostname; + hwalk = rbfind((void *)&hsrec, rbhosts); + if (!hwalk) goto done; switch (cmd) { case CMD_DROPTEST: - testhandle = rbtFind(rbtests, n1); - if (testhandle == rbtEnd(rbtests)) goto done; - twalk = gettreeitem(rbtests, testhandle); + tsrec.name = n1; + twalk = rbfind((void *)&tsrec, rbtests); + if (!twalk) goto done; for (lwalk = hwalk->logs; (lwalk && (lwalk->test != twalk)); lwalk = lwalk->next) ; if (lwalk == NULL) goto done; @@ -2250,7 +2255,7 @@ case CMD_DROPHOST: case CMD_DROPSTATE: /* Unlink the hostlist entry */ - rbtErase(rbhosts, hosthandle); + rbdelete((void *)hwalk, rbhosts); hostcount--; /* Loop through the host logs and free them */ @@ -2276,7 +2281,7 @@ break; case CMD_RENAMEHOST: - rbtErase(rbhosts, hosthandle); + rbdelete((void *)hwalk, rbhosts); if (strlen(hwalk->hostname) <= strlen(n1)) { strcpy(hwalk->hostname, n1); } @@ -2284,26 +2289,24 @@ xfree(hwalk->hostname); hwalk->hostname = strdup(n1); } - rbtInsert(rbhosts, hwalk->hostname, hwalk); + hwalk = rbsearch((void *)hwalk, rbhosts); break; case CMD_RENAMETEST: - testhandle = rbtFind(rbtests, n1); - if (testhandle == rbtEnd(rbtests)) goto done; - twalk = gettreeitem(rbtests, testhandle); + tsrec.name = n1; + twalk = rbfind((void *)&tsrec, rbtests); + if (!twalk) goto done; for (lwalk = hwalk->logs; (lwalk && (lwalk->test != twalk)); lwalk = lwalk->next) ; if (lwalk == NULL) goto done; if (lwalk == hwalk->pinglog) hwalk->pinglog = NULL; - testhandle = rbtFind(rbtests, n2); - if (testhandle == rbtEnd(rbtests)) { + tsrec.name = n2; + newt = rbfind((void *)&tsrec, rbtests); + if (!newt) { newt = create_testinfo(n2); } - else { - newt = gettreeitem(rbtests, testhandle); - } lwalk->test = newt; break; } @@ -2319,14 +2322,12 @@ unsigned char *get_filecache(char *fn, long *len) { - RbtIterator handle; - filecache_t *item; + filecache_t *item, srec; unsigned char *result; - handle = rbtFind(rbfilecache, fn); - if (handle == rbtEnd(rbfilecache)) return NULL; - - item = (filecache_t *)gettreeitem(rbfilecache, handle); + srec.fn = fn; + item = rbfind((void *)&srec, rbfilecache); + if (!item) return NULL; if (item->len < 0) return NULL; result = (unsigned char *)malloc(item->len); @@ -2339,20 +2340,19 @@ void add_filecache(char *fn, unsigned char *buf, off_t buflen) { - RbtIterator handle; - filecache_t *newitem; + filecache_t *newitem, srec; - handle = rbtFind(rbfilecache, fn); - if (handle == rbtEnd(rbfilecache)) { + srec.fn = fn; + newitem = rbfind((void *)&srec, rbfilecache); + if (!newitem) { newitem = (filecache_t *)malloc(sizeof(filecache_t)); newitem->fn = strdup(fn); newitem->len = buflen; newitem->fdata = (unsigned char *)malloc(buflen); memcpy(newitem->fdata, buf, buflen); - rbtInsert(rbfilecache, newitem->fn, newitem); + rbsearch((void *)newitem, rbfilecache); } else { - newitem = (filecache_t *)gettreeitem(rbfilecache, handle); if (newitem->fdata) xfree(newitem->fdata); newitem->len = buflen; newitem->fdata = (unsigned char *)malloc(buflen); @@ -2363,13 +2363,15 @@ void flush_filecache(void) { - RbtIterator handle; + RBLIST *flist; + filecache_t *item; - for (handle = rbtBegin(rbfilecache); (handle != rbtEnd(rbfilecache)); handle = rbtNext(rbfilecache, handle)) { - filecache_t *item = (filecache_t *)gettreeitem(rbfilecache, handle); + flist = rbopenlist(rbfilecache); + for (item = rbreadlist(flist); (item); item = rbreadlist(flist)) { if (item->fdata) xfree(item->fdata); item->len = -1; } + rbcloselist(flist); } @@ -2712,7 +2714,7 @@ case F_ACKTIME: bufp += sprintf(bufp, "%d", (int)lwalk->acktime); break; case F_DISABLETIME: bufp += sprintf(bufp, "%d", (int)lwalk->enabletime); break; case F_SENDER: bufp += sprintf(bufp, "%s", lwalk->sender); break; - case F_COOKIE: bufp += sprintf(bufp, "%s", lwalk->cookie); break; + case F_COOKIE: bufp += sprintf(bufp, "%s", (lwalk->cookie ? lwalk->cookie->id : "")); break; case F_LINE1: eoln = strchr(lwalk->message, '\n'); if (eoln) *eoln = '\0'; @@ -3284,7 +3286,7 @@ bufp += sprintf(bufp, " <Sender>%s</Sender>\n", log->sender); if (log->cookie) - bufp += sprintf(bufp, " <Cookie>%s</Cookie>\n", log->cookie); + bufp += sprintf(bufp, " <Cookie>%s</Cookie>\n", (log->cookie ? log->cookie->id : "")); else bufp += sprintf(bufp, " <Cookie>N/A</Cookie>\n"); @@ -3315,7 +3317,6 @@ * Request for a summmary of all known status logs * */ - RbtIterator hosthandle; xymond_hostlist_t *hwalk; xymond_log_t *lwalk, *firstlog; xymond_log_t infologrec, rrdlogrec; @@ -3328,6 +3329,7 @@ char *fields = NULL; int scolor = -1, acklevel = -1; static unsigned int lastboardsize = 0; + RBLIST *treelist; if (!oksender(wwwsenders, NULL, msg->addr.sin_addr, msg->buf)) goto done; @@ -3362,13 +3364,8 @@ infologrec.message = rrdlogrec.message = ""; infologrec.lastchange = rrdlogrec.lastchange = dummytimes; - for (hosthandle = rbtBegin(rbhosts); (hosthandle != rbtEnd(rbhosts)); hosthandle = rbtNext(rbhosts, hosthandle)) { - hwalk = gettreeitem(rbhosts, hosthandle); - if (!hwalk) { - errprintf("host-tree has a record with no data\n"); - continue; - } - + treelist = rbopenlist(rbhosts); + for (hwalk = rbreadlist(treelist); (hwalk); hwalk = rbreadlist(treelist)) { /* If there is a hostname filter, drop the "summary" 'hosts' */ if (shost && (hwalk->hosttype != H_NORMAL)) continue; @@ -3410,6 +3407,7 @@ generate_outbuf(&buf, &bufp, &bufsz, hwalk, lwalk, acklevel); } } + rbcloselist(treelist); *bufp = '\0'; xfree(msg->buf); @@ -3426,7 +3424,6 @@ * Request for a summmary of all known status logs in XML format * */ - RbtIterator hosthandle; xymond_hostlist_t *hwalk; xymond_log_t *lwalk; char *buf, *bufp; @@ -3436,6 +3433,7 @@ char *fields = NULL; int scolor = -1, acklevel = -1; static unsigned int lastboardsize = 0; + RBLIST *treelist; if (!oksender(wwwsenders, NULL, msg->addr.sin_addr, msg->buf)) goto done; @@ -3457,13 +3455,8 @@ bufp += sprintf(bufp, "<?xml version='1.0' encoding='ISO-8859-1'?>\n"); bufp += sprintf(bufp, "<StatusBoard>\n"); - for (hosthandle = rbtBegin(rbhosts); (hosthandle != rbtEnd(rbhosts)); hosthandle = rbtNext(rbhosts, hosthandle)) { - hwalk = gettreeitem(rbhosts, hosthandle); - if (!hwalk) { - errprintf("host-tree has a record with no data\n"); - continue; - } - + treelist = rbopenlist(rbhosts); + for (hwalk = rbreadlist(treelist); (hwalk); hwalk = rbreadlist(treelist)) { /* If there is a hostname filter, drop the "summary" 'hosts' */ if (shost && (hwalk->hosttype != H_NORMAL)) continue; @@ -3513,7 +3506,7 @@ bufp += sprintf(bufp, " <Sender>%s</Sender>\n", lwalk->sender); if (lwalk->cookie) - bufp += sprintf(bufp, " <Cookie>%s</Cookie>\n", lwalk->cookie); + bufp += sprintf(bufp, " <Cookie>%s</Cookie>\n", (lwalk->cookie ? lwalk->cookie->id : "")); else bufp += sprintf(bufp, " <Cookie>N/A</Cookie>\n"); @@ -3522,6 +3515,7 @@ if (eoln) *eoln = '\n'; } } + rbcloselist(treelist); bufp += sprintf(bufp, "</StatusBoard>\n"); xfree(msg->buf); @@ -3883,18 +3877,17 @@ } else if (strncmp(msg->buf, "clientlog ", 10) == 0) { char *hostname, *p; - RbtIterator hosthandle; + xymond_hostlist_t *hwalk, hsrec; + if (!oksender(wwwsenders, NULL, msg->addr.sin_addr, msg->buf)) goto done; p = msg->buf + strlen("clientlog"); p += strspn(p, "\t "); hostname = p; p += strcspn(p, "\t "); if (*p) { *p = '\0'; p++; } p += strspn(p, "\t "); - hosthandle = rbtFind(rbhosts, hostname); - if (hosthandle != rbtEnd(rbhosts)) { - xymond_hostlist_t *hwalk; - hwalk = gettreeitem(rbhosts, hosthandle); - + hsrec.hostname = hostname; + hwalk = rbfind((void *)&hsrec, rbhosts); + if (hwalk) { if (hwalk->clientmsgs) { char *sections = NULL; char *cmsg = totalclientmsg(hwalk->clientmsgs); @@ -3944,19 +3937,20 @@ } else if (strncmp(msg->buf, "ghostlist", 9) == 0) { if (oksender(wwwsenders, NULL, msg->addr.sin_addr, msg->buf)) { - RbtIterator ghandle; ghostlist_t *gwalk; strbuffer_t *resp; char msgline[1024]; + RBLIST *treelist; resp = newstrbuffer(0); - for (ghandle = rbtBegin(rbghosts); (ghandle != rbtEnd(rbghosts)); ghandle = rbtNext(rbghosts, ghandle)) { - gwalk = (ghostlist_t *)gettreeitem(rbghosts, ghandle); + treelist = rbopenlist(rbghosts); + for (gwalk = rbreadlist(treelist); (gwalk); gwalk = rbreadlist(treelist)) { snprintf(msgline, sizeof(msgline), "%s|%s|%ld\n", gwalk->name, gwalk->sender, (long int)(gwalk->tstamp + timeroffset)); addtobuffer(resp, msgline); } + rbcloselist(treelist); msg->doingwhat = RESPONDING; xfree(msg->buf); @@ -3969,19 +3963,20 @@ else if (strncmp(msg->buf, "multisrclist", 12) == 0) { if (oksender(wwwsenders, NULL, msg->addr.sin_addr, msg->buf)) { - RbtIterator mhandle; multisrclist_t *mwalk; strbuffer_t *resp; char msgline[1024]; + RBLIST *treelist; resp = newstrbuffer(0); - for (mhandle = rbtBegin(rbmultisrc); (mhandle != rbtEnd(rbmultisrc)); mhandle = rbtNext(rbmultisrc, mhandle)) { - mwalk = (multisrclist_t *)gettreeitem(rbmultisrc, mhandle); + treelist = rbopenlist(rbmultisrc); + for (mwalk = rbreadlist(treelist); (mwalk); mwalk = rbreadlist(treelist)) { snprintf(msgline, sizeof(msgline), "%s|%s|%s|%ld\n", mwalk->id, mwalk->senders[0], mwalk->senders[1], (long int)(mwalk->tstamp + timeroffset)); addtobuffer(resp, msgline); } + rbcloselist(treelist); msg->doingwhat = RESPONDING; xfree(msg->buf); @@ -4013,13 +4008,13 @@ { char *tempfn; FILE *fd; - RbtIterator hosthandle; xymond_hostlist_t *hwalk; xymond_log_t *lwalk; time_t now = getcurrenttime(NULL); scheduletask_t *swalk; ackinfo_t *awalk; int iores = 0; + RBLIST *treelist; if (checkpointfn == NULL) return; @@ -4033,11 +4028,10 @@ return; } - for (hosthandle = rbtBegin(rbhosts); ((hosthandle != rbtEnd(rbhosts)) && (iores >= 0)); hosthandle = rbtNext(rbhosts, hosthandle)) { + treelist = rbopenlist(rbhosts); + for (hwalk = rbreadlist(treelist); (hwalk); hwalk = rbreadlist(treelist)) { char *msgstr; - hwalk = gettreeitem(rbhosts, hosthandle); - for (lwalk = hwalk->logs; (lwalk); lwalk = lwalk->next) { if (lwalk->dismsg && (lwalk->enabletime < now) && (lwalk->enabletime != DISABLED_UNTIL_OK)) { xfree(lwalk->dismsg); @@ -4057,7 +4051,7 @@ colnames[lwalk->oldcolor], (int)lwalk->logtime, (int) lwalk->lastchange[0], (int) lwalk->validtime, (int) lwalk->enabletime, (int) lwalk->acktime, - lwalk->cookie, (int) lwalk->cookieexpires, + (lwalk->cookie ? lwalk->cookie->id : ""), (int) lwalk->cookieexpires, nlencode(lwalk->message)); if (lwalk->dismsg) msgstr = nlencode(lwalk->dismsg); else msgstr = ""; if (iores >= 0) iores = fprintf(fd, "|%s", msgstr); @@ -4073,6 +4067,7 @@ } } } + rbcloselist(treelist); for (swalk = schedulehead; (swalk && (iores >= 0)); swalk = swalk->next) { iores = fprintf(fd, "@@XYMONDCHK-V1|.task.|%d|%d|%s|%s\n", @@ -4108,9 +4103,8 @@ char *item; int i, err; char hostip[IP_ADDR_STRLEN]; - RbtIterator hosthandle, testhandle, originhandle; - xymond_hostlist_t *hitem = NULL; - testinfo_t *t = NULL; + xymond_hostlist_t *hitem = NULL, hsrec; + testinfo_t *t = NULL, tsrec; char *origin = NULL; xymond_log_t *ltail = NULL; char *originname, *hostname, *testname, *sender, *testflags, *statusmsg, *disablemsg, *ackmsg, *cookie; @@ -4176,12 +4170,12 @@ case 0: break; case 1: break; case 2: - hosthandle = rbtFind(rbhosts, item); - hitem = gettreeitem(rbhosts, hosthandle); + hsrec.hostname = item; + hitem = rbfind((void *)&hsrec, rbhosts); break; case 3: - testhandle = rbtFind(rbtests, item); - t = (testhandle == rbtEnd(rbtests)) ? NULL : gettreeitem(rbtests, testhandle); + tsrec.name = item; + t = rbfind((void *)&tsrec, rbtests); break; case 4: newack->received = atoi(item); break; case 5: newack->validuntil = atoi(item); break; @@ -4264,28 +4258,21 @@ dbgprintf("Status: Host=%s, test=%s\n", hostname, testname); count++; - hosthandle = rbtFind(rbhosts, hostname); - if (hosthandle == rbtEnd(rbhosts)) { + hsrec.hostname = hostname; + hitem = rbfind((void *)&hsrec, rbhosts); + if (!hitem) { /* New host */ hitem = create_hostlist_t(hostname, hostip); hostcount++; } - else { - hitem = gettreeitem(rbhosts, hosthandle); - } - testhandle = rbtFind(rbtests, testname); - if (testhandle == rbtEnd(rbtests)) { + tsrec.name = testname; + t = rbfind((void *)&tsrec, rbtests); + if (!t) { t = create_testinfo(testname); } - else t = gettreeitem(rbtests, testhandle); - originhandle = rbtFind(rborigins, originname); - if (originhandle == rbtEnd(rborigins)) { - origin = strdup(originname); - rbtInsert(rborigins, origin, origin); - } - else origin = gettreeitem(rborigins, originhandle); + origin = rbsearch((void *)originname, rborigins); if (hitem->logs == NULL) { ltail = hitem->logs = (xymond_log_t *) calloc(1, sizeof(xymond_log_t)); @@ -4332,8 +4319,14 @@ } else ltail->ackmsg = NULL; - ltail->cookie = strdup(cookie); - if (cookie > 0) rbtInsert(rbcookies, ltail->cookie, ltail); + if (cookie && (strlen(cookie) > 0)) { + cookie_t *newrec; + + newrec = (cookie_t *)calloc(1, sizeof(cookie_t)); + newrec->id = strdup(cookie); + newrec->log = ltail; + ltail->cookie = rbsearch((void *)newrec, rbcookies); + } ltail->cookieexpires = cookieexpires; ltail->metas = NULL; ltail->acklist = NULL; @@ -4350,15 +4343,15 @@ void check_purple_status(void) { - RbtIterator hosthandle; xymond_hostlist_t *hwalk; xymond_log_t *lwalk; + RBLIST *treelist; time_t now = getcurrenttime(NULL); dbgprintf("-> check_purple_status\n"); - for (hosthandle = rbtBegin(rbhosts); (hosthandle != rbtEnd(rbhosts)); hosthandle = rbtNext(rbhosts, hosthandle)) { - hwalk = gettreeitem(rbhosts, hosthandle); + treelist = rbopenlist(rbhosts); + for (hwalk = rbreadlist(treelist); (hwalk); hwalk = rbreadlist(treelist)) { lwalk = hwalk->logs; while (lwalk) { if (lwalk->validtime < now) { @@ -4420,6 +4413,8 @@ } } } + rbcloselist(treelist); + dbgprintf("<- check_purple_status\n"); } @@ -4449,7 +4444,62 @@ } } +int host_compare(const void *r1, const void *r2, const void *c) +{ + xymond_hostlist_t *h1 = (xymond_hostlist_t *)r1; + xymond_hostlist_t *h2 = (xymond_hostlist_t *)r2; + return (strcasecmp(h1->hostname, h2->hostname)); +} + +int test_compare(const void *r1, const void *r2, const void *c) +{ + testinfo_t *t1 = (testinfo_t *)r1; + testinfo_t *t2 = (testinfo_t *)r2; + + return (strcasecmp(t1->name, t2->name)); +} + +int origin_compare(const void *r1, const void *r2, const void *c) +{ + char *o1 = (char *)r1; + char *o2 = (char *)r2; + + return (strcasecmp(o1, o2)); +} + +int cookie_compare(const void *r1, const void *r2, const void *c) +{ + cookie_t *c1 = (cookie_t *)r1; + cookie_t *c2 = (cookie_t *)r2; + + return (strcasecmp(c1->id, c2->id)); +} + +int filecache_compare(const void *r1, const void *r2, const void *c) +{ + filecache_t *f1 = (filecache_t *)r1; + filecache_t *f2 = (filecache_t *)r2; + + return (strcasecmp(f1->fn, f2->fn)); +} + +int ghost_compare(const void *r1, const void *r2, const void *c) +{ + ghostlist_t *g1 = (ghostlist_t *)r1; + ghostlist_t *g2 = (ghostlist_t *)r2; + + return (strcasecmp(g1->name, g2->name)); +} + +int multisrc_compare(const void *r1, const void *r2, const void *c) +{ + multisrclist_t *m1 = (multisrclist_t *)r1; + multisrclist_t *m2 = (multisrclist_t *)r2; + + return (strcasecmp(m1->id, m2->id)); +} + int main(int argc, char *argv[]) { conn_t *connhead = NULL, *conntail=NULL; @@ -4478,13 +4528,13 @@ boottimer = gettimer(); /* Create our trees */ - rbhosts = rbtNew(name_compare); - rbtests = rbtNew(name_compare); - rborigins = rbtNew(name_compare); - rbcookies = rbtNew(name_compare); - rbfilecache = rbtNew(name_compare); - rbghosts = rbtNew(name_compare); - rbmultisrc = rbtNew(name_compare); + rbhosts = rbinit(host_compare, NULL); + rbtests = rbinit(test_compare, NULL); + rborigins = rbinit(origin_compare, NULL); + rbcookies = rbinit(cookie_compare, NULL); + rbfilecache = rbinit(filecache_compare, NULL); + rbghosts = rbinit(ghost_compare, NULL); + rbmultisrc = rbinit(multisrc_compare, NULL); /* For wildcard notify's */ create_testinfo("*"); @@ -4877,32 +4927,28 @@ } if (reloadconfig && hostsfn) { - RbtIterator hosthandle; + RBLIST *treelist; + xymond_hostlist_t *hwalk; reloadconfig = 0; load_hostnames(hostsfn, NULL, get_fqdn()); /* Scan our list of hosts and weed out those we do not know about any more */ - hosthandle = rbtBegin(rbhosts); - while (hosthandle != rbtEnd(rbhosts)) { - xymond_hostlist_t *hwalk; - - hwalk = gettreeitem(rbhosts, hosthandle); - + treelist = rbopenlist(rbhosts); + hwalk = rbreadlist(treelist); + while (hwalk) { if (hwalk->hosttype == H_SUMMARY) { /* Leave the summaries as-is */ - hosthandle = rbtNext(rbhosts, hosthandle); } else if (hostinfo(hwalk->hostname) == NULL) { /* Remove all state info about this host. This will NOT remove files. */ handle_dropnrename(CMD_DROPSTATE, "xymond", hwalk->hostname, NULL, NULL); - - /* Must restart tree-walk after deleting node from the tree */ - hosthandle = rbtBegin(rbhosts); } else { - hosthandle = rbtNext(rbhosts, hosthandle); + /* Do nothing */ } + + hwalk = rbreadlist(treelist); } load_clientconfig(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <st...@us...> - 2011-06-27 15:06:08
|
Revision: 6701 http://xymon.svn.sourceforge.net/xymon/?rev=6701&view=rev Author: storner Date: 2011-06-27 15:06:02 +0000 (Mon, 27 Jun 2011) Log Message: ----------- Makefile fix for libredblack inclusion Modified Paths: -------------- trunk/include/libxymon.h trunk/lib/Makefile Modified: trunk/include/libxymon.h =================================================================== --- trunk/include/libxymon.h 2011-06-25 11:38:18 UTC (rev 6700) +++ trunk/include/libxymon.h 2011-06-27 15:06:02 UTC (rev 6701) @@ -87,6 +87,7 @@ #include "../lib/netservices.h" #include "../lib/rbtr.h" #include "../lib/readmib.h" +#include "../lib/redblack.h" #include "../lib/rmd160c.h" #include "../lib/sendmsg.h" #include "../lib/sha1.h" Modified: trunk/lib/Makefile =================================================================== --- trunk/lib/Makefile 2011-06-25 11:38:18 UTC (rev 6700) +++ trunk/lib/Makefile 2011-06-27 15:06:02 UTC (rev 6701) @@ -30,8 +30,17 @@ cp libredblack/.libs/libredblack.a . redblack.h: libredblack/.libs/libredblack.a - cp libredblack/redblack.h . +# The redblack.h header-file declares all data returned from the lookup-functions as "const". +# Which doesn't make sense, since it points to data that I have put into the tree, and can +# therefore modify as I see fit. So to avoid gcc puking all over the place, fix these defs. + cat libredblack/redblack.h | sed \ + -e 's!^RB_STATIC const RB_ENTRY(data_t) \*RB_ENTRY(find)!RB_STATIC RB_ENTRY(data_t) *RB_ENTRY(find)!' \ + -e 's!^RB_STATIC const RB_ENTRY(data_t) \*RB_ENTRY(lookup)!RB_STATIC RB_ENTRY(data_t) *RB_ENTRY(lookup)!' \ + -e 's!^RB_STATIC const RB_ENTRY(data_t) \*RB_ENTRY(search)!RB_STATIC RB_ENTRY(data_t) *RB_ENTRY(search)!' \ + -e 's!^RB_STATIC const RB_ENTRY(data_t) \*RB_ENTRY(delete)!RB_STATIC RB_ENTRY(data_t) *RB_ENTRY(delete)!' \ + -e 's!^RB_STATIC const RB_ENTRY(data_t) \*RB_ENTRY(readlist)!RB_STATIC RB_ENTRY(data_t) *RB_ENTRY(readlist)!' >redblack.h + libredblack/.libs/libredblack.a: libredblack/Makefile (cd libredblack && $(MAKE)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <st...@us...> - 2011-08-01 21:27:28
|
Revision: 6720 http://xymon.svn.sourceforge.net/xymon/?rev=6720&view=rev Author: storner Date: 2011-08-01 21:27:22 +0000 (Mon, 01 Aug 2011) Log Message: ----------- Release 4.3.4 Modified Paths: -------------- trunk/Changes trunk/RELEASENOTES trunk/debian/changelog trunk/include/version.h Modified: trunk/Changes =================================================================== --- trunk/Changes 2011-08-01 21:25:12 UTC (rev 6719) +++ trunk/Changes 2011-08-01 21:27:22 UTC (rev 6720) @@ -1,3 +1,34 @@ +Changes from 4.3.3 -> 4.3.4 (1 Aug 2011) +======================================== +* rev 6713 +* Fix crashes and data corruption in Xymon worker modules + (xymond_client, xymond_rrd etc) after handling large + messages. +* Fix xymond lock-up when renaming/deleting hosts +* Fix xymond cookie lookup mechanism +* Webpages: Add new HOSTPOPUP setting to control what values from + hosts.cfg are displayed as a "comment" to the hostname (either + in pop-up's or next to the hostname). +* Fix xymond_client crash if analysis.cfg contains invalid configuration + entries, e.g. expressions that do not compile. +* Fix showgraph CGI crash when legends contain colon. +* xymonnet: Include hostname when reporting erroneous test-spec +* CGI utils: Multiple potential security fixes involving buffer- + overruns when generating responses. +* CGI utils: Fix crash when invoked with HTTP "HEAD" +* CGI utils: Fix crashes on 64-bit platforms due to missing prototype + of "basename()" function. +* svcstatus CGI: Dont crash if history log is not a file. +* Critical systems view CGI: Cross-site scripting fix +* Fix recovery-messages for alerts sent to a GROUP +* RRD "memory" status handler now recognizes the output from the + bb-xsnmp.pl module (for Cisco routers). +* Web templates modified so the menu CSS can override the default + body CSS. +* Acknowledge web page now allows selecting minutes/hours/days +* Enable/Disable webpage enhanced, so when selecting multiple hosts + the "Tests" column only lists the tests those hosts have. + Changes from 4.3.2 -> 4.3.3 (6 May 2011) ======================================== * rev6684 Modified: trunk/RELEASENOTES =================================================================== --- trunk/RELEASENOTES 2011-08-01 21:25:12 UTC (rev 6719) +++ trunk/RELEASENOTES 2011-08-01 21:27:22 UTC (rev 6720) @@ -1,7 +1,8 @@ <<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>> - * * * Release notes for Xymon 4.3.1 * * * + * * * Release notes for Xymon 4.3.4 * * * <<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>> + Changes for 4.3.1 ================== This is a SECURITY BUG FIX release, resolving a number of Modified: trunk/debian/changelog =================================================================== --- trunk/debian/changelog 2011-08-01 21:25:12 UTC (rev 6719) +++ trunk/debian/changelog 2011-08-01 21:27:22 UTC (rev 6720) @@ -1,3 +1,35 @@ +xymon (4.3.4) unstable; urgency=medium + + rev 6720 + * Fix crashes and data corruption in Xymon worker modules + (xymond_client, xymond_rrd etc) after handling large messages. + * Fix xymond lock-up when renaming/deleting hosts + * Fix xymond cookie lookup mechanism + * Fix xymond_client crash if analysis.cfg contains invalid + configuration entries, e.g. expressions that do not compile. + * Fix showgraph CGI crash when legends contain colon. + * CGI utils: Fix potential security issues involving buffer- + overruns when generating responses. + * CGI utils: Fix crash when invoked with HTTP "HEAD" + * CGI utils: Fix crashes on 64-bit platforms due to missing + prototype of "basename()" function. + * svcstatus CGI: Fix crash if history log is not a file. + * Critical systems view CGI: Fix cross-site scripting + * Fix recovery-messages for alerts sent to a GROUP + * xymonnet: Include hostname when reporting erroneous test-spec + * Webpages: Add new HOSTPOPUP setting to control what values from + hosts.cfg are displayed as a "comment" to the hostname (either + in pop-up's or next to the hostname). + * RRD "memory" status handler now recognizes the output from the + bb-xsnmp.pl module (for Cisco routers). + * Web templates modified so the menu CSS can override the default + body CSS. + * Acknowledge web page now allows selecting minutes/hours/days + * Enable/Disable webpage enhanced, so when selecting multiple hosts + the "Tests" column only lists the tests those hosts have. + + -- Henrik Stoerner <he...@hs...> Mon, 1 Aug 2011 23:26:00 +0200 + xymon (4.3.3) unstable; urgency=high rev 6684 Modified: trunk/include/version.h =================================================================== --- trunk/include/version.h 2011-08-01 21:25:12 UTC (rev 6719) +++ trunk/include/version.h 2011-08-01 21:27:22 UTC (rev 6720) @@ -11,7 +11,7 @@ #ifndef __VERSION_H__ #define __VERSION_H__ -#define VERSION "4.3.3" +#define VERSION "4.3.4" #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <st...@us...> - 2011-08-07 11:26:04
|
Revision: 6725 http://xymon.svn.sourceforge.net/xymon/?rev=6725&view=rev Author: storner Date: 2011-08-07 11:25:56 +0000 (Sun, 07 Aug 2011) Log Message: ----------- hosts.cfg API: Add XMH_DGNAME to fetch the "group" string for a host. Client/alert configuration: New DISPLAYGROUP / EXDISPLAYGROUP options to select host by the text used on the hosts.cfg 'group' that they appear in. Modified Paths: -------------- trunk/common/xymon-xmh.5 trunk/lib/loadalerts.c trunk/lib/loadalerts.h trunk/lib/loadhosts.c trunk/lib/loadhosts.h trunk/lib/loadhosts_file.c trunk/xymond/alerts.cfg.5 trunk/xymond/analysis.cfg.5 trunk/xymond/client_config.c trunk/xymond/xymond_client.c Modified: trunk/common/xymon-xmh.5 =================================================================== --- trunk/common/xymon-xmh.5 2011-08-04 15:30:05 UTC (rev 6724) +++ trunk/common/xymon-xmh.5 2011-08-07 11:25:56 UTC (rev 6725) @@ -54,6 +54,10 @@ .IP XMH_DESCRIPTION Value of the DESCR tag. +.IP XMH_DGNAME +The text string from the hosts.cfg "group" definition (group, group-only, group-except) +in which the host is defined. + .IP XMH_DISPLAYNAME Value of the NAME tag. Modified: trunk/lib/loadalerts.c =================================================================== --- trunk/lib/loadalerts.c 2011-08-04 15:30:05 UTC (rev 6724) +++ trunk/lib/loadalerts.c 2011-08-07 11:25:56 UTC (rev 6725) @@ -161,6 +161,10 @@ if (crit->pagespecre) pcre_free(crit->pagespecre); if (crit->expagespec) xfree(crit->expagespec); if (crit->expagespecre) pcre_free(crit->expagespecre); + if (crit->dgspec) xfree(crit->dgspec); + if (crit->dgspecre) pcre_free(crit->dgspecre); + if (crit->exdgspec) xfree(crit->exdgspec); + if (crit->exdgspecre) pcre_free(crit->exdgspecre); if (crit->hostspec) xfree(crit->hostspec); if (crit->hostspecre) pcre_free(crit->hostspecre); if (crit->exhostspec) xfree(crit->exhostspec); @@ -318,6 +322,28 @@ if (*(crit->expagespec) == '%') crit->expagespecre = compileregex(crit->expagespec+1); firsttoken = 0; } + else if ((strncasecmp(p, "DISPLAYGROUP=", 13) == 0) || (strncasecmp(p, "DISPLAYGROUPS=", 14) == 0)) { + char *val; + criteria_t *crit; + + if (firsttoken) { flush_rule(currule); currule = NULL; currcp = NULL; pstate = P_NONE; } + val = strchr(p, '=')+1; + crit = setup_criteria(&currule, &currcp); + crit->dgspec = strdup(val); + if (*(crit->dgspec) == '%') crit->dgspecre = compileregex(crit->dgspec+1); + firsttoken = 0; + } + else if ((strncasecmp(p, "EXDISPLAYGROUP=", 15) == 0) || (strncasecmp(p, "EXDISPLAYGROUPS=", 16) == 0)) { + char *val; + criteria_t *crit; + + if (firsttoken) { flush_rule(currule); currule = NULL; currcp = NULL; pstate = P_NONE; } + val = strchr(p, '=')+1; + crit = setup_criteria(&currule, &currcp); + crit->exdgspec = strdup(val); + if (*(crit->exdgspec) == '%') crit->exdgspecre = compileregex(crit->exdgspec+1); + firsttoken = 0; + } else if ((strncasecmp(p, "HOST=", 5) == 0) || (strncasecmp(p, "HOSTS=", 6) == 0)) { char *val; criteria_t *crit; @@ -668,6 +694,8 @@ { 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); @@ -750,7 +778,7 @@ { /* * See if the "crit" matches the "alert". - * Match on pagespec, hostspec, svcspec, classspec, groupspec, colors, timespec, minduration, maxduration, sendrecovered + * Match on pagespec, dgspec, hostspec, svcspec, classspec, groupspec, colors, timespec, minduration, maxduration, sendrecovered */ static char *pgnames = NULL; @@ -769,8 +797,8 @@ if (!cfline && rulecrit) cfline = rulecrit->cfline; if (!cfline) cfline = "<undefined>"; - traceprintf("Matching host:service:page '%s:%s:%s' against rule line %d\n", - alert->hostname, alert->testname, alert->location, cfid); + traceprintf("Matching host:service:dgroup:page '%s:%s:%s:%s' against rule line %d\n", + alert->hostname, alert->testname, xmh_item(hinfo, XMH_DGNAME), alert->location, cfid); if (alert->state == A_PAGING) { /* Check max-duration now - it's fast and easy. */ @@ -856,7 +884,6 @@ pgexclres = (namematch(pgtok, crit->expagespec, crit->expagespecre) ? 1 : 0); pgtok = strtok(NULL, ","); - } if (pgexclres == 1) { traceprintf("Failed '%s' (pagename excluded)\n", cfline); @@ -867,6 +894,15 @@ return 0; } + if (crit && crit->dgspec && !namematch(xmh_item(hinfo, XMH_DGNAME), crit->dgspec, crit->dgspecre)) { + traceprintf("Failed '%s' (displaygroup not in include list)\n", cfline); + return 0; + } + if (crit && crit->exdgspec && namematch(xmh_item(hinfo, XMH_DGNAME), crit->exdgspec, crit->exdgspecre)) { + traceprintf("Failed '%s' (displaygroup excluded)\n", cfline); + return 0; + } + if (crit && crit->hostspec && !namematch(alert->hostname, crit->hostspec, crit->hostspecre)) { traceprintf("Failed '%s' (hostname not in include list)\n", cfline); return 0; Modified: trunk/lib/loadalerts.h =================================================================== --- trunk/lib/loadalerts.h 2011-08-04 15:30:05 UTC (rev 6724) +++ trunk/lib/loadalerts.h 2011-08-07 11:25:56 UTC (rev 6725) @@ -53,6 +53,10 @@ pcre *pagespecre; char *expagespec; /* Pages to exclude */ pcre *expagespecre; + char *dgspec; /* Display groups to include */ + pcre *dgspecre; + char *exdgspec; /* Display groups to exclude */ + pcre *exdgspecre; char *hostspec; /* Hosts to include */ pcre *hostspecre; char *exhostspec; /* Hosts to exclude */ Modified: trunk/lib/loadhosts.c =================================================================== --- trunk/lib/loadhosts.c 2011-08-04 15:30:05 UTC (rev 6724) +++ trunk/lib/loadhosts.c 2011-08-07 11:25:56 UTC (rev 6725) @@ -39,7 +39,7 @@ void *data; /* Misc. data supplied by the user of this library function */ struct namelist_t *defaulthost; /* Points to the latest ".default." host */ int pageindex; - char *groupid; + char *groupid, *dgname; char *classname; char *osname; struct namelist_t *next; @@ -189,6 +189,7 @@ xmh_item_name[XMH_PAGEPATHTITLE] = "XMH_PAGEPATHTITLE"; xmh_item_name[XMH_ALLPAGEPATHS] = "XMH_ALLPAGEPATHS"; xmh_item_name[XMH_GROUPID] = "XMH_GROUPID"; + xmh_item_name[XMH_DGNAME] = "XMH_DGNAME"; xmh_item_name[XMH_PAGEINDEX] = "XMH_PAGEINDEX"; xmh_item_name[XMH_RAW] = "XMH_RAW"; @@ -240,6 +241,7 @@ if (walk->hostname) xfree(walk->hostname); if (walk->groupid) xfree(walk->groupid); + if (walk->dgname) xfree(walk->dgname); if (walk->classname) xfree(walk->classname); if (walk->osname) xfree(walk->osname); if (walk->logname) xfree(walk->logname); @@ -256,6 +258,7 @@ /* clientname should not be freed, since it's just a pointer into the elems-array */ if (walk->hostname) xfree(walk->hostname); if (walk->groupid) xfree(walk->groupid); + if (walk->dgname) xfree(walk->dgname); if (walk->classname) xfree(walk->classname); if (walk->osname) xfree(walk->osname); if (walk->logname) xfree(walk->logname); @@ -514,6 +517,9 @@ case XMH_GROUPID: return host->groupid; + case XMH_DGNAME: + return host->dgname; + case XMH_DOCURL: p = xmh_find_item(host, item); if (p) { Modified: trunk/lib/loadhosts.h =================================================================== --- trunk/lib/loadhosts.h 2011-08-04 15:30:05 UTC (rev 6724) +++ trunk/lib/loadhosts.h 2011-08-07 11:25:56 UTC (rev 6725) @@ -59,6 +59,7 @@ XMH_NOPROP, XMH_PAGEINDEX, XMH_GROUPID, + XMH_DGNAME, XMH_PAGENAME, XMH_PAGEPATH, XMH_PAGETITLE, Modified: trunk/lib/loadhosts_file.c =================================================================== --- trunk/lib/loadhosts_file.c 2011-08-04 15:30:05 UTC (rev 6724) +++ trunk/lib/loadhosts_file.c 2011-08-07 11:25:56 UTC (rev 6725) @@ -51,7 +51,7 @@ static void *hostfiles = NULL; FILE *hosts; int ip1, ip2, ip3, ip4, groupid, pageidx; - char hostname[4096]; + char hostname[4096], *dgname; strbuffer_t *inbuf; pagelist_t *curtoppage, *curpage, *pgtail; namelist_t *nametail = NULL; @@ -76,6 +76,7 @@ initialize_hostlist(); curpage = curtoppage = pgtail = pghead; pageidx = groupid = 0; + dgname = NULL; hosts = stackfopen(hostsfn, "r", &hostfiles); if (hosts == NULL) return -1; @@ -90,6 +91,7 @@ char *name, *title; pageidx = groupid = 0; + if (dgname) xfree(dgname); dgname = NULL; if (get_page_name_title(STRBUF(inbuf), "page", &name, &title) == 0) { newp = (pagelist_t *)malloc(sizeof(pagelist_t)); newp->pagepath = strdup(name); @@ -107,6 +109,7 @@ char *name, *title; pageidx = groupid = 0; + if (dgname) xfree(dgname); dgname = NULL; if (get_page_name_title(STRBUF(inbuf), "subpage", &name, &title) == 0) { newp = (pagelist_t *)malloc(sizeof(pagelist_t)); newp->pagepath = malloc(strlen(curtoppage->pagepath) + strlen(name) + 2); @@ -126,6 +129,7 @@ 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) { for (parent = pghead; (parent && !pagematch(parent, pname)); parent = parent->next); @@ -146,7 +150,50 @@ } } else if (strncmp(STRBUF(inbuf), "group", 5) == 0) { + char *tok, *inp; + groupid++; + if (dgname) xfree(dgname); dgname = NULL; + + tok = strtok(STRBUF(inbuf), " \t"); + if ((strcmp(tok, "group-only") == 0) || (strcmp(tok, "group-except") == 0)) { + tok = strtok(NULL, " \t"); + } + if (tok) tok = strtok(NULL, "\r\n"); + + if (tok) { + char *inp; + + /* Strip HTML tags from the string */ + dgname = (char *)malloc(strlen(tok) + 1); + *dgname = '\0'; + + inp = tok; + while (*inp) { + char *tagstart, *tagend; + + tagstart = strchr(inp, '<'); + if (tagstart) { + tagend = strchr(tagstart, '>'); + + *tagstart = '\0'; + if (*inp) strcat(dgname, inp); + if (tagend) { + inp = tagend+1; + } + else { + /* Unmatched '<', keep all of the string */ + *tagstart = '<'; + strcat(dgname, tagstart); + inp += strlen(inp); + } + } + else { + strcat(dgname, inp); + inp += strlen(inp); + } + } + } } else if (sscanf(STRBUF(inbuf), "%d.%d.%d.%d %s", &ip1, &ip2, &ip3, &ip4, hostname) == 5) { char *startoftags, *tag, *delim; @@ -183,6 +230,7 @@ sprintf(newitem->ip, "%d.%d.%d.%d", ip1, ip2, ip3, ip4); sprintf(groupidstr, "%d", groupid); newitem->groupid = strdup(groupidstr); + newitem->dgname = (dgname ? strdup(dgname) : strdup("NONE")); newitem->pageindex = pageidx++; newitem->hostname = strdup(hostname); @@ -298,6 +346,7 @@ } stackfclose(hosts); freestrbuffer(inbuf); + if (dgname) xfree(dgname); rbtDelete(htree); MEMUNDEFINE(hostname); Modified: trunk/xymond/alerts.cfg.5 =================================================================== --- trunk/xymond/alerts.cfg.5 2011-08-04 15:30:05 UTC (rev 6724) +++ trunk/xymond/alerts.cfg.5 2011-08-07 11:25:56 UTC (rev 6725) @@ -48,6 +48,27 @@ .BR "EXPAGE=targetstring" Rule excluding an alert if the pagename matches. .sp +.BR "DISPLAYGROUP=groupstring" +Rule matching an alert by the text of the display-group (text following the group, +group-only, group-except heading) in the hosts.cfg file. "groupstring" is the text +for the group, stripped of any HTML tags. E.g. if you have this setup: +.IP +.nf +group Web +10.0.0.1 www1.foo.com +10.0.0.2 www2.foo.com +group Production databases +10.0.1.1 db1.foo.com +.fi +.LP +Then the hosts in the Web-group can be matched with \fBDISPLAYGROUP=Web\fR, +and the database servers can be matched with \fBDISPLAYGROUP="Production databases"\fR. +Note that you can also use regular expressions, e.g. \fBDISPLAYGROUP=%database\fR. +If there is no group-setting for the host, use "DISPLAYGROUP=NONE". +.sp +.BR "EXDISPLAYGROUP=groupstring" +Rule excluding a group by matching the display-group string. +.sp .BR "HOST=targetstring" Rule matching an alert by the hostname. .sp Modified: trunk/xymond/analysis.cfg.5 =================================================================== --- trunk/xymond/analysis.cfg.5 2011-08-04 15:30:05 UTC (rev 6724) +++ trunk/xymond/analysis.cfg.5 2011-08-07 11:25:56 UTC (rev 6725) @@ -495,7 +495,7 @@ file). .BR "PAGE=targetstring" -Rule matching an alert by the name of the page in XYmon. "targetstring" is the path of +Rule matching an alert by the name of the page in Xymon. "targetstring" is the path of the page as defined in the hosts.cfg file. E.g. if you have this setup: .IP .nf @@ -540,6 +540,27 @@ .BR "EXCLASS=classname" Exclude all hosts belonging to "classname" from this rule. +.BR "DISPLAYGROUP=groupstring" +Rule matching an alert by the text of the display-group (text following the group, +group-only, group-except heading) in the hosts.cfg file. "groupstring" is the text +for the group, stripped of any HTML tags. E.g. if you have this setup: +.IP +.nf +group Web +10.0.0.1 www1.foo.com +10.0.0.2 www2.foo.com +group Production databases +10.0.1.1 db1.foo.com +.fi +.LP +Then the hosts in the Web-group can be matched with \fBDISPLAYGROUP=Web\fR, +and the database servers can be matched with \fBDISPLAYGROUP="Production databases"\fR. +Note that you can also use regular expressions, e.g. \fBDISPLAYGROUP=%database\fR. +If there is no group-setting for the host, use "DISPLAYGROUP=NONE". + +.BR "EXDISPLAYGROUP=groupstring" +Rule excluding a group by matching the display-group string. + .BR "TIME=timespecification" Rule matching by the time-of-day. This is specified as the DOWNTIME time specification in the hosts.cfg file. E.g. "TIME=W:0800:2200" Modified: trunk/xymond/client_config.c =================================================================== --- trunk/xymond/client_config.c 2011-08-04 15:30:05 UTC (rev 6724) +++ trunk/xymond/client_config.c 2011-08-07 11:25:56 UTC (rev 6725) @@ -241,6 +241,8 @@ exprlist_t *exhostexp; exprlist_t *pageexp; exprlist_t *expageexp; + exprlist_t *dgexp; + exprlist_t *exdgexp; exprlist_t *classexp; exprlist_t *exclassexp; char *timespec, *statustext, *rrdidstr, *groups; @@ -359,6 +361,8 @@ if (rwalk->classexp && !namematch(classname, rwalk->classexp->pattern, rwalk->classexp->exp)) continue; if (rwalk->exhostexp && namematch(hostname, rwalk->exhostexp->pattern, rwalk->exhostexp->exp)) continue; if (rwalk->hostexp && !namematch(hostname, rwalk->hostexp->pattern, rwalk->hostexp->exp)) continue; + if (rwalk->exdgexp && namematch(hostname, rwalk->exdgexp->pattern, rwalk->exdgexp->exp)) continue; + if (rwalk->dgexp && !namematch(hostname, rwalk->dgexp->pattern, rwalk->dgexp->exp)) continue; pgmatchres = pgexclres = -1; pgtok = strtok(pagenamecopy, ","); @@ -415,6 +419,7 @@ static c_rule_t *setup_rule(ruletype_t ruletype, exprlist_t *curhost, exprlist_t *curexhost, exprlist_t *curpage, exprlist_t *curexpage, + exprlist_t *curdg, exprlist_t *curexdg, exprlist_t *curclass, exprlist_t *curexclass, char *curtime, char *curtext, char *curgroup, int cfid) @@ -428,6 +433,8 @@ newitem->exhostexp = curexhost; newitem->pageexp = curpage; newitem->expageexp = curexpage; + newitem->dgexp = curdg; + newitem->exdgexp = curexdg; newitem->classexp = curclass; newitem->exclassexp = curexclass; if (curtime) newitem->timespec = strdup(curtime); @@ -443,15 +450,17 @@ { if (!token) return 1; - if ( (strncasecmp(token, "HOST=", 5) == 0) || - (strncasecmp(token, "EXHOST=", 7) == 0) || - (strncasecmp(token, "PAGE=", 5) == 0) || - (strncasecmp(token, "EXPAGE=", 7) == 0) || - (strncasecmp(token, "CLASS=", 6) == 0) || - (strncasecmp(token, "EXCLASS=", 8) == 0) || - (strncasecmp(token, "TEXT=", 5) == 0) || - (strncasecmp(token, "GROUP=", 6) == 0) || - (strncasecmp(token, "TIME=", 5) == 0) ) return 1; + if ( (strncasecmp(token, "HOST=", 5) == 0) || + (strncasecmp(token, "EXHOST=", 7) == 0) || + (strncasecmp(token, "PAGE=", 5) == 0) || + (strncasecmp(token, "EXPAGE=", 7) == 0) || + (strncasecmp(token, "DISPLAYGROUP=", 12) == 0) || + (strncasecmp(token, "EXDISPLAYGROUP=", 14) == 0) || + (strncasecmp(token, "CLASS=", 6) == 0) || + (strncasecmp(token, "EXCLASS=", 8) == 0) || + (strncasecmp(token, "TEXT=", 5) == 0) || + (strncasecmp(token, "GROUP=", 6) == 0) || + (strncasecmp(token, "TIME=", 5) == 0) ) return 1; return 0; } @@ -517,7 +526,7 @@ FILE *fd; strbuffer_t *inbuf; char *tok; - exprlist_t *curhost, *curpage, *curclass, *curexhost, *curexpage, *curexclass; + exprlist_t *curhost, *curpage, *curclass, *curexhost, *curexpage, *curexclass, *curdg, *curexdg; char *curtime, *curtext, *curgroup; c_rule_t *currule = NULL; int cfid = 0; @@ -600,18 +609,20 @@ havetree = 0; } - curhost = curpage = curclass = curexhost = curexpage = curexclass = NULL; +#define NEWRULE(X) (setup_rule(X, curhost, curexhost, curpage, curexpage, curdg, curexdg, curclass, curexclass, curtime, curtext, curgroup, cfid)); + + curhost = curpage = curclass = curexhost = curexpage = curexclass = curdg = curexdg = NULL; curtime = curtext = curgroup = NULL; inbuf = newstrbuffer(0); while (stackfgets(inbuf, NULL)) { - exprlist_t *newhost, *newpage, *newexhost, *newexpage, *newclass, *newexclass; + exprlist_t *newhost, *newpage, *newexhost, *newexpage, *newclass, *newexclass, *newdg, *newexdg; char *newtime, *newtext, *newgroup; int unknowntok = 0; cfid++; sanitize_input(inbuf, 1, 0); if (STRBUFLEN(inbuf) == 0) continue; - newhost = newpage = newexhost = newexpage = newclass = newexclass = NULL; + newhost = newpage = newexhost = newexpage = newclass = newexclass = newdg = newexdg = NULL; newtime = newtext = newgroup = NULL; currule = NULL; @@ -641,6 +652,18 @@ if (currule) currule->expageexp = newexpage; tok = wstok(NULL); continue; } + else if (strncasecmp(tok, "DISPLAYGROUP=", 13) == 0) { + char *p = strchr(tok, '='); + newdg = setup_expr(p+1, 0); + if (currule) currule->dgexp = newdg; + tok = wstok(NULL); continue; + } + else if (strncasecmp(tok, "EXDISPLAYGROUP=", 15) == 0) { + char *p = strchr(tok, '='); + newexdg = setup_expr(p+1, 0); + if (currule) currule->exdgexp = newexdg; + tok = wstok(NULL); continue; + } else if (strncasecmp(tok, "CLASS=", 6) == 0) { char *p = strchr(tok, '='); newclass = setup_expr(p+1, 0); @@ -675,7 +698,7 @@ currule = NULL; } else if (strcasecmp(tok, "UP") == 0) { - currule = setup_rule(C_UPTIME, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_UPTIME) currule->rule.uptime.recentlimit = 3600; currule->rule.uptime.ancientlimit = -1; @@ -685,13 +708,13 @@ currule->rule.uptime.ancientlimit = 60*durationvalue(tok); } else if (strcasecmp(tok, "CLOCK") == 0) { - currule = setup_rule(C_CLOCK, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_CLOCK); currule->rule.clock.maxdiff = 60; tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.clock.maxdiff = atoi(tok); } else if (strcasecmp(tok, "LOAD") == 0) { - currule = setup_rule(C_LOAD, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_LOAD); currule->rule.load.warnlevel = 5.0; currule->rule.load.paniclevel = atof(tok); @@ -701,7 +724,7 @@ currule->rule.load.paniclevel = atof(tok); } else if (strcasecmp(tok, "DISK") == 0) { - currule = setup_rule(C_DISK, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_DISK); currule->rule.disk.abswarn = 0; currule->rule.disk.warnlevel = 90; currule->rule.disk.abspanic = 0; @@ -745,7 +768,7 @@ currule->rule.disk.color = parse_color(tok); } else if (strcasecmp(tok, "INODE") == 0) { - currule = setup_rule(C_INODE, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_INODE); currule->rule.inode.abswarn = 0; currule->rule.inode.warnlevel = 70; currule->rule.inode.abspanic = 0; @@ -790,7 +813,7 @@ } else if ((strcasecmp(tok, "MEMREAL") == 0) || (strcasecmp(tok, "MEMPHYS") == 0) || (strcasecmp(tok, "PHYS") == 0)) { - currule = setup_rule(C_MEM, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_MEM); currule->rule.mem.memtype = C_MEM_PHYS; currule->rule.mem.warnlevel = 100; currule->rule.mem.paniclevel = 101; @@ -801,7 +824,7 @@ currule->rule.mem.paniclevel = atoi(tok); } else if ((strcasecmp(tok, "MEMSWAP") == 0) || (strcasecmp(tok, "SWAP") == 0)) { - currule = setup_rule(C_MEM, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_MEM); currule->rule.mem.memtype = C_MEM_SWAP; currule->rule.mem.warnlevel = 50; currule->rule.mem.paniclevel = 80; @@ -812,7 +835,7 @@ currule->rule.mem.paniclevel = atoi(tok); } else if ((strcasecmp(tok, "MEMACT") == 0) || (strcasecmp(tok, "ACTUAL") == 0) || (strcasecmp(tok, "ACT") == 0)) { - currule = setup_rule(C_MEM, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_MEM); currule->rule.mem.memtype = C_MEM_ACT; currule->rule.mem.warnlevel = 90; currule->rule.mem.paniclevel = 97; @@ -823,7 +846,7 @@ currule->rule.mem.paniclevel = atoi(tok); } else if (strcasecmp(tok, "MEMCSA") == 0) { - currule = setup_rule(C_MEM, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_MEM); currule->rule.zos_mem.zos_memtype = C_MEM_CSA; currule->rule.zos_mem.warnlevel = 90; currule->rule.zos_mem.paniclevel = 95; @@ -834,7 +857,7 @@ currule->rule.zos_mem.paniclevel = atoi(tok); } else if (strcasecmp(tok, "MEMECSA") == 0) { - currule = setup_rule(C_MEM, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_MEM); currule->rule.zos_mem.zos_memtype = C_MEM_ECSA; currule->rule.zos_mem.warnlevel = 90; currule->rule.zos_mem.paniclevel = 95; @@ -845,7 +868,7 @@ currule->rule.zos_mem.paniclevel = atoi(tok); } else if (strcasecmp(tok, "MEMSQA") == 0) { - currule = setup_rule(C_MEM, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_MEM); currule->rule.zos_mem.zos_memtype = C_MEM_SQA; currule->rule.zos_mem.warnlevel = 90; currule->rule.zos_mem.paniclevel = 95; @@ -856,7 +879,7 @@ currule->rule.zos_mem.paniclevel = atoi(tok); } else if (strcasecmp(tok, "MEMESQA") == 0) { - currule = setup_rule(C_MEM, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_MEM); currule->rule.zos_mem.zos_memtype = C_MEM_ESQA; currule->rule.zos_mem.warnlevel = 90; currule->rule.zos_mem.paniclevel = 95; @@ -867,7 +890,7 @@ currule->rule.zos_mem.paniclevel = atoi(tok); } else if (strcasecmp(tok, "CICS") == 0) { - currule = setup_rule(C_CICS, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_CICS); currule->rule.cics.dsawarnlevel = 90; currule->rule.cics.dsapaniclevel = 95; currule->rule.cics.edsawarnlevel = 90; @@ -914,7 +937,7 @@ break; } - currule = setup_rule(C_PROC, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_PROC); currule->rule.proc.pmin = 1; currule->rule.proc.pmax = -1; currule->rule.proc.color = COL_RED; @@ -963,7 +986,7 @@ else if (strcasecmp(tok, "LOG") == 0) { int idx = 0; - currule = setup_rule(C_LOG, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_LOG); currule->rule.log.logfile = NULL; currule->rule.log.matchexp = NULL; currule->rule.log.matchone = NULL; @@ -1009,7 +1032,7 @@ } while (tok && (!isqual(tok))); } else if (strcasecmp(tok, "FILE") == 0) { - currule = setup_rule(C_FILE, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_FILE); currule->rule.fcheck.filename = NULL; currule->rule.fcheck.color = COL_RED; @@ -1155,7 +1178,7 @@ } while (tok && (!isqual(tok))); } else if (strcasecmp(tok, "DIR") == 0) { - currule = setup_rule(C_DIR, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_DIR); currule->rule.dcheck.filename = NULL; currule->rule.dcheck.color = COL_RED; @@ -1183,7 +1206,7 @@ } while (tok && (!isqual(tok))); } else if (strcasecmp(tok, "PORT") == 0) { - currule = setup_rule(C_PORT, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_PORT); currule->rule.port.localexp = NULL; currule->rule.port.exlocalexp = NULL; @@ -1241,7 +1264,7 @@ } while (tok && (!isqual(tok))); } else if (strcasecmp(tok, "PAGING") == 0) { - currule = setup_rule(C_PAGING, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_PAGING); currule->rule.paging.warnlevel = 5; currule->rule.paging.paniclevel = 10; @@ -1253,7 +1276,7 @@ currule->rule.paging.paniclevel = atoi(tok); } else if (strcasecmp(tok, "GETVIS") == 0) { - currule = setup_rule(C_MEM_GETVIS, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_MEM_GETVIS); currule->rule.zvse_getvis.warnlevel = 90; currule->rule.zvse_getvis.paniclevel = 95; currule->rule.zvse_getvis.anywarnlevel = 90; @@ -1273,7 +1296,7 @@ currule->rule.zvse_getvis.anypaniclevel = atoi(tok); } else if (strcasecmp(tok, "VSIZE") == 0) { - currule = setup_rule(C_MEM_VSIZE, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_MEM_VSIZE); currule->rule.zvse_vsize.warnlevel = 90; currule->rule.zvse_vsize.paniclevel = 95; @@ -1283,7 +1306,7 @@ currule->rule.zvse_vsize.paniclevel = atoi(tok); } else if (strcasecmp(tok, "MAXUSER") == 0) { - currule = setup_rule(C_ASID, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_ASID); currule->rule.asid.asidtype = C_ASID_MAXUSER; currule->rule.asid.warnlevel = 101; @@ -1296,7 +1319,7 @@ currule->rule.asid.paniclevel = atoi(tok); } else if (strcasecmp(tok, "NPARTS") == 0) { - currule = setup_rule(C_ASID, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_ASID); currule->rule.asid.asidtype = C_ASID_NPARTS; currule->rule.asid.warnlevel = 101; @@ -1313,7 +1336,7 @@ tok = wstok(NULL); /* See if there is any service definition at all */ if (tok) { - currule = setup_rule(C_SVC, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_SVC); currule->rule.svc.svcexp = setup_expr(tok, 0); currule->rule.svc.startupexp = NULL; @@ -1346,7 +1369,7 @@ } } else if (strcasecmp(tok, "MIB") == 0) { - currule = setup_rule(C_MIBVAL, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_MIBVAL); currule->rule.mibval.mibvalexp = NULL; currule->rule.mibval.keyexp = NULL; currule->rule.mibval.color = COL_RED; @@ -1383,7 +1406,7 @@ else if (strcasecmp(tok, "DS") == 0) { char *key, *ds, *column; - currule = setup_rule(C_RRDDS, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_RRDDS); currule->rule.rrdds.color = COL_RED; tok = wstok(NULL); @@ -1452,7 +1475,7 @@ } else if (strcasecmp(tok, "MQ_QUEUE") == 0) { char *p; - currule = setup_rule(C_MQ_QUEUE, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_MQ_QUEUE); currule->rule.mqqueue.qmgrname = NULL; currule->rule.mqqueue.qname = NULL; currule->rule.mqqueue.warnlen = -1; @@ -1496,7 +1519,7 @@ else if (strcasecmp(tok, "MQ_CHANNEL") == 0) { char *p; - currule = setup_rule(C_MQ_CHANNEL, curhost, curexhost, curpage, curexpage, curclass, curexclass, curtime, curtext, curgroup, cfid); + currule = NEWRULE(C_MQ_CHANNEL); currule->rule.mqchannel.qmgrname = NULL; currule->rule.mqchannel.chnname = NULL; currule->rule.mqchannel.warnstates = NULL; @@ -1851,8 +1874,10 @@ if (rwalk->timespec) printf(" TIME=%s", rwalk->timespec); if (rwalk->hostexp) printf(" HOST=%s", rwalk->hostexp->pattern); if (rwalk->exhostexp) printf(" EXHOST=%s", rwalk->exhostexp->pattern); - if (rwalk->pageexp) printf(" HOST=%s", rwalk->pageexp->pattern); - if (rwalk->expageexp) printf(" EXHOST=%s", rwalk->expageexp->pattern); + if (rwalk->dgexp) printf(" DISPLAYGROUP=%s", rwalk->dgexp->pattern); + if (rwalk->exdgexp) printf(" EXDISPLAYGROUP=%s", rwalk->exdgexp->pattern); + if (rwalk->pageexp) printf(" PAGE=%s", rwalk->pageexp->pattern); + if (rwalk->expageexp) printf(" EXPAGE=%s", rwalk->expageexp->pattern); if (rwalk->classexp) printf(" CLASS=%s", rwalk->classexp->pattern); if (rwalk->exclassexp) printf(" EXCLASS=%s", rwalk->exclassexp->pattern); if (rwalk->statustext) printf(" TEXT=%s", rwalk->statustext); Modified: trunk/xymond/xymond_client.c =================================================================== --- trunk/xymond/xymond_client.c 2011-08-04 15:30:05 UTC (rev 6724) +++ trunk/xymond/xymond_client.c 2011-08-07 11:25:56 UTC (rev 6725) @@ -868,7 +868,7 @@ long memphystotal, long memphysused, long memactused, long memswaptotal, long memswapused) { - unsigned long memphyspct = 0, memswappct = 0, memactpct = 0; + long memphyspct = 0, memswappct = 0, memactpct = 0; int physyellow, physred, swapyellow, swapred, actyellow, actred; int memorycolor = COL_GREEN, physcolor = COL_GREEN, swapcolor = COL_GREEN, actcolor = COL_GREEN; @@ -924,28 +924,28 @@ sprintf(msgline, " %-12s%12s%12s%12s\n", "Memory", "Used", "Total", "Percentage"); addtostatus(msgline); - sprintf(msgline, "&%s %-12s%11luM%11luM%11lu%%\n", + sprintf(msgline, "&%s %-12s%11ldM%11ldM%11ld%%\n", colorname(physcolor), "Physical", memphysused, memphystotal, memphyspct); addtostatus(msgline); if (memactused != -1) { if (memactpct <= 100) - sprintf(msgline, "&%s %-12s%11luM%11luM%11lu%%\n", + sprintf(msgline, "&%s %-12s%11ldM%11ldM%11ld%%\n", colorname(actcolor), "Actual", memactused, memphystotal, memactpct); else - sprintf(msgline, "&%s %-12s%11luM%11luM%11lu%% - invalid data\n", - colorname(COL_CLEAR), "Actual", memactused, memphystotal, 0); + sprintf(msgline, "&%s %-12s%11ldM%11ldM%11ld%% - invalid data\n", + colorname(COL_CLEAR), "Actual", memactused, memphystotal, 0L); addtostatus(msgline); } if (memswapused != -1) { if (memswappct <= 100) - sprintf(msgline, "&%s %-12s%11luM%11luM%11lu%%\n", + sprintf(msgline, "&%s %-12s%11ldM%11ldM%11ld%%\n", colorname(swapcolor), "Swap", memswapused, memswaptotal, memswappct); else - sprintf(msgline, "&%s %-12s%11luM%11luM%11lu%% - invalid data\n", - colorname(COL_CLEAR), "Swap", memswapused, memswaptotal, 0); + sprintf(msgline, "&%s %-12s%11ldM%11ldM%11ld%% - invalid data\n", + colorname(COL_CLEAR), "Swap", memswapused, memswaptotal, 0L); addtostatus(msgline); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <st...@us...> - 2011-08-07 16:44:41
|
Revision: 6730 http://xymon.svn.sourceforge.net/xymon/?rev=6730&view=rev Author: storner Date: 2011-08-07 16:44:34 +0000 (Sun, 07 Aug 2011) Log Message: ----------- xymond: Add new "delayred" and "delayyellow" tags, allowing any status that go red/yellow to have the change delayed for a number of minutes so that transient failures does not trigger updates and alerts. xymonnet: Deprecate the "badSTATUS" tags, since these are better handled by delayred/delayyellow. Modified Paths: -------------- trunk/common/hosts.cfg.5 trunk/lib/loadhosts.c trunk/lib/loadhosts.h trunk/xymond/xymond.8 trunk/xymond/xymond.c trunk/xymonnet/xymonnet.c Modified: trunk/common/hosts.cfg.5 =================================================================== --- trunk/common/hosts.cfg.5 2011-08-07 15:15:40 UTC (rev 6729) +++ trunk/common/hosts.cfg.5 2011-08-07 16:44:34 UTC (rev 6730) @@ -111,7 +111,21 @@ Xymon, however. This tag disables the check of source IP when receiving data. +.IP delayred=STATUSCOLUMN:DELAY[,STATUSCOLUMN:DELAY...] +Usually, status changes happen immediately. This tag is used to defer +an update to red for the STATUSCOLUMN status for DELAY minutes. E.g. +with \fBdelayred=disk:10,cpu:30\fR, a red disk-status will not appear +on the Xymon webpages until it has been red for at least 10 minutes. +Note: Since most tests only execute once every 5 minutes, it will +usually not make sense to set N to anything but a multiple of 5. The +exception is network tests, since +.I xymonnet-again.sh(1) +will re-run failed network tests once a minute for up to 30 minutes. +.IP delayyellow=STATUSCOLUMN:DELAY[,STATUSCOLUMN:DELAY...] +Same as \fBdelayred\fR, but defers the change to a yellow status. + + .SH XYMONGEN DISPLAY OPTIONS These tags are processed by the .I xymongen(1) @@ -325,6 +339,10 @@ or yellow status. .IP NK:testname[,testname] +NOTE: This has been deprecated, you should use +.I criticalview.cgi(1) +instead of the NK tag. + Define the tests that you want included on the critical page. E.g. if you have a host where you only want to see the http tests on critical.html, you specify it as @@ -383,6 +401,7 @@ command line option. If no "WML:" tag is specified, the "NK:" tag is used if present. + .SH XYMON STATUS PROPAGATION OPTIONS These tags affect how a status propagates upwards from a single test to the page and higher. This can also be done with the @@ -614,6 +633,9 @@ silently ignored. .IP badTEST[-weekdays-starttime-endtime]:x:y:z +NOTE: This has been deprecated, use the \fBdelayred\fR and +\fBdelayyellow\fR settings instead. + Normally when a network test fails, the status changes to red immediately. With a "badTEST:x:y:z" tag this behaviour changes: .br Modified: trunk/lib/loadhosts.c =================================================================== --- trunk/lib/loadhosts.c 2011-08-07 15:15:40 UTC (rev 6729) +++ trunk/lib/loadhosts.c 2011-08-07 16:44:34 UTC (rev 6730) @@ -129,6 +129,10 @@ xmh_item_name[XMH_BROWSER] = "XMH_BROWSER"; xmh_item_key[XMH_HOLIDAYS] = "holidays="; xmh_item_name[XMH_HOLIDAYS] = "XMH_HOLIDAYS"; + xmh_item_key[XMH_DELAYRED] = "delayred="; + xmh_item_name[XMH_DELAYRED] = "XMH_DELAYRED"; + xmh_item_key[XMH_DELAYYELLOW] = "delayyellow="; + xmh_item_name[XMH_DELAYYELLOW] = "XMH_DELAYYELLOW"; xmh_item_key[XMH_FLAG_NOINFO] = "noinfo"; xmh_item_name[XMH_FLAG_NOINFO] = "XMH_FLAG_NOINFO"; xmh_item_key[XMH_FLAG_NOTRENDS] = "notrends"; Modified: trunk/lib/loadhosts.h =================================================================== --- trunk/lib/loadhosts.h 2011-08-07 15:15:40 UTC (rev 6729) +++ trunk/lib/loadhosts.h 2011-08-07 16:44:34 UTC (rev 6730) @@ -34,6 +34,8 @@ XMH_DEPENDS, XMH_BROWSER, XMH_HOLIDAYS, + XMH_DELAYRED, + XMH_DELAYYELLOW, XMH_FLAG_NOINFO, XMH_FLAG_NOTRENDS, XMH_FLAG_NODISP, Modified: trunk/xymond/xymond.8 =================================================================== --- trunk/xymond/xymond.8 2011-08-07 15:15:40 UTC (rev 6729) +++ trunk/xymond/xymond.8 2011-08-07 16:44:34 UTC (rev 6730) @@ -96,6 +96,16 @@ flap-count should be at least (3600/300)-1, i.e. 11. Default: 1800 seconds (30 minutes). +.IP "--delay-red=N" / "--delay-yellow=N" +Sets the delay before a red/yellow status causes a change in the web +page display. Is usually controlled on a per-host basis via the +\fBdelayred\fR and \fBdelayyellow\fR settings in +.I hosts.cfg(5) +but these options allow you to set a default value for the delays. +The value N is in minutes. Default: 0 minutes (no delay). +Note: Since most tests only execute once every 5 minutes, it will +usually not make sense to set N to anything but a multiple of 5. + .IP "--env=FILENAME" Loads the content of FILENAME as environment settings before starting xymond. This is mostly used when running as a stand-alone daemon; if Modified: trunk/xymond/xymond.c =================================================================== --- trunk/xymond/xymond.c 2011-08-07 15:15:40 UTC (rev 6729) +++ trunk/xymond/xymond.c 2011-08-07 16:44:34 UTC (rev 6730) @@ -128,6 +128,7 @@ time_t validtime; /* time when status is no longer valid */ time_t enabletime; /* time when test auto-enables after a disable */ time_t acktime; /* time when test acknowledgement expires */ + time_t redstart, yellowstart; unsigned char *message; int msgsz; unsigned char *dismsg, *ackmsg; @@ -181,7 +182,10 @@ int clientsavedisk = 0; /* On disk via the CLICHG channel */ int allow_downloads = 1; +int defaultreddelay = 0; /* Default delay for changing a status to RED */ +int defaultyellowdelay = 0; /* Default delay for changing a status to YELLOW */ + #define NOTALK 0 #define RECEIVING 1 #define RESPONDING 2 @@ -1174,6 +1178,38 @@ } +static int changedelay(void *hinfo, int newcolor, char *testname, int currcolor) +{ + char *key, *tok, *dstr = NULL; + int keylen, result = 0; + + /* Ignore any delays when we start with a purple status */ + if (currcolor == COL_PURPLE) return 0; + + switch (newcolor) { + case COL_RED: dstr = xmh_item(hinfo, XMH_DELAYRED); result = defaultreddelay; break; + case COL_YELLOW: dstr = xmh_item(hinfo, XMH_DELAYYELLOW); result = defaultyellowdelay; break; + default: break; + } + + if (!dstr) return result; + + /* Check "DELAYRED=cpu:10,disk:30,ssh:20" - number is in minutes */ + keylen = strlen(testname) + 1; + key = (char *)malloc(keylen + 1); + sprintf(key, "%s:", testname); + + dstr = strdup(dstr); + tok = strtok(dstr, ","); + while (tok && (strncmp(key, tok, keylen) != 0)) tok = strtok(NULL, ","); + if (tok) result = 60*atoi(tok+keylen); /* Convert to seconds */ + + xfree(key); + xfree(dstr); + + return result; +} + void handle_status(unsigned char *msg, char *sender, char *hostname, char *testname, char *grouplist, xymond_log_t *log, int newcolor, char *downcause, int modifyonly) { @@ -1181,6 +1217,8 @@ time_t now = getcurrenttime(NULL); int msglen, issummary; enum alertstate_t oldalertstatus, newalertstatus; + int delayval = 0; + void *hinfo = hostinfo(hostname); dbgprintf("->handle_status\n"); @@ -1369,7 +1407,6 @@ * - some multi-homed hosts use a random IP for sending us data. */ if ( (strcmp(log->sender, "xymond") != 0) && (strcmp(sender, "xymond") != 0) ) { - void *hinfo = hostinfo(hostname); if ((xmh_item(hinfo, XMH_FLAG_PULLDATA) == NULL) && (xmh_item(hinfo, XMH_FLAG_MULTIHOMED) == NULL)) { log_multisrc(log, sender); } @@ -1379,6 +1416,53 @@ *(log->sender + sizeof(log->sender) - 1) = '\0'; } + + /* Handle delayed red/yellow */ + switch (newcolor) { + case COL_RED: + if (log->redstart == 0) log->redstart = now; + /* + * Do NOT clear yellowstart. If we changed green->red, then it is already clear. + * When changing yellow->red, we may drop down to yellow again later and then we + * want to count the red time as part of the yellow status. + * But do set yellowstart if it is 0. If we go green->red now, and then later + * red->yellow, we do want it to look as if the yellow began when the red status + * happened. + */ + if (log->yellowstart == 0) log->yellowstart = now; + break; + + case COL_YELLOW: + if (log->yellowstart == 0) log->yellowstart = now; + log->redstart = 0; /* Clear it here, so brief red's from a yellow state does not trigger red */ + break; + + default: + log->yellowstart = log->redstart = 0; + break; + } + + if ((newcolor == COL_RED) && ((delayval = changedelay(hinfo, COL_RED, testname, log->color)) > 0)) { + if ((now - log->redstart) >= delayval) { + /* Time's up - we will go red */ + } + else { + delayval = changedelay(hinfo, COL_YELLOW, testname, log->color); + if ((now - log->redstart) >= delayval) { + /* The yellow delay has been passed, so go yellow */ + newcolor = COL_YELLOW; + } + else { + /* Neither yellow nor red delay passed - keep current color */ + newcolor = log->color; + } + } + } + else if ((newcolor == COL_YELLOW) && ((delayval = changedelay(hinfo, COL_YELLOW, testname, log->color)) > 0)) { + if ((now - log->yellowstart) < delayval) newcolor = log->color; /* Keep current color */ + } + + log->oldcolor = log->color; log->color = newcolor; oldalertstatus = decide_alertstate(log->oldcolor); @@ -4057,6 +4141,7 @@ if (iores >= 0) iores = fprintf(fd, "|%s", msgstr); if (lwalk->ackmsg) msgstr = nlencode(lwalk->ackmsg); else msgstr = ""; if (iores >= 0) iores = fprintf(fd, "|%s", msgstr); + if (iores >= 0) iores = fprintf(fd, "|%d|%d", (int)lwalk->redstart, (int)lwalk->yellowstart); if (iores >= 0) iores = fprintf(fd, "\n"); for (awalk = lwalk->acklist; (awalk && (iores >= 0)); awalk = awalk->next) { @@ -4108,7 +4193,7 @@ char *origin = NULL; xymond_log_t *ltail = NULL; char *originname, *hostname, *testname, *sender, *testflags, *statusmsg, *disablemsg, *ackmsg, *cookie; - time_t logtime, lastchange, validtime, enabletime, acktime, cookieexpires; + time_t logtime, lastchange, validtime, enabletime, acktime, cookieexpires, yellowstart, redstart; int color = COL_GREEN, oldcolor = COL_GREEN; int count = 0; @@ -4124,7 +4209,7 @@ initfgets(fd); while (unlimfgets(inbuf, fd)) { originname = hostname = testname = sender = testflags = statusmsg = disablemsg = ackmsg = cookie = NULL; - logtime = lastchange = validtime = enabletime = acktime = cookieexpires = 0; + logtime = lastchange = validtime = enabletime = acktime = cookieexpires = yellowstart = redstart = 0; err = 0; if ((strncmp(STRBUF(inbuf), "@@XYMONDCHK-V1|.task.|", 22) == 0) || (strncmp(STRBUF(inbuf), "@@HOBBITDCHK-V1|.task.|", 23) == 0)) { @@ -4228,6 +4313,8 @@ case 15: if (strlen(item)) statusmsg = item; else err=1; break; case 16: disablemsg = item; break; case 17: ackmsg = item; break; + case 18: redstart = atoi(item); break; + case 19: yellowstart = atoi(item); break; default: err = 1; } @@ -4304,6 +4391,8 @@ ltail->enabletime = enabletime; if (ltail->enabletime == DISABLED_UNTIL_OK) ltail->validtime = INT_MAX; ltail->acktime = acktime; + ltail->redstart = redstart; + ltail->yellowstart = yellowstart; nldecode(statusmsg); ltail->message = strdup(statusmsg); ltail->msgsz = strlen(statusmsg)+1; @@ -4657,6 +4746,14 @@ char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } + else if (argnmatch(argv[argi], "--delay-red=")) { + char *p = strchr(argv[argi], '='); + defaultreddelay = 60*atoi(p+1); + } + else if (argnmatch(argv[argi], "--delay-yellow=")) { + char *p = strchr(argv[argi], '='); + defaultyellowdelay = 60*atoi(p+1); + } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); Modified: trunk/xymonnet/xymonnet.c =================================================================== --- trunk/xymonnet/xymonnet.c 2011-08-07 15:15:40 UTC (rev 6729) +++ trunk/xymonnet/xymonnet.c 2011-08-07 16:44:34 UTC (rev 6730) @@ -390,6 +390,7 @@ char *p, *routestring = NULL; void *hwalk; testedhost_t *h; + int badtagsused = 0; load_hostnames(xgetenv("HOSTSCFG"), "netinclude", get_fqdn()); if (first_host() == NULL) { @@ -413,7 +414,10 @@ h = init_testedhost(xmh_item(hwalk, XMH_HOSTNAME)); p = xmh_custom_item(hwalk, "badconn:"); - if (p) sscanf(p+strlen("badconn:"), "%d:%d:%d", &h->badconn[0], &h->badconn[1], &h->badconn[2]); + if (p) { + sscanf(p+strlen("badconn:"), "%d:%d:%d", &h->badconn[0], &h->badconn[1], &h->badconn[2]); + badtagsused = 1; + } p = xmh_custom_item(hwalk, "route:"); if (p) h->routerdeps = p + strlen("route:"); @@ -758,6 +762,7 @@ } + badtagsused = 1; badclear = badyellow = badred = 0; inscope = 1; @@ -829,6 +834,10 @@ } + if (badtagsused) { + errprintf("WARNING: The 'bad<TESTNAME>' syntax has been deprecated, please convert to 'delayred' and/or 'delayyellow' tags\n"); + } + return; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <st...@us...> - 2011-08-08 06:10:01
|
Revision: 6731 http://xymon.svn.sourceforge.net/xymon/?rev=6731&view=rev Author: storner Date: 2011-08-08 06:09:54 +0000 (Mon, 08 Aug 2011) Log Message: ----------- xymond: Drop command-line parameters for delayred/delayyellow defaults. Instead, add DELAYRED and DELAYYELLOW settings in xymonserver.cfg that contain the default value of a "delayred"/"delayyellow" setting in hosts.cfg. Modified Paths: -------------- trunk/lib/environ.c trunk/xymond/etcfiles/xymonserver.cfg.DIST trunk/xymond/xymond.c Modified: trunk/lib/environ.c =================================================================== --- trunk/lib/environ.c 2011-08-07 16:44:34 UTC (rev 6730) +++ trunk/lib/environ.c 2011-08-08 06:09:54 UTC (rev 6731) @@ -37,6 +37,8 @@ { "XYMONNETWORK", "" }, { "BBLOCATION", "" }, { "PATH", "/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:"BUILD_HOME"/bin" }, + { "DELAYRED", "" }, + { "DELAYYELLOW", "" }, { "XYMONDPORT", "1984" }, { "XYMSRV", "$XYMONSERVERIP" }, { "XYMSERVERS", "" }, Modified: trunk/xymond/etcfiles/xymonserver.cfg.DIST =================================================================== --- trunk/xymond/etcfiles/xymonserver.cfg.DIST 2011-08-07 16:44:34 UTC (rev 6730) +++ trunk/xymond/etcfiles/xymonserver.cfg.DIST 2011-08-08 06:09:54 UTC (rev 6731) @@ -26,7 +26,11 @@ # You can add these extra settings here: @RUNTIMEDEFS@ +# Default settings for "delayred" and "delayyellow" parameters in hosts.cfg +DELAYRED="" # Format: status:delay[,status:delay - e.g. "cpu:15,disk:30" +DELAYYELLOW="" # Format: status:delay[,status:delay - e.g. "cpu:15,disk:30" + ##### Normally you do not need to modify anything below this point ##### # General settings Modified: trunk/xymond/xymond.c =================================================================== --- trunk/xymond/xymond.c 2011-08-07 16:44:34 UTC (rev 6730) +++ trunk/xymond/xymond.c 2011-08-08 06:09:54 UTC (rev 6731) @@ -182,10 +182,7 @@ int clientsavedisk = 0; /* On disk via the CLICHG channel */ int allow_downloads = 1; -int defaultreddelay = 0; /* Default delay for changing a status to RED */ -int defaultyellowdelay = 0; /* Default delay for changing a status to YELLOW */ - #define NOTALK 0 #define RECEIVING 1 #define RESPONDING 2 @@ -249,6 +246,8 @@ char *ackinfologfn = NULL; FILE *ackinfologfd = NULL; +char *defaultreddelay = NULL, *defaultyellowdelay = NULL; + typedef struct xymond_statistics_t { char *cmd; unsigned long count; @@ -1187,8 +1186,8 @@ if (currcolor == COL_PURPLE) return 0; switch (newcolor) { - case COL_RED: dstr = xmh_item(hinfo, XMH_DELAYRED); result = defaultreddelay; break; - case COL_YELLOW: dstr = xmh_item(hinfo, XMH_DELAYYELLOW); result = defaultyellowdelay; break; + case COL_RED: dstr = xmh_item(hinfo, XMH_DELAYRED); if (!dstr) dstr = defaultreddelay; break; + case COL_YELLOW: dstr = xmh_item(hinfo, XMH_DELAYYELLOW); if (!dstr) dstr = defaultyellowdelay; break; default: break; } @@ -4638,6 +4637,9 @@ gettimeofday(&tv, &tz); srandom(tv.tv_usec); + defaultreddelay = xgetenv("DELAYRED"); if (defaultreddelay && (strlen(defaultreddelay) == 0)) defaultreddelay = NULL; + defaultyellowdelay = xgetenv("DELAYYELLOW"); if (defaultyellowdelay && (strlen(defaultyellowdelay) == 0)) defaultyellowdelay = NULL; + /* Load alert config */ alertcolors = colorset(xgetenv("ALERTCOLORS"), ((1 << COL_GREEN) | (1 << COL_BLUE))); okcolors = colorset(xgetenv("OKCOLORS"), (1 << COL_RED)); @@ -4746,14 +4748,6 @@ char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } - else if (argnmatch(argv[argi], "--delay-red=")) { - char *p = strchr(argv[argi], '='); - defaultreddelay = 60*atoi(p+1); - } - else if (argnmatch(argv[argi], "--delay-yellow=")) { - char *p = strchr(argv[argi], '='); - defaultyellowdelay = 60*atoi(p+1); - } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <st...@us...> - 2011-08-15 12:43:52
|
Revision: 6733 http://xymon.svn.sourceforge.net/xymon/?rev=6733&view=rev Author: storner Date: 2011-08-15 12:43:46 +0000 (Mon, 15 Aug 2011) Log Message: ----------- Host documentation links: Add new HOSTDOCURL setting in xymonserver.cfg to provide printf formatting string for host documentation URL's. Change link-handling code to use HOSTDOCURL, if present. Deprecate the "--doc-url" and "--doc-cgi" options for xymongen - use HOSTDOCURL instead. Modified Paths: -------------- trunk/common/xymonserver.cfg.5 trunk/lib/environ.c trunk/lib/links.c trunk/lib/links.h trunk/xymond/etcfiles/xymonserver.cfg.DIST trunk/xymongen/xymongen.1 Modified: trunk/common/xymonserver.cfg.5 =================================================================== --- trunk/common/xymonserver.cfg.5 2011-08-10 05:47:49 UTC (rev 6732) +++ trunk/common/xymonserver.cfg.5 2011-08-15 12:43:46 UTC (rev 6733) @@ -316,7 +316,18 @@ .I columndoc.sh(1) script to document a column. +.IP HOSTDOCURL +Format string used to build a link to the documentation for a host. +If not set, then Xymon falls back to scanning the XYMONNOTES directory +for files matching the hostname, or the hostname together with a common +filename extension (.php, .html, .doc and so on). If set, this string +becomes a formatting string for the documentation URL. E.g. for the host +"myhost", a setting of HOSTDOCURL="/docs/%s.php" will generate a link to +"/docs/myhost.php". +Default: Not set, so host documentation will be retrieved from the +XYMONNOTES directory. + .SH SETTINGS FOR SENDING MESSAGES TO XYMON .IP XYMSRV The IP-address used to contact the Modified: trunk/lib/environ.c =================================================================== --- trunk/lib/environ.c 2011-08-10 05:47:49 UTC (rev 6732) +++ trunk/lib/environ.c 2011-08-15 12:43:46 UTC (rev 6733) @@ -113,6 +113,7 @@ { "RRDHEIGHT", "120" }, { "RRDWIDTH", "576" }, { "COLUMNDOCURL", "$CGIBINURL/columndoc.sh?%s" }, + { "HOSTDOCURL", "" }, { "XYMONLOGO", "Xymon" }, { "XYMONPAGELOCAL", "<B><I>Pages Hosted Locally</I></B>" }, { "XYMONPAGEREMOTE", "<B><I>Remote Status Display</I></B>" }, Modified: trunk/lib/links.c =================================================================== --- trunk/lib/links.c 2011-08-10 05:47:49 UTC (rev 6732) +++ trunk/lib/links.c 2011-08-15 12:43:46 UTC (rev 6733) @@ -35,6 +35,7 @@ static char *notesskin = NULL; static char *helpskin = NULL; static char *columndocurl = NULL; +static char *hostdocurl = NULL; char *link_docext(char *fn) { @@ -118,6 +119,7 @@ if (notesskin) { xfree(notesskin); notesskin = NULL; } if (helpskin) { xfree(helpskin); helpskin = NULL; } if (columndocurl) { xfree(columndocurl); columndocurl = NULL; } + if (hostdocurl) { xfree(hostdocurl); hostdocurl = NULL; } if (xgetenv("XYMONNOTESSKIN")) notesskin = strdup(xgetenv("XYMONNOTESSKIN")); else { @@ -132,11 +134,15 @@ } if (xgetenv("COLUMNDOCURL")) columndocurl = strdup(xgetenv("COLUMNDOCURL")); + if (xgetenv("HOSTDOCURL")) hostdocurl = strdup(xgetenv("HOSTDOCURL")); - strcpy(dirname, xgetenv("XYMONNOTESDIR")); - load_links(dirname, notesskin); + if (!hostdocurl || (strlen(hostdocurl) == 0)) { + strcpy(dirname, xgetenv("XYMONNOTESDIR")); + load_links(dirname, notesskin); + } /* Change xxx/xxx/xxx/notes into xxx/xxx/xxx/help */ + strcpy(dirname, xgetenv("XYMONNOTESDIR")); p = strrchr(dirname, '/'); *p = '\0'; strcat(dirname, "/help"); load_links(dirname, helpskin); @@ -189,24 +195,19 @@ if (linkurl == NULL) linkurl = (char *)malloc(PATH_MAX); if (!linksloaded) load_all_links(); - link = find_link(hostname); - - if (link) { - sprintf(linkurl, "%s/%s", link->urlprefix, link->filename); + if (hostdocurl && *hostdocurl) { + snprintf(linkurl, PATH_MAX-1, hostdocurl, hostname); return linkurl; } + else { + link = find_link(hostname); + if (link) { + sprintf(linkurl, "%s/%s", link->urlprefix, link->filename); + return linkurl; + } + } + return NULL; } -char *hostlink_filename(char *hostname) -{ - link_t *link; - - if (!linksloaded) load_all_links(); - - link = find_link(hostname); - - return (link ? link->filename : NULL); -} - Modified: trunk/lib/links.h =================================================================== --- trunk/lib/links.h 2011-08-10 05:47:49 UTC (rev 6732) +++ trunk/lib/links.h 2011-08-15 12:43:46 UTC (rev 6733) @@ -15,6 +15,5 @@ extern void load_all_links(void); extern char *columnlink(char *colname); extern char *hostlink(char *hostname); -extern char *hostlink_filename(char *hostname); #endif Modified: trunk/xymond/etcfiles/xymonserver.cfg.DIST =================================================================== --- trunk/xymond/etcfiles/xymonserver.cfg.DIST 2011-08-10 05:47:49 UTC (rev 6732) +++ trunk/xymond/etcfiles/xymonserver.cfg.DIST 2011-08-15 12:43:46 UTC (rev 6733) @@ -157,7 +157,13 @@ DOTHEIGHT="16" # Height (in pixels) of the color GIF's DOTWIDTH="16" # Width (in pixels) of the color GIF's COLUMNDOCURL="$CGIBINURL/columndoc.sh?%s" # URL formatting string for column-links +# HOSTDOCURL is a formatting string for generating links to host documentation. +# If NOT set, Xymon will scan the "notes" directory for files matching the hostname +# and possibly a filename extension (php, html, doc, asp ...) +# +# HOSTDOCURL="$XYMONNOTESSKIN/%s.html" + # HTML content HTMLCONTENTTYPE="text/html" # You can add charset options here. Modified: trunk/xymongen/xymongen.1 =================================================================== --- trunk/xymongen/xymongen.1 2011-08-10 05:47:49 UTC (rev 6732) +++ trunk/xymongen/xymongen.1 2011-08-15 12:43:46 UTC (rev 6733) @@ -40,17 +40,14 @@ Prints the version number of xymongen .sp .IP "--docurl=URL" -Make hostnames be hyperlinks to documentation, accessed via a common -web page (typically a CGI script or a PHP-driven dynamic page). The URL -parameter is a formatting string with the name of the web page - you can -put a "%s" in it which will be replaced by the hostname being accessed. -E.g. if you use the bb-notes extension from www.deadcat.net, you would -enable this with "--docurl=/xymon/admin/notes.php?host=%s". For the host -www.storner.dk this will result in a link to -"/xymon/admin/notes.php?host=www.storner.dk". +This option is deprecated, use the HOSTDOCURL setting in +.I xymonserver.cfg(5) +instead. .sp .IP "--doccgi=URL" -This option is deprecated; please use --docurl instead. +This option is deprecated, use the HOSTDOCURL setting in +.I xymonserver.cfg(5) +instead. .sp .IP "--doc-window" Causes links to documentation for hosts and services to open in a This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <st...@us...> - 2011-08-19 10:47:39
|
Revision: 6734 http://xymon.svn.sourceforge.net/xymon/?rev=6734&view=rev Author: storner Date: 2011-08-19 10:47:33 +0000 (Fri, 19 Aug 2011) Log Message: ----------- Critical view CGI: Optionally show eventlog (like the "All non-green" page) for the hosts present on the Critical Systems view. Modified Paths: -------------- trunk/web/criticalview.c trunk/xymond/webfiles/critical_footer Modified: trunk/web/criticalview.c =================================================================== --- trunk/web/criticalview.c 2011-08-15 12:43:46 UTC (rev 6733) +++ trunk/web/criticalview.c 2011-08-19 10:47:33 UTC (rev 6734) @@ -30,9 +30,11 @@ } hstatus_t; static RbtHandle rbstate; +static RbtHandle hostsonpage; static time_t oldlimit = 3600; static int critacklevel = 1; static int usetooltips = 0; +static time_t maxage = INT_MAX; void errormsg(char *s) { @@ -67,6 +69,7 @@ now = getcurrenttime(NULL); rbstate = rbtNew(name_compare); + hostsonpage = rbtNew(name_compare); bol = board; while (bol && (*bol)) { @@ -282,6 +285,7 @@ /* New host */ curhost = itm->hostname; print_hoststatus(output, itm, rbcolumns, prio, firsthost); + rbtInsert(hostsonpage, itm->hostname, itm); firsthost = 0; } @@ -290,7 +294,15 @@ } +static int evcount = 0; +static int ev_included(char *hostname) +{ + /* Callback function for filtering eventlog-hosts */ + return (rbtFind(hostsonpage, hostname) == rbtEnd(hostsonpage)) ? 0 : 1; +} + + void generate_critpage(FILE *output, char *hfprefix) { RbtIterator hhandle; @@ -333,13 +345,22 @@ fprintf(output, "%s", xgetenv("XYMONALLOKTEXT")); } + if (evcount > 0) { + /* Include the eventlog */ + do_eventlog(output, evcount, maxage/60, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, + ev_included, + NULL, NULL, NULL, XYMON_COUNT_NONE, XYMON_S_NONE, NULL); + fprintf(output, "<br><br><br>\n"); + } + fprintf(output, "</center>\n"); + headfoot(output, hfprefix, "", "footer", color); } static int maxprio = 3; -static time_t maxage = INT_MAX; static int mincolor = COL_YELLOW; static int wantacked = 0; @@ -365,7 +386,7 @@ { cgidata_t *cgidata = cgi_request(); cgidata_t *cwalk; - int havemaxprio=0, havemaxage=0, havemincolor=0, havewantacked=0; + int havemaxprio=0, havemaxage=0, havemincolor=0, havewantacked=0, haveevcount=0; cwalk = cgidata; while (cwalk) { @@ -393,6 +414,11 @@ wantacked = (strcasecmp(cwalk->value, "yes") == 0); havewantacked = 1; } + else if (strcasecmp(cwalk->name, "EVCOUNT") == 0) { + selectenv(cwalk->name, cwalk->value); + evcount = atoi(cwalk->value); + haveevcount = 1; + } cwalk = cwalk->next; } @@ -401,6 +427,7 @@ if (!havemaxage) selectenv("MAXAGE", "525600"); if (!havemincolor) selectenv("MINCOLOR", "yellow"); if (!havewantacked) selectenv("WANTACKED", "no"); + if (!haveevcount) selectenv("EVCOUNT", "0"); } Modified: trunk/xymond/webfiles/critical_footer =================================================================== --- trunk/xymond/webfiles/critical_footer 2011-08-15 12:43:46 UTC (rev 6733) +++ trunk/xymond/webfiles/critical_footer 2011-08-19 10:47:33 UTC (rev 6734) @@ -5,6 +5,7 @@ <TH>Color</TH> <TH>Age</TH> <TH>Acked</TH> + <TH>Eventlog</TH> <TH> </TH> </TR> <TR> @@ -41,6 +42,14 @@ </SELECT> </TD> <TD ALIGN=CENTER> + <SELECT NAME="EVCOUNT"> + <OPTION VALUE="0" &SELECT_EVCOUNT_0>No eventlog + <OPTION VALUE="10" &SELECT_EVCOUNT_10>Max 10 events + <OPTION VALUE="50" &SELECT_EVCOUNT_50>Max 50 events + <OPTION VALUE="100" &SELECT_EVCOUNT_100>Max 100 events + </SELECT> + </TD> + <TD ALIGN=CENTER> <INPUT TYPE="SUBMIT" NAME="Submit" VALUE="Apply" ALT="Apply filter"> </TD> </TR> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <st...@us...> - 2011-09-03 07:16:07
|
Revision: 6737 http://xymon.svn.sourceforge.net/xymon/?rev=6737&view=rev Author: storner Date: 2011-09-03 07:16:00 +0000 (Sat, 03 Sep 2011) Log Message: ----------- Critical Systems CGI: Enable display of systems from multiple critical-systems configurations on one page. Modified Paths: -------------- trunk/lib/loadcriticalconf.c trunk/web/criticalview.c trunk/web/criticalview.cgi.1 Added Paths: ----------- trunk/xymond/webfiles/critmulti_header trunk/xymond/webfiles/divider_footer trunk/xymond/webfiles/divider_header Modified: trunk/lib/loadcriticalconf.c =================================================================== --- trunk/lib/loadcriticalconf.c 2011-08-19 11:26:58 UTC (rev 6736) +++ trunk/lib/loadcriticalconf.c 2011-09-03 07:16:00 UTC (rev 6737) @@ -69,6 +69,14 @@ fn = defaultfn; } + if (configfn && (strcmp(fn, configfn) != 0)) { + /* Force full reload - it's a different config file */ + if (configfiles) { + stackfclist(&configfiles); + configfiles = NULL; + } + } + if (configfn) xfree(configfn); configfn = strdup(fn); Modified: trunk/web/criticalview.c =================================================================== --- trunk/web/criticalview.c 2011-08-19 11:26:58 UTC (rev 6736) +++ trunk/web/criticalview.c 2011-09-03 07:16:00 UTC (rev 6737) @@ -29,12 +29,14 @@ critconf_t *config; } hstatus_t; -static RbtHandle rbstate; -static RbtHandle hostsonpage; +static RbtHandle *rbstate = NULL; +static RbtHandle *hostsonpage = NULL; +static int treecount = 0; static time_t oldlimit = 3600; static int critacklevel = 1; static int usetooltips = 0; static time_t maxage = INT_MAX; +static time_t pagecolor = COL_GREEN; void errormsg(char *s) { @@ -42,35 +44,62 @@ } -int loadstatus(int maxprio, time_t maxage, int mincolor, int wantacked) +static char *boardmaster = NULL; + +static int getboard(int mincolor) { - int xymondresult; - char *board = NULL; - char *bol, *eol; - time_t now; char msg[1024]; int i; sendreturn_t *sres; + int xymondresult; - 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) { - freesendreturnbuf(sres); - errormsg("Unable to fetch current status\n"); - return 1; + 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; +} + +int loadstatus(int maxprio, time_t maxage, int mincolor, int wantacked) +{ + char *board, *bol, *eol; + time_t now; + + /* + * We leak memory by dup'ing this and not freeing it. + * But we cannot free it, because the tree holding the data + * for later printing contains pointers into this string buffer. + */ + board = strdup(boardmaster); + + now = getcurrenttime(NULL); + treecount++; + if (treecount == 1) { + rbstate = malloc(sizeof(RbtHandle)); + hostsonpage = malloc(sizeof(RbtHandle)); + } else { - board = getsendreturnstr(sres, 1); - freesendreturnbuf(sres); + rbstate = realloc(rbstate, (treecount) * sizeof(RbtHandle)); + hostsonpage = realloc(hostsonpage, (treecount) * sizeof(RbtHandle)); } + rbstate[treecount-1] = rbtNew(name_compare); + hostsonpage[treecount-1] = rbtNew(name_compare); - now = getcurrenttime(NULL); - rbstate = rbtNew(name_compare); - hostsonpage = rbtNew(name_compare); - bol = board; while (bol && (*bol)) { char *endkey; @@ -125,7 +154,7 @@ newitem->key = (char *)malloc(strlen(newitem->hostname) + strlen(newitem->testname) + 2); sprintf(newitem->key, "%s|%s", newitem->hostname, newitem->testname); - status = rbtInsert(rbstate, newitem->key, newitem); + status = rbtInsert(rbstate[treecount-1], newitem->key, newitem); } } } @@ -184,7 +213,7 @@ fprintf(output, "<TR><TD COLSPAN=%d><HR WIDTH=\"100%%\"></TD></TR>\n\n", colcount); } -void print_hoststatus(FILE *output, hstatus_t *itm, RbtHandle columns, int prio, int firsthost) +void print_hoststatus(FILE *output, hstatus_t *itm, RbtHandle statetree, RbtHandle columns, int prio, int firsthost) { void *hinfo; char *dispname, *ip, *key; @@ -221,8 +250,8 @@ colname = (char *)k1; key = (char *)realloc(key, 2 + strlen(itm->hostname) + strlen(colname)); sprintf(key, "%s|%s", itm->hostname, colname); - sthandle = rbtFind(rbstate, key); - if (sthandle == rbtEnd(rbstate)) { + sthandle = rbtFind(statetree, key); + if (sthandle == rbtEnd(statetree)) { fprintf(output, "-"); } else { @@ -230,7 +259,7 @@ char *htmlalttag; char *htmlackstr; - rbtKeyValue(rbstate, sthandle, &k1, &k2); + rbtKeyValue(statetree, sthandle, &k1, &k2); column = (hstatus_t *)k2; if (column->config->priority != prio) fprintf(output, "-"); @@ -265,18 +294,18 @@ } -void print_oneprio(FILE *output, RbtHandle rbstate, RbtHandle rbcolumns, int prio) +void print_oneprio(FILE *output, RbtHandle statetree, RbtHandle hoptree, RbtHandle rbcolumns, int prio) { RbtIterator hhandle; int firsthost = 1; char *curhost = ""; /* Then output each host and their column status */ - for (hhandle = rbtBegin(rbstate); (hhandle != rbtEnd(rbstate)); hhandle = rbtNext(rbstate, hhandle)) { + for (hhandle = rbtBegin(statetree); (hhandle != rbtEnd(statetree)); hhandle = rbtNext(statetree, hhandle)) { void *k1, *k2; hstatus_t *itm; - rbtKeyValue(rbstate, hhandle, &k1, &k2); + rbtKeyValue(statetree, hhandle, &k1, &k2); itm = (hstatus_t *)k2; if (itm->config->priority != prio) continue; @@ -284,8 +313,8 @@ /* New host */ curhost = itm->hostname; - print_hoststatus(output, itm, rbcolumns, prio, firsthost); - rbtInsert(hostsonpage, itm->hostname, itm); + print_hoststatus(output, itm, statetree, rbcolumns, prio, firsthost); + rbtInsert(hoptree, itm->hostname, itm); firsthost = 0; } @@ -295,46 +324,33 @@ static int evcount = 0; +static RbtHandle evhopfilter; static int ev_included(char *hostname) { /* Callback function for filtering eventlog-hosts */ - return (rbtFind(hostsonpage, hostname) == rbtEnd(hostsonpage)) ? 0 : 1; + return (rbtFind(evhopfilter, hostname) == rbtEnd(evhopfilter)) ? 0 : 1; } -void generate_critpage(FILE *output, char *hfprefix) +void generate_critpage(RbtHandle statetree, RbtHandle hoptree, FILE *output, char *header, char *footer, int color, int maxprio) { RbtIterator hhandle; - int color = COL_GREEN; - int maxprio = 0; - /* Determine background color and max. priority */ - for (hhandle = rbtBegin(rbstate); (hhandle != rbtEnd(rbstate)); hhandle = rbtNext(rbstate, hhandle)) { - void *k1, *k2; - hstatus_t *itm; - - rbtKeyValue(rbstate, hhandle, &k1, &k2); - itm = (hstatus_t *)k2; - - if (itm->color > color) color = itm->color; - if (itm->config->priority > maxprio) maxprio = itm->config->priority; - } - - headfoot(output, hfprefix, "", "header", color); + headfoot(output, header, "", "header", pagecolor); /* Use PAGE color here, not the part color */ fprintf(output, "<center>\n"); if (color != COL_GREEN) { RbtHandle rbcolumns; int prio; - rbcolumns = columnlist(rbstate); + rbcolumns = columnlist(statetree); fprintf(output, "<TABLE BORDER=0 CELLPADDING=4 SUMMARY=\"Critical status display\">\n"); print_colheaders(output, rbcolumns); for (prio = 1; (prio <= maxprio); prio++) { - print_oneprio(output, rbstate, rbcolumns, prio); + print_oneprio(output, statetree, hoptree, rbcolumns, prio); } fprintf(output, "</TABLE>\n"); @@ -347,6 +363,7 @@ if (evcount > 0) { /* Include the eventlog */ + evhopfilter = hoptree; do_eventlog(output, evcount, maxage/60, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ev_included, @@ -356,7 +373,7 @@ fprintf(output, "</center>\n"); - headfoot(output, hfprefix, "", "footer", color); + headfoot(output, footer, "", "footer", color); } @@ -435,9 +452,12 @@ { int argi; char *envarea = NULL; - char *critconfig = 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], '='); @@ -459,7 +479,11 @@ } else if (argnmatch(argv[argi], "--config=")) { char *p = strchr(argv[argi], '='); - critconfig = strdup(p+1); + + 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], '='); @@ -473,13 +497,67 @@ 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); + use_recentgifs = 1; + + if (getboard(mincolor) == 0) { + int i; + char *oneconfig, *onename; + int *partcolor, *partprio; + RbtIterator 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 = rbtBegin(rbstate[i]); (hhandle != rbtEnd(rbstate[i])); hhandle = rbtNext(rbstate[i], hhandle)) { + void *k1, *k2; + hstatus_t *itm; + + rbtKeyValue(rbstate[i], hhandle, &k1, &k2); + itm = (hstatus_t *)k2; + + 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" : "critical") : "divider", + (critconfig[i+1] == NULL) ? "critical" : "divider", + partcolor[i], partprio[i]); + } } else { fprintf(stdout, "Cannot load Xymon status\n"); Modified: trunk/web/criticalview.cgi.1 =================================================================== --- trunk/web/criticalview.cgi.1 2011-08-19 11:26:58 UTC (rev 6736) +++ trunk/web/criticalview.cgi.1 2011-09-03 07:16:00 UTC (rev 6737) @@ -50,6 +50,12 @@ Systems information. The default is to load this from $XYMONHOME/etc/critical.cfg +.IP "--config=ID:FILENAME +Allows the use of multiple Critical Systems configuration files +on a single webpage. "ID" is a text that will be shown on the web +page prior to the critical systems from FILENAME. This option can be +repeated to include critical systems from multiple configurations. + .SH "ENVIRONMENT VARIABLES" .IP XYMONHOME Used to locate the template files for the generated web pages. Added: trunk/xymond/webfiles/critmulti_header =================================================================== --- trunk/xymond/webfiles/critmulti_header (rev 0) +++ trunk/xymond/webfiles/critmulti_header 2011-09-03 07:16:00 UTC (rev 6737) @@ -0,0 +1,47 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> +<HTML> +<HEAD> +<META HTTP-EQUIV="REFRESH" CONTENT="60"> +<META HTTP-EQUIV="EXPIRES" CONTENT="Sat, 01 Jan 2001 00:00:00 GMT"> +<TITLE>&XYMWEBBACKGROUND : Xymon - Status @ &XYMWEBDATE</TITLE> + +<!-- Styles for the Xymon body --> +<link rel="stylesheet" type="text/css" href="&XYMONBODYCSS"> + +<!-- Styles for the menu bar --> +<link rel="stylesheet" type="text/css" href="&XYMONBODYMENUCSS"> + +<!-- The favicon image --> +<link rel="shortcut icon" href="&XYMONSKIN/favicon-&XYMWEBBACKGROUND.ico"> + +</HEAD> + +<BODY class="&XYMWEBBACKGROUND"> + +&XYMONBODYHEADER + +<TABLE SUMMARY="Topline" WIDTH="100%"> +<TR><TD HEIGHT=16> </TD></TR> <!-- For the menu bar --> +<TR> + <TD VALIGN=MIDDLE ALIGN=LEFT WIDTH="30%"> + <FONT FACE="Arial, Helvetica" SIZE="+1" COLOR="silver"><B>&XYMONLOGO</B></FONT> + </TD> + <TD VALIGN=MIDDLE ALIGN=CENTER WIDTH="40%"> + <CENTER><FONT FACE="Arial, Helvetica" SIZE="+1" COLOR="silver"><B>Current Critical Systems</B></FONT></CENTER> + </TD> + <TD VALIGN=MIDDLE ALIGN=RIGHT WIDTH="30%"> + <FONT FACE="Arial, Helvetica" SIZE="+1" COLOR="silver"><B>&XYMWEBDATE</B></FONT> + </TD> +</TR> +</TABLE> +<BR> + +<table width="100%"><tr> +<td width="10%"> </td> +<td width="35%"><hr></td> +<td width="10%" align=center> + <FONT FACE="Arial, Helvetica" SIZE="+1" COLOR="silver"><B>&DIVIDERTEXT</B></FONT> +</td> +<td width="35%"><hr></td> +<td width="10%"> </td> +</table> Added: trunk/xymond/webfiles/divider_footer =================================================================== --- trunk/xymond/webfiles/divider_footer (rev 0) +++ trunk/xymond/webfiles/divider_footer 2011-09-03 07:16:00 UTC (rev 6737) @@ -0,0 +1,3 @@ +<br> +<br> + Added: trunk/xymond/webfiles/divider_header =================================================================== --- trunk/xymond/webfiles/divider_header (rev 0) +++ trunk/xymond/webfiles/divider_header 2011-09-03 07:16:00 UTC (rev 6737) @@ -0,0 +1,9 @@ +<table width="100%"><tr> +<td width="10%"> </td> +<td width="35%"><hr></td> +<td width="10%" align=center> + <FONT FACE="Arial, Helvetica" SIZE="+1" COLOR="silver"><B>&DIVIDERTEXT</B></FONT> +</td> +<td width="35%"><hr></td> +<td width="10%"> </td> +</table> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <st...@us...> - 2011-09-03 13:57:47
|
Revision: 6739 http://xymon.svn.sourceforge.net/xymon/?rev=6739&view=rev Author: storner Date: 2011-09-03 13:57:39 +0000 (Sat, 03 Sep 2011) Log Message: ----------- xymond: Revert rev 6699, drop libredblack library since it is not stable when doing deletes. Revision Links: -------------- http://xymon.svn.sourceforge.net/xymon/?rev=6699&view=rev Modified Paths: -------------- trunk/build/Makefile.rules trunk/lib/Makefile trunk/xymond/Makefile trunk/xymond/xymond.c Removed Paths: ------------- trunk/lib/libredblack-1.3.tar.gz Modified: trunk/build/Makefile.rules =================================================================== --- trunk/build/Makefile.rules 2011-09-03 07:18:10 UTC (rev 6738) +++ trunk/build/Makefile.rules 2011-09-03 13:57:39 UTC (rev 6739) @@ -126,13 +126,11 @@ ##################### distclean: allclean rm -f Makefile - rm -rf lib/libredblack rm -rf xymonnet/c-ares rm -rf debbuild rpmbuild allclean: clean (cd xymonnet/c-ares && $(MAKE) clean) || true - (cd lib/libredblack && $(MAKE) clean) || true clean: $(MAKE) -C build clean Modified: trunk/lib/Makefile =================================================================== --- trunk/lib/Makefile 2011-09-03 07:18:10 UTC (rev 6738) +++ trunk/lib/Makefile 2011-09-03 13:57:39 UTC (rev 6739) @@ -11,48 +11,21 @@ CFLAGS += -I. -I../include -all: test-endianness libxymon.a libredblack.a redblack.h xymonclient.a loadhosts stackio availability md5 sha1 rmd160 locator +all: test-endianness libxymon.a xymonclient.a loadhosts stackio availability md5 sha1 rmd160 locator client: test-endianness xymonclient.a test-endianness: test-endianness.c $(CC) $(CFLAGS) -o $@ $< -libxymon.a: redblack.h $(XYMONLIBOBJS) +libxymon.a: $(XYMONLIBOBJS) ar cr libxymon.a $(XYMONLIBOBJS) ranlib libxymon.a || echo "" -xymonclient.a: redblack.h $(CLIENTLIBOBJS) +xymonclient.a: $(CLIENTLIBOBJS) ar cr xymonclient.a $(CLIENTLIBOBJS) ranlib xymonclient.a || echo "" -libredblack.a: libredblack/.libs/libredblack.a - cp libredblack/.libs/libredblack.a . - -redblack.h: libredblack/.libs/libredblack.a -# The redblack.h header-file declares all data returned from the lookup-functions as "const". -# Which doesn't make sense, since it points to data that I have put into the tree, and can -# therefore modify as I see fit. So to avoid gcc puking all over the place, fix these defs. - cat libredblack/redblack.h | sed \ - -e 's!^RB_STATIC const RB_ENTRY(data_t) \*RB_ENTRY(find)!RB_STATIC RB_ENTRY(data_t) *RB_ENTRY(find)!' \ - -e 's!^RB_STATIC const RB_ENTRY(data_t) \*RB_ENTRY(lookup)!RB_STATIC RB_ENTRY(data_t) *RB_ENTRY(lookup)!' \ - -e 's!^RB_STATIC const RB_ENTRY(data_t) \*RB_ENTRY(search)!RB_STATIC RB_ENTRY(data_t) *RB_ENTRY(search)!' \ - -e 's!^RB_STATIC const RB_ENTRY(data_t) \*RB_ENTRY(delete)!RB_STATIC RB_ENTRY(data_t) *RB_ENTRY(delete)!' \ - -e 's!^RB_STATIC const RB_ENTRY(data_t) \*RB_ENTRY(readlist)!RB_STATIC RB_ENTRY(data_t) *RB_ENTRY(readlist)!' >redblack.h - - -libredblack/.libs/libredblack.a: libredblack/Makefile - (cd libredblack && $(MAKE)) - -libredblack/Makefile: libredblack/configure - (cd libredblack && CFLAGS="$(CFLAGS)" ./configure --disable-shared --without-rbgen) - -libredblack/configure: libredblack-1.3.tar.gz - gzip -dc $< | tar xf - - mv libredblack-1.3 libredblack - # Must touch "configure", or it will trigger a rebuild because it is older than the tar.gz file. - touch libredblack/configure - loadhosts.o: loadhosts.c loadhosts_file.c $(CC) $(CFLAGS) -c -o $@ loadhosts.c @@ -111,8 +84,5 @@ $(CC) $(CFLAGS) -DSTANDALONE -o $@ locator.c ./libxymon.a $(NETLIBS) $(LIBRTDEF) clean: - rm -f *.o *.a redblack.h *~ loadhosts stackio availability test-endianness md5 sha1 rmd160 locator + rm -f *.o *.a *~ loadhosts stackio availability test-endianness md5 sha1 rmd160 locator -distclean: clean - rm -rf libredblack - Deleted: trunk/lib/libredblack-1.3.tar.gz =================================================================== (Binary files differ) Modified: trunk/xymond/Makefile =================================================================== --- trunk/xymond/Makefile 2011-09-03 07:18:10 UTC (rev 6738) +++ trunk/xymond/Makefile 2011-09-03 13:57:39 UTC (rev 6739) @@ -1,7 +1,7 @@ PROGRAMS = xymon.sh xymond xymond_channel xymond_locator xymond_filestore xymond_history xymond_alert xymond_rrd xymond_sample xymond_client xymond_hostdata xymond_capture xymonfetch xymon-mailack trimhistory combostatus xymonreports.sh moverrd.sh convertnk rrdcachectl CLIENTPROGRAMS = ../client/xymond_client -LIBOBJS = ../lib/libxymon.a ../lib/libredblack.a +LIBOBJS = ../lib/libxymon.a XYMONDOBJS = xymond.o xymond_buffer.o xymond_ipc.o CHANNELOBJS = xymond_channel.o xymond_buffer.o xymond_ipc.o Modified: trunk/xymond/xymond.c =================================================================== --- trunk/xymond/xymond.c 2011-09-03 07:18:10 UTC (rev 6738) +++ trunk/xymond/xymond.c 2011-09-03 13:57:39 UTC (rev 6739) @@ -109,11 +109,6 @@ struct modifier_t *next; } modifier_t; -typedef struct cookie_t { - char *id; - void *log; -} cookie_t; - /* This holds all information about a single status */ typedef struct xymond_log_t { struct xymond_hostlist_t *host; @@ -132,7 +127,7 @@ unsigned char *message; int msgsz; unsigned char *dismsg, *ackmsg; - struct cookie_t *cookie; + char *cookie; time_t cookieexpires; struct xymond_meta_t *metas; struct modifier_t *modifiers; @@ -165,11 +160,11 @@ unsigned char *fdata; } filecache_t; -struct rbtree *rbhosts; /* The hosts we have reports from */ -struct rbtree *rbtests; /* The tests (columns) we have seen */ -struct rbtree *rborigins; /* The origins we have seen */ -struct rbtree *rbcookies; /* The cookies we use */ -struct rbtree *rbfilecache; +RbtHandle rbhosts; /* The hosts we have reports from */ +RbtHandle rbtests; /* The tests (columns) we have seen */ +RbtHandle rborigins; /* The origins we have seen */ +RbtHandle rbcookies; /* The cookies we use */ +RbtHandle rbfilecache; sender_t *maintsenders = NULL; sender_t *statussenders = NULL; @@ -227,14 +222,14 @@ char *sender; time_t tstamp, matchtime; } ghostlist_t; -struct rbtree *rbghosts; +RbtHandle rbghosts; typedef struct multisrclist_t { char *id; char *senders[2]; time_t tstamp; } multisrclist_t; -struct rbtree *rbmultisrc; +RbtHandle rbmultisrc; enum ghosthandling_t ghosthandling = GH_LOG; @@ -369,12 +364,10 @@ int i, clients; char bootuptxt[40]; char uptimetxt[40]; + RbtIterator ghandle; time_t uptime = (nowtimer - boottimer); time_t boottstamp = (now - uptime); char msgline[2048]; - RBLIST *treelist; - ghostlist_t *gwalk; - multisrclist_t *mwalk; dbgprintf("-> generate_stats\n"); @@ -440,27 +433,27 @@ sprintf(msgline, "clichg channel messages: %10ld (%d readers)\n", clichgchn->msgcount, clients); addtobuffer(statsbuf, msgline); - treelist = rbopenlist(rbghosts); - gwalk = rbreadlist(treelist); - if (gwalk) addtobuffer(statsbuf, "\n\nGhost reports:\n"); - for (; (gwalk); gwalk = rbreadlist(treelist)) { + ghandle = rbtBegin(rbghosts); + if (ghandle != rbtEnd(rbghosts)) addtobuffer(statsbuf, "\n\nGhost reports:\n"); + for (; (ghandle != rbtEnd(rbghosts)); ghandle = rbtNext(rbghosts, ghandle)) { + ghostlist_t *gwalk = (ghostlist_t *)gettreeitem(rbghosts, ghandle); + /* Skip records older than 10 minutes */ if (gwalk->tstamp < (nowtimer - 600)) continue; sprintf(msgline, " %-15s reported host %s\n", gwalk->sender, gwalk->name); addtobuffer(statsbuf, msgline); } - rbcloselist(treelist); - treelist = rbopenlist(rbmultisrc); - mwalk = rbreadlist(treelist); - if (mwalk) addtobuffer(statsbuf, "\n\nMulti-source statuses\n"); - for (; (mwalk); mwalk = rbreadlist(treelist)) { + ghandle = rbtBegin(rbmultisrc); + if (ghandle != rbtEnd(rbmultisrc)) addtobuffer(statsbuf, "\n\nMulti-source statuses\n"); + for (; (ghandle != rbtEnd(rbmultisrc)); ghandle = rbtNext(rbmultisrc, ghandle)) { + multisrclist_t *mwalk = (multisrclist_t *)gettreeitem(rbmultisrc, ghandle); + /* Skip records older than 10 minutes */ if (mwalk->tstamp < (nowtimer - 600)) continue; sprintf(msgline, " %-25s reported by %s and %s\n", mwalk->id, mwalk->senders[0], mwalk->senders[1]); addtobuffer(statsbuf, msgline); } - rbcloselist(treelist); if (errbuf) { addtobuffer(statsbuf, "\n\nLatest error messages:\n"); @@ -507,28 +500,28 @@ xymond_hostlist_t *create_hostlist_t(char *hostname, char *ip) { - xymond_hostlist_t *hitem, *res; + xymond_hostlist_t *hitem; hitem = (xymond_hostlist_t *) calloc(1, sizeof(xymond_hostlist_t)); hitem->hostname = strdup(hostname); strcpy(hitem->ip, ip); if (strcmp(hostname, "summary") == 0) hitem->hosttype = H_SUMMARY; else hitem->hosttype = H_NORMAL; - res = rbsearch((void *)hitem, rbhosts); + rbtInsert(rbhosts, hitem->hostname, hitem); - return res; + return hitem; } testinfo_t *create_testinfo(char *name) { - testinfo_t *newrec, *res; + testinfo_t *newrec; newrec = (testinfo_t *)calloc(1, sizeof(testinfo_t)); newrec->name = strdup(name); newrec->clientsave = clientsavedisk; - res = rbsearch((void *)newrec, rbtests); + rbtInsert(rbtests, newrec->name, newrec); - return res; + return newrec; } void posttochannel(xymond_channel_t *channel, char *channelmarker, @@ -762,7 +755,9 @@ sender, hostname, log->test->name, log->host->ip, (int) log->validtime, colnames[log->color], colnames[log->oldcolor], (int) log->lastchange[0], - pagepath, (log->cookie ? log->cookie->id : ""), osname, classname, + pagepath, + (log->cookie ? log->cookie : ""), + osname, classname, (log->grouplist ? log->grouplist : "")); if (n < (bufsz-5)) { @@ -860,7 +855,8 @@ char *log_ghost(char *hostname, char *sender, char *msg) { - ghostlist_t *gwalk, gsrec; + RbtIterator ghandle; + ghostlist_t *gwalk; char *result = NULL; time_t nowtimer = gettimer(); @@ -874,8 +870,8 @@ if ((hostname == NULL) || (sender == NULL)) return NULL; - gsrec.name = hostname; - gwalk = rbfind((void *)&gsrec, rbghosts); + ghandle = rbtFind(rbghosts, hostname); + gwalk = (ghandle != rbtEnd(rbghosts)) ? (ghostlist_t *)gettreeitem(rbghosts, ghandle) : NULL; if ((gwalk == NULL) || ((gwalk->matchtime + 600) < nowtimer)) { int found = 0; @@ -909,7 +905,7 @@ gwalk->name = strdup(hostname); gwalk->sender = strdup(sender); gwalk->tstamp = gwalk->matchtime = nowtimer; - rbsearch((void *)gwalk, rbghosts); + rbtInsert(rbghosts, gwalk->name, gwalk); } else { if (gwalk->sender) xfree(gwalk->sender); @@ -931,23 +927,24 @@ void log_multisrc(xymond_log_t *log, char *newsender) { - multisrclist_t *gwalk, gsrec; + RbtIterator ghandle; + multisrclist_t *gwalk; char id[1024]; dbgprintf("-> log_multisrc\n"); snprintf(id, sizeof(id), "%s:%s", log->host->hostname, log->test->name); - gsrec.id = id; - gwalk = rbfind((void *)&gsrec, rbmultisrc); - if (gwalk == NULL) { + ghandle = rbtFind(rbmultisrc, id); + if (ghandle == rbtEnd(rbghosts)) { gwalk = (multisrclist_t *)calloc(1, sizeof(multisrclist_t)); gwalk->id = strdup(id); gwalk->senders[0] = strdup(log->sender); gwalk->senders[1] = strdup(newsender); gwalk->tstamp = gettimer(); - rbsearch((void *)gwalk, rbmultisrc); + rbtInsert(rbmultisrc, gwalk->id, gwalk); } else { + gwalk = (multisrclist_t *)gettreeitem(rbghosts, ghandle); xfree(gwalk->senders[0]); gwalk->senders[0] = strdup(log->sender); xfree(gwalk->senders[1]); gwalk->senders[1] = strdup(newsender); gwalk->tstamp = gettimer(); @@ -958,24 +955,24 @@ xymond_log_t *find_log(char *hostname, char *testname, char *origin, xymond_hostlist_t **host) { - xymond_hostlist_t *hwalk, hsrec; + RbtIterator hosthandle, testhandle, originhandle; + xymond_hostlist_t *hwalk; char *owalk = NULL; - testinfo_t *twalk, tsrec; + testinfo_t *twalk; xymond_log_t *lwalk; *host = NULL; if ((hostname == NULL) || (testname == NULL)) return NULL; - hsrec.hostname = hostname; - hwalk = rbfind((void *)&hsrec, rbhosts); - if (!hwalk) return NULL; else *host = hwalk; + hosthandle = rbtFind(rbhosts, hostname); + if (hosthandle != rbtEnd(rbhosts)) *host = hwalk = gettreeitem(rbhosts, hosthandle); else return NULL; - tsrec.name = testname; - twalk = rbfind((void *)&tsrec, rbtests); - if (!twalk) return NULL; + testhandle = rbtFind(rbtests, testname); + if (testhandle != rbtEnd(rbtests)) twalk = gettreeitem(rbtests, testhandle); else return NULL; if (origin) { - owalk = rbfind((void *)origin, rborigins); + originhandle = rbtFind(rborigins, origin); + if (originhandle != rbtEnd(rborigins)) owalk = gettreeitem(rborigins, originhandle); } for (lwalk = hwalk->logs; (lwalk && ((lwalk->test != twalk) || (lwalk->origin != owalk))); lwalk = lwalk->next); @@ -996,8 +993,9 @@ char *firstline, *p; char *hosttest, *hostname, *testname, *colstr, *grp; char hostip[IP_ADDR_STRLEN]; - xymond_hostlist_t *hwalk = NULL, hsrec; - testinfo_t *twalk = NULL, tsrec; + RbtIterator hosthandle, testhandle, originhandle; + xymond_hostlist_t *hwalk = NULL; + testinfo_t *twalk = NULL; char *owalk = NULL; xymond_log_t *lwalk = NULL; @@ -1063,10 +1061,11 @@ hostname = knownname; } - hsrec.hostname = hostname; - hwalk = rbfind((void *)&hsrec, rbhosts); + hosthandle = rbtFind(rbhosts, hostname); + if (hosthandle == rbtEnd(rbhosts)) hwalk = NULL; + else hwalk = gettreeitem(rbhosts, hosthandle); - if (createhost && !hwalk) { + if (createhost && (hosthandle == rbtEnd(rbhosts))) { hwalk = create_hostlist_t(hostname, hostip); hostcount++; } @@ -1077,8 +1076,8 @@ return; } - tsrec.name = testname; - twalk = rbfind((void *)&tsrec, rbtests); + testhandle = rbtFind(rbtests, testname); + if (testhandle != rbtEnd(rbtests)) twalk = gettreeitem(rbtests, testhandle); if (createlog && (twalk == NULL)) twalk = create_testinfo(testname); } else { @@ -1086,10 +1085,11 @@ } if (origin) { - owalk = rbfind((void *)origin, rborigins); + originhandle = rbtFind(rborigins, origin); + if (originhandle != rbtEnd(rborigins)) owalk = gettreeitem(rborigins, originhandle); if (createlog && (owalk == NULL)) { owalk = strdup(origin); - rbsearch((void *)owalk, rborigins); + rbtInsert(rborigins, owalk, owalk); } } @@ -1102,7 +1102,6 @@ lwalk->host = hwalk; lwalk->test = twalk; lwalk->origin = owalk; - lwalk->cookie = NULL; lwalk->next = hwalk->logs; hwalk->logs = lwalk; if (strcmp(testname, xgetenv("PINGCOLUMN")) == 0) hwalk->pinglog = lwalk; @@ -1138,21 +1137,38 @@ } +void clear_cookie(xymond_log_t *log) +{ + RbtIterator cookiehandle; + + if (!log->cookie) return; + + cookiehandle = rbtFind(rbcookies, log->cookie); + if (cookiehandle == rbtEnd(rbcookies)) return; + rbtErase(rbcookies, cookiehandle); + + xfree(log->cookie); + log->cookie = NULL; log->cookieexpires = 0; +} + + xymond_log_t *find_cookie(char *cookie) { /* * Find a cookie we have issued. */ - cookie_t *cwalk, csrec; xymond_log_t *result = NULL; + RbtIterator cookiehandle; dbgprintf("-> find_cookie\n"); - csrec.id = cookie; - cwalk = rbfind((void *)&csrec, rbcookies); - if (cwalk) { - result = (xymond_log_t *)cwalk->log; - if (result->cookieexpires <= getcurrenttime(NULL)) result = NULL; + cookiehandle = rbtFind(rbcookies, cookie); + if (cookiehandle != rbtEnd(rbcookies)) { + result = gettreeitem(rbcookies, cookiehandle); + if (result->cookieexpires <= getcurrenttime(NULL)) { + clear_cookie(result); + result = NULL; + } } dbgprintf("<- find_cookie\n"); @@ -1160,23 +1176,7 @@ return result; } -void clear_cookie(xymond_log_t *log) -{ - cookie_t csrec, *oldrec; - if (!log->cookie) return; - - csrec.id = log->cookie->id; - oldrec = rbdelete((void *)&csrec, rbcookies); - if (oldrec) { - xfree(oldrec->id); - xfree(oldrec); - } - - log->cookie = NULL; log->cookieexpires = 0; -} - - static int changedelay(void *hinfo, int newcolor, char *testname, int currcolor) { char *key, *tok, *dstr = NULL; @@ -1536,21 +1536,17 @@ if (log->cookieexpires < now) { int newcookie; char scookie[10]; - cookie_t *newrec; clear_cookie(log); /* Need to ensure that cookies are unique, hence the loop */ - log->cookie = NULL; log->cookieexpires = 0; do { newcookie = (random() % 1000000); sprintf(scookie, "%d", newcookie); } while (find_cookie(scookie)); - newrec = (cookie_t *)calloc(1, sizeof(cookie_t)); - newrec->id = strdup(scookie); - newrec->log = log; - log->cookie = rbsearch((void *)newrec, rbcookies); + log->cookie = strdup(scookie); + rbtInsert(rbcookies, log->cookie, log); /* * This is fundamentally flawed. The cookie should be generated by @@ -1804,8 +1800,9 @@ char *hname = NULL, *tname = NULL; time_t expires = 0; int alltests = 0; - xymond_hostlist_t *hwalk = NULL, hsrec; - testinfo_t *twalk = NULL, tsrec; + RbtIterator hosthandle, testhandle; + xymond_hostlist_t *hwalk = NULL; + testinfo_t *twalk = NULL; xymond_log_t *log; char *p; char hostip[IP_ADDR_STRLEN]; @@ -1864,22 +1861,22 @@ hname = knownhost(hosttest, hostip, ghosthandling); if (hname == NULL) goto done; - hsrec.hostname = hname; - hwalk = rbfind((void *)&hsrec, rbhosts); - if (!hwalk) { + hosthandle = rbtFind(rbhosts, hname); + if (hosthandle == rbtEnd(rbhosts)) { /* Unknown host */ goto done; } + else hwalk = gettreeitem(rbhosts, hosthandle); if (!oksender(maintsenders, hwalk->ip, msg->addr.sin_addr, msg->buf)) goto done; if (tname) { - tsrec.name = tname; - twalk = rbfind((void *)&tsrec, rbtests); - if (!twalk) { + testhandle = rbtFind(rbtests, tname); + if (testhandle == rbtEnd(rbtests)) { /* Unknown test */ goto done; } + else twalk = gettreeitem(rbtests, testhandle); } if (enabled) { @@ -2080,6 +2077,7 @@ { char *chnbuf, *theclass; int msglen, buflen = 0; + RbtIterator hosthandle; clientmsg_list_t *cwalk, *chead, *ctail, *czombie; dbgprintf("->handle_client\n"); @@ -2092,11 +2090,11 @@ buflen += 6; if (clientsavemem) { - xymond_hostlist_t *hwalk, hsrec; + hosthandle = rbtFind(rbhosts, hostname); + if (hosthandle != rbtEnd(rbhosts)) { + xymond_hostlist_t *hwalk; + hwalk = gettreeitem(rbhosts, hosthandle); - hsrec.hostname = hostname; - hwalk = rbfind((void *)&hsrec, rbhosts); - if (hwalk) { for (cwalk = hwalk->clientmsgs; (cwalk && strcmp(cwalk->collectorid, collectorid)); cwalk = cwalk->next) ; if (cwalk) { if (strlen(cwalk->msg) >= msglen) @@ -2244,8 +2242,9 @@ void handle_dropnrename(enum droprencmd_t cmd, char *sender, char *hostname, char *n1, char *n2) { char hostip[IP_ADDR_STRLEN]; - xymond_hostlist_t *hwalk, hsrec; - testinfo_t *twalk, *newt, tsrec; + RbtIterator hosthandle, testhandle; + xymond_hostlist_t *hwalk; + testinfo_t *twalk, *newt; xymond_log_t *lwalk; char *marker = NULL; char *canonhostname; @@ -2311,15 +2310,15 @@ canonhostname = knownhost(hostname, hostip, ghosthandling); if (canonhostname) hostname = canonhostname; - hsrec.hostname = hostname; - hwalk = rbfind((void *)&hsrec, rbhosts); - if (!hwalk) goto done; + hosthandle = rbtFind(rbhosts, hostname); + if (hosthandle == rbtEnd(rbhosts)) goto done; + else hwalk = gettreeitem(rbhosts, hosthandle); switch (cmd) { case CMD_DROPTEST: - tsrec.name = n1; - twalk = rbfind((void *)&tsrec, rbtests); - if (!twalk) goto done; + testhandle = rbtFind(rbtests, n1); + if (testhandle == rbtEnd(rbtests)) goto done; + twalk = gettreeitem(rbtests, testhandle); for (lwalk = hwalk->logs; (lwalk && (lwalk->test != twalk)); lwalk = lwalk->next) ; if (lwalk == NULL) goto done; @@ -2338,7 +2337,7 @@ case CMD_DROPHOST: case CMD_DROPSTATE: /* Unlink the hostlist entry */ - rbdelete((void *)hwalk, rbhosts); + rbtErase(rbhosts, hosthandle); hostcount--; /* Loop through the host logs and free them */ @@ -2364,7 +2363,7 @@ break; case CMD_RENAMEHOST: - rbdelete((void *)hwalk, rbhosts); + rbtErase(rbhosts, hosthandle); if (strlen(hwalk->hostname) <= strlen(n1)) { strcpy(hwalk->hostname, n1); } @@ -2372,24 +2371,26 @@ xfree(hwalk->hostname); hwalk->hostname = strdup(n1); } - hwalk = rbsearch((void *)hwalk, rbhosts); + rbtInsert(rbhosts, hwalk->hostname, hwalk); break; case CMD_RENAMETEST: - tsrec.name = n1; - twalk = rbfind((void *)&tsrec, rbtests); - if (!twalk) goto done; + testhandle = rbtFind(rbtests, n1); + if (testhandle == rbtEnd(rbtests)) goto done; + twalk = gettreeitem(rbtests, testhandle); for (lwalk = hwalk->logs; (lwalk && (lwalk->test != twalk)); lwalk = lwalk->next) ; if (lwalk == NULL) goto done; if (lwalk == hwalk->pinglog) hwalk->pinglog = NULL; - tsrec.name = n2; - newt = rbfind((void *)&tsrec, rbtests); - if (!newt) { + testhandle = rbtFind(rbtests, n2); + if (testhandle == rbtEnd(rbtests)) { newt = create_testinfo(n2); } + else { + newt = gettreeitem(rbtests, testhandle); + } lwalk->test = newt; break; } @@ -2405,12 +2406,14 @@ unsigned char *get_filecache(char *fn, long *len) { - filecache_t *item, srec; + RbtIterator handle; + filecache_t *item; unsigned char *result; - srec.fn = fn; - item = rbfind((void *)&srec, rbfilecache); - if (!item) return NULL; + handle = rbtFind(rbfilecache, fn); + if (handle == rbtEnd(rbfilecache)) return NULL; + + item = (filecache_t *)gettreeitem(rbfilecache, handle); if (item->len < 0) return NULL; result = (unsigned char *)malloc(item->len); @@ -2423,19 +2426,20 @@ void add_filecache(char *fn, unsigned char *buf, off_t buflen) { - filecache_t *newitem, srec; + RbtIterator handle; + filecache_t *newitem; - srec.fn = fn; - newitem = rbfind((void *)&srec, rbfilecache); - if (!newitem) { + handle = rbtFind(rbfilecache, fn); + if (handle == rbtEnd(rbfilecache)) { newitem = (filecache_t *)malloc(sizeof(filecache_t)); newitem->fn = strdup(fn); newitem->len = buflen; newitem->fdata = (unsigned char *)malloc(buflen); memcpy(newitem->fdata, buf, buflen); - rbsearch((void *)newitem, rbfilecache); + rbtInsert(rbfilecache, newitem->fn, newitem); } else { + newitem = (filecache_t *)gettreeitem(rbfilecache, handle); if (newitem->fdata) xfree(newitem->fdata); newitem->len = buflen; newitem->fdata = (unsigned char *)malloc(buflen); @@ -2446,15 +2450,13 @@ void flush_filecache(void) { - RBLIST *flist; - filecache_t *item; + RbtIterator handle; - flist = rbopenlist(rbfilecache); - for (item = rbreadlist(flist); (item); item = rbreadlist(flist)) { + for (handle = rbtBegin(rbfilecache); (handle != rbtEnd(rbfilecache)); handle = rbtNext(rbfilecache, handle)) { + filecache_t *item = (filecache_t *)gettreeitem(rbfilecache, handle); if (item->fdata) xfree(item->fdata); item->len = -1; } - rbcloselist(flist); } @@ -2797,7 +2799,7 @@ case F_ACKTIME: bufp += sprintf(bufp, "%d", (int)lwalk->acktime); break; case F_DISABLETIME: bufp += sprintf(bufp, "%d", (int)lwalk->enabletime); break; case F_SENDER: bufp += sprintf(bufp, "%s", lwalk->sender); break; - case F_COOKIE: bufp += sprintf(bufp, "%s", (lwalk->cookie ? lwalk->cookie->id : "")); break; + case F_COOKIE: bufp += sprintf(bufp, "%s", (lwalk->cookie ? lwalk->cookie : "")); break; case F_LINE1: eoln = strchr(lwalk->message, '\n'); if (eoln) *eoln = '\0'; @@ -3368,8 +3370,8 @@ bufp += sprintf(bufp, " <DisableTime>%s</DisableTime>\n", timestr(log->enabletime)); bufp += sprintf(bufp, " <Sender>%s</Sender>\n", log->sender); - if (log->cookie) - bufp += sprintf(bufp, " <Cookie>%s</Cookie>\n", (log->cookie ? log->cookie->id : "")); + if (log->cookie && (log->cookieexpires > now)) + bufp += sprintf(bufp, " <Cookie>%s</Cookie>\n", log->cookie); else bufp += sprintf(bufp, " <Cookie>N/A</Cookie>\n"); @@ -3400,6 +3402,7 @@ * Request for a summmary of all known status logs * */ + RbtIterator hosthandle; xymond_hostlist_t *hwalk; xymond_log_t *lwalk, *firstlog; xymond_log_t infologrec, rrdlogrec; @@ -3412,7 +3415,6 @@ char *fields = NULL; int scolor = -1, acklevel = -1; static unsigned int lastboardsize = 0; - RBLIST *treelist; if (!oksender(wwwsenders, NULL, msg->addr.sin_addr, msg->buf)) goto done; @@ -3447,8 +3449,13 @@ infologrec.message = rrdlogrec.message = ""; infologrec.lastchange = rrdlogrec.lastchange = dummytimes; - treelist = rbopenlist(rbhosts); - for (hwalk = rbreadlist(treelist); (hwalk); hwalk = rbreadlist(treelist)) { + for (hosthandle = rbtBegin(rbhosts); (hosthandle != rbtEnd(rbhosts)); hosthandle = rbtNext(rbhosts, hosthandle)) { + hwalk = gettreeitem(rbhosts, hosthandle); + if (!hwalk) { + errprintf("host-tree has a record with no data\n"); + continue; + } + /* If there is a hostname filter, drop the "summary" 'hosts' */ if (shost && (hwalk->hosttype != H_NORMAL)) continue; @@ -3490,7 +3497,6 @@ generate_outbuf(&buf, &bufp, &bufsz, hwalk, lwalk, acklevel); } } - rbcloselist(treelist); *bufp = '\0'; xfree(msg->buf); @@ -3507,6 +3513,7 @@ * Request for a summmary of all known status logs in XML format * */ + RbtIterator hosthandle; xymond_hostlist_t *hwalk; xymond_log_t *lwalk; char *buf, *bufp; @@ -3516,7 +3523,6 @@ char *fields = NULL; int scolor = -1, acklevel = -1; static unsigned int lastboardsize = 0; - RBLIST *treelist; if (!oksender(wwwsenders, NULL, msg->addr.sin_addr, msg->buf)) goto done; @@ -3538,8 +3544,13 @@ bufp += sprintf(bufp, "<?xml version='1.0' encoding='ISO-8859-1'?>\n"); bufp += sprintf(bufp, "<StatusBoard>\n"); - treelist = rbopenlist(rbhosts); - for (hwalk = rbreadlist(treelist); (hwalk); hwalk = rbreadlist(treelist)) { + for (hosthandle = rbtBegin(rbhosts); (hosthandle != rbtEnd(rbhosts)); hosthandle = rbtNext(rbhosts, hosthandle)) { + hwalk = gettreeitem(rbhosts, hosthandle); + if (!hwalk) { + errprintf("host-tree has a record with no data\n"); + continue; + } + /* If there is a hostname filter, drop the "summary" 'hosts' */ if (shost && (hwalk->hosttype != H_NORMAL)) continue; @@ -3588,8 +3599,8 @@ bufp += sprintf(bufp, " <DisableTime>%s</DisableTime>\n", timestr(lwalk->enabletime)); bufp += sprintf(bufp, " <Sender>%s</Sender>\n", lwalk->sender); - if (lwalk->cookie) - bufp += sprintf(bufp, " <Cookie>%s</Cookie>\n", (lwalk->cookie ? lwalk->cookie->id : "")); + if (lwalk->cookie && (lwalk->cookieexpires > now)) + bufp += sprintf(bufp, " <Cookie>%s</Cookie>\n", lwalk->cookie); else bufp += sprintf(bufp, " <Cookie>N/A</Cookie>\n"); @@ -3598,7 +3609,6 @@ if (eoln) *eoln = '\n'; } } - rbcloselist(treelist); bufp += sprintf(bufp, "</StatusBoard>\n"); xfree(msg->buf); @@ -3960,17 +3970,18 @@ } else if (strncmp(msg->buf, "clientlog ", 10) == 0) { char *hostname, *p; - xymond_hostlist_t *hwalk, hsrec; - + RbtIterator hosthandle; if (!oksender(wwwsenders, NULL, msg->addr.sin_addr, msg->buf)) goto done; p = msg->buf + strlen("clientlog"); p += strspn(p, "\t "); hostname = p; p += strcspn(p, "\t "); if (*p) { *p = '\0'; p++; } p += strspn(p, "\t "); - hsrec.hostname = hostname; - hwalk = rbfind((void *)&hsrec, rbhosts); - if (hwalk) { + hosthandle = rbtFind(rbhosts, hostname); + if (hosthandle != rbtEnd(rbhosts)) { + xymond_hostlist_t *hwalk; + hwalk = gettreeitem(rbhosts, hosthandle); + if (hwalk->clientmsgs) { char *sections = NULL; char *cmsg = totalclientmsg(hwalk->clientmsgs); @@ -4020,20 +4031,19 @@ } else if (strncmp(msg->buf, "ghostlist", 9) == 0) { if (oksender(wwwsenders, NULL, msg->addr.sin_addr, msg->buf)) { + RbtIterator ghandle; ghostlist_t *gwalk; strbuffer_t *resp; char msgline[1024]; - RBLIST *treelist; resp = newstrbuffer(0); - treelist = rbopenlist(rbghosts); - for (gwalk = rbreadlist(treelist); (gwalk); gwalk = rbreadlist(treelist)) { + for (ghandle = rbtBegin(rbghosts); (ghandle != rbtEnd(rbghosts)); ghandle = rbtNext(rbghosts, ghandle)) { + gwalk = (ghostlist_t *)gettreeitem(rbghosts, ghandle); snprintf(msgline, sizeof(msgline), "%s|%s|%ld\n", gwalk->name, gwalk->sender, (long int)(gwalk->tstamp + timeroffset)); addtobuffer(resp, msgline); } - rbcloselist(treelist); msg->doingwhat = RESPONDING; xfree(msg->buf); @@ -4046,20 +4056,19 @@ else if (strncmp(msg->buf, "multisrclist", 12) == 0) { if (oksender(wwwsenders, NULL, msg->addr.sin_addr, msg->buf)) { + RbtIterator mhandle; multisrclist_t *mwalk; strbuffer_t *resp; char msgline[1024]; - RBLIST *treelist; resp = newstrbuffer(0); - treelist = rbopenlist(rbmultisrc); - for (mwalk = rbreadlist(treelist); (mwalk); mwalk = rbreadlist(treelist)) { + for (mhandle = rbtBegin(rbmultisrc); (mhandle != rbtEnd(rbmultisrc)); mhandle = rbtNext(rbmultisrc, mhandle)) { + mwalk = (multisrclist_t *)gettreeitem(rbmultisrc, mhandle); snprintf(msgline, sizeof(msgline), "%s|%s|%s|%ld\n", mwalk->id, mwalk->senders[0], mwalk->senders[1], (long int)(mwalk->tstamp + timeroffset)); addtobuffer(resp, msgline); } - rbcloselist(treelist); msg->doingwhat = RESPONDING; xfree(msg->buf); @@ -4091,13 +4100,13 @@ { char *tempfn; FILE *fd; + RbtIterator hosthandle; xymond_hostlist_t *hwalk; xymond_log_t *lwalk; time_t now = getcurrenttime(NULL); scheduletask_t *swalk; ackinfo_t *awalk; int iores = 0; - RBLIST *treelist; if (checkpointfn == NULL) return; @@ -4111,10 +4120,11 @@ return; } - treelist = rbopenlist(rbhosts); - for (hwalk = rbreadlist(treelist); (hwalk); hwalk = rbreadlist(treelist)) { + for (hosthandle = rbtBegin(rbhosts); ((hosthandle != rbtEnd(rbhosts)) && (iores >= 0)); hosthandle = rbtNext(rbhosts, hosthandle)) { char *msgstr; + hwalk = gettreeitem(rbhosts, hosthandle); + for (lwalk = hwalk->logs; (lwalk); lwalk = lwalk->next) { if (lwalk->dismsg && (lwalk->enabletime < now) && (lwalk->enabletime != DISABLED_UNTIL_OK)) { xfree(lwalk->dismsg); @@ -4134,7 +4144,7 @@ colnames[lwalk->oldcolor], (int)lwalk->logtime, (int) lwalk->lastchange[0], (int) lwalk->validtime, (int) lwalk->enabletime, (int) lwalk->acktime, - (lwalk->cookie ? lwalk->cookie->id : ""), (int) lwalk->cookieexpires, + (lwalk->cookie ? lwalk->cookie : ""), (int) lwalk->cookieexpires, nlencode(lwalk->message)); if (lwalk->dismsg) msgstr = nlencode(lwalk->dismsg); else msgstr = ""; if (iores >= 0) iores = fprintf(fd, "|%s", msgstr); @@ -4151,7 +4161,6 @@ } } } - rbcloselist(treelist); for (swalk = schedulehead; (swalk && (iores >= 0)); swalk = swalk->next) { iores = fprintf(fd, "@@XYMONDCHK-V1|.task.|%d|%d|%s|%s\n", @@ -4187,8 +4196,9 @@ char *item; int i, err; char hostip[IP_ADDR_STRLEN]; - xymond_hostlist_t *hitem = NULL, hsrec; - testinfo_t *t = NULL, tsrec; + RbtIterator hosthandle, testhandle, originhandle; + xymond_hostlist_t *hitem = NULL; + testinfo_t *t = NULL; char *origin = NULL; xymond_log_t *ltail = NULL; char *originname, *hostname, *testname, *sender, *testflags, *statusmsg, *disablemsg, *ackmsg, *cookie; @@ -4254,12 +4264,12 @@ case 0: break; case 1: break; case 2: - hsrec.hostname = item; - hitem = rbfind((void *)&hsrec, rbhosts); + hosthandle = rbtFind(rbhosts, item); + hitem = gettreeitem(rbhosts, hosthandle); break; case 3: - tsrec.name = item; - t = rbfind((void *)&tsrec, rbtests); + testhandle = rbtFind(rbtests, item); + t = (testhandle == rbtEnd(rbtests)) ? NULL : gettreeitem(rbtests, testhandle); break; case 4: newack->received = atoi(item); break; case 5: newack->validuntil = atoi(item); break; @@ -4344,21 +4354,28 @@ dbgprintf("Status: Host=%s, test=%s\n", hostname, testname); count++; - hsrec.hostname = hostname; - hitem = rbfind((void *)&hsrec, rbhosts); - if (!hitem) { + hosthandle = rbtFind(rbhosts, hostname); + if (hosthandle == rbtEnd(rbhosts)) { /* New host */ hitem = create_hostlist_t(hostname, hostip); hostcount++; } + else { + hitem = gettreeitem(rbhosts, hosthandle); + } - tsrec.name = testname; - t = rbfind((void *)&tsrec, rbtests); - if (!t) { + testhandle = rbtFind(rbtests, testname); + if (testhandle == rbtEnd(rbtests)) { t = create_testinfo(testname); } + else t = gettreeitem(rbtests, testhandle); - origin = rbsearch((void *)originname, rborigins); + originhandle = rbtFind(rborigins, originname); + if (originhandle == rbtEnd(rborigins)) { + origin = strdup(originname); + rbtInsert(rborigins, origin, origin); + } + else origin = gettreeitem(rborigins, originhandle); if (hitem->logs == NULL) { ltail = hitem->logs = (xymond_log_t *) calloc(1, sizeof(xymond_log_t)); @@ -4395,27 +4412,31 @@ nldecode(statusmsg); ltail->message = strdup(statusmsg); ltail->msgsz = strlen(statusmsg)+1; + if (disablemsg && strlen(disablemsg)) { nldecode(disablemsg); ltail->dismsg = strdup(disablemsg); } else ltail->dismsg = NULL; + if (ackmsg && strlen(ackmsg)) { nldecode(ackmsg); ltail->ackmsg = strdup(ackmsg); } else ltail->ackmsg = NULL; - if (cookie && (strlen(cookie) > 0)) { - cookie_t *newrec; - newrec = (cookie_t *)calloc(1, sizeof(cookie_t)); - newrec->id = strdup(cookie); - newrec->log = ltail; - ltail->cookie = rbsearch((void *)newrec, rbcookies); + if (cookie && *cookie) { + ltail->cookie = strdup(cookie); + ltail->cookieexpires = cookieexpires; + rbtInsert(rbcookies, ltail->cookie, ltail); } - ltail->cookieexpires = cookieexpires; + else { + ltail->cookie = NULL; + ltail->cookieexpires = 0; + } + ltail->metas = NULL; ltail->acklist = NULL; ltail->next = NULL; @@ -4431,15 +4452,15 @@ void check_purple_status(void) { + RbtIterator hosthandle; xymond_hostlist_t *hwalk; xymond_log_t *lwalk; - RBLIST *treelist; time_t now = getcurrenttime(NULL); dbgprintf("-> check_purple_status\n"); + for (hosthandle = rbtBegin(rbhosts); (hosthandle != rbtEnd(rbhosts)); hosthandle = rbtNext(rbhosts, hosthandle)) { + hwalk = gettreeitem(rbhosts, hosthandle); - treelist = rbopenlist(rbhosts); - for (hwalk = rbreadlist(treelist); (hwalk); hwalk = rbreadlist(treelist)) { lwalk = hwalk->logs; while (lwalk) { if (lwalk->validtime < now) { @@ -4501,8 +4522,6 @@ } } } - rbcloselist(treelist); - dbgprintf("<- check_purple_status\n"); } @@ -4532,62 +4551,7 @@ } } -int host_compare(const void *r1, const void *r2, const void *c) -{ - xymond_hostlist_t *h1 = (xymond_hostlist_t *)r1; - xymond_hostlist_t *h2 = (xymond_hostlist_t *)r2; - return (strcasecmp(h1->hostname, h2->hostname)); -} - -int test_compare(const void *r1, const void *r2, const void *c) -{ - testinfo_t *t1 = (testinfo_t *)r1; - testinfo_t *t2 = (testinfo_t *)r2; - - return (strcasecmp(t1->name, t2->name)); -} - -int origin_compare(const void *r1, const void *r2, const void *c) -{ - char *o1 = (char *)r1; - char *o2 = (char *)r2; - - return (strcasecmp(o1, o2)); -} - -int cookie_compare(const void *r1, const void *r2, const void *c) -{ - cookie_t *c1 = (cookie_t *)r1; - cookie_t *c2 = (cookie_t *)r2; - - return (strcasecmp(c1->id, c2->id)); -} - -int filecache_compare(const void *r1, const void *r2, const void *c) -{ - filecache_t *f1 = (filecache_t *)r1; - filecache_t *f2 = (filecache_t *)r2; - - return (strcasecmp(f1->fn, f2->fn)); -} - -int ghost_compare(const void *r1, const void *r2, const void *c) -{ - ghostlist_t *g1 = (ghostlist_t *)r1; - ghostlist_t *g2 = (ghostlist_t *)r2; - - return (strcasecmp(g1->name, g2->name)); -} - -int multisrc_compare(const void *r1, const void *r2, const void *c) -{ - multisrclist_t *m1 = (multisrclist_t *)r1; - multisrclist_t *m2 = (multisrclist_t *)r2; - - return (strcasecmp(m1->id, m2->id)); -} - int main(int argc, char *argv[]) { conn_t *connhead = NULL, *conntail=NULL; @@ -4616,13 +4580,13 @@ boottimer = gettimer(); /* Create our trees */ - rbhosts = rbinit(host_compare, NULL); - rbtests = rbinit(test_compare, NULL); - rborigins = rbinit(origin_compare, NULL); - rbcookies = rbinit(cookie_compare, NULL); - rbfilecache = rbinit(filecache_compare, NULL); - rbghosts = rbinit(ghost_compare, NULL); - rbmultisrc = rbinit(multisrc_compare, NULL); + rbhosts = rbtNew(name_compare); + rbtests = rbtNew(name_compare); + rborigins = rbtNew(name_compare); + rbcookies = rbtNew(name_compare); + rbfilecache = rbtNew(name_compare); + rbghosts = rbtNew(name_compare); + rbmultisrc = rbtNew(name_compare); /* For wildcard notify's */ create_testinfo("*"); @@ -5018,28 +4982,32 @@ } if (reloadconfig && hostsfn) { - RBLIST *treelist; - xymond_hostlist_t *hwalk; + RbtIterator hosthandle; reloadconfig = 0; load_hostnames(hostsfn, NULL, get_fqdn()); /* Scan our list of hosts and weed out those we do not know about any more */ - treelist = rbopenlist(rbhosts); - hwalk = rbreadlist(treelist); - while (hwalk) { + hosthandle = rbtBegin(rbhosts); + while (hosthandle != rbtEnd(rbhosts)) { + xymond_hostlist_t *hwalk; + + hwalk = gettreeitem(rbhosts, hosthandle); + if (hwalk->hosttype == H_SUMMARY) { /* Leave the summaries as-is */ + hosthandle = rbtNext(rbhosts, hosthandle); } else if (hostinfo(hwalk->hostname) == NULL) { /* Remove all state info about this host. This will NOT remove files. */ handle_dropnrename(CMD_DROPSTATE, "xymond", hwalk->hostname, NULL, NULL); + + /* Must restart tree-walk after deleting node from the tree */ + hosthandle = rbtBegin(rbhosts); } else { - /* Do nothing */ + hosthandle = rbtNext(rbhosts, hosthandle); } - - hwalk = rbreadlist(treelist); } load_clientconfig(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <st...@us...> - 2011-09-03 14:13:22
|
Revision: 6740 http://xymon.svn.sourceforge.net/xymon/?rev=6740&view=rev Author: storner Date: 2011-09-03 14:13:16 +0000 (Sat, 03 Sep 2011) Log Message: ----------- Library: New tree storage implementation Modified Paths: -------------- trunk/include/libxymon.h trunk/lib/Makefile Added Paths: ----------- trunk/lib/tree.c trunk/lib/tree.h Modified: trunk/include/libxymon.h =================================================================== --- trunk/include/libxymon.h 2011-09-03 13:57:39 UTC (rev 6739) +++ trunk/include/libxymon.h 2011-09-03 14:13:16 UTC (rev 6740) @@ -87,7 +87,6 @@ #include "../lib/netservices.h" #include "../lib/rbtr.h" #include "../lib/readmib.h" -#include "../lib/redblack.h" #include "../lib/rmd160c.h" #include "../lib/sendmsg.h" #include "../lib/sha1.h" @@ -98,6 +97,7 @@ #include "../lib/suid.h" #include "../lib/timefunc.h" #include "../lib/timing.h" +#include "../lib/tree.h" #include "../lib/url.h" #endif Modified: trunk/lib/Makefile =================================================================== --- trunk/lib/Makefile 2011-09-03 13:57:39 UTC (rev 6739) +++ trunk/lib/Makefile 2011-09-03 14:13:16 UTC (rev 6740) @@ -1,9 +1,9 @@ # Xymon library Makefile # -XYMONLIBOBJS = osdefs.o acklog.o availability.o calc.o cgi.o cgiurls.o clientlocal.o color.o crondate.o digest.o encoding.o environ.o errormsg.o eventlog.o files.o headfoot.o xymonrrd.o holidays.o htmllog.o ipaccess.o loadalerts.o loadhosts.o loadcriticalconf.o locator.o links.o matching.o md5.o memory.o misc.o msort.o netservices.o notifylog.o rbtr.o readmib.o reportlog.o rmd160c.o sendmsg.o sha1.o sha2.o sig.o stackio.o strfunc.o suid.o timefunc.o timing.o url.o +XYMONLIBOBJS = osdefs.o acklog.o availability.o calc.o cgi.o cgiurls.o clientlocal.o color.o crondate.o digest.o encoding.o environ.o errormsg.o eventlog.o files.o headfoot.o xymonrrd.o holidays.o htmllog.o ipaccess.o loadalerts.o loadhosts.o loadcriticalconf.o locator.o links.o matching.o md5.o memory.o misc.o msort.o netservices.o notifylog.o rbtr.o readmib.o reportlog.o rmd160c.o sendmsg.o sha1.o sha2.o sig.o stackio.o strfunc.o suid.o timefunc.o timing.o tree.o url.o -CLIENTLIBOBJS = osdefs.o cgiurls.o color-client.o crondate.o digest.o encoding.o environ-client.o errormsg.o holidays.o ipaccess.o loadhosts.o md5.o memory.o misc.o msort.o rbtr.o rmd160c.o sendmsg.o sha1.o sha2.o sig.o stackio.o strfunc.o suid.o timefunc-client.o +CLIENTLIBOBJS = osdefs.o cgiurls.o color-client.o crondate.o digest.o encoding.o environ-client.o errormsg.o holidays.o ipaccess.o loadhosts.o md5.o memory.o misc.o msort.o rbtr.o rmd160c.o sendmsg.o sha1.o sha2.o sig.o stackio.o strfunc.o suid.o timefunc-client.o tree.o ifeq ($(LOCALCLIENT),yes) CLIENTLIBOBJS += matching.o endif Added: trunk/lib/tree.c =================================================================== --- trunk/lib/tree.c (rev 0) +++ trunk/lib/tree.c 2011-09-03 14:13:16 UTC (rev 6740) @@ -0,0 +1,334 @@ +/*----------------------------------------------------------------------------*/ +/* Xymon monitor library. */ +/* */ +/* This is a library module, part of libxymon. */ +/* It contains routines for tree-based record storage. */ +/* */ +/* Copyright (C) 2011-2011 Henrik Storner <he...@st...> */ +/* */ +/* This program is released under the GNU General Public License (GPL), */ +/* version 2. See the file "COPYING" for details. */ +/* */ +/*----------------------------------------------------------------------------*/ + +static char rcsid[] = "$Id: files.c 6712 2011-07-31 21:01:52Z storner $"; + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <ctype.h> + +#include "tree.h" + +typedef struct treerec_t { + char *key; + void *userdata; + int deleted; +} treerec_t; + +typedef struct xtree_t { + treerec_t *entries; + int treesz; + int (*compare)(const char *a, const char *b); +} xtree_t; + +static int binsearch(xtree_t *mytree, char *key) +{ + int uplim, lowlim, n; + + /* Do a binary search */ + lowlim = 0; uplim = mytree->treesz-1; + + do { + int res; + + n = (uplim + lowlim) / 2; + res = mytree->compare(key, mytree->entries[n].key); + + if (res == 0) { + /* Found it! */ + uplim = -1; /* To exit loop */ + } + else if (res > 0) { + /* Higher up */ + lowlim = n+1; + } + else { + /* Further down */ + uplim = n-1; + } + + } while ((uplim >= 0) && (lowlim <= uplim)); + + return n; +} + +void *xtreeNew(int(*xtreeCompare)(const char *a, const char *b)) +{ + xtree_t *newtree = (xtree_t *)calloc(1, sizeof(xtree_t)); + newtree->compare = xtreeCompare; + return newtree; +} + +void xtreeDestroy(void *treehandle) +{ + xtree_t *mytree = (xtree_t *)treehandle; + int i; + + if (treehandle == NULL) return; + + /* Must delete our privately held keys in the deleted records */ + for (i = 0; (i < mytree->treesz); i++) { + if (mytree->entries[i].deleted) free(mytree->entries[i].key); + } + free(mytree->entries); + free(mytree); +} + +int xtreeFind(void *treehandle, char *key) +{ + xtree_t *mytree = (xtree_t *)treehandle; + int n; + + /* Does tree exist ? Is it empty? */ + if ((treehandle == NULL) || (mytree->treesz == 0)) return -1; + + n = binsearch(mytree, key); + if ((n >= 0) && (n < mytree->treesz) && (mytree->entries[n].deleted == 0) && (mytree->compare(key, mytree->entries[n].key) == 0)) + return n; + + return -1; +} + +int xtreeFirst(void *treehandle) +{ + xtree_t *mytree = (xtree_t *)treehandle; + + /* Does tree exist ? Is it empty? */ + if ((treehandle == NULL) || (mytree->treesz == 0)) return -1; + + return 0; +} + +int xtreeNext(void *treehandle, int pos) +{ + xtree_t *mytree = (xtree_t *)treehandle; + + /* Does tree exist ? Is it empty? */ + if ((treehandle == NULL) || (mytree->treesz == 0) || (pos >= (mytree->treesz - 1)) || (pos < 0)) return -1; + + do { + pos++; + } while ((pos < mytree->treesz) && (mytree->entries[pos].deleted != 0)); + + return pos; +} + +char *xtreeKey(void *treehandle, int pos) +{ + xtree_t *mytree = (xtree_t *)treehandle; + + /* Does tree exist ? Is it empty? */ + if ((treehandle == NULL) || (mytree->treesz == 0) || (pos >= mytree->treesz) || (pos < 0)) return NULL; + + return mytree->entries[pos].key; +} + +void *xtreeData(void *treehandle, int pos) +{ + xtree_t *mytree = (xtree_t *)treehandle; + + /* Does tree exist ? Is it empty? */ + if ((treehandle == NULL) || (mytree->treesz == 0) || (pos >= mytree->treesz) || (pos < 0)) return NULL; + + return mytree->entries[pos].userdata; +} + + +xtreeStatus_t xtreeAdd(void *treehandle, char *key, char *userdata) +{ + xtree_t *mytree = (xtree_t *)treehandle; + int n; + + if (treehandle == NULL) return -1; + + if (mytree->treesz == 0) { + /* Empty tree, just add record */ + mytree->entries = (treerec_t *)calloc(1, sizeof(treerec_t)); + mytree->entries[0].key = key; + mytree->entries[0].userdata = userdata; + mytree->entries[0].deleted = 0; + } + else { + n = binsearch(mytree, key); + + if ((n >= 0) && (n < mytree->treesz) && (mytree->compare(key, mytree->entries[n].key) == 0)) { + /* Record already exists */ + + if (mytree->entries[n].deleted != 0) { + /* Revive the old record. Note that we can now discard are privately held key */ + free(mytree->entries[n].key); + + mytree->entries[n].key = key; + mytree->entries[n].deleted = 0; + mytree->entries[n].userdata = userdata; + return 0; + } + else { + /* Error */ + return 1; + } + } + + /* Must create new record */ + if (mytree->compare(key, mytree->entries[mytree->treesz - 1].key) > 0) { + /* Add after all the others */ + mytree->entries = (treerec_t *)realloc(mytree->entries, (1 + mytree->treesz)*sizeof(treerec_t)); + mytree->entries[mytree->treesz].key = key; + mytree->entries[mytree->treesz].userdata = userdata; + mytree->entries[mytree->treesz].deleted = 0; + } + else if (mytree->compare(key, mytree->entries[0].key) < 0) { + /* Add before all the others */ + treerec_t *newents = (treerec_t *)malloc((1 + mytree->treesz)*sizeof(treerec_t)); + newents[0].key = key; + newents[0].userdata = userdata; + newents[0].deleted = 0; + memcpy(&(newents[1]), &(mytree->entries[0]), (mytree->treesz * sizeof(treerec_t))); + free(mytree->entries); + mytree->entries = newents; + } + else { + int n; + treerec_t *newents; + + n = binsearch(mytree, key); + if (mytree->compare(mytree->entries[n].key, key) < 0) n++; + + /* + * n now points to the record AFTER where we will insert data in the current list. + * So in the new list, the new record will be in position n. + * Check if this is a deleted record, if it is then we won't have to move anything. + */ + if (mytree->entries[n].deleted != 0) { + /* Deleted record, let's re-use it. */ + free(mytree->entries[n].key); + mytree->entries[n].key = key; + mytree->entries[n].userdata = userdata; + mytree->entries[n].deleted = 0; + return 0; + } + + /* Ok, must create a new list and copy entries there */ + newents = (treerec_t *)malloc((1 + mytree->treesz)*sizeof(treerec_t)); + + /* Copy record 0..(n-1), i.e. n records */ + memcpy(&(newents[0]), &(mytree->entries[0]), n*sizeof(treerec_t)); + + /* New record is the n'th record */ + newents[n].key = key; + newents[n].userdata = userdata; + newents[n].deleted = 0; + + /* Finally, copy records n..(treesz-1) from the old list to position (n+1) onwards in the new list */ + memcpy(&(newents[n+1]), &(mytree->entries[n]), (mytree->treesz - n)*sizeof(treerec_t)); + + free(mytree->entries); + mytree->entries = newents; + } + } + + mytree->treesz += 1; + return 0; +} + +void *xtreeDelete(void *treehandle, char *key) +{ + xtree_t *mytree = (xtree_t *)treehandle; + int n; + + if (treehandle == NULL) return NULL; + if (mytree->treesz == 0) return NULL; /* Empty tree */ + + n = binsearch(mytree, key); + + if ((n >= 0) && (n < mytree->treesz) && (mytree->entries[n].deleted == 0) && (mytree->compare(key, mytree->entries[n].key) == 0)) { + mytree->entries[n].key = strdup(mytree->entries[n].key); /* Must dup the key, since user may discard it */ + mytree->entries[n].deleted = 1; + return mytree->entries[n].userdata; + } + + return NULL; +} + + +#ifdef STANDALONE +int main(int argc, char **argv) +{ + char buf[1024], key[1024], data[1024]; + void *th = NULL; + int n; + char *rec, *p; + + do { + printf("New, Add, Find, Delete, dUmp, deStroy : "); fflush(stdout); + if (fgets(buf, sizeof(buf), stdin) == NULL) return 0; + + switch (*buf) { + case 'N': case 'n': + th = xtreeNew(strcasecmp); + break; + + case 'A': case 'a': + printf("Key:");fflush(stdout); fgets(key, sizeof(key), stdin); + p = strchr(key, '\n'); if (p) *p = '\0'; + printf("Data:");fflush(stdout); fgets(data, sizeof(data), stdin); + p = strchr(data, '\n'); if (p) *p = '\0'; + n = xtreeAdd(th, strdup(key), strdup(data)); + printf("Result: %d\n", n); + break; + + case 'D': case 'd': + printf("Key:");fflush(stdout); fgets(key, sizeof(key), stdin); + p = strchr(key, '\n'); if (p) *p = '\0'; + rec = xtreeDelete(th, key); + if (rec) { + printf("Existing record deleted: Data was '%s'\n", rec); + } + else { + printf("No record\n"); + } + break; + + case 'F': case 'f': + printf("Key:");fflush(stdout); fgets(key, sizeof(key), stdin); + p = strchr(key, '\n'); if (p) *p = '\0'; + n = xtreeFind(th, key); + if (n >= 0) { + printf("Found record: Data was '%s'\n", (char *)xtreeData(th, n)); + } + else { + printf("No record\n"); + } + break; + + case 'U': case 'u': + n = xtreeFirst(th); + while (n >= 0) { + printf("%02d: Key '%s', data '%s'\n", n, (char *)xtreeKey(th, n), (char *)xtreeData(th, n)); + n = xtreeNext(th, n); + } + break; + + case 'S': case 's': + xtreeDestroy(th); + th = NULL; + break; + } + } while (1); + + return 0; +} +#endif + Added: trunk/lib/tree.h =================================================================== --- trunk/lib/tree.h (rev 0) +++ trunk/lib/tree.h 2011-09-03 14:13:16 UTC (rev 6740) @@ -0,0 +1,37 @@ +/*----------------------------------------------------------------------------*/ +/* Xymon monitor library. */ +/* */ +/* This is a library module, part of libxymon. */ +/* It contains routines for tree-based record storage. */ +/* */ +/* Copyright (C) 2011-2011 Henrik Storner <he...@st...> */ +/* */ +/* This program is released under the GNU General Public License (GPL), */ +/* version 2. See the file "COPYING" for details. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef __TREE_H__ +#define __TREE_H__ + +typedef enum { + XTREE_STATUS_OK, + XTREE_STATUS_MEM_EXHAUSTED, + XTREE_STATUS_DUPLICATE_KEY, + XTREE_STATUS_KEY_NOT_FOUND +} xtreeStatus_t; + +#define xtreeEnd(X) (-1) + +extern void *xtreeNew(int(*xtreeCompare)(const char *a, const char *b)); +extern void xtreeDestroy(void *treehandle); +extern xtreeStatus_t xtreeAdd(void *treehandle, char *key, char *userdata); +extern void *xtreeDelete(void *treehandle, char *key); +extern int xtreeFind(void *treehandle, char *key); +extern int xtreeFirst(void *treehandle); +extern int xtreeNext(void *treehandle, int pos); +extern char *xtreeKey(void *treehandle, int pos); +extern void *xtreeData(void *treehandle, int pos); + +#endif + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <st...@us...> - 2011-09-04 06:02:48
|
Revision: 6746 http://xymon.svn.sourceforge.net/xymon/?rev=6746&view=rev Author: storner Date: 2011-09-04 06:02:41 +0000 (Sun, 04 Sep 2011) Log Message: ----------- Library tree function: Drop the rbtr code, switch to own very plain xtree-code (missed two files in rev 6745) Revision Links: -------------- http://xymon.svn.sourceforge.net/xymon/?rev=6745&view=rev Modified Paths: -------------- trunk/README trunk/xymongen/util.c Modified: trunk/README =================================================================== --- trunk/README 2011-09-04 06:01:06 UTC (rev 6745) +++ trunk/README 2011-09-04 06:02:41 UTC (rev 6746) @@ -71,12 +71,7 @@ in Xymon was taken from the "mutt" mail client sources, so some changes were done by Thomas Roessler <roe...@do...>. -* The lib/rbtr.c and lib/rbtr.h files are by Thomas Nieman, - who has released them into the public domain. - http://www.epaperpress.com/sortsearch/rbt.html - http://www.epaperpress.com/sortsearch/title.html - Support ------- There is an open mailing list for discussing Xymon, asking Modified: trunk/xymongen/util.c =================================================================== --- trunk/xymongen/util.c 2011-09-04 06:01:06 UTC (rev 6745) +++ trunk/xymongen/util.c 2011-09-04 06:02:41 UTC (rev 6746) @@ -26,9 +26,9 @@ char *htmlextension = ".html"; /* Filename extension for generated HTML files */ -static RbtHandle hosttree; +static void * hosttree; static int havehosttree = 0; -static RbtHandle columntree; +static void * columntree; static int havecolumntree = 0; char *hostpage_link(host_t *host) @@ -130,14 +130,14 @@ host_t *find_host(char *hostname) { - RbtIterator handle; + xtreePos_t handle; if (havehosttree == 0) return NULL; /* Search for the host */ - handle = rbtFind(hosttree, hostname); - if (handle != rbtEnd(hosttree)) { - hostlist_t *entry = (hostlist_t *)gettreeitem(hosttree, handle); + handle = xtreeFind(hosttree, hostname); + if (handle != xtreeEnd(hosttree)) { + hostlist_t *entry = (hostlist_t *)xtreeData(hosttree, handle); return (entry ? entry->hostentry : NULL); } @@ -151,14 +151,14 @@ hostlist_t *find_hostlist(char *hostname) { - RbtIterator handle; + xtreePos_t handle; if (havehosttree == 0) return NULL; /* Search for the host */ - handle = rbtFind(hosttree, hostname); - if (handle != rbtEnd(hosttree)) { - hostlist_t *entry = (hostlist_t *)gettreeitem(hosttree, handle); + handle = xtreeFind(hosttree, hostname); + if (handle != xtreeEnd(hosttree)) { + hostlist_t *entry = (hostlist_t *)xtreeData(hosttree, handle); return entry; } @@ -168,22 +168,22 @@ void add_to_hostlist(hostlist_t *rec) { if (havehosttree == 0) { - hosttree = rbtNew(name_compare); + hosttree = xtreeNew(strcasecmp); havehosttree = 1; } - rbtInsert(hosttree, rec->hostentry->hostname, rec); + xtreeAdd(hosttree, rec->hostentry->hostname, rec); } -static RbtIterator hostlistwalk; +static xtreePos_t hostlistwalk; hostlist_t *hostlistBegin(void) { if (havehosttree == 0) return NULL; - hostlistwalk = rbtBegin(hosttree); + hostlistwalk = xtreeFirst(hosttree); - if (hostlistwalk != rbtEnd(hosttree)) { - return (hostlist_t *)gettreeitem(hosttree, hostlistwalk); + if (hostlistwalk != xtreeEnd(hosttree)) { + return (hostlist_t *)xtreeData(hosttree, hostlistwalk); } else { return NULL; @@ -194,10 +194,10 @@ { if (havehosttree == 0) return NULL; - if (hostlistwalk != rbtEnd(hosttree)) hostlistwalk = rbtNext(hosttree, hostlistwalk); + if (hostlistwalk != xtreeEnd(hosttree)) hostlistwalk = xtreeNext(hosttree, hostlistwalk); - if (hostlistwalk != rbtEnd(hosttree)) { - return (hostlist_t *)gettreeitem(hosttree, hostlistwalk); + if (hostlistwalk != xtreeEnd(hosttree)) { + return (hostlist_t *)xtreeData(hosttree, hostlistwalk); } else { return NULL; @@ -207,17 +207,17 @@ xymongen_col_t *find_or_create_column(char *testname, int create) { xymongen_col_t *newcol = NULL; - RbtIterator handle; + xtreePos_t handle; dbgprintf("find_or_create_column(%s)\n", textornull(testname)); if (havecolumntree == 0) { - columntree = rbtNew(name_compare); + columntree = xtreeNew(strcasecmp); havecolumntree = 1; } - handle = rbtFind(columntree, testname); - if (handle != rbtEnd(columntree)) newcol = (xymongen_col_t *)gettreeitem(columntree, handle); + handle = xtreeFind(columntree, testname); + if (handle != xtreeEnd(columntree)) newcol = (xymongen_col_t *)xtreeData(columntree, handle); if (newcol == NULL) { if (!create) return NULL; @@ -227,7 +227,7 @@ newcol->listname = (char *)malloc(strlen(testname)+1+2); sprintf(newcol->listname, ",%s,", testname); - rbtInsert(columntree, newcol->name, newcol); + xtreeAdd(columntree, newcol->name, newcol); } return newcol; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <st...@us...> - 2011-09-04 11:26:56
|
Revision: 6747 http://xymon.svn.sourceforge.net/xymon/?rev=6747&view=rev Author: storner Date: 2011-09-04 11:26:49 +0000 (Sun, 04 Sep 2011) Log Message: ----------- svcstatus CGI: Optimize status-display by eliminating the need to load the full hosts.cfg, instead grab the host info from xymond. Modified Paths: -------------- trunk/lib/Makefile trunk/lib/loadhosts.c trunk/lib/loadhosts.h trunk/lib/loadhosts_file.c trunk/web/svcstatus.c trunk/xymond/xymond.c Added Paths: ----------- trunk/lib/loadhosts_net.c Modified: trunk/lib/Makefile =================================================================== --- trunk/lib/Makefile 2011-09-04 06:02:41 UTC (rev 6746) +++ trunk/lib/Makefile 2011-09-04 11:26:49 UTC (rev 6747) @@ -26,7 +26,7 @@ ar cr xymonclient.a $(CLIENTLIBOBJS) ranlib xymonclient.a || echo "" -loadhosts.o: loadhosts.c loadhosts_file.c +loadhosts.o: loadhosts.c loadhosts_file.c loadhosts_net.c $(CC) $(CFLAGS) -c -o $@ loadhosts.c eventlog.o: eventlog.c Modified: trunk/lib/loadhosts.c =================================================================== --- trunk/lib/loadhosts.c 2011-09-04 06:02:41 UTC (rev 6746) +++ trunk/lib/loadhosts.c 2011-09-04 11:26:49 UTC (rev 6747) @@ -44,12 +44,11 @@ char *osname; struct namelist_t *next; - char *rawentry; /* The raw hosts.cfg entry for this host. */ char *allelems; /* Storage for data pointed to by elems */ char **elems; /* List of pointers to the elements of the entry */ /* - * The following are pre-parsed elements from the "rawentry". + * The following are pre-parsed elements. * These are pre-parsed because they are used by the xymon daemon, so * fast access to them is an optimization. */ @@ -329,6 +328,7 @@ } #include "loadhosts_file.c" +#include "loadhosts_net.c" char *knownhost(char *hostname, char *hostip, enum ghosthandling_t ghosthandling) { @@ -346,6 +346,22 @@ if (result) xfree(result); result = NULL; + if (hivalhost) { + *hostip = '\0'; + + if (!hivalbuf || (*hivalbuf == '\0')) return NULL; + + result = (strcasecmp(hivalhost, hostname) == 0) ? strdup(hivalhost) : NULL; + if (!result && hivals[XMH_CLIENTALIAS]) { + result = (strcasecmp(hivals[XMH_CLIENTALIAS], hostname) == 0) ? strdup(hivalhost) : NULL; + } + + if (result && hivals[XMH_IP]) strcpy(hostip, hivals[XMH_IP]); + + return result; + } + + /* Find the host in the normal hostname list */ hosthandle = xtreeFind(rbhosts, hostname); if (hosthandle != xtreeEnd(rbhosts)) { @@ -385,6 +401,19 @@ { namelist_t *walk = NULL; + if (hivalhost) { + int result; + char *hvh_logname, *p; + + hvh_logname = strdup(hivalhost); + p = hvh_logname; while ((p = strchr(p, '.')) != NULL) { *p = '_'; } + + result = (strcasecmp(hvh_logname, logdir) == 0); + + xfree(hvh_logname); + return result; + } + /* Find the host */ /* Must do the linear string search, since the tree is indexed by the hostname, not logname */ for (walk = namehead; (walk && (strcasecmp(walk->logname, logdir) != 0)); walk = walk->next); @@ -398,6 +427,10 @@ namelist_t *result = NULL; time_t now = getcurrenttime(NULL); + if (hivalhost) { + return (strcasecmp(hostname, hivalhost) == 0) ? &hival_hostinfo : NULL; + } + if (!configloaded) load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); hosthandle = xtreeFind(rbhosts, hostname); @@ -432,10 +465,6 @@ result->preference = 1; result->page = pghead; - if (result->rawentry) xfree(result->rawentry); - result->rawentry = (char *)malloc(strlen(hostname) + 100); - sprintf(result->rawentry, "127.0.0.1 %s #", hostname); - if (result->allelems) xfree(result->allelems); result->allelems = strdup(""); @@ -461,6 +490,8 @@ if (host == NULL) return NULL; + if (host == &hival_hostinfo) return hivals[item]; + switch (item) { case XMH_CLIENTALIAS: return host->clientname; @@ -631,14 +662,14 @@ void *first_host(void) { - return namehead; + return (hivalhost ? &hival_hostinfo : namehead); } void *next_host(void *currenthost, int wantclones) { namelist_t *walk; - if (!currenthost) return NULL; + if (!currenthost || (currenthost == &hival_hostinfo)) return NULL; if (wantclones) return ((namelist_t *)currenthost)->next; @@ -655,6 +686,23 @@ { namelist_t *host = (namelist_t *)hostin; + if (host == &hival_hostinfo) { + switch (item) { + case XMH_CLASS: + case XMH_OS: + case XMH_CLIENTALIAS: + hivals[item] = strdup((char *)value); + break; + case XMH_DATA: + hivals[item] = (char *)value; + break; + default: + break; + } + + return; + } + switch (item) { case XMH_CLASS: if (host->classname) xfree(host->classname); @@ -715,7 +763,12 @@ namelist_t *h; char *val; - load_hostnames(argv[1], NULL, get_fqdn()); + if (strcmp(argv[1], "@") == 0) { + load_hostinfo(argv[2]); + } + else { + load_hostnames(argv[1], NULL, get_fqdn()); + } for (argi = 2; (argi < argc); argi++) { char s[1024]; Modified: trunk/lib/loadhosts.h =================================================================== --- trunk/lib/loadhosts.h 2011-09-04 06:02:41 UTC (rev 6746) +++ trunk/lib/loadhosts.h 2011-09-04 11:26:49 UTC (rev 6747) @@ -81,6 +81,7 @@ enum ghosthandling_t { GH_ALLOW, GH_IGNORE, GH_LOG, GH_MATCH }; extern int load_hostnames(char *hostsfn, char *extrainclude, int fqdn); +extern int load_hostinfo(char *hostname); 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 06:02:41 UTC (rev 6746) +++ trunk/lib/loadhosts_file.c 2011-09-04 11:26:49 UTC (rev 6747) @@ -57,6 +57,8 @@ namelist_t *nametail = NULL; void * htree; + load_hostinfo(NULL); + /* First check if there were no modifications at all */ if (hostfiles) { if (!stackfmodified(hostfiles)){ Added: trunk/lib/loadhosts_net.c =================================================================== --- trunk/lib/loadhosts_net.c (rev 0) +++ trunk/lib/loadhosts_net.c 2011-09-04 11:26:49 UTC (rev 6747) @@ -0,0 +1,95 @@ +/*----------------------------------------------------------------------------*/ +/* Xymon monitor library. */ +/* */ +/* This is a library module for Xymon, responsible for loading the host */ +/* configuration from xymond, for either a single host or all hosts. */ +/* */ +/* Copyright (C) 2011-2011 Henrik Storner <he...@hs...> */ +/* */ +/* This program is released under the GNU General Public License (GPL), */ +/* version 2. See the file "COPYING" for details. */ +/* */ +/*----------------------------------------------------------------------------*/ + +static char rcsid_net[] = "$Id: loadhosts_file.c 6745 2011-09-04 06:01:06Z storner $"; + +static char *hivalhost = NULL; +static char *hivals[XMH_LAST] = { NULL, }; +static char *hivalbuf = NULL; +static namelist_t hival_hostinfo; /* Used as token for userspace. Also holds raw data in "elems" */ + +int load_hostinfo(char *targethost) +{ + sendreturn_t *sres; + sendresult_t sendstat; + char *msg, *bol, *eoln, *key, *val; + int elemsize = 0; + + xmh_item_list_setup(); + + if (hivalhost) { + xfree(hivalhost); + hivalhost = NULL; + } + if (hivalbuf) { + xfree(hivalbuf); hivalbuf = NULL; + xfree(hival_hostinfo.elems); + } + + if (!targethost) return -1; + + hivalhost = strdup(targethost); + memset(hivals, 0, sizeof(hivals)); + memset(&hival_hostinfo, 0, sizeof(hival_hostinfo)); + hival_hostinfo.elems = (char **)calloc(1, sizeof(char *)); + + msg = (char *)malloc(200 + strlen(targethost)); + sprintf(msg, "hostinfo clone=%s", targethost); + + sres = newsendreturnbuf(1, NULL); + sendstat = sendmessage(msg, NULL, XYMON_TIMEOUT, sres); + xfree(msg); + if (sendstat != XYMONSEND_OK) { + errprintf("Cannot load hostinfo\n"); + return -1; + } + + hivalbuf = getsendreturnstr(sres, 1); + bol = hivalbuf; + while (bol && *bol) { + int idx; + + /* + * The "clone" output is multiline: + * Lines beginning with XMH_ are the item-values, + * all others are elem entries. + */ + + eoln = strchr(bol, '\n'); + if (eoln) *eoln = '\0'; + + key = bol; + if (strncmp(key, "XMH_", 4) == 0) { + val = strchr(bol, ':'); if (val) { *val = '\0'; val++; } + idx = xmh_key_idx(key); + if ((idx >= 0) && (idx < XMH_LAST)) hivals[idx] = val; + } + else { + elemsize++; + hival_hostinfo.elems = (char **)realloc(hival_hostinfo.elems, (elemsize+1)*sizeof(char *)); + hival_hostinfo.elems[elemsize-1] = bol; + } + + bol = (eoln ? eoln+1 : NULL); + } + hival_hostinfo.elems[elemsize] = NULL; + + hival_hostinfo.hostname = hivals[XMH_HOSTNAME]; + if (hivals[XMH_IP]) + strcpy(hival_hostinfo.ip, hivals[XMH_IP]); + else + *(hival_hostinfo.ip) = '\0'; + + return 0; +} + Modified: trunk/web/svcstatus.c =================================================================== --- trunk/web/svcstatus.c 2011-09-04 06:02:41 UTC (rev 6746) +++ trunk/web/svcstatus.c 2011-09-04 11:26:49 UTC (rev 6747) @@ -150,11 +150,16 @@ return 0; } -int loadhostdata(char *hostname, char **ip, char **displayname, char **compacts) +int loadhostdata(char *hostname, char **ip, char **displayname, char **compacts, int full) { void *hinfo = NULL; - load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); + if (full) { + load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); + } + else { + load_hostinfo(hostname); + } if ((hinfo = hostinfo(hostname)) == NULL) { errormsg("No such host"); @@ -242,7 +247,10 @@ restofmsg = (log ? log : strdup("<No data>\n")); } else if ((strcmp(service, xgetenv("TRENDSCOLUMN")) == 0) || (strcmp(service, xgetenv("INFOCOLUMN")) == 0)) { - if (loadhostdata(hostname, &ip, &displayname, &compacts) != 0) return 1; + int fullload = (strcmp(service, xgetenv("INFOCOLUMN")) == 0); + + if (loadhostdata(hostname, &ip, &displayname, &compacts, fullload) != 0) return 1; + ishtmlformatted = 1; sethostenv(displayname, ip, service, colorname(COL_GREEN), hostname); sethostenv_refresh(600); @@ -292,7 +300,7 @@ char *sumline, *msg, *p, *compitem, *complist; sendreturn_t *sres; - if (loadhostdata(hostname, &ip, &displayname, &compacts) != 0) return 1; + if (loadhostdata(hostname, &ip, &displayname, &compacts, 0) != 0) return 1; complist = NULL; if (compacts && *compacts) { @@ -490,7 +498,7 @@ if (!tstamp) { errormsg("Invalid request"); return 1; } - if (loadhostdata(hostname, &ip, &displayname, &compacts) != 0) return 1; + if (loadhostdata(hostname, &ip, &displayname, &compacts, 0) != 0) return 1; hostnamedash = strdup(hostname); p = hostnamedash; while ((p = strchr(p, '.')) != NULL) *p = '_'; p = hostnamedash; while ((p = strchr(p, ',')) != NULL) *p = '_'; Modified: trunk/xymond/xymond.c =================================================================== --- trunk/xymond/xymond.c 2011-09-04 06:02:41 UTC (rev 6746) +++ trunk/xymond/xymond.c 2011-09-04 11:26:49 UTC (rev 6747) @@ -3622,31 +3622,70 @@ char *fields = NULL; int scolor = -1, acklevel = -1; static unsigned int lastboardsize = 0; + char *clonehost; if (!oksender(wwwsenders, NULL, msg->addr.sin_addr, msg->buf)) goto done; - setup_filter(msg->buf, - "XMH_HOSTNAME,XMH_IP,XMH_RAW", - &spage, &shost, &snet, &stest, &scolor, &acklevel, &fields, - &chspage, &chshost, &chsnet, &chstest); + clonehost = strstr(msg->buf, " clone="); + if (clonehost) { + void *hinfo; + strbuffer_t *outbuf = NULL; + int outlen; - if (lastboardsize == 0) { - /* A guesstimate - 500 bytes per host */ - bufsz = (hostcount+1)*500; + outbuf = newstrbuffer(1024); + clonehost += strlen(" clone="); + hinfo = hostinfo(clonehost); + + if (hinfo) { + enum xmh_item_t idx; + char *val; + + for (idx = 0; (idx < XMH_LAST); idx++) { + val = xmh_item(hinfo, idx); + if (val) { + addtobuffer(outbuf, xmh_item_id(idx)); + addtobuffer(outbuf, ":"); + addtobuffer(outbuf, val); + addtobuffer(outbuf, "\n"); + } + } + + val = xmh_item_walk(hinfo); + while (val) { + addtobuffer(outbuf, val); + addtobuffer(outbuf, "\n"); + val = xmh_item_walk(NULL); + } + } + + outlen = STRBUFLEN(outbuf); + buf = grabstrbuffer(outbuf); + bufp = (buf + outlen); } else { - /* Add 10% to the last size we used */ - bufsz = lastboardsize + (lastboardsize / 10); - } - bufp = buf = (char *)malloc(bufsz); + setup_filter(msg->buf, + "XMH_HOSTNAME,XMH_IP,XMH_RAW", + &spage, &shost, &snet, &stest, &scolor, &acklevel, &fields, + &chspage, &chshost, &chsnet, &chstest); - for (hinfo = first_host(); (hinfo); hinfo = next_host(hinfo, 0)) { - if (!match_host_filter(hinfo, spage, shost, snet)) continue; - generate_hostinfo_outbuf(&buf, &bufp, &bufsz, hinfo); + if (lastboardsize == 0) { + /* A guesstimate - 500 bytes per host */ + bufsz = (hostcount+1)*500; + } + else { + /* Add 10% to the last size we used */ + bufsz = lastboardsize + (lastboardsize / 10); + } + bufp = buf = (char *)malloc(bufsz); + + for (hinfo = first_host(); (hinfo); hinfo = next_host(hinfo, 0)) { + if (!match_host_filter(hinfo, spage, shost, snet)) continue; + generate_hostinfo_outbuf(&buf, &bufp, &bufsz, hinfo); + } + + *bufp = '\0'; } - *bufp = '\0'; - xfree(msg->buf); msg->doingwhat = RESPONDING; msg->bufp = msg->buf = buf; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
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. |
From: <st...@us...> - 2011-09-09 08:12:08
|
Revision: 6752 http://xymon.svn.sourceforge.net/xymon/?rev=6752&view=rev Author: storner Date: 2011-09-09 08:12:02 +0000 (Fri, 09 Sep 2011) Log Message: ----------- xymongen and xymonnet: Option to load hosts.cfg from xymond Modified Paths: -------------- trunk/xymongen/loadlayout.c trunk/xymongen/xymongen.1 trunk/xymongen/xymongen.c trunk/xymongen/xymongen.h trunk/xymonnet/xymonnet.1 trunk/xymonnet/xymonnet.c Modified: trunk/xymongen/loadlayout.c =================================================================== --- trunk/xymongen/loadlayout.c 2011-09-04 22:08:43 UTC (rev 6751) +++ trunk/xymongen/loadlayout.c 2011-09-09 08:12:02 UTC (rev 6752) @@ -428,8 +428,21 @@ int fqdn = get_fqdn(); char *cfgdata, *inbol, *ineol, insavchar; - if (load_hostnames(xgetenv("HOSTSCFG"), "dispinclude", fqdn) != 0) { - errprintf("Cannot load host configuration\n"); + if (loadhostsfromxymond) { + if (load_hostnames("@", NULL, fqdn) != 0) { + errprintf("Cannot load host configuration from xymond\n"); + return NULL; + } + } + else { + if (load_hostnames(xgetenv("HOSTSCFG"), "netinclude", fqdn) != 0) { + errprintf("Cannot load host configuration from %s\n", xgetenv("HOSTSCFG")); + return NULL; + } + } + + if (first_host() == NULL) { + errprintf("Empty configuration from %s\n", (loadhostsfromxymond ? "xymond" : xgetenv("HOSTSCFG"))); return NULL; } Modified: trunk/xymongen/xymongen.1 =================================================================== --- trunk/xymongen/xymongen.1 2011-09-04 22:08:43 UTC (rev 6751) +++ trunk/xymongen/xymongen.1 2011-09-09 08:12:02 UTC (rev 6752) @@ -105,7 +105,17 @@ reflecting the color of the Critical status page. This allows you to track when problems have appeared on the critical status page. The logfile is stored in $XYMONSERVERLOGS/criticalstatus.log +.sp +.IP --loadhostsfromxymond +Instead of reading the hosts.cfg file, xymongen will load the +hosts.cfg configuration from the xymond daemon. This eliminates +the need for reading the hosts.cfg, and if you have xymond and +xymongen running on different hosts, it also eliminates the need +for copying the hosts.cfg file between systems. Note that the +"dispinclude" option in hosts.cfg is ignored when this option is +enabled. + .SH PAGE LAYOUT OPTIONS These options affect how the webpages generated by xymongen appear in the browser. Modified: trunk/xymongen/xymongen.c =================================================================== --- trunk/xymongen/xymongen.c 2011-09-04 22:08:43 UTC (rev 6751) +++ trunk/xymongen/xymongen.c 2011-09-09 08:12:02 UTC (rev 6752) @@ -41,6 +41,7 @@ dispsummary_t *dispsums = NULL; /* Summaries we received and display */ int xymon_color, nongreen_color, critical_color; /* Top-level page colors */ int fqdn = 1; /* Xymon FQDN setting */ +int loadhostsfromxymond = 0; time_t reportstart = 0; time_t reportend = 0; @@ -448,6 +449,9 @@ else if (strcmp(argv[i], "--no-update") == 0) { dontsendmessages = 1; } + else if (strcmp(argv[i], "--loadhostsfromxymond") == 0) { + loadhostsfromxymond = 1; + } else if (strcmp(argv[i], "--version") == 0) { printf("xymongen version %s\n", VERSION); printf("\n"); Modified: trunk/xymongen/xymongen.h =================================================================== --- trunk/xymongen/xymongen.h 2011-09-04 22:08:43 UTC (rev 6751) +++ trunk/xymongen/xymongen.h 2011-09-09 08:12:02 UTC (rev 6752) @@ -235,6 +235,7 @@ extern int reportstyle; extern int dynamicreport; extern int fqdn; +extern int loadhostsfromxymond; #endif Modified: trunk/xymonnet/xymonnet.1 =================================================================== --- trunk/xymonnet/xymonnet.1 2011-09-04 22:08:43 UTC (rev 6751) +++ trunk/xymonnet/xymonnet.1 2011-09-09 08:12:02 UTC (rev 6752) @@ -181,6 +181,15 @@ "IPADDRESS" must be a valid IP-address on the host running xymonnet. +.IP --loadhostsfromxymond +Instead of reading the hosts.cfg file, xymonnet will load the +hosts.cfg configuration from the xymond daemon. This eliminates +the need for reading the hosts.cfg, and if you have xymond and +xymonnet running on different hosts, it also eliminates the need +for copying the hosts.cfg file between systems. Note that the +"netinclude" option in hosts.cfg is ignored when this option is +enabled. + .SH OPTIONS FOR TESTS OF THE SIMPLE TCP SERVICES .IP --checkresponse[=COLOR] When testing well-known services (e.g. FTP, SSH, SMTP, POP-2, POP-3, Modified: trunk/xymonnet/xymonnet.c =================================================================== --- trunk/xymonnet/xymonnet.c 2011-09-04 22:08:43 UTC (rev 6751) +++ trunk/xymonnet/xymonnet.c 2011-09-09 08:12:02 UTC (rev 6752) @@ -104,6 +104,7 @@ int extcmdtimeout = 30; int bigfailure = 0; char *defaultsourceip = NULL; +int loadhostsfromxymond = 0; void dump_hostlist(void) { @@ -392,9 +393,21 @@ testedhost_t *h; int badtagsused = 0; - load_hostnames(xgetenv("HOSTSCFG"), "netinclude", get_fqdn()); + if (loadhostsfromxymond) { + if (load_hostnames("@", NULL, fqdn) != 0) { + errprintf("Cannot load host configuration from xymond\n"); + return; + } + } + else { + if (load_hostnames(xgetenv("HOSTSCFG"), "netinclude", fqdn) != 0) { + errprintf("Cannot load host configuration from %s\n", xgetenv("HOSTSCFG")); + return; + } + } + if (first_host() == NULL) { - errprintf("Cannot load file %s\n", xgetenv("HOSTSCFG")); + errprintf("Empty configuration from %s\n", (loadhostsfromxymond ? "xymond" : xgetenv("HOSTSCFG"))); return; } @@ -2003,6 +2016,9 @@ char *p = strchr(argv[argi], '='); p++; warnbytesread = atoi(p); } + else if (strcmp(argv[argi], "--loadhostsfromxymond") == 0) { + loadhostsfromxymond = 1; + } /* Options for TCP tests */ else if (strcmp(argv[argi], "--checkresponse") == 0) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |