ruby-jss 0.10.2 → 0.11.0a5

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.

Potentially problematic release.


This version of ruby-jss might be problematic. Click here for more details.

Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.md +49 -2
  3. data/README.md +14 -7
  4. data/lib/jss/api_connection.rb +48 -24
  5. data/lib/jss/api_object/advanced_search.rb +5 -1
  6. data/lib/jss/api_object/computer.rb +204 -402
  7. data/lib/jss/api_object/computer_invitation.rb +5 -3
  8. data/lib/jss/api_object/ebook.rb +5 -0
  9. data/lib/jss/api_object/extendable.rb +13 -0
  10. data/lib/jss/api_object/group/computer_group.rb +4 -0
  11. data/lib/jss/api_object/group/mobile_device_group.rb +4 -1
  12. data/lib/jss/api_object/group.rb +6 -1
  13. data/lib/jss/api_object/mac_application.rb +5 -0
  14. data/lib/jss/api_object/management_history/audit_event.rb +45 -0
  15. data/lib/jss/api_object/management_history/casper_imaging_log.rb +37 -0
  16. data/lib/jss/api_object/management_history/casper_remote_log.rb +37 -0
  17. data/lib/jss/api_object/management_history/computer_usage_log.rb +43 -0
  18. data/lib/jss/api_object/management_history/ebook.rb +70 -0
  19. data/lib/jss/api_object/management_history/mac_app_store_app.rb +69 -0
  20. data/lib/jss/api_object/management_history/mdm_command.rb +96 -0
  21. data/lib/jss/api_object/management_history/mobile_device_app.rb +99 -0
  22. data/lib/jss/api_object/management_history/policy_log.rb +60 -0
  23. data/lib/jss/api_object/management_history/screen_sharing_log.rb +41 -0
  24. data/lib/jss/api_object/management_history/user_location_change.rb +66 -0
  25. data/lib/jss/api_object/management_history.rb +865 -0
  26. data/lib/jss/api_object/mdm.rb +1298 -0
  27. data/lib/jss/api_object/mobile_device.rb +241 -644
  28. data/lib/jss/api_object/mobile_device_application.rb +6 -0
  29. data/lib/jss/api_object/mobile_device_configuration_profile.rb +36 -0
  30. data/lib/jss/api_object/osx_configuration_profile.rb +115 -151
  31. data/lib/jss/api_object/patch.rb +38 -0
  32. data/lib/jss/api_object/patch_policy.rb +38 -0
  33. data/lib/jss/api_object/peripheral.rb +5 -7
  34. data/lib/jss/api_object/policy.rb +5 -0
  35. data/lib/jss/api_object/restricted_software.rb +5 -0
  36. data/lib/jss/api_object/scopable/scope.rb +367 -411
  37. data/lib/jss/api_object/self_servable.rb +15 -4
  38. data/lib/jss/api_object/sitable.rb +197 -0
  39. data/lib/jss/api_object/site.rb +45 -76
  40. data/lib/jss/api_object/user.rb +7 -3
  41. data/lib/jss/api_object.rb +75 -4
  42. data/lib/jss/utility.rb +21 -0
  43. data/lib/jss/version.rb +1 -1
  44. data/lib/jss.rb +6 -0
  45. metadata +42 -6
@@ -39,14 +39,14 @@ module JSS
39
39
  # This class represents a Mobile Device stored in the JSS.
40
40
  #
41
41
  # ---
42
- # ===Adding devices to the JSS
42
+ # === Adding devices to the JSS
43
43
  #
44
44
  # This class cannot be used to add new mobile devices to the JSS. That can only be done
45
45
  # via the enrollment process. See JSS::MobileDeviceInvitation for sending
46
46
  # an enrollment invite to a device.
47
47
  #
48
48
  # ---
49
- # ===Editing values
49
+ # === Editing values
50
50
  #
51
51
  # Only a few values can be changed via the API, using these methods, q.v:
52
52
  # - #asset_tag= String
@@ -57,35 +57,32 @@ module JSS
57
57
  # After modfying any values, #save must be called to save changes to the JSS.
58
58
  #
59
59
  # ---
60
- # ===MDM Commands
60
+ # === MDM Commands
61
61
  #
62
- # The following methods can be used to send an APNS command to the device represented by an
63
- # instance of JSS::MobileDevice, equivalent to clicking one of the buttons on
64
- # the Management Commands section of the Management tab of the Mobile Device details page in the JSS UI.
62
+ # See the {JSS::MDM} mixin module for Class and Instance methods for
63
+ # sending MDM commands to mobiledevices.
65
64
  #
66
- # The methods supported are:
67
- # - blank_push (aliases blank, noop, send_blank_push)
68
- # - update_inventory (alias recon)
69
- # - device_lock (aliases lock, lock_device)
70
- # - erase_device (aliases wipe)
71
- # - clear_passcode
72
- # - unmanage_device (alias unmanage)
73
- #
74
- # Each returns true if the command as sent.
75
- #
76
- # @see JSS::APIObject
65
+ # To send MDM commands without fetching mobiledevice instances, use the class
66
+ # methods, which can take multiple identifiers at once.
77
67
  #
68
+ # NOTE: If the {#name=} method is used to change the name of a supervized device,
69
+ # the DeviceName MDM command will be sent to the device when
70
+ # the changes are sent to the server via {#save} or {#update}
78
71
  #
79
72
  class MobileDevice < JSS::APIObject
80
73
 
81
74
  # Mix-Ins
82
75
  #####################################
83
76
 
77
+ include JSS::Creatable
84
78
  include JSS::Updatable
85
79
  include JSS::Locatable
86
80
  include JSS::Purchasable
87
81
  include JSS::Uploadable
88
82
  include JSS::Extendable
83
+ include JSS::Sitable
84
+ include JSS::MDM
85
+ include JSS::ManagementHistory
89
86
 
90
87
  extend JSS::Matchable
91
88
 
@@ -102,6 +99,9 @@ module JSS
102
99
  # It's also used in various error messages
103
100
  RSRC_OBJECT_KEY = :mobile_device
104
101
 
102
+ # Where is the Site data in the API JSON?
103
+ SITE_SUBSET = :general
104
+
105
105
  # these keys, as well as :id and :name, are present in valid API JSON data for this class
106
106
  VALID_DATA_KEYS = %i[device_name capacity tethered].freeze
107
107
 
@@ -120,232 +120,191 @@ module JSS
120
120
  # This is the class for relevant Extension Attributes
121
121
  EXT_ATTRIB_CLASS = JSS::MobileDeviceExtensionAttribute
122
122
 
123
- # the rsrc for mobile dev commands
124
- MDM_RSRC = 'mobiledevicecommands/command'.freeze
125
-
126
- # The MDM commands sendable via the api
127
- # and alternative versions
128
- #
129
- MDM_COMMANDS = {
130
- blank_push: 'BlankPush',
131
- send_blank_push: 'BlankPush',
132
- blank: 'BlankPush',
133
- noop: 'BlankPush',
134
-
135
- settings: 'Settings',
136
-
137
- update_inventory: 'UpdateInventory',
138
- recon: 'UpdateInventory',
139
-
140
- device_lock: 'DeviceLock',
141
- lock: 'DeviceLock',
142
- lock_device: 'DeviceLock',
143
-
144
- erase_device: 'EraseDevice',
145
- erase: 'EraseDevice',
146
- wipe: 'EraseDevice',
147
-
148
- clear_passcode: 'ClearPasscode',
149
-
150
- clear_restrictions_password: 'ClearRestrictionsPassword',
151
-
152
- enable_data_roaming: 'SettingsEnableDataRoaming',
153
- disable_data_roaming: 'SettingsDisableDataRoaming',
154
-
155
- enable_voice_roaming: 'SettingsEnableVoiceRoaming',
156
- disable_voice_roaming: 'SettingsDisableVoiceRoaming',
157
-
158
- enable_app_analytics: 'SettingsEnableAppAnalytics',
159
- disable_app_analytics: 'SettingsDisableAppAnalytics',
160
-
161
- enable_diagnostic_submission: 'SettingsEnableDiagnosticSubmission',
162
- disable_diagnostic_submission: 'SettingsDisableDiagnosticSubmission',
163
-
164
- # wallpaper: 'Wallpaper',
165
-
166
- device_name: 'DeviceName',
167
-
168
- shutdown_device: 'ShutDownDevice',
169
- shutdown: 'ShutDownDevice',
170
-
171
- restart_device: 'RestartDevice',
172
- restart: 'RestartDevice',
173
-
174
- # passcode_lock_grace_period: 'PasscodeLockGracePeriod',
175
-
176
- unmanage_device: 'UnmanageDevice',
177
- unmanage: 'UnmanageDevice'
178
-
179
- }.freeze
180
-
181
- # These MDM commands need extra data.
182
- MDM_COMMANDS_REQUIRING_DATA = %w[DeviceLock DeviceName Wallpaper].freeze
183
-
184
- # The History resource
185
- HISTORY_RSRC = 'mobiledevicehistory'.freeze
186
-
187
- # Available history subsets
188
- HISTORY_SUBSETS = %i[management_commands user_location audits applications ebooks].freeze
123
+ # What kind of devices are we for MDM purposes?
124
+ MDM_COMMAND_TARGET = :mobiledevices
189
125
 
190
126
  # the object type for this object in
191
127
  # the object history table.
192
128
  # See {APIObject#add_object_history_entry}
193
129
  OBJECT_HISTORY_OBJECT_TYPE = 21
194
130
 
195
-
196
131
  # Class Methods
197
132
  #####################################
198
133
 
199
134
  # @return [Array<String>] all mobiledevice serial_numbers
200
135
  def self.all_serial_numbers(refresh = false, api: JSS.api)
201
- all(refresh, api: API).map { |i| i[:serial_number] }
136
+ all(refresh, api: api).map { |i| i[:serial_number] }
202
137
  end
203
138
 
204
139
  # @return [Array<String>] all mobiledevice phone numbers
205
140
  def self.all_phone_numbers(refresh = false, api: JSS.api)
206
- all(refresh, api: API).map { |i| i[:phone_number] }.reject(&:empty?)
141
+ all(refresh, api: api).map { |i| i[:phone_number] }.reject(&:empty?)
207
142
  end
208
143
 
209
144
  # @return [Array<String>] all mobiledevice wifi mac addrs
210
145
  def self.all_wifi_mac_addresses(refresh = false, api: JSS.api)
211
- all(refresh, api: API).map { |i| i[:wifi_mac_address] }
146
+ all(refresh, api: api).map { |i| i[:wifi_mac_address] }
212
147
  end
213
148
 
214
149
  # @return [Array<String>] all mobiledevice wifi mac addrs
215
150
  def self.all_mac_addresses(refresh = false, api: JSS.api)
216
- all_wifi_mac_addresses(refresh, api: API)
151
+ all_wifi_mac_addresses(refresh, api: api)
217
152
  end
218
153
 
219
154
  # @return [Array<String>] all mobiledevice udids
220
155
  def self.all_udids(refresh = false, api: JSS.api)
221
- all(refresh, api: API).map { |i| i[:udid] }
156
+ all(refresh, api: api).map { |i| i[:udid] }
222
157
  end
223
158
 
224
159
  # @return [Array<Hash>] the list of all managed mobile devices
225
160
  def self.all_managed(refresh = false, api: JSS.api)
226
- all(refresh, api: API).select { |d| d[:managed] }
161
+ all(refresh, api: api).select { |d| d[:managed] }
227
162
  end
228
163
 
229
164
  # @return [Array<Hash>] the list of all unmanaged mobile devices
230
165
  def self.all_unmanaged(refresh = false, api: JSS.api)
231
- all(refresh, api: API).reject { |d| d[:managed] }
166
+ all(refresh, api: api).reject { |d| d[:managed] }
167
+ end
168
+
169
+ # @return [Array<Hash>] the list of all supervised mobile devices
170
+ def self.all_supervised(refresh = false, api: JSS.api)
171
+ all(refresh, api: api).select { |d| d[:supervised] }
172
+ end
173
+
174
+ # @return [Array<Hash>] the list of all unsupervised mobile devices
175
+ def self.all_unsupervised(refresh = false, api: JSS.api)
176
+ all(refresh, api: api).reject { |d| d[:supervised] }
232
177
  end
233
178
 
234
179
  # @return [Array<Hash>] the list of all iPhones
235
180
  def self.all_iphones(refresh = false, api: JSS.api)
236
- all(refresh, api: API).select { |d| d[:model].start_with? 'iPhone' }
181
+ all(refresh, api: api).select { |d| d[:model].start_with? 'iPhone' }
237
182
  end
238
183
 
239
184
  # @return [Array<Hash>] the list of all iPads
240
185
  def self.all_ipads(refresh = false, api: JSS.api)
241
- all(refresh, api: API).select { |d| d[:model].start_with? 'iPad' }
186
+ all(refresh, api: api).select { |d| d[:model].start_with? 'iPad' }
242
187
  end
243
188
 
244
189
  # @return [Array<Hash>] the list of all iPads
245
190
  def self.all_apple_tvs(refresh = false, api: JSS.api)
246
- all(refresh, api: API).select { |d| d[:model_identifier].start_with? 'AppleTV' }
191
+ all(refresh, api: api).select { |d| d[:model_identifier].start_with? 'AppleTV' }
247
192
  end
248
193
 
249
- # Send an MDM command to one or more mobile devices by id or name
250
- #
251
- #
252
- # @param targets[String,Integer,Array<String,Integer>]
253
- # the name or id of the mobile devices to receive the command, or
254
- # an array of such names or ids, or a comma-separated string
255
- # of them.
256
- # @param command[Symbol] the command to send, one of the keys
257
- # of MDM_COMMANDS
258
- #
259
- # @param data[String] Some commands require extra data.
260
- #
261
- # @param api[JSS::APIConnection] the APi to query. Defaults to the
262
- # currently active API, see {JSS::APIConnection}
263
- #
264
- # @return [String] The uuid of the MDM command sent, if applicable
265
- # (blank pushes do not generate uuids)
266
- #
267
- def self.send_mdm_command(targets, command, data = nil, api: JSS.api)
268
- raise JSS::NoSuchItemError, "Unknown command '#{command}'" unless MDM_COMMANDS.keys.include? command
194
+ # Attributes
195
+ #####################################
269
196
 
270
- command = MDM_COMMANDS[command]
271
- cmd_rsrc = "#{MDM_RSRC}/#{command}"
197
+ ############
198
+ # The values returned in the General subset are stored as direct attributes
272
199
 
273
- if MDM_COMMANDS_REQUIRING_DATA.include? command
274
- raise "MDM command '#{command}' requires additional data." unless data
275
- cmd_rsrc << "/#{data}"
276
- end
200
+ # identifiers
201
+ ###########################
277
202
 
278
- targets = JSS.to_s_and_a(targets.to_s)[:arrayform] unless targets.is_a? Array
203
+ # @return [String]
204
+ attr_reader :serial_number
205
+ alias sn serial_number
206
+ alias serialnumber serial_number
279
207
 
280
- # make sure its an array of ids
281
- targets.map! do |md|
282
- if all_ids(api: api).include? md.to_i
283
- md.to_i
284
- elsif all_names(api: api).include? md
285
- map_all_ids_to(:name, api: api.invert[md])
286
- else
287
- raise JSS::NoSuchItemError, "No mobile device found matching '#{md}'"
288
- end # if
289
- end # map!
208
+ # @return [String]
209
+ attr_reader :udid
290
210
 
291
- cmd_rsrc << "/id/#{targets.join ','}"
211
+ # @return [String]
212
+ attr_reader :asset_tag
292
213
 
293
- result = api.post_rsrc cmd_rsrc, nil
294
- result =~ %r{<uuid>(.*)</uuid>}
295
- Regexp.last_match(1)
296
- end
214
+ # @return [String]
215
+ attr_reader :display_name
297
216
 
298
- def self.management_history(identifier, subset = nil, api: JSS.api)
299
- id = nil
300
- if identifier.is_a? Integer
301
- id = identifier
302
- else
303
- key = case identifier
304
- when *all_names(api: api) then :name
305
- when *all_serial_numbers(api: api) then :serial_number
306
- when *all_mac_addresses(api: api) then :mac_address
307
- when *all_udids(api: api) then :udid
308
- end
309
- id = map_all_ids_to(key, api: api).invert[identifier]
310
- end # if identifier.is_a? Integer
311
-
312
- raise JSS::NoSuchItemError, "No MobileDevice found matching #{identifier}" unless id && all_ids(api: api).include?(id)
313
-
314
- rsrc = "#{HISTORY_RSRC}/id/#{id}"
315
-
316
- if subset
317
- raise "subset must be one of: :#{HISTORY_SUBSETS.join ', :'}" unless HISTORY_SUBSETS.include? subset
318
- rsrc << "/subset/#{subset}"
319
- end
217
+ # @return [String]
218
+ attr_reader :device_name
320
219
 
321
- hist = api.get_rsrc(rsrc)[:mobile_device_history]
322
- subset ? hist[subset] : hist
323
- end
220
+ # @return [String] An Apple TV identifier
221
+ attr_reader :device_id
324
222
 
325
- # Attributes
326
- #####################################
223
+ # @return [String]
224
+ attr_reader :exchange_activesync_device_identifier
327
225
 
328
- ############
329
- # The values returned in the General and Location subset are stored as direct attributes
330
- # Here are the Location values
226
+ # settings
227
+ ###########################
228
+
229
+ # @return [Boolean] is this device managed?
230
+ attr_reader :managed
231
+ alias managed? managed
232
+
233
+ # @return [Boolean] is this device supervised?
234
+ attr_reader :supervised
235
+ alias supervised? supervised
236
+
237
+ # @return [String] the device_ownership_level
238
+ attr_reader :device_ownership_level
239
+
240
+ # @return [String] the tether state of the device
241
+ attr_reader :tethered
242
+
243
+ # @return [Boolean] is this device shared?
244
+ attr_reader :shared
245
+
246
+ # @return [Boolean] is this device ble_capable?
247
+ attr_reader :ble_capable
331
248
 
332
249
  # @return [String] the airplay passwd on devices that can receive AirPlay (i.e. apple tvs)
333
250
  attr_reader :airplay_password
334
251
 
335
- # @return [String] the asset tag
336
- attr_reader :asset_tag
252
+ # @return [String] the languages
253
+ attr_reader :languages
254
+
255
+ # @return [String] the locales
256
+ attr_reader :locales
257
+
258
+ # software
259
+ ###########################
260
+
261
+ # @return [String] the model firmware
262
+ attr_reader :modem_firmware
263
+
264
+ # @return [String] the OS version
265
+ attr_reader :os_version
266
+
267
+ # @return [String] the OS build
268
+ attr_reader :os_build
269
+
270
+ # @return [String] the OS type
271
+ attr_reader :os_type
272
+
273
+ # hardware
274
+ ###########################
275
+
276
+ # @return [String] the display name of the model
277
+ attr_reader :model
278
+
279
+ # @return [String] the display name of the model
280
+ attr_reader :model_number
281
+
282
+ # @return [String] the display name of the model
283
+ attr_reader :model_display
284
+
285
+ # @return [String] the model identifier
286
+ attr_reader :model_identifier
287
+
288
+ # usage
289
+ ##########################
337
290
 
338
291
  # @return [Intger] how much space available on the device?
339
292
  attr_reader :available_mb
293
+ alias available available_mb
340
294
 
341
295
  # @return [Integer] total storage on the device
342
296
  attr_reader :capacity_mb
297
+ alias capacity capacity_mb
343
298
 
344
299
  # @return [Integer] how much of the capacity is in use?
345
300
  attr_reader :percentage_used
346
301
 
347
302
  # @return [Integer] what percentage of the battery is remaining
348
303
  attr_reader :battery_level
304
+ alias battery_percent battery_level
305
+
306
+ # network
307
+ ##########################
349
308
 
350
309
  # @return [String] the bluetooth mac addr
351
310
  attr_reader :bluetooth_mac_address
@@ -353,26 +312,23 @@ module JSS
353
312
  # @return [String] the wifi mac addr
354
313
  attr_reader :wifi_mac_address
355
314
 
356
- # @return [Hash] !{:name=>"xxx", :id=>nnn} the computer associated with this device
357
- attr_reader :computer
315
+ # @return [String] the IP addr
316
+ attr_reader :ip_address
358
317
 
359
- # @return [String] what is this??
360
- attr_reader :device_id
318
+ # @return [String] the phone number of the device's SIM card
319
+ attr_reader :sim_phone_number
320
+ alias device_phone_number sim_phone_number
361
321
 
362
- # @return [String] the API's device_name and display_name are not used.
363
- attr_reader :name
322
+ # timestamps
323
+ ##########################
364
324
 
365
325
  # @return [Time] uses the value from the API's initial_entry_date_epoch
366
326
  attr_reader :initial_entry_date
367
327
 
368
- # @return [String] the IP addr
369
- attr_reader :ip_address
370
-
371
- # @return [String] the language setting
372
- attr_reader :languages
373
-
374
328
  # @return [Time] uses the value from the API's last_backup_time_epoch
375
329
  attr_reader :last_backup_time
330
+ alias last_backup_date last_backup_time
331
+ alias last_backup last_backup_time
376
332
 
377
333
  # @return [Time] uses the value from the API's last_inventory_update_utc
378
334
  attr_reader :last_inventory_update
@@ -380,50 +336,12 @@ module JSS
380
336
  # @return [Time] the last time this device enrolled in Jamf
381
337
  attr_reader :last_enrollment
382
338
 
383
- # @return [String] the locales
384
- attr_reader :locales
385
-
386
- # @return [Boolean] is this device managed?
387
- attr_reader :managed
388
-
389
- # @return [Boolean] is this device supervised?
390
- attr_reader :supervised
391
-
392
- # @return [String] the display name of the model
393
- attr_reader :model_display
394
- alias model model_display
395
-
396
- # @return [String] the model identifier
397
- attr_reader :model_identifier
339
+ # @return [Time] last_cloud_backup_date
340
+ attr_reader :last_cloud_backup_date
398
341
 
399
- # @return [String] the model firmware
400
- attr_reader :modem_firmware
401
-
402
- # @return [String] the OS version
403
- attr_reader :os_version
404
-
405
- # @return [String] the OS build
406
- attr_reader :os_build
407
-
408
- # @return [String] the phone number of the device's SIM card
409
- attr_reader :phone_number
342
+ # subsets
410
343
 
411
- # @return [String] the serial numbee
412
- attr_reader :serial_number
413
-
414
- # @return [String] the site associated with this device
415
- attr_reader :site
416
-
417
- # @return [Boolean] Is this device supervised?
418
- attr_reader :supervised
419
-
420
- # @return [String] the tether state of the device
421
- attr_reader :tethered
422
-
423
- # @return [String] the udid
424
- attr_reader :udid
425
-
426
- # @return [Array<Hash>] the applications on the devices
344
+ # @return [Array<Hash>] the applications on the device
427
345
  attr_reader :applications
428
346
 
429
347
  # @return [Array<Hash>]
@@ -494,449 +412,124 @@ module JSS
494
412
  # - :file_level_encryption_capable=>true
495
413
  attr_reader :security
496
414
 
497
- #####################################
498
415
  # Instance Methods
499
416
  #####################################
500
417
 
501
- #
502
418
  # @see APIObject#initialize
503
419
  #
420
+ # When creating new records with .make,
421
+ # udid:, serial_number:, and asset_tag: can be provided in
422
+ # the args.
423
+ #
504
424
  def initialize(args = {})
505
425
  super args
506
-
507
- gen = @init_data[:general]
508
- @airplay_password = gen[:airplay_password]
509
- @asset_tag = gen[:asset_tag]
510
- @available_mb = gen[:available_mb]
511
- @battery_level = gen[:battery_level]
512
- @bluetooth_mac_address = gen[:bluetooth_mac_address]
513
- @capacity_mb = gen[:capacity_mb]
514
- @computer = gen[:computer]
515
- @device_id = gen[:device_id]
516
- @device_name = gen[:device_name]
517
- @display_name = gen[:display_name]
518
- @initial_entry_date = JSS.epoch_to_time gen[:initial_entry_date_epoch]
519
- @ip_address = gen[:ip_address]
520
- @languages = gen[:languages]
521
- @last_backup_time = JSS.epoch_to_time gen[:last_backup_time_epoch]
522
- @last_inventory_update = JSS.epoch_to_time gen[:last_inventory_update_epoch]
523
- @last_enrollment = JSS.epoch_to_time gen[:last_enrollment_epoch]
524
- @locales = gen[:locales]
525
- @managed = gen[:managed]
526
- @supervised = gen[:supervised]
527
- @model_display = gen[:model_display]
528
- @model_identifier = gen[:model_identifier]
529
- @modem_firmware = gen[:modem_firmware]
530
- @os_build = gen[:os_build]
531
- @os_version = gen[:os_version]
532
- @percentage_used = gen[:percentage_used]
533
- @phone_number = gen[:phone_number]
534
- @serial_number = gen[:serial_number]
535
- @site = JSS::APIObject.get_name(gen[:site])
536
- @supervised = gen[:supervised]
537
- @tethered = gen[:tethered]
538
- @udid = gen[:udid]
539
- @wifi_mac_address = gen[:wifi_mac_address]
540
-
541
- @mobile_device_groups = @init_data[:mobile_device_groups]
542
- @network = @init_data[:network]
543
- @extension_attributes = @init_data[:extension_attributes]
544
- @certificates = @init_data[:certificates]
545
- @configuration_profiles = @init_data[:configuration_profiles]
546
- @provisioning_profiles = @init_data[:provisioning_profiles]
547
- @security = @init_data[:security]
548
- @applications = @init_data[:applications]
549
- end # initialize
550
-
551
- # Send a blank_push MDM command
552
- #
553
- # @see MobileDevice.send_mdm_command
554
- #
555
- # @return [String] The command uuid
556
- #
557
- def blank_push
558
- self.class.send_mdm_command @id, :blank_push, api: @api
559
- end #
560
-
561
- # Send an update_inventory MDM command
562
- #
563
- # @see MobileDevice.send_mdm_command
564
- #
565
- # @return [String] The command uuid
566
- #
567
- def update_inventory
568
- self.class.send_mdm_command @id, :update_inventory, api: @api
569
- end
570
-
571
- # Send a device_lock MDM command
572
- #
573
- # @param message[String] The message to display on the lock screen.
574
- #
575
- # @see MobileDevice.send_mdm_command
576
- #
577
- # @return [String] The command uuid
578
- #
579
- def device_lock(message)
580
- self.class.send_mdm_command @id, :device_lock, message, api: @api
581
- end
582
-
583
- # Send an erase_device MDM command
584
- #
585
- # @see MobileDevice.send_mdm_command
586
- #
587
- # @return [String] The command uuid
588
- #
589
- def erase_device
590
- self.class.send_mdm_command @id, :erase_device, api: @api
591
- end
592
-
593
- # Send a clear_passcode MDM command
594
- #
595
- # @see MobileDevice.send_mdm_command
596
- #
597
- # @return [String] The command uuid
598
- #
599
- def clear_passcode
600
- self.class.send_mdm_command @id, :clear_passcode, api: @api
601
- end
602
-
603
- # Send a unmanage_device MDM command
604
- #
605
- # @see MobileDevice.send_mdm_command
606
- #
607
- # @return [String] The command uuid
608
- #
609
- def unmanage_device
610
- @managed = false if self.class.send_mdm_command(@id, :unmanage_device, api: @api)
611
- end
612
-
613
- # Send a ClearRestrictionsPassword MDM command
614
- #
615
- # @see MobileDevice.send_mdm_command
616
- #
617
- # @return [String] The command uuid
618
- #
619
- def clear_restrictions_password
620
- self.class.send_mdm_command @id, :clear_restrictions_password, api: @api
621
- end
622
-
623
- # Send a SettingsEnableDataRoaming MDM command
624
- #
625
- # @see MobileDevice.send_mdm_command
626
- #
627
- # @return [String] The command uuid
628
- #
629
- def enable_data_roaming
630
- self.class.send_mdm_command @id, :enable_data_roaming, api: @api
631
- end
632
-
633
- # Send a disable_data_roaming MDM command
634
- #
635
- # @see MobileDevice.send_mdm_command
636
- #
637
- # @return [String] The command uuid
638
- #
639
- def disable_data_roaming
640
- self.class.send_mdm_command @id, :disable_data_roaming, api: @api
641
- end
642
-
643
- # Send a enable_voice_roaming MDM command
644
- #
645
- # @see MobileDevice.send_mdm_command
646
- #
647
- # @return [String] The command uuid
648
- #
649
- def enable_voice_roaming
650
- self.class.send_mdm_command @id, :enable_voice_roaming, api: @api
651
- end
652
-
653
- # Send a disable_voice_roaming MDM command
654
- #
655
- # @see MobileDevice.send_mdm_command
656
- #
657
- # @return [String] The command uuid
658
- #
659
- def disable_voice_roaming
660
- self.class.send_mdm_command @id, :disable_voice_roaming, api: @api
661
- end
662
-
663
- # Send a enable_app_analytics MDM command
664
- #
665
- # @see MobileDevice.send_mdm_command
666
- #
667
- # @return [String] The command uuid
668
- #
669
- def enable_app_analytics
670
- self.class.send_mdm_command @id, :enable_app_analytics, api: @api
671
- end
672
-
673
- # Send a disable_app_analytics MDM command
674
- #
675
- # @see MobileDevice.send_mdm_command
676
- #
677
- # @return [String] The command uuid
678
- #
679
- def disable_app_analytics
680
- self.class.send_mdm_command @id, :disable_app_analytics, api: @api
681
- end
682
-
683
- # Send a enable_diagnostic_submission MDM command
684
- #
685
- # @see MobileDevice.send_mdm_command
686
- #
687
- # @return [String] The command uuid
688
- #
689
- def enable_diagnostic_submission
690
- self.class.send_mdm_command @id, :enable_diagnostic_submission, api: @api
691
- end
692
-
693
- # Send a disable_diagnostic_submission MDM command
694
- #
695
- # @see MobileDevice.send_mdm_command
696
- #
697
- # @return [String] The command uuid
698
- #
699
- def disable_diagnostic_submission
700
- self.class.send_mdm_command @id, :disable_diagnostic_submission, api: @api
701
- end
702
-
703
- # Send a device_name MDM command
704
- #
705
- # @param new_name[String] The name for the device
706
- #
707
- # @see MobileDevice.send_mdm_command
708
- #
709
- # @return [String] The command uuid
710
- #
711
- def device_name(new_name)
712
- self.class.send_mdm_command @id, :device_name, new_name, api: @api
713
- end
714
-
715
- # Send a shutdown device MDM command
716
- #
717
- # @see MobileDevice.send_mdm_command
718
- #
719
- # @return [String] The command uuid
720
- #
721
- def shutdown
722
- self.class.send_mdm_command @id, :shutdown, api: @api
723
- end
724
-
725
- # Send a restart device MDM command
726
- #
727
- # @see MobileDevice.send_mdm_command
728
- #
729
- # @return [String] The command uuid
730
- #
731
- def restart
732
- self.class.send_mdm_command @id, :restart, api: @api
733
- end
734
-
735
- # The full management History data for this Mobile Device
736
- #
737
- # @return [Hash] Keys are:
738
- # general: Hash of identifiers
739
- # user_location: see user_location_history
740
- # management_commands: see management_command_history
741
- # audits: see audit_history
742
- # applications: see managed_app_history
743
- # ebooks: see managed
744
- #
745
- def management_history
746
- self.class.management_history @id, api: @api
747
- end
748
-
749
- # The user_location subset of the full history
750
- #
751
- # @return [Array<Hash>] Each hash contains user and location data
752
- # and the timestamp as a JSS epoch value or string.
753
- # use JSS.epoch_to_time or JSS.parse_time to convert them to Time
754
- # objects
755
- #
756
- def user_location_history
757
- self.class.management_history @id, :user_location, api: @api
758
- end
759
-
760
- # The management_commands subset of the full history
761
- #
762
- # @return [Hash] A hash of :completed, :pending, and :failed
763
- # mdm commands, each being an array of hashes.
764
- # see #completed_mdm_commands, #pending_mdm_commands and
765
- # #failed_mdm_commands
766
- #
767
- def management_command_history
768
- self.class.management_history @id, :management_commands, api: @api
769
- end
770
- alias mdm_command_history management_command_history
771
-
772
- # The history of completed mdm commands.
773
- #
774
- # @return [Array<Hash>] Each hash contains a command name and
775
- # and the timestamp as a JSS epoch value or string.
776
- # use JSS.epoch_to_time or JSS.parse_time to convert them to Time
777
- # objects
778
- #
779
- def completed_mdm_commands
780
- management_command_history[:completed]
781
- end
782
-
783
- # The currently pending mdm commands.
784
- #
785
- # @return [Array<Hash>] Each hash contains a command name and a :status
786
- # and a a timestamp as a JSS epoch value or string.
787
- # use JSS.epoch_to_time or JSS.parse_time to convert them to Time
788
- # objects
789
- #
790
- def pending_mdm_commands
791
- management_command_history[:pending]
792
- end
793
-
794
- # The history of failed mdm commands.
795
- #
796
- # @return [Array<Hash>] Each hash contains a command name and an :error
797
- # message and timestamps for issuance and failure as JSS epoch values
798
- # or strings. use JSS.epoch_to_time or JSS.parse_time to convert them to
799
- # Time objects
800
- #
801
- def failed_mdm_commands
802
- management_command_history[:failed]
803
- end
804
-
805
- # The applications subset of the full history
806
- #
807
- # @return [Hash] Keys are :installed, :pending, and :failed
808
- # See #installed_managed_apps, #pending_managed_apps and
809
- # #failed_managed_apps
810
- #
811
- def managed_app_history
812
- self.class.management_history @id, :applications, api: @api
813
- end
814
-
815
- # The apps that have been installed via MDM
816
- #
817
- # @param from[Symbol] :in_house, :app_store, :other, or :all.
818
- # Defaults to :all
819
- #
820
- # @return [Hash{Array<Hash>}] When from = :all, all three sources.
821
- #
822
- # @return [Array<Hash>] When from = :in_house, :app_store, or :other
823
- # the managed apps that have been installed from that source.
824
- # Each Hash includes these keys:
825
- # name:
826
- # version:
827
- # short_version:
828
- # management_status:
829
- # bundle_size:
830
- # dynamic_size:
831
- #
832
- def installed_managed_apps(from = :all)
833
- all = managed_app_history[:installed]
834
- case from
835
- when :all
836
- all
837
- when :in_house
838
- all[:in_house_from_mobile_device_app_catalog]
839
- when :app_store
840
- all[:app_store_from_mobile_device_app_catalog]
841
- when :other
842
- all[:other]
426
+ if @in_jss
427
+
428
+ gen = @init_data[:general]
429
+
430
+ # identifiers
431
+ @serial_number = gen[:serial_number]
432
+ @udid = gen[:udid]
433
+ @asset_tag = gen[:asset_tag]
434
+ @device_id = gen[:device_id]
435
+ @device_name = gen[:device_name]
436
+ @display_name = gen[:display_name]
437
+ @exchange_activesync_device_identifier = gen[:exchange_activesync_device_identifier]
438
+
439
+ # settings
440
+ @managed = gen[:managed]
441
+ @supervised = gen[:supervised]
442
+ @device_ownership_level = gen[:device_ownership_level]
443
+ @tethered = gen[:tethered]
444
+ @shared = gen[:shared]
445
+ @ble_capable = gen[:ble_capable]
446
+
447
+ @airplay_password = gen[:airplay_password]
448
+ @languages = gen[:languages]
449
+ @locales = gen[:locales]
450
+
451
+ # software
452
+ @os_type = gen[:os_type]
453
+ @os_build = gen[:os_build]
454
+ @os_version = gen[:os_version]
455
+ @modem_firmware = gen[:modem_firmware]
456
+
457
+ # hardware
458
+ @model = gen[:model]
459
+ @model_number = gen[:model_number]
460
+ @model_identifier = gen[:model_identifier]
461
+ @model_display = gen[:model_display]
462
+
463
+ # usage
464
+ @capacity_mb = gen[:capacity_mb]
465
+ @available_mb = gen[:available_mb]
466
+ @percentage_used = gen[:percentage_used]
467
+ @battery_level = gen[:battery_level]
468
+
469
+ # network
470
+ @bluetooth_mac_address = gen[:bluetooth_mac_address]
471
+ @wifi_mac_address = gen[:wifi_mac_address]
472
+ @sim_phone_number = gen[:phone_number]
473
+ @ip_address = gen[:ip_address]
474
+
475
+ # timestamps
476
+ @initial_entry_date = JSS.epoch_to_time gen[:initial_entry_date_epoch]
477
+ @last_backup_time = JSS.epoch_to_time gen[:last_backup_time_epoch]
478
+ @last_cloud_backup_date = JSS.epoch_to_time gen[:last_cloud_backup_date_epoch]
479
+ @last_inventory_update = JSS.epoch_to_time gen[:last_inventory_update_epoch]
480
+ @last_enrollment = JSS.epoch_to_time gen[:last_enrollment_epoch]
481
+
482
+ # subsets
483
+ @mobile_device_groups = @init_data[:mobile_device_groups]
484
+ @network = @init_data[:network]
485
+ @extension_attributes = @init_data[:extension_attributes]
486
+ @certificates = @init_data[:certificates]
487
+ @configuration_profiles = @init_data[:configuration_profiles]
488
+ @provisioning_profiles = @init_data[:provisioning_profiles]
489
+ @security = @init_data[:security]
490
+ @applications = @init_data[:applications]
843
491
  else
844
- raise JSS::InvalidDataError, "Unknown mobiledevice app source: '#{from}'"
492
+ @udid = args[:udid]
493
+ @serial_number = args[:serial_number]
494
+ @asset_tag = args[:asset_tag]
845
495
  end
846
- end
496
+ end # initialize
847
497
 
848
- # An array of pending managed app installs.
849
- #
850
- # @return [Array<Hash>] Hashes for each pending app install
851
- #
852
- def pending_managed_apps
853
- managed_app_history[:pending]
498
+ def name=(new_name)
499
+ super
500
+ @needs_mdm_name_change = true if managed? && supervised?
854
501
  end
855
502
 
856
- # An array of data about failed managed app installs
857
- #
858
- # @return [Array<Hash>] The name: and version: of each failed app install.
859
503
  #
860
- def failed_managed_apps
861
- managed_app_history[:failed]
504
+ def serial_number=(new_val)
505
+ return nil if new_val == @serial_number
506
+ @serial_number = new_val.empty? ? new_val : JSS::Validate.unique_identifier(self.class, :serial_number, new_val, api: api)
507
+ @need_to_update = true
862
508
  end
863
509
 
864
- # The audits subset of the full history
865
- # The history of 'auditable' events.
866
510
  #
867
- # @return [Array<Hash>] One hash per event
868
- #
869
- def audit_history
870
- self.class.management_history @id, :audits, api: @api
511
+ def udid=(new_val)
512
+ return nil if new_val == @udid
513
+ @udid = new_val.empty? ? new_val : JSS::Validate.unique_identifier(self.class, :udid, new_val, api: api)
514
+ @need_to_update = true
871
515
  end
872
516
 
873
- # The ebooks subset of the full history
874
- #
875
- # @return [Hash] Keys are :installed, :pending, and :failed
876
- # See #installed_managed_ebooks, #pending_managed_ebooks and
877
- # #failed_managed_ebooks
878
517
  #
879
- def managed_ebook_history
880
- self.class.management_history @id, :ebooks, api: @api
518
+ def asset_tag=(new_val)
519
+ return nil if @asset_tag == new_val
520
+ new_val.strip!
521
+ @asset_tag = new_val
522
+ @need_to_update = true
881
523
  end
882
524
 
883
- # The ebooks that have been installed via MDM
884
- #
885
- # @param from[Symbol] :in_house, :ibookstore, or :all.
886
- # Defaults to :all
887
- #
888
- # @return [Hash{Array<Hash>}] When from = :all, all three sources.
889
525
  #
890
- # @return [Array<Hash>] When from = :in_house, :app_store, or :other
891
- # the managed apps that have been installed from that source.
892
- #
893
- def installed_managed_ebooks(from = :all)
894
- all = managed_ebook_history[:installed]
895
- case from
896
- when :all
897
- all
898
- when :in_house
899
- all[:inhouse]
900
- when :ibookstore
901
- all[:ibookstore]
902
- else
903
- raise JSS::InvalidDataError, "Unknown ebook source: '#{from}'"
904
- end
905
- end
906
-
907
- # Mananged ebooks pending installation
908
- #
909
- # @return [Array<Hash>] The pending ebooks
910
- #
911
- def pending_managed_ebooks
912
- managed_ebook_history[:pending]
913
- end
914
-
915
- # Mananged ebooks tha failed installation
916
- #
917
- # @return [Array<Hash>] The failed ebook installs
918
- #
919
- def failed_managed_ebooks
920
- managed_ebook_history[:failed]
526
+ def update
527
+ super
528
+ return unless @needs_mdm_name_change
529
+ set_device_mame @name if managed? && supervised?
530
+ @needs_mdm_name_change = false
921
531
  end
922
532
 
923
-
924
- # Aliases
925
- alias battery_percent battery_level
926
- alias managed? managed
927
- alias sn serial_number
928
- alias serialnumber serial_number
929
-
930
- alias noop blank_push
931
- alias send_blank_push blank_push
932
- alias recon update_inventory
933
- alias lock device_lock
934
- alias lock_device device_lock
935
- alias erase erase_device
936
- alias wipe erase_device
937
- alias unmanage unmanage_device
938
- alias make_unmanaged unmanage_device
939
-
940
533
  # private methods
941
534
  ##############################
942
535
 
@@ -945,12 +538,16 @@ module JSS
945
538
  def rest_xml
946
539
  doc = REXML::Document.new APIConnection::XML_HEADER
947
540
  md = doc.add_element self.class::RSRC_OBJECT_KEY.to_s
541
+ general = md.add_element('general')
542
+ general.add_element('name').text = @name
543
+ general.add_element('udid').text = @udid
544
+ general.add_element('serial_number').text = @serial_number
545
+ general.add_element('asset_tag').text = @asset_tag
948
546
 
949
- md << ext_attr_xml if @changed_eas && !@changed_eas.empty?
950
-
547
+ md << ext_attr_xml if unsaved_eas?
951
548
  md << location_xml if has_location?
952
549
  md << purchasing_xml if has_purchasing?
953
-
550
+ add_site_to_xml doc
954
551
  doc.to_s
955
552
  end
956
553