Re: [PATCH] ldirectord: Allow sending email via external SMTP server

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, May 07, 2009 at 02:09:34PM -0600, Caleb Anthony wrote:
> Attached is a new patch. This one adds two new subs:
> ld_emailalert_net_smtp and ld_emailalert_mail_send. If an SMTP server
> is set in ldirectord.cf, then ld_emailalert_net_smtp will be called
> and the email will be sent via SMTP. If an SMTP server is not set in
> ldirectord.cf then ld_emailalert_mail_send will be called and the
> email will be sent via the Mail::Send methods.
> 
> Let me know what you think.

Hi Caleb,

That looks pretty good to me. How well tested is it?

I have rediffed it against the current http://hg.linux-ha.org/dev tree.
The result is below:

Index: dev/ldirectord/ldirectord.in
===================================================================
--- dev.orig/ldirectord/ldirectord.in	2009-05-08 10:21:45.000000000 +1000
+++ dev/ldirectord/ldirectord.in	2009-05-08 10:27:02.000000000 +1000
@@ -248,6 +248,13 @@ If defined in a virtual server section t
 Default: all
 
 
+B<smtp = >I<ip_address|hostname>B<">
+
+A valid SMTP server address to use for sending email via SMTP.
+
+If defined in a virtual server section then the global value is overridden.
+
+
 B<execute = ">I<configuration>B<">
 
 Use this directive to start an instance of ldirectord for
@@ -662,6 +669,7 @@ use vars qw(
 	    $EMAILALERT
 	    $EMAILALERTFREQ
 	    $EMAILALERTSTATUS
+	    $SMTP
 	    $CLEANSTOP
 
 	    $CALLBACK
@@ -1422,6 +1430,9 @@ sub read_config
 					($1 eq "yes" || $1 eq "no")
 						or &config_error($line, "cleanstop must be 'yes' or 'no'");
 					$vsrv{cleanstop} = $1;
+				} elsif  ($rcmd =~ /^smtp\s*=\s*(.*)/) {
+					$1 =~ /(^([0-9A-Za-z._+-]+))/ or &config_error($line, "invalid SMTP server address");
+					$vsrv{smtp} = $1;
 				} else {
 					&config_error($line, "Unknown command \"$linedata\"");
 				}
@@ -1540,6 +1551,10 @@ sub read_config
 			($1 eq "yes" || $1 eq "no")
 			    or &config_error($line, "cleanstop must be 'yes' or 'no'");
 			$CLEANSTOP = $1;
+		} elsif  ($linedata  =~ /^smtp\s*=\s*(.*)/) {
+			$1 =~ /(^([0-9A-Za-z._+-]+))/ or &config_error($line,
+					"invalid SMTP server address");
+			$SMTP = $1;
 		} else {
 			if ($linedata  =~ /^timeout\s*=\s*(.*)/) {
 				&config_error($line, 
@@ -4109,14 +4124,13 @@ sub daemon_status_str
 sub ld_emailalert_send
 {
 	my ($subject, $v, $rserver, $currenttime) = (@_);
-	my $emailmsg;
-	my $emailfh;
 	my $status = 0;
 	my $to_addr;
 	my $frequency;
 	my $virtual_str;
 	my $id;
 	my $statusfilter;
+	my $smtp_server;
 
 	$frequency = defined $v->{emailalertfreq} ? $v->{emailalert} :
 				$EMAILALERTFREQ;
@@ -4143,6 +4157,72 @@ sub ld_emailalert_send
 		return 0;
 	}
 
+	$smtp_server = defined $v->{smtp} ? $v->{smtp} :
+				$SMTP;
+
+	if (defined $smtp_server) {
+		$status = &ld_emailalert_net_smtp($smtp_server, $to_addr, $subject);
+	}
+	else {
+		$status = &ld_emailalert_mail_send($to_addr, $subject);
+	}
+
+	return($status);
+}
+
+# ld_emailalert_net_smtp
+# Send email alerts via SMTP server
+# pre: smtp: SMTP server defined
+# post: message is emailed if SMTP server is valid and working
+# return: 0 on success
+#	  1 on error
+
+sub ld_emailalert_net_smtp
+{
+	my ($smtp_server, $to_addr, $subject) = (@_);
+	my $status = 0;
+
+	use Net::SMTP;
+	use Sys::Hostname;
+
+	my $hostname = hostname;
+
+	my $smtp = Net::SMTP->new($smtp_server);
+
+	if ($smtp) {
+		$smtp->mail("$ENV{USER}\@$hostname");
+		$smtp->to($to_addr);
+		$smtp->data();
+		$smtp->datasend("From: $ENV{USER}\@$hostname\n");
+		$smtp->datasend("To: $to_addr\n");
+		$smtp->datasend("Subject: $subject\n\n");
+		$smtp->datasend("Log-Message: $subject\n" .
+				"Daemon-Status: " .
+				&daemon_status_str() . "\n");
+		$smtp->dataend();
+		$smtp->quit;
+	} else {
+		&ld_log("failed to send SMTP email message\n");
+		$status = 1;
+	}
+
+	return($status);
+}
+
+# ld_emailalert_mail_send
+# Send email alerts via Mail::Send
+# pre: smtp: SMTP server not defined
+# post: message is emailed if one of the Mail::Send methods works
+# return: 0 on success
+#	  1 on error
+
+sub ld_emailalert_mail_send
+{
+	my ($to_addr, $subject) = (@_);
+	my $emailmsg;
+	my $emailfh;
+	my $status = 0;
+
 	use Mail::Send;
 
 	&ld_log("emailalert: $subject");
@@ -4160,7 +4240,6 @@ sub ld_emailalert_send
 	return($status);
 }
 
-
 # ld_emailalert_resend
 # Resend email alerts as neccessary
 # pre: none
--
To unsubscribe from this list: send the line "unsubscribe lvs-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Filesystem Devel]     [Linux NFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]     [X.Org]

  Powered by Linux