blob: 58029e466fe9d5cb34c65ac6fbc3d35151ec6d05 (
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
125
126
127
|
#!/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
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 = 25
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
|