Imported Upstream version 4.4.3
This commit is contained in:
parent
dac8330c0a
commit
797bccfa31
13
.gitignore
vendored
13
.gitignore
vendored
@ -24,9 +24,6 @@ nbproject/
|
|||||||
*.o
|
*.o
|
||||||
*.la
|
*.la
|
||||||
*.lo
|
*.lo
|
||||||
*.gcda
|
|
||||||
*.gcno
|
|
||||||
*.gcov
|
|
||||||
*.a
|
*.a
|
||||||
*.so
|
*.so
|
||||||
cgi/run*
|
cgi/run*
|
||||||
@ -36,8 +33,14 @@ core.[1-9]*
|
|||||||
*.pre-indent
|
*.pre-indent
|
||||||
*.swp
|
*.swp
|
||||||
|
|
||||||
|
*.gcda
|
||||||
|
*.gcno
|
||||||
|
*.gcov
|
||||||
|
coverage-report/
|
||||||
|
nagioscore.info-file
|
||||||
|
|
||||||
html/angularjs/angular-1.3.9
|
html/angularjs/angular-1.3.9
|
||||||
html/angularjs/ui-utils-0.2.1
|
html/angularjs/ui-utils-0.2.3
|
||||||
html/bootstrap-3.3.0
|
html/bootstrap-3.3.7
|
||||||
html/d3
|
html/d3
|
||||||
html/index.php
|
html/index.php
|
||||||
|
159
.travis.yml
Normal file
159
.travis.yml
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
language: c
|
||||||
|
|
||||||
|
sudo: true
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- os: linux
|
||||||
|
dist: trusty
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- apache2
|
||||||
|
- build-essential
|
||||||
|
- gcovr
|
||||||
|
- gperf
|
||||||
|
- lcov
|
||||||
|
- libgd-dev
|
||||||
|
- php5
|
||||||
|
- php5-gd
|
||||||
|
- unzip
|
||||||
|
- valgrind
|
||||||
|
env:
|
||||||
|
- MATRIX_EVAL="CC=gcc && CXX=g++"
|
||||||
|
|
||||||
|
- os: linux
|
||||||
|
dist: trusty
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
sources:
|
||||||
|
- ubuntu-toolchain-r-test
|
||||||
|
packages:
|
||||||
|
- apache2
|
||||||
|
- build-essential
|
||||||
|
- gcovr
|
||||||
|
- gperf
|
||||||
|
- g++-5
|
||||||
|
- lcov
|
||||||
|
- libgd-dev
|
||||||
|
- php5
|
||||||
|
- php5-gd
|
||||||
|
- unzip
|
||||||
|
- valgrind
|
||||||
|
env:
|
||||||
|
- MATRIX_EVAL="CC=gcc-5 && CXX=g++-5"
|
||||||
|
|
||||||
|
- os: linux
|
||||||
|
dist: trusty
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
sources:
|
||||||
|
- ubuntu-toolchain-r-test
|
||||||
|
packages:
|
||||||
|
- apache2
|
||||||
|
- build-essential
|
||||||
|
- gcovr
|
||||||
|
- gperf
|
||||||
|
- g++-6
|
||||||
|
- lcov
|
||||||
|
- libgd-dev
|
||||||
|
- php5
|
||||||
|
- php5-gd
|
||||||
|
- unzip
|
||||||
|
- valgrind
|
||||||
|
env:
|
||||||
|
- MATRIX_EVAL="CC=gcc-6 && CXX=g++-6"
|
||||||
|
|
||||||
|
- os: linux
|
||||||
|
dist: trusty
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
sources:
|
||||||
|
- ubuntu-toolchain-r-test
|
||||||
|
packages:
|
||||||
|
- apache2
|
||||||
|
- build-essential
|
||||||
|
- gcovr
|
||||||
|
- gperf
|
||||||
|
- g++-7
|
||||||
|
- lcov
|
||||||
|
- libgd-dev
|
||||||
|
- php5
|
||||||
|
- php5-gd
|
||||||
|
- unzip
|
||||||
|
- valgrind
|
||||||
|
env:
|
||||||
|
- MATRIX_EVAL="CC=gcc-7 && CXX=g++-7"
|
||||||
|
|
||||||
|
- os: linux
|
||||||
|
dist: trusty
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
sources:
|
||||||
|
- ubuntu-toolchain-r-test
|
||||||
|
packages:
|
||||||
|
- apache2
|
||||||
|
- build-essential
|
||||||
|
- gcovr
|
||||||
|
- gperf
|
||||||
|
- g++-8
|
||||||
|
- lcov
|
||||||
|
- libgd-dev
|
||||||
|
- php5
|
||||||
|
- php5-gd
|
||||||
|
- unzip
|
||||||
|
- valgrind
|
||||||
|
env:
|
||||||
|
- MATRIX_EVAL="CC=gcc-8 && CXX=g++-8"
|
||||||
|
|
||||||
|
- os: linux
|
||||||
|
dist: trusty
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
sources:
|
||||||
|
- llvm-toolchain-trusty-5.0
|
||||||
|
packages:
|
||||||
|
- apache2
|
||||||
|
- build-essential
|
||||||
|
- clang-5.0
|
||||||
|
- gcovr
|
||||||
|
- gperf
|
||||||
|
- lcov
|
||||||
|
- libgd-dev
|
||||||
|
- php5
|
||||||
|
- php5-gd
|
||||||
|
- unzip
|
||||||
|
- valgrind
|
||||||
|
env:
|
||||||
|
- MATRIX_EVAL="CC=clang-5.0 && CXX=clang++-5.0"
|
||||||
|
|
||||||
|
- os: linux
|
||||||
|
dist: trusty
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
sources:
|
||||||
|
- llvm-toolchain-trusty-6.0
|
||||||
|
- ubuntu-toolchain-r-test
|
||||||
|
packages:
|
||||||
|
- apache2
|
||||||
|
- build-essential
|
||||||
|
- clang-6.0
|
||||||
|
- gcovr
|
||||||
|
- gperf
|
||||||
|
- g++-4.9
|
||||||
|
- lcov
|
||||||
|
- libgd-dev
|
||||||
|
- php5
|
||||||
|
- php5-gd
|
||||||
|
- unzip
|
||||||
|
- valgrind
|
||||||
|
env:
|
||||||
|
- MATRIX_EVAL="CC=clang-6.0 && CXX=clang++-6.0"
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
- eval "${MATRIX_EVAL}"
|
||||||
|
|
||||||
|
script:
|
||||||
|
- ./configure --enable-testing
|
||||||
|
- make test
|
||||||
|
- gcovr -r .
|
@ -155,7 +155,7 @@ When you submit a Pull Request, make sure you follow the guidelines:
|
|||||||
* Keep commit messages as concise as possible.
|
* Keep commit messages as concise as possible.
|
||||||
* Update the appropriate files in regards to your changes:
|
* Update the appropriate files in regards to your changes:
|
||||||
|
|
||||||
* `CHANGES`
|
* `Changelog`
|
||||||
|
|
||||||
* `THANKS`
|
* `THANKS`
|
||||||
|
|
||||||
|
92
Changelog
92
Changelog
@ -3,6 +3,92 @@ Nagios Core 4 Change Log
|
|||||||
########################
|
########################
|
||||||
|
|
||||||
|
|
||||||
|
4.4.3 - 2019-01-15
|
||||||
|
------------------
|
||||||
|
FIXES
|
||||||
|
* Fixed services sending recovery emails when they recover if host in down state (#572) (Scott Wilkerson)
|
||||||
|
* Fixed a make error when building on the aarch64 architecture (#598) (Gareth Randall)
|
||||||
|
* Fixed --with-cgibindir and --with-webdir to actually set values given (#585) (lawsontyler)
|
||||||
|
* Fixed soft recovery states for services (#575) (Jake Omann)
|
||||||
|
* Fixed XSS vulnerability in Alert Summary report (CVE-2018-18245) (Jake Omann)
|
||||||
|
* Fixed services in soft states sometimes not switching into hard states (#576) (Jake Omann)
|
||||||
|
* Fixed last_state_change to update when a state goes from soft -> hard state (#592) (Jake Omann)
|
||||||
|
* Fixed Map link always being set to undefined host and don't show link for Nagios Process root note (#539) (Jake Omann)
|
||||||
|
* Fixed notifications sending when services went into hard state on a down or unreachable host (#584) (Jake Omann)
|
||||||
|
* Fixed log_host_retries not logging the host soft state checks (#599) (Jake Omann)
|
||||||
|
* Fixed stalking_options N option to properly log only when a notification is actually sent (#604) (Jake Omann)
|
||||||
|
* Fixed issue with service status totals being zero when servicegroup=all on servicegroup status page (#579) (Jake Omann)
|
||||||
|
* Fixed escalation notifications logic and recovery notifications not going out (#582) (Jake Omann)
|
||||||
|
* Fixed not finding child index causing duplicate hosts showing in the Map (#471) (Jake Omann)
|
||||||
|
* Fixed Map configuration popup checkboxes not working and Root Node not populating (#543) (Jake Omann)
|
||||||
|
* Fixed cleanup and deinit of neb modules on reload (#573) (Jake Omann)
|
||||||
|
|
||||||
|
|
||||||
|
4.4.2 - 2018-08-16
|
||||||
|
------------------
|
||||||
|
FIXES
|
||||||
|
* Fix comment data being duplicated after a `service nagios reload` or similar (#549) (Bryan Heden)
|
||||||
|
* Fix check_interval and retry_interval not changing at the appropriate times (#551) (Scott Wilkerson)
|
||||||
|
* Fixed passive checks sending recovery email when host was previously UP (#552) (Scott Wilkerson)
|
||||||
|
* Fixed flapping comments duplication on nagios reload (#554) (Christian Jung)
|
||||||
|
* Fix for CVE-2018-13441, CVE-2018-13458, CVE-2018-13457 null pointer dereference (Trevor McDonald)
|
||||||
|
* Fixed syntax error in file: default-init.in (#558) (Christian Zettel)
|
||||||
|
* Reset current notification number and state flags when the host recovers, reset all service variables when they recover fixes (#557) (Scott Wilkerson)
|
||||||
|
* Fixed wrong counting of service status totals when showing servicegroup details (#548) (Christian Zettel, Bryan Heden)
|
||||||
|
* Fixed avail.cgi not printing CSV output when checkbox is checked (for any type: host/service/hostgroup/servicegroup) (#570) (Bryan Heden)
|
||||||
|
* Fixed nagios not logging SOFT state changes after 1 (Scott Wilkerson)
|
||||||
|
|
||||||
|
|
||||||
|
4.4.1 - 2018-06-25
|
||||||
|
------------------
|
||||||
|
FIXES
|
||||||
|
* Revert some macro->kvvec changes causing problems when `enable_environment_macros` was enabled (Bryan Heden)
|
||||||
|
* Adjust `process_macro_r` function logic so that it handles macros properly (Bryan Heden)
|
||||||
|
* Fix spec file for systemd (Karsten Weiss, Fr3dY, Bryan Heden)
|
||||||
|
* Fix bug where `ssize_t` typedef to int on some systems (Bryan Heden)
|
||||||
|
|
||||||
|
|
||||||
|
4.4.0 - 2018-06-19
|
||||||
|
------------------
|
||||||
|
ENHANCEMENTS
|
||||||
|
* new status for check dependencies (John Frickson)
|
||||||
|
* Allow more flexible requirements for comments (John Frickson)
|
||||||
|
* Add a `statusCRITICALACK` class for the status column (John Frickson)
|
||||||
|
* CSV output based on groups (all options) (John Frickson)
|
||||||
|
* New Macro(s) to generate URL for host / service object to be used in notifications (John Frickson)
|
||||||
|
* New Macro(s) to determine if host/service notifications are enabled (#419) (Bryan Heden)
|
||||||
|
* New Macro(s) for obtaining the host/service notification periods (#350) (Bryan Heden)
|
||||||
|
* enable_page_tour interface option (Bryan Heden)
|
||||||
|
* Code cleanups in important sections (Workers, Handling Results) (Bryan Heden)
|
||||||
|
* Automatic mail program detection (with same /bin/mail failback) (Bryan Heden)
|
||||||
|
* Incorporated [autoconf-macros](https://github.com/NagiosEnterprises/autoconf-macros) into Core (Bryan Heden)
|
||||||
|
* Lots of enhancements/additions to configure/make process. (Bryan Heden)
|
||||||
|
* Moved all files to startup/
|
||||||
|
* Added upstart job
|
||||||
|
* Added system limit detection (RLIMIT_NPROC) to check for anticipated fork() failures (#434) (Bryan Heden)
|
||||||
|
* Added stalking on notifications (`N` or `notifications` option when specifying `stalking_options`) (#342) (Bryan Heden)
|
||||||
|
* Added automatic `systemctl daemon-reload` and `initctl reload-configuration` where applicable on `make install-init` (Bryan Heden)
|
||||||
|
* Added case-insentive command submission. (#373) (Bryan Heden)
|
||||||
|
* Enabled `check_external_commands` by default (Bryan Heden)
|
||||||
|
|
||||||
|
FIXES
|
||||||
|
* Command line macro detection skips potential macros with no ending dollar sign (Bryan Heden, Jake Omann)
|
||||||
|
* Fixed a lockup condition sometimes encountered on shutdown or restart (Aaron Beck)
|
||||||
|
* Fixed negative time offset calculations computing incorrectly sometimes (bbeutel)
|
||||||
|
* Fixed reloads causing defunct (zombie) processes (#441) (Bryan Heden)
|
||||||
|
* Fixed wait3(), wait4() implementations (replaced with waitpid()) (#326) (Bryan Heden)
|
||||||
|
* Fixed additive inheritance not testing for duplicates in hosts/services/(+escalations) (#392) (Bryan Heden)
|
||||||
|
* Fixed very very (around 600k chars or greater) large plugin output crashing Nagios (#432) (Bryan Heden)
|
||||||
|
* Fixed first_notification_delay not beeing calculated from last_hard_state_change (#425) (Christian Zettel)
|
||||||
|
* Fixed duplicate downtime ID occuring from downtimes in retention file (#506) (Franz [feisenko])
|
||||||
|
* Fixed segfault when navbarsearch was used in status.cgi for something other than a host (#489) (Bryan Heden)
|
||||||
|
* Fixed some miscellaneous ./configure issues on Solaris (Bryan Heden, Troy Lea)
|
||||||
|
* Fixed "Locate host on map" link (#496) (Troy Lea)
|
||||||
|
* Fixed service groups defined with unknown service members (that aren't first in the list) not erroring out (#500) (Bryan Heden)
|
||||||
|
* Fixed tac.cgi to have consistent behavior with the other cgis (#481) (Bryan Heden, Matt Capra)
|
||||||
|
* Fixed clear_host/service_flapping command logic to broker/notify properly (#525) (Bryan Heden, Karsten Weiss)
|
||||||
|
|
||||||
|
|
||||||
4.3.4 - 2017-08-24
|
4.3.4 - 2017-08-24
|
||||||
------------------
|
------------------
|
||||||
* Improved config file parsing (Mark Felder)
|
* Improved config file parsing (Mark Felder)
|
||||||
@ -15,7 +101,7 @@ Nagios Core 4 Change Log
|
|||||||
------------------
|
------------------
|
||||||
* xodtemplate.c wrong option-deprecation code warning (alex2grad / John Frickson)
|
* xodtemplate.c wrong option-deprecation code warning (alex2grad / John Frickson)
|
||||||
* On-demand host check always use cached host state (John Frickson)
|
* On-demand host check always use cached host state (John Frickson)
|
||||||
* 'á' causes Serivce Status Information to not be displayed (John Frickson)
|
* 'á' causes Service Status Information to not be displayed (John Frickson)
|
||||||
* New Macro(s) to generate URL for host / service object (John Frickson)
|
* New Macro(s) to generate URL for host / service object (John Frickson)
|
||||||
* Fix minor map issues (Troy Lea)
|
* Fix minor map issues (Troy Lea)
|
||||||
* Fix lockfile issues (Bryan Heden)
|
* Fix lockfile issues (Bryan Heden)
|
||||||
@ -25,7 +111,7 @@ Nagios Core 4 Change Log
|
|||||||
|
|
||||||
4.3.2 - 2017-05-09
|
4.3.2 - 2017-05-09
|
||||||
------------------
|
------------------
|
||||||
FIXED
|
FIXES
|
||||||
* Every 15sec /var/log/messages is flooded with "nagios: set_environment_var" (John Frickson)
|
* Every 15sec /var/log/messages is flooded with "nagios: set_environment_var" (John Frickson)
|
||||||
* Changed release date to ISO format (yyyy-mm-dd) (John Frickson)
|
* Changed release date to ISO format (yyyy-mm-dd) (John Frickson)
|
||||||
* `make all` fails if unzip is not installed (John Frickson)
|
* `make all` fails if unzip is not installed (John Frickson)
|
||||||
@ -410,5 +496,5 @@ FIXES
|
|||||||
|
|
||||||
4.0.0 - 09/20/2013
|
4.0.0 - 09/20/2013
|
||||||
------------------
|
------------------
|
||||||
See http://nagios.sourceforge.net/docs/nagioscore/4/en/whatsnew.html for a
|
See https://assets.nagios.com/downloads/nagioscore/docs/nagioscore/4/en/whatsnew.html for a
|
||||||
list of the changes in Nagios Core 4
|
list of the changes in Nagios Core 4
|
||||||
|
89
Makefile.in
89
Makefile.in
@ -27,11 +27,11 @@ LOGDIR=@localstatedir@
|
|||||||
CHECKRESULTDIR=@CHECKRESULTDIR@
|
CHECKRESULTDIR=@CHECKRESULTDIR@
|
||||||
CFGDIR=@sysconfdir@
|
CFGDIR=@sysconfdir@
|
||||||
BINDIR=@bindir@
|
BINDIR=@bindir@
|
||||||
CGIDIR=@sbindir@
|
CGIDIR=@cgibindir@
|
||||||
LIBEXECDIR=@libexecdir@
|
LIBEXECDIR=@libexecdir@
|
||||||
LIBDIR=@libdir@
|
LIBDIR=@libdir@
|
||||||
INCLUDEDIR=@includedir@/nagios
|
INCLUDEDIR=@includedir@/nagios
|
||||||
HTMLDIR=@datadir@
|
HTMLDIR=@webdir@
|
||||||
datarootdir=@datarootdir@
|
datarootdir=@datarootdir@
|
||||||
LN_S=@LN_S@
|
LN_S=@LN_S@
|
||||||
INSTALL=@INSTALL@
|
INSTALL=@INSTALL@
|
||||||
@ -39,9 +39,16 @@ INSTALL_OPTS=@INSTALL_OPTS@
|
|||||||
COMMAND_OPTS=@COMMAND_OPTS@
|
COMMAND_OPTS=@COMMAND_OPTS@
|
||||||
HTTPD_CONF=@HTTPD_CONF@
|
HTTPD_CONF=@HTTPD_CONF@
|
||||||
LN_HTTPD_SITES_ENABLED=@LN_HTTPD_SITES_ENABLED@
|
LN_HTTPD_SITES_ENABLED=@LN_HTTPD_SITES_ENABLED@
|
||||||
INIT_DIR=@init_dir@
|
INIT_DIR=@initdir@
|
||||||
INIT_OPTS=@INIT_OPTS@
|
INIT_OPTS=@INIT_OPTS@
|
||||||
CGICFGDIR=$(CGIDIR)
|
CGICFGDIR=$(CGIDIR)
|
||||||
|
NAGIOS_USER=@nagios_user@
|
||||||
|
NAGIOS_GRP=@nagios_grp@
|
||||||
|
DIST=@dist_type@
|
||||||
|
|
||||||
|
SRC_INIT=@src_init@
|
||||||
|
INIT_FILE=@initname@
|
||||||
|
INIT_TYPE=@init_type@
|
||||||
|
|
||||||
USE_EVENTBROKER=@USE_EVENTBROKER@
|
USE_EVENTBROKER=@USE_EVENTBROKER@
|
||||||
USE_LIBTAP=@USE_LIBTAP@
|
USE_LIBTAP=@USE_LIBTAP@
|
||||||
@ -55,9 +62,17 @@ CP=@CP@
|
|||||||
none:
|
none:
|
||||||
@echo "Please supply a command line argument (i.e. 'make all'). Other targets are:"
|
@echo "Please supply a command line argument (i.e. 'make all'). Other targets are:"
|
||||||
@echo " nagios cgis contrib modules workers"
|
@echo " nagios cgis contrib modules workers"
|
||||||
@echo " clean"
|
@echo " test"
|
||||||
@echo " install install-base install-cgis install-html install-exfoliation install-config install-init install-commandmode fullinstall"
|
@echo " install install-base"
|
||||||
|
@echo " install-cgis install-html"
|
||||||
|
@echo " install-webconf install-config"
|
||||||
|
@echo " install-init install-daemoninit"
|
||||||
|
@echo " install-commandmode install-groups-users"
|
||||||
|
@echo " install-exfoliation install-classicui"
|
||||||
|
@echo " install-basic install-unstripped"
|
||||||
|
@echo " fullinstall"
|
||||||
# @echo " uninstall"
|
# @echo " uninstall"
|
||||||
|
@echo " clean"
|
||||||
|
|
||||||
# FreeBSD make does not support -C option, so we'll use the Apache style... (patch by Stanley Hopcroft 12/27/1999)
|
# FreeBSD make does not support -C option, so we'll use the Apache style... (patch by Stanley Hopcroft 12/27/1999)
|
||||||
|
|
||||||
@ -82,8 +97,11 @@ all:
|
|||||||
@echo "*** Compile finished ***"
|
@echo "*** Compile finished ***"
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "If the main program and CGIs compiled without any errors, you"
|
@echo "If the main program and CGIs compiled without any errors, you"
|
||||||
@echo "can continue with installing Nagios as follows (type 'make'"
|
@echo "can continue with testing or installing Nagios as follows (type"
|
||||||
@echo "without any arguments for a list of all possible options):"
|
@echo "'make' without any arguments for a list of all possible options):"
|
||||||
|
@echo ""
|
||||||
|
@echo " make test"
|
||||||
|
@echo " - This runs the test suite"
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo " make install"
|
@echo " make install"
|
||||||
@echo " - This installs the main program, CGIs, and HTML files"
|
@echo " - This installs the main program, CGIs, and HTML files"
|
||||||
@ -91,6 +109,13 @@ all:
|
|||||||
@echo " make install-init"
|
@echo " make install-init"
|
||||||
@echo " - This installs the init script in $(DESTDIR)$(INIT_DIR)"
|
@echo " - This installs the init script in $(DESTDIR)$(INIT_DIR)"
|
||||||
@echo ""
|
@echo ""
|
||||||
|
@echo " make install-daemoninit"
|
||||||
|
@echo " - This will initialize the init script"
|
||||||
|
@echo " in $(DESTDIR)$(INIT_DIR)"
|
||||||
|
@echo ""
|
||||||
|
@echo " make install-groups-users"
|
||||||
|
@echo " - This adds the users and groups if they do not exist"
|
||||||
|
@echo ""
|
||||||
@echo " make install-commandmode"
|
@echo " make install-commandmode"
|
||||||
@echo " - This installs and configures permissions on the"
|
@echo " - This installs and configures permissions on the"
|
||||||
@echo " directory for holding the external command file"
|
@echo " directory for holding the external command file"
|
||||||
@ -183,6 +208,11 @@ clean:
|
|||||||
cd $(SRC_WORKERS) && $(MAKE) $@
|
cd $(SRC_WORKERS) && $(MAKE) $@
|
||||||
rm -f *.cfg core
|
rm -f *.cfg core
|
||||||
rm -f *~ *.*~ */*~ */*.*~ */*/*.*~
|
rm -f *~ *.*~ */*~ */*.*~ */*/*.*~
|
||||||
|
rm -f nagioscore.info-file
|
||||||
|
rm -f *.gcno */*.gcno */*/*.gcno
|
||||||
|
rm -f *.gcda */*.gcda */*/*.gcda
|
||||||
|
rm -f *.gcov */*.gcov */*/*.gcov
|
||||||
|
rm -rf coverage-report
|
||||||
|
|
||||||
distclean: clean
|
distclean: clean
|
||||||
cd $(SRC_LIB) && $(MAKE) $@
|
cd $(SRC_LIB) && $(MAKE) $@
|
||||||
@ -197,7 +227,7 @@ distclean: clean
|
|||||||
cd $(SRC_TTAP) && $(MAKE) $@
|
cd $(SRC_TTAP) && $(MAKE) $@
|
||||||
cd $(SRC_WORKERS) && $(MAKE) $@
|
cd $(SRC_WORKERS) && $(MAKE) $@
|
||||||
rm -f sample-config/*.cfg sample-config/*.conf sample-config/template-object/*.cfg
|
rm -f sample-config/*.cfg sample-config/*.conf sample-config/template-object/*.cfg
|
||||||
rm -f daemon-init openrc-init pkginfo
|
rm -f daemon-init daemon-service daemon-openrc pkginfo
|
||||||
rm -f Makefile subst
|
rm -f Makefile subst
|
||||||
rm -f config.log config.status config.cache
|
rm -f config.log config.status config.cache
|
||||||
rm -f tags
|
rm -f tags
|
||||||
@ -222,6 +252,16 @@ tap/src/tap.o:
|
|||||||
test-perl: cgis
|
test-perl: cgis
|
||||||
cd t && $(MAKE) test
|
cd t && $(MAKE) test
|
||||||
|
|
||||||
|
coverage: test
|
||||||
|
@if ! which lcov >/dev/null 2>&1; then \
|
||||||
|
echo "ERROR: You must install lcov and genhtml first"; \
|
||||||
|
else \
|
||||||
|
lcov -c -d . -o nagioscore.info-file; \
|
||||||
|
genhtml nagioscore.info-file -o coverage-report; \
|
||||||
|
echo "Your coverage report is in coverage-report/index.html"; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
install-html:
|
install-html:
|
||||||
cd $(SRC_HTM) && $(MAKE) install
|
cd $(SRC_HTM) && $(MAKE) install
|
||||||
$(MAKE) install-exfoliation
|
$(MAKE) install-exfoliation
|
||||||
@ -270,7 +310,6 @@ install-basic:
|
|||||||
@echo " - This installs sample config files in $(DESTDIR)$(CFGDIR)"
|
@echo " - This installs sample config files in $(DESTDIR)$(CFGDIR)"
|
||||||
@echo ""
|
@echo ""
|
||||||
|
|
||||||
|
|
||||||
install-config:
|
install-config:
|
||||||
$(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(CFGDIR)
|
$(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(CFGDIR)
|
||||||
$(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(CFGDIR)/objects
|
$(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(CFGDIR)/objects
|
||||||
@ -294,6 +333,9 @@ install-config:
|
|||||||
@echo "services, hosts, etc. to fit your particular needs."
|
@echo "services, hosts, etc. to fit your particular needs."
|
||||||
@echo ""
|
@echo ""
|
||||||
|
|
||||||
|
install-groups-users:
|
||||||
|
@autoconf-macros/add_group_user $(DIST) $(NAGIOS_USER) $(NAGIOS_GRP) 1
|
||||||
|
|
||||||
install-webconf:
|
install-webconf:
|
||||||
$(INSTALL) -m 644 sample-config/httpd.conf $(DESTDIR)$(HTTPD_CONF)/nagios.conf
|
$(INSTALL) -m 644 sample-config/httpd.conf $(DESTDIR)$(HTTPD_CONF)/nagios.conf
|
||||||
if [ $(LN_HTTPD_SITES_ENABLED) -eq 1 ]; then \
|
if [ $(LN_HTTPD_SITES_ENABLED) -eq 1 ]; then \
|
||||||
@ -338,11 +380,32 @@ install-classicui:
|
|||||||
@echo "NOTE: Use 'make install-exfoliation' to use new Nagios theme";
|
@echo "NOTE: Use 'make install-exfoliation' to use new Nagios theme";
|
||||||
@echo ""
|
@echo ""
|
||||||
|
|
||||||
install-init: install-daemoninit
|
install-init:
|
||||||
|
|
||||||
install-daemoninit:
|
|
||||||
$(INSTALL) -m 755 -d $(INIT_OPTS) $(DESTDIR)$(INIT_DIR)
|
$(INSTALL) -m 755 -d $(INIT_OPTS) $(DESTDIR)$(INIT_DIR)
|
||||||
$(INSTALL) -m 755 $(INIT_OPTS) daemon-init $(DESTDIR)$(INIT_DIR)/nagios
|
$(INSTALL) -m 755 $(INIT_OPTS) startup/$(SRC_INIT) $(DESTDIR)$(INIT_DIR)/$(INIT_FILE)
|
||||||
|
|
||||||
|
install-daemoninit: install-init
|
||||||
|
@if [ x$(INIT_TYPE) = xsysv ]; then \
|
||||||
|
if which chkconfig >/dev/null 2>&1; then \
|
||||||
|
chkconfig --add nagios; \
|
||||||
|
elif which update-rc.d >/dev/null 2>&1; then \
|
||||||
|
update-rc.d nagios defaults; \
|
||||||
|
fi \
|
||||||
|
elif [ x$(INIT_TYPE) = xsystemd ]; then \
|
||||||
|
if which systemctl >/dev/null 2>&1; then \
|
||||||
|
systemctl daemon-reload; \
|
||||||
|
systemctl enable nagios.service; \
|
||||||
|
fi; \
|
||||||
|
chmod 0644 $(INIT_DIR)/$(INIT_FILE); \
|
||||||
|
elif [ x$(INIT_TYPE) = xupstart ]; then \
|
||||||
|
if which initctl >/dev/null 2>&1; then \
|
||||||
|
initctl reload-configuration; \
|
||||||
|
fi \
|
||||||
|
elif [ x$(INIT_TYPE) = xopenrc ]; then \
|
||||||
|
if which rc-update >/dev/null 2>&1; then \
|
||||||
|
rc-update add nagios default; \
|
||||||
|
fi \
|
||||||
|
fi
|
||||||
|
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "*** Init script installed ***"
|
@echo "*** Init script installed ***"
|
||||||
|
@ -1,5 +1,10 @@
|
|||||||
Nagios 4.x README
|
Nagios 4.x
|
||||||
=================
|
==========
|
||||||
|
|
||||||
|
![Nagios!](https://www.nagios.com/wp-content/uploads/2015/05/Nagios-Black-500x124.png)
|
||||||
|
|
||||||
|
[![Build Status](https://travis-ci.org/NagiosEnterprises/nagioscore.svg?branch=master)](https://travis-ci.org/NagiosEnterprises/nagioscore)
|
||||||
|
|
||||||
|
|
||||||
Nagios is a host/service/network monitoring program written in C and
|
Nagios is a host/service/network monitoring program written in C and
|
||||||
released under the GNU General Public License, version 2. CGI programs
|
released under the GNU General Public License, version 2. CGI programs
|
||||||
@ -10,7 +15,7 @@ Visit the Nagios homepage at https://www.nagios.org for documentation,
|
|||||||
new releases, bug reports, information on discussion forums, and more.
|
new releases, bug reports, information on discussion forums, and more.
|
||||||
|
|
||||||
|
|
||||||
https://www.nagios.org/about/features/[Features]
|
[Features](https://www.nagios.org/about/features/)
|
||||||
-----------------------------------------------
|
-----------------------------------------------
|
||||||
* Monitoring of network services (via SMTP, POP3, HTTP, PING, etc).
|
* Monitoring of network services (via SMTP, POP3, HTTP, PING, etc).
|
||||||
* Monitoring of host resources (processor load, disk usage, etc.).
|
* Monitoring of host resources (processor load, disk usage, etc.).
|
||||||
@ -30,9 +35,9 @@ https://www.nagios.org/about/features/[Features]
|
|||||||
Changes
|
Changes
|
||||||
-------
|
-------
|
||||||
See the
|
See the
|
||||||
https://raw.githubusercontent.com/NagiosEnterprises/nagioscore/master/Changelog[Changelog]
|
[Changelog](https://raw.githubusercontent.com/NagiosEnterprises/nagioscore/master/Changelog)
|
||||||
for a summary of important changes and fixes, or the
|
for a summary of important changes and fixes, or the
|
||||||
https://github.com/NagiosEnterprises/nagioscore/commits/master[commit history]
|
[commit history](https://github.com/NagiosEnterprises/nagioscore/commits/master)
|
||||||
for more detail.
|
for more detail.
|
||||||
|
|
||||||
|
|
||||||
@ -43,16 +48,16 @@ Latest releases can be downloaded from https://www.nagios.org/download/
|
|||||||
|
|
||||||
Installation
|
Installation
|
||||||
------------
|
------------
|
||||||
http://nagios.sourceforge.net/docs/nagioscore/4/en/quickstart.html[Quickstart installation guides]
|
[Quickstart installation guides](http://nagios.sourceforge.net/docs/nagioscore/4/en/quickstart.html)
|
||||||
are available to help you get Nagios up and monitoring.
|
are available to help you get Nagios up and monitoring.
|
||||||
|
|
||||||
|
|
||||||
Documentation & Support
|
Documentation & Support
|
||||||
-----------------------
|
-----------------------
|
||||||
* http://nagios.sourceforge.net/docs/nagioscore/4/en/[User Guide]
|
* [User Guide](http://nagios.sourceforge.net/docs/nagioscore/4/en/)
|
||||||
* https://library.nagios.com/library/products/nagioscore/[Nagios Core Documentation Library]
|
* [Nagios Core Documentation Library](https://library.nagios.com/library/products/nagioscore/)
|
||||||
* https://support.nagios.com/forum/viewforum.php?f=7[Support Forums]
|
* [Support Forums](https://support.nagios.com/forum/viewforum.php?f=7)
|
||||||
* https://www.nagios.org/support/[Additional Support Resources]
|
* [Additional Support Resources](https://www.nagios.org/support/)
|
||||||
|
|
||||||
|
|
||||||
Contributing
|
Contributing
|
||||||
@ -60,13 +65,11 @@ Contributing
|
|||||||
The Nagios source code is hosted on GitHub:
|
The Nagios source code is hosted on GitHub:
|
||||||
https://github.com/NagiosEnterprises/nagioscore
|
https://github.com/NagiosEnterprises/nagioscore
|
||||||
|
|
||||||
Do you have an idea or feature request to make Nagios better? Join or
|
Do you have an idea or feature request to make Nagios better? Join or start a
|
||||||
start a discussion on the
|
discussion on the [Nagios Core Development forum](https://support.nagios.com/forum/viewforum.php?f=34).
|
||||||
https://support.nagios.com/forum/viewforum.php?f=34[Nagios Core Development forum].
|
Bugs can be reported by [opening an issue on GitHub](https://github.com/NagiosEnterprises/nagioscore/issues/new).
|
||||||
Bugs can be reported by
|
If you have identified a security related issue in Nagios, please contact
|
||||||
https://github.com/NagiosEnterprises/nagioscore/issues/new[opening an
|
security@nagios.com.
|
||||||
issue on GitHub]. If you have identified a security related issue in
|
|
||||||
Nagios, please contact security@nagios.com.
|
|
||||||
|
|
||||||
Patches and GitHub pull requests are welcome. Pull requests on GitHub
|
Patches and GitHub pull requests are welcome. Pull requests on GitHub
|
||||||
link commits in version control to review and discussion of the
|
link commits in version control to review and discussion of the
|
||||||
@ -76,5 +79,5 @@ who was involved.
|
|||||||
Created by Ethan Galstad, the success of Nagios has been due to the
|
Created by Ethan Galstad, the success of Nagios has been due to the
|
||||||
fantastic community members that support it and provide bug reports,
|
fantastic community members that support it and provide bug reports,
|
||||||
patches, and great ideas. See the
|
patches, and great ideas. See the
|
||||||
https://raw.githubusercontent.com/NagiosEnterprises/nagioscore/master/THANKS[THANKS file]
|
[THANKS file](https://raw.githubusercontent.com/NagiosEnterprises/nagioscore/master/THANKS)
|
||||||
for some of the many who have contributed since 1999.
|
for some of the many who have contributed since 1999.
|
8
THANKS
8
THANKS
@ -8,6 +8,7 @@ few of the many members that have contributed to Nagios in various ways
|
|||||||
since 1999. If I missed your name, misspelled it or otherwise got it
|
since 1999. If I missed your name, misspelled it or otherwise got it
|
||||||
wrong, please let me know.
|
wrong, please let me know.
|
||||||
|
|
||||||
|
* Aaron Beck
|
||||||
* Adam Bowen
|
* Adam Bowen
|
||||||
* Ahmon Dancy
|
* Ahmon Dancy
|
||||||
* Alain Radix
|
* Alain Radix
|
||||||
@ -53,8 +54,10 @@ wrong, please let me know.
|
|||||||
* Chris Kolquist
|
* Chris Kolquist
|
||||||
* Chris Rothecker
|
* Chris Rothecker
|
||||||
* Chris Witterholt
|
* Chris Witterholt
|
||||||
|
* Christian Jung
|
||||||
* Christian Masopust
|
* Christian Masopust
|
||||||
* Christian Mies
|
* Christian Mies
|
||||||
|
* Christian Zettel
|
||||||
* Christoph Biedl
|
* Christoph Biedl
|
||||||
* Christoph Kron
|
* Christoph Kron
|
||||||
* Christoph Maser
|
* Christoph Maser
|
||||||
@ -89,10 +92,12 @@ wrong, please let me know.
|
|||||||
* Evan Winter
|
* Evan Winter
|
||||||
* Felipe Almeida
|
* Felipe Almeida
|
||||||
* Florian Weimer
|
* Florian Weimer
|
||||||
|
* Fr3dY
|
||||||
* Fran Boon
|
* Fran Boon
|
||||||
* Franky Van Liedekerke
|
* Franky Van Liedekerke
|
||||||
* Frederic Schaer
|
* Frederic Schaer
|
||||||
* Frederic Van Espen
|
* Frederic Van Espen
|
||||||
|
* Gareth Randall
|
||||||
* Garry Cook
|
* Garry Cook
|
||||||
* Gary Berger
|
* Gary Berger
|
||||||
* Gary Miller
|
* Gary Miller
|
||||||
@ -185,9 +190,11 @@ wrong, please let me know.
|
|||||||
* Luiz Felipe R E
|
* Luiz Felipe R E
|
||||||
* Luke Ross
|
* Luke Ross
|
||||||
* Emmanuel Dreyfus
|
* Emmanuel Dreyfus
|
||||||
|
* Manuel Lanctot
|
||||||
* Marc Powell
|
* Marc Powell
|
||||||
* Marcus Fleige
|
* Marcus Fleige
|
||||||
* Marcus Hildenbrand
|
* Marcus Hildenbrand
|
||||||
|
* Mario Trangoni
|
||||||
* Mark DeTrano
|
* Mark DeTrano
|
||||||
* Mark Felder
|
* Mark Felder
|
||||||
* Mark Frost
|
* Mark Frost
|
||||||
@ -320,6 +327,7 @@ wrong, please let me know.
|
|||||||
* Todd Wheeler
|
* Todd Wheeler
|
||||||
* Tom Bertelson
|
* Tom Bertelson
|
||||||
* Tom De Blende
|
* Tom De Blende
|
||||||
|
* Tom Ryder
|
||||||
* Tom Welsh
|
* Tom Welsh
|
||||||
* Tomer Okavi
|
* Tomer Okavi
|
||||||
* Ton Voon
|
* Ton Voon
|
||||||
|
7
aclocal.m4
vendored
Executable file
7
aclocal.m4
vendored
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
m4_include([autoconf-macros/ax_nagios_get_os])
|
||||||
|
m4_include([autoconf-macros/ax_nagios_get_distrib])
|
||||||
|
m4_include([autoconf-macros/ax_nagios_get_init])
|
||||||
|
m4_include([autoconf-macros/ax_nagios_get_inetd])
|
||||||
|
m4_include([autoconf-macros/ax_nagios_get_paths])
|
||||||
|
m4_include([autoconf-macros/ax_nagios_get_files])
|
||||||
|
m4_include([autoconf-macros/ax_nagios_get_ssl])
|
1
autoconf-macros/.gitignore
vendored
Normal file
1
autoconf-macros/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
nbproject/
|
7
autoconf-macros/CHANGELOG.md
Normal file
7
autoconf-macros/CHANGELOG.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
1.0.1
|
||||||
|
-----
|
||||||
|
* Fix bug determining inetd,xinetd if neither are running (Bryan Heden)
|
||||||
|
|
||||||
|
1.0.0
|
||||||
|
-----
|
||||||
|
* Initial Release (John Frickson)
|
264
autoconf-macros/LICENSE
Normal file
264
autoconf-macros/LICENSE
Normal file
@ -0,0 +1,264 @@
|
|||||||
|
The GNU General Public License, Version 2, June 1991 (GPLv2)
|
||||||
|
============================================================
|
||||||
|
|
||||||
|
> Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||||
|
> 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies of this license
|
||||||
|
document, but changing it is not allowed.
|
||||||
|
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
--------
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your freedom to share
|
||||||
|
and change it. By contrast, the GNU General Public License is intended to
|
||||||
|
guarantee your freedom to share and change free software--to make sure the
|
||||||
|
software is free for all its users. This General Public License applies to most
|
||||||
|
of the Free Software Foundation's software and to any other program whose
|
||||||
|
authors commit to using it. (Some other Free Software Foundation software is
|
||||||
|
covered by the GNU Lesser General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not price. Our
|
||||||
|
General Public Licenses are designed to make sure that you have the freedom to
|
||||||
|
distribute copies of free software (and charge for this service if you wish),
|
||||||
|
that you receive source code or can get it if you want it, that you can change
|
||||||
|
the software or use pieces of it in new free programs; and that you know you can
|
||||||
|
do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid anyone to deny
|
||||||
|
you these rights or to ask you to surrender the rights. These restrictions
|
||||||
|
translate to certain responsibilities for you if you distribute copies of the
|
||||||
|
software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether gratis or for a
|
||||||
|
fee, you must give the recipients all the rights that you have. You must make
|
||||||
|
sure that they, too, receive or can get the source code. And you must show them
|
||||||
|
these terms so they know their rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and (2) offer
|
||||||
|
you this license which gives you legal permission to copy, distribute and/or
|
||||||
|
modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain that
|
||||||
|
everyone understands that there is no warranty for this free software. If the
|
||||||
|
software is modified by someone else and passed on, we want its recipients to
|
||||||
|
know that what they have is not the original, so that any problems introduced by
|
||||||
|
others will not reflect on the original authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software patents. We wish
|
||||||
|
to avoid the danger that redistributors of a free program will individually
|
||||||
|
obtain patent licenses, in effect making the program proprietary. To prevent
|
||||||
|
this, we have made it clear that any patent must be licensed for everyone's free
|
||||||
|
use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and modification
|
||||||
|
follow.
|
||||||
|
|
||||||
|
|
||||||
|
Terms And Conditions For Copying, Distribution And Modification
|
||||||
|
---------------------------------------------------------------
|
||||||
|
|
||||||
|
**0.** This License applies to any program or other work which contains a notice
|
||||||
|
placed by the copyright holder saying it may be distributed under the terms of
|
||||||
|
this General Public License. The "Program", below, refers to any such program or
|
||||||
|
work, and a "work based on the Program" means either the Program or any
|
||||||
|
derivative work under copyright law: that is to say, a work containing the
|
||||||
|
Program or a portion of it, either verbatim or with modifications and/or
|
||||||
|
translated into another language. (Hereinafter, translation is included without
|
||||||
|
limitation in the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not covered by
|
||||||
|
this License; they are outside its scope. The act of running the Program is not
|
||||||
|
restricted, and the output from the Program is covered only if its contents
|
||||||
|
constitute a work based on the Program (independent of having been made by
|
||||||
|
running the Program). Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
**1.** You may copy and distribute verbatim copies of the Program's source code
|
||||||
|
as you receive it, in any medium, provided that you conspicuously and
|
||||||
|
appropriately publish on each copy an appropriate copyright notice and
|
||||||
|
disclaimer of warranty; keep intact all the notices that refer to this License
|
||||||
|
and to the absence of any warranty; and give any other recipients of the Program
|
||||||
|
a copy of this License along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and you may at
|
||||||
|
your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
**2.** You may modify your copy or copies of the Program or any portion of it,
|
||||||
|
thus forming a work based on the Program, and copy and distribute such
|
||||||
|
modifications or work under the terms of Section 1 above, provided that you also
|
||||||
|
meet all of these conditions:
|
||||||
|
|
||||||
|
* **a)** You must cause the modified files to carry prominent notices stating
|
||||||
|
that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
* **b)** You must cause any work that you distribute or publish, that in whole
|
||||||
|
or in part contains or is derived from the Program or any part thereof, to
|
||||||
|
be licensed as a whole at no charge to all third parties under the terms of
|
||||||
|
this License.
|
||||||
|
|
||||||
|
* **c)** If the modified program normally reads commands interactively when
|
||||||
|
run, you must cause it, when started running for such interactive use in the
|
||||||
|
most ordinary way, to print or display an announcement including an
|
||||||
|
appropriate copyright notice and a notice that there is no warranty (or
|
||||||
|
else, saying that you provide a warranty) and that users may redistribute
|
||||||
|
the program under these conditions, and telling the user how to view a copy
|
||||||
|
of this License. (Exception: if the Program itself is interactive but does
|
||||||
|
not normally print such an announcement, your work based on the Program is
|
||||||
|
not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If identifiable
|
||||||
|
sections of that work are not derived from the Program, and can be reasonably
|
||||||
|
considered independent and separate works in themselves, then this License, and
|
||||||
|
its terms, do not apply to those sections when you distribute them as separate
|
||||||
|
works. But when you distribute the same sections as part of a whole which is a
|
||||||
|
work based on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the entire whole,
|
||||||
|
and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest your
|
||||||
|
rights to work written entirely by you; rather, the intent is to exercise the
|
||||||
|
right to control the distribution of derivative or collective works based on the
|
||||||
|
Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program with the
|
||||||
|
Program (or with a work based on the Program) on a volume of a storage or
|
||||||
|
distribution medium does not bring the other work under the scope of this
|
||||||
|
License.
|
||||||
|
|
||||||
|
**3.** You may copy and distribute the Program (or a work based on it, under
|
||||||
|
Section 2) in object code or executable form under the terms of Sections 1 and 2
|
||||||
|
above provided that you also do one of the following:
|
||||||
|
|
||||||
|
* **a)** Accompany it with the complete corresponding machine-readable source
|
||||||
|
code, which must be distributed under the terms of Sections 1 and 2 above on
|
||||||
|
a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
* **b)** Accompany it with a written offer, valid for at least three years, to
|
||||||
|
give any third party, for a charge no more than your cost of physically
|
||||||
|
performing source distribution, a complete machine-readable copy of the
|
||||||
|
corresponding source code, to be distributed under the terms of Sections 1
|
||||||
|
and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
* **c)** Accompany it with the information you received as to the offer to
|
||||||
|
distribute corresponding source code. (This alternative is allowed only for
|
||||||
|
noncommercial distribution and only if you received the program in object
|
||||||
|
code or executable form with such an offer, in accord with Subsection b
|
||||||
|
above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for making
|
||||||
|
modifications to it. For an executable work, complete source code means all the
|
||||||
|
source code for all modules it contains, plus any associated interface
|
||||||
|
definition files, plus the scripts used to control compilation and installation
|
||||||
|
of the executable. However, as a special exception, the source code distributed
|
||||||
|
need not include anything that is normally distributed (in either source or
|
||||||
|
binary form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component itself
|
||||||
|
accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering access to copy
|
||||||
|
from a designated place, then offering equivalent access to copy the source code
|
||||||
|
from the same place counts as distribution of the source code, even though third
|
||||||
|
parties are not compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
**4.** You may not copy, modify, sublicense, or distribute the Program except as
|
||||||
|
expressly provided under this License. Any attempt otherwise to copy, modify,
|
||||||
|
sublicense or distribute the Program is void, and will automatically terminate
|
||||||
|
your rights under this License. However, parties who have received copies, or
|
||||||
|
rights, from you under this License will not have their licenses terminated so
|
||||||
|
long as such parties remain in full compliance.
|
||||||
|
|
||||||
|
**5.** You are not required to accept this License, since you have not signed
|
||||||
|
it. However, nothing else grants you permission to modify or distribute the
|
||||||
|
Program or its derivative works. These actions are prohibited by law if you do
|
||||||
|
not accept this License. Therefore, by modifying or distributing the Program (or
|
||||||
|
any work based on the Program), you indicate your acceptance of this License to
|
||||||
|
do so, and all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
**6.** Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the original
|
||||||
|
licensor to copy, distribute or modify the Program subject to these terms and
|
||||||
|
conditions. You may not impose any further restrictions on the recipients'
|
||||||
|
exercise of the rights granted herein. You are not responsible for enforcing
|
||||||
|
compliance by third parties to this License.
|
||||||
|
|
||||||
|
**7.** If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues), conditions
|
||||||
|
are imposed on you (whether by court order, agreement or otherwise) that
|
||||||
|
contradict the conditions of this License, they do not excuse you from the
|
||||||
|
conditions of this License. If you cannot distribute so as to satisfy
|
||||||
|
simultaneously your obligations under this License and any other pertinent
|
||||||
|
obligations, then as a consequence you may not distribute the Program at all.
|
||||||
|
For example, if a patent license would not permit royalty-free redistribution of
|
||||||
|
the Program by all those who receive copies directly or indirectly through you,
|
||||||
|
then the only way you could satisfy both it and this License would be to refrain
|
||||||
|
entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under any
|
||||||
|
particular circumstance, the balance of the section is intended to apply and the
|
||||||
|
section as a whole is intended to apply in other circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any patents or
|
||||||
|
other property right claims or to contest validity of any such claims; this
|
||||||
|
section has the sole purpose of protecting the integrity of the free software
|
||||||
|
distribution system, which is implemented by public license practices. Many
|
||||||
|
people have made generous contributions to the wide range of software
|
||||||
|
distributed through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing to
|
||||||
|
distribute software through any other system and a licensee cannot impose that
|
||||||
|
choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to be a
|
||||||
|
consequence of the rest of this License.
|
||||||
|
|
||||||
|
**8.** If the distribution and/or use of the Program is restricted in certain
|
||||||
|
countries either by patents or by copyrighted interfaces, the original copyright
|
||||||
|
holder who places the Program under this License may add an explicit
|
||||||
|
geographical distribution limitation excluding those countries, so that
|
||||||
|
distribution is permitted only in or among countries not thus excluded. In such
|
||||||
|
case, this License incorporates the limitation as if written in the body of this
|
||||||
|
License.
|
||||||
|
|
||||||
|
**9.** The Free Software Foundation may publish revised and/or new versions of
|
||||||
|
the General Public License from time to time. Such new versions will be similar
|
||||||
|
in spirit to the present version, but may differ in detail to address new
|
||||||
|
problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program specifies
|
||||||
|
a version number of this License which applies to it and "any later version",
|
||||||
|
you have the option of following the terms and conditions either of that version
|
||||||
|
or of any later version published by the Free Software Foundation. If the
|
||||||
|
Program does not specify a version number of this License, you may choose any
|
||||||
|
version ever published by the Free Software Foundation.
|
||||||
|
|
||||||
|
**10.** If you wish to incorporate parts of the Program into other free programs
|
||||||
|
whose distribution conditions are different, write to the author to ask for
|
||||||
|
permission. For software which is copyrighted by the Free Software Foundation,
|
||||||
|
write to the Free Software Foundation; we sometimes make exceptions for this.
|
||||||
|
Our decision will be guided by the two goals of preserving the free status of
|
||||||
|
all derivatives of our free software and of promoting the sharing and reuse of
|
||||||
|
software generally.
|
||||||
|
|
||||||
|
|
||||||
|
No Warranty
|
||||||
|
-----------
|
||||||
|
|
||||||
|
**11.** BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
|
||||||
|
THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
|
||||||
|
STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM
|
||||||
|
"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
||||||
|
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||||
|
PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||||
|
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
**12.** IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE
|
||||||
|
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||||
|
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
|
||||||
|
INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
|
||||||
|
BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||||
|
FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER
|
||||||
|
OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
1
autoconf-macros/LICENSE.md
Symbolic link
1
autoconf-macros/LICENSE.md
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
LICENSE
|
199
autoconf-macros/README.md
Normal file
199
autoconf-macros/README.md
Normal file
@ -0,0 +1,199 @@
|
|||||||
|
autoconf-macros
|
||||||
|
===============
|
||||||
|
|
||||||
|
The purpose of Nagios autoconf-macros is to have a central place for
|
||||||
|
autoconf macros that can be maintained in one place, but be used by any
|
||||||
|
of the Nagios software. It is intended to be used as a git subtree.
|
||||||
|
See the [Usage](#usage) and [References](#references) sections below.
|
||||||
|
|
||||||
|
Since this project will be included in several parent projects, any
|
||||||
|
changes must be as project-neutral as possible.
|
||||||
|
|
||||||
|
Make sure to check out the [CHANGELOG](CHANGELOG.md) for relevant
|
||||||
|
information, as well.
|
||||||
|
|
||||||
|
|
||||||
|
Contents
|
||||||
|
--------
|
||||||
|
|
||||||
|
The collection consists of the following macros:
|
||||||
|
|
||||||
|
### AX_NAGIOS_GET_OS alias AC_NAGIOS_GET_OS
|
||||||
|
|
||||||
|
> Output Variable : `opsys`
|
||||||
|
|
||||||
|
This macro detects the operating system, and transforms it into a generic
|
||||||
|
label. The most common OS's that use Nagios software are recognized and
|
||||||
|
used in subsequent macros.
|
||||||
|
|
||||||
|
### AX_NAGIOS_GET_DISTRIB_TYPE alias AC_NAGIOS_GET_DISTRIB_TYPE
|
||||||
|
|
||||||
|
> Output Variables : `dist_type`, `dist_ver`
|
||||||
|
|
||||||
|
This macro detects the distribution type. For Linux, this would be rh
|
||||||
|
(for Red Hat and derivatives), suse (OpenSUSE, SLES, derivatives), gentoo
|
||||||
|
(Gentoo and derivatives), debian (Debian and derivatives), and so on.
|
||||||
|
For BSD, this would be openbsd, netbsd, freebsd, dragonfly, etc. It can
|
||||||
|
also be aix, solaris, osx, and so on for Unix operating systems.
|
||||||
|
|
||||||
|
### AX_NAGIOS_GET_INIT alias AC_NAGIOS_GET_INIT
|
||||||
|
|
||||||
|
> Output Variable : `init_type`
|
||||||
|
|
||||||
|
This macro detects what software is used to start daemons on bootup
|
||||||
|
or on request, generally knows as the "init system". The init_type
|
||||||
|
will generally be one of sysv (many), bsd (Slackware), newbsd (*BSD),
|
||||||
|
launchd (OS X), smf10 or smf11 (Solaris), systemd (newer Linux),
|
||||||
|
gentoo (older Gentoo), upstart (several), or unknown.
|
||||||
|
|
||||||
|
### AX_NAGIOS_GET_INETD alias AC_NAGIOS_GET_INETD
|
||||||
|
|
||||||
|
> Output Variable : `inetd_type`
|
||||||
|
|
||||||
|
This macro detects what software is used to start daemons or services
|
||||||
|
on demand, which historically has been "inetd". The inetd_type
|
||||||
|
will generally be one of inetd, xinetd, launchd (OS X), smf10 or smf11
|
||||||
|
(Solaris), systemd (newer Linux), upstart (several), or unknown.
|
||||||
|
|
||||||
|
### AX_NAGIOS_GET_PATHS alias AC_NAGIOS_GET_PATHS
|
||||||
|
|
||||||
|
> Output Variables : **many!**
|
||||||
|
|
||||||
|
This macro determines the installation paths for binaries, config files,
|
||||||
|
PID files, and so on. For a "standard" install of Nagios, NRPE, NDO Utils,
|
||||||
|
etc., most will be in the /usr/local/nagios hierarchy with startup files
|
||||||
|
located in /etc. For distributions or software repositories, the
|
||||||
|
"--enable-install-method=os" option can be used. This will determine the
|
||||||
|
O/S dependent directories, such as /usr/bin, /usr/sbin, /var/lib/nagios,
|
||||||
|
/usr/lib/nagios, etc. or for OS X, /Library/LaunchDaemons.
|
||||||
|
|
||||||
|
### AX_NAGIOS_GET_FILES alias AC_NAGIOS_GET_FILES
|
||||||
|
|
||||||
|
> Output Variables : `src_init`, `src_inetd`, `src_tmpfile`
|
||||||
|
|
||||||
|
Each Nagios project will have a top-level directory named "/startup/".
|
||||||
|
In that directory will be "*.in" files for the various "init_type" and
|
||||||
|
"inetd_type" systems. This macro will determine which file(s) from
|
||||||
|
that directory will be needed.
|
||||||
|
|
||||||
|
### AX_NAGIOS_GET_SSL alias AC_NAGIOS_GET_SSL
|
||||||
|
|
||||||
|
> Output Variables : `HAVE_KRB5_H`, `HAVE_SSL`, `SSL_INC_DIR`, `SSL_LIB_DIR`, `CFLAGS`, `LDFLAGS`, `LIBS`
|
||||||
|
|
||||||
|
This macro checks various directories for SSL libraries and header files.
|
||||||
|
The searches are based on known install locations on various operating
|
||||||
|
systems and distributions, for openssl, gnutls-openssl, and nss_compat_ossl.
|
||||||
|
If it finds the headers and libraries, it will then do an `AC_LINK_IFELSE`
|
||||||
|
on a simple program to make sure a compile and link will work correctly.
|
||||||
|
|
||||||
|
|
||||||
|
Usage
|
||||||
|
-----
|
||||||
|
|
||||||
|
This repo is intended to be used as a git subtree, so changes will
|
||||||
|
automatically propagate, and still be reasonably easy to use.
|
||||||
|
|
||||||
|
* First, Create, checkout, clone, or branch your project. If you do an
|
||||||
|
`ls -AF` it might look something like this:
|
||||||
|
|
||||||
|
.git/ .gitignore ChangeLog LICENSE Makefile.in
|
||||||
|
README configure.ac include/ src/
|
||||||
|
|
||||||
|
* Then make a reference to _this_ project inside your project.
|
||||||
|
|
||||||
|
git remote add autoconf-macros git@github.com:NagiosEnterprises/autoconf-macros
|
||||||
|
git subtree add --prefix=macros/ autoconf-macros master
|
||||||
|
|
||||||
|
* After executing the above two commands, if you do an `ls -AF` now,
|
||||||
|
it should look like this:
|
||||||
|
|
||||||
|
.git/ .gitignore ChangeLog LICENSE Makefile.in
|
||||||
|
README configure.ac include/ macros/ src/
|
||||||
|
|
||||||
|
* The `macros/` directory has been added.
|
||||||
|
|
||||||
|
* Now do a `git push` to save everything.
|
||||||
|
|
||||||
|
* If you make any changes to autoconf-macros, commit them separately
|
||||||
|
from any parent-project changes to keep from polluting the commit
|
||||||
|
history with unrelated comments.
|
||||||
|
|
||||||
|
* To submit your changes to autoconf-macros:
|
||||||
|
|
||||||
|
git subtree push --prefix=macros autoconf-macros peters-updates
|
||||||
|
This will create a new branch called `peters-updates`. You then need to
|
||||||
|
create a _pull request_ to get your changes merged into autoconf-macros
|
||||||
|
master.
|
||||||
|
|
||||||
|
* To get the latest version of `autoconf-macros` into your parent project:
|
||||||
|
|
||||||
|
git subtgree pull --squash --prefix=macros autoconf-macros master
|
||||||
|
|
||||||
|
|
||||||
|
References
|
||||||
|
----------
|
||||||
|
|
||||||
|
Now that autoconf-macros is available to your project, you will need to
|
||||||
|
reference it.
|
||||||
|
|
||||||
|
* Create (or add these lines to) file `YourProject/aclocal.m4`
|
||||||
|
|
||||||
|
m4_include([macros/ax_nagios_get_os])
|
||||||
|
m4_include([macros/ax_nagios_get_distrib])
|
||||||
|
m4_include([macros/ax_nagios_get_init])
|
||||||
|
m4_include([macros/ax_nagios_get_inetd])
|
||||||
|
m4_include([macros/ax_nagios_get_paths])
|
||||||
|
m4_include([macros/ax_nagios_get_files])
|
||||||
|
m4_include([macros/ax_nagios_get_ssl])
|
||||||
|
|
||||||
|
* In your `YourProject/configure.ac` add the following lines. A good place
|
||||||
|
to put them would be right after any `AC_PROG_*` entries:
|
||||||
|
|
||||||
|
AC_NAGIOS_GET_OS
|
||||||
|
AC_NAGIOS_GET_DISTRIB_TYPE
|
||||||
|
AC_NAGIOS_GET_INIT
|
||||||
|
AC_NAGIOS_GET_INETD
|
||||||
|
AC_NAGIOS_GET_PATHS
|
||||||
|
AC_NAGIOS_GET_FILES
|
||||||
|
|
||||||
|
* If you need SSL functionality, add the following to `YourProject/configure.ac`
|
||||||
|
where you want to check for SSL:
|
||||||
|
|
||||||
|
AC_NAGIOS_GET_SSL
|
||||||
|
|
||||||
|
* You will now be able to reference any of the variables in `config.h.in`
|
||||||
|
and any files listed in the `AC_CONFIG_FILES` macro in `configure.ac`.
|
||||||
|
|
||||||
|
|
||||||
|
License Notice
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Copyright (c) 2016-2017 Nagios Enterprises, LLC
|
||||||
|
|
||||||
|
This work is made available to you under the terms of Version 2 of
|
||||||
|
the GNU General Public License. A copy of that license should have
|
||||||
|
been provided with this software, but in any event can be obtained
|
||||||
|
from http://www.fsf.org.
|
||||||
|
|
||||||
|
This work is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||||
|
02110-1301 or visit their web page on the internet at
|
||||||
|
http://www.fsf.org.
|
||||||
|
|
||||||
|
|
||||||
|
Questions?
|
||||||
|
----------
|
||||||
|
|
||||||
|
If you have questions about this addon, or problems getting things
|
||||||
|
working, first try searching the nagios-users mailing list archives.
|
||||||
|
Details on searching the list archives can be found at
|
||||||
|
http://www.nagios.org
|
||||||
|
|
||||||
|
If you don't find an answer there, post a message in the Nagios
|
||||||
|
Plugin Development forum at https://support.nagios.com/forum/viewforum.php?f=35
|
164
autoconf-macros/add_group_user
Executable file
164
autoconf-macros/add_group_user
Executable file
@ -0,0 +1,164 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
#----------------------
|
||||||
|
# Initialize variables
|
||||||
|
#----------------------
|
||||||
|
dist="$1"
|
||||||
|
uid="$2"
|
||||||
|
gid="$3"
|
||||||
|
rc=0
|
||||||
|
|
||||||
|
#------------------------------------------------------------------
|
||||||
|
# Determine if the user should be created with a shell environment
|
||||||
|
# 0 = no shell (more secure)
|
||||||
|
# 1 = shell (less secure but sometimes required)
|
||||||
|
#------------------------------------------------------------------
|
||||||
|
shell=0
|
||||||
|
if [ $# -eq 4 ]; then
|
||||||
|
if [ x$4 = x1 ]; then
|
||||||
|
shell=1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
#-------------------------------------
|
||||||
|
# Check if the specified group exists
|
||||||
|
#-------------------------------------
|
||||||
|
group_exists(){
|
||||||
|
case $dist in
|
||||||
|
osx) rc=`dscl . -read /Groups/$gid >/dev/null 2>&1; echo $?` ;;
|
||||||
|
hpux) rc=`grget -n $gid >/dev/null 2>&1; echo $?` ;;
|
||||||
|
aix) rc=`lsgroup -a $gid >/dev/null 2>&1; echo $?` ;;
|
||||||
|
*) rc=`getent group $gid > /dev/null 2>&1; echo $?` ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo $rc
|
||||||
|
}
|
||||||
|
|
||||||
|
#------------------------
|
||||||
|
# Add the specified user
|
||||||
|
#------------------------
|
||||||
|
add_user(){
|
||||||
|
rc=`id "$uid" > /dev/null 2>&1; echo $?`
|
||||||
|
if test $rc -eq 0; then
|
||||||
|
echo "User $uid already exists" > /dev/stderr
|
||||||
|
echo 0
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $dist in
|
||||||
|
aix)
|
||||||
|
echo useradd -g $gid $uid > /dev/stderr
|
||||||
|
rc=`useradd -g $gid $uid; echo $?`
|
||||||
|
;;
|
||||||
|
|
||||||
|
hpux)
|
||||||
|
echo useradd -m -g $gid $uid > /dev/stderr
|
||||||
|
rc=`useradd -m -g $gid $uid; echo $?`
|
||||||
|
;;
|
||||||
|
|
||||||
|
solaris)
|
||||||
|
echo useradd -m -d /export/home/$uid -g $gid $uid > /dev/stderr
|
||||||
|
rc=`useradd -m -d /export/home/$uid -g $gid $uid; echo $?`
|
||||||
|
;;
|
||||||
|
|
||||||
|
osx)
|
||||||
|
newid=`dscl . -list /Users UniqueID | tr -s ' ' | cut -d' ' -f2 | sort -n | tail -1`
|
||||||
|
newid=`expr 1 + $newid`
|
||||||
|
echo dscl . -create /Users/$uid > /dev/stderr
|
||||||
|
dscl . -create /Users/$uid
|
||||||
|
echo dscl . -create /Users/$uid UniqueID $newid > /dev/stderr
|
||||||
|
dscl . -create /Users/$uid UniqueID $newid
|
||||||
|
if [ $shell = 0 ]; then
|
||||||
|
echo dscl . -create /Users/$uid UserShell /usr/bin/false > /dev/stderr
|
||||||
|
dscl . -create /Users/$uid UserShell /usr/bin/false
|
||||||
|
fi
|
||||||
|
echo dscl . -create /Users/$uid PrimaryGroupID 20 > /dev/stderr
|
||||||
|
dscl . -create /Users/$uid PrimaryGroupID 20
|
||||||
|
echo dscl . -append /Groups/$gid GroupMembership $uid > /dev/stderr
|
||||||
|
rc=`dscl . -append /Groups/$gid GroupMembership $uid; echo $?`
|
||||||
|
;;
|
||||||
|
|
||||||
|
freebsd)
|
||||||
|
if [ $shell = 0 ]; then
|
||||||
|
echo pw add user $uid -g $gid -s /usr/bin/false > /dev/stderr
|
||||||
|
rc=`pw add user $uid -g $gid -s /usr/bin/false; echo $?`
|
||||||
|
else
|
||||||
|
echo pw add user $uid -g $gid > /dev/stderr
|
||||||
|
rc=`pw add user $uid -g $gid; echo $?`
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
netbsd|openbsd)
|
||||||
|
echo useradd -g $gid $uid > /dev/stderr
|
||||||
|
rc=`useradd -g $gid $uid; echo $?`
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
if [ $shell = 0 ]; then
|
||||||
|
echo useradd -r -g $gid $uid > /dev/stderr
|
||||||
|
rc=`useradd -r -g $gid $uid; echo $?`
|
||||||
|
else
|
||||||
|
echo useradd -g $gid $uid > /dev/stderr
|
||||||
|
rc=`useradd -g $gid $uid; echo $?`
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo $rc
|
||||||
|
}
|
||||||
|
|
||||||
|
#-------------------------
|
||||||
|
# Add the specified group
|
||||||
|
#-------------------------
|
||||||
|
add_group(){
|
||||||
|
rc=`group_exists`
|
||||||
|
if test $rc -eq 0; then
|
||||||
|
echo "Group $gid already exists" > /dev/stderr
|
||||||
|
echo 0
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $dist in
|
||||||
|
aix)
|
||||||
|
echo mkgroup $gid > /dev/stderr
|
||||||
|
rc=`mkgroup "$gid"; echo $?`
|
||||||
|
;;
|
||||||
|
|
||||||
|
hpux|solaris)
|
||||||
|
echo groupadd $gid > /dev/stderr
|
||||||
|
rc=`groupadd "$gid"; echo $?`
|
||||||
|
;;
|
||||||
|
|
||||||
|
osx)
|
||||||
|
newid=`dscl . -list /Groups gid | tr -s ' ' | cut -d' ' -f2 | sort -n | tail -1`
|
||||||
|
newid=`expr 1 + $newid`
|
||||||
|
echo dscl . -create /Groups/$gid gid $newid > /dev/stderr
|
||||||
|
rc=`dscl . -create /Groups/$gid gid $newid; echo $?`
|
||||||
|
;;
|
||||||
|
|
||||||
|
freebsd)
|
||||||
|
echo pw add group $gid > /dev/stderr
|
||||||
|
rc=`pw add group $gid; echo $?`
|
||||||
|
;;
|
||||||
|
|
||||||
|
netbsd|openbsd)
|
||||||
|
echo groupadd $gid > /dev/stderr
|
||||||
|
rc=`groupadd $gid; echo $?`
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo groupadd -r $gid > /dev/stderr
|
||||||
|
rc=`groupadd -r $gid; echo $?`
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo $rc
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
rc=`add_group`
|
||||||
|
if test $rc -ne 0; then
|
||||||
|
exit 1;
|
||||||
|
fi
|
||||||
|
rc=`add_user`
|
||||||
|
exit $rc
|
160
autoconf-macros/ax_nagios_get_distrib
Normal file
160
autoconf-macros/ax_nagios_get_distrib
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_NAGIOS_GET_DISTRIB_TYPE
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# This macro determines the O/S distribution of the computer it is run on.
|
||||||
|
# $dist_type will be set and will be one of:
|
||||||
|
# unknown (could not be determined)
|
||||||
|
# freebsd, netbsd, openbsd, dragonfly, etc (The BSDs)
|
||||||
|
# suse, rh, debian, gentoo (and possibly their descendants)
|
||||||
|
# Other major Linux distributions (and possibly their descendants)
|
||||||
|
# The O/S name for the rest
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2016 Nagios Core Development Team
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by the
|
||||||
|
# Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
# option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
# Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||||
|
# gives unlimited permission to copy, distribute and modify the configure
|
||||||
|
# scripts that are the output of Autoconf when processing the Macro. You
|
||||||
|
# need not follow the terms of the GNU General Public License when using
|
||||||
|
# or distributing such scripts, even though portions of the text of the
|
||||||
|
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||||
|
# all other use of the material that constitutes the Autoconf Macro.
|
||||||
|
#
|
||||||
|
# This special exception to the GPL applies to versions of the Autoconf
|
||||||
|
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||||
|
# modified version of the Autoconf Macro, you may extend this special
|
||||||
|
# exception to the GPL to apply to your modified version as well.
|
||||||
|
# ===========================================================================
|
||||||
|
|
||||||
|
AU_ALIAS([AC_NAGIOS_GET_DISTRIB_TYPE], [AX_NAGIOS_GET_DISTRIB_TYPE])
|
||||||
|
AC_DEFUN([AX_NAGIOS_GET_DISTRIB_TYPE],
|
||||||
|
[
|
||||||
|
|
||||||
|
AC_SUBST(dist_type)
|
||||||
|
AC_SUBST(dist_ver)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Get user hints for possible cross-compile
|
||||||
|
#
|
||||||
|
AC_MSG_CHECKING(what the distribution type is )
|
||||||
|
AC_ARG_WITH(dist-type, AC_HELP_STRING([--with-dist-type=type],
|
||||||
|
[specify distribution type (suse, rh, debian, etc.)]),
|
||||||
|
[
|
||||||
|
#
|
||||||
|
# Run this if --with was specified
|
||||||
|
#
|
||||||
|
if test "x$withval" = x -o x$withval = xno; then
|
||||||
|
dist_type_wanted=yes
|
||||||
|
else
|
||||||
|
dist_type_wanted=no
|
||||||
|
dist_type="$withval"
|
||||||
|
dist_ver="unknown"
|
||||||
|
AC_MSG_RESULT($dist_type)
|
||||||
|
fi
|
||||||
|
], [
|
||||||
|
#
|
||||||
|
# Run this if --with was not specified
|
||||||
|
#
|
||||||
|
dist_type_wanted=yes
|
||||||
|
])
|
||||||
|
|
||||||
|
if test x$dist_type = xno; then
|
||||||
|
dist_type_wanted=yes
|
||||||
|
elif test x$dist_type = xyes; then
|
||||||
|
AC_MSG_ERROR([you must enter a distribution type if '--with-dist-type' is specified])
|
||||||
|
fi
|
||||||
|
|
||||||
|
#
|
||||||
|
# Determine distribution type if it wasn't supplied
|
||||||
|
#
|
||||||
|
dist_ver="unknown"
|
||||||
|
|
||||||
|
if test $dist_type_wanted=yes; then
|
||||||
|
dist_type="unknown"
|
||||||
|
|
||||||
|
if test "$opsys" != "linux"; then
|
||||||
|
dist_type="$opsys"
|
||||||
|
AS_CASE([$opsys],
|
||||||
|
[bsd],
|
||||||
|
dist_type=`uname -s | tr ["[A-Z]" "[a-z]"]`
|
||||||
|
dist_ver=`uname -r`,
|
||||||
|
[aix],
|
||||||
|
dist_ver="`uname -v`.`uname -r`",
|
||||||
|
[hp-ux],
|
||||||
|
dist_ver=`uname -r | cut -d'.' -f1-3`,
|
||||||
|
[solaris],
|
||||||
|
dist_ver=`uname -r | cut -d'.' -f2`,
|
||||||
|
[*],
|
||||||
|
dist_ver=$OSTYPE
|
||||||
|
)
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
if test -r "/etc/gentoo-release"; then
|
||||||
|
dist_type="gentoo"
|
||||||
|
dist_ver=`cat /etc/gentoo-release`
|
||||||
|
|
||||||
|
elif test -r "/etc/os-release"; then
|
||||||
|
. /etc/os-release
|
||||||
|
if test x"$ID_LIKE" != x; then
|
||||||
|
dist_type=`echo $ID_LIKE | cut -d' ' -f1 | tr ["[A-Z]" "[a-z]"]`
|
||||||
|
elif test x"$ID" = xol; then
|
||||||
|
dist_type=rh
|
||||||
|
else
|
||||||
|
dist_type=`echo $ID | tr ["[A-Z]" "[a-z]"]`
|
||||||
|
fi
|
||||||
|
if test x"$dist_type" = sles; then
|
||||||
|
dist_type=suse
|
||||||
|
fi
|
||||||
|
if test x"$VERSION_ID" != x; then
|
||||||
|
dist_ver=$VERSION_ID
|
||||||
|
elif test x"$VERSION" != x; then
|
||||||
|
dist_ver=`echo $VERSION | cut -d'.' -f1 | tr -d [:alpha:][:blank:][:punct:]`
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif test -r "/etc/redhat-release"; then
|
||||||
|
dist_type=rh
|
||||||
|
dist_ver=`cat /etc/redhat-release`
|
||||||
|
|
||||||
|
elif test -r "/etc/debian_version"; then
|
||||||
|
dist_type="debian"
|
||||||
|
if test -r "/etc/lsb-release"; then
|
||||||
|
. /etc/lsb-release
|
||||||
|
dist_ver=`echo "$DISTRIB_RELEASE"`
|
||||||
|
else
|
||||||
|
dist_ver=`cat /etc/debian_version`
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif test -r "/etc/SuSE-release"; then
|
||||||
|
dist_type=suse
|
||||||
|
dist_ver=`grep VERSION /etc/SuSE-release`
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$dist_ver" != "unknown"; then
|
||||||
|
dist_ver=`echo "$dist_ver" | cut -d'.' -f1 | tr -d [:alpha:][:blank:][:punct:]`
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_MSG_RESULT($dist_type)
|
||||||
|
])
|
131
autoconf-macros/ax_nagios_get_files
Normal file
131
autoconf-macros/ax_nagios_get_files
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_NAGIOS_GET_FILES
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# This macro figures out which init and/or inetd files to use based
|
||||||
|
# on the results of the AX_NAGIOS_GET_OS, AX_NAGIOS_GET_DISTRIB_TYPE,
|
||||||
|
# AX_NAGIOS_GET_INIT and AX_NAGIOS_GET_INETD macros. It will select
|
||||||
|
# the appropriate files(s) from the 'startup' directory and copy it.
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2016 Nagios Core Development Team
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by the
|
||||||
|
# Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
# option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
# Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||||
|
# gives unlimited permission to copy, distribute and modify the configure
|
||||||
|
# scripts that are the output of Autoconf when processing the Macro. You
|
||||||
|
# need not follow the terms of the GNU General Public License when using
|
||||||
|
# or distributing such scripts, even though portions of the text of the
|
||||||
|
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||||
|
# all other use of the material that constitutes the Autoconf Macro.
|
||||||
|
#
|
||||||
|
# This special exception to the GPL applies to versions of the Autoconf
|
||||||
|
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||||
|
# modified version of the Autoconf Macro, you may extend this special
|
||||||
|
# exception to the GPL to apply to your modified version as well.
|
||||||
|
# ===========================================================================
|
||||||
|
|
||||||
|
AU_ALIAS([AC_NAGIOS_GET_FILES], [AX_NAGIOS_GET_FILES])
|
||||||
|
AC_DEFUN([AX_NAGIOS_GET_FILES],
|
||||||
|
[
|
||||||
|
|
||||||
|
AC_SUBST(src_init)
|
||||||
|
AC_SUBST(src_inetd)
|
||||||
|
AC_SUBST(src_tmpfile)
|
||||||
|
AC_SUBST(bsd_enable)
|
||||||
|
|
||||||
|
src_inetd=""
|
||||||
|
src_init=""
|
||||||
|
bsd_enable=""
|
||||||
|
|
||||||
|
AC_MSG_CHECKING(for which init file to use )
|
||||||
|
|
||||||
|
AS_CASE([$init_type],
|
||||||
|
|
||||||
|
[sysv],
|
||||||
|
src_init=default-init,
|
||||||
|
|
||||||
|
[systemd],
|
||||||
|
src_tmpfile=tmpfile.conf
|
||||||
|
src_init=default-service,
|
||||||
|
|
||||||
|
[bsd],
|
||||||
|
src_init=bsd-init,
|
||||||
|
|
||||||
|
[newbsd],
|
||||||
|
if test $dist_type = freebsd ; then
|
||||||
|
bsd_enable="_enable"
|
||||||
|
src_init=default-init
|
||||||
|
elif test $dist_type = openbsd ; then
|
||||||
|
bsd_enable="_flags"
|
||||||
|
src_init=openbsd-init
|
||||||
|
elif test $dist_type = netbsd ; then
|
||||||
|
bsd_enable=""
|
||||||
|
src_init=newbsd-init
|
||||||
|
fi,
|
||||||
|
|
||||||
|
# [gentoo],
|
||||||
|
|
||||||
|
[openrc],
|
||||||
|
src_init=openrc-init,
|
||||||
|
|
||||||
|
[smf*],
|
||||||
|
src_init="solaris-init.xml"
|
||||||
|
src_inetd="solaris-inetd.xml",
|
||||||
|
|
||||||
|
[upstart],
|
||||||
|
if test $dist_type = rh ; then
|
||||||
|
src_init=rh-upstart-init
|
||||||
|
else
|
||||||
|
src_init=upstart-init
|
||||||
|
fi,
|
||||||
|
|
||||||
|
[launchd],
|
||||||
|
src_init="mac-init.plist",
|
||||||
|
|
||||||
|
[*],
|
||||||
|
src_init="unknown"
|
||||||
|
)
|
||||||
|
AC_MSG_RESULT($src_init)
|
||||||
|
|
||||||
|
AC_MSG_CHECKING(for which inetd files to use )
|
||||||
|
|
||||||
|
if test x$src_inetd = x; then
|
||||||
|
|
||||||
|
AS_CASE([$inetd_type],
|
||||||
|
[inetd*],
|
||||||
|
src_inetd=default-inetd,
|
||||||
|
|
||||||
|
[xinetd],
|
||||||
|
src_inetd=default-xinetd,
|
||||||
|
|
||||||
|
[systemd],
|
||||||
|
src_inetd=default-socket,
|
||||||
|
|
||||||
|
[launchd],
|
||||||
|
src_inetd="mac-inetd.plist",
|
||||||
|
|
||||||
|
[*],
|
||||||
|
src_inetd="unknown"
|
||||||
|
)
|
||||||
|
|
||||||
|
fi
|
||||||
|
AC_MSG_RESULT($src_inetd)
|
||||||
|
|
||||||
|
])
|
146
autoconf-macros/ax_nagios_get_inetd
Normal file
146
autoconf-macros/ax_nagios_get_inetd
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_NAGIOS_GET_INETD
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# This macro determines whether inetd or xinetd is being used
|
||||||
|
# The argument are:
|
||||||
|
# the init type as determined by AX_NAGIOS_GET_INIT
|
||||||
|
# $inetd_type will be set and will be one of:
|
||||||
|
# unknown (could not be determined)
|
||||||
|
# launchd (Mac OS X)
|
||||||
|
# smf10 (Solaris)
|
||||||
|
# smf11 (Solaris)
|
||||||
|
# upstart (Older Debian)
|
||||||
|
# xinetd (Most Linux, BSD)
|
||||||
|
# inetd (The rest)
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2016 Nagios Core Development Team
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by the
|
||||||
|
# Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
# option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
# Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||||
|
# gives unlimited permission to copy, distribute and modify the configure
|
||||||
|
# scripts that are the output of Autoconf when processing the Macro. You
|
||||||
|
# need not follow the terms of the GNU General Public License when using
|
||||||
|
# or distributing such scripts, even though portions of the text of the
|
||||||
|
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||||
|
# all other use of the material that constitutes the Autoconf Macro.
|
||||||
|
#
|
||||||
|
# This special exception to the GPL applies to versions of the Autoconf
|
||||||
|
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||||
|
# modified version of the Autoconf Macro, you may extend this special
|
||||||
|
# exception to the GPL to apply to your modified version as well.
|
||||||
|
# ===========================================================================
|
||||||
|
|
||||||
|
AU_ALIAS([AC_NAGIOS_GET_INETD], [AX_NAGIOS_GET_INETD])
|
||||||
|
AC_DEFUN([AX_NAGIOS_GET_INETD],
|
||||||
|
[
|
||||||
|
|
||||||
|
AC_SUBST(inetd_type)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Get user hints for possible cross-compile
|
||||||
|
#
|
||||||
|
AC_MSG_CHECKING(what inetd is being used )
|
||||||
|
AC_ARG_WITH(inetd_type, AC_HELP_STRING([--with-inetd-type=type],
|
||||||
|
[which super-server the system runs (inetd, xinetd, systemd, launchd,
|
||||||
|
smf10, smf11, etc.)]),
|
||||||
|
[
|
||||||
|
inetd_type_wanted=yes
|
||||||
|
#
|
||||||
|
# Run this if --with was specified
|
||||||
|
#
|
||||||
|
if test "x$withval" = x -o x$withval = xno; then
|
||||||
|
inetd_type_wanted=yes
|
||||||
|
else
|
||||||
|
inetd_type_wanted=no
|
||||||
|
inetd_type="$withval"
|
||||||
|
AC_MSG_RESULT($inetd_type)
|
||||||
|
fi
|
||||||
|
], [
|
||||||
|
#
|
||||||
|
# Run this if --with was not specified
|
||||||
|
#
|
||||||
|
inetd_type_wanted=yes
|
||||||
|
])
|
||||||
|
|
||||||
|
if test x$inetd_type = xno; then
|
||||||
|
inetd_type_wanted=yes
|
||||||
|
elif test x$inetd_type = xyes; then
|
||||||
|
AC_MSG_ERROR([you must enter an inetd type if '--with-inetd-type' is specified])
|
||||||
|
fi
|
||||||
|
|
||||||
|
#
|
||||||
|
# Determine inetd type if it wasn't supplied
|
||||||
|
#
|
||||||
|
if test $inetd_type_wanted = yes; then
|
||||||
|
|
||||||
|
inetd_disabled=""
|
||||||
|
|
||||||
|
AS_CASE([$dist_type],
|
||||||
|
[solaris],
|
||||||
|
if test x"$init_type" = "xsmf10" -o x"$init_type" = "xsmf11"; then
|
||||||
|
inetd_type="$init_type"
|
||||||
|
else
|
||||||
|
inetd_type="inetd"
|
||||||
|
fi,
|
||||||
|
|
||||||
|
[*bsd*],
|
||||||
|
inetd_type=`ps -A -o comm -c | grep inetd`,
|
||||||
|
|
||||||
|
[osx],
|
||||||
|
inetd_type=`launchd`,
|
||||||
|
|
||||||
|
[aix|hp-ux],
|
||||||
|
inetd_type=`UNIX95= ps -A -o comm | grep inetd | head -1`,
|
||||||
|
|
||||||
|
[*],
|
||||||
|
inetd_type=[`ps -C "inetd,xinetd" -o fname | grep -vi COMMAND | head -1`])
|
||||||
|
|
||||||
|
if test x"$inetd_type" = x; then
|
||||||
|
if test -f /etc/xinetd.conf -a -d /etc/xinetd.d; then
|
||||||
|
inetd_disabled="(Not running)"
|
||||||
|
inetd_type=xinetd
|
||||||
|
elif test -f /etc/inetd.conf -o -f /usr/sbin/inetd; then
|
||||||
|
inetd_type=inetd
|
||||||
|
inetd_disabled="(Not running)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test x"$inetd_type" = x; then
|
||||||
|
if test x"$init_type" = "xupstart"; then
|
||||||
|
inetd_type="upstart"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test x"$inetd_type" = x; then
|
||||||
|
if test x"$init_type" = "xsystemd"; then
|
||||||
|
inetd_type="systemd"
|
||||||
|
else
|
||||||
|
inetd_type="unknown"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -n "$inetd_disabled"; then
|
||||||
|
AC_MSG_RESULT($inetd_type $inetd_disabled)
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT($inetd_type)
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
200
autoconf-macros/ax_nagios_get_init
Normal file
200
autoconf-macros/ax_nagios_get_init
Normal file
@ -0,0 +1,200 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_NAGIOS_GET_INIT
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# This macro determines the O/S distribution of the computer it is run on.
|
||||||
|
# $init_type will be set and will be one of:
|
||||||
|
# unknown (could not be determined)
|
||||||
|
# launchd (Mac OS X)
|
||||||
|
# bsd (Slackware Linux)
|
||||||
|
# newbsd (FreeBSD, OpenBSD, NetBSD, Dragonfly, etc)
|
||||||
|
# smf10 (Solaris)
|
||||||
|
# smf11 (Solaris)
|
||||||
|
# systemd (Linux SystemD)
|
||||||
|
# gentoo (Older Gentoo)
|
||||||
|
# openrc (Recent Gentoo and some others)
|
||||||
|
# upstart (Older Debian)
|
||||||
|
# sysv (The rest)
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2016 Nagios Core Development Team
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by the
|
||||||
|
# Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
# option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
# Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||||
|
# gives unlimited permission to copy, distribute and modify the configure
|
||||||
|
# scripts that are the output of Autoconf when processing the Macro. You
|
||||||
|
# need not follow the terms of the GNU General Public License when using
|
||||||
|
# or distributing such scripts, even though portions of the text of the
|
||||||
|
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||||
|
# all other use of the material that constitutes the Autoconf Macro.
|
||||||
|
#
|
||||||
|
# This special exception to the GPL applies to versions of the Autoconf
|
||||||
|
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||||
|
# modified version of the Autoconf Macro, you may extend this special
|
||||||
|
# exception to the GPL to apply to your modified version as well.
|
||||||
|
# ===========================================================================
|
||||||
|
|
||||||
|
AU_ALIAS([AC_NAGIOS_GET_INIT], [AX_NAGIOS_GET_INIT])
|
||||||
|
AC_DEFUN([AX_NAGIOS_GET_INIT],
|
||||||
|
[
|
||||||
|
|
||||||
|
AC_SUBST(init_type)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Get user hints for possible cross-compile
|
||||||
|
#
|
||||||
|
AC_MSG_CHECKING(what init system is being used )
|
||||||
|
AC_ARG_WITH(init_type,AC_HELP_STRING([--with-init-type=type],
|
||||||
|
[specify init type (bsd, sysv, systemd, launchd, smf10, smf11, upstart,
|
||||||
|
openrc, etc.)]),
|
||||||
|
[
|
||||||
|
#
|
||||||
|
# Run this if --with was specified
|
||||||
|
#
|
||||||
|
if test "x$withval" = x -o x$withval = xno; then
|
||||||
|
init_type_wanted=yes
|
||||||
|
else
|
||||||
|
init_type_wanted=no
|
||||||
|
init_type="$withval"
|
||||||
|
AC_MSG_RESULT($init_type)
|
||||||
|
fi
|
||||||
|
], [
|
||||||
|
#
|
||||||
|
# Run this if --with was not specified
|
||||||
|
#
|
||||||
|
init_type_wanted=yes
|
||||||
|
])
|
||||||
|
|
||||||
|
if test x$init_type = xno; then
|
||||||
|
init_type_wanted=yes
|
||||||
|
elif test x$init_type = xyes; then
|
||||||
|
AC_MSG_ERROR([you must enter an init type if '--with-init-type' is specified])
|
||||||
|
fi
|
||||||
|
|
||||||
|
#
|
||||||
|
# Determine init type if it wasn't supplied
|
||||||
|
#
|
||||||
|
if test $init_type_wanted = yes; then
|
||||||
|
init_type=""
|
||||||
|
|
||||||
|
if test x"$opsys" = x; then
|
||||||
|
init_type="unknown"
|
||||||
|
init_type_wanted=no
|
||||||
|
elif test x"$dist_type" = x; then
|
||||||
|
init_type="unknown"
|
||||||
|
init_type_wanted=no
|
||||||
|
elif test "$opsys" = "osx"; then
|
||||||
|
init_type="launchd"
|
||||||
|
init_type_wanted=no
|
||||||
|
elif test "$opsys" = "bsd"; then
|
||||||
|
init_type="newbsd"
|
||||||
|
init_type_wanted=no
|
||||||
|
elif test "$dist_type" = "solaris"; then
|
||||||
|
if test -d "/lib/svc/manifest"; then
|
||||||
|
init_type="smf11"
|
||||||
|
init_type_wanted=no
|
||||||
|
elif test -d "/lib/svc/monitor"; then
|
||||||
|
init_type="smf10"
|
||||||
|
init_type_wanted=no
|
||||||
|
else
|
||||||
|
init_type="sysv"
|
||||||
|
init_type_wanted=no
|
||||||
|
fi
|
||||||
|
elif test "$dist_type" = "slackware"; then
|
||||||
|
init_type="bsd"
|
||||||
|
init_type_wanted=no
|
||||||
|
elif test "$dist_type" = "aix"; then
|
||||||
|
init_type="bsd"
|
||||||
|
init_type_wanted=no
|
||||||
|
elif test "$dist_type" = "hp-ux"; then
|
||||||
|
init_type="unknown"
|
||||||
|
init_type_wanted=no
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
PSCMD="ps -p1 -o args"
|
||||||
|
if test $dist_type = solaris; then
|
||||||
|
PSCMD="env UNIX95=1; ps -p1 -o args"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$init_type_wanted" = yes; then
|
||||||
|
pid1=`$PSCMD | grep -vi COMMAND | cut -d' ' -f1`
|
||||||
|
if test x"$pid1" = "x"; then
|
||||||
|
init_type="unknown"
|
||||||
|
init_type_wanted=no
|
||||||
|
fi
|
||||||
|
if `echo $pid1 | grep "systemd" > /dev/null`; then
|
||||||
|
init_type="systemd"
|
||||||
|
init_type_wanted=no
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$init_type_wanted" = yes; then
|
||||||
|
if test "$pid1" = "init"; then
|
||||||
|
if test -e "/sbin/init"; then
|
||||||
|
pid1="/sbin/init";
|
||||||
|
elif test -e "/usr/sbin/init"; then
|
||||||
|
pid1="/usr/sbin/init"
|
||||||
|
else
|
||||||
|
init_type="unknown"
|
||||||
|
init_type_wanted=no
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test -L "$pid1"; then
|
||||||
|
pid1=`readlink "$pid1"`
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$init_type_wanted" = yes; then
|
||||||
|
if `echo $pid1 | grep "systemd" > /dev/null`; then
|
||||||
|
init_type="systemd"
|
||||||
|
init_type_wanted=no
|
||||||
|
elif test -f "/sbin/rc"; then
|
||||||
|
if test -f /sbin/runscript; then
|
||||||
|
init_type_wanted=no
|
||||||
|
if `/sbin/start-stop-daemon -V | grep "OpenRC" > /dev/null`; then
|
||||||
|
init_type="openrc"
|
||||||
|
else
|
||||||
|
init_type="gentoo"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$init_type_wanted" = yes; then
|
||||||
|
if test "$pid1" = "/sbin/init" -o "$pid1" = "/usr/sbin/init"; then
|
||||||
|
if `$pid1 --version 2>/dev/null | grep "upstart" >/dev/null`; then
|
||||||
|
init_type="upstart"
|
||||||
|
init_type_wanted=no
|
||||||
|
elif test -f "/etc/rc" -a ! -L "/etc/rc"; then
|
||||||
|
init_type="newbsd"
|
||||||
|
init_type_wanted=no
|
||||||
|
else
|
||||||
|
init_type="sysv"
|
||||||
|
init_type_wanted=no
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$init_type_wanted" = yes; then
|
||||||
|
init_type="unknown"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_MSG_RESULT($init_type)
|
||||||
|
])
|
101
autoconf-macros/ax_nagios_get_os
Normal file
101
autoconf-macros/ax_nagios_get_os
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_NAGIOS_GET_OS
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# This macro determines the operating system of the computer it is run on.
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2016 Nagios Core Development Team
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by the
|
||||||
|
# Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
# option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
# Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||||
|
# gives unlimited permission to copy, distribute and modify the configure
|
||||||
|
# scripts that are the output of Autoconf when processing the Macro. You
|
||||||
|
# need not follow the terms of the GNU General Public License when using
|
||||||
|
# or distributing such scripts, even though portions of the text of the
|
||||||
|
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||||
|
# all other use of the material that constitutes the Autoconf Macro.
|
||||||
|
#
|
||||||
|
# This special exception to the GPL applies to versions of the Autoconf
|
||||||
|
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||||
|
# modified version of the Autoconf Macro, you may extend this special
|
||||||
|
# exception to the GPL to apply to your modified version as well.
|
||||||
|
# ===========================================================================
|
||||||
|
|
||||||
|
AU_ALIAS([AC_NAGIOS_GET_OS], [AX_NAGIOS_GET_OS])
|
||||||
|
AC_DEFUN([AX_NAGIOS_GET_OS],
|
||||||
|
[
|
||||||
|
|
||||||
|
AC_SUBST(opsys)
|
||||||
|
AC_SUBST(arch)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Get user hints
|
||||||
|
#
|
||||||
|
AC_MSG_CHECKING(what the operating system is )
|
||||||
|
AC_ARG_WITH(opsys, AC_HELP_STRING([--with-opsys=OS],
|
||||||
|
[specify operating system (linux, osx, bsd, solaris, irix, cygwin,
|
||||||
|
aix, hp-ux, etc.)]),
|
||||||
|
[
|
||||||
|
#
|
||||||
|
# Run this if --with was specified
|
||||||
|
#
|
||||||
|
if test "x$withval" = x -o x$withval = xno; then
|
||||||
|
opsys_wanted=yes
|
||||||
|
else
|
||||||
|
opsys_wanted=no
|
||||||
|
opsys="$withval"
|
||||||
|
AC_MSG_RESULT($opsys)
|
||||||
|
fi
|
||||||
|
], [
|
||||||
|
#
|
||||||
|
# Run this if --with was not specified
|
||||||
|
#
|
||||||
|
opsys_wanted=yes
|
||||||
|
])
|
||||||
|
|
||||||
|
if test x$opsys = xno; then
|
||||||
|
opsys=""
|
||||||
|
opsys_wanted=yes
|
||||||
|
elif test x$opsys = xyes; then
|
||||||
|
AC_MSG_ERROR([you must enter an O/S type if '--with-opsys' is specified])
|
||||||
|
fi
|
||||||
|
|
||||||
|
#
|
||||||
|
# Determine operating system if it wasn't supplied
|
||||||
|
#
|
||||||
|
if test $opsys_wanted=yes; then
|
||||||
|
opsys=`uname -s | tr ["[A-Z]" "[a-z]"]`
|
||||||
|
if test x"$opsys" = "x"; then opsys="unknown"; fi
|
||||||
|
AS_CASE([$opsys],
|
||||||
|
[darwin*], opsys="osx",
|
||||||
|
[*bsd*], opsys="bsd",
|
||||||
|
[dragonfly], opsys="bsd",
|
||||||
|
[sunos], opsys="solaris",
|
||||||
|
[gnu/hurd], opsys="linux",
|
||||||
|
[irix*], opsys="irix",
|
||||||
|
[cygwin*], opsys="cygwin",
|
||||||
|
[mingw*], opsys="mingw",
|
||||||
|
[msys*], opsys="msys")
|
||||||
|
fi
|
||||||
|
|
||||||
|
arch=`uname -m | tr ["[A-Z]" "[a-z]"]`
|
||||||
|
|
||||||
|
AC_MSG_RESULT($opsys)
|
||||||
|
])
|
783
autoconf-macros/ax_nagios_get_paths
Normal file
783
autoconf-macros/ax_nagios_get_paths
Normal file
@ -0,0 +1,783 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_NAGIOS_GET_PATHS
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# This macro figures out the installation & run paths for various systems
|
||||||
|
# The argument are:
|
||||||
|
# the O/S determined by the AX_NAGIOS_GET_OS macro.
|
||||||
|
# the distribution type as determined by AX_NAGIOS_GET_DISTRIB_TYPE
|
||||||
|
# the init type as determined by AX_NAGIOS_GET_INIT
|
||||||
|
# the inetd type as determined by AX_NAGIOS_GET_INETD
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2016 Nagios Core Development Team
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by the
|
||||||
|
# Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
# option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
# Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||||
|
# gives unlimited permission to copy, distribute and modify the configure
|
||||||
|
# scripts that are the output of Autoconf when processing the Macro. You
|
||||||
|
# need not follow the terms of the GNU General Public License when using
|
||||||
|
# or distributing such scripts, even though portions of the text of the
|
||||||
|
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||||
|
# all other use of the material that constitutes the Autoconf Macro.
|
||||||
|
#
|
||||||
|
# This special exception to the GPL applies to versions of the Autoconf
|
||||||
|
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||||
|
# modified version of the Autoconf Macro, you may extend this special
|
||||||
|
# exception to the GPL to apply to your modified version as well.
|
||||||
|
# ===========================================================================
|
||||||
|
|
||||||
|
AU_ALIAS([AC_NAGIOS_GET_PATHS], [AX_NAGIOS_GET_PATHS])
|
||||||
|
AC_DEFUN([AX_NAGIOS_GET_PATHS],
|
||||||
|
[
|
||||||
|
|
||||||
|
AC_SUBST(pkgsysconfdir)
|
||||||
|
AC_SUBST(objsysconfdir)
|
||||||
|
AC_SUBST(initname)
|
||||||
|
AC_SUBST(inetdname)
|
||||||
|
AC_SUBST(pluginsdir)
|
||||||
|
AC_SUBST(brokersdir)
|
||||||
|
AC_SUBST(cgibindir)
|
||||||
|
AC_SUBST(webdir)
|
||||||
|
AC_SUBST(privatesysconfdir)
|
||||||
|
AC_SUBST(pkglocalstatedir)
|
||||||
|
AC_SUBST(logdir)
|
||||||
|
AC_SUBST(piddir)
|
||||||
|
AC_SUBST(pipedir)
|
||||||
|
AC_SUBST(spooldir)
|
||||||
|
AC_SUBST(initdir)
|
||||||
|
AC_SUBST(initdiroverridden)
|
||||||
|
AC_SUBST(inetddir)
|
||||||
|
AC_SUBST(tmpfilesd)
|
||||||
|
AC_SUBST(subsyslockdir)
|
||||||
|
AC_SUBST(subsyslockfile)
|
||||||
|
|
||||||
|
if test x$DBG_PATHS != x; then
|
||||||
|
echo
|
||||||
|
echo Incoming paths:
|
||||||
|
echo " prefix $prefix"
|
||||||
|
echo " exec_prefix $exec_prefix"
|
||||||
|
echo " bindir $bindir"
|
||||||
|
echo " libexecdir $libexecdir"
|
||||||
|
echo " sysconfdir $sysconfdir"
|
||||||
|
echo " localstatedir $localstatedir"
|
||||||
|
echo " datarootdir $datarootdir"
|
||||||
|
echo " datadir $datadir"
|
||||||
|
echo " localedir $localedir"
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_MSG_CHECKING(for which paths to use )
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(install_method,
|
||||||
|
AC_HELP_STRING([--enable-install-method=<method>],
|
||||||
|
[sets the install method to use: 'default' (the default) will install to
|
||||||
|
/usr/local/nagios, 'os' will try to determine which method to use based
|
||||||
|
on OS type and distribution. Fine tuning using the '--bindir', etc.
|
||||||
|
overrides above will still work]),
|
||||||
|
install_method=$enableval,
|
||||||
|
install_method=default
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(showdirs_only,
|
||||||
|
AC_HELP_STRING([--enable-showdirs-only=yes],
|
||||||
|
[This option will cause 'configure' to stop after determining the install
|
||||||
|
locations based on '--enable-install-method', so you can see the
|
||||||
|
destinations before a full './configure', 'make', 'make install'
|
||||||
|
process.]),
|
||||||
|
showdirs_only=$enableval,
|
||||||
|
showdirs_only=no
|
||||||
|
)
|
||||||
|
|
||||||
|
AS_CASE([$install_method],
|
||||||
|
[yes], install_method="os",
|
||||||
|
[no], install_method="default",
|
||||||
|
[default|os], :,
|
||||||
|
[*], echo >&6; AC_MSG_ERROR(['--enable-install-method=$install_method' is invalid])
|
||||||
|
)
|
||||||
|
|
||||||
|
if test $showdirs_only != "no"; then showdirs_only="yes"; fi
|
||||||
|
|
||||||
|
AS_CASE([$dist_type],
|
||||||
|
[*solaris*|*hp-ux*|*aix*|*osx*], opsys=unix)
|
||||||
|
|
||||||
|
|
||||||
|
# Does this package need to know:
|
||||||
|
need_cgi=no # where the cgi-bin directory is
|
||||||
|
need_web=no # where the website directory is
|
||||||
|
need_brk=no # where the event broker modules directory is
|
||||||
|
need_plg=no # where the plugins directory is
|
||||||
|
need_pipe=no # where the pipe directory is
|
||||||
|
need_spl=no # where the spool directory is
|
||||||
|
need_loc=no # where the locale directory is
|
||||||
|
need_log_subdir=no # where the loc sub-directory is
|
||||||
|
need_etc_subdir=no # where the etc sub-directory is
|
||||||
|
need_pls_dir=no # where the package locate state directory is
|
||||||
|
|
||||||
|
if test x"$INIT_PROG" = x; then
|
||||||
|
INIT_PROG="$PKG_NAME"
|
||||||
|
fi
|
||||||
|
|
||||||
|
AS_CASE([$PKG_NAME],
|
||||||
|
[nagios],
|
||||||
|
need_log_subdir=yes
|
||||||
|
need_etc_subdir=yes
|
||||||
|
need_pls_dir=yes
|
||||||
|
need_brk=yes
|
||||||
|
need_pipe=yes
|
||||||
|
need_spl=yes
|
||||||
|
need_loc=yes
|
||||||
|
need_cgi=yes
|
||||||
|
need_web=yes,
|
||||||
|
|
||||||
|
[ndoutils],
|
||||||
|
need_brk=yes
|
||||||
|
need_spl=yes,
|
||||||
|
|
||||||
|
[nrpe],
|
||||||
|
need_plg=yes,
|
||||||
|
|
||||||
|
[nsca],
|
||||||
|
need_cgi=no,
|
||||||
|
|
||||||
|
[plugins],
|
||||||
|
need_loc=yes
|
||||||
|
need_plg=yes
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_ARG_WITH(pkgsysconfdir, AC_HELP_STRING([--with-pkgsysconfdir=DIR],
|
||||||
|
[where configuration files should be placed]),
|
||||||
|
if test x$withval != x -a x$withval != xno -a x$withval != xyes; then
|
||||||
|
pkgsysconfdir="$withval"
|
||||||
|
fi)
|
||||||
|
AC_ARG_WITH(objsysconfdir, AC_HELP_STRING([--with-objsysconfdir=DIR],
|
||||||
|
[where object configuration files should be placed]),
|
||||||
|
if test x$withval != x -a x$withval != xno -a x$withval != xyes; then
|
||||||
|
objsysconfdir="$withval"
|
||||||
|
fi)
|
||||||
|
AC_ARG_WITH(privatesysconfdir, AC_HELP_STRING([--with-privatesysconfdir=DIR],
|
||||||
|
[where private configuration files should be placed]),
|
||||||
|
if test x$withval != x -a x$withval != xno -a x$withval != xyes; then
|
||||||
|
privatesysconfdir="$withval"
|
||||||
|
fi)
|
||||||
|
AC_ARG_WITH(webdir, AC_HELP_STRING([--with-webdir=DIR],
|
||||||
|
[where the website files should be placed]),
|
||||||
|
if test x$withval != x -a x$withval != xno -a x$withval != xyes; then
|
||||||
|
webdir="$withval"
|
||||||
|
fi)
|
||||||
|
AC_ARG_WITH(pluginsdir, AC_HELP_STRING([--with-pluginsdir=DIR],
|
||||||
|
[where the plugins should be placed]),
|
||||||
|
if test x$withval != x -a x$withval != xno -a x$withval != xyes; then
|
||||||
|
pluginsdir="$withval"
|
||||||
|
fi)
|
||||||
|
AC_ARG_WITH(brokersdir, AC_HELP_STRING([--with-brokersdir=DIR],
|
||||||
|
[where the broker modules should be placed]),
|
||||||
|
if test x$withval != x -a x$withval != xno -a x$withval != xyes; then
|
||||||
|
brokersdir="$withval"
|
||||||
|
fi)
|
||||||
|
AC_ARG_WITH(cgibindir, AC_HELP_STRING([--with-cgibindir=DIR],
|
||||||
|
[where the CGI programs should be placed]),
|
||||||
|
if test x$withval != x -a x$withval != xno -a x$withval != xyes; then
|
||||||
|
cgibindir="$withval"
|
||||||
|
fi)
|
||||||
|
AC_ARG_WITH(logdir, AC_HELP_STRING([--with-logdir=DIR],
|
||||||
|
[where log files should be placed]),
|
||||||
|
if test x$withval != x -a x$withval != xno -a x$withval != xyes; then
|
||||||
|
logdir="$withval"
|
||||||
|
fi)
|
||||||
|
AC_ARG_WITH(piddir, AC_HELP_STRING([--with-piddir=DIR],
|
||||||
|
[where the PID file should be placed]),
|
||||||
|
if test x$withval != x -a x$withval != xno -a x$withval != xyes; then
|
||||||
|
piddir="$withval"
|
||||||
|
fi)
|
||||||
|
AC_ARG_WITH(pipedir, AC_HELP_STRING([--with-pipedir=DIR],
|
||||||
|
[where socket and pipe files should be placed]),
|
||||||
|
if test x$withval != x -a x$withval != xno -a x$withval != xyes; then
|
||||||
|
pipedir="$withval"
|
||||||
|
fi)
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Setup the base directory
|
||||||
|
#
|
||||||
|
|
||||||
|
if test $install_method = "default"; then
|
||||||
|
if test $opsys = "unix"; then
|
||||||
|
if test x"$prefix" = "xNONE"; then prefix="/usr/local/nagios"; fi
|
||||||
|
else
|
||||||
|
if test x"$prefix" = "xNONE"; then prefix=${ac_default_prefix}; fi
|
||||||
|
fi
|
||||||
|
datarootdir=${datarootdir="$prefix"}
|
||||||
|
|
||||||
|
else
|
||||||
|
if test x"$datadir" = x'${datarootdir}'; then AS_UNSET(datadir); fi
|
||||||
|
if test x"$sysconfdir" = x'${prefix}/etc'; then AS_UNSET(sysconfdir); fi
|
||||||
|
|
||||||
|
if test x"$prefix" = "xNONE"; then
|
||||||
|
if test $dist_type = freebsd -o $dist_type = openbsd -o $dist_type = osx; then
|
||||||
|
prefix="/usr/local"
|
||||||
|
elif test $dist_type = netbsd; then
|
||||||
|
prefix="/usr/pkg"
|
||||||
|
else
|
||||||
|
prefix="/usr"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test x"$exec_prefix" = "xNONE"; then exec_prefix=$prefix; fi
|
||||||
|
if test x"$localstatedir" = x'${prefix}/var'; then
|
||||||
|
if test $dist_type = "osx"; then
|
||||||
|
localstatedir="/private/var"
|
||||||
|
else
|
||||||
|
localstatedir="/var"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $opsys = "unix"; then
|
||||||
|
if test x"$datarootdir" = x'${prefix}/share'; then
|
||||||
|
if test $dist_type = "hp-ux"; then
|
||||||
|
datarootdir="/usr/local/share"
|
||||||
|
if test x"$libexecdir" = x'${exec_prefix}/libexec'; then
|
||||||
|
libexecdir="/usr/nagios"
|
||||||
|
fi
|
||||||
|
elif test $dist_type = "osx"; then
|
||||||
|
datarootdir="/usr/local/share"
|
||||||
|
if test x"$libexecdir" = x'${exec_prefix}/libexec'; then
|
||||||
|
libexecdir="/usr/local/nagios"
|
||||||
|
fi
|
||||||
|
elif test x"$libexecdir" = x'${exec_prefix}/libexec'; then
|
||||||
|
libexecdir="/usr/lib/nagios"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test $dist_type = "osx"; then
|
||||||
|
if test x"$libexecdir" = x'${exec_prefix}/libexec'; then
|
||||||
|
libexecdir="/usr/local/libexec/nagios"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
elif test $opsys = "bsd"; then
|
||||||
|
if test x"$libexecdir" = x'${exec_prefix}/libexec'; then
|
||||||
|
libexecdir=${exec_prefix}/libexec/nagios;
|
||||||
|
fi
|
||||||
|
elif test x"$libexecdir" = x'${exec_prefix}/lib'; then
|
||||||
|
libexecdir=${libexecdir}/nagios;
|
||||||
|
elif test x"$libexecdir" = x'${exec_prefix}/libexec'; then
|
||||||
|
libexecdir=${exec_prefix}/lib/nagios;
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test x"$exec_prefix" = "xNONE"; then exec_prefix=${prefix}; fi
|
||||||
|
|
||||||
|
tmpfilesd=${tmpfilesd="/usr/lib/tmpfiles.d"}
|
||||||
|
if test ! -d "$tmpfilesd"; then
|
||||||
|
tmpfilesd="N/A"
|
||||||
|
else
|
||||||
|
tmpfilesd="$tmpfilesd/$INIT_PROG.conf"
|
||||||
|
fi
|
||||||
|
subsyslockdir=${subsyslockdir="/run"}
|
||||||
|
if test ! -d "$subsyslockdir"; then
|
||||||
|
subsyslockdir="N/A"
|
||||||
|
subsyslockfile="N/A"
|
||||||
|
else
|
||||||
|
subsyslockfile="$subsyslockdir/$INIT_PROG.lock"
|
||||||
|
fi
|
||||||
|
if test "$need_loc" = no; then
|
||||||
|
localedir="N/A"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $install_method = "default" ; then
|
||||||
|
#
|
||||||
|
# Do the default setup
|
||||||
|
#
|
||||||
|
datadir=${datadir="$datarootdir"}
|
||||||
|
if test $need_web = yes; then
|
||||||
|
webdir=${webdir="$datadir"}
|
||||||
|
else
|
||||||
|
webdir="N/A"
|
||||||
|
fi
|
||||||
|
if test $opsys = "unix"; then
|
||||||
|
sysconfdir=${sysconfdir="/etc/opt"}
|
||||||
|
fi
|
||||||
|
pkgsysconfdir=${pkgsysconfdir="$sysconfdir"}
|
||||||
|
if test $need_etc_subdir = yes; then
|
||||||
|
objsysconfdir=${objsysconfdir="$pkgsysconfdir/objects"}
|
||||||
|
else
|
||||||
|
objsysconfdir="N/A"
|
||||||
|
fi
|
||||||
|
privatesysconfdir=${privatesysconfdir="$pkgsysconfdir"}
|
||||||
|
logdir=${logdir="$localstatedir"}
|
||||||
|
piddir=${piddir="$localstatedir"}
|
||||||
|
if test "$need_pipe" = yes; then
|
||||||
|
pipedir=${pipedir="$localstatedir/rw"}
|
||||||
|
else
|
||||||
|
pipedir="N/A"
|
||||||
|
fi
|
||||||
|
if test "$need_pls_dir" = yes; then
|
||||||
|
pkglocalstatedir=${pkglocalstatedir="$localstatedir"}
|
||||||
|
else
|
||||||
|
pkglocalstatedir="N/A"
|
||||||
|
fi
|
||||||
|
if test "$need_spl" = yes; then
|
||||||
|
spooldir=${spooldir="$localstatedir/var"}
|
||||||
|
else
|
||||||
|
spooldir="N/A"
|
||||||
|
fi
|
||||||
|
if test $need_brk = yes; then
|
||||||
|
brokersdir=${brokersdir="$bindir"}
|
||||||
|
else
|
||||||
|
brokersdir="N/A"
|
||||||
|
fi
|
||||||
|
if test $need_plg = yes; then
|
||||||
|
pluginsdir=${pluginsdir="$libexecdir"}
|
||||||
|
else
|
||||||
|
pluginsdir="N/A"
|
||||||
|
fi
|
||||||
|
if test $need_cgi = yes; then
|
||||||
|
cgibindir=${cgibindir="$prefix/sbin"}
|
||||||
|
else
|
||||||
|
cgibindir="N/A"
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif test $opsys = "linux"; then
|
||||||
|
|
||||||
|
#
|
||||||
|
# Linux "Standard" install
|
||||||
|
#
|
||||||
|
install_method="$install_method : FHS"
|
||||||
|
datadir=${datadir="$datarootdir/nagios"}
|
||||||
|
if test $need_web = yes; then
|
||||||
|
webdir=${webdir="$datadir/html"}
|
||||||
|
else
|
||||||
|
webdir="N/A"
|
||||||
|
fi
|
||||||
|
sysconfdir=${sysconfdir="/etc"}
|
||||||
|
pkgsysconfdir=${pkgsysconfdir="$sysconfdir/nagios"}
|
||||||
|
if test $need_etc_subdir = yes; then
|
||||||
|
objsysconfdir=${objsysconfdir="$pkgsysconfdir/objects"}
|
||||||
|
else
|
||||||
|
objsysconfdir="N/A"
|
||||||
|
fi
|
||||||
|
privatesysconfdir=${privatesysconfdir="$pkgsysconfdir/private"}
|
||||||
|
if test $need_log_subdir = yes; then
|
||||||
|
logdir=${logdir="$localstatedir/log/$INIT_PROG"}
|
||||||
|
else
|
||||||
|
logdir=${logdir="$localstatedir/log"}
|
||||||
|
fi
|
||||||
|
piddir=${piddir="$localstatedir/run/${INIT_PROG}"}
|
||||||
|
if test "$need_pipe" = yes; then
|
||||||
|
pipedir=${pipedir="$localstatedir/run/${INIT_PROG}"}
|
||||||
|
else
|
||||||
|
pipedir="N/A"
|
||||||
|
fi
|
||||||
|
if test "$need_pls_dir" = yes; then
|
||||||
|
pkglocalstatedir=${pkglocalstatedir="$localstatedir/lib/$INIT_PROG"}
|
||||||
|
else
|
||||||
|
pkglocalstatedir="N/A"
|
||||||
|
fi
|
||||||
|
if test "$need_spl" = yes; then
|
||||||
|
spooldir=${spooldir="$localstatedir/spool/$INIT_PROG"}
|
||||||
|
else
|
||||||
|
spooldir="N/A"
|
||||||
|
fi
|
||||||
|
if test $need_brk = yes; then
|
||||||
|
brokersdir=${brokersdir="$libexecdir/brokers"}
|
||||||
|
else
|
||||||
|
brokersdir="N/A"
|
||||||
|
fi
|
||||||
|
if test $need_plg = yes; then
|
||||||
|
pluginsdir=${pluginsdir="$libexecdir/plugins"}
|
||||||
|
else
|
||||||
|
pluginsdir="N/A"
|
||||||
|
fi
|
||||||
|
if test $need_cgi = yes; then
|
||||||
|
cgibindir=${cgibindir="$libexecdir/cgi-bin"}
|
||||||
|
else
|
||||||
|
cgibindir="N/A"
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif test $opsys = "unix"; then
|
||||||
|
|
||||||
|
#
|
||||||
|
# "Standard" Unix install
|
||||||
|
#
|
||||||
|
install_method="$install_method : Unix Standard"
|
||||||
|
if test $dist_type = osx; then
|
||||||
|
install_method="$install_method : OS X Standard"
|
||||||
|
fi
|
||||||
|
datadir=${datadir="$datarootdir/nagios"}
|
||||||
|
if test $need_web = yes; then
|
||||||
|
webdir=${webdir="$datadir/html"}
|
||||||
|
else
|
||||||
|
webdir="N/A"
|
||||||
|
fi
|
||||||
|
if test $dist_type = osx; then
|
||||||
|
sysconfdir=${sysconfdir="/private/etc"}
|
||||||
|
else
|
||||||
|
sysconfdir=${sysconfdir="/etc"}
|
||||||
|
fi
|
||||||
|
pkgsysconfdir=${pkgsysconfdir="$sysconfdir/nagios"}
|
||||||
|
if test $need_etc_subdir = yes; then
|
||||||
|
objsysconfdir=${objsysconfdir="$pkgsysconfdir/objects"}
|
||||||
|
else
|
||||||
|
objsysconfdir="N/A"
|
||||||
|
fi
|
||||||
|
privatesysconfdir=${privatesysconfdir="$pkgsysconfdir/private"}
|
||||||
|
if test "$need_pls_dir" = yes; then
|
||||||
|
pkglocalstatedir=${pkglocalstatedir="$localstatedir/lib/$INIT_PROG"}
|
||||||
|
else
|
||||||
|
pkglocalstatedir="N/A"
|
||||||
|
fi
|
||||||
|
if test "$need_loc" = yes; then
|
||||||
|
localedir=${localedir="/usr/local/share/locale/<lang>/LC_MESSAGES/nagios-plugins.mo"}
|
||||||
|
fi
|
||||||
|
if test "$need_spl" = yes; then
|
||||||
|
spooldir=${spooldir="$localstatedir/spool/$INIT_PROG"}
|
||||||
|
else
|
||||||
|
spooldir="N/A"
|
||||||
|
fi
|
||||||
|
if test $need_brk = yes; then
|
||||||
|
brokersdir=${brokersdir="$libexecdir/brokers"}
|
||||||
|
else
|
||||||
|
brokersdir="N/A"
|
||||||
|
fi
|
||||||
|
if test $need_plg = yes; then
|
||||||
|
pluginsdir=${pluginsdir="$libexecdir/plugins"}
|
||||||
|
else
|
||||||
|
pluginsdir="N/A"
|
||||||
|
fi
|
||||||
|
if test $need_cgi = yes; then
|
||||||
|
cgibindir=${cgibindir="$libexecdir/cgi-bin"}
|
||||||
|
else
|
||||||
|
cgibindir="N/A"
|
||||||
|
fi
|
||||||
|
AS_CASE([$dist_type],
|
||||||
|
[*hp-ux*],
|
||||||
|
piddir=${piddir="$pkgsysconfdir"}
|
||||||
|
pipedir=${pipedir="$pkglocalstatedir"}
|
||||||
|
logdir=${logdir="$pkglocalstatedir/log"},
|
||||||
|
|
||||||
|
[*],
|
||||||
|
piddir=${piddir="$localstatedir/run/${INIT_PROG}"}
|
||||||
|
if test "$need_pipe" = yes; then
|
||||||
|
pipedir=${pipedir="$localstatedir/run/${INIT_PROG}"}
|
||||||
|
else
|
||||||
|
pipedir="N/A"
|
||||||
|
fi
|
||||||
|
if test $need_log_subdir = yes; then
|
||||||
|
logdir=${logdir="$localstatedir/log/$INIT_PROG"}
|
||||||
|
else
|
||||||
|
logdir=${logdir="$localstatedir/log"}
|
||||||
|
fi
|
||||||
|
)
|
||||||
|
|
||||||
|
elif test $opsys = "bsd"; then
|
||||||
|
|
||||||
|
#
|
||||||
|
# "Standard" BSD install
|
||||||
|
#
|
||||||
|
install_method="$install_method : BSD"
|
||||||
|
if test $dist_type = freebsd -o $dist_type = openbsd; then
|
||||||
|
prefix=${prefix="/usr/local"}
|
||||||
|
exec_prefix=${exec_prefix="/usr/local"}
|
||||||
|
if test $dist_type = freebsd; then
|
||||||
|
install_method="$install_method : FreeBSD"
|
||||||
|
else
|
||||||
|
install_method="$install_method : OpenBSD"
|
||||||
|
fi
|
||||||
|
elif test $dist_type = netbsd; then
|
||||||
|
prefix=${prefix="/usr/pkg"}
|
||||||
|
exec_prefix=${exec_prefix="/usr/pkg"}
|
||||||
|
install_method="$install_method : NetBSD"
|
||||||
|
fi
|
||||||
|
datadir=${datadir="$datarootdir/nagios"}
|
||||||
|
if test $need_web = yes -o $need_cgi = yes; then
|
||||||
|
if test $dist_type = freebsd; then
|
||||||
|
webdir=${webdir="$prefix/www/nagios"}
|
||||||
|
elif test $dist_type = netbsd; then
|
||||||
|
webdir=${webdir="$prefix/share/nagios"}
|
||||||
|
elif test $dist_type = openbsd; then
|
||||||
|
webdir=${webdir="/var/www/nagios"}
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
webdir="N/A"
|
||||||
|
fi
|
||||||
|
if test $dist_type = freebsd; then
|
||||||
|
sysconfdir=${sysconfdir="/usr/local/etc"}
|
||||||
|
else
|
||||||
|
sysconfdir=${sysconfdir="/etc"}
|
||||||
|
fi
|
||||||
|
pkgsysconfdir=${pkgsysconfdir="$sysconfdir/nagios"}
|
||||||
|
if test $need_etc_subdir = yes; then
|
||||||
|
objsysconfdir=${objsysconfdir="$pkgsysconfdir/objects"}
|
||||||
|
else
|
||||||
|
objsysconfdir="N/A"
|
||||||
|
fi
|
||||||
|
privatesysconfdir=${privatesysconfdir="$pkgsysconfdir/private"}
|
||||||
|
if test "$need_pls_dir" = yes; then
|
||||||
|
pkglocalstatedir=${pkglocalstatedir="$localstatedir/lib/$INIT_PROG"}
|
||||||
|
else
|
||||||
|
pkglocalstatedir="N/A"
|
||||||
|
fi
|
||||||
|
if test "$need_loc" = yes; then
|
||||||
|
localedir=${localedir="/usr/local/share/locale/<lang>/LC_MESSAGES/nagios-plugins.mo"}
|
||||||
|
fi
|
||||||
|
if test "$need_spl" = yes; then
|
||||||
|
spooldir=${spooldir="$localstatedir/spool/$INIT_PROG"}
|
||||||
|
else
|
||||||
|
spooldir="N/A"
|
||||||
|
fi
|
||||||
|
if test $need_brk = yes; then
|
||||||
|
brokersdir=${brokersdir="$libexecdir/brokers"}
|
||||||
|
else
|
||||||
|
brokersdir="N/A"
|
||||||
|
fi
|
||||||
|
if test $need_plg = yes; then
|
||||||
|
pluginsdir=${pluginsdir="$libexecdir/plugins"}
|
||||||
|
else
|
||||||
|
pluginsdir="N/A"
|
||||||
|
fi
|
||||||
|
if test $need_cgi = yes; then
|
||||||
|
if test $dist_type = freebsd; then
|
||||||
|
cgibindir=${cgibindir="$webdir/cgi-bin"}
|
||||||
|
elif test $dist_type = netbsd; then
|
||||||
|
cgibindir=${pluginsdir="$libexecdir/cgi-bin"}
|
||||||
|
elif test $dist_type = openbsd; then
|
||||||
|
cgibindir=${pluginsdir="/var/www/cgi-bin/nagios"}
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
cgibindir="N/A"
|
||||||
|
fi
|
||||||
|
piddir=${piddir="$localstatedir/run/${INIT_PROG}"}
|
||||||
|
if test "$need_pipe" = yes; then
|
||||||
|
pipedir=${pipedir="$localstatedir/run/${INIT_PROG}"}
|
||||||
|
else
|
||||||
|
pipedir="N/A"
|
||||||
|
fi
|
||||||
|
if test $need_log_subdir = yes; then
|
||||||
|
logdir=${logdir="$localstatedir/log/$INIT_PROG"}
|
||||||
|
else
|
||||||
|
logdir=${logdir="$localstatedir/log"}
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
#
|
||||||
|
# Unknown install
|
||||||
|
#
|
||||||
|
install_method="unknown"
|
||||||
|
webdir=unknown
|
||||||
|
pkgsysconfdir=unknown
|
||||||
|
objsysconfdir=unknown
|
||||||
|
privatesysconfdir=unknown
|
||||||
|
logdir=unknown
|
||||||
|
piddir=unknown
|
||||||
|
pipedir=unknown
|
||||||
|
pkglocalstatedir=unknown
|
||||||
|
spooldir=unknown
|
||||||
|
brokersdir=unknown
|
||||||
|
pluginsdir=unknown
|
||||||
|
cgibindir=unknown
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
eval prefix=$prefix
|
||||||
|
eval exec_prefix=$exec_prefix
|
||||||
|
eval bindir=$bindir
|
||||||
|
eval datarootdir=$datarootdir
|
||||||
|
eval datadir=$datadir
|
||||||
|
eval libexecdir=$libexecdir
|
||||||
|
eval brokersdir=$brokersdir
|
||||||
|
eval pluginsdir=$pluginsdir
|
||||||
|
eval cgibindir=$cgibindir
|
||||||
|
eval localstatedir=$localstatedir
|
||||||
|
eval pkglocalstatedir=$pkglocalstatedir
|
||||||
|
eval webdir=$webdir
|
||||||
|
eval localedir=$localedir
|
||||||
|
eval sysconfdir=$sysconfdir
|
||||||
|
eval pkgsysconfdir=$pkgsysconfdir
|
||||||
|
eval piddir=$piddir
|
||||||
|
|
||||||
|
|
||||||
|
# We test systemd first because in case
|
||||||
|
# someone tries to install Nagios on a
|
||||||
|
# system with a newer version, that doesn't
|
||||||
|
# have the defined versions ..we can just
|
||||||
|
# (hopefully) fall back to SysV
|
||||||
|
# And if that doesn't work, well...
|
||||||
|
AS_CASE([$init_type],
|
||||||
|
|
||||||
|
[systemd],
|
||||||
|
if test -d "/lib/systemd/system"; then
|
||||||
|
initdir=${initdir="/lib/systemd/system"}
|
||||||
|
elif test -d "/usr/lib/systemd/system"; then
|
||||||
|
initdir=${initdir="/usr/lib/systemd/system"}
|
||||||
|
elif test -d "/usr/local/lib/systemd/system"; then
|
||||||
|
initdir=${initdir="/usr/local/lib/systemd/system"}
|
||||||
|
elif test -d "/run/systemd/system"; then
|
||||||
|
initdir=${initdir="/run/systemd/system"}
|
||||||
|
elif test -d "/etc/systemd/system"; then
|
||||||
|
initdir=${initdir="/etc/systemd/system"}
|
||||||
|
elif test -d "/etc/systemd/user"; then
|
||||||
|
initdir=${initdir="/etc/systemd/user"}
|
||||||
|
elif test -d "/run/systemd/user"; then
|
||||||
|
initdir=${initdir="/run/systemd/user"}
|
||||||
|
elif test -d "/usr/lib/systemd/user"; then
|
||||||
|
initdir=${initdir="/usr/lib/systemd/user"}
|
||||||
|
elif test -d "/usr/local/lib/systemd/user"; then
|
||||||
|
initdir=${initdir="/usr/local/lib/systemd/user"}
|
||||||
|
elif test -d "/usr/share/systemd/user"; then
|
||||||
|
initdir=${initdir="/usr/share/systemd/user"}
|
||||||
|
elif test -d "/usr/local/share/systemd/user"; then
|
||||||
|
initdir=${initdir="/usr/local/share/systemd/user"}
|
||||||
|
elif test -d "$HOME/.config/systemd/user"; then
|
||||||
|
initdir=${initdir="$HOME/.config/systemd/user"}
|
||||||
|
elif test -d "$HOME/.local/share/systemd/user"; then
|
||||||
|
initdir=${initdir="$HOME/.local/share/systemd/user"}
|
||||||
|
elif test -d "$XDG_CONFIG_HOME/systemd/user/"; then
|
||||||
|
initdir=${initdir="$XDG_CONFIG_HOME/systemd/user/"}
|
||||||
|
elif test -d "$XDG_RUNTIME_DIR/systemd/user/"; then
|
||||||
|
initdir=${initdir="$XDG_RUNTIME_DIR/systemd/user/"}
|
||||||
|
elif test -d "$XDG_DATA_HOME/systemd/user/"; then
|
||||||
|
initdir=${initdir="$XDG_DATA_HOME/systemd/user/"}
|
||||||
|
else
|
||||||
|
init_type="sysv"
|
||||||
|
fi
|
||||||
|
initname=${initname="$INIT_PROG.service"},
|
||||||
|
)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Init scripts/files
|
||||||
|
#
|
||||||
|
AS_CASE([$init_type],
|
||||||
|
|
||||||
|
[sysv],
|
||||||
|
if test $dist_type = "hp-ux"; then
|
||||||
|
initdir=${initdir="/sbin/init.d"}
|
||||||
|
else
|
||||||
|
initdir=${initdir="/etc/init.d"}
|
||||||
|
fi
|
||||||
|
initname=${initname="$INIT_PROG"}
|
||||||
|
initconfdir=${initconfdir="/etc/conf.d"}
|
||||||
|
initconf=${initconf="$initconfdir/$INIT_PROG"},
|
||||||
|
|
||||||
|
|
||||||
|
[bsd],
|
||||||
|
if test $dist_type = "aix"; then
|
||||||
|
initdir=${initdir="/sbin/rc.d/init.d"}
|
||||||
|
initname=${initname="$INIT_PROG"}
|
||||||
|
else
|
||||||
|
initdir=${initdir="/etc/rc.d"}
|
||||||
|
initname=${initname="rc.$INIT_PROG"}
|
||||||
|
fi,
|
||||||
|
|
||||||
|
[newbsd],
|
||||||
|
initdir=${initdir="/usr/local/etc/rc.d"}
|
||||||
|
initname=${initname="$INIT_PROG"},
|
||||||
|
|
||||||
|
[gentoo],
|
||||||
|
initdir=${initdir="/etc/init.d"}
|
||||||
|
initname=${initname="$INIT_PROG"}
|
||||||
|
initconfdir=${initconfdir="/etc/init.d"}
|
||||||
|
initconf=${initconf="$initconfdir/$INIT_PROG"},
|
||||||
|
|
||||||
|
[openrc],
|
||||||
|
initdir=${initdir="/etc/init.d"}
|
||||||
|
initname=${initname="$INIT_PROG"}
|
||||||
|
initconfdir=${initconfdir="/etc/conf.d"}
|
||||||
|
initconf=${initconf="$initconfdir/$INIT_PROG"},
|
||||||
|
|
||||||
|
[smf*],
|
||||||
|
if test $init_type = smf10; then
|
||||||
|
initdir=${initdir="/var/svc/manifest/network/nagios"}
|
||||||
|
else
|
||||||
|
initdir=${initdir="/lib/svc/manifest/network/nagios"}
|
||||||
|
fi
|
||||||
|
initname=${initname="$INIT_PROG.xml"}
|
||||||
|
initconfdir=unknown
|
||||||
|
initconf=unknown,
|
||||||
|
|
||||||
|
[upstart],
|
||||||
|
initdir=${initdir="/etc/init"}
|
||||||
|
initname=${initname="$INIT_PROG.conf"}
|
||||||
|
initconfdir=${initconfdir="/etc/default"}
|
||||||
|
initconf=${initconf="$initconfdir/$INIT_PROG"},
|
||||||
|
|
||||||
|
[launchd],
|
||||||
|
initdir=${initdir="/Library/LaunchDaemons"}
|
||||||
|
initname=${initname="org.nagios.$INIT_PROG.plist"},
|
||||||
|
# initconfdir=${initconfdir="/private/etc"}
|
||||||
|
# initconf=${initconf="$initconfdir/$INIT_PROG"},
|
||||||
|
|
||||||
|
[systemd],
|
||||||
|
init_type=systemd,
|
||||||
|
|
||||||
|
[*],
|
||||||
|
initdir=unknown
|
||||||
|
initname=unknown)
|
||||||
|
|
||||||
|
# Now see if they supplied any overwriting values
|
||||||
|
initdiroverridden=no
|
||||||
|
AC_ARG_WITH(initdir,
|
||||||
|
AC_HELP_STRING([--with-initdir=<path>],
|
||||||
|
[overrides path for initdir]),
|
||||||
|
initdir=$withval
|
||||||
|
initdiroverridden=yes,
|
||||||
|
initdir=$initdir
|
||||||
|
)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Inetd (per connection) scripts/files
|
||||||
|
#
|
||||||
|
AS_CASE([$inetd_type],
|
||||||
|
[inetd*],
|
||||||
|
inetddir=${inetddir="/etc"}
|
||||||
|
inetdname=${inetdname="inetd.conf"},
|
||||||
|
|
||||||
|
[xinetd],
|
||||||
|
inetddir=${inetddir="/etc/xinetd.d"}
|
||||||
|
inetdname=${inetdname="$INIT_PROG"},
|
||||||
|
|
||||||
|
[systemd],
|
||||||
|
if test $dist_type = "debian"; then
|
||||||
|
inetddir=${inetddir="/lib/systemd/system"}
|
||||||
|
else
|
||||||
|
inetddir=${inetddir="/usr/lib/systemd/system"}
|
||||||
|
fi
|
||||||
|
netdname=${inetdname="$INIT_PROG.socket"},
|
||||||
|
|
||||||
|
[smf*],
|
||||||
|
if test $init_type = smf10; then
|
||||||
|
inetddir=${inetddir="/var/svc/manifest/network/nagios"}
|
||||||
|
else
|
||||||
|
inetddir=${inetddir="/lib/svc/manifest/network/nagios"}
|
||||||
|
fi
|
||||||
|
inetdname=${inetdname="$INIT_PROG.xml"},
|
||||||
|
|
||||||
|
# [upstart],
|
||||||
|
# inetddir=${inetddir="/etc/init.d"}
|
||||||
|
# inetdname=${inetdname="$INIT_PROG"},
|
||||||
|
|
||||||
|
[launchd],
|
||||||
|
inetddir=${inetddir="/Library/LaunchDaemons"}
|
||||||
|
inetdname=${inetdname="org.nagios.$INIT_PROG.plist"},
|
||||||
|
|
||||||
|
[*],
|
||||||
|
inetddir=${inetddir="unknown"}
|
||||||
|
inetdname=${inetdname="unknown"})
|
||||||
|
|
||||||
|
AC_MSG_RESULT($install_method)
|
||||||
|
])
|
303
autoconf-macros/ax_nagios_get_ssl
Normal file
303
autoconf-macros/ax_nagios_get_ssl
Normal file
@ -0,0 +1,303 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_NAGIOS_GET_SSL
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# This macro finds the openssl binary, the header files directory and
|
||||||
|
# the library files directory. It will also search for the gnutls
|
||||||
|
# compatibility library/headers and the nss compatibility library/headers.
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2016 Nagios Core Development Team
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by the
|
||||||
|
# Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
# option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
# Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||||
|
# gives unlimited permission to copy, distribute and modify the configure
|
||||||
|
# scripts that are the output of Autoconf when processing the Macro. You
|
||||||
|
# need not follow the terms of the GNU General Public License when using
|
||||||
|
# or distributing such scripts, even though portions of the text of the
|
||||||
|
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||||
|
# all other use of the material that constitutes the Autoconf Macro.
|
||||||
|
#
|
||||||
|
# This special exception to the GPL applies to versions of the Autoconf
|
||||||
|
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||||
|
# modified version of the Autoconf Macro, you may extend this special
|
||||||
|
# exception to the GPL to apply to your modified version as well.
|
||||||
|
# ===========================================================================
|
||||||
|
|
||||||
|
AU_ALIAS([AC_NAGIOS_GET_SSL], [AX_NAGIOS_GET_SSL])
|
||||||
|
AC_DEFUN([AX_NAGIOS_GET_SSL],
|
||||||
|
[
|
||||||
|
|
||||||
|
# -------------------------------
|
||||||
|
# SSL library and include paths
|
||||||
|
# -------------------------------
|
||||||
|
|
||||||
|
SSL_TYPE=openssl
|
||||||
|
try_pkg_config=1
|
||||||
|
ssl_dir=
|
||||||
|
ssl_inc_dir=
|
||||||
|
ssl_lib_dir=
|
||||||
|
SSL_INC_DIR=
|
||||||
|
SSL_INC_PREFIX=
|
||||||
|
SSL_HDR=
|
||||||
|
SSL_LIB_DIR=
|
||||||
|
|
||||||
|
AC_SUBST(HAVE_SSL)
|
||||||
|
AC_SUBST(SSL_TYPE)
|
||||||
|
AC_SUBST(SSL_INC_DIR)
|
||||||
|
AC_SUBST(SSL_HDR)
|
||||||
|
AC_SUBST(SSL_INC_PREFIX)
|
||||||
|
AC_SUBST(SSL_LIB_DIR)
|
||||||
|
|
||||||
|
|
||||||
|
# gnutls/openssl.h
|
||||||
|
# nss_compat_ossl/nss_compat_ossl.h
|
||||||
|
|
||||||
|
dnl # Which type - openssl, gnutls-openssl, nss
|
||||||
|
dnl AC_ARG_WITH([ssl-type],
|
||||||
|
dnl dnl AS_HELP_STRING([--with-ssl-type=TYPE],[replace TYPE with gnutls or nss to use one of these instead of openssl]),
|
||||||
|
dnl AS_HELP_STRING([--with-ssl-type=TYPE],[replace TYPE with gnutls to use that instead of openssl]),
|
||||||
|
dnl [SSL_TYPE=$withval])
|
||||||
|
|
||||||
|
AC_ARG_WITH([ssl],
|
||||||
|
AS_HELP_STRING([--with-ssl=DIR],[sets location of the SSL installation]),
|
||||||
|
[ssl_dir=$withval])
|
||||||
|
AC_ARG_WITH([ssl-inc],
|
||||||
|
AS_HELP_STRING([--with-ssl-inc=DIR],
|
||||||
|
[sets location of the SSL include files]),
|
||||||
|
[ssl_inc_dir=$withval])
|
||||||
|
AC_ARG_WITH([ssl-lib],
|
||||||
|
AS_HELP_STRING([--with-ssl-lib=DIR],[sets location of the SSL libraries]),
|
||||||
|
[ssl_lib_dir=$withval])
|
||||||
|
|
||||||
|
if test x$ssl_inc_dir != x -o x$ssl_lib_dir != x; then
|
||||||
|
try_pkg_config=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_ARG_WITH([kerberos-inc],
|
||||||
|
AS_HELP_STRING([--with-kerberos-inc=DIR],
|
||||||
|
[sets location of the Kerberos include files]),
|
||||||
|
[kerberos_inc_dir=$withval])
|
||||||
|
|
||||||
|
if test x$SSL_TYPE = xyes; then
|
||||||
|
SSL_TYPE=openssl
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
dflt_hdrs="$ssl_inc_dir $ssl_dir $ssl_inc_dir/include $ssl_dir/include \
|
||||||
|
/usr/local/opt/{BBB} /usr/include/{BBB} /usr/local/include/{BBB} \
|
||||||
|
/usr/local/{AAA} /usr/local/{BBB} /usr/lib/{AAA} /usr/lib/{BBB} \
|
||||||
|
/usr/{AAA} /usr/pkg /usr/local /usr /usr/freeware/lib/{BBB} \
|
||||||
|
/usr/sfw /usr/sfw/include /opt/{BBB}"
|
||||||
|
|
||||||
|
dflt_libs="$ssl_lib_dir {ssldir} {ssldir}/lib {ssldir}/lib64 /usr/lib64 \
|
||||||
|
/usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu \
|
||||||
|
/usr/local/lib /usr/lib/{AAA} /usr/{AAA}/lib /usr/{BBB}/lib \
|
||||||
|
/usr/pkg/lib /usr/freeware/lib/{BBB} /usr/sfw/lib /opt/freeware/lib \
|
||||||
|
/opt/{BBB}/lib/hpux64 /opt/{BBB}/lib/pa20_64 /opt/{BBB}/lib/hpux32 \
|
||||||
|
/opt/{BBB}/lib /opt/{BBB}";
|
||||||
|
|
||||||
|
|
||||||
|
AS_CASE([$SSL_TYPE],
|
||||||
|
[no], [SSL_TYPE=NONE],
|
||||||
|
[yes|openssl],
|
||||||
|
[ssl_hdr_dirs=`echo "$dflt_hdrs" | sed -e 's/{AAA}/ssl/g' | sed -e 's/{BBB}/openssl/g'`
|
||||||
|
ssl_lib_dirs=`echo "$dflt_libs" | sed -e 's/{AAA}/ssl/g' | sed -e 's/{BBB}/openssl/g'`
|
||||||
|
SSL_INC_PREFIX=openssl
|
||||||
|
SSL_HDR=ssl.h
|
||||||
|
ssl_lib=libssl],
|
||||||
|
[gnutls],
|
||||||
|
[ssl_hdr_dirs=`echo "$dflt_hdrs" | sed -e 's/{AAA}/gnutls/g' | sed -e 's/{BBB}/gnutls/g'`
|
||||||
|
ssl_lib_dirs=`echo "$dflt_libs" | sed -e 's/{AAA}/gnutls/g' | sed -e 's/{BBB}/gnutls/g'`
|
||||||
|
SSL_INC_PREFIX=gnutls
|
||||||
|
SSL_TYPE=gnutls_compat
|
||||||
|
SSL_HDR=compat.h
|
||||||
|
ssl_lib=libgnutls],
|
||||||
|
[nss],
|
||||||
|
[ssl_hdr_dirs=`echo "$dflt_hdrs" | sed -e 's/{AAA}/nss_compat_ossl/g' | sed -e 's/{BBB}/nss_compat_ossl/g'`
|
||||||
|
ssl_lib_dirs=`echo "$dflt_libs" | sed -e 's/{AAA}/nss_compat_ossl/g' | sed -e 's/{BBB}/nss_compat_ossl/g'`
|
||||||
|
SSL_HDR=nss_compat_ossl.h
|
||||||
|
ssl_lib=libnss_compat],
|
||||||
|
[*], echo >&6; AC_MSG_ERROR(['--with-ssl-type=$SSL_TYPE' is invalid])
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Check for SSL support
|
||||||
|
|
||||||
|
if test x$SSL_TYPE != xNONE; then
|
||||||
|
|
||||||
|
found_ssl=no
|
||||||
|
|
||||||
|
# RedHat 8.0 and 9.0 include openssl compiled with kerberos,
|
||||||
|
# so we must include header file
|
||||||
|
# Must come before openssl checks for Redhat EL 3
|
||||||
|
AC_MSG_CHECKING(for Kerberos include files)
|
||||||
|
found_kerberos=no
|
||||||
|
for dir in $kerberos_inc_dir /usr/kerberos/include /usr/include/krb5 \
|
||||||
|
/usr/include; do
|
||||||
|
kerbdir="$dir"
|
||||||
|
if test -f "$dir/krb5.h"; then
|
||||||
|
found_kerberos=yes
|
||||||
|
CFLAGS="$CFLAGS -I$kerbdir"
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_KRB5_H,[1],[Have the krb5.h header file])
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if test x_$found_kerberos != x_yes; then
|
||||||
|
AC_MSG_WARN(could not find include files)
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(found Kerberos include files in $kerbdir)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# First, try using pkg_config
|
||||||
|
AC_CHECK_TOOL([PKG_CONFIG], [pkg-config])
|
||||||
|
if test x"$PKG_CONFIG" != x -a $try_pkg_config -ne 0 ; then
|
||||||
|
cflags=`$PKG_CONFIG $SSL_TYPE --cflags-only-I 2>/dev/null`
|
||||||
|
if test $? -eq 0; then
|
||||||
|
CFLAGS="$CFLAGS $cflags"
|
||||||
|
LDFLAGS="$LDFLAGS `$PKG_CONFIG $SSL_TYPE --libs-only-L 2>/dev/null`"
|
||||||
|
LIBS="$LIBS `$PKG_CONFIG $SSL_TYPE --libs-only-l 2>/dev/null`"
|
||||||
|
found_ssl=yes
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_SSL,[1],[Have SSL support])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test x_$found_ssl != x_yes; then
|
||||||
|
|
||||||
|
# Find the SSL Headers
|
||||||
|
AC_MSG_CHECKING(for SSL headers)
|
||||||
|
for dir in $ssl_hdr_dirs; do
|
||||||
|
if test "$dir" = "/include"; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
ssldir="$dir"
|
||||||
|
if test -f "$dir/include/$SSL_INC_PREFIX/$SSL_HDR"; then
|
||||||
|
found_ssl=yes
|
||||||
|
CFLAGS="$CFLAGS -I$dir/include/$SSL_INC_PREFIX -I$ssldir/include"
|
||||||
|
SSL_INC_DIR="$dir/include/$SSL_INC_PREFIX"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if test -f "$dir/include/$SSL_HDR"; then
|
||||||
|
found_ssl=yes
|
||||||
|
if test "$SSL_HDR" != compat.h ; then
|
||||||
|
SSL_INC_PREFIX=""
|
||||||
|
fi
|
||||||
|
CFLAGS="$CFLAGS -I$dir/include"
|
||||||
|
SSL_INC_DIR="$dir/include"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if test -f "$dir/$SSL_HDR"; then
|
||||||
|
found_ssl=yes
|
||||||
|
SSL_INC_PREFIX=""
|
||||||
|
CFLAGS="$CFLAGS -I$dir"
|
||||||
|
SSL_INC_DIR="$dir"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if test -f "$dir/$SSL_INC_PREFIX/$SSL_HDR"; then
|
||||||
|
found_ssl=yes
|
||||||
|
CFLAGS="$CFLAGS -I$dir/$SSL_INC_PREFIX"
|
||||||
|
SSL_INC_DIR="$dir/$SSL_INC_PREFIX"
|
||||||
|
ssldir="$dir/.."
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if test x_$found_ssl != x_yes; then
|
||||||
|
AC_MSG_ERROR(Cannot find ssl headers)
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(found in $ssldir)
|
||||||
|
|
||||||
|
# Now try and find SSL libraries
|
||||||
|
|
||||||
|
AC_MSG_CHECKING(for SSL libraries)
|
||||||
|
found_ssl=no
|
||||||
|
ssl_lib_dirs=`echo "$ssl_lib_dirs" | sed -e "s|{ssldir}|$ssldir|g"`
|
||||||
|
|
||||||
|
if test "`uname -s`" = "Darwin" ; then
|
||||||
|
soext="dylib"
|
||||||
|
elif test "`uname -s`" = "HP-UX" ; then
|
||||||
|
if test x$arch = "xia64"; then
|
||||||
|
soext="so"
|
||||||
|
else
|
||||||
|
soext="sl"
|
||||||
|
fi
|
||||||
|
elif test "`uname -s`" = "AIX" ; then
|
||||||
|
soext="a"
|
||||||
|
else
|
||||||
|
soext="so"
|
||||||
|
fi
|
||||||
|
|
||||||
|
for dir in $ssl_lib_dirs; do
|
||||||
|
if test -f "$dir/$ssl_lib.$soext"; then
|
||||||
|
found_ssl=yes
|
||||||
|
SSL_LIB_DIR="$dir"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if test x_$found_ssl != x_yes; then
|
||||||
|
AC_MSG_ERROR(Cannot find ssl libraries)
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(found in $SSL_LIB_DIR)
|
||||||
|
|
||||||
|
LDFLAGS="$LDFLAGS -L$SSL_LIB_DIR";
|
||||||
|
LIBS="$LIBS -l`echo $ssl_lib | sed -e 's/^lib//'` -lcrypto";
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_SSL,[1],[Have SSL support])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test x$found_ssl = xyes ; then
|
||||||
|
if test -n "$SSL_INC_PREFIX" ; then
|
||||||
|
SSL_INC_PREFIX="${SSL_INC_PREFIX}/"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# try to compile and link to see if SSL is set up properly
|
||||||
|
AC_MSG_CHECKING([whether compiling and linking against SSL works])
|
||||||
|
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM([#include <${SSL_INC_PREFIX}${SSL_HDR}>], [SSL_new(NULL)])],
|
||||||
|
[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
$1
|
||||||
|
], [
|
||||||
|
AC_MSG_ERROR([no])
|
||||||
|
$2
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test x$found_ssl = xyes -a x$need_dh = xyes; then
|
||||||
|
|
||||||
|
# Find the openssl program
|
||||||
|
|
||||||
|
if test x$need_dh = xyes; then
|
||||||
|
AC_PATH_PROG(sslbin,openssl,value-if-not-found,$ssl_dir/sbin$PATH_SEPARATOR$ssl_dir/bin$PATH_SEPARATOR$PATH)
|
||||||
|
AC_DEFINE(USE_SSL_DH)
|
||||||
|
# Generate DH parameters
|
||||||
|
if test -f "$sslbin"; then
|
||||||
|
echo ""
|
||||||
|
echo "*** Generating DH Parameters for SSL/TLS ***"
|
||||||
|
# awk to strip off meta data at bottom of dhparam output
|
||||||
|
$sslbin dhparam -C 2048 | awk '/^-----/ {exit} {print}' > include/dh.h
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
@ -14,13 +14,13 @@ CC=@CC@
|
|||||||
CFLAGS=-Wall -I.. @CFLAGS@ @DEFS@ -DNSCORE
|
CFLAGS=-Wall -I.. @CFLAGS@ @DEFS@ -DNSCORE
|
||||||
|
|
||||||
# Compiler flags for use with gprof
|
# Compiler flags for use with gprof
|
||||||
#CFLAGS=-pg -DHAVE_CONFIG_H -DNSCORE
|
#CFLAGS=-pg -I.. -DHAVE_CONFIG_H -DNSCORE
|
||||||
|
|
||||||
# Compiler flags for use with Valgrind
|
# Compiler flags for use with Valgrind
|
||||||
#CFLAGS=-O0 -g -DHAVE_CONFIG_H -DNSCORE
|
#CFLAGS=-O0 -I.. -g -DHAVE_CONFIG_H -DNSCORE
|
||||||
|
|
||||||
# Compiler flags for optimization (overrides default)
|
# Compiler flags for optimization (overrides default)
|
||||||
#CFLAGS=-O3 -Wall -fno-strict-aliasing -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -DHAVE_CONFIG_H -DNSCORE
|
#CFLAGS=-O3 -Wall -I.. -fno-strict-aliasing -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -DHAVE_CONFIG_H -DNSCORE
|
||||||
|
|
||||||
# Compiler flags for optimization (complements default)
|
# Compiler flags for optimization (complements default)
|
||||||
#CFLAGS_WARN=-Wall -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs
|
#CFLAGS_WARN=-Wall -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs
|
||||||
@ -36,8 +36,8 @@ exec_prefix=@exec_prefix@
|
|||||||
LOGDIR=@localstatedir@
|
LOGDIR=@localstatedir@
|
||||||
CFGDIR=@sysconfdir@
|
CFGDIR=@sysconfdir@
|
||||||
BINDIR=@bindir@
|
BINDIR=@bindir@
|
||||||
CGIDIR=@sbindir@
|
CGIDIR=@cgibindir@
|
||||||
HTMLDIR=@datarootdir@
|
HTMLDIR=@webdir@
|
||||||
INSTALL=@INSTALL@
|
INSTALL=@INSTALL@
|
||||||
INSTALL_OPTS=@INSTALL_OPTS@
|
INSTALL_OPTS=@INSTALL_OPTS@
|
||||||
COMMAND_OPTS=@COMMAND_OPTS@
|
COMMAND_OPTS=@COMMAND_OPTS@
|
||||||
@ -92,7 +92,7 @@ DDATAHDRS=
|
|||||||
DDATADEPS=$(DDATALIBS)
|
DDATADEPS=$(DDATALIBS)
|
||||||
|
|
||||||
|
|
||||||
OBJS=$(BROKER_O) $(SRC_COMMON)/shared.o nerd.o query-handler.o workers.o checks.o config.o commands.o events.o flapping.o logging.o macros-base.o netutils.o notifications.o sehandlers.o utils.o $(RDATALIBS) $(CDATALIBS) $(ODATALIBS) $(SDATALIBS) $(PDATALIBS) $(DDATALIBS) $(BASEEXTRALIBS)
|
OBJS=$(BROKER_O) $(SRC_COMMON)/shared.o @NERD_O@ query-handler.o workers.o checks.o config.o commands.o events.o flapping.o logging.o macros-base.o netutils.o notifications.o sehandlers.o utils.o $(RDATALIBS) $(CDATALIBS) $(ODATALIBS) $(SDATALIBS) $(PDATALIBS) $(DDATALIBS) $(BASEEXTRALIBS)
|
||||||
OBJDEPS=$(ODATADEPS) $(ODATADEPS) $(RDATADEPS) $(CDATADEPS) $(SDATADEPS) $(PDATADEPS) $(DDATADEPS) $(BROKER_H)
|
OBJDEPS=$(ODATADEPS) $(ODATADEPS) $(RDATADEPS) $(CDATADEPS) $(SDATADEPS) $(PDATADEPS) $(DDATADEPS) $(BROKER_H)
|
||||||
|
|
||||||
all: nagios nagiostats
|
all: nagios nagiostats
|
||||||
|
3466
base/checks.c
3466
base/checks.c
File diff suppressed because it is too large
Load Diff
697
base/commands.c
697
base/commands.c
File diff suppressed because it is too large
Load Diff
@ -136,7 +136,7 @@ int read_main_config_file(char *main_config_file) {
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* get the variable name */
|
/* get the variable name */
|
||||||
if((temp_ptr = my_strtok(input, "=")) == NULL) {
|
if((temp_ptr = my_strtok_with_free(input, "=", FALSE)) == NULL) {
|
||||||
asprintf(&error_message, "NULL variable");
|
asprintf(&error_message, "NULL variable");
|
||||||
error = TRUE;
|
error = TRUE;
|
||||||
break;
|
break;
|
||||||
@ -148,7 +148,7 @@ int read_main_config_file(char *main_config_file) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* get the value */
|
/* get the value */
|
||||||
if((temp_ptr = my_strtok(NULL, "\n")) == NULL) {
|
if((temp_ptr = my_strtok_with_free(NULL, "\n", FALSE)) == NULL) {
|
||||||
asprintf(&error_message, "NULL value");
|
asprintf(&error_message, "NULL value");
|
||||||
error = TRUE;
|
error = TRUE;
|
||||||
break;
|
break;
|
||||||
@ -158,6 +158,7 @@ int read_main_config_file(char *main_config_file) {
|
|||||||
error = TRUE;
|
error = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
temp_ptr = my_strtok_with_free(NULL, "\n", TRUE);
|
||||||
strip(variable);
|
strip(variable);
|
||||||
strip(value);
|
strip(value);
|
||||||
|
|
||||||
@ -176,8 +177,12 @@ int read_main_config_file(char *main_config_file) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
else if(!strcmp(variable, "website_url")) {
|
else if(!strcmp(variable, "website_url")) {
|
||||||
|
int lth;
|
||||||
my_free(website_url);
|
my_free(website_url);
|
||||||
website_url = strdup(value);
|
website_url = strdup(value);
|
||||||
|
lth = strlen(website_url);
|
||||||
|
if (website_url[lth-1] == '/')
|
||||||
|
website_url[lth-1] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(!strcmp(variable, "loadctl_options"))
|
else if(!strcmp(variable, "loadctl_options"))
|
||||||
@ -1177,6 +1182,38 @@ int read_main_config_file(char *main_config_file) {
|
|||||||
else if(!strcmp(variable,"host_down_disable_service_checks")) {
|
else if(!strcmp(variable,"host_down_disable_service_checks")) {
|
||||||
host_down_disable_service_checks = strtoul(value, NULL, 0);
|
host_down_disable_service_checks = strtoul(value, NULL, 0);
|
||||||
}
|
}
|
||||||
|
else if(!strcmp(variable,"service_skip_check_dependency_status")) {
|
||||||
|
service_skip_check_dependency_status = atoi(value);
|
||||||
|
if(service_skip_check_dependency_status < -1 || service_skip_check_dependency_status > 3) {
|
||||||
|
asprintf(&error_message, "Illegal value for service_skip_check_dependency_status");
|
||||||
|
error = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(!strcmp(variable,"service_skip_check_parent_status")) {
|
||||||
|
service_skip_check_parent_status = atoi(value);
|
||||||
|
if(service_skip_check_parent_status < -1 || service_skip_check_parent_status > 3) {
|
||||||
|
asprintf(&error_message, "Illegal value for service_skip_check_parent_status");
|
||||||
|
error = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(!strcmp(variable,"service_skip_check_host_down_status")) {
|
||||||
|
service_skip_check_host_down_status = atoi(value);
|
||||||
|
if(service_skip_check_host_down_status < -1 || service_skip_check_host_down_status > 3) {
|
||||||
|
asprintf(&error_message, "Illegal value for service_skip_check_host_down_status");
|
||||||
|
error = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(!strcmp(variable,"host_skip_check_dependency_status")) {
|
||||||
|
host_skip_check_dependency_status = atoi(value);
|
||||||
|
if(host_skip_check_dependency_status < -1 || host_skip_check_dependency_status > 3) {
|
||||||
|
asprintf(&error_message, "Illegal value for host_skip_check_dependency_status");
|
||||||
|
error = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
/* we don't know what this variable is... */
|
/* we don't know what this variable is... */
|
||||||
else {
|
else {
|
||||||
asprintf(&error_message, "UNKNOWN VARIABLE");
|
asprintf(&error_message, "UNKNOWN VARIABLE");
|
||||||
@ -1320,7 +1357,7 @@ int read_resource_file(char *resource_file) {
|
|||||||
strip(input);
|
strip(input);
|
||||||
|
|
||||||
/* get the variable name */
|
/* get the variable name */
|
||||||
if((temp_ptr = my_strtok(input, "=")) == NULL) {
|
if((temp_ptr = my_strtok_with_free(input, "=", FALSE)) == NULL) {
|
||||||
logit(NSLOG_CONFIG_ERROR, TRUE, "Error: NULL variable - Line %d of resource file '%s'", current_line, resource_file);
|
logit(NSLOG_CONFIG_ERROR, TRUE, "Error: NULL variable - Line %d of resource file '%s'", current_line, resource_file);
|
||||||
error = TRUE;
|
error = TRUE;
|
||||||
break;
|
break;
|
||||||
@ -1331,7 +1368,7 @@ int read_resource_file(char *resource_file) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* get the value */
|
/* get the value */
|
||||||
if((temp_ptr = my_strtok(NULL, "\n")) == NULL) {
|
if((temp_ptr = my_strtok_with_free(NULL, "\n", FALSE)) == NULL) {
|
||||||
logit(NSLOG_CONFIG_ERROR, TRUE, "Error: NULL variable value - Line %d of resource file '%s'", current_line, resource_file);
|
logit(NSLOG_CONFIG_ERROR, TRUE, "Error: NULL variable value - Line %d of resource file '%s'", current_line, resource_file);
|
||||||
error = TRUE;
|
error = TRUE;
|
||||||
break;
|
break;
|
||||||
@ -1340,6 +1377,7 @@ int read_resource_file(char *resource_file) {
|
|||||||
error = TRUE;
|
error = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
temp_ptr = my_strtok_with_free(NULL, "\n", TRUE);
|
||||||
|
|
||||||
/* what should we do with the variable/value pair? */
|
/* what should we do with the variable/value pair? */
|
||||||
|
|
||||||
|
195
base/events.c
195
base/events.c
@ -757,40 +757,27 @@ int init_event_queue(void)
|
|||||||
unsigned int size;
|
unsigned int size;
|
||||||
|
|
||||||
size = num_objects.hosts + num_objects.services;
|
size = num_objects.hosts + num_objects.services;
|
||||||
if(size < 4096)
|
if (size < 4096) {
|
||||||
size = 4096;
|
size = 4096;
|
||||||
|
}
|
||||||
|
|
||||||
nagios_squeue = squeue_create(size);
|
nagios_squeue = squeue_create(size);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* schedule a new timed event */
|
/* schedule a new timed event */
|
||||||
timed_event *schedule_new_event(int event_type, int high_priority, time_t run_time, int recurring, unsigned long event_interval, void *timing_func, int compensate_for_time_change, void *event_data, void *event_args, int event_options) {
|
timed_event *schedule_new_event(int event_type, int high_priority, time_t run_time,
|
||||||
timed_event *new_event;
|
int recurring, unsigned long event_interval, void *timing_func,
|
||||||
|
int compensate_for_time_change, void *event_data, void *event_args, int event_options)
|
||||||
|
{
|
||||||
|
timed_event * new_event = NULL;
|
||||||
char run_time_string[MAX_DATETIME_LENGTH] = "";
|
char run_time_string[MAX_DATETIME_LENGTH] = "";
|
||||||
|
|
||||||
log_debug_info(DEBUGL_FUNCTIONS, 0, "schedule_new_event()\n");
|
get_datetime_string(&run_time, run_time_string, MAX_DATETIME_LENGTH, SHORT_DATE_TIME);
|
||||||
|
|
||||||
get_datetime_string(&run_time, run_time_string, MAX_DATETIME_LENGTH,
|
|
||||||
SHORT_DATE_TIME);
|
|
||||||
log_debug_info(DEBUGL_EVENTS, 0, "New Event Details:\n");
|
|
||||||
log_debug_info(DEBUGL_EVENTS, 0, " Type: EVENT_%s\n",
|
|
||||||
EVENT_TYPE_STR(event_type));
|
|
||||||
log_debug_info(DEBUGL_EVENTS, 0, " High Priority: %s\n",
|
|
||||||
( high_priority ? "Yes" : "No"));
|
|
||||||
log_debug_info(DEBUGL_EVENTS, 0, " Run Time: %s\n",
|
|
||||||
run_time_string);
|
|
||||||
log_debug_info(DEBUGL_EVENTS, 0, " Recurring: %s\n",
|
|
||||||
( recurring ? "Yes" : "No"));
|
|
||||||
log_debug_info(DEBUGL_EVENTS, 0, " Event Interval: %lu\n",
|
|
||||||
event_interval);
|
|
||||||
log_debug_info(DEBUGL_EVENTS, 0, " Compensate for Time Change: %s\n",
|
|
||||||
( compensate_for_time_change ? "Yes" : "No"));
|
|
||||||
log_debug_info(DEBUGL_EVENTS, 0, " Event Options: %d\n",
|
|
||||||
event_options);
|
|
||||||
|
|
||||||
new_event = (timed_event *)calloc(1, sizeof(timed_event));
|
new_event = (timed_event *)calloc(1, sizeof(timed_event));
|
||||||
if(new_event != NULL) {
|
if (new_event != NULL) {
|
||||||
|
|
||||||
new_event->event_type = event_type;
|
new_event->event_type = event_type;
|
||||||
new_event->event_data = event_data;
|
new_event->event_data = event_data;
|
||||||
new_event->event_args = event_args;
|
new_event->event_args = event_args;
|
||||||
@ -802,20 +789,40 @@ timed_event *schedule_new_event(int event_type, int high_priority, time_t run_ti
|
|||||||
new_event->compensate_for_time_change = compensate_for_time_change;
|
new_event->compensate_for_time_change = compensate_for_time_change;
|
||||||
new_event->priority = high_priority;
|
new_event->priority = high_priority;
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
log_debug_info(DEBUGL_EVENTS, 0, " Event ID: %p\n", new_event);
|
log_debug_info(DEBUGL_FUNCTIONS, 0,
|
||||||
|
"schedule_new_event()\n"
|
||||||
|
"New Event Details:\n"
|
||||||
|
" Event ID: %p\n"
|
||||||
|
" Type: EVENT_%s\n"
|
||||||
|
" High Priority: %d\n"
|
||||||
|
" Run Time: %s\n"
|
||||||
|
" Recurring: %d\n"
|
||||||
|
" Event Interval: %lu\n"
|
||||||
|
" Compensate for Time Change: %d\n"
|
||||||
|
" Event Options: %d\n",
|
||||||
|
new_event,
|
||||||
|
EVENT_TYPE_STR(event_type),
|
||||||
|
high_priority,
|
||||||
|
run_time_string,
|
||||||
|
recurring,
|
||||||
|
event_interval,
|
||||||
|
compensate_for_time_change,
|
||||||
|
event_options);
|
||||||
|
|
||||||
/* add the event to the event list */
|
/* add the event to the event list */
|
||||||
add_event(nagios_squeue, new_event);
|
add_event(nagios_squeue, new_event);
|
||||||
|
|
||||||
return new_event;
|
return new_event;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* reschedule an event in order of execution time */
|
/* reschedule an event in order of execution time */
|
||||||
void reschedule_event(squeue_t *sq, timed_event *event) {
|
void reschedule_event(squeue_t *sq, timed_event *event)
|
||||||
|
{
|
||||||
time_t current_time = 0L;
|
time_t current_time = 0L;
|
||||||
time_t (*timingfunc)(void);
|
time_t (*timingfunc)(void);
|
||||||
|
|
||||||
@ -826,84 +833,99 @@ void reschedule_event(squeue_t *sq, timed_event *event) {
|
|||||||
|
|
||||||
/* use custom timing function */
|
/* use custom timing function */
|
||||||
if(event->timing_func != NULL) {
|
if(event->timing_func != NULL) {
|
||||||
|
|
||||||
timingfunc = event->timing_func;
|
timingfunc = event->timing_func;
|
||||||
event->run_time = (*timingfunc)();
|
event->run_time = (*timingfunc)();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* normal recurring events */
|
/* normal recurring events */
|
||||||
else {
|
else {
|
||||||
|
|
||||||
event->run_time = event->run_time + event->event_interval;
|
event->run_time = event->run_time + event->event_interval;
|
||||||
time(¤t_time);
|
time(¤t_time);
|
||||||
if(event->run_time < current_time)
|
|
||||||
|
if(event->run_time < current_time) {
|
||||||
event->run_time = current_time;
|
event->run_time = current_time;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* add the event to the event list */
|
/* add the event to the event list */
|
||||||
add_event(sq, event);
|
add_event(sq, event);
|
||||||
|
}
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* add an event to list ordered by execution time */
|
/* add an event to list ordered by execution time */
|
||||||
void add_event(squeue_t *sq, timed_event *event) {
|
void add_event(squeue_t *sq, timed_event *event)
|
||||||
|
{
|
||||||
log_debug_info(DEBUGL_FUNCTIONS, 0, "add_event()\n");
|
log_debug_info(DEBUGL_FUNCTIONS, 0, "add_event()\n");
|
||||||
|
|
||||||
if(event->sq_event) {
|
if (event->sq_event != NULL) {
|
||||||
|
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE,
|
logit(NSLOG_RUNTIME_ERROR, TRUE,
|
||||||
"Error: Adding %s event that seems to already be scheduled\n",
|
"Error: Adding %s event that seems to already be scheduled\n",
|
||||||
EVENT_TYPE_STR(event->event_type));
|
EVENT_TYPE_STR(event->event_type));
|
||||||
|
|
||||||
remove_event(sq, event);
|
remove_event(sq, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(event->priority) {
|
if (event->priority > 0) {
|
||||||
event->sq_event = squeue_add_usec(sq, event->run_time, event->priority - 1, event);
|
event->sq_event = squeue_add_usec(sq, event->run_time, event->priority - 1, event);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
event->sq_event = squeue_add(sq, event->run_time, event);
|
event->sq_event = squeue_add(sq, event->run_time, event);
|
||||||
}
|
}
|
||||||
if(!event->sq_event) {
|
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Failed to add event to squeue '%p' with prio %u: %s\n",
|
if (event->sq_event == NULL) {
|
||||||
|
|
||||||
|
logit(NSLOG_RUNTIME_ERROR, TRUE,
|
||||||
|
"Error: Failed to add event to squeue '%p' with prio %u: %s\n",
|
||||||
sq, event->priority, strerror(errno));
|
sq, event->priority, strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(sq == nagios_squeue)
|
/* this specifies + just to ensure different than `-1` visually */
|
||||||
|
if (sq == nagios_squeue) {
|
||||||
track_events(event->event_type, +1);
|
track_events(event->event_type, +1);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef USE_EVENT_BROKER
|
#ifdef USE_EVENT_BROKER
|
||||||
else {
|
else {
|
||||||
/* send event data to broker */
|
|
||||||
broker_timed_event(NEBTYPE_TIMEDEVENT_ADD, NEBFLAG_NONE, NEBATTR_NONE, event, NULL);
|
broker_timed_event(NEBTYPE_TIMEDEVENT_ADD, NEBFLAG_NONE, NEBATTR_NONE, event, NULL);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* remove an event from the queue */
|
/* remove an event from the queue */
|
||||||
void remove_event(squeue_t *sq, timed_event *event) {
|
void remove_event(squeue_t *sq, timed_event *event)
|
||||||
|
{
|
||||||
|
|
||||||
#ifdef USE_EVENT_BROKER
|
#ifdef USE_EVENT_BROKER
|
||||||
/* send event data to broker */
|
|
||||||
broker_timed_event(NEBTYPE_TIMEDEVENT_REMOVE, NEBFLAG_NONE, NEBATTR_NONE, event, NULL);
|
broker_timed_event(NEBTYPE_TIMEDEVENT_REMOVE, NEBFLAG_NONE, NEBATTR_NONE, event, NULL);
|
||||||
#endif
|
#endif
|
||||||
if(!event || !event->sq_event)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (sq)
|
if (event == NULL || event->sq_event == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sq != NULL) {
|
||||||
squeue_remove(sq, event->sq_event);
|
squeue_remove(sq, event->sq_event);
|
||||||
else
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE,
|
logit(NSLOG_RUNTIME_ERROR, TRUE,
|
||||||
"Error: remove_event() called for %s event with NULL sq parameter\n",
|
"Error: remove_event() called for %s event with NULL sq parameter\n",
|
||||||
EVENT_TYPE_STR(event->event_type));
|
EVENT_TYPE_STR(event->event_type));
|
||||||
|
}
|
||||||
|
|
||||||
if(sq == nagios_squeue)
|
if (sq == nagios_squeue) {
|
||||||
track_events(event->event_type, -1);
|
track_events(event->event_type, -1);
|
||||||
|
}
|
||||||
|
|
||||||
event->sq_event = NULL; /* mark this event as unscheduled */
|
/* mark this event as unscheduled */
|
||||||
|
event->sq_event = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* if we catch an event from the queue which gets removed when
|
* if we catch an event from the queue which gets removed when
|
||||||
@ -916,88 +938,121 @@ void remove_event(squeue_t *sq, timed_event *event) {
|
|||||||
if (event == current_event) {
|
if (event == current_event) {
|
||||||
current_event = NULL;
|
current_event = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int should_run_event(timed_event *temp_event)
|
static int should_run_event(timed_event *temp_event)
|
||||||
{
|
{
|
||||||
int run_event = TRUE; /* default action is to execute the event */
|
/* default action is to execute the event */
|
||||||
|
int run_event = TRUE;
|
||||||
int nudge_seconds = 0;
|
int nudge_seconds = 0;
|
||||||
|
|
||||||
/* we only care about jobs that cause processes to run */
|
/* we only care about jobs that cause processes to run */
|
||||||
if (temp_event->event_type != EVENT_HOST_CHECK &&
|
if (temp_event->event_type != EVENT_HOST_CHECK
|
||||||
temp_event->event_type != EVENT_SERVICE_CHECK)
|
&& temp_event->event_type != EVENT_SERVICE_CHECK) {
|
||||||
{
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if we can't spawn any more jobs, don't bother */
|
/* if we can't spawn any more jobs, don't bother */
|
||||||
if (!wproc_can_spawn(&loadctl)) {
|
if (wproc_can_spawn(&loadctl) <= 0) {
|
||||||
wproc_reap(1, 1); /* Try to reap one job for one msec. */
|
|
||||||
|
/* Try to reap one job for one msec. */
|
||||||
|
wproc_reap(1, 1);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* run a few checks before executing a service check... */
|
/* run a few checks before executing a service check... */
|
||||||
if(temp_event->event_type == EVENT_SERVICE_CHECK) {
|
if (temp_event->event_type == EVENT_SERVICE_CHECK) {
|
||||||
|
|
||||||
service *temp_service = (service *)temp_event->event_data;
|
service *temp_service = (service *)temp_event->event_data;
|
||||||
|
|
||||||
/* forced checks override normal check logic */
|
/* forced checks override normal check logic */
|
||||||
if((temp_service->check_options & CHECK_OPTION_FORCE_EXECUTION))
|
if((temp_service->check_options & CHECK_OPTION_FORCE_EXECUTION)) {
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* don't run a service check if we're already maxed out on the number of parallel service checks... */
|
/* don't run a service check if we're already maxed out on the number of parallel service checks... */
|
||||||
if(max_parallel_service_checks != 0 && (currently_running_service_checks >= max_parallel_service_checks)) {
|
if (max_parallel_service_checks != 0
|
||||||
|
&& currently_running_service_checks >= max_parallel_service_checks) {
|
||||||
|
|
||||||
nudge_seconds = ranged_urand(NUDGE_MIN, NUDGE_MAX);
|
nudge_seconds = ranged_urand(NUDGE_MIN, NUDGE_MAX);
|
||||||
logit(NSLOG_RUNTIME_WARNING, TRUE, "\tMax concurrent service checks (%d) has been reached. Nudging %s:%s by %d seconds...\n", max_parallel_service_checks, temp_service->host_name, temp_service->description, nudge_seconds);
|
logit(NSLOG_RUNTIME_WARNING, TRUE,
|
||||||
|
"\tMax concurrent service checks (%d) has been reached."
|
||||||
|
" Nudging %s:%s by %d seconds...\n",
|
||||||
|
max_parallel_service_checks, temp_service->host_name,
|
||||||
|
temp_service->description, nudge_seconds);
|
||||||
|
|
||||||
run_event = FALSE;
|
run_event = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* don't run a service check if active checks are disabled */
|
/* don't run a service check if active checks are disabled */
|
||||||
if(execute_service_checks == FALSE) {
|
if (execute_service_checks == FALSE) {
|
||||||
log_debug_info(DEBUGL_EVENTS | DEBUGL_CHECKS, 1, "We're not executing service checks right now, so we'll skip check event for service '%s;%s'.\n", temp_service->host_name, temp_service->description);
|
|
||||||
|
log_debug_info(DEBUGL_EVENTS | DEBUGL_CHECKS, 1,
|
||||||
|
"We're not executing service checks right now, so we'll skip check event for service '%s;%s'.\n",
|
||||||
|
temp_service->host_name, temp_service->description);
|
||||||
|
|
||||||
run_event = FALSE;
|
run_event = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* reschedule the check if we can't run it now */
|
/* reschedule the check if we can't run it now */
|
||||||
if(run_event == FALSE) {
|
if (run_event == FALSE) {
|
||||||
|
|
||||||
remove_event(nagios_squeue, temp_event);
|
remove_event(nagios_squeue, temp_event);
|
||||||
|
|
||||||
if(nudge_seconds) {
|
/* We nudge the next check time when it is
|
||||||
/* We nudge the next check time when it is due to too many concurrent service checks */
|
due to too many concurrent service checks */
|
||||||
|
if (nudge_seconds) {
|
||||||
temp_service->next_check = (time_t)(temp_service->next_check + nudge_seconds);
|
temp_service->next_check = (time_t)(temp_service->next_check + nudge_seconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Otherwise just schedule as normal */
|
||||||
else {
|
else {
|
||||||
temp_service->next_check += check_window(temp_service);
|
temp_service->next_check += check_window(temp_service);
|
||||||
}
|
}
|
||||||
|
|
||||||
temp_event->run_time = temp_service->next_check;
|
temp_event->run_time = temp_service->next_check;
|
||||||
|
|
||||||
reschedule_event(nagios_squeue, temp_event);
|
reschedule_event(nagios_squeue, temp_event);
|
||||||
update_service_status(temp_service, FALSE);
|
update_service_status(temp_service, FALSE);
|
||||||
|
|
||||||
run_event = FALSE;
|
run_event = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* run a few checks before executing a host check... */
|
/* run a few checks before executing a host check... */
|
||||||
else if(temp_event->event_type == EVENT_HOST_CHECK) {
|
else if (temp_event->event_type == EVENT_HOST_CHECK) {
|
||||||
|
|
||||||
host *temp_host = (host *)temp_event->event_data;
|
host *temp_host = (host *)temp_event->event_data;
|
||||||
|
|
||||||
/* forced checks override normal check logic */
|
/* forced checks override normal check logic */
|
||||||
if((temp_host->check_options & CHECK_OPTION_FORCE_EXECUTION))
|
if ((temp_host->check_options & CHECK_OPTION_FORCE_EXECUTION)) {
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* don't run a host check if active checks are disabled */
|
/* don't run a host check if active checks are disabled */
|
||||||
if(execute_host_checks == FALSE) {
|
if (execute_host_checks == FALSE) {
|
||||||
log_debug_info(DEBUGL_EVENTS | DEBUGL_CHECKS, 1, "We're not executing host checks right now, so we'll skip host check event for host '%s'.\n", temp_host->name);
|
|
||||||
|
log_debug_info(DEBUGL_EVENTS | DEBUGL_CHECKS, 1,
|
||||||
|
"We're not executing host checks right now, so we'll skip host check event for host '%s'.\n",
|
||||||
|
temp_host->name);
|
||||||
|
|
||||||
run_event = FALSE;
|
run_event = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* reschedule the host check if we can't run it right now */
|
/* reschedule the host check if we can't run it right now */
|
||||||
if(run_event == FALSE) {
|
if (run_event == FALSE) {
|
||||||
|
|
||||||
remove_event(nagios_squeue, temp_event);
|
remove_event(nagios_squeue, temp_event);
|
||||||
|
|
||||||
temp_host->next_check += check_window(temp_host);
|
temp_host->next_check += check_window(temp_host);
|
||||||
temp_event->run_time = temp_host->next_check;
|
temp_event->run_time = temp_host->next_check;
|
||||||
|
|
||||||
reschedule_event(nagios_squeue, temp_event);
|
reschedule_event(nagios_squeue, temp_event);
|
||||||
update_host_status(temp_host, FALSE);
|
update_host_status(temp_host, FALSE);
|
||||||
|
|
||||||
run_event = FALSE;
|
run_event = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -308,10 +308,12 @@ void set_service_flap(service *svc, double percent_change, double high_threshold
|
|||||||
/* log a notice - this one is parsed by the history CGI */
|
/* log a notice - this one is parsed by the history CGI */
|
||||||
logit(NSLOG_RUNTIME_WARNING, FALSE, "SERVICE FLAPPING ALERT: %s;%s;STARTED; Service appears to have started flapping (%2.1f%% change >= %2.1f%% threshold)\n", svc->host_name, svc->description, percent_change, high_threshold);
|
logit(NSLOG_RUNTIME_WARNING, FALSE, "SERVICE FLAPPING ALERT: %s;%s;STARTED; Service appears to have started flapping (%2.1f%% change >= %2.1f%% threshold)\n", svc->host_name, svc->description, percent_change, high_threshold);
|
||||||
|
|
||||||
|
if (svc->flapping_comment_id == 0) {
|
||||||
/* add a non-persistent comment to the service */
|
/* add a non-persistent comment to the service */
|
||||||
asprintf(&temp_buffer, "Notifications for this service are being suppressed because it was detected as having been flapping between different states (%2.1f%% change >= %2.1f%% threshold). When the service state stabilizes and the flapping stops, notifications will be re-enabled.", percent_change, high_threshold);
|
asprintf(&temp_buffer, "Notifications for this service are being suppressed because it was detected as having been flapping between different states (%2.1f%% change >= %2.1f%% threshold). When the service state stabilizes and the flapping stops, notifications will be re-enabled.", percent_change, high_threshold);
|
||||||
add_new_service_comment(FLAPPING_COMMENT, svc->host_name, svc->description, time(NULL), "(Nagios Process)", temp_buffer, 0, COMMENTSOURCE_INTERNAL, FALSE, (time_t)0, &(svc->flapping_comment_id));
|
add_new_service_comment(FLAPPING_COMMENT, svc->host_name, svc->description, time(NULL), "(Nagios Process)", temp_buffer, 0, COMMENTSOURCE_INTERNAL, FALSE, (time_t)0, &(svc->flapping_comment_id));
|
||||||
my_free(temp_buffer);
|
my_free(temp_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
/* set the flapping indicator */
|
/* set the flapping indicator */
|
||||||
svc->is_flapping = TRUE;
|
svc->is_flapping = TRUE;
|
||||||
@ -396,10 +398,12 @@ void set_host_flap(host *hst, double percent_change, double high_threshold, doub
|
|||||||
/* log a notice - this one is parsed by the history CGI */
|
/* log a notice - this one is parsed by the history CGI */
|
||||||
logit(NSLOG_RUNTIME_WARNING, FALSE, "HOST FLAPPING ALERT: %s;STARTED; Host appears to have started flapping (%2.1f%% change > %2.1f%% threshold)\n", hst->name, percent_change, high_threshold);
|
logit(NSLOG_RUNTIME_WARNING, FALSE, "HOST FLAPPING ALERT: %s;STARTED; Host appears to have started flapping (%2.1f%% change > %2.1f%% threshold)\n", hst->name, percent_change, high_threshold);
|
||||||
|
|
||||||
|
if (hst->flapping_comment_id == 0) {
|
||||||
/* add a non-persistent comment to the host */
|
/* add a non-persistent comment to the host */
|
||||||
asprintf(&temp_buffer, "Notifications for this host are being suppressed because it was detected as having been flapping between different states (%2.1f%% change > %2.1f%% threshold). When the host state stabilizes and the flapping stops, notifications will be re-enabled.", percent_change, high_threshold);
|
asprintf(&temp_buffer, "Notifications for this host are being suppressed because it was detected as having been flapping between different states (%2.1f%% change > %2.1f%% threshold). When the host state stabilizes and the flapping stops, notifications will be re-enabled.", percent_change, high_threshold);
|
||||||
add_new_host_comment(FLAPPING_COMMENT, hst->name, time(NULL), "(Nagios Process)", temp_buffer, 0, COMMENTSOURCE_INTERNAL, FALSE, (time_t)0, &(hst->flapping_comment_id));
|
add_new_host_comment(FLAPPING_COMMENT, hst->name, time(NULL), "(Nagios Process)", temp_buffer, 0, COMMENTSOURCE_INTERNAL, FALSE, (time_t)0, &(hst->flapping_comment_id));
|
||||||
my_free(temp_buffer);
|
my_free(temp_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
/* set the flapping indicator */
|
/* set the flapping indicator */
|
||||||
hst->is_flapping = TRUE;
|
hst->is_flapping = TRUE;
|
||||||
|
@ -180,6 +180,8 @@ static int nagios_core_worker(const char *path)
|
|||||||
}
|
}
|
||||||
|
|
||||||
enter_worker(sd, start_cmd);
|
enter_worker(sd, start_cmd);
|
||||||
|
free_worker_memory(WPROC_FORCE);
|
||||||
|
free_memory(get_global_macros());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -345,6 +347,7 @@ int main(int argc, char **argv) {
|
|||||||
printf("along with this program; if not, write to the Free Software\n");
|
printf("along with this program; if not, write to the Free Software\n");
|
||||||
printf("Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n\n");
|
printf("Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n\n");
|
||||||
|
|
||||||
|
cleanup();
|
||||||
exit(OK);
|
exit(OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -374,6 +377,7 @@ int main(int argc, char **argv) {
|
|||||||
printf("the mailing lists, and commercial support options for Nagios.\n");
|
printf("the mailing lists, and commercial support options for Nagios.\n");
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
|
cleanup();
|
||||||
exit(ERROR);
|
exit(ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -384,7 +388,10 @@ int main(int argc, char **argv) {
|
|||||||
*/
|
*/
|
||||||
config_file = nspath_absolute(argv[optind], NULL);
|
config_file = nspath_absolute(argv[optind], NULL);
|
||||||
if(config_file == NULL) {
|
if(config_file == NULL) {
|
||||||
|
|
||||||
printf("Error allocating memory.\n");
|
printf("Error allocating memory.\n");
|
||||||
|
|
||||||
|
cleanup();
|
||||||
exit(ERROR);
|
exit(ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -426,6 +433,7 @@ int main(int argc, char **argv) {
|
|||||||
result = read_main_config_file(config_file);
|
result = read_main_config_file(config_file);
|
||||||
if(result != OK) {
|
if(result != OK) {
|
||||||
printf(" Error processing main config file!\n\n");
|
printf(" Error processing main config file!\n\n");
|
||||||
|
cleanup();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -435,6 +443,7 @@ int main(int argc, char **argv) {
|
|||||||
/* drop privileges */
|
/* drop privileges */
|
||||||
if((result = drop_privileges(nagios_user, nagios_group)) == ERROR) {
|
if((result = drop_privileges(nagios_user, nagios_group)) == ERROR) {
|
||||||
printf(" Failed to drop privileges. Aborting.");
|
printf(" Failed to drop privileges. Aborting.");
|
||||||
|
cleanup();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -444,6 +453,7 @@ int main(int argc, char **argv) {
|
|||||||
*/
|
*/
|
||||||
if (!verify_config && test_configured_paths() == ERROR) {
|
if (!verify_config && test_configured_paths() == ERROR) {
|
||||||
printf(" One or more path problems detected. Aborting.\n");
|
printf(" One or more path problems detected. Aborting.\n");
|
||||||
|
cleanup();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -468,6 +478,7 @@ int main(int argc, char **argv) {
|
|||||||
printf(" may have been removed or modified in this version. Make sure to read\n");
|
printf(" may have been removed or modified in this version. Make sure to read\n");
|
||||||
printf(" the HTML documentation regarding the config files, as well as the\n");
|
printf(" the HTML documentation regarding the config files, as well as the\n");
|
||||||
printf(" 'Whats New' section to find out what has changed.\n\n");
|
printf(" 'Whats New' section to find out what has changed.\n\n");
|
||||||
|
cleanup();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -488,6 +499,7 @@ int main(int argc, char **argv) {
|
|||||||
printf(" may have been removed or modified in this version. Make sure to read\n");
|
printf(" may have been removed or modified in this version. Make sure to read\n");
|
||||||
printf(" the HTML documentation regarding the config files, as well as the\n");
|
printf(" the HTML documentation regarding the config files, as well as the\n");
|
||||||
printf(" 'Whats New' section to find out what has changed.\n\n");
|
printf(" 'Whats New' section to find out what has changed.\n\n");
|
||||||
|
cleanup();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -534,8 +546,9 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
/* make valgrind shut up about still reachable memory */
|
/* make valgrind shut up about still reachable memory */
|
||||||
neb_free_module_list();
|
neb_free_module_list();
|
||||||
free(config_file_dir);
|
cleanup();
|
||||||
free(config_file);
|
my_free(config_file);
|
||||||
|
my_free(config_file_dir);
|
||||||
|
|
||||||
exit(result);
|
exit(result);
|
||||||
}
|
}
|
||||||
@ -556,17 +569,20 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
if (!nagios_binary_path) {
|
if (!nagios_binary_path) {
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Unable to allocate memory for nagios_binary_path\n");
|
logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Unable to allocate memory for nagios_binary_path\n");
|
||||||
|
cleanup();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(nagios_iobs = iobroker_create())) {
|
if (!(nagios_iobs = iobroker_create())) {
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Failed to create IO broker set: %s\n",
|
logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Failed to create IO broker set: %s\n",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
|
cleanup();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* keep monitoring things until we get a shutdown command */
|
/* keep monitoring things until we get a shutdown command */
|
||||||
do {
|
do {
|
||||||
|
|
||||||
/* reset internal book-keeping (in case we're restarting) */
|
/* reset internal book-keeping (in case we're restarting) */
|
||||||
wproc_num_workers_spawned = wproc_num_workers_online = 0;
|
wproc_num_workers_spawned = wproc_num_workers_online = 0;
|
||||||
caught_signal = sigshutdown = FALSE;
|
caught_signal = sigshutdown = FALSE;
|
||||||
@ -583,6 +599,7 @@ int main(int argc, char **argv) {
|
|||||||
result = read_main_config_file(config_file);
|
result = read_main_config_file(config_file);
|
||||||
if (result != OK) {
|
if (result != OK) {
|
||||||
logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to process config file '%s'. Aborting\n", config_file);
|
logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to process config file '%s'. Aborting\n", config_file);
|
||||||
|
cleanup();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
timing_point("Main config file read\n");
|
timing_point("Main config file read\n");
|
||||||
@ -621,11 +638,13 @@ int main(int argc, char **argv) {
|
|||||||
if (test_path_access(nagios_binary_path, X_OK)) {
|
if (test_path_access(nagios_binary_path, X_OK)) {
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: failed to access() %s: %s\n", nagios_binary_path, strerror(errno));
|
logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: failed to access() %s: %s\n", nagios_binary_path, strerror(errno));
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Spawning workers will be impossible. Aborting.\n");
|
logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Spawning workers will be impossible. Aborting.\n");
|
||||||
|
cleanup();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (test_configured_paths() == ERROR) {
|
if (test_configured_paths() == ERROR) {
|
||||||
/* error has already been logged */
|
/* error has already been logged */
|
||||||
|
cleanup();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -664,8 +683,11 @@ int main(int argc, char **argv) {
|
|||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
timing_point("Query handler initialized\n");
|
timing_point("Query handler initialized\n");
|
||||||
|
|
||||||
|
#ifdef ENABLE_NERD
|
||||||
nerd_init();
|
nerd_init();
|
||||||
timing_point("NERD initialized\n");
|
timing_point("NERD initialized\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
/* initialize check workers */
|
/* initialize check workers */
|
||||||
if(init_workers(num_check_workers) < 0) {
|
if(init_workers(num_check_workers) < 0) {
|
||||||
@ -690,6 +712,7 @@ int main(int argc, char **argv) {
|
|||||||
/* if we're dumping core, we must remove all dl-files */
|
/* if we're dumping core, we must remove all dl-files */
|
||||||
if (daemon_dumps_core)
|
if (daemon_dumps_core)
|
||||||
neb_unload_all_modules(NEBMODULE_FORCE_UNLOAD, NEBMODULE_NEB_SHUTDOWN);
|
neb_unload_all_modules(NEBMODULE_FORCE_UNLOAD, NEBMODULE_NEB_SHUTDOWN);
|
||||||
|
cleanup();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
timing_point("Modules loaded\n");
|
timing_point("Modules loaded\n");
|
||||||
@ -734,6 +757,14 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
timing_point("Object configuration parsed and understood\n");
|
timing_point("Object configuration parsed and understood\n");
|
||||||
|
|
||||||
|
#ifdef DETECT_RLIMIT_PROBLEM
|
||||||
|
/* lets do a quick system limit detection
|
||||||
|
to determine if we're likely to run into any
|
||||||
|
problems. */
|
||||||
|
rlimit_problem_detection(num_check_workers);
|
||||||
|
timing_point("Limit detection");
|
||||||
|
#endif
|
||||||
|
|
||||||
/* write the objects.cache file */
|
/* write the objects.cache file */
|
||||||
fcache_objects(object_cache_file);
|
fcache_objects(object_cache_file);
|
||||||
timing_point("Objects cached\n");
|
timing_point("Objects cached\n");
|
||||||
@ -747,7 +778,7 @@ int main(int argc, char **argv) {
|
|||||||
broker_program_state(NEBTYPE_PROCESS_START, NEBFLAG_NONE, NEBATTR_NONE, NULL);
|
broker_program_state(NEBTYPE_PROCESS_START, NEBFLAG_NONE, NEBATTR_NONE, NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* initialize status data unless we're starting */
|
/* initialize status data only if we're starting (no restarts) */
|
||||||
if(sigrestart == FALSE) {
|
if(sigrestart == FALSE) {
|
||||||
initialize_status_data(config_file);
|
initialize_status_data(config_file);
|
||||||
timing_point("Status data initialized\n");
|
timing_point("Status data initialized\n");
|
||||||
@ -821,7 +852,7 @@ int main(int argc, char **argv) {
|
|||||||
qh_deinit(qh_socket_path ? qh_socket_path : DEFAULT_QUERY_SOCKET);
|
qh_deinit(qh_socket_path ? qh_socket_path : DEFAULT_QUERY_SOCKET);
|
||||||
|
|
||||||
/* 03/01/2007 EG Moved from sighandler() to prevent FUTEX locking problems under NPTL */
|
/* 03/01/2007 EG Moved from sighandler() to prevent FUTEX locking problems under NPTL */
|
||||||
/* 03/21/2007 EG SIGSEGV signals are still logged in sighandler() so we don't loose them */
|
/* 03/21/2007 EG SIGSEGV signals are still logged in sighandler() so we don't lose them */
|
||||||
/* did we catch a signal? */
|
/* did we catch a signal? */
|
||||||
if(caught_signal == TRUE) {
|
if(caught_signal == TRUE) {
|
||||||
|
|
||||||
@ -849,7 +880,10 @@ int main(int argc, char **argv) {
|
|||||||
/* clean up the scheduled downtime data */
|
/* clean up the scheduled downtime data */
|
||||||
cleanup_downtime_data();
|
cleanup_downtime_data();
|
||||||
|
|
||||||
/* clean up the status data unless we're restarting */
|
/* clean up comment data */
|
||||||
|
free_comment_data();
|
||||||
|
|
||||||
|
/* clean up the status data if we are not restarting */
|
||||||
if(sigrestart == FALSE) {
|
if(sigrestart == FALSE) {
|
||||||
cleanup_status_data(TRUE);
|
cleanup_status_data(TRUE);
|
||||||
}
|
}
|
||||||
@ -857,6 +891,7 @@ int main(int argc, char **argv) {
|
|||||||
free_worker_memory(WPROC_FORCE);
|
free_worker_memory(WPROC_FORCE);
|
||||||
/* shutdown stuff... */
|
/* shutdown stuff... */
|
||||||
if(sigshutdown == TRUE) {
|
if(sigshutdown == TRUE) {
|
||||||
|
shutdown_command_file_worker();
|
||||||
iobroker_destroy(nagios_iobs, IOBROKER_CLOSE_SOCKETS);
|
iobroker_destroy(nagios_iobs, IOBROKER_CLOSE_SOCKETS);
|
||||||
nagios_iobs = NULL;
|
nagios_iobs = NULL;
|
||||||
|
|
||||||
@ -864,8 +899,22 @@ int main(int argc, char **argv) {
|
|||||||
logit(NSLOG_PROCESS_INFO, TRUE, "Successfully shutdown... (PID=%d)\n", (int)getpid());
|
logit(NSLOG_PROCESS_INFO, TRUE, "Successfully shutdown... (PID=%d)\n", (int)getpid());
|
||||||
}
|
}
|
||||||
|
|
||||||
/* clean up after ourselves */
|
/* try and collect any zombie processes */
|
||||||
|
if (sigrestart == TRUE) {
|
||||||
|
|
||||||
|
int status = 0;
|
||||||
|
pid_t child_pid;
|
||||||
|
log_debug_info(DEBUGL_PROCESS, 1, "Calling waitpid() on all children...\n");
|
||||||
|
|
||||||
|
while ((child_pid = waitpid(-1, &status, WNOHANG)) > 0) {
|
||||||
|
|
||||||
|
log_debug_info(DEBUGL_PROCESS, 2, " * child PID: (%d), status: (%d)\n", child_pid, status);
|
||||||
|
}
|
||||||
|
|
||||||
|
log_debug_info(DEBUGL_PROCESS, 1, "All children have been wait()ed on\n");
|
||||||
|
|
||||||
cleanup();
|
cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
/* close debug log */
|
/* close debug log */
|
||||||
close_debug_log();
|
close_debug_log();
|
||||||
@ -877,6 +926,7 @@ int main(int argc, char **argv) {
|
|||||||
unlink(lock_file);
|
unlink(lock_file);
|
||||||
|
|
||||||
/* free misc memory */
|
/* free misc memory */
|
||||||
|
cleanup();
|
||||||
my_free(lock_file);
|
my_free(lock_file);
|
||||||
my_free(config_file);
|
my_free(config_file);
|
||||||
my_free(config_file_dir);
|
my_free(config_file_dir);
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
#ifdef ENABLE_NERD
|
||||||
/*
|
/*
|
||||||
* Nagios Event Radio Dispatcher
|
* Nagios Event Radio Dispatcher
|
||||||
*
|
*
|
||||||
@ -7,6 +8,10 @@
|
|||||||
*
|
*
|
||||||
* This code uses the eventbroker api to get its data, which means
|
* This code uses the eventbroker api to get its data, which means
|
||||||
* we're finally eating our own dogfood in that respect.
|
* we're finally eating our own dogfood in that respect.
|
||||||
|
*
|
||||||
|
* Note: Disabled by default as of 4.4.0
|
||||||
|
* ./configure --enable-nerd
|
||||||
|
* to enable!
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define _GNU_SOURCE 1
|
#define _GNU_SOURCE 1
|
||||||
@ -493,3 +498,5 @@ int nerd_init(void)
|
|||||||
logit(NSLOG_INFO_MESSAGE, TRUE, "nerd: Fully initialized and ready to rock!\n");
|
logit(NSLOG_INFO_MESSAGE, TRUE, "nerd: Fully initialized and ready to rock!\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -54,7 +54,7 @@ const char *notification_reason_name(unsigned int reason_type)
|
|||||||
"CUSTOM"
|
"CUSTOM"
|
||||||
};
|
};
|
||||||
|
|
||||||
if (reason_type < sizeof(names))
|
if (reason_type < ARRAY_SIZE(names))
|
||||||
return names[reason_type];
|
return names[reason_type];
|
||||||
|
|
||||||
return "(unknown)";
|
return "(unknown)";
|
||||||
@ -106,7 +106,7 @@ int service_notification(service *svc, int type, char *not_author, char *not_dat
|
|||||||
if (temp_host->scheduled_downtime_depth > 0 || svc->scheduled_downtime_depth > 0)
|
if (temp_host->scheduled_downtime_depth > 0 || svc->scheduled_downtime_depth > 0)
|
||||||
svc->next_notification = current_time;
|
svc->next_notification = current_time;
|
||||||
}
|
}
|
||||||
return OK;
|
return ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_debug_info(DEBUGL_NOTIFICATIONS, 0, "Notification viability test passed.\n");
|
log_debug_info(DEBUGL_NOTIFICATIONS, 0, "Notification viability test passed.\n");
|
||||||
@ -222,7 +222,7 @@ int service_notification(service *svc, int type, char *not_author, char *not_dat
|
|||||||
/* set the notification number macro */
|
/* set the notification number macro */
|
||||||
asprintf(&mac.x[MACRO_SERVICENOTIFICATIONNUMBER], "%d", svc->current_notification_number);
|
asprintf(&mac.x[MACRO_SERVICENOTIFICATIONNUMBER], "%d", svc->current_notification_number);
|
||||||
|
|
||||||
/* the $NOTIFICATIONNUMBER$ macro is maintained for backward compatability */
|
/* the $NOTIFICATIONNUMBER$ macro is maintained for backward compatibility */
|
||||||
mac.x[MACRO_NOTIFICATIONNUMBER] = strdup(mac.x[MACRO_SERVICENOTIFICATIONNUMBER]);
|
mac.x[MACRO_NOTIFICATIONNUMBER] = strdup(mac.x[MACRO_SERVICENOTIFICATIONNUMBER]);
|
||||||
|
|
||||||
/* set the notification id macro */
|
/* set the notification id macro */
|
||||||
@ -342,7 +342,6 @@ int check_service_notification_viability(service *svc, int type, int options) {
|
|||||||
timeperiod *temp_period;
|
timeperiod *temp_period;
|
||||||
time_t current_time;
|
time_t current_time;
|
||||||
time_t timeperiod_start;
|
time_t timeperiod_start;
|
||||||
time_t first_problem_time;
|
|
||||||
|
|
||||||
log_debug_info(DEBUGL_FUNCTIONS, 0, "check_service_notification_viability()\n");
|
log_debug_info(DEBUGL_FUNCTIONS, 0, "check_service_notification_viability()\n");
|
||||||
|
|
||||||
@ -547,11 +546,16 @@ int check_service_notification_viability(service *svc, int type, int options) {
|
|||||||
/* see if enough time has elapsed for first notification (Mathias Sundman) */
|
/* see if enough time has elapsed for first notification (Mathias Sundman) */
|
||||||
/* 10/02/07 don't place restrictions on recoveries or non-normal notifications, must use last time ok (or program start) in calculation */
|
/* 10/02/07 don't place restrictions on recoveries or non-normal notifications, must use last time ok (or program start) in calculation */
|
||||||
/* it is reasonable to assume that if the service was never up, the program start time should be used in this calculation */
|
/* it is reasonable to assume that if the service was never up, the program start time should be used in this calculation */
|
||||||
if(type == NOTIFICATION_NORMAL && svc->current_notification_number == 0 && svc->current_state != STATE_OK) {
|
/* check if delay of notifications is activated (ccztux) */
|
||||||
|
if(type == NOTIFICATION_NORMAL
|
||||||
|
&& svc->first_notification_delay > 0
|
||||||
|
&& svc->current_notification_number == 0
|
||||||
|
&& svc->current_state != STATE_OK)
|
||||||
|
{
|
||||||
|
time_t last_problem_time = svc->last_hard_state_change > 0 ? svc->last_hard_state_change : program_start;
|
||||||
|
|
||||||
first_problem_time = svc->last_time_ok > 0 ? svc->last_time_ok : program_start;
|
/* determine the time to use of the last problem point */
|
||||||
|
if(current_time < last_problem_time + (time_t)(svc->first_notification_delay * interval_length)) {
|
||||||
if(current_time < first_problem_time + (time_t)(svc->first_notification_delay * interval_length)) {
|
|
||||||
log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Not enough time has elapsed since the service changed to a non-OK state, so we should not notify about this problem yet\n");
|
log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Not enough time has elapsed since the service changed to a non-OK state, so we should not notify about this problem yet\n");
|
||||||
return ERROR;
|
return ERROR;
|
||||||
}
|
}
|
||||||
@ -563,29 +567,6 @@ int check_service_notification_viability(service *svc, int type, int options) {
|
|||||||
return ERROR;
|
return ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** RECOVERY NOTIFICATIONS ARE GOOD TO GO AT THIS POINT *****/
|
|
||||||
if(svc->current_state == STATE_OK)
|
|
||||||
return OK;
|
|
||||||
|
|
||||||
/* don't notify contacts about this service problem again if the notification interval is set to 0 */
|
|
||||||
if(svc->no_more_notifications == TRUE) {
|
|
||||||
log_debug_info(DEBUGL_NOTIFICATIONS, 1, "We shouldn't re-notify contacts about this service problem.\n");
|
|
||||||
return ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if the host is down or unreachable, don't notify contacts about service failures */
|
|
||||||
if(temp_host->current_state != STATE_UP && temp_host->state_type == HARD_STATE) {
|
|
||||||
log_debug_info(DEBUGL_NOTIFICATIONS, 1, "The host is either down or unreachable, so we won't notify contacts about this service.\n");
|
|
||||||
return ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* don't notify if we haven't waited long enough since the last time (and the service is not marked as being volatile) */
|
|
||||||
if((current_time < svc->next_notification) && svc->is_volatile == FALSE) {
|
|
||||||
log_debug_info(DEBUGL_NOTIFICATIONS, 1, "We haven't waited long enough to re-notify contacts about this service.\n");
|
|
||||||
log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Next valid notification time: %s", ctime(&svc->next_notification));
|
|
||||||
return ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if this service is currently in a scheduled downtime period, don't send the notification */
|
/* if this service is currently in a scheduled downtime period, don't send the notification */
|
||||||
if(svc->scheduled_downtime_depth > 0) {
|
if(svc->scheduled_downtime_depth > 0) {
|
||||||
log_debug_info(DEBUGL_NOTIFICATIONS, 1, "This service is currently in a scheduled downtime, so we won't send notifications.\n");
|
log_debug_info(DEBUGL_NOTIFICATIONS, 1, "This service is currently in a scheduled downtime, so we won't send notifications.\n");
|
||||||
@ -610,6 +591,25 @@ int check_service_notification_viability(service *svc, int type, int options) {
|
|||||||
return ERROR;
|
return ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* don't notify contacts about this service problem again if the notification interval is set to 0 */
|
||||||
|
if(svc->no_more_notifications == TRUE) {
|
||||||
|
log_debug_info(DEBUGL_NOTIFICATIONS, 1, "We shouldn't re-notify contacts about this service problem.\n");
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if the host is down or unreachable, don't notify contacts about service failures */
|
||||||
|
if(temp_host->current_state != STATE_UP && temp_host->state_type == HARD_STATE) {
|
||||||
|
log_debug_info(DEBUGL_NOTIFICATIONS, 1, "The host is either down or unreachable, so we won't notify contacts about this service.\n");
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* don't notify if we haven't waited long enough since the last time (and the service is not marked as being volatile) */
|
||||||
|
if((current_time < svc->next_notification) && svc->is_volatile == FALSE) {
|
||||||
|
log_debug_info(DEBUGL_NOTIFICATIONS, 1, "We haven't waited long enough to re-notify contacts about this service.\n");
|
||||||
|
log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Next valid notification time: %s", ctime(&svc->next_notification));
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1066,7 +1066,7 @@ int host_notification(host *hst, int type, char *not_author, char *not_data, int
|
|||||||
/* check viability of sending out a host notification */
|
/* check viability of sending out a host notification */
|
||||||
if(check_host_notification_viability(hst, type, options) == ERROR) {
|
if(check_host_notification_viability(hst, type, options) == ERROR) {
|
||||||
log_debug_info(DEBUGL_NOTIFICATIONS, 0, "Notification viability test failed. No notification will be sent out.\n");
|
log_debug_info(DEBUGL_NOTIFICATIONS, 0, "Notification viability test failed. No notification will be sent out.\n");
|
||||||
return OK;
|
return ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_debug_info(DEBUGL_NOTIFICATIONS, 0, "Notification viability test passed.\n");
|
log_debug_info(DEBUGL_NOTIFICATIONS, 0, "Notification viability test passed.\n");
|
||||||
@ -1179,7 +1179,7 @@ int host_notification(host *hst, int type, char *not_author, char *not_data, int
|
|||||||
/* set the notification number macro */
|
/* set the notification number macro */
|
||||||
asprintf(&mac.x[MACRO_HOSTNOTIFICATIONNUMBER], "%d", hst->current_notification_number);
|
asprintf(&mac.x[MACRO_HOSTNOTIFICATIONNUMBER], "%d", hst->current_notification_number);
|
||||||
|
|
||||||
/* the $NOTIFICATIONNUMBER$ macro is maintained for backward compatability */
|
/* the $NOTIFICATIONNUMBER$ macro is maintained for backward compatibility */
|
||||||
mac.x[MACRO_NOTIFICATIONNUMBER] = strdup(mac.x[MACRO_HOSTNOTIFICATIONNUMBER]);
|
mac.x[MACRO_NOTIFICATIONNUMBER] = strdup(mac.x[MACRO_HOSTNOTIFICATIONNUMBER]);
|
||||||
|
|
||||||
/* set the notification id macro */
|
/* set the notification id macro */
|
||||||
@ -1296,7 +1296,6 @@ int host_notification(host *hst, int type, char *not_author, char *not_data, int
|
|||||||
int check_host_notification_viability(host *hst, int type, int options) {
|
int check_host_notification_viability(host *hst, int type, int options) {
|
||||||
time_t current_time;
|
time_t current_time;
|
||||||
time_t timeperiod_start;
|
time_t timeperiod_start;
|
||||||
time_t first_problem_time;
|
|
||||||
|
|
||||||
log_debug_info(DEBUGL_FUNCTIONS, 0, "check_host_notification_viability()\n");
|
log_debug_info(DEBUGL_FUNCTIONS, 0, "check_host_notification_viability()\n");
|
||||||
|
|
||||||
@ -1470,11 +1469,17 @@ int check_host_notification_viability(host *hst, int type, int options) {
|
|||||||
/* see if enough time has elapsed for first notification (Mathias Sundman) */
|
/* see if enough time has elapsed for first notification (Mathias Sundman) */
|
||||||
/* 10/02/07 don't place restrictions on recoveries or non-normal notifications, must use last time up (or program start) in calculation */
|
/* 10/02/07 don't place restrictions on recoveries or non-normal notifications, must use last time up (or program start) in calculation */
|
||||||
/* it is reasonable to assume that if the host was never up, the program start time should be used in this calculation */
|
/* it is reasonable to assume that if the host was never up, the program start time should be used in this calculation */
|
||||||
if(type == NOTIFICATION_NORMAL && hst->current_notification_number == 0 && hst->current_state != HOST_UP) {
|
/* check if delay of notifications is activated (ccztux) */
|
||||||
|
if(type == NOTIFICATION_NORMAL
|
||||||
|
&& hst->first_notification_delay > 0
|
||||||
|
&& hst->current_notification_number == 0
|
||||||
|
&& hst->current_state != STATE_OK)
|
||||||
|
{
|
||||||
|
|
||||||
first_problem_time = hst->last_time_up > 0 ? hst->last_time_up : program_start;
|
time_t last_problem_time = hst->last_hard_state_change > 0 ? hst->last_hard_state_change : program_start;
|
||||||
|
|
||||||
if(current_time < first_problem_time + (time_t)(hst->first_notification_delay * interval_length)) {
|
/* determine the time to use of the last problem point */
|
||||||
|
if(current_time < last_problem_time + (time_t)(hst->first_notification_delay * interval_length)) {
|
||||||
log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Not enough time has elapsed since the host changed to a non-UP state (or since program start), so we shouldn't notify about this problem yet.\n");
|
log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Not enough time has elapsed since the host changed to a non-UP state (or since program start), so we shouldn't notify about this problem yet.\n");
|
||||||
return ERROR;
|
return ERROR;
|
||||||
}
|
}
|
||||||
@ -1486,10 +1491,6 @@ int check_host_notification_viability(host *hst, int type, int options) {
|
|||||||
return ERROR;
|
return ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** RECOVERY NOTIFICATIONS ARE GOOD TO GO AT THIS POINT *****/
|
|
||||||
if(hst->current_state == HOST_UP)
|
|
||||||
return OK;
|
|
||||||
|
|
||||||
/* if this host is currently in a scheduled downtime period, don't send the notification */
|
/* if this host is currently in a scheduled downtime period, don't send the notification */
|
||||||
if(hst->scheduled_downtime_depth > 0) {
|
if(hst->scheduled_downtime_depth > 0) {
|
||||||
log_debug_info(DEBUGL_NOTIFICATIONS, 1, "This host is currently in a scheduled downtime, so we won't send notifications.\n");
|
log_debug_info(DEBUGL_NOTIFICATIONS, 1, "This host is currently in a scheduled downtime, so we won't send notifications.\n");
|
||||||
|
@ -24,12 +24,20 @@ static dkhash_table *qh_table;
|
|||||||
/* the echo service. stupid, but useful for testing */
|
/* the echo service. stupid, but useful for testing */
|
||||||
static int qh_echo(int sd, char *buf, unsigned int len)
|
static int qh_echo(int sd, char *buf, unsigned int len)
|
||||||
{
|
{
|
||||||
if (!strcmp(buf, "help")) {
|
int result = 0;
|
||||||
|
|
||||||
|
if (buf == NULL || !strcmp(buf, "help")) {
|
||||||
|
|
||||||
nsock_printf_nul(sd,
|
nsock_printf_nul(sd,
|
||||||
"Query handler that simply echoes back what you send it.");
|
"Query handler that simply echoes back what you send it.");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
(void)write(sd, buf, len);
|
|
||||||
|
result = write(sd, buf, len);
|
||||||
|
if (result == -1) {
|
||||||
|
|
||||||
|
logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: qh_echo() error on write(sd,buf=[%s],len=%d): %s\n", buf, len, strerror(errno));
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -41,21 +49,27 @@ static struct query_handler *qh_find_handler(const char *name)
|
|||||||
/* subset of http error codes */
|
/* subset of http error codes */
|
||||||
const char *qh_strerror(int code)
|
const char *qh_strerror(int code)
|
||||||
{
|
{
|
||||||
if (code < 0)
|
if (code < 0) {
|
||||||
return "Low-level system error";
|
return "Low-level system error";
|
||||||
|
}
|
||||||
|
|
||||||
if (code == 100)
|
if (code == 100) {
|
||||||
return "Continue";
|
return "Continue";
|
||||||
if (code == 101)
|
}
|
||||||
|
if (code == 101) {
|
||||||
return "Switching protocols";
|
return "Switching protocols";
|
||||||
|
}
|
||||||
|
|
||||||
if (code < 300)
|
if (code < 300) {
|
||||||
return "OK";
|
return "OK";
|
||||||
|
}
|
||||||
|
|
||||||
if (code < 400)
|
if (code < 400) {
|
||||||
return "Redirected (possibly deprecated address)";
|
return "Redirected (possibly deprecated address)";
|
||||||
|
}
|
||||||
|
|
||||||
switch (code) {
|
switch (code) {
|
||||||
|
|
||||||
/* client errors */
|
/* client errors */
|
||||||
case 400: return "Bad request";
|
case 400: return "Bad request";
|
||||||
case 401: return "Unauthorized";
|
case 401: return "Unauthorized";
|
||||||
@ -79,29 +93,41 @@ const char *qh_strerror(int code)
|
|||||||
case 503: return "Service unavailable";
|
case 503: return "Service unavailable";
|
||||||
case 504: return "Gateway timeout";
|
case 504: return "Gateway timeout";
|
||||||
case 505: return "Version not supported";
|
case 505: return "Version not supported";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return "Unknown error";
|
return "Unknown error";
|
||||||
}
|
}
|
||||||
|
|
||||||
static int qh_input(int sd, int events, void *ioc_)
|
static int qh_input(int sd, int events, void *ioc_)
|
||||||
{
|
{
|
||||||
iocache *ioc = (iocache *)ioc_;
|
iocache * ioc = (iocache *) ioc_;
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
input on main socket, so accept one
|
||||||
|
this is when a worker initially connects
|
||||||
|
we create the iocache and then register
|
||||||
|
that to a new socket descriptor and this function
|
||||||
|
so that ioc_ != NULL next time
|
||||||
|
*/
|
||||||
|
if (sd == qh_listen_sock) {
|
||||||
|
|
||||||
/* input on main socket, so accept one */
|
|
||||||
if(sd == qh_listen_sock) {
|
|
||||||
struct sockaddr sa;
|
struct sockaddr sa;
|
||||||
socklen_t slen = 0;
|
socklen_t slen = 0;
|
||||||
int nsd;
|
int nsd = 0;
|
||||||
|
|
||||||
memset(&sa, 0, sizeof(sa)); /* shut valgrind up */
|
/* shut valgrind up */
|
||||||
|
memset(&sa, 0, sizeof(sa));
|
||||||
nsd = accept(sd, &sa, &slen);
|
nsd = accept(sd, &sa, &slen);
|
||||||
if(qh_max_running && qh_running >= qh_max_running) {
|
if (qh_max_running && qh_running >= qh_max_running) {
|
||||||
nsock_printf(nsd, "503: Server full");
|
nsock_printf(nsd, "503: Server full");
|
||||||
close(nsd);
|
close(nsd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!(ioc = iocache_create(16384))) {
|
ioc = iocache_create(16384);
|
||||||
|
if (ioc == NULL) {
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to create iocache for inbound request\n");
|
logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to create iocache for inbound request\n");
|
||||||
nsock_printf(nsd, "500: Internal server error");
|
nsock_printf(nsd, "500: Internal server error");
|
||||||
close(nsd);
|
close(nsd);
|
||||||
@ -112,7 +138,8 @@ static int qh_input(int sd, int events, void *ioc_)
|
|||||||
* @todo: Stash the iocache and the socket in some
|
* @todo: Stash the iocache and the socket in some
|
||||||
* addressable list so we can release them on deinit
|
* addressable list so we can release them on deinit
|
||||||
*/
|
*/
|
||||||
if(iobroker_register(nagios_iobs, nsd, ioc, qh_input) < 0) {
|
result = iobroker_register(nagios_iobs, nsd, ioc, qh_input);
|
||||||
|
if (result < 0) {
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to register input socket %d with I/O broker: %s\n", nsd, strerror(errno));
|
logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to register input socket %d with I/O broker: %s\n", nsd, strerror(errno));
|
||||||
iocache_destroy(ioc);
|
iocache_destroy(ioc);
|
||||||
close(nsd);
|
close(nsd);
|
||||||
@ -124,17 +151,26 @@ static int qh_input(int sd, int events, void *ioc_)
|
|||||||
qh_running++;
|
qh_running++;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
this is when an existing connection
|
||||||
|
sends more data after they've already made
|
||||||
|
the connection
|
||||||
|
*/
|
||||||
else {
|
else {
|
||||||
int result;
|
|
||||||
unsigned long len;
|
unsigned long len = 0;
|
||||||
unsigned int query_len = 0;
|
unsigned int query_len = 0;
|
||||||
char *buf, *space;
|
struct query_handler * qh = NULL;
|
||||||
struct query_handler *qh;
|
char * buf = NULL;
|
||||||
char *handler = NULL, *query = NULL;
|
char * space = NULL;
|
||||||
|
char * handler = NULL;
|
||||||
|
char * query = NULL;
|
||||||
|
|
||||||
result = iocache_read(ioc, sd);
|
result = iocache_read(ioc, sd);
|
||||||
|
|
||||||
/* disconnect? */
|
/* disconnect? */
|
||||||
if(result == 0 || (result < 0 && errno == EPIPE)) {
|
if (result == 0 || (result < 0 && errno == EPIPE)) {
|
||||||
iocache_destroy(ioc);
|
iocache_destroy(ioc);
|
||||||
iobroker_close(nagios_iobs, sd);
|
iobroker_close(nagios_iobs, sd);
|
||||||
qh_running--;
|
qh_running--;
|
||||||
@ -152,8 +188,9 @@ static int qh_input(int sd, int events, void *ioc_)
|
|||||||
|
|
||||||
/* Use data up to the first nul byte */
|
/* Use data up to the first nul byte */
|
||||||
buf = iocache_use_delim(ioc, "\0", 1, &len);
|
buf = iocache_use_delim(ioc, "\0", 1, &len);
|
||||||
if(!buf)
|
if (buf == NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Identify handler part and any magic query bytes */
|
/* Identify handler part and any magic query bytes */
|
||||||
if (*buf == '@' || *buf == '#') {
|
if (*buf == '@' || *buf == '#') {
|
||||||
@ -161,18 +198,18 @@ static int qh_input(int sd, int events, void *ioc_)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Locate query (if any) */
|
/* Locate query (if any) */
|
||||||
if((space = strchr(buf, ' '))) {
|
space = strchr(buf, ' ');
|
||||||
|
if (space != NULL) {
|
||||||
*space = 0;
|
*space = 0;
|
||||||
query = space + 1;
|
query = space + 1;
|
||||||
query_len = len - ((unsigned long)query - (unsigned long)buf);
|
query_len = len - (unsigned long)(query - buf);
|
||||||
} else {
|
|
||||||
query = "";
|
|
||||||
query_len = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* locate the handler */
|
/* locate the handler */
|
||||||
if(!(qh = qh_find_handler(handler))) {
|
qh = qh_find_handler(handler);
|
||||||
|
|
||||||
/* not found. that's a 404 */
|
/* not found. that's a 404 */
|
||||||
|
if (qh == NULL) {
|
||||||
nsock_printf(sd, "404: %s: No such handler", handler);
|
nsock_printf(sd, "404: %s: No such handler", handler);
|
||||||
iobroker_close(nagios_iobs, sd);
|
iobroker_close(nagios_iobs, sd);
|
||||||
iocache_destroy(ioc);
|
iocache_destroy(ioc);
|
||||||
@ -180,16 +217,20 @@ static int qh_input(int sd, int events, void *ioc_)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* strip trailing newlines */
|
/* strip trailing newlines */
|
||||||
while (query_len > 0 && (query[query_len - 1] == 0 || query[query_len - 1] == '\n'))
|
while (query_len > 0
|
||||||
|
&& (query[query_len - 1] == 0 || query[query_len - 1] == '\n')) {
|
||||||
|
|
||||||
query[--query_len] = 0;
|
query[--query_len] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* now pass the query to the handler */
|
/* now pass the query to the handler */
|
||||||
if ((result = qh->handler(sd, query, query_len)) >= 100) {
|
result = qh->handler(sd, query, query_len);
|
||||||
|
if (result >= 100) {
|
||||||
nsock_printf_nul(sd, "%d: %s", result, qh_strerror(result));
|
nsock_printf_nul(sd, "%d: %s", result, qh_strerror(result));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(result >= 300 || *buf == '#') {
|
|
||||||
/* error code or one-shot query */
|
/* error code or one-shot query */
|
||||||
|
if (result >= 300 || *buf == '#') {
|
||||||
iobroker_close(nagios_iobs, sd);
|
iobroker_close(nagios_iobs, sd);
|
||||||
iocache_destroy(ioc);
|
iocache_destroy(ioc);
|
||||||
return 0;
|
return 0;
|
||||||
@ -197,34 +238,53 @@ static int qh_input(int sd, int events, void *ioc_)
|
|||||||
|
|
||||||
/* check for magic handler codes */
|
/* check for magic handler codes */
|
||||||
switch (result) {
|
switch (result) {
|
||||||
case QH_CLOSE: /* oneshot handler */
|
|
||||||
case -1: /* general error */
|
/* oneshot handler */
|
||||||
|
case QH_CLOSE:
|
||||||
|
|
||||||
|
/* general error */
|
||||||
|
case -1:
|
||||||
iobroker_close(nagios_iobs, sd);
|
iobroker_close(nagios_iobs, sd);
|
||||||
|
|
||||||
/* fallthrough */
|
/* fallthrough */
|
||||||
case QH_TAKEOVER: /* handler takes over */
|
|
||||||
case 101: /* switch protocol (takeover + message) */
|
/* handler takes over */
|
||||||
|
case QH_TAKEOVER:
|
||||||
|
|
||||||
|
/* switch protocol (takeover + message) */
|
||||||
|
case 101:
|
||||||
iocache_destroy(ioc);
|
iocache_destroy(ioc);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int qh_deregister_handler(const char *name)
|
int qh_deregister_handler(const char *name)
|
||||||
{
|
{
|
||||||
struct query_handler *qh, *next, *prev;
|
struct query_handler *qh = NULL;
|
||||||
|
struct query_handler *next = NULL;
|
||||||
|
struct query_handler *prev = NULL;
|
||||||
|
|
||||||
if (!(qh = dkhash_remove(qh_table, name, NULL)))
|
qh = dkhash_remove(qh_table, name, NULL);
|
||||||
|
if (qh != NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
next = qh->next_qh;
|
next = qh->next_qh;
|
||||||
prev = qh->prev_qh;
|
prev = qh->prev_qh;
|
||||||
if (next)
|
|
||||||
|
if (next != NULL) {
|
||||||
next->prev_qh = prev;
|
next->prev_qh = prev;
|
||||||
if (prev)
|
}
|
||||||
|
|
||||||
|
if (prev != NULL) {
|
||||||
prev->next_qh = next;
|
prev->next_qh = next;
|
||||||
else
|
}
|
||||||
|
else {
|
||||||
qhandlers = next;
|
qhandlers = next;
|
||||||
|
}
|
||||||
|
|
||||||
free(qh);
|
free(qh);
|
||||||
|
|
||||||
@ -233,29 +293,32 @@ int qh_deregister_handler(const char *name)
|
|||||||
|
|
||||||
int qh_register_handler(const char *name, const char *description, unsigned int options, qh_handler handler)
|
int qh_register_handler(const char *name, const char *description, unsigned int options, qh_handler handler)
|
||||||
{
|
{
|
||||||
struct query_handler *qh;
|
struct query_handler *qh = NULL;
|
||||||
int result;
|
int result = 0;
|
||||||
|
|
||||||
if(!name)
|
if (name == NULL) {
|
||||||
|
logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to register handler with no name\n");
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if(!handler) {
|
if (handler == NULL) {
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to register handler '%s': No handler function specified\n", name);
|
logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to register handler '%s': No handler function specified\n", name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(strlen(name) > 128) {
|
if (strlen(name) > 128) {
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to register handler '%s': Name too long\n", name);
|
logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to register handler '%s': Name too long\n", name);
|
||||||
return -ENAMETOOLONG;
|
return -ENAMETOOLONG;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* names must be unique */
|
/* names must be unique */
|
||||||
if(qh_find_handler(name)) {
|
if (qh_find_handler(name)) {
|
||||||
logit(NSLOG_RUNTIME_WARNING, TRUE, "qh: Handler '%s' registered more than once\n", name);
|
logit(NSLOG_RUNTIME_WARNING, TRUE, "qh: Handler '%s' registered more than once\n", name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(qh = calloc(1, sizeof(*qh)))) {
|
qh = calloc(1, sizeof(*qh));
|
||||||
|
if (qh == NULL) {
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to allocate memory for handler '%s'\n", name);
|
logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to allocate memory for handler '%s'\n", name);
|
||||||
return -errno;
|
return -errno;
|
||||||
}
|
}
|
||||||
@ -265,12 +328,15 @@ int qh_register_handler(const char *name, const char *description, unsigned int
|
|||||||
qh->handler = handler;
|
qh->handler = handler;
|
||||||
qh->options = options;
|
qh->options = options;
|
||||||
qh->next_qh = qhandlers;
|
qh->next_qh = qhandlers;
|
||||||
if (qhandlers)
|
|
||||||
|
if (qhandlers) {
|
||||||
qhandlers->prev_qh = qh;
|
qhandlers->prev_qh = qh;
|
||||||
|
}
|
||||||
|
|
||||||
qhandlers = qh;
|
qhandlers = qh;
|
||||||
|
|
||||||
result = dkhash_insert(qh_table, qh->name, NULL, qh);
|
result = dkhash_insert(qh_table, qh->name, NULL, qh);
|
||||||
if(result < 0) {
|
if (result < 0) {
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE,
|
logit(NSLOG_RUNTIME_ERROR, TRUE,
|
||||||
"qh: Failed to insert query handler '%s' (%p) into hash table %p (%d): %s\n",
|
"qh: Failed to insert query handler '%s' (%p) into hash table %p (%d): %s\n",
|
||||||
name, qh, qh_table, result, strerror(errno));
|
name, qh, qh_table, result, strerror(errno));
|
||||||
@ -283,27 +349,29 @@ int qh_register_handler(const char *name, const char *description, unsigned int
|
|||||||
|
|
||||||
void qh_deinit(const char *path)
|
void qh_deinit(const char *path)
|
||||||
{
|
{
|
||||||
struct query_handler *qh, *next;
|
struct query_handler *qh = NULL;
|
||||||
|
|
||||||
|
for (qh = qhandlers; qh != NULL; qh = qh->next_qh) {
|
||||||
|
|
||||||
for(qh = qhandlers; qh; qh = next) {
|
|
||||||
next = qh->next_qh;
|
|
||||||
qh_deregister_handler(qh->name);
|
qh_deregister_handler(qh->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
dkhash_destroy(qh_table);
|
dkhash_destroy(qh_table);
|
||||||
qh_table = NULL;
|
qh_table = NULL;
|
||||||
qhandlers = NULL;
|
qhandlers = NULL;
|
||||||
|
|
||||||
if(!path)
|
if (path == NULL) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
unlink(path);
|
unlink(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int qh_help(int sd, char *buf, unsigned int len)
|
static int qh_help(int sd, char *buf, unsigned int len)
|
||||||
{
|
{
|
||||||
struct query_handler *qh;
|
struct query_handler *qh = NULL;
|
||||||
|
|
||||||
if (!*buf || !strcmp(buf, "help")) {
|
if (buf == NULL || !strcmp(buf, "help")) {
|
||||||
nsock_printf_nul(sd,
|
nsock_printf_nul(sd,
|
||||||
" help <name> show help for handler <name>\n"
|
" help <name> show help for handler <name>\n"
|
||||||
" help list list registered handlers\n");
|
" help list list registered handlers\n");
|
||||||
@ -311,16 +379,22 @@ static int qh_help(int sd, char *buf, unsigned int len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!strcmp(buf, "list")) {
|
if (!strcmp(buf, "list")) {
|
||||||
for (qh = qhandlers; qh; qh = qh->next_qh) {
|
|
||||||
|
for (qh = qhandlers; qh != NULL; qh = qh->next_qh) {
|
||||||
nsock_printf(sd, "%-10s %s\n", qh->name, qh->description ? qh->description : "(No description available)");
|
nsock_printf(sd, "%-10s %s\n", qh->name, qh->description ? qh->description : "(No description available)");
|
||||||
}
|
}
|
||||||
|
|
||||||
nsock_printf(sd, "%c", 0);
|
nsock_printf(sd, "%c", 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(qh = qh_find_handler(buf))) {
|
qh = qh_find_handler(buf);
|
||||||
|
if (qh == NULL) {
|
||||||
|
|
||||||
nsock_printf_nul(sd, "No handler named '%s' is registered\n", buf);
|
nsock_printf_nul(sd, "No handler named '%s' is registered\n", buf);
|
||||||
|
|
||||||
} else if (qh->handler(sd, "help", 4) > 200) {
|
} else if (qh->handler(sd, "help", 4) > 200) {
|
||||||
|
|
||||||
nsock_printf_nul(sd, "The handler %s doesn't have any help yet.", buf);
|
nsock_printf_nul(sd, "The handler %s doesn't have any help yet.", buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -331,8 +405,10 @@ static int qh_core(int sd, char *buf, unsigned int len)
|
|||||||
{
|
{
|
||||||
char *space;
|
char *space;
|
||||||
|
|
||||||
if (!*buf || !strcmp(buf, "help")) {
|
if (buf == NULL || !strcmp(buf, "help")) {
|
||||||
nsock_printf_nul(sd, "Query handler for manipulating nagios core.\n"
|
|
||||||
|
nsock_printf_nul(sd,
|
||||||
|
"Query handler for manipulating nagios core.\n"
|
||||||
"Available commands:\n"
|
"Available commands:\n"
|
||||||
" loadctl Print information about current load control settings\n"
|
" loadctl Print information about current load control settings\n"
|
||||||
" loadctl <options> Configure nagios load control.\n"
|
" loadctl <options> Configure nagios load control.\n"
|
||||||
@ -340,13 +416,21 @@ static int qh_core(int sd, char *buf, unsigned int len)
|
|||||||
" returned above.\n"
|
" returned above.\n"
|
||||||
" squeuestats scheduling queue statistics\n"
|
" squeuestats scheduling queue statistics\n"
|
||||||
);
|
);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if ((space = memchr(buf, ' ', len)))
|
space = memchr(buf, ' ', len);
|
||||||
|
|
||||||
|
if (space != NULL) {
|
||||||
*(space++) = 0;
|
*(space++) = 0;
|
||||||
if (!space && !strcmp(buf, "loadctl")) {
|
}
|
||||||
nsock_printf_nul
|
|
||||||
(sd, "jobs_max=%u;jobs_min=%u;"
|
if (space == NULL) {
|
||||||
|
|
||||||
|
if (!strcmp(buf, "loadctl")) {
|
||||||
|
|
||||||
|
nsock_printf_nul(sd,
|
||||||
|
"jobs_max=%u;jobs_min=%u;"
|
||||||
"jobs_running=%u;jobs_limit=%u;"
|
"jobs_running=%u;jobs_limit=%u;"
|
||||||
"load=%.2f;"
|
"load=%.2f;"
|
||||||
"backoff_limit=%.2f;backoff_change=%u;"
|
"backoff_limit=%.2f;backoff_change=%u;"
|
||||||
@ -359,15 +443,23 @@ static int qh_core(int sd, char *buf, unsigned int len)
|
|||||||
loadctl.backoff_limit, loadctl.backoff_change,
|
loadctl.backoff_limit, loadctl.backoff_change,
|
||||||
loadctl.rampup_limit, loadctl.rampup_change,
|
loadctl.rampup_limit, loadctl.rampup_change,
|
||||||
loadctl.nproc_limit, loadctl.nofile_limit,
|
loadctl.nproc_limit, loadctl.nofile_limit,
|
||||||
loadctl.options, loadctl.changes);
|
loadctl.options, loadctl.changes
|
||||||
|
);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!space && !strcmp(buf, "squeuestats"))
|
else if (!strcmp(buf, "squeuestats")) {
|
||||||
return dump_event_stats(sd);
|
|
||||||
|
return dump_event_stats(sd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* space != NULL: */
|
||||||
|
else {
|
||||||
|
|
||||||
|
len -= (unsigned long)(space - buf);
|
||||||
|
|
||||||
if (space) {
|
|
||||||
len -= (unsigned long)space - (unsigned long)buf;
|
|
||||||
if (!strcmp(buf, "loadctl")) {
|
if (!strcmp(buf, "loadctl")) {
|
||||||
return set_loadctl_options(space, len) == OK ? 200 : 400;
|
return set_loadctl_options(space, len) == OK ? 200 : 400;
|
||||||
}
|
}
|
||||||
@ -379,12 +471,15 @@ static int qh_core(int sd, char *buf, unsigned int len)
|
|||||||
|
|
||||||
int qh_init(const char *path)
|
int qh_init(const char *path)
|
||||||
{
|
{
|
||||||
int result, old_umask;
|
int result = 0;
|
||||||
|
int old_umask = 0;
|
||||||
|
|
||||||
if(qh_listen_sock >= 0)
|
if (qh_listen_sock >= 0) {
|
||||||
iobroker_close(nagios_iobs, qh_listen_sock);
|
iobroker_close(nagios_iobs, qh_listen_sock);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (path == NULL) {
|
||||||
|
|
||||||
if(!path) {
|
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: query_socket is NULL. What voodoo is this?\n");
|
logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: query_socket is NULL. What voodoo is this?\n");
|
||||||
return ERROR;
|
return ERROR;
|
||||||
}
|
}
|
||||||
@ -393,17 +488,25 @@ int qh_init(const char *path)
|
|||||||
errno = 0;
|
errno = 0;
|
||||||
qh_listen_sock = nsock_unix(path, NSOCK_TCP | NSOCK_UNLINK);
|
qh_listen_sock = nsock_unix(path, NSOCK_TCP | NSOCK_UNLINK);
|
||||||
umask(old_umask);
|
umask(old_umask);
|
||||||
if(qh_listen_sock < 0) {
|
|
||||||
|
if (qh_listen_sock < 0) {
|
||||||
|
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to init socket '%s'. %s: %s\n",
|
logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to init socket '%s'. %s: %s\n",
|
||||||
path, nsock_strerror(qh_listen_sock), strerror(errno));
|
path, nsock_strerror(qh_listen_sock), strerror(errno));
|
||||||
return ERROR;
|
return ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* plugins shouldn't have this socket */
|
/* plugins shouldn't have this socket */
|
||||||
(void)fcntl(qh_listen_sock, F_SETFD, FD_CLOEXEC);
|
result = fcntl(qh_listen_sock, F_SETFD, FD_CLOEXEC);
|
||||||
|
if (result == -1) {
|
||||||
|
|
||||||
|
logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to fcntl() query handler socket\n");
|
||||||
|
}
|
||||||
|
|
||||||
/* most likely overkill, but it's small, so... */
|
/* most likely overkill, but it's small, so... */
|
||||||
if(!(qh_table = dkhash_create(1024))) {
|
qh_table = dkhash_create(1024);
|
||||||
|
if (qh_table == NULL) {
|
||||||
|
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to create hash table\n");
|
logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to create hash table\n");
|
||||||
close(qh_listen_sock);
|
close(qh_listen_sock);
|
||||||
return ERROR;
|
return ERROR;
|
||||||
@ -411,7 +514,8 @@ int qh_init(const char *path)
|
|||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
result = iobroker_register(nagios_iobs, qh_listen_sock, NULL, qh_input);
|
result = iobroker_register(nagios_iobs, qh_listen_sock, NULL, qh_input);
|
||||||
if(result < 0) {
|
if (result < 0) {
|
||||||
|
|
||||||
dkhash_destroy(qh_table);
|
dkhash_destroy(qh_table);
|
||||||
close(qh_listen_sock);
|
close(qh_listen_sock);
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to register socket with io broker: %s; errno=%d: %s\n", iobroker_strerror(result), errno, strerror(errno));
|
logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to register socket with io broker: %s; errno=%d: %s\n", iobroker_strerror(result), errno, strerror(errno));
|
||||||
@ -421,10 +525,20 @@ int qh_init(const char *path)
|
|||||||
logit(NSLOG_INFO_MESSAGE, FALSE, "qh: Socket '%s' successfully initialized\n", path);
|
logit(NSLOG_INFO_MESSAGE, FALSE, "qh: Socket '%s' successfully initialized\n", path);
|
||||||
|
|
||||||
/* now register our the in-core handlers */
|
/* now register our the in-core handlers */
|
||||||
if(!qh_register_handler("core", "Nagios Core control and info", 0, qh_core))
|
result = qh_register_handler("core", "Nagios Core control and info", 0, qh_core);
|
||||||
|
if (result == OK) {
|
||||||
logit(NSLOG_INFO_MESSAGE, FALSE, "qh: core query handler registered\n");
|
logit(NSLOG_INFO_MESSAGE, FALSE, "qh: core query handler registered\n");
|
||||||
qh_register_handler("echo", "The Echo Service - What You Put Is What You Get", 0, qh_echo);
|
}
|
||||||
qh_register_handler("help", "Help for the query handler", 0, qh_help);
|
|
||||||
|
result = qh_register_handler("echo", "The Echo Service - What You Put Is What You Get", 0, qh_echo);
|
||||||
|
if (result == OK) {
|
||||||
|
logit(NSLOG_INFO_MESSAGE, FALSE, "qh: echo service query handler registered\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
result = qh_register_handler("help", "Help for the query handler", 0, qh_help);
|
||||||
|
if (result == OK) {
|
||||||
|
logit(NSLOG_INFO_MESSAGE, FALSE, "qh: help for the query handler registered\n");
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
423
base/utils.c
423
base/utils.c
@ -25,14 +25,22 @@
|
|||||||
#include "../include/objects.h"
|
#include "../include/objects.h"
|
||||||
#include "../include/statusdata.h"
|
#include "../include/statusdata.h"
|
||||||
#include "../include/comments.h"
|
#include "../include/comments.h"
|
||||||
|
#include "../include/downtime.h"
|
||||||
#include "../include/macros.h"
|
#include "../include/macros.h"
|
||||||
#include "../include/nagios.h"
|
#include "../include/nagios.h"
|
||||||
#include "../include/netutils.h"
|
#include "../include/netutils.h"
|
||||||
|
#include "../include/perfdata.h"
|
||||||
#include "../include/broker.h"
|
#include "../include/broker.h"
|
||||||
#include "../include/nebmods.h"
|
#include "../include/nebmods.h"
|
||||||
#include "../include/nebmodules.h"
|
#include "../include/nebmodules.h"
|
||||||
#include "../include/workers.h"
|
#include "../include/workers.h"
|
||||||
|
|
||||||
|
#include "../xdata/xodtemplate.h"
|
||||||
|
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/resource.h>
|
||||||
|
|
||||||
|
|
||||||
/* global variables only used by the daemon */
|
/* global variables only used by the daemon */
|
||||||
char *nagios_binary_path = NULL;
|
char *nagios_binary_path = NULL;
|
||||||
char *config_file = NULL;
|
char *config_file = NULL;
|
||||||
@ -194,6 +202,10 @@ char *website_url;
|
|||||||
int allow_empty_hostgroup_assignment;
|
int allow_empty_hostgroup_assignment;
|
||||||
|
|
||||||
int host_down_disable_service_checks;
|
int host_down_disable_service_checks;
|
||||||
|
int service_skip_check_dependency_status;
|
||||||
|
int service_skip_check_parent_status;
|
||||||
|
int service_skip_check_host_down_status;
|
||||||
|
int host_skip_check_dependency_status;
|
||||||
|
|
||||||
/*** perfdata variables ***/
|
/*** perfdata variables ***/
|
||||||
int perfdata_timeout;
|
int perfdata_timeout;
|
||||||
@ -376,6 +388,10 @@ void init_main_cfg_vars(int first_time) {
|
|||||||
allow_empty_hostgroup_assignment =
|
allow_empty_hostgroup_assignment =
|
||||||
DEFAULT_ALLOW_EMPTY_HOSTGROUP_ASSIGNMENT;
|
DEFAULT_ALLOW_EMPTY_HOSTGROUP_ASSIGNMENT;
|
||||||
host_down_disable_service_checks = FALSE;
|
host_down_disable_service_checks = FALSE;
|
||||||
|
service_skip_check_dependency_status = -1;
|
||||||
|
service_skip_check_parent_status = -1;
|
||||||
|
service_skip_check_host_down_status = -1;
|
||||||
|
host_skip_check_dependency_status = -1;
|
||||||
perfdata_timeout = 0;
|
perfdata_timeout = 0;
|
||||||
host_perfdata_command = NULL;
|
host_perfdata_command = NULL;
|
||||||
service_perfdata_command = NULL;
|
service_perfdata_command = NULL;
|
||||||
@ -1426,6 +1442,9 @@ time_t calculate_time_from_day_of_month(int year, int month, int monthday) {
|
|||||||
day--;
|
day--;
|
||||||
|
|
||||||
/* make the new time */
|
/* make the new time */
|
||||||
|
t.tm_sec = 0;
|
||||||
|
t.tm_min = 0;
|
||||||
|
t.tm_hour = 0;
|
||||||
t.tm_mon = month;
|
t.tm_mon = month;
|
||||||
t.tm_year = year;
|
t.tm_year = year;
|
||||||
t.tm_mday = day;
|
t.tm_mday = day;
|
||||||
@ -1617,6 +1636,7 @@ void setup_sighandler(void) {
|
|||||||
sigaction(SIGHUP, &sig_action, NULL);
|
sigaction(SIGHUP, &sig_action, NULL);
|
||||||
if(daemon_dumps_core == FALSE && daemon_mode == TRUE)
|
if(daemon_dumps_core == FALSE && daemon_mode == TRUE)
|
||||||
sigaction(SIGSEGV, &sig_action, NULL);
|
sigaction(SIGSEGV, &sig_action, NULL);
|
||||||
|
sig_action.sa_flags = SA_NOCLDWAIT;
|
||||||
#else /* HAVE_SIGACTION */
|
#else /* HAVE_SIGACTION */
|
||||||
signal(SIGPIPE, SIG_IGN);
|
signal(SIGPIPE, SIG_IGN);
|
||||||
signal(SIGQUIT, sighandler);
|
signal(SIGQUIT, sighandler);
|
||||||
@ -1701,7 +1721,7 @@ void my_system_sighandler(int sig) {
|
|||||||
|
|
||||||
|
|
||||||
/* Handle the SIGXFSZ signal. A SIGXFSZ signal is received when a file exceeds
|
/* Handle the SIGXFSZ signal. A SIGXFSZ signal is received when a file exceeds
|
||||||
the maximum allowable size either as dictated by the fzise parameter in
|
the maximum allowable size either as dictated by the fsize parameter in
|
||||||
/etc/security/limits.conf (ulimit -f) or by the maximum size allowed by
|
/etc/security/limits.conf (ulimit -f) or by the maximum size allowed by
|
||||||
the filesystem */
|
the filesystem */
|
||||||
void handle_sigxfsz(int sig) {
|
void handle_sigxfsz(int sig) {
|
||||||
@ -1824,37 +1844,49 @@ static long long check_file_size(char *path, unsigned long fudge,
|
|||||||
/************************ DAEMON FUNCTIONS ************************/
|
/************************ DAEMON FUNCTIONS ************************/
|
||||||
/******************************************************************/
|
/******************************************************************/
|
||||||
|
|
||||||
int daemon_init(void) {
|
int daemon_init(void)
|
||||||
|
{
|
||||||
pid_t pid = -1;
|
pid_t pid = -1;
|
||||||
int pidno = 0;
|
int pidno = 0;
|
||||||
int lockfile = 0;
|
int lockfile = 0;
|
||||||
int val = 0;
|
int val = 0;
|
||||||
char buf[256];
|
char buf[256] = { 0 };
|
||||||
struct flock lock;
|
|
||||||
char *homedir = NULL;
|
char *homedir = NULL;
|
||||||
char *cp;
|
char *cp = NULL;
|
||||||
|
struct flock lock;
|
||||||
|
|
||||||
#ifdef RLIMIT_CORE
|
#ifdef RLIMIT_CORE
|
||||||
struct rlimit limit;
|
struct rlimit limit;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* change working directory. scuttle home if we're dumping core */
|
/* change working directory. scuttle home if we're dumping core */
|
||||||
if(daemon_dumps_core == TRUE) {
|
if (daemon_dumps_core == TRUE) {
|
||||||
|
|
||||||
homedir = getenv("HOME");
|
homedir = getenv("HOME");
|
||||||
if (homedir && *homedir)
|
|
||||||
|
if (homedir && *homedir) {
|
||||||
chdir(homedir);
|
chdir(homedir);
|
||||||
|
}
|
||||||
else if (log_file && *log_file) {
|
else if (log_file && *log_file) {
|
||||||
|
|
||||||
homedir = strdup(log_file);
|
homedir = strdup(log_file);
|
||||||
|
|
||||||
cp = strrchr(homedir, '/');
|
cp = strrchr(homedir, '/');
|
||||||
if (cp)
|
|
||||||
|
if (cp) {
|
||||||
*cp = '\0';
|
*cp = '\0';
|
||||||
else
|
}
|
||||||
|
else {
|
||||||
strcpy(homedir, "/");
|
strcpy(homedir, "/");
|
||||||
|
}
|
||||||
|
|
||||||
chdir(homedir);
|
chdir(homedir);
|
||||||
free(homedir);
|
free(homedir);
|
||||||
} else
|
|
||||||
|
} else {
|
||||||
chdir("/");
|
chdir("/");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
umask(S_IWGRP | S_IWOTH);
|
umask(S_IWGRP | S_IWOTH);
|
||||||
|
|
||||||
@ -1871,43 +1903,77 @@ int daemon_init(void) {
|
|||||||
|
|
||||||
lockfile = open(lock_file, O_RDWR | O_CREAT, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
|
lockfile = open(lock_file, O_RDWR | O_CREAT, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
|
||||||
|
|
||||||
if(lockfile < 0) {
|
if (lockfile < 0) {
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "Failed to obtain lock on file %s: %s\n", lock_file, strerror(errno));
|
|
||||||
logit(NSLOG_PROCESS_INFO | NSLOG_RUNTIME_ERROR, TRUE, "Bailing out due to errors encountered while attempting to daemonize... (PID=%d)", (int)getpid());
|
logit(NSLOG_RUNTIME_ERROR, TRUE,
|
||||||
|
"Failed to obtain lock on file %s: %s\n", lock_file, strerror(errno));
|
||||||
|
logit(NSLOG_PROCESS_INFO | NSLOG_RUNTIME_ERROR, TRUE,
|
||||||
|
"Bailing out due to errors encountered while attempting to daemonize... (PID=%d)", (int)getpid());
|
||||||
|
|
||||||
cleanup();
|
cleanup();
|
||||||
exit(ERROR);
|
exit(ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* see if we can read the contents of the lockfile */
|
/* see if we can read the contents of the lockfile */
|
||||||
if((val = read(lockfile, buf, (size_t)10)) < 0) {
|
val = read(lockfile, buf, (size_t)10);
|
||||||
|
if (val < 0) {
|
||||||
|
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "Lockfile exists but cannot be read");
|
logit(NSLOG_RUNTIME_ERROR, TRUE, "Lockfile exists but cannot be read");
|
||||||
cleanup();
|
cleanup();
|
||||||
exit(ERROR);
|
exit(ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we read something - check the PID */
|
/* we read something - check the PID */
|
||||||
if(val > 0) {
|
if (val > 0) {
|
||||||
if((val = sscanf(buf, "%d", &pidno)) < 1) {
|
|
||||||
|
val = sscanf(buf, "%d", &pidno);
|
||||||
|
if (val < 1) {
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "Lockfile '%s' does not contain a valid PID (%s)", lock_file, buf);
|
logit(NSLOG_RUNTIME_ERROR, TRUE, "Lockfile '%s' does not contain a valid PID (%s)", lock_file, buf);
|
||||||
cleanup();
|
cleanup();
|
||||||
exit(ERROR);
|
exit(ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pid = (pid_t)pidno;
|
||||||
|
if (val == 1) {
|
||||||
|
|
||||||
/* check for SIGHUP */
|
/* check for SIGHUP */
|
||||||
if(val == 1 && (pid = (pid_t)pidno) == getpid()) {
|
if (pid == getpid()) {
|
||||||
close(lockfile);
|
close(lockfile);
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* send a signal to see if pid alive */
|
||||||
|
val = kill(pid, 0);
|
||||||
|
|
||||||
|
/* is this process alive? */
|
||||||
|
if (val == 0) {
|
||||||
|
logit(NSLOG_RUNTIME_ERROR, TRUE,
|
||||||
|
"Lockfile '%s' contains PID of running process (%d)", lock_file, pidno);
|
||||||
|
cleanup();
|
||||||
|
exit(ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* exit on errors... */
|
/* exit on errors... */
|
||||||
if((pid = fork()) < 0)
|
pid = fork();
|
||||||
|
if (pid < 0) {
|
||||||
return(ERROR);
|
return(ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
/* parent process goes away.. */
|
/* parent process goes away.. */
|
||||||
else if((int)pid != 0)
|
else if (pid != 0) {
|
||||||
|
|
||||||
|
iobroker_destroy(nagios_iobs, IOBROKER_CLOSE_SOCKETS);
|
||||||
|
cleanup();
|
||||||
|
cleanup_performance_data();
|
||||||
|
cleanup_downtime_data();
|
||||||
|
my_free(lock_file);
|
||||||
|
my_free(config_file);
|
||||||
|
my_free(config_file_dir);
|
||||||
|
my_free(nagios_binary_path);
|
||||||
exit(OK);
|
exit(OK);
|
||||||
|
}
|
||||||
|
|
||||||
/* child continues... */
|
/* child continues... */
|
||||||
|
|
||||||
@ -1919,13 +1985,21 @@ int daemon_init(void) {
|
|||||||
lock.l_start = 0;
|
lock.l_start = 0;
|
||||||
lock.l_whence = SEEK_SET;
|
lock.l_whence = SEEK_SET;
|
||||||
lock.l_len = 0;
|
lock.l_len = 0;
|
||||||
if(fcntl(lockfile, F_SETLK, &lock) < 0) {
|
|
||||||
if(errno == EACCES || errno == EAGAIN) {
|
val = fcntl(lockfile, F_SETLK, &lock);
|
||||||
|
|
||||||
|
if (val < 0) {
|
||||||
|
if (errno == EACCES || errno == EAGAIN) {
|
||||||
fcntl(lockfile, F_GETLK, &lock);
|
fcntl(lockfile, F_GETLK, &lock);
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "Lockfile '%s' looks like its already held by another instance of Nagios (PID %d). Bailing out...", lock_file, (int)lock.l_pid);
|
logit(NSLOG_RUNTIME_ERROR, TRUE,
|
||||||
|
"Lockfile '%s' looks like its already held by another instance of Nagios (PID %d). Bailing out...",
|
||||||
|
lock_file, (int)lock.l_pid);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
logit(NSLOG_RUNTIME_ERROR, TRUE,
|
||||||
|
"Cannot lock lockfile '%s': %s. Bailing out...",
|
||||||
|
lock_file, strerror(errno));
|
||||||
}
|
}
|
||||||
else
|
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "Cannot lock lockfile '%s': %s. Bailing out...", lock_file, strerror(errno));
|
|
||||||
|
|
||||||
cleanup();
|
cleanup();
|
||||||
exit(ERROR);
|
exit(ERROR);
|
||||||
@ -1957,7 +2031,7 @@ int daemon_init(void) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -2094,12 +2168,13 @@ int process_check_result_queue(char *dirname) {
|
|||||||
return ERROR;
|
return ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_debug_info(DEBUGL_CHECKS, 1, "Starting to read check result queue '%s'...\n", dirname);
|
log_debug_info(DEBUGL_CHECKS, 0, "Starting to read check result queue '%s'...\n", dirname);
|
||||||
|
|
||||||
start = time(NULL);
|
start = time(NULL);
|
||||||
|
|
||||||
/* process all files in the directory... */
|
/* process all files in the directory... */
|
||||||
while((dirfile = readdir(dirp)) != NULL) {
|
while((dirfile = readdir(dirp)) != NULL) {
|
||||||
|
|
||||||
/* bail out if we encountered a signal */
|
/* bail out if we encountered a signal */
|
||||||
if (sigshutdown == TRUE || sigrestart == TRUE) {
|
if (sigshutdown == TRUE || sigrestart == TRUE) {
|
||||||
log_debug_info(DEBUGL_CHECKS, 0, "Breaking out of check result reaper: signal encountered\n");
|
log_debug_info(DEBUGL_CHECKS, 0, "Breaking out of check result reaper: signal encountered\n");
|
||||||
@ -2116,7 +2191,13 @@ int process_check_result_queue(char *dirname) {
|
|||||||
snprintf(file, sizeof(file), "%s/%s", dirname, dirfile->d_name);
|
snprintf(file, sizeof(file), "%s/%s", dirname, dirfile->d_name);
|
||||||
file[sizeof(file) - 1] = '\x0';
|
file[sizeof(file) - 1] = '\x0';
|
||||||
|
|
||||||
/* process this if it's a check result file... */
|
/* process this if it's a check result file...
|
||||||
|
remember it needs to be in the format of
|
||||||
|
filename = cXXXXXX
|
||||||
|
where X is any integer
|
||||||
|
there must also be a filename present
|
||||||
|
okfile = cXXXXXX.ok
|
||||||
|
where the XXXXXX is the same as in the filename */
|
||||||
x = strlen(dirfile->d_name);
|
x = strlen(dirfile->d_name);
|
||||||
if(x == 7 && dirfile->d_name[0] == 'c') {
|
if(x == 7 && dirfile->d_name[0] == 'c') {
|
||||||
|
|
||||||
@ -2152,8 +2233,10 @@ int process_check_result_queue(char *dirname) {
|
|||||||
result = process_check_result_file(file);
|
result = process_check_result_file(file);
|
||||||
|
|
||||||
/* break out if we encountered an error */
|
/* break out if we encountered an error */
|
||||||
if(result == ERROR)
|
if(result == ERROR) {
|
||||||
|
log_debug_info(DEBUGL_CHECKS, 0, "Encountered an error processing the check result file\n");
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
check_result_files++;
|
check_result_files++;
|
||||||
}
|
}
|
||||||
@ -2161,6 +2244,8 @@ int process_check_result_queue(char *dirname) {
|
|||||||
|
|
||||||
closedir(dirp);
|
closedir(dirp);
|
||||||
|
|
||||||
|
log_debug_info(DEBUGL_CHECKS, 0, "Finished reaping %d check results\n", check_result_files);
|
||||||
|
|
||||||
return check_result_files;
|
return check_result_files;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -2213,17 +2298,21 @@ int process_check_result(check_result *cr)
|
|||||||
/* static char *unescape_check_result_file_output(char*); */
|
/* static char *unescape_check_result_file_output(char*); */
|
||||||
|
|
||||||
/* reads check result(s) from a file */
|
/* reads check result(s) from a file */
|
||||||
int process_check_result_file(char *fname) {
|
int process_check_result_file(char *fname)
|
||||||
|
{
|
||||||
mmapfile *thefile = NULL;
|
mmapfile *thefile = NULL;
|
||||||
char *input = NULL;
|
char *input = NULL;
|
||||||
char *var = NULL;
|
char *var = NULL;
|
||||||
char *val = NULL;
|
char *val = NULL;
|
||||||
|
char *vartok = NULL;
|
||||||
|
char *valtok = NULL;
|
||||||
char *v1 = NULL, *v2 = NULL;
|
char *v1 = NULL, *v2 = NULL;
|
||||||
time_t current_time;
|
time_t current_time;
|
||||||
check_result cr;
|
check_result cr;
|
||||||
|
|
||||||
if(fname == NULL)
|
if (fname == NULL) {
|
||||||
return ERROR;
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
init_check_result(&cr);
|
init_check_result(&cr);
|
||||||
cr.engine = &nagios_spool_check_engine;
|
cr.engine = &nagios_spool_check_engine;
|
||||||
@ -2233,7 +2322,8 @@ int process_check_result_file(char *fname) {
|
|||||||
log_debug_info(DEBUGL_CHECKS, 1, "Processing check result file: '%s'\n", fname);
|
log_debug_info(DEBUGL_CHECKS, 1, "Processing check result file: '%s'\n", fname);
|
||||||
|
|
||||||
/* open the file for reading */
|
/* open the file for reading */
|
||||||
if((thefile = mmap_fopen(fname)) == NULL) {
|
thefile = mmap_fopen(fname);
|
||||||
|
if (thefile == NULL) {
|
||||||
|
|
||||||
/* try removing the file - zero length files can't be mmap()'ed, so it might exist */
|
/* try removing the file - zero length files can't be mmap()'ed, so it might exist */
|
||||||
log_debug_info(DEBUGL_CHECKS, 1, "Failed to open check result file for reading: '%s'\n", fname);
|
log_debug_info(DEBUGL_CHECKS, 1, "Failed to open check result file for reading: '%s'\n", fname);
|
||||||
@ -2247,24 +2337,28 @@ int process_check_result_file(char *fname) {
|
|||||||
|
|
||||||
/* free memory */
|
/* free memory */
|
||||||
my_free(input);
|
my_free(input);
|
||||||
|
my_free(var);
|
||||||
|
my_free(val);
|
||||||
|
|
||||||
/* read the next line */
|
/* read the next line */
|
||||||
if((input = mmap_fgets_multiline(thefile)) == NULL)
|
input = mmap_fgets_multiline(thefile);
|
||||||
|
if (input == NULL) {
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* skip comments */
|
/* skip comments */
|
||||||
if(input[0] == '#')
|
if (input[0] == '#') {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/* empty line indicates end of record */
|
/* empty line indicates end of record */
|
||||||
else if(input[0] == '\n') {
|
else if (input[0] == '\n') {
|
||||||
|
|
||||||
/* do we have the minimum amount of data? */
|
/* do we have the minimum amount of data? */
|
||||||
if(cr.host_name != NULL && cr.output != NULL) {
|
if (cr.host_name != NULL && cr.output != NULL) {
|
||||||
|
|
||||||
/* process the check result */
|
/* process the check result */
|
||||||
process_check_result(&cr);
|
process_check_result(&cr);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* cleanse for next check result */
|
/* cleanse for next check result */
|
||||||
@ -2273,62 +2367,97 @@ int process_check_result_file(char *fname) {
|
|||||||
cr.output_file = fname;
|
cr.output_file = fname;
|
||||||
}
|
}
|
||||||
|
|
||||||
if((var = my_strtok(input, "=")) == NULL)
|
vartok = my_strtok_with_free(input, "=", FALSE);
|
||||||
|
if (vartok == NULL) {
|
||||||
continue;
|
continue;
|
||||||
if((val = my_strtok(NULL, "\n")) == NULL)
|
}
|
||||||
|
|
||||||
|
valtok = my_strtok_with_free(NULL, "\n", FALSE);
|
||||||
|
if (valtok == NULL) {
|
||||||
|
|
||||||
|
vartok = my_strtok_with_free(NULL, NULL, TRUE);
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* clean up some memory before we go any further */
|
||||||
|
var = strdup(vartok);
|
||||||
|
val = strdup(valtok);
|
||||||
|
vartok = my_strtok_with_free(NULL, NULL, TRUE);
|
||||||
|
|
||||||
|
log_debug_info(DEBUGL_CHECKS, 2, " * %25s: %s\n", var, val);
|
||||||
|
|
||||||
/* found the file time */
|
/* found the file time */
|
||||||
if(!strcmp(var, "file_time")) {
|
if (!strcmp(var, "file_time")) {
|
||||||
|
|
||||||
/* file is too old - ignore check results it contains and delete it */
|
/* file is too old - ignore check results it contains and delete it */
|
||||||
/* this will only work as intended if file_time comes before check results */
|
/* this will only work as intended if file_time comes before check results */
|
||||||
if(max_check_result_file_age > 0 && (current_time - (strtoul(val, NULL, 0)) > max_check_result_file_age)) {
|
if ((max_check_result_file_age > 0)
|
||||||
|
&& (current_time - (strtoul(val, NULL, 0)) > max_check_result_file_age)) {
|
||||||
|
|
||||||
|
log_debug_info(DEBUGL_CHECKS, 1,
|
||||||
|
"Skipping check_result because file_time is %s and max cr file age is %lu",
|
||||||
|
val, max_check_result_file_age);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* else we have check result data */
|
/* else we have check result data */
|
||||||
else {
|
else {
|
||||||
if(!strcmp(var, "host_name"))
|
|
||||||
|
if (!strcmp(var, "host_name")) {
|
||||||
cr.host_name = (char *)strdup(val);
|
cr.host_name = (char *)strdup(val);
|
||||||
else if(!strcmp(var, "service_description")) {
|
}
|
||||||
|
else if (!strcmp(var, "service_description")) {
|
||||||
cr.service_description = (char *)strdup(val);
|
cr.service_description = (char *)strdup(val);
|
||||||
cr.object_check_type = SERVICE_CHECK;
|
cr.object_check_type = SERVICE_CHECK;
|
||||||
}
|
}
|
||||||
else if(!strcmp(var, "check_type"))
|
else if (!strcmp(var, "check_type")) {
|
||||||
cr.check_type = atoi(val);
|
cr.check_type = atoi(val);
|
||||||
else if(!strcmp(var, "check_options"))
|
}
|
||||||
|
else if (!strcmp(var, "check_options")) {
|
||||||
cr.check_options = atoi(val);
|
cr.check_options = atoi(val);
|
||||||
else if(!strcmp(var, "scheduled_check"))
|
}
|
||||||
|
else if (!strcmp(var, "scheduled_check")) {
|
||||||
cr.scheduled_check = atoi(val);
|
cr.scheduled_check = atoi(val);
|
||||||
else if(!strcmp(var, "reschedule_check"))
|
}
|
||||||
|
else if (!strcmp(var, "reschedule_check")) {
|
||||||
cr.reschedule_check = atoi(val);
|
cr.reschedule_check = atoi(val);
|
||||||
else if(!strcmp(var, "latency"))
|
}
|
||||||
|
else if (!strcmp(var, "latency")) {
|
||||||
cr.latency = strtod(val, NULL);
|
cr.latency = strtod(val, NULL);
|
||||||
else if(!strcmp(var, "start_time")) {
|
}
|
||||||
if((v1 = strtok(val, ".")) == NULL)
|
else if (!strcmp(var, "start_time") || !strcmp(var, "finish_time")) {
|
||||||
|
|
||||||
|
v1 = strtok(val, ".");
|
||||||
|
if (v1 == NULL) {
|
||||||
continue;
|
continue;
|
||||||
if((v2 = strtok(NULL, "\n")) == NULL)
|
}
|
||||||
|
|
||||||
|
v2 = strtok(NULL, "\n");
|
||||||
|
if (v2 == NULL) {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(var, "start_time")) {
|
||||||
cr.start_time.tv_sec = strtoul(v1, NULL, 0);
|
cr.start_time.tv_sec = strtoul(v1, NULL, 0);
|
||||||
cr.start_time.tv_usec = strtoul(v2, NULL, 0);
|
cr.start_time.tv_usec = strtoul(v2, NULL, 0);
|
||||||
}
|
}
|
||||||
else if(!strcmp(var, "finish_time")) {
|
else {
|
||||||
if((v1 = strtok(val, ".")) == NULL)
|
|
||||||
continue;
|
|
||||||
if((v2 = strtok(NULL, "\n")) == NULL)
|
|
||||||
continue;
|
|
||||||
cr.finish_time.tv_sec = strtoul(v1, NULL, 0);
|
cr.finish_time.tv_sec = strtoul(v1, NULL, 0);
|
||||||
cr.finish_time.tv_usec = strtoul(v2, NULL, 0);
|
cr.finish_time.tv_usec = strtoul(v2, NULL, 0);
|
||||||
}
|
}
|
||||||
else if(!strcmp(var, "early_timeout"))
|
}
|
||||||
|
else if (!strcmp(var, "early_timeout")) {
|
||||||
cr.early_timeout = atoi(val);
|
cr.early_timeout = atoi(val);
|
||||||
else if(!strcmp(var, "exited_ok"))
|
}
|
||||||
|
else if (!strcmp(var, "exited_ok")) {
|
||||||
cr.exited_ok = atoi(val);
|
cr.exited_ok = atoi(val);
|
||||||
else if(!strcmp(var, "return_code"))
|
}
|
||||||
|
else if (!strcmp(var, "return_code")) {
|
||||||
cr.return_code = atoi(val);
|
cr.return_code = atoi(val);
|
||||||
else if(!strcmp(var, "output"))
|
}
|
||||||
|
else if (!strcmp(var, "output")) {
|
||||||
|
|
||||||
/* Interpolate "\\\\" and "\\n" escape sequences to the literal
|
/* Interpolate "\\\\" and "\\n" escape sequences to the literal
|
||||||
* characters they represent. This converts from the single line
|
* characters they represent. This converts from the single line
|
||||||
* format used to store the output in a checkresult file, to the
|
* format used to store the output in a checkresult file, to the
|
||||||
@ -2338,14 +2467,21 @@ int process_check_result_file(char *fname) {
|
|||||||
cr.output = unescape_check_result_output(val);
|
cr.output = unescape_check_result_output(val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my_free(var);
|
||||||
|
my_free(val);
|
||||||
|
|
||||||
|
log_debug_info(DEBUGL_CHECKS, 2, " **************\n");
|
||||||
|
|
||||||
/* do we have the minimum amount of data? */
|
/* do we have the minimum amount of data? */
|
||||||
if(cr.host_name != NULL && cr.output != NULL) {
|
if (cr.host_name != NULL && cr.output != NULL) {
|
||||||
|
|
||||||
/* process check result */
|
/* process check result */
|
||||||
process_check_result(&cr);
|
process_check_result(&cr);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
/* log a debug message */
|
/* log a debug message */
|
||||||
log_debug_info(DEBUGL_CHECKS, 1, "Minimum amount of data not present; Skipped check result file: '%s'\n", fname);
|
log_debug_info(DEBUGL_CHECKS, 1, "Minimum amount of data not present; Skipped check result file: '%s'\n", fname);
|
||||||
}
|
}
|
||||||
@ -2359,13 +2495,14 @@ int process_check_result_file(char *fname) {
|
|||||||
delete_check_result_file(fname);
|
delete_check_result_file(fname);
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* deletes as check result file, as well as its ok-to-go file */
|
/* deletes as check result file, as well as its ok-to-go file */
|
||||||
int delete_check_result_file(char *fname) {
|
int delete_check_result_file(char *fname)
|
||||||
|
{
|
||||||
char *temp_buffer = NULL;
|
char *temp_buffer = NULL;
|
||||||
int result = OK;
|
int result = OK;
|
||||||
|
|
||||||
@ -2374,20 +2511,23 @@ int delete_check_result_file(char *fname) {
|
|||||||
|
|
||||||
/* delete the ok-to-go file */
|
/* delete the ok-to-go file */
|
||||||
asprintf(&temp_buffer, "%s.ok", fname);
|
asprintf(&temp_buffer, "%s.ok", fname);
|
||||||
|
|
||||||
result |= unlink(temp_buffer);
|
result |= unlink(temp_buffer);
|
||||||
|
|
||||||
my_free(temp_buffer);
|
my_free(temp_buffer);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* initializes a host/service check result */
|
/* initializes a host/service check result */
|
||||||
int init_check_result(check_result *info) {
|
int init_check_result(check_result *info)
|
||||||
|
{
|
||||||
if(info == NULL)
|
if (info == NULL) {
|
||||||
return ERROR;
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
/* reset vars */
|
/* reset vars */
|
||||||
info->object_check_type = HOST_CHECK;
|
info->object_check_type = HOST_CHECK;
|
||||||
@ -2411,22 +2551,23 @@ int init_check_result(check_result *info) {
|
|||||||
info->engine = NULL;
|
info->engine = NULL;
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* frees memory associated with a host/service check result */
|
/* frees memory associated with a host/service check result */
|
||||||
int free_check_result(check_result *info) {
|
int free_check_result(check_result *info)
|
||||||
|
{
|
||||||
if(info == NULL)
|
if (info == NULL) {
|
||||||
return OK;
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
my_free(info->host_name);
|
my_free(info->host_name);
|
||||||
my_free(info->service_description);
|
my_free(info->service_description);
|
||||||
my_free(info->output);
|
my_free(info->output);
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************/
|
/******************************************************************/
|
||||||
@ -3307,6 +3448,7 @@ char *get_program_modification_date(void) {
|
|||||||
|
|
||||||
/* do some cleanup before we exit */
|
/* do some cleanup before we exit */
|
||||||
void cleanup(void) {
|
void cleanup(void) {
|
||||||
|
xodtemplate_free_memory();
|
||||||
|
|
||||||
#ifdef USE_EVENT_BROKER
|
#ifdef USE_EVENT_BROKER
|
||||||
/* unload modules */
|
/* unload modules */
|
||||||
@ -3332,8 +3474,6 @@ void free_memory(nagios_macros *mac) {
|
|||||||
|
|
||||||
/* free all allocated memory for the object definitions */
|
/* free all allocated memory for the object definitions */
|
||||||
free_object_data();
|
free_object_data();
|
||||||
|
|
||||||
/* free memory allocated to comments */
|
|
||||||
free_comment_data();
|
free_comment_data();
|
||||||
|
|
||||||
/* free event queue data */
|
/* free event queue data */
|
||||||
@ -3386,22 +3526,31 @@ void free_memory(nagios_macros *mac) {
|
|||||||
mac->x[MACRO_TEMPFILE] = NULL; /* assigned from temp_file */
|
mac->x[MACRO_TEMPFILE] = NULL; /* assigned from temp_file */
|
||||||
my_free(temp_path);
|
my_free(temp_path);
|
||||||
mac->x[MACRO_TEMPPATH] = NULL; /*assigned from temp_path */
|
mac->x[MACRO_TEMPPATH] = NULL; /*assigned from temp_path */
|
||||||
my_free(check_result_path);
|
|
||||||
my_free(command_file);
|
my_free(command_file);
|
||||||
mac->x[MACRO_COMMANDFILE] = NULL; /* assigned from command_file */
|
mac->x[MACRO_COMMANDFILE] = NULL; /* assigned from command_file */
|
||||||
|
|
||||||
|
my_free(check_result_path);
|
||||||
my_free(log_archive_path);
|
my_free(log_archive_path);
|
||||||
my_free(website_url);
|
my_free(website_url);
|
||||||
|
my_free(status_file);
|
||||||
|
my_free(retention_file);
|
||||||
|
|
||||||
for (i = 0; i < MAX_USER_MACROS; i++) {
|
for (i = 0; i < MAX_USER_MACROS; i++) {
|
||||||
my_free(macro_user[i]);
|
my_free(macro_user[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* these have no other reference */
|
/* these have no other reference */
|
||||||
|
my_free(mac->x[MACRO_PROCESSSTARTTIME]);
|
||||||
|
my_free(mac->x[MACRO_EVENTSTARTTIME]);
|
||||||
my_free(mac->x[MACRO_ADMINEMAIL]);
|
my_free(mac->x[MACRO_ADMINEMAIL]);
|
||||||
my_free(mac->x[MACRO_ADMINPAGER]);
|
my_free(mac->x[MACRO_ADMINPAGER]);
|
||||||
my_free(mac->x[MACRO_RESOURCEFILE]);
|
my_free(mac->x[MACRO_RESOURCEFILE]);
|
||||||
my_free(mac->x[MACRO_OBJECTCACHEFILE]);
|
my_free(mac->x[MACRO_OBJECTCACHEFILE]);
|
||||||
my_free(mac->x[MACRO_MAINCONFIGFILE]);
|
my_free(mac->x[MACRO_MAINCONFIGFILE]);
|
||||||
|
my_free(mac->x[MACRO_RETENTIONDATAFILE]);
|
||||||
|
my_free(mac->x[MACRO_HOSTPERFDATAFILE]);
|
||||||
|
my_free(mac->x[MACRO_STATUSDATAFILE]);
|
||||||
|
my_free(mac->x[MACRO_SERVICEPERFDATAFILE]);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -3504,3 +3653,129 @@ int reset_variables(void) {
|
|||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* try and detect any problems with sys limits
|
||||||
|
we're specifically interested in NPROC
|
||||||
|
but could easily add NOFILE here if necessary */
|
||||||
|
#ifdef DETECT_RLIMIT_PROBLEM
|
||||||
|
void rlimit_problem_detection(int desired_workers) {
|
||||||
|
|
||||||
|
log_debug_info(DEBUGL_PROCESS, 2, "rlimit_problem_detection()\n");
|
||||||
|
|
||||||
|
struct rlimit rlim;
|
||||||
|
int ilim;
|
||||||
|
host * temp_host = NULL;
|
||||||
|
service * temp_service = NULL;
|
||||||
|
|
||||||
|
/* how many times a worker forks/execs to run a plugin */
|
||||||
|
int forks_per_worker_per_check = 2;
|
||||||
|
|
||||||
|
/* time period to calculate over (in minutes) */
|
||||||
|
int time_period_calc = 5;
|
||||||
|
|
||||||
|
/* how many processes do we just want to account for? */
|
||||||
|
int arbitrary_user_processes = 300;
|
||||||
|
|
||||||
|
double checks_per_time_period = 0.0;
|
||||||
|
double this_interval = 0.0;
|
||||||
|
int total_num_procs = 0;
|
||||||
|
|
||||||
|
|
||||||
|
/* first, we grab the NPROC limit, then we check if it isn't unlimited
|
||||||
|
if it isn't, but the max is, then we set the soft limit to the max
|
||||||
|
if that doesn't work, or the max isn't unlimited, then we try and
|
||||||
|
calculate what the current usage is really, and how many workers
|
||||||
|
we expect to have, and calculate what our usage (generally) is
|
||||||
|
going to be */
|
||||||
|
|
||||||
|
ilim = getrlimit(RLIMIT_NPROC, &rlim);
|
||||||
|
if (ilim != 0) {
|
||||||
|
|
||||||
|
/* nothing we can do here, so just let it keep moving along */
|
||||||
|
logit(NSLOG_PROCESS_INFO, TRUE, "WARNING: getrlimit(RLIMIT_NPROC) failed with errno: %s\n", strerror(errno));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rlim.rlim_cur == RLIM_INFINITY) {
|
||||||
|
|
||||||
|
/* we won't have any problems due to fork constraints */
|
||||||
|
log_debug_info(DEBUGL_PROCESS, 0, " * RLIMIT_NPROC is unlimited, no need to continue checking.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
desired_workers = get_desired_workers(desired_workers);
|
||||||
|
|
||||||
|
/* calculate the amount of checks
|
||||||
|
and the worst-case (estimation) frequency in which they repeat */
|
||||||
|
for (temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) {
|
||||||
|
|
||||||
|
this_interval = 0;
|
||||||
|
|
||||||
|
if (!(temp_host->checks_enabled)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get the smallest possible */
|
||||||
|
if (temp_host->check_interval > temp_host->retry_interval
|
||||||
|
&& temp_host->retry_interval != 0) {
|
||||||
|
|
||||||
|
this_interval = temp_host->retry_interval;
|
||||||
|
} else {
|
||||||
|
this_interval = temp_host->check_interval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get them on an average scale (5 min) */
|
||||||
|
if (this_interval > 0) {
|
||||||
|
this_interval = ceil((double) time_period_calc / this_interval);
|
||||||
|
}
|
||||||
|
|
||||||
|
checks_per_time_period += this_interval;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) {
|
||||||
|
|
||||||
|
this_interval = 0;
|
||||||
|
|
||||||
|
if (!(temp_service->checks_enabled)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get the smallest possible */
|
||||||
|
if (temp_service->check_interval > temp_service->retry_interval
|
||||||
|
&& temp_service->retry_interval != 0) {
|
||||||
|
|
||||||
|
this_interval = temp_service->retry_interval;
|
||||||
|
} else {
|
||||||
|
this_interval = temp_service->check_interval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get them on an average scale (5 min) */
|
||||||
|
if (this_interval > 0) {
|
||||||
|
this_interval = ceil(time_period_calc / this_interval);
|
||||||
|
}
|
||||||
|
|
||||||
|
checks_per_time_period += this_interval;
|
||||||
|
}
|
||||||
|
|
||||||
|
total_num_procs = checks_per_time_period * forks_per_worker_per_check;
|
||||||
|
total_num_procs += desired_workers;
|
||||||
|
total_num_procs += arbitrary_user_processes;
|
||||||
|
|
||||||
|
log_debug_info(DEBUGL_PROCESS, 0, " * total_num_procs is: %d\n", total_num_procs);
|
||||||
|
log_debug_info(DEBUGL_PROCESS, 0, " * using forks_per_worker_per_check: %d\n", forks_per_worker_per_check);
|
||||||
|
log_debug_info(DEBUGL_PROCESS, 0, " * using desired_workers: %d\n", desired_workers);
|
||||||
|
log_debug_info(DEBUGL_PROCESS, 0, " * using arbitrary_user_processes: %d\n", arbitrary_user_processes);
|
||||||
|
|
||||||
|
|
||||||
|
if (rlim.rlim_cur > total_num_procs) {
|
||||||
|
|
||||||
|
log_debug_info(DEBUGL_PROCESS, 0, " * RLIMIT_NPROC is %d, total max estimated processes is %d, everything looks okay!\n",
|
||||||
|
(int) rlim.rlim_cur, total_num_procs);
|
||||||
|
} else {
|
||||||
|
|
||||||
|
/* just warn the user - no need to bail out */
|
||||||
|
logit(NSLOG_RUNTIME_WARNING, TRUE, "WARNING: RLIMIT_NPROC is %d, total max estimated processes is %d! You should increase your limits (ulimit -u, or limits.conf)\n",
|
||||||
|
(int) rlim.rlim_cur, total_num_procs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
390
base/workers.c
390
base/workers.c
@ -73,17 +73,38 @@ extern struct kvvec * macros_to_kvv(nagios_macros *);
|
|||||||
static const char *wpjob_type_name(unsigned int type)
|
static const char *wpjob_type_name(unsigned int type)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case WPJOB_CHECK: return "CHECK";
|
case WPJOB_CHECK:
|
||||||
case WPJOB_NOTIFY: return "NOTIFY";
|
return "CHECK";
|
||||||
case WPJOB_OCSP: return "OCSP";
|
|
||||||
case WPJOB_OCHP: return "OCHP";
|
case WPJOB_NOTIFY:
|
||||||
case WPJOB_GLOBAL_SVC_EVTHANDLER: return "GLOBAL SERVICE EVENTHANDLER";
|
return "NOTIFY";
|
||||||
case WPJOB_SVC_EVTHANDLER: return "SERVICE EVENTHANDLER";
|
|
||||||
case WPJOB_GLOBAL_HOST_EVTHANDLER: return "GLOBAL HOST EVENTHANDLER";
|
case WPJOB_OCSP:
|
||||||
case WPJOB_HOST_EVTHANDLER: return "HOST EVENTHANDLER";
|
return "OCSP";
|
||||||
case WPJOB_CALLBACK: return "CALLBACK";
|
|
||||||
case WPJOB_HOST_PERFDATA: return "HOST PERFDATA";
|
case WPJOB_OCHP:
|
||||||
case WPJOB_SVC_PERFDATA: return "SERVICE PERFDATA";
|
return "OCHP";
|
||||||
|
|
||||||
|
case WPJOB_GLOBAL_SVC_EVTHANDLER:
|
||||||
|
return "GLOBAL SERVICE EVENTHANDLER";
|
||||||
|
|
||||||
|
case WPJOB_SVC_EVTHANDLER:
|
||||||
|
return "SERVICE EVENTHANDLER";
|
||||||
|
|
||||||
|
case WPJOB_GLOBAL_HOST_EVTHANDLER:
|
||||||
|
return "GLOBAL HOST EVENTHANDLER";
|
||||||
|
|
||||||
|
case WPJOB_HOST_EVTHANDLER:
|
||||||
|
return "HOST EVENTHANDLER";
|
||||||
|
|
||||||
|
case WPJOB_CALLBACK:
|
||||||
|
return "CALLBACK";
|
||||||
|
|
||||||
|
case WPJOB_HOST_PERFDATA:
|
||||||
|
return "HOST PERFDATA";
|
||||||
|
|
||||||
|
case WPJOB_SVC_PERFDATA:
|
||||||
|
return "SERVICE PERFDATA";
|
||||||
}
|
}
|
||||||
return "UNKNOWN";
|
return "UNKNOWN";
|
||||||
}
|
}
|
||||||
@ -93,17 +114,22 @@ static void wproc_logdump_buffer(int level, int show, const char *prefix, char *
|
|||||||
char *ptr, *eol;
|
char *ptr, *eol;
|
||||||
unsigned int line = 1;
|
unsigned int line = 1;
|
||||||
|
|
||||||
if (!buf || !*buf)
|
if (!buf || !*buf) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (ptr = buf; ptr && *ptr; ptr = eol ? eol + 1 : NULL) {
|
for (ptr = buf; ptr && *ptr; ptr = eol ? eol + 1 : NULL) {
|
||||||
if ((eol = strchr(ptr, '\n')))
|
if ((eol = strchr(ptr, '\n'))) {
|
||||||
*eol = 0;
|
*eol = 0;
|
||||||
|
}
|
||||||
logit(level, show, "%s line %.02d: %s\n", prefix, line++, ptr);
|
logit(level, show, "%s line %.02d: %s\n", prefix, line++, ptr);
|
||||||
if (eol)
|
if (eol) {
|
||||||
*eol = '\n';
|
*eol = '\n';
|
||||||
else
|
}
|
||||||
|
else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try to reap 'jobs' jobs for 'msecs' milliseconds. Return early on error. */
|
/* Try to reap 'jobs' jobs for 'msecs' milliseconds. Return early on error. */
|
||||||
@ -113,13 +139,17 @@ void wproc_reap(int jobs, int msecs)
|
|||||||
gettimeofday(&start, NULL);
|
gettimeofday(&start, NULL);
|
||||||
|
|
||||||
while (jobs > 0 && msecs > 0) {
|
while (jobs > 0 && msecs > 0) {
|
||||||
|
|
||||||
int inputs = iobroker_poll(nagios_iobs, msecs);
|
int inputs = iobroker_poll(nagios_iobs, msecs);
|
||||||
if (inputs < 0) return;
|
if (inputs < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
jobs -= inputs; /* One input is roughly equivalent to one job. */
|
jobs -= inputs; /* One input is roughly equivalent to one job. */
|
||||||
|
|
||||||
struct timeval now;
|
struct timeval now;
|
||||||
gettimeofday(&now, NULL);
|
gettimeofday(&now, NULL);
|
||||||
|
|
||||||
msecs -= tv_delta_msec(&start, &now);
|
msecs -= tv_delta_msec(&start, &now);
|
||||||
start = now;
|
start = now;
|
||||||
}
|
}
|
||||||
@ -131,20 +161,24 @@ int wproc_can_spawn(struct load_control *lc)
|
|||||||
time_t now;
|
time_t now;
|
||||||
|
|
||||||
/* if no load control is enabled, we can safely run this job */
|
/* if no load control is enabled, we can safely run this job */
|
||||||
if (!(lc->options & LOADCTL_ENABLED))
|
if (!(lc->options & LOADCTL_ENABLED)) {
|
||||||
return 1;
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
now = time(NULL);
|
now = time(NULL);
|
||||||
if (lc->last_check + lc->check_interval > now) {
|
if (lc->last_check + lc->check_interval > now) {
|
||||||
|
|
||||||
lc->last_check = now;
|
lc->last_check = now;
|
||||||
|
|
||||||
if (getloadavg(lc->load, 3) < 0)
|
if (getloadavg(lc->load, 3) < 0) {
|
||||||
return lc->jobs_limit > lc->jobs_running;
|
return lc->jobs_limit > lc->jobs_running;
|
||||||
|
}
|
||||||
|
|
||||||
if (lc->load[0] > lc->backoff_limit) {
|
if (lc->load[0] > lc->backoff_limit) {
|
||||||
old = lc->jobs_limit;
|
old = lc->jobs_limit;
|
||||||
lc->jobs_limit -= lc->backoff_change;
|
lc->jobs_limit -= lc->backoff_change;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (lc->load[0] < lc->rampup_limit) {
|
else if (lc->load[0] < lc->rampup_limit) {
|
||||||
old = lc->jobs_limit;
|
old = lc->jobs_limit;
|
||||||
lc->jobs_limit += lc->rampup_change;
|
lc->jobs_limit += lc->rampup_change;
|
||||||
@ -153,6 +187,7 @@ int wproc_can_spawn(struct load_control *lc)
|
|||||||
if (lc->jobs_limit > lc->jobs_max) {
|
if (lc->jobs_limit > lc->jobs_max) {
|
||||||
lc->jobs_limit = lc->jobs_max;
|
lc->jobs_limit = lc->jobs_max;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (lc->jobs_limit < lc->jobs_min) {
|
else if (lc->jobs_limit < lc->jobs_min) {
|
||||||
logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Tried to set jobs_limit to %u, below jobs_min (%u)\n",
|
logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Tried to set jobs_limit to %u, below jobs_min (%u)\n",
|
||||||
lc->jobs_limit, lc->jobs_min);
|
lc->jobs_limit, lc->jobs_min);
|
||||||
@ -184,19 +219,28 @@ static struct wproc_job *get_job(struct wproc_worker *wp, int job_id)
|
|||||||
|
|
||||||
static struct wproc_list *get_wproc_list(const char *cmd)
|
static struct wproc_list *get_wproc_list(const char *cmd)
|
||||||
{
|
{
|
||||||
struct wproc_list *wp_list;
|
struct wproc_list *wp_list = NULL;
|
||||||
char *cmd_name = NULL, *slash = NULL, *space;
|
char *cmd_name = NULL;
|
||||||
|
char *slash = NULL;
|
||||||
|
char *space = NULL;
|
||||||
|
|
||||||
if (!specialized_workers)
|
if (!specialized_workers) {
|
||||||
return &workers;
|
return &workers;
|
||||||
|
}
|
||||||
|
|
||||||
/* first, look for a specialized worker for this command */
|
/* first, look for a specialized worker for this command */
|
||||||
if ((space = strchr(cmd, ' ')) != NULL) {
|
space = strchr(cmd, ' ');
|
||||||
int namelen = (unsigned long)space - (unsigned long)cmd;
|
if (space != NULL) {
|
||||||
|
|
||||||
|
int namelen = (unsigned long) space - (unsigned long) cmd;
|
||||||
|
|
||||||
cmd_name = calloc(1, namelen + 1);
|
cmd_name = calloc(1, namelen + 1);
|
||||||
|
|
||||||
/* not exactly optimal, but what the hells */
|
/* not exactly optimal, but what the hells */
|
||||||
if (!cmd_name)
|
if (!cmd_name) {
|
||||||
return &workers;
|
return &workers;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(cmd_name, cmd, namelen);
|
memcpy(cmd_name, cmd, namelen);
|
||||||
slash = strrchr(cmd_name, '/');
|
slash = strrchr(cmd_name, '/');
|
||||||
}
|
}
|
||||||
@ -208,37 +252,63 @@ static struct wproc_list *get_wproc_list(const char *cmd)
|
|||||||
if (wp_list != NULL) {
|
if (wp_list != NULL) {
|
||||||
log_debug_info(DEBUGL_CHECKS, 1, "Found specialized worker(s) for '%s'", (slash && *slash != '/') ? slash : cmd_name);
|
log_debug_info(DEBUGL_CHECKS, 1, "Found specialized worker(s) for '%s'", (slash && *slash != '/') ? slash : cmd_name);
|
||||||
}
|
}
|
||||||
if (cmd_name)
|
if (cmd_name) {
|
||||||
free(cmd_name);
|
free(cmd_name);
|
||||||
|
}
|
||||||
|
|
||||||
return wp_list ? wp_list : &workers;
|
if (wp_list) {
|
||||||
|
return wp_list;
|
||||||
|
}
|
||||||
|
|
||||||
|
return &workers;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct wproc_worker *get_worker(const char *cmd)
|
static struct wproc_worker *get_worker(const char *cmd)
|
||||||
{
|
{
|
||||||
struct wproc_list *wp_list;
|
struct wproc_list *wp_list = NULL;
|
||||||
|
|
||||||
if (!cmd)
|
log_debug_info(DEBUGL_WORKERS, 0, "get_worker()\n");
|
||||||
|
|
||||||
|
if (!cmd) {
|
||||||
|
log_debug_info(DEBUGL_WORKERS, 1, " * cmd is null, bailing\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
wp_list = get_wproc_list(cmd);
|
wp_list = get_wproc_list(cmd);
|
||||||
if (!wp_list || !wp_list->wps || !wp_list->len)
|
if (!wp_list) {
|
||||||
|
log_debug_info(DEBUGL_WORKERS, 1, " * wp_list is null, bailing\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!wp_list->wps) {
|
||||||
|
log_debug_info(DEBUGL_WORKERS, 1, " * wp_list->wps is null, bailing\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!wp_list->len) {
|
||||||
|
log_debug_info(DEBUGL_WORKERS, 2, " * wp_list->len is <= 0, bailing\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return wp_list->wps[wp_list->idx++ % wp_list->len];
|
return wp_list->wps[wp_list->idx++ % wp_list->len];
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct wproc_job *create_job(int type, void *arg, time_t timeout, const char *cmd)
|
static struct wproc_job *create_job(int type, void *arg, time_t timeout, const char *cmd)
|
||||||
{
|
{
|
||||||
struct wproc_job *job;
|
struct wproc_job *job = NULL;
|
||||||
struct wproc_worker *wp;
|
struct wproc_worker *wp = NULL;
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
log_debug_info(DEBUGL_WORKERS, 0, "create_job()\n");
|
||||||
|
|
||||||
wp = get_worker(cmd);
|
wp = get_worker(cmd);
|
||||||
if (!wp)
|
if (wp == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
job = calloc(1, sizeof(*job));
|
job = calloc(1, sizeof(*job));
|
||||||
if (!job) {
|
if (job == NULL) {
|
||||||
|
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Failed to allocate memory for worker job: %s\n", strerror(errno));
|
logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Failed to allocate memory for worker job: %s\n", strerror(errno));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -248,7 +318,19 @@ static struct wproc_job *create_job(int type, void *arg, time_t timeout, const c
|
|||||||
job->type = type;
|
job->type = type;
|
||||||
job->arg = arg;
|
job->arg = arg;
|
||||||
job->timeout = timeout;
|
job->timeout = timeout;
|
||||||
if (fanout_add(wp->jobs, job->id, job) < 0 || !(job->command = strdup(cmd))) {
|
|
||||||
|
result = fanout_add(wp->jobs, job->id, job);
|
||||||
|
if (result < 0) {
|
||||||
|
|
||||||
|
log_debug_info(DEBUGL_WORKERS, 1, " * Can't add job to wp->jobs, bailing\n");
|
||||||
|
free(job);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
job->command = strdup(cmd);
|
||||||
|
if (job->command == NULL) {
|
||||||
|
|
||||||
|
log_debug_info(DEBUGL_WORKERS, 1, " * job command can't be null, bailing\n");
|
||||||
free(job);
|
free(job);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -260,26 +342,48 @@ static void run_job_callback(struct wproc_job *job, struct wproc_result *wpres,
|
|||||||
{
|
{
|
||||||
wproc_callback_job *cj;
|
wproc_callback_job *cj;
|
||||||
|
|
||||||
if (!job || !job->arg)
|
log_debug_info(DEBUGL_WORKERS, 0, "run_job_callback()\n");
|
||||||
|
|
||||||
|
if (job == NULL) {
|
||||||
|
|
||||||
|
log_debug_info(DEBUGL_WORKERS, 1, " * job is null, bailing\n");
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (job->arg == NULL) {
|
||||||
|
|
||||||
|
log_debug_info(DEBUGL_WORKERS, 1, " * job arg is null, bailing\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
cj = (struct wproc_callback_job *)job->arg;
|
cj = (struct wproc_callback_job *)job->arg;
|
||||||
|
|
||||||
if (!cj->callback)
|
if (cj->callback == NULL) {
|
||||||
|
|
||||||
|
log_debug_info(DEBUGL_WORKERS, 1, " * callback_job callback is null, bailing\n");
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
cj->callback(wpres, cj->data, val);
|
cj->callback(wpres, cj->data, val);
|
||||||
cj->callback = NULL;
|
cj->callback = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void destroy_job(struct wproc_job *job)
|
static void destroy_job(struct wproc_job *job)
|
||||||
{
|
{
|
||||||
if (!job)
|
if (job == NULL) {
|
||||||
|
|
||||||
|
log_debug_info(DEBUGL_WORKERS, 1, " * destroy_job -> job is null, bailing\n");
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_debug_info(DEBUGL_WORKERS, 0, "destroy_job(%d=%s)\n", job->type, wpjob_type_name(job->type));
|
||||||
|
|
||||||
switch (job->type) {
|
switch (job->type) {
|
||||||
case WPJOB_CHECK:
|
case WPJOB_CHECK:
|
||||||
free_check_result(job->arg);
|
free_check_result(job->arg);
|
||||||
free(job->arg);
|
free(job->arg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WPJOB_NOTIFY:
|
case WPJOB_NOTIFY:
|
||||||
case WPJOB_OCSP:
|
case WPJOB_OCSP:
|
||||||
case WPJOB_OCHP:
|
case WPJOB_OCHP:
|
||||||
@ -294,20 +398,25 @@ static void destroy_job(struct wproc_job *job)
|
|||||||
case WPJOB_SVC_PERFDATA:
|
case WPJOB_SVC_PERFDATA:
|
||||||
/* these require nothing special */
|
/* these require nothing special */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WPJOB_CALLBACK:
|
case WPJOB_CALLBACK:
|
||||||
/* call with NULL result to make callback clean things up */
|
/* call with NULL result to make callback clean things up */
|
||||||
run_job_callback(job, NULL, 0);
|
run_job_callback(job, NULL, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
logit(NSLOG_RUNTIME_WARNING, TRUE, "wproc: Unknown job type: %d\n", job->type);
|
logit(NSLOG_RUNTIME_WARNING, TRUE, "wproc: Unknown job type: %d\n", job->type);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
my_free(job->command);
|
my_free(job->command);
|
||||||
if (job->wp) {
|
if (job->wp != NULL) {
|
||||||
|
|
||||||
|
log_debug_info(DEBUGL_WORKERS, 1, " * removing job->wp\n");
|
||||||
fanout_remove(job->wp->jobs, job->id);
|
fanout_remove(job->wp->jobs, job->id);
|
||||||
job->wp->jobs_running--;
|
job->wp->jobs_running--;
|
||||||
}
|
}
|
||||||
|
|
||||||
loadctl.jobs_running--;
|
loadctl.jobs_running--;
|
||||||
|
|
||||||
free(job);
|
free(job);
|
||||||
@ -320,8 +429,10 @@ static void fo_destroy_job(void *job)
|
|||||||
|
|
||||||
static int wproc_is_alive(struct wproc_worker *wp)
|
static int wproc_is_alive(struct wproc_worker *wp)
|
||||||
{
|
{
|
||||||
if (!wp || !wp->pid)
|
if (wp == NULL || wp->pid <= 0) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (kill(wp->pid, 0) == 0 && iobroker_is_registered(nagios_iobs, wp->sd))
|
if (kill(wp->pid, 0) == 0 && iobroker_is_registered(nagios_iobs, wp->sd))
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
@ -329,18 +440,22 @@ static int wproc_is_alive(struct wproc_worker *wp)
|
|||||||
|
|
||||||
static int wproc_destroy(struct wproc_worker *wp, int flags)
|
static int wproc_destroy(struct wproc_worker *wp, int flags)
|
||||||
{
|
{
|
||||||
int i = 0, force = 0, self;
|
int i = 0;
|
||||||
|
int force = 0;
|
||||||
|
int self = 0;
|
||||||
|
|
||||||
if (!wp)
|
if (!wp) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
force = !!(flags & WPROC_FORCE);
|
force = !!(flags & WPROC_FORCE);
|
||||||
|
|
||||||
self = getpid();
|
self = getpid();
|
||||||
|
|
||||||
/* master retains workers through restarts */
|
/* master retains workers through restarts */
|
||||||
if (self == nagios_pid && !force)
|
if (self == nagios_pid && !force) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* free all memory when either forcing or a worker called us */
|
/* free all memory when either forcing or a worker called us */
|
||||||
iocache_destroy(wp->ioc);
|
iocache_destroy(wp->ioc);
|
||||||
@ -350,8 +465,9 @@ static int wproc_destroy(struct wproc_worker *wp, int flags)
|
|||||||
wp->jobs = NULL;
|
wp->jobs = NULL;
|
||||||
|
|
||||||
/* workers must never control other workers, so they return early */
|
/* workers must never control other workers, so they return early */
|
||||||
if (self != nagios_pid)
|
if (self != nagios_pid) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* kill(0, SIGKILL) equals suicide, so we avoid it */
|
/* kill(0, SIGKILL) equals suicide, so we avoid it */
|
||||||
if (wp->pid) {
|
if (wp->pid) {
|
||||||
@ -374,39 +490,54 @@ static int remove_specialized(void *data)
|
|||||||
{
|
{
|
||||||
if (data == to_remove) {
|
if (data == to_remove) {
|
||||||
return DKHASH_WALK_REMOVE;
|
return DKHASH_WALK_REMOVE;
|
||||||
} else if (to_remove == NULL) {
|
}
|
||||||
|
|
||||||
|
else if (to_remove == NULL) {
|
||||||
|
|
||||||
/* remove all specialised workers and their lists */
|
/* remove all specialised workers and their lists */
|
||||||
struct wproc_list *h = data;
|
struct wproc_list *h = data;
|
||||||
int i;
|
int i;
|
||||||
for (i=0;i<h->len;i++) {
|
|
||||||
|
for (i = 0; i < h->len; i++) {
|
||||||
|
|
||||||
/* not sure what WPROC_FORCE is actually for.
|
/* not sure what WPROC_FORCE is actually for.
|
||||||
* Nagios does *not* retain workers across
|
* Nagios does *not* retain workers across
|
||||||
* restarts, as stated in wproc_destroy?
|
* restarts, as stated in wproc_destroy?
|
||||||
*/
|
*/
|
||||||
wproc_destroy(h->wps[i], WPROC_FORCE);
|
wproc_destroy(h->wps[i], WPROC_FORCE);
|
||||||
}
|
}
|
||||||
|
|
||||||
h->len = 0;
|
h->len = 0;
|
||||||
free(h->wps);
|
free(h->wps);
|
||||||
free(h);
|
free(h);
|
||||||
|
|
||||||
return DKHASH_WALK_REMOVE;
|
return DKHASH_WALK_REMOVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* remove worker from job assignment list */
|
/* remove worker from job assignment list */
|
||||||
static void remove_worker(struct wproc_worker *worker)
|
static void remove_worker(struct wproc_worker *worker)
|
||||||
{
|
{
|
||||||
unsigned int i, j = 0;
|
unsigned int i = 0;
|
||||||
|
unsigned int j = 0;
|
||||||
struct wproc_list *wpl = worker->wp_list;
|
struct wproc_list *wpl = worker->wp_list;
|
||||||
|
|
||||||
for (i = 0; i < wpl->len; i++) {
|
for (i = 0; i < wpl->len; i++) {
|
||||||
if (wpl->wps[i] == worker)
|
|
||||||
|
if (wpl->wps[i] == worker) {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
wpl->wps[j++] = wpl->wps[i];
|
wpl->wps[j++] = wpl->wps[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
wpl->len = j;
|
wpl->len = j;
|
||||||
|
|
||||||
if (!specialized_workers || wpl->len)
|
if (specialized_workers == NULL || wpl->len > 0) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
to_remove = wpl;
|
to_remove = wpl;
|
||||||
dkhash_walk_data(specialized_workers, remove_specialized);
|
dkhash_walk_data(specialized_workers, remove_specialized);
|
||||||
@ -438,22 +569,28 @@ void free_worker_memory(int flags)
|
|||||||
to_remove = NULL;
|
to_remove = NULL;
|
||||||
dkhash_walk_data(specialized_workers, remove_specialized);
|
dkhash_walk_data(specialized_workers, remove_specialized);
|
||||||
dkhash_destroy(specialized_workers);
|
dkhash_destroy(specialized_workers);
|
||||||
specialized_workers = NULL; /* Don't leave pointers to freed memory. */
|
|
||||||
|
/* Don't leave pointers to freed memory. */
|
||||||
|
specialized_workers = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int str2timeval(char *str, struct timeval *tv)
|
static int str2timeval(char *str, struct timeval *tv)
|
||||||
{
|
{
|
||||||
char *ptr, *ptr2;
|
char *ptr = NULL;
|
||||||
|
char *ptr2 = NULL;
|
||||||
|
|
||||||
tv->tv_sec = strtoul(str, &ptr, 10);
|
tv->tv_sec = strtoul(str, &ptr, 10);
|
||||||
|
|
||||||
if (ptr == str) {
|
if (ptr == str) {
|
||||||
tv->tv_sec = tv->tv_usec = 0;
|
tv->tv_sec = tv->tv_usec = 0;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*ptr == '.' || *ptr == ',') {
|
if (*ptr == '.' || *ptr == ',') {
|
||||||
ptr2 = ptr + 1;
|
ptr2 = ptr + 1;
|
||||||
tv->tv_usec = strtoul(ptr2, &ptr, 10);
|
tv->tv_usec = strtoul(ptr2, &ptr, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -462,22 +599,25 @@ static int handle_worker_check(wproc_result *wpres, struct wproc_worker *wp, str
|
|||||||
int result = ERROR;
|
int result = ERROR;
|
||||||
check_result *cr = (check_result *)job->arg;
|
check_result *cr = (check_result *)job->arg;
|
||||||
|
|
||||||
memcpy(&cr->rusage, &wpres->rusage, sizeof(wpres->rusage));
|
|
||||||
cr->start_time.tv_sec = wpres->start.tv_sec;
|
cr->start_time.tv_sec = wpres->start.tv_sec;
|
||||||
cr->start_time.tv_usec = wpres->start.tv_usec;
|
cr->start_time.tv_usec = wpres->start.tv_usec;
|
||||||
cr->finish_time.tv_sec = wpres->stop.tv_sec;
|
cr->finish_time.tv_sec = wpres->stop.tv_sec;
|
||||||
cr->finish_time.tv_usec = wpres->stop.tv_usec;
|
cr->finish_time.tv_usec = wpres->stop.tv_usec;
|
||||||
|
|
||||||
if (WIFEXITED(wpres->wait_status)) {
|
if (WIFEXITED(wpres->wait_status)) {
|
||||||
cr->return_code = WEXITSTATUS(wpres->wait_status);
|
cr->return_code = WEXITSTATUS(wpres->wait_status);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
cr->return_code = STATE_UNKNOWN;
|
cr->return_code = STATE_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wpres->outstd && *wpres->outstd) {
|
if (wpres->outstd && *wpres->outstd) {
|
||||||
cr->output = strdup(wpres->outstd);
|
cr->output = strdup(wpres->outstd);
|
||||||
} else if (wpres->outerr) {
|
}
|
||||||
|
else if (wpres->outerr) {
|
||||||
asprintf(&cr->output, "(No output on stdout) stderr: %s", wpres->outerr);
|
asprintf(&cr->output, "(No output on stdout) stderr: %s", wpres->outerr);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
cr->output = NULL;
|
cr->output = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -554,42 +694,6 @@ static int parse_worker_result(wproc_result *wpres, struct kvvec *kvv)
|
|||||||
case WPRES_runtime:
|
case WPRES_runtime:
|
||||||
/* ignored */
|
/* ignored */
|
||||||
break;
|
break;
|
||||||
case WPRES_ru_utime:
|
|
||||||
str2timeval(value, &wpres->rusage.ru_utime);
|
|
||||||
break;
|
|
||||||
case WPRES_ru_stime:
|
|
||||||
str2timeval(value, &wpres->rusage.ru_stime);
|
|
||||||
break;
|
|
||||||
case WPRES_ru_minflt:
|
|
||||||
wpres->rusage.ru_minflt = atoi(value);
|
|
||||||
break;
|
|
||||||
case WPRES_ru_majflt:
|
|
||||||
wpres->rusage.ru_majflt = atoi(value);
|
|
||||||
break;
|
|
||||||
case WPRES_ru_nswap:
|
|
||||||
wpres->rusage.ru_nswap = atoi(value);
|
|
||||||
break;
|
|
||||||
case WPRES_ru_inblock:
|
|
||||||
wpres->rusage.ru_inblock = atoi(value);
|
|
||||||
break;
|
|
||||||
case WPRES_ru_oublock:
|
|
||||||
wpres->rusage.ru_oublock = atoi(value);
|
|
||||||
break;
|
|
||||||
case WPRES_ru_msgsnd:
|
|
||||||
wpres->rusage.ru_msgsnd = atoi(value);
|
|
||||||
break;
|
|
||||||
case WPRES_ru_msgrcv:
|
|
||||||
wpres->rusage.ru_msgrcv = atoi(value);
|
|
||||||
break;
|
|
||||||
case WPRES_ru_nsignals:
|
|
||||||
wpres->rusage.ru_nsignals = atoi(value);
|
|
||||||
break;
|
|
||||||
case WPRES_ru_nvcsw:
|
|
||||||
wpres->rusage.ru_nsignals = atoi(value);
|
|
||||||
break;
|
|
||||||
case WPRES_ru_nivcsw:
|
|
||||||
wpres->rusage.ru_nsignals = atoi(value);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
logit(NSLOG_RUNTIME_WARNING, TRUE, "wproc: Recognized but unhandled result variable: %s=%s\n", key, value);
|
logit(NSLOG_RUNTIME_WARNING, TRUE, "wproc: Recognized but unhandled result variable: %s=%s\n", key, value);
|
||||||
@ -622,8 +726,8 @@ static int handle_worker_result(int sd, int events, void *arg)
|
|||||||
static struct kvvec kvv = KVVEC_INITIALIZER;
|
static struct kvvec kvv = KVVEC_INITIALIZER;
|
||||||
struct wproc_worker *wp = (struct wproc_worker *)arg;
|
struct wproc_worker *wp = (struct wproc_worker *)arg;
|
||||||
|
|
||||||
if(iocache_capacity(wp->ioc) == 0) {
|
if((ret = iocache_capacity(wp->ioc)) < 0) {
|
||||||
logit(NSLOG_RUNTIME_WARNING, TRUE, "wproc: iocache_capacity() is 0 for worker %s.\n", wp->name);
|
logit(NSLOG_RUNTIME_WARNING, TRUE, "wproc: iocache_capacity() is %d for worker %s.\n", ret, wp->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = iocache_read(wp->ioc, wp->sd);
|
ret = iocache_read(wp->ioc, wp->sd);
|
||||||
@ -954,21 +1058,7 @@ static int spawn_core_worker(void)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int get_desired_workers(int desired_workers) {
|
||||||
int init_workers(int desired_workers)
|
|
||||||
{
|
|
||||||
specialized_workers = dkhash_create(512);
|
|
||||||
if (!specialized_workers) {
|
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "wproc: Failed to allocate specialized worker table.\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Register our query handler before launching workers, so other workers
|
|
||||||
* can join us whenever they're ready. */
|
|
||||||
if (!qh_register_handler("wproc", "Worker process management and info", 0, wproc_query_handler))
|
|
||||||
logit(NSLOG_INFO_MESSAGE, TRUE, "wproc: Successfully registered manager as @wproc with query handler\n");
|
|
||||||
else
|
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "wproc: Failed to register manager with query handler\n");
|
|
||||||
|
|
||||||
if (desired_workers <= 0) {
|
if (desired_workers <= 0) {
|
||||||
int cpus = online_cpus(); /* Always at least 1 CPU. */
|
int cpus = online_cpus(); /* Always at least 1 CPU. */
|
||||||
@ -992,6 +1082,28 @@ int init_workers(int desired_workers)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return desired_workers;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if this function is updated, the function rlimit_problem_detection()
|
||||||
|
must be updated as well */
|
||||||
|
int init_workers(int desired_workers)
|
||||||
|
{
|
||||||
|
specialized_workers = dkhash_create(512);
|
||||||
|
if (!specialized_workers) {
|
||||||
|
logit(NSLOG_RUNTIME_ERROR, TRUE, "wproc: Failed to allocate specialized worker table.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Register our query handler before launching workers, so other workers
|
||||||
|
* can join us whenever they're ready. */
|
||||||
|
if (!qh_register_handler("wproc", "Worker process management and info", 0, wproc_query_handler))
|
||||||
|
logit(NSLOG_INFO_MESSAGE, TRUE, "wproc: Successfully registered manager as @wproc with query handler\n");
|
||||||
|
else
|
||||||
|
logit(NSLOG_RUNTIME_ERROR, TRUE, "wproc: Failed to register manager with query handler\n");
|
||||||
|
|
||||||
|
desired_workers = get_desired_workers(desired_workers);
|
||||||
wproc_num_workers_desired = desired_workers;
|
wproc_num_workers_desired = desired_workers;
|
||||||
|
|
||||||
if (workers_alive() == desired_workers)
|
if (workers_alive() == desired_workers)
|
||||||
@ -1001,8 +1113,10 @@ int init_workers(int desired_workers)
|
|||||||
if (desired_workers < (int)workers.len)
|
if (desired_workers < (int)workers.len)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
while (desired_workers-- > 0)
|
while (desired_workers-- > 0) {
|
||||||
spawn_core_worker();
|
int worker_pid = spawn_core_worker();
|
||||||
|
log_debug_info(DEBUGL_WORKERS, 2, "Spawned new worker with pid: (%d)\n", worker_pid);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1015,20 +1129,32 @@ int init_workers(int desired_workers)
|
|||||||
static int wproc_run_job(struct wproc_job *job, nagios_macros *mac)
|
static int wproc_run_job(struct wproc_job *job, nagios_macros *mac)
|
||||||
{
|
{
|
||||||
static struct kvvec kvv = KVVEC_INITIALIZER;
|
static struct kvvec kvv = KVVEC_INITIALIZER;
|
||||||
struct kvvec_buf *kvvb;
|
struct kvvec_buf *kvvb = NULL;
|
||||||
struct kvvec *env_kvvp = NULL;
|
struct kvvec *env_kvvp = NULL;
|
||||||
struct kvvec_buf *env_kvvb = NULL;
|
struct kvvec_buf *env_kvvb = NULL;
|
||||||
struct wproc_worker *wp;
|
struct wproc_worker *wp = NULL;
|
||||||
int ret, result = OK;
|
int ret = OK;
|
||||||
|
int result = OK;
|
||||||
ssize_t written = 0;
|
ssize_t written = 0;
|
||||||
|
|
||||||
if (!job || !job->wp)
|
log_debug_info(DEBUGL_WORKERS, 1, "wproc_run_job()\n");
|
||||||
|
|
||||||
|
if (job == NULL) {
|
||||||
|
log_debug_info(DEBUGL_WORKERS, 1, " * failed because job was null\n");
|
||||||
return ERROR;
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (job->wp == NULL) {
|
||||||
|
log_debug_info(DEBUGL_WORKERS, 1, " * failed because job worker process was null\n");
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
wp = job->wp;
|
wp = job->wp;
|
||||||
|
|
||||||
if (!kvvec_init(&kvv, 4)) /* job_id, type, command and timeout */
|
/* job_id, type, command and timeout */
|
||||||
|
if (!kvvec_init(&kvv, 4)) {
|
||||||
return ERROR;
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
kvvec_addkv(&kvv, "job_id", (char *)mkstr("%d", job->id));
|
kvvec_addkv(&kvv, "job_id", (char *)mkstr("%d", job->id));
|
||||||
kvvec_addkv(&kvv, "type", (char *)mkstr("%d", job->type));
|
kvvec_addkv(&kvv, "type", (char *)mkstr("%d", job->type));
|
||||||
@ -1036,37 +1162,53 @@ static int wproc_run_job(struct wproc_job *job, nagios_macros *mac)
|
|||||||
kvvec_addkv(&kvv, "timeout", (char *)mkstr("%u", job->timeout));
|
kvvec_addkv(&kvv, "timeout", (char *)mkstr("%u", job->timeout));
|
||||||
|
|
||||||
/* Add the macro environment variables */
|
/* Add the macro environment variables */
|
||||||
if(mac) {
|
if (mac != NULL) {
|
||||||
|
|
||||||
env_kvvp = macros_to_kvv(mac);
|
env_kvvp = macros_to_kvv(mac);
|
||||||
if(NULL != env_kvvp) {
|
|
||||||
|
if (env_kvvp != NULL) {
|
||||||
|
|
||||||
env_kvvb = kvvec2buf(env_kvvp, '=', '\n', 0);
|
env_kvvb = kvvec2buf(env_kvvp, '=', '\n', 0);
|
||||||
if(NULL == env_kvvb) {
|
|
||||||
|
if (env_kvvb == NULL) {
|
||||||
kvvec_destroy(env_kvvp, KVVEC_FREE_KEYS);
|
kvvec_destroy(env_kvvp, KVVEC_FREE_KEYS);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
kvvec_addkv_wlen(&kvv, "env", strlen("env"), env_kvvb->buf,
|
/* no reason to call strlen("env")
|
||||||
env_kvvb->buflen);
|
when we know it's 3 characters */
|
||||||
|
kvvec_addkv_wlen(&kvv, "env", 3, env_kvvb->buf, env_kvvb->buflen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
kvvb = build_kvvec_buf(&kvv);
|
kvvb = build_kvvec_buf(&kvv);
|
||||||
|
|
||||||
/* ret = write(wp->sd, kvvb->buf, kvvb->bufsize); */
|
/* ret = write(wp->sd, kvvb->buf, kvvb->bufsize); */
|
||||||
ret = nwrite(wp->sd, kvvb->buf, kvvb->bufsize, &written);
|
ret = nwrite(wp->sd, kvvb->buf, kvvb->bufsize, &written);
|
||||||
if (ret != (int)kvvb->bufsize) {
|
|
||||||
logit(NSLOG_RUNTIME_ERROR, TRUE, "wproc: '%s' seems to be choked. ret = %d; bufsize = %lu: written = %lu; errno = %d (%s)\n",
|
if (ret != (int) kvvb->bufsize) {
|
||||||
wp->name, ret, kvvb->bufsize, written, errno, strerror(errno));
|
|
||||||
|
logit(NSLOG_RUNTIME_ERROR, TRUE,
|
||||||
|
"wproc: '%s' seems to be choked. ret = %d; bufsize = %lu: written = %lu; errno = %d (%s)\n",
|
||||||
|
wp->name, ret, kvvb->bufsize, (long unsigned int) written, errno, strerror(errno));
|
||||||
destroy_job(job);
|
destroy_job(job);
|
||||||
result = ERROR;
|
result = ERROR;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
wp->jobs_running++;
|
wp->jobs_running++;
|
||||||
wp->jobs_started++;
|
wp->jobs_started++;
|
||||||
loadctl.jobs_running++;
|
loadctl.jobs_running++;
|
||||||
}
|
}
|
||||||
if(NULL != env_kvvp) kvvec_destroy(env_kvvp, KVVEC_FREE_KEYS);
|
|
||||||
if(NULL != env_kvvb) {
|
if (env_kvvp != NULL) {
|
||||||
|
kvvec_destroy(env_kvvp, KVVEC_FREE_KEYS);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (env_kvvb != NULL) {
|
||||||
free(env_kvvb->buf);
|
free(env_kvvb->buf);
|
||||||
free(env_kvvb);
|
free(env_kvvb);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(kvvb->buf);
|
free(kvvb->buf);
|
||||||
free(kvvb);
|
free(kvvb);
|
||||||
|
|
||||||
|
@ -15,8 +15,8 @@ exec_prefix=@exec_prefix@
|
|||||||
LOGDIR=@localstatedir@
|
LOGDIR=@localstatedir@
|
||||||
CFGDIR=@sysconfdir@
|
CFGDIR=@sysconfdir@
|
||||||
BINDIR=@bindir@
|
BINDIR=@bindir@
|
||||||
CGIDIR=@sbindir@
|
CGIDIR=@cgibindir@
|
||||||
HTMLDIR=@datarootdir@
|
HTMLDIR=@webdir@
|
||||||
INSTALL=@INSTALL@
|
INSTALL=@INSTALL@
|
||||||
INSTALL_OPTS=@INSTALL_OPTS@
|
INSTALL_OPTS=@INSTALL_OPTS@
|
||||||
COMMAND_OPTS=@COMMAND_OPTS@
|
COMMAND_OPTS=@COMMAND_OPTS@
|
||||||
|
@ -638,7 +638,7 @@ int main(void) {
|
|||||||
reset_cgi_vars();
|
reset_cgi_vars();
|
||||||
|
|
||||||
/* read the CGI configuration file */
|
/* read the CGI configuration file */
|
||||||
result = read_cgi_config_file(get_cgi_config_location());
|
result = read_cgi_config_file(get_cgi_config_location(), NULL);
|
||||||
if(result == ERROR) {
|
if(result == ERROR) {
|
||||||
json_object_append_object(json_root, "result",
|
json_object_append_object(json_root, "result",
|
||||||
json_result(query_time, THISCGI,
|
json_result(query_time, THISCGI,
|
||||||
@ -1083,7 +1083,7 @@ int process_cgivars(json_object *json_root, archive_json_cgi_data *cgi_data,
|
|||||||
|
|
||||||
variables = getcgivars();
|
variables = getcgivars();
|
||||||
|
|
||||||
for(x = 0; variables[x] != NULL; x++) {
|
for(x = 0; variables[x]; x++) {
|
||||||
/* We set these each iteration because they could change with each
|
/* We set these each iteration because they could change with each
|
||||||
iteration */
|
iteration */
|
||||||
|
|
||||||
@ -3291,7 +3291,7 @@ int get_initial_downtime_state(au_linked_list *log_entries, time_t start_time,
|
|||||||
return initial_state;
|
return initial_state;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* If we dont' have a downtime state yet, the first downtime
|
/* If we don't have a downtime state yet, the first downtime
|
||||||
state we encounter will be opposite the initial downtime
|
state we encounter will be opposite the initial downtime
|
||||||
state */
|
state */
|
||||||
if(AU_LOGTYPE_NOTIFICATION == current_log_entry->entry_type) {
|
if(AU_LOGTYPE_NOTIFICATION == current_log_entry->entry_type) {
|
||||||
|
2453
cgi/avail.c
2453
cgi/avail.c
File diff suppressed because it is too large
Load Diff
@ -88,6 +88,7 @@ int service_status_has_been_read = FALSE;
|
|||||||
int program_status_has_been_read = FALSE;
|
int program_status_has_been_read = FALSE;
|
||||||
|
|
||||||
int refresh_rate = DEFAULT_REFRESH_RATE;
|
int refresh_rate = DEFAULT_REFRESH_RATE;
|
||||||
|
int enable_page_tour = TRUE;
|
||||||
int result_limit = 100;
|
int result_limit = 100;
|
||||||
|
|
||||||
int escape_html_tags = FALSE;
|
int escape_html_tags = FALSE;
|
||||||
@ -187,6 +188,8 @@ void reset_cgi_vars(void) {
|
|||||||
|
|
||||||
refresh_rate = DEFAULT_REFRESH_RATE;
|
refresh_rate = DEFAULT_REFRESH_RATE;
|
||||||
|
|
||||||
|
enable_page_tour = TRUE;
|
||||||
|
|
||||||
default_statusmap_layout_method = 0;
|
default_statusmap_layout_method = 0;
|
||||||
default_statusmap_layout_method = 0;
|
default_statusmap_layout_method = 0;
|
||||||
|
|
||||||
@ -268,7 +271,7 @@ const char *get_cmd_file_location(void) {
|
|||||||
|
|
||||||
|
|
||||||
/*read the CGI configuration file */
|
/*read the CGI configuration file */
|
||||||
int read_cgi_config_file(const char *filename) {
|
int read_cgi_config_file(const char *filename, read_config_callback callback) {
|
||||||
char *input = NULL;
|
char *input = NULL;
|
||||||
mmapfile *thefile;
|
mmapfile *thefile;
|
||||||
char *var = NULL;
|
char *var = NULL;
|
||||||
@ -314,6 +317,9 @@ int read_cgi_config_file(const char *filename) {
|
|||||||
else if(!strcmp(var, "refresh_rate"))
|
else if(!strcmp(var, "refresh_rate"))
|
||||||
refresh_rate = atoi(val);
|
refresh_rate = atoi(val);
|
||||||
|
|
||||||
|
else if(!strcmp(var, "enable_page_tour"))
|
||||||
|
enable_page_tour = (atoi(val) > 0) ? TRUE : FALSE;
|
||||||
|
|
||||||
/* page limit added 2/1/2012 -MG */
|
/* page limit added 2/1/2012 -MG */
|
||||||
else if(!strcmp(var, "result_limit"))
|
else if(!strcmp(var, "result_limit"))
|
||||||
result_limit = atoi(val);
|
result_limit = atoi(val);
|
||||||
@ -442,6 +448,8 @@ int read_cgi_config_file(const char *filename) {
|
|||||||
ack_no_send = (atoi(val) > 0) ? TRUE : FALSE;
|
ack_no_send = (atoi(val) > 0) ? TRUE : FALSE;
|
||||||
else if(!strcmp(var, "tac_cgi_hard_only"))
|
else if(!strcmp(var, "tac_cgi_hard_only"))
|
||||||
tac_cgi_hard_only = (atoi(val) > 0) ? TRUE : FALSE;
|
tac_cgi_hard_only = (atoi(val) > 0) ? TRUE : FALSE;
|
||||||
|
else if (callback)
|
||||||
|
(*callback)(var,val);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(p = illegal_output_chars; p && *p; p++)
|
for(p = illegal_output_chars; p && *p; p++)
|
||||||
@ -694,7 +702,7 @@ void cgi_init(void (*doc_header)(int), void (*doc_footer)(void), int object_opti
|
|||||||
init_shared_cfg_vars(1);
|
init_shared_cfg_vars(1);
|
||||||
|
|
||||||
/* read the CGI configuration file */
|
/* read the CGI configuration file */
|
||||||
result = read_cgi_config_file(get_cgi_config_location());
|
result = read_cgi_config_file(get_cgi_config_location(), NULL);
|
||||||
if(result == ERROR) {
|
if(result == ERROR) {
|
||||||
doc_header(FALSE);
|
doc_header(FALSE);
|
||||||
cgi_config_file_error(get_cgi_config_location());
|
cgi_config_file_error(get_cgi_config_location());
|
||||||
|
376
cgi/cmd.c
376
cgi/cmd.c
@ -29,8 +29,6 @@
|
|||||||
#include "../include/cgiauth.h"
|
#include "../include/cgiauth.h"
|
||||||
#include "../include/getcgi.h"
|
#include "../include/getcgi.h"
|
||||||
|
|
||||||
extern const char *extcmd_get_name(int id);
|
|
||||||
|
|
||||||
extern char main_config_file[MAX_FILENAME_LENGTH];
|
extern char main_config_file[MAX_FILENAME_LENGTH];
|
||||||
extern char url_html_path[MAX_FILENAME_LENGTH];
|
extern char url_html_path[MAX_FILENAME_LENGTH];
|
||||||
extern char url_images_path[MAX_FILENAME_LENGTH];
|
extern char url_images_path[MAX_FILENAME_LENGTH];
|
||||||
@ -98,10 +96,12 @@ authdata current_authdata;
|
|||||||
void show_command_help(int);
|
void show_command_help(int);
|
||||||
void request_command_data(int);
|
void request_command_data(int);
|
||||||
void commit_command_data(int);
|
void commit_command_data(int);
|
||||||
|
int print_comment_field(int cmd_id);
|
||||||
int commit_command(int);
|
int commit_command(int);
|
||||||
int write_command_to_file(char *);
|
int write_command_to_file(char *);
|
||||||
void clean_comment_data(char *);
|
void clean_comment_data(char *);
|
||||||
|
|
||||||
|
void cgicfg_callback(const char*, const char*);
|
||||||
void document_header(int);
|
void document_header(int);
|
||||||
void document_footer(void);
|
void document_footer(void);
|
||||||
int process_cgivars(void);
|
int process_cgivars(void);
|
||||||
@ -124,7 +124,7 @@ int main(void) {
|
|||||||
reset_cgi_vars();
|
reset_cgi_vars();
|
||||||
|
|
||||||
/* read the CGI configuration file */
|
/* read the CGI configuration file */
|
||||||
result = read_cgi_config_file(get_cgi_config_location());
|
result = read_cgi_config_file(get_cgi_config_location(), cgicfg_callback);
|
||||||
if(result == ERROR) {
|
if(result == ERROR) {
|
||||||
document_header(FALSE);
|
document_header(FALSE);
|
||||||
if(content_type == WML_CONTENT)
|
if(content_type == WML_CONTENT)
|
||||||
@ -256,6 +256,30 @@ int main(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void cgicfg_callback(const char *var, const char *val)
|
||||||
|
{
|
||||||
|
struct nagios_extcmd *ecmd;
|
||||||
|
const char *cp = val;
|
||||||
|
|
||||||
|
if (strncmp(var, "CMT_", 4))
|
||||||
|
return;
|
||||||
|
|
||||||
|
ecmd = extcmd_get_command_name(&var[4]);
|
||||||
|
if (!ecmd)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!isdigit(*val))
|
||||||
|
return;
|
||||||
|
|
||||||
|
ecmd->cmt_opt = atoi(val);
|
||||||
|
while (isdigit(*cp) || *cp == ',' || *cp == ' ' || *cp == '\t')
|
||||||
|
++cp;
|
||||||
|
if (!*cp)
|
||||||
|
return;
|
||||||
|
ecmd->default_comment = strdup(cp);
|
||||||
|
strip_html_brackets(ecmd->default_comment);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void document_header(int use_stylesheet) {
|
void document_header(int use_stylesheet) {
|
||||||
|
|
||||||
@ -326,7 +350,7 @@ int process_cgivars(void) {
|
|||||||
|
|
||||||
variables = getcgivars();
|
variables = getcgivars();
|
||||||
|
|
||||||
for(x = 0; variables[x] != NULL; x++) {
|
for(x = 0; variables[x]; x++) {
|
||||||
|
|
||||||
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
||||||
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
||||||
@ -1004,12 +1028,7 @@ void request_command_data(int cmd) {
|
|||||||
printf("<tr><td CLASS='optBoxItem'>Persistent%s:</td><td><b>", (cmd == CMD_ACKNOWLEDGE_HOST_PROBLEM) ? " Comment" : "");
|
printf("<tr><td CLASS='optBoxItem'>Persistent%s:</td><td><b>", (cmd == CMD_ACKNOWLEDGE_HOST_PROBLEM) ? " Comment" : "");
|
||||||
printf("<INPUT TYPE='checkbox' NAME='persistent' %s>", (cmd == CMD_ACKNOWLEDGE_HOST_PROBLEM) ? "" : "CHECKED");
|
printf("<INPUT TYPE='checkbox' NAME='persistent' %s>", (cmd == CMD_ACKNOWLEDGE_HOST_PROBLEM) ? "" : "CHECKED");
|
||||||
printf("</b></td></tr>\n");
|
printf("</b></td></tr>\n");
|
||||||
printf("<tr><td CLASS='optBoxRequiredItem'>Author (Your Name):</td><td><b>");
|
print_comment_field(cmd);
|
||||||
printf("<INPUT TYPE='TEXT' NAME='com_author' VALUE='%s' %s>", escape_string(comment_author), (lock_author_names == TRUE) ? "READONLY DISABLED" : "");
|
|
||||||
printf("</b></td></tr>\n");
|
|
||||||
printf("<tr><td CLASS='optBoxRequiredItem'>Comment:</td><td><b>");
|
|
||||||
printf("<INPUT TYPE='TEXT' NAME='com_data' VALUE='%s' SIZE=40>", escape_string(comment_data));
|
|
||||||
printf("</b></td></tr>\n");
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_ADD_SVC_COMMENT:
|
case CMD_ADD_SVC_COMMENT:
|
||||||
@ -1030,12 +1049,7 @@ void request_command_data(int cmd) {
|
|||||||
printf("<tr><td CLASS='optBoxItem'>Persistent%s:</td><td><b>", (cmd == CMD_ACKNOWLEDGE_SVC_PROBLEM) ? " Comment" : "");
|
printf("<tr><td CLASS='optBoxItem'>Persistent%s:</td><td><b>", (cmd == CMD_ACKNOWLEDGE_SVC_PROBLEM) ? " Comment" : "");
|
||||||
printf("<INPUT TYPE='checkbox' NAME='persistent' %s>", (cmd == CMD_ACKNOWLEDGE_SVC_PROBLEM) ? "" : "CHECKED");
|
printf("<INPUT TYPE='checkbox' NAME='persistent' %s>", (cmd == CMD_ACKNOWLEDGE_SVC_PROBLEM) ? "" : "CHECKED");
|
||||||
printf("</b></td></tr>\n");
|
printf("</b></td></tr>\n");
|
||||||
printf("<tr><td CLASS='optBoxRequiredItem'>Author (Your Name):</td><td><b>");
|
print_comment_field(cmd);
|
||||||
printf("<INPUT TYPE='TEXT' NAME='com_author' VALUE='%s' %s>", escape_string(comment_author), (lock_author_names == TRUE) ? "READONLY DISABLED" : "");
|
|
||||||
printf("</b></td></tr>\n");
|
|
||||||
printf("<tr><td CLASS='optBoxRequiredItem'>Comment:</td><td><b>");
|
|
||||||
printf("<INPUT TYPE='TEXT' NAME='com_data' VALUE='%s' SIZE=40>", escape_string(comment_data));
|
|
||||||
printf("</b></td></tr>\n");
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_DEL_HOST_COMMENT:
|
case CMD_DEL_HOST_COMMENT:
|
||||||
@ -1052,6 +1066,7 @@ void request_command_data(int cmd) {
|
|||||||
printf("<tr><td CLASS='optBoxRequiredItem'>Notification Delay (minutes from now):</td><td><b>");
|
printf("<tr><td CLASS='optBoxRequiredItem'>Notification Delay (minutes from now):</td><td><b>");
|
||||||
printf("<INPUT TYPE='TEXT' NAME='not_dly' VALUE='%d'>", notification_delay);
|
printf("<INPUT TYPE='TEXT' NAME='not_dly' VALUE='%d'>", notification_delay);
|
||||||
printf("</b></td></tr>\n");
|
printf("</b></td></tr>\n");
|
||||||
|
print_comment_field(cmd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_DELAY_SVC_NOTIFICATION:
|
case CMD_DELAY_SVC_NOTIFICATION:
|
||||||
@ -1063,6 +1078,7 @@ void request_command_data(int cmd) {
|
|||||||
printf("<tr><td CLASS='optBoxRequiredItem'>Notification Delay (minutes from now):</td><td><b>");
|
printf("<tr><td CLASS='optBoxRequiredItem'>Notification Delay (minutes from now):</td><td><b>");
|
||||||
printf("<INPUT TYPE='TEXT' NAME='not_dly' VALUE='%d'>", notification_delay);
|
printf("<INPUT TYPE='TEXT' NAME='not_dly' VALUE='%d'>", notification_delay);
|
||||||
printf("</b></td></tr>\n");
|
printf("</b></td></tr>\n");
|
||||||
|
print_comment_field(cmd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_SCHEDULE_SVC_CHECK:
|
case CMD_SCHEDULE_SVC_CHECK:
|
||||||
@ -1081,6 +1097,7 @@ void request_command_data(int cmd) {
|
|||||||
printf("<tr><td CLASS='optBoxRequiredItem'>Check Time:</td><td><b>");
|
printf("<tr><td CLASS='optBoxRequiredItem'>Check Time:</td><td><b>");
|
||||||
printf("<INPUT TYPE='TEXT' NAME='start_time' VALUE='%s'>", buffer);
|
printf("<INPUT TYPE='TEXT' NAME='start_time' VALUE='%s'>", buffer);
|
||||||
printf("</b></td></tr>\n");
|
printf("</b></td></tr>\n");
|
||||||
|
print_comment_field(cmd);
|
||||||
printf("<tr><td CLASS='optBoxItem'>Force Check:</td><td><b>");
|
printf("<tr><td CLASS='optBoxItem'>Force Check:</td><td><b>");
|
||||||
printf("<INPUT TYPE='checkbox' NAME='force_check' %s>", (force_check == TRUE) ? "CHECKED" : "");
|
printf("<INPUT TYPE='checkbox' NAME='force_check' %s>", (force_check == TRUE) ? "CHECKED" : "");
|
||||||
printf("</b></td></tr>\n");
|
printf("</b></td></tr>\n");
|
||||||
@ -1107,6 +1124,7 @@ void request_command_data(int cmd) {
|
|||||||
printf("<tr><td CLASS='optBoxRequiredItem'>Service:</td><td><b>");
|
printf("<tr><td CLASS='optBoxRequiredItem'>Service:</td><td><b>");
|
||||||
printf("<INPUT TYPE='TEXT' NAME='service' VALUE='%s'>", escape_string(service_desc));
|
printf("<INPUT TYPE='TEXT' NAME='service' VALUE='%s'>", escape_string(service_desc));
|
||||||
printf("</b></td></tr>\n");
|
printf("</b></td></tr>\n");
|
||||||
|
print_comment_field(cmd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_ENABLE_HOST_SVC_CHECKS:
|
case CMD_ENABLE_HOST_SVC_CHECKS:
|
||||||
@ -1133,6 +1151,7 @@ void request_command_data(int cmd) {
|
|||||||
printf("<tr><td CLASS='optBoxRequiredItem'>Host Name:</td><td><b>");
|
printf("<tr><td CLASS='optBoxRequiredItem'>Host Name:</td><td><b>");
|
||||||
printf("<INPUT TYPE='TEXT' NAME='host' VALUE='%s'>", escape_string(host_name));
|
printf("<INPUT TYPE='TEXT' NAME='host' VALUE='%s'>", escape_string(host_name));
|
||||||
printf("</b></td></tr>\n");
|
printf("</b></td></tr>\n");
|
||||||
|
print_comment_field(cmd);
|
||||||
if(cmd == CMD_ENABLE_HOST_SVC_CHECKS || cmd == CMD_DISABLE_HOST_SVC_CHECKS || cmd == CMD_ENABLE_HOST_SVC_NOTIFICATIONS || cmd == CMD_DISABLE_HOST_SVC_NOTIFICATIONS) {
|
if(cmd == CMD_ENABLE_HOST_SVC_CHECKS || cmd == CMD_DISABLE_HOST_SVC_CHECKS || cmd == CMD_ENABLE_HOST_SVC_NOTIFICATIONS || cmd == CMD_DISABLE_HOST_SVC_NOTIFICATIONS) {
|
||||||
printf("<tr><td CLASS='optBoxItem'>%s For Host Too:</td><td><b>", (cmd == CMD_ENABLE_HOST_SVC_CHECKS || cmd == CMD_ENABLE_HOST_SVC_NOTIFICATIONS) ? "Enable" : "Disable");
|
printf("<tr><td CLASS='optBoxItem'>%s For Host Too:</td><td><b>", (cmd == CMD_ENABLE_HOST_SVC_CHECKS || cmd == CMD_ENABLE_HOST_SVC_NOTIFICATIONS) ? "Enable" : "Disable");
|
||||||
printf("<INPUT TYPE='checkbox' NAME='ahas'>");
|
printf("<INPUT TYPE='checkbox' NAME='ahas'>");
|
||||||
@ -1167,6 +1186,7 @@ void request_command_data(int cmd) {
|
|||||||
case CMD_STOP_ACCEPTING_PASSIVE_HOST_CHECKS:
|
case CMD_STOP_ACCEPTING_PASSIVE_HOST_CHECKS:
|
||||||
case CMD_START_OBSESSING_OVER_HOST_CHECKS:
|
case CMD_START_OBSESSING_OVER_HOST_CHECKS:
|
||||||
case CMD_STOP_OBSESSING_OVER_HOST_CHECKS:
|
case CMD_STOP_OBSESSING_OVER_HOST_CHECKS:
|
||||||
|
if (print_comment_field(cmd) == FALSE)
|
||||||
printf("<tr><td CLASS='optBoxItem' colspan=2>There are no options for this command.<br>Click the 'Commit' button to submit the command.</td></tr>");
|
printf("<tr><td CLASS='optBoxItem' colspan=2>There are no options for this command.<br>Click the 'Commit' button to submit the command.</td></tr>");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1214,12 +1234,7 @@ void request_command_data(int cmd) {
|
|||||||
printf("<tr><td CLASS='optBoxRequiredItem'>Service:</td><td><b>");
|
printf("<tr><td CLASS='optBoxRequiredItem'>Service:</td><td><b>");
|
||||||
printf("<INPUT TYPE='TEXT' NAME='service' VALUE='%s'>", escape_string(service_desc));
|
printf("<INPUT TYPE='TEXT' NAME='service' VALUE='%s'>", escape_string(service_desc));
|
||||||
}
|
}
|
||||||
printf("<tr><td CLASS='optBoxRequiredItem'>Author (Your Name):</td><td><b>");
|
print_comment_field(cmd);
|
||||||
printf("<INPUT TYPE='TEXT' NAME='com_author' VALUE='%s' %s>", escape_string(comment_author), (lock_author_names == TRUE) ? "READONLY DISABLED" : "");
|
|
||||||
printf("</b></td></tr>\n");
|
|
||||||
printf("<tr><td CLASS='optBoxRequiredItem'>Comment:</td><td><b>");
|
|
||||||
printf("<INPUT TYPE='TEXT' NAME='com_data' VALUE='%s' SIZE=40>", escape_string(comment_data));
|
|
||||||
printf("</b></td></tr>\n");
|
|
||||||
|
|
||||||
printf("<tr><td CLASS='optBoxItem'><br></td></tr>\n");
|
printf("<tr><td CLASS='optBoxItem'><br></td></tr>\n");
|
||||||
|
|
||||||
@ -1303,6 +1318,7 @@ void request_command_data(int cmd) {
|
|||||||
printf("<INPUT TYPE='checkbox' NAME='ahas'>");
|
printf("<INPUT TYPE='checkbox' NAME='ahas'>");
|
||||||
printf("</b></td></tr>\n");
|
printf("</b></td></tr>\n");
|
||||||
}
|
}
|
||||||
|
print_comment_field(cmd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS:
|
case CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS:
|
||||||
@ -1319,6 +1335,7 @@ void request_command_data(int cmd) {
|
|||||||
printf("<INPUT TYPE='checkbox' NAME='ahas'>");
|
printf("<INPUT TYPE='checkbox' NAME='ahas'>");
|
||||||
printf("</b></td></tr>\n");
|
printf("</b></td></tr>\n");
|
||||||
}
|
}
|
||||||
|
print_comment_field(cmd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_DEL_HOST_DOWNTIME:
|
case CMD_DEL_HOST_DOWNTIME:
|
||||||
@ -1326,6 +1343,7 @@ void request_command_data(int cmd) {
|
|||||||
printf("<tr><td CLASS='optBoxRequiredItem'>Scheduled Downtime ID:</td><td><b>");
|
printf("<tr><td CLASS='optBoxRequiredItem'>Scheduled Downtime ID:</td><td><b>");
|
||||||
printf("<INPUT TYPE='TEXT' NAME='down_id' VALUE='%lu'>", downtime_id);
|
printf("<INPUT TYPE='TEXT' NAME='down_id' VALUE='%lu'>", downtime_id);
|
||||||
printf("</b></td></tr>\n");
|
printf("</b></td></tr>\n");
|
||||||
|
print_comment_field(cmd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
@ -1344,12 +1362,7 @@ void request_command_data(int cmd) {
|
|||||||
printf("<INPUT TYPE='TEXT' NAME='servicegroup' VALUE='%s'>", escape_string(servicegroup_name));
|
printf("<INPUT TYPE='TEXT' NAME='servicegroup' VALUE='%s'>", escape_string(servicegroup_name));
|
||||||
printf("</b></td></tr>\n");
|
printf("</b></td></tr>\n");
|
||||||
}
|
}
|
||||||
printf("<tr><td CLASS='optBoxRequiredItem'>Author (Your Name):</td><td><b>");
|
print_comment_field(cmd);
|
||||||
printf("<INPUT TYPE='TEXT' NAME='com_author' VALUE='%s' %s>", escape_string(comment_author), (lock_author_names == TRUE) ? "READONLY DISABLED" : "");
|
|
||||||
printf("</b></td></tr>\n");
|
|
||||||
printf("<tr><td CLASS='optBoxRequiredItem'>Comment:</td><td><b>");
|
|
||||||
printf("<INPUT TYPE='TEXT' NAME='com_data' VALUE='%s' SIZE=40>", escape_string(comment_data));
|
|
||||||
printf("</b></td></tr>\n");
|
|
||||||
time(&t);
|
time(&t);
|
||||||
get_time_string(&t, buffer, sizeof(buffer) - 1, SHORT_DATE_TIME);
|
get_time_string(&t, buffer, sizeof(buffer) - 1, SHORT_DATE_TIME);
|
||||||
printf("<tr><td CLASS='optBoxRequiredItem'>Start Time:</td><td><b>");
|
printf("<tr><td CLASS='optBoxRequiredItem'>Start Time:</td><td><b>");
|
||||||
@ -1402,12 +1415,7 @@ void request_command_data(int cmd) {
|
|||||||
printf("<INPUT TYPE='checkbox' NAME='broadcast_notification' ");
|
printf("<INPUT TYPE='checkbox' NAME='broadcast_notification' ");
|
||||||
printf("</b></td></tr>\n");
|
printf("</b></td></tr>\n");
|
||||||
|
|
||||||
printf("<tr><td CLASS='optBoxRequiredItem'>Author (Your Name):</td><td><b>");
|
print_comment_field(cmd);
|
||||||
printf("<INPUT TYPE='TEXT' NAME='com_author' VALUE='%s' %s>", escape_string(comment_author), (lock_author_names == TRUE) ? "READONLY DISABLED" : "");
|
|
||||||
printf("</b></td></tr>\n");
|
|
||||||
printf("<tr><td CLASS='optBoxRequiredItem'>Comment:</td><td><b>");
|
|
||||||
printf("<INPUT TYPE='TEXT' NAME='com_data' VALUE='%s' SIZE=40>", escape_string(comment_data));
|
|
||||||
printf("</b></td></tr>\n");
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -1443,6 +1451,33 @@ void request_command_data(int cmd) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int print_comment_field(int cmd_id)
|
||||||
|
{
|
||||||
|
char *reqtext = "optBoxItem";
|
||||||
|
char *comment = comment_data;
|
||||||
|
struct nagios_extcmd *ecmd = extcmd_get_command_id(cmd_id);
|
||||||
|
|
||||||
|
if (!ecmd || ecmd->cmt_opt == 0)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (ecmd->cmt_opt == 2)
|
||||||
|
reqtext = "optBoxRequiredItem";
|
||||||
|
|
||||||
|
if (!comment || !*comment) {
|
||||||
|
if (ecmd->default_comment)
|
||||||
|
comment = ecmd->default_comment;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("<tr><td CLASS='%s'>Author (Your Name):</td><td><b>", reqtext);
|
||||||
|
printf("<INPUT TYPE='TEXT' NAME='com_author' VALUE='%s' %s>", escape_string(comment_author), (lock_author_names == TRUE) ? "READONLY DISABLED" : "");
|
||||||
|
printf("</b></td></tr>\n");
|
||||||
|
printf("<tr><td CLASS='%s'>Comment:</td><td><b>", reqtext);
|
||||||
|
printf("<INPUT TYPE='TEXT' NAME='com_data' VALUE='%s' SIZE=40>", escape_string(comment));
|
||||||
|
printf("</b></td></tr>\n");
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void commit_command_data(int cmd) {
|
void commit_command_data(int cmd) {
|
||||||
char *error_string = NULL;
|
char *error_string = NULL;
|
||||||
int result = OK;
|
int result = OK;
|
||||||
@ -1454,7 +1489,7 @@ void commit_command_data(int cmd) {
|
|||||||
scheduled_downtime *temp_downtime;
|
scheduled_downtime *temp_downtime;
|
||||||
servicegroup *temp_servicegroup = NULL;
|
servicegroup *temp_servicegroup = NULL;
|
||||||
contact *temp_contact = NULL;
|
contact *temp_contact = NULL;
|
||||||
|
struct nagios_extcmd *ecmd = extcmd_get_command_id(cmd);
|
||||||
|
|
||||||
/* get authentication information */
|
/* get authentication information */
|
||||||
get_authentication_information(¤t_authdata);
|
get_authentication_information(¤t_authdata);
|
||||||
@ -1462,57 +1497,46 @@ void commit_command_data(int cmd) {
|
|||||||
/* get name to use for author */
|
/* get name to use for author */
|
||||||
if(lock_author_names == TRUE) {
|
if(lock_author_names == TRUE) {
|
||||||
temp_contact = find_contact(current_authdata.username);
|
temp_contact = find_contact(current_authdata.username);
|
||||||
if(temp_contact != NULL && temp_contact->alias != NULL)
|
if(temp_contact != NULL && temp_contact->alias != NULL) {
|
||||||
comment_author = temp_contact->alias;
|
comment_author = temp_contact->alias;
|
||||||
else
|
}
|
||||||
|
else {
|
||||||
comment_author = current_authdata.username;
|
comment_author = current_authdata.username;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ecmd->cmt_opt == 2 && *comment_data == '\0') {
|
||||||
|
if(!error_string) {
|
||||||
|
error_string = strdup("Comment was not entered");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
clean_comment_data(comment_data);
|
||||||
|
if (*comment_data != '\0' && *comment_author == '\0') {
|
||||||
|
if(!error_string) {
|
||||||
|
error_string = strdup("Author was not entered");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
clean_comment_data(comment_author);
|
||||||
|
|
||||||
switch(cmd) {
|
switch(cmd) {
|
||||||
case CMD_ADD_HOST_COMMENT:
|
case CMD_ADD_HOST_COMMENT:
|
||||||
case CMD_ACKNOWLEDGE_HOST_PROBLEM:
|
case CMD_ACKNOWLEDGE_HOST_PROBLEM:
|
||||||
|
|
||||||
/* make sure we have author name, and comment data... */
|
|
||||||
if(!strcmp(comment_author, "")) {
|
|
||||||
if(!error_string)
|
|
||||||
error_string = strdup("Author was not entered");
|
|
||||||
}
|
|
||||||
if(!strcmp(comment_data, "")) {
|
|
||||||
if(!error_string)
|
|
||||||
error_string = strdup("Comment was not entered");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* clean up the comment data */
|
|
||||||
clean_comment_data(comment_author);
|
|
||||||
clean_comment_data(comment_data);
|
|
||||||
|
|
||||||
/* see if the user is authorized to issue a command... */
|
/* see if the user is authorized to issue a command... */
|
||||||
temp_host = find_host(host_name);
|
temp_host = find_host(host_name);
|
||||||
if(is_authorized_for_host_commands(temp_host, ¤t_authdata) == TRUE)
|
if(is_authorized_for_host_commands(temp_host, ¤t_authdata) == TRUE) {
|
||||||
authorized = TRUE;
|
authorized = TRUE;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_ADD_SVC_COMMENT:
|
case CMD_ADD_SVC_COMMENT:
|
||||||
case CMD_ACKNOWLEDGE_SVC_PROBLEM:
|
case CMD_ACKNOWLEDGE_SVC_PROBLEM:
|
||||||
|
|
||||||
/* make sure we have author name, and comment data... */
|
|
||||||
if(!strcmp(comment_author, "")) {
|
|
||||||
if(!error_string)
|
|
||||||
error_string = strdup("Author was not entered");
|
|
||||||
}
|
|
||||||
if(!strcmp(comment_data, "")) {
|
|
||||||
if(!error_string)
|
|
||||||
error_string = strdup("Comment was not entered");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* clean up the comment data */
|
|
||||||
clean_comment_data(comment_author);
|
|
||||||
clean_comment_data(comment_data);
|
|
||||||
|
|
||||||
/* see if the user is authorized to issue a command... */
|
/* see if the user is authorized to issue a command... */
|
||||||
temp_service = find_service(host_name, service_desc);
|
temp_service = find_service(host_name, service_desc);
|
||||||
if(is_authorized_for_service_commands(temp_service, ¤t_authdata) == TRUE)
|
if(is_authorized_for_service_commands(temp_service, ¤t_authdata) == TRUE) {
|
||||||
authorized = TRUE;
|
authorized = TRUE;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_DEL_HOST_COMMENT:
|
case CMD_DEL_HOST_COMMENT:
|
||||||
@ -1520,27 +1544,32 @@ void commit_command_data(int cmd) {
|
|||||||
|
|
||||||
/* check the sanity of the comment id */
|
/* check the sanity of the comment id */
|
||||||
if(comment_id == 0) {
|
if(comment_id == 0) {
|
||||||
if(!error_string)
|
if(!error_string) {
|
||||||
error_string = strdup("Comment id cannot be 0");
|
error_string = strdup("Comment id cannot be 0");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* find the comment */
|
/* find the comment */
|
||||||
if(cmd == CMD_DEL_HOST_COMMENT)
|
if(cmd == CMD_DEL_HOST_COMMENT) {
|
||||||
temp_comment = find_host_comment(comment_id);
|
temp_comment = find_host_comment(comment_id);
|
||||||
else
|
}
|
||||||
|
else {
|
||||||
temp_comment = find_service_comment(comment_id);
|
temp_comment = find_service_comment(comment_id);
|
||||||
|
}
|
||||||
|
|
||||||
/* see if the user is authorized to issue a command... */
|
/* see if the user is authorized to issue a command... */
|
||||||
if(cmd == CMD_DEL_HOST_COMMENT && temp_comment != NULL) {
|
if(cmd == CMD_DEL_HOST_COMMENT && temp_comment != NULL) {
|
||||||
temp_host = find_host(temp_comment->host_name);
|
temp_host = find_host(temp_comment->host_name);
|
||||||
if(is_authorized_for_host_commands(temp_host, ¤t_authdata) == TRUE)
|
if(is_authorized_for_host_commands(temp_host, ¤t_authdata) == TRUE) {
|
||||||
authorized = TRUE;
|
authorized = TRUE;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if(cmd == CMD_DEL_SVC_COMMENT && temp_comment != NULL) {
|
if(cmd == CMD_DEL_SVC_COMMENT && temp_comment != NULL) {
|
||||||
temp_service = find_service(temp_comment->host_name, temp_comment->service_description);
|
temp_service = find_service(temp_comment->host_name, temp_comment->service_description);
|
||||||
if(is_authorized_for_service_commands(temp_service, ¤t_authdata) == TRUE)
|
if(is_authorized_for_service_commands(temp_service, ¤t_authdata) == TRUE) {
|
||||||
authorized = TRUE;
|
authorized = TRUE;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* free comment data */
|
/* free comment data */
|
||||||
free_comment_data();
|
free_comment_data();
|
||||||
@ -1552,27 +1581,32 @@ void commit_command_data(int cmd) {
|
|||||||
|
|
||||||
/* check the sanity of the downtime id */
|
/* check the sanity of the downtime id */
|
||||||
if(downtime_id == 0) {
|
if(downtime_id == 0) {
|
||||||
if(!error_string)
|
if(!error_string) {
|
||||||
error_string = strdup("Downtime id cannot be 0");
|
error_string = strdup("Downtime id cannot be 0");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* find the downtime entry */
|
/* find the downtime entry */
|
||||||
if(cmd == CMD_DEL_HOST_DOWNTIME)
|
if(cmd == CMD_DEL_HOST_DOWNTIME) {
|
||||||
temp_downtime = find_host_downtime(downtime_id);
|
temp_downtime = find_host_downtime(downtime_id);
|
||||||
else
|
}
|
||||||
|
else {
|
||||||
temp_downtime = find_service_downtime(downtime_id);
|
temp_downtime = find_service_downtime(downtime_id);
|
||||||
|
}
|
||||||
|
|
||||||
/* see if the user is authorized to issue a command... */
|
/* see if the user is authorized to issue a command... */
|
||||||
if(cmd == CMD_DEL_HOST_DOWNTIME && temp_downtime != NULL) {
|
if(cmd == CMD_DEL_HOST_DOWNTIME && temp_downtime != NULL) {
|
||||||
temp_host = find_host(temp_downtime->host_name);
|
temp_host = find_host(temp_downtime->host_name);
|
||||||
if(is_authorized_for_host_commands(temp_host, ¤t_authdata) == TRUE)
|
if(is_authorized_for_host_commands(temp_host, ¤t_authdata) == TRUE) {
|
||||||
authorized = TRUE;
|
authorized = TRUE;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if(cmd == CMD_DEL_SVC_DOWNTIME && temp_downtime != NULL) {
|
if(cmd == CMD_DEL_SVC_DOWNTIME && temp_downtime != NULL) {
|
||||||
temp_service = find_service(temp_downtime->host_name, temp_downtime->service_description);
|
temp_service = find_service(temp_downtime->host_name, temp_downtime->service_description);
|
||||||
if(is_authorized_for_service_commands(temp_service, ¤t_authdata) == TRUE)
|
if(is_authorized_for_service_commands(temp_service, ¤t_authdata) == TRUE) {
|
||||||
authorized = TRUE;
|
authorized = TRUE;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* free downtime data */
|
/* free downtime data */
|
||||||
free_downtime_data();
|
free_downtime_data();
|
||||||
@ -1599,52 +1633,39 @@ void commit_command_data(int cmd) {
|
|||||||
case CMD_STOP_OBSESSING_OVER_SVC:
|
case CMD_STOP_OBSESSING_OVER_SVC:
|
||||||
case CMD_CLEAR_SVC_FLAPPING_STATE:
|
case CMD_CLEAR_SVC_FLAPPING_STATE:
|
||||||
|
|
||||||
/* make sure we have author name and comment data... */
|
|
||||||
if(cmd == CMD_SCHEDULE_SVC_DOWNTIME) {
|
|
||||||
if(!strcmp(comment_data, "")) {
|
|
||||||
if(!error_string)
|
|
||||||
error_string = strdup("Comment was not entered");
|
|
||||||
}
|
|
||||||
else if(!strcmp(comment_author, "")) {
|
|
||||||
if(!error_string)
|
|
||||||
error_string = strdup("Author was not entered");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* see if the user is authorized to issue a command... */
|
/* see if the user is authorized to issue a command... */
|
||||||
temp_service = find_service(host_name, service_desc);
|
temp_service = find_service(host_name, service_desc);
|
||||||
if(is_authorized_for_service_commands(temp_service, ¤t_authdata) == TRUE)
|
if(is_authorized_for_service_commands(temp_service, ¤t_authdata) == TRUE) {
|
||||||
authorized = TRUE;
|
authorized = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* make sure we have passive check info (if necessary) */
|
/* make sure we have passive check info (if necessary) */
|
||||||
if(cmd == CMD_PROCESS_SERVICE_CHECK_RESULT && !strcmp(plugin_output, "")) {
|
if(cmd == CMD_PROCESS_SERVICE_CHECK_RESULT && !strcmp(plugin_output, "")) {
|
||||||
if(!error_string)
|
if(!error_string) {
|
||||||
error_string = strdup("Plugin output cannot be blank");
|
error_string = strdup("Plugin output cannot be blank");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* make sure we have a notification delay (if necessary) */
|
/* make sure we have a notification delay (if necessary) */
|
||||||
if(cmd == CMD_DELAY_SVC_NOTIFICATION && notification_delay <= 0) {
|
if(cmd == CMD_DELAY_SVC_NOTIFICATION && notification_delay <= 0) {
|
||||||
if(!error_string)
|
if(!error_string) {
|
||||||
error_string = strdup("Notification delay must be greater than 0");
|
error_string = strdup("Notification delay must be greater than 0");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* clean up the comment data if scheduling downtime */
|
|
||||||
if(cmd == CMD_SCHEDULE_SVC_DOWNTIME) {
|
|
||||||
clean_comment_data(comment_author);
|
|
||||||
clean_comment_data(comment_data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* make sure we have check time (if necessary) */
|
/* make sure we have check time (if necessary) */
|
||||||
if(cmd == CMD_SCHEDULE_SVC_CHECK && start_time == (time_t)0) {
|
if(cmd == CMD_SCHEDULE_SVC_CHECK && start_time == (time_t)0) {
|
||||||
if(!error_string)
|
if(!error_string) {
|
||||||
error_string = strdup("Start time must be non-zero or bad format has been submitted.");
|
error_string = strdup("Start time must be non-zero or bad format has been submitted.");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* make sure we have start/end times for downtime (if necessary) */
|
/* make sure we have start/end times for downtime (if necessary) */
|
||||||
if(cmd == CMD_SCHEDULE_SVC_DOWNTIME && (start_time == (time_t)0 || end_time == (time_t)0 || end_time < start_time)) {
|
if(cmd == CMD_SCHEDULE_SVC_DOWNTIME && (start_time == (time_t)0 || end_time == (time_t)0 || end_time < start_time)) {
|
||||||
if(!error_string)
|
if(!error_string) {
|
||||||
error_string = strdup("Start or end time not valid");
|
error_string = strdup("Start or end time not valid");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1672,8 +1693,9 @@ void commit_command_data(int cmd) {
|
|||||||
case CMD_STOP_OBSESSING_OVER_HOST_CHECKS:
|
case CMD_STOP_OBSESSING_OVER_HOST_CHECKS:
|
||||||
|
|
||||||
/* see if the user is authorized to issue a command... */
|
/* see if the user is authorized to issue a command... */
|
||||||
if(is_authorized_for_system_commands(¤t_authdata) == TRUE)
|
if(is_authorized_for_system_commands(¤t_authdata) == TRUE) {
|
||||||
authorized = TRUE;
|
authorized = TRUE;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_ENABLE_HOST_SVC_CHECKS:
|
case CMD_ENABLE_HOST_SVC_CHECKS:
|
||||||
@ -1704,52 +1726,39 @@ void commit_command_data(int cmd) {
|
|||||||
case CMD_STOP_OBSESSING_OVER_HOST:
|
case CMD_STOP_OBSESSING_OVER_HOST:
|
||||||
case CMD_CLEAR_HOST_FLAPPING_STATE:
|
case CMD_CLEAR_HOST_FLAPPING_STATE:
|
||||||
|
|
||||||
/* make sure we have author name and comment data... */
|
|
||||||
if(cmd == CMD_SCHEDULE_HOST_DOWNTIME || cmd == CMD_SCHEDULE_HOST_SVC_DOWNTIME) {
|
|
||||||
if(!strcmp(comment_data, "")) {
|
|
||||||
if(!error_string)
|
|
||||||
error_string = strdup("Comment was not entered");
|
|
||||||
}
|
|
||||||
else if(!strcmp(comment_author, "")) {
|
|
||||||
if(!error_string)
|
|
||||||
error_string = strdup("Author was not entered");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* see if the user is authorized to issue a command... */
|
/* see if the user is authorized to issue a command... */
|
||||||
temp_host = find_host(host_name);
|
temp_host = find_host(host_name);
|
||||||
if(is_authorized_for_host_commands(temp_host, ¤t_authdata) == TRUE)
|
if(is_authorized_for_host_commands(temp_host, ¤t_authdata) == TRUE) {
|
||||||
authorized = TRUE;
|
authorized = TRUE;
|
||||||
|
|
||||||
/* clean up the comment data if scheduling downtime */
|
|
||||||
if(cmd == CMD_SCHEDULE_HOST_DOWNTIME || cmd == CMD_SCHEDULE_HOST_SVC_DOWNTIME) {
|
|
||||||
clean_comment_data(comment_author);
|
|
||||||
clean_comment_data(comment_data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* make sure we have a notification delay (if necessary) */
|
/* make sure we have a notification delay (if necessary) */
|
||||||
if(cmd == CMD_DELAY_HOST_NOTIFICATION && notification_delay <= 0) {
|
if(cmd == CMD_DELAY_HOST_NOTIFICATION && notification_delay <= 0) {
|
||||||
if(!error_string)
|
if(!error_string) {
|
||||||
error_string = strdup("Notification delay must be greater than 0");
|
error_string = strdup("Notification delay must be greater than 0");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* make sure we have start/end times for downtime (if necessary) */
|
/* make sure we have start/end times for downtime (if necessary) */
|
||||||
if((cmd == CMD_SCHEDULE_HOST_DOWNTIME || cmd == CMD_SCHEDULE_HOST_SVC_DOWNTIME) && (start_time == (time_t)0 || end_time == (time_t)0 || start_time > end_time)) {
|
if((cmd == CMD_SCHEDULE_HOST_DOWNTIME || cmd == CMD_SCHEDULE_HOST_SVC_DOWNTIME) && (start_time == (time_t)0 || end_time == (time_t)0 || start_time > end_time)) {
|
||||||
if(!error_string)
|
if(!error_string) {
|
||||||
error_string = strdup("Start or end time not valid");
|
error_string = strdup("Start or end time not valid");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* make sure we have check time (if necessary) */
|
/* make sure we have check time (if necessary) */
|
||||||
if((cmd == CMD_SCHEDULE_HOST_CHECK || cmd == CMD_SCHEDULE_HOST_SVC_CHECKS) && start_time == (time_t)0) {
|
if((cmd == CMD_SCHEDULE_HOST_CHECK || cmd == CMD_SCHEDULE_HOST_SVC_CHECKS) && start_time == (time_t)0) {
|
||||||
if(!error_string)
|
if(!error_string) {
|
||||||
error_string = strdup("Start time must be non-zero or bad format has been submitted.");
|
error_string = strdup("Start time must be non-zero or bad format has been submitted.");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* make sure we have passive check info (if necessary) */
|
/* make sure we have passive check info (if necessary) */
|
||||||
if(cmd == CMD_PROCESS_HOST_CHECK_RESULT && !strcmp(plugin_output, "")) {
|
if(cmd == CMD_PROCESS_HOST_CHECK_RESULT && !strcmp(plugin_output, "")) {
|
||||||
if(!error_string)
|
if(!error_string) {
|
||||||
error_string = strdup("Plugin output cannot be blank");
|
error_string = strdup("Plugin output cannot be blank");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1762,33 +1771,17 @@ void commit_command_data(int cmd) {
|
|||||||
case CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME:
|
case CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME:
|
||||||
case CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME:
|
case CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME:
|
||||||
|
|
||||||
/* make sure we have author and comment data */
|
|
||||||
if(cmd == CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME || cmd == CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME) {
|
|
||||||
if(!strcmp(comment_data, "")) {
|
|
||||||
if(!error_string)
|
|
||||||
error_string = strdup("Comment was not entered");
|
|
||||||
}
|
|
||||||
else if(!strcmp(comment_author, "")) {
|
|
||||||
if(!error_string)
|
|
||||||
error_string = strdup("Author was not entered");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* make sure we have start/end times for downtime */
|
/* make sure we have start/end times for downtime */
|
||||||
if((cmd == CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME || cmd == CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME) && (start_time == (time_t)0 || end_time == (time_t)0 || start_time > end_time)) {
|
if((cmd == CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME || cmd == CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME) && (start_time == (time_t)0 || end_time == (time_t)0 || start_time > end_time)) {
|
||||||
if(!error_string)
|
if(!error_string) {
|
||||||
error_string = strdup("Start or end time not valid");
|
error_string = strdup("Start or end time not valid");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* see if the user is authorized to issue a command... */
|
/* see if the user is authorized to issue a command... */
|
||||||
temp_hostgroup = find_hostgroup(hostgroup_name);
|
temp_hostgroup = find_hostgroup(hostgroup_name);
|
||||||
if(is_authorized_for_hostgroup_commands(temp_hostgroup, ¤t_authdata) == TRUE)
|
if(is_authorized_for_hostgroup_commands(temp_hostgroup, ¤t_authdata) == TRUE) {
|
||||||
authorized = TRUE;
|
authorized = TRUE;
|
||||||
|
|
||||||
/* clean up the comment data if scheduling downtime */
|
|
||||||
if(cmd == CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME || cmd == CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME) {
|
|
||||||
clean_comment_data(comment_author);
|
|
||||||
clean_comment_data(comment_data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -1802,67 +1795,52 @@ void commit_command_data(int cmd) {
|
|||||||
case CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME:
|
case CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME:
|
||||||
case CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME:
|
case CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME:
|
||||||
|
|
||||||
/* make sure we have author and comment data */
|
|
||||||
if(cmd == CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME || cmd == CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME) {
|
|
||||||
if(!strcmp(comment_data, "")) {
|
|
||||||
if(!error_string)
|
|
||||||
error_string = strdup("Comment was not entered");
|
|
||||||
}
|
|
||||||
else if(!strcmp(comment_author, "")) {
|
|
||||||
if(!error_string)
|
|
||||||
error_string = strdup("Author was not entered");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* make sure we have start/end times for downtime */
|
/* make sure we have start/end times for downtime */
|
||||||
if((cmd == CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME || cmd == CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME) && (start_time == (time_t)0 || end_time == (time_t)0 || start_time > end_time)) {
|
if((cmd == CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME || cmd == CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME) && (start_time == (time_t)0 || end_time == (time_t)0 || start_time > end_time)) {
|
||||||
if(!error_string)
|
if(!error_string) {
|
||||||
error_string = strdup("Start or end time not valid");
|
error_string = strdup("Start or end time not valid");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* see if the user is authorized to issue a command... */
|
/* see if the user is authorized to issue a command... */
|
||||||
|
|
||||||
temp_servicegroup = find_servicegroup(servicegroup_name);
|
temp_servicegroup = find_servicegroup(servicegroup_name);
|
||||||
if(is_authorized_for_servicegroup_commands(temp_servicegroup, ¤t_authdata) == TRUE)
|
if(is_authorized_for_servicegroup_commands(temp_servicegroup, ¤t_authdata) == TRUE) {
|
||||||
authorized = TRUE;
|
authorized = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_SEND_CUSTOM_HOST_NOTIFICATION:
|
case CMD_SEND_CUSTOM_HOST_NOTIFICATION:
|
||||||
case CMD_SEND_CUSTOM_SVC_NOTIFICATION:
|
case CMD_SEND_CUSTOM_SVC_NOTIFICATION:
|
||||||
|
|
||||||
/* make sure we have author and comment data */
|
|
||||||
if(!strcmp(comment_data, "")) {
|
|
||||||
if(!error_string)
|
|
||||||
error_string = strdup("Comment was not entered");
|
|
||||||
}
|
|
||||||
else if(!strcmp(comment_author, "")) {
|
|
||||||
if(!error_string)
|
|
||||||
error_string = strdup("Author was not entered");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* see if the user is authorized to issue a command... */
|
/* see if the user is authorized to issue a command... */
|
||||||
if(cmd == CMD_SEND_CUSTOM_HOST_NOTIFICATION) {
|
if(cmd == CMD_SEND_CUSTOM_HOST_NOTIFICATION) {
|
||||||
temp_host = find_host(host_name);
|
temp_host = find_host(host_name);
|
||||||
if(is_authorized_for_host_commands(temp_host, ¤t_authdata) == TRUE)
|
if(is_authorized_for_host_commands(temp_host, ¤t_authdata) == TRUE) {
|
||||||
authorized = TRUE;
|
authorized = TRUE;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
temp_service = find_service(host_name, service_desc);
|
temp_service = find_service(host_name, service_desc);
|
||||||
if(is_authorized_for_service_commands(temp_service, ¤t_authdata) == TRUE)
|
if(is_authorized_for_service_commands(temp_service, ¤t_authdata) == TRUE) {
|
||||||
authorized = TRUE;
|
authorized = TRUE;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if(!error_string) error_string = strdup("An error occurred while processing your command!");
|
if(!error_string) {
|
||||||
|
error_string = strdup("An error occurred while processing your command!");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* to be safe, we are going to REQUIRE that the authentication functionality is enabled... */
|
/* to be safe, we are going to REQUIRE that the authentication functionality is enabled... */
|
||||||
if(use_authentication == FALSE) {
|
if(use_authentication == FALSE) {
|
||||||
if(content_type == WML_CONTENT)
|
if(content_type == WML_CONTENT) {
|
||||||
printf("<p>Error: Authentication is not enabled!</p>\n");
|
printf("<p>Error: Authentication is not enabled!</p>\n");
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
printf("<P>\n");
|
printf("<P>\n");
|
||||||
printf("<DIV CLASS='errorMessage'>Sorry Dave, I can't let you do that...</DIV><br>");
|
printf("<DIV CLASS='errorMessage'>Sorry Dave, I can't let you do that...</DIV><br>");
|
||||||
@ -1878,8 +1856,9 @@ void commit_command_data(int cmd) {
|
|||||||
|
|
||||||
/* the user is not authorized to issue the given command */
|
/* the user is not authorized to issue the given command */
|
||||||
else if(authorized == FALSE) {
|
else if(authorized == FALSE) {
|
||||||
if(content_type == WML_CONTENT)
|
if(content_type == WML_CONTENT) {
|
||||||
printf("<p>Error: You're not authorized to commit that command!</p>\n");
|
printf("<p>Error: You're not authorized to commit that command!</p>\n");
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
printf("<P><DIV CLASS='errorMessage'>Sorry, but you are not authorized to commit the specified command.</DIV></P>\n");
|
printf("<P><DIV CLASS='errorMessage'>Sorry, but you are not authorized to commit the specified command.</DIV></P>\n");
|
||||||
printf("<P><DIV CLASS='errorDescription'>Read the section of the documentation that deals with authentication and authorization in the CGIs for more information.<BR><BR>\n");
|
printf("<P><DIV CLASS='errorDescription'>Read the section of the documentation that deals with authentication and authorization in the CGIs for more information.<BR><BR>\n");
|
||||||
@ -1889,11 +1868,11 @@ void commit_command_data(int cmd) {
|
|||||||
|
|
||||||
/* some error occurred (data was probably missing) */
|
/* some error occurred (data was probably missing) */
|
||||||
else if(error_string) {
|
else if(error_string) {
|
||||||
if(content_type == WML_CONTENT)
|
if(content_type == WML_CONTENT) {
|
||||||
printf("<p>%s</p>\n", error_string);
|
printf("<p>%s</p>\n", error_string);
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
printf("<P><DIV CLASS='errorMessage'>%s</DIV></P>\n", error_string);
|
printf("<P><DIV CLASS='errorMessage'>%s</DIV></P>\n", error_string);
|
||||||
free(error_string);
|
|
||||||
printf("<P><DIV CLASS='errorDescription'>Go <A HREF='javascript:window.history.go(-1)'>back</A> and verify that you entered all required information correctly.<BR>\n");
|
printf("<P><DIV CLASS='errorDescription'>Go <A HREF='javascript:window.history.go(-1)'>back</A> and verify that you entered all required information correctly.<BR>\n");
|
||||||
printf("<A HREF='javascript:window.history.go(-2)'>Return from whence you came</A></DIV></P>\n");
|
printf("<A HREF='javascript:window.history.go(-2)'>Return from whence you came</A></DIV></P>\n");
|
||||||
}
|
}
|
||||||
@ -1901,8 +1880,9 @@ void commit_command_data(int cmd) {
|
|||||||
|
|
||||||
/* if Nagios isn't checking external commands, don't do anything... */
|
/* if Nagios isn't checking external commands, don't do anything... */
|
||||||
else if(check_external_commands == FALSE) {
|
else if(check_external_commands == FALSE) {
|
||||||
if(content_type == WML_CONTENT)
|
if(content_type == WML_CONTENT) {
|
||||||
printf("<p>Error: Nagios is not checking external commands!</p>\n");
|
printf("<p>Error: Nagios is not checking external commands!</p>\n");
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
printf("<P><DIV CLASS='errorMessage'>Sorry, but Nagios is currently not checking for external commands, so your command will not be committed!</DIV></P>\n");
|
printf("<P><DIV CLASS='errorMessage'>Sorry, but Nagios is currently not checking for external commands, so your command will not be committed!</DIV></P>\n");
|
||||||
printf("<P><DIV CLASS='errorDescription'>Read the documentation for information on how to enable external commands...<BR><BR>\n");
|
printf("<P><DIV CLASS='errorDescription'>Read the documentation for information on how to enable external commands...<BR><BR>\n");
|
||||||
@ -1917,8 +1897,9 @@ void commit_command_data(int cmd) {
|
|||||||
result = commit_command(cmd);
|
result = commit_command(cmd);
|
||||||
|
|
||||||
if(result == OK) {
|
if(result == OK) {
|
||||||
if(content_type == WML_CONTENT)
|
if(content_type == WML_CONTENT) {
|
||||||
printf("<p>Your command was submitted successfully...</p>\n");
|
printf("<p>Your command was submitted successfully...</p>\n");
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
printf("<P><DIV CLASS='infoMessage'>Your command request was successfully submitted to Nagios for processing.<BR><BR>\n");
|
printf("<P><DIV CLASS='infoMessage'>Your command request was successfully submitted to Nagios for processing.<BR><BR>\n");
|
||||||
printf("Note: It may take a while before the command is actually processed.<BR><BR>\n");
|
printf("Note: It may take a while before the command is actually processed.<BR><BR>\n");
|
||||||
@ -1926,8 +1907,9 @@ void commit_command_data(int cmd) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(content_type == WML_CONTENT)
|
if(content_type == WML_CONTENT) {
|
||||||
printf("<p>An error occurred while committing your command!</p>\n");
|
printf("<p>An error occurred while committing your command!</p>\n");
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
printf("<P><DIV CLASS='errorMessage'>An error occurred while attempting to commit your command for processing.<BR><BR>\n");
|
printf("<P><DIV CLASS='errorMessage'>An error occurred while attempting to commit your command for processing.<BR><BR>\n");
|
||||||
printf("<A HREF='javascript:window.history.go(-2)'>Return from whence you came</A></DIV></P>\n");
|
printf("<A HREF='javascript:window.history.go(-2)'>Return from whence you came</A></DIV></P>\n");
|
||||||
@ -1935,8 +1917,8 @@ void commit_command_data(int cmd) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
my_free(error_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((format(printf, 2, 3)))
|
__attribute__((format(printf, 2, 3)))
|
||||||
static int cmd_submitf(int id, const char *fmt, ...) {
|
static int cmd_submitf(int id, const char *fmt, ...) {
|
||||||
@ -1968,6 +1950,13 @@ static int cmd_submitf(int id, const char *fmt, ...) {
|
|||||||
return ERROR;
|
return ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (*comment_data != '\0') {
|
||||||
|
len2 = snprintf(cmd + len, sizeof(cmd) - len, ";%s;%s", comment_author, comment_data);
|
||||||
|
len += len2;
|
||||||
|
if(len2 < 0 || len >= sizeof(cmd))
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
cmd[len] = 0; /* 0 <= len < sizeof(cmd) */
|
cmd[len] = 0; /* 0 <= len < sizeof(cmd) */
|
||||||
return write_command_to_file(cmd);
|
return write_command_to_file(cmd);
|
||||||
}
|
}
|
||||||
@ -2070,11 +2059,11 @@ int commit_command(int cmd) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_ADD_HOST_COMMENT:
|
case CMD_ADD_HOST_COMMENT:
|
||||||
result = cmd_submitf(cmd, "%s;%d;%s;%s", host_name, persistent_comment, comment_author, comment_data);
|
result = cmd_submitf(cmd, "%s;%d", host_name, persistent_comment);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_ADD_SVC_COMMENT:
|
case CMD_ADD_SVC_COMMENT:
|
||||||
result = cmd_submitf(cmd, "%s;%s;%d;%s;%s", host_name, service_desc, persistent_comment, comment_author, comment_data);
|
result = cmd_submitf(cmd, "%s;%s;%d", host_name, service_desc, persistent_comment);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_DEL_HOST_COMMENT:
|
case CMD_DEL_HOST_COMMENT:
|
||||||
@ -2136,11 +2125,11 @@ int commit_command(int cmd) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_ACKNOWLEDGE_HOST_PROBLEM:
|
case CMD_ACKNOWLEDGE_HOST_PROBLEM:
|
||||||
result = cmd_submitf(cmd, "%s;%d;%d;%d;%s;%s", host_name, (sticky_ack == TRUE) ? ACKNOWLEDGEMENT_STICKY : ACKNOWLEDGEMENT_NORMAL, send_notification, persistent_comment, comment_author, comment_data);
|
result = cmd_submitf(cmd, "%s;%d;%d;%d", host_name, (sticky_ack == TRUE) ? ACKNOWLEDGEMENT_STICKY : ACKNOWLEDGEMENT_NORMAL, send_notification, persistent_comment);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_ACKNOWLEDGE_SVC_PROBLEM:
|
case CMD_ACKNOWLEDGE_SVC_PROBLEM:
|
||||||
result = cmd_submitf(cmd, "%s;%s;%d;%d;%d;%s;%s", host_name, service_desc, (sticky_ack == TRUE) ? ACKNOWLEDGEMENT_STICKY : ACKNOWLEDGEMENT_NORMAL, send_notification, persistent_comment, comment_author, comment_data);
|
result = cmd_submitf(cmd, "%s;%s;%d;%d;%d", host_name, service_desc, (sticky_ack == TRUE) ? ACKNOWLEDGEMENT_STICKY : ACKNOWLEDGEMENT_NORMAL, send_notification, persistent_comment);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_PROCESS_SERVICE_CHECK_RESULT:
|
case CMD_PROCESS_SERVICE_CHECK_RESULT:
|
||||||
@ -2157,15 +2146,15 @@ int commit_command(int cmd) {
|
|||||||
else if(child_options == 2)
|
else if(child_options == 2)
|
||||||
cmd = CMD_SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME;
|
cmd = CMD_SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME;
|
||||||
|
|
||||||
result = cmd_submitf(cmd, "%s;%lu;%lu;%d;%lu;%lu;%s;%s", host_name, start_time, end_time, fixed, triggered_by, duration, comment_author, comment_data);
|
result = cmd_submitf(cmd, "%s;%lu;%lu;%d;%lu;%lu", host_name, start_time, end_time, fixed, triggered_by, duration);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_SCHEDULE_HOST_SVC_DOWNTIME:
|
case CMD_SCHEDULE_HOST_SVC_DOWNTIME:
|
||||||
result = cmd_submitf(cmd, "%s;%lu;%lu;%d;%lu;%lu;%s;%s", host_name, start_time, end_time, fixed, triggered_by, duration, comment_author, comment_data);
|
result = cmd_submitf(cmd, "%s;%lu;%lu;%d;%lu;%lu", host_name, start_time, end_time, fixed, triggered_by, duration);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_SCHEDULE_SVC_DOWNTIME:
|
case CMD_SCHEDULE_SVC_DOWNTIME:
|
||||||
result = cmd_submitf(cmd, "%s;%s;%lu;%lu;%d;%lu;%lu;%s;%s", host_name, service_desc, start_time, end_time, fixed, triggered_by, duration, comment_author, comment_data);
|
result = cmd_submitf(cmd, "%s;%s;%lu;%lu;%d;%lu;%lu", host_name, service_desc, start_time, end_time, fixed, triggered_by, duration);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_DEL_HOST_DOWNTIME:
|
case CMD_DEL_HOST_DOWNTIME:
|
||||||
@ -2180,11 +2169,11 @@ int commit_command(int cmd) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_SEND_CUSTOM_HOST_NOTIFICATION:
|
case CMD_SEND_CUSTOM_HOST_NOTIFICATION:
|
||||||
result = cmd_submitf(cmd, "%s;%d;%s;%s", host_name, (force_notification | broadcast_notification), comment_author, comment_data);
|
result = cmd_submitf(cmd, "%s;%d", host_name, (force_notification | broadcast_notification));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_SEND_CUSTOM_SVC_NOTIFICATION:
|
case CMD_SEND_CUSTOM_SVC_NOTIFICATION:
|
||||||
result = cmd_submitf(cmd, "%s;%s;%d;%s;%s", host_name, service_desc, (force_notification | broadcast_notification), comment_author, comment_data);
|
result = cmd_submitf(cmd, "%s;%s;%d", host_name, service_desc, (force_notification | broadcast_notification));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
@ -2214,13 +2203,13 @@ int commit_command(int cmd) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME:
|
case CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME:
|
||||||
result = cmd_submitf(cmd, "%s;%lu;%lu;%d;0;%lu;%s;%s", hostgroup_name, start_time, end_time, fixed, duration, comment_author, comment_data);
|
result = cmd_submitf(cmd, "%s;%lu;%lu;%d;0;%lu", hostgroup_name, start_time, end_time, fixed, duration);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME:
|
case CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME:
|
||||||
result = cmd_submitf(cmd, "%s;%lu;%lu;%d;0;%lu;%s;%s", hostgroup_name, start_time, end_time, fixed, duration, comment_author, comment_data);
|
result = cmd_submitf(cmd, "%s;%lu;%lu;%d;0;%lu", hostgroup_name, start_time, end_time, fixed, duration);
|
||||||
if(affect_host_and_services == TRUE)
|
if(affect_host_and_services == TRUE)
|
||||||
result |= cmd_submitf(CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME, "%s;%lu;%lu;%d;0;%lu;%s;%s", hostgroup_name, start_time, end_time, fixed, duration, comment_author, comment_data);
|
result |= cmd_submitf(CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME, "%s;%lu;%lu;%d;0;%lu", hostgroup_name, start_time, end_time, fixed, duration);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
@ -2250,13 +2239,13 @@ int commit_command(int cmd) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME:
|
case CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME:
|
||||||
result = cmd_submitf(cmd, "%s;%lu;%lu;%d;0;%lu;%s;%s", servicegroup_name, start_time, end_time, fixed, duration, comment_author, comment_data);
|
result = cmd_submitf(cmd, "%s;%lu;%lu;%d;0;%lu", servicegroup_name, start_time, end_time, fixed, duration);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME:
|
case CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME:
|
||||||
result = cmd_submitf(cmd, "%s;%lu;%lu;%d;0;%lu;%s;%s", servicegroup_name, start_time, end_time, fixed, duration, comment_author, comment_data);
|
result = cmd_submitf(cmd, "%s;%lu;%lu;%d;0;%lu", servicegroup_name, start_time, end_time, fixed, duration);
|
||||||
if(affect_host_and_services == TRUE)
|
if(affect_host_and_services == TRUE)
|
||||||
result |= cmd_submitf(CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME, "%s;%lu;%lu;%d;0;%lu;%s;%s", servicegroup_name, start_time, end_time, fixed, duration, comment_author, comment_data);
|
result |= cmd_submitf(CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME, "%s;%lu;%lu;%d;0;%lu", servicegroup_name, start_time, end_time, fixed, duration);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -2330,6 +2319,9 @@ void clean_comment_data(char *buffer) {
|
|||||||
int x;
|
int x;
|
||||||
int y;
|
int y;
|
||||||
|
|
||||||
|
if (!buffer || !*buffer)
|
||||||
|
return;
|
||||||
|
|
||||||
y = (int)strlen(buffer);
|
y = (int)strlen(buffer);
|
||||||
|
|
||||||
for(x = 0; x < y; x++) {
|
for(x = 0; x < y; x++) {
|
||||||
|
@ -340,7 +340,7 @@ int process_cgivars(void) {
|
|||||||
variables = getcgivars();
|
variables = getcgivars();
|
||||||
to_expand[0] = '\0';
|
to_expand[0] = '\0';
|
||||||
|
|
||||||
for(x = 0; variables[x] != NULL; x++) {
|
for(x = 0; variables[x]; x++) {
|
||||||
|
|
||||||
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
||||||
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
||||||
|
@ -1,26 +1,21 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
#include "../include/common.h"
|
#include "../include/common.h"
|
||||||
|
#include "../include/cgiutils.h"
|
||||||
|
|
||||||
struct nagios_extcmd {
|
|
||||||
const char *name;
|
|
||||||
int id;
|
|
||||||
/* size_t namelen;
|
|
||||||
int min_args;
|
|
||||||
int (*handler)(struct nagios_extcmd *, int, char **);
|
|
||||||
struct nagios_extcmd *next_handler;
|
|
||||||
*/
|
|
||||||
};
|
|
||||||
|
|
||||||
#define CMD_DEF(name, min_args, handler) \
|
#define ALT_CMD_DEF(name)
|
||||||
{ #name, CMD_ ## name }
|
|
||||||
|
#define CMD_DEF(name, cmd_opt, dflt_comment) \
|
||||||
|
{ #name, CMD_ ## name, cmd_opt, dflt_comment }
|
||||||
/* { #name, sizeof(#name) - 1, CMD_ ## name, min_args, handler, NULL } */
|
/* { #name, sizeof(#name) - 1, CMD_ ## name, min_args, handler, NULL } */
|
||||||
struct nagios_extcmd in_core_commands[] = {
|
struct nagios_extcmd in_core_commands[] = {
|
||||||
CMD_DEF(NONE, 0, NULL),
|
CMD_DEF(NONE, 0, NULL),
|
||||||
CMD_DEF(ADD_HOST_COMMENT, 0, NULL),
|
CMD_DEF(ADD_HOST_COMMENT, 2, NULL),
|
||||||
CMD_DEF(DEL_HOST_COMMENT, 0, NULL),
|
CMD_DEF(DEL_HOST_COMMENT, 0, NULL),
|
||||||
CMD_DEF(ADD_SVC_COMMENT, 0, NULL),
|
CMD_DEF(ADD_SVC_COMMENT, 2, NULL),
|
||||||
CMD_DEF(DEL_SVC_COMMENT, 0, NULL),
|
CMD_DEF(DEL_SVC_COMMENT, 0, NULL),
|
||||||
CMD_DEF(ENABLE_SVC_CHECK, 0, NULL),
|
CMD_DEF(ENABLE_SVC_CHECK, 0, NULL),
|
||||||
CMD_DEF(DISABLE_SVC_CHECK, 0, NULL),
|
CMD_DEF(DISABLE_SVC_CHECK, 0, NULL),
|
||||||
@ -48,8 +43,8 @@ struct nagios_extcmd in_core_commands[] = {
|
|||||||
CMD_DEF(PROCESS_SERVICE_CHECK_RESULT, 0, NULL),
|
CMD_DEF(PROCESS_SERVICE_CHECK_RESULT, 0, NULL),
|
||||||
CMD_DEF(SAVE_STATE_INFORMATION, 0, NULL),
|
CMD_DEF(SAVE_STATE_INFORMATION, 0, NULL),
|
||||||
CMD_DEF(READ_STATE_INFORMATION, 0, NULL),
|
CMD_DEF(READ_STATE_INFORMATION, 0, NULL),
|
||||||
CMD_DEF(ACKNOWLEDGE_HOST_PROBLEM, 0, NULL),
|
CMD_DEF(ACKNOWLEDGE_HOST_PROBLEM, 2, NULL),
|
||||||
CMD_DEF(ACKNOWLEDGE_SVC_PROBLEM, 0, NULL),
|
CMD_DEF(ACKNOWLEDGE_SVC_PROBLEM, 2, NULL),
|
||||||
CMD_DEF(START_EXECUTING_SVC_CHECKS, 0, NULL),
|
CMD_DEF(START_EXECUTING_SVC_CHECKS, 0, NULL),
|
||||||
CMD_DEF(STOP_EXECUTING_SVC_CHECKS, 0, NULL),
|
CMD_DEF(STOP_EXECUTING_SVC_CHECKS, 0, NULL),
|
||||||
CMD_DEF(START_ACCEPTING_PASSIVE_SVC_CHECKS, 0, NULL),
|
CMD_DEF(START_ACCEPTING_PASSIVE_SVC_CHECKS, 0, NULL),
|
||||||
@ -70,8 +65,8 @@ struct nagios_extcmd in_core_commands[] = {
|
|||||||
CMD_DEF(REMOVE_SVC_ACKNOWLEDGEMENT, 0, NULL),
|
CMD_DEF(REMOVE_SVC_ACKNOWLEDGEMENT, 0, NULL),
|
||||||
CMD_DEF(SCHEDULE_FORCED_HOST_SVC_CHECKS, 0, NULL),
|
CMD_DEF(SCHEDULE_FORCED_HOST_SVC_CHECKS, 0, NULL),
|
||||||
CMD_DEF(SCHEDULE_FORCED_SVC_CHECK, 0, NULL),
|
CMD_DEF(SCHEDULE_FORCED_SVC_CHECK, 0, NULL),
|
||||||
CMD_DEF(SCHEDULE_HOST_DOWNTIME, 0, NULL),
|
CMD_DEF(SCHEDULE_HOST_DOWNTIME, 2, NULL),
|
||||||
CMD_DEF(SCHEDULE_SVC_DOWNTIME, 0, NULL),
|
CMD_DEF(SCHEDULE_SVC_DOWNTIME, 2, NULL),
|
||||||
CMD_DEF(ENABLE_HOST_FLAP_DETECTION, 0, NULL),
|
CMD_DEF(ENABLE_HOST_FLAP_DETECTION, 0, NULL),
|
||||||
CMD_DEF(DISABLE_HOST_FLAP_DETECTION, 0, NULL),
|
CMD_DEF(DISABLE_HOST_FLAP_DETECTION, 0, NULL),
|
||||||
CMD_DEF(ENABLE_SVC_FLAP_DETECTION, 0, NULL),
|
CMD_DEF(ENABLE_SVC_FLAP_DETECTION, 0, NULL),
|
||||||
@ -88,9 +83,9 @@ struct nagios_extcmd in_core_commands[] = {
|
|||||||
CMD_DEF(DEL_SVC_DOWNTIME, 0, NULL),
|
CMD_DEF(DEL_SVC_DOWNTIME, 0, NULL),
|
||||||
CMD_DEF(ENABLE_PERFORMANCE_DATA, 0, NULL),
|
CMD_DEF(ENABLE_PERFORMANCE_DATA, 0, NULL),
|
||||||
CMD_DEF(DISABLE_PERFORMANCE_DATA, 0, NULL),
|
CMD_DEF(DISABLE_PERFORMANCE_DATA, 0, NULL),
|
||||||
CMD_DEF(SCHEDULE_HOSTGROUP_HOST_DOWNTIME, 0, NULL),
|
CMD_DEF(SCHEDULE_HOSTGROUP_HOST_DOWNTIME, 2, NULL),
|
||||||
CMD_DEF(SCHEDULE_HOSTGROUP_SVC_DOWNTIME, 0, NULL),
|
CMD_DEF(SCHEDULE_HOSTGROUP_SVC_DOWNTIME, 2, NULL),
|
||||||
CMD_DEF(SCHEDULE_HOST_SVC_DOWNTIME, 0, NULL),
|
CMD_DEF(SCHEDULE_HOST_SVC_DOWNTIME, 2, NULL),
|
||||||
CMD_DEF(PROCESS_HOST_CHECK_RESULT, 0, NULL),
|
CMD_DEF(PROCESS_HOST_CHECK_RESULT, 0, NULL),
|
||||||
CMD_DEF(START_EXECUTING_HOST_CHECKS, 0, NULL),
|
CMD_DEF(START_EXECUTING_HOST_CHECKS, 0, NULL),
|
||||||
CMD_DEF(STOP_EXECUTING_HOST_CHECKS, 0, NULL),
|
CMD_DEF(STOP_EXECUTING_HOST_CHECKS, 0, NULL),
|
||||||
@ -124,8 +119,8 @@ struct nagios_extcmd in_core_commands[] = {
|
|||||||
CMD_DEF(DISABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS, 0, NULL),
|
CMD_DEF(DISABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS, 0, NULL),
|
||||||
CMD_DEF(ENABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS, 0, NULL),
|
CMD_DEF(ENABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS, 0, NULL),
|
||||||
CMD_DEF(DISABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS, 0, NULL),
|
CMD_DEF(DISABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS, 0, NULL),
|
||||||
CMD_DEF(SCHEDULE_SERVICEGROUP_HOST_DOWNTIME, 0, NULL),
|
CMD_DEF(SCHEDULE_SERVICEGROUP_HOST_DOWNTIME, 2, NULL),
|
||||||
CMD_DEF(SCHEDULE_SERVICEGROUP_SVC_DOWNTIME, 0, NULL),
|
CMD_DEF(SCHEDULE_SERVICEGROUP_SVC_DOWNTIME, 2, NULL),
|
||||||
CMD_DEF(CHANGE_GLOBAL_HOST_EVENT_HANDLER, 0, NULL),
|
CMD_DEF(CHANGE_GLOBAL_HOST_EVENT_HANDLER, 0, NULL),
|
||||||
CMD_DEF(CHANGE_GLOBAL_SVC_EVENT_HANDLER, 0, NULL),
|
CMD_DEF(CHANGE_GLOBAL_SVC_EVENT_HANDLER, 0, NULL),
|
||||||
CMD_DEF(CHANGE_HOST_EVENT_HANDLER, 0, NULL),
|
CMD_DEF(CHANGE_HOST_EVENT_HANDLER, 0, NULL),
|
||||||
@ -162,8 +157,8 @@ struct nagios_extcmd in_core_commands[] = {
|
|||||||
CMD_DEF(ENABLE_CONTACTGROUP_SVC_NOTIFICATIONS, 0, NULL),
|
CMD_DEF(ENABLE_CONTACTGROUP_SVC_NOTIFICATIONS, 0, NULL),
|
||||||
CMD_DEF(DISABLE_CONTACTGROUP_SVC_NOTIFICATIONS, 0, NULL),
|
CMD_DEF(DISABLE_CONTACTGROUP_SVC_NOTIFICATIONS, 0, NULL),
|
||||||
CMD_DEF(CHANGE_RETRY_HOST_CHECK_INTERVAL, 0, NULL),
|
CMD_DEF(CHANGE_RETRY_HOST_CHECK_INTERVAL, 0, NULL),
|
||||||
CMD_DEF(SEND_CUSTOM_HOST_NOTIFICATION, 0, NULL),
|
CMD_DEF(SEND_CUSTOM_HOST_NOTIFICATION, 2, NULL),
|
||||||
CMD_DEF(SEND_CUSTOM_SVC_NOTIFICATION, 0, NULL),
|
CMD_DEF(SEND_CUSTOM_SVC_NOTIFICATION, 2, NULL),
|
||||||
CMD_DEF(CHANGE_HOST_NOTIFICATION_TIMEPERIOD, 0, NULL),
|
CMD_DEF(CHANGE_HOST_NOTIFICATION_TIMEPERIOD, 0, NULL),
|
||||||
CMD_DEF(CHANGE_SVC_NOTIFICATION_TIMEPERIOD, 0, NULL),
|
CMD_DEF(CHANGE_SVC_NOTIFICATION_TIMEPERIOD, 0, NULL),
|
||||||
CMD_DEF(CHANGE_CONTACT_HOST_NOTIFICATION_TIMEPERIOD, 0, NULL),
|
CMD_DEF(CHANGE_CONTACT_HOST_NOTIFICATION_TIMEPERIOD, 0, NULL),
|
||||||
@ -181,33 +176,37 @@ struct nagios_extcmd in_core_commands[] = {
|
|||||||
# define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
|
# define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const char *extcmd_get_name(int id) {
|
struct nagios_extcmd* extcmd_get_command_id(int id)
|
||||||
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
for(i = 0; i < ARRAY_SIZE(in_core_commands); i++) {
|
for(i = 0; i < ARRAY_SIZE(in_core_commands); i++) {
|
||||||
struct nagios_extcmd *ecmd;
|
struct nagios_extcmd *ecmd;
|
||||||
ecmd = &in_core_commands[i];
|
ecmd = &in_core_commands[i];
|
||||||
if(ecmd->id == id)
|
if(ecmd->id == id)
|
||||||
return ecmd->name;
|
return ecmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ECMD_LIST_TESTING
|
struct nagios_extcmd* extcmd_get_command_name(const char *name)
|
||||||
int main(int argc, char **argv) {
|
{
|
||||||
int i, no_handler = 0;
|
unsigned int i;
|
||||||
|
|
||||||
for(i = 0; i < ARRAY_SIZE(in_core_commands); i++) {
|
for(i = 0; i < ARRAY_SIZE(in_core_commands); i++) {
|
||||||
struct nagios_extcmd *cmd = &in_core_commands[i];
|
struct nagios_extcmd *ecmd;
|
||||||
if(!cmd->handler) {
|
ecmd = &in_core_commands[i];
|
||||||
no_handler++;
|
if(!strcmp(ecmd->name, name))
|
||||||
printf("%s has no handler\n", extcmd_get_name(i));
|
return ecmd;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
printf("%d of %d commands have no handler\n",
|
|
||||||
no_handler, ARRAY_SIZE(in_core_commands));
|
|
||||||
|
|
||||||
return 0;
|
return NULL;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
const char *extcmd_get_name(int id) {
|
||||||
|
struct nagios_extcmd *ecmd = extcmd_get_command_id(id);
|
||||||
|
if (!ecmd)
|
||||||
|
return NULL;
|
||||||
|
return ecmd->name;
|
||||||
|
}
|
||||||
|
@ -36,6 +36,7 @@ static nagios_macros *mac;
|
|||||||
extern char nagios_process_info[MAX_INPUT_BUFFER];
|
extern char nagios_process_info[MAX_INPUT_BUFFER];
|
||||||
extern int nagios_process_state;
|
extern int nagios_process_state;
|
||||||
extern int refresh_rate;
|
extern int refresh_rate;
|
||||||
|
extern int enable_page_tour;
|
||||||
|
|
||||||
extern int buffer_stats[1][3];
|
extern int buffer_stats[1][3];
|
||||||
extern int program_stats[MAX_CHECK_STATS_TYPES][3];
|
extern int program_stats[MAX_CHECK_STATS_TYPES][3];
|
||||||
@ -561,7 +562,7 @@ void document_header(int use_stylesheet) {
|
|||||||
else if(display_type == DISPLAY_SERVICE_INFO)
|
else if(display_type == DISPLAY_SERVICE_INFO)
|
||||||
vidurl = "https://www.youtube.com/embed/f_knwQOS6FI";
|
vidurl = "https://www.youtube.com/embed/f_knwQOS6FI";
|
||||||
|
|
||||||
if (vidurl) {
|
if (enable_page_tour == TRUE && vidurl) {
|
||||||
printf("<script type='text/javascript' src='%s%s'></script>\n", url_js_path, JQUERY_JS);
|
printf("<script type='text/javascript' src='%s%s'></script>\n", url_js_path, JQUERY_JS);
|
||||||
printf("<script type='text/javascript' src='%s%s'></script>\n", url_js_path, NAGFUNCS_JS);
|
printf("<script type='text/javascript' src='%s%s'></script>\n", url_js_path, NAGFUNCS_JS);
|
||||||
printf("<script type='text/javascript'>\n");
|
printf("<script type='text/javascript'>\n");
|
||||||
@ -611,7 +612,7 @@ int process_cgivars(void) {
|
|||||||
|
|
||||||
variables = getcgivars();
|
variables = getcgivars();
|
||||||
|
|
||||||
for(x = 0; variables[x] != NULL; x++) {
|
for(x = 0; variables[x]; x++) {
|
||||||
|
|
||||||
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
||||||
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
||||||
@ -1123,7 +1124,7 @@ void show_host_info(void) {
|
|||||||
|
|
||||||
printf("<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 CLASS='command'>\n");
|
printf("<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 CLASS='command'>\n");
|
||||||
#ifdef USE_STATUSMAP
|
#ifdef USE_STATUSMAP
|
||||||
printf("<tr CLASS='command'><td><img src='%s%s' border=0 ALT='Locate Host On Map' TITLE='Locate Host On Map'></td><td CLASS='command'><a href='%s?host=%s'>Locate host on map</a></td></tr>\n", url_images_path, STATUSMAP_ICON, STATUSMAP_CGI, url_encode(host_name));
|
printf("<tr CLASS='command'><td><img src='%s%s' border=0 ALT='Locate Host On Map' TITLE='Locate Host On Map'></td><td CLASS='command'><a href='%s?host=%s&root=%s'>Locate host on map</a></td></tr>\n", url_images_path, STATUSMAP_ICON, STATUSMAP_CGI, url_encode(host_name), url_encode(host_name));
|
||||||
#endif
|
#endif
|
||||||
if(temp_hoststatus->checks_enabled == TRUE) {
|
if(temp_hoststatus->checks_enabled == TRUE) {
|
||||||
printf("<tr CLASS='command'><td><img src='%s%s' border=0 ALT='Disable Active Checks Of This Host' TITLE='Disable Active Checks Of This Host'></td><td CLASS='command'><a href='%s?cmd_typ=%d&host=%s'>Disable active checks of this host</a></td></tr>\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_DISABLE_HOST_CHECK, url_encode(host_name));
|
printf("<tr CLASS='command'><td><img src='%s%s' border=0 ALT='Disable Active Checks Of This Host' TITLE='Disable Active Checks Of This Host'></td><td CLASS='command'><a href='%s?cmd_typ=%d&host=%s'>Disable active checks of this host</a></td></tr>\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_DISABLE_HOST_CHECK, url_encode(host_name));
|
||||||
|
16
cgi/getcgi.c
16
cgi/getcgi.c
@ -42,8 +42,6 @@ void sanitize_cgi_input(char **cgivars) {
|
|||||||
|
|
||||||
strptr[y] = '\x0';
|
strptr[y] = '\x0';
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -101,8 +99,6 @@ void unescape_cgi_input(char *input) {
|
|||||||
input[y] = input[x];
|
input[y] = input[x];
|
||||||
}
|
}
|
||||||
input[y] = '\x0';
|
input[y] = '\x0';
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -275,7 +271,7 @@ char **getcgivars(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* terminate the list */
|
/* terminate the list */
|
||||||
pairlist[paircount] = '\x0';
|
pairlist[paircount] = NULL;
|
||||||
|
|
||||||
/* extract the names and values from the pairlist */
|
/* extract the names and values from the pairlist */
|
||||||
cgivars = (char **)malloc((paircount * 2 + 1) * sizeof(char *));
|
cgivars = (char **)malloc((paircount * 2 + 1) * sizeof(char *));
|
||||||
@ -314,11 +310,11 @@ char **getcgivars(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* terminate the name-value list */
|
/* terminate the name-value list */
|
||||||
cgivars[paircount * 2] = '\x0';
|
cgivars[paircount * 2] = NULL;
|
||||||
|
|
||||||
/* free allocated memory */
|
/* free allocated memory */
|
||||||
free(cgiinput);
|
free(cgiinput);
|
||||||
for(i = 0; pairlist[i] != NULL; i++)
|
for(i = 0; pairlist[i]; i++)
|
||||||
free(pairlist[i]);
|
free(pairlist[i]);
|
||||||
free(pairlist);
|
free(pairlist);
|
||||||
|
|
||||||
@ -536,16 +532,14 @@ void free_accept_languages( accept_languages * langs) {
|
|||||||
free( langs->languages);
|
free( langs->languages);
|
||||||
}
|
}
|
||||||
free( langs);
|
free( langs);
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* free() memory allocated to storing the CGI variables */
|
/* free() memory allocated to storing the CGI variables */
|
||||||
void free_cgivars(char **cgivars) {
|
void free_cgivars(char **cgivars) {
|
||||||
register int x;
|
register int x;
|
||||||
|
|
||||||
for(x = 0; cgivars[x] != '\x0'; x++)
|
for(x = 0; cgivars[x]; x++)
|
||||||
free(cgivars[x]);
|
free(cgivars[x]);
|
||||||
|
|
||||||
return;
|
free(cgivars);
|
||||||
}
|
}
|
||||||
|
@ -253,7 +253,7 @@ int main(int argc, char **argv) {
|
|||||||
init_shared_cfg_vars(1);
|
init_shared_cfg_vars(1);
|
||||||
|
|
||||||
/* read the CGI configuration file */
|
/* read the CGI configuration file */
|
||||||
result = read_cgi_config_file(get_cgi_config_location());
|
result = read_cgi_config_file(get_cgi_config_location(), NULL);
|
||||||
if(result == ERROR) {
|
if(result == ERROR) {
|
||||||
if(mode == CREATE_HTML) {
|
if(mode == CREATE_HTML) {
|
||||||
document_header(FALSE);
|
document_header(FALSE);
|
||||||
@ -1092,7 +1092,7 @@ int process_cgivars(void) {
|
|||||||
|
|
||||||
variables = getcgivars();
|
variables = getcgivars();
|
||||||
|
|
||||||
for(x = 0; variables[x] != NULL; x++) {
|
for(x = 0; variables[x]; x++) {
|
||||||
|
|
||||||
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
||||||
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
||||||
|
@ -334,7 +334,7 @@ int process_cgivars(void) {
|
|||||||
|
|
||||||
variables = getcgivars();
|
variables = getcgivars();
|
||||||
|
|
||||||
for(x = 0; variables[x] != NULL; x++) {
|
for(x = 0; variables[x]; x++) {
|
||||||
|
|
||||||
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
||||||
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1)
|
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1)
|
||||||
|
@ -325,7 +325,7 @@ int process_cgivars(void) {
|
|||||||
|
|
||||||
variables = getcgivars();
|
variables = getcgivars();
|
||||||
|
|
||||||
for(x = 0; variables[x] != NULL; x++) {
|
for(x = 0; variables[x]; x++) {
|
||||||
|
|
||||||
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
||||||
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
||||||
|
@ -639,7 +639,7 @@ int main(void) {
|
|||||||
reset_cgi_vars();
|
reset_cgi_vars();
|
||||||
|
|
||||||
/* read the CGI configuration file */
|
/* read the CGI configuration file */
|
||||||
result = read_cgi_config_file(get_cgi_config_location());
|
result = read_cgi_config_file(get_cgi_config_location(), NULL);
|
||||||
if(result == ERROR) {
|
if(result == ERROR) {
|
||||||
json_object_append_object(json_root, "result",
|
json_object_append_object(json_root, "result",
|
||||||
json_result(query_time, THISCGI,
|
json_result(query_time, THISCGI,
|
||||||
@ -1300,7 +1300,7 @@ int process_cgivars(json_object *json_root, object_json_cgi_data *cgi_data,
|
|||||||
|
|
||||||
variables = getcgivars();
|
variables = getcgivars();
|
||||||
|
|
||||||
for(x = 0; variables[x] != NULL; x++) {
|
for(x = 0; variables[x]; x++) {
|
||||||
/* We set these each iteration because they could change with each
|
/* We set these each iteration because they could change with each
|
||||||
iteration */
|
iteration */
|
||||||
|
|
||||||
|
@ -221,7 +221,7 @@ int process_cgivars(void) {
|
|||||||
|
|
||||||
variables = getcgivars();
|
variables = getcgivars();
|
||||||
|
|
||||||
for(x = 0; variables[x] != NULL; x++) {
|
for(x = 0; variables[x]; x++) {
|
||||||
|
|
||||||
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
||||||
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
||||||
|
@ -206,7 +206,7 @@ int process_cgivars(void) {
|
|||||||
|
|
||||||
variables = getcgivars();
|
variables = getcgivars();
|
||||||
|
|
||||||
for(x = 0; variables[x] != NULL; x++) {
|
for(x = 0; variables[x]; x++) {
|
||||||
|
|
||||||
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
||||||
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
||||||
|
28
cgi/status.c
28
cgi/status.c
@ -32,6 +32,7 @@
|
|||||||
|
|
||||||
extern int refresh_rate;
|
extern int refresh_rate;
|
||||||
extern int result_limit;
|
extern int result_limit;
|
||||||
|
extern int enable_page_tour;
|
||||||
|
|
||||||
extern char main_config_file[MAX_FILENAME_LENGTH];
|
extern char main_config_file[MAX_FILENAME_LENGTH];
|
||||||
extern char url_html_path[MAX_FILENAME_LENGTH];
|
extern char url_html_path[MAX_FILENAME_LENGTH];
|
||||||
@ -191,6 +192,7 @@ int display_header = TRUE;
|
|||||||
|
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
|
|
||||||
char *sound = NULL;
|
char *sound = NULL;
|
||||||
host *temp_host = NULL;
|
host *temp_host = NULL;
|
||||||
hostgroup *temp_hostgroup = NULL;
|
hostgroup *temp_hostgroup = NULL;
|
||||||
@ -236,7 +238,7 @@ int main(void) {
|
|||||||
host_filter[regex_i++] = '$';
|
host_filter[regex_i++] = '$';
|
||||||
host_filter[regex_i] = '\0';
|
host_filter[regex_i] = '\0';
|
||||||
}
|
}
|
||||||
else {
|
else if (host_name != NULL) {
|
||||||
if((temp_host = find_host(host_name)) == NULL) {
|
if((temp_host = find_host(host_name)) == NULL) {
|
||||||
for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) {
|
for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) {
|
||||||
if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE)
|
if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE)
|
||||||
@ -285,7 +287,6 @@ int main(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(display_header == TRUE) {
|
if(display_header == TRUE) {
|
||||||
|
|
||||||
/* begin top table */
|
/* begin top table */
|
||||||
printf("<table class='headertable'>\n");
|
printf("<table class='headertable'>\n");
|
||||||
printf("<tr>\n");
|
printf("<tr>\n");
|
||||||
@ -535,6 +536,7 @@ void document_header(int use_stylesheet) {
|
|||||||
printf("<script type='text/javascript' src='%s%s'></script>\n", url_js_path, NAGFUNCS_JS);
|
printf("<script type='text/javascript' src='%s%s'></script>\n", url_js_path, NAGFUNCS_JS);
|
||||||
/* JS function to append content to elements on page */
|
/* JS function to append content to elements on page */
|
||||||
printf("<script type='text/javascript'>\n");
|
printf("<script type='text/javascript'>\n");
|
||||||
|
if (enable_page_tour == TRUE) {
|
||||||
printf("var vbox, vBoxId='status%d%d', vboxText = "
|
printf("var vbox, vBoxId='status%d%d', vboxText = "
|
||||||
"'<a href=https://www.nagios.com/tours target=_blank>"
|
"'<a href=https://www.nagios.com/tours target=_blank>"
|
||||||
"Click here to watch the entire Nagios Core 4 Tour!</a>';\n",
|
"Click here to watch the entire Nagios Core 4 Tour!</a>';\n",
|
||||||
@ -561,6 +563,7 @@ void document_header(int use_stylesheet) {
|
|||||||
"vidid:vBoxId});\n", vidurl);
|
"vidid:vBoxId});\n", vidurl);
|
||||||
}
|
}
|
||||||
printf("});\n");
|
printf("});\n");
|
||||||
|
}
|
||||||
printf("function set_limit(url) { \nthis.location = url+'&limit='+$('#limit').val();\n }\n");
|
printf("function set_limit(url) { \nthis.location = url+'&limit='+$('#limit').val();\n }\n");
|
||||||
|
|
||||||
printf("</script>\n");
|
printf("</script>\n");
|
||||||
@ -598,7 +601,7 @@ int process_cgivars(void) {
|
|||||||
|
|
||||||
variables = getcgivars();
|
variables = getcgivars();
|
||||||
|
|
||||||
for(x = 0; variables[x] != NULL; x++) {
|
for(x = 0; variables[x]; x++) {
|
||||||
|
|
||||||
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
||||||
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
||||||
@ -870,9 +873,13 @@ void show_service_status_totals(void) {
|
|||||||
count_service = 1;
|
count_service = 1;
|
||||||
}
|
}
|
||||||
else if(display_type == DISPLAY_SERVICEGROUPS) {
|
else if(display_type == DISPLAY_SERVICEGROUPS) {
|
||||||
if(show_all_servicegroups == TRUE) {
|
|
||||||
|
if (show_all_servicegroups == TRUE) {
|
||||||
count_service = 1;
|
count_service = 1;
|
||||||
}
|
}
|
||||||
|
else if (is_service_member_of_servicegroup(find_servicegroup(servicegroup_name), temp_service) == FALSE) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
else if(is_host_member_of_servicegroup(find_servicegroup(servicegroup_name), temp_host) == TRUE) {
|
else if(is_host_member_of_servicegroup(find_servicegroup(servicegroup_name), temp_host) == TRUE) {
|
||||||
count_service = 1;
|
count_service = 1;
|
||||||
}
|
}
|
||||||
@ -1736,14 +1743,17 @@ void show_service_detail(void) {
|
|||||||
}
|
}
|
||||||
else if(temp_status->status == SERVICE_CRITICAL) {
|
else if(temp_status->status == SERVICE_CRITICAL) {
|
||||||
strncpy(status, "CRITICAL", sizeof(status));
|
strncpy(status, "CRITICAL", sizeof(status));
|
||||||
status_class = "CRITICAL";
|
if(temp_status->problem_has_been_acknowledged == TRUE) {
|
||||||
if(temp_status->problem_has_been_acknowledged == TRUE)
|
status_class = "CRITICALACK";
|
||||||
status_bg_class = "BGCRITICALACK";
|
status_bg_class = "BGCRITICALACK";
|
||||||
else if(temp_status->scheduled_downtime_depth > 0)
|
} else if(temp_status->scheduled_downtime_depth > 0) {
|
||||||
|
status_class = "CRITICAL";
|
||||||
status_bg_class = "BGCRITICALSCHED";
|
status_bg_class = "BGCRITICALSCHED";
|
||||||
else
|
} else {
|
||||||
|
status_class = "CRITICAL";
|
||||||
status_bg_class = "BGCRITICAL";
|
status_bg_class = "BGCRITICAL";
|
||||||
}
|
}
|
||||||
|
}
|
||||||
status[sizeof(status) - 1] = '\x0';
|
status[sizeof(status) - 1] = '\x0';
|
||||||
|
|
||||||
|
|
||||||
@ -3219,7 +3229,7 @@ void show_servicegroup_service_totals_summary(servicegroup *temp_servicegroup) {
|
|||||||
printf("<td class='miniStatusCRITICAL'><table border='0'>\n");
|
printf("<td class='miniStatusCRITICAL'><table border='0'>\n");
|
||||||
printf("<tr>\n");
|
printf("<tr>\n");
|
||||||
|
|
||||||
printf("<td class='miniStatusCRITICAL'><a href='%s?servicegroup=%s&style=detail&servicestatustypes=%d&hoststatustypes=%d&serviceprops=%lu&hostprops=%lu'>%d CRITICAL</a> :</td>\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SERVICE_CRITICAL, host_status_types, service_properties, host_properties, services_critical);
|
printf("<td class='miniStatusCRITICAL'><a href='%s?servicegroup=%s&style=detail&servicestatustypes=%d&hoststatustypes=%d&serviceprops=%lu&hostprops=%lu'>%d CRITICAL</a> </td>\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SERVICE_CRITICAL, host_status_types, service_properties, host_properties, services_critical);
|
||||||
|
|
||||||
printf("<td><table border='0'>\n");
|
printf("<td><table border='0'>\n");
|
||||||
|
|
||||||
|
@ -769,7 +769,7 @@ int main(void) {
|
|||||||
reset_cgi_vars();
|
reset_cgi_vars();
|
||||||
|
|
||||||
/* read the CGI configuration file */
|
/* read the CGI configuration file */
|
||||||
result = read_cgi_config_file(get_cgi_config_location());
|
result = read_cgi_config_file(get_cgi_config_location(), NULL);
|
||||||
if(result == ERROR) {
|
if(result == ERROR) {
|
||||||
json_object_append_object(json_root, "result",
|
json_object_append_object(json_root, "result",
|
||||||
json_result(query_time, THISCGI,
|
json_result(query_time, THISCGI,
|
||||||
@ -1284,7 +1284,7 @@ int process_cgivars(json_object *json_root, status_json_cgi_data *cgi_data,
|
|||||||
|
|
||||||
variables = getcgivars();
|
variables = getcgivars();
|
||||||
|
|
||||||
for(x = 0; variables[x] != NULL; x++) {
|
for(x = 0; variables[x]; x++) {
|
||||||
/* We set these each iteration because they could change with each
|
/* We set these each iteration because they could change with each
|
||||||
iteration */
|
iteration */
|
||||||
|
|
||||||
|
@ -238,7 +238,7 @@ int main(int argc, char **argv) {
|
|||||||
init_shared_cfg_vars(1);
|
init_shared_cfg_vars(1);
|
||||||
|
|
||||||
/* read the CGI configuration file */
|
/* read the CGI configuration file */
|
||||||
result = read_cgi_config_file(get_cgi_config_location());
|
result = read_cgi_config_file(get_cgi_config_location(), NULL);
|
||||||
if(result == ERROR) {
|
if(result == ERROR) {
|
||||||
document_header(FALSE);
|
document_header(FALSE);
|
||||||
if(create_type == CREATE_HTML)
|
if(create_type == CREATE_HTML)
|
||||||
@ -408,7 +408,7 @@ int process_cgivars(void) {
|
|||||||
|
|
||||||
variables = getcgivars();
|
variables = getcgivars();
|
||||||
|
|
||||||
for(x = 0; variables[x] != NULL; x++) {
|
for(x = 0; variables[x]; x++) {
|
||||||
|
|
||||||
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
||||||
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
||||||
|
@ -113,7 +113,7 @@ int main(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* read the CGI configuration file */
|
/* read the CGI configuration file */
|
||||||
result = read_cgi_config_file(get_cgi_config_location());
|
result = read_cgi_config_file(get_cgi_config_location(), NULL);
|
||||||
if(result == ERROR) {
|
if(result == ERROR) {
|
||||||
printf("<P>Error: Could not open CGI configuration file '%s' for reading!</P>\n", get_cgi_config_location());
|
printf("<P>Error: Could not open CGI configuration file '%s' for reading!</P>\n", get_cgi_config_location());
|
||||||
document_footer();
|
document_footer();
|
||||||
@ -228,7 +228,7 @@ int process_cgivars(void) {
|
|||||||
|
|
||||||
variables = getcgivars();
|
variables = getcgivars();
|
||||||
|
|
||||||
for(x = 0; variables[x] != NULL; x++) {
|
for(x = 0; variables[x]; x++) {
|
||||||
|
|
||||||
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
||||||
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
||||||
|
@ -139,7 +139,7 @@ int main(int argc, char **argv) {
|
|||||||
init_shared_cfg_vars(1);
|
init_shared_cfg_vars(1);
|
||||||
|
|
||||||
/* read the CGI configuration file */
|
/* read the CGI configuration file */
|
||||||
result = read_cgi_config_file(get_cgi_config_location());
|
result = read_cgi_config_file(get_cgi_config_location(), NULL);
|
||||||
if(result == ERROR) {
|
if(result == ERROR) {
|
||||||
document_header();
|
document_header();
|
||||||
return ERROR;
|
return ERROR;
|
||||||
@ -215,7 +215,7 @@ int process_cgivars(void) {
|
|||||||
|
|
||||||
variables = getcgivars();
|
variables = getcgivars();
|
||||||
|
|
||||||
for(x = 0; variables[x] != NULL; x++) {
|
for(x = 0; variables[x]; x++) {
|
||||||
|
|
||||||
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
||||||
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
||||||
@ -907,14 +907,17 @@ void draw_host(host *temp_host) {
|
|||||||
if(temp_host == NULL)
|
if(temp_host == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* see if user is authorized to view this host */
|
||||||
|
if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE)
|
||||||
|
return;
|
||||||
|
|
||||||
/* make sure we have the coordinates */
|
/* make sure we have the coordinates */
|
||||||
if(temp_host->have_3d_coords == FALSE)
|
if(temp_host->have_3d_coords == FALSE)
|
||||||
return;
|
return;
|
||||||
else {
|
|
||||||
x = temp_host->x_3d;
|
x = temp_host->x_3d;
|
||||||
y = temp_host->y_3d;
|
y = temp_host->y_3d;
|
||||||
z = temp_host->z_3d;
|
z = temp_host->z_3d;
|
||||||
}
|
|
||||||
|
|
||||||
/* make the host name safe for embedding in VRML */
|
/* make the host name safe for embedding in VRML */
|
||||||
vrml_safe_hostname = (char *)strdup(temp_host->name);
|
vrml_safe_hostname = (char *)strdup(temp_host->name);
|
||||||
@ -926,10 +929,6 @@ void draw_host(host *temp_host) {
|
|||||||
vrml_safe_hostname[a] = '_';
|
vrml_safe_hostname[a] = '_';
|
||||||
}
|
}
|
||||||
|
|
||||||
/* see if user is authorized to view this host */
|
|
||||||
if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* get the status of the host */
|
/* get the status of the host */
|
||||||
temp_hoststatus = find_hoststatus(temp_host->name);
|
temp_hoststatus = find_hoststatus(temp_host->name);
|
||||||
|
|
||||||
|
@ -721,7 +721,7 @@ int process_cgivars(void) {
|
|||||||
|
|
||||||
variables = getcgivars();
|
variables = getcgivars();
|
||||||
|
|
||||||
for(x = 0; variables[x] != NULL; x++) {
|
for(x = 0; variables[x]; x++) {
|
||||||
|
|
||||||
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
||||||
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
||||||
@ -1785,7 +1785,7 @@ void display_recent_alerts(void) {
|
|||||||
|
|
||||||
printf("<td CLASS='data%s'>%s</td>", bgclass, (temp_event->state_type == AE_SOFT_STATE) ? "SOFT" : "HARD");
|
printf("<td CLASS='data%s'>%s</td>", bgclass, (temp_event->state_type == AE_SOFT_STATE) ? "SOFT" : "HARD");
|
||||||
|
|
||||||
printf("<td CLASS='data%s'>%s</td>", bgclass, temp_event->event_info);
|
printf("<td CLASS='data%s'>%s</td>", bgclass, html_encode(temp_event->event_info, 1));
|
||||||
|
|
||||||
printf("</tr>\n");
|
printf("</tr>\n");
|
||||||
}
|
}
|
||||||
|
14
cgi/tac.c
14
cgi/tac.c
@ -66,6 +66,8 @@ extern servicestatus *servicestatus_list;
|
|||||||
|
|
||||||
extern int nagios_process_state;
|
extern int nagios_process_state;
|
||||||
|
|
||||||
|
extern int enable_page_tour;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -86,7 +88,7 @@ int process_cgivars(void);
|
|||||||
authdata current_authdata;
|
authdata current_authdata;
|
||||||
|
|
||||||
int embedded = FALSE;
|
int embedded = FALSE;
|
||||||
int display_header = FALSE;
|
int display_header = TRUE;
|
||||||
|
|
||||||
hostoutage *hostoutage_list = NULL;
|
hostoutage *hostoutage_list = NULL;
|
||||||
|
|
||||||
@ -302,6 +304,9 @@ void document_header(int use_stylesheet) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
printf("<script type='text/javascript' src='%s%s'></script>\n", url_js_path, JQUERY_JS);
|
printf("<script type='text/javascript' src='%s%s'></script>\n", url_js_path, JQUERY_JS);
|
||||||
|
|
||||||
|
|
||||||
|
if (enable_page_tour == TRUE) {
|
||||||
printf("<script type='text/javascript' src='%s%s'></script>\n", url_js_path, NAGFUNCS_JS);
|
printf("<script type='text/javascript' src='%s%s'></script>\n", url_js_path, NAGFUNCS_JS);
|
||||||
|
|
||||||
printf("<script type='text/javascript'>\nvar vbox, vBoxId='tac', "
|
printf("<script type='text/javascript'>\nvar vbox, vBoxId='tac', "
|
||||||
@ -313,6 +318,9 @@ void document_header(int use_stylesheet) {
|
|||||||
"vidurl:'https://www.youtube.com/embed/l20YRDhbOfA',text:vboxText,"
|
"vidurl:'https://www.youtube.com/embed/l20YRDhbOfA',text:vboxText,"
|
||||||
"vidid:vBoxId});");
|
"vidid:vBoxId});");
|
||||||
printf("\n});\n</script>\n");
|
printf("\n});\n</script>\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
printf("</HEAD>\n");
|
printf("</HEAD>\n");
|
||||||
printf("<BODY CLASS='tac' marginwidth=2 marginheight=2 topmargin=0 leftmargin=0 rightmargin=0>\n");
|
printf("<BODY CLASS='tac' marginwidth=2 marginheight=2 topmargin=0 leftmargin=0 rightmargin=0>\n");
|
||||||
@ -346,7 +354,7 @@ int process_cgivars(void) {
|
|||||||
|
|
||||||
variables = getcgivars();
|
variables = getcgivars();
|
||||||
|
|
||||||
for(x = 0; variables[x] != NULL; x++) {
|
for(x = 0; variables[x]; x++) {
|
||||||
|
|
||||||
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
||||||
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
||||||
@ -871,8 +879,6 @@ void display_tac_overview(void) {
|
|||||||
/* left column */
|
/* left column */
|
||||||
printf("<td align=left valign=top width=50%%>\n");
|
printf("<td align=left valign=top width=50%%>\n");
|
||||||
|
|
||||||
display_info_table("Tactical Monitoring Overview", TRUE, ¤t_authdata);
|
|
||||||
|
|
||||||
printf("</td>\n");
|
printf("</td>\n");
|
||||||
|
|
||||||
|
|
||||||
|
@ -268,7 +268,7 @@ int main(int argc, char **argv) {
|
|||||||
init_shared_cfg_vars(1);
|
init_shared_cfg_vars(1);
|
||||||
|
|
||||||
/* read the CGI configuration file */
|
/* read the CGI configuration file */
|
||||||
result = read_cgi_config_file(get_cgi_config_location());
|
result = read_cgi_config_file(get_cgi_config_location(), NULL);
|
||||||
if(result == ERROR) {
|
if(result == ERROR) {
|
||||||
if(mode == CREATE_HTML) {
|
if(mode == CREATE_HTML) {
|
||||||
document_header(FALSE);
|
document_header(FALSE);
|
||||||
@ -1299,7 +1299,7 @@ int process_cgivars(void) {
|
|||||||
|
|
||||||
variables = getcgivars();
|
variables = getcgivars();
|
||||||
|
|
||||||
for(x = 0; variables[x] != NULL; x++) {
|
for(x = 0; variables[x]; x++) {
|
||||||
|
|
||||||
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
/* do some basic length checking on the variable identifier to prevent buffer overflows */
|
||||||
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) {
|
||||||
|
@ -16,8 +16,8 @@ exec_prefix=@exec_prefix@
|
|||||||
LOGDIR=@localstatedir@
|
LOGDIR=@localstatedir@
|
||||||
CFGDIR=@sysconfdir@
|
CFGDIR=@sysconfdir@
|
||||||
BINDIR=@bindir@
|
BINDIR=@bindir@
|
||||||
CGIDIR=@sbindir@
|
CGIDIR=@cgibindir@
|
||||||
HTMLDIR=@datarootdir@
|
HTMLDIR=@webdir@
|
||||||
INSTALL=@INSTALL@
|
INSTALL=@INSTALL@
|
||||||
INSTALL_OPTS=@INSTALL_OPTS@
|
INSTALL_OPTS=@INSTALL_OPTS@
|
||||||
COMMAND_OPTS=@COMMAND_OPTS@
|
COMMAND_OPTS=@COMMAND_OPTS@
|
||||||
|
@ -150,7 +150,7 @@ static int downtime_add(scheduled_downtime *dt)
|
|||||||
prev_downtime_id = next_downtime_id;
|
prev_downtime_id = next_downtime_id;
|
||||||
if (!dt->downtime_id) {
|
if (!dt->downtime_id) {
|
||||||
dt->downtime_id = next_downtime_id++;
|
dt->downtime_id = next_downtime_id++;
|
||||||
} else if (dt->downtime_id > next_downtime_id) {
|
} else if (dt->downtime_id >= next_downtime_id) {
|
||||||
next_downtime_id = dt->downtime_id + 1;
|
next_downtime_id = dt->downtime_id + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1007,7 +1007,7 @@ static unsigned long get_next_downtime_id(void) {
|
|||||||
unsigned long new_dt_id;
|
unsigned long new_dt_id;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
new_dt_id = next_downtime_id++;
|
new_dt_id = next_downtime_id++;
|
||||||
if (!find_downtime(ANY_DOWNTIME, next_downtime_id)) {
|
if (!find_downtime(ANY_DOWNTIME, new_dt_id)) {
|
||||||
return new_dt_id;
|
return new_dt_id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
107
common/macros.c
107
common/macros.c
@ -115,13 +115,15 @@ int process_macros_r(nagios_macros *mac, char *input_buffer, char **output_buffe
|
|||||||
|
|
||||||
log_debug_info(DEBUGL_FUNCTIONS, 0, "process_macros_r()\n");
|
log_debug_info(DEBUGL_FUNCTIONS, 0, "process_macros_r()\n");
|
||||||
|
|
||||||
if(output_buffer == NULL)
|
if(output_buffer == NULL) {
|
||||||
return ERROR;
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
*output_buffer = (char *)strdup("");
|
*output_buffer = (char *)strdup("");
|
||||||
|
|
||||||
if(input_buffer == NULL)
|
if(input_buffer == NULL) {
|
||||||
return ERROR;
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
in_macro = FALSE;
|
in_macro = FALSE;
|
||||||
|
|
||||||
@ -137,13 +139,15 @@ int process_macros_r(nagios_macros *mac, char *input_buffer, char **output_buffe
|
|||||||
temp_buffer = buf_ptr;
|
temp_buffer = buf_ptr;
|
||||||
|
|
||||||
/* find the next delimiter - terminate preceding string and advance buffer pointer for next run */
|
/* find the next delimiter - terminate preceding string and advance buffer pointer for next run */
|
||||||
if((delim_ptr = strchr(buf_ptr, '$'))) {
|
delim_ptr = strchr(buf_ptr, '$');
|
||||||
|
if(delim_ptr != NULL) {
|
||||||
delim_ptr[0] = '\x0';
|
delim_ptr[0] = '\x0';
|
||||||
buf_ptr = (char *)delim_ptr + 1;
|
buf_ptr = (char *)delim_ptr + 1;
|
||||||
}
|
}
|
||||||
/* no delimiter found - we already have the last of the buffer */
|
/* no delimiter found - we already have the last of the buffer */
|
||||||
else
|
else {
|
||||||
buf_ptr = NULL;
|
buf_ptr = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
log_debug_info(DEBUGL_MACROS, 2, " Processing part: '%s'\n", temp_buffer);
|
log_debug_info(DEBUGL_MACROS, 2, " Processing part: '%s'\n", temp_buffer);
|
||||||
|
|
||||||
@ -162,22 +166,24 @@ int process_macros_r(nagios_macros *mac, char *input_buffer, char **output_buffe
|
|||||||
|
|
||||||
/* looks like we're in a macro, so process it... */
|
/* looks like we're in a macro, so process it... */
|
||||||
else {
|
else {
|
||||||
/* grab the macro value */
|
|
||||||
|
/* by default, we only free when instructed */
|
||||||
free_macro = FALSE;
|
free_macro = FALSE;
|
||||||
|
|
||||||
|
/* grab the macro value */
|
||||||
result = grab_macro_value_r(mac, temp_buffer, &selected_macro, ¯o_options, &free_macro);
|
result = grab_macro_value_r(mac, temp_buffer, &selected_macro, ¯o_options, &free_macro);
|
||||||
log_debug_info(DEBUGL_MACROS, 2, " Processed '%s', Free: %d\n", temp_buffer, free_macro);
|
log_debug_info(DEBUGL_MACROS, 2, " Processed '%s', Free: %d\n", temp_buffer, free_macro);
|
||||||
|
|
||||||
/* an error occurred - we couldn't parse the macro, so continue on */
|
/* an error occurred - we couldn't parse the macro, so continue on */
|
||||||
if(result == ERROR) {
|
if (result != OK) {
|
||||||
|
|
||||||
log_debug_info(DEBUGL_MACROS, 0, " WARNING: An error occurred processing macro '%s'!\n", temp_buffer);
|
log_debug_info(DEBUGL_MACROS, 0, " WARNING: An error occurred processing macro '%s'!\n", temp_buffer);
|
||||||
if(free_macro == TRUE)
|
if(free_macro == TRUE) {
|
||||||
my_free(selected_macro);
|
my_free(selected_macro);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result == OK)
|
|
||||||
; /* do nothing special if things worked out ok */
|
|
||||||
/* an escaped $ is done by specifying two $$ next to each other */
|
/* an escaped $ is done by specifying two $$ next to each other */
|
||||||
else if(!strcmp(temp_buffer, "")) {
|
if(!strcmp(temp_buffer, "")) {
|
||||||
log_debug_info(DEBUGL_MACROS, 2, " Escaped $. Running output (%lu): '%s'\n", (unsigned long)strlen(*output_buffer), *output_buffer);
|
log_debug_info(DEBUGL_MACROS, 2, " Escaped $. Running output (%lu): '%s'\n", (unsigned long)strlen(*output_buffer), *output_buffer);
|
||||||
*output_buffer = (char *)realloc(*output_buffer, strlen(*output_buffer) + 2);
|
*output_buffer = (char *)realloc(*output_buffer, strlen(*output_buffer) + 2);
|
||||||
strcat(*output_buffer, "$");
|
strcat(*output_buffer, "$");
|
||||||
@ -191,11 +197,17 @@ int process_macros_r(nagios_macros *mac, char *input_buffer, char **output_buffe
|
|||||||
*output_buffer = (char *)realloc(*output_buffer, strlen(*output_buffer) + strlen(temp_buffer) + 3);
|
*output_buffer = (char *)realloc(*output_buffer, strlen(*output_buffer) + strlen(temp_buffer) + 3);
|
||||||
strcat(*output_buffer, "$");
|
strcat(*output_buffer, "$");
|
||||||
strcat(*output_buffer, temp_buffer);
|
strcat(*output_buffer, temp_buffer);
|
||||||
|
|
||||||
|
/* just could have been a stray $ */
|
||||||
|
if (buf_ptr != NULL) {
|
||||||
strcat(*output_buffer, "$");
|
strcat(*output_buffer, "$");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* insert macro */
|
/* insert macro */
|
||||||
if(selected_macro != NULL) {
|
if (selected_macro != NULL) {
|
||||||
|
|
||||||
log_debug_info(DEBUGL_MACROS, 2, " Processed '%s', Free: %d, Cleaning options: %d\n", temp_buffer, free_macro, options);
|
log_debug_info(DEBUGL_MACROS, 2, " Processed '%s', Free: %d, Cleaning options: %d\n", temp_buffer, free_macro, options);
|
||||||
|
|
||||||
/* URL encode the macro if requested - this allocates new memory */
|
/* URL encode the macro if requested - this allocates new memory */
|
||||||
@ -210,14 +222,16 @@ int process_macros_r(nagios_macros *mac, char *input_buffer, char **output_buffe
|
|||||||
|
|
||||||
/* some macros should sometimes be cleaned */
|
/* some macros should sometimes be cleaned */
|
||||||
if(macro_options & options & (STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS)) {
|
if(macro_options & options & (STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS)) {
|
||||||
|
|
||||||
char *cleaned_macro = NULL;
|
char *cleaned_macro = NULL;
|
||||||
|
|
||||||
/* add the (cleaned) processed macro to the end of the already processed buffer */
|
/* add the (cleaned) processed macro to the end of the already processed buffer */
|
||||||
if(selected_macro != NULL && (cleaned_macro = clean_macro_chars(selected_macro, options)) != NULL) {
|
if(selected_macro != NULL && (cleaned_macro = clean_macro_chars(selected_macro, options)) != NULL) {
|
||||||
*output_buffer = (char *)realloc(*output_buffer, strlen(*output_buffer) + strlen(cleaned_macro) + 1);
|
*output_buffer = (char *)realloc(*output_buffer, strlen(*output_buffer) + strlen(cleaned_macro) + 1);
|
||||||
strcat(*output_buffer, cleaned_macro);
|
strcat(*output_buffer, cleaned_macro);
|
||||||
if(*cleaned_macro)
|
if(*cleaned_macro) {
|
||||||
my_free(cleaned_macro);
|
my_free(cleaned_macro);
|
||||||
|
}
|
||||||
|
|
||||||
log_debug_info(DEBUGL_MACROS, 2, " Cleaned macro. Running output (%lu): '%s'\n", (unsigned long)strlen(*output_buffer), *output_buffer);
|
log_debug_info(DEBUGL_MACROS, 2, " Cleaned macro. Running output (%lu): '%s'\n", (unsigned long)strlen(*output_buffer), *output_buffer);
|
||||||
}
|
}
|
||||||
@ -235,15 +249,16 @@ int process_macros_r(nagios_macros *mac, char *input_buffer, char **output_buffe
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* free memory if necessary (if we URL encoded the macro or we were told to do so by grab_macro_value()) */
|
/* free memory if necessary (if we URL encoded the macro or we were told to do so by grab_macro_value()) */
|
||||||
if(free_macro == TRUE)
|
if(free_macro == TRUE) {
|
||||||
my_free(selected_macro);
|
my_free(selected_macro);
|
||||||
|
}
|
||||||
|
|
||||||
log_debug_info(DEBUGL_MACROS, 2, " Just finished macro. Running output (%lu): '%s'\n", (unsigned long)strlen(*output_buffer), *output_buffer);
|
log_debug_info(DEBUGL_MACROS, 2, " Just finished macro. Running output (%lu): '%s'\n", (unsigned long)strlen(*output_buffer), *output_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
in_macro = FALSE;
|
in_macro = FALSE;
|
||||||
}
|
} /* if(in_macro == TRUE) */
|
||||||
}
|
} /* while(buf_ptr) */
|
||||||
|
|
||||||
/* free copy of input buffer */
|
/* free copy of input buffer */
|
||||||
my_free(save_buffer);
|
my_free(save_buffer);
|
||||||
@ -252,7 +267,7 @@ int process_macros_r(nagios_macros *mac, char *input_buffer, char **output_buffe
|
|||||||
log_debug_info(DEBUGL_MACROS, 1, "**** END MACRO PROCESSING *************\n");
|
log_debug_info(DEBUGL_MACROS, 1, "**** END MACRO PROCESSING *************\n");
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int process_macros(char *input_buffer, char **output_buffer, int options) {
|
int process_macros(char *input_buffer, char **output_buffer, int options) {
|
||||||
return process_macros_r(&global_macros, input_buffer, output_buffer, options);
|
return process_macros_r(&global_macros, input_buffer, output_buffer, options);
|
||||||
@ -689,8 +704,8 @@ int grab_macrox_value_r(nagios_macros *mac, int macro_type, char *arg1, char *ar
|
|||||||
/* HOST MACROS */
|
/* HOST MACROS */
|
||||||
/***************/
|
/***************/
|
||||||
case MACRO_HOSTGROUPNAMES:
|
case MACRO_HOSTGROUPNAMES:
|
||||||
case MACRO_HOSTINFOURL:
|
|
||||||
*free_macro = TRUE;
|
*free_macro = TRUE;
|
||||||
|
case MACRO_HOSTINFOURL:
|
||||||
case MACRO_HOSTNAME:
|
case MACRO_HOSTNAME:
|
||||||
case MACRO_HOSTALIAS:
|
case MACRO_HOSTALIAS:
|
||||||
case MACRO_HOSTADDRESS:
|
case MACRO_HOSTADDRESS:
|
||||||
@ -738,6 +753,8 @@ int grab_macrox_value_r(nagios_macros *mac, int macro_type, char *arg1, char *ar
|
|||||||
case MACRO_LASTHOSTSTATEID:
|
case MACRO_LASTHOSTSTATEID:
|
||||||
case MACRO_HOSTIMPORTANCE:
|
case MACRO_HOSTIMPORTANCE:
|
||||||
case MACRO_HOSTANDSERVICESIMPORTANCE:
|
case MACRO_HOSTANDSERVICESIMPORTANCE:
|
||||||
|
case MACRO_HOSTNOTIFICATIONENABLED:
|
||||||
|
case MACRO_HOSTNOTIFICATIONPERIOD:
|
||||||
|
|
||||||
/* a standard host macro */
|
/* a standard host macro */
|
||||||
if(arg2 == NULL) {
|
if(arg2 == NULL) {
|
||||||
@ -801,12 +818,12 @@ int grab_macrox_value_r(nagios_macros *mac, int macro_type, char *arg1, char *ar
|
|||||||
/********************/
|
/********************/
|
||||||
case MACRO_HOSTGROUPMEMBERS:
|
case MACRO_HOSTGROUPMEMBERS:
|
||||||
case MACRO_HOSTGROUPMEMBERADDRESSES:
|
case MACRO_HOSTGROUPMEMBERADDRESSES:
|
||||||
*free_macro = TRUE;
|
|
||||||
case MACRO_HOSTGROUPNAME:
|
|
||||||
case MACRO_HOSTGROUPALIAS:
|
|
||||||
case MACRO_HOSTGROUPNOTES:
|
case MACRO_HOSTGROUPNOTES:
|
||||||
case MACRO_HOSTGROUPNOTESURL:
|
case MACRO_HOSTGROUPNOTESURL:
|
||||||
case MACRO_HOSTGROUPACTIONURL:
|
case MACRO_HOSTGROUPACTIONURL:
|
||||||
|
*free_macro = TRUE;
|
||||||
|
case MACRO_HOSTGROUPNAME:
|
||||||
|
case MACRO_HOSTGROUPALIAS:
|
||||||
|
|
||||||
/* a standard hostgroup macro */
|
/* a standard hostgroup macro */
|
||||||
/* use the saved hostgroup pointer */
|
/* use the saved hostgroup pointer */
|
||||||
@ -829,8 +846,8 @@ int grab_macrox_value_r(nagios_macros *mac, int macro_type, char *arg1, char *ar
|
|||||||
/* SERVICE MACROS */
|
/* SERVICE MACROS */
|
||||||
/******************/
|
/******************/
|
||||||
case MACRO_SERVICEGROUPNAMES:
|
case MACRO_SERVICEGROUPNAMES:
|
||||||
case MACRO_SERVICEINFOURL:
|
|
||||||
*free_macro = TRUE;
|
*free_macro = TRUE;
|
||||||
|
case MACRO_SERVICEINFOURL:
|
||||||
case MACRO_SERVICEDESC:
|
case MACRO_SERVICEDESC:
|
||||||
case MACRO_SERVICESTATE:
|
case MACRO_SERVICESTATE:
|
||||||
case MACRO_SERVICESTATEID:
|
case MACRO_SERVICESTATEID:
|
||||||
@ -872,6 +889,8 @@ int grab_macrox_value_r(nagios_macros *mac, int macro_type, char *arg1, char *ar
|
|||||||
case MACRO_LASTSERVICESTATE:
|
case MACRO_LASTSERVICESTATE:
|
||||||
case MACRO_LASTSERVICESTATEID:
|
case MACRO_LASTSERVICESTATEID:
|
||||||
case MACRO_SERVICEIMPORTANCE:
|
case MACRO_SERVICEIMPORTANCE:
|
||||||
|
case MACRO_SERVICENOTIFICATIONENABLED:
|
||||||
|
case MACRO_SERVICENOTIFICATIONPERIOD:
|
||||||
|
|
||||||
/* use saved service pointer */
|
/* use saved service pointer */
|
||||||
if(arg1 == NULL && arg2 == NULL) {
|
if(arg1 == NULL && arg2 == NULL) {
|
||||||
@ -1717,6 +1736,12 @@ int grab_standard_host_macro_r(nagios_macros *mac, int macro_type, host *temp_ho
|
|||||||
case MACRO_HOSTNOTIFICATIONID:
|
case MACRO_HOSTNOTIFICATIONID:
|
||||||
*output = (char *)mkstr("%lu", temp_host->current_notification_id);
|
*output = (char *)mkstr("%lu", temp_host->current_notification_id);
|
||||||
break;
|
break;
|
||||||
|
case MACRO_HOSTNOTIFICATIONENABLED:
|
||||||
|
*output = (char *)mkstr("%s", temp_host->notifications_enabled ? "YES" : "NO");
|
||||||
|
break;
|
||||||
|
case MACRO_HOSTNOTIFICATIONPERIOD:
|
||||||
|
*output = (char *)mkstr("%s", temp_host->notification_period);
|
||||||
|
break;
|
||||||
case MACRO_HOSTEVENTID:
|
case MACRO_HOSTEVENTID:
|
||||||
*output = (char *)mkstr("%lu", temp_host->current_event_id);
|
*output = (char *)mkstr("%lu", temp_host->current_event_id);
|
||||||
break;
|
break;
|
||||||
@ -1816,10 +1841,14 @@ int grab_standard_host_macro_r(nagios_macros *mac, int macro_type, host *temp_ho
|
|||||||
host_services_value(temp_host));
|
host_services_value(temp_host));
|
||||||
break;
|
break;
|
||||||
case MACRO_HOSTINFOURL:
|
case MACRO_HOSTINFOURL:
|
||||||
|
*free_macro = TRUE;
|
||||||
buf1 = get_url_encoded_string(temp_host->name);
|
buf1 = get_url_encoded_string(temp_host->name);
|
||||||
|
if (buf1 != NULL) {
|
||||||
asprintf(output, "%s/cgi-bin/extinfo.cgi?type=1&host=%s",
|
asprintf(output, "%s/cgi-bin/extinfo.cgi?type=1&host=%s",
|
||||||
website_url ? website_url : "website_url not set", buf1);
|
website_url ? website_url : "website_url not set",
|
||||||
my_free(buf1);
|
buf1);
|
||||||
|
free(buf1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -2107,6 +2136,12 @@ int grab_standard_service_macro_r(nagios_macros *mac, int macro_type, service *t
|
|||||||
case MACRO_SERVICENOTIFICATIONID:
|
case MACRO_SERVICENOTIFICATIONID:
|
||||||
*output = (char *)mkstr("%lu", temp_service->current_notification_id);
|
*output = (char *)mkstr("%lu", temp_service->current_notification_id);
|
||||||
break;
|
break;
|
||||||
|
case MACRO_SERVICENOTIFICATIONENABLED:
|
||||||
|
*output = (char *)mkstr("%s", temp_service->notifications_enabled ? "YES" : "NO");
|
||||||
|
break;
|
||||||
|
case MACRO_SERVICENOTIFICATIONPERIOD:
|
||||||
|
*output = (char *)mkstr("%s", temp_service->notification_period);
|
||||||
|
break;
|
||||||
case MACRO_SERVICEEVENTID:
|
case MACRO_SERVICEEVENTID:
|
||||||
*output = (char *)mkstr("%lu", temp_service->current_event_id);
|
*output = (char *)mkstr("%lu", temp_service->current_event_id);
|
||||||
break;
|
break;
|
||||||
@ -2154,19 +2189,18 @@ int grab_standard_service_macro_r(nagios_macros *mac, int macro_type, service *t
|
|||||||
*output = (char *)mkstr("%u", temp_service->hourly_value);
|
*output = (char *)mkstr("%u", temp_service->hourly_value);
|
||||||
break;
|
break;
|
||||||
case MACRO_SERVICEINFOURL:
|
case MACRO_SERVICEINFOURL:
|
||||||
|
*free_macro = TRUE;
|
||||||
buf1 = get_url_encoded_string(temp_service->host_name);
|
buf1 = get_url_encoded_string(temp_service->host_name);
|
||||||
buf2 = get_url_encoded_string(temp_service->description);
|
buf2 = get_url_encoded_string(temp_service->description);
|
||||||
|
if (buf1 != NULL) {
|
||||||
|
if (buf2 != NULL) {
|
||||||
asprintf(output, "%s/cgi-bin/extinfo.cgi?type=2&host=%s&service=%s",
|
asprintf(output, "%s/cgi-bin/extinfo.cgi?type=2&host=%s&service=%s",
|
||||||
website_url ? website_url : "website_url not set",
|
website_url ? website_url : "website_url not set",
|
||||||
buf1, buf2);
|
buf1, buf2);
|
||||||
my_free(buf1);
|
free(buf2);
|
||||||
my_free(buf2);
|
}
|
||||||
break;
|
free(buf1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
my_free(buf1);
|
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -2194,6 +2228,7 @@ int grab_standard_service_macro_r(nagios_macros *mac, int macro_type, service *t
|
|||||||
switch(macro_type) {
|
switch(macro_type) {
|
||||||
case MACRO_SERVICEACTIONURL:
|
case MACRO_SERVICEACTIONURL:
|
||||||
case MACRO_SERVICENOTESURL:
|
case MACRO_SERVICENOTESURL:
|
||||||
|
*free_macro = TRUE;
|
||||||
process_macros_r(mac, *output, &temp_buffer, URL_ENCODE_MACRO_CHARS);
|
process_macros_r(mac, *output, &temp_buffer, URL_ENCODE_MACRO_CHARS);
|
||||||
*output = temp_buffer;
|
*output = temp_buffer;
|
||||||
break;
|
break;
|
||||||
@ -2544,8 +2579,8 @@ char *get_url_encoded_string(char *input) {
|
|||||||
(char)input[x] == '.' ||
|
(char)input[x] == '.' ||
|
||||||
(char)input[x] == '-' ||
|
(char)input[x] == '-' ||
|
||||||
(char)input[x] == '_' ||
|
(char)input[x] == '_' ||
|
||||||
(char)input[x] == '~')
|
(char)input[x] == '~') {
|
||||||
{
|
|
||||||
encoded_url_string[y++] = input[x];
|
encoded_url_string[y++] = input[x];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2803,6 +2838,10 @@ int init_macrox_names(void) {
|
|||||||
add_macrox_name(HOSTGROUPMEMBERADDRESSES);
|
add_macrox_name(HOSTGROUPMEMBERADDRESSES);
|
||||||
add_macrox_name(HOSTINFOURL);
|
add_macrox_name(HOSTINFOURL);
|
||||||
add_macrox_name(SERVICEINFOURL);
|
add_macrox_name(SERVICEINFOURL);
|
||||||
|
add_macrox_name(HOSTNOTIFICATIONENABLED);
|
||||||
|
add_macrox_name(SERVICENOTIFICATIONENABLED);
|
||||||
|
add_macrox_name(HOSTNOTIFICATIONPERIOD);
|
||||||
|
add_macrox_name(SERVICENOTIFICATIONPERIOD);
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
@ -2933,6 +2972,7 @@ int clear_service_macros_r(nagios_macros *mac) {
|
|||||||
my_free(mac->x[MACRO_SERVICENOTES]);
|
my_free(mac->x[MACRO_SERVICENOTES]);
|
||||||
|
|
||||||
my_free(mac->x[MACRO_SERVICEGROUPNAMES]);
|
my_free(mac->x[MACRO_SERVICEGROUPNAMES]);
|
||||||
|
my_free(mac->x[MACRO_SERVICEINFOURL]);
|
||||||
|
|
||||||
/* clear custom service variables */
|
/* clear custom service variables */
|
||||||
clear_custom_vars(&(mac->custom_service_vars));
|
clear_custom_vars(&(mac->custom_service_vars));
|
||||||
@ -2957,6 +2997,7 @@ int clear_host_macros_r(nagios_macros *mac) {
|
|||||||
|
|
||||||
/* numbers or by necessity autogenerated strings */
|
/* numbers or by necessity autogenerated strings */
|
||||||
my_free(mac->x[MACRO_HOSTGROUPNAMES]);
|
my_free(mac->x[MACRO_HOSTGROUPNAMES]);
|
||||||
|
my_free(mac->x[MACRO_HOSTINFOURL]);
|
||||||
|
|
||||||
/* clear custom host variables */
|
/* clear custom host variables */
|
||||||
clear_custom_vars(&(mac->custom_host_vars));
|
clear_custom_vars(&(mac->custom_host_vars));
|
||||||
|
@ -81,6 +81,7 @@ static const struct flag_map service_flag_map[] = {
|
|||||||
{ OPT_OK, 'o', "ok" },
|
{ OPT_OK, 'o', "ok" },
|
||||||
{ OPT_RECOVERY, 'r', "recovery" },
|
{ OPT_RECOVERY, 'r', "recovery" },
|
||||||
{ OPT_PENDING, 'p', "pending" },
|
{ OPT_PENDING, 'p', "pending" },
|
||||||
|
{ OPT_NOTIFICATIONS, 'N', "notifications" },
|
||||||
{ 0, 0, NULL },
|
{ 0, 0, NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -91,6 +92,7 @@ static const struct flag_map host_flag_map[] = {
|
|||||||
{ OPT_RECOVERY, 'r', "recovery" },
|
{ OPT_RECOVERY, 'r', "recovery" },
|
||||||
{ OPT_DOWNTIME, 's', "downtime" },
|
{ OPT_DOWNTIME, 's', "downtime" },
|
||||||
{ OPT_PENDING, 'p', "pending" },
|
{ OPT_PENDING, 'p', "pending" },
|
||||||
|
{ OPT_NOTIFICATIONS, 'N', "notifications" },
|
||||||
{ 0, 0, NULL },
|
{ 0, 0, NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -782,9 +784,6 @@ servicesmember *add_parent_service_to_service(service *svc, char *host_name, cha
|
|||||||
if(!svc || !host_name || !description || !*host_name || !*description)
|
if(!svc || !host_name || !description || !*host_name || !*description)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if((sm = calloc(1, sizeof(*sm))) == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (strcmp(svc->host_name, host_name) == 0 && strcmp(svc->description, description) == 0) {
|
if (strcmp(svc->host_name, host_name) == 0 && strcmp(svc->description, description) == 0) {
|
||||||
logit(NSLOG_CONFIG_ERROR, TRUE,
|
logit(NSLOG_CONFIG_ERROR, TRUE,
|
||||||
"Error: Host '%s' Service '%s' cannot be a child/parent of itself\n",
|
"Error: Host '%s' Service '%s' cannot be a child/parent of itself\n",
|
||||||
@ -792,6 +791,9 @@ servicesmember *add_parent_service_to_service(service *svc, char *host_name, cha
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if((sm = calloc(1, sizeof(*sm))) == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
if ((sm->host_name = strdup(host_name)) == NULL || (sm->service_description = strdup(description)) == NULL) {
|
if ((sm->host_name = strdup(host_name)) == NULL || (sm->service_description = strdup(description)) == NULL) {
|
||||||
/* there was an error copying (description is NULL now) */
|
/* there was an error copying (description is NULL now) */
|
||||||
my_free(sm->host_name);
|
my_free(sm->host_name);
|
||||||
@ -1201,6 +1203,7 @@ contact *add_contact(char *name, char *alias, char *email, char *pager, char **a
|
|||||||
if(!new_contact)
|
if(!new_contact)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
|
||||||
new_contact->host_notification_period = htp ? (char *)strdup(htp->name) : NULL;
|
new_contact->host_notification_period = htp ? (char *)strdup(htp->name) : NULL;
|
||||||
new_contact->service_notification_period = stp ? (char *)strdup(stp->name) : NULL;
|
new_contact->service_notification_period = stp ? (char *)strdup(stp->name) : NULL;
|
||||||
new_contact->host_notification_period_ptr = htp;
|
new_contact->host_notification_period_ptr = htp;
|
||||||
@ -2678,6 +2681,8 @@ int free_object_data(void) {
|
|||||||
if(this_host->address != this_host->name)
|
if(this_host->address != this_host->name)
|
||||||
my_free(this_host->address);
|
my_free(this_host->address);
|
||||||
my_free(this_host->name);
|
my_free(this_host->name);
|
||||||
|
my_free(this_host->check_period);
|
||||||
|
my_free(this_host->notification_period);
|
||||||
#ifdef NSCORE
|
#ifdef NSCORE
|
||||||
my_free(this_host->plugin_output);
|
my_free(this_host->plugin_output);
|
||||||
my_free(this_host->long_plugin_output);
|
my_free(this_host->long_plugin_output);
|
||||||
@ -2791,6 +2796,8 @@ int free_object_data(void) {
|
|||||||
my_free(this_contact->name);
|
my_free(this_contact->name);
|
||||||
my_free(this_contact->email);
|
my_free(this_contact->email);
|
||||||
my_free(this_contact->pager);
|
my_free(this_contact->pager);
|
||||||
|
my_free(this_contact->host_notification_period);
|
||||||
|
my_free(this_contact->service_notification_period);
|
||||||
for(j = 0; j < MAX_CONTACT_ADDRESSES; j++)
|
for(j = 0; j < MAX_CONTACT_ADDRESSES; j++)
|
||||||
my_free(this_contact->address[j]);
|
my_free(this_contact->address[j]);
|
||||||
|
|
||||||
@ -2858,6 +2865,8 @@ int free_object_data(void) {
|
|||||||
my_free(this_service->display_name);
|
my_free(this_service->display_name);
|
||||||
my_free(this_service->description);
|
my_free(this_service->description);
|
||||||
my_free(this_service->check_command);
|
my_free(this_service->check_command);
|
||||||
|
my_free(this_service->check_period);
|
||||||
|
my_free(this_service->notification_period);
|
||||||
#ifdef NSCORE
|
#ifdef NSCORE
|
||||||
my_free(this_service->plugin_output);
|
my_free(this_service->plugin_output);
|
||||||
my_free(this_service->long_plugin_output);
|
my_free(this_service->long_plugin_output);
|
||||||
|
@ -131,6 +131,44 @@ char *my_strtok(char *buffer, const char *tokens) {
|
|||||||
return sequence_head;
|
return sequence_head;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* fix the problem with my_strtok() strduping and causing intermittent memory leaks
|
||||||
|
* use as regular my_strtok, specifying FALSE for free_orig
|
||||||
|
* when done (before calling again), specify TRUE for free_orig for it to handle the free() */
|
||||||
|
char *my_strtok_with_free(char *buffer, const char *tokens, int free_orig) {
|
||||||
|
char *token_position = NULL;
|
||||||
|
char *sequence_head = NULL;
|
||||||
|
static char *my_strtok_buffer = NULL;
|
||||||
|
static char *original_my_strtok_buffer = NULL;
|
||||||
|
|
||||||
|
if(buffer != NULL) {
|
||||||
|
my_free(original_my_strtok_buffer);
|
||||||
|
if((my_strtok_buffer = (char *)strdup(buffer)) == NULL)
|
||||||
|
return NULL;
|
||||||
|
original_my_strtok_buffer = my_strtok_buffer;
|
||||||
|
}
|
||||||
|
else if (free_orig == TRUE) {
|
||||||
|
my_free(original_my_strtok_buffer);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
sequence_head = my_strtok_buffer;
|
||||||
|
|
||||||
|
if(sequence_head[0] == '\x0')
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
token_position = strchr(my_strtok_buffer, tokens[0]);
|
||||||
|
|
||||||
|
if(token_position == NULL) {
|
||||||
|
my_strtok_buffer = strchr(my_strtok_buffer, '\x0');
|
||||||
|
return sequence_head;
|
||||||
|
}
|
||||||
|
|
||||||
|
token_position[0] = '\x0';
|
||||||
|
my_strtok_buffer = token_position + 1;
|
||||||
|
|
||||||
|
return sequence_head;
|
||||||
|
}
|
||||||
|
|
||||||
/* fixes compiler problems under Solaris, since strsep() isn't included */
|
/* fixes compiler problems under Solaris, since strsep() isn't included */
|
||||||
/* this code is taken from the glibc source */
|
/* this code is taken from the glibc source */
|
||||||
char *my_strsep(char **stringp, const char *delim) {
|
char *my_strsep(char **stringp, const char *delim) {
|
||||||
|
324
configure.ac
324
configure.ac
@ -10,9 +10,9 @@ AC_PREFIX_DEFAULT(/usr/local/nagios)
|
|||||||
|
|
||||||
PKG_NAME=nagios
|
PKG_NAME=nagios
|
||||||
|
|
||||||
PKG_VERSION="4.3.4"
|
PKG_VERSION="4.4.3"
|
||||||
PKG_HOME_URL="https://www.nagios.org/"
|
PKG_HOME_URL="https://www.nagios.org/"
|
||||||
PKG_REL_DATE="2017-08-24"
|
PKG_REL_DATE="2019-01-15"
|
||||||
|
|
||||||
dnl Figure out how to invoke "install" and what install options to use.
|
dnl Figure out how to invoke "install" and what install options to use.
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
@ -51,6 +51,50 @@ AC_TYPE_SIZE_T
|
|||||||
AC_TYPE_SIGNAL
|
AC_TYPE_SIGNAL
|
||||||
AC_TYPE_GETGROUPS
|
AC_TYPE_GETGROUPS
|
||||||
|
|
||||||
|
dnl Get Nagios autoconf-macros
|
||||||
|
AC_NAGIOS_GET_OS
|
||||||
|
AC_NAGIOS_GET_DISTRIB_TYPE
|
||||||
|
AC_NAGIOS_GET_INIT
|
||||||
|
AC_NAGIOS_GET_INETD
|
||||||
|
AC_NAGIOS_GET_PATHS
|
||||||
|
AC_NAGIOS_GET_FILES
|
||||||
|
|
||||||
|
dnl We only have these options available so we need to make them work until there are more
|
||||||
|
if test "x$src_init" != "xdefault-init" -a \
|
||||||
|
"x$src_init" != "xdefault-service" -a \
|
||||||
|
"x$src_init" != "xopenrc-init" -a \
|
||||||
|
"x$src_init" != "xnewbsd-init" -a \
|
||||||
|
"x$src_init" != "xopenbsd-init" -a \
|
||||||
|
"x$src_init" != "xupstart-init"; then
|
||||||
|
|
||||||
|
src_init="default-init"
|
||||||
|
init_type="sysv"
|
||||||
|
initname="nagios"
|
||||||
|
|
||||||
|
if test "x$initdiroverridden" != "xyes"; then
|
||||||
|
initdir="/etc/init.d"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl We need to check for a lock file specified
|
||||||
|
dnl And if the built in check didn't work (the N/A)
|
||||||
|
dnl then we need to find one!
|
||||||
|
if test "x$subsyslockdir" = "xN/A"; then
|
||||||
|
if test -d "/var/run"; then
|
||||||
|
subsyslockdir="/var/run"
|
||||||
|
subsyslockfile="/var/run/$INIT_PROG.lock"
|
||||||
|
else
|
||||||
|
subsyslockdir="/usr/local/nagios/var/"
|
||||||
|
subsyslockfile="/usr/local/nagios/var/$INIT_PROG.lock"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
AC_ARG_WITH(lockfile,
|
||||||
|
AC_HELP_STRING([--with-lockfile=<path>],
|
||||||
|
[sets path for lockfile]),
|
||||||
|
subsyslockfile=$withval,
|
||||||
|
subsyslockfile=$subsyslockfile
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
dnl Check for asprintf() and friends...
|
dnl Check for asprintf() and friends...
|
||||||
AC_CACHE_CHECK([for va_copy],ac_cv_HAVE_VA_COPY,[
|
AC_CACHE_CHECK([for va_copy],ac_cv_HAVE_VA_COPY,[
|
||||||
@ -58,7 +102,7 @@ AC_TRY_LINK([#include <stdarg.h>
|
|||||||
va_list ap1,ap2;], [va_copy(ap1,ap2);],
|
va_list ap1,ap2;], [va_copy(ap1,ap2);],
|
||||||
ac_cv_HAVE_VA_COPY=yes,
|
ac_cv_HAVE_VA_COPY=yes,
|
||||||
ac_cv_HAVE_VA_COPY=no)])
|
ac_cv_HAVE_VA_COPY=no)])
|
||||||
if test x"$ac_cv_HAVE_VA_COPY" = x"yes"; then
|
if test "x$ac_cv_HAVE_VA_COPY" = "xyes"; then
|
||||||
AC_DEFINE(HAVE_VA_COPY,1,[Whether va_copy() is available])
|
AC_DEFINE(HAVE_VA_COPY,1,[Whether va_copy() is available])
|
||||||
else
|
else
|
||||||
AC_CACHE_CHECK([for __va_copy],ac_cv_HAVE___VA_COPY,[
|
AC_CACHE_CHECK([for __va_copy],ac_cv_HAVE___VA_COPY,[
|
||||||
@ -66,7 +110,7 @@ else
|
|||||||
va_list ap1,ap2;], [__va_copy(ap1,ap2);],
|
va_list ap1,ap2;], [__va_copy(ap1,ap2);],
|
||||||
ac_cv_HAVE___VA_COPY=yes,
|
ac_cv_HAVE___VA_COPY=yes,
|
||||||
ac_cv_HAVE___VA_COPY=no)])
|
ac_cv_HAVE___VA_COPY=no)])
|
||||||
if test x"$ac_cv_HAVE___VA_COPY" = x"yes"; then
|
if test "x$ac_cv_HAVE___VA_COPY" = "xyes"; then
|
||||||
AC_DEFINE(HAVE___VA_COPY,1,[Whether __va_copy() is available])
|
AC_DEFINE(HAVE___VA_COPY,1,[Whether __va_copy() is available])
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@ -103,7 +147,7 @@ void foo(const char *format, ...) {
|
|||||||
main() { foo("hello"); }
|
main() { foo("hello"); }
|
||||||
],
|
],
|
||||||
ac_cv_HAVE_C99_VSNPRINTF=yes,ac_cv_HAVE_C99_VSNPRINTF=no,ac_cv_HAVE_C99_VSNPRINTF=cross)])
|
ac_cv_HAVE_C99_VSNPRINTF=yes,ac_cv_HAVE_C99_VSNPRINTF=no,ac_cv_HAVE_C99_VSNPRINTF=cross)])
|
||||||
if test x"$ac_cv_HAVE_C99_VSNPRINTF" = x"yes"; then
|
if test "x$ac_cv_HAVE_C99_VSNPRINTF" = "xyes"; then
|
||||||
AC_DEFINE(HAVE_C99_VSNPRINTF,1,[Define if system has C99 compatible vsnprintf])
|
AC_DEFINE(HAVE_C99_VSNPRINTF,1,[Define if system has C99 compatible vsnprintf])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -113,11 +157,11 @@ AC_SUBST(SNPRINTF_O)
|
|||||||
|
|
||||||
dnl Checks for library functions.
|
dnl Checks for library functions.
|
||||||
AC_SEARCH_LIBS([getservbyname],[nsl],
|
AC_SEARCH_LIBS([getservbyname],[nsl],
|
||||||
[if test "$ac_cv_search_getservbyname" != "none required"; then
|
[if test "x$ac_cv_search_getservbyname" != "xnone required"; then
|
||||||
SOCKETLIBS="$SOCKETLIBS -lnsl"
|
SOCKETLIBS="$SOCKETLIBS -lnsl"
|
||||||
fi])
|
fi])
|
||||||
AC_SEARCH_LIBS([connect],[socket],
|
AC_SEARCH_LIBS([connect],[socket],
|
||||||
[if test "$ac_cv_search_connect" != "none required"; then
|
[if test "x$ac_cv_search_connect" != "xnone required"; then
|
||||||
SOCKETLIBS="$SOCKETLIBS -lsocket"
|
SOCKETLIBS="$SOCKETLIBS -lsocket"
|
||||||
fi])
|
fi])
|
||||||
AC_SUBST(SOCKETLIBS)
|
AC_SUBST(SOCKETLIBS)
|
||||||
@ -139,6 +183,7 @@ AC_SEARCH_LIBS(nanosleep,[rt posix4],,[
|
|||||||
exit 1
|
exit 1
|
||||||
])
|
])
|
||||||
|
|
||||||
|
dnl TODO: host_os needs changed to reflect AC_NAGIOS
|
||||||
case $host_os in
|
case $host_os in
|
||||||
*bsd*|darwin*)
|
*bsd*|darwin*)
|
||||||
root_grp=wheel
|
root_grp=wheel
|
||||||
@ -153,8 +198,27 @@ AC_SUBST(root_grp)
|
|||||||
INIT_OPTS="-o root -g $root_grp"
|
INIT_OPTS="-o root -g $root_grp"
|
||||||
AC_SUBST(INIT_OPTS)
|
AC_SUBST(INIT_OPTS)
|
||||||
|
|
||||||
|
dnl Just enable all of the testing things
|
||||||
|
dnl --enable-debugging --enable-coverage --with-this-user
|
||||||
|
dnl This is here because if not, the user override doesnt happen
|
||||||
|
ENABLE_TESTING=no
|
||||||
|
AC_ARG_ENABLE(testing,AC_HELP_STRING([--enable-testing],[DEBUGGING ONLY - Enable testing options]),
|
||||||
|
[ENABLE_TESTING=$enableval])
|
||||||
|
|
||||||
|
not_a_user="^^^^^"
|
||||||
|
AC_ARG_WITH(this_user,AC_HELP_STRING([--with-this-user],[sets all user/group info for current user running ./configure]),this_user=$USER,this_user=$not_a_user)
|
||||||
|
if test "x$ENABLE_TESTING" = "xyes"; then
|
||||||
|
this_user=$USER
|
||||||
|
fi
|
||||||
|
|
||||||
AC_ARG_WITH(nagios_user,AC_HELP_STRING([--with-nagios-user=<user>],[sets user name to run nagios]),nagios_user=$withval,nagios_user=nagios)
|
AC_ARG_WITH(nagios_user,AC_HELP_STRING([--with-nagios-user=<user>],[sets user name to run nagios]),nagios_user=$withval,nagios_user=nagios)
|
||||||
AC_ARG_WITH(nagios_group,AC_HELP_STRING([--with-nagios-group=<grp>],[sets group name to run nagios]),nagios_grp=$withval,nagios_grp=nagios)
|
AC_ARG_WITH(nagios_group,AC_HELP_STRING([--with-nagios-group=<grp>],[sets group name to run nagios]),nagios_grp=$withval,nagios_grp=nagios)
|
||||||
|
|
||||||
|
if test "x$this_user" != "x$not_a_user"; then
|
||||||
|
nagios_user=$this_user
|
||||||
|
nagios_grp=$this_user
|
||||||
|
fi
|
||||||
|
|
||||||
AC_SUBST(nagios_user)
|
AC_SUBST(nagios_user)
|
||||||
AC_SUBST(nagios_grp)
|
AC_SUBST(nagios_grp)
|
||||||
AC_DEFINE_UNQUOTED(DEFAULT_NAGIOS_USER,"$nagios_user",[user name to run nagios])
|
AC_DEFINE_UNQUOTED(DEFAULT_NAGIOS_USER,"$nagios_user",[user name to run nagios])
|
||||||
@ -164,6 +228,12 @@ AC_SUBST(INSTALL_OPTS)
|
|||||||
|
|
||||||
AC_ARG_WITH(command_user,AC_HELP_STRING([--with-command-user=<user>],[sets user name for command access]),command_user=$withval,command_user=$nagios_user)
|
AC_ARG_WITH(command_user,AC_HELP_STRING([--with-command-user=<user>],[sets user name for command access]),command_user=$withval,command_user=$nagios_user)
|
||||||
AC_ARG_WITH(command_group,AC_HELP_STRING([--with-command-group=<grp>],[sets group name for command access]),command_grp=$withval,command_grp=$nagios_grp)
|
AC_ARG_WITH(command_group,AC_HELP_STRING([--with-command-group=<grp>],[sets group name for command access]),command_grp=$withval,command_grp=$nagios_grp)
|
||||||
|
|
||||||
|
if test "x$this_user" != "x$not_a_user"; then
|
||||||
|
command_user=$this_user
|
||||||
|
command_grp=$this_user
|
||||||
|
fi
|
||||||
|
|
||||||
AC_SUBST(command_user)
|
AC_SUBST(command_user)
|
||||||
AC_SUBST(command_grp)
|
AC_SUBST(command_grp)
|
||||||
COMMAND_OPTS="-o $command_user -g $command_grp"
|
COMMAND_OPTS="-o $command_user -g $command_grp"
|
||||||
@ -177,15 +247,35 @@ AC_ARG_WITH(mail,
|
|||||||
MAIL_PROG=$withval,
|
MAIL_PROG=$withval,
|
||||||
MAIL_PROG=no
|
MAIL_PROG=no
|
||||||
)
|
)
|
||||||
if test x$MAIL_PROG = xno; then
|
if test "x$MAIL_PROG" = "xno"; then
|
||||||
AC_PATH_PROG(MAIL_PROG,mail)
|
AC_PATH_PROG(MAIL_PROG,mail)
|
||||||
fi
|
fi
|
||||||
dnl Fix for systems that don't (yet) have mail/mailx installed...
|
dnl Fix for systems that don't (yet) have mail/mailx installed...
|
||||||
if test x$MAIL_PROG = x; then
|
if test "x$MAIL_PROG" = "x"; then
|
||||||
|
if which mail >/dev/null; then
|
||||||
|
MAIL_PROG=`which mail`
|
||||||
|
elif which sendmail >/dev/null; then
|
||||||
|
MAIL_PROG=`which sendmail`
|
||||||
|
else
|
||||||
MAIL_PROG="/bin/mail"
|
MAIL_PROG="/bin/mail"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
AC_SUBST(MAIL_PROG)
|
AC_SUBST(MAIL_PROG)
|
||||||
|
|
||||||
|
dnl Determine location of the rm binary
|
||||||
|
BIN_RM=`which rm`
|
||||||
|
if test $? -ne 0; then
|
||||||
|
BIN_RM='/bin/rm'
|
||||||
|
fi
|
||||||
|
AC_SUBST(BIN_RM)
|
||||||
|
|
||||||
|
dnl Determine location of the kill binary
|
||||||
|
BIN_KILL=`which kill`
|
||||||
|
if test $? -ne 0; then
|
||||||
|
BIN_KILL='/bin/kill'
|
||||||
|
fi
|
||||||
|
AC_SUBST(BIN_KILL)
|
||||||
|
|
||||||
dnl Check for location of Apache conf.d directory
|
dnl Check for location of Apache conf.d directory
|
||||||
HTTP_CONF=no
|
HTTP_CONF=no
|
||||||
AC_ARG_WITH(httpd_conf,
|
AC_ARG_WITH(httpd_conf,
|
||||||
@ -195,19 +285,19 @@ AC_ARG_WITH(httpd_conf,
|
|||||||
HTTPD_CONF=no
|
HTTPD_CONF=no
|
||||||
)
|
)
|
||||||
LN_HTTPD_SITES_ENABLED=0
|
LN_HTTPD_SITES_ENABLED=0
|
||||||
if test x$HTTPD_CONF = xno; then
|
if test "x$HTTPD_CONF" = "xno"; then
|
||||||
if test -d /etc/httpd/conf.d; then
|
if test -d "/etc/httpd/conf.d"; then
|
||||||
HTTPD_CONF="/etc/httpd/conf.d"
|
HTTPD_CONF="/etc/httpd/conf.d"
|
||||||
elif test -d /etc/apache2/conf.d; then
|
elif test -d "/etc/apache2/conf.d"; then
|
||||||
HTTPD_CONF="/etc/apache2/conf.d"
|
HTTPD_CONF="/etc/apache2/conf.d"
|
||||||
elif test -d /etc/apache2/sites-available; then
|
elif test -d "/etc/apache2/sites-available"; then
|
||||||
HTTPD_CONF="/etc/apache2/sites-available"
|
HTTPD_CONF="/etc/apache2/sites-available"
|
||||||
if test -d /etc/apache2/sites-enabled; then
|
if test -d "/etc/apache2/sites-enabled"; then
|
||||||
LN_HTTPD_SITES_ENABLED=1
|
LN_HTTPD_SITES_ENABLED=1
|
||||||
fi
|
fi
|
||||||
elif test -d /etc/apache2/sites-enabled; then
|
elif test -d "/etc/apache2/sites-enabled"; then
|
||||||
HTTPD_CONF="/etc/apache2/sites-enabled"
|
HTTPD_CONF="/etc/apache2/sites-enabled"
|
||||||
elif test -d /etc/apache/conf.d; then
|
elif test -d "/etc/apache/conf.d"; then
|
||||||
HTTPD_CONF="/etc/apache/conf.d"
|
HTTPD_CONF="/etc/apache/conf.d"
|
||||||
else
|
else
|
||||||
HTTPD_CONF="/etc/httpd/conf.d"
|
HTTPD_CONF="/etc/httpd/conf.d"
|
||||||
@ -216,6 +306,16 @@ fi
|
|||||||
AC_SUBST(HTTPD_CONF)
|
AC_SUBST(HTTPD_CONF)
|
||||||
AC_SUBST(LN_HTTPD_SITES_ENABLED)
|
AC_SUBST(LN_HTTPD_SITES_ENABLED)
|
||||||
|
|
||||||
|
dnl Check if RLIMIT_PROC exists
|
||||||
|
AC_TRY_COMPILE([#ifdef __STDC__
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/resource.h>
|
||||||
|
#endif],
|
||||||
|
[struct rlimit rlim;
|
||||||
|
int ilim = getrlimit(RLIMIT_NPROC, &rlim);],
|
||||||
|
[AC_DEFINE(DETECT_RLIMIT_PROBLEM,1,[System has RLIMIT_PROC]) AC_MSG_RESULT([checking for RLIMIT_PROC... yes])],
|
||||||
|
[AC_MSG_RESULT([checking for RLIMIT_PROC... no])])
|
||||||
|
|
||||||
dnl Location of check result path
|
dnl Location of check result path
|
||||||
CHECKRESULTDIR=no
|
CHECKRESULTDIR=no
|
||||||
AC_ARG_WITH(checkresult-dir,
|
AC_ARG_WITH(checkresult-dir,
|
||||||
@ -224,12 +324,13 @@ AC_ARG_WITH(checkresult-dir,
|
|||||||
CHECKRESULTDIR=$withval,
|
CHECKRESULTDIR=$withval,
|
||||||
CHECKRESULTDIR=no
|
CHECKRESULTDIR=no
|
||||||
)
|
)
|
||||||
if test x$CHECKRESULTDIR = xno; then
|
if test "x$CHECKRESULTDIR" = "xno"; then
|
||||||
CHECKRESULTDIR="$localstatedir/spool/checkresults"
|
CHECKRESULTDIR="$localstatedir/spool/checkresults"
|
||||||
fi
|
fi
|
||||||
AC_SUBST(CHECKRESULTDIR)
|
AC_SUBST(CHECKRESULTDIR)
|
||||||
|
|
||||||
dnl Location of check result path
|
dnl Location of check result path
|
||||||
|
dnl TODO: this should be moved to autoconf-macros
|
||||||
TMPDIR=no
|
TMPDIR=no
|
||||||
AC_ARG_WITH(temp-dir,
|
AC_ARG_WITH(temp-dir,
|
||||||
AC_HELP_STRING([--with-temp-dir=<path>],
|
AC_HELP_STRING([--with-temp-dir=<path>],
|
||||||
@ -237,54 +338,20 @@ AC_ARG_WITH(temp-dir,
|
|||||||
TMPDIR=$withval,
|
TMPDIR=$withval,
|
||||||
TMPDIR=no
|
TMPDIR=no
|
||||||
)
|
)
|
||||||
if test x$TMPDIR = xno; then
|
if test "x$TMPDIR" = "xno"; then
|
||||||
TMPDIR="/tmp"
|
TMPDIR="/tmp"
|
||||||
fi
|
fi
|
||||||
AC_SUBST(TMPDIR)
|
AC_SUBST(TMPDIR)
|
||||||
|
|
||||||
dnl Check for location of init scripts
|
|
||||||
init_dir=/etc/rc.d/init.d
|
|
||||||
if test -d /etc/rc.d/init.d; then
|
|
||||||
init_dir="/etc/rc.d/init.d"
|
|
||||||
elif test -d /usr/local/etc/rc.d; then
|
|
||||||
init_dir="/usr/local/etc/rc.d"
|
|
||||||
elif test -d /etc/rc.d; then
|
|
||||||
init_dir="/etc/rc.d"
|
|
||||||
elif test -d /etc/init.d; then
|
|
||||||
init_dir="/etc/init.d"
|
|
||||||
elif test -d /sbin/init.d; then
|
|
||||||
init_dir="/sbin/init.d"
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl User can override init script location
|
|
||||||
AC_ARG_WITH(init_dir,
|
|
||||||
AC_HELP_STRING([--with-init-dir=<path>],
|
|
||||||
[sets directory to place init script into]),
|
|
||||||
init_dir=$withval
|
|
||||||
)
|
|
||||||
AC_SUBST(init_dir)
|
|
||||||
|
|
||||||
dnl User can override lock file location
|
|
||||||
dnl Use the /var/run/ path by default
|
|
||||||
dnl and use /run if it is available
|
|
||||||
|
|
||||||
default_lockfile_path=/var/run/nagios.lock
|
|
||||||
if test -d /run; then
|
|
||||||
default_lockfile_path=/run/nagios.lock
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_ARG_WITH(lockfile,
|
|
||||||
AC_HELP_STRING([--with-lockfile=<path>],
|
|
||||||
[sets path for lock file (default: [/var]/run/nagios.lock)]),
|
|
||||||
lockfile=$withval,
|
|
||||||
lockfile=$default_lockfile_path
|
|
||||||
)
|
|
||||||
AC_SUBST(lockfile)
|
|
||||||
|
|
||||||
dnl Determine the library to be used by the iobroker
|
dnl Determine the library to be used by the iobroker
|
||||||
|
|
||||||
dnl epoll_*() is linux specific and was added to glibc 2.3.2, so we
|
dnl epoll_*() is linux specific and was added to glibc 2.3.2, so we
|
||||||
dnl check for 2.4 and use epoll() if we're on that version or later.
|
dnl check for 2.4 and use epoll() if we're on that version or later.
|
||||||
|
dnl But we still need to set the variable GLIBC_NEWER_2_4 since
|
||||||
|
dnl it is used later in calculations perhaps by OSes not linux
|
||||||
|
|
||||||
|
GLIBC_NEWER_2_4=0
|
||||||
|
|
||||||
case $host_os in
|
case $host_os in
|
||||||
linux*)
|
linux*)
|
||||||
@ -304,7 +371,7 @@ linux*)
|
|||||||
[GLIBC_NEWER_2_4=1; AC_MSG_RESULT(yes)],
|
[GLIBC_NEWER_2_4=1; AC_MSG_RESULT(yes)],
|
||||||
[GLIBC_NEWER_2_4=0; AC_MSG_RESULT(no)]
|
[GLIBC_NEWER_2_4=0; AC_MSG_RESULT(no)]
|
||||||
)
|
)
|
||||||
if test $GLIBC_NEWER_2_4 -eq 1; then
|
if test "$GLIBC_NEWER_2_4" -eq 1; then
|
||||||
AC_CHECK_HEADER([sys/epoll.h])
|
AC_CHECK_HEADER([sys/epoll.h])
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
@ -320,7 +387,7 @@ AC_ARG_WITH(iobroker,
|
|||||||
|
|
||||||
case $IOBROKER_METHOD in
|
case $IOBROKER_METHOD in
|
||||||
epoll*)
|
epoll*)
|
||||||
if test $GLIBC_NEWER_2_4 -eq 1 -a x$ac_cv_header_sys_epoll_h = xyes ; then
|
if test "$GLIBC_NEWER_2_4" -eq 1 -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
|
||||||
AC_DEFINE([IOBROKER_USES_EPOLL])
|
AC_DEFINE([IOBROKER_USES_EPOLL])
|
||||||
else
|
else
|
||||||
echo "\"epoll\" is not available as an iobroker method."
|
echo "\"epoll\" is not available as an iobroker method."
|
||||||
@ -329,7 +396,7 @@ epoll*)
|
|||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
poll*)
|
poll*)
|
||||||
if test x$ac_cv_header_sys_poll_h = xyes -o x$ac_cv_header_poll_h = xyes ; then
|
if test "x$ac_cv_header_sys_poll_h" = "xyes" -o "x$ac_cv_header_poll_h" = "xyes"; then
|
||||||
AC_DEFINE([IOBROKER_USES_POLL])
|
AC_DEFINE([IOBROKER_USES_POLL])
|
||||||
else
|
else
|
||||||
echo "\"poll\" is not available as an iobroker method."
|
echo "\"poll\" is not available as an iobroker method."
|
||||||
@ -338,7 +405,7 @@ poll*)
|
|||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
select*)
|
select*)
|
||||||
if test x$ac_cv_header_sys_select_h = xyes ; then
|
if test "x$ac_cv_header_sys_select_h" = "xyes"; then
|
||||||
AC_DEFINE([IOBROKER_USES_SELECT])
|
AC_DEFINE([IOBROKER_USES_SELECT])
|
||||||
else
|
else
|
||||||
echo "\"select\" is not available as an iobroker method."
|
echo "\"select\" is not available as an iobroker method."
|
||||||
@ -347,13 +414,13 @@ select*)
|
|||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
none*)
|
none*)
|
||||||
if test $GLIBC_NEWER_2_4 -eq 1 -a x$ac_cv_header_sys_epoll_h = xyes ; then
|
if test "$GLIBC_NEWER_2_4" -eq 1 -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
|
||||||
AC_DEFINE([IOBROKER_USES_EPOLL])
|
AC_DEFINE([IOBROKER_USES_EPOLL])
|
||||||
IOBROKER_METHOD="epoll"
|
IOBROKER_METHOD="epoll"
|
||||||
elif test x$ac_cv_header_sys_poll_h = xyes -o x$ac_cv_header_poll_h = xyes ; then
|
elif test "x$ac_cv_header_sys_poll_h" = "xyes" -o "x$ac_cv_header_poll_h" = "xyes"; then
|
||||||
AC_DEFINE([IOBROKER_USES_POLL])
|
AC_DEFINE([IOBROKER_USES_POLL])
|
||||||
IOBROKER_METHOD="poll"
|
IOBROKER_METHOD="poll"
|
||||||
elif test x$ac_cv_header_sys_select_h = xyes ; then
|
elif test "x$ac_cv_header_sys_select_h" = "xyes"; then
|
||||||
AC_DEFINE([IOBROKER_USES_SELECT])
|
AC_DEFINE([IOBROKER_USES_SELECT])
|
||||||
IOBROKER_METHOD="select"
|
IOBROKER_METHOD="select"
|
||||||
else
|
else
|
||||||
@ -381,7 +448,21 @@ AC_ARG_WITH(gd-inc,
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
TRYGD=yep
|
TRYGD=yes
|
||||||
|
|
||||||
|
dnl 'NERD' is now disabled by default. enable it for functionality
|
||||||
|
NERD=no
|
||||||
|
NERD_O=""
|
||||||
|
AC_ARG_ENABLE(nerd,
|
||||||
|
AC_HELP_STRING([--enable-nerd],
|
||||||
|
[enables Nagios Event Radio Dispatch (NERD)]),
|
||||||
|
NERD=yes
|
||||||
|
)
|
||||||
|
if test "x$NERD" = "xyes"; then
|
||||||
|
AC_DEFINE_UNQUOTED(ENABLE_NERD,,[defined if user enabled NERD (radio dispatcher)])
|
||||||
|
NERD_O="nerd.o"
|
||||||
|
fi
|
||||||
|
AC_SUBST(NERD_O)
|
||||||
|
|
||||||
dnl 'corewindow' is now disabled. Allow it to be enabled if someone wants it
|
dnl 'corewindow' is now disabled. Allow it to be enabled if someone wants it
|
||||||
COREWINDOW=no
|
COREWINDOW=no
|
||||||
@ -393,7 +474,7 @@ AC_ARG_ENABLE(corewindow,
|
|||||||
AC_SUBST(COREWINDOW)
|
AC_SUBST(COREWINDOW)
|
||||||
|
|
||||||
dnl statusmap CGI enabled by default, unless users chooses not to use it
|
dnl statusmap CGI enabled by default, unless users chooses not to use it
|
||||||
TRYSTATUSMAP=yep
|
TRYSTATUSMAP=yes
|
||||||
AC_ARG_ENABLE(statusmap,
|
AC_ARG_ENABLE(statusmap,
|
||||||
AC_HELP_STRING([--disable-statusmap],
|
AC_HELP_STRING([--disable-statusmap],
|
||||||
[disables compilation of statusmap CGI]),
|
[disables compilation of statusmap CGI]),
|
||||||
@ -402,14 +483,14 @@ AC_ARG_ENABLE(statusmap,
|
|||||||
|
|
||||||
|
|
||||||
dnl statuswrl CGI enabled by default, unless users chooses not to use it
|
dnl statuswrl CGI enabled by default, unless users chooses not to use it
|
||||||
TRYSTATUSWRL=yep
|
TRYSTATUSWRL=yes
|
||||||
AC_ARG_ENABLE(statuswrl,
|
AC_ARG_ENABLE(statuswrl,
|
||||||
AC_HELP_STRING([--disable-statuswrl],
|
AC_HELP_STRING([--disable-statuswrl],
|
||||||
[disables compilation of statuswrl (VRML) CGI]),
|
[disables compilation of statuswrl (VRML) CGI]),
|
||||||
TRYSTATUSWRL=nope
|
TRYSTATUSWRL=nope
|
||||||
)
|
)
|
||||||
|
|
||||||
if test x$TRYSTATUSWRL = xyep; then
|
if test "x$TRYSTATUSWRL" = "xyes"; then
|
||||||
AC_DEFINE_UNQUOTED(USE_STATUSWRL,,[statuswrl CGI enabled by default, unless users chooses not to use it])
|
AC_DEFINE_UNQUOTED(USE_STATUSWRL,,[statuswrl CGI enabled by default, unless users chooses not to use it])
|
||||||
CGIEXTRAS="$CGIEXTRAS statuswrl.cgi"
|
CGIEXTRAS="$CGIEXTRAS statuswrl.cgi"
|
||||||
fi
|
fi
|
||||||
@ -464,7 +545,7 @@ char $2();
|
|||||||
|
|
||||||
|
|
||||||
dnl Should we try and detect the GD libs?
|
dnl Should we try and detect the GD libs?
|
||||||
if test x$TRYGD = xyep; then
|
if test "x$TRYGD" = "xyes"; then
|
||||||
|
|
||||||
dnl libiconv is required on some systems - tack it on if found
|
dnl libiconv is required on some systems - tack it on if found
|
||||||
AC_CHECK_LIB(iconv,main,ICONV=-liconv,)
|
AC_CHECK_LIB(iconv,main,ICONV=-liconv,)
|
||||||
@ -473,36 +554,36 @@ if test x$TRYGD = xyep; then
|
|||||||
|
|
||||||
dnl GD > 1.8.3 requires the TrueType library to be present as well, so test for that first...
|
dnl GD > 1.8.3 requires the TrueType library to be present as well, so test for that first...
|
||||||
JMD_CHECK_LIB_ORDER(gd,gdImagePng,1,[
|
JMD_CHECK_LIB_ORDER(gd,gdImagePng,1,[
|
||||||
GDLIBFOUND=yep
|
GDLIBFOUND=yes
|
||||||
GDLIBS="-lgd -lttf -lpng -ljpeg -lz -lm"
|
GDLIBS="-lgd -lttf -lpng -ljpeg -lz -lm"
|
||||||
],:,[-lttf -lpng -ljpeg -lz -lm])
|
],:,[-lttf -lpng -ljpeg -lz -lm])
|
||||||
|
|
||||||
dnl GD > 1.8.1 requires the jpeg library to be present as well, so test for that...
|
dnl GD > 1.8.1 requires the jpeg library to be present as well, so test for that...
|
||||||
if test x$GDLIBFOUND = x; then
|
if test "x$GDLIBFOUND" = "x"; then
|
||||||
JMD_CHECK_LIB_ORDER(gd,gdImagePng,2,[
|
JMD_CHECK_LIB_ORDER(gd,gdImagePng,2,[
|
||||||
GDLIBFOUND=yep
|
GDLIBFOUND=yes
|
||||||
GDLIBS="-lgd $ICONV -lpng -ljpeg -lz -lm"
|
GDLIBS="-lgd $ICONV -lpng -ljpeg -lz -lm"
|
||||||
],:,[$ICONV -lpng -ljpeg -lz -lm])
|
],:,[$ICONV -lpng -ljpeg -lz -lm])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl If we failed the first test, try without jpeg library
|
dnl If we failed the first test, try without jpeg library
|
||||||
if test x$GDLIBFOUND = x; then
|
if test "x$GDLIBFOUND" = "x"; then
|
||||||
JMD_CHECK_LIB_ORDER(gd,gdImagePng,3,[
|
JMD_CHECK_LIB_ORDER(gd,gdImagePng,3,[
|
||||||
GDLIBFOUND=yep
|
GDLIBFOUND=yes
|
||||||
GDLIBS="-lgd $ICONV -lz -lm -lpng"
|
GDLIBS="-lgd $ICONV -lz -lm -lpng"
|
||||||
],:,[$ICONV -lz -lm -lpng])
|
],:,[$ICONV -lz -lm -lpng])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl We failed again, so try a different library ordering (without jpeg libs)
|
dnl We failed again, so try a different library ordering (without jpeg libs)
|
||||||
if test x$GDLIBFOUND = x; then
|
if test "x$GDLIBFOUND" = "x"; then
|
||||||
JMD_CHECK_LIB_ORDER(gd,gdImagePng,4,[
|
JMD_CHECK_LIB_ORDER(gd,gdImagePng,4,[
|
||||||
GDLIBFOUND=yep
|
GDLIBFOUND=yes
|
||||||
GDLIBS="-lgd $ICONV -lpng -lz -lm"
|
GDLIBS="-lgd $ICONV -lpng -lz -lm"
|
||||||
],:,[$ICONV -lpng -lz -lm])
|
],:,[$ICONV -lpng -lz -lm])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl Did we find the necessary GD libraries?
|
dnl Did we find the necessary GD libraries?
|
||||||
if test x$GDLIBFOUND = x; then
|
if test "x$GDLIBFOUND" = "x"; then
|
||||||
echo ""
|
echo ""
|
||||||
echo ""
|
echo ""
|
||||||
echo "*** GD, PNG, and/or JPEG libraries could not be located... *********"
|
echo "*** GD, PNG, and/or JPEG libraries could not be located... *********"
|
||||||
@ -538,8 +619,9 @@ if test x$TRYGD = xyep; then
|
|||||||
|
|
||||||
dnl We found the GD lib!
|
dnl We found the GD lib!
|
||||||
else
|
else
|
||||||
echo "GD library was found!"
|
AC_MSG_CHECKING([for GD library])
|
||||||
if test x$TRYSTATUSMAP = xyep; then
|
AC_MSG_RESULT([yes])
|
||||||
|
if test "x$TRYSTATUSMAP" = "xyes"; then
|
||||||
AC_DEFINE_UNQUOTED(USE_STATUSMAP,,[defined if the user chose to include status map])
|
AC_DEFINE_UNQUOTED(USE_STATUSMAP,,[defined if the user chose to include status map])
|
||||||
CGIEXTRAS="$CGIEXTRAS statusmap.cgi"
|
CGIEXTRAS="$CGIEXTRAS statusmap.cgi"
|
||||||
AC_CHECK_LIB(gd,gdImageCreateTrueColor,
|
AC_CHECK_LIB(gd,gdImageCreateTrueColor,
|
||||||
@ -579,7 +661,7 @@ AC_ARG_ENABLE(nanosleep,
|
|||||||
USE_NANOSLEEP=$enableval,
|
USE_NANOSLEEP=$enableval,
|
||||||
USE_NANOSLEEP=yes
|
USE_NANOSLEEP=yes
|
||||||
)
|
)
|
||||||
if test x$USE_NANOSLEEP = xyes; then
|
if test "x$USE_NANOSLEEP" = "xyes"; then
|
||||||
AC_DEFINE_UNQUOTED(USE_NANOSLEEP,,[enables use of nanosleep (instead of sleep)])
|
AC_DEFINE_UNQUOTED(USE_NANOSLEEP,,[enables use of nanosleep (instead of sleep)])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -592,24 +674,24 @@ AC_ARG_ENABLE(event-broker,
|
|||||||
)
|
)
|
||||||
|
|
||||||
BROKER_LDFLAGS=""
|
BROKER_LDFLAGS=""
|
||||||
BROKERLIBS="";
|
BROKERLIBS=""
|
||||||
some_dl_found="no";
|
some_dl_found=no
|
||||||
if test x$USE_EVENTBROKER = xyes; then
|
if test "x$USE_EVENTBROKER" = "xyes"; then
|
||||||
|
|
||||||
dnl Which loader library should we use? libtdl or dl?
|
dnl Which loader library should we use? libtdl or dl?
|
||||||
dnl Hopefully this will be portable and not give us headaches...
|
dnl Hopefully this will be portable and not give us headaches...
|
||||||
AC_CHECK_HEADER(ltdl.h,[
|
AC_CHECK_HEADER(ltdl.h,[
|
||||||
AC_CHECK_LIB(ltdl,lt_dlinit,[
|
AC_CHECK_LIB(ltdl,lt_dlinit,[
|
||||||
AC_DEFINE(HAVE_LTDL_H,,[Which loader library should we use? libtdl or dl?])
|
AC_DEFINE(HAVE_LTDL_H,,[Which loader library should we use? libtdl or dl?])
|
||||||
some_dl_found="yes"
|
some_dl_found=yes
|
||||||
BROKERLIBS="$BROKERLIBS -lltdl"
|
BROKERLIBS="$BROKERLIBS -lltdl"
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
if test "x$some_dl_found" != xyes; then
|
if test "x$some_dl_found" != "xyes"; then
|
||||||
AC_CHECK_HEADER(dlfcn.h,[
|
AC_CHECK_HEADER(dlfcn.h,[
|
||||||
AC_CHECK_LIB(dl,dlopen,[
|
AC_CHECK_LIB(dl,dlopen,[
|
||||||
AC_DEFINE(HAVE_DLFCN_H,,[Which loader library should we use? libtdl or dl?])
|
AC_DEFINE(HAVE_DLFCN_H,,[Which loader library should we use? libtdl or dl?])
|
||||||
some_dl_found="yes"
|
some_dl_found=yes
|
||||||
BROKERLIBS="$BROKERLIBS -ldl"
|
BROKERLIBS="$BROKERLIBS -ldl"
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
@ -646,7 +728,7 @@ if test x$USE_EVENTBROKER = xyes; then
|
|||||||
esac
|
esac
|
||||||
AC_SUBST(BROKER_LDFLAGS)
|
AC_SUBST(BROKER_LDFLAGS)
|
||||||
AC_SUBST(BROKERLIBS)
|
AC_SUBST(BROKERLIBS)
|
||||||
test "x$BROKER_LDFLAGS" != x && AC_MSG_RESULT([$BROKER_LDFLAGS])
|
test "x$BROKER_LDFLAGS" != "x" && AC_MSG_RESULT([$BROKER_LDFLAGS])
|
||||||
|
|
||||||
|
|
||||||
dnl - Modified version from www.erlang.org
|
dnl - Modified version from www.erlang.org
|
||||||
@ -712,7 +794,7 @@ AC_ARG_ENABLE(cygwin,
|
|||||||
[enables building under the CYGWIN environment]),
|
[enables building under the CYGWIN environment]),
|
||||||
[cygwin=$enableval]
|
[cygwin=$enableval]
|
||||||
)
|
)
|
||||||
if test x$cygwin = xyes; then
|
if test "x$cygwin" = "xyes"; then
|
||||||
CFLAGS="${CFLAGS} -DCYGWIN"
|
CFLAGS="${CFLAGS} -DCYGWIN"
|
||||||
nagios_name=nagios.exe;
|
nagios_name=nagios.exe;
|
||||||
nagiostats_name=nagiostats.exe;
|
nagiostats_name=nagiostats.exe;
|
||||||
@ -732,7 +814,21 @@ dnl Find traceroute
|
|||||||
AC_PATH_PROG(PATH_TO_TRACEROUTE,traceroute)
|
AC_PATH_PROG(PATH_TO_TRACEROUTE,traceroute)
|
||||||
AC_DEFINE_UNQUOTED(TRACEROUTE_COMMAND,"$PATH_TO_TRACEROUTE",[traceroute command to use])
|
AC_DEFINE_UNQUOTED(TRACEROUTE_COMMAND,"$PATH_TO_TRACEROUTE",[traceroute command to use])
|
||||||
|
|
||||||
|
dnl Enable debugging?
|
||||||
|
ENABLE_DEBUGGING=no
|
||||||
|
AC_ARG_ENABLE(debugging,AC_HELP_STRING([--enable-debugging],[DEBUGGING ONLY - Enable some debugging for Nagios Core]),
|
||||||
|
[ENABLE_DEBUGGING=$enableval])
|
||||||
|
if test "x$ENABLE_DEBUGGING" = "xyes" -o "x$ENABLE_TESTING" = "xyes"; then
|
||||||
|
CFLAGS="${CFLAGS} -O0 -ggdb3 -g3"
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl Enable coverage?
|
||||||
|
ENABLE_COVERAGE=no
|
||||||
|
AC_ARG_ENABLE(coverage,AC_HELP_STRING([--enable-coverage],[DEBUGGING ONLY - Enable coverage reports (use with debugging)]),
|
||||||
|
[ENABLE_COVERAGE=$enableval])
|
||||||
|
if test "x$ENABLE_COVERAGE" = "xyes" -o "x$ENABLE_TESTING" = "xyes"; then
|
||||||
|
CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage"
|
||||||
|
fi
|
||||||
|
|
||||||
dnl Package directory for Solaris pkgmk (and other OSs, eventually)
|
dnl Package directory for Solaris pkgmk (and other OSs, eventually)
|
||||||
dnl VERSION=`grep 1.0 include/common.h | cut -d ' ' -f 3 | sed 's/"//g'`
|
dnl VERSION=`grep 1.0 include/common.h | cut -d ' ' -f 3 | sed 's/"//g'`
|
||||||
@ -768,7 +864,7 @@ AC_ARG_ENABLE(libtap,
|
|||||||
|
|
||||||
# Disabled for moment
|
# Disabled for moment
|
||||||
# If not local, check if we can use the system one
|
# If not local, check if we can use the system one
|
||||||
#if test "$enable_libtap" != "yes" ; then
|
#if test "$enable_libtap" != "yes"; then
|
||||||
# dnl Check for libtap, to run perl-like tests
|
# dnl Check for libtap, to run perl-like tests
|
||||||
# AC_CHECK_LIB(tap, plan_tests,
|
# AC_CHECK_LIB(tap, plan_tests,
|
||||||
# enable_libtap="yes"
|
# enable_libtap="yes"
|
||||||
@ -776,7 +872,7 @@ AC_ARG_ENABLE(libtap,
|
|||||||
#fi
|
#fi
|
||||||
|
|
||||||
# Finally, define tests if we use libtap
|
# Finally, define tests if we use libtap
|
||||||
if test "$enable_libtap" = "yes" ; then
|
if test "x$enable_libtap" = "xyes" -o "x$ENABLE_TESTING" = "xyes"; then
|
||||||
AC_CONFIG_SUBDIRS([tap])
|
AC_CONFIG_SUBDIRS([tap])
|
||||||
USE_LIBTAP=yes
|
USE_LIBTAP=yes
|
||||||
else
|
else
|
||||||
@ -788,7 +884,6 @@ AC_SUBST(USE_LIBTAP)
|
|||||||
AC_SUBST(CGIEXTRAS)
|
AC_SUBST(CGIEXTRAS)
|
||||||
AC_SUBST(GDLIBS)
|
AC_SUBST(GDLIBS)
|
||||||
AC_SUBST(BASEEXTRALIBS)
|
AC_SUBST(BASEEXTRALIBS)
|
||||||
AC_SUBST(INITDIR)
|
|
||||||
AC_SUBST(USE_EVENTBROKER)
|
AC_SUBST(USE_EVENTBROKER)
|
||||||
|
|
||||||
AC_PATH_PROG(PERL,perl)
|
AC_PATH_PROG(PERL,perl)
|
||||||
@ -801,11 +896,34 @@ if test -z "$UNZIP"; then
|
|||||||
AC_MSG_ERROR([Cannot continue without unzip!])
|
AC_MSG_ERROR([Cannot continue without unzip!])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_OUTPUT(Makefile lib/Makefile subst pkginfo base/Makefile common/Makefile contrib/Makefile cgi/Makefile html/Makefile module/Makefile worker/Makefile worker/ping/Makefile xdata/Makefile daemon-init openrc-init t/Makefile t-tap/Makefile)
|
dnl Need this here because of removing it from autoconf-macros
|
||||||
|
eval sbindir=$sbindir
|
||||||
|
|
||||||
|
AC_OUTPUT([
|
||||||
|
Makefile
|
||||||
|
lib/Makefile
|
||||||
|
base/Makefile
|
||||||
|
common/Makefile
|
||||||
|
contrib/Makefile
|
||||||
|
cgi/Makefile
|
||||||
|
html/Makefile
|
||||||
|
module/Makefile
|
||||||
|
worker/Makefile
|
||||||
|
worker/ping/Makefile
|
||||||
|
xdata/Makefile
|
||||||
|
subst
|
||||||
|
pkginfo
|
||||||
|
startup/openrc-init
|
||||||
|
startup/default-init
|
||||||
|
startup/default-service
|
||||||
|
startup/upstart-init
|
||||||
|
t/Makefile
|
||||||
|
t-tap/Makefile
|
||||||
|
])
|
||||||
|
|
||||||
perl subst include/locations.h
|
perl subst include/locations.h
|
||||||
perl subst html/config.inc.php
|
perl subst html/config.inc.php
|
||||||
|
dnl perl subst daemon-service
|
||||||
|
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
@ -828,6 +946,16 @@ perl subst sample-config/template-object/printer.cfg
|
|||||||
perl subst sample-config/template-object/switch.cfg
|
perl subst sample-config/template-object/switch.cfg
|
||||||
|
|
||||||
|
|
||||||
|
incdir=`eval echo $includedir`
|
||||||
|
if test "x$incdir" = "x$prefix/include"; then
|
||||||
|
includedir=$prefix/include/nagios
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x$USE_EVENTBROKER" != "xyes"; then
|
||||||
|
USE_EVENTBROKER=no
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
dnl Review options
|
dnl Review options
|
||||||
echo ""
|
echo ""
|
||||||
echo ""
|
echo ""
|
||||||
@ -840,20 +968,12 @@ echo " -------------------------"
|
|||||||
AC_MSG_RESULT([ Nagios executable: $nagios_name])
|
AC_MSG_RESULT([ Nagios executable: $nagios_name])
|
||||||
AC_MSG_RESULT([ Nagios user/group: $nagios_user,$nagios_grp])
|
AC_MSG_RESULT([ Nagios user/group: $nagios_user,$nagios_grp])
|
||||||
AC_MSG_RESULT([ Command user/group: $command_user,$command_grp])
|
AC_MSG_RESULT([ Command user/group: $command_user,$command_grp])
|
||||||
if test x$USE_EVENTBROKER = xyes; then
|
AC_MSG_RESULT([ Event Broker: $USE_EVENTBROKER])
|
||||||
AC_MSG_RESULT([ Event Broker: yes])
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([ Event Broker: no])
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT([ Install \${prefix}: $prefix])
|
AC_MSG_RESULT([ Install \${prefix}: $prefix])
|
||||||
incdir=`eval echo $includedir`
|
|
||||||
if test x$incdir = x$prefix/include; then
|
|
||||||
includedir=$prefix/include/nagios
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT([ Install \${includedir}: $includedir])
|
AC_MSG_RESULT([ Install \${includedir}: $includedir])
|
||||||
AC_MSG_RESULT([ Lock file: $lockfile])
|
AC_MSG_RESULT([ Lock file: $subsyslockfile])
|
||||||
AC_MSG_RESULT([ Check result directory: $CHECKRESULTDIR])
|
AC_MSG_RESULT([ Check result directory: $CHECKRESULTDIR])
|
||||||
AC_MSG_RESULT([ Init directory: $init_dir])
|
AC_MSG_RESULT([ Init directory: $initdir])
|
||||||
AC_MSG_RESULT([ Apache conf.d directory: $HTTPD_CONF])
|
AC_MSG_RESULT([ Apache conf.d directory: $HTTPD_CONF])
|
||||||
AC_MSG_RESULT([ Mail program: $MAIL_PROG])
|
AC_MSG_RESULT([ Mail program: $MAIL_PROG])
|
||||||
AC_MSG_RESULT([ Host OS: $host_os])
|
AC_MSG_RESULT([ Host OS: $host_os])
|
||||||
|
@ -22,7 +22,7 @@ INSTALL_OPTS=@INSTALL_OPTS@
|
|||||||
|
|
||||||
prefix=@prefix@
|
prefix=@prefix@
|
||||||
exec_prefix=@exec_prefix@
|
exec_prefix=@exec_prefix@
|
||||||
CGIDIR=@sbindir@
|
CGIDIR=@cgibindir@
|
||||||
BINDIR=@bindir@
|
BINDIR=@bindir@
|
||||||
|
|
||||||
CGIS=traceroute.cgi daemonchk.cgi
|
CGIS=traceroute.cgi daemonchk.cgi
|
||||||
@ -88,15 +88,19 @@ $(CGI_O): $(CGI_C)
|
|||||||
##############################################################################
|
##############################################################################
|
||||||
# rpm making automation for CentOS/RHEL.
|
# rpm making automation for CentOS/RHEL.
|
||||||
|
|
||||||
ARCH ?= $(shell arch)
|
ARCH ?= $(shell uname -m)
|
||||||
ifeq ($(ARCH),x86_64)
|
ifeq ($(ARCH),x86_64)
|
||||||
RPM_ARCH := x86_64
|
RPM_ARCH := x86_64
|
||||||
else
|
else
|
||||||
ifeq ($(ARCH),i686)
|
ifeq ($(ARCH),i686)
|
||||||
RPM_ARCH := i386
|
RPM_ARCH := i386
|
||||||
else
|
else
|
||||||
|
ifeq ($(ARCH),aarch64)
|
||||||
|
RPM_ARCH := aarch64
|
||||||
|
else
|
||||||
$(error Unknown arch "$(ARCH)".)
|
$(error Unknown arch "$(ARCH)".)
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
rpm:
|
rpm:
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/************************************************************************
|
/************************************************************************
|
||||||
*
|
*
|
||||||
* CONVERTCFG.C - Config File Convertor
|
* CONVERTCFG.C - Config File Converter
|
||||||
*
|
*
|
||||||
* Copyright (c) 2001-2005 Ethan Galstad (egalstad@nagios.org)
|
* Copyright (c) 2001-2005 Ethan Galstad (egalstad@nagios.org)
|
||||||
* Last Modified: 08-12-2005
|
* Last Modified: 08-12-2005
|
||||||
@ -310,7 +310,7 @@ int main(int argc, char **argv) {
|
|||||||
printf("\tretain_status_information\t1\t; Retain status information across program restarts\n");
|
printf("\tretain_status_information\t1\t; Retain status information across program restarts\n");
|
||||||
printf("\tretain_nonstatus_information\t1\t; Retain non-status information across program restarts\n");
|
printf("\tretain_nonstatus_information\t1\t; Retain non-status information across program restarts\n");
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("\tregister\t\t\t0\t; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE!\n");
|
printf("\tregister\t\t\t0\t; DON'T REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE!\n");
|
||||||
printf("\t}\n\n");
|
printf("\t}\n\n");
|
||||||
|
|
||||||
have_template = 1;
|
have_template = 1;
|
||||||
@ -430,7 +430,7 @@ int main(int argc, char **argv) {
|
|||||||
printf("\tretain_status_information\t1\t; Retain status information across program restarts\n");
|
printf("\tretain_status_information\t1\t; Retain status information across program restarts\n");
|
||||||
printf("\tretain_nonstatus_information\t1\t; Retain non-status information across program restarts\n");
|
printf("\tretain_nonstatus_information\t1\t; Retain non-status information across program restarts\n");
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("\tregister\t\t\t0\t; DONT REGISTER THIS DEFINITION - ITS NOT A REAL SERVICE, JUST A TEMPLATE!\n");
|
printf("\tregister\t\t\t0\t; DON'T REGISTER THIS DEFINITION - ITS NOT A REAL SERVICE, JUST A TEMPLATE!\n");
|
||||||
printf("\t}\n\n");
|
printf("\t}\n\n");
|
||||||
|
|
||||||
have_template = 1;
|
have_template = 1;
|
||||||
@ -667,7 +667,7 @@ int main(int argc, char **argv) {
|
|||||||
temp_ptr = my_strsep(&temp_ptr2, "[");
|
temp_ptr = my_strsep(&temp_ptr2, "[");
|
||||||
temp_ptr = my_strsep(&temp_ptr2, ";");
|
temp_ptr = my_strsep(&temp_ptr2, ";");
|
||||||
|
|
||||||
printf("# serviceextinfo definition\n", temp_ptr);
|
printf("# '%s' serviceextinfo definition\n", temp_ptr);
|
||||||
printf("define serviceextinfo{\n");
|
printf("define serviceextinfo{\n");
|
||||||
printf("\thost_name\t\t%s\t\t; The name of the service this data is associated with\n", temp_ptr);
|
printf("\thost_name\t\t%s\t\t; The name of the service this data is associated with\n", temp_ptr);
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ div.status { font-size: 10pt; text-align: center; }
|
|||||||
.statusUNKNOWN { font-size: 8pt; background-color: #ffbb55; border: 1px solid #777777; padding: 0 5 0 5; }
|
.statusUNKNOWN { font-size: 8pt; background-color: #ffbb55; border: 1px solid #777777; padding: 0 5 0 5; }
|
||||||
.statusWARNING { font-size: 8pt; background-color: #ffff00; border: 1px solid #777777; padding: 0 5 0 5; }
|
.statusWARNING { font-size: 8pt; background-color: #ffff00; border: 1px solid #777777; padding: 0 5 0 5; }
|
||||||
.statusCRITICAL { font-size: 8pt; background-color: #f88888; border: 1px solid #777777; padding: 0 5 0 5; }
|
.statusCRITICAL { font-size: 8pt; background-color: #f88888; border: 1px solid #777777; padding: 0 5 0 5; }
|
||||||
|
.statusCRITICALACK { font-size: 8pt; background-color: #f88888; border: 1px solid #777777; padding: 0 5 0 5; }
|
||||||
|
|
||||||
.statusHOSTPENDING { font-size: 8pt; background-color: #acacac; line-height: 150%; padding: 0 4 0 4; }
|
.statusHOSTPENDING { font-size: 8pt; background-color: #acacac; line-height: 150%; padding: 0 4 0 4; }
|
||||||
.statusHOSTUP { font-size: 8pt; background-color: #cce8cc; line-height: 150%; padding: 0 4 0 4; }
|
.statusHOSTUP { font-size: 8pt; background-color: #cce8cc; line-height: 150%; padding: 0 4 0 4; }
|
||||||
|
@ -202,23 +202,6 @@ want to reserve that for special cases.
|
|||||||
The following are completely optional (for now):
|
The following are completely optional (for now):
|
||||||
@li command - The command we executed
|
@li command - The command we executed
|
||||||
@li timeout - The timeout Nagios requested for this job
|
@li timeout - The timeout Nagios requested for this job
|
||||||
@li ru_nsignals - The ru_nsignals field from the rusage struct
|
|
||||||
@li ru_nswap - The ru_nswap field from the rusage struct
|
|
||||||
@li ru_minflt - The ru_minflt field from the rusage struct
|
|
||||||
@li ru_majflt - The ru_majflt field from the rusage struct
|
|
||||||
@li ru_stime - The ru_stime field from the rusage struct
|
|
||||||
@li ru_utime - The ru_utime field from the rusage struct
|
|
||||||
@li ru_inblock - The ru_inblock field from the rusage struct
|
|
||||||
@li ru_oublock - The ru_oublock field from the rusage struct
|
|
||||||
|
|
||||||
The meaning of the fields of the rusage struct can be viewed in the
|
|
||||||
section 2 man-page for the getrusage() system call. Normally, you
|
|
||||||
would access it by executing the following command:
|
|
||||||
@verbatim
|
|
||||||
man 2 getrusage
|
|
||||||
@endverbatim
|
|
||||||
Note that most systems do not support all the fields of the rusage
|
|
||||||
struct and may leave them empty if so.
|
|
||||||
|
|
||||||
@section logging Logging
|
@section logging Logging
|
||||||
Worker processes can send events to the main Nagios process that
|
Worker processes can send events to the main Nagios process that
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
PROJECT_NAME = Nagios
|
PROJECT_NAME = Nagios
|
||||||
PROJECT_NUMBER = 4.3.4
|
PROJECT_NUMBER = 4.4.3
|
||||||
PROJECT_BRIEF = "Dev docs for Nagios core and neb-module hackers"
|
PROJECT_BRIEF = "Dev docs for Nagios core and neb-module hackers"
|
||||||
|
|
||||||
INPUT = lib/ docs/
|
INPUT = lib/ docs/
|
||||||
|
@ -7,8 +7,8 @@ exec_prefix=@exec_prefix@
|
|||||||
LOGDIR=@localstatedir@
|
LOGDIR=@localstatedir@
|
||||||
CFGDIR=@sysconfdir@
|
CFGDIR=@sysconfdir@
|
||||||
BINDIR=@bindir@
|
BINDIR=@bindir@
|
||||||
CGIDIR=@sbindir@
|
CGIDIR=@cgibindir@
|
||||||
HTMLDIR=@datadir@
|
HTMLDIR=@webdir@
|
||||||
datarootdir=@datarootdir@
|
datarootdir=@datarootdir@
|
||||||
INSTALL=@INSTALL@
|
INSTALL=@INSTALL@
|
||||||
INSTALL_OPTS=@INSTALL_OPTS@
|
INSTALL_OPTS=@INSTALL_OPTS@
|
||||||
@ -18,10 +18,10 @@ CP=@CP@
|
|||||||
|
|
||||||
all html:
|
all html:
|
||||||
(cd angularjs && unzip -u angular-1.3.9.zip)
|
(cd angularjs && unzip -u angular-1.3.9.zip)
|
||||||
(cd angularjs && unzip -u ui-utils-0.2.1.zip)
|
(cd angularjs && unzip -u ui-utils-0.2.3.zip)
|
||||||
if [ ! -d bootstrap-3.3.0 ] ; then mkdir -p bootstrap-3.3.0 && ( cd bootstrap-3.3.0 && unzip -u ../bootstrap-3.3.0-dist.zip && mv dist/* . && rmdir dist ) ; fi
|
if [ ! -d bootstrap-3.3.7 ] ; then mkdir -p bootstrap-3.3.7 && ( cd bootstrap-3.3.7 && unzip -u ../bootstrap-3.3.7-dist.zip && mv dist/* . && rmdir dist ) ; fi
|
||||||
mkdir -p d3
|
mkdir -p d3
|
||||||
(cd d3 && unzip -u ../d3-3.5.3.zip)
|
(cd d3 && unzip -u ../d3-3.5.17.zip)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *.cfg *.sub core
|
rm -f *.cfg *.sub core
|
||||||
@ -34,8 +34,8 @@ clean:
|
|||||||
rm -f stylesheets/*~
|
rm -f stylesheets/*~
|
||||||
rm -f js/*~
|
rm -f js/*~
|
||||||
rm -rf angularjs/angular-1.3.9
|
rm -rf angularjs/angular-1.3.9
|
||||||
rm -rf angularjs/ui-utils-0.2.1
|
rm -rf angularjs/ui-utils-0.2.3
|
||||||
rm -rf bootstrap-3.3.0
|
rm -rf bootstrap-3.3.7
|
||||||
rm -rf d3
|
rm -rf d3
|
||||||
|
|
||||||
distclean: clean
|
distclean: clean
|
||||||
@ -58,9 +58,9 @@ install:
|
|||||||
# Directories for new CGI pages
|
# Directories for new CGI pages
|
||||||
$(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/angularjs
|
$(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/angularjs
|
||||||
$(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/angularjs/angular-1.3.9
|
$(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/angularjs/angular-1.3.9
|
||||||
$(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/angularjs/ui-utils-0.2.1
|
$(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/angularjs/ui-utils-0.2.3
|
||||||
$(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/bootstrap-3.3.0
|
$(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/bootstrap-3.3.7
|
||||||
$(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/bootstrap-3.3.0/css
|
$(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/bootstrap-3.3.7/css
|
||||||
$(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/d3
|
$(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/d3
|
||||||
$(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/spin
|
$(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/spin
|
||||||
# End of directories for new CGI pages
|
# End of directories for new CGI pages
|
||||||
@ -122,10 +122,10 @@ install:
|
|||||||
# Support files for new graphical CGIs
|
# Support files for new graphical CGIs
|
||||||
$(INSTALL) -m 664 $(INSTALL_OPTS) angularjs/angular-1.3.9/angular.min.js $(DESTDIR)$(HTMLDIR)/angularjs/angular-1.3.9
|
$(INSTALL) -m 664 $(INSTALL_OPTS) angularjs/angular-1.3.9/angular.min.js $(DESTDIR)$(HTMLDIR)/angularjs/angular-1.3.9
|
||||||
$(INSTALL) -m 664 $(INSTALL_OPTS) angularjs/angular-1.3.9/angular.min.js.map $(DESTDIR)$(HTMLDIR)/angularjs/angular-1.3.9
|
$(INSTALL) -m 664 $(INSTALL_OPTS) angularjs/angular-1.3.9/angular.min.js.map $(DESTDIR)$(HTMLDIR)/angularjs/angular-1.3.9
|
||||||
$(INSTALL) -m 664 $(INSTALL_OPTS) angularjs/ui-bootstrap-tpls-0.12.0.min.js $(DESTDIR)$(HTMLDIR)/angularjs
|
$(INSTALL) -m 664 $(INSTALL_OPTS) angularjs/ui-bootstrap-tpls-0.14.3.min.js $(DESTDIR)$(HTMLDIR)/angularjs
|
||||||
$(INSTALL) -m 664 $(INSTALL_OPTS) angularjs/ui-utils-0.2.1/ui-utils.js $(DESTDIR)$(HTMLDIR)/angularjs/ui-utils-0.2.1
|
$(INSTALL) -m 664 $(INSTALL_OPTS) angularjs/ui-utils-0.2.3/ui-utils.js $(DESTDIR)$(HTMLDIR)/angularjs/ui-utils-0.2.3
|
||||||
$(INSTALL) -m 664 $(INSTALL_OPTS) bootstrap-3.3.0/css/bootstrap.min.css $(DESTDIR)$(HTMLDIR)/bootstrap-3.3.0/css
|
$(INSTALL) -m 664 $(INSTALL_OPTS) bootstrap-3.3.7/css/bootstrap.min.css $(DESTDIR)$(HTMLDIR)/bootstrap-3.3.7/css
|
||||||
$(INSTALL) -m 664 $(INSTALL_OPTS) bootstrap-3.3.0/css/bootstrap-theme.min.css $(DESTDIR)$(HTMLDIR)/bootstrap-3.3.0/css
|
$(INSTALL) -m 664 $(INSTALL_OPTS) bootstrap-3.3.7/css/bootstrap-theme.min.css $(DESTDIR)$(HTMLDIR)/bootstrap-3.3.7/css
|
||||||
$(INSTALL) -m 664 $(INSTALL_OPTS) d3/d3.min.js $(DESTDIR)$(HTMLDIR)/d3
|
$(INSTALL) -m 664 $(INSTALL_OPTS) d3/d3.min.js $(DESTDIR)$(HTMLDIR)/d3
|
||||||
$(INSTALL) -m 664 $(INSTALL_OPTS) spin/spin.min.js $(DESTDIR)$(HTMLDIR)/spin
|
$(INSTALL) -m 664 $(INSTALL_OPTS) spin/spin.min.js $(DESTDIR)$(HTMLDIR)/spin
|
||||||
# End of support files for new graphical CGIs
|
# End of support files for new graphical CGIs
|
||||||
|
10
html/angularjs/ui-bootstrap-tpls-0.12.0.min.js
vendored
10
html/angularjs/ui-bootstrap-tpls-0.12.0.min.js
vendored
File diff suppressed because one or more lines are too long
12
html/angularjs/ui-bootstrap-tpls-0.14.3.min.js
vendored
Normal file
12
html/angularjs/ui-bootstrap-tpls-0.14.3.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
Binary file not shown.
BIN
html/angularjs/ui-utils-0.2.3.zip
Normal file
BIN
html/angularjs/ui-utils-0.2.3.zip
Normal file
Binary file not shown.
Binary file not shown.
BIN
html/bootstrap-3.3.7-dist.zip
Normal file
BIN
html/bootstrap-3.3.7-dist.zip
Normal file
Binary file not shown.
BIN
html/d3-3.5.17.zip
Normal file
BIN
html/d3-3.5.17.zip
Normal file
Binary file not shown.
Binary file not shown.
@ -5,9 +5,9 @@
|
|||||||
<title>Nagios Histogram</title>
|
<title>Nagios Histogram</title>
|
||||||
<link type="image/ico" rel="shortcut icon" href="images/favicon.ico"/>
|
<link type="image/ico" rel="shortcut icon" href="images/favicon.ico"/>
|
||||||
<link type="text/css" rel="stylesheet"
|
<link type="text/css" rel="stylesheet"
|
||||||
href="bootstrap-3.3.0/css/bootstrap.min.css">
|
href="bootstrap-3.3.7/css/bootstrap.min.css">
|
||||||
<link type="text/css" rel="stylesheet"
|
<link type="text/css" rel="stylesheet"
|
||||||
href="bootstrap-3.3.0/css/bootstrap-theme.min.css">
|
href="bootstrap-3.3.7/css/bootstrap-theme.min.css">
|
||||||
<link type='text/css' rel='stylesheet' href='stylesheets/common.css'>
|
<link type='text/css' rel='stylesheet' href='stylesheets/common.css'>
|
||||||
<link type='text/css' rel='stylesheet'
|
<link type='text/css' rel='stylesheet'
|
||||||
href='stylesheets/histogram.css'>
|
href='stylesheets/histogram.css'>
|
||||||
@ -16,9 +16,9 @@
|
|||||||
<script type="text/javascript"
|
<script type="text/javascript"
|
||||||
src="angularjs/angular-1.3.9/angular.min.js"></script>
|
src="angularjs/angular-1.3.9/angular.min.js"></script>
|
||||||
<script type="text/javascript"
|
<script type="text/javascript"
|
||||||
src="angularjs/ui-bootstrap-tpls-0.12.0.min.js"></script>
|
src="angularjs/ui-bootstrap-tpls-0.14.3.min.js"></script>
|
||||||
<script type="text/javascript"
|
<script type="text/javascript"
|
||||||
src="angularjs/ui-utils-0.2.1/ui-utils.js"></script>
|
src="angularjs/ui-utils-0.2.3/ui-utils.js"></script>
|
||||||
<script type="text/javascript" src="d3/d3.min.js"></script>
|
<script type="text/javascript" src="d3/d3.min.js"></script>
|
||||||
<script type="text/javascript" src="spin/spin.min.js"></script>
|
<script type="text/javascript" src="spin/spin.min.js"></script>
|
||||||
<script type="text/javascript" src="js/histogram.js"></script>
|
<script type="text/javascript" src="js/histogram.js"></script>
|
||||||
|
@ -3,6 +3,14 @@
|
|||||||
|
|
||||||
require_once(dirname(__FILE__).'/../config.inc.php');
|
require_once(dirname(__FILE__).'/../config.inc.php');
|
||||||
|
|
||||||
|
// get enable_page_tour no matter what
|
||||||
|
function get_enable_page_tour(){
|
||||||
|
global $cfg;
|
||||||
|
$cfg["enable_page_tour"] = true;
|
||||||
|
read_cgi_config_file();
|
||||||
|
}
|
||||||
|
get_enable_page_tour();
|
||||||
|
|
||||||
function get_update_information(){
|
function get_update_information(){
|
||||||
global $cfg;
|
global $cfg;
|
||||||
|
|
||||||
@ -125,7 +133,10 @@ function get_update_information(){
|
|||||||
function read_main_config_file($thefile=""){
|
function read_main_config_file($thefile=""){
|
||||||
global $cfg;
|
global $cfg;
|
||||||
|
|
||||||
$contents=array();
|
static $already_called = false;
|
||||||
|
static $contents=array();
|
||||||
|
|
||||||
|
if (!$already_called) {
|
||||||
|
|
||||||
// file name can be overridden from default
|
// file name can be overridden from default
|
||||||
if(isset($thefile) && $thefile!="")
|
if(isset($thefile) && $thefile!="")
|
||||||
@ -174,6 +185,9 @@ function read_main_config_file($thefile=""){
|
|||||||
fclose($fh);
|
fclose($fh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$already_called = true;
|
||||||
|
}
|
||||||
|
|
||||||
return $contents;
|
return $contents;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -182,7 +196,10 @@ function read_main_config_file($thefile=""){
|
|||||||
function read_cgi_config_file($thefile=""){
|
function read_cgi_config_file($thefile=""){
|
||||||
global $cfg;
|
global $cfg;
|
||||||
|
|
||||||
$contents=array();
|
static $already_called = false;
|
||||||
|
static $contents=array();
|
||||||
|
|
||||||
|
if (!$already_called) {
|
||||||
|
|
||||||
// file name can be overridden from default
|
// file name can be overridden from default
|
||||||
if(isset($thefile) && $thefile!="")
|
if(isset($thefile) && $thefile!="")
|
||||||
@ -223,6 +240,9 @@ function read_cgi_config_file($thefile=""){
|
|||||||
fclose($fh);
|
fclose($fh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$already_called = true;
|
||||||
|
}
|
||||||
|
|
||||||
return $contents;
|
return $contents;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,22 +26,23 @@ if ("@COREWINDOW@" == "yes" && isset($_GET['corewindow'])) {
|
|||||||
$url = "main.php";
|
$url = "main.php";
|
||||||
}
|
}
|
||||||
|
|
||||||
$this_year = '2017';
|
$this_year = '2019';
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
|
||||||
|
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta name="ROBOTS" content="NOINDEX, NOFOLLOW">
|
<meta name="ROBOTS" content="NOINDEX, NOFOLLOW">
|
||||||
<script LANGUAGE="javascript">
|
<title>Nagios: <?php echo $_SERVER['SERVER_NAME']; ?></title>
|
||||||
var n = Math.round(Math.random() * 10000000000);
|
|
||||||
document.write("<title>Nagios Core on " + window.location.hostname + "</title>");
|
|
||||||
document.cookie = "NagFormId=" + n.toString(16);
|
|
||||||
</script>
|
|
||||||
<link rel="shortcut icon" href="images/favicon.ico" type="image/ico">
|
<link rel="shortcut icon" href="images/favicon.ico" type="image/ico">
|
||||||
|
|
||||||
|
<script LANGUAGE="javascript">
|
||||||
|
var n = Math.round(Math.random() * 10000000000);
|
||||||
|
document.cookie = "NagFormId=" + n.toString(16);
|
||||||
|
</script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<frameset cols="180,*" style="border: 0px;">
|
<frameset cols="180,*" style="border: 0px; framespacing: 0px">
|
||||||
<frame src="side.php" name="side" frameborder="0" style="">
|
<frame src="side.php" name="side" frameborder="0" style="">
|
||||||
<frame src="<?php echo $url; ?>" name="main" frameborder="0" style="">
|
<frame src="<?php echo $url; ?>" name="main" frameborder="0" style="">
|
||||||
|
|
||||||
|
5
html/js/jquery-1.12.4.min.js
vendored
Normal file
5
html/js/jquery-1.12.4.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
4
html/js/jquery-1.7.1.min.js
vendored
4
html/js/jquery-1.7.1.min.js
vendored
File diff suppressed because one or more lines are too long
@ -136,6 +136,16 @@ angular.module("mapApp")
|
|||||||
// Force layout information
|
// Force layout information
|
||||||
var forceLayout = new Object;
|
var forceLayout = new Object;
|
||||||
|
|
||||||
|
// Watch for noresize update
|
||||||
|
$scope.$watch("noresize", function() {
|
||||||
|
$scope.allowResize = $scope.noresize == "false";
|
||||||
|
if ($scope.allowResize) {
|
||||||
|
d3.select("#resize-handle").style("visibility", "visible");
|
||||||
|
} else {
|
||||||
|
d3.select("#resize-handle").style("visibility", "hidden");
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
// Watch for changes on the reload value
|
// Watch for changes on the reload value
|
||||||
$scope.$watch("reload", function(newValue) {
|
$scope.$watch("reload", function(newValue) {
|
||||||
|
|
||||||
@ -928,6 +938,11 @@ angular.module("mapApp")
|
|||||||
// First record the parent node of the current node
|
// First record the parent node of the current node
|
||||||
var parent = currentNode.parent;
|
var parent = currentNode.parent;
|
||||||
|
|
||||||
|
// Fix root nodes with no parent nodes
|
||||||
|
if (parent === undefined) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// Next remove the current node as a child of
|
// Next remove the current node as a child of
|
||||||
// the parent node
|
// the parent node
|
||||||
parent.children = parent.children.filter(function(e, i, a) {
|
parent.children = parent.children.filter(function(e, i, a) {
|
||||||
@ -1084,24 +1099,20 @@ angular.module("mapApp")
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the node has no children and the host list
|
if (!node.hasOwnProperty("children") || node.children == null) {
|
||||||
// does, create the property and initialize it
|
|
||||||
if (!node.hasOwnProperty("children") ||
|
|
||||||
node.children == null) {
|
|
||||||
node.children = new Array;
|
node.children = new Array;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Next add any hosts in the list as children
|
// Next add any hosts in the list as children
|
||||||
// of the node, if they're not already
|
// of the node, if they're not already
|
||||||
hosts.forEach(function(e) {
|
hosts.forEach(function(e) {
|
||||||
var childIndex = findElement(node.children, e,
|
var childIndex = node.children.findIndex(function(s) {
|
||||||
function(list, index) {
|
return s.hostInfo.name === e;
|
||||||
return list[index].hostInfo.name;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if ($scope.hostList[e]) {
|
if ($scope.hostList[e]) {
|
||||||
|
|
||||||
if (childIndex == null) {
|
if (childIndex === -1) {
|
||||||
|
|
||||||
// Create the node object
|
// Create the node object
|
||||||
var hostNode = new Object;
|
var hostNode = new Object;
|
||||||
@ -1275,7 +1286,8 @@ angular.module("mapApp")
|
|||||||
|
|
||||||
// Reparent the tree to specified root host
|
// Reparent the tree to specified root host
|
||||||
if ($scope.hostList.hasOwnProperty($scope.root) &&
|
if ($scope.hostList.hasOwnProperty($scope.root) &&
|
||||||
($scope.rootNode != $scope.hostTree)) {
|
($scope.rootNode != $scope.hostTree) &&
|
||||||
|
$scope.hostList[$scope.root].hasOwnProperty("hostNodes")) {
|
||||||
reparentTree($scope.hostList[$scope.root].hostNodes[0]);
|
reparentTree($scope.hostList[$scope.root].hostNodes[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1671,7 +1683,7 @@ angular.module("mapApp")
|
|||||||
$scope.hostList[host].serviceStatusJSON[service] =
|
$scope.hostList[host].serviceStatusJSON[service] =
|
||||||
json.data.servicelist[host][service];
|
json.data.servicelist[host][service];
|
||||||
}
|
}
|
||||||
if (serviceStatUpdated) {
|
if ($scope.hostList[host].hasOwnProperty("g") && serviceStatUpdated) {
|
||||||
$scope.hostList[host].g.forEach(function(e, i, a) {
|
$scope.hostList[host].g.forEach(function(e, i, a) {
|
||||||
updateNode(e);
|
updateNode(e);
|
||||||
});
|
});
|
||||||
@ -1844,6 +1856,14 @@ angular.module("mapApp")
|
|||||||
|
|
||||||
// Update the map
|
// Update the map
|
||||||
var updateMap = function(source, reparent) {
|
var updateMap = function(source, reparent) {
|
||||||
|
|
||||||
|
// Update config variables before updating the map
|
||||||
|
$scope.showText = $scope.notext == "false";
|
||||||
|
$scope.showLinks = $scope.nolinks == "false";
|
||||||
|
$scope.showPopups = $scope.nopopups == "false";
|
||||||
|
$scope.allowResize = $scope.noresize == "false";
|
||||||
|
$scope.showIcons = $scope.noicons == "false";
|
||||||
|
|
||||||
reparent = reparent || false;
|
reparent = reparent || false;
|
||||||
switch($scope.layout) {
|
switch($scope.layout) {
|
||||||
case layouts.UserSupplied.index:
|
case layouts.UserSupplied.index:
|
||||||
|
@ -22,18 +22,25 @@ angular.module("nagiosDecorations", [])
|
|||||||
updateIntervalValue: "@updateInterval",
|
updateIntervalValue: "@updateInterval",
|
||||||
lastUpdate: "=lastUpdate",
|
lastUpdate: "=lastUpdate",
|
||||||
initialState: "@initialState",
|
initialState: "@initialState",
|
||||||
collapsable: "@collapsable",
|
collapsible: "@collapsible",
|
||||||
includePartial: "@includePartial"
|
includePartial: "@includePartial",
|
||||||
|
root: "@root"
|
||||||
},
|
},
|
||||||
controller: function($scope, $element, $attrs, $http) {
|
controller: function($scope, $element, $attrs, $http) {
|
||||||
|
|
||||||
$scope.updateInterval = parseInt($scope.updateIntervalValue);
|
$scope.updateInterval = parseInt($scope.updateIntervalValue);
|
||||||
$scope.isPermanentlyCollapsed = $scope.isCollapsed =
|
$scope.isPermanentlyCollapsed = $scope.isCollapsed =
|
||||||
$scope.initialState == "collapsed";
|
$scope.initialState == "collapsed";
|
||||||
$scope.isCollapsable = $scope.collapsable == "true";
|
$scope.isCollapsable = $scope.collapsible == "true";
|
||||||
|
|
||||||
$scope.haveProgramStatus = false;
|
$scope.haveProgramStatus = false;
|
||||||
|
|
||||||
|
// Create cgiurl and root node name
|
||||||
|
$scope.params = { cgiurl: $scope.cgiurl, root: $scope.root };
|
||||||
|
$scope.$watch("root", function() {
|
||||||
|
$scope.params.root = $scope.root;
|
||||||
|
});
|
||||||
|
|
||||||
$scope.$watch("cgiurl", function() {
|
$scope.$watch("cgiurl", function() {
|
||||||
getStatus();
|
getStatus();
|
||||||
});
|
});
|
||||||
|
@ -286,7 +286,7 @@ angular.module("trendsApp")
|
|||||||
d3.select("g#groupXAxis").select("path").remove();
|
d3.select("g#groupXAxis").select("path").remove();
|
||||||
};
|
};
|
||||||
|
|
||||||
// Handle a succesful availability response
|
// Handle a successful availability response
|
||||||
var onAvailabilitySuccess = function(json) {
|
var onAvailabilitySuccess = function(json) {
|
||||||
|
|
||||||
// Local layout variables
|
// Local layout variables
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<title>JSON Query Generator</title>
|
<title>JSON Query Generator</title>
|
||||||
<link rel="stylesheet" type="text/css" href="stylesheets/jsonquery.css"/>
|
<link rel="stylesheet" type="text/css" href="stylesheets/jsonquery.css"/>
|
||||||
<script type="text/javascript" src="js/jquery-1.7.1.min.js"></script>
|
<script type="text/javascript" src="js/jquery-1.12.4.min.js"></script>
|
||||||
<script type="text/javascript" src="js/jsonquery.js"></script>
|
<script type="text/javascript" src="js/jsonquery.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
@ -40,8 +40,8 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<button type="submit">Send Query</button>
|
<button type="submit">Send Query</button>
|
||||||
<form>
|
</form>
|
||||||
<div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</body>
|
</html>
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
include_once(dirname(__FILE__).'/includes/utils.inc.php');
|
include_once(dirname(__FILE__).'/includes/utils.inc.php');
|
||||||
|
|
||||||
$this_version = '4.3.4';
|
$this_version = '4.4.3';
|
||||||
$this_year = '2017';
|
$this_year = '2019';
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||||
|
|
||||||
@ -14,20 +14,25 @@ $this_year = '2017';
|
|||||||
<title>Nagios Core</title>
|
<title>Nagios Core</title>
|
||||||
<link rel="stylesheet" type="text/css" href="stylesheets/common.css?<?php echo $this_version; ?>" />
|
<link rel="stylesheet" type="text/css" href="stylesheets/common.css?<?php echo $this_version; ?>" />
|
||||||
<link rel="stylesheet" type="text/css" href="stylesheets/nag_funcs.css?<?php echo $this_version; ?>" />
|
<link rel="stylesheet" type="text/css" href="stylesheets/nag_funcs.css?<?php echo $this_version; ?>" />
|
||||||
<script type="text/javascript" src="js/jquery-1.7.1.min.js"></script>
|
<script type="text/javascript" src="js/jquery-1.12.4.min.js"></script>
|
||||||
<script type="text/javascript" src="js/nag_funcs.js"></script>
|
<script type="text/javascript" src="js/nag_funcs.js"></script>
|
||||||
|
|
||||||
<script type='text/javascript'>
|
<script type='text/javascript'>
|
||||||
var vbox, cookie;
|
var cookie;
|
||||||
|
<?php if ($cfg["enable_page_tour"]) { ?>
|
||||||
|
var vbox;
|
||||||
var vBoxId = "main";
|
var vBoxId = "main";
|
||||||
var vboxText = "<a href=https://www.nagios.com/tours target=_blank> " +
|
var vboxText = "<a href=https://www.nagios.com/tours target=_blank> " +
|
||||||
"Click here to watch the entire Nagios Core 4 Tour!</a>";
|
"Click here to watch the entire Nagios Core 4 Tour!</a>";
|
||||||
|
<?php } ?>
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
var user = "<?php echo $_SERVER['REMOTE_USER']; ?>";
|
var user = "<?php echo $_SERVER['REMOTE_USER']; ?>";
|
||||||
|
|
||||||
|
<?php if ($cfg["enable_page_tour"]) { ?>
|
||||||
vBoxId += ";" + user;
|
vBoxId += ";" + user;
|
||||||
vbox = new vidbox({pos:'lr',vidurl:'https://www.youtube.com/embed/2hVBAet-XpY',
|
vbox = new vidbox({pos:'lr',vidurl:'https://www.youtube.com/embed/2hVBAet-XpY',
|
||||||
text:vboxText,vidid:vBoxId});
|
text:vboxText,vidid:vBoxId});
|
||||||
|
<?php } ?>
|
||||||
loadRemoteFeed( // Our top banner splash.
|
loadRemoteFeed( // Our top banner splash.
|
||||||
'#splashbox0-contents', 'corebanner', 1,
|
'#splashbox0-contents', 'corebanner', 1,
|
||||||
'', processBannerItem, ''
|
'', processBannerItem, ''
|
||||||
@ -140,7 +145,7 @@ $this_year = '2017';
|
|||||||
<div id="currentversioninfo">
|
<div id="currentversioninfo">
|
||||||
<div class="product">Nagios<sup><span style="font-size: small;">®</span></sup> Core<sup><span style="font-size: small;">™</span></sup></div>
|
<div class="product">Nagios<sup><span style="font-size: small;">®</span></sup> Core<sup><span style="font-size: small;">™</span></sup></div>
|
||||||
<div class="version">Version <?php echo $this_version; ?></div>
|
<div class="version">Version <?php echo $this_version; ?></div>
|
||||||
<div class="releasedate">August 24, 2017</div>
|
<div class="releasedate">January 15, 2019</div>
|
||||||
<div class="checkforupdates"><a href="https://www.nagios.org/checkforupdates/?version=<?php echo $this_version; ?>&product=nagioscore" target="_blank">Check for updates</a></div>
|
<div class="checkforupdates"><a href="https://www.nagios.org/checkforupdates/?version=<?php echo $this_version; ?>&product=nagioscore" target="_blank">Check for updates</a></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@
|
|||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Root Node</label>
|
<label>Root Node</label>
|
||||||
<select class="form-control" ng-model="params.root"
|
<select class="form-control" ng-model="params.root"
|
||||||
ng-options="node for node in nodelist">
|
ng-options="node for node in nodelist track by node">
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
@ -3,16 +3,16 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td class="linkBox">
|
<td class="linkBox">
|
||||||
<span ng-show="params.root != 'Nagios Process'">
|
<span ng-show="params.root != 'Nagios Process'">
|
||||||
<a ng-href="{{params.cgiurl}}cgi-bin/status.cgi?host={{params.host | uriComponentEncode}}" target="_self">
|
<a ng-href="{{params.cgiurl}}status.cgi?host={{params.root | uriComponentEncode}}" target="_self">
|
||||||
View Status Detail For This Host
|
View Status Detail For This Host
|
||||||
</a>
|
</a>
|
||||||
<br/>
|
<br/>
|
||||||
</span>
|
</span>
|
||||||
<a ng-href="{{params.cgiurl}}cgi-bin/status.cgi?host=all" target="_self">
|
<a ng-href="{{params.cgiurl}}status.cgi?host=all" target="_self">
|
||||||
View Status Detail For All Hosts
|
View Status Detail For All Hosts
|
||||||
</a>
|
</a>
|
||||||
<br/>
|
<br/>
|
||||||
<a ng-href="{{params.cgiurl}}cgi-bin/status.cgi?hostgroup=all" target="_self">
|
<a ng-href="{{params.cgiurl}}status.cgi?hostgroup=all" target="_self">
|
||||||
View Status Overview For All Hosts
|
View Status Overview For All Hosts
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
|
17
html/map.php
17
html/map.php
@ -48,9 +48,9 @@
|
|||||||
<title>Nagios Map</title>
|
<title>Nagios Map</title>
|
||||||
<link type="image/ico" rel="shortcut icon" href="images/favicon.ico"/>
|
<link type="image/ico" rel="shortcut icon" href="images/favicon.ico"/>
|
||||||
<link type="text/css" rel="stylesheet"
|
<link type="text/css" rel="stylesheet"
|
||||||
href="bootstrap-3.3.0/css/bootstrap.min.css">
|
href="bootstrap-3.3.7/css/bootstrap.min.css">
|
||||||
<link type="text/css" rel="stylesheet"
|
<link type="text/css" rel="stylesheet"
|
||||||
href="bootstrap-3.3.0/css/bootstrap-theme.min.css">
|
href="bootstrap-3.3.7/css/bootstrap-theme.min.css">
|
||||||
<link type='text/css' rel='stylesheet' href='stylesheets/common.css'/>
|
<link type='text/css' rel='stylesheet' href='stylesheets/common.css'/>
|
||||||
<link type='text/css' rel='stylesheet' href='stylesheets/map.css'/>
|
<link type='text/css' rel='stylesheet' href='stylesheets/map.css'/>
|
||||||
<link type='text/css' rel='stylesheet' href='stylesheets/map-directive.css'/>
|
<link type='text/css' rel='stylesheet' href='stylesheets/map-directive.css'/>
|
||||||
@ -59,18 +59,19 @@
|
|||||||
<script type="text/javascript"
|
<script type="text/javascript"
|
||||||
src="angularjs/angular-1.3.9/angular.min.js"></script>
|
src="angularjs/angular-1.3.9/angular.min.js"></script>
|
||||||
<script type="text/javascript"
|
<script type="text/javascript"
|
||||||
src="angularjs/ui-bootstrap-tpls-0.12.0.min.js"></script>
|
src="angularjs/ui-bootstrap-tpls-0.14.3.min.js"></script>
|
||||||
<script type="text/javascript"
|
<script type="text/javascript"
|
||||||
src="angularjs/ui-utils-0.2.1/ui-utils.js"></script>
|
src="angularjs/ui-utils-0.2.3/ui-utils.js"></script>
|
||||||
<script type="text/javascript" src="spin/spin.min.js"></script>
|
<script type="text/javascript" src="spin/spin.min.js"></script>
|
||||||
<script type="text/javascript" src="js/map.js"></script>
|
<script type="text/javascript" src="js/map.js"></script>
|
||||||
<script type="text/javascript" src="js/map-directive.js"></script>
|
<script type="text/javascript" src="js/map-directive.js"></script>
|
||||||
<script type="text/javascript" src="js/map-form.js"></script>
|
<script type="text/javascript" src="js/map-form.js"></script>
|
||||||
<script type="text/javascript" src="js/nagios-decorations.js"></script>
|
<script type="text/javascript" src="js/nagios-decorations.js"></script>
|
||||||
<script type="text/javascript" src="js/nagios-time.js"></script>
|
<script type="text/javascript" src="js/nagios-time.js"></script>
|
||||||
<script type="text/javascript" src="js/jquery-1.7.1.min.js"></script>
|
<script type="text/javascript" src="js/jquery-1.12.4.min.js"></script>
|
||||||
<script type="text/javascript" src="js/nag_funcs.js"></script>
|
<script type="text/javascript" src="js/nag_funcs.js"></script>
|
||||||
|
|
||||||
|
<?php if ($cfg["enable_page_tour"]) { ?>
|
||||||
<script type='text/javascript'>
|
<script type='text/javascript'>
|
||||||
var vbox;
|
var vbox;
|
||||||
var vBoxId = "map";
|
var vBoxId = "map";
|
||||||
@ -84,6 +85,7 @@
|
|||||||
text:vboxText,vidid:vBoxId});
|
text:vboxText,vidid:vBoxId});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
<body ng-controller="mapCtrl" <?php echo $img; ?>>
|
<body ng-controller="mapCtrl" <?php echo $img; ?>>
|
||||||
@ -94,8 +96,9 @@
|
|||||||
update-interval="10"
|
update-interval="10"
|
||||||
last-update="lastUpdate"
|
last-update="lastUpdate"
|
||||||
initial-state="collapsed"
|
initial-state="collapsed"
|
||||||
collapsable="true"
|
collapsible="true"
|
||||||
include-partial="map-links.html">
|
include-partial="map-links.html"
|
||||||
|
root="{{params.root}}">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="map-container" ng-hide="formDisplayed"
|
<div id="map-container" ng-hide="formDisplayed"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
include_once(dirname(__FILE__).'/includes/utils.inc.php');
|
include_once(dirname(__FILE__).'/includes/utils.inc.php');
|
||||||
|
|
||||||
$this_version = '4.3.4';
|
$this_version = '4.4.3';
|
||||||
$link_target = 'main';
|
$link_target = 'main';
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||||
|
@ -38,7 +38,7 @@ div.status { font-size: 10pt; text-align: center; }
|
|||||||
.statusHOSTPENDING,.statusPENDING { background-color: #ACACAC; }
|
.statusHOSTPENDING,.statusPENDING { background-color: #ACACAC; }
|
||||||
.statusHOSTUP,.statusOK { background-color: #33FF00; }
|
.statusHOSTUP,.statusOK { background-color: #33FF00; }
|
||||||
.statusHOSTDOWN,.statusCRITICAL { background-color: #F83838; }
|
.statusHOSTDOWN,.statusCRITICAL { background-color: #F83838; }
|
||||||
.statusHOSTDOWNACK { background-color: #F83838; }
|
.statusHOSTDOWNACK,.statusCRITICALACK { background-color: #F83838; }
|
||||||
.statusHOSTDOWNSCHED { background-color: #F83838; }
|
.statusHOSTDOWNSCHED { background-color: #F83838; }
|
||||||
.statusHOSTUNREACHABLE { background-color: #F83838; }
|
.statusHOSTUNREACHABLE { background-color: #F83838; }
|
||||||
.statusHOSTUNREACHABLEACK { background-color: #F83838; }
|
.statusHOSTUNREACHABLEACK { background-color: #F83838; }
|
||||||
|
@ -5,9 +5,9 @@
|
|||||||
<title>Nagios Trends</title>
|
<title>Nagios Trends</title>
|
||||||
<link type="image/ico" rel="shortcut icon" href="images/favicon.ico"/>
|
<link type="image/ico" rel="shortcut icon" href="images/favicon.ico"/>
|
||||||
<link type="text/css" rel="stylesheet"
|
<link type="text/css" rel="stylesheet"
|
||||||
href="bootstrap-3.3.0/css/bootstrap.min.css">
|
href="bootstrap-3.3.7/css/bootstrap.min.css">
|
||||||
<link type="text/css" rel="stylesheet"
|
<link type="text/css" rel="stylesheet"
|
||||||
href="bootstrap-3.3.0/css/bootstrap-theme.min.css">
|
href="bootstrap-3.3.7/css/bootstrap-theme.min.css">
|
||||||
<link type='text/css' rel='stylesheet' href='stylesheets/common.css'>
|
<link type='text/css' rel='stylesheet' href='stylesheets/common.css'>
|
||||||
<link type='text/css' rel='stylesheet' href='stylesheets/trends.css'>
|
<link type='text/css' rel='stylesheet' href='stylesheets/trends.css'>
|
||||||
<link type='text/css' rel='stylesheet'
|
<link type='text/css' rel='stylesheet'
|
||||||
@ -16,9 +16,9 @@
|
|||||||
<script type="text/javascript"
|
<script type="text/javascript"
|
||||||
src="angularjs/angular-1.3.9/angular.min.js"></script>
|
src="angularjs/angular-1.3.9/angular.min.js"></script>
|
||||||
<script type="text/javascript"
|
<script type="text/javascript"
|
||||||
src="angularjs/ui-bootstrap-tpls-0.12.0.min.js"></script>
|
src="angularjs/ui-bootstrap-tpls-0.14.3.min.js"></script>
|
||||||
<script type="text/javascript"
|
<script type="text/javascript"
|
||||||
src="angularjs/ui-utils-0.2.1/ui-utils.js"></script>
|
src="angularjs/ui-utils-0.2.3/ui-utils.js"></script>
|
||||||
<script type="text/javascript" src="spin/spin.min.js"></script>
|
<script type="text/javascript" src="spin/spin.min.js"></script>
|
||||||
<script type="text/javascript" src="js/trends.js"></script>
|
<script type="text/javascript" src="js/trends.js"></script>
|
||||||
<script type="text/javascript" src="js/trends-form.js"></script>
|
<script type="text/javascript" src="js/trends-form.js"></script>
|
||||||
|
@ -93,7 +93,7 @@ NAGIOS_BEGIN_DECL
|
|||||||
#define NAGFUNCS_CSS "nag_funcs.css"
|
#define NAGFUNCS_CSS "nag_funcs.css"
|
||||||
|
|
||||||
/********************************* JAVASCRIPT INCLUDES **********************/
|
/********************************* JAVASCRIPT INCLUDES **********************/
|
||||||
#define JQUERY_JS "jquery-1.7.1.min.js"
|
#define JQUERY_JS "jquery-1.12.4.min.js"
|
||||||
#define NAGFUNCS_JS "nag_funcs.js"
|
#define NAGFUNCS_JS "nag_funcs.js"
|
||||||
|
|
||||||
/********************************* ICONS ************************************/
|
/********************************* ICONS ************************************/
|
||||||
@ -439,8 +439,17 @@ typedef struct lifo_struct {
|
|||||||
struct lifo_struct *next;
|
struct lifo_struct *next;
|
||||||
} lifo;
|
} lifo;
|
||||||
|
|
||||||
|
struct nagios_extcmd {
|
||||||
|
const char *name;
|
||||||
|
int id;
|
||||||
|
int cmt_opt; /* 0 = not allowed, 1 = optional, 2 = required */
|
||||||
|
char *default_comment;
|
||||||
|
};
|
||||||
|
|
||||||
/******************************** FUNCTIONS *******************************/
|
/******************************** FUNCTIONS *******************************/
|
||||||
|
|
||||||
|
typedef void (*read_config_callback)(const char*, const char*);
|
||||||
|
|
||||||
void reset_cgi_vars(void);
|
void reset_cgi_vars(void);
|
||||||
void cgi_init(void (*doc_header)(int), void (*doc_footer)(void), int object_options, int status_options);
|
void cgi_init(void (*doc_header)(int), void (*doc_footer)(void), int object_options, int status_options);
|
||||||
void free_memory(void);
|
void free_memory(void);
|
||||||
@ -448,7 +457,7 @@ void free_memory(void);
|
|||||||
const char *get_cgi_config_location(void); /* gets location of the CGI config file to read */
|
const char *get_cgi_config_location(void); /* gets location of the CGI config file to read */
|
||||||
const char *get_cmd_file_location(void); /* gets location of external command file to write to */
|
const char *get_cmd_file_location(void); /* gets location of external command file to write to */
|
||||||
|
|
||||||
int read_cgi_config_file(const char *);
|
int read_cgi_config_file(const char *, read_config_callback);
|
||||||
int read_main_config_file(const char *);
|
int read_main_config_file(const char *);
|
||||||
int read_all_object_configuration_data(const char *, int);
|
int read_all_object_configuration_data(const char *, int);
|
||||||
int read_all_status_data(const char *, int);
|
int read_all_status_data(const char *, int);
|
||||||
@ -494,5 +503,9 @@ void free_lifo_memory(void);
|
|||||||
int push_lifo(char *);
|
int push_lifo(char *);
|
||||||
char *pop_lifo(void);
|
char *pop_lifo(void);
|
||||||
|
|
||||||
|
struct nagios_extcmd* extcmd_get_command_id(int);
|
||||||
|
struct nagios_extcmd* extcmd_get_command_name(const char *);
|
||||||
|
const char *extcmd_get_name(int);
|
||||||
|
|
||||||
NAGIOS_END_DECL
|
NAGIOS_END_DECL
|
||||||
#endif
|
#endif
|
||||||
|
@ -113,6 +113,6 @@ int add_comment_to_hashlist(struct nagios_comment *);
|
|||||||
|
|
||||||
void free_comment_data(void); /* frees memory allocated to the comment list */
|
void free_comment_data(void); /* frees memory allocated to the comment list */
|
||||||
|
|
||||||
NAGIOS_BEGIN_DECL
|
NAGIOS_END_DECL
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -24,8 +24,8 @@
|
|||||||
|
|
||||||
#include "shared.h"
|
#include "shared.h"
|
||||||
|
|
||||||
#define PROGRAM_VERSION "4.3.4"
|
#define PROGRAM_VERSION "4.4.3"
|
||||||
#define PROGRAM_MODIFICATION_DATE "2017-08-24"
|
#define PROGRAM_MODIFICATION_DATE "2019-01-15"
|
||||||
|
|
||||||
NAGIOS_BEGIN_DECL
|
NAGIOS_BEGIN_DECL
|
||||||
|
|
||||||
|
@ -29,6 +29,12 @@
|
|||||||
/* Event broker integration */
|
/* Event broker integration */
|
||||||
#undef USE_EVENT_BROKER
|
#undef USE_EVENT_BROKER
|
||||||
|
|
||||||
|
/* NERD / radio dispatch usage */
|
||||||
|
#undef ENABLE_NERD
|
||||||
|
|
||||||
|
/* check for RLIMIT_PROC */
|
||||||
|
#undef DETECT_RLIMIT_PROBLEM
|
||||||
|
|
||||||
/* commands used by CGIs */
|
/* commands used by CGIs */
|
||||||
#undef TRACEROUTE_COMMAND
|
#undef TRACEROUTE_COMMAND
|
||||||
#undef PING_COMMAND
|
#undef PING_COMMAND
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
#define DEFAULT_PHYSICAL_CGIBIN_PATH "@sbindir@"
|
#define DEFAULT_PHYSICAL_CGIBIN_PATH "@sbindir@"
|
||||||
#define DEFAULT_URL_CGIBIN_PATH "@cgiurl@"
|
#define DEFAULT_URL_CGIBIN_PATH "@cgiurl@"
|
||||||
#define DEFAULT_CGI_CONFIG_FILE "@sysconfdir@/cgi.cfg"
|
#define DEFAULT_CGI_CONFIG_FILE "@sysconfdir@/cgi.cfg"
|
||||||
#define DEFAULT_LOCK_FILE "@lockfile@"
|
#define DEFAULT_LOCK_FILE "@subsyslockfile@"
|
||||||
#define DEFAULT_OBJECT_CACHE_FILE "@localstatedir@/objects.cache"
|
#define DEFAULT_OBJECT_CACHE_FILE "@localstatedir@/objects.cache"
|
||||||
#define DEFAULT_PRECACHED_OBJECT_FILE "@localstatedir@/objects.precache"
|
#define DEFAULT_PRECACHED_OBJECT_FILE "@localstatedir@/objects.precache"
|
||||||
#define DEFAULT_EVENT_BROKER_FILE "@localstatedir@/broker.socket"
|
#define DEFAULT_EVENT_BROKER_FILE "@localstatedir@/broker.socket"
|
||||||
|
@ -58,6 +58,7 @@
|
|||||||
#define DEBUGL_MACROS 2048
|
#define DEBUGL_MACROS 2048
|
||||||
#define DEBUGL_IPC 4096
|
#define DEBUGL_IPC 4096
|
||||||
#define DEBUGL_SCHEDULING 8192
|
#define DEBUGL_SCHEDULING 8192
|
||||||
|
#define DEBUGL_WORKERS 16384
|
||||||
|
|
||||||
#define DEBUGV_BASIC 0
|
#define DEBUGV_BASIC 0
|
||||||
#define DEBUGV_MORE 1
|
#define DEBUGV_MORE 1
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user