ruby-nmap 0.9.2 → 0.9.3
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|