Package: nagios-plugins
Version: 1.4.16-1
Severity: normal
Tags: patch upstream

Dear Maintainer,

we have two webservers behind a loadbalancer. The LB acts as a NAT and
PAT gateway, so requests to www.uni-paderborn.de:80 are forwarded to
siri1.uni-paderborn.de:5033 and siri2.uni-paderborn.de:5033.

Now I want to monitor both webservers, not only the LB. So I want to
use check_http with the following options:

check_http -I siri1 -p 5033 -H www.uni-paderborn.de:80

But in this case the current version of check_http (also checked the version in
unstable, same result) creates an HTTP request to siri1:80 which is wrong.

If I leave out the ":80" in the virtual host the request is wrong also:

check_http -I siri1 -p 5033 -H www.uni-paderborn.de -v | grep Host
Host: www.uni-paderborn.de:5033

So the plugin does distinguish between physical and virtual host names,
but it does NOT distinguish between physical and virtual ports.

I have already reported this bug upstream as bug id 3442015 two years ago
but have never received any answer. A patch was included also. This patch
still applies cleanly to the current version.

http://sourceforge.net/tracker/?func=detail&aid=3442015&group_id=29880&atid=397599


Christopher

-- System Information:
Debian Release: 7.1
  APT prefers stable
  APT policy: (700, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 3.2.0-4-amd64 (SMP w/4 CPU cores)
Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages nagios-plugins depends on:
ii  nagios-plugins-basic     1.4.16-1
ii  nagios-plugins-standard  1.4.16-1

Versions of packages nagios-plugins recommends:
pn  nagios-plugins-contrib  <none>

Versions of packages nagios-plugins suggests:
ii  icinga  1.7.1-6

-- no debconf information
#! /bin/sh /usr/share/dpatch/dpatch-run
## check_http_virtual_ports.dpatch by Christopher Odenbach <odenb...@uni-paderborn.de>
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: Patch for check_http to understand the concept of virtual ports

@DPATCH@

--- nagios-plugins-1.4.15/plugins/check_http.c	2011-11-28 16:35:25.000000000 +0000
+++ nagios-plugins-1.4.15.new/plugins/check_http.c	2011-11-28 13:26:56.000000000 +0000
@@ -90,10 +90,12 @@
 
 int specify_port = FALSE;
 int server_port = HTTP_PORT;
+int virtual_port = 0;
 char server_port_text[6] = "";
 char server_type[6] = "http";
 char *server_address;
 char *host_name;
+int host_name_length;
 char *server_url;
 char *user_agent;
 int server_url_length;
@@ -334,11 +336,25 @@
     case 'H': /* Host Name (virtual host) */
       host_name = strdup (optarg);
       if (host_name[0] == '[') {
-        if ((p = strstr (host_name, "]:")) != NULL) /* [IPv6]:port */
-          server_port = atoi (p + 2);
+        if ((p = strstr (host_name, "]:")) != NULL) { /* [IPv6]:port */
+          virtual_port = atoi (p + 2);
+          /* cut off the port */
+	  host_name_length = strlen (host_name) - strlen (p) - 1;
+          free (host_name);
+          host_name = strndup (optarg, host_name_length);
+          if (specify_port == FALSE)
+            server_port = virtual_port;
+	}
       } else if ((p = strchr (host_name, ':')) != NULL
-                 && strchr (++p, ':') == NULL) /* IPv4:port or host:port */
-          server_port = atoi (p);
+                 && strchr (++p, ':') == NULL) { /* IPv4:port or host:port */
+          virtual_port = atoi (p);
+          /* cut off the port */
+	  host_name_length = strlen (host_name) - strlen (p) - 1;
+          free (host_name);
+          host_name = strndup (optarg, host_name_length);
+          if (specify_port == FALSE)
+            server_port = virtual_port;
+        }  
       break;
     case 'I': /* Server IP-address */
       server_address = strdup (optarg);
@@ -484,6 +500,9 @@
   if (http_method == NULL)
     http_method = strdup ("GET");
 
+  if (virtual_port == 0)
+    virtual_port = server_port;
+  
   return TRUE;
 }
 
@@ -829,11 +848,11 @@
      * 14.23).  Some server applications/configurations cause trouble if the
      * (default) port is explicitly specified in the "Host:" header line.
      */
-    if ((use_ssl == FALSE && server_port == HTTP_PORT) ||
-        (use_ssl == TRUE && server_port == HTTPS_PORT))
+    if ((use_ssl == FALSE && virtual_port == HTTP_PORT) ||
+        (use_ssl == TRUE && virtual_port == HTTPS_PORT))
       asprintf (&buf, "%sHost: %s\r\n", buf, host_name);
     else
-      asprintf (&buf, "%sHost: %s:%d\r\n", buf, host_name, server_port);
+      asprintf (&buf, "%sHost: %s:%d\r\n", buf, host_name, virtual_port);
   }
 
   /* optionally send any other header tag */
@@ -1255,6 +1274,9 @@
          MAX_PORT, server_type, server_address, server_port, server_url,
          display_html ? "</A>" : "");
 
+  /* reset virtual port */
+  virtual_port = server_port;
+  
   if (verbose)
     printf (_("Redirection to %s://%s:%d%s\n"), server_type,
             host_name ? host_name : server_address, server_port, server_url);

Reply via email to