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, &block) ⇒ Object

Deprecated.

Use parse instead.

Since:

  • 0.7.0



69
70
71
# File 'lib/nmap/xml.rb', line 69

def self.load(text,&block)
  parse(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



87
88
89
# File 'lib/nmap/xml.rb', line 87

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

.parse(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.8.0



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

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

Instance Method Details

#debuggingInteger

Parses the debugging level.

Returns:

  • (Integer)

    The debugging level.



195
196
197
# File 'lib/nmap/xml.rb', line 195

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

#down_hostHost

Returns the first host found to be down during the scan.

Returns:

Since:

  • 0.8.0



330
331
332
# File 'lib/nmap/xml.rb', line 330

def down_host
  each_down_host.first
end

#down_hostsArray<Host>

Parses the hosts found to be down during the scan.

Returns:

  • (Array<Host>)

    The down hosts in the scan.

Since:

  • 0.8.0



319
320
321
# File 'lib/nmap/xml.rb', line 319

def down_hosts
  each_down_host.to_a
end

#each(&block) ⇒ Object

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

See Also:



383
384
385
# File 'lib/nmap/xml.rb', line 383

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

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

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

Yields:

  • (host)

    Each host will be passed to a given block.

Yield Parameters:

  • host (Host)

    A down host in the scan.

Returns:

  • (XML, Enumerator)

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

Since:

  • 0.8.0



301
302
303
304
305
306
307
308
309
# File 'lib/nmap/xml.rb', line 301

def each_down_host
  return enum_for(__method__) unless block_given?

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

  return self
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.



255
256
257
258
259
260
261
262
263
# File 'lib/nmap/xml.rb', line 255

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



152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/nmap/xml.rb', line 152

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



213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
# File 'lib/nmap/xml.rb', line 213

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.



347
348
349
350
351
352
353
354
355
# File 'lib/nmap/xml.rb', line 347

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

#hostHost

Returns the first host.

Returns:

Since:

  • 0.8.0



282
283
284
# File 'lib/nmap/xml.rb', line 282

def host
  each_host.first
end

#hostsArray<Host>

Parses the hosts in the scan.

Returns:

  • (Array<Host>)

    The hosts in the scan.



271
272
273
# File 'lib/nmap/xml.rb', line 271

def hosts
  each_host.to_a
end

#inspectString

Inspects the XML file.

Returns:

  • (String)

    The inspected XML file.



403
404
405
# File 'lib/nmap/xml.rb', line 403

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

#run_statsArray<RunStat>

Parses the essential runstats information.

Returns:

  • (Array<RunStat>)

    The runstats.

Since:

  • 0.7.0



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

def run_stats
  each_run_stat.to_a
end

#scan_infoArray<Scan>

Parses the scan information.

Returns:

  • (Array<Scan>)

    The scan information.



122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/nmap/xml.rb', line 122

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.



97
98
99
100
101
102
103
104
# File 'lib/nmap/xml.rb', line 97

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



238
239
240
# File 'lib/nmap/xml.rb', line 238

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.



393
394
395
# File 'lib/nmap/xml.rb', line 393

def to_s
  @path.to_s
end

#up_hostHost

Returns the first host found to be up during the scan.

Returns:

Since:

  • 0.8.0



374
375
376
# File 'lib/nmap/xml.rb', line 374

def up_host
  each_up_host.first
end

#up_hostsArray<Host>

Parses the hosts found to be up during the scan.

Returns:

  • (Array<Host>)

    The hosts in the scan.



363
364
365
# File 'lib/nmap/xml.rb', line 363

def up_hosts
  each_up_host.to_a
end

#verboseInteger

Parses the verbose level.

Returns:

  • (Integer)

    The verbose level.



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

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.



112
113
114
# File 'lib/nmap/xml.rb', line 112

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