net-ping 1.7.2 → 1.7.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 66ef8ec8a4d85b94397739115722bcb52e8b287b
4
- data.tar.gz: 9b530dc0bdc258e6c3daef1c6c48677f09093661
3
+ metadata.gz: 96a4aeabebdb1bf7c3347538c1ad96428e5d7386
4
+ data.tar.gz: 6434d02460e9ff981db346adde0664029a7e0de0
5
5
  SHA512:
6
- metadata.gz: d57ad9937a32293703c097322bc1f24d6f031c4d910b5a4131616226a46320ddfbcf1072a7f40b39b2c1879c421717a6a9389b443254e9419513d7dfbfa307e3
7
- data.tar.gz: 9016ac5f9fa70b60b89e0bcca798b516336fb9002cba9f21d6c17ed5dada65c8bd6d761aeb3e227f5dd65675e02984ab31dc3ef1ed290528385e3bf0ad105cf9
6
+ metadata.gz: e8075c1a265cd6d0e911e5e4a6a2e38d377d0c00d5a76c05cee37e089f40a51a7405051280e299ba168e8db7854387dd49a334fcc6c12f98cfc17cdebd91b26a
7
+ data.tar.gz: 8a450d951dafecd0133a85c16f01568c39c6ec6dbea07760b149d9b8f27dfc5de957e3fc4ffb950b1b49328b490377b123e3c031b82faf8f99f3aa74a541fce7
data/CHANGES CHANGED
@@ -1,3 +1,14 @@
1
+ == 1.7.3 - 3-Apr-2014
2
+ * Removed the Timeout block for the Ping::External class as it apparently
3
+ hasn't worked with open3 for some time. Instead, it now uses your command
4
+ line ping's timeout switch. Thanks go to Andrea Bernardo Ciddio for the
5
+ spot.
6
+ * Made ICMP pings thread safe. I think.
7
+ * Removed a redundant Timeout block in the Ping::ICMP class.
8
+ * If an ICMP ping times out, the exception attribute is set to "timeout".
9
+ * Added explicit support for AIX for the Ping::External class.
10
+ * Bumped minimum required Ruby version to 1.9.3.
11
+
1
12
  == 1.7.2 - 21-Jan-2014
2
13
  * Fixed a bug in the Ping::HTTP constructor where it was not honoring the
3
14
  port if provided as the second argument. Thanks go to Florian Anderiasch
data/README CHANGED
@@ -7,6 +7,7 @@
7
7
  * fakeweb (test only)
8
8
  * test-unit (test only)
9
9
 
10
+ Ruby users should use Ruby 1.9.3 or later.
10
11
  JRuby users should use JRuby 1.6.7 or later.
11
12
 
12
13
  == Installation
@@ -17,10 +18,6 @@
17
18
  attention to the documentation pertaining to ECONNREFUSED and TCP pings.
18
19
 
19
20
  Also note the documentation regarding down hosts.
20
-
21
- You do not need win32-open3 with Ruby 1.9.x. The open3 library that ships
22
- as part of the Ruby standard library should work.
23
-
24
21
  == How to require net-ping
25
22
  You can do either this:
26
23
 
@@ -44,8 +41,8 @@
44
41
  JRuby 1.6.7 or later is required for external pings because of a bug
45
42
  in earlier versions with open3 and stream handling.
46
43
 
47
- ICMP pings are not thread safe. See https://www.ruby-forum.com/topic/146116.
48
- Patches welcome.
44
+ ICMP pings will not work with JRuby without some sort of third-party
45
+ library support for raw sockets in Java, such as RockSaw.
49
46
 
50
47
  == License
51
48
  Artistic 2.0
@@ -60,3 +57,6 @@
60
57
  If you installed this library via Rubygems, you can view the inline
61
58
  documentation via ri or fire up 'gem server', and point your browser at
62
59
  http://localhost:8808.
60
+
61
+ == Author
62
+ Daniel J. Berger
data/doc/ping.txt CHANGED
@@ -221,7 +221,7 @@ Ping#warning
221
221
  UDP pings may not work with older versions of Ruby 1.9.x.
222
222
 
223
223
  Please report any bugs on the project page at
224
- http://www.rubyforge.org/projects/shards.
224
+ https://github.com/djberg96/net-ping
225
225
 
226
226
  = Acknowledgements
227
227
  The Ping::ICMP#ping method is based largely on the identical method from
@@ -235,7 +235,7 @@ Ping#warning
235
235
  Artistic 2.0
236
236
 
237
237
  = Copyright
238
- (C) 2003-2013 Daniel J. Berger, All Rights Reserved
238
+ (C) 2003-2014 Daniel J. Berger, All Rights Reserved
239
239
 
240
240
  = Warranty
241
241
  This package is provided "as is" and without any express or
@@ -22,14 +22,18 @@ module Net
22
22
  bool = false
23
23
 
24
24
  case RbConfig::CONFIG['host_os']
25
- when /linux|bsd|osx|mach|darwin/i
26
- pcmd += ['-c1', host]
25
+ when /linux/i
26
+ pcmd += ['-c', '1', '-W', @timeout.to_s, host]
27
+ when /aix/i
28
+ pcmd += ['-c', '1', '-w', @timeout.to_s, host]
29
+ when /bsd|osx|mach|darwin/i
30
+ pcmd += ['-c', '1', '-t', @timeout.to_s, host]
27
31
  when /solaris|sunos/i
28
- pcmd += [host, '1']
32
+ pcmd += [host, @timeout.to_s]
29
33
  when /hpux/i
30
- pcmd += [host, '-n1']
34
+ pcmd += [host, '-n1', '-m', @timeout.to_s]
31
35
  when /win32|windows|msdos|mswin|cygwin|mingw/i
32
- pcmd += ['-n', '1', host]
36
+ pcmd += ['-n', '1', '-w', (@timeout * 1000).to_s, host]
33
37
  else
34
38
  pcmd += [host]
35
39
  end
@@ -39,25 +43,33 @@ module Net
39
43
  begin
40
44
  err = nil
41
45
 
42
- Timeout.timeout(@timeout){
43
- Open3.popen3(*pcmd) do |stdin, stdout, stderr, thread|
44
- err = stderr.gets # Can't chomp yet, might be nil
46
+ Open3.popen3(*pcmd) do |stdin, stdout, stderr, thread|
47
+ stdin.close
48
+ err = stderr.gets # Can't chomp yet, might be nil
45
49
 
46
- case thread.value.exitstatus
47
- when 0
48
- bool = true # Success, at least one response.
49
- if err & err =~ /warning/i
50
- @warning = err.chomp
51
- end
52
- when 2
53
- bool = false # Transmission successful, no response.
50
+ case thread.value.exitstatus
51
+ when 0
52
+ bool = true # Success, at least one response.
53
+ if err & err =~ /warning/i
54
+ @warning = err.chomp
55
+ end
56
+ when 2
57
+ bool = false # Transmission successful, no response.
58
+ @exception = err.chomp if err
59
+ else
60
+ bool = false # An error occurred
61
+ if err
54
62
  @exception = err.chomp
55
63
  else
56
- bool = false # An error occurred
57
- @exception = err.chomp
58
- end
64
+ stdout.each_line do |line|
65
+ if line =~ /(timed out|could not find host|packet loss)/i
66
+ @exception = line.chomp
67
+ break
68
+ end
69
+ end
70
+ end
59
71
  end
60
- }
72
+ end
61
73
  rescue Exception => error
62
74
  @exception = error.message
63
75
  end
data/lib/net/ping/icmp.rb CHANGED
@@ -44,7 +44,7 @@ module Net
44
44
 
45
45
  0.upto(@data_size){ |n| @data << (n % 256).chr }
46
46
 
47
- @pid = Process.pid & 0xffff
47
+ @ping_id = (Thread.current.object_id ^ Process.pid) & 0xffff
48
48
 
49
49
  super(host, port, timeout)
50
50
  @port = nil # This value is not used in ICMP pings.
@@ -59,7 +59,7 @@ module Net
59
59
  end
60
60
 
61
61
  # Associates the local end of the socket connection with the given
62
- # +host+ and +port+. The default port is 0.
62
+ # +host+ and +port+. The default port is 0.
63
63
  #
64
64
  def bind(host, port = 0)
65
65
  @bind_host = host
@@ -90,10 +90,10 @@ module Net
90
90
  timeout = @timeout
91
91
 
92
92
  checksum = 0
93
- msg = [ICMP_ECHO, ICMP_SUBCODE, checksum, @pid, @seq, @data].pack(pstring)
93
+ msg = [ICMP_ECHO, ICMP_SUBCODE, checksum, @ping_id, @seq, @data].pack(pstring)
94
94
 
95
95
  checksum = checksum(msg)
96
- msg = [ICMP_ECHO, ICMP_SUBCODE, checksum, @pid, @seq, @data].pack(pstring)
96
+ msg = [ICMP_ECHO, ICMP_SUBCODE, checksum, @ping_id, @seq, @data].pack(pstring)
97
97
 
98
98
  begin
99
99
  saddr = Socket.pack_sockaddr_in(0, host)
@@ -107,37 +107,36 @@ module Net
107
107
  socket.send(msg, 0, saddr) # Send the message
108
108
 
109
109
  begin
110
- Timeout.timeout(@timeout){
111
- while true
112
- io_array = select([socket], nil, nil, timeout)
113
-
114
- if io_array.nil? || io_array[0].empty?
115
- return false
116
- end
117
-
118
- pid = nil
119
- seq = nil
120
-
121
- data = socket.recvfrom(1500).first
122
- type = data[20, 2].unpack('C2').first
123
-
124
- case type
125
- when ICMP_ECHOREPLY
126
- if data.length >= 28
127
- pid, seq = data[24, 4].unpack('n3')
128
- end
129
- else
130
- if data.length > 56
131
- pid, seq = data[52, 4].unpack('n3')
132
- end
133
- end
134
-
135
- if pid == @pid && seq == @seq && type == ICMP_ECHOREPLY
136
- bool = true
137
- break
138
- end
110
+ while true
111
+ io_array = select([socket], nil, nil, timeout)
112
+
113
+ if io_array.nil? || io_array[0].empty?
114
+ @exception = "timeout" if io_array.nil?
115
+ return false
116
+ end
117
+
118
+ ping_id = nil
119
+ seq = nil
120
+
121
+ data = socket.recvfrom(1500).first
122
+ type = data[20, 2].unpack('C2').first
123
+
124
+ case type
125
+ when ICMP_ECHOREPLY
126
+ if data.length >= 28
127
+ ping_id, seq = data[24, 4].unpack('n3')
128
+ end
129
+ else
130
+ if data.length > 56
131
+ ping_id, seq = data[52, 4].unpack('n3')
132
+ end
139
133
  end
140
- }
134
+
135
+ if ping_id == @ping_id && seq == @seq && type == ICMP_ECHOREPLY
136
+ bool = true
137
+ break
138
+ end
139
+ end
141
140
  rescue Exception => err
142
141
  @exception = err
143
142
  ensure
data/lib/net/ping/ping.rb CHANGED
@@ -10,7 +10,7 @@ module Net
10
10
  #
11
11
  class Ping
12
12
  # The version of the net-ping library.
13
- VERSION = '1.7.2'
13
+ VERSION = '1.7.3'
14
14
 
15
15
  # The host to ping. In the case of Ping::HTTP, this is the URI.
16
16
  attr_accessor :host
data/net-ping.gemspec CHANGED
@@ -3,7 +3,7 @@ require 'rbconfig'
3
3
 
4
4
  Gem::Specification.new do |spec|
5
5
  spec.name = 'net-ping'
6
- spec.version = '1.7.2'
6
+ spec.version = '1.7.3'
7
7
  spec.license = 'Artistic 2.0'
8
8
  spec.author = 'Daniel J. Berger'
9
9
  spec.email = 'djberg96@gmail.com'
@@ -12,11 +12,10 @@ Gem::Specification.new do |spec|
12
12
  spec.test_file = 'test/test_net_ping.rb'
13
13
  spec.files = Dir['**/*'].reject{ |f| f.include?('git') }
14
14
 
15
- spec.rubyforge_project = 'shards'
16
15
  spec.extra_rdoc_files = ['README', 'CHANGES', 'doc/ping.txt']
17
16
 
18
17
  # The TCP Ping class requires this for non-blocking sockets.
19
- spec.required_ruby_version = ">= 1.9.1"
18
+ spec.required_ruby_version = ">= 1.9.3"
20
19
 
21
20
  spec.add_development_dependency('test-unit')
22
21
  spec.add_development_dependency('fakeweb')
@@ -28,7 +28,7 @@ end
28
28
 
29
29
  class TC_Net_Ping < Test::Unit::TestCase
30
30
  def test_net_ping_version
31
- assert_equal('1.7.2', Net::Ping::VERSION)
31
+ assert_equal('1.7.3', Net::Ping::VERSION)
32
32
  end
33
33
  end
34
34
 
@@ -120,6 +120,15 @@ class TC_Net_Ping_External < Test::Unit::TestCase
120
120
  assert_nil(@pe.warning)
121
121
  end
122
122
 
123
+ test "timing out causes expected result" do
124
+ ext = Net::Ping::External.new('foo.bar.baz', nil, 1)
125
+ start = Time.now
126
+ assert_false(ext.ping?)
127
+ elapsed = Time.now - start
128
+ assert_true(elapsed < 2.5, "Actual elapsed: #{elapsed}")
129
+ assert_not_nil(ext.exception)
130
+ end
131
+
123
132
  def teardown
124
133
  @host = nil
125
134
  @bogus = nil
@@ -1,12 +1,13 @@
1
1
  #######################################################################
2
2
  # test_net_ping_icmp.rb
3
3
  #
4
- # Test case for the Net::PingICMP class. You must run this test case
4
+ # Test case for the Net::PingICMP class. You must run this test case
5
5
  # with root privileges on UNIX systems. This should be run via the
6
6
  # 'test' or 'test:icmp' Rake task.
7
7
  #######################################################################
8
8
  require 'test-unit'
9
9
  require 'net/ping/icmp'
10
+ require 'thread'
10
11
 
11
12
  if File::ALT_SEPARATOR
12
13
  require 'win32/security'
@@ -21,30 +22,62 @@ else
21
22
  end
22
23
 
23
24
  class TC_PingICMP < Test::Unit::TestCase
25
+ def self.startup
26
+ @@jruby = RUBY_PLATFORM == 'java'
27
+ end
28
+
24
29
  def setup
25
30
  @host = '127.0.0.1' # 'localhost'
26
31
  @icmp = Net::Ping::ICMP.new(@host)
32
+ @concurrency = 3
27
33
  end
28
34
 
29
35
  test "icmp ping basic functionality" do
30
36
  assert_respond_to(@icmp, :ping)
37
+ omit_if(@@jruby)
31
38
  assert_nothing_raised{ @icmp.ping }
32
39
  end
33
40
 
34
41
  test "icmp ping accepts a host" do
42
+ omit_if(@@jruby)
35
43
  assert_nothing_raised{ @icmp.ping(@host) }
36
44
  end
37
45
 
38
46
  test "icmp ping returns a boolean" do
47
+ omit_if(@@jruby)
39
48
  assert_boolean(@icmp.ping)
40
49
  assert_boolean(@icmp.ping(@host))
41
50
  end
42
51
 
43
52
  test "icmp ping of local host is successful" do
53
+ omit_if(@@jruby)
44
54
  assert_true(Net::Ping::ICMP.new(@host).ping?)
45
55
  assert_true(Net::Ping::ICMP.new('192.168.0.1').ping?)
46
56
  end
47
57
 
58
+ test "threaded icmp ping returns expected results" do
59
+ omit_if(@@jruby)
60
+ ips = ['8.8.4.4', '8.8.9.9', '127.0.0.1', '8.8.8.8', '8.8.8.9']
61
+ queue = Queue.new
62
+ threads = []
63
+
64
+ ips.each{ |ip| queue << ip }
65
+
66
+ @concurrency.times{
67
+ threads << Thread.new(queue) do |q|
68
+ ip = q.pop
69
+ icmp = Net::Ping::ICMP.new(ip, nil, 1)
70
+ if ip =~ /9/
71
+ assert_false(icmp.ping?)
72
+ else
73
+ assert_true(icmp.ping?)
74
+ end
75
+ end
76
+ }
77
+
78
+ threads.each{ |t| t.join }
79
+ end
80
+
48
81
  test "ping? is an alias for ping" do
49
82
  assert_respond_to(@icmp, :ping?)
50
83
  assert_alias_method(@icmp, :ping?, :ping)
@@ -56,6 +89,7 @@ class TC_PingICMP < Test::Unit::TestCase
56
89
  end
57
90
 
58
91
  test "icmp ping fails if host is invalid" do
92
+ omit_if(@@jruby)
59
93
  assert_false(Net::Ping::ICMP.new('bogus').ping?)
60
94
  assert_false(Net::Ping::ICMP.new('http://www.asdfhjklasdfhlkj.com').ping?)
61
95
  end
@@ -67,6 +101,7 @@ class TC_PingICMP < Test::Unit::TestCase
67
101
  end
68
102
 
69
103
  test "duration method basic functionality" do
104
+ omit_if(@@jruby)
70
105
  assert_nothing_raised{ @icmp.ping }
71
106
  assert_respond_to(@icmp, :duration)
72
107
  assert_kind_of(Float, @icmp.duration)
@@ -99,9 +134,15 @@ class TC_PingICMP < Test::Unit::TestCase
99
134
  assert_equal(7, @icmp.timeout)
100
135
  end
101
136
 
137
+ test "timeout works as expected" do
138
+ omit_if(@@jruby)
139
+ icmp = Net::Ping::ICMP.new('bogus.com', nil, 0.000001)
140
+ assert_false(icmp.ping?)
141
+ assert_equal('timeout', icmp.exception)
142
+ end
143
+
102
144
  test "exception method basic functionality" do
103
145
  assert_respond_to(@icmp, :exception)
104
- assert_nothing_raised{ @icmp.ping }
105
146
  end
106
147
 
107
148
  test "exception method returns nil if no ping has happened yet" do
@@ -128,6 +169,7 @@ class TC_PingICMP < Test::Unit::TestCase
128
169
  end
129
170
 
130
171
  test "setting an odd data_size is valid" do
172
+ omit_if(@@jruby)
131
173
  assert_nothing_raised{ @icmp.data_size = 57 }
132
174
  assert_boolean(@icmp.ping)
133
175
  end
@@ -135,5 +177,10 @@ class TC_PingICMP < Test::Unit::TestCase
135
177
  def teardown
136
178
  @host = nil
137
179
  @icmp = nil
180
+ @concurrency = nil
181
+ end
182
+
183
+ def self.shutdown
184
+ @@jruby = nil
138
185
  end
139
186
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: net-ping
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.2
4
+ version: 1.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel J. Berger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-21 00:00:00.000000000 Z
11
+ date: 2014-04-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: test-unit
@@ -102,15 +102,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
102
102
  requirements:
103
103
  - - ">="
104
104
  - !ruby/object:Gem::Version
105
- version: 1.9.1
105
+ version: 1.9.3
106
106
  required_rubygems_version: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  requirements: []
112
- rubyforge_project: shards
113
- rubygems_version: 2.2.0
112
+ rubyforge_project:
113
+ rubygems_version: 2.2.2
114
114
  signing_key:
115
115
  specification_version: 4
116
116
  summary: A ping interface for Ruby.