From ce85affd208cd8c873dd88c17b8d3d0540c8872e Mon Sep 17 00:00:00 2001 From: Patrick Uiterwijk Date: Thu, 13 Dec 2018 18:24:53 +0100 Subject: 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 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.")); -- cgit v0.10-9-g596f