Class: Nexpose::AssetGroup

Inherits:
AssetGroupSummary show all
Includes:
Sanitize
Defined in:
lib/nexpose/group.rb

Overview

Asset group configuration object containing Device details.

Instance Attribute Summary collapse

Attributes inherited from AssetGroupSummary

#dynamic, #risk_score

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Sanitize

#replace_entities

Methods inherited from AssetGroupSummary

#delete, #dynamic?

Constructor Details

#initialize(name, desc, id = -1,, risk = 0.0) ⇒ AssetGroup

Returns a new instance of AssetGroup.



78
79
80
81
82
# File 'lib/nexpose/group.rb', line 78

def initialize(name, desc, id = -1, risk = 0.0)
  @name, @description, @id, @risk_score = name, desc, id, risk
  @assets = []
  @tags = []
end

Instance Attribute Details

#assetsObject Also known as: devices

Array of devices associated with this asset group.



74
75
76
# File 'lib/nexpose/group.rb', line 74

def assets
  @assets
end

#descriptionObject

Returns the value of attribute description.



71
72
73
# File 'lib/nexpose/group.rb', line 71

def description
  @description
end

#idObject

Returns the value of attribute id.



71
72
73
# File 'lib/nexpose/group.rb', line 71

def id
  @id
end

#nameObject

Returns the value of attribute name.



71
72
73
# File 'lib/nexpose/group.rb', line 71

def name
  @name
end

#tagsObject

Returns the value of attribute tags.



71
72
73
# File 'lib/nexpose/group.rb', line 71

def tags
  @tags
end

Class Method Details

.load(connection, id) ⇒ AssetGroup

Load an existing configuration from a Nexpose instance.

Parameters:

  • connection (Connection)

    Connection to console where asset group is configured.

  • id (Fixnum)

    Asset group ID of an existing group.

Returns:

  • (AssetGroup)

    Asset group configuration loaded from a Nexpose console.



154
155
156
157
158
# File 'lib/nexpose/group.rb', line 154

def self.load(connection, id)
  xml = %(<AssetGroupConfigRequest session-id="#{connection.session_id}" group-id="#{id}"/>)
  r = APIRequest.execute(connection.url, xml)
  parse(r.res)
end

.parse(xml) ⇒ Object



160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
# File 'lib/nexpose/group.rb', line 160

def self.parse(xml)
  return nil unless xml
  group = REXML::XPath.first(xml, 'AssetGroupConfigResponse/AssetGroup')
  asset_group = new(group.attributes['name'],
                    group.attributes['description'],
                    group.attributes['id'].to_i,
                    group.attributes['riskscore'].to_f)

  group.elements.each('Description') do |desc|
    asset_group.description = desc.text
  end

  group.elements.each('Devices/device') do |dev|
    asset_group.assets << Device.new(dev.attributes['id'].to_i,
                                     dev.attributes['address'],
                                     dev.attributes['site-id'].to_i,
                                     dev.attributes['riskfactor'].to_f,
                                     dev.attributes['riskscore'].to_f)
  end
  group.elements.each('Tags/Tag') do |tag|
    asset_group.tags << TagSummary.parse_xml(tag)
  end
  asset_group
end

Instance Method Details

#as_xmlString

Generate an XML representation of this group configuration

Returns:

  • (String)

    XML valid for submission as part of other requests.



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/nexpose/group.rb', line 96

def as_xml
  xml = REXML::Element.new('AssetGroup')
  xml.attributes['id'] = @id
  xml.attributes['name'] = @name
  xml.attributes['description'] = @description

  if @description && !@description.empty?
    elem = REXML::Element.new('Description')
    elem.add_text(@description)
    xml.add_element(elem)
  end

  elem = REXML::Element.new('Devices')
  @assets.each { |a| elem.add_element('device', {'id' => a.id}) }
  xml.add_element(elem)

  unless tags.empty?
    tag_xml = xml.add_element(REXML::Element.new('Tags'))
    @tags.each { |tag| tag_xml.add_element(tag.as_xml) }
  end

  xml
end

#rescan_assets(connection) ⇒ Hash

Launch ad hoc scans against each group of assets per site.

Parameters:

  • connection (Connection)

    Connection to console where asset group is configured.

Returns:

  • (Hash)

    Hash of site ID to Scan launch information for each scan.



136
137
138
139
140
141
142
143
144
# File 'lib/nexpose/group.rb', line 136

def rescan_assets(connection)
  sites_ids = @assets.map { |d| d.site_id }.uniq
  scans = {}
  sites_ids.each do |site_id|
    to_scan = @assets.select { |d| d.site_id == site_id }
    scans[site_id] = connection.scan_devices(to_scan)
  end
  scans
end

#save(connection) ⇒ Object



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

def save(connection)
  xml = "<AssetGroupSaveRequest session-id='#{connection.session_id}'>"
  xml << to_xml
  xml << '</AssetGroupSaveRequest>'
  res = connection.execute(xml)
  @id = res.attributes['group-id'].to_i if res.success and @id < 1
end

#to_xmlString

Get an XML representation of the group that is valid for a save request. Note that only name, description, and asset ID information is accepted by a save request.

Returns:

  • (String)

    XML representation of the asset group.



126
127
128
# File 'lib/nexpose/group.rb', line 126

def to_xml
  as_xml.to_s
end