net-ping 1.7.2 → 1.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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.