diff options
Diffstat (limited to 'plugins/check_smtp.c')
| -rw-r--r-- | plugins/check_smtp.c | 52 |
1 files changed, 29 insertions, 23 deletions
diff --git a/plugins/check_smtp.c b/plugins/check_smtp.c index 1996c6d3..d37c57c8 100644 --- a/plugins/check_smtp.c +++ b/plugins/check_smtp.c | |||
| @@ -59,10 +59,6 @@ enum { | |||
| 59 | #define SMTP_STARTTLS "STARTTLS\r\n" | 59 | #define SMTP_STARTTLS "STARTTLS\r\n" |
| 60 | #define SMTP_AUTH_LOGIN "AUTH LOGIN\r\n" | 60 | #define SMTP_AUTH_LOGIN "AUTH LOGIN\r\n" |
| 61 | 61 | ||
| 62 | #ifndef HOST_MAX_BYTES | ||
| 63 | #define HOST_MAX_BYTES 255 | ||
| 64 | #endif | ||
| 65 | |||
| 66 | #define EHLO_SUPPORTS_STARTTLS 1 | 62 | #define EHLO_SUPPORTS_STARTTLS 1 |
| 67 | 63 | ||
| 68 | int process_arguments (int, char **); | 64 | int process_arguments (int, char **); |
| @@ -128,6 +124,7 @@ main (int argc, char **argv) | |||
| 128 | char *cmd_str = NULL; | 124 | char *cmd_str = NULL; |
| 129 | char *helocmd = NULL; | 125 | char *helocmd = NULL; |
| 130 | char *error_msg = ""; | 126 | char *error_msg = ""; |
| 127 | char *server_response = NULL; | ||
| 131 | struct timeval tv; | 128 | struct timeval tv; |
| 132 | 129 | ||
| 133 | /* Catch pipe errors in read/write - sometimes occurs when writing QUIT */ | 130 | /* Catch pipe errors in read/write - sometimes occurs when writing QUIT */ |
| @@ -189,21 +186,9 @@ main (int argc, char **argv) | |||
| 189 | printf (_("recv() failed\n")); | 186 | printf (_("recv() failed\n")); |
| 190 | return STATE_WARNING; | 187 | return STATE_WARNING; |
| 191 | } | 188 | } |
| 192 | else { | 189 | |
| 193 | if (verbose) | 190 | /* save connect return (220 hostname ..) for later use */ |
| 194 | printf ("%s", buffer); | 191 | xasprintf(&server_response, "%s", buffer); |
| 195 | /* strip the buffer of carriage returns */ | ||
| 196 | strip (buffer); | ||
| 197 | /* make sure we find the response we are looking for */ | ||
| 198 | if (!strstr (buffer, server_expect)) { | ||
| 199 | if (server_port == SMTP_PORT) | ||
| 200 | printf (_("Invalid SMTP response received from host: %s\n"), buffer); | ||
| 201 | else | ||
| 202 | printf (_("Invalid SMTP response received from host on port %d: %s\n"), | ||
| 203 | server_port, buffer); | ||
| 204 | return STATE_WARNING; | ||
| 205 | } | ||
| 206 | } | ||
| 207 | 192 | ||
| 208 | /* send the HELO/EHLO command */ | 193 | /* send the HELO/EHLO command */ |
| 209 | send(sd, helocmd, strlen(helocmd), 0); | 194 | send(sd, helocmd, strlen(helocmd), 0); |
| @@ -239,8 +224,8 @@ main (int argc, char **argv) | |||
| 239 | result = np_net_ssl_init(sd); | 224 | result = np_net_ssl_init(sd); |
| 240 | if(result != STATE_OK) { | 225 | if(result != STATE_OK) { |
| 241 | printf (_("CRITICAL - Cannot create SSL context.\n")); | 226 | printf (_("CRITICAL - Cannot create SSL context.\n")); |
| 242 | np_net_ssl_cleanup(); | ||
| 243 | close(sd); | 227 | close(sd); |
| 228 | np_net_ssl_cleanup(); | ||
| 244 | return STATE_CRITICAL; | 229 | return STATE_CRITICAL; |
| 245 | } else { | 230 | } else { |
| 246 | ssl_established = 1; | 231 | ssl_established = 1; |
| @@ -284,12 +269,31 @@ main (int argc, char **argv) | |||
| 284 | } | 269 | } |
| 285 | #endif | 270 | #endif |
| 286 | 271 | ||
| 272 | if (verbose) | ||
| 273 | printf ("%s", buffer); | ||
| 274 | |||
| 275 | /* save buffer for later use */ | ||
| 276 | xasprintf(&server_response, "%s%s", server_response, buffer); | ||
| 277 | /* strip the buffer of carriage returns */ | ||
| 278 | strip (server_response); | ||
| 279 | |||
| 280 | /* make sure we find the droids we are looking for */ | ||
| 281 | if (!strstr (server_response, server_expect)) { | ||
| 282 | if (server_port == SMTP_PORT) | ||
| 283 | printf (_("Invalid SMTP response received from host: %s\n"), server_response); | ||
| 284 | else | ||
| 285 | printf (_("Invalid SMTP response received from host on port %d: %s\n"), | ||
| 286 | server_port, server_response); | ||
| 287 | return STATE_WARNING; | ||
| 288 | } | ||
| 289 | |||
| 287 | if (send_mail_from) { | 290 | if (send_mail_from) { |
| 288 | my_send(cmd_str, strlen(cmd_str)); | 291 | my_send(cmd_str, strlen(cmd_str)); |
| 289 | if (recvlines(buffer, MAX_INPUT_BUFFER) >= 1 && verbose) | 292 | if (recvlines(buffer, MAX_INPUT_BUFFER) >= 1 && verbose) |
| 290 | printf("%s", buffer); | 293 | printf("%s", buffer); |
| 291 | } | 294 | } |
| 292 | 295 | ||
| 296 | n = 0; | ||
| 293 | while (n < ncommands) { | 297 | while (n < ncommands) { |
| 294 | xasprintf (&cmd_str, "%s%s", commands[n], "\r\n"); | 298 | xasprintf (&cmd_str, "%s%s", commands[n], "\r\n"); |
| 295 | my_send(cmd_str, strlen(cmd_str)); | 299 | my_send(cmd_str, strlen(cmd_str)); |
| @@ -764,10 +768,12 @@ recvlines(char *buf, size_t bufsize) | |||
| 764 | int | 768 | int |
| 765 | my_close (void) | 769 | my_close (void) |
| 766 | { | 770 | { |
| 771 | int result; | ||
| 772 | result = close(sd); | ||
| 767 | #ifdef HAVE_SSL | 773 | #ifdef HAVE_SSL |
| 768 | np_net_ssl_cleanup(); | 774 | np_net_ssl_cleanup(); |
| 769 | #endif | 775 | #endif |
| 770 | return close(sd); | 776 | return result; |
| 771 | } | 777 | } |
| 772 | 778 | ||
| 773 | 779 | ||
| @@ -830,7 +836,7 @@ print_help (void) | |||
| 830 | printf("\n"); | 836 | printf("\n"); |
| 831 | printf ("%s\n", _("Successul connects return STATE_OK, refusals and timeouts return")); | 837 | printf ("%s\n", _("Successul connects return STATE_OK, refusals and timeouts return")); |
| 832 | printf ("%s\n", _("STATE_CRITICAL, other errors return STATE_UNKNOWN. Successful")); | 838 | printf ("%s\n", _("STATE_CRITICAL, other errors return STATE_UNKNOWN. Successful")); |
| 833 | printf ("%s\n", _("connects, but incorrect reponse messages from the host result in")); | 839 | printf ("%s\n", _("connects, but incorrect response messages from the host result in")); |
| 834 | printf ("%s\n", _("STATE_WARNING return values.")); | 840 | printf ("%s\n", _("STATE_WARNING return values.")); |
| 835 | 841 | ||
| 836 | printf (UT_SUPPORT); | 842 | printf (UT_SUPPORT); |
