nexpose 0.5.4 → 0.5.5

Sign up to get free protection for your applications and to get access to all the features.
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