ruby-jss 0.7.0 → 0.8.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 (109) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.md +29 -22
  3. data/README.md +66 -86
  4. data/bin/jamfHelperBackgrounder +148 -0
  5. data/bin/netseg-update +0 -1
  6. data/lib/jss.rb +20 -9
  7. data/lib/jss/api_connection.rb +369 -295
  8. data/lib/jss/api_object.rb +651 -418
  9. data/lib/jss/api_object/account.rb +69 -77
  10. data/lib/jss/api_object/advanced_search.rb +201 -236
  11. data/lib/jss/api_object/advanced_search/advanced_computer_search.rb +42 -42
  12. data/lib/jss/api_object/advanced_search/advanced_mobile_device_search.rb +33 -43
  13. data/lib/jss/api_object/advanced_search/advanced_user_search.rb +33 -43
  14. data/lib/jss/api_object/building.rb +39 -52
  15. data/lib/jss/api_object/categorizable.rb +221 -0
  16. data/lib/jss/api_object/category.rb +81 -89
  17. data/lib/jss/api_object/computer.rb +486 -525
  18. data/lib/jss/api_object/computer_invitation.rb +73 -86
  19. data/lib/jss/api_object/criteriable.rb +6 -7
  20. data/lib/jss/api_object/ebook.rb +21 -0
  21. data/lib/jss/api_object/extendable.rb +6 -8
  22. data/lib/jss/api_object/group.rb +0 -3
  23. data/lib/jss/api_object/locatable.rb +19 -20
  24. data/lib/jss/api_object/mac_application.rb +21 -0
  25. data/lib/jss/api_object/mobile_device.rb +30 -21
  26. data/lib/jss/api_object/mobile_device_application.rb +447 -0
  27. data/lib/jss/api_object/mobile_device_configuration_profile.rb +21 -0
  28. data/lib/jss/api_object/osx_configuration_profile.rb +0 -3
  29. data/lib/jss/api_object/package.rb +21 -34
  30. data/lib/jss/api_object/peripheral.rb +16 -18
  31. data/lib/jss/api_object/policy.rb +5 -83
  32. data/lib/jss/api_object/purchasable.rb +11 -13
  33. data/lib/jss/api_object/scopable.rb +11 -12
  34. data/lib/jss/api_object/script.rb +3 -17
  35. data/lib/jss/api_object/self_servable.rb +419 -205
  36. data/lib/jss/api_object/self_servable/icon.rb +179 -0
  37. data/lib/jss/api_object/updatable.rb +35 -34
  38. data/lib/jss/api_object/uploadable.rb +72 -70
  39. data/lib/jss/api_object/user.rb +6 -7
  40. data/lib/jss/api_object/vppable.rb +117 -0
  41. data/lib/jss/client.rb +264 -225
  42. data/lib/jss/db_connection.rb +7 -5
  43. data/lib/jss/exceptions.rb +50 -42
  44. data/lib/jss/ruby_extensions.rb +8 -7
  45. data/lib/jss/ruby_extensions/object.rb +19 -0
  46. data/lib/jss/utility.rb +82 -40
  47. data/lib/jss/version.rb +1 -1
  48. metadata +37 -68
  49. data/bin/jss-webhook-server +0 -3
  50. data/lib/jss/webhooks.rb +0 -53
  51. data/lib/jss/webhooks/README.md +0 -269
  52. data/lib/jss/webhooks/configuration.rb +0 -213
  53. data/lib/jss/webhooks/data/sample_handlers/RestAPIOperation-executable +0 -91
  54. data/lib/jss/webhooks/data/sample_handlers/RestAPIOperation.rb +0 -45
  55. data/lib/jss/webhooks/data/sample_jsons/ComputerAdded.json +0 -27
  56. data/lib/jss/webhooks/data/sample_jsons/ComputerCheckIn.json +0 -27
  57. data/lib/jss/webhooks/data/sample_jsons/ComputerInventoryCompleted.json +0 -27
  58. data/lib/jss/webhooks/data/sample_jsons/ComputerPolicyFinished.json +0 -27
  59. data/lib/jss/webhooks/data/sample_jsons/ComputerPushCapabilityChanged.json +0 -27
  60. data/lib/jss/webhooks/data/sample_jsons/JSSShutdown.json +0 -14
  61. data/lib/jss/webhooks/data/sample_jsons/JSSStartup.json +0 -14
  62. data/lib/jss/webhooks/data/sample_jsons/MobileDeviceCheckIn.json +0 -26
  63. data/lib/jss/webhooks/data/sample_jsons/MobileDeviceCommandCompleted.json +0 -26
  64. data/lib/jss/webhooks/data/sample_jsons/MobileDeviceEnrolled.json +0 -26
  65. data/lib/jss/webhooks/data/sample_jsons/MobileDevicePushSent.json +0 -26
  66. data/lib/jss/webhooks/data/sample_jsons/MobileDeviceUnEnrolled.json +0 -26
  67. data/lib/jss/webhooks/data/sample_jsons/PatchSoftwareTitleUpdated.json +0 -14
  68. data/lib/jss/webhooks/data/sample_jsons/PushSent.json +0 -11
  69. data/lib/jss/webhooks/data/sample_jsons/RestAPIOperation.json +0 -15
  70. data/lib/jss/webhooks/data/sample_jsons/SCEPChallenge.json +0 -10
  71. data/lib/jss/webhooks/data/sample_jsons/SmartGroupComputerMembershipChange.json +0 -13
  72. data/lib/jss/webhooks/data/sample_jsons/SmartGroupMobileDeviceMembershipChange.json +0 -13
  73. data/lib/jss/webhooks/event.rb +0 -139
  74. data/lib/jss/webhooks/event/computer_added.rb +0 -38
  75. data/lib/jss/webhooks/event/computer_check_in.rb +0 -38
  76. data/lib/jss/webhooks/event/computer_inventory_completed.rb +0 -38
  77. data/lib/jss/webhooks/event/computer_policy_finished.rb +0 -38
  78. data/lib/jss/webhooks/event/computer_push_capability_changed.rb +0 -38
  79. data/lib/jss/webhooks/event/handlers.rb +0 -192
  80. data/lib/jss/webhooks/event/jss_shutdown.rb +0 -38
  81. data/lib/jss/webhooks/event/jss_startup.rb +0 -38
  82. data/lib/jss/webhooks/event/mobile_device_check_in.rb +0 -38
  83. data/lib/jss/webhooks/event/mobile_device_command_completed.rb +0 -38
  84. data/lib/jss/webhooks/event/mobile_device_enrolled.rb +0 -38
  85. data/lib/jss/webhooks/event/mobile_device_push_sent.rb +0 -38
  86. data/lib/jss/webhooks/event/mobile_device_unenrolled.rb +0 -38
  87. data/lib/jss/webhooks/event/patch_software_title_updated.rb +0 -38
  88. data/lib/jss/webhooks/event/push_sent.rb +0 -38
  89. data/lib/jss/webhooks/event/rest_api_operation.rb +0 -38
  90. data/lib/jss/webhooks/event/scep_challenge.rb +0 -38
  91. data/lib/jss/webhooks/event/smart_group_computer_membership_change.rb +0 -38
  92. data/lib/jss/webhooks/event/smart_group_mobile_device_membership_change.rb +0 -38
  93. data/lib/jss/webhooks/event/webhook.rb +0 -40
  94. data/lib/jss/webhooks/event_objects.rb +0 -112
  95. data/lib/jss/webhooks/event_objects/computer.rb +0 -49
  96. data/lib/jss/webhooks/event_objects/jss.rb +0 -36
  97. data/lib/jss/webhooks/event_objects/mobile_device.rb +0 -48
  98. data/lib/jss/webhooks/event_objects/patch_software_title_update.rb +0 -38
  99. data/lib/jss/webhooks/event_objects/push.rb +0 -33
  100. data/lib/jss/webhooks/event_objects/rest_api_operation.rb +0 -37
  101. data/lib/jss/webhooks/event_objects/scep_challenge.rb +0 -32
  102. data/lib/jss/webhooks/event_objects/smart_group.rb +0 -35
  103. data/lib/jss/webhooks/server_app.rb +0 -37
  104. data/lib/jss/webhooks/server_app/routes.rb +0 -27
  105. data/lib/jss/webhooks/server_app/routes/handle_webhook_event.rb +0 -39
  106. data/lib/jss/webhooks/server_app/routes/home.rb +0 -37
  107. data/lib/jss/webhooks/server_app/self_signed_cert.rb +0 -65
  108. data/lib/jss/webhooks/server_app/server.rb +0 -60
  109. data/lib/jss/webhooks/version.rb +0 -32
@@ -0,0 +1,179 @@
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
+ # An Icon in the JSS, used in Self Service.
30
+ #
31
+ # At the moment, icons are not API objects, they are collections of data
32
+ # stored in the JSS that might be included in some API object's Self Service data.
33
+ #
34
+ # The data available for an icon are:
35
+ #
36
+ # - id: the icon's id in the JSS
37
+ # - name: the icon's non-unique name in the JSS
38
+ # - uri: the uri to download or preview the icon
39
+ # - data: the icon file itself, base-64 encoded.
40
+ #
41
+ # Icon instances are read-only. To change the icon for an self-servable object,
42
+ # see {SelfServable#icon=}.
43
+ #
44
+ # NOTE: Since icons are not APIObjects, there's no way to see a list of them
45
+ # via the API. The JSS::Icon class methods .all, .all_ids, and .all_names
46
+ # require MySQL database access. See {JSS::DBConnection}.
47
+ #
48
+ class Icon
49
+
50
+ # Class Methods
51
+ #####################################
52
+
53
+ # Return an Array of { id:, name: } Hashes for all icons known to the JSS
54
+ # Since Icon lists aren't accessible via the API, this method must
55
+ # query the SQL database directly, and will raise an exception if you
56
+ # aren't connected to the database.
57
+ #
58
+ # @param refresh[Boolean] re-read the data from the server?
59
+ #
60
+ # @return [Array<Hash>] The names and ids of all icons known to the JSS
61
+ #
62
+ def self.all(refresh = false)
63
+ @all_icons = nil if refresh
64
+ return @all_icons if @all_icons
65
+ @all_icons = []
66
+ qry = 'SELECT icon_id, filename FROM icons'
67
+ res = JSS::DB_CNX.db.query qry
68
+ res.each_hash { |icon| @all_icons << { id: icon['icon_id'].to_i, name: icon['filename'] } }
69
+ @all_icons
70
+ end
71
+
72
+ # An Array of all icon ids known to the JSS.
73
+ # See {Icon.all}.
74
+ #
75
+ # @param refresh[Boolean] re-read the data from the server?
76
+ #
77
+ # @return [Array<Integer>] The ids of all icons known to the JSS
78
+ #
79
+ def self.all_ids(refresh = false)
80
+ all(refresh).map { |i| i[:id] }
81
+ end
82
+
83
+ # An Array of all icon names known to the JSS.
84
+ # See {Icon.all}.
85
+ # NOTE: Icon names are not unique
86
+ #
87
+ # @param refresh[Boolean] re-read the data from the server?
88
+ #
89
+ # @return [Array<Integer>] The names of all icons known to the JSS
90
+ #
91
+ def self.all_names(refresh = false)
92
+ all(refresh).map { |i| i[:name] }
93
+ end
94
+
95
+ # Attributes
96
+ #####################################
97
+
98
+ # @return [Integer] the icon's id in the JSS
99
+ attr_reader :id
100
+
101
+ # @return [String] the icon's name in the JSS
102
+ # NOTE: these are not unique
103
+ attr_reader :name
104
+ alias filename name
105
+
106
+ # @return [String] The URI for downloading or previewing the icon from the JSS
107
+ attr_reader :uri
108
+
109
+ # @return [String] The raw icon file.
110
+ attr_reader :data
111
+
112
+
113
+ # Constructor
114
+ #####################################
115
+
116
+ # Set up a new JSS::Icon instance
117
+ #
118
+ # @param icon_data[Hash] The :self_service_icon Hash from the :self_service
119
+ # Hash of an object's API @init_data
120
+ #
121
+ # @return [JSS::Icon] The new object
122
+ #
123
+ def initialize(icon_data)
124
+ return unless icon_data.is_a? Hash
125
+ @id = icon_data[:id]
126
+ @name = icon_data[:filename]
127
+ @uri = icon_data[:uri]
128
+ @data = icon_data[:data]
129
+
130
+ # if no :filename, its called :name
131
+ @name ||= icon_data[:name]
132
+
133
+ # if there's no id, as with MobileDeviceConfigurationProfile
134
+ # get it from the end of the uri if possible
135
+ if @uri && !@id
136
+ @id = Regexp.last_match(1).to_i if @uri =~ /(\d+)$/
137
+ end
138
+
139
+ # decode the icon data, or grab from
140
+ # the URI if needed
141
+ @data = Base64.decode64(@data) if @data
142
+ @data ||= open(@uri).read if @uri
143
+
144
+ end
145
+
146
+ # Instance Methods
147
+ #####################################
148
+
149
+ # Open the icon's URL in the current user's browser
150
+ #
151
+ # @return [void]
152
+ #
153
+ def show_in_browser
154
+ return nil unless @uri
155
+ system "/usr/bin/open '#{@uri}'"
156
+ end
157
+
158
+ # Save the icon to a file.
159
+ #
160
+ # @param path[Pathname, String] The path to which the file should be saved.
161
+ # If the path given is an existing directory, the icon's current filename will
162
+ # be used, if known.
163
+ #
164
+ # @param overwrite[Boolean] Overwrite the file if it exists? Defaults to false
165
+ #
166
+ # @return [void]
167
+ #
168
+ def save(path, overwrite = false)
169
+ path = Pathname.new path
170
+ path = path + @name if path.directory? && @name
171
+
172
+ raise JSS::AlreadyExistsError, "The file #{path} already exists" if path.exist? unless overwrite
173
+ path.delete if path.exist?
174
+ path.jss_save @data
175
+ end
176
+
177
+ end # class icon
178
+
179
+ end # module
@@ -26,54 +26,54 @@
26
26
  ### A mix-in module providing object-updating via the JSS API.
27
27
  module JSS
28
28
 
29
- ### Module Variables
29
+ # Module Variables
30
30
  #####################################
31
31
 
32
- ### Module Methods
32
+ # Module Methods
33
33
  #####################################
34
34
 
35
- ### Sub-Modules
35
+ # Sub-Modules
36
36
  #####################################
37
37
 
38
- ### A mix-in module that allows objects to be updated in the JSS via the API.
39
- ###
40
- ### When a JSS::APIObject subclass includes this module, instances of that
41
- ### subclass can be modified in the JSS using the {#update} or {APIObject#save} methods.
42
- ###
43
- ### Such classes should define setter methods for any values that they wish to
44
- ### modify, such as the {#name=} method defined here. Those setter methods must:
45
- ### - ensure the correctness of the data they accept.
46
- ### - set @need_to_update to true, indicating that the local object no longer
47
- ### matches the JSS, and the changes should be pushed to the server with {#update}
48
- ###
49
- ### Classes mixing this module *must* provide a #rest_xml instance method that returns the XML
50
- ### String to be submitted to the API for object updating.
51
- ###
52
- ### @see APIObject#save
53
- ###
38
+ # A mix-in module that allows objects to be updated in the JSS via the API.
39
+ #
40
+ # When a JSS::APIObject subclass includes this module, instances of that
41
+ # subclass can be modified in the JSS using the {#update} or {APIObject#save} methods.
42
+ #
43
+ # Such classes should define setter methods for any values that they wish to
44
+ # modify, such as the {#name=} method defined here. Those setter methods must:
45
+ # - ensure the validity of the data they accept.
46
+ # - set @need_to_update to true, indicating that the local object no longer
47
+ # matches the JSS, and the changes should be pushed to the server with {#update}
48
+ #
49
+ # Classes mixing this module *must* provide a #rest_xml instance method that returns the XML
50
+ # String to be submitted to the API for object updating.
51
+ #
52
+ # @see_also APIObject#save
53
+ #
54
54
  module Updatable
55
55
 
56
- ### Constants
56
+ # Constants
57
57
  #####################################
58
58
 
59
59
  UPDATABLE = true
60
60
 
61
- ### Attributes
61
+ # Attributes
62
62
  #####################################
63
63
 
64
- ### @return [Boolean] do we have unsaved changes?
64
+ # @return [Boolean] do we have unsaved changes?
65
65
  attr_reader :need_to_update
66
66
 
67
- ### Mixed-in Instance Methods
67
+ # Mixed-in Instance Methods
68
68
  #####################################
69
69
 
70
- ### Change the name of this item
71
- ### Remember to #update to push changes to the server.
72
- ###
73
- ### @param newname[String] the new name
74
- ###
75
- ### @return [void]
76
- ###
70
+ # Change the name of this item
71
+ # Remember to #update to push changes to the server.
72
+ #
73
+ # @param newname[String] the new name
74
+ #
75
+ # @return [void]
76
+ #
77
77
  def name=(newname)
78
78
  return nil if @name == newname
79
79
  raise JSS::UnsupportedError, "Editing #{self.class::RSRC_LIST_KEY} isn't yet supported. Please use other Casper workflows." unless UPDATABLE
@@ -85,16 +85,17 @@ module JSS
85
85
  @need_to_update = true
86
86
  end # name=(newname)
87
87
 
88
- ### Save changes to the JSS
89
- ###
90
- ### @return [Boolean] success
91
- ###
88
+ # Save changes to the JSS
89
+ #
90
+ # @return [Boolean] success
91
+ #
92
92
  def update
93
93
  return nil unless @need_to_update
94
94
  raise JSS::UnsupportedError, "Editing #{self.class::RSRC_LIST_KEY} isn't yet supported. Please use other Casper workflows." unless UPDATABLE
95
95
  raise JSS::NoSuchItemError, "Not In JSS! Use #create to create this #{self.class::RSRC_OBJECT_KEY} in the JSS before updating it." unless @in_jss
96
96
  JSS::API.put_rsrc @rest_rsrc, rest_xml
97
97
  @need_to_update = false
98
+ refresh_icon if self_servable?
98
99
  @id
99
100
  end # update
100
101
 
@@ -27,107 +27,109 @@
27
27
  module JSS
28
28
 
29
29
  #####################################
30
- ### Module Variables
30
+ # Module Variables
31
31
  #####################################
32
32
 
33
33
  #####################################
34
- ### Module Methods
34
+ # Module Methods
35
35
  #####################################
36
36
 
37
37
  #####################################
38
- ### Sub-Modules
38
+ # Sub-Modules
39
39
  #####################################
40
40
 
41
- ###
42
- ### A mixin module providing file-upload capabilities to JSSAPIObject subclasses.
43
- ###
44
- ### Classes mixing in this module are required to define a constant UPLOAD_TYPES
45
- ### which is a Hash of :type => :resource pairs, like this:
46
- ###
47
- ### UPLOAD_TYPES = {
48
- ### :icon => :mobiledeviceapplicationsicon
49
- ### :app => mobiledeviceapplicationsipa
50
- ### :attachment => mobiledeviceapplications
51
- ### }
52
- ###
53
- ### with one pair for each type of upload that the class can handle.
54
- ### (most of them only handle one, usually :attachment)
55
- ###
56
- ### When the #upload method is called, one of the keys from that Hash must be specified
57
- ###
58
- ### Classes with only one upload type may want to redefine #upload to always call super with
59
- ### that one type.
60
- ###
61
- ### ----
62
- ###
63
- ### Implementation Notes from
64
- ### https://casperserver:8443/api/index.htm#!/fileuploads/uploadFiles_post
65
- ###
66
- ### POST ...JSSResource/fileuploads/<resource>/<idType>/<id>
67
- ###
68
- ### You can POST different types of files by entering parameters for <resource>, <idType>, and <id>.
69
- ### For example /JSSResource/fileuploads/computers/id/2.
70
- ###
71
- ### Attachments can be uploaded by specifying computers, mobiledevices, enrollmentprofiles, or
72
- ### peripherals as the resource.
73
- ###
74
- ### Icons can be uploaded by specifying policies, ebooks, or mobiledeviceapplicationsicon as the resource.
75
- ###
76
- ### A mobile device application can be uploaded by using mobiledeviceapplicationsipa as the resource.
77
- ###
78
- ### A disk encryption can be uploaded by specifying diskencryptionconfigurations as the resource.
79
- ###
80
- ### idTypes supported are "id" and "name", although peripheral names are not supported.
81
- ###
82
- ### A sample command is:
83
- ### curl -k -u user:password https://my.jss:8443/JSSResource/fileuploads/computers/id/2 -F name=@/Users/admin/Documents/Sample.doc -X POST
84
- ###
85
- ###
86
- ###
87
- ###
41
+ #
42
+ # A mixin module providing file-upload capabilities to JSSAPIObject subclasses.
43
+ #
44
+ # Classes mixing in this module are required to define a constant UPLOAD_TYPES
45
+ # which is a Hash of :type => :resource pairs, like this:
46
+ #
47
+ # UPLOAD_TYPES = {
48
+ # :icon => :mobiledeviceapplicationsicon
49
+ # :app => mobiledeviceapplicationsipa
50
+ # :attachment => mobiledeviceapplications
51
+ # }
52
+ #
53
+ # with one pair for each type of upload that the class can handle.
54
+ # (most of them only handle one, usually :attachment)
55
+ #
56
+ # When the #upload method is called, one of the keys from that Hash must be specified
57
+ #
58
+ # Classes with only one upload type may want to redefine #upload to always call super with
59
+ # that one type.
60
+ #
61
+ # ----
62
+ #
63
+ # Implementation Notes from
64
+ # https://casperserver:8443/api/index.htm#!/fileuploads/uploadFiles_post
65
+ #
66
+ # POST ...JSSResource/fileuploads/<resource>/<idType>/<id>
67
+ #
68
+ # You can POST different types of files by entering parameters for <resource>, <idType>, and <id>.
69
+ # For example /JSSResource/fileuploads/computers/id/2.
70
+ #
71
+ # Attachments can be uploaded by specifying computers, mobiledevices, enrollmentprofiles, or
72
+ # peripherals as the resource.
73
+ #
74
+ # Icons can be uploaded by specifying policies, ebooks, or mobiledeviceapplicationsicon as the resource.
75
+ #
76
+ # A mobile device application can be uploaded by using mobiledeviceapplicationsipa as the resource.
77
+ #
78
+ # A disk encryption can be uploaded by specifying diskencryptionconfigurations as the resource.
79
+ #
80
+ # idTypes supported are "id" and "name", although peripheral names are not supported.
81
+ #
82
+ # A sample command is:
83
+ # curl -k -u user:password https://my.jss:8443/JSSResource/fileuploads/computers/id/2 -F name=@/Users/admin/Documents/Sample.doc -X POST
84
+ #
85
+ #
86
+ #
87
+ #
88
88
  module Uploadable
89
89
 
90
90
  #####################################
91
- ### Constants
91
+ # Constants
92
92
  #####################################
93
93
 
94
+ UPLOADABLE = true
95
+
94
96
  UPLOAD_RSRC_PREFIX = 'fileuploads'.freeze
95
97
 
96
98
  #####################################
97
- ### Variables
99
+ # Variables
98
100
  #####################################
99
101
 
100
102
  #####################################
101
- ### Methods
103
+ # Methods
102
104
  #####################################
103
105
 
104
- ###
105
- ### Upload a file to the JSS via the REST Resource of the
106
- ### object to which this module is mixed in.
107
- ###
108
- ### @param type[Symbol] the type of upload happening.
109
- ### Must be one of the keys defined in the class's UPLOAD_TYPES Hash.
110
- ###
111
- ### @param local_file[String, Pathname] String or Pathname pointing to the
112
- ### locally-readable file to be uploaded.
113
- ###
114
- ### @return [String] The xml response from the server.
115
- ###
106
+ #
107
+ # Upload a file to the JSS via the REST Resource of the
108
+ # object to which this module is mixed in.
109
+ #
110
+ # @param type[Symbol] the type of upload happening.
111
+ # Must be one of the keys defined in the class's UPLOAD_TYPES Hash.
112
+ #
113
+ # @param local_file[String, Pathname] String or Pathname pointing to the
114
+ # locally-readable file to be uploaded.
115
+ #
116
+ # @return [String] The xml response from the server.
117
+ #
116
118
  def upload(type, local_file)
117
- ### the thing's gotta be in the JSS, and have an @id
119
+ # the thing's gotta be in the JSS, and have an @id
118
120
  raise JSS::NoSuchItemError, 'Create this #{self.class::RSRC_OBJECT_KEY} in the JSS before uploading files to it.' unless @id && @in_jss
119
121
 
120
- ### the type has to be defined in the class of self.
122
+ # the type has to be defined in the class of self.
121
123
  raise JSS::InvalidDataError, "#{self.class::RSRC_LIST_KEY} only take uploads of type: :#{self.class::UPLOAD_TYPES.keys.join(', :')}." \
122
124
  unless self.class::UPLOAD_TYPES.keys.include? type
123
125
 
124
- ### figure out the resource after the UPLOAD_RSRC_PREFIX
126
+ # figure out the resource after the UPLOAD_RSRC_PREFIX
125
127
  upload_rsrc = "#{UPLOAD_RSRC_PREFIX}/#{self.class::UPLOAD_TYPES[type]}/id/#{@id}"
126
128
 
127
- ### make a File object to hand to REST. 'rb' = read,binary
129
+ # make a File object to hand to REST. 'rb' = read,binary
128
130
  file = File.new local_file.to_s, 'rb'
129
131
 
130
- ### upload it!
132
+ # upload it!
131
133
  JSS::API.cnx[upload_rsrc].post name: file
132
134
  end # def upload file
133
135