diff options
Diffstat (limited to 'plugins/check_smtp.c')
-rw-r--r-- | plugins/check_smtp.c | 218 |
1 files changed, 20 insertions, 198 deletions
diff --git a/plugins/check_smtp.c b/plugins/check_smtp.c index 19e9aea8..ad85c7f6 100644 --- a/plugins/check_smtp.c +++ b/plugins/check_smtp.c @@ -27,35 +27,14 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net"; #include "netutils.h" #include "utils.h" -#ifdef HAVE_SSL_H -# include <rsa.h> -# include <crypto.h> -# include <x509.h> -# include <pem.h> -# include <ssl.h> -# include <err.h> -#else -# ifdef HAVE_OPENSSL_SSL_H -# include <openssl/rsa.h> -# include <openssl/crypto.h> -# include <openssl/x509.h> -# include <openssl/pem.h> -# include <openssl/ssl.h> -# include <openssl/err.h> -# endif -#endif - #ifdef HAVE_SSL - int check_cert = FALSE; int days_till_exp; -SSL_CTX *ctx; -SSL *ssl; -X509 *server_cert; -int connect_STARTTLS (void); -# ifdef USE_OPENSSL -int check_certificate (X509 **); -# endif +# define my_recv(buf, len) ((use_ssl && ssl_established) ? np_net_ssl_read(buf, len) : read(sd, buf, len)) +# define my_send(buf, len) ((use_ssl && ssl_established) ? np_net_ssl_write(buf, len) : send(sd, buf, len, 0)) +#else /* ifndef HAVE_SSL */ +# define my_recv(buf, len) read(sd, buf, len) +# define my_send(buf, len) send(sd, buf, len, 0) #endif enum { @@ -77,7 +56,6 @@ int process_arguments (int, char **); int validate_arguments (void); void print_help (void); void print_usage (void); -int myrecv(void); int my_close(void); #ifdef HAVE_REGEX_H @@ -111,7 +89,7 @@ int check_critical_time = FALSE; int verbose = 0; int use_ssl = FALSE; short use_ehlo = FALSE; -short ssl_established = TRUE; +short ssl_established = 0; char *localhostname = NULL; int sd; char buffer[MAX_INPUT_BUFFER]; @@ -237,22 +215,20 @@ main (int argc, char **argv) send (sd, SMTP_QUIT, strlen (SMTP_QUIT), 0); return STATE_UNKNOWN; } - if(connect_STARTTLS() != OK) { + result = np_net_ssl_init(sd); + if(result != STATE_OK) { printf (_("CRITICAL - Cannot create SSL context.\n")); + np_net_ssl_cleanup(); + close(sd); return STATE_CRITICAL; } else { - ssl_established = TRUE; + ssl_established = 1; } # ifdef USE_OPENSSL if ( check_cert ) { - if ((server_cert = SSL_get_peer_certificate (ssl)) != NULL) { - result = check_certificate (&server_cert); - X509_free(server_cert); - } - else { + result = np_net_ssl_check_cert(days_till_exp); + if(result != STATE_OK){ printf (_("CRITICAL - Cannot retrieve server certificate.\n")); - result = STATE_CRITICAL; - } my_close(); return result; @@ -272,26 +248,16 @@ main (int argc, char **argv) * Use the -f option to provide a FROM address */ if (smtp_use_dummycmd) { -#ifdef HAVE_SSL - if (use_ssl) - SSL_write(ssl, cmd_str, strlen(cmd_str)); - else -#endif - send(sd, cmd_str, strlen(cmd_str), 0); - myrecv(); + my_send(cmd_str, strlen(cmd_str)); + my_recv(buffer, MAX_INPUT_BUFFER-1); if (verbose) printf("%s", buffer); } while (n < ncommands) { asprintf (&cmd_str, "%s%s", commands[n], "\r\n"); -#ifdef HAVE_SSL - if (use_ssl) - SSL_write(ssl,cmd_str, strlen(cmd_str)); - else -#endif - send(sd, cmd_str, strlen(cmd_str), 0); - myrecv(); + my_send(cmd_str, strlen(cmd_str)); + my_recv(buffer, MAX_INPUT_BUFFER-1); if (verbose) printf("%s", buffer); strip (buffer); @@ -328,12 +294,7 @@ main (int argc, char **argv) } /* tell the server we're done */ -#ifdef HAVE_SSL - if (use_ssl) - SSL_write(ssl,SMTP_QUIT, strlen (SMTP_QUIT)); - else -#endif - send (sd, SMTP_QUIT, strlen (SMTP_QUIT), 0); + my_send (SMTP_QUIT, strlen (SMTP_QUIT)); /* finally close the connection */ close (sd); @@ -626,150 +587,11 @@ Usage: %s -H host [-p port] [-e expect] [-C command] [-f from addr]\n\ [-w warn] [-c crit] [-t timeout] [-S] [-D days] [-n] [-v] [-4|-6]\n", progname); } -#ifdef HAVE_SSL -int -connect_STARTTLS (void) -{ - SSL_METHOD *meth; - - /* Initialize SSL context */ - SSLeay_add_ssl_algorithms (); - meth = SSLv23_client_method (); - SSL_load_error_strings (); - if ((ctx = SSL_CTX_new (meth)) == NULL) - { - printf(_("CRITICAL - Cannot create SSL context.\n")); - return STATE_CRITICAL; - } - /* do the SSL handshake */ - if ((ssl = SSL_new (ctx)) != NULL) - { - SSL_set_fd (ssl, sd); - /* original version checked for -1 - I look for success instead (1) */ - if (SSL_connect (ssl) == 1) - return OK; -# ifdef USE_OPENSSL - ERR_print_errors_fp (stderr); -# endif - } - else - { - printf (_("CRITICAL - Cannot initiate SSL handshake.\n")); - } - my_close(); - - return STATE_CRITICAL; -} - -# ifdef USE_OPENSSL -int -check_certificate (X509 ** certificate) -{ - ASN1_STRING *tm; - int offset; - struct tm stamp; - int days_left; - - /* Retrieve timestamp of certificate */ - tm = X509_get_notAfter (*certificate); - - /* Generate tm structure to process timestamp */ - if (tm->type == V_ASN1_UTCTIME) { - if (tm->length < 10) { - printf (_("CRITICAL - Wrong time format in certificate.\n")); - return STATE_CRITICAL; - } - else { - stamp.tm_year = (tm->data[0] - '0') * 10 + (tm->data[1] - '0'); - if (stamp.tm_year < 50) - stamp.tm_year += 100; - offset = 0; - } - } - else { - if (tm->length < 12) { - printf (_("CRITICAL - Wrong time format in certificate.\n")); - return STATE_CRITICAL; - } - else { - stamp.tm_year = - (tm->data[0] - '0') * 1000 + (tm->data[1] - '0') * 100 + - (tm->data[2] - '0') * 10 + (tm->data[3] - '0'); - stamp.tm_year -= 1900; - offset = 2; - } - } - stamp.tm_mon = - (tm->data[2 + offset] - '0') * 10 + (tm->data[3 + offset] - '0') - 1; - stamp.tm_mday = - (tm->data[4 + offset] - '0') * 10 + (tm->data[5 + offset] - '0'); - stamp.tm_hour = - (tm->data[6 + offset] - '0') * 10 + (tm->data[7 + offset] - '0'); - stamp.tm_min = - (tm->data[8 + offset] - '0') * 10 + (tm->data[9 + offset] - '0'); - stamp.tm_sec = 0; - stamp.tm_isdst = -1; - - days_left = (mktime (&stamp) - time (NULL)) / 86400; - snprintf - (timestamp, sizeof(timestamp), "%02d/%02d/%04d %02d:%02d", - stamp.tm_mon + 1, - stamp.tm_mday, stamp.tm_year + 1900, stamp.tm_hour, stamp.tm_min); - - if (days_left > 0 && days_left <= days_till_exp) { - printf ("Certificate expires in %d day(s) (%s).\n", days_left, timestamp); - return STATE_WARNING; - } - if (days_left < 0) { - printf ("Certificate expired on %s.\n", timestamp); - return STATE_CRITICAL; - } - - if (days_left == 0) { - printf ("Certificate expires today (%s).\n", timestamp); - return STATE_WARNING; - } - - printf ("Certificate will expire on %s.\n", timestamp); - - return STATE_OK; -} -# endif /* USE_OPENSSL */ -#endif - -int -myrecv (void) -{ - int i; - -#ifdef HAVE_SSL - if (use_ssl) { - i = SSL_read (ssl, buffer, MAXBUF - 1); - } - else { -#endif - i = read (sd, buffer, MAXBUF - 1); -#ifdef HAVE_SSL - } -#endif - return i; -} - int my_close (void) { #ifdef HAVE_SSL - if (use_ssl == TRUE && ssl_established == TRUE) { - SSL_shutdown (ssl); - SSL_free (ssl); - SSL_CTX_free (ctx); - return 0; - } - else { -#endif - return close(sd); -#ifdef HAVE_SSL - } + np_net_ssl_cleanup(); #endif + return close(sd); } |