128 lines
3.7 KiB
Diff
128 lines
3.7 KiB
Diff
From 9bb312d3a1ee8c6ddcbf2f8e106cea457487b0aa Mon Sep 17 00:00:00 2001
|
|
From: Pasi Kärkkäinen <pasik@iki.fi>
|
|
Date: Mon, 19 Aug 2013 11:15:16 -0500
|
|
Subject: [PATCH] Add To header for SMTP alerts.
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Signed-off-by: Pasi Kärkkäinen <pasik@iki.fi>
|
|
---
|
|
keepalived/core/smtp.c | 42 +++++++++++++++++++++++++++++++++++++++++-
|
|
keepalived/include/smtp.h | 4 +++-
|
|
2 files changed, 44 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/keepalived/core/smtp.c b/keepalived/core/smtp.c
|
|
index ff9df02..fd414c4 100644
|
|
--- a/keepalived/core/smtp.c
|
|
+++ b/keepalived/core/smtp.c
|
|
@@ -80,6 +80,7 @@ free_smtp_all(smtp_thread_arg * smtp_arg)
|
|
FREE(smtp_arg->buffer);
|
|
FREE(smtp_arg->subject);
|
|
FREE(smtp_arg->body);
|
|
+ FREE(smtp_arg->email_to);
|
|
FREE(smtp_arg);
|
|
}
|
|
|
|
@@ -435,6 +436,43 @@ data_code(thread_t * thread, int status)
|
|
return 0;
|
|
}
|
|
|
|
+/*
|
|
+ * Build a comma separated string of smtp recipient email addresses
|
|
+ * for the email message To-header.
|
|
+ */
|
|
+void
|
|
+build_to_header_rcpt_addrs(smtp_thread_arg *smtp_arg)
|
|
+{
|
|
+ char *fetched_email;
|
|
+ char *email_to_addrs;
|
|
+ int email_addrs_max;
|
|
+
|
|
+ if (smtp_arg == NULL) return;
|
|
+ email_to_addrs = smtp_arg->email_to;
|
|
+ smtp_arg->email_it = 0;
|
|
+
|
|
+ email_addrs_max = (SMTP_BUFFER_MAX / SMTP_EMAIL_ADDR_MAX_LENGTH) - 1;
|
|
+
|
|
+ while ((fetched_email = fetch_next_email(smtp_arg)) != NULL) {
|
|
+
|
|
+ /* First email address, so no need for "," */
|
|
+ if (smtp_arg->email_it == 0) {
|
|
+ snprintf(email_to_addrs, SMTP_EMAIL_ADDR_MAX_LENGTH, "%s", fetched_email);
|
|
+ }
|
|
+ else {
|
|
+ strcat(email_to_addrs, ", ");
|
|
+ strncat(email_to_addrs, fetched_email, SMTP_EMAIL_ADDR_MAX_LENGTH);
|
|
+ }
|
|
+
|
|
+ smtp_arg->email_it++;
|
|
+ if (smtp_arg->email_it >= email_addrs_max)
|
|
+ break;
|
|
+
|
|
+ }
|
|
+
|
|
+ smtp_arg->email_it = 0;
|
|
+}
|
|
+
|
|
/* BODY command processing.
|
|
* Do we need to use mutli-thread for multi-part body
|
|
* handling ? Don t really think :)
|
|
@@ -453,7 +491,7 @@ body_cmd(thread_t * thread)
|
|
strftime(rfc822, sizeof(rfc822), "%a, %d %b %Y %H:%M:%S %z", gmtime(&tm));
|
|
|
|
snprintf(buffer, SMTP_BUFFER_MAX, SMTP_HEADERS_CMD,
|
|
- rfc822, global_data->email_from, smtp_arg->subject);
|
|
+ rfc822, global_data->email_from, smtp_arg->subject, smtp_arg->email_to);
|
|
|
|
/* send the subject field */
|
|
if (send(thread->u.fd, buffer, strlen(buffer), 0) == -1)
|
|
@@ -548,6 +586,7 @@ smtp_alert(real_server * rs, vrrp_rt * vrrp,
|
|
smtp_arg->subject = (char *) MALLOC(MAX_HEADERS_LENGTH);
|
|
smtp_arg->body = (char *) MALLOC(MAX_BODY_LENGTH);
|
|
smtp_arg->buffer = (char *) MALLOC(SMTP_BUFFER_MAX);
|
|
+ smtp_arg->email_to = (char *) MALLOC(SMTP_BUFFER_MAX);
|
|
|
|
/* format subject if rserver is specified */
|
|
if (rs) {
|
|
@@ -571,6 +610,7 @@ smtp_alert(real_server * rs, vrrp_rt * vrrp,
|
|
subject);
|
|
|
|
strncpy(smtp_arg->body, body, MAX_BODY_LENGTH);
|
|
+ build_to_header_rcpt_addrs(smtp_arg);
|
|
|
|
smtp_connect(smtp_arg);
|
|
}
|
|
diff --git a/keepalived/include/smtp.h b/keepalived/include/smtp.h
|
|
index b7f848b..f43aec9 100644
|
|
--- a/keepalived/include/smtp.h
|
|
+++ b/keepalived/include/smtp.h
|
|
@@ -39,6 +39,7 @@
|
|
#define SMTP_BUFFER_LENGTH 512
|
|
#define SMTP_BUFFER_MAX 1024
|
|
#define SMTP_MAX_FSM_STATE 10
|
|
+#define SMTP_EMAIL_ADDR_MAX_LENGTH 64
|
|
|
|
/* SMTP command stage */
|
|
#define HELO 4
|
|
@@ -75,6 +76,7 @@ typedef struct _smtp_thread_arg {
|
|
char *subject;
|
|
char *body;
|
|
char *buffer;
|
|
+ char *email_to;
|
|
long buflen;
|
|
} smtp_thread_arg;
|
|
|
|
@@ -84,7 +86,7 @@ typedef struct _smtp_thread_arg {
|
|
#define SMTP_RCPT_CMD "RCPT TO:<%s>\r\n"
|
|
#define SMTP_DATA_CMD "DATA\r\n"
|
|
#define SMTP_HEADERS_CMD "Date: %s\r\nFrom: %s\r\nSubject: %s\r\n" \
|
|
- "X-Mailer: Keepalived\r\n\r\n"
|
|
+ "X-Mailer: Keepalived\r\nTo: %s\r\n\r\n"
|
|
#define SMTP_BODY_CMD "%s\r\n"
|
|
#define SMTP_SEND_CMD "\r\n.\r\n"
|
|
#define SMTP_QUIT_CMD "QUIT\r\n"
|
|
--
|
|
1.8.1.4
|
|
|