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
@@ -61,7 +61,7 @@ module JSS
61
61
  #
62
62
  #
63
63
  # Classes including this module *MUST*:
64
- # - call {#add_self_service_xml()} in their #rest_xml method
64
+ # - call {#add_self_service_xml(xmldoc)} in their #rest_xml method
65
65
  #
66
66
  # IMPORTANT: Since SelfServable also includes #{JSS::Updatable}, for uploading icons,
67
67
  # see that module for its requirements.
@@ -85,6 +85,8 @@ module JSS
85
85
  MAKE_AVAILABLE = 'Make Available in Self Service'.freeze
86
86
  AUTO_INSTALL = 'Install Automatically'.freeze
87
87
  AUTO_INSTALL_OR_PROMPT = 'Install Automatically/Prompt Users to Install'.freeze
88
+ PATCHPOL_SELF_SERVICE = 'selfservice'.freeze # 'Make Available in Self Service' in the UI
89
+ PATCHPOL_AUTO = 'prompt'.freeze # 'Install Automatically' in the UI
88
90
 
89
91
  DEFAULT_INSTALL_BUTTON_TEXT = 'Install'.freeze
90
92
 
@@ -98,6 +100,15 @@ module JSS
98
100
  can_display_in_categories: true,
99
101
  can_feature_in_categories: true
100
102
  },
103
+ JSS::PatchPolicy => {
104
+ in_self_service_data_path: [:general, :distribution_method],
105
+ in_self_service: PATCHPOL_SELF_SERVICE,
106
+ not_in_self_service: PATCHPOL_AUTO,
107
+ targets: [:macos],
108
+ payload: :patchpolicy,
109
+ can_display_in_categories: false,
110
+ can_feature_in_categories: false
111
+ },
101
112
  JSS::MacApplication => { # TODO: add the correct values when Jamf fixes this bug
102
113
  in_self_service_data_path: nil, # [:general, :distribution_method],
103
114
  in_self_service: nil, # MAKE_AVAILABLE,
@@ -471,10 +482,10 @@ module JSS
471
482
  end
472
483
 
473
484
  def validate_icon(id)
474
- if JSS::DB_CNX.connected?
475
- raise JSS::NoSuchItemError, "No icon with id #{new_icon}" unless JSS::Icon.all_ids.include? id
476
- end
485
+ return nil unless JSS::DB_CNX.connected?
486
+ raise JSS::NoSuchItemError, "No icon with id #{new_icon}" unless JSS::Icon.all_ids.include? id
477
487
  end
488
+
478
489
  # Re-read the icon data for this object from the API
479
490
  # Generally done after uploading a new icon via {#icon=}
480
491
  #
@@ -0,0 +1,197 @@
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
+ module JSS
28
+
29
+ # Module Variables
30
+ #####################################
31
+
32
+ # Module Methods
33
+ #####################################
34
+
35
+ # Classes
36
+ #####################################
37
+
38
+ # A mix-in module that centralizes the code for handling objects which can be
39
+ # assigned a 'site' in the JSS.
40
+ #
41
+ # Objects in the JSS present site data in the top-level :general Hash
42
+ # in the :site key which is a Hash with a :name and :id key.
43
+ #
44
+ # Classes mixing in this module MUST:
45
+ #
46
+ # - define the constant SITE_SUBSET as either :top, :general, or whatever
47
+ # sub-hash of API data conaints the site info. (most are :general, but
48
+ # some, like advanced searches, are at the top level)
49
+ #
50
+ # - call {#add_site_to_xml(xmldoc)} from their #rest_xml method if they are
51
+ # {Updatable} or {Creatable}
52
+ #
53
+ module Sitable
54
+
55
+ # Module Constants
56
+ #####################################
57
+
58
+ SITABLE = true
59
+
60
+ # When no site has been assigned, this is the 'name' and id used
61
+ NO_SITE_NAME = 'None'.freeze
62
+ NO_SITE_ID = -1
63
+
64
+ # Setting the site to any of these values will unset the site
65
+ NON_SITES = [
66
+ nil,
67
+ '',
68
+ 0,
69
+ NO_SITE_NAME,
70
+ NO_SITE_ID
71
+ ].freeze
72
+
73
+ # Mixed-in Public Instance Methods
74
+ #####################################
75
+
76
+ # The name of the site for this object.
77
+ # For backward compatibility, this is aliased to just
78
+ # 'site'
79
+ #
80
+ # @return [String] The name of the site for this object.
81
+ #
82
+ def site_name
83
+ @site_name
84
+ end # cat name
85
+ alias site site_name
86
+
87
+ # The id of the site for this object.
88
+ #
89
+ # @return [Integer] The id of the site for this object.
90
+ #
91
+ def site_id
92
+ @site_id
93
+ end # cat id
94
+
95
+ # The JSS::Site instance for this object's site
96
+ #
97
+ # @return [JSS::Site] The JSS::Site instance for this object's site
98
+ #
99
+ def site_object
100
+ return nil unless site_assigned?
101
+ JSS::Site.new id: @site_id
102
+ end # cat obj
103
+
104
+ # Does this object have a site assigned?
105
+ #
106
+ # @return [Boolean] Does this object have a site assigned?
107
+ #
108
+ def site_assigned?
109
+ !@site_name.nil?
110
+ end # cat assigned?
111
+
112
+ # Change the site of this object.
113
+ # Any of the NON_SITES values will
114
+ # unset the site
115
+ #
116
+ # @param new_site[Integer, String] The new site
117
+ #
118
+ # @return [void]
119
+ #
120
+ def site=(new_site)
121
+ return nil unless updatable? || creatable?
122
+
123
+ # unset the site? Use nil or an empty string
124
+ if NON_SITES.include? new_site
125
+ unset_site
126
+ return
127
+ end
128
+
129
+
130
+ new_id = JSS::Site.valid_id new_site, api: @api
131
+ new_name = JSS::Site.map_all_ids_to(:name, api: @api)[new_id]
132
+ # no change, go home.
133
+ return nil if new_name == @site_name
134
+
135
+ raise JSS::NoSuchItemError, "Site '#{new_site}' is not known to the JSS" unless new_id
136
+
137
+ @site_name = new_name
138
+ @site_id = new_id
139
+ @need_to_update = true
140
+ end # site =
141
+
142
+ # Set the site to nothing
143
+ #
144
+ # @return [void]
145
+ #
146
+ def unset_site
147
+ # no change, go home
148
+ return nil if @site_name.nil?
149
+ @site_name = nil
150
+ @site_id = nil
151
+ @need_to_update = true
152
+ end # unset site
153
+
154
+ # Mixed-in Private Instance Methods
155
+ #####################################
156
+ private
157
+
158
+ # Parse the site data from any incoming API data
159
+ #
160
+ # @return [void]
161
+ #
162
+ def parse_site
163
+ site_data =
164
+ if self.class::SITE_SUBSET == :top
165
+ @init_data[:site]
166
+ else
167
+ @init_data[self.class::SITE_SUBSET][:site]
168
+ end
169
+
170
+ raise JSS::MissingDataError, 'No Site data found in API data.' unless site_data
171
+
172
+ @site_name = site_data[:name]
173
+ @site_id = site_data[:id]
174
+ end # parse site
175
+
176
+ # Add the site to the XML for POSTing or PUTting to the API.
177
+ #
178
+ # @param xmldoc[REXML::Document] The in-construction XML document
179
+ #
180
+ # @return [void]
181
+ #
182
+ def add_site_to_xml(xmldoc)
183
+ root = xmldoc.root
184
+ site_elem =
185
+ if self.class::SITE_SUBSET == :top
186
+ root.add_element 'site'
187
+ else
188
+ parent_elem = root.elements[self.class::SITE_SUBSET.to_s]
189
+ parent_elem ||= root.add_element(self.class::SITE_SUBSET.to_s)
190
+ parent_elem.add_element 'site'
191
+ end
192
+ site_elem.add_element('name').text = @site_name.to_s
193
+ end # add_site_to_xml
194
+
195
+ end # module categorizable
196
+
197
+ end # module
@@ -1,99 +1,68 @@
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
- ### Module Variables
31
- #####################################
32
-
33
- #####################################
34
- ### Module Methods
35
- #####################################
29
+ # Classes
30
+ ###################################
36
31
 
37
-
38
- #####################################
39
- ### Classes
40
- #####################################
41
-
42
- ###
43
- ### A Site in the JSS.
44
- ###
45
- ### These are simple, in that they only have an ID and a name.
46
- ###
47
- ### @see JSS::APIObject
48
- ###
32
+ # A Site in the JSS.
33
+ #
34
+ # These are simple, in that they only have an ID and a name.
35
+ #
36
+ # @see JSS::APIObject
37
+ #
49
38
  class Site < JSS::APIObject
50
39
 
51
- #####################################
52
- ### Mix-Ins
53
- #####################################
40
+ # Mix-Ins
41
+ ###################################
54
42
  include JSS::Creatable
55
43
  include JSS::Updatable
56
44
 
57
- #####################################
58
- ### Class Methods
59
- #####################################
60
-
61
- #####################################
62
- ### Class Constants
63
- #####################################
45
+ # Class Constants
46
+ ###################################
64
47
 
65
- ### The base for REST resources of this class
66
- RSRC_BASE = "sites"
48
+ # The base for REST resources of this class
49
+ RSRC_BASE = 'sites'.freeze
67
50
 
68
- ### the hash key used for the JSON list output of all objects in the JSS
51
+ # the hash key used for the JSON list output of all objects in the JSS
69
52
  RSRC_LIST_KEY = :sites
70
53
 
71
- ### The hash key used for the JSON object output.
72
- ### It's also used in various error messages
54
+ # The hash key used for the JSON object output.
55
+ # It's also used in various error messages
73
56
  RSRC_OBJECT_KEY = :site
74
57
 
75
- ### these keys, as well as :id and :name, are present in valid API JSON data for this class
76
- VALID_DATA_KEYS = []
58
+ # these keys, as well as :id and :name, are present in valid API JSON data for this class
59
+ VALID_DATA_KEYS = [].freeze
77
60
 
78
61
  # the object type for this object in
79
62
  # the object history table.
80
63
  # See {APIObject#add_object_history_entry}
81
64
  OBJECT_HISTORY_OBJECT_TYPE = 44
82
65
 
83
- #####################################
84
- ### Attributes
85
- #####################################
86
-
87
- #####################################
88
- ### Constructor
89
- #####################################
90
-
91
-
92
- #####################################
93
- ### Public Instance Methods
94
- #####################################
95
-
96
-
97
66
  end # class site
98
67
 
99
68
  end # module
@@ -106,9 +106,13 @@ module JSS
106
106
 
107
107
  ### @return [Array<Hash>]
108
108
  ###
109
- ### The sites associated with this user
109
+ ### Unlike every other Sitable object, Users
110
+ ### can be in multiple sites, so we don't use
111
+ ### the Sitable mixin module. Instead we'll
112
+ ### we'll store them in this Array, as they come
113
+ ### from the API.
110
114
  ###
111
- ### Each Hash has then :id and :name for one site
115
+ ### Each Hash has the :id and :name for one site
112
116
  ###
113
117
  attr_reader :sites
114
118
 
@@ -267,7 +271,7 @@ module JSS
267
271
 
268
272
  user << JSS::Site.xml_list(@sites)
269
273
 
270
- user << ext_attr_xml if @changed_eas && !@changed_eas.empty?
274
+ user << ext_attr_xml if unsaved_eas?
271
275
 
272
276
  return doc.to_s
273
277
  end
@@ -483,6 +483,47 @@ module JSS
483
483
  new args
484
484
  end
485
485
 
486
+
487
+ # Delete one or more API objects by jss_id without instantiating them.
488
+ # Non-existent id's are skipped and an array of skipped ids is returned.
489
+ #
490
+ # If an Array is provided, it is passed through #uniq! before being processed.
491
+ #
492
+ # @param victims[Integer,Array<Integer>] An object id or an array of them
493
+ # to be deleted
494
+ #
495
+ # @param api[JSS::APIConnection] the API connection to use.
496
+ # Defaults to the corrently active API. See {JSS::APIConnection}
497
+ #
498
+ # @return [Array<Integer>] The id's that didn't exist when we tried to
499
+ # delete them.
500
+ #
501
+ def self.delete(victims, api: JSS.api)
502
+ raise JSS::UnsupportedError, '.delete can only be called on subclasses of JSS::APIObject' if self == JSS::APIObject
503
+ raise JSS::InvalidDataError, 'Parameter must be an Integer ID or an Array of them' unless victims.is_a?(Integer) || victims.is_a?(Array)
504
+
505
+ case victims
506
+ when Integer
507
+ victims = [victims]
508
+ when Fixnum
509
+ victims = [victims]
510
+ when Array
511
+ victims.uniq!
512
+ end
513
+
514
+ skipped = []
515
+ current_ids = all_ids :refresh, api: api
516
+ victims.each do |vid|
517
+ if current_ids.include? vid
518
+ api.delete_rsrc "#{self::RSRC_BASE}/id/#{vid}"
519
+ else
520
+ skipped << vid
521
+ end # if current_ids include v
522
+ end # each victim
523
+
524
+ skipped
525
+ end # self.delete
526
+
486
527
  ### Class Constants
487
528
  #####################################
488
529
 
@@ -654,11 +695,16 @@ module JSS
654
695
  defined? self.class::SELF_SERVABLE
655
696
  end
656
697
 
657
- # @return [Boolean] See {JSS::criteriable}
698
+ # @return [Boolean] See {JSS::Criteriable}
658
699
  def criterable?
659
700
  defined? self.class::CRITERIABLE
660
701
  end
661
702
 
703
+ # @return [Boolean] See {JSS::Sitable}
704
+ def sitable?
705
+ defined? self.class::SITABLE
706
+ end
707
+
662
708
  # @return [Boolean] See {JSS::extendable}
663
709
  def extendable?
664
710
  defined? self.class::EXTENDABLE
@@ -691,8 +737,8 @@ module JSS
691
737
 
692
738
  # Delete this item from the JSS.
693
739
  #
694
- # TODO: Make a class method for mass deletion
695
- # without instantiating, then call it from this method.
740
+ # @seealso {APIObject.delete} for deleting
741
+ # one or more objects by id without needing to instantiate
696
742
  #
697
743
  # Subclasses may want to redefine this method,
698
744
  # first calling super, then setting other attributes to
@@ -815,6 +861,17 @@ module JSS
815
861
  history
816
862
  end
817
863
 
864
+ # Print the rest_xml value of the object to stdout,
865
+ # with indentation. Useful for debugging.
866
+ #
867
+ # @return [void]
868
+ #
869
+ def ppx
870
+ return nil unless creatable? || updatable?
871
+ REXML::Document.new(rest_xml).write $stdout, 2
872
+ puts
873
+ end
874
+
818
875
  # Private Instance Methods
819
876
  #####################################
820
877
  private
@@ -920,10 +977,11 @@ module JSS
920
977
  # many things have a :site
921
978
  # TODO: Implement a Sitable mixin module
922
979
  #
923
- @site = JSS::APIObject.get_name(@main_subset[:site]) if @main_subset[:site]
980
+ # @site = JSS::APIObject.get_name(@main_subset[:site]) if @main_subset[:site]
924
981
 
925
982
  ##### Handle Mix-ins
926
983
  initialize_category
984
+ initialize_site
927
985
  initialize_location
928
986
  initialize_purchasing
929
987
  initialize_scope
@@ -959,6 +1017,14 @@ module JSS
959
1017
  parse_category if categorizable?
960
1018
  end
961
1019
 
1020
+ # parse site data during initialization
1021
+ #
1022
+ # @return [void]
1023
+ #
1024
+ def initialize_site
1025
+ parse_site if sitable?
1026
+ end
1027
+
962
1028
  # parse location data during initialization
963
1029
  #
964
1030
  # @return [void]
@@ -1063,6 +1129,9 @@ require 'jss/api_object/extendable'
1063
1129
  require 'jss/api_object/self_servable'
1064
1130
  require 'jss/api_object/categorizable'
1065
1131
  require 'jss/api_object/vppable'
1132
+ require 'jss/api_object/sitable'
1133
+ require 'jss/api_object/mdm'
1134
+ require 'jss/api_object/management_history'
1066
1135
 
1067
1136
  ### Mix-in Sub Modules with Classes
1068
1137
  require 'jss/api_object/criteriable'
@@ -1091,6 +1160,8 @@ require 'jss/api_object/netboot_server'
1091
1160
  require 'jss/api_object/network_segment'
1092
1161
  require 'jss/api_object/osx_configuration_profile'
1093
1162
  require 'jss/api_object/package'
1163
+ require 'jss/api_object/patch'
1164
+ require 'jss/api_object/patch_policy'
1094
1165
  require 'jss/api_object/peripheral_type'
1095
1166
  require 'jss/api_object/peripheral'
1096
1167
  require 'jss/api_object/policy'
data/lib/jss/utility.rb CHANGED
@@ -558,4 +558,25 @@ module JSS
558
558
  pw
559
559
  end
560
560
 
561
+ # un/set devmode mode.
562
+ # Useful when coding - methods can call JSS.devmode? and then
563
+ # e.g. spit out something instead of performing some action.
564
+ #
565
+ # @param [Symbol] Set devmode :on or :off
566
+ #
567
+ # @return [Boolean] The new state of devmode
568
+ #
569
+ def self.devmode(setting)
570
+ @devmode = setting == :on ? true : false
571
+ end
572
+
573
+
574
+ # is devmode currently on?
575
+ #
576
+ # @return [Boolean]
577
+ #
578
+ def self.devmode?
579
+ @devmode
580
+ end
581
+
561
582
  end # module
data/lib/jss/version.rb CHANGED
@@ -27,6 +27,6 @@
27
27
  module JSS
28
28
 
29
29
  ### The version of the JSS ruby gem
30
- VERSION = '0.10.2'.freeze
30
+ VERSION = '0.11.0a5'.freeze
31
31
 
32
32
  end # module
data/lib/jss.rb CHANGED
@@ -59,6 +59,7 @@ module JSS
59
59
  require 'rest-client'
60
60
  require 'json'
61
61
  require 'plist'
62
+ require 'immutable-struct'
62
63
 
63
64
  ### Constants
64
65
  #####################################
@@ -160,6 +161,8 @@ module JSS
160
161
  class NetworkSegment < JSS::APIObject; end
161
162
  class OSXConfigurationProfile < JSS::APIObject; end
162
163
  class Package < JSS::APIObject; end
164
+ class Patch < JSS::APIObject; end
165
+ class PatchPolicy < JSS::APIObject; end
163
166
  class PeripheralType < JSS::APIObject; end
164
167
  class Peripheral < JSS::APIObject; end
165
168
  class Policy < JSS::APIObject; end
@@ -183,6 +186,9 @@ module JSS
183
186
  module SelfServable; end
184
187
  module Categorizable; end
185
188
  module VPPable; end
189
+ module Sitable; end
190
+ module MDM; end
191
+ module ManagementHistory; end
186
192
 
187
193
  end # module JSS
188
194