ruby-nmap 0.4.0 → 0.4.1
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.
- data/ChangeLog.md +9 -0
- data/Rakefile +1 -1
- data/gemspec.yml +1 -1
- data/lib/nmap/host.rb +16 -13
- data/lib/nmap/os.rb +22 -16
- data/lib/nmap/version.rb +1 -1
- data/lib/nmap/xml.rb +17 -12
- data/spec/spec_helper.rb +1 -0
- data/spec/xml_spec.rb +4 -0
- metadata +5 -5
data/ChangeLog.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
### 0.4.1 / 2010-11-23
|
2
|
+
|
3
|
+
* Fixed a bug in {Nmap::XML#each} where it was calling `each_up_hosts`,
|
4
|
+
and not {Nmap::XML#each_up_host}.
|
5
|
+
* {Nmap::OS#each_class}, {Nmap::OS#each_match}, {Nmap::XML#each_host} and
|
6
|
+
{Nmap::XML#each_up_host} now return an Enumerator object if no block
|
7
|
+
is given.
|
8
|
+
* Use `yield` instead of `block.call` for a slight performance improvement.
|
9
|
+
|
1
10
|
### 0.4.0 / 2010-11-17
|
2
11
|
|
3
12
|
* Added new options to {Nmap::Task} based on nmap 5.21:
|
data/Rakefile
CHANGED
data/gemspec.yml
CHANGED
data/lib/nmap/host.rb
CHANGED
@@ -4,7 +4,6 @@ require 'nmap/os'
|
|
4
4
|
require 'nmap/port'
|
5
5
|
|
6
6
|
require 'nokogiri'
|
7
|
-
require 'enumerator'
|
8
7
|
|
9
8
|
module Nmap
|
10
9
|
class Host
|
@@ -24,10 +23,10 @@ module Nmap
|
|
24
23
|
# @yieldparam [Host] host
|
25
24
|
# The newly created Host object.
|
26
25
|
#
|
27
|
-
def initialize(node
|
26
|
+
def initialize(node)
|
28
27
|
@node = node
|
29
28
|
|
30
|
-
|
29
|
+
yield self if block_given?
|
31
30
|
end
|
32
31
|
|
33
32
|
#
|
@@ -39,7 +38,7 @@ module Nmap
|
|
39
38
|
# @since 0.1.2
|
40
39
|
#
|
41
40
|
def start_time
|
42
|
-
Time.at(@node['starttime'].to_i)
|
41
|
+
@start_time ||= Time.at(@node['starttime'].to_i)
|
43
42
|
end
|
44
43
|
|
45
44
|
#
|
@@ -51,7 +50,7 @@ module Nmap
|
|
51
50
|
# @since 0.1.2
|
52
51
|
#
|
53
52
|
def end_time
|
54
|
-
Time.at(@node['endtime'].to_i)
|
53
|
+
@end_time ||= Time.at(@node['endtime'].to_i)
|
55
54
|
end
|
56
55
|
|
57
56
|
#
|
@@ -61,12 +60,16 @@ module Nmap
|
|
61
60
|
# The status of the host.
|
62
61
|
#
|
63
62
|
def status
|
64
|
-
|
63
|
+
unless @status
|
64
|
+
status = @node.at('status')
|
65
65
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
66
|
+
@status = Status.new(
|
67
|
+
status['state'].to_sym,
|
68
|
+
status['reason']
|
69
|
+
)
|
70
|
+
end
|
71
|
+
|
72
|
+
return @status
|
70
73
|
end
|
71
74
|
|
72
75
|
#
|
@@ -221,9 +224,9 @@ module Nmap
|
|
221
224
|
# The OS guessing information.
|
222
225
|
#
|
223
226
|
def os(&block)
|
224
|
-
os = @node.at('os')
|
225
|
-
|
226
|
-
|
227
|
+
if (os = @node.at('os'))
|
228
|
+
@os = OS.new(os,&block)
|
229
|
+
end
|
227
230
|
end
|
228
231
|
|
229
232
|
#
|
data/lib/nmap/os.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
require 'nmap/os_class'
|
2
2
|
require 'nmap/os_match'
|
3
3
|
|
4
|
-
require 'enumerator'
|
5
|
-
|
6
4
|
module Nmap
|
7
5
|
class OS
|
8
6
|
|
@@ -20,10 +18,10 @@ module Nmap
|
|
20
18
|
# @yieldparam [OS] os
|
21
19
|
# The newly created OS object.
|
22
20
|
#
|
23
|
-
def initialize(node
|
21
|
+
def initialize(node)
|
24
22
|
@node = node
|
25
23
|
|
26
|
-
|
24
|
+
yield self if block_given?
|
27
25
|
end
|
28
26
|
|
29
27
|
#
|
@@ -35,10 +33,13 @@ module Nmap
|
|
35
33
|
# @yieldparam [OSClass] class
|
36
34
|
# The OS class information.
|
37
35
|
#
|
38
|
-
# @return [OS]
|
39
|
-
# The OS information.
|
36
|
+
# @return [OS, Enumerator]
|
37
|
+
# The OS information. If no block was given, an enumerator object
|
38
|
+
# will be returned.
|
40
39
|
#
|
41
|
-
def each_class
|
40
|
+
def each_class
|
41
|
+
return enum_for(:each_class) unless block_given?
|
42
|
+
|
42
43
|
@node.xpath("osclass").map do |osclass|
|
43
44
|
os_class = OSClass.new(
|
44
45
|
osclass['type'].to_sym,
|
@@ -47,7 +48,7 @@ module Nmap
|
|
47
48
|
osclass['accuracy'].to_i
|
48
49
|
)
|
49
50
|
|
50
|
-
|
51
|
+
yield os_class
|
51
52
|
end
|
52
53
|
|
53
54
|
return self
|
@@ -60,7 +61,7 @@ module Nmap
|
|
60
61
|
# The OS class information.
|
61
62
|
#
|
62
63
|
def classes
|
63
|
-
|
64
|
+
enum_for(:each_class).to_a
|
64
65
|
end
|
65
66
|
|
66
67
|
#
|
@@ -72,17 +73,20 @@ module Nmap
|
|
72
73
|
# @yieldparam [OSMatch] class
|
73
74
|
# The OS match information.
|
74
75
|
#
|
75
|
-
# @return [OS]
|
76
|
-
# The OS information.
|
76
|
+
# @return [OS, Enumerator]
|
77
|
+
# The OS information. If no block was given, an enumerator object
|
78
|
+
# will be returned.
|
77
79
|
#
|
78
|
-
def each_match
|
80
|
+
def each_match
|
81
|
+
return enum_for(:each_match) unless block_given?
|
82
|
+
|
79
83
|
@node.xpath("osmatch").map do |osclass|
|
80
84
|
os_match = OSMatch.new(
|
81
85
|
osclass['name'],
|
82
86
|
osclass['accuracy'].to_i
|
83
87
|
)
|
84
88
|
|
85
|
-
|
89
|
+
yield os_match
|
86
90
|
end
|
87
91
|
|
88
92
|
return self
|
@@ -95,7 +99,7 @@ module Nmap
|
|
95
99
|
# The OS match information.
|
96
100
|
#
|
97
101
|
def matches
|
98
|
-
|
102
|
+
enum_for(:each_match).to_a
|
99
103
|
end
|
100
104
|
|
101
105
|
#
|
@@ -105,7 +109,9 @@ module Nmap
|
|
105
109
|
# The ports used.
|
106
110
|
#
|
107
111
|
def ports_used
|
108
|
-
@node.xpath("portused/@portid").map
|
112
|
+
@ports_used ||= @node.xpath("portused/@portid").map do |port|
|
113
|
+
port.inner_text.to_i
|
114
|
+
end
|
109
115
|
end
|
110
116
|
|
111
117
|
#
|
@@ -115,7 +121,7 @@ module Nmap
|
|
115
121
|
# The OS fingerprint.
|
116
122
|
#
|
117
123
|
def fingerprint
|
118
|
-
@node.at("osfingerprint/@fingerprint").inner_text
|
124
|
+
@fingerprint ||= @node.at("osfingerprint/@fingerprint").inner_text
|
119
125
|
end
|
120
126
|
|
121
127
|
#
|
data/lib/nmap/version.rb
CHANGED
data/lib/nmap/xml.rb
CHANGED
@@ -4,7 +4,6 @@ require 'nmap/scan'
|
|
4
4
|
require 'nmap/host'
|
5
5
|
|
6
6
|
require 'nokogiri'
|
7
|
-
require 'enumerator'
|
8
7
|
|
9
8
|
module Nmap
|
10
9
|
class XML
|
@@ -26,11 +25,11 @@ module Nmap
|
|
26
25
|
# @yieldparam [XML] xml
|
27
26
|
# The newly created XML object.
|
28
27
|
#
|
29
|
-
def initialize(path
|
28
|
+
def initialize(path)
|
30
29
|
@path = File.expand_path(path)
|
31
30
|
@doc = Nokogiri::XML(File.new(@path))
|
32
31
|
|
33
|
-
|
32
|
+
yield self if block_given?
|
34
33
|
end
|
35
34
|
|
36
35
|
#
|
@@ -130,12 +129,15 @@ module Nmap
|
|
130
129
|
# @yieldparam [Host] host
|
131
130
|
# A host in the scan.
|
132
131
|
#
|
133
|
-
# @return [XML]
|
134
|
-
# The XML object.
|
132
|
+
# @return [XML, Enumerator]
|
133
|
+
# The XML object. If no block was given, an enumerator object will
|
134
|
+
# be returned.
|
135
135
|
#
|
136
136
|
def each_host(&block)
|
137
|
+
return enum_for(:each_host) unless block
|
138
|
+
|
137
139
|
@doc.xpath('/nmaprun/host').each do |host|
|
138
|
-
|
140
|
+
Host.new(host,&block)
|
139
141
|
end
|
140
142
|
|
141
143
|
return self
|
@@ -148,7 +150,7 @@ module Nmap
|
|
148
150
|
# The hosts in the scan.
|
149
151
|
#
|
150
152
|
def hosts
|
151
|
-
|
153
|
+
enum_for(:each_host).to_a
|
152
154
|
end
|
153
155
|
|
154
156
|
#
|
@@ -160,10 +162,13 @@ module Nmap
|
|
160
162
|
# @yieldparam [Host] host
|
161
163
|
# A host in the scan.
|
162
164
|
#
|
163
|
-
# @return [XML]
|
164
|
-
# The XML parser.
|
165
|
+
# @return [XML, Enumerator]
|
166
|
+
# The XML parser. If no block was given, an enumerator object will
|
167
|
+
# be returned.
|
165
168
|
#
|
166
169
|
def each_up_host(&block)
|
170
|
+
return enum_for(:each_up_host) unless block
|
171
|
+
|
167
172
|
@doc.xpath("/nmaprun/host[status[@state='up']]").each do |host|
|
168
173
|
Host.new(host,&block)
|
169
174
|
end
|
@@ -178,16 +183,16 @@ module Nmap
|
|
178
183
|
# The hosts in the scan.
|
179
184
|
#
|
180
185
|
def up_hosts
|
181
|
-
|
186
|
+
enum_for(:each_up_host).to_a
|
182
187
|
end
|
183
188
|
|
184
189
|
#
|
185
190
|
# Parses the hosts that were found to be up during the scan.
|
186
191
|
#
|
187
|
-
# @see
|
192
|
+
# @see each_up_host
|
188
193
|
#
|
189
194
|
def each(&block)
|
190
|
-
|
195
|
+
each_up_host(&block)
|
191
196
|
end
|
192
197
|
|
193
198
|
#
|
data/spec/spec_helper.rb
CHANGED
data/spec/xml_spec.rb
CHANGED
@@ -66,6 +66,10 @@ describe XML do
|
|
66
66
|
@xml.hosts.length.should == 10
|
67
67
|
end
|
68
68
|
|
69
|
+
it "should iterate over each up host" do
|
70
|
+
@xml.each.all? { |host| host.status.state == :up }.should == true
|
71
|
+
end
|
72
|
+
|
69
73
|
it "should convert to a String" do
|
70
74
|
@xml.to_s.should == Helpers::SCAN_FILE
|
71
75
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 4
|
8
|
-
-
|
9
|
-
version: 0.4.
|
8
|
+
- 1
|
9
|
+
version: 0.4.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Postmodern
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-11-
|
17
|
+
date: 2010-11-23 00:00:00 -08:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -72,9 +72,9 @@ dependencies:
|
|
72
72
|
- !ruby/object:Gem::Version
|
73
73
|
segments:
|
74
74
|
- 2
|
75
|
+
- 1
|
75
76
|
- 0
|
76
|
-
|
77
|
-
version: 2.0.0
|
77
|
+
version: 2.1.0
|
78
78
|
type: :development
|
79
79
|
version_requirements: *id004
|
80
80
|
- !ruby/object:Gem::Dependency
|