[monitoring-plugins] added POST support (-P/-T options)
Andreas Baumann
git at monitoring-plugins.org
Sun Mar 19 18:20:12 CET 2017
Module: monitoring-plugins
Branch: feature_check_curl
Commit: 244712dd91615bd1a728b3d57ac55b6c71e4ddb0
Author: Andreas Baumann <mail at andreasbaumann.cc>
Date: Sun Mar 19 18:19:51 2017 +0100
URL: https://www.monitoring-plugins.org/repositories/monitoring-plugins/commit/?id=244712d
added POST support (-P/-T options)
---
plugins/check_curl.c | 38 +++++++++++++++++++++++++++++++++-----
1 file changed, 33 insertions(+), 5 deletions(-)
diff --git a/plugins/check_curl.c b/plugins/check_curl.c
index f6eaba6..4129acc 100644
--- a/plugins/check_curl.c
+++ b/plugins/check_curl.c
@@ -107,6 +107,8 @@ int show_extended_perfdata = FALSE;
int min_page_len = 0;
int max_page_len = 0;
char *http_method = NULL;
+char *http_post_data = NULL;
+char *http_content_type = NULL;
CURL *curl;
struct curl_slist *header_list = NULL;
curlhelp_curlbuf body_buf;
@@ -368,9 +370,21 @@ check_http (void)
else if (address_family == AF_INET6)
curl_easy_setopt (curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6);
+ /* either send http POST data (any data, not only POST)*/
+ if (http_post_data) {
+ if (http_content_type) {
+ snprintf (http_header, DEFAULT_BUFFER_SIZE, "Content-Type: %s", http_content_type);
+ header_list = curl_slist_append (header_list, http_header);
+ }
+ curl_easy_setopt (curl, CURLOPT_POSTFIELDS, http_post_data);
+ }
+
/* do the request */
res = curl_easy_perform(curl);
+ if (verbose>=2 && http_post_data)
+ printf ("**** REQUEST CONTENT ****\n%s\n", http_post_data);
+
/* free header list, we don't need it anymore */
curl_slist_free_all(header_list);
@@ -603,6 +617,7 @@ process_arguments (int argc, char **argv)
STD_LONG_OPTS,
{"ssl", optional_argument, 0, 'S'},
{"sni", no_argument, 0, SNI_OPTION},
+ {"post", required_argument, 0, 'P'},
{"method", required_argument, 0, 'j'},
{"IP-address", required_argument, 0, 'I'},
{"url", required_argument, 0, 'u'},
@@ -623,6 +638,7 @@ process_arguments (int argc, char **argv)
{"useragent", required_argument, 0, 'A'},
{"header", required_argument, 0, 'k'},
{"no-body", no_argument, 0, 'N'},
+ {"content-type", required_argument, 0, 'T'},
{"pagesize", required_argument, 0, 'm'},
{"invert-regex", no_argument, NULL, INVERT_REGEX},
{"use-ipv4", no_argument, 0, '4'},
@@ -649,7 +665,7 @@ process_arguments (int argc, char **argv)
}
while (1) {
- c = getopt_long (argc, argv, "Vvh46t:c:w:A:k:H:j:I:a:p:d:e:s:R:r:u:f:C:J:K:S::m:NE", longopts, &option);
+ c = getopt_long (argc, argv, "Vvh46t:c:w:A:k:H:P:j:T:I:a:p:d:e:s:R:r:u:f:C:J:K:S::m:NE", longopts, &option);
if (c == -1 || c == EOF || c == 1)
break;
@@ -716,6 +732,12 @@ process_arguments (int argc, char **argv)
strncpy (user_auth, optarg, MAX_INPUT_BUFFER - 1);
user_auth[MAX_INPUT_BUFFER - 1] = 0;
break;
+ case 'P': /* HTTP POST data in URL encoded format; ignored if settings already */
+ if (! http_post_data)
+ http_post_data = strdup (optarg);
+ if (! http_method)
+ http_method = strdup("POST");
+ break;
case 'j': /* Set HTTP method */
if (http_method)
free(http_method);
@@ -884,6 +906,9 @@ process_arguments (int argc, char **argv)
server_expect[MAX_INPUT_BUFFER - 1] = 0;
server_expect_yn = 1;
break;
+ case 'T': /* Content-type */
+ http_content_type = strdup (optarg);
+ break;
case 'l': /* linespan */
cflags &= ~REG_NEWLINE;
break;
@@ -987,7 +1012,7 @@ print_help (void)
print_revision (progname, NP_VERSION);
printf ("Copyright (c) 1999 Ethan Galstad <nagios at nagios.org>\n");
- printf ("Copyright (c) 2017 Andreas Baumann <abaumann at yahoo.com>\n");
+ printf ("Copyright (c) 2017 Andreas Baumann <mail at andreasbaumann.cc>\n");
printf (COPYRIGHT, copyright, email);
printf ("%s\n", _("This plugin tests the HTTP service on the specified host. It can test"));
@@ -1058,11 +1083,15 @@ print_help (void)
printf (" %s\n", _("String to expect in the content"));
printf (" %s\n", "-u, --url=PATH");
printf (" %s\n", _("URL to GET or POST (default: /)"));
+ printf (" %s\n", "-P, --post=STRING");
+ printf (" %s\n", _("URL encoded http POST data"));
printf (" %s\n", "-j, --method=STRING (for example: HEAD, OPTIONS, TRACE, PUT, DELETE, CONNECT)");
printf (" %s\n", _("Set HTTP method."));
printf (" %s\n", "-N, --no-body");
printf (" %s\n", _("Don't wait for document body: stop reading after headers."));
printf (" %s\n", _("(Note that this still does an HTTP GET or POST, not a HEAD.)"));
+ printf (" %s\n", "-T, --content-type=STRING");
+ printf (" %s\n", _("specify Content-Type header media type when POSTing\n"));
printf (" %s\n", "-l, --linespan");
printf (" %s\n", _("Allow regex to span newlines (must precede -r or -R)"));
printf (" %s\n", "-r, --regex, --ereg=STRING");
@@ -1152,10 +1181,9 @@ print_usage (void)
printf (" [-w <warn time>] [-c <critical time>] [-t <timeout>] [-E] [-a auth]\n");
printf (" [-f <ok|warning|critcal|follow>]\n");
printf (" [-e <expect>] [-d string] [-s string] [-l] [-r <regex> | -R <case-insensitive regex>]\n");
- printf (" [-m <min_pg_size>:<max_pg_size>] [-N]\n");
- printf (" [-4|-6] [-N]\n");
+ printf (" [-P string] [-m <min_pg_size>:<max_pg_size>] [-4|-6] [-N]\n");
printf (" [-A string] [-k string] [-S <version>] [--sni] [-C <warn_age>[,<crit_age>]]\n");
- printf (" [-v verbose]\n", progname);
+ printf (" [-T <content-type>] [-j method]\n", progname);
printf ("\n");
printf ("%s\n", _("WARNING: check_curl is experimental. Please use"));
printf ("%s\n\n", _("check_http if you need a stable version."));
More information about the Commits
mailing list