It's fairly well tested. I tried to break it as much as I could - setting an unreachable SMTP server, setting an invalid SMTP server address, sending a ton of e-mails with the code by starting, stopping, adding and removing real servers, etc. I'm going to put it into production on a few IPVS directors I have here. I can report back in about a week if you would like. Also, there needs to be one addition to the ld_emailalert_net_smtp sub. The ld_emailalert_mail_send sub logs a message in ldirectord.log once an email is sent: &ld_log("emailalert: $subject");. I meant to include that same line in ld_emailalert_net_smtp so that each sub would be as similar as possible. Could you add that line to ld_emailalert_net_smtp before you commit? Thanks. On Thu, May 7, 2009 at 6:28 PM, Simon Horman <horms@xxxxxxxxxxxx> wrote: > 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