Class: Nmap::XML

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/nmap/xml.rb

Overview

Represents an Nmap XML file.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(document) {|xml| ... } ⇒ XML

Creates a new XML object.

Parameters:

  • document (Nokogiri::XML::Document, IO, String)

    The path to the Nmap XML scan file or Nokogiri::XML::Document.

Yields:

  • (xml)

    If a block is given, it will be passed the new XML object.

Yield Parameters:

  • xml (XML)

    The newly created XML object.



32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/nmap/xml.rb', line 32

def initialize(document)
  case document
  when Nokogiri::XML::Document
    @doc = document
  when IO, StringIO
    @doc = Nokogiri::XML(document)
  else
    @path = File.expand_path(document)
    @doc  = Nokogiri::XML(open(@path))
  end

  yield self if block_given?
end

Instance Attribute Details

#pathObject (readonly)

Path of the Nmap XML scan file



18
19
20
# File 'lib/nmap/xml.rb', line 18

def path
  @path
end

Class Method Details

.load(text) {|xml| ... } ⇒ Object

Creates a new XML object from XML text.

Parameters:

  • text (String)

    XML text of the scan file

Yields:

  • (xml)

    If a block is given, it will be passed the new XML object.

Yield Parameters:

  • xml (XML)

    The newly created XML object.

Since:

  • 0.7.0



60
61
62
# File 'lib/nmap/xml.rb', line 60

def self.load(text,&block)
  new(Nokogiri::XML(text), &block)
end

.open(path) {|xml| ... } ⇒ Object

Creates a new XML object from the file.

Parameters:

  • path (String)

    The path to the XML file.

Yields:

  • (xml)

    If a block is given, it will be passed the new XML object.

Yield Parameters:

  • xml (XML)

    The newly created XML object.

Since:

  • 0.7.0



78
79
80
# File 'lib/nmap/xml.rb', line 78

def self.open(path,&block)
  new(path,&block)
end

Instance Method Details

#debuggingInteger

Parses the debugging level.

Returns:

  • (Integer)

    The debugging level.



186
187
188
# File 'lib/nmap/xml.rb', line 186

def debugging
  @debugging ||= @doc.at('debugging/@level').inner_text.to_i
end

#each(&block) ⇒ Object

Parses the hosts that were found to be up during the scan.

See Also:



304
305
306
# File 'lib/nmap/xml.rb', line 304

def each(&block)
  each_up_host(&block)
end

#each_host {|host| ... } ⇒ XML, Enumerator

Parses the hosts in the scan.

Yields:

  • (host)

    Each host will be passed to a given block.

Yield Parameters:

  • host (Host)

    A host in the scan.

Returns:

  • (XML, Enumerator)

    The XML object. If no block was given, an enumerator object will be returned.



246
247
248
249
250
251
252
253
254
# File 'lib/nmap/xml.rb', line 246

def each_host
  return enum_for(__method__) unless block_given?

  @doc.xpath('/nmaprun/host').each do |host|
    yield Host.new(host)
  end

  return self
end

#each_run_stat {|run_stat| ... } ⇒ Enumerator

Parses the essential runstats information.

Yields:

  • (run_stat)

    The given block will be passed each runstat.

Yield Parameters:

  • run_stat (RunStat)

    A runstat.

Returns:

  • (Enumerator)

    If no block is given, an enumerator will be returned.

Since:

  • 0.7.0



143
144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'lib/nmap/xml.rb', line 143

def each_run_stat
  return enum_for(__method__) unless block_given?

  @doc.xpath('/nmaprun/runstats/finished').each do |run_stat|
    yield RunStat.new(
      Time.at(run_stat['time'].to_i),
      run_stat['elapsed'],
      run_stat['summary'],
      run_stat['exit']
    )
  end

  return self
end

#each_task {|task| ... } ⇒ Enumerator

Parses the tasks of the scan.

Yields:

  • (task)

    The given block will be passed each scan task.

Yield Parameters:

  • task (ScanTask)

    A task from the scan.

Returns:

  • (Enumerator)

    If no block is given, an enumerator will be returned.

Since:

  • 0.7.0



204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
# File 'lib/nmap/xml.rb', line 204

def each_task
  return enum_for(__method__) unless block_given?

  @doc.xpath('/nmaprun/taskbegin').each do |task_begin|
    task_end = task_begin.xpath('following-sibling::taskend').first

    yield ScanTask.new(
      task_begin['task'],
      Time.at(task_begin['time'].to_i),
      Time.at(task_end['time'].to_i),
      task_end['extrainfo']
    )
  end

  return self
end

#each_up_host {|host| ... } ⇒ XML, Enumerator

Parses the hosts that were found to be up during the scan.

Yields:

  • (host)

    Each host will be passed to a given block.

Yield Parameters:

  • host (Host)

    A host in the scan.

Returns:

  • (XML, Enumerator)

    The XML parser. If no block was given, an enumerator object will be returned.



279
280
281
282
283
284
285
286
287
# File 'lib/nmap/xml.rb', line 279

def each_up_host
  return enum_for(__method__) unless block_given?

  @doc.xpath("/nmaprun/host[status[@state='up']]").each do |host|
    yield Host.new(host)
  end

  return self
end

#hostsArray<Host>

Parses the hosts in the scan.

Returns:

  • (Array<Host>)

    The hosts in the scan.



262
263
264
# File 'lib/nmap/xml.rb', line 262

def hosts
  each_host.to_a
end

#inspectString

Inspects the XML file.

Returns:

  • (String)

    The inspected XML file.



324
325
326
# File 'lib/nmap/xml.rb', line 324

def inspect
  "#<#{self.class}: #{self}>"
end

#run_statsArray<RunStat>

Parses the essential runstats information.

Returns:

  • (Array<RunStat>)

    The runstats.

Since:

  • 0.7.0



166
167
168
# File 'lib/nmap/xml.rb', line 166

def run_stats
  each_run_stat.to_a
end

#scan_infoArray<Scan>

Parses the scan information.

Returns:

  • (Array<Scan>)

    The scan information.



113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/nmap/xml.rb', line 113

def scan_info
  @doc.xpath('/nmaprun/scaninfo').map do |scaninfo|
    Scan.new(
      scaninfo['type'].to_sym,
      scaninfo['protocol'].to_sym,
      scaninfo['services'].split(',').map { |ports|
        if ports.include?('-')
          Range.new(*(ports.split('-',2)))
        else
          ports.to_i
        end
      }
    )
  end
end

#scannerScanner

Parses the scanner information.

Returns:

  • (Scanner)

    The scanner that was used and generated the scan file.



88
89
90
91
92
93
94
95
# File 'lib/nmap/xml.rb', line 88

def scanner
  @scanner ||= Scanner.new(
    @doc.root['scanner'],
    @doc.root['version'],
    @doc.root['args'],
    Time.at(@doc.root['start'].to_i)
  )
end

#tasksArray<ScanTask>

Parses the tasks of the scan.

Returns:

  • (Array<ScanTask>)

    The tasks of the scan.

Since:

  • 0.1.2



229
230
231
# File 'lib/nmap/xml.rb', line 229

def tasks
  each_task.to_a
end

#to_sString

Converts the XML parser to a String.

Returns:

  • (String)

    The path of the XML scan file.



314
315
316
# File 'lib/nmap/xml.rb', line 314

def to_s
  @path.to_s
end

#up_hostsArray<Host>

Parses the hosts found to be up during the scan.

Returns:

  • (Array<Host>)

    The hosts in the scan.



295
296
297
# File 'lib/nmap/xml.rb', line 295

def up_hosts
  each_up_host.to_a
end

#verboseInteger

Parses the verbose level.

Returns:

  • (Integer)

    The verbose level.



176
177
178
# File 'lib/nmap/xml.rb', line 176

def verbose
  @verbose ||= @doc.at('verbose/@level').inner_text.to_i
end

#versionString

Parses the XML scan file version.

Returns:

  • (String)

    The version of the XML scan file.



103
104
105
# File 'lib/nmap/xml.rb', line 103

def version
  @version ||= @doc.root['xmloutputversion']
end