nexpose 7.0.0 → 7.0.1
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 +4 -4
- data/CHANGELOG.md +2 -3
- data/Gemfile.lock +1 -1
- data/lib/nexpose/ajax.rb +12 -16
- data/lib/nexpose/alert.rb +20 -21
- data/lib/nexpose/api.rb +3 -3
- data/lib/nexpose/asset.rb +23 -23
- data/lib/nexpose/blackout.rb +6 -14
- data/lib/nexpose/common.rb +87 -92
- data/lib/nexpose/connection.rb +8 -10
- data/lib/nexpose/console.rb +9 -9
- data/lib/nexpose/dag.rb +2 -2
- data/lib/nexpose/data_table.rb +8 -12
- data/lib/nexpose/device.rb +35 -34
- data/lib/nexpose/discovery.rb +69 -69
- data/lib/nexpose/discovery/filter.rb +7 -8
- data/lib/nexpose/engine.rb +22 -21
- data/lib/nexpose/error.rb +7 -5
- data/lib/nexpose/external.rb +21 -16
- data/lib/nexpose/filter.rb +51 -52
- data/lib/nexpose/global_blackout.rb +6 -7
- data/lib/nexpose/global_settings.rb +2 -3
- data/lib/nexpose/group.rb +25 -19
- data/lib/nexpose/json_serializer.rb +4 -14
- data/lib/nexpose/maint.rb +8 -9
- data/lib/nexpose/manage.rb +2 -2
- data/lib/nexpose/multi_tenant_user.rb +42 -42
- data/lib/nexpose/password_policy.rb +14 -14
- data/lib/nexpose/pool.rb +6 -5
- data/lib/nexpose/report.rb +30 -34
- data/lib/nexpose/report_template.rb +17 -18
- data/lib/nexpose/role.rb +64 -55
- data/lib/nexpose/scan.rb +77 -60
- data/lib/nexpose/scan_template.rb +17 -17
- data/lib/nexpose/scheduled_backup.rb +8 -8
- data/lib/nexpose/scheduled_maintenance.rb +9 -9
- data/lib/nexpose/shared_credential.rb +30 -33
- data/lib/nexpose/shared_secret.rb +5 -5
- data/lib/nexpose/silo.rb +68 -66
- data/lib/nexpose/silo_profile.rb +47 -50
- data/lib/nexpose/site.rb +101 -123
- data/lib/nexpose/site_credentials.rb +15 -17
- data/lib/nexpose/tag.rb +73 -80
- data/lib/nexpose/ticket.rb +45 -42
- data/lib/nexpose/user.rb +45 -45
- data/lib/nexpose/util.rb +1 -1
- data/lib/nexpose/version.rb +1 -1
- data/lib/nexpose/vuln.rb +45 -43
- data/lib/nexpose/vuln_def.rb +7 -7
- data/lib/nexpose/vuln_exception.rb +35 -36
- data/lib/nexpose/wait.rb +32 -28
- data/lib/nexpose/web_credentials.rb +34 -36
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 89a7f9d4854b3ac3826f56995370a1d38d0514be
|
4
|
+
data.tar.gz: 4b5a6783ca354eae0b694f970963c5eb44cf3de3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2faafc134faf7d0cd56ddf94a1119f6093e078c46164066f54ebafe1f13763be044c2c09930bc8adb7ebb93073c32c928fe09fc9c47042939960f8766675bda7
|
7
|
+
data.tar.gz: 30683f228a157c4c5c34ea74c78b991e69cc6d0ef6749299083c9e2b4e2b92df8dbfb3d8dcc535d31d41a9403ae2b31556009697adaa2378201642a2bddc53f6
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
-
## [
|
4
|
-
|
5
|
-
[Full Changelog](https://github.com/rapid7/nexpose-client/compare/v6.1.1...HEAD)
|
3
|
+
## [v7.0.0](https://github.com/rapid7/nexpose-client/tree/v7.0.0) (2017-08-31)
|
4
|
+
[Full Changelog](https://github.com/rapid7/nexpose-client/compare/v6.1.1...v7.0.0)
|
6
5
|
|
7
6
|
**Fixed bugs:**
|
8
7
|
|
data/Gemfile.lock
CHANGED
data/lib/nexpose/ajax.rb
CHANGED
@@ -15,7 +15,7 @@ module Nexpose
|
|
15
15
|
# Content type strings acceptect by Nexpose.
|
16
16
|
#
|
17
17
|
module CONTENT_TYPE
|
18
|
-
XML
|
18
|
+
XML = 'text/xml; charset=UTF-8'
|
19
19
|
JSON = 'application/json; charset-utf-8'
|
20
20
|
FORM = 'application/x-www-form-urlencoded; charset=UTF-8'
|
21
21
|
end
|
@@ -192,8 +192,8 @@ module Nexpose
|
|
192
192
|
# Get an error message from the response body if the request url api version
|
193
193
|
# is 2.1 or greater otherwise use the request body
|
194
194
|
def get_error_message(request, response)
|
195
|
-
version
|
196
|
-
data_request
|
195
|
+
version = get_request_api_version(request)
|
196
|
+
data_request = use_response_error_message?(request, response)
|
197
197
|
return_response = (version >= 2.1 || data_request)
|
198
198
|
(return_response && response.body) ? "response body: #{response.body}" : "request body: #{request.body}"
|
199
199
|
end
|
@@ -220,12 +220,10 @@ module Nexpose
|
|
220
220
|
# @param [String] pref Preference key value to preserve.
|
221
221
|
#
|
222
222
|
def preserving_preference(nsc, pref)
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
set_rows(nsc, pref, orig)
|
228
|
-
end
|
223
|
+
orig = get_rows(nsc, pref)
|
224
|
+
yield
|
225
|
+
ensure
|
226
|
+
set_rows(nsc, pref, orig)
|
229
227
|
end
|
230
228
|
|
231
229
|
# Get a valid row preference value.
|
@@ -251,10 +249,10 @@ module Nexpose
|
|
251
249
|
end
|
252
250
|
|
253
251
|
def get_rows(nsc, pref)
|
254
|
-
uri
|
252
|
+
uri = '/data/user/preferences/all'
|
255
253
|
pref_key = "#{pref}.rows"
|
256
|
-
resp
|
257
|
-
json
|
254
|
+
resp = get(nsc, uri)
|
255
|
+
json = JSON.parse(resp)
|
258
256
|
if json.key?(pref_key)
|
259
257
|
rows = json[pref_key].to_i
|
260
258
|
rows > 0 ? rows : 10
|
@@ -264,10 +262,8 @@ module Nexpose
|
|
264
262
|
end
|
265
263
|
|
266
264
|
def set_rows(nsc, pref, value)
|
267
|
-
uri
|
268
|
-
params = { 'name'
|
269
|
-
'value' => value }
|
270
|
-
|
265
|
+
uri = '/data/user/preference'
|
266
|
+
params = { 'name' => "#{pref}.rows", 'value' => value }
|
271
267
|
form_post(nsc, uri, params)
|
272
268
|
end
|
273
269
|
|
data/lib/nexpose/alert.rb
CHANGED
@@ -76,7 +76,7 @@ module Nexpose
|
|
76
76
|
|
77
77
|
# load a particular site alert
|
78
78
|
def self.load(nsc, site_id, alert_id)
|
79
|
-
uri
|
79
|
+
uri = "/api/2.1/site_configurations/#{site_id}/alerts/#{alert_id}"
|
80
80
|
resp = AJAX.get(nsc, uri, AJAX::CONTENT_TYPE::JSON)
|
81
81
|
|
82
82
|
unless resp.to_s == ''
|
@@ -92,7 +92,7 @@ module Nexpose
|
|
92
92
|
|
93
93
|
# load a list of alerts for a given site
|
94
94
|
def self.list_alerts(nsc, site_id)
|
95
|
-
uri
|
95
|
+
uri = "/api/2.1/site_configurations/#{site_id}/alerts"
|
96
96
|
resp = AJAX.get(nsc, uri, AJAX::CONTENT_TYPE::JSON)
|
97
97
|
data = JSON.parse(resp, symbolize_names: true)
|
98
98
|
load_alerts(data) unless data.nil?
|
@@ -120,7 +120,7 @@ module Nexpose
|
|
120
120
|
def save(nsc, site_id)
|
121
121
|
validate
|
122
122
|
uri = "/api/2.1/site_configurations/#{site_id}/alerts"
|
123
|
-
id
|
123
|
+
id = AJAX.put(nsc, uri, self.to_json, AJAX::CONTENT_TYPE::JSON)
|
124
124
|
@id = id.to_i
|
125
125
|
end
|
126
126
|
|
@@ -130,12 +130,10 @@ module Nexpose
|
|
130
130
|
raise ArgumentError.new('Vuln filter is a required attribute.') unless @vuln_filter
|
131
131
|
end
|
132
132
|
|
133
|
-
private
|
134
|
-
|
135
133
|
def self.create(hash)
|
136
134
|
alert_type = hash[:alert_type]
|
137
135
|
raise 'An alert must have an alert type' if alert_type.nil?
|
138
|
-
raise 'Alert name cannot be empty.' if !hash.
|
136
|
+
raise 'Alert name cannot be empty.' if !hash.key?(:name) || hash[:name].to_s == ''
|
139
137
|
raise 'SNMP and Syslog alerts must have a server defined' if ['SNMP', 'Syslog'].include?(alert_type) && hash[:server].to_s == ''
|
140
138
|
|
141
139
|
case alert_type
|
@@ -174,22 +172,23 @@ module Nexpose
|
|
174
172
|
attr_accessor :recipients, :sender, :verbose
|
175
173
|
|
176
174
|
def initialize(name, sender, server, recipients, enabled = 1, max_alerts = -1, verbose = 0)
|
177
|
-
unless recipients.is_a?(Array) && recipients.
|
175
|
+
unless recipients.is_a?(Array) && !recipients.empty?
|
178
176
|
raise 'An SMTP alert must contain an array of recipient emails with at least 1 recipient'
|
179
177
|
end
|
180
|
-
|
178
|
+
|
179
|
+
recipients.each do |recipient|
|
181
180
|
unless recipient =~ /^.+@.+\..+$/
|
182
181
|
raise "Recipients must contain valid emails, #{recipient} has an invalid format"
|
183
182
|
end
|
184
183
|
end
|
185
184
|
|
186
185
|
@alert_type = 'SMTP'
|
187
|
-
@name
|
188
|
-
@enabled
|
186
|
+
@name = name
|
187
|
+
@enabled = enabled
|
189
188
|
@max_alerts = max_alerts
|
190
|
-
@sender
|
191
|
-
@server
|
192
|
-
@verbose
|
189
|
+
@sender = sender
|
190
|
+
@server = server
|
191
|
+
@verbose = verbose
|
193
192
|
@recipients = recipients.nil? ? [] : recipients
|
194
193
|
end
|
195
194
|
|
@@ -209,13 +208,12 @@ module Nexpose
|
|
209
208
|
|
210
209
|
def initialize(name, community, server, enabled = 1, max_alerts = -1)
|
211
210
|
raise 'SNMP alerts must have a community defined.' if community.nil?
|
212
|
-
|
213
211
|
@alert_type = 'SNMP'
|
214
|
-
@name
|
215
|
-
@enabled
|
212
|
+
@name = name
|
213
|
+
@enabled = enabled
|
216
214
|
@max_alerts = max_alerts
|
217
|
-
@community
|
218
|
-
@server
|
215
|
+
@community = community
|
216
|
+
@server = server
|
219
217
|
end
|
220
218
|
end
|
221
219
|
|
@@ -225,10 +223,11 @@ module Nexpose
|
|
225
223
|
|
226
224
|
def initialize(name, server, enabled = 1, max_alerts = -1)
|
227
225
|
@alert_type = 'Syslog'
|
228
|
-
@name
|
229
|
-
@enabled
|
226
|
+
@name = name
|
227
|
+
@enabled = enabled
|
230
228
|
@max_alerts = max_alerts
|
231
|
-
@server
|
229
|
+
@server = server
|
232
230
|
end
|
233
231
|
end
|
232
|
+
|
234
233
|
end
|
data/lib/nexpose/api.rb
CHANGED
@@ -22,7 +22,7 @@ module Nexpose
|
|
22
22
|
#
|
23
23
|
def object_from_hash(nsc, hash)
|
24
24
|
hash.each do |k, v|
|
25
|
-
next if k == :url
|
25
|
+
next if k == :url # Do not store self-referential URL.
|
26
26
|
# Store resource URLs separately and create lazy accessors.
|
27
27
|
if v.is_a?(Hash) && v.key?(:url)
|
28
28
|
self.class.send(:define_method, k, proc { |conn = nsc| load_resource(conn, k, v[:url].gsub(/.*\/api/, '/api')) })
|
@@ -52,7 +52,7 @@ module Nexpose
|
|
52
52
|
# @return [Array[?]] Collection of "k" marshalled object.
|
53
53
|
#
|
54
54
|
def load_resource(nsc, k, url)
|
55
|
-
obj
|
55
|
+
obj = class_from_string(k)
|
56
56
|
resp = AJAX.get(nsc, url, AJAX::CONTENT_TYPE::JSON)
|
57
57
|
hash = JSON.parse(resp, symbolize_names: true)
|
58
58
|
if hash.is_a?(Array)
|
@@ -85,7 +85,6 @@ module Nexpose
|
|
85
85
|
|
86
86
|
module TypedAccessor
|
87
87
|
def typed_accessor(name, type)
|
88
|
-
|
89
88
|
# here we dynamically define accessor methods
|
90
89
|
define_method(name) do
|
91
90
|
instance_variable_get("@#{name}")
|
@@ -100,4 +99,5 @@ module Nexpose
|
|
100
99
|
end
|
101
100
|
end
|
102
101
|
end
|
102
|
+
|
103
103
|
end
|
data/lib/nexpose/asset.rb
CHANGED
@@ -42,7 +42,7 @@ module Nexpose
|
|
42
42
|
attr_accessor :unique_identifiers
|
43
43
|
|
44
44
|
def initialize
|
45
|
-
@addresses
|
45
|
+
@addresses = []
|
46
46
|
@host_names = []
|
47
47
|
end
|
48
48
|
|
@@ -53,7 +53,7 @@ module Nexpose
|
|
53
53
|
# @return [Asset] The requested asset, if found.
|
54
54
|
#
|
55
55
|
def self.load(nsc, id)
|
56
|
-
uri
|
56
|
+
uri = "/api/2.1/assets/#{id}"
|
57
57
|
resp = AJAX.get(nsc, uri, AJAX::CONTENT_TYPE::JSON)
|
58
58
|
hash = JSON.parse(resp, symbolize_names: true)
|
59
59
|
new.object_from_hash(nsc, hash)
|
@@ -97,9 +97,9 @@ module Nexpose
|
|
97
97
|
|
98
98
|
def <=>(other)
|
99
99
|
c = port <=> other.port
|
100
|
-
return c unless c
|
100
|
+
return c unless c.zero?
|
101
101
|
c = protocol <=> other.protocol
|
102
|
-
return c unless c
|
102
|
+
return c unless c.zero?
|
103
103
|
name <=> other.name
|
104
104
|
end
|
105
105
|
|
@@ -114,27 +114,27 @@ module Nexpose
|
|
114
114
|
# Valid protocol values for a service endpoint.
|
115
115
|
module Protocol
|
116
116
|
# Internet Protocol
|
117
|
-
IP
|
117
|
+
IP = 'IP'
|
118
118
|
# Internet Control Message Protocol
|
119
119
|
ICMP = 'ICMP'
|
120
120
|
# Internet Group Management Protocol
|
121
121
|
IGMP = 'IGMP'
|
122
122
|
# Gateway-to-Gateway Protocol
|
123
|
-
GGP
|
123
|
+
GGP = 'GGP'
|
124
124
|
# Transmission Control Protocol
|
125
|
-
TCP
|
125
|
+
TCP = 'TCP'
|
126
126
|
# PARC Universal Protocol
|
127
|
-
PUP
|
127
|
+
PUP = 'PUP'
|
128
128
|
# User Datagram Protocol
|
129
|
-
UDP
|
129
|
+
UDP = 'UDP'
|
130
130
|
# Internet Datagram Protocol
|
131
|
-
IDP
|
131
|
+
IDP = 'IDP'
|
132
132
|
# Encapsulating Security Payload
|
133
|
-
ESP
|
133
|
+
ESP = 'ESP'
|
134
134
|
# Network Disk Protocol
|
135
|
-
ND
|
135
|
+
ND = 'ND'
|
136
136
|
# Raw Packet (or unknown)
|
137
|
-
RAW
|
137
|
+
RAW = 'RAW'
|
138
138
|
end
|
139
139
|
end
|
140
140
|
|
@@ -163,11 +163,11 @@ module Nexpose
|
|
163
163
|
|
164
164
|
def <=>(other)
|
165
165
|
c = name <=> other.name
|
166
|
-
return c unless c
|
166
|
+
return c unless c.zero?
|
167
167
|
c = id <=> other.id
|
168
|
-
return c unless c
|
168
|
+
return c unless c.zero?
|
169
169
|
c = full_name <=> other.full_name
|
170
|
-
return c unless c
|
170
|
+
return c unless c.zero?
|
171
171
|
attributes <=> other.attributes
|
172
172
|
end
|
173
173
|
|
@@ -204,9 +204,9 @@ module Nexpose
|
|
204
204
|
|
205
205
|
def <=>(other)
|
206
206
|
c = name <=> other.name
|
207
|
-
return c unless c
|
207
|
+
return c unless c.zero?
|
208
208
|
c = id <=> other.id
|
209
|
-
return c unless c
|
209
|
+
return c unless c.zero?
|
210
210
|
attributes <=> other.attributes
|
211
211
|
end
|
212
212
|
|
@@ -248,11 +248,11 @@ module Nexpose
|
|
248
248
|
|
249
249
|
def <=>(other)
|
250
250
|
c = name <=> other.name
|
251
|
-
return c unless c
|
251
|
+
return c unless c.zero?
|
252
252
|
c = size <=> other.size
|
253
|
-
return c unless c
|
253
|
+
return c unless c.zero?
|
254
254
|
c = directory <=> other.directory
|
255
|
-
return c unless c
|
255
|
+
return c unless c.zero?
|
256
256
|
attributes <=> other.attributes
|
257
257
|
end
|
258
258
|
|
@@ -274,7 +274,7 @@ module Nexpose
|
|
274
274
|
attr_reader :id
|
275
275
|
|
276
276
|
def initialize(source = nil, id = nil)
|
277
|
-
@id
|
277
|
+
@id = id
|
278
278
|
@source = source
|
279
279
|
end
|
280
280
|
|
@@ -285,7 +285,7 @@ module Nexpose
|
|
285
285
|
|
286
286
|
def <=>(other)
|
287
287
|
c = source <=> other.source
|
288
|
-
return c unless c
|
288
|
+
return c unless c.zero?
|
289
289
|
id <=> other.id
|
290
290
|
end
|
291
291
|
|
data/lib/nexpose/blackout.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Nexpose
|
2
|
-
# Constants useful across the Nexpose module.
|
3
|
-
# Configuration structure for blackouts.
|
2
|
+
# Constants useful across the Nexpose module.
|
3
|
+
# Configuration structure for blackouts.
|
4
4
|
class Blackout < APIObject
|
5
5
|
# Whether or not this blackout is enabled.
|
6
6
|
attr_accessor :enabled
|
@@ -14,7 +14,7 @@ module Nexpose
|
|
14
14
|
# The amount of time, in minutes, a blackout period should last.
|
15
15
|
attr_accessor :blackout_duration
|
16
16
|
|
17
|
-
def initialize(start, enabled=true, duration, type, interval)
|
17
|
+
def initialize(start, enabled = true, duration, type, interval)
|
18
18
|
@blackout_start = start
|
19
19
|
@enabled = enabled
|
20
20
|
@blackout_duration = duration.to_i
|
@@ -24,7 +24,6 @@ module Nexpose
|
|
24
24
|
|
25
25
|
def self.from_hash(hash)
|
26
26
|
repeat_blackout_hash = hash[:repeat_blackout]
|
27
|
-
|
28
27
|
if repeat_blackout_hash.nil?
|
29
28
|
type = 'daily'
|
30
29
|
interval = 0
|
@@ -32,22 +31,15 @@ module Nexpose
|
|
32
31
|
type = repeat_blackout_hash[:type]
|
33
32
|
interval = repeat_blackout_hash[:interval]
|
34
33
|
end
|
35
|
-
|
36
34
|
new(hash[:start_date], hash[:enabled], hash[:blackout_duration], type, interval)
|
37
35
|
end
|
38
36
|
|
39
37
|
def to_h
|
40
|
-
blackout_hash = {
|
41
|
-
|
42
|
-
enabled: @enabled,
|
43
|
-
blackout_duration: @blackout_duration,
|
44
|
-
}
|
45
|
-
repeat_hash= {
|
46
|
-
type: @blackout_type,
|
47
|
-
interval: @blackout_interval
|
48
|
-
}
|
38
|
+
blackout_hash = { start_date: @blackout_start, enabled: @enabled, blackout_duration: @blackout_duration }
|
39
|
+
repeat_hash = { type: @blackout_type, interval: @blackout_interval }
|
49
40
|
blackout_hash[:repeat_blackout] = repeat_hash
|
50
41
|
blackout_hash
|
51
42
|
end
|
52
43
|
end
|
44
|
+
|
53
45
|
end
|
data/lib/nexpose/common.rb
CHANGED
@@ -2,7 +2,7 @@ module Nexpose
|
|
2
2
|
# Constants useful across the Nexpose module.
|
3
3
|
module Scope
|
4
4
|
GLOBAL = 'global'
|
5
|
-
SILO
|
5
|
+
SILO = 'silo'
|
6
6
|
end
|
7
7
|
|
8
8
|
# Configuration structure for e-mail notification.
|
@@ -49,11 +49,10 @@ module Nexpose
|
|
49
49
|
|
50
50
|
def initialize(to_all_authorized, send_to_owner_as, send_to_acl_as, send_as)
|
51
51
|
@to_all_authorized = to_all_authorized
|
52
|
-
@send_to_owner_as
|
53
|
-
@send_to_acl_as
|
54
|
-
@send_as
|
55
|
-
|
56
|
-
@recipients = []
|
52
|
+
@send_to_owner_as = send_to_owner_as
|
53
|
+
@send_to_acl_as = send_to_acl_as
|
54
|
+
@send_as = send_as
|
55
|
+
@recipients = []
|
57
56
|
end
|
58
57
|
|
59
58
|
def to_xml
|
@@ -116,9 +115,9 @@ module Nexpose
|
|
116
115
|
|
117
116
|
def as_xml
|
118
117
|
xml = REXML::Element.new('AdHocSchedule')
|
119
|
-
xml.attributes['start']
|
118
|
+
xml.attributes['start'] = @start
|
120
119
|
xml.attributes['maxDuration'] = @max_duration if @max_duration
|
121
|
-
xml.attributes['template']
|
120
|
+
xml.attributes['template'] = @scan_template_id
|
122
121
|
xml
|
123
122
|
end
|
124
123
|
|
@@ -170,10 +169,10 @@ module Nexpose
|
|
170
169
|
|
171
170
|
# @param [Time] start
|
172
171
|
def initialize(type, interval, start, enabled = true, scan_template_id = nil)
|
173
|
-
@type
|
174
|
-
@interval
|
175
|
-
@start
|
176
|
-
@enabled
|
172
|
+
@type = type
|
173
|
+
@interval = interval
|
174
|
+
@start = start
|
175
|
+
@enabled = enabled
|
177
176
|
@scan_template_id = scan_template_id
|
178
177
|
end
|
179
178
|
|
@@ -186,29 +185,28 @@ module Nexpose
|
|
186
185
|
else
|
187
186
|
schedule = new(repeat_scan_hash[:type], repeat_scan_hash[:interval], start)
|
188
187
|
end
|
189
|
-
schedule.enabled
|
188
|
+
schedule.enabled = hash[:enabled].nil? ? true : hash[:enabled]
|
190
189
|
schedule.scan_template_id = hash[:scan_template_id]
|
191
|
-
schedule.start
|
192
|
-
schedule.max_duration
|
193
|
-
schedule.not_valid_after
|
194
|
-
schedule.timezone
|
195
|
-
schedule.next_run_time
|
196
|
-
schedule.console_start
|
190
|
+
schedule.start = Nexpose::ISO8601.to_time(hash[:start_date]) if hash[:start_date]
|
191
|
+
schedule.max_duration = hash[:maximum_scan_duration] if hash[:maximum_scan_duration]
|
192
|
+
schedule.not_valid_after = Nexpose::ISO8601.to_time(hash[:not_valid_after_date]) if hash[:not_valid_after_date]
|
193
|
+
schedule.timezone = hash[:time_zone] if hash[:time_zone]
|
194
|
+
schedule.next_run_time = hash[:next_run_time] if hash[:next_run_time]
|
195
|
+
schedule.console_start = Nexpose::ISO8601.to_time(hash[:console_start_date]) if hash[:console_start_date]
|
197
196
|
schedule.console_timezone = hash[:console_time_zone] if hash[:console_time_zone]
|
198
197
|
|
199
198
|
unless repeat_scan_hash.nil?
|
200
|
-
schedule.type
|
201
|
-
schedule.interval
|
199
|
+
schedule.type = repeat_scan_hash[:type]
|
200
|
+
schedule.interval = repeat_scan_hash[:interval]
|
202
201
|
schedule.repeater_type = 'restart' if repeat_scan_hash[:on_repeat] == 'restart-scan'
|
203
202
|
schedule.repeater_type = 'continue' if repeat_scan_hash[:on_repeat] == 'resume-scan'
|
204
|
-
|
205
|
-
schedule.
|
206
|
-
schedule.
|
207
|
-
schedule.
|
208
|
-
schedule.
|
209
|
-
schedule.
|
210
|
-
schedule.
|
211
|
-
schedule.start_month = repeat_scan_hash[:start_month] if repeat_scan_hash[:start_month]
|
203
|
+
schedule.is_extended = repeat_scan_hash[:is_extended] if repeat_scan_hash[:is_extended]
|
204
|
+
schedule.hour = repeat_scan_hash[:hour] if repeat_scan_hash[:hour]
|
205
|
+
schedule.minute = repeat_scan_hash[:minute] if repeat_scan_hash[:minute]
|
206
|
+
schedule.date = repeat_scan_hash[:date] if repeat_scan_hash[:date]
|
207
|
+
schedule.day = repeat_scan_hash[:day] if repeat_scan_hash[:day]
|
208
|
+
schedule.occurrence = repeat_scan_hash[:occurrence] if repeat_scan_hash[:occurrence]
|
209
|
+
schedule.start_month = repeat_scan_hash[:start_month] if repeat_scan_hash[:start_month]
|
212
210
|
end
|
213
211
|
|
214
212
|
schedule
|
@@ -220,28 +218,26 @@ module Nexpose
|
|
220
218
|
scan_template_id: @scan_template_id,
|
221
219
|
maximum_scan_duration: @max_duration
|
222
220
|
}
|
223
|
-
schedule_hash[:start_date]
|
221
|
+
schedule_hash[:start_date] = Nexpose::ISO8601.to_string(@start) if @start
|
224
222
|
schedule_hash[:not_valid_after_date] = Nexpose::ISO8601.to_string(@not_valid_after) if @not_valid_after
|
225
|
-
schedule_hash[:time_zone]
|
223
|
+
schedule_hash[:time_zone] = @timezone if @timezone
|
226
224
|
|
227
|
-
unless (@type.nil? || @interval
|
225
|
+
unless (@type.nil? || @interval.to_i.zero?) && !@is_extended
|
228
226
|
repeat_scan_hash = {
|
229
227
|
type: @type,
|
230
228
|
interval: @interval
|
231
229
|
}
|
232
230
|
repeat_scan_hash[:on_repeat] = 'restart-scan' if @repeater_type == 'restart'
|
233
231
|
repeat_scan_hash[:on_repeat] = 'resume-scan' if @repeater_type == 'continue'
|
234
|
-
|
235
232
|
if @is_extended
|
236
233
|
repeat_scan_hash[:is_extended] = @is_extended
|
237
|
-
repeat_scan_hash[:hour]
|
238
|
-
repeat_scan_hash[:minute]
|
239
|
-
repeat_scan_hash[:date]
|
240
|
-
repeat_scan_hash[:day]
|
241
|
-
repeat_scan_hash[:occurrence]
|
234
|
+
repeat_scan_hash[:hour] = @hour if @hour
|
235
|
+
repeat_scan_hash[:minute] = @minute if @minute
|
236
|
+
repeat_scan_hash[:date] = @date if @date
|
237
|
+
repeat_scan_hash[:day] = @day if @day
|
238
|
+
repeat_scan_hash[:occurrence] = @occurrence if @occurrence
|
242
239
|
repeat_scan_hash[:start_month] = @start_month if @start_month
|
243
240
|
end
|
244
|
-
|
245
241
|
schedule_hash[:repeat_scan] = repeat_scan_hash
|
246
242
|
end
|
247
243
|
|
@@ -250,22 +246,22 @@ module Nexpose
|
|
250
246
|
|
251
247
|
def as_xml
|
252
248
|
xml = REXML::Element.new('Schedule')
|
253
|
-
xml.attributes['enabled']
|
254
|
-
xml.attributes['type']
|
255
|
-
xml.attributes['interval']
|
256
|
-
xml.attributes['start']
|
257
|
-
xml.attributes['maxDuration']
|
249
|
+
xml.attributes['enabled'] = @enabled ? 1 : 0
|
250
|
+
xml.attributes['type'] = @type
|
251
|
+
xml.attributes['interval'] = @interval
|
252
|
+
xml.attributes['start'] = @start if @start
|
253
|
+
xml.attributes['maxDuration'] = @max_duration if @max_duration
|
258
254
|
xml.attributes['notValidAfter'] = @not_valid_after if @not_valid_after
|
259
|
-
xml.attributes['repeaterType']
|
260
|
-
xml.attributes['is_extended']
|
261
|
-
xml.attributes['hour']
|
262
|
-
xml.attributes['minute']
|
263
|
-
xml.attributes['date']
|
264
|
-
xml.attributes['day']
|
265
|
-
xml.attributes['occurrence']
|
266
|
-
xml.attributes['start_month']
|
267
|
-
xml.attributes['timezone']
|
268
|
-
xml.attributes['template']
|
255
|
+
xml.attributes['repeaterType'] = @repeater_type if @repeater_type
|
256
|
+
xml.attributes['is_extended'] = @is_extended if @is_extended
|
257
|
+
xml.attributes['hour'] = @hour if @hour
|
258
|
+
xml.attributes['minute'] = @minute if @minute
|
259
|
+
xml.attributes['date'] = @date if @date
|
260
|
+
xml.attributes['day'] = @day if @day
|
261
|
+
xml.attributes['occurrence'] = @occurrence if @occurrence
|
262
|
+
xml.attributes['start_month'] = @start_month if @start_month
|
263
|
+
xml.attributes['timezone'] = @timezone if @timezone
|
264
|
+
xml.attributes['template'] = @scan_template_id if @scan_template_id
|
269
265
|
xml
|
270
266
|
end
|
271
267
|
|
@@ -280,18 +276,18 @@ module Nexpose
|
|
280
276
|
xml.attributes['enabled'] != '0')
|
281
277
|
|
282
278
|
# Optional parameters.
|
283
|
-
schedule.max_duration
|
284
|
-
schedule.not_valid_after
|
285
|
-
schedule.repeater_type
|
286
|
-
schedule.is_extended
|
287
|
-
schedule.hour
|
288
|
-
schedule.minute
|
289
|
-
schedule.date
|
290
|
-
schedule.day
|
291
|
-
schedule.occurrence
|
292
|
-
schedule.start_month
|
293
|
-
schedule.timezone
|
294
|
-
schedule.next_run_time
|
279
|
+
schedule.max_duration = xml.attributes['maxDuration'].to_i if xml.attributes['maxDuration']
|
280
|
+
schedule.not_valid_after = xml.attributes['notValidAfter'] if xml.attributes['notValidAfter']
|
281
|
+
schedule.repeater_type = xml.attributes['repeaterType'] if xml.attributes['repeaterType']
|
282
|
+
schedule.is_extended = xml.attributes['is_extended'] if xml.attributes['is_extended']
|
283
|
+
schedule.hour = xml.attributes['hour'] if xml.attributes['hour']
|
284
|
+
schedule.minute = xml.attributes['minute'] if xml.attributes['minute']
|
285
|
+
schedule.date = xml.attributes['date'] if xml.attributes['date']
|
286
|
+
schedule.day = xml.attributes['day'] if xml.attributes['day']
|
287
|
+
schedule.occurrence = xml.attributes['occurrence'] if xml.attributes['occurrence']
|
288
|
+
schedule.start_month = xml.attributes['start_month'] if xml.attributes['start_month']
|
289
|
+
schedule.timezone = xml.attributes['timezone'] if xml.attributes['timezone']
|
290
|
+
schedule.next_run_time = xml.attributes['next_run_time'] if xml.attributes['next_run_time']
|
295
291
|
schedule.scan_template_id = xml.attributes['template'] if xml.attributes['template']
|
296
292
|
schedule
|
297
293
|
end
|
@@ -300,11 +296,11 @@ module Nexpose
|
|
300
296
|
# may be used to create a Schedule.
|
301
297
|
#
|
302
298
|
module Type
|
303
|
-
DAILY
|
304
|
-
HOURLY
|
305
|
-
WEEKLY
|
299
|
+
DAILY = 'daily'
|
300
|
+
HOURLY = 'hourly'
|
301
|
+
WEEKLY = 'weekly'
|
306
302
|
MONTHLY_DATE = 'monthly-date'
|
307
|
-
MONTHLY_DAY
|
303
|
+
MONTHLY_DAY = 'monthly-day'
|
308
304
|
end
|
309
305
|
end
|
310
306
|
|
@@ -337,40 +333,39 @@ module Nexpose
|
|
337
333
|
state: state,
|
338
334
|
city: city,
|
339
335
|
zip: zip,
|
340
|
-
country: country
|
341
|
-
}
|
336
|
+
country: country }
|
342
337
|
end
|
343
338
|
|
344
339
|
# Create organization object from hash
|
345
340
|
def self.create(hash)
|
346
341
|
new do |org|
|
347
|
-
org.name
|
348
|
-
org.url
|
342
|
+
org.name = hash[:name]
|
343
|
+
org.url = hash[:url]
|
349
344
|
org.primary_contact = hash[:primary_contact]
|
350
|
-
org.job_title
|
351
|
-
org.email
|
352
|
-
org.telephone
|
353
|
-
org.address
|
354
|
-
org.state
|
355
|
-
org.city
|
356
|
-
org.zip
|
357
|
-
org.country
|
345
|
+
org.job_title = hash[:job_title]
|
346
|
+
org.email = hash[:email]
|
347
|
+
org.telephone = hash[:telephone]
|
348
|
+
org.address = hash[:address]
|
349
|
+
org.state = hash[:state]
|
350
|
+
org.city = hash[:city]
|
351
|
+
org.zip = hash[:zip]
|
352
|
+
org.country = hash[:country]
|
358
353
|
end
|
359
354
|
end
|
360
355
|
|
361
356
|
def self.parse(xml)
|
362
357
|
new do |org|
|
363
|
-
org.name
|
364
|
-
org.url
|
358
|
+
org.name = xml.attributes['name']
|
359
|
+
org.url = xml.attributes['url']
|
365
360
|
org.primary_contact = xml.attributes['primaryContact']
|
366
|
-
org.job_title
|
367
|
-
org.email
|
368
|
-
org.telephone
|
369
|
-
org.address
|
370
|
-
org.state
|
371
|
-
org.city
|
372
|
-
org.zip
|
373
|
-
org.country
|
361
|
+
org.job_title = xml.attributes['jobTitle']
|
362
|
+
org.email = xml.attributes['email']
|
363
|
+
org.telephone = xml.attributes['telephone']
|
364
|
+
org.address = xml.attributes['businessAddress']
|
365
|
+
org.state = xml.attributes['state']
|
366
|
+
org.city = xml.attributes['city']
|
367
|
+
org.zip = xml.attributes['zip']
|
368
|
+
org.country = xml.attributes['country']
|
374
369
|
end
|
375
370
|
end
|
376
371
|
|