diff options
Diffstat (limited to 'worker')
| -rw-r--r-- | worker/tests/README | 17 | ||||
| -rwxr-xr-x | worker/tests/ftp.rb | 144 | ||||
| -rwxr-xr-x | worker/tests/http.rb | 187 | ||||
| -rwxr-xr-x | worker/tests/https.rb | 188 | ||||
| -rwxr-xr-x | worker/tests/jabber.rb | 146 | ||||
| -rwxr-xr-x | worker/tests/ldap.rb | 140 | ||||
| -rwxr-xr-x | worker/tests/ping.rb | 116 | ||||
| -rwxr-xr-x | worker/tests/rsync.rb | 145 | ||||
| -rwxr-xr-x | worker/tests/smtp.rb | 145 | ||||
| -rwxr-xr-x | worker/tests/ssh.rb | 144 | ||||
| -rwxr-xr-x | worker/worker | 367 | 
11 files changed, 0 insertions, 1739 deletions
| diff --git a/worker/tests/README b/worker/tests/README deleted file mode 100644 index 5d8b6d3..0000000 --- a/worker/tests/README +++ /dev/null @@ -1,17 +0,0 @@ - -  This directory contains the protocol-tests. - -  For the protocol "xxx" we must have: - -        - The file called xxx.rb - -        - The definition of class "XXXTest" - note upper-case - -  The class must implement the methods: - -    run_test() - -    error() - -  'run_test' will be called to run the test, returning true if passed, and false - otherwise.  In the event of a test failure 'error' will return  something useful. diff --git a/worker/tests/ftp.rb b/worker/tests/ftp.rb deleted file mode 100755 index 63b6714..0000000 --- a/worker/tests/ftp.rb +++ /dev/null @@ -1,144 +0,0 @@ -#!/usr/bin/ruby  - - -require 'timeout' -require 'socket' - -# -# This class is responsible for performing tests against a remote FTP server -# -# -class FTPTest - -  # -  # Data passed from the JSON hash. -  # -  attr_reader :test_data - -  # -  # The error text we return on failure. -  # -  attr_reader :error - - - - -  # -  # Save the data away. -  # -  def initialize( data ) -    @test_data = data -    @error     = nil - - -    # -    # Ensure we have a host to probe -    # -    if ( @test_data["target_host"].nil? ) -      @error = "Missing target for the test." -      raise ArgumentError, @error -    end - -    # -    # Ensure we have a port to test. -    # -    if ( @test_data["test_port"].nil? ) -      @error = "Missing port for the test." -      raise ArgumentError, @error -    end - -  end - - -  # -  # Run the test. -  # -  #  Return "true" on success -  # -  #  Return "false" on failure. -  # -  # If the test fails the details should be retrieved from "error()". -  # -  def run_test - -    # -    #  Get the hostname & port to test against. -    # -    host = @test_data["target_host"] -    port = @test_data["test_port"] - -    puts "FTP testing host #{host}:#{port}" if ( @test_data['verbose'] ) - -    begin -      timeout(3) do - -        begin -          socket = TCPSocket.new( host, port ) -          socket.puts( "QUIT") - -          banner = socket.gets(nil) -          banner = banner[0,20] - -          socket.close() - -          if ( banner =~ /^220/ ) -            return true -          else -            @error = "Banner didn't report OK: #{banner}" -          end -        rescue -          @error = "FTP exception on host #{host}:#{port} - #{$!}" -          return false -        end -      end -    rescue Timeout::Error => e -      @error = "Timed-out connecting #{e}" -      return false -    end -    @error = "Misc. failure." -    return false -  end - - -  # -  #  Return the error. -  # -  def error -    return @error -  end - -end - - - - - -# -# Sample test, for testing. -# -if __FILE__ == $0 then - -  # -  #  Sample data. -  # -  test = { -    "target_host" => "mirror.bytemark.co.uk", -    "test_type"   => "ftp", -    "test_port"   => 21, -    "verbose"     => 1, -    "test_alert"  => "The FTP server no worky", -  } - - -  # -  #  Run the test. -  # -  tst = FTPTest.new( test ) -  if ( tst.run_test ) -    puts "TEST OK" -  else -    puts "TEST FAILED" -    puts tst.error() -  end - -end diff --git a/worker/tests/http.rb b/worker/tests/http.rb deleted file mode 100755 index 0d4cdd3..0000000 --- a/worker/tests/http.rb +++ /dev/null @@ -1,187 +0,0 @@ -#!/usr/bin/ruby - -require 'net/http' -require 'net/https' -require 'uri' - - - -class HTTPTest - -  # -  # Data passed from the JSON hash. -  # -  attr_reader :test_data - -  # -  # The HTTP status, the HTTP response body, and the error text -  # we return on failure. -  # -  attr_reader :status, :body, :error - - - -  # -  # Save the data away. -  # -  def initialize( data ) -    @test_data = data -    @error     = nil - -    # -    # Ensure we have an URL -    # -    if ( @test_data["target_host"].nil? ) -      @error = "Missing URL for the test." -      raise ArgumentError, @error -    end - -    # -    # Ensure we have a port -    # -    if ( @test_data["test_port"].nil? ) -      @error = "Missing port for the test." -      raise ArgumentError, @error -    end - -  end - - -  # -  # Run the test. -  # -  #  Return "true" on success -  # -  #  Return "false" on failure. -  # -  # If the test fails the details should be retrieved from "error()". -  # -  def run_test - -    # -    #  Do the fetch, if this success then we'll have the -    # @status + @text setup -    # -    if ( getURL (@test_data["target_host"] ) ) - -      # -      #  Do we need to test for a HTTP status code? -      # -      if ( @test_data["http_status"] ) -        puts "Testing for HTTP status code: #{@test_data['http_status']}" if ( @test_data['verbose'] ) - -        if ( @status != @test_data['http_status'].to_i) -          @error = "#{@error} status code was #{@status} not #{@test_data['http_status']}" -        end -      end - -      # -      #  Do we need to search for text in the body of the reply? -      # -      if ( @test_data['http_text'] ) -        puts "Testing for text in the response: #{@test_data['http_text']}" if ( @test_data['verbose'] ) - -        if (! @body.match(/#{@test_data['http_text']}/i) ) -          @error = "#{@error} The respond did not contain #{test_data['http_text']}" -        end -      end - -      return true if ( @error.nil? ) - -      return false -    end - -    return false -  end - - -  # -  #  Return the error text for why this test failed. -  # -  def error -    return @error -  end - - -  # -  # Retrieve a HTTP page from the web. -  # -  # NOTE:  This came from sentinel. -  def getURL (uri_str) -    begin -      uri_str = 'http://' + uri_str unless uri_str.match(/^http/) -      url = URI.parse(uri_str) -      http = Net::HTTP.new(url.host, url.port) -      http.open_timeout = 3 -      http.read_timeout = 3 - -      if (url.scheme == "https") -        http.use_ssl = true -        http.verify_mode = OpenSSL::SSL::VERIFY_NONE -      end - -      response = nil - -      if nil == url.query -        response = http.start { http.get(url.path) } -      else -        response = http.start { http.get("#{url.path}?#{url.query}") } -      end - -      @status = response.code.to_i -      @body   =  response.body - -      return true -    rescue Errno::EHOSTUNREACH => ex -      @error = "no route to host" -      return false -    rescue Timeout::Error => ex -      @error = "time out reached" -      return false -    rescue Errno::ECONNREFUSED => ex -      @error = "Connection refused" -      return false -    rescue => ex -      raise ex -      return false -    end -    return false -  end - - - -end - - - -# -# Sample test, for testing. -# -if __FILE__ == $0 then - -  # -  #  Sample data. -  # -  test = { -    "target_host" => "http://www.steve.org.uk/", -    "test_type"   => "http", -    "verbose"     => 1, -    "test_port"   => 80, -    "test_alert"  => "Steve's website is unavailable", -    "http_text"   => "Steve Kemp", -    "http_status" => "200" -  } - - -  # -  #  Run the test. -  # -  http = HTTPTest.new( test ) -  if ( http.run_test ) -    puts "TEST OK" -  else -    puts "TEST FAILED" -    puts http.error() -  end - -end diff --git a/worker/tests/https.rb b/worker/tests/https.rb deleted file mode 100755 index 49cdcef..0000000 --- a/worker/tests/https.rb +++ /dev/null @@ -1,188 +0,0 @@ -#!/usr/bin/ruby - -require 'net/http' -require 'net/https' -require 'uri' - - - -class HTTPSTest - -  # -  # Data passed from the JSON hash. -  # -  attr_reader :test_data - -  # -  # The HTTP status, the HTTP response body, and the error text -  # we return on failure. -  # -  attr_reader :status, :body, :error - - - -  # -  # Save the data away. -  # -  def initialize( data ) -    @test_data = data -    @error     = nil - -    # -    # Ensure we have an URL -    # -    if ( @test_data["target_host"].nil? ) -      @error = "Missing URL for the test." -      raise ArgumentError, @error -    end - -    # -    # Ensure we have a port -    # -    if ( @test_data["test_port"].nil? ) -      @error = "Missing port for the test." -      raise ArgumentError, @error - -    end - -  end - - -  # -  # Run the test. -  # -  #  Return "true" on success -  # -  #  Return "false" on failure. -  # -  # If the test fails the details should be retrieved from "error()". -  # -  def run_test - -    # -    #  Do the fetch, if this success then we'll have the -    # @status + @text setup -    # -    if ( getURL (@test_data["target_host"] ) ) - -      # -      #  Do we need to test for a HTTP status code? -      # -      if ( @test_data["http_status"] ) -        puts "Testing for HTTP status code: #{@test_data['http_status']}" if ( @test_data['verbose'] ) - -        if ( @status != @test_data['http_status'].to_i) -          @error = "#{@error} status code was #{@status} not #{@test_data['http_status']}" -        end -      end - -      # -      #  Do we need to search for text in the body of the reply? -      # -      if ( @test_data['http_text'] ) -        puts "Testing for text in the response: #{@test_data['http_text']}" if ( @test_data['verbose'] ) - -        if (! @body.match(/#{@test_data['http_text']}/i) ) -          @error = "#{@error} The respond did not contain #{test_data['http_text']}" -        end -      end - -      return true if ( @error.nil? ) - -      return false -    end - -    return false -  end - - -  # -  #  Return the error text for why this test failed. -  # -  def error -    return @error -  end - - -  # -  # Retrieve a HTTP page from the web. -  # -  # NOTE:  This came from sentinel. -  def getURL (uri_str) -    begin -      uri_str = 'http://' + uri_str unless uri_str.match(/^http/) -      url = URI.parse(uri_str) -      http = Net::HTTP.new(url.host, url.port) -      http.open_timeout = 3 -      http.read_timeout = 3 - -      if (url.scheme == "https") -        http.use_ssl = true -        http.verify_mode = OpenSSL::SSL::VERIFY_NONE -      end - -      response = nil - -      if nil == url.query -        response = http.start { http.get(url.path) } -      else -        response = http.start { http.get("#{url.path}?#{url.query}") } -      end - -      @status = response.code.to_i -      @body   =  response.body - -      return true -    rescue Errno::EHOSTUNREACH => ex -      @error = "no route to host" -      return false -    rescue Timeout::Error => ex -      @error = "time out reached" -      return false -    rescue Errno::ECONNREFUSED => ex -      @error = "Connection refused" -      return false -    rescue => ex -      raise ex -      return false -    end -    return false -  end - - - -end - - - -# -# Sample test, for testing. -# -if __FILE__ == $0 then - -  # -  #  Sample data. -  # -  test = { -    "target_host" => "http://www.steve.org.uk/", -    "test_type"   => "http", -    "verbose"     => 1, -    "test_port"   => 80, -    "test_alert"  => "Steve's website is unavailable", -    "http_text"   => "Steve Kemp", -    "http_status" => "200" -  } - - -  # -  #  Run the test. -  # -  http = HTTPSTest.new( test ) -  if ( http.run_test ) -    puts "TEST OK" -  else -    puts "TEST FAILED" -    puts http.error() -  end - -end diff --git a/worker/tests/jabber.rb b/worker/tests/jabber.rb deleted file mode 100755 index ab628d5..0000000 --- a/worker/tests/jabber.rb +++ /dev/null @@ -1,146 +0,0 @@ -#!/usr/bin/ruby - - - -require 'socket' -require 'timeout' - - -# -# Test that we can receive a response from a Jabber server that looks -# reasonable. -# -class JABBERTest - -  # -  # Data passed from the JSON hash. -  # -  attr_reader :test_data - -  # -  # The error text we return on failure. -  # -  attr_reader :error - - - -  # -  # Save the data away. -  # -  def initialize( data ) -    @test_data = data -    @error     = nil - - -    # -    # Ensure we have a host to probe -    # -    if ( @test_data["target_host"].nil? ) -      @error = "Missing target for the test." -      raise ArgumentError, @error -    end - -    # -    # Ensure we have a port to test. -    # -    if ( @test_data["test_port"].nil? ) -      @error = "Missing port for the test." -      raise ArgumentError, @error -    end - -  end - - -  # -  # Run the test. -  # -  #  Return "true" on success -  # -  #  Return "false" on failure. -  # -  # If the test fails the details should be retrieved from "error()". -  # -  def run_test -    @error = "" - -    # -    #  Get the hostname & port to test against. -    # -    host = @test_data['target_host'] -    port = @test_data['test_port'] - -    puts "Jabber testing host #{host}:#{port}" if ( @test_data['verbose'] ) - -    begin -      timeout(3) do - -        begin -          socket = TCPSocket.new( host, port ) -          socket.puts( "QUIT") - -          banner = socket.gets(nil) -          banner = banner[0,20] - -          socket.close() - -          if ( banner =~ /xml version/i ) -            puts "Jabber alive: #{banner}" if ( @test_data['verbose'] ) -            return true -          else -            @error = "Banner didn't seem reasonable: #{banner}" -            return false; -          end -        rescue -          @error = "Jabber exception on host #{host}:#{port} - #{$!}" -          return false -        end -      end -    rescue Timeout::Error => e -      @error = "TIMEOUT: #{e}" -      return false -    end - -    @error = "Misc failure" -    return false -  end - - - -  # -  #  Return the error text for why this test failed. -  # -  def error -    return @error -  end - -end - - -# -# Sample test, for testing. -# -if __FILE__ == $0 then - -  # -  #  Sample data. -  # -  test = { -    "target_host" => "chat.bytemark.co.uk", -    "test_type"   => "jabber", -    "verbose"     => 1, -    "test_alert"  => "Chat is down?", -  } - - -  # -  #  Run the test. -  # -  obj = JABBERTest.new( test ) -  if ( obj.run_test ) -    puts "TEST OK" -  else -    puts "TEST FAILED" -    puts obj.error() -  end - -end diff --git a/worker/tests/ldap.rb b/worker/tests/ldap.rb deleted file mode 100755 index e15f4e0..0000000 --- a/worker/tests/ldap.rb +++ /dev/null @@ -1,140 +0,0 @@ -#!/usr/bin/ruby - - - -require 'socket' -require 'timeout' - - -# -# Test that we can receive a response from an LDAP server. -# -class LDAPTest - -  # -  # Data passed from the JSON hash. -  # -  attr_reader :test_data - -  # -  # The error text we return on failure. -  # -  attr_reader :error - - - -  # -  # Save the data away. -  # -  def initialize( data ) -    @test_data = data -    @error     = nil - - -    # -    # Ensure we have a host to probe -    # -    if ( @test_data["target_host"].nil? ) -      @error = "Missing target for the test." -      raise ArgumentError, @error -    end - -    # -    # Ensure we have a port to test. -    # -    if ( @test_data["test_port"].nil? ) -      @error = "Missing port for the test." -      raise ArgumentError, @error -    end -  end - - -  # -  # Run the test. -  # -  #  Return "true" on success -  # -  #  Return "false" on failure. -  # -  # If the test fails the details should be retrieved from "error()". -  # -  def run_test - -    # -    # Until the test runs we have no error. -    # -    @error = "" - -    # -    #  Get the hostname & port to test against. -    # -    host = @test_data['target_host'] -    port = @test_data['test_port'] - -    puts "LDAP testing host #{host}:#{port}" if ( @test_data['verbose'] ) - -    begin -      timeout(3) do - -        begin -          socket = TCPSocket.new( host, port ) -          socket.puts( "QUIT") -          socket.close() - -          puts "LDAP alive" if ( @test_data['verbose'] ) -          return true -        rescue -          @error = "Exception connecting to host #{host}:#{port} - #{$!}" -          return false -        end -      end -    rescue Timeout::Error => e -      @error = "TIMEOUT: #{e}" -      return false -    end - -    @error = "Misc failure" -    return false -  end - - - -  # -  #  Return the error text for why this test failed. -  # -  def error -    return @error -  end - -end - - -# -# Sample test, for testing. -# -if __FILE__ == $0 then - -  # -  #  Sample data. -  # -  test = { -    "target_host" => "auth.bytemark.co.uk", -    "test_type"   => "ldap", -    "test_port"   => 389, -    "verbose"     => 1, -    "test_alert"  => "LDAP is down?", -  } - - -  # -  #  Run the test. -  # -  obj = LDAPTest.new( test ) -  if ( obj.run_test ) -    puts "TEST OK" -  else -    puts "TEST FAILED" -    puts obj.error() -  end - -end diff --git a/worker/tests/ping.rb b/worker/tests/ping.rb deleted file mode 100755 index d6ac877..0000000 --- a/worker/tests/ping.rb +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/ruby - - - -require 'socket' -require 'timeout' - - -# -# Test that we can receive a ping response from the remote host. -# -class PINGTest - -  # -  # Data passed from the JSON hash. -  # -  attr_reader :test_data - -  # -  # The error text we return on failure. -  # -  attr_reader :error - - - -  # -  # 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 "error()". -  # -  def run_test -    @error = "" - - -    # -    # Find the binary -    # -    binary = nil -    binary = "./util/multi-ping"  if ( File.exists?( "./util/multi-ping" ) ) -    binary = "../util/multi-ping" if ( File.exists?( "../util/multi-ping" ) ) -    binary = "../../util/multi-ping" if ( File.exists?( "../../util/multi-ping" ) ) - -    if ( binary.nil? ) -      @error = "Failed to find 'multi-ping'" -      return false -    end - - -    # -    #  Get the hostname to test against. -    # -    host = @test_data['target_host'] -    puts "ping testing host #{host}" if ( @test_data['verbose'] ) - - -    if ( system( "#{binary} #{host}" ) == true ) -      puts "PING OK" if ( @test_data['verbose'] ) -      return  true -    else -      @error = "Ping failed.  TODO: Mtr" -      return false -    end - -  end - - -  # -  #  Return the error text for why this test failed. -  # -  def error() -    return @error -  end - -end - - -# -# Sample test, for testing. -# -if __FILE__ == $0 then - -  # -  #  Sample data. -  # -  test = { -    "target_host" => "upload.ns.bytemark.co.uk", -    "test_type"   => "ping", -    "verbose"     => 1, -    "test_alert"  => "Pingly faily", -  } - - -  # -  #  Run the test. -  # -  obj = PINGTest.new( test ) -  if ( obj.run_test ) -    puts "TEST OK" -  else -    puts "TEST FAILED" -    puts obj.error() -  end - -end diff --git a/worker/tests/rsync.rb b/worker/tests/rsync.rb deleted file mode 100755 index 02f2dfa..0000000 --- a/worker/tests/rsync.rb +++ /dev/null @@ -1,145 +0,0 @@ -#!/usr/bin/ruby - - - -require 'socket' -require 'timeout' - - -# -# Test that we can receive a response from an rsync server that looks -# reasonable. -# -class RSYNCTest - -  # -  # Data passed from the JSON hash. -  # -  attr_reader :test_data - -  # -  # The error text we return on failure. -  # -  attr_reader :error - - - -  # -  # Save the data away. -  # -  def initialize( data ) -    @test_data = data -    @error     = nil - -    # -    # Ensure we have a host to probe -    # -    if ( @test_data["target_host"].nil? ) -      @error = "Missing target for the test." -      raise ArgumentError, @error -    end - -    # -    # Ensure we have a port to test. -    # -    if ( @test_data["test_port"].nil? ) -      @error = "Missing port for the test." -      raise ArgumentError, @error -    end -  end - - -  # -  # Run the test. -  # -  #  Return "true" on success -  # -  #  Return "false" on failure. -  # -  # If the test fails the details should be retrieved from "error()". -  # -  def run_test -    @error = "" - -    # -    #  Get the hostname & port to test against. -    # -    host = @test_data['target_host'] -    port = @test_data['test_port'] - -    puts "rsync testing host #{host}:#{port}" if ( @test_data['verbose'] ) - -    begin -      timeout(3) do - -        begin -          socket = TCPSocket.new( host, port ) -          socket.puts( "QUIT") - -          banner = socket.gets(nil) -          banner = banner[0,20] - -          socket.close() - -          if ( banner =~ /rsyncd/i ) -            puts "rsync alive: #{banner}" if ( @test_data['verbose'] ) -            return true -          else -            @error = "Banner didn't seem reasonable: #{banner}" -            return false; -          end -        rescue -          @error = "rsync exception on host #{host}:#{port} - #{$!}" -          return false -        end -      end -    rescue Timeout::Error => e -      @error = "TIMEOUT: #{e}" -      return false -    end - -    @error = "Misc failure" -    return false -  end - - - -  # -  #  Return the error text for why this test failed. -  # -  def error -    return @error -  end - -end - - -# -# Sample test, for testing. -# -if __FILE__ == $0 then - -  # -  #  Sample data. -  # -  test = { -    "target_host" => "upload.ns.bytemark.co.uk", -    "test_type"   => "rsync", -    "verbose"     => 1, -    "test_alert"  => "DNS upload service failure", -  } - - -  # -  #  Run the test. -  # -  obj = RSYNCTest.new( test ) -  if ( obj.run_test ) -    puts "TEST OK" -  else -    puts "TEST FAILED" -    puts obj.error() -  end - -end - diff --git a/worker/tests/smtp.rb b/worker/tests/smtp.rb deleted file mode 100755 index aa577d6..0000000 --- a/worker/tests/smtp.rb +++ /dev/null @@ -1,145 +0,0 @@ -#!/usr/bin/ruby - - - -require 'socket' -require 'timeout' - - -# -# Test that we can receive a response from an SMTP server that looks -# reasonable. -# -class SMTPTest - -  # -  # Data passed from the JSON hash. -  # -  attr_reader :test_data - -  # -  # The error text we return on failure. -  # -  attr_reader :error - - - -  # -  # Save the data away. -  # -  def initialize( data ) -    @test_data = data -    @error     = nil - - -    # -    # Ensure we have a host to probe -    # -    if ( @test_data["target_host"].nil? ) -      @error = "Missing target for the test." -      raise ArgumentError, @error -    end - -    # -    # Ensure we have a port to test. -    # -    if ( @test_data["test_port"].nil? ) -      @error = "Missing port for the test." -      raise ArgumentError, @error -    end -  end - - -  # -  # Run the test. -  # -  #  Return "true" on success -  # -  #  Return "false" on failure. -  # -  # If the test fails the details should be retrieved from "error". -  # -  def run_test -    @error = "" - -    # -    #  Get the hostname & port to test against. -    # -    host = @test_data['target_host'] -    port = @test_data['test_port'] - -    puts "SMTP testing host #{host}:#{port}" if ( @test_data['verbose'] ) - -    begin -      timeout(3) do - -        begin -          socket = TCPSocket.new( host, port ) -          socket.puts( "QUIT") - -          banner = socket.gets(nil) -          banner = banner[0,40] - -          socket.close() - -          if ( banner =~ /SMTP/i ) -            puts "SMTP alive: #{banner}" if ( @test_data['verbose'] ) -            return true -          else -            @error = "Banner didn't seem reasonable: #{banner}" -            return false; -          end -        rescue -          @error = "SMTP exception on host #{host}:#{port} - #{$!}" -          return false -        end -      end -    rescue Timeout::Error => e -      @error = "TIMEOUT: #{e}" -      return false -    end - -    @error = "Misc failure" -    return false -  end - - - -  # -  #  Return the error text for why this test failed. -  # -  def error -    return @error -  end - -end - - -# -# Sample test, for testing. -# -if __FILE__ == $0 then - -  # -  #  Sample data. -  # -  test = { -    "target_host" => "mail.steve.org.uk", -    "test_type"   => "smtp", -    "verbose"     => 1, -    "test_alert"  => "SMTP failure", -  } - - -  # -  #  Run the test. -  # -  obj = SMTPTest.new( test ) -  if ( obj.run_test ) -    puts "TEST OK" -  else -    puts "TEST FAILED" -    puts obj.error() -  end - -end diff --git a/worker/tests/ssh.rb b/worker/tests/ssh.rb deleted file mode 100755 index 18815b4..0000000 --- a/worker/tests/ssh.rb +++ /dev/null @@ -1,144 +0,0 @@ -#!/usr/bin/ruby - -require 'socket' -require 'timeout' - - -# -# Test that we can receive a response from an SSH server that looks -# reasonable. -# -class SSHTest - -  # -  # Data passed from the JSON hash. -  # -  attr_reader :test_data - -  # -  # The error text we return on failure. -  # -  attr_reader :error - - - -  # -  # Save the data away. -  # -  def initialize( data ) -    @test_data = data -    @error     = nil - - -    # -    # Ensure we have a host to probe -    # -    if ( @test_data["target_host"].nil? ) -      @error = "Missing target for the test." -      raise ArgumentError, @error -    end - -    # -    # Ensure we have a port to test. -    # -    if ( @test_data["test_port"].nil? ) -      @error = "Missing port for the test." -      raise ArgumentError, @error -    end -  end - - -  # -  # Run the test. -  # -  #  Return "true" on success -  # -  #  Return "false" on failure. -  # -  # If the test fails the details should be retrieved from "error". -  # -  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}" if ( @test_data['verbose'] ) - -    begin -      timeout(3) do - -        begin -          socket = TCPSocket.new( host, port ) -          socket.puts( "QUIT") - -          banner = socket.gets(nil) -          banner = banner[0,20] - -          socket.close() - -          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 -      end -    rescue Timeout::Error => e -      @error = "TIMEOUT: #{e}" -      return false -    end - -    @error = "Misc failure" -    return false -  end - - - -  # -  #  Return the error text for why this test failed. -  # -  def error -    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.error() -  end - -end diff --git a/worker/worker b/worker/worker deleted file mode 100755 index 3c9e355..0000000 --- a/worker/worker +++ /dev/null @@ -1,367 +0,0 @@ -#!/usr/bin/ruby -# -#  This script will pull tests to complete from the Beanstalk Queue, -# where they will be found in JSON form, and executes them. -# -# Steve -# -- -# - - - -require 'beanstalk-client' -require 'getoptlong' -require 'json' -require 'logger' - -require 'mauve/sender' -require 'mauve/proto' - - - -# -# Implementation of our protocol tests. -# -require 'tests/ftp' -require 'tests/http' -require 'tests/https' -require 'tests/jabber' -require 'tests/ldap' -require 'tests/ping' -require 'tests/rsync' -require 'tests/smtp' -require 'tests/ssh' - - - - -# -#  This class encapsulates the raising and clearing of alerts via Mauve. -# -class Alert - -  attr_reader :details - -  def initialize( test_details ) -    @details = test_details -  end - - -  # -  # Raise the alert. -  # -  def raise( detail ) - -    puts "RAISE: #{detail}" -    return - -    update = Mauve::Proto::AlertUpdate.new -    update.alert   = [] -    update.source  = "custodian" -    update.replace = true - -    alert            = Mauve::Proto::Alert.new -    alert.id         = @details['test_type'] -    alert.summary    = "#{@details['test_host']} #{@details['test_alert']}" -    alert.detail     = "The #{@details['test_type']} test failed against #{@details['test_host']}: #{detail}" -    alert.raise_time = Time.now.to_i -    update.alert << alert - -    Mauve::Sender.new("alert.bytemark.co.uk").send(update) - -  end - -  # -  #  Clear the alert. -  # -  def clear -    puts "CLEAR" -    return - -    update = Mauve::Proto::AlertUpdate.new -    update.alert   = [] -    update.source  = "custodian" -    update.replace = true - -    alert            = Mauve::Proto::Alert.new -    alert.id         = @details['test_type'] -    alert.summary    = "#{@details['test_host']} #{@details['test_alert']}" -    alert.detail     = "The #{@details['test_type']} test succeeded against #{@details['test_host']}" -    alert.clear_time = Time.now.to_i -    update.alert << alert - -    Mauve::Sender.new("alert.bytemark.co.uk").send(update) -  end - -end - - - - -# -# This class contains the code for connecting to a Beanstalk queue, -# fetching tests from it, and executing them -# -class Custodian - -  # -  # The beanstalk queue. -  # -  attr_reader :queue - -  # -  # How many times we re-test before we detect a failure -  # -  attr_reader :retry_count - -  # -  # The log-file object -  # -  attr_reader :logger - -  # -  # Constructor: Connect to the queue -  # -  def initialize( server ) - -    # Connect to the queue -    @queue = Beanstalk::Pool.new([server]) - -    # Instantiate the logger. -    @logger = Logger.new( "worker.log", "daily" ) - -    if ( ENV['REPEAT'] ) -       @retry_count=ENV['REPEAT'].to_i -    else -       @retry_count=5 -    end - -    log_message( "We'll run each test #{@retry_count} before alerting failures." ) -  end - - -  # -  # Write the given message to our logfile - and show it to the console -  # if we're running with '--verbose' in play -  # -  def log_message( msg ) -      @logger.info( msg ) -      puts msg if ( ENV['VERBOSE'] ) -  end - -  # -  #  Flush the queue. -  # -  def flush_queue! - -    log_message( "Flushing queue" ) - -    while( true ) -      begin -        job = @queue.reserve(1) -        id  = job.id -        log_message( "Deleted job #{id}" ) -        job.delete -      rescue Beanstalk::TimedOut => ex -        log_message( "The queue is now empty" ) -        return -      end -    end -  end - - - -  # -  # Process jobs from the queue - never return. -  # -  def run! -    while( true ) -      log_message( "\n" ) -      log_message( "\n" ) -      log_message( "Waiting for job.." ) -      process_single_job() -    end -  end - - - -  # -  # Fetch a single job from the queue, and process it. -  # -  def process_single_job - -    begin -      job = @queue.reserve() - -      log_message( "Job aquired - Job ID : #{job.id}" ) - - -      # -      #  Parse the JSON of the job body. -      # -      json = job.body -      hash = JSON.parse( json ) -      hash['verbose'] = 1 if ( ENV['VERBOSE'] ) - - -      # -      #  Output the details. -      # -      log_message( "Job body contains the following keys & values:") -      hash.keys.each do |key| -        log_message( "#{key} => #{hash[key]}" ) -      end - - - -      # -      # Did the test succeed?  If not count the number of times it failed in -      # a row.  We'll repeat several times -      # -      success = false -      count   = 0 - -      # -      # As a result of this test we'll either raise/clear with mauve. -      # -      # This helper will do that job. -      # -      alert = Alert.new( hash ) - - -      # -      # Convert the test-type to a class name, to do the protocol test. -      # -      # Given a test-type "foo" we'll attempt to instantiate a class called FOOTest. -      # -      test  = hash['test_type'] -      clazz = test.upcase -      clazz = "#{clazz}Test" - - -      # -      # Create the test object. -      # -      obj = eval(clazz).new( hash ) - - -      # -      # Ensure that the object we load implements the two methods -      # we expect. -      # -      if ( ( ! obj.respond_to?( "error") ) || -           ( ! obj.respond_to?( "run_test" ) ) ) -        puts "Class #{clazz} doesn't implement the full protocol-test API" -      end - - - -      # -      #  We'll run no more than MAX times. -      # -      #  We stop the execution on a single success. -      # -      while ( ( count < @retry_count ) && ( success == false ) ) - -        if ( obj.run_test() ) -          log_message( "Test succeeed - clearing alert" ) -          alert.clear() -          success= true -        end -        count += 1 -      end - -      # -      #  If we didn't succeed on any of the attempts raise the alert. -      # -      if ( ! success ) - -        # -        # Raise the alert, passing the error message. -        # -        log_message( "Test failed - alerting with #{obj.error()}" ) -        alert.raise( obj.error() ) -      end - -    rescue => ex -      puts "Exception raised processing job: #{ex}" - -    ensure -      # -      #  Delete the job - either we received an error, in which case -      # we should remove it to avoid picking it up again, or we handled -      # it successfully so it should be removed. -      # -      log_message( "Job ID : #{job.id} - Removed" ) -      job.delete if ( job ) -    end -  end -end - - - - - - - -# -#  Entry-point to our code. -# -if __FILE__ == $0 then - -  $SERVER = "127.0.0.1:11300"; - -  begin -    opts = GetoptLong.new( -                          [ "--verbose", "-v", GetoptLong::NO_ARGUMENT ], -                          [ "--flush",   "-f", GetoptLong::NO_ARGUMENT ], -                          [ "--server",  "-S", GetoptLong::REQUIRED_ARGUMENT ], -                          [ "--repeat",  "-r", GetoptLong::REQUIRED_ARGUMENT ], -                          [ "--single",  "-s", GetoptLong::NO_ARGUMENT ] -                          ) -    opts.each do |opt, arg| -      case opt -      when "--verbose": -          ENV["VERBOSE"] = "1" -      when "--flush": -          ENV["FLUSH"] = "1" -      when "--repeat": -          ENV["REPEAT"] = arg -      when "--server": -          $SERVER = arg -      when "--single": -          ENV["SINGLE"] = "1" -      end -    end -  rescue StandardError => ex -    puts "Option parsing failed: #{ex.to_s}" -    exit -  end - -  # -  #  Create the object -  # -  worker = Custodian.new( $SERVER ) - -  # -  #  Are we flushing the queue? -  # -  if ( ENV['FLUSH'] ) -    worker.flush_queue! -    exit(0) -  end - -  # -  #  Single step? -  # -  if ( ENV['SINGLE'] ) -    worker.process_single_job -    exit(0) -  end - -  # -  #  Otherwise loop indefinitely -  # -  worker.run! - -end | 
