blob: a25fe276af13a67c7e1453a4c6af6b66582601ec (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
#!/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
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
#
# Get the hostname & port to test against.
#
host = @test_data["target_host"]
port = @test_data["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/ )
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,
"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.get_details()
end
end
|