diff options
| author | Thomas Guyot-Sionnest <dermoth@users.sourceforge.net> | 2007-10-11 04:21:27 +0000 |
|---|---|---|
| committer | Thomas Guyot-Sionnest <dermoth@users.sourceforge.net> | 2007-10-11 04:21:27 +0000 |
| commit | 474d1713cee4227f133e416192760e1aa8632ee2 (patch) | |
| tree | 1b1e547b64bc79444eb1d79a964d8a91b5eda77a | |
| parent | 998bb7dc4be6060f87c1c468a30e8ccfd5219ba8 (diff) | |
| download | monitoring-plugins-474d1713cee4227f133e416192760e1aa8632ee2.tar.gz | |
Add stratum thresholds support for check_ntp (feature request #1703823)
git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@1806 f882894a-f735-0410-b71e-b25c423dba1c
| -rw-r--r-- | NEWS | 1 | ||||
| -rw-r--r-- | plugins/check_ntp.c | 71 |
2 files changed, 57 insertions, 15 deletions
| @@ -3,6 +3,7 @@ This file documents the major additions and syntax changes between releases. | |||
| 3 | 1.4.11 or 1.5 ?? | 3 | 1.4.11 or 1.5 ?? |
| 4 | Fix check_http regression in 1.4.10 where following redirects to | 4 | Fix check_http regression in 1.4.10 where following redirects to |
| 5 | relative URLs on virtual hosts failed if both "-H" and "-I" were used | 5 | relative URLs on virtual hosts failed if both "-H" and "-I" were used |
| 6 | Add stratum thresholds support to check_ntp (feature request #1703823) | ||
| 6 | 7 | ||
| 7 | 1.4.10 28th September 2007 | 8 | 1.4.10 28th September 2007 |
| 8 | Fix check_http buffer overflow vulnerability when following HTTP redirects | 9 | Fix check_http buffer overflow vulnerability when following HTTP redirects |
diff --git a/plugins/check_ntp.c b/plugins/check_ntp.c index 6c7c1e7d..12334f77 100644 --- a/plugins/check_ntp.c +++ b/plugins/check_ntp.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * | 4 | * |
| 5 | * License: GPL | 5 | * License: GPL |
| 6 | * Copyright (c) 2006 sean finney <seanius@seanius.net> | 6 | * Copyright (c) 2006 sean finney <seanius@seanius.net> |
| 7 | * Copyright (c) 2006 nagios-plugins team | 7 | * Copyright (c) 2007 nagios-plugins team |
| 8 | * | 8 | * |
| 9 | * Last Modified: $Date$ | 9 | * Last Modified: $Date$ |
| 10 | * | 10 | * |
| @@ -38,7 +38,7 @@ | |||
| 38 | 38 | ||
| 39 | const char *progname = "check_ntp"; | 39 | const char *progname = "check_ntp"; |
| 40 | const char *revision = "$Revision$"; | 40 | const char *revision = "$Revision$"; |
| 41 | const char *copyright = "2006"; | 41 | const char *copyright = "2007"; |
| 42 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; | 42 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; |
| 43 | 43 | ||
| 44 | #include "common.h" | 44 | #include "common.h" |
| @@ -47,9 +47,11 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net"; | |||
| 47 | 47 | ||
| 48 | static char *server_address=NULL; | 48 | static char *server_address=NULL; |
| 49 | static int verbose=0; | 49 | static int verbose=0; |
| 50 | static int stratum=-1; | ||
| 51 | static char *owarn="60"; | 50 | static char *owarn="60"; |
| 52 | static char *ocrit="120"; | 51 | static char *ocrit="120"; |
| 52 | static short do_stratum=0; | ||
| 53 | static char *swarn="16"; | ||
| 54 | static char *scrit="16"; | ||
| 53 | static short do_jitter=0; | 55 | static short do_jitter=0; |
| 54 | static char *jwarn="5000"; | 56 | static char *jwarn="5000"; |
| 55 | static char *jcrit="10000"; | 57 | static char *jcrit="10000"; |
| @@ -57,6 +59,7 @@ static char *jcrit="10000"; | |||
| 57 | int process_arguments (int, char **); | 59 | int process_arguments (int, char **); |
| 58 | thresholds *offset_thresholds = NULL; | 60 | thresholds *offset_thresholds = NULL; |
| 59 | thresholds *jitter_thresholds = NULL; | 61 | thresholds *jitter_thresholds = NULL; |
| 62 | thresholds *stratum_thresholds = NULL; | ||
| 60 | void print_help (void); | 63 | void print_help (void); |
| 61 | void print_usage (void); | 64 | void print_usage (void); |
| 62 | 65 | ||
| @@ -357,7 +360,7 @@ int best_offset_server(const ntp_server_results *slist, int nservers){ | |||
| 357 | * we don't waste time sitting around waiting for single packets. | 360 | * we don't waste time sitting around waiting for single packets. |
| 358 | * - we also "manually" handle resolving host names and connecting, because | 361 | * - we also "manually" handle resolving host names and connecting, because |
| 359 | * we have to do it in a way that our lazy macros don't handle currently :( */ | 362 | * we have to do it in a way that our lazy macros don't handle currently :( */ |
| 360 | double offset_request(const char *host, int *status){ | 363 | double offset_request(const char *host, int *stratum, int *status){ |
| 361 | int i=0, j=0, ga_result=0, num_hosts=0, *socklist=NULL, respnum=0; | 364 | int i=0, j=0, ga_result=0, num_hosts=0, *socklist=NULL, respnum=0; |
| 362 | int servers_completed=0, one_written=0, one_read=0, servers_readable=0, best_index=-1; | 365 | int servers_completed=0, one_written=0, one_read=0, servers_readable=0, best_index=-1; |
| 363 | time_t now_time=0, start_ts=0; | 366 | time_t now_time=0, start_ts=0; |
| @@ -454,7 +457,7 @@ double offset_request(const char *host, int *status){ | |||
| 454 | respnum=servers[i].num_responses++; | 457 | respnum=servers[i].num_responses++; |
| 455 | servers[i].offset[respnum]=calc_offset(&req[i], &recv_time); | 458 | servers[i].offset[respnum]=calc_offset(&req[i], &recv_time); |
| 456 | if(verbose) { | 459 | if(verbose) { |
| 457 | printf("offset %.10g\n", servers[i].offset[respnum]); | 460 | printf("offset %.10g, stratum %i\n", servers[i].offset[respnum], req[i].stratum); |
| 458 | } | 461 | } |
| 459 | servers[i].stratum=req[i].stratum; | 462 | servers[i].stratum=req[i].stratum; |
| 460 | servers[i].rtdisp=NTP32asDOUBLE(req[i].rtdisp); | 463 | servers[i].rtdisp=NTP32asDOUBLE(req[i].rtdisp); |
| @@ -483,6 +486,7 @@ double offset_request(const char *host, int *status){ | |||
| 483 | avg_offset+=servers[best_index].offset[j]; | 486 | avg_offset+=servers[best_index].offset[j]; |
| 484 | } | 487 | } |
| 485 | avg_offset/=servers[best_index].num_responses; | 488 | avg_offset/=servers[best_index].num_responses; |
| 489 | *stratum = servers[best_index].stratum; | ||
| 486 | } | 490 | } |
| 487 | 491 | ||
| 488 | /* cleanup */ | 492 | /* cleanup */ |
| @@ -660,6 +664,8 @@ int process_arguments(int argc, char **argv){ | |||
| 660 | {"use-ipv6", no_argument, 0, '6'}, | 664 | {"use-ipv6", no_argument, 0, '6'}, |
| 661 | {"warning", required_argument, 0, 'w'}, | 665 | {"warning", required_argument, 0, 'w'}, |
| 662 | {"critical", required_argument, 0, 'c'}, | 666 | {"critical", required_argument, 0, 'c'}, |
| 667 | {"swarn", required_argument, 0, 'W'}, | ||
| 668 | {"scrit", required_argument, 0, 'C'}, | ||
| 663 | {"jwarn", required_argument, 0, 'j'}, | 669 | {"jwarn", required_argument, 0, 'j'}, |
| 664 | {"jcrit", required_argument, 0, 'k'}, | 670 | {"jcrit", required_argument, 0, 'k'}, |
| 665 | {"timeout", required_argument, 0, 't'}, | 671 | {"timeout", required_argument, 0, 't'}, |
| @@ -672,7 +678,7 @@ int process_arguments(int argc, char **argv){ | |||
| 672 | usage ("\n"); | 678 | usage ("\n"); |
| 673 | 679 | ||
| 674 | while (1) { | 680 | while (1) { |
| 675 | c = getopt_long (argc, argv, "Vhv46w:c:j:k:t:H:", longopts, &option); | 681 | c = getopt_long (argc, argv, "Vhv46w:c:W:C:j:k:t:H:", longopts, &option); |
| 676 | if (c == -1 || c == EOF || c == 1) | 682 | if (c == -1 || c == EOF || c == 1) |
| 677 | break; | 683 | break; |
| 678 | 684 | ||
| @@ -694,6 +700,14 @@ int process_arguments(int argc, char **argv){ | |||
| 694 | case 'c': | 700 | case 'c': |
| 695 | ocrit = optarg; | 701 | ocrit = optarg; |
| 696 | break; | 702 | break; |
| 703 | case 'W': | ||
| 704 | do_stratum=1; | ||
| 705 | swarn = optarg; | ||
| 706 | break; | ||
| 707 | case 'C': | ||
| 708 | do_stratum=1; | ||
| 709 | scrit = optarg; | ||
| 710 | break; | ||
| 697 | case 'j': | 711 | case 'j': |
| 698 | do_jitter=1; | 712 | do_jitter=1; |
| 699 | jwarn = optarg; | 713 | jwarn = optarg; |
| @@ -750,8 +764,16 @@ char *perfd_jitter (double jitter) | |||
| 750 | TRUE, 0, FALSE, 0); | 764 | TRUE, 0, FALSE, 0); |
| 751 | } | 765 | } |
| 752 | 766 | ||
| 767 | char *perfd_stratum (int stratum) | ||
| 768 | { | ||
| 769 | return perfdata ("stratum", stratum, "", | ||
| 770 | do_stratum, (int)stratum_thresholds->warning->end, | ||
| 771 | do_stratum, (int)stratum_thresholds->critical->end, | ||
| 772 | TRUE, 0, TRUE, 16); | ||
| 773 | } | ||
| 774 | |||
| 753 | int main(int argc, char *argv[]){ | 775 | int main(int argc, char *argv[]){ |
| 754 | int result, offset_result, jitter_result; | 776 | int result, offset_result, jitter_result, stratum; |
| 755 | double offset=0, jitter=0; | 777 | double offset=0, jitter=0; |
| 756 | char *result_line, *perfdata_line; | 778 | char *result_line, *perfdata_line; |
| 757 | 779 | ||
| @@ -762,6 +784,7 @@ int main(int argc, char *argv[]){ | |||
| 762 | 784 | ||
| 763 | set_thresholds(&offset_thresholds, owarn, ocrit); | 785 | set_thresholds(&offset_thresholds, owarn, ocrit); |
| 764 | set_thresholds(&jitter_thresholds, jwarn, jcrit); | 786 | set_thresholds(&jitter_thresholds, jwarn, jcrit); |
| 787 | set_thresholds(&stratum_thresholds, swarn, scrit); | ||
| 765 | 788 | ||
| 766 | /* initialize alarm signal handling */ | 789 | /* initialize alarm signal handling */ |
| 767 | signal (SIGALRM, socket_timeout_alarm_handler); | 790 | signal (SIGALRM, socket_timeout_alarm_handler); |
| @@ -769,9 +792,11 @@ int main(int argc, char *argv[]){ | |||
| 769 | /* set socket timeout */ | 792 | /* set socket timeout */ |
| 770 | alarm (socket_timeout); | 793 | alarm (socket_timeout); |
| 771 | 794 | ||
| 772 | offset = offset_request(server_address, &offset_result); | 795 | offset = offset_request(server_address, &stratum, &offset_result); |
| 773 | result = get_status(fabs(offset), offset_thresholds); | 796 | result = get_status(fabs(offset), offset_thresholds); |
| 774 | result = max_state(result, offset_result); | 797 | result = max_state(result, offset_result); |
| 798 | if(do_stratum) | ||
| 799 | result = max_state(result, get_status(stratum, stratum_thresholds)); | ||
| 775 | 800 | ||
| 776 | /* If not told to check the jitter, we don't even send packets. | 801 | /* If not told to check the jitter, we don't even send packets. |
| 777 | * jitter is checked using NTP control packets, which not all | 802 | * jitter is checked using NTP control packets, which not all |
| @@ -816,6 +841,10 @@ int main(int argc, char *argv[]){ | |||
| 816 | asprintf(&result_line, "%s, jitter=%f", result_line, jitter); | 841 | asprintf(&result_line, "%s, jitter=%f", result_line, jitter); |
| 817 | asprintf(&perfdata_line, "%s %s", perfdata_line, perfd_jitter(jitter)); | 842 | asprintf(&perfdata_line, "%s %s", perfdata_line, perfd_jitter(jitter)); |
| 818 | } | 843 | } |
| 844 | if (do_stratum) { | ||
| 845 | asprintf(&result_line, "%s, stratum=%i", result_line, stratum); | ||
| 846 | asprintf(&perfdata_line, "%s %s", perfdata_line, perfd_stratum(stratum)); | ||
| 847 | } | ||
| 819 | printf("%s|%s\n", result_line, perfdata_line); | 848 | printf("%s|%s\n", result_line, perfdata_line); |
| 820 | 849 | ||
| 821 | if(server_address!=NULL) free(server_address); | 850 | if(server_address!=NULL) free(server_address); |
| @@ -837,16 +866,27 @@ void print_help(void){ | |||
| 837 | print_usage(); | 866 | print_usage(); |
| 838 | printf (_(UT_HELP_VRSN)); | 867 | printf (_(UT_HELP_VRSN)); |
| 839 | printf (_(UT_HOST_PORT), 'p', "123"); | 868 | printf (_(UT_HOST_PORT), 'p', "123"); |
| 840 | printf (" %s\n", "-w, --warning=DOUBLE"); | 869 | printf (" %s\n", "-w, --warning=THRESHOLD"); |
| 841 | printf (" %s\n", _("Offset to result in warning status (seconds)")); | 870 | printf (" %s\n", _("Offset to result in warning status (seconds)")); |
| 842 | printf (" %s\n", "-c, --critical=DOUBLE"); | 871 | printf (" %s\n", "-c, --critical=THRESHOLD"); |
| 843 | printf (" %s\n", _("Offset to result in critical status (seconds)")); | 872 | printf (" %s\n", _("Offset to result in critical status (seconds)")); |
| 844 | printf (" %s\n", "-j, --warning=DOUBLE"); | 873 | printf (" %s\n", "-W, --warning=THRESHOLD"); |
| 845 | printf (" %s\n", _("Warning value for jitter")); | 874 | printf (" %s\n", _("Warning threshold for stratum")); |
| 846 | printf (" %s\n", "-k, --critical=DOUBLE"); | 875 | printf (" %s\n", "-W, --critical=THRESHOLD"); |
| 847 | printf (" %s\n", _("Critical value for jitter")); | 876 | printf (" %s\n", _("Critical threshold for stratum")); |
| 877 | printf (" %s\n", "-j, --warning=THRESHOLD"); | ||
| 878 | printf (" %s\n", _("Warning threshold for jitter")); | ||
| 879 | printf (" %s\n", "-k, --critical=THRESHOLD"); | ||
| 880 | printf (" %s\n", _("Critical threshold for jitter")); | ||
| 848 | printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT); | 881 | printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT); |
| 849 | printf (_(UT_VERBOSE)); | 882 | printf (_(UT_VERBOSE)); |
| 883 | |||
| 884 | printf("\n"); | ||
| 885 | printf("%s\n", _("Notes:")); | ||
| 886 | printf(" %s\n", _("See:")); | ||
| 887 | printf(" %s\n", ("http://nagiosplug.sourceforge.net/developer-guidelines.html#THRESHOLDFORMAT")); | ||
| 888 | printf(" %s\n", _("for THRESHOLD format and examples.")); | ||
| 889 | |||
| 850 | printf (_(UT_SUPPORT)); | 890 | printf (_(UT_SUPPORT)); |
| 851 | } | 891 | } |
| 852 | 892 | ||
| @@ -854,5 +894,6 @@ void | |||
| 854 | print_usage(void) | 894 | print_usage(void) |
| 855 | { | 895 | { |
| 856 | printf (_("Usage:")); | 896 | printf (_("Usage:")); |
| 857 | printf("%s -H <host> [-w <warn>] [-c <crit>] [-j <warn>] [-k <crit>] [-v verbose]\n", progname); | 897 | printf(" %s -H <host> [-w <warn>] [-c <crit>] [-W <warn>] [-C <crit>]\n", progname); |
| 898 | printf(" [-j <warn>] [-k <crit>] [-v verbose]\n"); | ||
| 858 | } | 899 | } |
