Imported Upstream version 1.4.11
This commit is contained in:
parent
cff68b4c0a
commit
1d1585cd09
72 changed files with 16170 additions and 13657 deletions
|
@ -14,8 +14,8 @@ MATHLIBS = @MATHLIBS@
|
|||
#AM_CFLAGS = -Wall
|
||||
|
||||
libexec_PROGRAMS = check_apt check_cluster check_disk check_dummy check_http check_load \
|
||||
check_mrtg check_mrtgtraf check_ntp check_nwstat check_overcr check_ping \
|
||||
check_real check_smtp check_ssh check_tcp check_time \
|
||||
check_mrtg check_mrtgtraf check_ntp check_ntp_peer check_nwstat check_overcr check_ping \
|
||||
check_real check_smtp check_ssh check_tcp check_time check_ntp_time \
|
||||
check_ups check_users negate \
|
||||
urlize @EXTRAS@
|
||||
|
||||
|
@ -44,6 +44,9 @@ TESTS = @PLUGIN_TEST@
|
|||
test:
|
||||
perl -I $(top_builddir) -I $(top_srcdir) ../test.pl
|
||||
|
||||
test-debug:
|
||||
NPTEST_DEBUG=1 HARNESS_VERBOSE=1 perl -I $(top_builddir) -I $(top_srcdir) ../test.pl
|
||||
|
||||
##############################################################################
|
||||
# the actual targets
|
||||
|
||||
|
@ -70,6 +73,7 @@ check_mysql_query_LDADD = $(NETLIBS) $(MYSQLLIBS)
|
|||
check_nagios_LDADD = $(BASEOBJS) runcmd.o
|
||||
check_nt_LDADD = $(NETLIBS)
|
||||
check_ntp_LDADD = $(NETLIBS) $(MATHLIBS)
|
||||
check_ntp_peer_LDADD = $(NETLIBS) $(MATHLIBS)
|
||||
check_nwstat_LDADD = $(NETLIBS)
|
||||
check_overcr_LDADD = $(NETLIBS)
|
||||
check_pgsql_LDADD = $(NETLIBS) $(PGLIBS)
|
||||
|
@ -83,6 +87,7 @@ check_ssh_LDADD = $(NETLIBS)
|
|||
check_swap_LDADD = $(MATHLIBS) $(BASEOBJS) popen.o
|
||||
check_tcp_LDADD = $(SSLOBJS) $(NETLIBS) $(SSLLIBS)
|
||||
check_time_LDADD = $(NETLIBS)
|
||||
check_ntp_time_LDADD = $(NETLIBS) $(MATHLIBS)
|
||||
check_ups_LDADD = $(NETLIBS)
|
||||
check_users_LDADD = $(BASEOBJS) popen.o
|
||||
check_by_ssh_LDADD = $(NETLIBS) runcmd.o
|
||||
|
@ -110,6 +115,7 @@ check_mysql_query_DEPENDENCIES = check_mysql_query.c $(NETOBJS) $(DEPLIBS)
|
|||
check_nagios_DEPENDENCIES = check_nagios.c $(BASEOBJS) runcmd.o $(DEPLIBS)
|
||||
check_nt_DEPENDENCIES = check_nt.c $(NETOBJS) $(DEPLIBS)
|
||||
check_ntp_DEPENDENCIES = check_ntp.c $(NETOBJS) $(DEPLIBS)
|
||||
check_ntp_peer_DEPENDENCIES = check_ntp_peer.c $(NETOBJS) $(DEPLIBS)
|
||||
check_nwstat_DEPENDENCIES = check_nwstat.c $(NETOBJS) $(DEPLIBS)
|
||||
check_overcr_DEPENDENCIES = check_overcr.c $(NETOBJS) $(DEPLIBS)
|
||||
check_pgsql_DEPENDENCIES = check_pgsql.c $(NETOBJS) $(DEPLIBS)
|
||||
|
@ -123,6 +129,7 @@ check_ssh_DEPENDENCIES = check_ssh.c $(NETOBJS) $(DEPLIBS)
|
|||
check_swap_DEPENDENCIES = check_swap.c $(BASEOBJS) popen.o $(DEPLIBS)
|
||||
check_tcp_DEPENDENCIES = check_tcp.c $(SSLOBJS) $(NETOBJS) $(DEPLIBS)
|
||||
check_time_DEPENDENCIES = check_time.c $(NETOBJS) $(DEPLIBS)
|
||||
check_ntp_time_DEPENDENCIES = check_ntp_time.c $(NETOBJS) $(DEPLIBS)
|
||||
check_ups_DEPENDENCIES = check_ups.c $(NETOBJS) $(DEPLIBS)
|
||||
check_users_DEPENDENCIES = check_users.c $(BASEOBJS) popen.o $(DEPLIBS)
|
||||
check_by_ssh_DEPENDENCIES = check_by_ssh.c $(NETOBJS) runcmd.o $(DEPLIBS)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Makefile.in generated by automake 1.9.5 from Makefile.am.
|
||||
# Makefile.in generated by automake 1.9.6 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||
|
@ -14,8 +14,6 @@
|
|||
|
||||
@SET_MAKE@
|
||||
|
||||
SOURCES = check_apt.c check_by_ssh.c check_cluster.c check_dig.c check_disk.c check_dns.c check_dummy.c check_fping.c check_game.c check_hpjd.c check_http.c check_ide_smart.c check_ldap.c check_load.c check_mrtg.c check_mrtgtraf.c check_mysql.c check_mysql_query.c check_nagios.c check_nt.c check_ntp.c check_nwstat.c check_overcr.c check_pgsql.c check_ping.c check_procs.c check_radius.c check_real.c check_smtp.c check_snmp.c check_ssh.c check_swap.c check_tcp.c check_time.c check_ups.c check_users.c negate.c urlize.c
|
||||
|
||||
srcdir = @srcdir@
|
||||
top_srcdir = @top_srcdir@
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
|
@ -40,11 +38,11 @@ libexec_PROGRAMS = check_apt$(EXEEXT) check_cluster$(EXEEXT) \
|
|||
check_disk$(EXEEXT) check_dummy$(EXEEXT) check_http$(EXEEXT) \
|
||||
check_load$(EXEEXT) check_mrtg$(EXEEXT) \
|
||||
check_mrtgtraf$(EXEEXT) check_ntp$(EXEEXT) \
|
||||
check_nwstat$(EXEEXT) check_overcr$(EXEEXT) \
|
||||
check_ping$(EXEEXT) check_real$(EXEEXT) check_smtp$(EXEEXT) \
|
||||
check_ssh$(EXEEXT) check_tcp$(EXEEXT) check_time$(EXEEXT) \
|
||||
check_ups$(EXEEXT) check_users$(EXEEXT) negate$(EXEEXT) \
|
||||
urlize$(EXEEXT) @EXTRAS@
|
||||
check_ntp_peer$(EXEEXT) check_nwstat$(EXEEXT) \
|
||||
check_overcr$(EXEEXT) check_ping$(EXEEXT) check_real$(EXEEXT) \
|
||||
check_smtp$(EXEEXT) check_ssh$(EXEEXT) check_tcp$(EXEEXT) \
|
||||
check_time$(EXEEXT) check_ntp_time$(EXEEXT) check_ups$(EXEEXT) \
|
||||
check_users$(EXEEXT) negate$(EXEEXT) urlize$(EXEEXT) @EXTRAS@
|
||||
EXTRA_PROGRAMS = check_mysql$(EXEEXT) check_radius$(EXEEXT) \
|
||||
check_pgsql$(EXEEXT) check_snmp$(EXEEXT) check_hpjd$(EXEEXT) \
|
||||
check_swap$(EXEEXT) check_fping$(EXEEXT) check_ldap$(EXEEXT) \
|
||||
|
@ -167,6 +165,10 @@ check_nt_SOURCES = check_nt.c
|
|||
check_nt_OBJECTS = check_nt.$(OBJEXT)
|
||||
check_ntp_SOURCES = check_ntp.c
|
||||
check_ntp_OBJECTS = check_ntp.$(OBJEXT)
|
||||
check_ntp_peer_SOURCES = check_ntp_peer.c
|
||||
check_ntp_peer_OBJECTS = check_ntp_peer.$(OBJEXT)
|
||||
check_ntp_time_SOURCES = check_ntp_time.c
|
||||
check_ntp_time_OBJECTS = check_ntp_time.$(OBJEXT)
|
||||
check_nwstat_SOURCES = check_nwstat.c
|
||||
check_nwstat_OBJECTS = check_nwstat.$(OBJEXT)
|
||||
check_overcr_SOURCES = check_overcr.c
|
||||
|
@ -217,19 +219,21 @@ SOURCES = check_apt.c check_by_ssh.c check_cluster.c check_dig.c \
|
|||
check_game.c check_hpjd.c check_http.c check_ide_smart.c \
|
||||
check_ldap.c check_load.c check_mrtg.c check_mrtgtraf.c \
|
||||
check_mysql.c check_mysql_query.c check_nagios.c check_nt.c \
|
||||
check_ntp.c check_nwstat.c check_overcr.c check_pgsql.c \
|
||||
check_ping.c check_procs.c check_radius.c check_real.c \
|
||||
check_smtp.c check_snmp.c check_ssh.c check_swap.c check_tcp.c \
|
||||
check_time.c check_ups.c check_users.c negate.c urlize.c
|
||||
check_ntp.c check_ntp_peer.c check_ntp_time.c check_nwstat.c \
|
||||
check_overcr.c check_pgsql.c check_ping.c check_procs.c \
|
||||
check_radius.c check_real.c check_smtp.c check_snmp.c \
|
||||
check_ssh.c check_swap.c check_tcp.c check_time.c check_ups.c \
|
||||
check_users.c negate.c urlize.c
|
||||
DIST_SOURCES = check_apt.c check_by_ssh.c check_cluster.c check_dig.c \
|
||||
check_disk.c check_dns.c check_dummy.c check_fping.c \
|
||||
check_game.c check_hpjd.c check_http.c check_ide_smart.c \
|
||||
check_ldap.c check_load.c check_mrtg.c check_mrtgtraf.c \
|
||||
check_mysql.c check_mysql_query.c check_nagios.c check_nt.c \
|
||||
check_ntp.c check_nwstat.c check_overcr.c check_pgsql.c \
|
||||
check_ping.c check_procs.c check_radius.c check_real.c \
|
||||
check_smtp.c check_snmp.c check_ssh.c check_swap.c check_tcp.c \
|
||||
check_time.c check_ups.c check_users.c negate.c urlize.c
|
||||
check_ntp.c check_ntp_peer.c check_ntp_time.c check_nwstat.c \
|
||||
check_overcr.c check_pgsql.c check_ping.c check_procs.c \
|
||||
check_radius.c check_real.c check_smtp.c check_snmp.c \
|
||||
check_ssh.c check_swap.c check_tcp.c check_time.c check_ups.c \
|
||||
check_users.c negate.c urlize.c
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
|
@ -289,6 +293,7 @@ GL_COND_LIBTOOL_FALSE = @GL_COND_LIBTOOL_FALSE@
|
|||
GL_COND_LIBTOOL_TRUE = @GL_COND_LIBTOOL_TRUE@
|
||||
GMSGFMT = @GMSGFMT@
|
||||
GMSGFMT_015 = @GMSGFMT_015@
|
||||
GREP = @GREP@
|
||||
HAVE_INTTYPES_H = @HAVE_INTTYPES_H@
|
||||
HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@
|
||||
HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@
|
||||
|
@ -328,7 +333,6 @@ LTLIBINTL = @LTLIBINTL@
|
|||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MATHLIBS = @MATHLIBS@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
MSGFMT = @MSGFMT@
|
||||
MSGFMT_015 = @MSGFMT_015@
|
||||
MSGMERGE = @MSGMERGE@
|
||||
|
@ -406,12 +410,9 @@ WCTYPE_H = @WCTYPE_H@
|
|||
WINT_T_SUFFIX = @WINT_T_SUFFIX@
|
||||
XGETTEXT = @XGETTEXT@
|
||||
XGETTEXT_015 = @XGETTEXT_015@
|
||||
ac_ct_AR = @ac_ct_AR@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_CXX = @ac_ct_CXX@
|
||||
ac_ct_F77 = @ac_ct_F77@
|
||||
ac_ct_RANLIB = @ac_ct_RANLIB@
|
||||
ac_ct_STRIP = @ac_ct_STRIP@
|
||||
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
|
||||
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
|
||||
am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
|
||||
|
@ -429,6 +430,9 @@ build_os = @build_os@
|
|||
build_vendor = @build_vendor@
|
||||
check_tcp_ssl = @check_tcp_ssl@
|
||||
datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
docdir = @docdir@
|
||||
dvidir = @dvidir@
|
||||
exec_prefix = @exec_prefix@
|
||||
gl_LIBOBJS = @gl_LIBOBJS@
|
||||
gl_LTLIBOBJS = @gl_LTLIBOBJS@
|
||||
|
@ -437,6 +441,7 @@ host_alias = @host_alias@
|
|||
host_cpu = @host_cpu@
|
||||
host_os = @host_os@
|
||||
host_vendor = @host_vendor@
|
||||
htmldir = @htmldir@
|
||||
includedir = @includedir@
|
||||
infodir = @infodir@
|
||||
install_sh = @install_sh@
|
||||
|
@ -448,8 +453,10 @@ mandir = @mandir@
|
|||
mkdir_p = @mkdir_p@
|
||||
np_mysql_config = @np_mysql_config@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
sysconfdir = @sysconfdir@
|
||||
|
@ -495,6 +502,7 @@ check_mysql_query_LDADD = $(NETLIBS) $(MYSQLLIBS)
|
|||
check_nagios_LDADD = $(BASEOBJS) runcmd.o
|
||||
check_nt_LDADD = $(NETLIBS)
|
||||
check_ntp_LDADD = $(NETLIBS) $(MATHLIBS)
|
||||
check_ntp_peer_LDADD = $(NETLIBS) $(MATHLIBS)
|
||||
check_nwstat_LDADD = $(NETLIBS)
|
||||
check_overcr_LDADD = $(NETLIBS)
|
||||
check_pgsql_LDADD = $(NETLIBS) $(PGLIBS)
|
||||
|
@ -508,6 +516,7 @@ check_ssh_LDADD = $(NETLIBS)
|
|||
check_swap_LDADD = $(MATHLIBS) $(BASEOBJS) popen.o
|
||||
check_tcp_LDADD = $(SSLOBJS) $(NETLIBS) $(SSLLIBS)
|
||||
check_time_LDADD = $(NETLIBS)
|
||||
check_ntp_time_LDADD = $(NETLIBS) $(MATHLIBS)
|
||||
check_ups_LDADD = $(NETLIBS)
|
||||
check_users_LDADD = $(BASEOBJS) popen.o
|
||||
check_by_ssh_LDADD = $(NETLIBS) runcmd.o
|
||||
|
@ -534,6 +543,7 @@ check_mysql_query_DEPENDENCIES = check_mysql_query.c $(NETOBJS) $(DEPLIBS)
|
|||
check_nagios_DEPENDENCIES = check_nagios.c $(BASEOBJS) runcmd.o $(DEPLIBS)
|
||||
check_nt_DEPENDENCIES = check_nt.c $(NETOBJS) $(DEPLIBS)
|
||||
check_ntp_DEPENDENCIES = check_ntp.c $(NETOBJS) $(DEPLIBS)
|
||||
check_ntp_peer_DEPENDENCIES = check_ntp_peer.c $(NETOBJS) $(DEPLIBS)
|
||||
check_nwstat_DEPENDENCIES = check_nwstat.c $(NETOBJS) $(DEPLIBS)
|
||||
check_overcr_DEPENDENCIES = check_overcr.c $(NETOBJS) $(DEPLIBS)
|
||||
check_pgsql_DEPENDENCIES = check_pgsql.c $(NETOBJS) $(DEPLIBS)
|
||||
|
@ -547,6 +557,7 @@ check_ssh_DEPENDENCIES = check_ssh.c $(NETOBJS) $(DEPLIBS)
|
|||
check_swap_DEPENDENCIES = check_swap.c $(BASEOBJS) popen.o $(DEPLIBS)
|
||||
check_tcp_DEPENDENCIES = check_tcp.c $(SSLOBJS) $(NETOBJS) $(DEPLIBS)
|
||||
check_time_DEPENDENCIES = check_time.c $(NETOBJS) $(DEPLIBS)
|
||||
check_ntp_time_DEPENDENCIES = check_ntp_time.c $(NETOBJS) $(DEPLIBS)
|
||||
check_ups_DEPENDENCIES = check_ups.c $(NETOBJS) $(DEPLIBS)
|
||||
check_users_DEPENDENCIES = check_users.c $(BASEOBJS) popen.o $(DEPLIBS)
|
||||
check_by_ssh_DEPENDENCIES = check_by_ssh.c $(NETOBJS) runcmd.o $(DEPLIBS)
|
||||
|
@ -676,6 +687,12 @@ check_nt$(EXEEXT): $(check_nt_OBJECTS) $(check_nt_DEPENDENCIES)
|
|||
check_ntp$(EXEEXT): $(check_ntp_OBJECTS) $(check_ntp_DEPENDENCIES)
|
||||
@rm -f check_ntp$(EXEEXT)
|
||||
$(LINK) $(check_ntp_LDFLAGS) $(check_ntp_OBJECTS) $(check_ntp_LDADD) $(LIBS)
|
||||
check_ntp_peer$(EXEEXT): $(check_ntp_peer_OBJECTS) $(check_ntp_peer_DEPENDENCIES)
|
||||
@rm -f check_ntp_peer$(EXEEXT)
|
||||
$(LINK) $(check_ntp_peer_LDFLAGS) $(check_ntp_peer_OBJECTS) $(check_ntp_peer_LDADD) $(LIBS)
|
||||
check_ntp_time$(EXEEXT): $(check_ntp_time_OBJECTS) $(check_ntp_time_DEPENDENCIES)
|
||||
@rm -f check_ntp_time$(EXEEXT)
|
||||
$(LINK) $(check_ntp_time_LDFLAGS) $(check_ntp_time_OBJECTS) $(check_ntp_time_LDADD) $(LIBS)
|
||||
check_nwstat$(EXEEXT): $(check_nwstat_OBJECTS) $(check_nwstat_DEPENDENCIES)
|
||||
@rm -f check_nwstat$(EXEEXT)
|
||||
$(LINK) $(check_nwstat_LDFLAGS) $(check_nwstat_OBJECTS) $(check_nwstat_LDADD) $(LIBS)
|
||||
|
@ -755,6 +772,8 @@ distclean-compile:
|
|||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_nagios.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_nt.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_ntp.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_ntp_peer.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_ntp_time.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_nwstat.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_overcr.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_pgsql.Po@am__quote@
|
||||
|
@ -1084,6 +1103,9 @@ uninstall-am: uninstall-info-am uninstall-libexecPROGRAMS \
|
|||
test:
|
||||
perl -I $(top_builddir) -I $(top_srcdir) ../test.pl
|
||||
|
||||
test-debug:
|
||||
NPTEST_DEBUG=1 HARNESS_VERBOSE=1 perl -I $(top_builddir) -I $(top_srcdir) ../test.pl
|
||||
|
||||
##############################################################################
|
||||
# secondary dependencies
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* Copyright (c) 2000-2004 Ethan Galstad (nagios@nagios.org)
|
||||
* Copyright (c) 2007 nagios-plugins team
|
||||
* License: GPL
|
||||
* Last Modified: $Date: 2007-06-20 10:01:07 +0100 (Wed, 20 Jun 2007) $
|
||||
* Last Modified: $Date: 2007-12-11 05:57:35 +0000 (Tue, 11 Dec 2007) $
|
||||
*
|
||||
* License Information:
|
||||
*
|
||||
|
@ -23,12 +23,12 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* $Id: check_cluster.c 1745 2007-06-20 09:01:07Z psychotrahe $
|
||||
* $Id: check_cluster.c 1861 2007-12-11 05:57:35Z dermoth $
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
const char *progname = "check_cluster";
|
||||
const char *revision = "$Revision: 1745 $";
|
||||
const char *revision = "$Revision: 1861 $";
|
||||
const char *copyright = "2007";
|
||||
const char *email = "nagiosplug-devel@lists.sourceforge.net";
|
||||
|
||||
|
@ -71,6 +71,10 @@ int main(int argc, char **argv){
|
|||
int return_code=STATE_OK;
|
||||
thresholds *thresholds = NULL;
|
||||
|
||||
setlocale (LC_ALL, "");
|
||||
bindtextdomain (PACKAGE, LOCALEDIR);
|
||||
textdomain (PACKAGE);
|
||||
|
||||
if(process_arguments(argc,argv)==ERROR)
|
||||
usage(_("Could not parse arguments"));
|
||||
|
||||
|
@ -178,14 +182,10 @@ int process_arguments(int argc, char **argv){
|
|||
break;
|
||||
|
||||
case 'w': /* warning threshold */
|
||||
if (strspn (optarg, "0123456789:,") < strlen (optarg))
|
||||
usage2 (_("Invalid warning threshold: %s\n"), optarg);
|
||||
warn_threshold = strdup(optarg);
|
||||
break;
|
||||
|
||||
case 'c': /* warning threshold */
|
||||
if (strspn (optarg, "0123456789:,") < strlen (optarg))
|
||||
usage2 (_("Invalid critical threshold: %s\n"), optarg);
|
||||
crit_threshold = strdup(optarg);
|
||||
break;
|
||||
|
||||
|
@ -248,7 +248,7 @@ print_help(void)
|
|||
printf (" %s\n", _("non-OK state in order to return a WARNING status level"));
|
||||
printf (" %s\n", "-c, --critical=THRESHOLD");
|
||||
printf (" %s\n", _("Specifies the range of hosts or services in cluster that must be in a"));
|
||||
printf (" %s\n", _(" non-OK state in order to return a CRITICAL status level"));
|
||||
printf (" %s\n", _("non-OK state in order to return a CRITICAL status level"));
|
||||
printf (" %s\n", "-d, --data=LIST");
|
||||
printf (" %s\n", _("The status codes of the hosts or services in the cluster, separated by"));
|
||||
printf (" %s\n", _("commas"));
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* License: GPL
|
||||
* Copyright (c) 1999-2006 nagios-plugins team
|
||||
*
|
||||
* Last Modified: $Date: 2007-09-23 13:29:36 +0100 (Sun, 23 Sep 2007) $
|
||||
* Last Modified: $Date: 2007-12-08 16:34:05 +0000 (Sat, 08 Dec 2007) $
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
|
@ -27,13 +27,13 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* $Id: check_disk.c 1793 2007-09-23 12:29:36Z psychotrahe $
|
||||
* $Id: check_disk.c 1848 2007-12-08 16:34:05Z dermoth $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
const char *progname = "check_disk";
|
||||
const char *program_name = "check_disk"; /* Required for coreutils libs */
|
||||
const char *revision = "$Revision: 1793 $";
|
||||
const char *revision = "$Revision: 1848 $";
|
||||
const char *copyright = "1999-2006";
|
||||
const char *email = "nagiosplug-devel@lists.sourceforge.net";
|
||||
|
||||
|
@ -307,10 +307,17 @@ main (int argc, char **argv)
|
|||
|
||||
if (fsp.fsu_blocks && strcmp ("none", me->me_mountdir)) {
|
||||
total = fsp.fsu_blocks;
|
||||
available = fsp.fsu_bavail;
|
||||
/* 2007-12-08 - Workaround for Gnulib reporting insanely high available
|
||||
* space on BSD (the actual value should be negative but fsp.fsu_bavail
|
||||
* is unsigned) */
|
||||
available = fsp.fsu_bavail > fsp.fsu_bfree ? 0 : fsp.fsu_bavail;
|
||||
available_to_root = fsp.fsu_bfree;
|
||||
used = total - available_to_root;
|
||||
|
||||
if (verbose >= 3)
|
||||
printf ("For %s, total=%llu, available=%llu, available_to_root=%llu, used=%llu, fsp.fsu_files=%llu, fsp.fsu_ffree=%llu\n",
|
||||
me->me_mountdir, total, available, available_to_root, used, fsp.fsu_files, fsp.fsu_ffree);
|
||||
|
||||
dused_pct = calculate_percent( used, used + available ); /* used + available can never be > uintmax */
|
||||
|
||||
dfree_pct = 100 - dused_pct;
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* License: GPL
|
||||
* Copyright (c) 1999-2006 nagios-plugins team
|
||||
*
|
||||
* Last Modified: $Date: 2007-07-21 17:29:01 +0100 (Sat, 21 Jul 2007) $
|
||||
* Last Modified: $Date: 2007-12-11 05:57:35 +0000 (Tue, 11 Dec 2007) $
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
|
@ -33,13 +33,13 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: check_http.c 1759 2007-07-21 16:29:01Z hweiss $
|
||||
$Id: check_http.c 1861 2007-12-11 05:57:35Z dermoth $
|
||||
|
||||
******************************************************************************/
|
||||
/* splint -I. -I../../plugins -I../../lib/ -I/usr/kerberos/include/ ../../plugins/check_http.c */
|
||||
|
||||
const char *progname = "check_http";
|
||||
const char *revision = "$Revision: 1759 $";
|
||||
const char *revision = "$Revision: 1861 $";
|
||||
const char *copyright = "1999-2006";
|
||||
const char *email = "nagiosplug-devel@lists.sourceforge.net";
|
||||
|
||||
|
@ -48,6 +48,7 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net";
|
|||
#include "common.h"
|
||||
#include "netutils.h"
|
||||
#include "utils.h"
|
||||
#include "base64.h"
|
||||
|
||||
#define INPUT_DELIMITER ";"
|
||||
|
||||
|
@ -125,7 +126,6 @@ char *http_content_type;
|
|||
char buffer[MAX_INPUT_BUFFER];
|
||||
|
||||
int process_arguments (int, char **);
|
||||
static char *base64 (const char *bin, size_t len);
|
||||
int check_http (void);
|
||||
void redir (char *pos, char *status_line);
|
||||
int server_type_check(const char *type);
|
||||
|
@ -140,6 +140,10 @@ main (int argc, char **argv)
|
|||
{
|
||||
int result = STATE_UNKNOWN;
|
||||
|
||||
setlocale (LC_ALL, "");
|
||||
bindtextdomain (PACKAGE, LOCALEDIR);
|
||||
textdomain (PACKAGE);
|
||||
|
||||
/* Set default URL. Must be malloced for subsequent realloc if --onredirect=follow */
|
||||
server_url = strdup(HTTP_URL);
|
||||
server_url_length = strlen(server_url);
|
||||
|
@ -151,7 +155,7 @@ main (int argc, char **argv)
|
|||
|
||||
if (display_html == TRUE)
|
||||
printf ("<A HREF=\"%s://%s:%d%s\" target=\"_blank\">",
|
||||
use_ssl ? "https" : "http", server_address,
|
||||
use_ssl ? "https" : "http", host_name ? host_name : server_address,
|
||||
server_port, server_url);
|
||||
|
||||
/* initialize alarm signal handling, set socket timeout, start timer */
|
||||
|
@ -455,49 +459,6 @@ process_arguments (int argc, char **argv)
|
|||
|
||||
|
||||
|
||||
/* written by lauri alanko */
|
||||
static char *
|
||||
base64 (const char *bin, size_t len)
|
||||
{
|
||||
|
||||
char *buf = (char *) malloc ((len + 2) / 3 * 4 + 1);
|
||||
size_t i = 0, j = 0;
|
||||
|
||||
char BASE64_END = '=';
|
||||
char base64_table[64];
|
||||
strncpy (base64_table, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", 64);
|
||||
|
||||
while (j < len - 2) {
|
||||
buf[i++] = base64_table[bin[j] >> 2];
|
||||
buf[i++] = base64_table[((bin[j] & 3) << 4) | (bin[j + 1] >> 4)];
|
||||
buf[i++] = base64_table[((bin[j + 1] & 15) << 2) | (bin[j + 2] >> 6)];
|
||||
buf[i++] = base64_table[bin[j + 2] & 63];
|
||||
j += 3;
|
||||
}
|
||||
|
||||
switch (len - j) {
|
||||
case 1:
|
||||
buf[i++] = base64_table[bin[j] >> 2];
|
||||
buf[i++] = base64_table[(bin[j] & 3) << 4];
|
||||
buf[i++] = BASE64_END;
|
||||
buf[i++] = BASE64_END;
|
||||
break;
|
||||
case 2:
|
||||
buf[i++] = base64_table[bin[j] >> 2];
|
||||
buf[i++] = base64_table[((bin[j] & 3) << 4) | (bin[j + 1] >> 4)];
|
||||
buf[i++] = base64_table[(bin[j + 1] & 15) << 2];
|
||||
buf[i++] = BASE64_END;
|
||||
break;
|
||||
case 0:
|
||||
break;
|
||||
}
|
||||
|
||||
buf[i] = '\0';
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Returns 1 if we're done processing the document body; 0 to keep going */
|
||||
static int
|
||||
document_headers_done (char *full_page)
|
||||
|
@ -982,14 +943,14 @@ check_http (void)
|
|||
microsec = deltime (tv);
|
||||
elapsed_time = (double)microsec / 1.0e6;
|
||||
asprintf (&msg,
|
||||
_("HTTP WARNING: %s - %.3f second response time %s|%s %s\n"),
|
||||
_(" - %s - %.3f second response time %s|%s %s\n"),
|
||||
status_line, elapsed_time,
|
||||
(display_html ? "</A>" : ""),
|
||||
perfd_time (elapsed_time), perfd_size (pagesize));
|
||||
if (check_critical_time == TRUE && elapsed_time > critical_time)
|
||||
die (STATE_CRITICAL, "%s", msg);
|
||||
die (STATE_CRITICAL, "HTTP %s: %s", _("CRITICAL"), msg);
|
||||
if (check_warning_time == TRUE && elapsed_time > warning_time)
|
||||
die (STATE_WARNING, "%s", msg);
|
||||
die (STATE_WARNING, "HTTP %s: %s", _("WARNING"), msg);
|
||||
|
||||
/* Page and Header content checks go here */
|
||||
/* these checks should be last */
|
||||
|
@ -1062,7 +1023,6 @@ check_http (void)
|
|||
|
||||
|
||||
/* per RFC 2396 */
|
||||
#define HDR_LOCATION "%*[Ll]%*[Oo]%*[Cc]%*[Aa]%*[Tt]%*[Ii]%*[Oo]%*[Nn]: "
|
||||
#define URI_HTTP "%5[HTPShtps]"
|
||||
#define URI_HOST "%255[-.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]"
|
||||
#define URI_PORT "%6d" /* MAX_PORT's width is 5 chars, 6 to detect overflow */
|
||||
|
@ -1092,7 +1052,7 @@ redir (char *pos, char *status_line)
|
|||
die (STATE_UNKNOWN, _("HTTP UNKNOWN - Could not allocate url\n"));
|
||||
|
||||
while (pos) {
|
||||
sscanf (pos, "%[Ll]%*[Oo]%*[Cc]%*[Aa]%*[Tt]%*[Ii]%*[Oo]%*[Nn]:%n", xx, &i);
|
||||
sscanf (pos, "%1[Ll]%*1[Oo]%*1[Cc]%*1[Aa]%*1[Tt]%*1[Ii]%*1[Oo]%*1[Nn]:%n", xx, &i);
|
||||
if (i == 0) {
|
||||
pos += (size_t) strcspn (pos, "\r\n");
|
||||
pos += (size_t) strspn (pos, "\r\n");
|
||||
|
@ -1155,7 +1115,7 @@ redir (char *pos, char *status_line)
|
|||
}
|
||||
i = server_port;
|
||||
strcpy (type, server_type);
|
||||
strcpy (addr, server_address);
|
||||
strcpy (addr, host_name ? host_name : server_address);
|
||||
}
|
||||
|
||||
else {
|
||||
|
@ -1204,8 +1164,8 @@ redir (char *pos, char *status_line)
|
|||
display_html ? "</A>" : "");
|
||||
|
||||
if (verbose)
|
||||
printf (_("Redirection to %s://%s:%d%s\n"), server_type, server_address,
|
||||
server_port, server_url);
|
||||
printf (_("Redirection to %s://%s:%d%s\n"), server_type,
|
||||
host_name ? host_name : server_address, server_port, server_url);
|
||||
|
||||
check_http ();
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* License: GPL
|
||||
* Copyright (c) 1999-2006 nagios-plugins team
|
||||
*
|
||||
* Last Modified: $Date: 2007-04-25 23:10:13 +0100 (Wed, 25 Apr 2007) $
|
||||
* Last Modified: $Date: 2007-12-10 00:19:27 +0000 (Mon, 10 Dec 2007) $
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
|
@ -30,12 +30,12 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: check_load.c 1700 2007-04-25 22:10:13Z tonvoon $
|
||||
$Id: check_load.c 1851 2007-12-10 00:19:27Z psychotrahe $
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
const char *progname = "check_load";
|
||||
const char *revision = "$Revision: 1700 $";
|
||||
const char *revision = "$Revision: 1851 $";
|
||||
const char *copyright = "1999-2006";
|
||||
const char *email = "nagiosplug-devel@lists.sourceforge.net";
|
||||
|
||||
|
@ -77,6 +77,7 @@ static void
|
|||
get_threshold(char *arg, double *th)
|
||||
{
|
||||
size_t i, n;
|
||||
int valid = 0;
|
||||
char *str = arg, *p;
|
||||
|
||||
n = strlen(arg);
|
||||
|
@ -84,12 +85,13 @@ get_threshold(char *arg, double *th)
|
|||
th[i] = strtod(str, &p);
|
||||
if(p == str) break;
|
||||
|
||||
valid = 1;
|
||||
str = p + 1;
|
||||
if(n <= (size_t)(str - arg)) break;
|
||||
}
|
||||
|
||||
/* empty argument or non-floatish, so warn about it and die */
|
||||
if(!i) usage (_("Warning threshold must be float or float triplet!\n"));
|
||||
if(!i && !valid) usage (_("Warning threshold must be float or float triplet!\n"));
|
||||
|
||||
if(i != 2) {
|
||||
/* one or more numbers were given, so fill array with last
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* License: GPL
|
||||
* Copyright (c) 1999-2007 nagios-plugins team
|
||||
*
|
||||
* Last Modified: $Date: 2007-03-02 01:38:04 +0000 (Fri, 02 Mar 2007) $
|
||||
* Last Modified: $Date: 2007-12-11 05:57:35 +0000 (Tue, 11 Dec 2007) $
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
|
@ -31,7 +31,7 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: check_mrtgtraf.c 1624 2007-03-02 01:38:04Z egalstad $
|
||||
$Id: check_mrtgtraf.c 1861 2007-12-11 05:57:35Z dermoth $
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
|
@ -39,7 +39,7 @@
|
|||
#include "utils.h"
|
||||
|
||||
const char *progname = "check_mrtgtraf";
|
||||
const char *revision = "$Revision: 1624 $";
|
||||
const char *revision = "$Revision: 1861 $";
|
||||
const char *copyright = "1999-2007";
|
||||
const char *email = "nagiosplug-devel@lists.sourceforge.net";
|
||||
|
||||
|
@ -79,6 +79,10 @@ main (int argc, char **argv)
|
|||
char incoming_speed_rating[8];
|
||||
char outgoing_speed_rating[8];
|
||||
|
||||
setlocale (LC_ALL, "");
|
||||
bindtextdomain (PACKAGE, LOCALEDIR);
|
||||
textdomain (PACKAGE);
|
||||
|
||||
if (process_arguments (argc, argv) == ERROR)
|
||||
usage4 (_("Could not parse arguments"));
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
* Copyright (c) 1999-2006 nagios-plugins team
|
||||
* Copyright (c) 2000 Karl DeBisschop (kdebisschop@users.sourceforge.net)
|
||||
*
|
||||
* Last Modified: $Date: 2007-03-29 18:58:28 +0100 (Thu, 29 Mar 2007) $
|
||||
* Last Modified: $Date: 2007-12-10 07:52:00 +0000 (Mon, 10 Dec 2007) $
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
|
@ -32,12 +32,12 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* $Id: check_mysql.c 1655 2007-03-29 17:58:28Z hweiss $
|
||||
* $Id: check_mysql.c 1859 2007-12-10 07:52:00Z dermoth $
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
const char *progname = "check_mysql";
|
||||
const char *revision = "$Revision: 1655 $";
|
||||
const char *revision = "$Revision: 1859 $";
|
||||
const char *copyright = "1999-2006";
|
||||
const char *email = "nagiosplug-devel@lists.sourceforge.net";
|
||||
|
||||
|
@ -391,7 +391,7 @@ print_help (void)
|
|||
printf (" %s\n", "-S, --check-slave");
|
||||
printf (" %s\n", _("Check if the slave thread is running properly."));
|
||||
printf (" %s\n", "-w, --warning");
|
||||
printf (" %s\n", _("Exit with WARNING status if slave server is more then INTEGER seconds behind master"));
|
||||
printf (" %s\n", _("Exit with WARNING status if slave server is more than INTEGER seconds behind master"));
|
||||
printf (" %s\n", "-c, --critical");
|
||||
printf (" %s\n", _("Exit with CRITICAL status if slave server is more then INTEGER seconds behind master"));
|
||||
printf (" %s\n", _("There are no required arguments. By default, the local database with"));
|
||||
|
|
|
@ -4,9 +4,9 @@
|
|||
*
|
||||
* License: GPL
|
||||
* Copyright (c) 2006 sean finney <seanius@seanius.net>
|
||||
* Copyright (c) 2006 nagios-plugins team
|
||||
* Copyright (c) 2007 nagios-plugins team
|
||||
*
|
||||
* Last Modified: $Date: 2007-09-26 05:16:21 +0100 (Wed, 26 Sep 2007) $
|
||||
* Last Modified: $Date: 2007-12-11 05:57:35 +0000 (Tue, 11 Dec 2007) $
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
|
@ -32,13 +32,13 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: check_ntp.c 1799 2007-09-26 04:16:21Z dermoth $
|
||||
$Id: check_ntp.c 1861 2007-12-11 05:57:35Z dermoth $
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
const char *progname = "check_ntp";
|
||||
const char *revision = "$Revision: 1799 $";
|
||||
const char *copyright = "2006";
|
||||
const char *revision = "$Revision: 1861 $";
|
||||
const char *copyright = "2007";
|
||||
const char *email = "nagiosplug-devel@lists.sourceforge.net";
|
||||
|
||||
#include "common.h"
|
||||
|
@ -47,13 +47,16 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net";
|
|||
|
||||
static char *server_address=NULL;
|
||||
static int verbose=0;
|
||||
static double owarn=60;
|
||||
static double ocrit=120;
|
||||
static short do_offset=0;
|
||||
static char *owarn="60";
|
||||
static char *ocrit="120";
|
||||
static short do_jitter=0;
|
||||
static double jwarn=5000;
|
||||
static double jcrit=10000;
|
||||
static char *jwarn="5000";
|
||||
static char *jcrit="10000";
|
||||
|
||||
int process_arguments (int, char **);
|
||||
thresholds *offset_thresholds = NULL;
|
||||
thresholds *jitter_thresholds = NULL;
|
||||
void print_help (void);
|
||||
void print_usage (void);
|
||||
|
||||
|
@ -473,7 +476,7 @@ double offset_request(const char *host, int *status){
|
|||
/* now, pick the best server from the list */
|
||||
best_index=best_offset_server(servers, num_hosts);
|
||||
if(best_index < 0){
|
||||
*status=STATE_CRITICAL;
|
||||
*status=STATE_UNKNOWN;
|
||||
} else {
|
||||
/* finally, calculate the average offset */
|
||||
for(i=0; i<servers[best_index].num_responses;i++){
|
||||
|
@ -575,7 +578,7 @@ double jitter_request(const char *host, int *status){
|
|||
if(verbose) printf("%d candiate peers available\n", num_candidates);
|
||||
if(verbose && syncsource_found) printf("synchronization source found\n");
|
||||
if(! syncsource_found){
|
||||
*status = STATE_WARNING;
|
||||
*status = STATE_UNKNOWN;
|
||||
if(verbose) printf("warning: no synchronization source found\n");
|
||||
}
|
||||
|
||||
|
@ -625,7 +628,7 @@ double jitter_request(const char *host, int *status){
|
|||
}
|
||||
if(startofvalue == NULL || startofvalue==nptr){
|
||||
printf("warning: unable to read server jitter response.\n");
|
||||
*status = STATE_WARNING;
|
||||
*status = STATE_UNKNOWN;
|
||||
} else {
|
||||
if(verbose) printf("%g\n", jitter);
|
||||
num_valid++;
|
||||
|
@ -686,18 +689,20 @@ int process_arguments(int argc, char **argv){
|
|||
verbose++;
|
||||
break;
|
||||
case 'w':
|
||||
owarn = atof(optarg);
|
||||
do_offset=1;
|
||||
owarn = optarg;
|
||||
break;
|
||||
case 'c':
|
||||
ocrit = atof(optarg);
|
||||
do_offset=1;
|
||||
ocrit = optarg;
|
||||
break;
|
||||
case 'j':
|
||||
do_jitter=1;
|
||||
jwarn = atof(optarg);
|
||||
jwarn = optarg;
|
||||
break;
|
||||
case 'k':
|
||||
do_jitter=1;
|
||||
jcrit = atof(optarg);
|
||||
jcrit = optarg;
|
||||
break;
|
||||
case 'H':
|
||||
if(is_host(optarg) == FALSE)
|
||||
|
@ -724,14 +729,6 @@ int process_arguments(int argc, char **argv){
|
|||
}
|
||||
}
|
||||
|
||||
if (ocrit < owarn){
|
||||
usage4(_("Critical offset should be larger than warning offset"));
|
||||
}
|
||||
|
||||
if (jcrit < jwarn){
|
||||
usage4(_("Critical jitter should be larger than warning jitter"));
|
||||
}
|
||||
|
||||
if(server_address == NULL){
|
||||
usage4(_("Hostname was not supplied"));
|
||||
}
|
||||
|
@ -742,16 +739,16 @@ int process_arguments(int argc, char **argv){
|
|||
char *perfd_offset (double offset)
|
||||
{
|
||||
return fperfdata ("offset", offset, "s",
|
||||
TRUE, owarn,
|
||||
TRUE, ocrit,
|
||||
TRUE, offset_thresholds->warning->end,
|
||||
TRUE, offset_thresholds->critical->end,
|
||||
FALSE, 0, FALSE, 0);
|
||||
}
|
||||
|
||||
char *perfd_jitter (double jitter)
|
||||
{
|
||||
return fperfdata ("jitter", jitter, "s",
|
||||
do_jitter, jwarn,
|
||||
do_jitter, jcrit,
|
||||
do_jitter, jitter_thresholds->warning->end,
|
||||
do_jitter, jitter_thresholds->critical->end,
|
||||
TRUE, 0, FALSE, 0);
|
||||
}
|
||||
|
||||
|
@ -760,11 +757,18 @@ int main(int argc, char *argv[]){
|
|||
double offset=0, jitter=0;
|
||||
char *result_line, *perfdata_line;
|
||||
|
||||
result=offset_result=jitter_result=STATE_UNKNOWN;
|
||||
setlocale (LC_ALL, "");
|
||||
bindtextdomain (PACKAGE, LOCALEDIR);
|
||||
textdomain (PACKAGE);
|
||||
|
||||
result = offset_result = jitter_result = STATE_OK;
|
||||
|
||||
if (process_arguments (argc, argv) == ERROR)
|
||||
usage4 (_("Could not parse arguments"));
|
||||
|
||||
set_thresholds(&offset_thresholds, owarn, ocrit);
|
||||
set_thresholds(&jitter_thresholds, jwarn, jcrit);
|
||||
|
||||
/* initialize alarm signal handling */
|
||||
signal (SIGALRM, socket_timeout_alarm_handler);
|
||||
|
||||
|
@ -772,14 +776,13 @@ int main(int argc, char *argv[]){
|
|||
alarm (socket_timeout);
|
||||
|
||||
offset = offset_request(server_address, &offset_result);
|
||||
if(fabs(offset) > ocrit){
|
||||
/* check_ntp used to always return CRITICAL if offset_result == STATE_UNKNOWN.
|
||||
* Now we'll only do that is the offset thresholds were set */
|
||||
if (do_offset && offset_result == STATE_UNKNOWN) {
|
||||
result = STATE_CRITICAL;
|
||||
} else if(fabs(offset) > owarn) {
|
||||
result = STATE_WARNING;
|
||||
} else {
|
||||
result = STATE_OK;
|
||||
result = get_status(fabs(offset), offset_thresholds);
|
||||
}
|
||||
result=max_state(result, offset_result);
|
||||
|
||||
/* If not told to check the jitter, we don't even send packets.
|
||||
* jitter is checked using NTP control packets, which not all
|
||||
|
@ -788,40 +791,33 @@ int main(int argc, char *argv[]){
|
|||
*/
|
||||
if(do_jitter){
|
||||
jitter=jitter_request(server_address, &jitter_result);
|
||||
if(jitter > jcrit){
|
||||
result = max_state(result, STATE_CRITICAL);
|
||||
} else if(jitter > jwarn) {
|
||||
result = max_state(result, STATE_WARNING);
|
||||
} else if(jitter == -1.0 && result == STATE_OK){
|
||||
/* -1 indicates that we couldn't calculate the jitter
|
||||
* Only overrides STATE_OK from the offset */
|
||||
result = max_state_alt(result, get_status(jitter, jitter_thresholds));
|
||||
/* -1 indicates that we couldn't calculate the jitter
|
||||
* Only overrides STATE_OK from the offset */
|
||||
if(jitter == -1.0 && result == STATE_OK)
|
||||
result = STATE_UNKNOWN;
|
||||
}
|
||||
}
|
||||
result=max_state(result, jitter_result);
|
||||
result = max_state_alt(result, jitter_result);
|
||||
|
||||
switch (result) {
|
||||
case STATE_CRITICAL :
|
||||
asprintf(&result_line, "NTP CRITICAL:");
|
||||
asprintf(&result_line, _("NTP CRITICAL:"));
|
||||
break;
|
||||
case STATE_WARNING :
|
||||
asprintf(&result_line, "NTP WARNING:");
|
||||
asprintf(&result_line, _("NTP WARNING:"));
|
||||
break;
|
||||
case STATE_OK :
|
||||
asprintf(&result_line, "NTP OK:");
|
||||
asprintf(&result_line, _("NTP OK:"));
|
||||
break;
|
||||
default :
|
||||
asprintf(&result_line, "NTP UNKNOWN:");
|
||||
asprintf(&result_line, _("NTP UNKNOWN:"));
|
||||
break;
|
||||
}
|
||||
if(offset_result==STATE_CRITICAL){
|
||||
if(offset_result == STATE_UNKNOWN){
|
||||
asprintf(&result_line, "%s %s", result_line, _("Offset unknown"));
|
||||
asprintf(&perfdata_line, "");
|
||||
} else {
|
||||
if(offset_result==STATE_WARNING){
|
||||
asprintf(&result_line, "%s %s", result_line, _("Unable to fully sample sync server"));
|
||||
}
|
||||
asprintf(&result_line, "%s Offset %.10g secs", result_line, offset);
|
||||
asprintf(&result_line, "%s %s %.10g secs", result_line, _("Offset"), offset);
|
||||
asprintf(&perfdata_line, "%s", perfd_offset(offset));
|
||||
}
|
||||
if (do_jitter) {
|
||||
|
@ -849,16 +845,31 @@ void print_help(void){
|
|||
print_usage();
|
||||
printf (_(UT_HELP_VRSN));
|
||||
printf (_(UT_HOST_PORT), 'p', "123");
|
||||
printf (" %s\n", "-w, --warning=DOUBLE");
|
||||
printf (" %s\n", "-w, --warning=THRESHOLD");
|
||||
printf (" %s\n", _("Offset to result in warning status (seconds)"));
|
||||
printf (" %s\n", "-c, --critical=DOUBLE");
|
||||
printf (" %s\n", "-c, --critical=THRESHOLD");
|
||||
printf (" %s\n", _("Offset to result in critical status (seconds)"));
|
||||
printf (" %s\n", "-j, --warning=DOUBLE");
|
||||
printf (" %s\n", _("Warning value for jitter"));
|
||||
printf (" %s\n", "-k, --critical=DOUBLE");
|
||||
printf (" %s\n", _("Critical value for jitter"));
|
||||
printf (" %s\n", "-j, --warning=THRESHOLD");
|
||||
printf (" %s\n", _("Warning threshold for jitter"));
|
||||
printf (" %s\n", "-k, --critical=THRESHOLD");
|
||||
printf (" %s\n", _("Critical threshold for jitter"));
|
||||
printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT);
|
||||
printf (_(UT_VERBOSE));
|
||||
|
||||
printf("\n");
|
||||
printf("%s\n", _("Notes:"));
|
||||
printf(" %s\n", _("See:"));
|
||||
printf(" %s\n", ("http://nagiosplug.sourceforge.net/developer-guidelines.html#THRESHOLDFORMAT"));
|
||||
printf(" %s\n", _("for THRESHOLD format and examples."));
|
||||
|
||||
printf("\n");
|
||||
printf("%s\n", _("Examples:"));
|
||||
printf(" %s\n", _("Normal offset check:"));
|
||||
printf(" %s\n", ("./check_ntp -H ntpserv -w 0.5 -c 1"));
|
||||
printf(" %s\n", _("Check jitter too, avoiding critical notifications if jitter isn't available"));
|
||||
printf(" %s\n", _("(See Notes above for more details on thresholds formats):"));
|
||||
printf(" %s\n", ("./check_ntp -H ntpserv -w 0.5 -c 1 -j -1:100 -k -1:200"));
|
||||
|
||||
printf (_(UT_SUPPORT));
|
||||
}
|
||||
|
||||
|
@ -866,5 +877,5 @@ void
|
|||
print_usage(void)
|
||||
{
|
||||
printf (_("Usage:"));
|
||||
printf("%s -H <host> [-w <warn>] [-c <crit>] [-j <warn>] [-k <crit>] [-v verbose]\n", progname);
|
||||
printf(" %s -H <host> [-w <warn>] [-c <crit>] [-j <warn>] [-k <crit>] [-v verbose]\n", progname);
|
||||
}
|
||||
|
|
686
plugins/check_ntp_peer.c
Normal file
686
plugins/check_ntp_peer.c
Normal file
|
@ -0,0 +1,686 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Nagios check_ntp_peer plugin
|
||||
*
|
||||
* License: GPL
|
||||
* Copyright (c) 2006 sean finney <seanius@seanius.net>
|
||||
* Copyright (c) 2007 nagios-plugins team
|
||||
*
|
||||
* Last Modified: $Date: 2007-12-11 13:31:22 +0000 (Tue, 11 Dec 2007) $
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* This file contains the check_ntp_peer plugin
|
||||
*
|
||||
* This plugin checks an NTP server independent of any commandline
|
||||
* programs or external libraries.
|
||||
*
|
||||
* Use this plugin to check the health of an NTP server. It supports
|
||||
* checking the offset with the sync peer, the jitter and stratum. This
|
||||
* plugin will not check the clock offset between the local host and NTP
|
||||
* server; please use check_ntp_time for that purpose.
|
||||
*
|
||||
*
|
||||
* License Information:
|
||||
*
|
||||
* 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, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: check_ntp_peer.c 1864 2007-12-11 13:31:22Z dermoth $
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
const char *progname = "check_ntp_peer";
|
||||
const char *revision = "$Revision: 1864 $";
|
||||
const char *copyright = "2007";
|
||||
const char *email = "nagiosplug-devel@lists.sourceforge.net";
|
||||
|
||||
#include "common.h"
|
||||
#include "netutils.h"
|
||||
#include "utils.h"
|
||||
|
||||
static char *server_address=NULL;
|
||||
static int verbose=0;
|
||||
static int quiet=0;
|
||||
static short do_offset=0;
|
||||
static char *owarn="60";
|
||||
static char *ocrit="120";
|
||||
static short do_stratum=0;
|
||||
static char *swarn="-1:16";
|
||||
static char *scrit="-1:16";
|
||||
static short do_jitter=0;
|
||||
static char *jwarn="-1:5000";
|
||||
static char *jcrit="-1:10000";
|
||||
static int syncsource_found=0;
|
||||
|
||||
int process_arguments (int, char **);
|
||||
thresholds *offset_thresholds = NULL;
|
||||
thresholds *jitter_thresholds = NULL;
|
||||
thresholds *stratum_thresholds = NULL;
|
||||
void print_help (void);
|
||||
void print_usage (void);
|
||||
|
||||
/* max size of control message data */
|
||||
#define MAX_CM_SIZE 468
|
||||
|
||||
/* this structure holds everything in an ntp control message as per rfc1305 */
|
||||
typedef struct {
|
||||
uint8_t flags; /* byte with leapindicator,vers,mode. see macros */
|
||||
uint8_t op; /* R,E,M bits and Opcode */
|
||||
uint16_t seq; /* Packet sequence */
|
||||
uint16_t status; /* Clock status */
|
||||
uint16_t assoc; /* Association */
|
||||
uint16_t offset; /* Similar to TCP sequence # */
|
||||
uint16_t count; /* # bytes of data */
|
||||
char data[MAX_CM_SIZE]; /* ASCII data of the request */
|
||||
/* NB: not necessarily NULL terminated! */
|
||||
} ntp_control_message;
|
||||
|
||||
/* this is an association/status-word pair found in control packet reponses */
|
||||
typedef struct {
|
||||
uint16_t assoc;
|
||||
uint16_t status;
|
||||
} ntp_assoc_status_pair;
|
||||
|
||||
/* bits 1,2 are the leap indicator */
|
||||
#define LI_MASK 0xc0
|
||||
#define LI(x) ((x&LI_MASK)>>6)
|
||||
#define LI_SET(x,y) do{ x |= ((y<<6)&LI_MASK); }while(0)
|
||||
/* and these are the values of the leap indicator */
|
||||
#define LI_NOWARNING 0x00
|
||||
#define LI_EXTRASEC 0x01
|
||||
#define LI_MISSINGSEC 0x02
|
||||
#define LI_ALARM 0x03
|
||||
/* bits 3,4,5 are the ntp version */
|
||||
#define VN_MASK 0x38
|
||||
#define VN(x) ((x&VN_MASK)>>3)
|
||||
#define VN_SET(x,y) do{ x |= ((y<<3)&VN_MASK); }while(0)
|
||||
#define VN_RESERVED 0x02
|
||||
/* bits 6,7,8 are the ntp mode */
|
||||
#define MODE_MASK 0x07
|
||||
#define MODE(x) (x&MODE_MASK)
|
||||
#define MODE_SET(x,y) do{ x |= (y&MODE_MASK); }while(0)
|
||||
/* here are some values */
|
||||
#define MODE_CLIENT 0x03
|
||||
#define MODE_CONTROLMSG 0x06
|
||||
/* In control message, bits 8-10 are R,E,M bits */
|
||||
#define REM_MASK 0xe0
|
||||
#define REM_RESP 0x80
|
||||
#define REM_ERROR 0x40
|
||||
#define REM_MORE 0x20
|
||||
/* In control message, bits 11 - 15 are opcode */
|
||||
#define OP_MASK 0x1f
|
||||
#define OP_SET(x,y) do{ x |= (y&OP_MASK); }while(0)
|
||||
#define OP_READSTAT 0x01
|
||||
#define OP_READVAR 0x02
|
||||
/* In peer status bytes, bits 6,7,8 determine clock selection status */
|
||||
#define PEER_SEL(x) ((ntohs(x)>>8)&0x07)
|
||||
#define PEER_INCLUDED 0x04
|
||||
#define PEER_SYNCSOURCE 0x06
|
||||
|
||||
/* NTP control message header is 12 bytes, plus any data in the data
|
||||
* field, plus null padding to the nearest 32-bit boundary per rfc.
|
||||
*/
|
||||
#define SIZEOF_NTPCM(m) (12+ntohs(m.count)+((m.count)?4-(ntohs(m.count)%4):0))
|
||||
|
||||
/* finally, a little helper or two for debugging: */
|
||||
#define DBG(x) do{if(verbose>1){ x; }}while(0);
|
||||
#define PRINTSOCKADDR(x) \
|
||||
do{ \
|
||||
printf("%u.%u.%u.%u", (x>>24)&0xff, (x>>16)&0xff, (x>>8)&0xff, x&0xff);\
|
||||
}while(0);
|
||||
|
||||
void print_ntp_control_message(const ntp_control_message *p){
|
||||
int i=0, numpeers=0;
|
||||
const ntp_assoc_status_pair *peer=NULL;
|
||||
|
||||
printf("control packet contents:\n");
|
||||
printf("\tflags: 0x%.2x , 0x%.2x\n", p->flags, p->op);
|
||||
printf("\t li=%d (0x%.2x)\n", LI(p->flags), p->flags&LI_MASK);
|
||||
printf("\t vn=%d (0x%.2x)\n", VN(p->flags), p->flags&VN_MASK);
|
||||
printf("\t mode=%d (0x%.2x)\n", MODE(p->flags), p->flags&MODE_MASK);
|
||||
printf("\t response=%d (0x%.2x)\n", (p->op&REM_RESP)>0, p->op&REM_RESP);
|
||||
printf("\t more=%d (0x%.2x)\n", (p->op&REM_MORE)>0, p->op&REM_MORE);
|
||||
printf("\t error=%d (0x%.2x)\n", (p->op&REM_ERROR)>0, p->op&REM_ERROR);
|
||||
printf("\t op=%d (0x%.2x)\n", p->op&OP_MASK, p->op&OP_MASK);
|
||||
printf("\tsequence: %d (0x%.2x)\n", ntohs(p->seq), ntohs(p->seq));
|
||||
printf("\tstatus: %d (0x%.2x)\n", ntohs(p->status), ntohs(p->status));
|
||||
printf("\tassoc: %d (0x%.2x)\n", ntohs(p->assoc), ntohs(p->assoc));
|
||||
printf("\toffset: %d (0x%.2x)\n", ntohs(p->offset), ntohs(p->offset));
|
||||
printf("\tcount: %d (0x%.2x)\n", ntohs(p->count), ntohs(p->count));
|
||||
numpeers=ntohs(p->count)/(sizeof(ntp_assoc_status_pair));
|
||||
if(p->op&REM_RESP && p->op&OP_READSTAT){
|
||||
peer=(ntp_assoc_status_pair*)p->data;
|
||||
for(i=0;i<numpeers;i++){
|
||||
printf("\tpeer id %.2x status %.2x",
|
||||
ntohs(peer[i].assoc), ntohs(peer[i].status));
|
||||
if (PEER_SEL(peer[i].status) >= PEER_INCLUDED){
|
||||
if(PEER_SEL(peer[i].status) >= PEER_SYNCSOURCE){
|
||||
printf(" <-- current sync source");
|
||||
} else {
|
||||
printf(" <-- current sync candidate");
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
char *extract_value(const char *varlist, const char *name){
|
||||
char *tmpvarlist=NULL, *tmpkey=NULL, *value=NULL;
|
||||
int last=0;
|
||||
|
||||
/* The following code require a non-empty varlist */
|
||||
if(strlen(varlist) == 0)
|
||||
return NULL;
|
||||
|
||||
tmpvarlist = strdup(varlist);
|
||||
tmpkey = strtok(tmpvarlist, "=");
|
||||
|
||||
do {
|
||||
if(strstr(tmpkey, name) != NULL) {
|
||||
value = strtok(NULL, ",");
|
||||
last = 1;
|
||||
}
|
||||
} while (last == 0 && (tmpkey = strtok(NULL, "=")));
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
void
|
||||
setup_control_request(ntp_control_message *p, uint8_t opcode, uint16_t seq){
|
||||
memset(p, 0, sizeof(ntp_control_message));
|
||||
LI_SET(p->flags, LI_NOWARNING);
|
||||
VN_SET(p->flags, VN_RESERVED);
|
||||
MODE_SET(p->flags, MODE_CONTROLMSG);
|
||||
OP_SET(p->op, opcode);
|
||||
p->seq = htons(seq);
|
||||
/* Remaining fields are zero for requests */
|
||||
}
|
||||
|
||||
/* This function does all the actual work; roughly here's what it does
|
||||
* beside setting the offest, jitter and stratum passed as argument:
|
||||
* - offset can be negative, so if it cannot get the offset, offset_result
|
||||
* is set to UNKNOWN, otherwise OK.
|
||||
* - jitter and stratum are set to -1 if they cannot be retrieved so any
|
||||
* positive value means a success retrieving the value.
|
||||
* - status is set to WARNING if there's no sync.peer (otherwise OK) and is
|
||||
* the return value of the function.
|
||||
* status is pretty much useless as syncsource_found is a global variable
|
||||
* used later in main to check is the server was synchronized. It works
|
||||
* so I left it alone */
|
||||
int ntp_request(const char *host, double *offset, int *offset_result, double *jitter, int *stratum){
|
||||
int conn=-1, i, npeers=0, num_candidates=0;
|
||||
double tmp_offset = 0;
|
||||
int min_peer_sel=PEER_INCLUDED;
|
||||
int peers_size=0, peer_offset=0;
|
||||
int status;
|
||||
ntp_assoc_status_pair *peers=NULL;
|
||||
ntp_control_message req;
|
||||
const char *getvar = "stratum,offset,jitter";
|
||||
char *data, *value, *nptr;
|
||||
void *tmp;
|
||||
|
||||
status = STATE_OK;
|
||||
*offset_result = STATE_UNKNOWN;
|
||||
*jitter = *stratum = -1;
|
||||
|
||||
/* Long-winded explanation:
|
||||
* Getting the sync peer offset, jitter and stratum requires a number of
|
||||
* steps:
|
||||
* 1) Send a READSTAT request.
|
||||
* 2) Interpret the READSTAT reply
|
||||
* a) The data section contains a list of peer identifiers (16 bits)
|
||||
* and associated status words (16 bits)
|
||||
* b) We want the value of 0x06 in the SEL (peer selection) value,
|
||||
* which means "current synchronizatin source". If that's missing,
|
||||
* we take anything better than 0x04 (see the rfc for details) but
|
||||
* set a minimum of warning.
|
||||
* 3) Send a READVAR request for information on each peer identified
|
||||
* in 2b greater than the minimum selection value.
|
||||
* 4) Extract the offset, jitter and stratum value from the data[]
|
||||
* (it's ASCII)
|
||||
*/
|
||||
my_udp_connect(server_address, 123, &conn);
|
||||
|
||||
/* keep sending requests until the server stops setting the
|
||||
* REM_MORE bit, though usually this is only 1 packet. */
|
||||
do{
|
||||
setup_control_request(&req, OP_READSTAT, 1);
|
||||
DBG(printf("sending READSTAT request"));
|
||||
write(conn, &req, SIZEOF_NTPCM(req));
|
||||
DBG(print_ntp_control_message(&req));
|
||||
/* Attempt to read the largest size packet possible */
|
||||
req.count=htons(MAX_CM_SIZE);
|
||||
DBG(printf("recieving READSTAT response"))
|
||||
if(read(conn, &req, SIZEOF_NTPCM(req)) == -1)
|
||||
die(STATE_CRITICAL, "NTP CRITICAL: No response from NTP server\n");
|
||||
DBG(print_ntp_control_message(&req));
|
||||
/* Each peer identifier is 4 bytes in the data section, which
|
||||
* we represent as a ntp_assoc_status_pair datatype.
|
||||
*/
|
||||
peers_size+=ntohs(req.count);
|
||||
if((tmp=realloc(peers, peers_size)) == NULL)
|
||||
free(peers), die(STATE_UNKNOWN, "can not (re)allocate 'peers' buffer\n");
|
||||
peers=tmp;
|
||||
memcpy((void*)((ptrdiff_t)peers+peer_offset), (void*)req.data, ntohs(req.count));
|
||||
npeers=peers_size/sizeof(ntp_assoc_status_pair);
|
||||
peer_offset+=ntohs(req.count);
|
||||
} while(req.op&REM_MORE);
|
||||
|
||||
/* first, let's find out if we have a sync source, or if there are
|
||||
* at least some candidates. In the latter case we'll issue
|
||||
* a warning but go ahead with the check on them. */
|
||||
for (i = 0; i < npeers; i++){
|
||||
if (PEER_SEL(peers[i].status) >= PEER_INCLUDED){
|
||||
num_candidates++;
|
||||
if(PEER_SEL(peers[i].status) >= PEER_SYNCSOURCE){
|
||||
syncsource_found=1;
|
||||
min_peer_sel=PEER_SYNCSOURCE;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(verbose) printf("%d candiate peers available\n", num_candidates);
|
||||
if(verbose && syncsource_found) printf("synchronization source found\n");
|
||||
if(! syncsource_found){
|
||||
status = STATE_WARNING;
|
||||
if(verbose) printf("warning: no synchronization source found\n");
|
||||
}
|
||||
|
||||
|
||||
for (i = 0; i < npeers; i++){
|
||||
/* Only query this server if it is the current sync source */
|
||||
/* If there's no sync.peer, query all candidates and use the best one */
|
||||
if (PEER_SEL(peers[i].status) >= min_peer_sel){
|
||||
if(verbose) printf("Getting offset, jitter and stratum for peer %.2x\n", ntohs(peers[i].assoc));
|
||||
asprintf(&data, "");
|
||||
do{
|
||||
setup_control_request(&req, OP_READVAR, 2);
|
||||
req.assoc = peers[i].assoc;
|
||||
/* Putting the wanted variable names in the request
|
||||
* cause the server to provide _only_ the requested values.
|
||||
* thus reducing net traffic, guaranteeing us only a single
|
||||
* datagram in reply, and making intepretation much simpler
|
||||
*/
|
||||
/* Older servers doesn't know what jitter is, so if we get an
|
||||
* error on the first pass we redo it with "dispersion" */
|
||||
strncpy(req.data, getvar, MAX_CM_SIZE-1);
|
||||
req.count = htons(strlen(getvar));
|
||||
DBG(printf("sending READVAR request...\n"));
|
||||
write(conn, &req, SIZEOF_NTPCM(req));
|
||||
DBG(print_ntp_control_message(&req));
|
||||
|
||||
req.count = htons(MAX_CM_SIZE);
|
||||
DBG(printf("receiving READVAR response...\n"));
|
||||
read(conn, &req, SIZEOF_NTPCM(req));
|
||||
DBG(print_ntp_control_message(&req));
|
||||
|
||||
if(!(req.op&REM_ERROR))
|
||||
asprintf(&data, "%s%s", data, req.data);
|
||||
} while(req.op&REM_MORE);
|
||||
|
||||
if(req.op&REM_ERROR) {
|
||||
if(strstr(getvar, "jitter")) {
|
||||
if(verbose) printf("The command failed. This is usually caused by servers refusing the 'jitter'\nvariable. Restarting with 'dispersion'...\n");
|
||||
getvar = "stratum,offset,dispersion";
|
||||
i--;
|
||||
continue;
|
||||
} else if(strlen(getvar)) {
|
||||
if(verbose) printf("Server didn't like dispersion either; will retrieve everything\n");
|
||||
getvar = "";
|
||||
i--;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if(verbose > 1)
|
||||
printf("Server responded: >>>%s<<<\n", data);
|
||||
|
||||
/* get the offset */
|
||||
if(verbose)
|
||||
printf("parsing offset from peer %.2x: ", ntohs(peers[i].assoc));
|
||||
|
||||
value = extract_value(data, "offset");
|
||||
nptr=NULL;
|
||||
/* Convert the value if we have one */
|
||||
if(value != NULL)
|
||||
tmp_offset = strtod(value, &nptr) / 1000;
|
||||
/* If value is null or no conversion was performed */
|
||||
if(value == NULL || value==nptr) {
|
||||
if(verbose) printf("error: unable to read server offset response.\n");
|
||||
} else {
|
||||
if(verbose) printf("%.10g\n", tmp_offset);
|
||||
if(*offset_result == STATE_UNKNOWN || fabs(tmp_offset) < fabs(*offset)) {
|
||||
*offset = tmp_offset;
|
||||
*offset_result = STATE_OK;
|
||||
} else {
|
||||
/* Skip this one; move to the next */
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if(do_jitter) {
|
||||
/* get the jitter */
|
||||
if(verbose) {
|
||||
printf("parsing %s from peer %.2x: ", strstr(getvar, "dispersion") != NULL ? "dispersion" : "jitter", ntohs(peers[i].assoc));
|
||||
}
|
||||
value = extract_value(data, strstr(getvar, "dispersion") != NULL ? "dispersion" : "jitter");
|
||||
nptr=NULL;
|
||||
/* Convert the value if we have one */
|
||||
if(value != NULL)
|
||||
*jitter = strtod(value, &nptr);
|
||||
/* If value is null or no conversion was performed */
|
||||
if(value == NULL || value==nptr) {
|
||||
if(verbose) printf("error: unable to read server jitter/dispersion response.\n");
|
||||
*jitter = -1;
|
||||
} else if(verbose) {
|
||||
printf("%.10g\n", *jitter);
|
||||
}
|
||||
}
|
||||
|
||||
if(do_stratum) {
|
||||
/* get the stratum */
|
||||
if(verbose) {
|
||||
printf("parsing stratum from peer %.2x: ", ntohs(peers[i].assoc));
|
||||
}
|
||||
value = extract_value(data, "stratum");
|
||||
nptr=NULL;
|
||||
/* Convert the value if we have one */
|
||||
if(value != NULL)
|
||||
*stratum = strtol(value, &nptr, 10);
|
||||
if(value == NULL || value==nptr) {
|
||||
if(verbose) printf("error: unable to read server stratum response.\n");
|
||||
*stratum = -1;
|
||||
} else {
|
||||
if(verbose) printf("%i\n", *stratum);
|
||||
}
|
||||
}
|
||||
} /* if (PEER_SEL(peers[i].status) >= min_peer_sel) */
|
||||
} /* for (i = 0; i < npeers; i++) */
|
||||
|
||||
close(conn);
|
||||
if(peers!=NULL) free(peers);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
int process_arguments(int argc, char **argv){
|
||||
int c;
|
||||
int option=0;
|
||||
static struct option longopts[] = {
|
||||
{"version", no_argument, 0, 'V'},
|
||||
{"help", no_argument, 0, 'h'},
|
||||
{"verbose", no_argument, 0, 'v'},
|
||||
{"use-ipv4", no_argument, 0, '4'},
|
||||
{"use-ipv6", no_argument, 0, '6'},
|
||||
{"quiet", no_argument, 0, 'q'},
|
||||
{"warning", required_argument, 0, 'w'},
|
||||
{"critical", required_argument, 0, 'c'},
|
||||
{"swarn", required_argument, 0, 'W'},
|
||||
{"scrit", required_argument, 0, 'C'},
|
||||
{"jwarn", required_argument, 0, 'j'},
|
||||
{"jcrit", required_argument, 0, 'k'},
|
||||
{"timeout", required_argument, 0, 't'},
|
||||
{"hostname", required_argument, 0, 'H'},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
|
||||
if (argc < 2)
|
||||
usage ("\n");
|
||||
|
||||
while (1) {
|
||||
c = getopt_long (argc, argv, "Vhv46qw:c:W:C:j:k:t:H:", longopts, &option);
|
||||
if (c == -1 || c == EOF || c == 1)
|
||||
break;
|
||||
|
||||
switch (c) {
|
||||
case 'h':
|
||||
print_help();
|
||||
exit(STATE_OK);
|
||||
break;
|
||||
case 'V':
|
||||
print_revision(progname, revision);
|
||||
exit(STATE_OK);
|
||||
break;
|
||||
case 'v':
|
||||
verbose++;
|
||||
break;
|
||||
case 'q':
|
||||
quiet = 1;
|
||||
break;
|
||||
case 'w':
|
||||
do_offset=1;
|
||||
owarn = optarg;
|
||||
break;
|
||||
case 'c':
|
||||
do_offset=1;
|
||||
ocrit = optarg;
|
||||
break;
|
||||
case 'W':
|
||||
do_stratum=1;
|
||||
swarn = optarg;
|
||||
break;
|
||||
case 'C':
|
||||
do_stratum=1;
|
||||
scrit = optarg;
|
||||
break;
|
||||
case 'j':
|
||||
do_jitter=1;
|
||||
jwarn = optarg;
|
||||
break;
|
||||
case 'k':
|
||||
do_jitter=1;
|
||||
jcrit = optarg;
|
||||
break;
|
||||
case 'H':
|
||||
if(is_host(optarg) == FALSE)
|
||||
usage2(_("Invalid hostname/address"), optarg);
|
||||
server_address = strdup(optarg);
|
||||
break;
|
||||
case 't':
|
||||
socket_timeout=atoi(optarg);
|
||||
break;
|
||||
case '4':
|
||||
address_family = AF_INET;
|
||||
break;
|
||||
case '6':
|
||||
#ifdef USE_IPV6
|
||||
address_family = AF_INET6;
|
||||
#else
|
||||
usage4 (_("IPv6 support not available"));
|
||||
#endif
|
||||
break;
|
||||
case '?':
|
||||
/* print short usage statement if args not parsable */
|
||||
usage5 ();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(server_address == NULL){
|
||||
usage4(_("Hostname was not supplied"));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
char *perfd_offset (double offset)
|
||||
{
|
||||
return fperfdata ("offset", offset, "s",
|
||||
TRUE, offset_thresholds->warning->end,
|
||||
TRUE, offset_thresholds->critical->end,
|
||||
FALSE, 0, FALSE, 0);
|
||||
}
|
||||
|
||||
char *perfd_jitter (double jitter)
|
||||
{
|
||||
return fperfdata ("jitter", jitter, "",
|
||||
do_jitter, jitter_thresholds->warning->end,
|
||||
do_jitter, jitter_thresholds->critical->end,
|
||||
TRUE, 0, FALSE, 0);
|
||||
}
|
||||
|
||||
char *perfd_stratum (int stratum)
|
||||
{
|
||||
return perfdata ("stratum", stratum, "",
|
||||
do_stratum, (int)stratum_thresholds->warning->end,
|
||||
do_stratum, (int)stratum_thresholds->critical->end,
|
||||
TRUE, 0, TRUE, 16);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]){
|
||||
int result, offset_result, stratum;
|
||||
double offset=0, jitter=0;
|
||||
char *result_line, *perfdata_line;
|
||||
|
||||
setlocale (LC_ALL, "");
|
||||
bindtextdomain (PACKAGE, LOCALEDIR);
|
||||
textdomain (PACKAGE);
|
||||
|
||||
if (process_arguments (argc, argv) == ERROR)
|
||||
usage4 (_("Could not parse arguments"));
|
||||
|
||||
set_thresholds(&offset_thresholds, owarn, ocrit);
|
||||
set_thresholds(&jitter_thresholds, jwarn, jcrit);
|
||||
set_thresholds(&stratum_thresholds, swarn, scrit);
|
||||
|
||||
/* initialize alarm signal handling */
|
||||
signal (SIGALRM, socket_timeout_alarm_handler);
|
||||
|
||||
/* set socket timeout */
|
||||
alarm (socket_timeout);
|
||||
|
||||
/* This returns either OK or WARNING (See comment preceeding ntp_request) */
|
||||
result = ntp_request(server_address, &offset, &offset_result, &jitter, &stratum);
|
||||
|
||||
if(offset_result == STATE_UNKNOWN) {
|
||||
/* if there's no sync peer (this overrides ntp_request output): */
|
||||
result = (quiet == 1 ? STATE_UNKNOWN : STATE_CRITICAL);
|
||||
} else {
|
||||
/* Be quiet if there's no candidates either */
|
||||
if (quiet == 1 && result == STATE_WARNING)
|
||||
result = STATE_UNKNOWN;
|
||||
result = max_state_alt(result, get_status(fabs(offset), offset_thresholds));
|
||||
}
|
||||
|
||||
if(do_stratum)
|
||||
result = max_state_alt(result, get_status(stratum, stratum_thresholds));
|
||||
|
||||
if(do_jitter)
|
||||
result = max_state_alt(result, get_status(jitter, jitter_thresholds));
|
||||
|
||||
switch (result) {
|
||||
case STATE_CRITICAL :
|
||||
asprintf(&result_line, _("NTP CRITICAL:"));
|
||||
break;
|
||||
case STATE_WARNING :
|
||||
asprintf(&result_line, _("NTP WARNING:"));
|
||||
break;
|
||||
case STATE_OK :
|
||||
asprintf(&result_line, _("NTP OK:"));
|
||||
break;
|
||||
default :
|
||||
asprintf(&result_line, _("NTP UNKNOWN:"));
|
||||
break;
|
||||
}
|
||||
if(!syncsource_found)
|
||||
asprintf(&result_line, "%s %s,", result_line, _("Server not synchronized"));
|
||||
|
||||
if(offset_result == STATE_UNKNOWN){
|
||||
asprintf(&result_line, "%s %s", result_line, _("Offset unknown"));
|
||||
asprintf(&perfdata_line, "");
|
||||
} else {
|
||||
asprintf(&result_line, "%s %s %.10g secs", result_line, _("Offset"), offset);
|
||||
asprintf(&perfdata_line, "%s", perfd_offset(offset));
|
||||
}
|
||||
if (do_jitter) {
|
||||
asprintf(&result_line, "%s, jitter=%f", result_line, jitter);
|
||||
asprintf(&perfdata_line, "%s %s", perfdata_line, perfd_jitter(jitter));
|
||||
}
|
||||
if (do_stratum) {
|
||||
asprintf(&result_line, "%s, stratum=%i", result_line, stratum);
|
||||
asprintf(&perfdata_line, "%s %s", perfdata_line, perfd_stratum(stratum));
|
||||
}
|
||||
printf("%s|%s\n", result_line, perfdata_line);
|
||||
|
||||
if(server_address!=NULL) free(server_address);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void print_help(void){
|
||||
print_revision(progname, revision);
|
||||
|
||||
printf ("Copyright (c) 2006 Sean Finney\n");
|
||||
printf (COPYRIGHT, copyright, email);
|
||||
|
||||
printf ("%s\n", _("This plugin checks the selected ntp server"));
|
||||
|
||||
printf ("\n\n");
|
||||
|
||||
print_usage();
|
||||
printf (_(UT_HELP_VRSN));
|
||||
printf (_(UT_HOST_PORT), 'p', "123");
|
||||
printf (" %s\n", "-q, --quiet");
|
||||
printf (" %s\n", _("Returns UNKNOWN instead of CRITICAL or WARNING if server isn't synchronized"));
|
||||
printf (" %s\n", "-w, --warning=THRESHOLD");
|
||||
printf (" %s\n", _("Offset to result in warning status (seconds)"));
|
||||
printf (" %s\n", "-c, --critical=THRESHOLD");
|
||||
printf (" %s\n", _("Offset to result in critical status (seconds)"));
|
||||
printf (" %s\n", "-W, --warning=THRESHOLD");
|
||||
printf (" %s\n", _("Warning threshold for stratum"));
|
||||
printf (" %s\n", "-W, --critical=THRESHOLD");
|
||||
printf (" %s\n", _("Critical threshold for stratum"));
|
||||
printf (" %s\n", "-j, --warning=THRESHOLD");
|
||||
printf (" %s\n", _("Warning threshold for jitter"));
|
||||
printf (" %s\n", "-k, --critical=THRESHOLD");
|
||||
printf (" %s\n", _("Critical threshold for jitter"));
|
||||
printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT);
|
||||
printf (_(UT_VERBOSE));
|
||||
|
||||
printf("\n");
|
||||
printf("%s\n", _("Notes:"));
|
||||
printf(" %s\n", _("This plugin checks an NTP server independent of any commandline"));
|
||||
printf(" %s\n\n", _("programs or external libraries."));
|
||||
printf(" %s\n", _("Use this plugin to check the health of an NTP server. It supports"));
|
||||
printf(" %s\n", _("checking the offset with the sync peer, the jitter and stratum. This"));
|
||||
printf(" %s\n", _("plugin will not check the clock offset between the local host and NTP"));
|
||||
printf(" %s\n\n", _("server; please use check_ntp_time for that purpose."));
|
||||
|
||||
printf(" %s\n", _("See:"));
|
||||
printf(" %s\n", ("http://nagiosplug.sourceforge.net/developer-guidelines.html#THRESHOLDFORMAT"));
|
||||
printf(" %s\n", _("for THRESHOLD format and examples."));
|
||||
|
||||
printf("\n");
|
||||
printf("%s\n", _("Examples:"));
|
||||
printf(" %s\n", _("Simple NTP server check:"));
|
||||
printf(" %s\n", ("./check_ntp_peer -H ntpserv -w 0.5 -c 1"));
|
||||
printf(" %s\n", _("Check jitter too, avoiding critical notifications if jitter isn't available"));
|
||||
printf(" %s\n", _("(See Notes above for more details on thresholds formats):"));
|
||||
printf(" %s\n", ("./check_ntp_peer -H ntpserv -w 0.5 -c 1 -j -1:100 -k -1:200"));
|
||||
printf(" %s\n", _("Check only stratum:"));
|
||||
printf(" %s\n", ("./check_ntp_peer -H ntpserv -W 4 -C 6"));
|
||||
|
||||
printf (_(UT_SUPPORT));
|
||||
}
|
||||
|
||||
void
|
||||
print_usage(void)
|
||||
{
|
||||
printf (_("Usage:"));
|
||||
printf(" %s -H <host> [-w <warn>] [-c <crit>] [-W <warn>] [-C <crit>]\n", progname);
|
||||
printf(" [-j <warn>] [-k <crit>] [-v verbose]\n");
|
||||
}
|
636
plugins/check_ntp_time.c
Normal file
636
plugins/check_ntp_time.c
Normal file
|
@ -0,0 +1,636 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Nagios check_ntp_time plugin
|
||||
*
|
||||
* License: GPL
|
||||
* Copyright (c) 2006 sean finney <seanius@seanius.net>
|
||||
* Copyright (c) 2007 nagios-plugins team
|
||||
*
|
||||
* Last Modified: $Date: 2007-12-11 05:57:35 +0000 (Tue, 11 Dec 2007) $
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* This file contains the check_ntp_time plugin
|
||||
*
|
||||
* This plugin checks the clock offset between the local host and a
|
||||
* remote NTP server. It is independent of any commandline programs or
|
||||
* external libraries.
|
||||
*
|
||||
* If you'd rather want to monitor an NTP server, please use
|
||||
* check_ntp_peer.
|
||||
*
|
||||
*
|
||||
* License Information:
|
||||
*
|
||||
* 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, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: check_ntp_time.c 1861 2007-12-11 05:57:35Z dermoth $
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
const char *progname = "check_ntp_time";
|
||||
const char *revision = "$Revision: 1861 $";
|
||||
const char *copyright = "2007";
|
||||
const char *email = "nagiosplug-devel@lists.sourceforge.net";
|
||||
|
||||
#include "common.h"
|
||||
#include "netutils.h"
|
||||
#include "utils.h"
|
||||
|
||||
static char *server_address=NULL;
|
||||
static int verbose=0;
|
||||
static int quiet=0;
|
||||
static char *owarn="60";
|
||||
static char *ocrit="120";
|
||||
|
||||
int process_arguments (int, char **);
|
||||
thresholds *offset_thresholds = NULL;
|
||||
void print_help (void);
|
||||
void print_usage (void);
|
||||
|
||||
/* number of times to perform each request to get a good average. */
|
||||
#define AVG_NUM 4
|
||||
|
||||
/* max size of control message data */
|
||||
#define MAX_CM_SIZE 468
|
||||
|
||||
/* this structure holds everything in an ntp request/response as per rfc1305 */
|
||||
typedef struct {
|
||||
uint8_t flags; /* byte with leapindicator,vers,mode. see macros */
|
||||
uint8_t stratum; /* clock stratum */
|
||||
int8_t poll; /* polling interval */
|
||||
int8_t precision; /* precision of the local clock */
|
||||
int32_t rtdelay; /* total rt delay, as a fixed point num. see macros */
|
||||
uint32_t rtdisp; /* like above, but for max err to primary src */
|
||||
uint32_t refid; /* ref clock identifier */
|
||||
uint64_t refts; /* reference timestamp. local time local clock */
|
||||
uint64_t origts; /* time at which request departed client */
|
||||
uint64_t rxts; /* time at which request arrived at server */
|
||||
uint64_t txts; /* time at which request departed server */
|
||||
} ntp_message;
|
||||
|
||||
/* this structure holds data about results from querying offset from a peer */
|
||||
typedef struct {
|
||||
time_t waiting; /* ts set when we started waiting for a response */
|
||||
int num_responses; /* number of successfully recieved responses */
|
||||
uint8_t stratum; /* copied verbatim from the ntp_message */
|
||||
double rtdelay; /* converted from the ntp_message */
|
||||
double rtdisp; /* converted from the ntp_message */
|
||||
double offset[AVG_NUM]; /* offsets from each response */
|
||||
uint8_t flags; /* byte with leapindicator,vers,mode. see macros */
|
||||
} ntp_server_results;
|
||||
|
||||
/* bits 1,2 are the leap indicator */
|
||||
#define LI_MASK 0xc0
|
||||
#define LI(x) ((x&LI_MASK)>>6)
|
||||
#define LI_SET(x,y) do{ x |= ((y<<6)&LI_MASK); }while(0)
|
||||
/* and these are the values of the leap indicator */
|
||||
#define LI_NOWARNING 0x00
|
||||
#define LI_EXTRASEC 0x01
|
||||
#define LI_MISSINGSEC 0x02
|
||||
#define LI_ALARM 0x03
|
||||
/* bits 3,4,5 are the ntp version */
|
||||
#define VN_MASK 0x38
|
||||
#define VN(x) ((x&VN_MASK)>>3)
|
||||
#define VN_SET(x,y) do{ x |= ((y<<3)&VN_MASK); }while(0)
|
||||
#define VN_RESERVED 0x02
|
||||
/* bits 6,7,8 are the ntp mode */
|
||||
#define MODE_MASK 0x07
|
||||
#define MODE(x) (x&MODE_MASK)
|
||||
#define MODE_SET(x,y) do{ x |= (y&MODE_MASK); }while(0)
|
||||
/* here are some values */
|
||||
#define MODE_CLIENT 0x03
|
||||
#define MODE_CONTROLMSG 0x06
|
||||
/* In control message, bits 8-10 are R,E,M bits */
|
||||
#define REM_MASK 0xe0
|
||||
#define REM_RESP 0x80
|
||||
#define REM_ERROR 0x40
|
||||
#define REM_MORE 0x20
|
||||
/* In control message, bits 11 - 15 are opcode */
|
||||
#define OP_MASK 0x1f
|
||||
#define OP_SET(x,y) do{ x |= (y&OP_MASK); }while(0)
|
||||
#define OP_READSTAT 0x01
|
||||
#define OP_READVAR 0x02
|
||||
/* In peer status bytes, bits 6,7,8 determine clock selection status */
|
||||
#define PEER_SEL(x) ((ntohs(x)>>8)&0x07)
|
||||
#define PEER_INCLUDED 0x04
|
||||
#define PEER_SYNCSOURCE 0x06
|
||||
|
||||
/**
|
||||
** a note about the 32-bit "fixed point" numbers:
|
||||
**
|
||||
they are divided into halves, each being a 16-bit int in network byte order:
|
||||
- the first 16 bits are an int on the left side of a decimal point.
|
||||
- the second 16 bits represent a fraction n/(2^16)
|
||||
likewise for the 64-bit "fixed point" numbers with everything doubled :)
|
||||
**/
|
||||
|
||||
/* macros to access the left/right 16 bits of a 32-bit ntp "fixed point"
|
||||
number. note that these can be used as lvalues too */
|
||||
#define L16(x) (((uint16_t*)&x)[0])
|
||||
#define R16(x) (((uint16_t*)&x)[1])
|
||||
/* macros to access the left/right 32 bits of a 64-bit ntp "fixed point"
|
||||
number. these too can be used as lvalues */
|
||||
#define L32(x) (((uint32_t*)&x)[0])
|
||||
#define R32(x) (((uint32_t*)&x)[1])
|
||||
|
||||
/* ntp wants seconds since 1/1/00, epoch is 1/1/70. this is the difference */
|
||||
#define EPOCHDIFF 0x83aa7e80UL
|
||||
|
||||
/* extract a 32-bit ntp fixed point number into a double */
|
||||
#define NTP32asDOUBLE(x) (ntohs(L16(x)) + (double)ntohs(R16(x))/65536.0)
|
||||
|
||||
/* likewise for a 64-bit ntp fp number */
|
||||
#define NTP64asDOUBLE(n) (double)(((uint64_t)n)?\
|
||||
(ntohl(L32(n))-EPOCHDIFF) + \
|
||||
(.00000001*(0.5+(double)(ntohl(R32(n))/42.94967296))):\
|
||||
0)
|
||||
|
||||
/* convert a struct timeval to a double */
|
||||
#define TVasDOUBLE(x) (double)(x.tv_sec+(0.000001*x.tv_usec))
|
||||
|
||||
/* convert an ntp 64-bit fp number to a struct timeval */
|
||||
#define NTP64toTV(n,t) \
|
||||
do{ if(!n) t.tv_sec = t.tv_usec = 0; \
|
||||
else { \
|
||||
t.tv_sec=ntohl(L32(n))-EPOCHDIFF; \
|
||||
t.tv_usec=(int)(0.5+(double)(ntohl(R32(n))/4294.967296)); \
|
||||
} \
|
||||
}while(0)
|
||||
|
||||
/* convert a struct timeval to an ntp 64-bit fp number */
|
||||
#define TVtoNTP64(t,n) \
|
||||
do{ if(!t.tv_usec && !t.tv_sec) n=0x0UL; \
|
||||
else { \
|
||||
L32(n)=htonl(t.tv_sec + EPOCHDIFF); \
|
||||
R32(n)=htonl((uint64_t)((4294.967296*t.tv_usec)+.5)); \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
/* NTP control message header is 12 bytes, plus any data in the data
|
||||
* field, plus null padding to the nearest 32-bit boundary per rfc.
|
||||
*/
|
||||
#define SIZEOF_NTPCM(m) (12+ntohs(m.count)+((m.count)?4-(ntohs(m.count)%4):0))
|
||||
|
||||
/* finally, a little helper or two for debugging: */
|
||||
#define DBG(x) do{if(verbose>1){ x; }}while(0);
|
||||
#define PRINTSOCKADDR(x) \
|
||||
do{ \
|
||||
printf("%u.%u.%u.%u", (x>>24)&0xff, (x>>16)&0xff, (x>>8)&0xff, x&0xff);\
|
||||
}while(0);
|
||||
|
||||
/* calculate the offset of the local clock */
|
||||
static inline double calc_offset(const ntp_message *m, const struct timeval *t){
|
||||
double client_tx, peer_rx, peer_tx, client_rx;
|
||||
client_tx = NTP64asDOUBLE(m->origts);
|
||||
peer_rx = NTP64asDOUBLE(m->rxts);
|
||||
peer_tx = NTP64asDOUBLE(m->txts);
|
||||
client_rx=TVasDOUBLE((*t));
|
||||
return (.5*((peer_tx-client_rx)+(peer_rx-client_tx)));
|
||||
}
|
||||
|
||||
/* print out a ntp packet in human readable/debuggable format */
|
||||
void print_ntp_message(const ntp_message *p){
|
||||
struct timeval ref, orig, rx, tx;
|
||||
|
||||
NTP64toTV(p->refts,ref);
|
||||
NTP64toTV(p->origts,orig);
|
||||
NTP64toTV(p->rxts,rx);
|
||||
NTP64toTV(p->txts,tx);
|
||||
|
||||
printf("packet contents:\n");
|
||||
printf("\tflags: 0x%.2x\n", p->flags);
|
||||
printf("\t li=%d (0x%.2x)\n", LI(p->flags), p->flags&LI_MASK);
|
||||
printf("\t vn=%d (0x%.2x)\n", VN(p->flags), p->flags&VN_MASK);
|
||||
printf("\t mode=%d (0x%.2x)\n", MODE(p->flags), p->flags&MODE_MASK);
|
||||
printf("\tstratum = %d\n", p->stratum);
|
||||
printf("\tpoll = %g\n", pow(2, p->poll));
|
||||
printf("\tprecision = %g\n", pow(2, p->precision));
|
||||
printf("\trtdelay = %-.16g\n", NTP32asDOUBLE(p->rtdelay));
|
||||
printf("\trtdisp = %-.16g\n", NTP32asDOUBLE(p->rtdisp));
|
||||
printf("\trefid = %x\n", p->refid);
|
||||
printf("\trefts = %-.16g\n", NTP64asDOUBLE(p->refts));
|
||||
printf("\torigts = %-.16g\n", NTP64asDOUBLE(p->origts));
|
||||
printf("\trxts = %-.16g\n", NTP64asDOUBLE(p->rxts));
|
||||
printf("\ttxts = %-.16g\n", NTP64asDOUBLE(p->txts));
|
||||
}
|
||||
|
||||
void setup_request(ntp_message *p){
|
||||
struct timeval t;
|
||||
|
||||
memset(p, 0, sizeof(ntp_message));
|
||||
LI_SET(p->flags, LI_ALARM);
|
||||
VN_SET(p->flags, 4);
|
||||
MODE_SET(p->flags, MODE_CLIENT);
|
||||
p->poll=4;
|
||||
p->precision=(int8_t)0xfa;
|
||||
L16(p->rtdelay)=htons(1);
|
||||
L16(p->rtdisp)=htons(1);
|
||||
|
||||
gettimeofday(&t, NULL);
|
||||
TVtoNTP64(t,p->txts);
|
||||
}
|
||||
|
||||
/* select the "best" server from a list of servers, and return its index.
|
||||
* this is done by filtering servers based on stratum, dispersion, and
|
||||
* finally round-trip delay. */
|
||||
int best_offset_server(const ntp_server_results *slist, int nservers){
|
||||
int i=0, j=0, cserver=0, candidates[5], csize=0;
|
||||
|
||||
/* for each server */
|
||||
for(cserver=0; cserver<nservers; cserver++){
|
||||
/* sort out servers with error flags */
|
||||
if ( LI(slist[cserver].flags) != LI_NOWARNING ){
|
||||
if (verbose) printf("discarding peer id %d: flags=%d\n", cserver, LI(slist[cserver].flags));
|
||||
break;
|
||||
}
|
||||
|
||||
/* compare it to each of the servers already in the candidate list */
|
||||
for(i=0; i<csize; i++){
|
||||
/* does it have an equal or better stratum? */
|
||||
if(slist[cserver].stratum <= slist[i].stratum){
|
||||
/* does it have an equal or better dispersion? */
|
||||
if(slist[cserver].rtdisp <= slist[i].rtdisp){
|
||||
/* does it have a better rtdelay? */
|
||||
if(slist[cserver].rtdelay < slist[i].rtdelay){
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* if we haven't reached the current list's end, move everyone
|
||||
* over one to the right, and insert the new candidate */
|
||||
if(i<csize){
|
||||
for(j=5; j>i; j--){
|
||||
candidates[j]=candidates[j-1];
|
||||
}
|
||||
}
|
||||
/* regardless, if they should be on the list... */
|
||||
if(i<5) {
|
||||
candidates[i]=cserver;
|
||||
if(csize<5) csize++;
|
||||
/* otherwise discard the server */
|
||||
} else {
|
||||
DBG(printf("discarding peer id %d\n", cserver));
|
||||
}
|
||||
}
|
||||
|
||||
if(csize>0) {
|
||||
DBG(printf("best server selected: peer %d\n", candidates[0]));
|
||||
return candidates[0];
|
||||
} else {
|
||||
DBG(printf("no peers meeting synchronization criteria :(\n"));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* do everything we need to get the total average offset
|
||||
* - we use a certain amount of parallelization with poll() to ensure
|
||||
* we don't waste time sitting around waiting for single packets.
|
||||
* - we also "manually" handle resolving host names and connecting, because
|
||||
* we have to do it in a way that our lazy macros don't handle currently :( */
|
||||
double offset_request(const char *host, int *status){
|
||||
int i=0, j=0, ga_result=0, num_hosts=0, *socklist=NULL, respnum=0;
|
||||
int servers_completed=0, one_written=0, one_read=0, servers_readable=0, best_index=-1;
|
||||
time_t now_time=0, start_ts=0;
|
||||
ntp_message *req=NULL;
|
||||
double avg_offset=0.;
|
||||
struct timeval recv_time;
|
||||
struct addrinfo *ai=NULL, *ai_tmp=NULL, hints;
|
||||
struct pollfd *ufds=NULL;
|
||||
ntp_server_results *servers=NULL;
|
||||
|
||||
/* setup hints to only return results from getaddrinfo that we'd like */
|
||||
memset(&hints, 0, sizeof(struct addrinfo));
|
||||
hints.ai_family = address_family;
|
||||
hints.ai_protocol = IPPROTO_UDP;
|
||||
hints.ai_socktype = SOCK_DGRAM;
|
||||
|
||||
/* fill in ai with the list of hosts resolved by the host name */
|
||||
ga_result = getaddrinfo(host, "123", &hints, &ai);
|
||||
if(ga_result!=0){
|
||||
die(STATE_UNKNOWN, "error getting address for %s: %s\n",
|
||||
host, gai_strerror(ga_result));
|
||||
}
|
||||
|
||||
/* count the number of returned hosts, and allocate stuff accordingly */
|
||||
for(ai_tmp=ai; ai_tmp!=NULL; ai_tmp=ai_tmp->ai_next){ num_hosts++; }
|
||||
req=(ntp_message*)malloc(sizeof(ntp_message)*num_hosts);
|
||||
if(req==NULL) die(STATE_UNKNOWN, "can not allocate ntp message array");
|
||||
socklist=(int*)malloc(sizeof(int)*num_hosts);
|
||||
if(socklist==NULL) die(STATE_UNKNOWN, "can not allocate socket array");
|
||||
ufds=(struct pollfd*)malloc(sizeof(struct pollfd)*num_hosts);
|
||||
if(ufds==NULL) die(STATE_UNKNOWN, "can not allocate socket array");
|
||||
servers=(ntp_server_results*)malloc(sizeof(ntp_server_results)*num_hosts);
|
||||
if(servers==NULL) die(STATE_UNKNOWN, "can not allocate server array");
|
||||
memset(servers, 0, sizeof(ntp_server_results)*num_hosts);
|
||||
|
||||
/* setup each socket for writing, and the corresponding struct pollfd */
|
||||
ai_tmp=ai;
|
||||
for(i=0;ai_tmp;i++){
|
||||
socklist[i]=socket(ai_tmp->ai_family, SOCK_DGRAM, IPPROTO_UDP);
|
||||
if(socklist[i] == -1) {
|
||||
perror(NULL);
|
||||
die(STATE_UNKNOWN, "can not create new socket");
|
||||
}
|
||||
if(connect(socklist[i], ai_tmp->ai_addr, ai_tmp->ai_addrlen)){
|
||||
die(STATE_UNKNOWN, "can't create socket connection");
|
||||
} else {
|
||||
ufds[i].fd=socklist[i];
|
||||
ufds[i].events=POLLIN;
|
||||
ufds[i].revents=0;
|
||||
}
|
||||
ai_tmp = ai_tmp->ai_next;
|
||||
}
|
||||
|
||||
/* now do AVG_NUM checks to each host. We stop before timeout/2 seconds
|
||||
* have passed in order to ensure post-processing and jitter time. */
|
||||
now_time=start_ts=time(NULL);
|
||||
while(servers_completed<num_hosts && now_time-start_ts <= socket_timeout/2){
|
||||
/* loop through each server and find each one which hasn't
|
||||
* been touched in the past second or so and is still lacking
|
||||
* some responses. For each of these servers, send a new request,
|
||||
* and update the "waiting" timestamp with the current time. */
|
||||
one_written=0;
|
||||
now_time=time(NULL);
|
||||
|
||||
for(i=0; i<num_hosts; i++){
|
||||
if(servers[i].waiting<now_time && servers[i].num_responses<AVG_NUM){
|
||||
if(verbose && servers[i].waiting != 0) printf("re-");
|
||||
if(verbose) printf("sending request to peer %d\n", i);
|
||||
setup_request(&req[i]);
|
||||
write(socklist[i], &req[i], sizeof(ntp_message));
|
||||
servers[i].waiting=now_time;
|
||||
one_written=1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* quickly poll for any sockets with pending data */
|
||||
servers_readable=poll(ufds, num_hosts, 100);
|
||||
if(servers_readable==-1){
|
||||
perror("polling ntp sockets");
|
||||
die(STATE_UNKNOWN, "communication errors");
|
||||
}
|
||||
|
||||
/* read from any sockets with pending data */
|
||||
for(i=0; servers_readable && i<num_hosts; i++){
|
||||
if(ufds[i].revents&POLLIN && servers[i].num_responses < AVG_NUM){
|
||||
if(verbose) {
|
||||
printf("response from peer %d: ", i);
|
||||
}
|
||||
|
||||
read(ufds[i].fd, &req[i], sizeof(ntp_message));
|
||||
gettimeofday(&recv_time, NULL);
|
||||
DBG(print_ntp_message(&req[i]));
|
||||
respnum=servers[i].num_responses++;
|
||||
servers[i].offset[respnum]=calc_offset(&req[i], &recv_time);
|
||||
if(verbose) {
|
||||
printf("offset %.10g\n", servers[i].offset[respnum]);
|
||||
}
|
||||
servers[i].stratum=req[i].stratum;
|
||||
servers[i].rtdisp=NTP32asDOUBLE(req[i].rtdisp);
|
||||
servers[i].rtdelay=NTP32asDOUBLE(req[i].rtdelay);
|
||||
servers[i].waiting=0;
|
||||
servers[i].flags=req[i].flags;
|
||||
servers_readable--;
|
||||
one_read = 1;
|
||||
if(servers[i].num_responses==AVG_NUM) servers_completed++;
|
||||
}
|
||||
}
|
||||
/* lather, rinse, repeat. */
|
||||
}
|
||||
|
||||
if (one_read == 0) {
|
||||
die(STATE_CRITICAL, "NTP CRITICAL: No response from NTP server\n");
|
||||
}
|
||||
|
||||
/* now, pick the best server from the list */
|
||||
best_index=best_offset_server(servers, num_hosts);
|
||||
if(best_index < 0){
|
||||
*status=STATE_UNKNOWN;
|
||||
} else {
|
||||
/* finally, calculate the average offset */
|
||||
for(i=0; i<servers[best_index].num_responses;i++){
|
||||
avg_offset+=servers[best_index].offset[j];
|
||||
}
|
||||
avg_offset/=servers[best_index].num_responses;
|
||||
}
|
||||
|
||||
/* cleanup */
|
||||
for(j=0; j<num_hosts; j++){ close(socklist[j]); }
|
||||
free(socklist);
|
||||
free(ufds);
|
||||
free(servers);
|
||||
free(req);
|
||||
freeaddrinfo(ai);
|
||||
|
||||
if(verbose) printf("overall average offset: %.10g\n", avg_offset);
|
||||
return avg_offset;
|
||||
}
|
||||
|
||||
int process_arguments(int argc, char **argv){
|
||||
int c;
|
||||
int option=0;
|
||||
static struct option longopts[] = {
|
||||
{"version", no_argument, 0, 'V'},
|
||||
{"help", no_argument, 0, 'h'},
|
||||
{"verbose", no_argument, 0, 'v'},
|
||||
{"use-ipv4", no_argument, 0, '4'},
|
||||
{"use-ipv6", no_argument, 0, '6'},
|
||||
{"quiet", no_argument, 0, 'q'},
|
||||
{"warning", required_argument, 0, 'w'},
|
||||
{"critical", required_argument, 0, 'c'},
|
||||
{"timeout", required_argument, 0, 't'},
|
||||
{"hostname", required_argument, 0, 'H'},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
|
||||
if (argc < 2)
|
||||
usage ("\n");
|
||||
|
||||
while (1) {
|
||||
c = getopt_long (argc, argv, "Vhv46qw:c:t:H:", longopts, &option);
|
||||
if (c == -1 || c == EOF || c == 1)
|
||||
break;
|
||||
|
||||
switch (c) {
|
||||
case 'h':
|
||||
print_help();
|
||||
exit(STATE_OK);
|
||||
break;
|
||||
case 'V':
|
||||
print_revision(progname, revision);
|
||||
exit(STATE_OK);
|
||||
break;
|
||||
case 'v':
|
||||
verbose++;
|
||||
break;
|
||||
case 'q':
|
||||
quiet = 1;
|
||||
break;
|
||||
case 'w':
|
||||
owarn = optarg;
|
||||
break;
|
||||
case 'c':
|
||||
ocrit = optarg;
|
||||
break;
|
||||
case 'H':
|
||||
if(is_host(optarg) == FALSE)
|
||||
usage2(_("Invalid hostname/address"), optarg);
|
||||
server_address = strdup(optarg);
|
||||
break;
|
||||
case 't':
|
||||
socket_timeout=atoi(optarg);
|
||||
break;
|
||||
case '4':
|
||||
address_family = AF_INET;
|
||||
break;
|
||||
case '6':
|
||||
#ifdef USE_IPV6
|
||||
address_family = AF_INET6;
|
||||
#else
|
||||
usage4 (_("IPv6 support not available"));
|
||||
#endif
|
||||
break;
|
||||
case '?':
|
||||
/* print short usage statement if args not parsable */
|
||||
usage5 ();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(server_address == NULL){
|
||||
usage4(_("Hostname was not supplied"));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
char *perfd_offset (double offset)
|
||||
{
|
||||
return fperfdata ("offset", offset, "s",
|
||||
TRUE, offset_thresholds->warning->end,
|
||||
TRUE, offset_thresholds->critical->end,
|
||||
FALSE, 0, FALSE, 0);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]){
|
||||
int result, offset_result;
|
||||
double offset=0;
|
||||
char *result_line, *perfdata_line;
|
||||
|
||||
setlocale (LC_ALL, "");
|
||||
bindtextdomain (PACKAGE, LOCALEDIR);
|
||||
textdomain (PACKAGE);
|
||||
|
||||
result = offset_result = STATE_OK;
|
||||
|
||||
if (process_arguments (argc, argv) == ERROR)
|
||||
usage4 (_("Could not parse arguments"));
|
||||
|
||||
set_thresholds(&offset_thresholds, owarn, ocrit);
|
||||
|
||||
/* initialize alarm signal handling */
|
||||
signal (SIGALRM, socket_timeout_alarm_handler);
|
||||
|
||||
/* set socket timeout */
|
||||
alarm (socket_timeout);
|
||||
|
||||
offset = offset_request(server_address, &offset_result);
|
||||
if (offset_result == STATE_UNKNOWN) {
|
||||
result = (quiet == 1 ? STATE_UNKNOWN : STATE_CRITICAL);
|
||||
} else {
|
||||
result = get_status(fabs(offset), offset_thresholds);
|
||||
}
|
||||
|
||||
switch (result) {
|
||||
case STATE_CRITICAL :
|
||||
asprintf(&result_line, _("NTP CRITICAL:"));
|
||||
break;
|
||||
case STATE_WARNING :
|
||||
asprintf(&result_line, _("NTP WARNING:"));
|
||||
break;
|
||||
case STATE_OK :
|
||||
asprintf(&result_line, _("NTP OK:"));
|
||||
break;
|
||||
default :
|
||||
asprintf(&result_line, _("NTP UNKNOWN:"));
|
||||
break;
|
||||
}
|
||||
if(offset_result == STATE_UNKNOWN){
|
||||
asprintf(&result_line, "%s %s", result_line, _("Offset unknown"));
|
||||
asprintf(&perfdata_line, "");
|
||||
} else {
|
||||
asprintf(&result_line, "%s %s %.10g secs", result_line, _("Offset"), offset);
|
||||
asprintf(&perfdata_line, "%s", perfd_offset(offset));
|
||||
}
|
||||
printf("%s|%s\n", result_line, perfdata_line);
|
||||
|
||||
if(server_address!=NULL) free(server_address);
|
||||
return result;
|
||||
}
|
||||
|
||||
void print_help(void){
|
||||
print_revision(progname, revision);
|
||||
|
||||
printf ("Copyright (c) 2006 Sean Finney\n");
|
||||
printf (COPYRIGHT, copyright, email);
|
||||
|
||||
printf ("%s\n", _("This plugin checks the clock offset with the ntp server"));
|
||||
|
||||
printf ("\n\n");
|
||||
|
||||
print_usage();
|
||||
printf (_(UT_HELP_VRSN));
|
||||
printf (_(UT_HOST_PORT), 'p', "123");
|
||||
printf (" %s\n", "-q, --quiet");
|
||||
printf (" %s\n", _("Returns UNKNOWN instead of CRITICAL if offset cannot be found"));
|
||||
printf (" %s\n", "-w, --warning=THRESHOLD");
|
||||
printf (" %s\n", _("Offset to result in warning status (seconds)"));
|
||||
printf (" %s\n", "-c, --critical=THRESHOLD");
|
||||
printf (" %s\n", _("Offset to result in critical status (seconds)"));
|
||||
printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT);
|
||||
printf (_(UT_VERBOSE));
|
||||
|
||||
printf("\n");
|
||||
printf("%s\n", _("Notes:"));
|
||||
printf(" %s\n", _("This plugin checks the clock offset between the local host and a"));
|
||||
printf(" %s\n", _("remote NTP server. It is independent of any commandline programs or"));
|
||||
printf(" %s\n\n", _("external libraries."));
|
||||
printf(" %s\n", _("If you'd rather want to monitor an NTP server, please use"));
|
||||
printf(" %s\n\n", _("check_ntp_peer."));
|
||||
|
||||
printf(" %s\n", _("See:"));
|
||||
printf(" %s\n", ("http://nagiosplug.sourceforge.net/developer-guidelines.html#THRESHOLDFORMAT"));
|
||||
printf(" %s\n", _("for THRESHOLD format and examples."));
|
||||
|
||||
printf("\n");
|
||||
printf("%s\n", _("Examples:"));
|
||||
printf(" %s\n", ("./check_ntp_time -H ntpserv -w 0.5 -c 1"));
|
||||
|
||||
printf (_(UT_SUPPORT));
|
||||
}
|
||||
|
||||
void
|
||||
print_usage(void)
|
||||
{
|
||||
printf (_("Usage:"));
|
||||
printf(" %s -H <host> [-w <warn>] [-c <crit>] [-W <warn>] [-C <crit>]\n", progname);
|
||||
printf(" [-j <warn>] [-k <crit>] [-v verbose]\n");
|
||||
}
|
||||
|
|
@ -5,7 +5,7 @@
|
|||
* License: GPL
|
||||
* Copyright (c) 2000-2006 nagios-plugins team
|
||||
*
|
||||
* Last Modified: $Date: 2007-04-23 08:30:47 +0100 (Mon, 23 Apr 2007) $
|
||||
* Last Modified: $Date: 2007-10-25 21:43:04 +0100 (Thu, 25 Oct 2007) $
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
|
@ -30,12 +30,12 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id: check_ping.c 1699 2007-04-23 07:30:47Z hweiss $
|
||||
$Id: check_ping.c 1810 2007-10-25 20:43:04Z tonvoon $
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
const char *progname = "check_ping";
|
||||
const char *revision = "$Revision: 1699 $";
|
||||
const char *revision = "$Revision: 1810 $";
|
||||
const char *copyright = "2000-2006";
|
||||
const char *email = "nagiosplug-devel@lists.sourceforge.net";
|
||||
|
||||
|
@ -548,7 +548,7 @@ print_help (void)
|
|||
{
|
||||
print_revision (progname, revision);
|
||||
|
||||
printf ("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>");
|
||||
printf ("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>\n");
|
||||
printf (COPYRIGHT, copyright, email);
|
||||
|
||||
printf (_("Use ping to check connection statistics for a remote host."));
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* License: GPL
|
||||
* Copyright (c) 1999-2006 nagios-plugins team
|
||||
*
|
||||
* Last Modified: $Date: 2007-09-26 11:57:44 +0100 (Wed, 26 Sep 2007) $
|
||||
* Last Modified: $Date: 2007-12-10 07:52:00 +0000 (Mon, 10 Dec 2007) $
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
|
@ -30,12 +30,12 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* $Id: check_radius.c 1800 2007-09-26 10:57:44Z hweiss $
|
||||
* $Id: check_radius.c 1859 2007-12-10 07:52:00Z dermoth $
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
const char *progname = "check_radius";
|
||||
const char *revision = "$Revision: 1800 $";
|
||||
const char *revision = "$Revision: 1859 $";
|
||||
const char *copyright = "2000-2006";
|
||||
const char *email = "nagiosplug-devel@lists.sourceforge.net";
|
||||
|
||||
|
@ -287,7 +287,7 @@ process_arguments (int argc, char **argv)
|
|||
}
|
||||
|
||||
if (server == NULL)
|
||||
usage4 (_("Host not specified"));
|
||||
usage4 (_("Hostname was not supplied"));
|
||||
if (username == NULL)
|
||||
usage4 (_("User not specified"));
|
||||
if (password == NULL)
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* License: GPL
|
||||
* Copyright (c) 1999-2006 nagios-plugins team
|
||||
*
|
||||
* Last Modified: $Date: 2007-09-15 15:25:56 +0100 (Sat, 15 Sep 2007) $
|
||||
* Last Modified: $Date: 2007-11-09 21:17:03 +0000 (Fri, 09 Nov 2007) $
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
|
@ -31,12 +31,12 @@
|
|||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
*
|
||||
* $Id: check_smtp.c 1780 2007-09-15 14:25:56Z hweiss $
|
||||
* $Id: check_smtp.c 1817 2007-11-09 21:17:03Z dermoth $
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
const char *progname = "check_smtp";
|
||||
const char *revision = "$Revision: 1780 $";
|
||||
const char *revision = "$Revision: 1817 $";
|
||||
const char *copyright = "2000-2006";
|
||||
const char *email = "nagiosplug-devel@lists.sourceforge.net";
|
||||
|
||||
|
@ -45,6 +45,7 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net";
|
|||
#include "common.h"
|
||||
#include "netutils.h"
|
||||
#include "utils.h"
|
||||
#include "base64.h"
|
||||
|
||||
#ifdef HAVE_SSL
|
||||
int check_cert = FALSE;
|
||||
|
@ -122,46 +123,6 @@ enum {
|
|||
UDP_PROTOCOL = 2,
|
||||
};
|
||||
|
||||
/* written by lauri alanko */
|
||||
static char *
|
||||
base64 (const char *bin, size_t len)
|
||||
{
|
||||
|
||||
char *buf = (char *) malloc ((len + 2) / 3 * 4 + 1);
|
||||
size_t i = 0, j = 0;
|
||||
|
||||
char BASE64_END = '=';
|
||||
char base64_table[64];
|
||||
strncpy (base64_table, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", 64);
|
||||
|
||||
while (j < len - 2) {
|
||||
buf[i++] = base64_table[bin[j] >> 2];
|
||||
buf[i++] = base64_table[((bin[j] & 3) << 4) | (bin[j + 1] >> 4)];
|
||||
buf[i++] = base64_table[((bin[j + 1] & 15) << 2) | (bin[j + 2] >> 6)];
|
||||
buf[i++] = base64_table[bin[j + 2] & 63];
|
||||
j += 3;
|
||||
}
|
||||
|
||||
switch (len - j) {
|
||||
case 1:
|
||||
buf[i++] = base64_table[bin[j] >> 2];
|
||||
buf[i++] = base64_table[(bin[j] & 3) << 4];
|
||||
buf[i++] = BASE64_END;
|
||||
buf[i++] = BASE64_END;
|
||||
break;
|
||||
case 2:
|
||||
buf[i++] = base64_table[bin[j] >> 2];
|
||||
buf[i++] = base64_table[((bin[j] & 3) << 4) | (bin[j + 1] >> 4)];
|
||||
buf[i++] = base64_table[(bin[j + 1] & 15) << 2];
|
||||
buf[i++] = BASE64_END;
|
||||
break;
|
||||
case 0:
|
||||
break;
|
||||
}
|
||||
|
||||
buf[i] = '\0';
|
||||
return buf;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
|
@ -567,6 +528,7 @@ process_arguments (int argc, char **argv)
|
|||
break;
|
||||
case 'A':
|
||||
authtype = optarg;
|
||||
use_ehlo = TRUE;
|
||||
break;
|
||||
case 'U':
|
||||
authuser = optarg;
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* License: GPL
|
||||
* Copyright (c) 1999-2007 nagios-plugins team
|
||||
*
|
||||
* Last Modified: $Date: 2007-05-29 06:22:32 +0100 (Tue, 29 May 2007) $
|
||||
* Last Modified: $Date: 2007-12-10 07:52:00 +0000 (Mon, 10 Dec 2007) $
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
|
@ -30,12 +30,12 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* $Id: check_snmp.c 1721 2007-05-29 05:22:32Z dermoth $
|
||||
* $Id: check_snmp.c 1859 2007-12-10 07:52:00Z dermoth $
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
const char *progname = "check_snmp";
|
||||
const char *revision = "$Revision: 1721 $";
|
||||
const char *revision = "$Revision: 1859 $";
|
||||
const char *copyright = "1999-2007";
|
||||
const char *email = "nagiosplug-devel@lists.sourceforge.net";
|
||||
|
||||
|
@ -148,6 +148,7 @@ main (int argc, char **argv)
|
|||
int result = STATE_DEPENDENT;
|
||||
char input_buffer[MAX_INPUT_BUFFER];
|
||||
char *command_line = NULL;
|
||||
char *cl_hidden_auth = NULL;
|
||||
char *response = NULL;
|
||||
char *outbuff;
|
||||
char *output;
|
||||
|
@ -186,11 +187,17 @@ main (int argc, char **argv)
|
|||
asprintf(&command_line, "%s -t %d -r %d -m %s -v %s %s %s:%s %s",
|
||||
PATH_TO_SNMPGETNEXT, timeout_interval, retries, miblist, proto,
|
||||
authpriv, server_address, port, oid);
|
||||
asprintf(&cl_hidden_auth, "%s -t %d -r %d -m %s -v %s %s %s:%s %s",
|
||||
PATH_TO_SNMPGETNEXT, timeout_interval, retries, miblist, proto,
|
||||
"[authpriv]", server_address, port, oid);
|
||||
}else{
|
||||
|
||||
asprintf (&command_line, "%s -t %d -r %d -m %s -v %s %s %s:%s %s",
|
||||
PATH_TO_SNMPGET, timeout_interval, retries, miblist, proto,
|
||||
authpriv, server_address, port, oid);
|
||||
asprintf(&cl_hidden_auth, "%s -t %d -r %d -m %s -v %s %s %s:%s %s",
|
||||
PATH_TO_SNMPGET, timeout_interval, retries, miblist, proto,
|
||||
"[authpriv]", server_address, port, oid);
|
||||
}
|
||||
|
||||
if (verbose)
|
||||
|
@ -200,14 +207,14 @@ main (int argc, char **argv)
|
|||
/* run the command */
|
||||
child_process = spopen (command_line);
|
||||
if (child_process == NULL) {
|
||||
printf (_("Could not open pipe: %s\n"), command_line);
|
||||
printf (_("Could not open pipe: %s\n"), cl_hidden_auth);
|
||||
exit (STATE_UNKNOWN);
|
||||
}
|
||||
|
||||
#if 0 /* Removed May 29, 2007 */
|
||||
child_stderr = fdopen (child_stderr_array[fileno (child_process)], "r");
|
||||
if (child_stderr == NULL) {
|
||||
printf (_("Could not open stderr for %s\n"), command_line);
|
||||
printf (_("Could not open stderr for %s\n"), cl_hidden_auth);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -219,12 +226,16 @@ main (int argc, char **argv)
|
|||
|
||||
ptr = output;
|
||||
|
||||
strcat(perfstr, "| ");
|
||||
strncat(perfstr, "| ", sizeof(perfstr)-strlen(perfstr)-1);
|
||||
while (ptr) {
|
||||
char *foo;
|
||||
unsigned int copylen;
|
||||
|
||||
foo = strstr (ptr, delimiter);
|
||||
strncat(perfstr, ptr, foo-ptr);
|
||||
copylen = foo-ptr;
|
||||
if (copylen > sizeof(perfstr)-strlen(perfstr)-1)
|
||||
copylen = sizeof(perfstr)-strlen(perfstr)-1;
|
||||
strncat(perfstr, ptr, copylen);
|
||||
ptr = foo;
|
||||
|
||||
if (ptr == NULL)
|
||||
|
@ -357,11 +368,11 @@ main (int argc, char **argv)
|
|||
|
||||
i++;
|
||||
|
||||
strcat(perfstr, "=");
|
||||
strcat(perfstr, show);
|
||||
strncat(perfstr, "=", sizeof(perfstr)-strlen(perfstr)-1);
|
||||
strncat(perfstr, show, sizeof(perfstr)-strlen(perfstr)-1);
|
||||
if (type)
|
||||
strcat(perfstr, type);
|
||||
strcat(perfstr, " ");
|
||||
strncat(perfstr, type, sizeof(perfstr)-strlen(perfstr)-1);
|
||||
strncat(perfstr, " ", sizeof(perfstr)-strlen(perfstr)-1);
|
||||
|
||||
} /* end while (ptr) */
|
||||
|
||||
|
@ -369,7 +380,7 @@ main (int argc, char **argv)
|
|||
die (STATE_UNKNOWN,
|
||||
_("%s problem - No data received from host\nCMD: %s\n"),
|
||||
label,
|
||||
command_line);
|
||||
cl_hidden_auth);
|
||||
|
||||
#if 0 /* Removed May 29, 2007 */
|
||||
/* WARNING if output found on stderr */
|
||||
|
@ -510,7 +521,7 @@ process_arguments (int argc, char **argv)
|
|||
/* Test parameters */
|
||||
case 'c': /* critical time threshold */
|
||||
if (strspn (optarg, "0123456789:,") < strlen (optarg))
|
||||
usage2 (_("Invalid critical threshold: %s\n"), optarg);
|
||||
usage2 (_("Invalid critical threshold"), optarg);
|
||||
for (ptr = optarg; ptr && jj < MAX_OIDS; jj++) {
|
||||
if (llu_getll (&lower_crit_lim[jj], ptr) == 1)
|
||||
eval_method[jj] |= CRIT_LT;
|
||||
|
@ -521,7 +532,7 @@ process_arguments (int argc, char **argv)
|
|||
break;
|
||||
case 'w': /* warning time threshold */
|
||||
if (strspn (optarg, "0123456789:,") < strlen (optarg))
|
||||
usage2 (_("Invalid warning threshold: %s\n"), optarg);
|
||||
usage2 (_("Invalid warning threshold"), optarg);
|
||||
for (ptr = optarg; ptr && ii < MAX_OIDS; ii++) {
|
||||
if (llu_getll (&lower_warn_lim[ii], ptr) == 1)
|
||||
eval_method[ii] |= WARN_LT;
|
||||
|
@ -939,14 +950,14 @@ print_help (void)
|
|||
|
||||
/* Authentication Tokens*/
|
||||
printf (" %s\n", "-C, --community=STRING");
|
||||
printf (" %s\n", _("Optional community string for SNMP communication"));
|
||||
printf (_("(default is \"%s\")"),DEFAULT_COMMUNITY);
|
||||
printf (" %s ", _("Optional community string for SNMP communication"));
|
||||
printf ("(%s \"%s\")\n", _("default is") ,DEFAULT_COMMUNITY);
|
||||
printf (" %s\n", "-U, --secname=USERNAME");
|
||||
printf (" %s\n", _("SNMPv3 username"));
|
||||
printf (" %s\n", "-A, --authpassword=PASSWORD");
|
||||
printf (" %s\n", _("SNMPv3 authentication password"));
|
||||
printf (" %s\n", "-X, --privpasswd=PASSWORD");
|
||||
printf (" %s\n", _("SNMPv3 crypt passwd (DES)"));
|
||||
printf (" %s\n", _("SNMPv3 privacy password"));
|
||||
|
||||
/* OID Stuff */
|
||||
printf (" %s\n", "-o, --oid=OID(s)");
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* License: GPL
|
||||
* Copyright (c) 1999-2006 nagios-plugins team
|
||||
*
|
||||
* Last Modified: $Date: 2007-01-28 21:46:41 +0000 (Sun, 28 Jan 2007) $
|
||||
* Last Modified: $Date: 2007-11-09 13:08:43 +0000 (Fri, 09 Nov 2007) $
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
|
@ -31,12 +31,12 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* $Id: check_ssh.c 1590 2007-01-28 21:46:41Z hweiss $
|
||||
* $Id: check_ssh.c 1813 2007-11-09 13:08:43Z dermoth $
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
const char *progname = "check_ssh";
|
||||
const char *revision = "$Revision: 1590 $";
|
||||
const char *revision = "$Revision: 1813 $";
|
||||
const char *copyright = "2000-2006";
|
||||
const char *email = "nagiosplug-devel@lists.sourceforge.net";
|
||||
|
||||
|
@ -221,7 +221,7 @@ ssh_connect (char *haddr, int hport, char *remote_version)
|
|||
char *ssh_server = NULL;
|
||||
char rev_no[20];
|
||||
|
||||
sscanf ("$Revision: 1590 $", "$Revision: %[0123456789.]", rev_no);
|
||||
sscanf ("$Revision: 1813 $", "$Revision: %[0123456789.]", rev_no);
|
||||
|
||||
result = my_tcp_connect (haddr, hport, &sd);
|
||||
|
||||
|
@ -233,6 +233,7 @@ ssh_connect (char *haddr, int hport, char *remote_version)
|
|||
recv (sd, output, BUFF_SZ, 0);
|
||||
if (strncmp (output, "SSH", 3)) {
|
||||
printf (_("Server answer: %s"), output);
|
||||
close(sd);
|
||||
exit (STATE_CRITICAL);
|
||||
}
|
||||
else {
|
||||
|
@ -252,6 +253,7 @@ ssh_connect (char *haddr, int hport, char *remote_version)
|
|||
printf
|
||||
(_("SSH WARNING - %s (protocol %s) version mismatch, expected '%s'\n"),
|
||||
ssh_server, ssh_proto, remote_version);
|
||||
close(sd);
|
||||
exit (STATE_WARNING);
|
||||
}
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* Copyright (c) 2000 Karl DeBisschop (kdebisschop@users.sourceforge.net)
|
||||
* Copyright (c) 2000-2006 nagios-plugins team
|
||||
*
|
||||
* Last Modified: $Date: 2007-02-07 14:06:11 +0000 (Wed, 07 Feb 2007) $
|
||||
* Last Modified: $Date: 2007-12-10 07:52:00 +0000 (Mon, 10 Dec 2007) $
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
|
@ -28,12 +28,12 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* $Id: check_swap.c 1613 2007-02-07 14:06:11Z hweiss $
|
||||
* $Id: check_swap.c 1859 2007-12-10 07:52:00Z dermoth $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
const char *progname = "check_swap";
|
||||
const char *revision = "$Revision: 1613 $";
|
||||
const char *revision = "$Revision: 1859 $";
|
||||
const char *copyright = "2000-2006";
|
||||
const char *email = "nagiosplug-devel@lists.sourceforge.net";
|
||||
|
||||
|
@ -543,8 +543,7 @@ print_help (void)
|
|||
printf (" %s\n", _("Exit with CRITCAL status if less than PERCENT of swap space is free"));
|
||||
printf (" %s\n", "-a, --allswaps");
|
||||
printf (" %s\n", _("Conduct comparisons for all swap partitions, one by one"));
|
||||
printf (" %s\n", "-v, --verbose");
|
||||
printf (" %s\n", _("Verbose output. Up to 3 levels"));
|
||||
printf (_(UT_VERBOSE));
|
||||
printf ("\n");
|
||||
printf ("%s\n", _("Notes:"));
|
||||
printf (" %s\n", _("On AIX, if -a is specified, uses lsps -a, otherwise uses lsps -s.\n"));
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
* 2004 Arnaud Quette <arnaud.quette@mgeups.com>
|
||||
* Copyright (c) 2002-2006 nagios-plugins team
|
||||
*
|
||||
* Last Modified: $Date: 2007-05-09 10:16:33 +0100 (Wed, 09 May 2007) $
|
||||
* Last Modified: $Date: 2007-10-25 21:43:04 +0100 (Thu, 25 Oct 2007) $
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
|
@ -33,12 +33,12 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* $Id: check_ups.c 1709 2007-05-09 09:16:33Z psychotrahe $
|
||||
* $Id: check_ups.c 1810 2007-10-25 20:43:04Z tonvoon $
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
const char *progname = "check_ups";
|
||||
const char *revision = "$Revision: 1709 $";
|
||||
const char *revision = "$Revision: 1810 $";
|
||||
const char *copyright = "2002-2006";
|
||||
const char *email = "nagiosplug-devel@lists.sourceforge.net";
|
||||
|
||||
|
@ -598,7 +598,7 @@ print_help (void)
|
|||
|
||||
print_revision (progname, revision);
|
||||
|
||||
printf ("Copyright (c) 2000 Tom Shields");
|
||||
printf ("Copyright (c) 2000 Tom Shields\n");
|
||||
printf ("Copyright (c) 2004 Alain Richard <alain.richard@equation.fr>\n");
|
||||
printf ("Copyright (c) 2004 Arnaud Quette <arnaud.quette@mgeups.com>\n");
|
||||
printf (COPYRIGHT, copyright, email);
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* License: GPL
|
||||
* Copyright (c) 2002-2007 nagios-plugins team
|
||||
*
|
||||
* Last Modified: $Date: 2007-09-23 13:29:36 +0100 (Sun, 23 Sep 2007) $
|
||||
* Last Modified: $Date: 2007-12-10 07:52:00 +0000 (Mon, 10 Dec 2007) $
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
|
@ -29,7 +29,7 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* $Id: negate.c 1793 2007-09-23 12:29:36Z psychotrahe $
|
||||
* $Id: negate.c 1859 2007-12-10 07:52:00Z dermoth $
|
||||
|
||||
@@-<article>
|
||||
|
||||
|
@ -69,7 +69,7 @@
|
|||
******************************************************************************/
|
||||
|
||||
const char *progname = "negate";
|
||||
const char *revision = "$Revision: 1793 $";
|
||||
const char *revision = "$Revision: 1859 $";
|
||||
const char *copyright = "2002-2007";
|
||||
const char *email = "nagiosplug-devel@lists.sourceforge.net";
|
||||
|
||||
|
@ -206,7 +206,7 @@ process_arguments (int argc, char **argv)
|
|||
break;
|
||||
case 'o': /* replacement for OK */
|
||||
if ((state[STATE_OK] = translate_state(optarg)) == ERROR)
|
||||
usage4 (_("Ok must be a valid state name (OK, WARNING, CRITICAL, UNKNOWN) or integer (0-4)."));
|
||||
usage4 (_("Ok must be a valid state name (OK, WARNING, CRITICAL, UNKNOWN) or integer (0-3)."));
|
||||
permute = FALSE;
|
||||
break;
|
||||
|
||||
|
@ -305,7 +305,7 @@ print_help (void)
|
|||
printf (_(UT_HELP_VRSN));
|
||||
|
||||
printf (_(UT_TIMEOUT), DEFAULT_TIMEOUT);
|
||||
printf (" %s\n", _("Keep timeout lower than the plugin timeout to retain CRITICAL status."));
|
||||
printf (" %s\n", _("Keep timeout longer than the plugin timeout to retain CRITICAL status."));
|
||||
|
||||
printf(" -o,--ok=STATUS\n");
|
||||
printf(" -w,--warning=STATUS\n");
|
||||
|
@ -325,8 +325,8 @@ print_help (void)
|
|||
printf ("%s\n", _("Notes:"));
|
||||
printf ("%s\n", _("This plugin is a wrapper to take the output of another plugin and invert it."));
|
||||
printf ("%s\n", _("The full path of the plugin must be provided."));
|
||||
printf ("%s\n", _("If the wrapped plugin returns STATE_OK, the wrapper will return STATE_CRITICAL."));
|
||||
printf ("%s\n", _("If the wrapped plugin returns STATE_CRITICAL, the wrapper will return STATE_OK."));
|
||||
printf ("%s\n", _("If the wrapped plugin returns OK, the wrapper will return CRITICAL."));
|
||||
printf ("%s\n", _("If the wrapped plugin returns CRITICAL, the wrapper will return OK."));
|
||||
printf ("%s\n", _("Otherwise, the output state of the wrapped plugin is unchanged."));
|
||||
|
||||
printf (_(UT_SUPPORT));
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
#
|
||||
# Load Average Tests via check_load
|
||||
#
|
||||
# $Id: check_load.t 1700 2007-04-25 22:10:13Z tonvoon $
|
||||
# $Id: check_load.t 1851 2007-12-10 00:19:27Z psychotrahe $
|
||||
#
|
||||
|
||||
use strict;
|
||||
|
@ -11,10 +11,11 @@ use NPTest;
|
|||
|
||||
my $res;
|
||||
|
||||
my $successOutput = '/^OK - load average: [0-9]+\.?[0-9]+, [0-9]+\.?[0-9]+, [0-9]+\.?[0-9]+/';
|
||||
my $failureOutput = '/^CRITICAL - load average: [0-9]+\.?[0-9]+, [0-9]+\.?[0-9]+, [0-9]+\.?[0-9]+/';
|
||||
my $loadValue = "[0-9]+\.?[0-9]+";
|
||||
my $successOutput = "/^OK - load average: $loadValue, $loadValue, $loadValue/";
|
||||
my $failureOutput = "/^CRITICAL - load average: $loadValue, $loadValue, $loadValue/";
|
||||
|
||||
plan tests => 6;
|
||||
plan tests => 11;
|
||||
|
||||
$res = NPTest->testCmd( "./check_load -w 100,100,100 -c 100,100,100" );
|
||||
cmp_ok( $res->return_code, 'eq', 0, "load not over 100");
|
||||
|
@ -28,3 +29,9 @@ $res = NPTest->testCmd( "./check_load -r -w 0,0,0 -c 0,0,0" );
|
|||
cmp_ok( $res->return_code, 'eq', 2, "Load over 0 with per cpu division");
|
||||
like( $res->output, $failureOutput, "Output OK");
|
||||
|
||||
$res = NPTest->testCmd( "./check_load -w 100 -c 100,110" );
|
||||
cmp_ok( $res->return_code, 'eq', 0, "Plugin can handle non-triplet-arguments");
|
||||
like( $res->output, $successOutput, "Output OK");
|
||||
like( $res->perf_output, "/load1=$loadValue;100.000;100.000/", "Test handling of non triplet thresholds (load1)");
|
||||
like( $res->perf_output, "/load5=$loadValue;100.000;110.000/", "Test handling of non triplet thresholds (load5)");
|
||||
like( $res->perf_output, "/load15=$loadValue;100.000;110.000/", "Test handling of non triplet thresholds (load15)");
|
||||
|
|
|
@ -2,14 +2,17 @@
|
|||
#
|
||||
# Testing NTP
|
||||
#
|
||||
# $Id: check_ntp.t 1468 2006-08-14 08:42:23Z tonvoon $
|
||||
# $Id: check_ntp.t 1865 2007-12-11 13:54:23Z dermoth $
|
||||
#
|
||||
|
||||
use strict;
|
||||
use Test::More;
|
||||
use NPTest;
|
||||
|
||||
plan tests => 4;
|
||||
my @PLUGINS1 = ('check_ntp', 'check_ntp_peer', 'check_ntp_time');
|
||||
my @PLUGINS2 = ('check_ntp_peer');
|
||||
|
||||
plan tests => (12 * scalar(@PLUGINS1)) + (6 * scalar(@PLUGINS2));
|
||||
|
||||
my $res;
|
||||
|
||||
|
@ -25,33 +28,84 @@ my $host_nonresponsive = getTestParameter( "NP_HOST_NONRESPONSIVE",
|
|||
"The hostname of system not responsive to network requests",
|
||||
"10.0.0.1" );
|
||||
|
||||
my $hostname_invalid = getTestParameter( "NP_HOSTNAME_INVALID",
|
||||
my $hostname_invalid = getTestParameter( "NP_HOSTNAME_INVALID",
|
||||
"An invalid (not known to DNS) hostname",
|
||||
"nosuchhost");
|
||||
|
||||
SKIP: {
|
||||
skip "No NTP server defined", 1 unless $ntp_service;
|
||||
my $ntp_okmatch1 = '/^NTP\sOK:\sOffset\s-?[0-9]+(\.[0-9]+)?(e-[0-9]{2})?\ssecs/';
|
||||
my $ntp_warnmatch1 = '/^NTP\sWARNING:\sOffset\s-?[0-9]+(\.[0-9]+)?(e-[0-9]{2})?\ssecs/';
|
||||
my $ntp_critmatch1 = '/^NTP\sCRITICAL:\sOffset\s-?[0-9]+(\.[0-9]+)?(e-[0-9]{2})?\ssecs/';
|
||||
my $ntp_okmatch2 = '/^NTP\sOK:\sOffset\s-?[0-9]+(\.[0-9]+)?(e-[0-9]{2})?\ssecs,\sjitter=[0-9]+\.[0-9]+,\sstratum=[0-9]{1,2}/';
|
||||
my $ntp_warnmatch2 = '/^NTP\sWARNING:\sOffset\s-?[0-9]+(\.[0-9]+)?(e-[0-9]{2})?\ssecs,\sjitter=[0-9]+\.[0-9]+,\sstratum=[0-9]{1,2}/';
|
||||
my $ntp_critmatch2 = '/^NTP\sCRITICAL:\sOffset\s-?[0-9]+(\.[0-9]+)?(e-[0-9]{2})?\ssecs,\sjitter=[0-9]+\.[0-9]+,\sstratum=[0-9]{1,2}/';
|
||||
my $ntp_noresponse = '/^(CRITICAL - Socket timeout after 3 seconds)|(NTP CRITICAL: No response from NTP server)$/';
|
||||
my $ntp_nosuchhost = '/^check_ntp.*: Invalid hostname/address - ' . $hostname_invalid . '/';
|
||||
|
||||
|
||||
foreach my $plugin (@PLUGINS1) {
|
||||
SKIP: {
|
||||
skip "No NTP server defined", 1 unless $ntp_service;
|
||||
$res = NPTest->testCmd(
|
||||
"./$plugin -H $ntp_service -w 1000 -c 2000"
|
||||
);
|
||||
cmp_ok( $res->return_code, '==', 0, "$plugin: Good NTP result (simple check)" );
|
||||
like( $res->output, $ntp_okmatch1, "$plugin: Output match OK (simple check)" );
|
||||
|
||||
$res = NPTest->testCmd(
|
||||
"./$plugin -H $ntp_service -w 1000: -c 2000"
|
||||
);
|
||||
cmp_ok( $res->return_code, '==', 1, "$plugin: Warning NTP result (simple check)" );
|
||||
like( $res->output, $ntp_warnmatch1, "$plugin: Output match WARNING (simple check)" );
|
||||
|
||||
$res = NPTest->testCmd(
|
||||
"./$plugin -H $ntp_service -w 1000 -c 2000:"
|
||||
);
|
||||
cmp_ok( $res->return_code, '==', 2, "$plugin: Critical NTP result (simple check)" );
|
||||
like( $res->output, $ntp_critmatch1, "$plugin: Output match CRITICAL (simple check)" );
|
||||
}
|
||||
|
||||
SKIP: {
|
||||
skip "No bad NTP server defined", 1 unless $no_ntp_service;
|
||||
$res = NPTest->testCmd(
|
||||
"./$plugin -H $no_ntp_service -t 3"
|
||||
);
|
||||
cmp_ok( $res->return_code, '==', 2, "$plugin: No NTP service" );
|
||||
like( $res->output, $ntp_noresponse, "$plugin: Output match no NTP service" );
|
||||
}
|
||||
|
||||
$res = NPTest->testCmd(
|
||||
"./check_ntp -H $ntp_service"
|
||||
"./$plugin -H $host_nonresponsive -t 3"
|
||||
);
|
||||
cmp_ok( $res->return_code, '==', 0, "Got good NTP result");
|
||||
cmp_ok( $res->return_code, '==', 2, "$plugin: Server not responding" );
|
||||
like( $res->output, $ntp_noresponse, "$plugin: Output match non-responsive" );
|
||||
|
||||
$res = NPTest->testCmd(
|
||||
"./$plugin -H $hostname_invalid"
|
||||
);
|
||||
cmp_ok( $res->return_code, '==', 3, "$plugin: Invalid hostname/address" );
|
||||
like( $res->output, $ntp_nosuchhost, "$plugin: Output match invalid hostname/address" );
|
||||
|
||||
}
|
||||
|
||||
SKIP: {
|
||||
skip "No bad NTP server defined", 1 unless $no_ntp_service;
|
||||
$res = NPTest->testCmd(
|
||||
"./check_ntp -H $no_ntp_service"
|
||||
);
|
||||
cmp_ok( $res->return_code, '==', 2, "Got bad NTP result");
|
||||
foreach my $plugin (@PLUGINS2) {
|
||||
SKIP: {
|
||||
skip "No NTP server defined", 1 unless $ntp_service;
|
||||
$res = NPTest->testCmd(
|
||||
"./$plugin -H $ntp_service -w 1000 -c 2000 -W 20 -C 21 -j 100000 -k 200000"
|
||||
);
|
||||
cmp_ok( $res->return_code, '==', 0, "$plugin: Good NTP result with jitter and stratum check" );
|
||||
like( $res->output, $ntp_okmatch2, "$plugin: Output match OK with jitter and stratum" );
|
||||
|
||||
$res = NPTest->testCmd(
|
||||
"./$plugin -H $ntp_service -w 1000 -c 2000 -W \\~:-1 -C 21 -j 100000 -k 200000"
|
||||
);
|
||||
cmp_ok( $res->return_code, '==', 1, "$plugin: Warning NTP result with jitter and stratum check" );
|
||||
like( $res->output, $ntp_warnmatch2, "$plugin: Output match WARNING with jitter and stratum" );
|
||||
|
||||
$res = NPTest->testCmd(
|
||||
"./$plugin -H $ntp_service -w 1000 -c 2000 -W 20 -C 21 -j 100000 -k \\~:-1"
|
||||
);
|
||||
cmp_ok( $res->return_code, '==', 2, "$plugin: Critical NTP result with jitter and stratum check" );
|
||||
like( $res->output, $ntp_critmatch2, "$plugin: Output match CRITICAL with jitter and stratum" );
|
||||
}
|
||||
}
|
||||
|
||||
$res = NPTest->testCmd(
|
||||
"./check_ntp -H $host_nonresponsive"
|
||||
);
|
||||
cmp_ok( $res->return_code, '==', 2, "Got critical if server not responding");
|
||||
|
||||
$res = NPTest->testCmd(
|
||||
"./check_ntp -H $hostname_invalid"
|
||||
);
|
||||
cmp_ok( $res->return_code, '==', 3, "Got critical if server hostname invalid");
|
||||
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
* Copyright (c) 2006 Nagios Plugin Development Team
|
||||
* License: GPL
|
||||
*
|
||||
* $Revision: 1752 $
|
||||
* $Date: 2007-07-07 13:02:45 +0100 (Sat, 07 Jul 2007) $
|
||||
* $Revision: 1829 $
|
||||
* $Date: 2007-11-23 04:18:16 +0000 (Fri, 23 Nov 2007) $
|
||||
****************************************************************************/
|
||||
|
||||
#define LOCAL_TIMEOUT_ALARM_HANDLER
|
||||
|
@ -53,6 +53,33 @@ max_state (int a, int b)
|
|||
return max (a, b);
|
||||
}
|
||||
|
||||
/* **************************************************************************
|
||||
* max_state_alt(STATE_x, STATE_y)
|
||||
* compares STATE_x to STATE_y and returns result based on the following
|
||||
* STATE_OK < STATE_DEPENDENT < STATE_UNKNOWN < STATE_WARNING < STATE_CRITICAL
|
||||
*
|
||||
* The main difference between max_state_alt and max_state it that it doesn't
|
||||
* allow setting a default to UNKNOWN. It will instead prioritixe any valid
|
||||
* non-OK state.
|
||||
****************************************************************************/
|
||||
|
||||
int
|
||||
max_state_alt (int a, int b)
|
||||
{
|
||||
if (a == STATE_CRITICAL || b == STATE_CRITICAL)
|
||||
return STATE_CRITICAL;
|
||||
else if (a == STATE_WARNING || b == STATE_WARNING)
|
||||
return STATE_WARNING;
|
||||
else if (a == STATE_UNKNOWN || b == STATE_UNKNOWN)
|
||||
return STATE_UNKNOWN;
|
||||
else if (a == STATE_DEPENDENT || b == STATE_DEPENDENT)
|
||||
return STATE_DEPENDENT;
|
||||
else if (a == STATE_OK || b == STATE_OK)
|
||||
return STATE_OK;
|
||||
else
|
||||
return max (a, b);
|
||||
}
|
||||
|
||||
void usage (const char *msg)
|
||||
{
|
||||
printf ("%s\n", msg);
|
||||
|
|
|
@ -18,7 +18,7 @@ suite of plugins. */
|
|||
|
||||
/* Standardize version information, termination */
|
||||
|
||||
/* $Id: utils.h 1590 2007-01-28 21:46:41Z hweiss $ */
|
||||
/* $Id: utils.h 1829 2007-11-23 04:18:16Z dermoth $ */
|
||||
|
||||
void support (void);
|
||||
char *clean_revstring (const char *);
|
||||
|
@ -76,6 +76,7 @@ char *strpcpy (char *, const char *, const char *);
|
|||
char *strpcat (char *, const char *, const char *);
|
||||
|
||||
int max_state (int a, int b);
|
||||
int max_state_alt (int a, int b);
|
||||
|
||||
void usage (const char *) __attribute__((noreturn));
|
||||
void usage2(const char *, const char *) __attribute__((noreturn));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue