summaryrefslogtreecommitdiff
path: root/worker
diff options
context:
space:
mode:
authorSteve Kemp <steve@steve.org.uk>2012-11-12 21:00:16 +0000
committerSteve Kemp <steve@steve.org.uk>2012-11-12 21:00:16 +0000
commit6334b9cdfc47bd85b2ce236572e08406324d25cd (patch)
treebd0bd3cc279d8377efde2affc8dc223bfb858ca2 /worker
Initial dump of code.
Diffstat (limited to 'worker')
-rw-r--r--worker/README13
-rw-r--r--worker/tests/README15
-rw-r--r--worker/tests/ftp.rb51
-rw-r--r--worker/tests/http.rb20
-rw-r--r--worker/tests/https.rb20
-rw-r--r--worker/tests/jabber.rb51
-rw-r--r--worker/tests/ldap.rb41
-rwxr-xr-xworker/tests/ping.rb36
-rw-r--r--worker/tests/rsync.rb48
-rw-r--r--worker/tests/smtp.rb52
-rwxr-xr-xworker/tests/ssh.rb50
-rwxr-xr-xworker/worker147
12 files changed, 544 insertions, 0 deletions
diff --git a/worker/README b/worker/README
new file mode 100644
index 0000000..f87decb
--- /dev/null
+++ b/worker/README
@@ -0,0 +1,13 @@
+
+ This is the worker component.
+
+ It is designed to pull (testing) jobs from the beanstalk queue, executing them serially.
+
+ The jobs will be serialized JSON objects which have the following keys in all cases:
+
+ * test_type => ping | ssh | mysql | http | https | ...
+ * test_target => example.com | 192.168.0.1 | etc
+
+ Tests may implement additional keys, they will be used or ignored as appropriate.
+
+ There is no concept of an execution time, nor is there any threading to worry about.
diff --git a/worker/tests/README b/worker/tests/README
new file mode 100644
index 0000000..f40031b
--- /dev/null
+++ b/worker/tests/README
@@ -0,0 +1,15 @@
+
+ This directory contains the protocol-tests.
+
+ For the protocol "XXX" we must have:
+
+ - The file called XXX.rb
+
+ - The definition of the single method XXX_test
+
+ The test will make use of "target_host", and "test_port" (other keys may be optionally
+ used) and will return the single result:
+
+ false: The test failed.
+
+ true: The test succeeded. \ No newline at end of file
diff --git a/worker/tests/ftp.rb b/worker/tests/ftp.rb
new file mode 100644
index 0000000..cd0e754
--- /dev/null
+++ b/worker/tests/ftp.rb
@@ -0,0 +1,51 @@
+require 'timeout'
+
+
+#
+# Run an FTP test.
+#
+#
+# Return value
+# TRUE: The host is up
+#
+# FALSE: The host is not up
+#
+def ftp_test ( params )
+
+ #
+ # Get the hostname & port to test against.
+ #
+ host = params['target_host']
+ port = params['test_port']
+
+ puts "FTP testing host #{host}:#{port}"
+
+
+ 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/ )
+ puts "FTP alive: #{banner}"
+ return true
+ end
+ rescue
+ puts "FTP exception on host #{host}:#{port} - #{$!}"
+ return false
+ end
+ end
+ rescue Timeout::Error => e
+ puts "TIMEOUT: #{e}"
+ return false
+ end
+
+ return false
+end
diff --git a/worker/tests/http.rb b/worker/tests/http.rb
new file mode 100644
index 0000000..56163c8
--- /dev/null
+++ b/worker/tests/http.rb
@@ -0,0 +1,20 @@
+
+#
+# Run a HTTP test.
+#
+#
+# Return value
+# TRUE: The host is up
+#
+# FALSE: The host is not up
+#
+def http_test( params )
+
+ #
+ # Get the URL to fetch.
+ #
+ host = params['target_host']
+
+ puts "HTTP FAILED - TODO - IMPLEMENT"
+ return false
+end
diff --git a/worker/tests/https.rb b/worker/tests/https.rb
new file mode 100644
index 0000000..b905d79
--- /dev/null
+++ b/worker/tests/https.rb
@@ -0,0 +1,20 @@
+
+#
+# Run a HTTPS test.
+#
+#
+# Return value
+# TRUE: The host is up
+#
+# FALSE: The host is not up
+#
+def https_test( params )
+
+ #
+ # Get the URL to poll.
+ #
+ host = params['target_host']
+
+ puts "HTTPS FAILED - TODO - IMPLEMENT"
+ return false
+end
diff --git a/worker/tests/jabber.rb b/worker/tests/jabber.rb
new file mode 100644
index 0000000..5caeb5b
--- /dev/null
+++ b/worker/tests/jabber.rb
@@ -0,0 +1,51 @@
+require 'timeout'
+
+
+#
+# Run a Jabber test.
+#
+#
+# Return value
+# TRUE: The host is up
+#
+# FALSE: The host is not up
+#
+def jabber_test ( params )
+
+ #
+ # Get the hostname & port to test against.
+ #
+ host = params['target_host']
+ port = 5222
+
+ puts "Jabber testing host #{host}:#{port}"
+
+
+ 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}"
+ return true
+ end
+ rescue
+ puts "Jabber exception on host #{host}:#{port} - #{$!}"
+ return false
+ end
+ end
+ rescue Timeout::Error => e
+ puts "TIMEOUT: #{e}"
+ return false
+ end
+
+ return false
+end
diff --git a/worker/tests/ldap.rb b/worker/tests/ldap.rb
new file mode 100644
index 0000000..4570f66
--- /dev/null
+++ b/worker/tests/ldap.rb
@@ -0,0 +1,41 @@
+require 'timeout'
+
+
+#
+# Run an LDAP test.
+#
+#
+# Return value
+# TRUE: The host is up
+#
+# FALSE: The host is not up
+#
+def ldap_test ( params )
+
+ #
+ # Get the hostname & port to test against.
+ #
+ host = params['target_host']
+ port = params['test_port']
+
+ puts "LDAP testing host #{host}:#{port}"
+
+
+ begin
+ timeout(3) do
+
+ begin
+ socket = TCPSocket.new( host, port )
+ socket.close()
+ return true
+ rescue
+ puts "LDAP exception on host #{host}:#{port} - #{$!}"
+ return false
+ end
+ end
+ rescue Timeout::Error => e
+ puts "TIMEOUT: #{e}"
+ return false
+ end
+ return false
+end
diff --git a/worker/tests/ping.rb b/worker/tests/ping.rb
new file mode 100755
index 0000000..72769a6
--- /dev/null
+++ b/worker/tests/ping.rb
@@ -0,0 +1,36 @@
+
+#
+# Run a PING test.
+#
+#
+# Return value
+# TRUE: The host is up
+#
+# FALSE: The host is not up
+#
+def ping_test( params )
+
+ #
+ # 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" ) )
+
+ if ( binary.nil? )
+ puts "Failed to find 'multi-ping'"
+ exit 1
+ end
+
+ #
+ # Is it IPv6 or IPv4a
+ #
+ host = params['target_host']
+ if ( system( "#{binary} #{host}" ) == true )
+ puts "PING OK"
+ return true
+ else
+ puts "PING FAILED"
+ return false
+ end
+end
diff --git a/worker/tests/rsync.rb b/worker/tests/rsync.rb
new file mode 100644
index 0000000..2c781d8
--- /dev/null
+++ b/worker/tests/rsync.rb
@@ -0,0 +1,48 @@
+require 'timeout'
+
+
+#
+# Run an rsync test.
+#
+#
+# Return value
+# TRUE: The host is up
+#
+# FALSE: The host is not up
+#
+def rsync_test ( params )
+
+ #
+ # Get the hostname
+ #
+ host = params['target_host']
+ port = 873
+
+ puts "rsync testing host #{host}:#{port}"
+
+
+ begin
+ timeout(3) do
+
+ begin
+ socket = TCPSocket.new( host, port )
+ socket.puts( "QUIT")
+ banner = socket.gets(nil)
+ socket.close()
+
+ banner = banner[0,20]
+ if ( banner =~ /rsyncd/i )
+ puts "rsync alive: #{banner}"
+ return true
+ end
+ rescue
+ puts "Exception on host #{host}:#{port} - #{$!}"
+ return false
+ end
+ end
+ rescue Timeout::Error => e
+ puts "TIMEOUT: #{e}"
+ return false
+ end
+ return false
+end
diff --git a/worker/tests/smtp.rb b/worker/tests/smtp.rb
new file mode 100644
index 0000000..66da545
--- /dev/null
+++ b/worker/tests/smtp.rb
@@ -0,0 +1,52 @@
+require 'timeout'
+
+
+#
+# Run an SMTP test.
+#
+#
+# Return value
+# TRUE: The host is up
+#
+# FALSE: The host is not up
+#
+def smtp_test ( params )
+
+ #
+ # Get the hostname & port to test against.
+ #
+ host = params['target_host']
+ port = 25
+
+ puts "SMTP testing host #{host}:#{port}"
+
+
+ begin
+ timeout(3) do
+
+ begin
+ socket = TCPSocket.new( host, port )
+ socket.puts( "QUIT\n\n")
+
+ banner = socket.gets(nil)
+ banner = banner[0,20]
+
+ socket.close()
+
+ if ( banner =~ /SMTP/i )
+ puts "SMTP alive: #{banner}"
+ return true
+ end
+ rescue
+ puts "SMTP exception on host #{host}:#{port} - #{$!}"
+ return false
+ end
+ end
+ rescue Timeout::Error => e
+
+ puts "SMTP TIMEOUT: #{e}"
+ return false
+ end
+ puts "SMTP Misc Failure"
+ return false
+end
diff --git a/worker/tests/ssh.rb b/worker/tests/ssh.rb
new file mode 100755
index 0000000..4264c8e
--- /dev/null
+++ b/worker/tests/ssh.rb
@@ -0,0 +1,50 @@
+require 'timeout'
+
+
+#
+# Run an SSH test.
+#
+#
+# Return value
+# TRUE: The host is up
+#
+# FALSE: The host is not up
+#
+def ssh_test ( params )
+
+ #
+ # Get the hostname & port to test against.
+ #
+ host = params['target_host']
+ port = params['test_port']
+
+ puts "SSH testing host #{host}:#{port}"
+
+
+ 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}"
+ return true
+ end
+ rescue
+ puts "SSH exception on host #{host}:#{port} - #{$!}"
+ return false
+ end
+ end
+ rescue Timeout::Error => e
+ puts "TIMEOUT: #{e}"
+ return false
+ end
+
+ return false
+end
diff --git a/worker/worker b/worker/worker
new file mode 100755
index 0000000..6380cf8
--- /dev/null
+++ b/worker/worker
@@ -0,0 +1,147 @@
+#!/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.
+#
+#
+# TODO: Command line parsing:
+#
+# 1. set failure count 3 in a row, for example.
+#
+# 2. enable/disable logging.
+#
+# 3. Specify server name/port for the beanstalk queue.
+#
+#
+# Steve
+# --
+#
+
+
+
+require 'beanstalk-client'
+require 'json';
+
+
+
+
+#
+# Implementations for 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'
+
+
+
+
+
+
+def clear_alert( hash )
+ puts "CLEARING ALERT: #{hash}"
+end
+
+
+
+
+def raise_alert( hash )
+ puts "Raising ALERT: #{hash}"
+end
+
+
+
+
+
+
+#
+# Connect to the queue server
+#
+beanstalk = Beanstalk::Pool.new(['localhost:11300'])
+
+
+
+
+#
+# Run until we're killed
+#
+loop do
+
+ puts "\n\nWaiting for job.."
+
+
+ #
+ # Find the next job.
+ #
+ job = beanstalk.reserve
+ puts "Job acquired: #{Time.new.inspect}"
+
+
+ #
+ # Parse the JSON of the job body.
+ #
+ json = job.body
+ hash = JSON.parse( json )
+
+ #
+ # Output the details.
+ #
+ puts "JOB: #{job.id}"
+ puts "Type of test is #{hash['test_type']}"
+ hash.keys.each do |key|
+ puts "\t#{key} => #{hash[key]}"
+ end
+
+
+ #
+ # Switch on type of test.
+ #
+ test = hash['test_type']
+ method = "#{test}_test".to_sym
+
+ #
+ # If it succeeds.
+ #
+ begin
+
+ success = false
+ count = 0
+
+ #
+ # We'll run no more than MAX times.
+ #
+ # We stop the execution on a single success.
+ #
+ while ( ( count < 5 ) && ( success == false ) )
+ if ( send( method, hash ) )
+ clear_alert(hash)
+ success= true
+ end
+ count += 1
+ end
+
+ #
+ # If we didn't succeed on any of the attempts raise the alert.
+ #
+ if ( ! success )
+ raise_alert( hash )
+ end
+
+ rescue => ex
+ puts "Exception: #{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.
+ #
+ job.delete
+ end
+end
+
+