ruby-nmap 0.9.2 → 0.9.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 +4 -4
- data/ChangeLog.md +15 -0
- data/Gemfile +1 -1
- data/LICENSE.txt +1 -1
- data/README.md +10 -1
- data/Rakefile +0 -2
- data/lib/nmap/host.rb +12 -12
- data/lib/nmap/os.rb +1 -1
- data/lib/nmap/port.rb +3 -3
- data/lib/nmap/task.rb +59 -16
- data/lib/nmap/version.rb +1 -1
- data/lib/nmap/xml.rb +4 -0
- data/spec/task_spec.rb +129 -15
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '07049218e947bfd368b40b59010f838c9e298f25'
|
4
|
+
data.tar.gz: 94176a6041fc4da9a2adcd7ebf4ea9714ff6b6e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6b753b489e1f5f8ee6e03ea9162e7a120d3fdfcb97d138f3cd0d6b02f521b0630240322e8ebb76b88a54437095b1ac40e2f2271e1692b0665df8f7203ee8bd7f
|
7
|
+
data.tar.gz: f00bec7139dcd52ef9f4d351da5c3821fa0a2f20cb3570927b11b80f0c90f74cdf32876a252f1ad9b4a1b8051921c493af848991896d857b657381431438285f
|
data/ChangeLog.md
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
### 0.9.3 / 2018-05-01
|
2
|
+
|
3
|
+
* Added missing `Nmap::Task#defeat_icmp_ratelimit` for the
|
4
|
+
`--defeat-icmp-ratelimit` option.
|
5
|
+
* Added missing `Nmap::Task#nsock_engine` for the `--nsock-engine` option.
|
6
|
+
* Added the {Nmap::XML#prescripts} alias.
|
7
|
+
* Added the {Nmap::XML#postscripts} alias.
|
8
|
+
* Allow `Task#sctp_init_ping` to accept a port Range object.
|
9
|
+
* Fixed a typo in the `Task#defeat_rst_ratelimit` name.
|
10
|
+
* Fixed the option formatting of `Nmap::Task#syn_discovery`.
|
11
|
+
* Fixed the option formatting of `Nmap::Task#ack_discovery`.
|
12
|
+
* Fixed the option formatting of `Nmap::Task#udp_discovery`.
|
13
|
+
* Fixed the option formatting of `Nmap::Task#sctp_init_ping`.
|
14
|
+
* Fixed the option formatting of `Nmap::Task#ip_ping`.
|
15
|
+
|
1
16
|
### 0.9.2 / 2017-01-13
|
2
17
|
|
3
18
|
* Fix file descriptor leak in {Nmap::XML#initialize} by using
|
data/Gemfile
CHANGED
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -32,6 +32,15 @@ Run Nmap from Ruby:
|
|
32
32
|
nmap.targets = '192.168.1.*'
|
33
33
|
end
|
34
34
|
|
35
|
+
Run `sudo nmap` from Ruby:
|
36
|
+
|
37
|
+
require 'nmap/program'
|
38
|
+
|
39
|
+
Nmap::Program.sudo_scan do |nmap|
|
40
|
+
nmap.syn_scan = true
|
41
|
+
# ...
|
42
|
+
end
|
43
|
+
|
35
44
|
Parse Nmap XML scan files:
|
36
45
|
|
37
46
|
require 'nmap/xml'
|
@@ -83,7 +92,7 @@ Print NSE script output from an XML scan file:
|
|
83
92
|
|
84
93
|
## License
|
85
94
|
|
86
|
-
Copyright (c) 2009-
|
95
|
+
Copyright (c) 2009-2018 Postmodern
|
87
96
|
|
88
97
|
See {file:LICENSE.txt} for license information.
|
89
98
|
|
data/Rakefile
CHANGED
data/lib/nmap/host.rb
CHANGED
@@ -63,7 +63,7 @@ module Nmap
|
|
63
63
|
#
|
64
64
|
def status
|
65
65
|
unless @status
|
66
|
-
status = @node.
|
66
|
+
status = @node.at_xpath('status')
|
67
67
|
|
68
68
|
@status = Status.new(
|
69
69
|
status['state'].to_sym,
|
@@ -120,7 +120,7 @@ module Nmap
|
|
120
120
|
# The MAC address of the host.
|
121
121
|
#
|
122
122
|
def mac
|
123
|
-
@mac ||= if (addr = @node.
|
123
|
+
@mac ||= if (addr = @node.at_xpath("address[@addrtype='mac']"))
|
124
124
|
addr['addr']
|
125
125
|
end
|
126
126
|
end
|
@@ -134,7 +134,7 @@ module Nmap
|
|
134
134
|
# @since 0.8.0
|
135
135
|
#
|
136
136
|
def vendor
|
137
|
-
@vendor ||= if (vendor = @node.
|
137
|
+
@vendor ||= if (vendor = @node.at_xpath("address/@vendor"))
|
138
138
|
vendor.inner_text
|
139
139
|
end
|
140
140
|
end
|
@@ -146,7 +146,7 @@ module Nmap
|
|
146
146
|
# The IPv4 address of the host.
|
147
147
|
#
|
148
148
|
def ipv4
|
149
|
-
@ipv4 ||= if (addr = @node.
|
149
|
+
@ipv4 ||= if (addr = @node.at_xpath("address[@addrtype='ipv4']"))
|
150
150
|
addr['addr']
|
151
151
|
end
|
152
152
|
end
|
@@ -158,7 +158,7 @@ module Nmap
|
|
158
158
|
# The IPv6 address of the host.
|
159
159
|
#
|
160
160
|
def ipv6
|
161
|
-
@ipv6 ||= if (addr = @node.
|
161
|
+
@ipv6 ||= if (addr = @node.at_xpath("address[@addrtype='ipv6']"))
|
162
162
|
addr['addr']
|
163
163
|
end
|
164
164
|
end
|
@@ -240,7 +240,7 @@ module Nmap
|
|
240
240
|
# The OS guessing information.
|
241
241
|
#
|
242
242
|
def os
|
243
|
-
@os ||= if (os = @node.
|
243
|
+
@os ||= if (os = @node.at_xpath('os'))
|
244
244
|
OS.new(os)
|
245
245
|
end
|
246
246
|
|
@@ -263,7 +263,7 @@ module Nmap
|
|
263
263
|
# @since 0.7.0
|
264
264
|
#
|
265
265
|
def uptime
|
266
|
-
@uptime ||= if (uptime = @node.
|
266
|
+
@uptime ||= if (uptime = @node.at_xpath('uptime'))
|
267
267
|
Uptime.new(
|
268
268
|
uptime['seconds'].to_i,
|
269
269
|
Time.parse(uptime['lastboot'])
|
@@ -287,7 +287,7 @@ module Nmap
|
|
287
287
|
# The parsed object.
|
288
288
|
#
|
289
289
|
def tcp_sequence
|
290
|
-
@tcp_sequence ||= if (seq = @node.
|
290
|
+
@tcp_sequence ||= if (seq = @node.at_xpath('tcpsequence'))
|
291
291
|
TcpSequence.new(seq)
|
292
292
|
end
|
293
293
|
|
@@ -317,7 +317,7 @@ module Nmap
|
|
317
317
|
# The parsed object.
|
318
318
|
#
|
319
319
|
def ip_id_sequence
|
320
|
-
@ip_id_sequence ||= if (seq = @node.
|
320
|
+
@ip_id_sequence ||= if (seq = @node.at_xpath('ipidsequence'))
|
321
321
|
IpIdSequence.new(seq)
|
322
322
|
end
|
323
323
|
|
@@ -347,7 +347,7 @@ module Nmap
|
|
347
347
|
# The parsed object.
|
348
348
|
#
|
349
349
|
def tcp_ts_sequence
|
350
|
-
@tcp_ts_sequence ||= if (seq = @node.
|
350
|
+
@tcp_ts_sequence ||= if (seq = @node.at_xpath('tcptssequence'))
|
351
351
|
TcpTsSequence.new(seq)
|
352
352
|
end
|
353
353
|
|
@@ -532,7 +532,7 @@ module Nmap
|
|
532
532
|
# @since 0.9.0
|
533
533
|
#
|
534
534
|
def host_script
|
535
|
-
@host_script ||= if (hostscript = @node.
|
535
|
+
@host_script ||= if (hostscript = @node.at_xpath('hostscript'))
|
536
536
|
HostScript.new(hostscript)
|
537
537
|
end
|
538
538
|
end
|
@@ -552,7 +552,7 @@ module Nmap
|
|
552
552
|
# @since 0.7.0
|
553
553
|
#
|
554
554
|
def traceroute
|
555
|
-
@traceroute ||= if (trace = @node.
|
555
|
+
@traceroute ||= if (trace = @node.at_xpath('trace'))
|
556
556
|
Traceroute.new(trace)
|
557
557
|
end
|
558
558
|
|
data/lib/nmap/os.rb
CHANGED
@@ -109,7 +109,7 @@ module Nmap
|
|
109
109
|
# The OS fingerprint.
|
110
110
|
#
|
111
111
|
def fingerprint
|
112
|
-
@fingerprint ||= if (fingerprint = @node.
|
112
|
+
@fingerprint ||= if (fingerprint = @node.at_xpath("osfingerprint/@fingerprint"))
|
113
113
|
fingerprint.inner_text
|
114
114
|
end
|
115
115
|
end
|
data/lib/nmap/port.rb
CHANGED
@@ -46,7 +46,7 @@ module Nmap
|
|
46
46
|
# The state of the port (`:open`, `:filtered` or `:closed`).
|
47
47
|
#
|
48
48
|
def state
|
49
|
-
@state ||= @node.
|
49
|
+
@state ||= @node.at_xpath('state/@state').inner_text.to_sym
|
50
50
|
end
|
51
51
|
|
52
52
|
#
|
@@ -56,7 +56,7 @@ module Nmap
|
|
56
56
|
# How the port was discovered.
|
57
57
|
#
|
58
58
|
def reason
|
59
|
-
@reason ||= @node.
|
59
|
+
@reason ||= @node.at_xpath('state/@reason').inner_text
|
60
60
|
end
|
61
61
|
|
62
62
|
#
|
@@ -68,7 +68,7 @@ module Nmap
|
|
68
68
|
# @since 0.6.0
|
69
69
|
#
|
70
70
|
def service
|
71
|
-
@service_info ||= if (service = @node.
|
71
|
+
@service_info ||= if (service = @node.at_xpath('service'))
|
72
72
|
Service.new(service)
|
73
73
|
end
|
74
74
|
end
|
data/lib/nmap/task.rb
CHANGED
@@ -95,7 +95,9 @@ module Nmap
|
|
95
95
|
# * `--max-scan-delay` - `nmap.max_scan_delay`
|
96
96
|
# * `--min-rate` - `nmap.min_rate`
|
97
97
|
# * `--max-rate` - `nmap.max_rate`
|
98
|
-
# * `--
|
98
|
+
# * `--defeat-rst-ratelimit` - `nmap.defeat_rst_ratelimit`
|
99
|
+
# * `--defeat-icmp-ratelimit` - `nmap.defeat_icmp_ratelimit`
|
100
|
+
# * `--nsock-engine` - `nmap.nsock_engine`
|
99
101
|
# * `-T` - `nmap.timing_template`
|
100
102
|
# * `-T0` - `nmap.paranoid_timing`
|
101
103
|
# * `-T1` - `nmap.sneaky_timing`
|
@@ -180,14 +182,24 @@ module Nmap
|
|
180
182
|
short_option :flag => '-sL', :name => :list
|
181
183
|
short_option :flag => '-sn', :name => :ping
|
182
184
|
short_option :flag => '-Pn', :name => :skip_discovery
|
183
|
-
short_option :flag => '-PS', :name => :syn_discovery
|
184
|
-
|
185
|
-
|
186
|
-
short_option :flag => '-
|
185
|
+
short_option :flag => '-PS', :name => :syn_discovery do |opt,value|
|
186
|
+
["#{opt.flag}#{format_port_list(value)}"]
|
187
|
+
end
|
188
|
+
short_option :flag => '-PA', :name => :ack_discovery do |opt,value|
|
189
|
+
["#{opt.flag}#{format_port_list(value)}"]
|
190
|
+
end
|
191
|
+
short_option :flag => '-PU', :name => :udp_discovery do |opt,value|
|
192
|
+
["#{opt.flag}#{format_port_list(value)}"]
|
193
|
+
end
|
194
|
+
short_option :flag => '-PY', :name => :sctp_init_ping do |opt,value|
|
195
|
+
["#{opt.flag}#{format_port_list(value)}"]
|
196
|
+
end
|
187
197
|
short_option :flag => '-PE', :name => :icmp_echo_discovery
|
188
198
|
short_option :flag => '-PP', :name => :icmp_timestamp_discovery
|
189
199
|
short_option :flag => '-PM', :name => :icmp_netmask_discovery
|
190
|
-
short_option :flag => '-PO', :name => :ip_ping
|
200
|
+
short_option :flag => '-PO', :name => :ip_ping do |opt,value|
|
201
|
+
["#{opt.flag}#{format_protocol_list(value)}"]
|
202
|
+
end
|
191
203
|
short_option :flag => '-PR', :name => :arp_ping
|
192
204
|
long_option :flag => '--traceroute', :name => :traceroute
|
193
205
|
short_option :flag => '-n', :name => :disable_dns
|
@@ -215,17 +227,9 @@ module Nmap
|
|
215
227
|
# PORT SPECIFICATION AND SCAN ORDER:
|
216
228
|
short_option :flag => '-p', :name => :ports do |opt,value|
|
217
229
|
unless value.empty?
|
218
|
-
[opt.flag, value
|
219
|
-
case port
|
220
|
-
when Range
|
221
|
-
"#{port.first}-#{port.last}"
|
222
|
-
else
|
223
|
-
port.to_s
|
224
|
-
end
|
225
|
-
}.join(',')]
|
230
|
+
[opt.flag, format_port_list(value)]
|
226
231
|
end
|
227
232
|
end
|
228
|
-
|
229
233
|
short_option :flag => '-F', :name => :fast
|
230
234
|
short_option :flag => '-r', :name => :consecutively
|
231
235
|
long_option :flag => '--top-ports'
|
@@ -268,7 +272,9 @@ module Nmap
|
|
268
272
|
long_option :flag => '--max-scan-delay'
|
269
273
|
long_option :flag => '--min-rate'
|
270
274
|
long_option :flag => '--max-rate'
|
271
|
-
long_option :flag => '--
|
275
|
+
long_option :flag => '--defeat-rst-ratelimit'
|
276
|
+
long_option :flag => '--defeat-icmp-ratelimit'
|
277
|
+
long_option :flag => '--nsock-engine'
|
272
278
|
short_option :flag => '-T', :name => :timing_template
|
273
279
|
short_option :flag => '-T0', :name => :paranoid_timing
|
274
280
|
short_option :flag => '-T1', :name => :sneaky_timing
|
@@ -334,5 +340,42 @@ module Nmap
|
|
334
340
|
|
335
341
|
non_option :tailing => true, :name => :targets
|
336
342
|
|
343
|
+
private
|
344
|
+
|
345
|
+
#
|
346
|
+
# Fomats a port list.
|
347
|
+
#
|
348
|
+
# @param [Array<Integer,Range>] ports
|
349
|
+
# The port ranges.
|
350
|
+
#
|
351
|
+
# @return [String]
|
352
|
+
# Comma separated string.
|
353
|
+
#
|
354
|
+
def self.format_port_list(ports)
|
355
|
+
ports.map { |port|
|
356
|
+
case port
|
357
|
+
when Range
|
358
|
+
"#{port.first}-#{port.last}"
|
359
|
+
else
|
360
|
+
port.to_s
|
361
|
+
end
|
362
|
+
}.join(',')
|
363
|
+
end
|
364
|
+
|
365
|
+
#
|
366
|
+
# Formats a protocol list.
|
367
|
+
#
|
368
|
+
# @param [Array<Integer,Range>] protocols
|
369
|
+
# The IP protocol numbers.
|
370
|
+
#
|
371
|
+
# @return [String]
|
372
|
+
# Comma separated string.
|
373
|
+
#
|
374
|
+
def self.format_protocol_list(protocols)
|
375
|
+
# NOTE: the man page says the protocol list is similar to the format of
|
376
|
+
# a port range.
|
377
|
+
format_port_list(protocols)
|
378
|
+
end
|
379
|
+
|
337
380
|
end
|
338
381
|
end
|
data/lib/nmap/version.rb
CHANGED
data/lib/nmap/xml.rb
CHANGED
@@ -255,6 +255,8 @@ module Nmap
|
|
255
255
|
end
|
256
256
|
end
|
257
257
|
|
258
|
+
alias prescripts prescript
|
259
|
+
|
258
260
|
#
|
259
261
|
# The NSE scripts ran after the scan.
|
260
262
|
#
|
@@ -269,6 +271,8 @@ module Nmap
|
|
269
271
|
end
|
270
272
|
end
|
271
273
|
|
274
|
+
alias postscripts postscript
|
275
|
+
|
272
276
|
#
|
273
277
|
# Parses the hosts in the scan.
|
274
278
|
#
|
data/spec/task_spec.rb
CHANGED
@@ -3,34 +3,148 @@ require 'nmap/task'
|
|
3
3
|
|
4
4
|
describe Task do
|
5
5
|
describe "#ports=" do
|
6
|
-
|
7
|
-
subject.ports = []
|
6
|
+
context "when given an empty Array" do
|
7
|
+
before { subject.ports = [] }
|
8
8
|
|
9
|
-
|
9
|
+
it "should ignore empty port Arrays" do
|
10
|
+
subject.ports = []
|
11
|
+
|
12
|
+
expect(subject.arguments).to eq([])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "when given a String" do
|
17
|
+
let(:ports) { '80,21,25' }
|
18
|
+
|
19
|
+
before { subject.ports = ports }
|
20
|
+
|
21
|
+
it "should emit the String as is" do
|
22
|
+
expect(subject.arguments).to eq(['-p', ports])
|
23
|
+
end
|
10
24
|
end
|
11
25
|
|
12
|
-
|
13
|
-
|
26
|
+
context "when given an Array of Strings" do
|
27
|
+
let(:ports) { %w[80 21 25] }
|
28
|
+
|
29
|
+
before { subject.ports = ports }
|
30
|
+
|
31
|
+
it "should format an Array of String ports" do
|
32
|
+
expect(subject.arguments).to eq(['-p', ports.join(',')])
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context "when given an Array of Integers" do
|
37
|
+
let(:ports) { [80, 21, 25] }
|
38
|
+
|
39
|
+
before { subject.ports = ports }
|
40
|
+
|
41
|
+
it "should format an Array of Integer ports" do
|
42
|
+
expect(subject.arguments).to eq(['-p', ports.join(',')])
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "when given an Array containing a Range" do
|
47
|
+
let(:ports) { [80, 21..25] }
|
48
|
+
|
49
|
+
before { subject.ports = ports }
|
50
|
+
|
51
|
+
it "should format the Range" do
|
52
|
+
expect(subject.arguments).to eq([
|
53
|
+
'-p', "#{ports[0]},#{ports[1].begin}-#{ports[1].end}"
|
54
|
+
])
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
shared_examples "optional port range" do |flag,method|
|
60
|
+
before { subject.send(:"#{method}=",ports) }
|
61
|
+
|
62
|
+
context "when given a Boolean" do
|
63
|
+
let(:ports) { true }
|
64
|
+
|
65
|
+
it "should emit the '#{flag}' option flag" do
|
66
|
+
expect(subject.arguments).to eq([flag])
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context "when given an empty Array" do
|
71
|
+
let(:ports) { [] }
|
72
|
+
|
73
|
+
it "should emit the '#{flag}' option flag" do
|
74
|
+
expect(subject.arguments).to eq([flag])
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context "when given an Array of Integers" do
|
79
|
+
let(:ports) { [80, 21, 25] }
|
80
|
+
|
81
|
+
it "should emit the '#{flag}' option flag with the Integer ports" do
|
82
|
+
expect(subject.arguments).to eq(["#{flag}#{ports.join(',')}"])
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context "when given an Array containing a Range" do
|
87
|
+
let(:ports) { [80, 21..25] }
|
88
|
+
|
89
|
+
it "should emit the '#{flag}' option flag with the Integer ports" do
|
90
|
+
expect(subject.arguments).to eq([
|
91
|
+
"#{flag}#{ports[0]},#{ports[1].begin}-#{ports[1].end}"
|
92
|
+
])
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "#syn_discovery" do
|
98
|
+
include_examples "optional port range", '-PS', :syn_discovery
|
99
|
+
end
|
100
|
+
|
101
|
+
describe "#ack_discovery" do
|
102
|
+
include_examples "optional port range", '-PA', :ack_discovery
|
103
|
+
end
|
104
|
+
|
105
|
+
describe "#udp_discovery" do
|
106
|
+
include_examples "optional port range", '-PU', :udp_discovery
|
107
|
+
end
|
108
|
+
|
109
|
+
describe "#sctp_init_ping" do
|
110
|
+
include_examples "optional port range", '-PY', :sctp_init_ping
|
111
|
+
end
|
112
|
+
|
113
|
+
describe "#ip_ping" do
|
114
|
+
before { subject.ip_ping = protocols }
|
115
|
+
|
116
|
+
context "when given a Boolean" do
|
117
|
+
let(:protocols) { true }
|
14
118
|
|
15
|
-
|
119
|
+
it "should emit the '-PO' option flag" do
|
120
|
+
expect(subject.arguments).to eq(['-PO'])
|
121
|
+
end
|
16
122
|
end
|
17
123
|
|
18
|
-
|
19
|
-
|
124
|
+
context "when given an empty Array" do
|
125
|
+
let(:protocols) { [] }
|
20
126
|
|
21
|
-
|
127
|
+
it "should emit the '-PO' option flag" do
|
128
|
+
expect(subject.arguments).to eq(['-PO'])
|
129
|
+
end
|
22
130
|
end
|
23
131
|
|
24
|
-
|
25
|
-
|
132
|
+
context "when given an Array of Integers" do
|
133
|
+
let(:protocols) { [80, 21, 25] }
|
26
134
|
|
27
|
-
|
135
|
+
it "should emit the '-PO' option flag with the Integer ports" do
|
136
|
+
expect(subject.arguments).to eq(["-PO#{protocols.join(',')}"])
|
137
|
+
end
|
28
138
|
end
|
29
139
|
|
30
|
-
|
31
|
-
|
140
|
+
context "when given an Array containing a Range" do
|
141
|
+
let(:protocols) { [80, 21..25] }
|
32
142
|
|
33
|
-
|
143
|
+
it "should emit the '-PO' option flag with the Integer ports" do
|
144
|
+
expect(subject.arguments).to eq([
|
145
|
+
"-PO#{protocols[0]},#{protocols[1].begin}-#{protocols[1].end}"
|
146
|
+
])
|
147
|
+
end
|
34
148
|
end
|
35
149
|
end
|
36
150
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-nmap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Postmodern
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-05-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -157,7 +157,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
157
157
|
requirements:
|
158
158
|
- nmap >= 5.00
|
159
159
|
rubyforge_project:
|
160
|
-
rubygems_version: 2.
|
160
|
+
rubygems_version: 2.6.14
|
161
161
|
signing_key:
|
162
162
|
specification_version: 4
|
163
163
|
summary: A Ruby interface to Nmap.
|