Module: Nexpose::DataTable

Defined in:
lib/nexpose/data_table.rb

Overview

Data table functions which extract data from the Nexpose UI.

The functions in this file are utility functions for accessing data in the same manner as the Nexpose UI. These functions are not designed for external use, but to aid exposing data through other methods in the gem.

Class Method Summary collapse

Class Method Details

._dyn_headers(response) ⇒ Object

Parse headers out of a dyntable response.



84
85
86
87
88
89
90
# File 'lib/nexpose/data_table.rb', line 84

def _dyn_headers(response)
  headers = []
  response.elements.each('DynTable/MetaData/Column') do |header|
    headers << header.attributes['name']
  end
  headers
end

._dyn_record(row) ⇒ Object

Parse records out of the row of a dyntable.



102
103
104
105
106
107
108
# File 'lib/nexpose/data_table.rb', line 102

def _dyn_record(row)
  record = []
  row.elements.each('td') do |value|
    record << (value.text ? value.text.to_s : '')
  end
  record
end

._dyn_rows(response) ⇒ Object

Parse rows out of a dyntable into an array of values.



93
94
95
96
97
98
99
# File 'lib/nexpose/data_table.rb', line 93

def _dyn_rows(response)
  rows = []
  response.elements.each('DynTable/Data/tr') do |row|
    rows << _dyn_record(row)
  end
  rows
end

._get_dyn_table(console, address, payload = nil) ⇒ Array[Hash]

Helper method to get a Dyntable into a consumable Ruby object.

Example usage:

DataTable._get_dyn_table(@console, '/data/asset/os/dyntable.xml?tableID=OSSynopsisTable')

Parameters:

  • console (Connection)

    API connection to a Nexpose console.

  • address (String)

    Tag address with parameters relative to host:port

Returns:

  • (Array[Hash])

    array of hashes representing the requested table.



70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/nexpose/data_table.rb', line 70

def _get_dyn_table(console, address, payload = nil)
  if payload
    response = AJAX.post(console, address, payload)
  else
    response = AJAX.get(console, address)
  end
  response = REXML::Document.new(response)

  headers = _dyn_headers(response)
  rows    = _dyn_rows(response)
  rows.map { |row| Hash[headers.zip(row)] }
end

._get_json_table(console, address, parameters = {}, page_size = 500, records = nil, post = true) ⇒ Array[Hash]

Helper method to get the YUI tables into a consumable Ruby object.

Example usage:

DataTable._get_json_table(@console,
                          '/data/asset/site',
                          { 'sort' => 'assetName',
                            'table-id' => 'site-assets',
                            'siteID' => site_id })

Parameters:

  • console (Connection)

    API connection to a Nexpose console.

  • address (String)

    Controller address relative to host:port

  • parameters (Hash) (defaults to: {})

    Parameters that need to be sent to the controller The following attributes may need to be provided:

    'sort' Column to sort by
    'table-id' The ID of the table to get from this controller
    
  • page_size (Fixnum) (defaults to: 500)

    Number of records to include per page. Value must conform to supported defaults: -1, 10, 25, 50, 100, 500.

  • records (Fixnum) (defaults to: nil)

    number of records to return, gets all if not specified.

  • post (Boolean) (defaults to: true)

    Whether to use form post or get to retrieve data.

Returns:

  • (Array[Hash])

    An array of hashes representing the requested table.



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/nexpose/data_table.rb', line 34

def _get_json_table(console, address, parameters = {}, page_size = 500, records = nil, post = true)
  parameters['dir']        = 'DESC'
  parameters['startIndex'] = -1
  parameters['results']    = -1
  if post
    request = lambda { |p| AJAX.form_post(console, address, p) }
  else
    request = lambda { |p| AJAX.get(console, address.dup, AJAX::CONTENT_TYPE::JSON, p) }
  end

  response = request.call(parameters)
  data     = JSON.parse(response)
  # Don't attept to grab more records than there are.
  total = data['totalRecords']
  return [] if total.zero?
  total = records.nil? ? total : [records, total].min
  rows  = []
  parameters['results'] = page_size
  while rows.length < total
    parameters['startIndex'] = rows.length
    data = JSON.parse(request.call(parameters))
    rows.concat data['records']
  end
  rows
end