summaryrefslogtreecommitdiffstats
path: root/lib/Smokeping/probes/SSH.pm
diff options
context:
space:
mode:
authorNiko Tyni <ntyni@iki.fi>2005-02-13 20:23:04 +0100
committerNiko Tyni <ntyni@iki.fi>2005-02-13 20:23:04 +0100
commit6d76521656e91daa160bc8019828f1b68d7aa5dc (patch)
treeaaa27615a0702942fa1606d9a5c89f0a3547467c /lib/Smokeping/probes/SSH.pm
parent6dba1afbe4b475a7d34f5ef867b7b37291cd1484 (diff)
downloadsmokeping-6d76521656e91daa160bc8019828f1b68d7aa5dc.tar.gz
smokeping-6d76521656e91daa160bc8019828f1b68d7aa5dc.tar.xz
Moved probes, matchers and ciscoRttMonMIB modules to lib/Smokeping.
Diffstat (limited to 'lib/Smokeping/probes/SSH.pm')
-rw-r--r--lib/Smokeping/probes/SSH.pm124
1 files changed, 124 insertions, 0 deletions
diff --git a/lib/Smokeping/probes/SSH.pm b/lib/Smokeping/probes/SSH.pm
new file mode 100644
index 0000000..0f336d6
--- /dev/null
+++ b/lib/Smokeping/probes/SSH.pm
@@ -0,0 +1,124 @@
+package Smokeping::probes::SSH;
+
+=head1 301 Moved Permanently
+
+This is a Smokeping probe module. Please use the command
+
+C<smokeping -man Smokeping::probes::SSH>
+
+to view the documentation or the command
+
+C<smokeping -makepod Smokeping::probes::SSH>
+
+to generate the POD document.
+
+=cut
+
+use strict;
+use base qw(Smokeping::probes::basefork);
+use IPC::Open3;
+use Symbol;
+use Carp;
+use POSIX;
+
+sub pod_hash {
+ return {
+ name => <<DOC,
+Smokeping::probes::SSH - Secure Shell Probe for SmokePing
+DOC
+ description => <<DOC,
+Integrates ssh-keyscan as a probe into smokeping. The variable B<binary> must
+point to your copy of the ssh-keyscan program. If it is not installed on
+your system yet, you should install openssh >= 3.8p1
+
+The Probe asks the given host n-times for it's public key. Where n is
+the amount specified in the config File.
+DOC
+ authors => <<'DOC',
+Christian Recktenwald <smokeping-contact@citecs.de>
+DOC
+ }
+}
+
+my $ssh_re=qr/^# \S+ SSH-/i;
+
+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} ) {
+
+ my $call = "$self->{properties}{binary} -t rsa localhost";
+ my $return = `$call 2>&1`;
+ if ($return =~ m/$ssh_re/s){
+ $self->{pingfactor} = 10;
+ print "### parsing ssh-keyscan output...OK\n";
+ } else {
+ croak "ERROR: output of '$call' does not match $ssh_re\n";
+ }
+ };
+
+ return $self;
+}
+
+sub ProbeDesc($){
+ my $self = shift;
+ return "SSH requests";
+}
+
+sub pingone ($){
+ my $self = shift;
+ my $target = shift;
+
+ my $inh = gensym;
+ my $outh = gensym;
+ my $errh = gensym;
+
+ my $host = $target->{addr};
+
+ my $query = "$self->{properties}{binary} -t rsa $host";
+ my @times;
+
+ # get the user and system times before and after the test
+ $self->do_debug("query=$query\n");
+ for (my $run = 0; $run < $self->pings; $run++) {
+ my @times1 = POSIX::times;
+ my $pid = open3($inh,$outh,$errh, $query);
+ while (<$outh>) {
+ if (/$ssh_re/i) {
+ last;
+ }
+ }
+ waitpid $pid,0;
+ close $errh;
+ close $inh;
+ close $outh;
+ my @times2 = POSIX::times;
+ push @times, $times2[0]-$times1[0];
+ }
+ @times = map {sprintf "%.10e", $_ / $self->{pingfactor}} sort {$a <=> $b} grep {$_ ne "-"} @times;
+
+# $self->do_debug("time=@times\n");
+ return @times;
+}
+
+sub probevars {
+ my $class = shift;
+ return $class->_makevars($class->SUPER::probevars, {
+ _mandatory => [ 'binary' ],
+ binary => {
+ _doc => "The location of your ssh-keyscan binary.",
+ _example => '/usr/bin/ssh-keyscan',
+ _sub => sub {
+ my $val = shift;
+ -x $val or return "ERROR: binary '$val' is not executable";
+ return undef;
+ },
+ },
+ })
+}
+
+1;