ruby-jss 1.3.2 → 1.5.3
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/CHANGES.md +122 -0
- data/lib/jamf.rb +18 -16
- data/lib/jamf/api/base_classes/collection_resource.rb +613 -0
- data/lib/jamf/api/{abstract_classes → base_classes}/json_object.rb +109 -101
- data/lib/jamf/api/{abstract_classes → base_classes}/prestage.rb +55 -30
- data/lib/jamf/api/{abstract_classes → base_classes}/resource.rb +10 -6
- data/lib/jamf/api/{abstract_classes → base_classes}/singleton_resource.rb +4 -3
- data/lib/jamf/api/connection.rb +13 -9
- data/lib/jamf/api/connection/api_error.rb +8 -8
- data/lib/jamf/api/connection/token.rb +36 -15
- data/lib/jamf/api/json_objects/device_enrollment_device.rb +14 -7
- data/lib/jamf/api/json_objects/{location.rb → device_enrollment_device_sync_state.rb} +27 -41
- data/lib/jamf/api/json_objects/device_enrollment_sync_status.rb +1 -1
- data/lib/jamf/api/json_objects/{attachment.rb → locale.rb} +14 -23
- data/lib/jamf/api/json_objects/md_prestage_name.rb +1 -1
- data/lib/jamf/api/json_objects/md_prestage_names.rb +2 -2
- data/lib/jamf/api/json_objects/md_prestage_skip_setup_items.rb +50 -1
- data/lib/jamf/api/json_objects/prestage_assignment.rb +2 -2
- data/lib/jamf/api/json_objects/prestage_location.rb +3 -3
- data/lib/jamf/api/json_objects/prestage_purchasing_data.rb +7 -7
- data/lib/jamf/api/json_objects/prestage_scope.rb +1 -1
- data/lib/jamf/api/{resources/collection_resources → json_objects}/time_zone.rb +9 -23
- data/lib/jamf/api/mixins/{abstract.rb → base_class.rb} +34 -16
- data/lib/jamf/api/mixins/bulk_deletable.rb +27 -6
- data/lib/jamf/api/mixins/change_log.rb +201 -51
- data/lib/jamf/api/{resources/collection_resources/computer.rb → mixins/filterable.rb} +19 -17
- data/lib/jamf/api/mixins/pageable.rb +208 -0
- data/lib/jamf/api/{json_objects/installed_application.rb → mixins/sortable.rb} +33 -33
- data/lib/jamf/api/resources/collection_resources/building.rb +16 -9
- data/lib/jamf/api/resources/collection_resources/category.rb +5 -4
- data/lib/jamf/api/resources/collection_resources/computer_prestage.rb +12 -5
- data/lib/jamf/api/resources/collection_resources/department.rb +1 -3
- data/lib/jamf/api/resources/collection_resources/device_enrollment.rb +13 -13
- data/lib/jamf/api/resources/collection_resources/inventory_preload_record.rb +11 -3
- data/lib/jamf/api/resources/collection_resources/mobile_device_prestage.rb +25 -23
- data/lib/jamf/api/resources/collection_resources/script.rb +61 -25
- data/lib/jamf/api/resources/singleton_resources/app_store_country_codes.rb +15 -5
- data/lib/jamf/api/resources/singleton_resources/locales.rb +155 -0
- data/lib/jamf/api/resources/singleton_resources/time_zones.rb +213 -0
- data/lib/jamf/validate.rb +63 -24
- data/lib/jamf/version.rb +1 -1
- data/lib/jss.rb +2 -1
- data/lib/jss/api_connection.rb +113 -406
- data/lib/jss/api_object.rb +10 -20
- data/lib/jss/api_object/advanced_search.rb +27 -26
- data/lib/jss/api_object/app_store_country_codes.rb +298 -0
- data/lib/jss/api_object/categorizable.rb +1 -1
- data/lib/jss/api_object/computer.rb +13 -0
- data/lib/jss/api_object/configuration_profile.rb +60 -4
- data/lib/jss/api_object/directory_binding_type.rb +66 -60
- data/lib/jss/api_object/directory_binding_type/active_directory.rb +71 -34
- data/lib/jss/api_object/directory_binding_type/admitmac.rb +536 -467
- data/lib/jss/api_object/directory_binding_type/centrify.rb +21 -7
- data/lib/jss/api_object/directory_binding_type/open_directory.rb +4 -4
- data/lib/jss/api_object/distribution_point.rb +2 -2
- data/lib/jss/api_object/dock_item.rb +102 -96
- data/lib/jss/api_object/ebook.rb +1 -2
- data/lib/jss/api_object/extendable.rb +1 -1
- data/lib/jss/api_object/extension_attribute.rb +4 -3
- data/lib/jss/api_object/group.rb +33 -2
- data/lib/jss/api_object/mac_application.rb +107 -8
- data/lib/jss/api_object/network_segment.rb +43 -12
- data/lib/jss/api_object/package.rb +1 -1
- data/lib/jss/api_object/patch_source.rb +10 -9
- data/lib/jss/api_object/policy.rb +217 -28
- data/lib/jss/api_object/printer.rb +10 -4
- data/lib/jss/api_object/scopable.rb +10 -15
- data/lib/jss/api_object/scopable/scope.rb +389 -73
- data/lib/jss/api_object/self_servable.rb +17 -9
- data/lib/jss/api_object/uploadable.rb +1 -1
- data/lib/jss/api_object/user.rb +42 -1
- data/lib/jss/api_object/vpp_account.rb +209 -0
- data/lib/jss/api_object/vppable.rb +169 -13
- data/lib/jss/exceptions.rb +3 -0
- data/lib/jss/server.rb +15 -0
- data/lib/jss/utility.rb +142 -37
- data/lib/jss/validate.rb +53 -10
- data/lib/jss/version.rb +1 -1
- metadata +45 -61
- data/lib/jamf/api/abstract_classes/advanced_search.rb +0 -86
- data/lib/jamf/api/abstract_classes/collection_resource.rb +0 -433
- data/lib/jamf/api/abstract_classes/generic_reference.rb +0 -145
- data/lib/jamf/api/abstract_classes/prestage_skip_setup_items.rb +0 -126
- data/lib/jamf/api/json_objects/account_prefs.rb +0 -79
- data/lib/jamf/api/json_objects/android_details.rb +0 -139
- data/lib/jamf/api/json_objects/appletv_details.rb +0 -110
- data/lib/jamf/api/json_objects/cellular_network.rb +0 -151
- data/lib/jamf/api/json_objects/computer_prestage_skip_setup_items.rb +0 -67
- data/lib/jamf/api/json_objects/criterion.rb +0 -152
- data/lib/jamf/api/json_objects/extension_attribute_value.rb +0 -128
- data/lib/jamf/api/json_objects/installed_certificate.rb +0 -53
- data/lib/jamf/api/json_objects/installed_configuration_profile.rb +0 -67
- data/lib/jamf/api/json_objects/installed_ebook.rb +0 -58
- data/lib/jamf/api/json_objects/installed_provisioning_profile.rb +0 -59
- data/lib/jamf/api/json_objects/ios_details.rb +0 -244
- data/lib/jamf/api/json_objects/mobile_device_details.rb +0 -219
- data/lib/jamf/api/json_objects/mobile_device_security.rb +0 -101
- data/lib/jamf/api/json_objects/purchasing_data.rb +0 -125
- data/lib/jamf/api/mixins/locatable.rb +0 -124
- data/lib/jamf/api/mixins/referable.rb +0 -92
- data/lib/jamf/api/resources/collection_resources/account.rb +0 -163
- data/lib/jamf/api/resources/collection_resources/advanced_mobile_device_search.rb +0 -52
- data/lib/jamf/api/resources/collection_resources/advanced_user_search.rb +0 -52
- data/lib/jamf/api/resources/collection_resources/extension_attribute.rb +0 -45
- data/lib/jamf/api/resources/collection_resources/mobile_device.rb +0 -315
- data/lib/jamf/api/resources/collection_resources/site.rb +0 -77
- data/lib/jamf/api/resources/singleton_resources/authorization.rb +0 -88
- data/lib/jamf/api/resources/singleton_resources/client_checkin_settings.rb +0 -139
- data/lib/jamf/api/resources/singleton_resources/reenrollment_settings.rb +0 -95
|
@@ -459,9 +459,17 @@ module JSS
|
|
|
459
459
|
### @return [void]
|
|
460
460
|
###
|
|
461
461
|
def building=(newval)
|
|
462
|
-
new =
|
|
463
|
-
|
|
464
|
-
|
|
462
|
+
new =
|
|
463
|
+
if newval.to_s.empty?
|
|
464
|
+
JSS::BLANK
|
|
465
|
+
else
|
|
466
|
+
id = JSS::Building.valid_id newval
|
|
467
|
+
raise JSS::MissingDataError, "No building matching '#{newval}'" unless id
|
|
468
|
+
|
|
469
|
+
JSS::Building.map_all_ids_to(:name)[id]
|
|
470
|
+
end
|
|
471
|
+
|
|
472
|
+
@building = new
|
|
465
473
|
@need_to_update = true
|
|
466
474
|
end
|
|
467
475
|
|
|
@@ -484,9 +492,16 @@ module JSS
|
|
|
484
492
|
### @return [void]
|
|
485
493
|
###
|
|
486
494
|
def department=(newval)
|
|
487
|
-
new =
|
|
488
|
-
|
|
489
|
-
|
|
495
|
+
new =
|
|
496
|
+
if newval.to_s.empty?
|
|
497
|
+
JSS::BLANK
|
|
498
|
+
else
|
|
499
|
+
id = JSS::Department.valid_id newval
|
|
500
|
+
raise JSS::MissingDataError , "No department matching '#{newval}' in the JSS" unless id
|
|
501
|
+
|
|
502
|
+
JSS::Department.map_all_ids_to(:name)[id]
|
|
503
|
+
end
|
|
504
|
+
@department = new
|
|
490
505
|
@need_to_update = true
|
|
491
506
|
end
|
|
492
507
|
|
|
@@ -531,9 +546,17 @@ module JSS
|
|
|
531
546
|
### @return [void]
|
|
532
547
|
###
|
|
533
548
|
def netboot_server=(newval)
|
|
534
|
-
new =
|
|
535
|
-
|
|
536
|
-
|
|
549
|
+
new =
|
|
550
|
+
if newval.to_s.empty?
|
|
551
|
+
JSS::BLANK
|
|
552
|
+
else
|
|
553
|
+
id = JSS::NetBootServer.valid_id newval
|
|
554
|
+
raise JSS::MissingDataError, "No netboot_server matching '#{newval}' in the JSS" unless id
|
|
555
|
+
|
|
556
|
+
JSS::NetbootServer.map_all_ids_to(:name)[id]
|
|
557
|
+
end
|
|
558
|
+
|
|
559
|
+
@netboot_server = new
|
|
537
560
|
@need_to_update = true
|
|
538
561
|
end
|
|
539
562
|
|
|
@@ -544,9 +567,17 @@ module JSS
|
|
|
544
567
|
### @return [void]
|
|
545
568
|
###
|
|
546
569
|
def swu_server=(newval)
|
|
547
|
-
new =
|
|
548
|
-
|
|
549
|
-
|
|
570
|
+
new =
|
|
571
|
+
if newval.to_s.empty?
|
|
572
|
+
JSS::BLANK
|
|
573
|
+
else
|
|
574
|
+
id = JSS::SoftwareUpdateServer.valid_id newval
|
|
575
|
+
raise JSS::MissingDataError, "No swu_server matching '#{newval}' in the JSS" unless id
|
|
576
|
+
|
|
577
|
+
JSS::SoftwareUpdateServer.map_all_ids_to(:name)[id]
|
|
578
|
+
end
|
|
579
|
+
|
|
580
|
+
@swu_server = new
|
|
550
581
|
@need_to_update = true
|
|
551
582
|
end
|
|
552
583
|
|
|
@@ -65,7 +65,7 @@ module JSS
|
|
|
65
65
|
DIST_POINT_PKGS_FOLDER = 'Packages'.freeze
|
|
66
66
|
|
|
67
67
|
# The possible values for cpu_type (required_processor) in a JSS package
|
|
68
|
-
CPU_TYPES = %w[None
|
|
68
|
+
CPU_TYPES = %w[None x86 ppc].freeze
|
|
69
69
|
|
|
70
70
|
# the possible priorities
|
|
71
71
|
PRIORITIES = (1..20)
|
|
@@ -120,30 +120,31 @@ module JSS
|
|
|
120
120
|
|
|
121
121
|
# Fetch either an internal or external patch source
|
|
122
122
|
#
|
|
123
|
-
# BUG: there's an API bug: fetching a non-existent
|
|
123
|
+
# BUG: there's an API bug: fetching a non-existent
|
|
124
124
|
# which is why we rescue internal server errors.
|
|
125
125
|
#
|
|
126
126
|
# @see APIObject.fetch
|
|
127
127
|
#
|
|
128
|
-
def self.fetch(
|
|
128
|
+
def self.fetch(searchterm = nil, **args)
|
|
129
129
|
if self == JSS::PatchSource
|
|
130
130
|
begin
|
|
131
|
-
fetched = JSS::PatchInternalSource.fetch
|
|
132
|
-
rescue
|
|
131
|
+
fetched = JSS::PatchInternalSource.fetch searchterm, **args
|
|
132
|
+
rescue
|
|
133
133
|
fetched = nil
|
|
134
134
|
end
|
|
135
135
|
unless fetched
|
|
136
136
|
begin
|
|
137
|
-
fetched = JSS::PatchExternalSource.fetch
|
|
138
|
-
rescue
|
|
137
|
+
fetched = JSS::PatchExternalSource.fetch searchterm, **args
|
|
138
|
+
rescue
|
|
139
139
|
raise JSS::NoSuchItemError, 'No matching PatchSource found'
|
|
140
140
|
end
|
|
141
141
|
end
|
|
142
142
|
return fetched
|
|
143
143
|
end # if self == JSS::PatchSource
|
|
144
|
+
|
|
144
145
|
begin
|
|
145
|
-
super
|
|
146
|
-
rescue
|
|
146
|
+
super searchterm, **args
|
|
147
|
+
rescue JSS::NoSuchItemError
|
|
147
148
|
raise JSS::NoSuchItemError, "No matching #{self::RSRC_OBJECT_KEY} found"
|
|
148
149
|
end
|
|
149
150
|
end
|
|
@@ -211,7 +212,7 @@ module JSS
|
|
|
211
212
|
begin
|
|
212
213
|
# TODO: remove this and adjust parsing when jamf fixes the JSON
|
|
213
214
|
raw = JSS::XMLWorkaround.data_via_xml(rsrc, AVAILABLE_TITLES_DATA_MAP, api)
|
|
214
|
-
rescue
|
|
215
|
+
rescue JSS::NoSuchItemError
|
|
215
216
|
return []
|
|
216
217
|
end
|
|
217
218
|
|
|
@@ -148,6 +148,12 @@ module JSS
|
|
|
148
148
|
monthly: 'Once every month'
|
|
149
149
|
}.freeze
|
|
150
150
|
|
|
151
|
+
RETRY_EVENTS = {
|
|
152
|
+
none: 'none',
|
|
153
|
+
checkin: 'check-in',
|
|
154
|
+
trigger: 'trigger'
|
|
155
|
+
}.freeze
|
|
156
|
+
|
|
151
157
|
RESTART_WHEN = {
|
|
152
158
|
if_pkg_requires: 'Restart if a package or update requires it',
|
|
153
159
|
now: 'Restart immediately',
|
|
@@ -257,14 +263,14 @@ module JSS
|
|
|
257
263
|
}.freeze
|
|
258
264
|
|
|
259
265
|
LOG_FLUSH_INTERVAL_PERIODS = {
|
|
260
|
-
day: '
|
|
261
|
-
days: '
|
|
262
|
-
week: '
|
|
263
|
-
weeks: '
|
|
264
|
-
month: '
|
|
265
|
-
months: '
|
|
266
|
-
year: '
|
|
267
|
-
years: '
|
|
266
|
+
day: 'Days',
|
|
267
|
+
days: 'Days',
|
|
268
|
+
week: 'Weeks',
|
|
269
|
+
weeks: 'Weeks',
|
|
270
|
+
month: 'Months',
|
|
271
|
+
months: 'Months',
|
|
272
|
+
year: 'Years',
|
|
273
|
+
years: 'Years'
|
|
268
274
|
}.freeze
|
|
269
275
|
|
|
270
276
|
# the object type for this object in
|
|
@@ -281,6 +287,83 @@ module JSS
|
|
|
281
287
|
# How is the category stored in the API data?
|
|
282
288
|
CATEGORY_DATA_TYPE = Hash
|
|
283
289
|
|
|
290
|
+
# Class Methods
|
|
291
|
+
######################
|
|
292
|
+
|
|
293
|
+
# Flush logs for a given policy older than some number of days, weeks,
|
|
294
|
+
# months or years, possibly limited to one or more computers.
|
|
295
|
+
#
|
|
296
|
+
# With no parameters, flushes all logs for the policy for all computers.
|
|
297
|
+
#
|
|
298
|
+
# NOTE: Currently the API doesn't have a way to flush only failed policies.
|
|
299
|
+
#
|
|
300
|
+
# WARNING: Log flushing can take a long time, and the API call doesnt return
|
|
301
|
+
# until its finished. The connection timeout will be temporarily raised to
|
|
302
|
+
# 30 minutes, unless it's already higher.
|
|
303
|
+
#
|
|
304
|
+
# @param policy[Integer,String] The id or name of the policy to flush
|
|
305
|
+
#
|
|
306
|
+
# @param older_than[Integer] 0, 1, 2, 3, or 6
|
|
307
|
+
#
|
|
308
|
+
# @param period[Symbol] :days, :weeks, :months, or :years
|
|
309
|
+
#
|
|
310
|
+
# @param computers[Array<Integer,String>] Identifiers of the target computers
|
|
311
|
+
# either ids, names, SNs, macaddrs, or UDIDs. If omitted, flushes logs for
|
|
312
|
+
# all computers
|
|
313
|
+
#
|
|
314
|
+
# @param api [JSS::APIConnection] the API connection to use.
|
|
315
|
+
#
|
|
316
|
+
# @return [void]
|
|
317
|
+
#
|
|
318
|
+
def self.flush_logs(policy, older_than: 0, period: :days, computers: [], api: JSS.api)
|
|
319
|
+
orig_timeout = api.cnx.options.timeout
|
|
320
|
+
pol_id = valid_id policy
|
|
321
|
+
raise JSS::NoSuchItemError, "No Policy identified by '#{policy}'." unless pol_id
|
|
322
|
+
|
|
323
|
+
older_than = LOG_FLUSH_INTERVAL_INTEGERS[older_than]
|
|
324
|
+
raise JSS::InvalidDataError, "older_than must be one of these integers: #{LOG_FLUSH_INTERVAL_INTEGERS.keys.join ', '}" unless older_than
|
|
325
|
+
|
|
326
|
+
period = LOG_FLUSH_INTERVAL_PERIODS[period]
|
|
327
|
+
raise JSS::InvalidDataError, "period must be one of these symbols: :#{LOG_FLUSH_INTERVAL_PERIODS.keys.join ', :'}" unless period
|
|
328
|
+
|
|
329
|
+
computers = [computers] unless computers.is_a? Array
|
|
330
|
+
|
|
331
|
+
# log flushes can be really slow
|
|
332
|
+
api.timeout = 1800 unless orig_timeout && orig_timeout > 1800
|
|
333
|
+
|
|
334
|
+
return api.delete_rsrc "#{LOG_FLUSH_RSRC}/policy/id/#{pol_id}/interval/#{older_than}+#{period}" if computers.empty?
|
|
335
|
+
|
|
336
|
+
flush_logs_for_specific_computers pol_id, older_than, period, computers, api
|
|
337
|
+
ensure
|
|
338
|
+
api.timeout = orig_timeout
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
# use an XML body in a DELETE request to flush logs for
|
|
342
|
+
# a list of computers - used by the flush_logs class method
|
|
343
|
+
def self.flush_logs_for_specific_computers(pol_id, older_than, period, computers, api)
|
|
344
|
+
# build the xml body for a DELETE request
|
|
345
|
+
xml_doc = REXML::Document.new JSS::APIConnection::XML_HEADER
|
|
346
|
+
lf = xml_doc.add_element 'logflush'
|
|
347
|
+
lf.add_element('log').text = 'policy'
|
|
348
|
+
lf.add_element('log_id').text = pol_id.to_s
|
|
349
|
+
lf.add_element('interval').text = "#{older_than} #{period}"
|
|
350
|
+
comps_elem = lf.add_element 'computers'
|
|
351
|
+
computers.each do |c|
|
|
352
|
+
id = JSS::Computer.valid_id c
|
|
353
|
+
next unless id
|
|
354
|
+
|
|
355
|
+
ce = comps_elem.add_element 'computer'
|
|
356
|
+
ce.add_element('id').text = id.to_s
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
# Do a DELETE request with a body.
|
|
360
|
+
api.cnx.delete(LOG_FLUSH_RSRC) do |req|
|
|
361
|
+
req.headers[JSS::APIConnection::HTTP_CONTENT_TYPE_HEADER] = JSS::APIConnection::MIME_XML
|
|
362
|
+
req.body = xml_doc.to_s
|
|
363
|
+
end
|
|
364
|
+
end
|
|
365
|
+
private_class_method :flush_logs_for_specific_computers
|
|
366
|
+
|
|
284
367
|
# Attributes
|
|
285
368
|
######################
|
|
286
369
|
|
|
@@ -613,7 +696,6 @@ module JSS
|
|
|
613
696
|
|
|
614
697
|
if @in_jss
|
|
615
698
|
gen = @init_data[:general]
|
|
616
|
-
@frequency = gen[:frequency]
|
|
617
699
|
@target_drive = gen[:target_drive]
|
|
618
700
|
@offline = gen[:offline]
|
|
619
701
|
@enabled = gen[:enabled]
|
|
@@ -629,6 +711,10 @@ module JSS
|
|
|
629
711
|
trigger_enrollment_complete: gen[:trigger_enrollment_complete],
|
|
630
712
|
trigger_other: gen[:trigger_other]
|
|
631
713
|
}
|
|
714
|
+
@frequency = gen[:frequency]
|
|
715
|
+
@retry_event = gen[:retry_event]
|
|
716
|
+
@retry_attempts = gen[:retry_attempts]
|
|
717
|
+
@notify_failed_retries = gen[:notify_on_each_failed_retry]
|
|
632
718
|
|
|
633
719
|
dtl = gen[:date_time_limitations]
|
|
634
720
|
|
|
@@ -745,8 +831,93 @@ module JSS
|
|
|
745
831
|
# @return [void]
|
|
746
832
|
#
|
|
747
833
|
def frequency=(freq)
|
|
748
|
-
raise JSS::InvalidDataError, "New frequency must be one of :#{FREQUENCIES.keys.join ', :'}" unless FREQUENCIES.key?(freq)
|
|
749
|
-
|
|
834
|
+
raise JSS::InvalidDataError, "New frequency must be one of :#{FREQUENCIES.keys.join ', :'}" unless FREQUENCIES.key?(freq) || FREQUENCIES.value?(freq)
|
|
835
|
+
|
|
836
|
+
freq = freq.is_a?(Symbol) ? FREQUENCIES[freq] : freq
|
|
837
|
+
return if freq == @frequency
|
|
838
|
+
|
|
839
|
+
@frequency = freq
|
|
840
|
+
@need_to_update = true
|
|
841
|
+
end
|
|
842
|
+
|
|
843
|
+
# @return [String] The event that causes a policy retry
|
|
844
|
+
def retry_event
|
|
845
|
+
return RETRY_EVENTS[:none] unless FREQUENCIES[:once_per_computer] == @frequency
|
|
846
|
+
|
|
847
|
+
@retry_event
|
|
848
|
+
end
|
|
849
|
+
|
|
850
|
+
# Set the event that causes a retry if the policy fails.
|
|
851
|
+
# One of the ways to turn off policy retry is to set this to :none
|
|
852
|
+
# The other is to set the retry_attempts to 0
|
|
853
|
+
#
|
|
854
|
+
# @param [Symbol, String] A key or value from RETRY_EVENTS
|
|
855
|
+
# @return [void]
|
|
856
|
+
#
|
|
857
|
+
def retry_event=(evt)
|
|
858
|
+
validate_retry_opt
|
|
859
|
+
raise JSS::InvalidDataError, "Retry event must be one of :#{RETRY_EVENTS.keys.join ', :'}" unless RETRY_EVENTS.key?(evt) || RETRY_EVENTS.value?(evt)
|
|
860
|
+
|
|
861
|
+
evt = evt.is_a?(Symbol) ? RETRY_EVENTS[evt] : evt
|
|
862
|
+
return if evt == @retry_event
|
|
863
|
+
|
|
864
|
+
# if the event is not 'none' and attempts is <= 0,
|
|
865
|
+
# set events to 1, or the API won't accept it
|
|
866
|
+
unless evt == RETRY_EVENTS[:none]
|
|
867
|
+
@retry_attempts = 1 unless @retry_attempts.positive?
|
|
868
|
+
end
|
|
869
|
+
|
|
870
|
+
@retry_event = evt
|
|
871
|
+
@need_to_update = true
|
|
872
|
+
end
|
|
873
|
+
|
|
874
|
+
# @return [Integer] How many times wil the policy be retried if it fails.
|
|
875
|
+
# -1 means no retries, otherwise, an integer from 1 to 10
|
|
876
|
+
def retry_attempts
|
|
877
|
+
return 0 unless FREQUENCIES[:once_per_computer] == @frequency
|
|
878
|
+
|
|
879
|
+
@retry_attempts
|
|
880
|
+
end
|
|
881
|
+
|
|
882
|
+
# Set the number of times to retry if the policy fails.
|
|
883
|
+
# One of the ways to turn off policy retry is to set this to 0 or -1
|
|
884
|
+
# The other is to set retry_event to :none
|
|
885
|
+
#
|
|
886
|
+
# @param [Integer] From -1 to 10
|
|
887
|
+
# @return [void]
|
|
888
|
+
#
|
|
889
|
+
def retry_attempts=(int)
|
|
890
|
+
validate_retry_opt
|
|
891
|
+
raise JSS::InvalidDataError, 'Retry attempts must be an integer from 0-10' unless int.is_a?(Integer) && (-1..10).include?(int)
|
|
892
|
+
|
|
893
|
+
# if zero or -1, turn off retries
|
|
894
|
+
if int <= 0
|
|
895
|
+
@retry_event = RETRY_EVENTS[:none]
|
|
896
|
+
int = -1
|
|
897
|
+
end
|
|
898
|
+
return if @retry_attempts == int
|
|
899
|
+
|
|
900
|
+
@retry_attempts = int
|
|
901
|
+
@need_to_update = true
|
|
902
|
+
end
|
|
903
|
+
|
|
904
|
+
# @return [Boolean] Should admins be notified of failed retry attempts
|
|
905
|
+
def notify_failed_retries?
|
|
906
|
+
return false unless FREQUENCIES[:once_per_computer] == @frequency
|
|
907
|
+
|
|
908
|
+
@notify_failed_retries
|
|
909
|
+
end
|
|
910
|
+
alias notify_failed_retries notify_failed_retries?
|
|
911
|
+
alias notify_on_each_failed_retry notify_failed_retries?
|
|
912
|
+
|
|
913
|
+
# @param bool[Boolean] Should admins be notified of failed retry attempts
|
|
914
|
+
# @return [void]
|
|
915
|
+
def notify_failed_retries=(bool)
|
|
916
|
+
validate_retry_opt
|
|
917
|
+
bool = JSS::Validate.boolean bool
|
|
918
|
+
return if @notify_failed_retries == bool
|
|
919
|
+
|
|
920
|
+
@notify_failed_retries = bool
|
|
750
921
|
@need_to_update = true
|
|
751
922
|
end
|
|
752
923
|
|
|
@@ -1621,34 +1792,37 @@ module JSS
|
|
|
1621
1792
|
end
|
|
1622
1793
|
alias execute run
|
|
1623
1794
|
|
|
1624
|
-
# Flush
|
|
1625
|
-
# some number of days, weeks, months or years
|
|
1795
|
+
# Flush logs for this policy older than
|
|
1796
|
+
# some number of days, weeks, months or years, possibly limited to
|
|
1797
|
+
# one or more computers
|
|
1798
|
+
#
|
|
1799
|
+
# With no parameters, flushes all logs for all computers
|
|
1626
1800
|
#
|
|
1627
|
-
#
|
|
1801
|
+
# NOTE: Currently the API doesn't have a way to flush only failed policies.
|
|
1628
1802
|
#
|
|
1629
|
-
#
|
|
1630
|
-
#
|
|
1803
|
+
# WARNING: Log flushing can take a long time, and the API call doesnt return
|
|
1804
|
+
# until its finished. The connection timeout will be temporarily raised to
|
|
1805
|
+
# 30 minutes, unless it's already higher.
|
|
1631
1806
|
#
|
|
1632
1807
|
# @param older_than[Integer] 0, 1, 2, 3, or 6
|
|
1633
1808
|
#
|
|
1634
1809
|
# @param period[Symbol] :days, :weeks, :months, or :years
|
|
1635
1810
|
#
|
|
1811
|
+
# @param computers[Array<Integer,String>] Identifiers of the target computers
|
|
1812
|
+
# either ids, names, SNs, macaddrs, or UDIDs
|
|
1813
|
+
#
|
|
1636
1814
|
# @return [void]
|
|
1637
1815
|
#
|
|
1638
|
-
def flush_logs(older_than: 0, period: :days)
|
|
1816
|
+
def flush_logs(older_than: 0, period: :days, computers: [])
|
|
1639
1817
|
raise JSS::NoSuchItemError, "Policy doesn't exist in the JSS. Use #create first." unless @in_jss
|
|
1640
1818
|
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
interval = "#{LOG_FLUSH_INTERVAL_INTEGERS[older_than]}+#{LOG_FLUSH_INTERVAL_PERIODS[period]}"
|
|
1650
|
-
|
|
1651
|
-
@api.delete_rsrc "#{LOG_FLUSH_RSRC}/policy/id/#{@id}/interval/#{interval}"
|
|
1819
|
+
JSS::Policy.flush_logs(
|
|
1820
|
+
@id,
|
|
1821
|
+
older_than: older_than,
|
|
1822
|
+
period: period,
|
|
1823
|
+
computers: computers,
|
|
1824
|
+
api: @api
|
|
1825
|
+
)
|
|
1652
1826
|
end
|
|
1653
1827
|
|
|
1654
1828
|
# Private Instance Methods
|
|
@@ -1656,6 +1830,17 @@ module JSS
|
|
|
1656
1830
|
|
|
1657
1831
|
private
|
|
1658
1832
|
|
|
1833
|
+
# raise an error if a trying to set retry options when
|
|
1834
|
+
# frequency is not 'once per comptuer'
|
|
1835
|
+
#
|
|
1836
|
+
# @return [void]
|
|
1837
|
+
#
|
|
1838
|
+
def validate_retry_opt
|
|
1839
|
+
return if FREQUENCIES[:once_per_computer] == @frequency
|
|
1840
|
+
|
|
1841
|
+
raise JSS::UnsupportedError, 'Policy retry is only available when frequency is set to :once_per_computer'
|
|
1842
|
+
end
|
|
1843
|
+
|
|
1659
1844
|
# raise an error if a package being added isn't valid
|
|
1660
1845
|
#
|
|
1661
1846
|
# @see #add_package
|
|
@@ -1786,6 +1971,10 @@ module JSS
|
|
|
1786
1971
|
general.add_element('name').text = @name
|
|
1787
1972
|
general.add_element('enabled').text = @enabled
|
|
1788
1973
|
general.add_element('frequency').text = @frequency
|
|
1974
|
+
general.add_element('retry_event').text = @retry_event
|
|
1975
|
+
general.add_element('retry_attempts').text = @retry_attempts.to_s
|
|
1976
|
+
general.add_element('notify_on_each_failed_retry').text = @notify_failed_retries.to_s
|
|
1977
|
+
|
|
1789
1978
|
general.add_element('target_drive').text = @target_drive
|
|
1790
1979
|
general.add_element('offline').text = @offline
|
|
1791
1980
|
|