ruby-jss 0.10.0 → 0.10.1a2

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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/lib/jss/api_object.rb +102 -0
  3. data/lib/jss/api_object/advanced_search/advanced_computer_search.rb +4 -0
  4. data/lib/jss/api_object/advanced_search/advanced_mobile_device_search.rb +5 -0
  5. data/lib/jss/api_object/advanced_search/advanced_user_search.rb +5 -0
  6. data/lib/jss/api_object/building.rb +5 -0
  7. data/lib/jss/api_object/category.rb +5 -0
  8. data/lib/jss/api_object/computer.rb +7 -2
  9. data/lib/jss/api_object/computer_invitation.rb +5 -0
  10. data/lib/jss/api_object/department.rb +26 -21
  11. data/lib/jss/api_object/distribution_point.rb +5 -0
  12. data/lib/jss/api_object/ebook.rb +5 -0
  13. data/lib/jss/api_object/extendable.rb +123 -148
  14. data/lib/jss/api_object/extension_attribute.rb +242 -301
  15. data/lib/jss/api_object/extension_attribute/computer_extension_attribute.rb +5 -0
  16. data/lib/jss/api_object/extension_attribute/mobile_device_extension_attribute.rb +14 -9
  17. data/lib/jss/api_object/extension_attribute/user_extension_attribute.rb +40 -35
  18. data/lib/jss/api_object/group/computer_group.rb +11 -6
  19. data/lib/jss/api_object/group/mobile_device_group.rb +11 -6
  20. data/lib/jss/api_object/group/user_group.rb +16 -11
  21. data/lib/jss/api_object/ldap_server.rb +5 -0
  22. data/lib/jss/api_object/mac_application.rb +5 -0
  23. data/lib/jss/api_object/mobile_device.rb +5 -0
  24. data/lib/jss/api_object/mobile_device_application.rb +5 -0
  25. data/lib/jss/api_object/mobile_device_configuration_profile.rb +5 -0
  26. data/lib/jss/api_object/netboot_server.rb +11 -6
  27. data/lib/jss/api_object/network_segment.rb +5 -0
  28. data/lib/jss/api_object/osx_configuration_profile.rb +4 -0
  29. data/lib/jss/api_object/package.rb +5 -0
  30. data/lib/jss/api_object/peripheral.rb +4 -0
  31. data/lib/jss/api_object/peripheral_type.rb +11 -6
  32. data/lib/jss/api_object/policy.rb +5 -0
  33. data/lib/jss/api_object/removable_macaddr.rb +28 -23
  34. data/lib/jss/api_object/restricted_software.rb +5 -0
  35. data/lib/jss/api_object/script.rb +5 -0
  36. data/lib/jss/api_object/site.rb +29 -24
  37. data/lib/jss/api_object/software_update_server.rb +11 -6
  38. data/lib/jss/api_object/user.rb +5 -0
  39. data/lib/jss/api_object/webhook.rb +5 -0
  40. data/lib/jss/version.rb +1 -1
  41. metadata +4 -4
@@ -1,167 +1,133 @@
1
- ### Copyright 2017 Pixar
2
-
3
- ###
4
- ### Licensed under the Apache License, Version 2.0 (the "Apache License")
5
- ### with the following modification; you may not use this file except in
6
- ### compliance with the Apache License and the following modification to it:
7
- ### Section 6. Trademarks. is deleted and replaced with:
8
- ###
9
- ### 6. Trademarks. This License does not grant permission to use the trade
10
- ### names, trademarks, service marks, or product names of the Licensor
11
- ### and its affiliates, except as required to comply with Section 4(c) of
12
- ### the License and to reproduce the content of the NOTICE file.
13
- ###
14
- ### You may obtain a copy of the Apache License at
15
- ###
16
- ### http://www.apache.org/licenses/LICENSE-2.0
17
- ###
18
- ### Unless required by applicable law or agreed to in writing, software
19
- ### distributed under the Apache License with the above modification is
20
- ### distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21
- ### KIND, either express or implied. See the Apache License for the specific
22
- ### language governing permissions and limitations under the Apache License.
23
- ###
24
- ###
25
-
26
- ###
1
+ # Copyright 2017 Pixar
2
+
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "Apache License")
5
+ # with the following modification; you may not use this file except in
6
+ # compliance with the Apache License and the following modification to it:
7
+ # Section 6. Trademarks. is deleted and replaced with:
8
+ #
9
+ # 6. Trademarks. This License does not grant permission to use the trade
10
+ # names, trademarks, service marks, or product names of the Licensor
11
+ # and its affiliates, except as required to comply with Section 4(c) of
12
+ # the License and to reproduce the content of the NOTICE file.
13
+ #
14
+ # You may obtain a copy of the Apache License at
15
+ #
16
+ # http://www.apache.org/licenses/LICENSE-2.0
17
+ #
18
+ # Unless required by applicable law or agreed to in writing, software
19
+ # distributed under the Apache License with the above modification is
20
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21
+ # KIND, either express or implied. See the Apache License for the specific
22
+ # language governing permissions and limitations under the Apache License.
23
+ #
24
+ #
25
+
26
+ #
27
27
  module JSS
28
28
 
29
-
30
-
31
- #####################################
32
- ### Constants
33
- #####################################
34
-
35
- #####################################
36
- ### Module Variables
37
- #####################################
38
-
39
- #####################################
40
- ### Module Methods
41
- #####################################
42
-
43
- ####################################
44
- ### Classes
45
- #####################################
46
-
47
-
48
- ###
49
- ### The parent class of ExtensionAttribute objects in the JSS.
50
- ###
51
- ### The API extension attribute objects work with the definitions of extension
52
- ### attributes, not the resulting values stored in the JSS with the inventory
53
- ### reports.
54
- ###
55
- ### This superclass, however, uses the {AdvancedSearch} subclasses to provide
56
- ### access to the reported values in two ways:
57
- ### * A list of target objects with a certain value for the ExtensionAttribute instance.
58
- ### See the {#all_with_result} method for details
59
- ### * A list of the most recent value for this ExtensionAttribute in all targets in the JSS
60
- ###
61
- ### The {ComputerExtensionAttribute} subclass offers a {ComputerExtensionAttribute#history}
62
- ### method providing the history of values for the EA for one computer. This requires
63
- ### MySQL access to the JSS database since that history isn't available via the API.
64
- ###
65
- ### Subclasses of ExtensionAttribute must define these constants:
66
- ### * TARGET_CLASS - the {APIObject} subclass to which the extention attribute applies.
67
- ### e.g. {JSS::Computer}
68
- ###
69
- ### * ALL_TARGETS_CRITERION - a {JSS::Criteriable::Criterion} instance that will be used in
70
- ### an {AdvancedSearch} to find all of members of the TARGET_CLASS
71
- ###
72
- ### @see JSS::APIObject
73
- ###
29
+ # Classes
30
+ ###################################
31
+
32
+ # The parent class of ExtensionAttribute objects in the JSS.
33
+ #
34
+ # The API extension attribute objects work with the definitions of extension
35
+ # attributes, not the resulting values stored in the JSS with the inventory
36
+ # reports.
37
+ #
38
+ # This superclass, however, uses the {AdvancedSearch} subclasses to provide
39
+ # access to the reported values in two ways:
40
+ # * A list of target objects with a certain value for the ExtensionAttribute instance.
41
+ # See the {#all_with_result} method for details
42
+ # * A list of the most recent value for this ExtensionAttribute in all targets in the JSS
43
+ #
44
+ # The {ComputerExtensionAttribute} subclass offers a {ComputerExtensionAttribute#history}
45
+ # method providing the history of values for the EA for one computer. This requires
46
+ # MySQL access to the JSS database since that history isn't available via the API.
47
+ #
48
+ # Subclasses of ExtensionAttribute must define these constants:
49
+ # * TARGET_CLASS - the {APIObject} subclass to which the extention attribute applies.
50
+ # e.g. {JSS::Computer}
51
+ #
52
+ # * ALL_TARGETS_CRITERION - a {JSS::Criteriable::Criterion} instance that will be used in
53
+ # an {AdvancedSearch} to find all of members of the TARGET_CLASS
54
+ #
55
+ # @see JSS::APIObject
56
+ #
74
57
  class ExtensionAttribute < JSS::APIObject
75
58
 
76
- #####################################
77
- ### Mix-Ins
78
- #####################################
59
+ # Mix-Ins
60
+ ###################################
79
61
  include JSS::Creatable
80
62
  include JSS::Updatable
81
63
 
82
- #####################################
83
- ### Class Methods
84
- #####################################
85
-
86
- #####################################
87
- ### Class Constants
88
- #####################################
89
-
90
- ### What kinds of data can be created by EAs?
91
- ### Note, Dates must be in the format "YYYY-MM-DD hh:mm:ss"
92
- DATA_TYPES = ["String", "Date", "Integer"]
93
- DEFAULT_DATA_TYPE = "String"
64
+ # Class Constants
65
+ ###################################
94
66
 
95
- ### Where does the data come from?
96
- INPUT_TYPES = [ "Text Field", "Pop-up Menu", "script", "LDAP Attribute Mapping"]
97
- DEFAULT_INPUT_TYPE = "Text Field"
67
+ # What kinds of data can be created by EAs?
68
+ # Note, Dates must be in the format "YYYY-MM-DD hh:mm:ss"
69
+ DATA_TYPES = %w[String Date Integer].freeze
70
+ DEFAULT_DATA_TYPE = 'String'.freeze
98
71
 
99
- ### These input types can be modified, the others cannot.
100
- EDITABLE_INPUT_TYPES = ["Text Field", "Pop-up Menu"]
72
+ # Where does the data come from?
73
+ INPUT_TYPES = ['Text Field', 'Pop-up Menu', 'script', 'LDAP Attribute Mapping'].freeze
74
+ DEFAULT_INPUT_TYPE = 'Text Field'.freeze
101
75
 
102
- ### Popup choices can, for now, take empty strings
103
- BLANK = ''.freeze
104
-
105
- ### Where can it be displayed in the WebApp?
106
- ### subclasses can add to this list
76
+ # Where can it be displayed in the WebApp?
77
+ # subclasses can add to this list
107
78
  WEB_DISPLAY_CHOICES = [
108
- "General",
109
- "Operating System",
110
- "Hardware",
111
- "User and Location",
112
- "Purchasing",
113
- "Extension Attributes"
114
- ]
115
- DEFAULT_WEB_DISPLAY_CHOICE = "Extension Attributes"
116
-
117
- LAST_RECON_FIELD = 'Last Inventory Update'
118
- LAST_RECON_FIELD_SYM = LAST_RECON_FIELD.gsub(' ', '_').to_sym
119
-
120
- USERNAME_FIELD = "Username"
79
+ 'General',
80
+ 'Operating System',
81
+ 'Hardware',
82
+ 'User and Location',
83
+ 'Purchasing',
84
+ 'Extension Attributes'
85
+ ].freeze
86
+ DEFAULT_WEB_DISPLAY_CHOICE = 'Extension Attributes'.freeze
87
+
88
+ LAST_RECON_FIELD = 'Last Inventory Update'.freeze
89
+ LAST_RECON_FIELD_SYM = LAST_RECON_FIELD.tr(' ', '_').to_sym
90
+
91
+ USERNAME_FIELD = 'Username'.freeze
121
92
  USERNAME_FIELD_SYM = USERNAME_FIELD.to_sym
122
93
 
123
- ######################
124
- ### Attributes
125
- ######################
94
+ # Attributes
95
+ ####################
126
96
 
127
- ### :id, :name, :in_jss, :need_to_update, and :rest_rsrc come from JSS::APIObject
97
+ # :id, :name, :in_jss, :need_to_update, and :rest_rsrc come from JSS::APIObject
128
98
 
129
- ### @return [String] description of the ext attrib
99
+ # @return [String] description of the ext attrib
130
100
  attr_reader :description
131
101
 
132
- ### @return [String] the type of data created by the EA. Must be one of DATA_TYPES
102
+ # @return [String] the type of data created by the EA. Must be one of DATA_TYPES
133
103
  attr_reader :data_type
134
104
 
135
- ### @return [String] where does this data come from? Must be one of the INPUT_TYPES.
105
+ # @return [String] where does this data come from? Must be one of the INPUT_TYPES.
136
106
  attr_reader :input_type
137
107
 
138
- ### @return [Array<String>] the choices available in the UI when the @input_type is "Pop-up Menu"
108
+ # @return [Array<String>] the choices available in the UI when the @input_type is "Pop-up Menu"
139
109
  attr_reader :popup_choices
140
110
 
141
- ### @return [String] In which part of the web UI does the data appear?
111
+ # @return [String] In which part of the web UI does the data appear?
142
112
  attr_reader :web_display
143
113
 
144
114
 
115
+ # Constructor
116
+ ###################################
145
117
 
146
- #####################################
147
- ### Constructor
148
- #####################################
149
118
 
150
- ###
151
- ### @see JSS::APIObject#initialize
152
- ###
119
+ # @see JSS::APIObject#initialize
120
+ #
153
121
  def initialize(args = {})
154
-
155
122
  super args
156
123
 
157
- ### @init_data now has the raw data
158
- ### so fill in our attributes or set defaults
124
+ # @init_data now has the raw data
125
+ # so fill in our attributes or set defaults
159
126
 
160
127
  @description = @init_data[:description]
161
128
  @data_type = @init_data[:data_type] || DEFAULT_DATA_TYPE
162
129
  @web_display = @init_data[:inventory_display] || DEFAULT_WEB_DISPLAY_CHOICE
163
130
 
164
-
165
131
  if @init_data[:input_type]
166
132
  @input_type = @init_data[:input_type][:type] || DEFAULT_INPUT_TYPE
167
133
  @popup_choices = @init_data[:input_type][:popup_choices]
@@ -171,40 +137,36 @@ module JSS
171
137
  @input_type = DEFAULT_INPUT_TYPE
172
138
  end
173
139
 
174
- ### the name of the EA might have spaces and caps, which the will come to us as symbols with the spaces
175
- ### as underscores, like this.
176
- @symbolized_name = @name.gsub(/-| /,'_').to_sym
177
-
140
+ # the name of the EA might have spaces and caps, which the will come to us as symbols with the spaces
141
+ # as underscores, like this.
142
+ @symbolized_name = @name.gsub(/-| /, '_').to_sym
178
143
  end # init
179
144
 
180
- #####################################
181
- ### Public Instance Methods
182
- #####################################
183
145
 
184
- ###
185
- ### @see JSS::Creatable#create
186
- ###
146
+ # Public Instance Methods
147
+ ###################################
148
+
149
+
150
+ # @see JSS::Creatable#create
151
+ #
187
152
  def create
188
- if @input_type == "Pop-up Menu"
189
- raise MissingDataError, "No popup_choices set for Pop-up Menu input_type." unless @popup_choices.kind_of? Array and (not @popup_choices.empty?)
153
+ if @input_type == 'Pop-up Menu'
154
+ raise MissingDataError, 'No popup_choices set for Pop-up Menu input_type.' unless @popup_choices.is_a?(Array) && !@popup_choices.empty?
190
155
  end
191
156
  super
192
157
  end
193
158
 
194
- ###
195
- ### @see JSS::Updatable#update
196
- ###
159
+ # @see JSS::Updatable#update
160
+ #
197
161
  def update
198
- if @input_type == "Pop-up Menu"
199
- raise MissingDataError, "No popup_choices set for Pop-up Menu input_type." unless @popup_choices.kind_of? Array and (not @popup_choices.empty?)
162
+ if @input_type == 'Pop-up Menu'
163
+ raise MissingDataError, 'No popup_choices set for Pop-up Menu input_type.' unless @popup_choices.is_a?(Array) && !@popup_choices.empty?
200
164
  end
201
165
  super
202
166
  end
203
167
 
204
-
205
- ###
206
- ### @see JSS::APIObject#delete
207
- ###
168
+ # @see JSS::APIObject#delete
169
+ #
208
170
  def delete
209
171
  orig_open_timeout = @api.cnx.options[:open_timeout]
210
172
  orig_timeout = @api.cnx.options[:timeout]
@@ -218,178 +180,164 @@ module JSS
218
180
  end
219
181
  end
220
182
 
221
- ###
222
- ### Change the description of this EA
223
- ###
224
- ### @param new_val[String] the new value
225
- ###
226
- ### @return [void]
227
- ###
228
- def description= (new_val)
183
+ # Change the description of this EA
184
+ #
185
+ # @param new_val[String] the new value
186
+ #
187
+ # @return [void]
188
+ #
189
+ def description=(new_val)
229
190
  return nil if @description == new_val
230
191
  @description = new_val
231
192
  @need_to_update = true
232
193
  end # name=(newname)
233
194
 
234
- ###
235
- ### Change the data type of this EA
236
- ###
237
- ### @param new_val[String] the new value, which must be a member of DATA_TYPES
238
- ###
239
- ### @return [void]
240
- ###
241
- def data_type= (new_val)
195
+ # Change the data type of this EA
196
+ #
197
+ # @param new_val[String] the new value, which must be a member of DATA_TYPES
198
+ #
199
+ # @return [void]
200
+ #
201
+ def data_type=(new_val)
242
202
  return nil if @data_type == new_val
243
- raise JSS::InvalidDataError, "data_type must be a string, one of: #{DATA_TYPES.join(", ")}" unless DATA_TYPES.include? new_val
203
+ raise JSS::InvalidDataError, "data_type must be a string, one of: #{DATA_TYPES.join(', ')}" unless DATA_TYPES.include? new_val
244
204
  @data_type = new_val
245
205
  @need_to_update = true
246
206
  end #
247
207
 
248
-
249
- ###
250
- ### Change the inventory_display of this EA
251
- ###
252
- ### @param new_val[String] the new value, which must be a member of INVENTORY_DISPLAY_CHOICES
253
- ###
254
- ### @return [void]
255
- ###
256
- def web_display= (new_val)
208
+ # Change the inventory_display of this EA
209
+ #
210
+ # @param new_val[String] the new value, which must be a member of INVENTORY_DISPLAY_CHOICES
211
+ #
212
+ # @return [void]
213
+ #
214
+ def web_display=(new_val)
257
215
  return nil if @web_display == new_val
258
- raise JSS::InvalidDataError, "inventory_display must be a string, one of: #{INVENTORY_DISPLAY_CHOICES.join(", ")}" unless WEB_DISPLAY_CHOICES.include? new_val
216
+ raise JSS::InvalidDataError, "inventory_display must be a string, one of: #{INVENTORY_DISPLAY_CHOICES.join(', ')}" unless WEB_DISPLAY_CHOICES.include? new_val
259
217
  @web_display = new_val
260
218
  @need_to_update = true
261
219
  end #
262
220
 
263
-
264
- ###
265
- ### Change the input type of this EA
266
- ###
267
- ### @param new_val[String] the new value, which must be a member of INPUT_TYPES
268
- ###
269
- ### @return [void]
270
- ###
271
- def input_type= (new_val)
221
+ # Change the input type of this EA
222
+ #
223
+ # @param new_val[String] the new value, which must be a member of INPUT_TYPES
224
+ #
225
+ # @return [void]
226
+ #
227
+ def input_type=(new_val)
272
228
  return nil if @input_type == new_val
273
- raise JSS::InvalidDataError, "input_type must be a string, one of: #{INPUT_TYPES.join(", ")}" unless INPUT_TYPES.include? new_val
229
+ raise JSS::InvalidDataError, "input_type must be a string, one of: #{INPUT_TYPES.join(', ')}" unless INPUT_TYPES.include? new_val
274
230
  @input_type = new_val
275
- @popup_choices = nil if @input_type == "Text Field"
231
+ @popup_choices = nil if @input_type == 'Text Field'
276
232
  @need_to_update = true
277
233
  end #
278
234
 
279
- ###
280
- ### Change the Popup Choices of this EA
281
- ### New value must be an Array, the items will be converted to Strings.
282
- ###
283
- ### This automatically sets input_type to "Pop-up Menu"
284
- ###
285
- ### Values are checked to ensure they match the @data_type
286
- ### Note, Dates must be in the format "YYYY-MM-DD hh:mm:ss"
287
- ###
288
- ### @param new_val[Array<#to_s>] the new values
289
- ###
290
- ### @return [void]
291
- ###
292
- def popup_choices= (new_val)
235
+ # Change the Popup Choices of this EA
236
+ # New value must be an Array, the items will be converted to Strings.
237
+ #
238
+ # This automatically sets input_type to "Pop-up Menu"
239
+ #
240
+ # Values are checked to ensure they match the @data_type
241
+ # Note, Dates must be in the format "YYYY-MM-DD hh:mm:ss"
242
+ #
243
+ # @param new_val[Array<#to_s>] the new values
244
+ #
245
+ # @return [void]
246
+ #
247
+ def popup_choices=(new_val)
293
248
  return nil if @popup_choices == new_val
294
- raise JSS::InvalidDataError, "popup_choices must be an Array" unless new_val.kind_of?(Array)
249
+ raise JSS::InvalidDataError, 'popup_choices must be an Array' unless new_val.is_a?(Array)
295
250
 
296
- ### convert each one to a String,
297
- ### and check that it matches the @data_type
251
+ # convert each one to a String,
252
+ # and check that it matches the @data_type
298
253
  new_val.map! do |v|
299
254
  v = v.to_s.strip
300
255
  case @data_type
301
- when "Date"
302
- raise JSS::InvalidDataError, "data_type is Date, but '#{v}' is not formatted 'YYYY-MM-DD hh:mm:ss'" unless v =~ /^\d{4}(-\d\d){2} (\d\d:){2}\d\d$/
303
- when "Integer"
304
- raise JSS::InvalidDataError, "data_type is Integer, but '#{v}' is not one" unless v =~ /^\d+$/
256
+ when 'Date'
257
+ raise JSS::InvalidDataError, "data_type is Date, but '#{v}' is not formatted 'YYYY-MM-DD hh:mm:ss'" unless v =~ /^\d{4}(-\d\d){2} (\d\d:){2}\d\d$/
258
+ when 'Integer'
259
+ raise JSS::InvalidDataError, "data_type is Integer, but '#{v}' is not one" unless v =~ /^\d+$/
305
260
  end
306
261
  v
307
262
  end
308
- self.input_type = "Pop-up Menu"
263
+ self.input_type = 'Pop-up Menu'
309
264
  @popup_choices = new_val
310
265
  @need_to_update = true
311
266
  end #
312
267
 
313
-
314
- ###
315
- ### Get an Array of Hashes for all inventory objects
316
- ### with a desired result in their latest report for this EA.
317
- ###
318
- ### Each Hash is one inventory object (computer, mobile device, user), with these keys:
319
- ### :id - the computer id
320
- ### :name - the computer name
321
- ### :value - the matching ext attr value for the objects latest report.
322
- ###
323
- ### This is done by creating a temprary {AdvancedSearch} for objects with matching
324
- ### values in the EA field, then getting the #search_results hash from it.
325
- ###
326
- ### The AdvancedSearch is then deleted.
327
- ###
328
- ### @param search_type[String] how are we comparing the stored value with the desired value.
329
- ### must be a member of JSS::Criterion::SEARCH_TYPES
330
- ###
331
- ### @param desired_value[String] the value to compare with the stored value to determine a match.
332
- ###
333
- ### @return [Array<Hash{:id=>Integer,:name=>String,:value=>String,Integer,Time}>] the items that match the result.
334
- ###
268
+ # Get an Array of Hashes for all inventory objects
269
+ # with a desired result in their latest report for this EA.
270
+ #
271
+ # Each Hash is one inventory object (computer, mobile device, user), with these keys:
272
+ # :id - the computer id
273
+ # :name - the computer name
274
+ # :value - the matching ext attr value for the objects latest report.
275
+ #
276
+ # This is done by creating a temprary {AdvancedSearch} for objects with matching
277
+ # values in the EA field, then getting the #search_results hash from it.
278
+ #
279
+ # The AdvancedSearch is then deleted.
280
+ #
281
+ # @param search_type[String] how are we comparing the stored value with the desired value.
282
+ # must be a member of JSS::Criterion::SEARCH_TYPES
283
+ #
284
+ # @param desired_value[String] the value to compare with the stored value to determine a match.
285
+ #
286
+ # @return [Array<Hash{:id=>Integer,:name=>String,:value=>String,Integer,Time}>] the items that match the result.
287
+ #
335
288
  def all_with_result(search_type, desired_value)
336
289
  raise JSS::NoSuchItemError, "EA Not In JSS! Use #create to create this #{self.class::RSRC_OBJECT_KEY}." unless @in_jss
337
- raise JSS::InvalidDataError, "Invalid search_type, see JSS::Criteriable::Criterion::SEARCH_TYPES" unless JSS::Criteriable::Criterion::SEARCH_TYPES.include? search_type.to_s
290
+ raise JSS::InvalidDataError, 'Invalid search_type, see JSS::Criteriable::Criterion::SEARCH_TYPES' unless JSS::Criteriable::Criterion::SEARCH_TYPES.include? search_type.to_s
338
291
  begin
339
-
340
292
  search_class = self.class::TARGET_CLASS::SEARCH_CLASS
341
- acs = search_class.new api: @api, :id => :new, :name => "ruby-jss-EA-result-search-#{Time.now.to_jss_epoch}"
293
+ acs = search_class.new api: @api, id: :new, name: "ruby-jss-EA-result-search-#{Time.now.to_jss_epoch}"
342
294
  acs.display_fields = [@name]
343
- crit_list = [JSS::Criteriable::Criterion.new(:and_or => "and", :name => @name, :search_type => search_type.to_s, :value => desired_value)]
295
+ crit_list = [JSS::Criteriable::Criterion.new(and_or: 'and', name: @name, search_type: search_type.to_s, value: desired_value)]
344
296
  acs.criteria = JSS::Criteriable::Criteria.new crit_list
345
297
 
346
298
  acs.create :get_results
347
299
 
348
300
  results = []
349
301
 
350
- acs.search_results.each{ |i|
302
+ acs.search_results.each do |i|
351
303
  value = case @data_type
352
- when "Date" then JSS.parse_datetime i[@symbolized_name]
353
- when "Integer" then i[@symbolized_name].to_i
354
- else i[@symbolized_name]
304
+ when 'Date' then JSS.parse_datetime i[@symbolized_name]
305
+ when 'Integer' then i[@symbolized_name].to_i
306
+ else i[@symbolized_name]
355
307
  end # case
356
- results << {:id => i[:id], :name => i[:name], :value => value}
357
- }
358
-
308
+ results << { id: i[:id], name: i[:name], value: value }
309
+ end
359
310
  ensure
360
311
  acs.delete
361
312
  end
362
313
  results
363
- end
364
-
365
-
366
-
367
- ### Return an Array of Hashes showing the most recent value
368
- ### for this EA on all inventory objects in the JSS.
369
- ###
370
- ### Each Hash is one inventory object (computer, mobile device, user), with these keys:
371
- ### :id - the jss id
372
- ### :name - the object (computer, user, mobiledevice) name
373
- ### :value - the most recent ext attr value for the object.
374
- ### :as_of - the timestamp of when the value was collected (nil for User EAs)
375
- ### :username - the username associated with the object
376
- ###
377
- ### This is done by creating a temporary {AdvancedSearch}
378
- ### for all objects, with the EA as a display field. The #search_result
379
- ### then contains the desired data.
380
- ###
381
- ### The AdvancedSearch is then deleted.
382
- ###
383
- ### @return [Array<Hash{:id=>Integer,:name=>String,:value=>String,Integer,Time,:as_of=>Time}>]
384
- ###
385
- ### @see JSS::AdvancedSearch
386
- ###
387
- ### @see JSS::AdvancedComputerSearch
388
- ###
389
- ### @see JSS::AdvancedMobileDeviceSearch
390
- ###
391
- ### @see JSS::AdvancedUserSearch
392
- ###
314
+ end # Return an Array of Hashes showing the most recent value
315
+
316
+ # for this EA on all inventory objects in the JSS.
317
+ #
318
+ # Each Hash is one inventory object (computer, mobile device, user), with these keys:
319
+ # :id - the jss id
320
+ # :name - the object (computer, user, mobiledevice) name
321
+ # :value - the most recent ext attr value for the object.
322
+ # :as_of - the timestamp of when the value was collected (nil for User EAs)
323
+ # :username - the username associated with the object
324
+ #
325
+ # This is done by creating a temporary {AdvancedSearch}
326
+ # for all objects, with the EA as a display field. The #search_result
327
+ # then contains the desired data.
328
+ #
329
+ # The AdvancedSearch is then deleted.
330
+ #
331
+ # @return [Array<Hash{:id=>Integer,:name=>String,:value=>String,Integer,Time,:as_of=>Time}>]
332
+ #
333
+ # @see JSS::AdvancedSearch
334
+ #
335
+ # @see JSS::AdvancedComputerSearch
336
+ #
337
+ # @see JSS::AdvancedMobileDeviceSearch
338
+ #
339
+ # @see JSS::AdvancedUserSearch
340
+ #
393
341
  def latest_values
394
342
  raise JSS::NoSuchItemError, "EA Not In JSS! Use #create to create this #{self.class::RSRC_OBJECT_KEY}." unless @in_jss
395
343
  tmp_advsrch = "ruby-jss-EA-latest-search-#{Time.now.to_jss_epoch}"
@@ -397,10 +345,10 @@ module JSS
397
345
  begin
398
346
  search_class = self.class::TARGET_CLASS::SEARCH_CLASS
399
347
  acs = search_class.make name: tmp_advsrch, api: @api
400
- acs.display_fields = self.class::TARGET_CLASS == JSS::User ? [@name, USERNAME_FIELD] : [@name, USERNAME_FIELD, LAST_RECON_FIELD]
348
+ acs.display_fields = self.class::TARGET_CLASS == JSS::User ? [@name, USERNAME_FIELD] : [@name, USERNAME_FIELD, LAST_RECON_FIELD]
401
349
 
402
350
  # search for 'Username like "" ' because all searchable object classes have a "Username" value
403
- crit = JSS::Criteriable::Criterion.new(:and_or => "and", :name => "Username", :search_type => "like", :value => '')
351
+ crit = JSS::Criteriable::Criterion.new(and_or: 'and', name: 'Username', search_type: 'like', value: '')
404
352
  # crit = self.class::ALL_TARGETS_CRITERION
405
353
  acs.criteria = JSS::Criteriable::Criteria.new [crit]
406
354
  acs.create :get_results
@@ -409,46 +357,40 @@ module JSS
409
357
 
410
358
  acs.search_results.each do |i|
411
359
  value = case @data_type
412
- when "Date" then JSS.parse_datetime i[@symbolized_name]
413
- when "Integer" then i[@symbolized_name].to_i
414
- else i[@symbolized_name]
360
+ when 'Date' then JSS.parse_datetime i[@symbolized_name]
361
+ when 'Integer' then i[@symbolized_name].to_i
362
+ else i[@symbolized_name]
415
363
  end # case
416
364
 
417
365
  as_of = Time.parse(i[LAST_RECON_FIELD_SYM]) if i[LAST_RECON_FIELD_SYM]
418
366
 
419
- results << {:id => i[:id], :name => i[:name], :username => i[USERNAME_FIELD_SYM] , :value => value, :as_of => as_of }
420
- end #acs.search_results.each
421
-
367
+ results << { id: i[:id], name: i[:name], username: i[USERNAME_FIELD_SYM], value: value, as_of: as_of }
368
+ end # acs.search_results.each
422
369
  ensure
423
370
  if defined? acs
424
371
  acs.delete if acs
425
372
  else
426
- search_class.fetch(:name => tmp_advsrch, api: @api).delete if search_class.all_names(:refresh, api: @api).include? tmp_advsrch
373
+ search_class.fetch(name: tmp_advsrch, api: @api).delete if search_class.all_names(:refresh, api: @api).include? tmp_advsrch
427
374
  end
428
375
  end
429
376
 
430
377
  results
431
-
432
378
  end
433
379
 
434
-
435
- ### aliases
380
+ # aliases
436
381
 
437
382
  alias desc description
438
383
 
439
-
440
-
441
- ######################
442
- ### Private Instance Methods
443
- #####################
384
+ # Private Instance Methods
385
+ ###################
444
386
 
445
387
  private
446
388
 
447
- ###
448
- ### Return a REXML object for this ext attr, with the current values.
449
- ### Subclasses should augment this in their rest_xml methods
450
- ### then return it .to_s, for saving or updating
451
- ###
389
+ #
390
+ # Return a REXML object for this ext attr, with the current values.
391
+ # Subclasses should augment this in their rest_xml methods
392
+ # then return it .to_s, for saving or updating
393
+ #
452
394
  def rest_rexml
453
395
  ea = REXML::Element.new self.class::RSRC_OBJECT_KEY.to_s
454
396
  ea.add_element('name').text = @name
@@ -458,18 +400,17 @@ module JSS
458
400
 
459
401
  it = ea.add_element('input_type')
460
402
  it.add_element('type').text = @input_type
461
- if @input_type == "Pop-up Menu"
403
+ if @input_type == 'Pop-up Menu'
462
404
  pcs = it.add_element('popup_choices')
463
- @popup_choices.each{|pc| pcs.add_element('choice').text = pc}
405
+ @popup_choices.each { |pc| pcs.add_element('choice').text = pc }
464
406
  end
465
- return ea
407
+ ea
466
408
  end # rest xml
467
409
 
468
-
469
410
  end # class ExtAttrib
470
411
 
471
412
  end # module JSS
472
413
 
473
- require "jss/api_object/extension_attribute/computer_extension_attribute"
474
- require "jss/api_object/extension_attribute/mobile_device_extension_attribute"
475
- require "jss/api_object/extension_attribute/user_extension_attribute"
414
+ require 'jss/api_object/extension_attribute/computer_extension_attribute'
415
+ require 'jss/api_object/extension_attribute/mobile_device_extension_attribute'
416
+ require 'jss/api_object/extension_attribute/user_extension_attribute'