Module: monitoring-plugins
    Branch: master
    Commit: ce85affd208cd8c873dd88c17b8d3d0540c8872e
    Author: Patrick Uiterwijk <patr...@puiterwijk.org>
 Committer: Franz Schwartau <fr...@electromail.org>
      Date: Thu Dec 13 18:24:53 2018 +0100
       URL: 
https://www.monitoring-plugins.org/repositories/monitoring-plugins/commit/?id=ce85aff

check_smtp: Add option to prefix PROXY header

This enables checks of SMTP servers that expect the haproxy
PROXY protocol:  -o smtpd_upstream_proxy_protocol=haproxy.

Backported from nagios-plugins:
https://github.com/nagios-plugins/nagios-plugins/commit/3246efe923b5482c5024c40e593ce942e628a3cb

---

 plugins/check_smtp.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/plugins/check_smtp.c b/plugins/check_smtp.c
index eaa7eeb..addabfc 100644
--- a/plugins/check_smtp.c
+++ b/plugins/check_smtp.c
@@ -52,6 +52,7 @@ int days_till_exp_warn, days_till_exp_crit;
 enum {
        SMTP_PORT       = 25
 };
+#define PROXY_PREFIX "PROXY TCP4 0.0.0.0 0.0.0.0 25 25\r\n"
 #define SMTP_EXPECT "220"
 #define SMTP_HELO "HELO "
 #define SMTP_EHLO "EHLO "
@@ -102,6 +103,7 @@ double critical_time = 0;
 int check_critical_time = FALSE;
 int verbose = 0;
 int use_ssl = FALSE;
+short use_proxy_prefix = FALSE;
 short use_ehlo = FALSE;
 short use_lhlo = FALSE;
 short ssl_established = 0;
@@ -184,6 +186,13 @@ main (int argc, char **argv)
 
        if (result == STATE_OK) { /* we connected */
 
+               /* If requested, send PROXY header */
+               if (use_proxy_prefix) {
+                       if (verbose)
+                               printf ("Sending header %s\n", PROXY_PREFIX);
+                       send(sd, PROXY_PREFIX, strlen(PROXY_PREFIX), 0);
+               }
+
                /* watch for the SMTP connection string and */
                /* return a WARNING status if we couldn't read any data */
                if (recvlines(buffer, MAX_INPUT_BUFFER) <= 0) {
@@ -478,6 +487,7 @@ process_arguments (int argc, char **argv)
                {"starttls",no_argument,0,'S'},
                {"certificate",required_argument,0,'D'},
                {"ignore-quit-failure",no_argument,0,'q'},
+               {"proxy",no_argument,0,'r'},
                {0, 0, 0, 0}
        };
 
@@ -494,7 +504,7 @@ process_arguments (int argc, char **argv)
        }
 
        while (1) {
-               c = getopt_long (argc, argv, 
"+hVv46Lt:p:f:e:c:w:H:C:R:SD:F:A:U:P:q",
+               c = getopt_long (argc, argv, 
"+hVv46Lrt:p:f:e:c:w:H:C:R:SD:F:A:U:P:q",
                                 longopts, &option);
 
                if (c == -1 || c == EOF)
@@ -621,6 +631,9 @@ process_arguments (int argc, char **argv)
                        use_ssl = TRUE;
                        use_ehlo = TRUE;
                        break;
+               case 'r':
+                       use_proxy_prefix = TRUE;
+                       break;
                case 'L':
                        use_lhlo = TRUE;
                        break;
@@ -819,6 +832,8 @@ print_help (void)
   printf ("    %s\n", _("FROM-address to include in MAIL command, required by 
Exchange 2000")),
   printf (" %s\n", "-F, --fqdn=STRING");
   printf ("    %s\n", _("FQDN used for HELO"));
+  printf (" %s\n", "-r, --proxy");
+  printf ("    %s\n", _("Use PROXY protocol prefix for the connection."));
 #ifdef HAVE_SSL
   printf (" %s\n", "-D, --certificate=INTEGER[,INTEGER]");
   printf ("    %s\n", _("Minimum number of days a certificate has to be 
valid."));

Reply via email to