ruby-jss 1.4.1 → 1.5.1

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.

Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.md +38 -0
  3. data/lib/jamf.rb +10 -3
  4. data/lib/jamf/api/abstract_classes/collection_resource.rb +329 -150
  5. data/lib/jamf/api/abstract_classes/generic_reference.rb +9 -1
  6. data/lib/jamf/api/abstract_classes/json_object.rb +106 -82
  7. data/lib/jamf/api/abstract_classes/prestage.rb +54 -29
  8. data/lib/jamf/api/abstract_classes/prestage_skip_setup_items.rb +21 -0
  9. data/lib/jamf/api/abstract_classes/resource.rb +4 -4
  10. data/lib/jamf/api/abstract_classes/singleton_resource.rb +1 -1
  11. data/lib/jamf/api/connection.rb +13 -9
  12. data/lib/jamf/api/connection/api_error.rb +8 -8
  13. data/lib/jamf/api/connection/token.rb +16 -15
  14. data/lib/jamf/api/json_objects/computer_prestage_skip_setup_items.rb +14 -1
  15. data/lib/jamf/api/json_objects/device_enrollment_device.rb +14 -7
  16. data/lib/jamf/api/json_objects/device_enrollment_device_sync_state.rb +81 -0
  17. data/lib/jamf/api/json_objects/locale.rb +59 -0
  18. data/lib/jamf/api/json_objects/md_prestage_skip_setup_items.rb +50 -1
  19. data/lib/jamf/api/json_objects/prestage_location.rb +3 -3
  20. data/lib/jamf/api/json_objects/prestage_purchasing_data.rb +7 -7
  21. data/lib/jamf/api/json_objects/prestage_scope.rb +1 -1
  22. data/lib/jamf/api/{resources/collection_resources → json_objects}/time_zone.rb +9 -23
  23. data/lib/jamf/api/mixins/bulk_deletable.rb +27 -6
  24. data/lib/jamf/api/mixins/change_log.rb +201 -51
  25. data/lib/jamf/api/mixins/filterable.rb +51 -0
  26. data/lib/jamf/api/mixins/pageable.rb +208 -0
  27. data/lib/jamf/api/mixins/sortable.rb +59 -0
  28. data/lib/jamf/api/resources/collection_resources/building.rb +19 -8
  29. data/lib/jamf/api/resources/collection_resources/category.rb +5 -3
  30. data/lib/jamf/api/resources/collection_resources/computer_prestage.rb +11 -4
  31. data/lib/jamf/api/resources/collection_resources/device_enrollment.rb +10 -10
  32. data/lib/jamf/api/resources/collection_resources/inventory_preload_record.rb +11 -3
  33. data/lib/jamf/api/resources/collection_resources/mobile_device_prestage.rb +24 -22
  34. data/lib/jamf/api/resources/collection_resources/script.rb +61 -25
  35. data/lib/jamf/api/resources/singleton_resources/app_store_country_codes.rb +15 -5
  36. data/lib/jamf/api/resources/singleton_resources/client_checkin_settings.rb +14 -14
  37. data/lib/jamf/api/resources/singleton_resources/locales.rb +155 -0
  38. data/lib/jamf/api/resources/singleton_resources/time_zones.rb +213 -0
  39. data/lib/jamf/validate.rb +63 -24
  40. data/lib/jamf/version.rb +1 -1
  41. data/lib/jss.rb +2 -1
  42. data/lib/jss/api_connection.rb +110 -370
  43. data/lib/jss/api_object.rb +3 -19
  44. data/lib/jss/api_object/categorizable.rb +1 -1
  45. data/lib/jss/api_object/configuration_profile.rb +34 -3
  46. data/lib/jss/api_object/directory_binding_type.rb +66 -60
  47. data/lib/jss/api_object/directory_binding_type/active_directory.rb +71 -34
  48. data/lib/jss/api_object/directory_binding_type/admitmac.rb +536 -467
  49. data/lib/jss/api_object/directory_binding_type/centrify.rb +21 -7
  50. data/lib/jss/api_object/directory_binding_type/open_directory.rb +4 -4
  51. data/lib/jss/api_object/distribution_point.rb +2 -2
  52. data/lib/jss/api_object/dock_item.rb +102 -96
  53. data/lib/jss/api_object/extendable.rb +1 -1
  54. data/lib/jss/api_object/group.rb +33 -2
  55. data/lib/jss/api_object/network_segment.rb +43 -12
  56. data/lib/jss/api_object/patch_source.rb +10 -9
  57. data/lib/jss/api_object/printer.rb +10 -4
  58. data/lib/jss/api_object/scopable.rb +10 -15
  59. data/lib/jss/exceptions.rb +3 -0
  60. data/lib/jss/server.rb +15 -0
  61. data/lib/jss/version.rb +1 -1
  62. metadata +37 -22
@@ -106,7 +106,7 @@ module JSS
106
106
  # @return [void]
107
107
  def workstation_mode=(newvalue)
108
108
 
109
- raise JSS::InvalidDataError, "workstation_mode must be true or false." unless newvalue.is_a? Bool
109
+ raise JSS::InvalidDataError, "workstation_mode must be true or false." unless newvalue.is_a?(TrueClass) || newvalue.is_a(FalseClass)
110
110
 
111
111
  @workstation_mode = newvalue
112
112
 
@@ -125,7 +125,7 @@ module JSS
125
125
  # @return [void]
126
126
  def overwrite_existing=(newvalue)
127
127
 
128
- raise JSS::InvalidDataError, "overwrite_existing must be true or false." unless newvalue.is_a? Bool
128
+ raise JSS::InvalidDataError, "overwrite_existing must be true or false." unless newvalue.is_a?(TrueClass) || newvalue.is_a(FalseClass)
129
129
 
130
130
  @overwrite_existing = newvalue
131
131
 
@@ -144,7 +144,7 @@ module JSS
144
144
  # @return [void]
145
145
  def update_PAM=(newvalue)
146
146
 
147
- raise JSS::InvalidDataError, "update_PAM must be true or false." unless newvalue.is_a? Bool
147
+ raise JSS::InvalidDataError, "update_PAM must be true or false." unless newvalue.is_a?(TrueClass) || newvalue.is_a(FalseClass)
148
148
 
149
149
  @update_PAM = newvalue
150
150
 
@@ -163,9 +163,16 @@ module JSS
163
163
  # @return [void]
164
164
  def zone=(newvalue)
165
165
 
166
- raise JSS::InvalidDataError, "zone must be a string." unless newvalue.is_a? String
166
+ new =
167
+ if newvalue.to_s.empty?
168
+ JSS::BLANK
169
+ else
170
+ # Data Check
171
+ raise JSS::InvalidDataError, "zone must be a string." unless newvalue.is_a? String
172
+ newvalue
173
+ end
167
174
 
168
- @zone = newvalue
175
+ @zone = new
169
176
 
170
177
  self.container&.should_update
171
178
  end
@@ -182,9 +189,16 @@ module JSS
182
189
  # @return [void]
183
190
  def preferred_domain_server=(newvalue)
184
191
 
185
- raise JSS::InvalidDataError, "preferred_domain_server must be a string." unless newvalue.is_a? String
192
+ new =
193
+ if newvalue.to_s.empty?
194
+ JSS::BLANK
195
+ else
196
+ # Data Check
197
+ raise JSS::InvalidDataError, "preferred_domain_server must be a string." unless newvalue.is_a? String
198
+ newvalue
199
+ end
186
200
 
187
- @preferred_domain_server = newvalue
201
+ @preferred_domain_server = new
188
202
 
189
203
  self.container&.should_update
190
204
  end
@@ -93,7 +93,7 @@ module JSS
93
93
  # @return [void]
94
94
  def encrypt_using_ssl=(newvalue)
95
95
 
96
- raise JSS::InvalidDataError, "encrypt_using_ssl must be true or false." unless newvalue.is_a? Bool
96
+ raise JSS::InvalidDataError, "encrypt_using_ssl must be true or false." unless newvalue.is_a?(TrueClass) || newvalue.is_a(FalseClass)
97
97
 
98
98
  @encrypt_using_ssl = newvalue
99
99
 
@@ -112,7 +112,7 @@ module JSS
112
112
  # @return [void]
113
113
  def perform_secure_bind=(newvalue)
114
114
 
115
- raise JSS::InvalidDataError, "perform_secure_bind must be true or false." unless newvalue.is_a? Bool
115
+ raise JSS::InvalidDataError, "perform_secure_bind must be true or false." unless newvalue.is_a?(TrueClass) || newvalue.is_a(FalseClass)
116
116
 
117
117
  @perform_secure_bind = newvalue
118
118
 
@@ -131,7 +131,7 @@ module JSS
131
131
  # @return [void]
132
132
  def use_for_authentication=(newvalue)
133
133
 
134
- raise JSS::InvalidDataError, "use_for_authentication must be true or false." unless newvalue.is_a? Bool
134
+ raise JSS::InvalidDataError, "use_for_authentication must be true or false." unless newvalue.is_a?(TrueClass) || newvalue.is_a(FalseClass)
135
135
 
136
136
  @use_for_authentication = newvalue
137
137
 
@@ -150,7 +150,7 @@ module JSS
150
150
  # @return [void]
151
151
  def use_for_contacts=(newvalue)
152
152
 
153
- raise JSS::InvalidDataError, "use_for_contacts must be true or false." unless newvalue.is_a? Bool
153
+ raise JSS::InvalidDataError, "use_for_contacts must be true or false." unless newvalue.is_a?(TrueClass) || newvalue.is_a(FalseClass)
154
154
 
155
155
  @use_for_contacts = newvalue
156
156
 
@@ -407,9 +407,9 @@ module JSS
407
407
 
408
408
  begin
409
409
  mount pw, :rw
410
- return :mountable
410
+ :mountable
411
411
  rescue
412
- return false
412
+ false
413
413
  ensure
414
414
  unmount
415
415
  end
@@ -24,8 +24,9 @@
24
24
  ###
25
25
 
26
26
  module JSS
27
-
28
- # Module Variables
27
+
28
+
29
+ # Module Variables
29
30
  #####################################
30
31
 
31
32
  # Module Methods
@@ -40,98 +41,103 @@ module JSS
40
41
  # @see JSS::APIObject
41
42
  #
42
43
  class DockItem < JSS::APIObject
43
-
44
- # Mix-Ins
45
- #####################################
46
- include JSS::Creatable
47
- include JSS::Updatable
48
-
49
- # Class Methods
50
- #####################################
51
-
52
- # Class Constants
53
- #####################################
54
-
55
- # The Dock Item type
56
- DOCK_ITEM_TYPE = [
57
- "App",
58
- "File",
59
- "Folder"
60
- ].freeze
61
-
62
- # The base for REST resources of this class
63
- RSRC_BASE = 'dockitems'.freeze
64
-
65
- # the hash key used for the JSON list output of all objects in the JSS
66
- RSRC_LIST_KEY = :dock_items
67
-
68
- # The hash key used for the JSON object output.
69
- # It's also used in various error messages
70
- RSRC_OBJECT_KEY = :dock_item
71
-
72
- # the object type for this object in
73
- # the object history table.
74
- # See {APIObject#add_object_history_entry}
75
- #OBJECT_HISTORY_OBJECT_TYPE = 41
76
-
77
- # Attributes
78
- #####################################
79
- attr_reader :id
80
- attr_reader :name
81
- attr_reader :type
82
- attr_reader :path
83
-
84
- # Constructor
85
- # @see JSS::APIObject.initialize
86
- #####################################
87
- def initialize(args = {})
88
- super args
89
-
90
- @type = "App" unless !@init_data[:type].nil?
91
- @type = @init_data[:type]
92
- @path = @init_data[:path]
93
- end
94
-
95
- # Public Instance Methods
96
- #####################################
97
-
98
- # set the type
99
- #
100
- # @param newval[String] the new app type
101
- #
102
- # @return [void]
103
- #
104
- def type=(newval)
105
- raise JSS::InvalidDataError, 'Type must be a string' unless message.is_a? String
106
- raise JSS::InvalidDataError, "Type must be one of the following: #{DOCK_ITEM_TYPE.to_s}; not #{newval.to_s}" unless DOCK_ITEM_TYPE.include? newval.to_s
107
- @type = newval
108
- @need_to_update = true
109
- end
110
-
111
- # set the path
112
- #
113
- # @param newval[String] the new app path
114
- def path=(newval)
115
- raise JSS::InvalidDataError, 'Path must be a String' unless newval.is_a? String
116
- @path = newval
117
- @need_to_update = true
118
- end
119
-
120
- # private instance methods
121
- ######################
122
- private
123
-
124
- # the xml formated data for adding or updating this in the JSS
125
- #
126
- def rest_xml
127
- doc = REXML::Document.new APIConnection::XML_HEADER
128
- ns = doc.add_element RSRC_OBJECT_KEY.to_s
129
- ns.add_element('name').text = @name
130
- ns.add_element('type').text = @type.to_s
131
- ns.add_element('path').text = @path.to_s
132
- doc.to_s
133
- end # rest_xml
44
+
45
+
46
+ # Mix-Ins
47
+ #####################################
48
+ include JSS::Creatable
49
+ include JSS::Updatable
50
+
51
+ # Class Methods
52
+ #####################################
53
+
54
+ # Class Constants
55
+ #####################################
56
+
57
+ # The Dock Item type
58
+ DOCK_ITEM_TYPE = %w[
59
+ App
60
+ File
61
+ Folder
62
+ ].freeze
63
+
64
+ # The base for REST resources of this class
65
+ RSRC_BASE = 'dockitems'.freeze
66
+
67
+ # the hash key used for the JSON list output of all objects in the JSS
68
+ RSRC_LIST_KEY = :dock_items
69
+
70
+ # The hash key used for the JSON object output.
71
+ # It's also used in various error messages
72
+ RSRC_OBJECT_KEY = :dock_item
73
+
74
+ # the object type for this object in
75
+ # the object history table.
76
+ # See {APIObject#add_object_history_entry}
77
+ # OBJECT_HISTORY_OBJECT_TYPE = 41
78
+
79
+ # Attributes
80
+ #####################################
81
+ attr_reader :id
82
+ attr_reader :name
83
+ attr_reader :type
84
+ attr_reader :path
85
+
86
+ # Constructor
87
+ # @see JSS::APIObject.initialize
88
+ #####################################
89
+ def initialize(args = {})
90
+ super args
91
+
92
+ @type = 'App' if @init_data[:type].nil?
93
+ @type = @init_data[:type]
94
+ @path = @init_data[:path]
95
+ end
96
+
97
+ # Public Instance Methods
98
+ #####################################
99
+
100
+ # set the type
101
+ #
102
+ # @param newval[String] the new app type
103
+ #
104
+ # @return [void]
105
+ #
106
+ def type=(newval)
107
+ raise JSS::InvalidDataError, 'Type must be a string' unless newval.is_a? String
108
+ raise JSS::InvalidDataError, "Type must be one of the following: #{DOCK_ITEM_TYPE}; not #{newval}" unless DOCK_ITEM_TYPE.include? newval.to_s
109
+
110
+ @type = newval
111
+ @need_to_update = true
112
+ end
113
+
114
+ # set the path
115
+ #
116
+ # @param newval[String] the new app path
117
+ def path=(newval)
118
+ raise JSS::InvalidDataError, 'Path must be a String' unless newval.is_a? String
119
+
120
+ @path = newval
121
+ @need_to_update = true
134
122
  end
135
-
136
-
137
- end
123
+
124
+ # private instance methods
125
+ ######################
126
+ private
127
+
128
+ # the xml formated data for adding or updating this in the JSS
129
+ #
130
+ def rest_xml
131
+ doc = REXML::Document.new APIConnection::XML_HEADER
132
+ ns = doc.add_element RSRC_OBJECT_KEY.to_s
133
+ ns.add_element('name').text = @name
134
+ ns.add_element('type').text = @type.to_s
135
+ ns.add_element('path').text = @path.to_s
136
+ doc.to_s
137
+ end # rest_xml
138
+
139
+ end
140
+
141
+
142
+
143
+ end
@@ -23,7 +23,6 @@
23
23
  #
24
24
  #
25
25
 
26
- #
27
26
  module JSS
28
27
 
29
28
  # Sub-Modules
@@ -221,6 +220,7 @@ module JSS
221
220
  eaxml = REXML::Element.new('extension_attributes')
222
221
  @extension_attributes.each do |ea|
223
222
  next unless @changed_eas.include? ea[:name]
223
+
224
224
  ea_el = eaxml.add_element('extension_attribute')
225
225
  ea_el.add_element('name').text = ea[:name]
226
226
 
@@ -241,7 +241,7 @@ module JSS
241
241
  #
242
242
  # @param retries [Integer] If calculate_members is true, refetching the
243
243
  # group to re-read the membership can happen too fast, the JSS won't know
244
- # it exists yet and will throw a RestClient::NotFound error. If that
244
+ # it exists yet and will throw a NoSuchItem error. If that
245
245
  # happens, try again this many times with a 1 second pause between attempts.
246
246
  #
247
247
  def create(calculate_members: true, retries: 10)
@@ -256,7 +256,7 @@ module JSS
256
256
  begin
257
257
  refresh_members
258
258
  break
259
- rescue RestClient::NotFound
259
+ rescue
260
260
  sleep 1
261
261
  tries += 1
262
262
  end # begin
@@ -311,6 +311,37 @@ module JSS
311
311
  super
312
312
  end
313
313
 
314
+ # Change static group to smart group
315
+ #
316
+ # @param args[Hash] the options and settings use for switching the computer group from static group to smart group
317
+ #
318
+ # @option args criteria[Array] The criterias to be user for the smart group
319
+ def set_smart(*params)
320
+ return if @is_smart
321
+
322
+ params[:criteria] = [] if params[:criteria].nil?
323
+
324
+ criteria = params[:criteria]
325
+
326
+ @is_smart = true
327
+ @need_to_update = true
328
+ end
329
+
330
+ # Change smart group to static group
331
+ #
332
+ # @param args[Hash] the options and settings use for switching the computer group from smart group to static group
333
+ #
334
+ # @option args preserve_members[Boolean] Should the smart group preserve it's current members?
335
+ def set_static(*params)
336
+ return unless @is_smart
337
+
338
+ preserve_members = params.include? :preserve_members
339
+
340
+ @is_smart = false
341
+
342
+ clear() unless preserve_members
343
+ end
344
+
314
345
  # How many members of the group?
315
346
  #
316
347
  # @return [Integer] the number of members of the group
@@ -459,9 +459,17 @@ module JSS
459
459
  ### @return [void]
460
460
  ###
461
461
  def building=(newval)
462
- new = JSS::Building.all.select { |b| (b[:id] == newval) || (b[:name] == newval) }[0]
463
- raise JSS::MissingDataError, "No building matching '#{newval}'" unless new
464
- @building = new[:name]
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 = JSS::Department.all.select { |b| (b[:id] == newval) || (b[:name] == newval) }[0]
488
- raise JSS::MissingDataError, "No department matching '#{newval}' in the JSS" unless new
489
- @department = new[:name]
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 = JSS::NetbootServer.all.select { |b| (b[:id] == newval) || (b[:name] == newval) }[0]
535
- raise JSS::MissingDataError, "No netboot_server matching '#{newval}' in the JSS" unless new
536
- @netboot_server = new[:name]
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 = JSS::SoftwareUpdateServer.all.select { |b| (b[:id] == newval) || (b[:name] == newval) }[0]
548
- raise JSS::MissingDataError, "No swu_server matching '#{newval}' in the JSS" unless new
549
- @swu_server = new[:name]
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