X-Git-Url: https://git.octo.it/?p=collectd.git;a=blobdiff_plain;f=src%2Fnotify_email.c;h=08f865fc2c57805866ce3475a3ec9b3a77ed0e9a;hp=dc4e47f73cc29990a46b3a0f9f6914f11b3e2a21;hb=61a1fa91ba73e4fe3a34949f77c5f017056f2b7a;hpb=2c2e9a297f59c110ddd4adef6293fe80f39f15b7 diff --git a/src/notify_email.c b/src/notify_email.c index dc4e47f7..08f865fc 100644 --- a/src/notify_email.c +++ b/src/notify_email.c @@ -1,6 +1,7 @@ /** * collectd - src/notify_email.c * Copyright (C) 2008 Oleg King + * Copyright (C) 2010 Florian Forster * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -18,6 +19,7 @@ * * Authors: * Oleg King + * Florian Forster **/ #include "collectd.h" @@ -26,6 +28,7 @@ #include #include +#include #define MAXSTRING 256 @@ -45,6 +48,7 @@ static char **recipients; static int recipients_len = 0; static smtp_session_t session; +static pthread_mutex_t session_lock = PTHREAD_MUTEX_INITIALIZER; static smtp_message_t message; static auth_context_t authctx = NULL; @@ -61,7 +65,7 @@ static char *email_subject = NULL; /* Callback to get username and password */ static int authinteract (auth_client_request_t request, char **result, - int fields, void *arg) + int fields, void __attribute__((unused)) *arg) { int i; for (i = 0; i < fields; i++) @@ -78,7 +82,7 @@ static int authinteract (auth_client_request_t request, char **result, /* Callback to print the recipient status */ static void print_recipient_status (smtp_recipient_t recipient, - const char *mailbox, void *arg) + const char *mailbox, void __attribute__((unused)) *arg) { const smtp_status_t *status; @@ -90,7 +94,8 @@ static void print_recipient_status (smtp_recipient_t recipient, } /* void print_recipient_status */ /* Callback to monitor SMTP activity */ -static void monitor_cb (const char *buf, int buflen, int writing, void *arg) +static void monitor_cb (const char *buf, int buflen, int writing, + void __attribute__((unused)) *arg) { char log_str[MAXSTRING]; @@ -112,17 +117,23 @@ static int notify_email_init (void) { char server[MAXSTRING]; + ssnprintf(server, sizeof (server), "%s:%i", + (smtp_host == NULL) ? DEFAULT_SMTP_HOST : smtp_host, + smtp_port); + + pthread_mutex_lock (&session_lock); + auth_client_init(); - if (!(session = smtp_create_session ())) { + + session = smtp_create_session (); + if (session == NULL) { + pthread_mutex_unlock (&session_lock); ERROR ("notify_email plugin: cannot create SMTP session"); return (-1); } smtp_set_monitorcb (session, monitor_cb, NULL, 1); smtp_set_hostname (session, hostname_g); - ssnprintf(server, sizeof (server), "%s:%i", - (smtp_host == NULL) ? DEFAULT_SMTP_HOST : smtp_host, - smtp_port); smtp_set_server (session, server); if (smtp_user && smtp_password) { @@ -132,18 +143,30 @@ static int notify_email_init (void) } if ( !smtp_auth_set_context (session, authctx)) { + pthread_mutex_unlock (&session_lock); ERROR ("notify_email plugin: cannot set SMTP auth context"); return (-1); } + pthread_mutex_unlock (&session_lock); return (0); } /* int notify_email_init */ static int notify_email_shutdown (void) { - smtp_destroy_session (session); - auth_destroy_context (authctx); + pthread_mutex_lock (&session_lock); + + if (session != NULL) + smtp_destroy_session (session); + session = NULL; + + if (authctx != NULL) + auth_destroy_context (authctx); + authctx = NULL; + auth_client_exit(); + + pthread_mutex_unlock (&session_lock); return (0); } /* int notify_email_shutdown */ @@ -202,9 +225,9 @@ static int notify_email_config (const char *key, const char *value) return 0; } /* int notify_email_config (const char *, const char *) */ -static int notify_email_notification (const notification_t *n) +static int notify_email_notification (const notification_t *n, + user_data_t __attribute__((unused)) *user_data) { - smtp_recipient_t recipient; struct tm timestamp_tm; char timestamp_str[64]; @@ -246,7 +269,16 @@ static int notify_email_notification (const notification_t *n) n->host, n->message); + pthread_mutex_lock (&session_lock); + + if (session == NULL) { + /* Initialization failed or we're in the process of shutting down. */ + pthread_mutex_unlock (&session_lock); + return (-1); + } + if (!(message = smtp_add_message (session))) { + pthread_mutex_unlock (&session_lock); ERROR ("notify_email plugin: cannot set SMTP message"); return (-1); } @@ -255,23 +287,30 @@ static int notify_email_notification (const notification_t *n) smtp_set_message_str (message, buf); for (i = 0; i < recipients_len; i++) - recipient = smtp_add_recipient (message, recipients[i]); + smtp_add_recipient (message, recipients[i]); /* Initiate a connection to the SMTP server and transfer the message. */ if (!smtp_start_session (session)) { char buf[MAXSTRING]; ERROR ("notify_email plugin: SMTP server problem: %s", smtp_strerror (smtp_errno (), buf, sizeof buf)); + pthread_mutex_unlock (&session_lock); return (-1); } else { - const smtp_status_t *status; - /* Report on the success or otherwise of the mail transfer. */ - status = smtp_message_transfer_status (message); - DEBUG ("notify_email plugin: SMTP server report: %d %s", + #if COLLECT_DEBUG + const smtp_status_t *status; + /* Report on the success or otherwise of the mail transfer. */ + status = smtp_message_transfer_status (message); + DEBUG ("notify_email plugin: SMTP server report: %d %s", status->code, (status->text != NULL) ? status->text : "\n"); + #else + //I don't know if the function below has side affects so i'm calling it to be on the safe side. + smtp_message_transfer_status (message); + #endif smtp_enumerate_recipients (message, print_recipient_status, NULL); } + pthread_mutex_unlock (&session_lock); return (0); } /* int notify_email_notification */ @@ -281,7 +320,8 @@ void module_register (void) plugin_register_shutdown ("notify_email", notify_email_shutdown); plugin_register_config ("notify_email", notify_email_config, config_keys, config_keys_num); - plugin_register_notification ("notify_email", notify_email_notification); + plugin_register_notification ("notify_email", notify_email_notification, + /* user_data = */ NULL); } /* void module_register (void) */ /* vim: set sw=2 sts=2 ts=8 et : */