summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Oetiker <tobi@oetiker.ch>2012-11-08 09:03:34 +0100
committerTobias Oetiker <tobi@oetiker.ch>2012-11-08 09:03:34 +0100
commitefcd36cf069f51f52fdd9c6b4f433fc979d93e23 (patch)
treec467939227da2fdee7c2d80b03de9a5b463dffdf
parent7dac5296d1e490adf5fcbfa8de0c398e1a5cf55a (diff)
parent7719ba573effcbd0ac35203c0c6f5ebf79921ee6 (diff)
downloadsmokeping-efcd36cf069f51f52fdd9c6b4f433fc979d93e23.tar.gz
smokeping-efcd36cf069f51f52fdd9c6b4f433fc979d93e23.tar.xz
Merge pull request #9 from couloum/master
new probe SendEmail
-rw-r--r--lib/Smokeping/probes/SendEmail.pm178
1 files changed, 178 insertions, 0 deletions
diff --git a/lib/Smokeping/probes/SendEmail.pm b/lib/Smokeping/probes/SendEmail.pm
new file mode 100644
index 0000000..947e3c5
--- /dev/null
+++ b/lib/Smokeping/probes/SendEmail.pm
@@ -0,0 +1,178 @@
+package Smokeping::probes::SendEmail;
+
+# Copyright (c) 2012 Florian Coulmier <florian@coulmier.fr>
+#
+# 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 Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>. 1
+#
+
+=head1 301 Moved Permanently
+
+This is a Smokeping probe module. Please use the command
+
+C<smokeping -man Smokeping::probes::skel>
+
+to view the documentation or the command
+
+C<smokeping -makepod Smokeping::probes::skel>
+
+to generate the POD document.
+
+=cut
+
+use strict;
+use base qw(Smokeping::probes::basefork);
+use Carp;
+use Sys::Hostname;
+use Time::HiRes;
+use Net::SMTP;
+
+sub pod_hash {
+ return {
+ name => <<DOC,
+Smokeping::probes::SendEmail - a Smokeping probe that measure time neeed to send an mail
+DOC
+ description => <<DOC,
+This probe actually send a mail to a MX server and measure time it took. You can choose the sender and recipient adress as well as the size of the mail.
+DOC
+ authors => <<'DOC',
+ Florian Coulmier <florian@coulmier.fr>,
+DOC
+ see_also => <<DOC
+L<smokeping_extend>
+DOC
+ };
+}
+
+sub new($$$)
+{
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new(@_);
+
+ # no need for this if we run as a cgi
+ unless ( $ENV{SERVER_SOFTWARE} ) {
+ # if you have to test the program output
+ # or something like that, do it here
+ # and bail out if necessary
+ };
+
+ return $self;
+}
+
+# Probe-specific variables declaration
+sub probevars {
+ my $class = shift;
+ return $class->_makevars($class->SUPER::probevars, {
+ _mandatory => [ 'from', 'to' ],
+ from => {
+ _doc => "Mail from address",
+ _example => 'test@test.com',
+ },
+ to => {
+ _doc => "Rcpt to address",
+ _exemple => 'test@test.com',
+ },
+ subject => {
+ _doc => "Subject of the mail",
+ _exemple => "Test Smokeping",
+ _default => "Test",
+ },
+ bodysize => {
+ _doc => "Size of the mail to send in bytes. If set to 0, a default mail content will be set. Note that mail always contain From, To and Subject headers.",
+ _exemple => "1024",
+ _default => "0",
+ }
+ });
+}
+
+# Target-specific variables declaration
+sub targetvars {
+ my $class = shift;
+ return $class->_makevars($class->SUPER::targetvars, {
+ port => { _doc => "Port of the SMTP server to reach",
+ _exemple => 25,
+ _default => 25,
+ },
+ });
+}
+
+sub ProbeDesc($){
+ my $self = shift;
+ return "Measure time to send a complete email";
+}
+
+# this is where the actual stuff happens
+sub pingone ($){
+ my $self = shift;
+ my $target = shift;
+
+ my @times;
+
+ # Retrieve probe-specific and target-specific variables
+ my $count = $self->pings($target);
+ my $from = $self->{properties}{from};
+ my $to = $self->{properties}{to};
+ my $subject = $self->{properties}{subject} || "Smokeping Test";
+ my $bodysize = $self->{properties}{bodysize} || 0;
+
+ my $host = $target->{addr};
+ my $port = $target->{vars}{port} || 25;
+
+ # Get Hostname
+ my $hostname = hostname();
+
+
+ # Send a mail as many times as requested
+ for (1..$count) {
+ # Start counting time
+ my $start = Time::HiRes::gettimeofday();
+
+ # Open the connection and then send the mail
+ my $smtp = new Net::SMTP("$host:$port", Timeout => 5, Hello => $hostname);
+ next if (!$smtp);
+
+ $smtp->mail($from) || next;
+ $smtp->to($to, { Notify => ['NEVER'] }) || next;
+ $smtp->data() || next;
+ $smtp->datasend("From: <$from>\n");
+ $smtp->datasend("To: <$to>\n");
+ $smtp->datasend("Subject: $subject\n");
+ $smtp->datasend("\n");
+
+ # If user specified a bodysize for the probe, send the request number of characters instead of the default content.
+ if ($bodysize > 0) {
+ my $nbLines = $bodysize / 80;
+ for (1..$nbLines) {
+ $smtp->datasend(sprintf("%s\n", "A" x 79));
+ }
+ $smtp->datasend(sprintf("%s\n", "A" x ($bodysize % 80)));
+ } else {
+ $smtp->datasend("This is a test email sent by Smokeping to check speed of mx server $host.\n");
+ $smtp->datasend("If you receive this mail in your mailbox, you are likely to be spammed in just few minutes!\n");
+ }
+
+ $smtp->dataend() || next;
+ $smtp->quit();
+
+ # End measure of time and save it
+ my $end = Time::HiRes::gettimeofday();
+ push(@times, $end - $start);
+ }
+
+ return sort {$a <=> $b } @times;
+}
+
+# That's all, folks!
+
+1;