X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fnotify_email.c;h=0aed27f12bb2ac8b41b5fa4e80d586e0c71f8bca;hb=613f5b8a4a3ec711b29928ba78ab7d318ff169fc;hp=2059db4cb60a7b572aee03139b56cc4e360b1d00;hpb=1795f8bca674517bb2807b60d954803966caf74d;p=collectd.git diff --git a/src/notify_email.c b/src/notify_email.c index 2059db4c..0aed27f1 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,18 +28,19 @@ #include #include +#include #define MAXSTRING 256 static const char *config_keys[] = { - "SMTPHost", + "SMTPServer", "SMTPPort", "SMTPUser", "SMTPPassword", - "SMTPFrom", - "SMTPSubject", - "EmailTo" + "From", + "Recipient", + "Subject" }; static int config_keys_num = STATIC_ARRAY_SIZE (config_keys); @@ -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; @@ -52,8 +56,8 @@ static int smtp_port = 25; static char *smtp_host = NULL; static char *smtp_user = NULL; static char *smtp_password = NULL; -static char *smtp_from = NULL; -static char *smtp_subject = NULL; +static char *email_from = NULL; +static char *email_subject = NULL; #define DEFAULT_SMTP_HOST "localhost" #define DEFAULT_SMTP_FROM "root@localhost" @@ -61,7 +65,7 @@ static char *smtp_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,24 +143,36 @@ 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 */ static int notify_email_config (const char *key, const char *value) { - if (strcasecmp (key, "EmailTo") == 0) + if (strcasecmp (key, "Recipient") == 0) { char **tmp; @@ -167,7 +190,7 @@ static int notify_email_config (const char *key, const char *value) } recipients_len++; } - else if (0 == strcasecmp (key, "SMTPHost")) { + else if (0 == strcasecmp (key, "SMTPServer")) { sfree (smtp_host); smtp_host = strdup (value); } @@ -188,13 +211,13 @@ static int notify_email_config (const char *key, const char *value) sfree (smtp_password); smtp_password = strdup (value); } - else if (0 == strcasecmp (key, "SMTPFrom")) { - sfree (smtp_from); - smtp_from = strdup (value); + else if (0 == strcasecmp (key, "From")) { + sfree (email_from); + email_from = strdup (value); } - else if (0 == strcasecmp (key, "SMTPSubject")) { - sfree (smtp_subject); - smtp_subject = strdup (value); + else if (0 == strcasecmp (key, "Subject")) { + sfree (email_subject); + email_subject = strdup (value); } else { return -1; @@ -202,7 +225,8 @@ 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; @@ -222,7 +246,7 @@ static int notify_email_notification (const notification_t *n) : ((n->severity == NOTIF_OKAY) ? "OKAY" : "UNKNOWN"))); ssnprintf (subject, sizeof (subject), - (smtp_subject == NULL) ? DEFAULT_SMTP_SUBJECT : smtp_subject, + (email_subject == NULL) ? DEFAULT_SMTP_SUBJECT : email_subject, severity, n->host); localtime_r (&n->time, ×tamp_tm); @@ -246,11 +270,20 @@ 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); } - smtp_set_reverse_path (message, smtp_from); + smtp_set_reverse_path (message, email_from); smtp_set_header (message, "To", NULL, NULL); smtp_set_message_str (message, buf); @@ -262,6 +295,7 @@ static int notify_email_notification (const notification_t *n) 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; @@ -272,6 +306,7 @@ static int notify_email_notification (const notification_t *n) smtp_enumerate_recipients (message, print_recipient_status, NULL); } + pthread_mutex_unlock (&session_lock); return (0); } /* int notify_email_notification */ @@ -281,7 +316,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 : */