diff options
author | linkslice <sparctacus@gmail.com> | 2012-06-06 21:35:34 -0700 |
---|---|---|
committer | Holger Weiss <holger@zedat.fu-berlin.de> | 2013-08-18 18:23:11 +0200 |
commit | 2a8eab6b31e0f461e52b504776caad6bb93b981f (patch) | |
tree | 087ab01032764d366d91849a619489b73d3c776c | |
parent | 0eeb8cde6756c1280f4925ba479d378541bbce04 (diff) | |
download | monitoring-plugins-2a8eab6b31e0f461e52b504776caad6bb93b981f.tar.gz |
added ability to check regex against http headers. booyah!
-rw-r--r-- | plugins/check_http.c | 24 | ||||
-rwxr-xr-x | plugins/tests/check_http.t | 11 |
2 files changed, 33 insertions, 2 deletions
diff --git a/plugins/check_http.c b/plugins/check_http.c index 6db38e8c..52040281 100644 --- a/plugins/check_http.c +++ b/plugins/check_http.c | |||
@@ -100,7 +100,9 @@ char *user_agent; | |||
100 | int server_url_length; | 100 | int server_url_length; |
101 | int server_expect_yn = 0; | 101 | int server_expect_yn = 0; |
102 | char server_expect[MAX_INPUT_BUFFER] = HTTP_EXPECT; | 102 | char server_expect[MAX_INPUT_BUFFER] = HTTP_EXPECT; |
103 | char header_expect[MAX_INPUT_BUFFER] = ""; | ||
103 | char string_expect[MAX_INPUT_BUFFER] = ""; | 104 | char string_expect[MAX_INPUT_BUFFER] = ""; |
105 | char output_header_search[30] = ""; | ||
104 | char output_string_search[30] = ""; | 106 | char output_string_search[30] = ""; |
105 | char *warning_thresholds = NULL; | 107 | char *warning_thresholds = NULL; |
106 | char *critical_thresholds = NULL; | 108 | char *critical_thresholds = NULL; |
@@ -205,6 +207,7 @@ process_arguments (int argc, char **argv) | |||
205 | {"port", required_argument, 0, 'p'}, | 207 | {"port", required_argument, 0, 'p'}, |
206 | {"authorization", required_argument, 0, 'a'}, | 208 | {"authorization", required_argument, 0, 'a'}, |
207 | {"proxy_authorization", required_argument, 0, 'b'}, | 209 | {"proxy_authorization", required_argument, 0, 'b'}, |
210 | {"header_string", required_argument, 0, 'd'}, | ||
208 | {"string", required_argument, 0, 's'}, | 211 | {"string", required_argument, 0, 's'}, |
209 | {"expect", required_argument, 0, 'e'}, | 212 | {"expect", required_argument, 0, 'e'}, |
210 | {"regex", required_argument, 0, 'r'}, | 213 | {"regex", required_argument, 0, 'r'}, |
@@ -243,7 +246,7 @@ process_arguments (int argc, char **argv) | |||
243 | } | 246 | } |
244 | 247 | ||
245 | while (1) { | 248 | while (1) { |
246 | c = getopt_long (argc, argv, "Vvh46t:c:w:A:k:H:P:j:T:I:a:b:e:p:s:R:r:u:f:C:nlLS::m:M:N:E", longopts, &option); | 249 | c = getopt_long (argc, argv, "Vvh46t:c:w:A:k:H:P:j:T:I:a:b:d:e:p:s:R:r:u:f:C:nlLS::m:M:N:E", longopts, &option); |
247 | if (c == -1 || c == EOF) | 250 | if (c == -1 || c == EOF) |
248 | break; | 251 | break; |
249 | 252 | ||
@@ -392,6 +395,10 @@ process_arguments (int argc, char **argv) | |||
392 | free(http_method); | 395 | free(http_method); |
393 | http_method = strdup (optarg); | 396 | http_method = strdup (optarg); |
394 | break; | 397 | break; |
398 | case 'd': /* string or substring */ | ||
399 | strncpy (header_expect, optarg, MAX_INPUT_BUFFER - 1); | ||
400 | header_expect[MAX_INPUT_BUFFER - 1] = 0; | ||
401 | break; | ||
395 | case 's': /* string or substring */ | 402 | case 's': /* string or substring */ |
396 | strncpy (string_expect, optarg, MAX_INPUT_BUFFER - 1); | 403 | strncpy (string_expect, optarg, MAX_INPUT_BUFFER - 1); |
397 | string_expect[MAX_INPUT_BUFFER - 1] = 0; | 404 | string_expect[MAX_INPUT_BUFFER - 1] = 0; |
@@ -1085,6 +1092,17 @@ check_http (void) | |||
1085 | } | 1092 | } |
1086 | 1093 | ||
1087 | /* Page and Header content checks go here */ | 1094 | /* Page and Header content checks go here */ |
1095 | if (strlen (header_expect)) { | ||
1096 | if (!strstr (header, header_expect)) { | ||
1097 | strncpy(&output_header_search[0],header_expect,sizeof(output_header_search)); | ||
1098 | if(output_header_search[sizeof(output_header_search)-1]!='\0') { | ||
1099 | bcopy("...",&output_header_search[sizeof(output_header_search)-4],4); | ||
1100 | } | ||
1101 | asprintf (&msg, _("%sheader '%s' not found on '%s://%s:%d%s', "), msg, output_header_search, use_ssl ? "https" : "http", host_name ? host_name : server_address, server_port, server_url); | ||
1102 | result = STATE_CRITICAL; | ||
1103 | } | ||
1104 | } | ||
1105 | |||
1088 | 1106 | ||
1089 | if (strlen (string_expect)) { | 1107 | if (strlen (string_expect)) { |
1090 | if (!strstr (page, string_expect)) { | 1108 | if (!strstr (page, string_expect)) { |
@@ -1434,6 +1452,8 @@ print_help (void) | |||
1434 | printf (" %s", _("the first (status) line of the server response (default: ")); | 1452 | printf (" %s", _("the first (status) line of the server response (default: ")); |
1435 | printf ("%s)\n", HTTP_EXPECT); | 1453 | printf ("%s)\n", HTTP_EXPECT); |
1436 | printf (" %s\n", _("If specified skips all other status line logic (ex: 3xx, 4xx, 5xx processing)")); | 1454 | printf (" %s\n", _("If specified skips all other status line logic (ex: 3xx, 4xx, 5xx processing)")); |
1455 | printf (" %s\n", "-d, --header-string=STRING"); | ||
1456 | printf (" %s\n", _("String to expect in the response headers")); | ||
1437 | printf (" %s\n", "-s, --string=STRING"); | 1457 | printf (" %s\n", "-s, --string=STRING"); |
1438 | printf (" %s\n", _("String to expect in the content")); | 1458 | printf (" %s\n", _("String to expect in the content")); |
1439 | printf (" %s\n", "-u, --url=PATH"); | 1459 | printf (" %s\n", "-u, --url=PATH"); |
@@ -1535,7 +1555,7 @@ print_usage (void) | |||
1535 | printf (" %s -H <vhost> | -I <IP-address> [-u <uri>] [-p <port>]\n",progname); | 1555 | printf (" %s -H <vhost> | -I <IP-address> [-u <uri>] [-p <port>]\n",progname); |
1536 | printf (" [-w <warn time>] [-c <critical time>] [-t <timeout>] [-L] [-a auth]\n"); | 1556 | printf (" [-w <warn time>] [-c <critical time>] [-t <timeout>] [-L] [-a auth]\n"); |
1537 | printf (" [-b proxy_auth] [-f <ok|warning|critcal|follow|sticky|stickyport>]\n"); | 1557 | printf (" [-b proxy_auth] [-f <ok|warning|critcal|follow|sticky|stickyport>]\n"); |
1538 | printf (" [-e <expect>] [-s string] [-l] [-r <regex> | -R <case-insensitive regex>]\n"); | 1558 | printf (" [-e <expect>] [-d string] [-s string] [-l] [-r <regex> | -R <case-insensitive regex>]\n"); |
1539 | printf (" [-P string] [-m <min_pg_size>:<max_pg_size>] [-4|-6] [-N] [-M <age>]\n"); | 1559 | printf (" [-P string] [-m <min_pg_size>:<max_pg_size>] [-4|-6] [-N] [-M <age>]\n"); |
1540 | printf (" [-A string] [-k string] [-S <version>] [--sni] [-C <warn_age>[,<crit_age>]]\n"); | 1560 | printf (" [-A string] [-k string] [-S <version>] [--sni] [-C <warn_age>[,<crit_age>]]\n"); |
1541 | printf (" [-T <content-type>] [-j method]\n"); | 1561 | printf (" [-T <content-type>] [-j method]\n"); |
diff --git a/plugins/tests/check_http.t b/plugins/tests/check_http.t index 9f97abdc..873fd6ec 100755 --- a/plugins/tests/check_http.t +++ b/plugins/tests/check_http.t | |||
@@ -151,6 +151,10 @@ sub run_server { | |||
151 | unshift @persist, $c; | 151 | unshift @persist, $c; |
152 | delete($persist[1000]); | 152 | delete($persist[1000]); |
153 | next MAINLOOP; | 153 | next MAINLOOP; |
154 | } elsif ($r->url->path eq "/header_check") { | ||
155 | $c->send_basic_header; | ||
156 | $c->send_header('foo'); | ||
157 | $c->send_crlf; | ||
154 | } else { | 158 | } else { |
155 | $c->send_error(HTTP::Status->RC_FORBIDDEN); | 159 | $c->send_error(HTTP::Status->RC_FORBIDDEN); |
156 | } | 160 | } |
@@ -223,6 +227,13 @@ sub run_common_tests { | |||
223 | is( $result->return_code, 2, "Missing string check"); | 227 | is( $result->return_code, 2, "Missing string check"); |
224 | like( $result->output, qr%HTTP CRITICAL: HTTP/1\.1 200 OK - string 'NonRootWithOver30charsAndM...' not found on 'https?://127\.0\.0\.1:\d+/file/root'%, "Shows search string and location"); | 228 | like( $result->output, qr%HTTP CRITICAL: HTTP/1\.1 200 OK - string 'NonRootWithOver30charsAndM...' not found on 'https?://127\.0\.0\.1:\d+/file/root'%, "Shows search string and location"); |
225 | 229 | ||
230 | $result = NPTest->testCmd( "$command -u /header_check -d foo" ); | ||
231 | is( $result->return_code, 0, "header_check search for string"); | ||
232 | like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - 274 bytes in [\d\.]+ second/', "Output correct" ); | ||
233 | |||
234 | $result = NPTest->testCmd( "$command -u /header_check -d foobar" ); | ||
235 | is( $result->return_code, 2, "Missing header string check"); | ||
236 | like( $result->output, qr%^HTTP CRITICAL: HTTP/1\.1 200 OK - string 'foobar' not found on 'https?://127\.0\.0\.1:\d+/header_check/root'%, "Shows search string and location"); | ||
226 | 237 | ||
227 | my $cmd; | 238 | my $cmd; |
228 | $cmd = "$command -u /slow"; | 239 | $cmd = "$command -u /slow"; |