nexpose 0.5.4 → 0.5.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 00359dd620e92f676ddd3fa63454edcde20be901
4
- data.tar.gz: e4232827f4eb8c05c0f3f384e9d15dc1c7b21de5
3
+ metadata.gz: be1927974585e905062867bb7351af429d25508f
4
+ data.tar.gz: 6bdddfb2e730d732b624eec8a1fb1a6d3a64cc8f
5
5
  SHA512:
6
- metadata.gz: 06b52c03d3a839c289bc140c5c8c741a5119040681bdb7f4946ea9dc26d11f9e518c8ec5717a525fa072c385e7763939c268c45cbe87af9f07f7800f7071521f
7
- data.tar.gz: 35fa17bad2fa38cb8333510ea62e5cd63a90051726656531b05b024bfc5f43766efa77c71b6a31fcfd6028a2293f1a43e3a99a96f7f700c0a543338a111688e1
6
+ metadata.gz: f1378c726f6efe3b18e57e40becbb76705bd12e0fa23e38e5c8f28bc3ace2bef5c4fb3641f64b0815d68b724225bc26fdb921fad1f1a4ae33cce722c0973ada6
7
+ data.tar.gz: a5a4bff4e2ac2f6935c905a12c63a8dd54ffd2c49875faa2c64f0c7c916ea00560c8c4ea3038e7399558c477a4ee7610146ea95a94de685c7124a888102ce30b
data/lib/nexpose.rb CHANGED
@@ -83,7 +83,7 @@ require 'nexpose/user'
83
83
  require 'nexpose/vuln'
84
84
  require 'nexpose/vuln_exception'
85
85
  require 'nexpose/connection'
86
- require 'nexpose/backup'
86
+ require 'nexpose/maint'
87
87
 
88
88
  module Nexpose
89
89
 
data/lib/nexpose/ajax.rb CHANGED
@@ -120,6 +120,8 @@ module Nexpose
120
120
  response.body
121
121
  when Net::HTTPCreated
122
122
  response.body
123
+ when Net::HTTPUnauthorized
124
+ raise Nexpose::PermissionError.new(response)
123
125
  else
124
126
  req_type = request.class.name.split('::').last.upcase
125
127
  raise Nexpose::APIError.new(response, "#{req_type} request to #{request.path} failed. #{request.body}")
@@ -5,9 +5,6 @@ module Nexpose
5
5
  attr_reader :http
6
6
  attr_reader :uri
7
7
  attr_reader :headers
8
- attr_reader :retry_count
9
- attr_reader :time_out
10
- attr_reader :pause
11
8
 
12
9
  attr_reader :req
13
10
  attr_reader :res
@@ -20,7 +17,7 @@ module Nexpose
20
17
  attr_reader :raw_response
21
18
  attr_reader :raw_response_data
22
19
 
23
- def initialize(req, url, api_version='1.1')
20
+ def initialize(req, url, api_version = '1.1')
24
21
  @url = url
25
22
  @req = req
26
23
  @api_version = api_version
@@ -29,10 +26,6 @@ module Nexpose
29
26
  end
30
27
 
31
28
  def prepare_http_client
32
- @retry_count = 0
33
- @retry_count_max = 10
34
- @time_out = 30
35
- @pause = 2
36
29
  @uri = URI.parse(@url)
37
30
  @http = Net::HTTP.new(@uri.host, @uri.port)
38
31
  @http.use_ssl = true
@@ -46,11 +39,12 @@ module Nexpose
46
39
  @success = false
47
40
  end
48
41
 
49
- def execute
42
+ def execute(options = {})
50
43
  @conn_tries = 0
51
44
 
52
45
  begin
53
46
  prepare_http_client
47
+ @http.read_timeout = options[:timeout] if options.key? :timeout
54
48
  @raw_response = @http.post(@uri.path, @req, @headers)
55
49
  @raw_response_data = @raw_response.read_body
56
50
  @res = parse_xml(@raw_response_data)
@@ -93,7 +87,7 @@ module Nexpose
93
87
  @conn_tries += 1
94
88
  retry
95
89
  end
96
- rescue ::ArgumentError, ::NoMethodError
90
+ rescue ::ArgumentError, ::NoMethodError => e
97
91
  if @conn_tries < 5
98
92
  @conn_tries += 1
99
93
  retry
@@ -101,9 +95,10 @@ module Nexpose
101
95
  rescue ::Timeout::Error
102
96
  if @conn_tries < 5
103
97
  @conn_tries += 1
104
- retry
98
+ # If an explicit timeout is set, don't retry.
99
+ retry unless options.key? :timeout
105
100
  end
106
- @error = 'Nexpose host did not respond.'
101
+ @error = "Nexpose did not respond within #{@http.read_timeout} seconds."
107
102
  rescue ::Errno::EHOSTUNREACH, ::Errno::ENETDOWN, ::Errno::ENETUNREACH, ::Errno::ENETRESET, ::Errno::EHOSTDOWN, ::Errno::EACCES, ::Errno::EINVAL, ::Errno::EADDRNOTAVAIL
108
103
  @error = 'Nexpose host is unreachable.'
109
104
  # Handle console-level interrupts
@@ -127,12 +122,11 @@ module Nexpose
127
122
  @res.root.attributes(*args)
128
123
  end
129
124
 
130
- def self.execute(url, req, api_version='1.1')
125
+ def self.execute(url, req, api_version='1.1', options = {})
131
126
  obj = self.new(req, url, api_version)
132
- obj.execute
127
+ obj.execute(options)
133
128
  raise APIError.new(obj, "Action failed: #{obj.error}") unless obj.success
134
129
  obj
135
130
  end
136
-
137
131
  end
138
132
  end
@@ -31,7 +31,7 @@ module Nexpose
31
31
  # Send as file attachment or zipped file to individuals who are not members
32
32
  # of the report access list. One of: file|zip
33
33
  attr_accessor :send_as
34
- # Send to all the authorized users of sites, groups, and devices.
34
+ # Send to all the authorized users of sites, groups, and assets.
35
35
  attr_accessor :to_all_authorized
36
36
  # Send to users on the report access list.
37
37
  attr_accessor :send_to_acl_as
@@ -84,10 +84,10 @@ module Nexpose
84
84
  end
85
85
 
86
86
  # Execute an API request
87
- def execute(xml, version = '1.1')
87
+ def execute(xml, version = '1.1', options = {})
88
88
  @request_xml = xml.to_s
89
89
  @api_version = version
90
- response = APIRequest.execute(@url, @request_xml, @api_version)
90
+ response = APIRequest.execute(@url, @request_xml, @api_version, options)
91
91
  @response_xml = response.raw_response_data
92
92
  response
93
93
  end
@@ -84,6 +84,8 @@ module Nexpose
84
84
  r = execute(make_xml('DeviceDeleteRequest', { 'device-id' => device_id }))
85
85
  r.success
86
86
  end
87
+
88
+ alias_method :delete_asset, :delete_device
87
89
  end
88
90
 
89
91
  # Object that represents a single device in a Nexpose security console.
data/lib/nexpose/group.rb CHANGED
@@ -59,14 +59,18 @@ module Nexpose
59
59
  # Asset group configuration object containing Device details.
60
60
  #
61
61
  class AssetGroup < AssetGroupSummary
62
+ include Sanitize
63
+
62
64
  attr_accessor :name, :description, :id
63
65
 
64
66
  # Array[Device] of devices associated with this asset group.
65
- attr_accessor :devices
67
+ attr_accessor :assets
68
+ alias :devices :assets
69
+ alias :devices= :assets=
66
70
 
67
71
  def initialize(name, desc, id = -1, risk = 0.0)
68
72
  @name, @description, @id, @risk_score = name, desc, id, risk
69
- @devices = []
73
+ @assets = []
70
74
  end
71
75
 
72
76
  def save(connection)
@@ -78,18 +82,18 @@ module Nexpose
78
82
  end
79
83
 
80
84
  # Get an XML representation of the group that is valid for a save request.
81
- # Note that only name, description, and device ID information is accepted
85
+ # Note that only name, description, and asset ID information is accepted
82
86
  # by a save request.
83
87
  #
84
88
  # @return [String] XML representation of the asset group.
85
89
  #
86
90
  def to_xml
87
- xml = %(<AssetGroup id="#{@id}" name="#{@name}")
88
- xml << %( description="#{@description}") if @description
91
+ xml = %(<AssetGroup id="#{@id}" name="#{replace_entities(@name)}")
92
+ xml << %( description="#{replace_entities(@description)}") if @description
89
93
  xml << '>'
90
94
  xml << '<Devices>'
91
- @devices.each do |device|
92
- xml << %(<device id="#{device.id}"/>)
95
+ @assets.each do |asset|
96
+ xml << %(<device id="#{asset.id}"/>)
93
97
  end
94
98
  xml << '</Devices>'
95
99
  xml << '</AssetGroup>'
@@ -102,11 +106,11 @@ module Nexpose
102
106
  # @return [Hash] Hash of site ID to Scan launch information for each scan.
103
107
  #
104
108
  def rescan_assets(connection)
105
- sites_ids = @devices.map { |d| d.site_id }.uniq
109
+ sites_ids = @assets.map { |d| d.site_id }.uniq
106
110
  scans = {}
107
111
  sites_ids.each do |id|
108
- to_scan = @devices.select { |d| d.site_id == id }
109
- scans[id] = connection.scan_devices(to_scan)
112
+ to_scan = @assets.select { |d| d.site_id == id }
113
+ scans[id] = connection.scan_assets(to_scan)
110
114
  end
111
115
  scans
112
116
  end
@@ -134,11 +138,11 @@ module Nexpose
134
138
  group.attributes['id'].to_i,
135
139
  group.attributes['riskscore'].to_f)
136
140
  group.elements.each('Devices/device') do |dev|
137
- asset_group.devices << Device.new(dev.attributes['id'].to_i,
138
- dev.attributes['address'],
139
- dev.attributes['site-id'].to_i,
140
- dev.attributes['riskfactor'].to_f,
141
- dev.attributes['riskscore'].to_f)
141
+ asset_group.assets << Device.new(dev.attributes['id'].to_i,
142
+ dev.attributes['address'],
143
+ dev.attributes['site-id'].to_i,
144
+ dev.attributes['riskfactor'].to_f,
145
+ dev.attributes['riskscore'].to_f)
142
146
  end
143
147
  asset_group
144
148
  end
@@ -32,6 +32,31 @@ module Nexpose
32
32
  end
33
33
  end
34
34
 
35
+ # Initiate database maintenance tasks to improve database performance and
36
+ # consistency.
37
+ # A restart will be initiated in order to put the product into maintenance
38
+ # mode while the tasks are run. It will then restart automatically.
39
+ #
40
+ # @param [Boolean] clean_up Removes any unnecessary data from the database.
41
+ # @param [Boolean] compress Compresses the database tables and reclaims
42
+ # unused, allocated space.
43
+ # @param [Boolean] reindex Drops and recreates the database indexes for
44
+ # improved performance.
45
+ # @return [Boolean] Whether a maintenance tasks are successfully initiated.
46
+ #
47
+ def db_maintenance(clean_up = false, compress = false, reindex = false)
48
+ return unless compress || clean_up || reindex
49
+ parameters = { 'cmd' => 'startMaintenance',
50
+ 'targetTask' => 'dbMaintenance' }
51
+ parameters['cleanup'] = 1 if clean_up
52
+ parameters['compress'] = 1 if compress
53
+ parameters['reindex'] = 1 if reindex
54
+ xml = AJAX.form_post(self, '/admin/global/maintenance/maintCmd.txml', parameters)
55
+ if !!(xml =~ /succeded="true"/)
56
+ _maintenance_restart
57
+ end
58
+ end
59
+
35
60
  def _maintenance_restart
36
61
  parameters = { 'cancelAllTasks' => false,
37
62
  'cmd' => 'restartServer',
@@ -226,13 +226,15 @@ module Nexpose
226
226
  # For XML-based reports, only the raw report is returned and not any images.
227
227
  #
228
228
  # @param [Connection] connection Nexpose connection.
229
+ # @param [Fixnum] timeout How long, in seconds, to wait for the report to
230
+ # generate. Larger reports can take a significant amount of time.
229
231
  # @return Report in text format except for PDF, which returns binary data.
230
232
  #
231
- def generate(connection)
233
+ def generate(connection, timeout = 300)
232
234
  xml = %(<ReportAdhocGenerateRequest session-id='#{connection.session_id}'>)
233
235
  xml << to_xml
234
236
  xml << '</ReportAdhocGenerateRequest>'
235
- response = connection.execute(xml)
237
+ response = connection.execute(xml, '1.1', timeout: timeout)
236
238
  if response.success
237
239
  content_type_response = response.raw_response.header['Content-Type']
238
240
  if content_type_response =~ /multipart\/mixed;\s*boundary=([^\s]+)/
@@ -396,9 +398,9 @@ module Nexpose
396
398
  end
397
399
 
398
400
  # Object that represents a report filter which determines which sites, asset
399
- # groups, and/or devices that a report is run against.
401
+ # groups, and/or assets that a report is run against.
400
402
  #
401
- # The configuration must include at least one of device (asset), site,
403
+ # The configuration must include at least one of asset, site,
402
404
  # group (asset group) or scan filter to define the scope of report.
403
405
  # The vuln-status filter can be used only with raw report formats: csv
404
406
  # or raw_xml. If the vuln-status filter is not included in the configuration,
@@ -406,8 +408,9 @@ module Nexpose
406
408
  # exported by default in csv and raw_xml reports.
407
409
  #
408
410
  class Filter
411
+ include Sanitize
409
412
 
410
- # The ID of the specific site, group, device, or scan.
413
+ # The ID of the specific site, group, asset, or scan.
411
414
  # For scan, this can also be "last" for the most recently run scan.
412
415
  # For vuln-status, the ID can have one of the following values:
413
416
  # 1. vulnerable-exploited (The check was positive. An exploit verified the vulnerability.)
@@ -424,7 +427,7 @@ module Nexpose
424
427
  end
425
428
 
426
429
  def to_xml
427
- %(<filter id='#{@id}' type='#{@type}' />)
430
+ %(<filter id='#{replace_entities(@id)}' type='#{@type}' />)
428
431
  end
429
432
 
430
433
  def self.parse(xml)
@@ -108,7 +108,9 @@ module Nexpose
108
108
  # Array of report attributes, in the order they will be present in a report.
109
109
  attr_accessor :attributes
110
110
  # Display asset names with IPs.
111
- attr_accessor :show_device_names
111
+ attr_accessor :show_asset_names
112
+ alias :show_device_names :show_asset_names
113
+ alias :show_device_names= :show_asset_names=
112
114
 
113
115
  def initialize(name, type = 'document', id = -1, scope = 'silo', built_in = false)
114
116
  @name = name
@@ -120,7 +122,7 @@ module Nexpose
120
122
  @sections = []
121
123
  @properties = {}
122
124
  @attributes = []
123
- @show_device_names = false
125
+ @show_asset_names = false
124
126
  end
125
127
 
126
128
  # Save the configuration for a report template.
@@ -170,7 +172,7 @@ module Nexpose
170
172
  xml << '</ReportSections>'
171
173
  end
172
174
 
173
- xml << %(<Settings><showDeviceNames enabled='#{@show_device_names ? 1 : 0}' /></Settings>)
175
+ xml << %(<Settings><showDeviceNames enabled='#{@show_asset_names ? 1 : 0}' /></Settings>)
174
176
  xml << '</ReportTemplate>'
175
177
  end
176
178
 
@@ -198,7 +200,7 @@ module Nexpose
198
200
  end
199
201
 
200
202
  tmp.elements.each('//showDeviceNames') do |show|
201
- template.show_device_names = show.attributes['enabled'] == '1'
203
+ template.show_asset_names = show.attributes['enabled'] == '1'
202
204
  end
203
205
 
204
206
  return template
data/lib/nexpose/role.rb CHANGED
@@ -112,6 +112,7 @@ module Nexpose
112
112
  end
113
113
 
114
114
  class Role < RoleSummary
115
+ include Sanitize
115
116
 
116
117
  # Constants, mapping UI terms to role names expected by API.
117
118
 
@@ -231,10 +232,10 @@ module Nexpose
231
232
  end
232
233
 
233
234
  def to_xml
234
- xml = %Q(<Role name="#{@name}" full-name="#{@full_name}")
235
+ xml = %Q(<Role name="#{replace_entities(@name)}" full-name="#{replace_entities(@full_name)}")
235
236
  xml << %Q( enabled="#{(enabled ? 'true' : 'false')}")
236
237
  xml << %Q( scope="#{@scope}">)
237
- xml << %Q(<Description>#{@description}</Description>)
238
+ xml << %Q(<Description>#{replace_entities(@description)}</Description>)
238
239
 
239
240
  xml << '<SitePrivileges>'
240
241
  Privilege::Site::constants.each do |field|
@@ -34,6 +34,7 @@ module Nexpose
34
34
  # available for configuration.
35
35
  #
36
36
  class ScanTemplate
37
+ include Sanitize
37
38
 
38
39
  # Parsed XML of a scan template.
39
40
  attr_reader :xml
@@ -60,7 +61,7 @@ module Nexpose
60
61
  def name=(name)
61
62
  desc = REXML::XPath.first(@xml, 'ScanTemplate/templateDescription')
62
63
  if desc
63
- desc.attributes['title'] = name
64
+ desc.attributes['title'] = replace_entities(name)
64
65
  else
65
66
  root = REXML::XPath.first(xml, 'ScanTemplate')
66
67
  desc = REXML::Element.new('templateDescription')
@@ -80,7 +81,7 @@ module Nexpose
80
81
  def description=(description)
81
82
  desc = REXML::XPath.first(@xml, 'ScanTemplate/templateDescription')
82
83
  if desc
83
- desc.text = description
84
+ desc.text = replace_entities(description)
84
85
  else
85
86
  root = REXML::XPath.first(xml, 'ScanTemplate')
86
87
  desc = REXML::Element.new('templateDescription')
@@ -56,10 +56,12 @@ module Nexpose
56
56
  attr_accessor :name
57
57
 
58
58
  # The asset the ticket is created for.
59
- attr_accessor :device_id
59
+ attr_accessor :asset_id
60
+ alias :device_id :asset_id
61
+ alias :device_id= :asset_id=
60
62
 
61
63
  # The login name of person to whom the ticket is assigned.
62
- # The user must have view asset privilege on the asset specified in the device-id attribute.
64
+ # The user must have view asset privilege on the asset specified in the asset-id attribute.
63
65
  attr_accessor :assigned_to
64
66
 
65
67
  # The relative priority of the ticket, assigned by the creator of the ticket.
@@ -82,7 +84,7 @@ module Nexpose
82
84
  def self.parse(xml)
83
85
  ticket = new(xml.attributes['name'],
84
86
  xml.attributes['id'].to_i)
85
- ticket.device_id = xml.attributes['device-id'].to_i
87
+ ticket.asset_id = xml.attributes['device-id'].to_i
86
88
  ticket.assigned_to = xml.attributes['assigned-to']
87
89
  lookup = Ticket::Priority.constants.reduce({}) { |a, e| a[Ticket::Priority.const_get(e)] = e; a }
88
90
  ticket.priority = lookup[xml.attributes['priority']]
@@ -178,7 +180,7 @@ module Nexpose
178
180
  xml = REXML::Element.new('TicketCreate')
179
181
  xml.add_attributes({ 'name' => @name,
180
182
  'priority' => @priority,
181
- 'device-id' => @device_id,
183
+ 'device-id' => @asset_id,
182
184
  'assigned-to' => @assigned_to })
183
185
 
184
186
  vuln_xml = REXML::Element.new('Vulnerabilities')
data/lib/nexpose/user.rb CHANGED
@@ -117,9 +117,9 @@ module Nexpose
117
117
  xml << %Q{ authsrcid="#{@authsrcid}"}
118
118
  xml << %Q{ name="#{replace_entities(@name)}"}
119
119
  xml << %Q{ fullname="#{replace_entities(@full_name)}"}
120
- xml << %Q{ role-name="#{@role_name}"}
120
+ xml << %Q{ role-name="#{replace_entities(@role_name)}"}
121
121
  xml << %Q{ password="#{replace_entities(@password)}"} if @password
122
- xml << %Q{ email="#{@email}"} if @email
122
+ xml << %Q{ email="#{replace_entities(@email)}"} if @email
123
123
  xml << %Q{ enabled="#{@enabled}"}
124
124
  # These two fields are keying off role_name to work around a defect.
125
125
  xml << %Q{ allGroups="#{@all_groups || @role_name == 'global-admin'}"}
@@ -83,13 +83,13 @@ module Nexpose
83
83
  # Certain attributes are necessary for some exception scopes, even though
84
84
  # they are optional otherwise.
85
85
  # • An exception for all instances of a vulnerability on all assets only
86
- # requires the vuln_id attribute. The device_id, vuln_key and port
86
+ # requires the vuln_id attribute. The asset_id, vuln_key and port
87
87
  # attributes are ignored for this scope type.
88
88
  # • An exception for all instances on a specific asset requires the vuln_id
89
- # and device_id attributes. The vuln_key and port attributes are ignored for
89
+ # and asset_id attributes. The vuln_key and port attributes are ignored for
90
90
  # this scope type.
91
91
  # • An exception for a specific instance of a vulnerability on a specific
92
- # asset requires the vuln_id, device_id. Additionally, the port and/or the
92
+ # asset requires the vuln_id, asset_id. Additionally, the port and/or the
93
93
  # key attribute must be specified.
94
94
  #
95
95
  class VulnException
@@ -111,9 +111,12 @@ module Nexpose
111
111
  # The scope of the exception.
112
112
  # @see Nexpose::VulnException::Scope
113
113
  attr_accessor :scope
114
- # ID of device, if this exception applies to only one device.
115
- attr_accessor :device_id
116
- # Port on a device, if this exception applies to a specific port.
114
+ # ID of asset, if this exception applies to only one asset.
115
+ attr_accessor :asset_id
116
+ alias :device_id :asset_id
117
+ alias :device_id= :asset_id=
118
+
119
+ # Port on a asset, if this exception applies to a specific port.
117
120
  attr_accessor :port
118
121
  # The specific vulnerable component in a discovered instance of the
119
122
  # vulnerability referenced by the vuln_id, such as a program, file or user
@@ -145,9 +148,9 @@ module Nexpose
145
148
  'reason' => @reason })
146
149
  case @scope
147
150
  when Scope::ALL_INSTANCES_ON_A_SPECIFIC_ASSET
148
- xml.add_attributes({ 'device-id' => @device_id })
151
+ xml.add_attributes({ 'device-id' => @asset_id })
149
152
  when Scope::SPECIFIC_INSTANCE_OF_SPECIFIC_ASSET
150
- xml.add_attributes({ 'device-id' => @device_id,
153
+ xml.add_attributes({ 'device-id' => @asset_id,
151
154
  'port-no' => @port,
152
155
  'vuln-key' => @vuln_key })
153
156
  end
@@ -303,12 +306,12 @@ module Nexpose
303
306
 
304
307
  case @scope
305
308
  when Scope::ALL_INSTANCES
306
- @device_id = @port = @vuln_key = nil
309
+ @asset_id = @port = @vuln_key = nil
307
310
  when Scope::ALL_INSTANCES_ON_A_SPECIFIC_ASSET
308
- raise ArgumentError.new('No device_id.') unless @device_id
311
+ raise ArgumentError.new('No asset_id.') unless @asset_id
309
312
  @port = @vuln_key = nil
310
313
  when Scope::SPECIFIC_INSTANCE_OF_SPECIFIC_ASSET
311
- raise ArgumentError.new('No device_id.') unless @device_id
314
+ raise ArgumentError.new('No asset_id.') unless @asset_id
312
315
  raise ArgumentError.new('Port or vuln_key is required.') unless @port || @vuln_key
313
316
  else
314
317
  raise ArgumentError.new("Invalid scope: #{@scope}")
@@ -324,7 +327,7 @@ module Nexpose
324
327
  exception.id = xml.attributes['exception-id']
325
328
  exception.submitter = xml.attributes['submitter']
326
329
  exception.reviewer = xml.attributes['reviewer']
327
- exception.device_id = xml.attributes['device-id']
330
+ exception.asset_id = xml.attributes['device-id']
328
331
  exception.port = xml.attributes['port-no']
329
332
  exception.vuln_key = xml.attributes['vuln-key']
330
333
  # TODO: Convert to Date/Time object?
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nexpose
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.4
4
+ version: 0.5.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - HD Moore
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-09-27 00:00:00.000000000 Z
13
+ date: 2013-11-08 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: librex
@@ -55,7 +55,6 @@ files:
55
55
  - Rakefile
56
56
  - lib/nexpose.rb
57
57
  - lib/nexpose/pool.rb
58
- - lib/nexpose/backup.rb
59
58
  - lib/nexpose/group.rb
60
59
  - lib/nexpose/device.rb
61
60
  - lib/nexpose/report_template.rb
@@ -66,6 +65,7 @@ files:
66
65
  - lib/nexpose/creds.rb
67
66
  - lib/nexpose/api_request.rb
68
67
  - lib/nexpose/role.rb
68
+ - lib/nexpose/maint.rb
69
69
  - lib/nexpose/engine.rb
70
70
  - lib/nexpose/manage.rb
71
71
  - lib/nexpose/scan.rb
@@ -105,7 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
105
105
  version: '0'
106
106
  requirements: []
107
107
  rubyforge_project:
108
- rubygems_version: 2.0.0.rc.2
108
+ rubygems_version: 2.0.3
109
109
  signing_key:
110
110
  specification_version: 4
111
111
  summary: Ruby API for Rapid7 Nexpose