index 22e78fba3bbc91a1de8c8ecf60056d4ffc0ac015..ea24a0e7f9f3f6e301e4c04b36c9114969767268 100644 (file)
--- a/plugins/check_ntp_time.c
+++ b/plugins/check_ntp_time.c
-/******************************************************************************
-*
+/*****************************************************************************
+*
* Nagios check_ntp_time plugin
-*
+*
* License: GPL
-* Copyright (c) 2006 sean finney <seanius@seanius.net>
-* Copyright (c) 2007 nagios-plugins team
-*
+* Copyright (c) 2006 Sean Finney <seanius@seanius.net>
+* Copyright (c) 2006-2008 Nagios Plugins Development Team
+*
* Last Modified: $Date$
-*
+*
* 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
+*
+* 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.
+*
+*
+* 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
+* the Free Software Foundation, either version 3 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$
-
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+* $Id$
+*
*****************************************************************************/
-const char *progname = "check_ntp";
+const char *progname = "check_ntp_time";
const char *revision = "$Revision$";
-const char *copyright = "2007";
+const char *copyright = "2006-2008";
const char *email = "nagiosplug-devel@lists.sourceforge.net";
#include "common.h"
* 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;
+ int i=0, cserver=0, best_server=-1;
/* 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;
+ /* We don't want any servers that fails these tests */
+ /* Sort out servers that didn't respond or responede with a 0 stratum;
+ * stratum 0 is for reference clocks so no NTP server should ever report
+ * a stratum 0 */
+ if ( slist[cserver].stratum == 0){
+ if (verbose) printf("discarding peer %d: stratum=%d\n", cserver, slist[cserver].stratum);
+ continue;
+ }
+ /* Sort out servers with error flags */
+ if ( LI(slist[cserver].flags) == LI_ALARM ){
+ if (verbose) printf("discarding peer %d: flags=%d\n", cserver, LI(slist[cserver].flags));
+ continue;
}
- /* 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 don't have a server yet, use the first one */
+ if (best_server == -1) {
+ best_server = cserver;
+ DBG(printf("using peer %d as our first candidate\n", best_server));
+ continue;
}
- /* 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];
+ /* compare the server to the best one we've seen so far */
+ /* does it have an equal or better stratum? */
+ DBG(printf("comparing peer %d with peer %d\n", cserver, best_server));
+ if(slist[cserver].stratum <= slist[best_server].stratum){
+ DBG(printf("stratum for peer %d <= peer %d\n", cserver, best_server));
+ /* does it have an equal or better dispersion? */
+ if(slist[cserver].rtdisp <= slist[best_server].rtdisp){
+ DBG(printf("dispersion for peer %d <= peer %d\n", cserver, best_server));
+ /* does it have a better rtdelay? */
+ if(slist[cserver].rtdelay < slist[best_server].rtdelay){
+ DBG(printf("rtdelay for peer %d < peer %d\n", cserver, best_server));
+ best_server = cserver;
+ DBG(printf("peer %d is now our best candidate\n", best_server));
+ }
}
}
- /* 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];
+ if(best_server >= 0) {
+ DBG(printf("best server selected: peer %d\n", best_server));
+ return best_server;
} else {
DBG(printf("no peers meeting synchronization criteria :(\n"));
return -1;
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);
+ DBG(printf("Found %d peers to check\n", num_hosts));
/* setup each socket for writing, and the corresponding struct pollfd */
ai_tmp=ai;
double offset=0;
char *result_line, *perfdata_line;
+ setlocale (LC_ALL, "");
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+
result = offset_result = STATE_OK;
+ /* Parse extra opts if any */
+ argv=np_extra_opts (&argc, argv, progname);
+
if (process_arguments (argc, argv) == ERROR)
usage4 (_("Could not parse arguments"));
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_UNKNOWN){
asprintf(&result_line, "%s %s", result_line, _("Offset unknown"));
asprintf(&perfdata_line, "");
} else {
- 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));
}
printf("%s|%s\n", result_line, perfdata_line);
print_usage();
printf (_(UT_HELP_VRSN));
+ printf (_(UT_EXTRA_OPTS));
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 (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT);
printf (_(UT_VERBOSE));
+ printf("\n");
+ 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", _("external libraries."));
+
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(" %s\n", _("check_ntp_peer."));
+ printf("\n");
+ printf(_(UT_THRESHOLDS_NOTES));
+#ifdef NP_EXTRA_OPTS
+ printf("\n");
+ printf(_(UT_EXTRA_OPTS_NOTES));
+#endif
printf("\n");
printf("%s\n", _("Examples:"));
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");
+ printf(" %s -H <host> [-w <warn>] [-c <crit>] [-v verbose]\n", progname);
}