net-ping 1.1.1 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +23 -0
- data/MANIFEST +10 -2
- data/README +16 -1
- data/doc/ping.txt +114 -94
- data/lib/net/ping.rb +11 -237
- data/lib/net/ping/external.rb +92 -0
- data/lib/net/ping/http.rb +83 -0
- data/lib/net/ping/icmp.rb +168 -0
- data/lib/net/ping/ping.rb +81 -0
- data/lib/net/ping/tcp.rb +84 -0
- data/lib/net/ping/udp.rb +90 -0
- data/test/tc_pingexternal.rb +31 -6
- data/test/tc_pinghttp.rb +32 -7
- data/test/tc_pingicmp.rb +84 -0
- data/test/tc_pingtcp.rb +29 -5
- data/test/tc_pingudp.rb +33 -7
- data/test/ts_ping.rb +10 -0
- metadata +17 -8
data/CHANGES
CHANGED
@@ -1,3 +1,26 @@
|
|
1
|
+
== 1.2.0 - 5-Dec-2006
|
2
|
+
* Internal reorganization - each class now lives in its own file.
|
3
|
+
* Added the Ping::ICMP class. Thanks go to Jos Backus for contributing a
|
4
|
+
large part of the code.
|
5
|
+
* The host argument is now optional in the constructor. You can now specify
|
6
|
+
it in the ping method instead. Note that it must be specified in one place
|
7
|
+
or the other.
|
8
|
+
* Each PingXXX class is now Ping::XXX instead. However, class name aliases
|
9
|
+
have been setup for backwards compatibility for now.
|
10
|
+
* The constructor for each Ping types now yields self.
|
11
|
+
* Added the pingecho alias for the ping method for each Ping type.
|
12
|
+
* Added the Ping::HTTP#follow_redirect accessor.
|
13
|
+
* The Ping::HTTP#ping method now honors the timeout value.
|
14
|
+
* The Ping::HTTP class now follows redirects automatically, though this is
|
15
|
+
configurable with the follow_redirect accessor.
|
16
|
+
* The Ping::TCP.ecr and Ping::TCP.ecr= methods are now true class method
|
17
|
+
aliases (they were just wrappers previously).
|
18
|
+
* The Ping::UDP class now enforces a 64 character limit on data that can be
|
19
|
+
sent on a udp ping.
|
20
|
+
* Updated the gemspec. Specifically, MS Windows now has a dependency on
|
21
|
+
the win32-open3 package.
|
22
|
+
* Added inline rdoc.
|
23
|
+
|
1
24
|
== 1.1.1 - 15-Jun-2006
|
2
25
|
* Fixed a bug in PingTCP (bad variable name). Thanks go to Anoop Chandran
|
3
26
|
for the spot.
|
data/MANIFEST
CHANGED
@@ -3,15 +3,23 @@ CHANGES
|
|
3
3
|
README
|
4
4
|
test.rb
|
5
5
|
install.rb
|
6
|
+
net-ping.gemspec
|
6
7
|
|
7
8
|
examples/test_pingexternal.rb
|
8
9
|
examples/test_pinghttp.rb
|
9
10
|
examples/test_pingtcp.rb
|
10
11
|
examples/test_pingudp.rb
|
11
12
|
|
12
|
-
net/
|
13
|
+
lib/net/ping.rb
|
14
|
+
lib/net/ping/icmp.rb
|
15
|
+
lib/net/ping/tcp.rb
|
16
|
+
lib/net/ping/udp.rb
|
17
|
+
lib/net/ping/http.rb
|
18
|
+
lib/net/ping/external.rb
|
13
19
|
|
14
20
|
test/tc_pingexternal.rb
|
21
|
+
test/tc_pinghttp.rb
|
22
|
+
test/tc_pingicmp.rb
|
15
23
|
test/tc_pingtcp.rb
|
16
24
|
test/tc_pingudp.rb
|
17
|
-
test/
|
25
|
+
test/ts_ping.rb
|
data/README
CHANGED
@@ -3,7 +3,8 @@
|
|
3
3
|
|
4
4
|
== Prerequisites
|
5
5
|
* Ruby 1.8.0 or later
|
6
|
-
* The win32/open3 package is required for Win32 systems
|
6
|
+
* The win32/open3 package is required for Win32 systems when using the
|
7
|
+
Net::Ping::External class.
|
7
8
|
|
8
9
|
== Installation
|
9
10
|
=== Manual Installation
|
@@ -18,3 +19,17 @@
|
|
18
19
|
pertaining to ECONNREFUSED with regards to TCP pings.
|
19
20
|
|
20
21
|
Also note the documentation regarding down hosts.
|
22
|
+
|
23
|
+
== How to require net-ping
|
24
|
+
You can do either this:
|
25
|
+
|
26
|
+
require 'net/ping'
|
27
|
+
|
28
|
+
In which case you will get Net::Ping and all of its subclasses. Or,
|
29
|
+
you can load individual subclasses like this:
|
30
|
+
|
31
|
+
require 'net/ping/tcp'
|
32
|
+
|
33
|
+
The former has the advantage of being easier to remember and all inclusive,
|
34
|
+
not to mention backwards compatible. The latter has the advantage of
|
35
|
+
reducing your memory footprint.
|
data/doc/ping.txt
CHANGED
@@ -1,16 +1,16 @@
|
|
1
|
-
|
1
|
+
= Description
|
2
2
|
A simple Ruby interface to the 'ping' command.
|
3
3
|
|
4
|
-
|
4
|
+
= Synopsis
|
5
5
|
require "net/ping"
|
6
6
|
include Net
|
7
7
|
|
8
|
-
|
8
|
+
Ping::TCP.econnrefused = true
|
9
9
|
|
10
|
-
pt = Net::
|
11
|
-
pu = Net::
|
12
|
-
pe = Net::
|
13
|
-
ph = Net::
|
10
|
+
pt = Net::Ping::TCP.new(host)
|
11
|
+
pu = Net::Ping::UDP.new(host)
|
12
|
+
pe = Net::Ping::External.new(host)
|
13
|
+
ph = Net::Ping::HTTP.new(uri)
|
14
14
|
|
15
15
|
if pt.ping
|
16
16
|
puts "TCP ping successful"
|
@@ -36,109 +36,125 @@
|
|
36
36
|
puts "HTTP ping unsuccessful: " + ph.exception
|
37
37
|
end
|
38
38
|
|
39
|
-
|
40
|
-
*
|
41
|
-
*
|
42
|
-
*
|
43
|
-
*
|
39
|
+
= Ping Classes
|
40
|
+
* Ping::TCP
|
41
|
+
* Ping::UDP
|
42
|
+
* Ping::External
|
43
|
+
* Ping::HTTP
|
44
|
+
* Ping::ICMP
|
44
45
|
|
45
46
|
All Ping classes are children of the Ping parent class (which should
|
46
47
|
never be instantiated directly).
|
47
48
|
|
48
|
-
|
49
|
-
|
50
|
-
|
49
|
+
The Ping::ICMP class requires root privileges on UNIX systems.
|
50
|
+
|
51
|
+
== Net::Ping
|
52
|
+
Net::Ping.new(host=nil, port=7, timeout=5)
|
53
|
+
Creates and returns a new Ping object. If the host is not specified
|
54
|
+
in the constructor then it must be specified in the ping method.
|
55
|
+
|
56
|
+
== Net::Ping::TCP
|
57
|
+
Ping::TCP.econnrefused
|
58
|
+
Returns the setting for how ECONNREFUSED is handled. By default, this is
|
59
|
+
set to false, i.e. an ECONNREFUSED error is considered a failed ping.
|
60
|
+
|
61
|
+
Ping::TCP.econnrefused=(bool)
|
62
|
+
Sets the behavior for how ECONNREFUSED is handled. By default, this is
|
63
|
+
set to false, i.e. an ECONNREFUSED error is considered a failed ping.
|
64
|
+
|
65
|
+
Ping::TCP#ping(host=nil)
|
66
|
+
Attempts to open a connection using TCPSocket with a +host+ specified
|
67
|
+
either here or in the constructor. A successful open means the ping was
|
68
|
+
successful and true is returned. Otherwise, false is returned.
|
69
|
+
|
70
|
+
== Net::Ping::UDP
|
71
|
+
Ping::UDP#ping
|
72
|
+
Attempts to open a connection using UDPSocket and sends the value of
|
73
|
+
Ping::UDP#data as a string across the socket. If the return string matches,
|
74
|
+
then the ping was successful and true is returned. Otherwise, false is
|
75
|
+
returned.
|
51
76
|
|
52
|
-
|
53
|
-
|
54
|
-
set to false, i.e. an ECONNREFUSED error is considered a failed ping.
|
77
|
+
Ping::UDP#data
|
78
|
+
Returns the string that is sent across the UDP socket.
|
55
79
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
PingTCP#ping
|
61
|
-
PingTCP#ping?
|
62
|
-
Attempts to open a connection using TCPSocket. A successful open means
|
63
|
-
the ping was successful and true is returned. Otherwise, false is returned.
|
64
|
-
|
65
|
-
=== PingUDP
|
66
|
-
PingUDP.new(host, port=7, timeout=5)
|
67
|
-
Creates and returns a new PingUDP object.
|
68
|
-
|
69
|
-
PingUDP#ping
|
70
|
-
PingUDP#ping?
|
71
|
-
Attempts to open a connection using UDPSocket and sends the value of
|
72
|
-
PingUDP#data as a string across the socket. If the return string matches,
|
73
|
-
then the ping was successful and true is returned. Otherwise, false is
|
74
|
-
returned.
|
75
|
-
|
76
|
-
PingUDP#data
|
77
|
-
Returns the string that is sent across the UDP socket.
|
78
|
-
|
79
|
-
PingUDP#data=(string)
|
80
|
-
Sets the string that is sent across the UDP socket. The default is "ping"
|
80
|
+
Ping::UDP#data=(string)
|
81
|
+
Sets the string that is sent across the UDP socket. The default is "ping".
|
82
|
+
Note that the +string+ cannot be larger than MAX_DATA (64 characters).
|
81
83
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
various options, depending on platform. If nothing is sent to stderr, the
|
90
|
-
ping was successful and true is returned. Otherwise, false is returned.
|
91
|
-
|
92
|
-
=== PingHTTP
|
93
|
-
PingHTTP.new(uri, port=80, timeout=5)
|
94
|
-
Creates and returns a new PingHTTP object.
|
84
|
+
== Net::Ping::External
|
85
|
+
Ping::External#ping
|
86
|
+
Uses the 'open3' module and calls your system's local 'ping' command with
|
87
|
+
various options, depending on platform. If nothing is sent to stderr, the
|
88
|
+
ping was successful and true is returned. Otherwise, false is returned.
|
89
|
+
|
90
|
+
The MS Windows platform requires the 'win32-open3' package.
|
95
91
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
returned. Otherwise, false is returned and PingHTTP#exception is set to
|
101
|
-
the error message.
|
92
|
+
== Ping::HTTP
|
93
|
+
Ping::HTTP.new(uri=nil, port=80, timeout=5)
|
94
|
+
Identical to Net::Ping.new except that, instead of a host, the first
|
95
|
+
argument is a URI.
|
102
96
|
|
103
|
-
|
104
|
-
|
97
|
+
Ping::HTTP#ping
|
98
|
+
Checks for a response against +uri+. As long as kind of Net::HTTPSuccess
|
99
|
+
response is returned, the ping is successful and true is returned.
|
100
|
+
Otherwise, false is returned and Ping::HTTP#exception is set to the error
|
101
|
+
message.
|
102
|
+
|
103
|
+
Note that redirects are automatically followed unless the
|
104
|
+
Ping::HTTP#follow_redirects method is set to false.
|
105
|
+
|
106
|
+
Ping::HTTP#follow_redirect
|
107
|
+
Indicates whether or not a redirect should be followed in a ping attempt.
|
108
|
+
By default this is set to true.
|
109
|
+
|
110
|
+
Ping::HTTP#follow_redirect=(bool)
|
111
|
+
Sets whether or not a redirect should be followed in a ping attempt. If
|
112
|
+
set to false, then any redirect is considered a failed ping.
|
113
|
+
|
114
|
+
Ping::HTTP#uri
|
115
|
+
An alias for Ping::HTTP#host.
|
105
116
|
|
106
|
-
|
107
|
-
|
117
|
+
Ping::HTTP#uri=(uri)
|
118
|
+
An alias for Ping::HTTP#host=.
|
119
|
+
|
120
|
+
== Ping::ICMP
|
121
|
+
Ping::ICMP#duration
|
122
|
+
The time it took to ping the host. Not a precise value but a good estimate.
|
108
123
|
|
109
|
-
|
124
|
+
= Common Instance Methods
|
110
125
|
Ping#exception
|
111
|
-
|
112
|
-
|
113
|
-
|
126
|
+
Returns the error string that was set if a ping call failed. If an exception
|
127
|
+
is raised, it is caught and stored in this attribute. It is not raised in
|
128
|
+
your code.
|
114
129
|
|
115
|
-
|
130
|
+
This should be nil if the ping succeeded.
|
116
131
|
|
117
132
|
Ping#host
|
118
|
-
|
133
|
+
Returns the host name that ping attempts will ping against.
|
119
134
|
|
120
135
|
Ping#host=(hostname)
|
121
|
-
|
136
|
+
Sets the host name that ping attempts will ping against.
|
122
137
|
|
123
138
|
Ping#port
|
124
|
-
|
139
|
+
Returns the port number that ping attempts will use.
|
125
140
|
|
126
141
|
Ping#port=(port)
|
127
|
-
|
128
|
-
|
129
|
-
|
142
|
+
Set the port number to open socket connections on. The default is 7 (or
|
143
|
+
whatever your 'echo' port is set to). Note that you can also specify a
|
144
|
+
string, such as "http".
|
130
145
|
|
131
146
|
Ping#timeout
|
132
|
-
|
133
|
-
|
147
|
+
Returns the amount of time before the timeout module raises a TimeoutError
|
148
|
+
during connection attempts. The default is 5 seconds.
|
134
149
|
|
135
150
|
Ping#timeout=(time)
|
136
|
-
|
137
|
-
|
151
|
+
Sets the amount of time before the timeout module raises a TimeoutError.
|
152
|
+
during connection attempts.
|
138
153
|
|
139
154
|
Ping#warning
|
140
|
-
|
141
|
-
|
155
|
+
Returns a warning string that was returned during the ping attempt. This
|
156
|
+
typically occurs only in the Ping::External class, or the Ping::HTTP class
|
157
|
+
if a redirect occurred.
|
142
158
|
|
143
159
|
== Notes
|
144
160
|
If a host is down *IT IS CONSIDERED A FAILED PING*, and the 'no answer from
|
@@ -146,7 +162,7 @@ Ping#warning
|
|
146
162
|
this behavior, in which case you need merely check the exception attribute
|
147
163
|
against a regex as a simple workaround.
|
148
164
|
|
149
|
-
== FAQ
|
165
|
+
== Pre-emptive FAQ
|
150
166
|
Q: "Why don't you return exceptions if a connection fails?"
|
151
167
|
|
152
168
|
A: Because ping is only meant to return one of two things - success or
|
@@ -158,7 +174,7 @@ Ping#warning
|
|
158
174
|
|
159
175
|
A: It's possible that the echo port has been disabled on the remote
|
160
176
|
host for security reasons. Your best best is to specify a different port
|
161
|
-
or to use
|
177
|
+
or to use Ping::ICMP or Ping::External instead.
|
162
178
|
|
163
179
|
Q: "Why does TCP ping return false when I know it should return true?"
|
164
180
|
|
@@ -177,29 +193,33 @@ Ping#warning
|
|
177
193
|
A: I *could* but I won't so don't bug me about it. It's far more effort than
|
178
194
|
it's worth.
|
179
195
|
|
180
|
-
|
196
|
+
= Known Bugs
|
181
197
|
You may see a test failure from the tc_pingtcp test case. You can ignore
|
182
198
|
this.
|
183
199
|
|
184
200
|
Please report any bugs on the project page at
|
185
201
|
http://www.rubyforge.org/projects/shards.
|
186
202
|
|
187
|
-
|
188
|
-
|
189
|
-
|
203
|
+
= Acknowledgements
|
204
|
+
The Ping::ICMP#ping method is based largely on the identical method from
|
205
|
+
the Net::Ping Perl module by Rob Brown. Much of the code was ported by
|
206
|
+
Jos Backus on ruby-talk.
|
207
|
+
|
208
|
+
= Future Plans
|
209
|
+
Add a bind method.
|
190
210
|
|
191
|
-
|
211
|
+
= License
|
192
212
|
Ruby's
|
193
213
|
|
194
|
-
|
195
|
-
(C) 2003-
|
214
|
+
= Copyright
|
215
|
+
(C) 2003-2006 Daniel J. Berger, All Rights Reserved
|
196
216
|
|
197
|
-
|
217
|
+
= Warranty
|
198
218
|
This package is provided "as is" and without any express or
|
199
219
|
implied warranties, including, without limitation, the implied
|
200
220
|
warranties of merchantability and fitness for a particular purpose.
|
201
221
|
|
202
|
-
|
222
|
+
= Author
|
203
223
|
Daniel J. Berger
|
204
224
|
djberg96 at gmail dot com
|
205
225
|
imperator on IRC (irc.freenode.net)
|
data/lib/net/ping.rb
CHANGED
@@ -1,237 +1,11 @@
|
|
1
|
-
require "
|
2
|
-
require "
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
@host = host
|
13
|
-
@port = port || Socket.getservbyname("echo") || 7
|
14
|
-
@timeout = timeout
|
15
|
-
@data = "ping"
|
16
|
-
@exception = nil
|
17
|
-
@warning = nil
|
18
|
-
end
|
19
|
-
|
20
|
-
def ping
|
21
|
-
@exception = nil
|
22
|
-
@warning = nil
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
##########################################################################
|
27
|
-
# With a TCP ping, simply try to open a connection. If we are successful,
|
28
|
-
# assume success. In either case, close the connection to be polite.
|
29
|
-
##########################################################################
|
30
|
-
class PingTCP < Ping
|
31
|
-
@@econnrefused = false
|
32
|
-
|
33
|
-
# Returns whether or not ECONNREFUSED error is to be considered a
|
34
|
-
# successful ping. The default is false.
|
35
|
-
def self.econnrefused
|
36
|
-
@@econnrefused
|
37
|
-
end
|
38
|
-
|
39
|
-
# An alias for PingTCP.econnrefused
|
40
|
-
def self.ecr
|
41
|
-
self.econnrefused
|
42
|
-
end
|
43
|
-
|
44
|
-
# Sets whether or not an ECONNREFUSED error should be considered a
|
45
|
-
# successful ping.
|
46
|
-
def self.econnrefused=(bool)
|
47
|
-
unless bool.kind_of?(TrueClass) || bool.kind_of?(FalseClass)
|
48
|
-
raise ArgumentError, "argument must be true or false"
|
49
|
-
end
|
50
|
-
@@econnrefused = bool
|
51
|
-
end
|
52
|
-
|
53
|
-
# An alias for PingTCP.econnrefused=
|
54
|
-
def self.ecr=(bool)
|
55
|
-
self.econnrefused = bool
|
56
|
-
end
|
57
|
-
|
58
|
-
# This method attempts to ping a host and port using a TCPSocket with
|
59
|
-
# the host and port values passed to the constructor.
|
60
|
-
def ping
|
61
|
-
super
|
62
|
-
success = false
|
63
|
-
tcp = nil
|
64
|
-
begin
|
65
|
-
Timeout.timeout(@timeout){
|
66
|
-
begin
|
67
|
-
tcp = TCPSocket.new(@host,@port)
|
68
|
-
rescue Errno::ECONNREFUSED => err
|
69
|
-
if @@econnrefused == true
|
70
|
-
success = true
|
71
|
-
else
|
72
|
-
@exception = err
|
73
|
-
end
|
74
|
-
rescue Exception => err
|
75
|
-
@exception = err
|
76
|
-
else
|
77
|
-
success = true
|
78
|
-
end
|
79
|
-
}
|
80
|
-
rescue Timeout::Error => err
|
81
|
-
@exception = err
|
82
|
-
ensure
|
83
|
-
tcp.close if tcp
|
84
|
-
end
|
85
|
-
success
|
86
|
-
end
|
87
|
-
|
88
|
-
alias ping? ping
|
89
|
-
end
|
90
|
-
|
91
|
-
##########################################################################
|
92
|
-
# With a UDP ping, send a simple text string and check the return string.
|
93
|
-
# If they match, assume success.
|
94
|
-
##########################################################################
|
95
|
-
class PingUDP < Ping
|
96
|
-
attr_accessor :data
|
97
|
-
|
98
|
-
# Sends a simple text string and checks the return string. If they
|
99
|
-
# match, the ping was successful.
|
100
|
-
def ping
|
101
|
-
super
|
102
|
-
success = false
|
103
|
-
udp = UDPSocket.open
|
104
|
-
a = []
|
105
|
-
begin
|
106
|
-
Timeout.timeout(@timeout){
|
107
|
-
udp.connect(@host, @port)
|
108
|
-
udp.send(@data, 0)
|
109
|
-
a = udp.recvfrom(64)
|
110
|
-
}
|
111
|
-
rescue Exception => err
|
112
|
-
@exception = err
|
113
|
-
else
|
114
|
-
if a[0] == @data
|
115
|
-
success = true
|
116
|
-
end
|
117
|
-
ensure
|
118
|
-
udp.close if udp
|
119
|
-
end
|
120
|
-
success
|
121
|
-
end
|
122
|
-
|
123
|
-
alias ping? ping
|
124
|
-
end
|
125
|
-
|
126
|
-
##################################
|
127
|
-
# Use your system's ping command
|
128
|
-
##################################
|
129
|
-
class PingExternal < Ping
|
130
|
-
|
131
|
-
# Pings the host using your system's ping utility and checks for any
|
132
|
-
# errors or warnings.
|
133
|
-
def ping
|
134
|
-
super
|
135
|
-
input, output, error = ""
|
136
|
-
pstring = "ping "
|
137
|
-
success = false
|
138
|
-
|
139
|
-
case PLATFORM
|
140
|
-
when /linux|bsd/i
|
141
|
-
pstring += "-c 1 #{@host}"
|
142
|
-
when /solaris|sunos/i
|
143
|
-
pstring += "#{@host} 1"
|
144
|
-
when /hpux/i
|
145
|
-
pstring += "#{@host} -n 1"
|
146
|
-
when /win32|windows/i
|
147
|
-
pstring += "-n 1 #{@host}"
|
148
|
-
else
|
149
|
-
pstring += "#{@host}"
|
150
|
-
end
|
151
|
-
|
152
|
-
if File::ALT_SEPARATOR
|
153
|
-
require "win32/open3"
|
154
|
-
else
|
155
|
-
require "open3"
|
156
|
-
end
|
157
|
-
|
158
|
-
Timeout.timeout(@timeout){
|
159
|
-
input, output, error = Open3.popen3(pstring)
|
160
|
-
}
|
161
|
-
|
162
|
-
e = error.gets # Can't chomp yet, might be nil
|
163
|
-
|
164
|
-
input.close
|
165
|
-
error.close
|
166
|
-
|
167
|
-
unless e.nil?
|
168
|
-
if e =~ /warning/i
|
169
|
-
@warning = e.chomp
|
170
|
-
success = true
|
171
|
-
else
|
172
|
-
@exception = e.chomp
|
173
|
-
end
|
174
|
-
# The "no answer" response goes to stdout, not stderr, so check it
|
175
|
-
else
|
176
|
-
lines = output.readlines
|
177
|
-
output.close
|
178
|
-
if lines.nil? || lines.empty?
|
179
|
-
success = true
|
180
|
-
else
|
181
|
-
regexp = /no answer|host unreachable|could not find host/i
|
182
|
-
lines.each{ |e|
|
183
|
-
if regexp.match(e)
|
184
|
-
@exception = e.chomp
|
185
|
-
end
|
186
|
-
}
|
187
|
-
success = true
|
188
|
-
end
|
189
|
-
end
|
190
|
-
success
|
191
|
-
end
|
192
|
-
|
193
|
-
alias ping? ping
|
194
|
-
end
|
195
|
-
|
196
|
-
# For this class, +host+ is actually a URI.
|
197
|
-
class PingHTTP < Ping
|
198
|
-
require "net/http"
|
199
|
-
require "uri"
|
200
|
-
include Net
|
201
|
-
|
202
|
-
# Creates and returns a new PingHTTP object.
|
203
|
-
#--
|
204
|
-
# Defined separately in order to set the default port to 80.
|
205
|
-
def initialize(host, port=80, timeout=5)
|
206
|
-
super(host, port, timeout)
|
207
|
-
end
|
208
|
-
|
209
|
-
# Looks for an HTTP response from the URI passed to the constructor.
|
210
|
-
# If the result is HTTPSuccess or HTTPOK, the ping was successful.
|
211
|
-
def ping
|
212
|
-
super
|
213
|
-
success = false
|
214
|
-
uri = URI.parse(@host)
|
215
|
-
|
216
|
-
begin
|
217
|
-
resp = HTTP.get_response(uri.host, uri.path, @port)
|
218
|
-
rescue Exception => err
|
219
|
-
@exception = err
|
220
|
-
else
|
221
|
-
case resp
|
222
|
-
when Net::HTTPSuccess, Net::HTTPOK
|
223
|
-
success = true
|
224
|
-
else
|
225
|
-
@exception = resp.message
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
|
-
success
|
230
|
-
end
|
231
|
-
|
232
|
-
alias ping? ping
|
233
|
-
alias uri host
|
234
|
-
alias uri= host=
|
235
|
-
end
|
236
|
-
|
237
|
-
end # Net
|
1
|
+
# By doing a "require 'net/ping'" you are requiring every subclass. If you
|
2
|
+
# want to require a specific ping type only, do "require 'net/ping/tcp'",
|
3
|
+
# for example.
|
4
|
+
#
|
5
|
+
$LOAD_PATH.unshift File.dirname(__FILE__)
|
6
|
+
|
7
|
+
require 'ping/tcp'
|
8
|
+
require 'ping/udp'
|
9
|
+
require 'ping/icmp'
|
10
|
+
require 'ping/external'
|
11
|
+
require 'ping/http'
|