diff options
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/check_http.c | 71 |
1 files changed, 33 insertions, 38 deletions
diff --git a/plugins/check_http.c b/plugins/check_http.c index be18ce7d..506a1ec7 100644 --- a/plugins/check_http.c +++ b/plugins/check_http.c | |||
@@ -189,16 +189,17 @@ struct timeval tv; | |||
189 | #define HTTPS_PORT 443 | 189 | #define HTTPS_PORT 443 |
190 | #define HTTP_EXPECT "HTTP/1." | 190 | #define HTTP_EXPECT "HTTP/1." |
191 | #define HTTP_URL "/" | 191 | #define HTTP_URL "/" |
192 | #define CRLF "\r\n" | ||
192 | 193 | ||
193 | char timestamp[17] = ""; | 194 | char timestamp[17] = ""; |
194 | int specify_port = FALSE; | 195 | int specify_port = FALSE; |
195 | int server_port = HTTP_PORT; | 196 | int server_port = HTTP_PORT; |
196 | char server_port_text[6] = ""; | 197 | char server_port_text[6] = ""; |
197 | char server_type[6] = "http"; | 198 | char server_type[6] = "http"; |
198 | /*@null@*/ char *server_address = NULL; | 199 | char *server_address = ""; |
199 | char *host_name = ""; | 200 | char *host_name = ""; |
200 | /*@null@*/ char *server_url = NULL; | 201 | char *server_url = HTTP_URL; |
201 | int server_url_length = 0; | 202 | int server_url_length = 1; |
202 | int server_expect_yn = 0; | 203 | int server_expect_yn = 0; |
203 | char server_expect[MAX_INPUT_BUFFER] = HTTP_EXPECT; | 204 | char server_expect[MAX_INPUT_BUFFER] = HTTP_EXPECT; |
204 | char string_expect[MAX_INPUT_BUFFER] = ""; | 205 | char string_expect[MAX_INPUT_BUFFER] = ""; |
@@ -212,8 +213,8 @@ int onredirect = STATE_OK; | |||
212 | int use_ssl = FALSE; | 213 | int use_ssl = FALSE; |
213 | int verbose = FALSE; | 214 | int verbose = FALSE; |
214 | int sd; | 215 | int sd; |
215 | /*@null@*/ char *http_method = NULL; | 216 | char *http_method = "GET"; |
216 | /*@null@*/ char *http_post_data = NULL; | 217 | char *http_post_data = ""; |
217 | char buffer[MAX_INPUT_BUFFER]; | 218 | char buffer[MAX_INPUT_BUFFER]; |
218 | 219 | ||
219 | void print_usage (void); | 220 | void print_usage (void); |
@@ -404,11 +405,11 @@ process_arguments (int argc, char **argv) | |||
404 | asprintf (&host_name, "%s", optarg); | 405 | asprintf (&host_name, "%s", optarg); |
405 | break; | 406 | break; |
406 | case 'I': /* Server IP-address */ | 407 | case 'I': /* Server IP-address */ |
407 | server_address = strscpy (server_address, optarg); | 408 | asprintf (&server_address, "%s", optarg); |
408 | break; | 409 | break; |
409 | case 'u': /* Host or server */ | 410 | case 'u': /* Host or server */ |
410 | server_url = strscpy (server_url, optarg); | 411 | asprintf (&server_url, "%s", optarg); |
411 | server_url_length = strlen (optarg); | 412 | server_url_length = strlen (server_url); |
412 | break; | 413 | break; |
413 | case 'p': /* Host or server */ | 414 | case 'p': /* Host or server */ |
414 | if (!is_intnonneg (optarg)) | 415 | if (!is_intnonneg (optarg)) |
@@ -421,8 +422,8 @@ process_arguments (int argc, char **argv) | |||
421 | user_auth[MAX_INPUT_BUFFER - 1] = 0; | 422 | user_auth[MAX_INPUT_BUFFER - 1] = 0; |
422 | break; | 423 | break; |
423 | case 'P': /* HTTP POST data in URL encoded format */ | 424 | case 'P': /* HTTP POST data in URL encoded format */ |
424 | http_method = strscpy (http_method, "POST"); | 425 | asprintf (&http_method, "%s", "POST"); |
425 | http_post_data = strscpy (http_post_data, optarg); | 426 | asprintf (&http_post_data, "%s", optarg); |
426 | break; | 427 | break; |
427 | case 's': /* string or substring */ | 428 | case 's': /* string or substring */ |
428 | strncpy (string_expect, optarg, MAX_INPUT_BUFFER - 1); | 429 | strncpy (string_expect, optarg, MAX_INPUT_BUFFER - 1); |
@@ -464,27 +465,17 @@ process_arguments (int argc, char **argv) | |||
464 | 465 | ||
465 | c = optind; | 466 | c = optind; |
466 | 467 | ||
467 | if (server_address == NULL) { | 468 | if (strcmp (server_address, "") == 0 && c < argc) |
468 | if (c < argc) { | 469 | asprintf (&server_address, "%s", argv[c++]); |
469 | server_address = strscpy (NULL, argv[c++]); | ||
470 | } | ||
471 | else if (strcmp (host_name ,"") == 0) { | ||
472 | usage ("check_http: you must specify a server address\n"); | ||
473 | } | ||
474 | } | ||
475 | 470 | ||
476 | if (strcmp (host_name ,"") == 0 && c < argc) | 471 | if (strcmp (host_name, "") == 0 && c < argc) |
477 | asprintf (&host_name, "%s", argv[c++]); | 472 | asprintf (&host_name, "%s", argv[c++]); |
478 | 473 | ||
479 | if (server_address == NULL) | 474 | if (strcmp (server_address ,"") == 0) { |
480 | server_address = strscpy (NULL, host_name); | 475 | if (strcmp (host_name, "") == 0) |
481 | 476 | usage ("check_http: you must specify a server address or host name\n"); | |
482 | if (http_method == NULL) | 477 | else |
483 | http_method = strscpy (http_method, "GET"); | 478 | asprintf (&server_address, "%s", host_name); |
484 | |||
485 | if (server_url == NULL) { | ||
486 | server_url = strscpy (NULL, "/"); | ||
487 | server_url_length = strlen(HTTP_URL); | ||
488 | } | 479 | } |
489 | 480 | ||
490 | return TRUE; | 481 | return TRUE; |
@@ -600,7 +591,7 @@ check_http (void) | |||
600 | } | 591 | } |
601 | 592 | ||
602 | /* either send http POST data */ | 593 | /* either send http POST data */ |
603 | if (http_post_data) { | 594 | if (strlen (http_post_data)) { |
604 | asprintf (&buf, "Content-Type: application/x-www-form-urlencoded\r\n"); | 595 | asprintf (&buf, "Content-Type: application/x-www-form-urlencoded\r\n"); |
605 | if (SSL_write (ssl, buf, strlen (buf)) == -1) { | 596 | if (SSL_write (ssl, buf, strlen (buf)) == -1) { |
606 | ERR_print_errors_fp (stderr); | 597 | ERR_print_errors_fp (stderr); |
@@ -611,11 +602,15 @@ check_http (void) | |||
611 | ERR_print_errors_fp (stderr); | 602 | ERR_print_errors_fp (stderr); |
612 | return STATE_CRITICAL; | 603 | return STATE_CRITICAL; |
613 | } | 604 | } |
614 | http_post_data = strscat (http_post_data, "\r\n"); | ||
615 | if (SSL_write (ssl, http_post_data, strlen (http_post_data)) == -1) { | 605 | if (SSL_write (ssl, http_post_data, strlen (http_post_data)) == -1) { |
616 | ERR_print_errors_fp (stderr); | 606 | ERR_print_errors_fp (stderr); |
617 | return STATE_CRITICAL; | 607 | return STATE_CRITICAL; |
618 | } | 608 | } |
609 | asprintf (&buf, CRLF); | ||
610 | if (SSL_write (ssl, buf, strlen (buf)) == -1) { | ||
611 | ERR_print_errors_fp (stderr); | ||
612 | return STATE_CRITICAL; | ||
613 | } | ||
619 | } | 614 | } |
620 | else { | 615 | else { |
621 | /* or just a newline so the server knows we're done with the request */ | 616 | /* or just a newline so the server knows we're done with the request */ |
@@ -655,13 +650,13 @@ check_http (void) | |||
655 | 650 | ||
656 | /* either send http POST data */ | 651 | /* either send http POST data */ |
657 | /* written by Chris Henesy <lurker@shadowtech.org> */ | 652 | /* written by Chris Henesy <lurker@shadowtech.org> */ |
658 | if (http_post_data) { | 653 | if (strlen (http_post_data)) { |
659 | asprintf (&buf, "Content-Type: application/x-www-form-urlencoded\r\n"); | 654 | asprintf (&buf, "Content-Type: application/x-www-form-urlencoded\r\n"); |
660 | send (sd, buf, strlen (buf), 0); | 655 | send (sd, buf, strlen (buf), 0); |
661 | asprintf (&buf, "Content-Length: %i\r\n\r\n", strlen (http_post_data)); | 656 | asprintf (&buf, "Content-Length: %i\r\n\r\n", strlen (http_post_data)); |
662 | send (sd, buf, strlen (buf), 0); | 657 | send (sd, buf, strlen (buf), 0); |
663 | http_post_data = strscat (http_post_data, "\r\n"); | ||
664 | send (sd, http_post_data, strlen (http_post_data), 0); | 658 | send (sd, http_post_data, strlen (http_post_data), 0); |
659 | send (sd, CRLF, strlen (CRLF), 0); | ||
665 | } | 660 | } |
666 | else { | 661 | else { |
667 | /* or just a newline so the server knows we're done with the request */ | 662 | /* or just a newline so the server knows we're done with the request */ |
@@ -773,7 +768,7 @@ check_http (void) | |||
773 | strstr (status_line, "304")) { | 768 | strstr (status_line, "304")) { |
774 | if (onredirect == STATE_DEPENDENT) { | 769 | if (onredirect == STATE_DEPENDENT) { |
775 | 770 | ||
776 | orig_url = strscpy(NULL, server_url); | 771 | asprintf (&orig_url, "%s", server_url); |
777 | pos = header; | 772 | pos = header; |
778 | while (pos) { | 773 | while (pos) { |
779 | server_address = realloc (server_address, MAX_IPV4_HOSTLENGTH); | 774 | server_address = realloc (server_address, MAX_IPV4_HOSTLENGTH); |
@@ -788,26 +783,26 @@ check_http (void) | |||
788 | server_url_length = strcspn (pos, "\r\n"); | 783 | server_url_length = strcspn (pos, "\r\n"); |
789 | } | 784 | } |
790 | if (sscanf (pos, HDR_LOCATION URI_HTTP URI_HOST URI_PORT URI_PATH, server_type, server_address, server_port_text, server_url) == 4) { | 785 | if (sscanf (pos, HDR_LOCATION URI_HTTP URI_HOST URI_PORT URI_PATH, server_type, server_address, server_port_text, server_url) == 4) { |
791 | host_name = strscpy (host_name, server_address); | 786 | asprintf (&host_name, "%s", server_address); |
792 | use_ssl = server_type_check (server_type); | 787 | use_ssl = server_type_check (server_type); |
793 | server_port = atoi (server_port_text); | 788 | server_port = atoi (server_port_text); |
794 | check_http (); | 789 | check_http (); |
795 | } | 790 | } |
796 | else if (sscanf (pos, HDR_LOCATION URI_HTTP URI_HOST URI_PATH, server_type, server_address, server_url) == 3 ) { | 791 | else if (sscanf (pos, HDR_LOCATION URI_HTTP URI_HOST URI_PATH, server_type, server_address, server_url) == 3 ) { |
797 | host_name = strscpy (host_name, server_address); | 792 | asprintf (&host_name, "%s", server_address); |
798 | use_ssl = server_type_check (server_type); | 793 | use_ssl = server_type_check (server_type); |
799 | server_port = server_port_check (use_ssl); | 794 | server_port = server_port_check (use_ssl); |
800 | check_http (); | 795 | check_http (); |
801 | } | 796 | } |
802 | else if (sscanf (pos, HDR_LOCATION URI_HTTP URI_HOST URI_PORT, server_type, server_address, server_port_text) == 3) { | 797 | else if (sscanf (pos, HDR_LOCATION URI_HTTP URI_HOST URI_PORT, server_type, server_address, server_port_text) == 3) { |
803 | host_name = strscpy (host_name, server_address); | 798 | asprintf (&host_name, "%s", server_address); |
804 | strcpy (server_url, "/"); | 799 | strcpy (server_url, "/"); |
805 | use_ssl = server_type_check (server_type); | 800 | use_ssl = server_type_check (server_type); |
806 | server_port = atoi (server_port_text); | 801 | server_port = atoi (server_port_text); |
807 | check_http (); | 802 | check_http (); |
808 | } | 803 | } |
809 | else if (sscanf (pos, HDR_LOCATION URI_HTTP URI_HOST, server_type, server_address) == 2) { | 804 | else if (sscanf (pos, HDR_LOCATION URI_HTTP URI_HOST, server_type, server_address) == 2) { |
810 | host_name = strscpy (host_name, server_address); | 805 | asprintf (&host_name, "%s", server_address); |
811 | strcpy (server_url, "/"); | 806 | strcpy (server_url, "/"); |
812 | use_ssl = server_type_check (server_type); | 807 | use_ssl = server_type_check (server_type); |
813 | server_port = server_port_check (use_ssl); | 808 | server_port = server_port_check (use_ssl); |
@@ -912,7 +907,7 @@ int connect_SSL (void) | |||
912 | { | 907 | { |
913 | SSL_METHOD *meth; | 908 | SSL_METHOD *meth; |
914 | 909 | ||
915 | randbuff = strscpy (NULL, "qwertyuiopasdfghjkl"); | 910 | asprintf (randbuff, "%s", "qwertyuiopasdfghjkl"); |
916 | RAND_seed (randbuff, strlen (randbuff)); | 911 | RAND_seed (randbuff, strlen (randbuff)); |
917 | /* Initialize SSL context */ | 912 | /* Initialize SSL context */ |
918 | SSLeay_add_ssl_algorithms (); | 913 | SSLeay_add_ssl_algorithms (); |