ruby-jss 0.10.2 → 0.11.0a5
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of ruby-jss might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGES.md +49 -2
- data/README.md +14 -7
- data/lib/jss/api_connection.rb +48 -24
- data/lib/jss/api_object/advanced_search.rb +5 -1
- data/lib/jss/api_object/computer.rb +204 -402
- data/lib/jss/api_object/computer_invitation.rb +5 -3
- data/lib/jss/api_object/ebook.rb +5 -0
- data/lib/jss/api_object/extendable.rb +13 -0
- data/lib/jss/api_object/group/computer_group.rb +4 -0
- data/lib/jss/api_object/group/mobile_device_group.rb +4 -1
- data/lib/jss/api_object/group.rb +6 -1
- data/lib/jss/api_object/mac_application.rb +5 -0
- data/lib/jss/api_object/management_history/audit_event.rb +45 -0
- data/lib/jss/api_object/management_history/casper_imaging_log.rb +37 -0
- data/lib/jss/api_object/management_history/casper_remote_log.rb +37 -0
- data/lib/jss/api_object/management_history/computer_usage_log.rb +43 -0
- data/lib/jss/api_object/management_history/ebook.rb +70 -0
- data/lib/jss/api_object/management_history/mac_app_store_app.rb +69 -0
- data/lib/jss/api_object/management_history/mdm_command.rb +96 -0
- data/lib/jss/api_object/management_history/mobile_device_app.rb +99 -0
- data/lib/jss/api_object/management_history/policy_log.rb +60 -0
- data/lib/jss/api_object/management_history/screen_sharing_log.rb +41 -0
- data/lib/jss/api_object/management_history/user_location_change.rb +66 -0
- data/lib/jss/api_object/management_history.rb +865 -0
- data/lib/jss/api_object/mdm.rb +1298 -0
- data/lib/jss/api_object/mobile_device.rb +241 -644
- data/lib/jss/api_object/mobile_device_application.rb +6 -0
- data/lib/jss/api_object/mobile_device_configuration_profile.rb +36 -0
- data/lib/jss/api_object/osx_configuration_profile.rb +115 -151
- data/lib/jss/api_object/patch.rb +38 -0
- data/lib/jss/api_object/patch_policy.rb +38 -0
- data/lib/jss/api_object/peripheral.rb +5 -7
- data/lib/jss/api_object/policy.rb +5 -0
- data/lib/jss/api_object/restricted_software.rb +5 -0
- data/lib/jss/api_object/scopable/scope.rb +367 -411
- data/lib/jss/api_object/self_servable.rb +15 -4
- data/lib/jss/api_object/sitable.rb +197 -0
- data/lib/jss/api_object/site.rb +45 -76
- data/lib/jss/api_object/user.rb +7 -3
- data/lib/jss/api_object.rb +75 -4
- data/lib/jss/utility.rb +21 -0
- data/lib/jss/version.rb +1 -1
- data/lib/jss.rb +6 -0
- metadata +42 -6
@@ -63,31 +63,24 @@ module JSS
|
|
63
63
|
#
|
64
64
|
# === MDM Commands
|
65
65
|
#
|
66
|
-
#
|
67
|
-
#
|
68
|
-
# clicking one of the buttons on the Management Commands section of the
|
69
|
-
# Management tab of the Computer details page in the JSS UI.
|
66
|
+
# See the {JSS::MDM} mixin module for Class and Instance methods for
|
67
|
+
# sending MDM commands to computers.
|
70
68
|
#
|
71
|
-
#
|
72
|
-
#
|
73
|
-
# - {#erase_device} (aliases wipe)
|
74
|
-
# - {#remove_mdm_profile}
|
69
|
+
# To send MDM commands without fetching Computer instances, use the class
|
70
|
+
# methods, which can take multiple computer identifiers at once.
|
75
71
|
#
|
76
|
-
#
|
77
|
-
# {
|
78
|
-
#
|
79
|
-
#
|
80
|
-
# NOTE: the poorly named 'UnmanageDevice' command via the API is implemented
|
81
|
-
# as the {#remove_mdm_profile} method (which is its name in the webUI).
|
82
|
-
# Calling that method will NOT unmanage the machine from the JSS's point
|
72
|
+
# NOTE: the poorly named 'UnmanageDevice' mdm command is implemented
|
73
|
+
# as {#remove_mdm_profile} (which is its name in the webUI) as well as
|
74
|
+
# {#unmanage_device}.
|
75
|
+
# Calling that method will NOT fully unmanage a computer from the JSS's point
|
83
76
|
# of view, it will just remove the mdm management profile from the machine
|
84
77
|
# and all configuration profiles that were installed via the JSS. Those
|
85
78
|
# profiles may be re-installed automatically later if the computer is still in
|
86
79
|
# scope for them
|
87
80
|
#
|
88
|
-
#
|
89
|
-
#
|
90
|
-
# nil, and requring re-enrollment.
|
81
|
+
# To properly unmanage a computer, use the {#make_unmanaged} Instance method
|
82
|
+
# which removes the mdm profile, but also makes the machine unmanged by the
|
83
|
+
# JSS, setting the management acct to nil, and requring re-enrollment.
|
91
84
|
#
|
92
85
|
# === Computer History
|
93
86
|
#
|
@@ -168,12 +161,15 @@ module JSS
|
|
168
161
|
|
169
162
|
# MixIns
|
170
163
|
#####################################
|
171
|
-
|
164
|
+
include JSS::Creatable
|
172
165
|
include JSS::Updatable
|
173
166
|
include JSS::Locatable
|
174
167
|
include JSS::Purchasable
|
175
168
|
include JSS::Uploadable
|
176
169
|
include JSS::Extendable
|
170
|
+
include JSS::Sitable
|
171
|
+
include JSS::MDM
|
172
|
+
include JSS::ManagementHistory
|
177
173
|
|
178
174
|
extend JSS::Matchable
|
179
175
|
|
@@ -193,6 +189,9 @@ module JSS
|
|
193
189
|
# It's also used in various error messages
|
194
190
|
RSRC_OBJECT_KEY = :computer
|
195
191
|
|
192
|
+
# Where is the Site data in the API JSON?
|
193
|
+
SITE_SUBSET = :general
|
194
|
+
|
196
195
|
# these keys, as well as :id and :name, are present in valid API JSON data for this class
|
197
196
|
# DEPRECATED, with be removed in a future release.
|
198
197
|
VALID_DATA_KEYS = %i[sus distribution_point alt_mac_address].freeze
|
@@ -218,32 +217,8 @@ module JSS
|
|
218
217
|
# file uploads can send attachments to the JSS using :computers as the sub-resource.
|
219
218
|
UPLOAD_TYPES = { attachment: :computers }.freeze
|
220
219
|
|
221
|
-
#
|
222
|
-
|
223
|
-
|
224
|
-
# A mapping of Symbols available to the send_mdm_command class method, to
|
225
|
-
# the String commands actuallly sent via the API.
|
226
|
-
COMPUTER_MDM_COMMANDS = {
|
227
|
-
blank_push: 'BlankPush',
|
228
|
-
blankpush: 'BlankPush',
|
229
|
-
send_blank_push: 'BlankPush',
|
230
|
-
blank: 'BlankPush',
|
231
|
-
noop: 'BlankPush',
|
232
|
-
device_lock: 'DeviceLock',
|
233
|
-
devicelock: 'DeviceLock',
|
234
|
-
lock: 'DeviceLock',
|
235
|
-
lock_device: 'DeviceLock',
|
236
|
-
erase_device: 'EraseDevice',
|
237
|
-
erasedevice: 'EraseDevice',
|
238
|
-
erase: 'EraseDevice',
|
239
|
-
wipe: 'EraseDevice',
|
240
|
-
unmanage_device: 'UnmanageDevice',
|
241
|
-
unmanagedevice: 'UnmanageDevice',
|
242
|
-
unmanage: 'UnmanageDevice'
|
243
|
-
}.freeze
|
244
|
-
|
245
|
-
# these MDM commands require a passcode
|
246
|
-
COMPUTER_MDM_COMMANDS_NEEDING_PASSCODE = %w[DeviceLock EraseDevice].freeze
|
220
|
+
# Tell the MDM module what kind of MDM commands we use.
|
221
|
+
MDM_COMMAND_TARGET = :computers
|
247
222
|
|
248
223
|
# The API resource for app usage
|
249
224
|
APPLICATION_USAGE_RSRC = 'computerapplicationusage'.freeze
|
@@ -289,54 +264,11 @@ module JSS
|
|
289
264
|
# The top-level hash key for the inventory collection settings
|
290
265
|
INV_COLLECTION_KEY = :computer_inventory_collection
|
291
266
|
|
292
|
-
# The API Resource for the computer history data
|
293
|
-
HISTORY_RSRC = 'computerhistory'.freeze
|
294
|
-
|
295
|
-
# The top-level hash key for the history data
|
296
|
-
HISTORY_KEY = :computer_history
|
297
|
-
|
298
|
-
# The keys are both the subset names in the resrouce URLS (when
|
299
|
-
# converted to strings) and the second-level hash key of the
|
300
|
-
# returned subset data.
|
301
|
-
#
|
302
|
-
# The values are the key within each history item that contains the
|
303
|
-
# 'epoch' timestamp, for conver
|
304
|
-
HISTORY_SUBSETS = %i[
|
305
|
-
computer_usage_logs
|
306
|
-
audits
|
307
|
-
policy_logs
|
308
|
-
casper_remote_logs
|
309
|
-
screen_sharing_logs
|
310
|
-
casper_imaging_logs
|
311
|
-
commands
|
312
|
-
user_location
|
313
|
-
mac_app_store_applications
|
314
|
-
].freeze
|
315
|
-
|
316
|
-
# HISTORY_SUBSETS = %i(
|
317
|
-
# computer_usage_logs date_time_epoch
|
318
|
-
# audits
|
319
|
-
# policy_logs date_completed_epoch
|
320
|
-
# casper_remote_logs date_time_epoch
|
321
|
-
# screen_sharing_logs date_time_epoch
|
322
|
-
# casper_imaging_logs
|
323
|
-
# commands completed_epoch
|
324
|
-
# user_location
|
325
|
-
# mac_app_store_applications
|
326
|
-
# ).freeze
|
327
|
-
|
328
|
-
POLICY_STATUS_COMPLETED = 'Completed'.freeze
|
329
|
-
|
330
|
-
POLICY_STATUS_FAILED = 'Failed'.freeze
|
331
|
-
|
332
|
-
POLICY_STATUS_PENDING = 'Pending'.freeze
|
333
|
-
|
334
267
|
# the object type for this object in
|
335
268
|
# the object history table.
|
336
269
|
# See {APIObject#add_object_history_entry}
|
337
270
|
OBJECT_HISTORY_OBJECT_TYPE = 1
|
338
271
|
|
339
|
-
|
340
272
|
# Class Methods
|
341
273
|
#####################################
|
342
274
|
|
@@ -463,64 +395,120 @@ module JSS
|
|
463
395
|
all(refresh, api: api).select { |d| d[:model] =~ /^macpro/i }
|
464
396
|
end
|
465
397
|
|
466
|
-
#
|
398
|
+
# Retrieve Application Usage data for a computer by id, without
|
399
|
+
# instantiation.
|
467
400
|
#
|
401
|
+
# @param ident [Integer,String] An identifier (id, name, serialnumber,
|
402
|
+
# macadress or udid) of the computer for which to retrieve Application Usage
|
468
403
|
#
|
469
|
-
# @param
|
470
|
-
# the name or id of the computer to receive the command, or
|
471
|
-
# an array of such names or ids, or a comma-separated string
|
472
|
-
# of them.
|
473
|
-
# @param command[Symbol] the command to send, one of the keys
|
474
|
-
# of COMPUTER_MDM_COMMANDS
|
404
|
+
# @param start_date [Time,Date,DateTime,String] The earliest date to retrieve
|
475
405
|
#
|
476
|
-
# @param
|
406
|
+
# @param end_date [String,Date,DateTime,Time] Defaults to start_date
|
477
407
|
#
|
478
408
|
# @param api[JSS::APIConnection] an API connection to use for the query.
|
479
409
|
# Defaults to the corrently active API. See {JSS::APIConnection}
|
480
410
|
#
|
481
|
-
# @return [
|
482
|
-
#
|
411
|
+
# @return [Hash{Date=>Array<Hash>}] A Hash with keys (Date instances) for
|
412
|
+
# each day in the range.
|
483
413
|
#
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
414
|
+
# Each hash value contains an Array of apps used
|
415
|
+
# on that day.
|
416
|
+
#
|
417
|
+
# Each item in the array is a hash of data about the app.
|
418
|
+
# Those hash keys are:
|
419
|
+
# :name => String, the name of the app
|
420
|
+
# :version => String ,the version of the app
|
421
|
+
# :foreground => Integer, the minutes it was in the foreground
|
422
|
+
# :open => Integer, the minutes it was running.
|
423
|
+
#
|
424
|
+
def self.application_usage(ident, start_date, end_date = nil, api: JSS.api)
|
425
|
+
id = valid_id ident, api: api
|
426
|
+
raise "No computer matches identifier: #{ident}" unless id
|
427
|
+
end_date ||= start_date
|
428
|
+
start_date = Time.parse start_date if start_date.is_a? String
|
429
|
+
end_date = Time.parse end_date if end_date.is_a? String
|
430
|
+
unless ([start_date.class, end_date.class] - APPLICATION_USAGE_DATE_CLASSES).empty?
|
431
|
+
raise JSS::InvalidDataError, 'Invalid Start or End Date'
|
495
432
|
end
|
433
|
+
start_date = start_date.strftime APPLICATION_USAGE_DATE_FMT
|
434
|
+
end_date = end_date.strftime APPLICATION_USAGE_DATE_FMT
|
435
|
+
data = api.get_rsrc(APPLICATION_USAGE_RSRC + "/id/#{id}/#{start_date}_#{end_date}")
|
436
|
+
parsed_data = {}
|
437
|
+
data[APPLICATION_USAGE_KEY].each do |day_hash|
|
438
|
+
date = Date.parse day_hash[:date]
|
439
|
+
parsed_data[date] = day_hash[:apps]
|
440
|
+
end
|
441
|
+
parsed_data
|
442
|
+
end # app usage
|
496
443
|
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
444
|
+
# The 'computer management' data for a given computer by id,
|
445
|
+
# looked up on the fly.
|
446
|
+
#
|
447
|
+
# Without specifying a subset:, the entire dataset is returned as a hash of
|
448
|
+
# arrays, one per subset
|
449
|
+
#
|
450
|
+
# If a subset is given then only that array is returned, and it contains
|
451
|
+
# hashes with data about each item (usually :name and :id)
|
452
|
+
#
|
453
|
+
# If the only: param is provided with a subset, it is used as a hash-key to
|
454
|
+
# map the array to just those values, so subset: :smart_groups, only: :name
|
455
|
+
# will return an array of names of smartgroups that contain the computer.
|
456
|
+
#
|
457
|
+
# @param ident [Integer,String] An identifier (id, name, serialnumber,
|
458
|
+
# macadress or udid) of the computer for which to retrieve Application Usage
|
459
|
+
#
|
460
|
+
# @param subset[Symbol] Fetch only a subset of data, as an array.
|
461
|
+
# must be one of the symbols in MGMT_DATA_SUBSETS
|
462
|
+
#
|
463
|
+
# @param only[Symbol] When fetching a subset, only return one value
|
464
|
+
# per item in the array. meaningless without a subset.
|
465
|
+
#
|
466
|
+
# @param api[JSS::APIConnection] an API connection to use for the query.
|
467
|
+
# Defaults to the corrently active API. See {JSS::APIConnection}
|
468
|
+
#
|
469
|
+
# @return [Hash] Without a subset:, a hash of all subsets, each of which is
|
470
|
+
# an Array
|
471
|
+
#
|
472
|
+
# @return [Array] With a subset:, an array of items in that subset, possibly
|
473
|
+
# limited to just certain values with only:
|
474
|
+
#
|
475
|
+
def self.management_data(ident, subset: nil, only: nil, api: JSS.api)
|
476
|
+
id = valid_id ident, api: api
|
477
|
+
raise "No computer matches identifier: #{ident}" unless id
|
478
|
+
if subset
|
479
|
+
management_data_subset id, subset: subset, only: only, api: api
|
480
|
+
else
|
481
|
+
full_management_data id, api: api
|
482
|
+
end
|
483
|
+
end
|
511
484
|
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
485
|
+
# The full set of management data for a given computer.
|
486
|
+
# This private method is called by self.management_data, q.v.
|
487
|
+
#
|
488
|
+
def self.full_management_data(id, api: JSS.api)
|
489
|
+
mgmt_rsrc = MGMT_DATA_RSRC + "/id/#{id}"
|
490
|
+
api.get_rsrc(mgmt_rsrc)[MGMT_DATA_KEY]
|
491
|
+
end
|
492
|
+
private_class_method :full_management_data
|
516
493
|
|
494
|
+
# A subset of management data for a given computer.
|
495
|
+
# This private method is called by self.management_data, q.v.
|
496
|
+
#
|
497
|
+
def self.management_data_subset(id, subset: nil, only: nil, api: JSS.api)
|
498
|
+
raise "Subset must be one of :#{MGMT_DATA_SUBSETS.join ', :'}" unless MGMT_DATA_SUBSETS.include? subset
|
499
|
+
subset_rsrc = MGMT_DATA_RSRC + "/id/#{id}/subset/#{subset}"
|
500
|
+
subset_data = api.get_rsrc(subset_rsrc)[MGMT_DATA_KEY]
|
501
|
+
return subset_data unless only
|
502
|
+
subset_data.map { |d| d[only] }
|
503
|
+
end
|
504
|
+
private_class_method :management_data_subset
|
517
505
|
|
518
506
|
# Attributes
|
519
507
|
#####################################
|
520
508
|
|
521
|
-
#
|
522
|
-
|
523
|
-
|
509
|
+
# identifiers
|
510
|
+
################
|
511
|
+
|
524
512
|
|
525
513
|
# @return [String] the secondary mac address
|
526
514
|
attr_reader :alt_mac_address
|
@@ -540,6 +528,9 @@ module JSS
|
|
540
528
|
# @return [IPAddr] the last known IP address
|
541
529
|
attr_reader :ip_address
|
542
530
|
|
531
|
+
# @return [Boolean]
|
532
|
+
attr_reader :itunes_store_account_is_active
|
533
|
+
|
543
534
|
# @return [String] the version of the jamf binary
|
544
535
|
attr_reader :jamf_version
|
545
536
|
|
@@ -561,6 +552,13 @@ module JSS
|
|
561
552
|
# @return [Boolean] doesit support MDM?
|
562
553
|
attr_reader :mdm_capable
|
563
554
|
|
555
|
+
# @return [Array] user accts that support MDM?
|
556
|
+
# NOTE: This suffers from the JSON-Hash-treated-like_XML-Array-loses-data
|
557
|
+
# bug and only shows the last listed user, cuz it comes from the API
|
558
|
+
# as a hash, not an array.
|
559
|
+
#
|
560
|
+
attr_reader :mdm_capable_users
|
561
|
+
|
564
562
|
# @return [String] the name of the netboot server for this machine
|
565
563
|
attr_reader :netboot_server
|
566
564
|
|
@@ -740,42 +738,57 @@ module JSS
|
|
740
738
|
|
741
739
|
# @param (see APIObject#initialize)
|
742
740
|
#
|
743
|
-
#
|
741
|
+
# # When creating new records with .make,
|
742
|
+
# these can be provided in the arg, or after instantiation via
|
743
|
+
# setter methods:
|
744
|
+
# serial_number:, udid:, asset_tag:, mac_address:
|
745
|
+
# alt_mac_address:, barcode_1:, barcode_2:
|
746
|
+
#
|
744
747
|
#
|
745
748
|
def initialize(args = {})
|
746
749
|
super args
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
|
752
|
-
|
753
|
-
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
|
760
|
-
|
761
|
-
|
762
|
-
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
|
767
|
-
|
768
|
-
|
769
|
-
|
770
|
-
|
771
|
-
|
772
|
-
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
778
|
-
|
750
|
+
if @in_jss
|
751
|
+
@alt_mac_address = @init_data[:general][:alt_mac_address]
|
752
|
+
@asset_tag = @init_data[:general][:asset_tag]
|
753
|
+
@barcode_1 = @init_data[:general][:barcode_1]
|
754
|
+
@barcode_2 = @init_data[:general][:barcode_2]
|
755
|
+
@distribution_point = @init_data[:general][:distribution_point]
|
756
|
+
@initial_entry_date = JSS.epoch_to_time @init_data[:general][:initial_entry_date_epoch]
|
757
|
+
@last_enrolled = JSS.epoch_to_time @init_data[:general][:last_enrolled_date_epoch]
|
758
|
+
@ip_address = @init_data[:general][:ip_address]
|
759
|
+
@itunes_store_account_is_active = @init_data[:general][:itunes_store_account_is_active]
|
760
|
+
@jamf_version = @init_data[:general][:jamf_version]
|
761
|
+
@last_contact_time = JSS.epoch_to_time @init_data[:general][:last_contact_time_epoch]
|
762
|
+
@mac_address = @init_data[:general][:mac_address]
|
763
|
+
@managed = @init_data[:general][:remote_management][:managed]
|
764
|
+
@management_username = @init_data[:general][:remote_management][:management_username]
|
765
|
+
@mdm_capable = @init_data[:general][:mdm_capable]
|
766
|
+
@mdm_capable_users = @init_data[:general][:mdm_capable_users].values
|
767
|
+
@netboot_server = @init_data[:general][:netboot_server]
|
768
|
+
@platform = @init_data[:general][:platform]
|
769
|
+
@report_date = JSS.epoch_to_time @init_data[:general][:report_date_epoch]
|
770
|
+
@serial_number = @init_data[:general][:serial_number]
|
771
|
+
@site = JSS::APIObject.get_name(@init_data[:general][:site])
|
772
|
+
@sus = @init_data[:general][:sus]
|
773
|
+
@udid = @init_data[:general][:udid]
|
774
|
+
|
775
|
+
@configuration_profiles = @init_data[:configuration_profiles]
|
776
|
+
@certificates = @init_data[:certificates]
|
777
|
+
@groups_accounts = @init_data[:groups_accounts]
|
778
|
+
@hardware = @init_data[:hardware]
|
779
|
+
@peripherals = @init_data[:peripherals]
|
780
|
+
@software = @init_data[:software]
|
781
|
+
|
782
|
+
@management_password = nil
|
783
|
+
else
|
784
|
+
@udid = args[:udid]
|
785
|
+
@serial_number = args[:serial_number]
|
786
|
+
@asset_tag = args[:asset_tag]
|
787
|
+
@mac_address = args[:mac_address]
|
788
|
+
@alt_mac_address = args[:alt_mac_address]
|
789
|
+
@barcode_1 = args[:barcode_1]
|
790
|
+
@barcode_2 = args[:barcode_2]
|
791
|
+
end
|
779
792
|
end # initialize
|
780
793
|
|
781
794
|
# @return [Array] the JSS groups to which thismachine belongs (smart and static)
|
@@ -840,239 +853,69 @@ module JSS
|
|
840
853
|
|
841
854
|
# Get application usage data for this computer
|
842
855
|
# for a given date range.
|
843
|
-
#
|
844
|
-
# TODO: Make this a class method so we can retrieve it without
|
845
|
-
# instantiating the Computer.
|
846
|
-
#
|
847
|
-
# @param start_date [String,Date,DateTime,Time]
|
848
|
-
#
|
849
|
-
# @param end_date [String,Date,DateTime,Time] Defaults to start_date
|
850
|
-
#
|
851
|
-
# @return [Hash{Date=>Array<Hash>}] For each day in the range, an Array
|
852
|
-
# with one Hash per application used. The hash keys are:
|
853
|
-
# :name => String, the name of the app
|
854
|
-
# :version => String ,the version of the app
|
855
|
-
# :foreground => Integer, the minutes it was in the foreground
|
856
|
-
# :open => Integer, the minutes it was running.
|
856
|
+
# See {JSS::Computer.application_usage} for details
|
857
857
|
#
|
858
858
|
def application_usage(start_date, end_date = nil)
|
859
|
-
end_date
|
860
|
-
start_date = Time.parse start_date if start_date.is_a? String
|
861
|
-
end_date = Time.parse end_date if end_date.is_a? String
|
862
|
-
unless ([start_date.class, end_date.class] - APPLICATION_USAGE_DATE_CLASSES).empty?
|
863
|
-
raise JSS::InvalidDataError, 'Invalid Start or End Date'
|
864
|
-
end
|
865
|
-
start_date = start_date.strftime APPLICATION_USAGE_DATE_FMT
|
866
|
-
end_date = end_date.strftime APPLICATION_USAGE_DATE_FMT
|
867
|
-
data = @api.get_rsrc(APPLICATION_USAGE_RSRC + "/id/#{@id}/#{start_date}_#{end_date}")
|
868
|
-
parsed_data = {}
|
869
|
-
data[APPLICATION_USAGE_KEY].each do |day_hash|
|
870
|
-
date = Date.parse day_hash[:date]
|
871
|
-
parsed_data[date] = day_hash[:apps]
|
872
|
-
end
|
873
|
-
parsed_data
|
859
|
+
JSS::Computer.application_usage @id, start_date, end_date, api: @api
|
874
860
|
end # app usage
|
875
861
|
|
876
|
-
# The 'computer management' data for this computer
|
862
|
+
# The 'computer management' data for this computer
|
877
863
|
#
|
878
|
-
#
|
879
|
-
# arrays, one per subset
|
880
|
-
# If a subset is given then only that array is returned, and it contains
|
881
|
-
# hashes with data about each item (usually :name and :id)
|
864
|
+
# NOTE: the data isn't cached locally, and the API is queried every time
|
882
865
|
#
|
883
|
-
#
|
884
|
-
# map the array to just those values, so subset: :smart_groups, only: :name
|
885
|
-
# will return an array of names of smartgroups that contain this computer.
|
886
|
-
#
|
887
|
-
# TODO: Make this a class method so we can retrieve it without
|
888
|
-
# instantiating the Computer.
|
889
|
-
#
|
890
|
-
# @param subset[Symbol] Fetch only a subset of data, as an array.
|
891
|
-
# must be one of the symbols in MGMT_DATA_SUBSETS
|
866
|
+
# @see {JSS::Computer.management_data} for details
|
892
867
|
#
|
893
|
-
|
894
|
-
|
895
|
-
|
896
|
-
# @param refresh[Boolean] should the data be re-cached from the API?
|
897
|
-
#
|
898
|
-
# @return [Hash] Without a subset:, a hash of all subsets, each of which is
|
899
|
-
# an Array
|
900
|
-
#
|
901
|
-
# @return [Array] With a subset:, an array of items in that subset.
|
902
|
-
#
|
903
|
-
def management_data(subset: nil, only: nil, refresh: false)
|
904
|
-
@management_data ||= {}
|
905
|
-
if subset
|
906
|
-
management_data_subset(subset: subset, only: only, refresh: refresh)
|
907
|
-
else
|
908
|
-
full_management_data refresh
|
909
|
-
end
|
910
|
-
end
|
911
|
-
|
912
|
-
def full_management_data(refresh = false)
|
913
|
-
@management_data[:full] = nil if refresh
|
914
|
-
return @management_data[:full] if @management_data[:full]
|
915
|
-
mgmt_rsrc = MGMT_DATA_RSRC + "/id/#{@id}"
|
916
|
-
@management_data[:full] = @api.get_rsrc(mgmt_rsrc)[MGMT_DATA_KEY]
|
917
|
-
@management_data[:full]
|
918
|
-
end
|
919
|
-
private :full_management_data
|
920
|
-
|
921
|
-
def management_data_subset(subset: nil, only: nil, refresh: false)
|
922
|
-
raise "Subset must be one of :#{MGMT_DATA_SUBSETS.join ', :'}" unless MGMT_DATA_SUBSETS.include? subset
|
923
|
-
@management_data[subset] = nil if refresh
|
924
|
-
return @management_data[subset] if @management_data[subset]
|
925
|
-
subset_rsrc = MGMT_DATA_RSRC + "/id/#{@id}/subset/#{subset}"
|
926
|
-
@management_data[subset] = @api.get_rsrc(subset_rsrc)[MGMT_DATA_KEY]
|
927
|
-
return @management_data[subset] unless only
|
928
|
-
@management_data[subset].map { |d| d[only] }
|
868
|
+
def management_data(subset: nil, only: nil)
|
869
|
+
raise JSS::NoSuchItemError, 'Computer not yet saved in the JSS' unless @in_jss
|
870
|
+
JSS::Computer.management_data @id, subset: subset, only: only, api: @api
|
929
871
|
end
|
930
|
-
private :management_data_subset
|
931
872
|
|
932
873
|
# A shortcut for 'management_data subset: :smart_groups'
|
933
874
|
#
|
934
|
-
def smart_groups(only: nil
|
935
|
-
management_data subset: :smart_groups, only: only
|
875
|
+
def smart_groups(only: nil)
|
876
|
+
management_data subset: :smart_groups, only: only
|
936
877
|
end
|
937
878
|
|
938
879
|
# A shortcut for 'management_data subset: :static_groups'
|
939
880
|
#
|
940
|
-
def static_groups(only: nil
|
941
|
-
management_data subset: :static_groups, only: only
|
881
|
+
def static_groups(only: nil)
|
882
|
+
management_data subset: :static_groups, only: only
|
942
883
|
end
|
943
884
|
|
944
885
|
# A shortcut for 'management_data subset: :policies'
|
945
886
|
#
|
946
|
-
def policies(only: nil
|
947
|
-
management_data subset: :policies, only: only
|
887
|
+
def policies(only: nil)
|
888
|
+
management_data subset: :policies, only: only
|
948
889
|
end
|
949
890
|
|
950
891
|
# A shortcut for 'management_data subset: :os_x_configuration_profiles'
|
951
892
|
#
|
952
|
-
def configuration_profiles(only: nil
|
953
|
-
management_data subset: :os_x_configuration_profiles, only: only
|
893
|
+
def configuration_profiles(only: nil)
|
894
|
+
management_data subset: :os_x_configuration_profiles, only: only
|
954
895
|
end
|
955
896
|
|
956
897
|
# A shortcut for 'management_data subset: :ebooks'
|
957
898
|
#
|
958
|
-
def ebooks(only: nil
|
899
|
+
def ebooks(only: nil)
|
959
900
|
management_data subset: :ebooks, only: only, refresh: refresh
|
960
901
|
end
|
961
902
|
|
962
903
|
# A shortcut for 'management_data subset: :mac_app_store_apps'
|
963
904
|
#
|
964
|
-
def app_store_apps(only: nil
|
965
|
-
management_data subset: :mac_app_store_apps, only: only
|
905
|
+
def app_store_apps(only: nil)
|
906
|
+
management_data subset: :mac_app_store_apps, only: only
|
966
907
|
end
|
967
908
|
|
968
909
|
# A shortcut for 'management_data subset: :restricted_software'
|
969
910
|
#
|
970
|
-
def restricted_software(only: nil
|
971
|
-
management_data subset: :restricted_software, only: only
|
911
|
+
def restricted_software(only: nil)
|
912
|
+
management_data subset: :restricted_software, only: only
|
972
913
|
end
|
973
914
|
|
974
915
|
# A shortcut for 'management_data subset: :patch_reporting_software_titles'
|
975
916
|
#
|
976
|
-
def patch_titles(only: nil
|
977
|
-
management_data subset: :patch_reporting_software_titles, only: only
|
978
|
-
end
|
979
|
-
|
980
|
-
# Return this computer's history.
|
981
|
-
# WARNING! Its huge, better to use a subset a
|
982
|
-
# nd one of the shortcut methods.
|
983
|
-
#
|
984
|
-
# TODO: Make this a class method so we can retrieve it without
|
985
|
-
# instantiating the Computer.
|
986
|
-
#
|
987
|
-
# @param subset[Symbol] the subset to return, rather than full history.
|
988
|
-
#
|
989
|
-
# @param refresh[Boolean] should we re-cache the data from the API?
|
990
|
-
#
|
991
|
-
# @return [Hash] The full history
|
992
|
-
#
|
993
|
-
# @return [Array] The history subset requested
|
994
|
-
#
|
995
|
-
def history(subset: nil, refresh: false)
|
996
|
-
@history ||= {}
|
997
|
-
if subset
|
998
|
-
history_subset(subset: subset, refresh: refresh)
|
999
|
-
else
|
1000
|
-
full_history refresh
|
1001
|
-
end
|
1002
|
-
end
|
1003
|
-
|
1004
|
-
def full_history(refresh = false)
|
1005
|
-
@history[:full] = nil if refresh
|
1006
|
-
return @history[:full] if @history[:full]
|
1007
|
-
history_rsrc = HISTORY_RSRC + "/id/#{@id}"
|
1008
|
-
@history[:full] = @api.get_rsrc(history_rsrc)[HISTORY_KEY]
|
1009
|
-
@history[:full]
|
1010
|
-
end
|
1011
|
-
private :full_history
|
1012
|
-
|
1013
|
-
def history_subset(subset: nil, refresh: false)
|
1014
|
-
raise "Subset must be one of :#{HISTORY_SUBSETS.join ', :'}" unless HISTORY_SUBSETS.include? subset
|
1015
|
-
@history[subset] = nil if refresh
|
1016
|
-
return @history[subset] if @history[subset]
|
1017
|
-
subset_rsrc = HISTORY_RSRC + "/id/#{@id}/subset/#{subset}"
|
1018
|
-
@history[subset] = @api.get_rsrc(subset_rsrc)[HISTORY_KEY]
|
1019
|
-
@history[subset]
|
1020
|
-
end
|
1021
|
-
private :history_subset
|
1022
|
-
|
1023
|
-
# Shortcut for history(:computer_usage_logs)
|
1024
|
-
def usage_logs(refresh = false)
|
1025
|
-
history(subset: :computer_usage_logs, refresh: refresh)
|
1026
|
-
end
|
1027
|
-
|
1028
|
-
# Shortcut for history(:audits)
|
1029
|
-
def audits(refresh = false)
|
1030
|
-
history(subset: :audits, refresh: refresh)
|
1031
|
-
end
|
1032
|
-
|
1033
|
-
# Shortcut for history(:policy_logs)
|
1034
|
-
def policy_logs(refresh = false)
|
1035
|
-
history(subset: :policy_logs, refresh: refresh)
|
1036
|
-
end
|
1037
|
-
|
1038
|
-
# Shortcut for history(:policy_logs), but just the completed policies
|
1039
|
-
def completed_policies(refresh = false)
|
1040
|
-
policy_logs(refresh).select { |pl| pl[:status] == POLICY_STATUS_COMPLETED }
|
1041
|
-
end
|
1042
|
-
|
1043
|
-
# Shortcut for history(:policy_logs), but just the failes policies
|
1044
|
-
def failed_policies(refresh = false)
|
1045
|
-
policy_log(refresh).select { |pl| pl[:status] == POLICY_STATUS_FAILED }
|
1046
|
-
end
|
1047
|
-
|
1048
|
-
# Shortcut for history(:casper_remote_logs)
|
1049
|
-
def casper_remote_logs(refresh = false)
|
1050
|
-
history(subset: :casper_remote_logs, refresh: refresh)
|
1051
|
-
end
|
1052
|
-
|
1053
|
-
# Shortcut for history(:screen_sharing_logs)
|
1054
|
-
def screen_sharing_logs(refresh = false)
|
1055
|
-
history(subset: :screen_sharing_logs, refresh: refresh)
|
1056
|
-
end
|
1057
|
-
|
1058
|
-
# Shortcut for history(:casper_imaging_logs)
|
1059
|
-
def casper_imaging_logs(refresh = false)
|
1060
|
-
history(subset: :casper_imaging_logs, refresh: refresh)
|
1061
|
-
end
|
1062
|
-
|
1063
|
-
# Shortcut for history(:commands)
|
1064
|
-
def commands(refresh = false)
|
1065
|
-
history(subset: :commands, refresh: refresh)
|
1066
|
-
end
|
1067
|
-
|
1068
|
-
# Shortcut for history(:user_location)
|
1069
|
-
def user_location_history(refresh = false)
|
1070
|
-
history(subset: :user_location, refresh: refresh)
|
1071
|
-
end
|
1072
|
-
|
1073
|
-
# Shortcut for history(:mac_app_store_applications)
|
1074
|
-
def app_store_app_history(refresh = false)
|
1075
|
-
history(subset: :mac_app_store_applications, refresh: refresh)
|
917
|
+
def patch_titles(only: nil)
|
918
|
+
management_data subset: :patch_reporting_software_titles, only: only
|
1076
919
|
end
|
1077
920
|
|
1078
921
|
# Set or unset management acct and password for this computer
|
@@ -1177,10 +1020,9 @@ module JSS
|
|
1177
1020
|
# @return [void]
|
1178
1021
|
#
|
1179
1022
|
def update
|
1180
|
-
|
1181
|
-
remove_mdm_profile if mdm_capable && managed? && @unmange_at_update
|
1023
|
+
remove_mdm_profile if mdm_capable && @unmange_at_update
|
1182
1024
|
@unmange_at_update = false
|
1183
|
-
|
1025
|
+
super
|
1184
1026
|
end
|
1185
1027
|
|
1186
1028
|
# Delete this computer from the JSS
|
@@ -1228,48 +1070,6 @@ module JSS
|
|
1228
1070
|
@software = nil
|
1229
1071
|
end # delete
|
1230
1072
|
|
1231
|
-
# Send a blank_push MDM command
|
1232
|
-
#
|
1233
|
-
# See JSS::Computer.send_mdm_command
|
1234
|
-
#
|
1235
|
-
def blank_push
|
1236
|
-
self.class.send_mdm_command @id, :blank_push, api: @api
|
1237
|
-
end
|
1238
|
-
alias noop blank_push
|
1239
|
-
alias send_blank_push blank_push
|
1240
|
-
|
1241
|
-
# Send a device_lock MDM command
|
1242
|
-
#
|
1243
|
-
# See JSS::Computer.send_mdm_command
|
1244
|
-
#
|
1245
|
-
def device_lock(passcode)
|
1246
|
-
self.class.send_mdm_command @id, :device_lock, passcode, api: @api
|
1247
|
-
end
|
1248
|
-
alias lock device_lock
|
1249
|
-
alias lock_device device_lock
|
1250
|
-
|
1251
|
-
# Send an erase_device MDM command
|
1252
|
-
#
|
1253
|
-
# See JSS::Computer.send_mdm_command
|
1254
|
-
#
|
1255
|
-
def erase_device(passcode)
|
1256
|
-
self.class.send_mdm_command @id, :erase_device, passcode, api: @api
|
1257
|
-
end
|
1258
|
-
alias erase erase_device
|
1259
|
-
alias wipe erase_device
|
1260
|
-
|
1261
|
-
# Remove MDM management profile without
|
1262
|
-
# un-enrolling from the JSS or
|
1263
|
-
# resetting the JSS management acct.
|
1264
|
-
#
|
1265
|
-
# To do those things as well, see {#make_unmanaged}
|
1266
|
-
#
|
1267
|
-
# See JSS::Computer.send_mdm_command
|
1268
|
-
#
|
1269
|
-
def remove_mdm_profile
|
1270
|
-
self.class.send_mdm_command @id, :unmanage_device, api: @api
|
1271
|
-
end
|
1272
|
-
|
1273
1073
|
# aliases
|
1274
1074
|
alias alt_macaddress alt_mac_address
|
1275
1075
|
alias bar_code_1 barcode_1
|
@@ -1314,12 +1114,14 @@ module JSS
|
|
1314
1114
|
rmgmt.add_element('management_username').text = @management_username
|
1315
1115
|
rmgmt.add_element('management_password').text = @management_password if @management_password
|
1316
1116
|
|
1317
|
-
computer << ext_attr_xml if
|
1117
|
+
computer << ext_attr_xml if unsaved_eas?
|
1318
1118
|
|
1319
1119
|
computer << location_xml if has_location?
|
1320
1120
|
|
1321
1121
|
computer << purchasing_xml if has_purchasing?
|
1322
1122
|
|
1123
|
+
add_site_to_xml(doc)
|
1124
|
+
|
1323
1125
|
doc.to_s
|
1324
1126
|
end # rest_xml
|
1325
1127
|
|