From 22e1d5a39e0a8a885adc3d88bff91fa58a3eb119 Mon Sep 17 00:00:00 2001 From: Steve Kemp Date: Tue, 13 Nov 2012 11:51:26 +0000 Subject: Converted to class-based API --- worker/tests/ssh.rb | 134 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 105 insertions(+), 29 deletions(-) (limited to 'worker/tests/ssh.rb') diff --git a/worker/tests/ssh.rb b/worker/tests/ssh.rb index 4264c8e..9fd2277 100755 --- a/worker/tests/ssh.rb +++ b/worker/tests/ssh.rb @@ -1,50 +1,126 @@ +#!/usr/bin/ruby + +require 'socket' require 'timeout' # -# Run an SSH test. -# -# -# Return value -# TRUE: The host is up +# Test that we can receive a response from an SSH server that looks +# reasonable. # -# FALSE: The host is not up -# -def ssh_test ( params ) +class SSHTest # - # Get the hostname & port to test against. + # Data passed from the JSON hash. + # + attr_reader :test_data + + # + # The error text we return on failure. + # + attr_reader :error + + + # - host = params['target_host'] - port = params['test_port'] + # Save the data away. + # + def initialize( data ) + @test_data = data + end + + + # + # Run the test. + # + # Return "true" on success + # + # Return "false" on failure. + # + # If the test fails the details should be retrieved from "get_details". + # + def run_test + @error = "" + + # + # Get the hostname & port to test against. + # + host = @test_data['target_host'] + port = @test_data['test_port'] - puts "SSH testing host #{host}:#{port}" + puts "ssh testing host #{host}:#{port}" if ( @test_data['verbose'] ) + begin + timeout(3) do - begin - timeout(3) do + begin + socket = TCPSocket.new( host, port ) + socket.puts( "QUIT") - begin - socket = TCPSocket.new( host, port ) - socket.puts( "QUIT") + banner = socket.gets(nil) + banner = banner[0,20] - banner = socket.gets(nil) - banner = banner[0,20] - socket.close() + socket.close() - if ( banner =~ /ssh/i ) - puts "SSH alive: #{banner}" - return true + if ( banner =~ /ssh/i ) + puts "ssh alive: #{banner}" if ( @test_data['verbose'] ) + return true + else + @error = "Banner didn't seem reasonable: #{banner}" + return false; + end + rescue + @error = "ssh exception on host #{host}:#{port} - #{$!}" + return false end - rescue - puts "SSH exception on host #{host}:#{port} - #{$!}" - return false end + rescue Timeout::Error => e + @error = "TIMEOUT: #{e}" + return false end - rescue Timeout::Error => e - puts "TIMEOUT: #{e}" + + @error = "Misc failure" return false end - return false + + + # + # Return the error text for why this test failed. + # + def get_details + return @error + end + +end + + +# +# Sample test, for testing. +# +if __FILE__ == $0 then + + # + # Sample data. + # + test = { + "target_host" => "ssh.steve.org.uk", + "test_type" => "ssh", + "test_port" => 2222, + "verbose" => 1, + "test_alert" => "Steve's host isn't running SSH?", + } + + + # + # Run the test. + # + obj = SSHTest.new( test ) + if ( obj.run_test ) + puts "TEST OK" + else + puts "TEST FAILED" + puts obj.get_details() + end + end -- cgit v1.2.1