diff --git a/plugins/check_http.c b/plugins/check_http.c
index b676eec50331bac8c4a29e29ee13cac2b8183d39..6e76706277d702712a92bfa3e34656b9fcb29bf5 100644 (file)
--- a/plugins/check_http.c
+++ b/plugins/check_http.c
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ $Id$
+
******************************************************************************/
/* splint -I. -I../../plugins -I../../lib/ -I/usr/kerberos/include/ ../../plugins/check_http.c */
const char *progname = "check_http";
const char *revision = "$Revision$";
******************************************************************************/
/* splint -I. -I../../plugins -I../../lib/ -I/usr/kerberos/include/ ../../plugins/check_http.c */
const char *progname = "check_http";
const char *revision = "$Revision$";
-const char *copyright = "1999-2001";
+const char *copyright = "1999-2004";
const char *email = "nagiosplug-devel@lists.sourceforge.net";
#include "common.h"
#include "netutils.h"
#include "utils.h"
const char *email = "nagiosplug-devel@lists.sourceforge.net";
#include "common.h"
#include "netutils.h"
#include "utils.h"
+#define INPUT_DELIMITER ";"
+
#define HTTP_EXPECT "HTTP/1."
enum {
MAX_IPV4_HOSTLENGTH = 255,
#define HTTP_EXPECT "HTTP/1."
enum {
MAX_IPV4_HOSTLENGTH = 255,
int connect_SSL (void);
int check_certificate (X509 **);
#endif
int connect_SSL (void);
int check_certificate (X509 **);
#endif
+int no_body = FALSE;
+int maximum_age = -1;
#ifdef HAVE_REGEX_H
enum {
#ifdef HAVE_REGEX_H
enum {
int check_critical_time = FALSE;
char user_auth[MAX_INPUT_BUFFER] = "";
int display_html = FALSE;
int check_critical_time = FALSE;
char user_auth[MAX_INPUT_BUFFER] = "";
int display_html = FALSE;
+char *http_opt_headers;
int onredirect = STATE_OK;
int use_ssl = FALSE;
int verbose = FALSE;
int onredirect = STATE_OK;
int use_ssl = FALSE;
int verbose = FALSE;
void redir (char *pos, char *status_line);
int server_type_check(const char *type);
int server_port_check(int ssl_flag);
void redir (char *pos, char *status_line);
int server_type_check(const char *type);
int server_port_check(int ssl_flag);
-char *perfd_time (long microsec);
+char *perfd_time (double microsec);
char *perfd_size (int page_len);
int my_recv (void);
int my_close (void);
char *perfd_size (int page_len);
int my_recv (void);
int my_close (void);
clean_revstring (revision), VERSION);
if (process_arguments (argc, argv) == ERROR)
clean_revstring (revision), VERSION);
if (process_arguments (argc, argv) == ERROR)
- usage (_("check_http: could not parse arguments\n"));
+ usage4 (_("Could not parse arguments"));
if (strstr (timestamp, ":")) {
if (strstr (server_url, "?"))
if (strstr (timestamp, ":")) {
if (strstr (server_url, "?"))
}
if (display_html == TRUE)
}
if (display_html == TRUE)
- printf ("<A HREF=\"http://%s:%d%s\" target=\"_blank\">",
- host_name, server_port, server_url);
+ printf ("<A HREF=\"%s://%s:%d%s\" target=\"_blank\">",
+ use_ssl ? "https" : "http", host_name,
+ server_port, server_url);
/* initialize alarm signal handling, set socket timeout, start timer */
(void) signal (SIGALRM, socket_timeout_alarm_handler);
/* initialize alarm signal handling, set socket timeout, start timer */
(void) signal (SIGALRM, socket_timeout_alarm_handler);
X509_free (server_cert);
}
else {
X509_free (server_cert);
}
else {
- printf (_("ERROR: Cannot retrieve server certificate.\n"));
+ printf (_("CRITICAL - Cannot retrieve server certificate.\n"));
result = STATE_CRITICAL;
}
SSL_shutdown (ssl);
result = STATE_CRITICAL;
}
SSL_shutdown (ssl);
#endif
return result;
}
#endif
return result;
}
-\f
+
/* process command-line arguments */
/* process command-line arguments */
{"verbose", no_argument, 0, 'v'},
{"post", required_argument, 0, 'P'},
{"IP-address", required_argument, 0, 'I'},
{"verbose", no_argument, 0, 'v'},
{"post", required_argument, 0, 'P'},
{"IP-address", required_argument, 0, 'I'},
+ {"url", required_argument, 0, 'u'},
{"string", required_argument, 0, 's'},
{"regex", required_argument, 0, 'r'},
{"ereg", required_argument, 0, 'r'},
{"string", required_argument, 0, 's'},
{"regex", required_argument, 0, 'r'},
{"ereg", required_argument, 0, 'r'},
{"linespan", no_argument, 0, 'l'},
{"onredirect", required_argument, 0, 'f'},
{"certificate", required_argument, 0, 'C'},
{"linespan", no_argument, 0, 'l'},
{"onredirect", required_argument, 0, 'f'},
{"certificate", required_argument, 0, 'C'},
+ {"useragent", required_argument, 0, 'A'},
+ {"header", required_argument, 0, 'k'},
+ {"no-body", no_argument, 0, 'N'},
+ {"max-age", required_argument, 0, 'M'},
{"content-type", required_argument, 0, 'T'},
{"min", required_argument, 0, 'm'},
{"use-ipv4", no_argument, 0, '4'},
{"content-type", required_argument, 0, 'T'},
{"min", required_argument, 0, 'm'},
{"use-ipv4", no_argument, 0, '4'},
}
while (1) {
}
while (1) {
- c = getopt_long (argc, argv, "Vvh46t:c:w:H:P:T:I:a:e:p:s:R:r:u:f:C:nlLSm:", longopts, &option);
+ c = getopt_long (argc, argv, "Vvh46t:c:w:A:k:H:P:T:I:a:e:p:s:R:r:u:f:C:nlLSm:M:N", longopts, &option);
if (c == -1 || c == EOF)
break;
switch (c) {
case '?': /* usage */
if (c == -1 || c == EOF)
break;
switch (c) {
case '?': /* usage */
- usage3 (_("unknown argument"), optopt);
+ usage2 (_("Unknown argument"), optarg);
break;
case 'h': /* help */
print_help ();
break;
case 'h': /* help */
print_help ();
break;
case 't': /* timeout period */
if (!is_intnonneg (optarg))
break;
case 't': /* timeout period */
if (!is_intnonneg (optarg))
- usage2 (_("timeout interval must be a non-negative integer"), optarg);
+ usage2 (_("Timeout interval must be a positive integer"), optarg);
else
socket_timeout = atoi (optarg);
break;
case 'c': /* critical time threshold */
if (!is_nonnegative (optarg))
else
socket_timeout = atoi (optarg);
break;
case 'c': /* critical time threshold */
if (!is_nonnegative (optarg))
- usage2 (_("invalid critical threshold"), optarg);
+ usage2 (_("Critical threshold must be integer"), optarg);
else {
critical_time = strtod (optarg, NULL);
check_critical_time = TRUE;
else {
critical_time = strtod (optarg, NULL);
check_critical_time = TRUE;
break;
case 'w': /* warning time threshold */
if (!is_nonnegative (optarg))
break;
case 'w': /* warning time threshold */
if (!is_nonnegative (optarg))
- usage2 (_("invalid warning threshold"), optarg);
+ usage2 (_("Warning threshold must be integer"), optarg);
else {
warning_time = strtod (optarg, NULL);
check_warning_time = TRUE;
}
break;
else {
warning_time = strtod (optarg, NULL);
check_warning_time = TRUE;
}
break;
+ case 'A': /* User Agent String */
+ asprintf (&user_agent, "User-Agent: %s", optarg);
+ break;
+ case 'k': /* Additional headers */
+ asprintf (&http_opt_headers, "%s", optarg);
+ break;
case 'L': /* show html link */
display_html = TRUE;
break;
case 'L': /* show html link */
display_html = TRUE;
break;
break;
case 'S': /* use SSL */
#ifndef HAVE_SSL
break;
case 'S': /* use SSL */
#ifndef HAVE_SSL
- usage (_("check_http: invalid option - SSL is not available\n"));
+ usage4 (_("Invalid option - SSL is not available"));
#endif
use_ssl = TRUE;
if (specify_port == FALSE)
#endif
use_ssl = TRUE;
if (specify_port == FALSE)
case 'C': /* Check SSL cert validity */
#ifdef HAVE_SSL
if (!is_intnonneg (optarg))
case 'C': /* Check SSL cert validity */
#ifdef HAVE_SSL
if (!is_intnonneg (optarg))
- usage2 (_("invalid certificate expiration period"), optarg);
+ usage2 (_("Invalid certificate expiration period"), optarg);
else {
days_till_exp = atoi (optarg);
check_cert = TRUE;
}
#else
else {
days_till_exp = atoi (optarg);
check_cert = TRUE;
}
#else
- usage (_("check_http: invalid option - SSL is not available\n"));
+ usage4 (_("Invalid option - SSL is not available"));
#endif
break;
case 'f': /* onredirect */
#endif
break;
case 'f': /* onredirect */
/* Note: H, I, and u must be malloc'd or will fail on redirects */
case 'H': /* Host Name (virtual host) */
host_name = strdup (optarg);
/* Note: H, I, and u must be malloc'd or will fail on redirects */
case 'H': /* Host Name (virtual host) */
host_name = strdup (optarg);
+ if (strstr (optarg, ":"))
+ sscanf (optarg, "%*[^:]:%d", &server_port);
break;
case 'I': /* Server IP-address */
server_address = strdup (optarg);
break;
case 'I': /* Server IP-address */
server_address = strdup (optarg);
break;
case 'p': /* Server port */
if (!is_intnonneg (optarg))
break;
case 'p': /* Server port */
if (!is_intnonneg (optarg))
- usage2 (_("invalid port number"), optarg);
+ usage2 (_("Invalid port number"), optarg);
else {
server_port = atoi (optarg);
specify_port = TRUE;
else {
server_port = atoi (optarg);
specify_port = TRUE;
case 'l': /* linespan */
case 'r': /* linespan */
case 'R': /* linespan */
case 'l': /* linespan */
case 'r': /* linespan */
case 'R': /* linespan */
- usage (_("check_http: call for regex which was not a compiled option\n"));
+ usage4 (_("Call for regex which was not a compiled option"));
break;
#else
case 'l': /* linespan */
break;
#else
case 'l': /* linespan */
#ifdef USE_IPV6
address_family = AF_INET6;
#else
#ifdef USE_IPV6
address_family = AF_INET6;
#else
- usage (_("IPv6 support not available\n"));
+ usage4 (_("IPv6 support not available"));
#endif
break;
case 'v': /* verbose */
#endif
break;
case 'v': /* verbose */
case 'm': /* min_page_length */
min_page_len = atoi (optarg);
break;
case 'm': /* min_page_length */
min_page_len = atoi (optarg);
break;
+ case 'N': /* no-body */
+ no_body = TRUE;
+ break;
+ case 'M': /* max-age */
+ {
+ int L = strlen(optarg);
+ if (L && optarg[L-1] == 'm')
+ maximum_age = atoi (optarg) * 60;
+ else if (L && optarg[L-1] == 'h')
+ maximum_age = atoi (optarg) * 60 * 60;
+ else if (L && optarg[L-1] == 'd')
+ maximum_age = atoi (optarg) * 60 * 60 * 24;
+ else if (L && (optarg[L-1] == 's' ||
+ isdigit (optarg[L-1])))
+ maximum_age = atoi (optarg);
+ else {
+ fprintf (stderr, "unparsable max-age: %s\n", optarg);
+ exit (1);
+ }
+ }
+ break;
}
}
}
}
if (server_address == NULL) {
if (host_name == NULL)
if (server_address == NULL) {
if (host_name == NULL)
- usage (_("check_http: you must specify a server address or host name\n"));
+ usage4 (_("You must specify a server address or host name"));
else
server_address = strdup (host_name);
}
else
server_address = strdup (host_name);
}
return TRUE;
}
return TRUE;
}
-\f
+
/* written by lauri alanko */
/* written by lauri alanko */
buf[i] = '\0';
return buf;
}
buf[i] = '\0';
return buf;
}
-\f
+/* Returns 1 if we're done processing the document body; 0 to keep going */
+static int
+document_headers_done (char *full_page)
+{
+ const char *body;
+
+ for (body = full_page; *body; body++) {
+ if (!strncmp (body, "\n\n", 2) || !strncmp (body, "\n\r\n", 3))
+ break;
+ }
+
+ if (!*body)
+ return 0; /* haven't read end of headers yet */
+
+ full_page[body - full_page] = 0;
+ return 1;
+}
+
+static time_t
+parse_time_string (const char *string)
+{
+ struct tm tm;
+ time_t t;
+ memset (&tm, 0, sizeof(tm));
+
+ /* Like this: Tue, 25 Dec 2001 02:59:03 GMT */
+
+ if (isupper (string[0]) && /* Tue */
+ islower (string[1]) &&
+ islower (string[2]) &&
+ ',' == string[3] &&
+ ' ' == string[4] &&
+ (isdigit(string[5]) || string[5] == ' ') && /* 25 */
+ isdigit (string[6]) &&
+ ' ' == string[7] &&
+ isupper (string[8]) && /* Dec */
+ islower (string[9]) &&
+ islower (string[10]) &&
+ ' ' == string[11] &&
+ isdigit (string[12]) && /* 2001 */
+ isdigit (string[13]) &&
+ isdigit (string[14]) &&
+ isdigit (string[15]) &&
+ ' ' == string[16] &&
+ isdigit (string[17]) && /* 02: */
+ isdigit (string[18]) &&
+ ':' == string[19] &&
+ isdigit (string[20]) && /* 59: */
+ isdigit (string[21]) &&
+ ':' == string[22] &&
+ isdigit (string[23]) && /* 03 */
+ isdigit (string[24]) &&
+ ' ' == string[25] &&
+ 'G' == string[26] && /* GMT */
+ 'M' == string[27] && /* GMT */
+ 'T' == string[28]) {
+
+ tm.tm_sec = 10 * (string[23]-'0') + (string[24]-'0');
+ tm.tm_min = 10 * (string[20]-'0') + (string[21]-'0');
+ tm.tm_hour = 10 * (string[17]-'0') + (string[18]-'0');
+ tm.tm_mday = 10 * (string[5] == ' ' ? 0 : string[5]-'0') + (string[6]-'0');
+ tm.tm_mon = (!strncmp (string+8, "Jan", 3) ? 0 :
+ !strncmp (string+8, "Feb", 3) ? 1 :
+ !strncmp (string+8, "Mar", 3) ? 2 :
+ !strncmp (string+8, "Apr", 3) ? 3 :
+ !strncmp (string+8, "May", 3) ? 4 :
+ !strncmp (string+8, "Jun", 3) ? 5 :
+ !strncmp (string+8, "Jul", 3) ? 6 :
+ !strncmp (string+8, "Aug", 3) ? 7 :
+ !strncmp (string+8, "Sep", 3) ? 8 :
+ !strncmp (string+8, "Oct", 3) ? 9 :
+ !strncmp (string+8, "Nov", 3) ? 10 :
+ !strncmp (string+8, "Dec", 3) ? 11 :
+ -1);
+ tm.tm_year = ((1000 * (string[12]-'0') +
+ 100 * (string[13]-'0') +
+ 10 * (string[14]-'0') +
+ (string[15]-'0'))
+ - 1900);
+
+ tm.tm_isdst = 0; /* GMT is never in DST, right? */
+
+ if (tm.tm_mon < 0 || tm.tm_mday < 1 || tm.tm_mday > 31)
+ return 0;
+
+ /*
+ This is actually wrong: we need to subtract the local timezone
+ offset from GMT from this value. But, that's ok in this usage,
+ because we only comparing these two GMT dates against each other,
+ so it doesn't matter what time zone we parse them in.
+ */
+
+ t = mktime (&tm);
+ if (t == (time_t) -1) t = 0;
+
+ if (verbose) {
+ const char *s = string;
+ while (*s && *s != '\r' && *s != '\n')
+ fputc (*s++, stdout);
+ printf (" ==> %lu\n", (unsigned long) t);
+ }
+
+ return t;
+
+ } else {
+ return 0;
+ }
+}
+
+
+
+static void
+check_document_dates (const char *headers)
+{
+ const char *s;
+ char *server_date = 0;
+ char *document_date = 0;
+
+ s = headers;
+ while (*s) {
+ const char *field = s;
+ const char *value = 0;
+
+ /* Find the end of the header field */
+ while (*s && !isspace(*s) && *s != ':')
+ s++;
+
+ /* Remember the header value, if any. */
+ if (*s == ':')
+ value = ++s;
+
+ /* Skip to the end of the header, including continuation lines. */
+ while (*s && !(*s == '\n' && (s[1] != ' ' && s[1] != '\t')))
+ s++;
+ s++;
+
+ /* Process this header. */
+ if (value && value > field+2) {
+ char *ff = (char *) malloc (value-field);
+ char *ss = ff;
+ while (field < value-1)
+ *ss++ = tolower(*field++);
+ *ss++ = 0;
+
+ if (!strcmp (ff, "date") || !strcmp (ff, "last-modified")) {
+ const char *e;
+ while (*value && isspace (*value))
+ value++;
+ for (e = value; *e && *e != '\r' && *e != '\n'; e++)
+ ;
+ ss = (char *) malloc (e - value + 1);
+ strncpy (ss, value, e - value);
+ ss[e - value] = 0;
+ if (!strcmp (ff, "date")) {
+ if (server_date) free (server_date);
+ server_date = ss;
+ } else {
+ if (document_date) free (document_date);
+ document_date = ss;
+ }
+ }
+ free (ff);
+ }
+ }
+
+ /* Done parsing the body. Now check the dates we (hopefully) parsed. */
+ if (!server_date || !*server_date) {
+ die (STATE_UNKNOWN, _("Server date unknown\n"));
+ } else if (!document_date || !*document_date) {
+ die (STATE_CRITICAL, _("Document modification date unknown\n"));
+ } else {
+ time_t srv_data = parse_time_string (server_date);
+ time_t doc_data = parse_time_string (document_date);
+
+ if (srv_data <= 0) {
+ die (STATE_CRITICAL, _("CRITICAL - Server date \"%100s\" unparsable"), server_date);
+ } else if (doc_data <= 0) {
+ die (STATE_CRITICAL, _("CRITICAL - Document date \"%100s\" unparsable"), document_date);
+ } else if (doc_data > srv_data + 30) {
+ die (STATE_CRITICAL, _("CRITICAL - Document is %d seconds in the future\n"), (int)doc_data - (int)srv_data);
+ } else if (doc_data < srv_data - maximum_age) {
+ int n = (srv_data - doc_data);
+ if (n > (60 * 60 * 24 * 2))
+ die (STATE_CRITICAL,
+ _("CRITICAL - Last modified %.1f days ago\n"),
+ ((float) n) / (60 * 60 * 24));
+ else
+ die (STATE_CRITICAL,
+ _("CRITICAL - Last modified %d:%02d:%02d ago\n"),
+ n / (60 * 60), (n / 60) % 60, n % 60);
+ }
+
+ free (server_date);
+ free (document_date);
+ }
+}
+
+
int
check_http (void)
int
check_http (void)
X509_free (server_cert);
}
else {
X509_free (server_cert);
}
else {
- printf (_("ERROR: Cannot retrieve server certificate.\n"));
+ printf (_("CRITICAL - Cannot retrieve server certificate.\n"));
return STATE_CRITICAL;
}
return STATE_CRITICAL;
}
if (host_name)
asprintf (&buf, "%sHost: %s\r\n", buf, host_name);
if (host_name)
asprintf (&buf, "%sHost: %s\r\n", buf, host_name);
+ /* optionally send any other header tag */
+ if (http_opt_headers) {
+ for ((pos = strtok(http_opt_headers, INPUT_DELIMITER)); pos; (pos = strtok(NULL, INPUT_DELIMITER)))
+ asprintf (&buf, "%s%s\r\n", buf, pos);
+ }
+
/* optionally send the authentication info */
if (strlen(user_auth)) {
auth = base64 (user_auth, strlen (user_auth));
/* optionally send the authentication info */
if (strlen(user_auth)) {
auth = base64 (user_auth, strlen (user_auth));
buffer[i] = '\0';
asprintf (&full_page, "%s%s", full_page, buffer);
pagesize += i;
buffer[i] = '\0';
asprintf (&full_page, "%s%s", full_page, buffer);
pagesize += i;
+
+ if (no_body && document_headers_done (full_page)) {
+ i = 0;
+ break;
+ }
}
if (i < 0 && errno != ECONNRESET) {
}
if (i < 0 && errno != ECONNRESET) {
if ( sslerr == SSL_ERROR_SSL ) {
die (STATE_WARNING, _("Client Certificate Required\n"));
} else {
if ( sslerr == SSL_ERROR_SSL ) {
die (STATE_WARNING, _("Client Certificate Required\n"));
} else {
- die (STATE_CRITICAL, _("Error in recv()\n"));
+ die (STATE_CRITICAL, _("Error on receive\n"));
}
}
else {
#endif
}
}
else {
#endif
- die (STATE_CRITICAL, _("Error in recv()\n"));
+ die (STATE_CRITICAL, _("Error on receive\n"));
#ifdef HAVE_SSL
}
#endif
#ifdef HAVE_SSL
}
#endif
page = full_page;
if (verbose)
page = full_page;
if (verbose)
- printf ("%s://%s:%d%s is %d characters\n", server_type, server_address, server_port, server_url, pagesize);
+ printf ("%s://%s:%d%s is %d characters\n",
+ use_ssl ? "https" : "http", server_address,
+ server_port, server_url, pagesize);
/* find status line and null-terminate it */
status_line = page;
/* find status line and null-terminate it */
status_line = page;
page += (size_t) strspn (page, "\r\n");
header[pos - header] = 0;
if (verbose)
page += (size_t) strspn (page, "\r\n");
header[pos - header] = 0;
if (verbose)
- printf ("**** HEADER ****\n%s\n**** CONTENT ****\n%s\n", header, page);
+ printf ("**** HEADER ****\n%s\n**** CONTENT ****\n%s\n", header,
+ (no_body ? " [[ skipped ]]" : page));
/* make sure the status line matches the response we are looking for */
if (!strstr (status_line, server_expect)) {
/* make sure the status line matches the response we are looking for */
if (!strstr (status_line, server_expect)) {
_(" - %s - %.3f second response time %s%s|%s %s\n"),
status_line, elapsed_time, timestamp,
(display_html ? "</A>" : ""),
_(" - %s - %.3f second response time %s%s|%s %s\n"),
status_line, elapsed_time, timestamp,
(display_html ? "</A>" : ""),
- perfd_time (microsec), perfd_size (pagesize));
+ perfd_time (elapsed_time), perfd_size (pagesize));
} /* end if (http_status >= 300) */
} /* end else (server_expect_yn) */
} /* end if (http_status >= 300) */
} /* end else (server_expect_yn) */
+ if (maximum_age >= 0) {
+ check_document_dates (header);
+ }
+
/* check elapsed time */
microsec = deltime (tv);
elapsed_time = (double)microsec / 1.0e6;
asprintf (&msg,
/* check elapsed time */
microsec = deltime (tv);
elapsed_time = (double)microsec / 1.0e6;
asprintf (&msg,
- _("HTTP problem: %s - %.3f second response time %s%s|%s %s\n"),
+ _("HTTP WARNING: %s - %.3f second response time %s%s|%s %s\n"),
status_line, elapsed_time, timestamp,
(display_html ? "</A>" : ""),
status_line, elapsed_time, timestamp,
(display_html ? "</A>" : ""),
- perfd_time (microsec), perfd_size (pagesize));
+ perfd_time (elapsed_time), perfd_size (pagesize));
if (check_critical_time == TRUE && elapsed_time > critical_time)
die (STATE_CRITICAL, "%s", msg);
if (check_warning_time == TRUE && elapsed_time > warning_time)
if (check_critical_time == TRUE && elapsed_time > critical_time)
die (STATE_CRITICAL, "%s", msg);
if (check_warning_time == TRUE && elapsed_time > warning_time)
printf (_("HTTP OK %s - %.3f second response time %s%s|%s %s\n"),
status_line, elapsed_time,
timestamp, (display_html ? "</A>" : ""),
printf (_("HTTP OK %s - %.3f second response time %s%s|%s %s\n"),
status_line, elapsed_time,
timestamp, (display_html ? "</A>" : ""),
- perfd_time (microsec), perfd_size (pagesize));
+ perfd_time (elapsed_time), perfd_size (pagesize));
exit (STATE_OK);
}
else {
printf (_("CRITICAL - string not found%s|%s %s\n"),
(display_html ? "</A>" : ""),
exit (STATE_OK);
}
else {
printf (_("CRITICAL - string not found%s|%s %s\n"),
(display_html ? "</A>" : ""),
- perfd_time (microsec), perfd_size (pagesize));
+ perfd_time (elapsed_time), perfd_size (pagesize));
exit (STATE_CRITICAL);
}
}
exit (STATE_CRITICAL);
}
}
printf (_("HTTP OK %s - %.3f second response time %s%s|%s %s\n"),
status_line, elapsed_time,
timestamp, (display_html ? "</A>" : ""),
printf (_("HTTP OK %s - %.3f second response time %s%s|%s %s\n"),
status_line, elapsed_time,
timestamp, (display_html ? "</A>" : ""),
- perfd_time (microsec), perfd_size (pagesize));
+ perfd_time (elapsed_time), perfd_size (pagesize));
exit (STATE_OK);
}
else {
if (errcode == REG_NOMATCH) {
printf (_("CRITICAL - pattern not found%s|%s %s\n"),
(display_html ? "</A>" : ""),
exit (STATE_OK);
}
else {
if (errcode == REG_NOMATCH) {
printf (_("CRITICAL - pattern not found%s|%s %s\n"),
(display_html ? "</A>" : ""),
- perfd_time (microsec), perfd_size (pagesize));
+ perfd_time (elapsed_time), perfd_size (pagesize));
exit (STATE_CRITICAL);
}
else {
exit (STATE_CRITICAL);
}
else {
asprintf (&msg, _("HTTP OK %s - %d bytes in %.3f seconds %s%s|%s %s\n"),
status_line, page_len, elapsed_time,
timestamp, (display_html ? "</A>" : ""),
asprintf (&msg, _("HTTP OK %s - %d bytes in %.3f seconds %s%s|%s %s\n"),
status_line, page_len, elapsed_time,
timestamp, (display_html ? "</A>" : ""),
- perfd_time (microsec), perfd_size (page_len));
+ perfd_time (elapsed_time), perfd_size (page_len));
die (STATE_OK, "%s", msg);
return STATE_UNKNOWN;
}
die (STATE_OK, "%s", msg);
return STATE_UNKNOWN;
}
-
/* per RFC 2396 */
#define HDR_LOCATION "%*[Ll]%*[Oo]%*[Cc]%*[Aa]%*[Tt]%*[Ii]%*[Oo]%*[Nn]: "
#define URI_HTTP "%[HTPShtps]://"
/* per RFC 2396 */
#define HDR_LOCATION "%*[Ll]%*[Oo]%*[Cc]%*[Aa]%*[Tt]%*[Ii]%*[Oo]%*[Nn]: "
#define URI_HTTP "%[HTPShtps]://"
addr = malloc (MAX_IPV4_HOSTLENGTH + 1);
if (addr == NULL)
addr = malloc (MAX_IPV4_HOSTLENGTH + 1);
if (addr == NULL)
- die (STATE_UNKNOWN, _("ERROR: could not allocate addr\n"));
+ die (STATE_UNKNOWN, _("Could not allocate addr\n"));
url = malloc (strcspn (pos, "\r\n"));
if (url == NULL)
url = malloc (strcspn (pos, "\r\n"));
if (url == NULL)
- die (STATE_UNKNOWN, _("ERROR: could not allocate url\n"));
+ die (STATE_UNKNOWN, _("Could not allocate url\n"));
while (pos) {
while (pos) {
url = realloc (url, strcspn (pos, "\r\n"));
if (url == NULL)
url = realloc (url, strcspn (pos, "\r\n"));
if (url == NULL)
- die (STATE_UNKNOWN, _("ERROR: could not allocate url\n"));
+ die (STATE_UNKNOWN, _("could not allocate url\n"));
/* URI_HTTP, URI_HOST, URI_PORT, URI_PATH */
if (sscanf (pos, HD1, type, addr, port, url) == 4) {
/* URI_HTTP, URI_HOST, URI_PORT, URI_PATH */
if (sscanf (pos, HD1, type, addr, port, url) == 4) {
}
#endif
}
#endif
+
+
#ifdef HAVE_SSL
int
check_certificate (X509 ** certificate)
#ifdef HAVE_SSL
int
check_certificate (X509 ** certificate)
return STATE_OK;
}
#endif
return STATE_OK;
}
#endif
-\f
-char *perfd_time (long microsec)
+
+char *perfd_time (double elapsed_time)
{
{
- return perfdata ("time", microsec, "us",
- check_warning_time, (int)(1e6*warning_time),
- check_critical_time, (int)(1e6*critical_time),
- TRUE, 0, FALSE, 0);
+ return fperfdata ("time", elapsed_time, "s",
+ check_warning_time, warning_time,
+ check_critical_time, critical_time,
+ TRUE, 0, FALSE, 0);
}
}
+
char *perfd_size (int page_len)
{
return perfdata ("size", page_len, "B",
char *perfd_size (int page_len)
{
return perfdata ("size", page_len, "B",
}
}
+
int
my_recv (void)
{
int
my_recv (void)
{
}
}
+
int
my_close (void)
{
int
my_close (void)
{
-
-
-\f
void
print_help (void)
{
print_revision (progname, revision);
void
print_help (void)
{
print_revision (progname, revision);
- printf (_("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>\n"));
- printf (_(COPYRIGHT), copyright, email);
+ printf ("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>\n");
+ printf (COPYRIGHT, copyright, email);
printf (_("\
This plugin tests the HTTP service on the specified host. It can test\n\
normal (http) and secure (https) servers, follow redirects, search for\n\
strings and regular expressions, check connection times, and report on\n\
printf (_("\
This plugin tests the HTTP service on the specified host. It can test\n\
normal (http) and secure (https) servers, follow redirects, search for\n\
strings and regular expressions, check connection times, and report on\n\
-certificate expiration times.\n"));
+certificate expiration times.\n\n"));
print_usage ();
print_usage ();
printf (_("\
-H, --hostname=ADDRESS\n\
Host name argument for servers using host headers (virtual host)\n\
printf (_("\
-H, --hostname=ADDRESS\n\
Host name argument for servers using host headers (virtual host)\n\
+ Append a port to include it in the header (eg: example.com:5000)\n\
-I, --IP-address=ADDRESS\n\
IP address or name (use numeric address if possible to bypass DNS lookup).\n\
-p, --port=INTEGER\n\
-I, --IP-address=ADDRESS\n\
IP address or name (use numeric address if possible to bypass DNS lookup).\n\
-p, --port=INTEGER\n\
URL to GET or POST (default: /)\n\
-P, --post=STRING\n\
URL encoded http POST data\n\
URL to GET or POST (default: /)\n\
-P, --post=STRING\n\
URL encoded http POST data\n\
+ -N, --no-body\n\
+ Don't wait for document body: stop reading after headers.\n\
+ (Note that this still does an HTTP GET or POST, not a HEAD.)\n\
+ -M, --max-age=SECONDS\n\
+ Warn if document is more than SECONDS old. the number can also be of \n\
+ the form \"10m\" for minutes, \"10h\" for hours, or \"10d\" for days.\n\
-T, --content-type=STRING\n\
specify Content-Type header media type when POSTing\n"), HTTP_EXPECT);
-T, --content-type=STRING\n\
specify Content-Type header media type when POSTing\n"), HTTP_EXPECT);
printf (_("\
-a, --authorization=AUTH_PAIR\n\
Username:password on sites with basic authentication\n\
printf (_("\
-a, --authorization=AUTH_PAIR\n\
Username:password on sites with basic authentication\n\
+ -A, --useragent=STRING\n\
+ String to be sent in http header as \"User Agent\"\n\
+ -k, --header=STRING\n\
+ Any other tags to be sent in http header, separated by semicolon\n\
-L, --link=URL\n\
Wrap output in HTML link (obsoleted by urlize)\n\
-f, --onredirect=<ok|warning|critical|follow>\n\
-L, --link=URL\n\
Wrap output in HTML link (obsoleted by urlize)\n\
-f, --onredirect=<ok|warning|critical|follow>\n\
-
void
print_usage (void)
{
void
print_usage (void)
{
- printf (_("\
-Usage: %s (-H <vhost> | -I <IP-address>) [-u <uri>] [-p <port>]\n\
- [-w <warn time>] [-c <critical time>] [-t <timeout>] [-L]\n\
- [-a auth] [-f <ok | warn | critcal | follow>] [-e <expect>]\n\
- [-s string] [-l] [-r <regex> | -R <case-insensitive regex>]\n\
- [-P string] [-m min_pg_size] [-4|-6]\n"), progname);
- printf (_(UT_HLP_VRS), progname, progname);
+ printf ("\
+Usage: %s -H <vhost> | -I <IP-address>) [-u <uri>] [-p <port>]\n\
+ [-w <warn time>] [-c <critical time>] [-t <timeout>] [-L]\n\
+ [-a auth] [-f <ok | warn | critcal | follow>] [-e <expect>]\n\
+ [-s string] [-l] [-r <regex> | -R <case-insensitive regex>]\n\
+ [-P string] [-m min_pg_size] [-4|-6] [-N] [-M <age>]\n\
+ [-A string] [-k string]\n", progname);
}
}