diff options
| author | Andreas Baumann <mail@andreasbaumann.cc> | 2023-02-11 19:11:07 +0100 | 
|---|---|---|
| committer | Andreas Baumann <mail@andreasbaumann.cc> | 2023-02-11 19:11:07 +0100 | 
| commit | f6978deaa1bf7c6a7196363104ebfcef143080ab (patch) | |
| tree | e0f84ae5c919c929a6877e63f6387733da725622 /plugins | |
| parent | 27b0c6964559ba60ff6c7a626d51e62e5256ed62 (diff) | |
| download | monitoring-plugins-f6978de.tar.gz | |
added --cookie-jar and doing proper cleanup of libcurl
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/check_curl.c | 47 | 
1 files changed, 34 insertions, 13 deletions
| diff --git a/plugins/check_curl.c b/plugins/check_curl.c index 406f6f88..35d1237b 100644 --- a/plugins/check_curl.c +++ b/plugins/check_curl.c | |||
| @@ -214,6 +214,7 @@ int address_family = AF_UNSPEC; | |||
| 214 | curlhelp_ssl_library ssl_library = CURLHELP_SSL_LIBRARY_UNKNOWN; | 214 | curlhelp_ssl_library ssl_library = CURLHELP_SSL_LIBRARY_UNKNOWN; | 
| 215 | int curl_http_version = CURL_HTTP_VERSION_NONE; | 215 | int curl_http_version = CURL_HTTP_VERSION_NONE; | 
| 216 | int automatic_decompression = FALSE; | 216 | int automatic_decompression = FALSE; | 
| 217 | char *cookie_jar_file = NULL; | ||
| 217 | 218 | ||
| 218 | int process_arguments (int, char**); | 219 | int process_arguments (int, char**); | 
| 219 | void handle_curl_option_return_code (CURLcode res, const char* option); | 220 | void handle_curl_option_return_code (CURLcode res, const char* option); | 
| @@ -412,6 +413,19 @@ lookup_host (const char *host, char *buf, size_t buflen) | |||
| 412 | return 0; | 413 | return 0; | 
| 413 | } | 414 | } | 
| 414 | 415 | ||
| 416 | static void | ||
| 417 | cleanup (void) | ||
| 418 | { | ||
| 419 | curlhelp_free_statusline(&status_line); | ||
| 420 | curl_easy_cleanup (curl); | ||
| 421 | curl_global_cleanup (); | ||
| 422 | curlhelp_freewritebuffer (&body_buf); | ||
| 423 | curlhelp_freewritebuffer (&header_buf); | ||
| 424 | if (!strcmp (http_method, "PUT")) { | ||
| 425 | curlhelp_freereadbuffer (&put_buf); | ||
| 426 | } | ||
| 427 | } | ||
| 428 | |||
| 415 | int | 429 | int | 
| 416 | check_http (void) | 430 | check_http (void) | 
| 417 | { | 431 | { | 
| @@ -743,7 +757,16 @@ check_http (void) | |||
| 743 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_INFILESIZE, (curl_off_t)strlen (http_post_data)), "CURLOPT_INFILESIZE"); | 757 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_INFILESIZE, (curl_off_t)strlen (http_post_data)), "CURLOPT_INFILESIZE"); | 
| 744 | } | 758 | } | 
| 745 | } | 759 | } | 
| 760 | |||
| 761 | /* cookie handling */ | ||
| 762 | if (cookie_jar_file != NULL) { | ||
| 763 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_COOKIEJAR, cookie_jar_file), "CURLOPT_COOKIEJAR"); | ||
| 764 | handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_COOKIEFILE, cookie_jar_file), "CURLOPT_COOKIEFILE"); | ||
| 765 | } | ||
| 746 | 766 | ||
| 767 | /* register cleanup function to shut down libcurl properly */ | ||
| 768 | atexit (cleanup); | ||
| 769 | |||
| 747 | /* do the request */ | 770 | /* do the request */ | 
| 748 | res = curl_easy_perform(curl); | 771 | res = curl_easy_perform(curl); | 
| 749 | 772 | ||
| @@ -1021,7 +1044,7 @@ GOT_FIRST_CERT: | |||
| 1021 | else | 1044 | else | 
| 1022 | msg[strlen(msg)-3] = '\0'; | 1045 | msg[strlen(msg)-3] = '\0'; | 
| 1023 | } | 1046 | } | 
| 1024 | 1047 | ||
| 1025 | /* TODO: separate _() msg and status code: die (result, "HTTP %s: %s\n", state_text(result), msg); */ | 1048 | /* TODO: separate _() msg and status code: die (result, "HTTP %s: %s\n", state_text(result), msg); */ | 
| 1026 | die (result, "HTTP %s: %s %d %s%s%s - %d bytes in %.3f second response time %s|%s\n%s%s", | 1049 | die (result, "HTTP %s: %s %d %s%s%s - %d bytes in %.3f second response time %s|%s\n%s%s", | 
| 1027 | state_text(result), string_statuscode (status_line.http_major, status_line.http_minor), | 1050 | state_text(result), string_statuscode (status_line.http_major, status_line.http_minor), | 
| @@ -1033,16 +1056,6 @@ GOT_FIRST_CERT: | |||
| 1033 | (show_body ? body_buf.buf : ""), | 1056 | (show_body ? body_buf.buf : ""), | 
| 1034 | (show_body ? "\n" : "") ); | 1057 | (show_body ? "\n" : "") ); | 
| 1035 | 1058 | ||
| 1036 | /* proper cleanup after die? */ | ||
| 1037 | curlhelp_free_statusline(&status_line); | ||
| 1038 | curl_easy_cleanup (curl); | ||
| 1039 | curl_global_cleanup (); | ||
| 1040 | curlhelp_freewritebuffer (&body_buf); | ||
| 1041 | curlhelp_freewritebuffer (&header_buf); | ||
| 1042 | if (!strcmp (http_method, "PUT")) { | ||
| 1043 | curlhelp_freereadbuffer (&put_buf); | ||
| 1044 | } | ||
| 1045 | |||
| 1046 | return result; | 1059 | return result; | 
| 1047 | } | 1060 | } | 
| 1048 | 1061 | ||
| @@ -1239,7 +1252,8 @@ process_arguments (int argc, char **argv) | |||
| 1239 | CONTINUE_AFTER_CHECK_CERT, | 1252 | CONTINUE_AFTER_CHECK_CERT, | 
| 1240 | CA_CERT_OPTION, | 1253 | CA_CERT_OPTION, | 
| 1241 | HTTP_VERSION_OPTION, | 1254 | HTTP_VERSION_OPTION, | 
| 1242 | AUTOMATIC_DECOMPRESSION | 1255 | AUTOMATIC_DECOMPRESSION, | 
| 1256 | COOKIE_JAR | ||
| 1243 | }; | 1257 | }; | 
| 1244 | 1258 | ||
| 1245 | int option = 0; | 1259 | int option = 0; | 
| @@ -1285,6 +1299,7 @@ process_arguments (int argc, char **argv) | |||
| 1285 | {"max-redirs", required_argument, 0, MAX_REDIRS_OPTION}, | 1299 | {"max-redirs", required_argument, 0, MAX_REDIRS_OPTION}, | 
| 1286 | {"http-version", required_argument, 0, HTTP_VERSION_OPTION}, | 1300 | {"http-version", required_argument, 0, HTTP_VERSION_OPTION}, | 
| 1287 | {"enable-automatic-decompression", no_argument, 0, AUTOMATIC_DECOMPRESSION}, | 1301 | {"enable-automatic-decompression", no_argument, 0, AUTOMATIC_DECOMPRESSION}, | 
| 1302 | {"cookie-jar", required_argument, 0, COOKIE_JAR}, | ||
| 1288 | {0, 0, 0, 0} | 1303 | {0, 0, 0, 0} | 
| 1289 | }; | 1304 | }; | 
| 1290 | 1305 | ||
| @@ -1691,6 +1706,9 @@ process_arguments (int argc, char **argv) | |||
| 1691 | case AUTOMATIC_DECOMPRESSION: | 1706 | case AUTOMATIC_DECOMPRESSION: | 
| 1692 | automatic_decompression = TRUE; | 1707 | automatic_decompression = TRUE; | 
| 1693 | break; | 1708 | break; | 
| 1709 | case COOKIE_JAR: | ||
| 1710 | cookie_jar_file = optarg; | ||
| 1711 | break; | ||
| 1694 | case '?': | 1712 | case '?': | 
| 1695 | /* print short usage statement if args not parsable */ | 1713 | /* print short usage statement if args not parsable */ | 
| 1696 | usage5 (); | 1714 | usage5 (); | 
| @@ -1910,6 +1928,8 @@ print_help (void) | |||
| 1910 | printf (" %s\n", _("1.0 = HTTP/1.0, 1.1 = HTTP/1.1, 2.0 = HTTP/2 (HTTP/2 will fail without -S)")); | 1928 | printf (" %s\n", _("1.0 = HTTP/1.0, 1.1 = HTTP/1.1, 2.0 = HTTP/2 (HTTP/2 will fail without -S)")); | 
| 1911 | printf (" %s\n", "--enable-automatic-decompression"); | 1929 | printf (" %s\n", "--enable-automatic-decompression"); | 
| 1912 | printf (" %s\n", _("Enable automatic decompression of body (CURLOPT_ACCEPT_ENCODING).")); | 1930 | printf (" %s\n", _("Enable automatic decompression of body (CURLOPT_ACCEPT_ENCODING).")); | 
| 1931 | printf (" %s\n", "---cookie-jar=FILE"); | ||
| 1932 | printf (" %s\n", _("Store cookies in the cookie jar and send them out when requested.")); | ||
| 1913 | printf ("\n"); | 1933 | printf ("\n"); | 
| 1914 | 1934 | ||
| 1915 | printf (UT_WARN_CRIT); | 1935 | printf (UT_WARN_CRIT); | 
| @@ -1994,7 +2014,8 @@ print_usage (void) | |||
| 1994 | printf (" [-P string] [-m <min_pg_size>:<max_pg_size>] [-4|-6] [-N] [-M <age>]\n"); | 2014 | printf (" [-P string] [-m <min_pg_size>:<max_pg_size>] [-4|-6] [-N] [-M <age>]\n"); | 
| 1995 | printf (" [-A string] [-k string] [-S <version>] [--sni]\n"); | 2015 | printf (" [-A string] [-k string] [-S <version>] [--sni]\n"); | 
| 1996 | printf (" [-T <content-type>] [-j method]\n"); | 2016 | printf (" [-T <content-type>] [-j method]\n"); | 
| 1997 | printf (" [--http-version=<version>]\n"); | 2017 | printf (" [--http-version=<version>] [--enable-automatic-decompression]\n"); | 
| 2018 | printf (" [--cookie-jar=<cookie jar file>\n"); | ||
| 1998 | printf (" %s -H <vhost> | -I <IP-address> -C <warn_age>[,<crit_age>]\n",progname); | 2019 | printf (" %s -H <vhost> | -I <IP-address> -C <warn_age>[,<crit_age>]\n",progname); | 
| 1999 | printf (" [-p <port>] [-t <timeout>] [-4|-6] [--sni]\n"); | 2020 | printf (" [-p <port>] [-t <timeout>] [-4|-6] [--sni]\n"); | 
| 2000 | printf ("\n"); | 2021 | printf ("\n"); | 
