summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/custodian/protocoltest/tftp.rb116
-rw-r--r--lib/custodian/protocoltests.rb1
-rwxr-xr-xt/test-custodian-testfactory.rb2
3 files changed, 118 insertions, 1 deletions
diff --git a/lib/custodian/protocoltest/tftp.rb b/lib/custodian/protocoltest/tftp.rb
new file mode 100644
index 0000000..7a6abe3
--- /dev/null
+++ b/lib/custodian/protocoltest/tftp.rb
@@ -0,0 +1,116 @@
+require 'custodian/settings'
+require 'custodian/testfactory'
+require 'custodian/util/tftp'
+
+
+#
+# The TFTP-protocol test
+#
+# This object is instantiated if the parser sees a line such as:
+#
+###
+### tftp://foo.vm.bytemark.co.uk/pxelinux.0 must run tftp otherwise 'tftp fail'
+###
+#
+#
+module Custodian
+
+ module ProtocolTest
+
+ class TFTPTest < TestFactory
+
+ #
+ # The line from which we were constructed.
+ #
+ attr_reader :line
+
+ #
+ # The TFTP server
+ #
+ attr_reader :host
+
+ #
+ # The TFTP port
+ #
+ attr_reader :port
+
+ #
+ # The file on the TFTP server to test
+ #
+ attr_reader :file
+
+ #
+ # Constructor
+ #
+ def initialize(line)
+
+ #
+ # Save the line
+ #
+ @line = line
+
+ #
+ # Save the URL
+ #
+ url = line.split(/\s+/)[0]
+
+ #
+ # Ensure we've got a TFTP url.
+ #
+ if url !~ /^tftp:/
+ raise ArgumentError, "The target wasn't a TFTP URL: #{line}"
+ end
+
+ #
+ # Extract host, port and file from URL
+ #
+ if line =~ /^tftp:\/\/([^\/]+)\/([^\s]*)/
+ @host = $1.split(':')[0]
+ @file = $2.dup
+ p = $1.split(':')[1]
+ @port = (p && p.to_i > 0) ? p.to_i : 69
+ end
+
+ #
+ # Ensure there is a file to fetch
+ #
+ if @file.nil? || @file.empty?
+ raise ArgumentError, "Missing file name"
+ end
+
+ end
+
+ #
+ # Allow this test to be serialized.
+ #
+ def to_s
+ @line
+ end
+
+ #
+ # Run the test.
+ #
+ def run_test
+ tftp = Custodian::Util::Tftp.new(@host, @port)
+ if tftp.test(@file)
+ Custodian::TestResult::TEST_PASSED
+ else
+ @error = "TFTP failed for #{@file} on #{@host}"
+ Custodian::TestResult::TEST_FAILED
+ end
+ end
+
+ #
+ # If the test fails then report the error.
+ #
+ def error
+ @error
+ end
+
+ register_test_type 'tftp'
+
+ end
+
+ end
+
+end
diff --git a/lib/custodian/protocoltests.rb b/lib/custodian/protocoltests.rb
index 56fee83..b793b41 100644
--- a/lib/custodian/protocoltests.rb
+++ b/lib/custodian/protocoltests.rb
@@ -31,6 +31,7 @@ require 'custodian/protocoltest/ssh'
require 'custodian/protocoltest/ssl'
require 'custodian/protocoltest/smtp'
require 'custodian/protocoltest/telnet'
+require 'custodian/protocoltest/tftp'
#
diff --git a/t/test-custodian-testfactory.rb b/t/test-custodian-testfactory.rb
index f864544..fa5129f 100755
--- a/t/test-custodian-testfactory.rb
+++ b/t/test-custodian-testfactory.rb
@@ -266,7 +266,7 @@ class TestTestFactory < Test::Unit::TestCase
#
# NOTE: Skip the DNS and LDAP tests - they are more complex.
#
- next if tst =~ /^(ldap|dns|dnsbl|sslcertificate)$/
+ next if tst =~ /^(ldap|dns|dnsbl|sslcertificate|tftp)$/
# normal
test_one = "http://foo.com/.com must run #{tst} on 1234"