ruby-jss 0.6.5 → 0.6.6
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.
- checksums.yaml +4 -4
- data/CHANGES.md +57 -5
- data/lib/jss.rb +78 -94
- data/lib/jss/api_connection.rb +8 -0
- data/lib/jss/api_object.rb +126 -102
- data/lib/jss/api_object/creatable.rb +33 -15
- data/lib/jss/api_object/distribution_point.rb +4 -1
- data/lib/jss/api_object/extension_attribute.rb +1 -1
- data/lib/jss/api_object/package.rb +121 -187
- data/lib/jss/api_object/policy.rb +590 -251
- data/lib/jss/api_object/script.rb +92 -128
- data/lib/jss/api_object/self_servable.rb +93 -117
- data/lib/jss/api_object/updatable.rb +12 -27
- data/lib/jss/api_object/uploadable.rb +12 -15
- data/lib/jss/client.rb +178 -156
- data/lib/jss/db_connection.rb +34 -49
- data/lib/jss/ruby_extensions/string.rb +25 -21
- data/lib/jss/version.rb +1 -1
- data/lib/jss/webhooks.rb +52 -0
- data/lib/jss/webhooks/README.md +269 -0
- data/lib/jss/webhooks/configuration.rb +212 -0
- data/lib/jss/webhooks/data/sample_handlers/RestAPIOperation-executable +90 -0
- data/lib/jss/webhooks/data/sample_handlers/RestAPIOperation.rb +44 -0
- data/lib/jss/webhooks/data/sample_jsons/ComputerAdded.json +27 -0
- data/lib/jss/webhooks/data/sample_jsons/ComputerCheckIn.json +27 -0
- data/lib/jss/webhooks/data/sample_jsons/ComputerInventoryCompleted.json +27 -0
- data/lib/jss/webhooks/data/sample_jsons/ComputerPolicyFinished.json +27 -0
- data/lib/jss/webhooks/data/sample_jsons/ComputerPushCapabilityChanged.json +27 -0
- data/lib/jss/webhooks/data/sample_jsons/JSSShutdown.json +14 -0
- data/lib/jss/webhooks/data/sample_jsons/JSSStartup.json +14 -0
- data/lib/jss/webhooks/data/sample_jsons/MobileDeviceCheckIn.json +26 -0
- data/lib/jss/webhooks/data/sample_jsons/MobileDeviceCommandCompleted.json +26 -0
- data/lib/jss/webhooks/data/sample_jsons/MobileDeviceEnrolled.json +26 -0
- data/lib/jss/webhooks/data/sample_jsons/MobileDevicePushSent.json +26 -0
- data/lib/jss/webhooks/data/sample_jsons/MobileDeviceUnEnrolled.json +26 -0
- data/lib/jss/webhooks/data/sample_jsons/PatchSoftwareTitleUpdated.json +14 -0
- data/lib/jss/webhooks/data/sample_jsons/PushSent.json +11 -0
- data/lib/jss/webhooks/data/sample_jsons/RestAPIOperation.json +15 -0
- data/lib/jss/webhooks/data/sample_jsons/SCEPChallenge.json +10 -0
- data/lib/jss/webhooks/data/sample_jsons/SmartGroupComputerMembershipChange.json +13 -0
- data/lib/jss/webhooks/data/sample_jsons/SmartGroupMobileDeviceMembershipChange.json +13 -0
- data/lib/jss/webhooks/event.rb +138 -0
- data/lib/jss/webhooks/event/computer_added.rb +37 -0
- data/lib/jss/webhooks/event/computer_check_in.rb +37 -0
- data/lib/jss/webhooks/event/computer_inventory_completed.rb +37 -0
- data/lib/jss/webhooks/event/computer_policy_finished.rb +37 -0
- data/lib/jss/webhooks/event/computer_push_capability_changed.rb +37 -0
- data/lib/jss/webhooks/event/handlers.rb +191 -0
- data/lib/jss/webhooks/event/jss_shutdown.rb +37 -0
- data/lib/jss/webhooks/event/jss_startup.rb +37 -0
- data/lib/jss/webhooks/event/mobile_device_check_in.rb +37 -0
- data/lib/jss/webhooks/event/mobile_device_command_completed.rb +37 -0
- data/lib/jss/webhooks/event/mobile_device_enrolled.rb +37 -0
- data/lib/jss/webhooks/event/mobile_device_push_sent.rb +37 -0
- data/lib/jss/webhooks/event/mobile_device_unenrolled.rb +37 -0
- data/lib/jss/webhooks/event/patch_software_title_updated.rb +37 -0
- data/lib/jss/webhooks/event/push_sent.rb +37 -0
- data/lib/jss/webhooks/event/rest_api_operation.rb +37 -0
- data/lib/jss/webhooks/event/scep_challenge.rb +37 -0
- data/lib/jss/webhooks/event/smart_group_computer_membership_change.rb +37 -0
- data/lib/jss/webhooks/event/smart_group_mobile_device_membership_change.rb +37 -0
- data/lib/jss/webhooks/event/webhook.rb +39 -0
- data/lib/jss/webhooks/event_objects.rb +111 -0
- data/lib/jss/webhooks/event_objects/computer.rb +48 -0
- data/lib/jss/webhooks/event_objects/jss.rb +35 -0
- data/lib/jss/webhooks/event_objects/mobile_device.rb +47 -0
- data/lib/jss/webhooks/event_objects/patch_software_title_update.rb +37 -0
- data/lib/jss/webhooks/event_objects/push.rb +32 -0
- data/lib/jss/webhooks/event_objects/rest_api_operation.rb +36 -0
- data/lib/jss/webhooks/event_objects/scep_challenge.rb +31 -0
- data/lib/jss/webhooks/event_objects/smart_group.rb +34 -0
- data/lib/jss/webhooks/server_app.rb +36 -0
- data/lib/jss/webhooks/server_app/routes.rb +26 -0
- data/lib/jss/webhooks/server_app/routes/handle_webhook_event.rb +38 -0
- data/lib/jss/webhooks/server_app/routes/home.rb +36 -0
- data/lib/jss/webhooks/server_app/self_signed_cert.rb +64 -0
- data/lib/jss/webhooks/server_app/server.rb +59 -0
- data/lib/jss/webhooks/version.rb +31 -0
- metadata +63 -4
@@ -1,47 +1,42 @@
|
|
1
1
|
### Copyright 2016 Pixar
|
2
|
-
###
|
2
|
+
###
|
3
3
|
### Licensed under the Apache License, Version 2.0 (the "Apache License")
|
4
4
|
### with the following modification; you may not use this file except in
|
5
5
|
### compliance with the Apache License and the following modification to it:
|
6
6
|
### Section 6. Trademarks. is deleted and replaced with:
|
7
|
-
###
|
7
|
+
###
|
8
8
|
### 6. Trademarks. This License does not grant permission to use the trade
|
9
9
|
### names, trademarks, service marks, or product names of the Licensor
|
10
10
|
### and its affiliates, except as required to comply with Section 4(c) of
|
11
11
|
### the License and to reproduce the content of the NOTICE file.
|
12
|
-
###
|
12
|
+
###
|
13
13
|
### You may obtain a copy of the Apache License at
|
14
|
-
###
|
14
|
+
###
|
15
15
|
### http://www.apache.org/licenses/LICENSE-2.0
|
16
|
-
###
|
16
|
+
###
|
17
17
|
### Unless required by applicable law or agreed to in writing, software
|
18
18
|
### distributed under the Apache License with the above modification is
|
19
19
|
### distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
20
20
|
### KIND, either express or implied. See the Apache License for the specific
|
21
21
|
### language governing permissions and limitations under the Apache License.
|
22
|
-
###
|
22
|
+
###
|
23
23
|
###
|
24
24
|
|
25
25
|
###
|
26
26
|
module JSS
|
27
27
|
|
28
|
-
#####################################
|
29
28
|
### Module Constants
|
30
29
|
#####################################
|
31
30
|
|
32
|
-
#####################################
|
33
31
|
### Module Variables
|
34
32
|
#####################################
|
35
33
|
|
36
|
-
#####################################
|
37
34
|
### Module Methods
|
38
35
|
#####################################
|
39
36
|
|
40
|
-
#####################################
|
41
37
|
### Classes
|
42
38
|
#####################################
|
43
39
|
|
44
|
-
###
|
45
40
|
### A Script in the JSS.
|
46
41
|
###
|
47
42
|
### As of Casper 9.4, the script contents as stored in the database are
|
@@ -60,23 +55,20 @@ module JSS
|
|
60
55
|
###
|
61
56
|
class Script < JSS::APIObject
|
62
57
|
|
63
|
-
#####################################
|
64
58
|
### Mix-Ins
|
65
59
|
#####################################
|
66
60
|
|
67
61
|
include JSS::Creatable
|
68
62
|
include JSS::Updatable
|
69
63
|
|
70
|
-
#####################################
|
71
64
|
### Class Methods
|
72
65
|
#####################################
|
73
66
|
|
74
|
-
#####################################
|
75
67
|
### Class Constants
|
76
68
|
#####################################
|
77
69
|
|
78
70
|
### The base for REST resources of this class
|
79
|
-
RSRC_BASE =
|
71
|
+
RSRC_BASE = 'scripts'.freeze
|
80
72
|
|
81
73
|
### the hash key used for the JSON list output of all objects in the JSS
|
82
74
|
RSRC_LIST_KEY = :scripts
|
@@ -86,21 +78,20 @@ module JSS
|
|
86
78
|
RSRC_OBJECT_KEY = :script
|
87
79
|
|
88
80
|
### these keys, as well as :id and :name, are present in valid API JSON data for this class
|
89
|
-
VALID_DATA_KEYS = [:parameters, :filename, :os_requirements
|
81
|
+
VALID_DATA_KEYS = [:parameters, :filename, :os_requirements].freeze
|
90
82
|
|
91
83
|
### The script storage folder on the distribution point, if used
|
92
|
-
DIST_POINT_SCRIPTS_FOLDER =
|
84
|
+
DIST_POINT_SCRIPTS_FOLDER = 'Scripts'.freeze
|
93
85
|
|
94
86
|
### Priority to use for running the script in relation to other actions during imaging
|
95
|
-
PRIORITIES = [
|
87
|
+
PRIORITIES = ['Before', 'After', 'At Reboot'].freeze
|
96
88
|
|
97
89
|
### which is default?
|
98
|
-
DEFAULT_PRIORITY =
|
90
|
+
DEFAULT_PRIORITY = 'After'.freeze
|
99
91
|
|
100
92
|
### The keys used in the @parameters Hash
|
101
|
-
PARAMETER_KEYS = [:parameter4, :parameter5, :parameter6
|
93
|
+
PARAMETER_KEYS = [:parameter4, :parameter5, :parameter6, :parameter7, :parameter8, :parameter9, :parameter10, :parameter11].freeze
|
102
94
|
|
103
|
-
#####################################
|
104
95
|
### Attributes
|
105
96
|
#####################################
|
106
97
|
|
@@ -128,29 +119,23 @@ module JSS
|
|
128
119
|
### @return {String] the actual code for this script, if it's stored in the database.
|
129
120
|
attr_reader :script_contents
|
130
121
|
|
131
|
-
|
132
|
-
#####################################
|
133
122
|
### Constructor
|
134
123
|
#####################################
|
135
124
|
|
136
125
|
###
|
137
|
-
|
138
|
-
###
|
139
|
-
def initialize (args = {})
|
126
|
+
def initialize(args = {})
|
140
127
|
super
|
141
128
|
|
142
129
|
@category = JSS::APIObject.get_name(@init_data[:category])
|
143
130
|
@filename = @init_data[:filename] || @name
|
144
131
|
@info = @init_data[:info]
|
145
132
|
@notes = @init_data[:notes]
|
146
|
-
@os_requirements = @init_data[:os_requirements] ? JSS.to_s_and_a(@init_data[:os_requirements]
|
133
|
+
@os_requirements = @init_data[:os_requirements] ? JSS.to_s_and_a(@init_data[:os_requirements])[:arrayform] : []
|
147
134
|
@parameters = @init_data[:parameters] ? @init_data[:parameters] : {}
|
148
135
|
@priority = @init_data[:priority] || DEFAULT_PRIORITY
|
149
|
-
@script_contents =
|
150
|
-
|
136
|
+
@script_contents = @init_data[:script_contents]
|
151
137
|
end # initialize
|
152
138
|
|
153
|
-
###
|
154
139
|
### Change the script filename
|
155
140
|
###
|
156
141
|
### Setting it to nil will make it match the script name
|
@@ -162,8 +147,7 @@ module JSS
|
|
162
147
|
### @note This method does NOT change the filename on the distribution point
|
163
148
|
### if that's where you store your scripts.
|
164
149
|
###
|
165
|
-
def filename=
|
166
|
-
|
150
|
+
def filename=(new_val)
|
167
151
|
new_val = nil if new_val == ''
|
168
152
|
new_val = @name unless new_val
|
169
153
|
|
@@ -171,9 +155,8 @@ module JSS
|
|
171
155
|
|
172
156
|
@filename = new_val
|
173
157
|
@need_to_update = true
|
174
|
-
end #filename=
|
158
|
+
end # filename=
|
175
159
|
|
176
|
-
###
|
177
160
|
### Change the script's display name
|
178
161
|
###
|
179
162
|
### If the filename is the same as the name, the filename will be changed also
|
@@ -182,7 +165,7 @@ module JSS
|
|
182
165
|
###
|
183
166
|
### @return [void]
|
184
167
|
###
|
185
|
-
def name=
|
168
|
+
def name=(new_val)
|
186
169
|
return nil if new_val == @name
|
187
170
|
new_val = nil if new_val == ''
|
188
171
|
raise JSS::MissingDataError, "Name can't be empty" unless new_val
|
@@ -195,9 +178,8 @@ module JSS
|
|
195
178
|
### if our REST resource is based on the name, update that too
|
196
179
|
@rest_rsrc = "#{RSRC_BASE}/name/#{CGI.escape @name}" if @rest_rsrc.include? '/name/'
|
197
180
|
@need_to_update = true
|
198
|
-
end #name=
|
181
|
+
end # name=
|
199
182
|
|
200
|
-
###
|
201
183
|
### Change the os_requirements
|
202
184
|
###
|
203
185
|
### Minumum OS's can be specified as a string using the notation ">=10.6.7"
|
@@ -217,90 +199,84 @@ module JSS
|
|
217
199
|
### @example Minimum OS
|
218
200
|
### myscript.os_requirements ">=10.7.5"
|
219
201
|
###
|
220
|
-
def os_requirements=
|
202
|
+
def os_requirements=(new_val)
|
221
203
|
### nil should be an empty array
|
222
204
|
new_val = [] if new_val.to_s.empty?
|
223
205
|
|
224
206
|
### if any value starts with >=, expand it
|
225
207
|
case new_val
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
208
|
+
when String
|
209
|
+
new_val = JSS.expand_min_os(new_val) if new_val =~ /^>=/
|
210
|
+
when Array
|
211
|
+
new_val.map! { |a| a =~ /^>=/ ? JSS.expand_min_os(a) : a }
|
212
|
+
new_val.flatten!
|
213
|
+
new_val.uniq!
|
214
|
+
else
|
215
|
+
raise JSS::InvalidDataError, 'os_requirements must be a String or an Array of strings'
|
234
216
|
end # case
|
235
217
|
|
236
218
|
### get the array version
|
237
219
|
@os_requirements = JSS.to_s_and_a(new_val)[:arrayform]
|
238
220
|
@need_to_update = true
|
221
|
+
end # os_requirements=
|
239
222
|
|
240
|
-
end #os_requirements=
|
241
|
-
|
242
|
-
###
|
243
223
|
### Change the priority of this script
|
244
224
|
###
|
245
225
|
### @param new_val[Integer] the new priority, which must be one of {PRIORITIES}
|
246
226
|
###
|
247
227
|
### @return [void]
|
248
228
|
###
|
249
|
-
def priority=
|
229
|
+
def priority=(new_val)
|
250
230
|
return nil if new_val == @priority
|
251
|
-
new_val = DEFAULT_PRIORITY if new_val.nil?
|
231
|
+
new_val = DEFAULT_PRIORITY if new_val.nil? || (new_val == '')
|
252
232
|
raise JSS::InvalidDataError, ":priority must be one of: #{PRIORITIES.join ', '}" unless PRIORITIES.include? new_val
|
253
233
|
@priority = new_val
|
254
234
|
@need_to_update = true
|
255
|
-
end #priority=
|
235
|
+
end # priority=
|
256
236
|
|
257
|
-
###
|
258
237
|
### Change the info field
|
259
238
|
###
|
260
239
|
### @param new_val[String] the new info
|
261
240
|
###
|
262
241
|
### @return [void]
|
263
242
|
###
|
264
|
-
def info=
|
243
|
+
def info=(new_val)
|
265
244
|
return nil if new_val == @info
|
266
245
|
### line breaks should be \r
|
267
|
-
new_val = new_val.to_s.
|
246
|
+
new_val = new_val.to_s.tr("\n", "\r")
|
268
247
|
@info = new_val
|
269
248
|
@need_to_update = true
|
270
|
-
end #info=
|
249
|
+
end # info=
|
271
250
|
|
272
|
-
###
|
273
251
|
### Change the notes field
|
274
252
|
###
|
275
253
|
### @param new_val[String] the new notes
|
276
254
|
###
|
277
255
|
### @return [void]
|
278
256
|
###
|
279
|
-
def notes=
|
257
|
+
def notes=(new_val)
|
280
258
|
return nil if new_val == @notes
|
281
259
|
### line breaks should be \r
|
282
|
-
new_val = new_val.to_s.
|
260
|
+
new_val = new_val.to_s.tr("\n", "\r")
|
283
261
|
@notes = new_val
|
284
262
|
@need_to_update = true
|
285
|
-
end #notes=
|
263
|
+
end # notes=
|
286
264
|
|
287
|
-
###
|
288
265
|
### Change the category
|
289
266
|
###
|
290
267
|
### @param new_val[String] the name of the new category, which must be in {JSS::Category.all_names}
|
291
268
|
###
|
292
269
|
### @return [void]
|
293
270
|
###
|
294
|
-
def category=
|
271
|
+
def category=(new_val)
|
295
272
|
return nil if new_val == @category
|
296
273
|
new_val = nil if new_val == ''
|
297
274
|
new_val ||= JSS::Category::DEFAULT_CATEGORY
|
298
275
|
raise JSS::InvalidDataError, "Category #{new_val} is not known to the JSS" unless JSS::Category.all_names.include? new_val
|
299
276
|
@need_to_update = true
|
300
277
|
@category = new_val
|
301
|
-
end #category=
|
278
|
+
end # category=
|
302
279
|
|
303
|
-
###
|
304
280
|
### Replace all the script parameters at once.
|
305
281
|
###
|
306
282
|
### This will replace the entire set with the hash provided.
|
@@ -309,21 +285,21 @@ module JSS
|
|
309
285
|
###
|
310
286
|
### @return [void]
|
311
287
|
###
|
312
|
-
def parameters=
|
288
|
+
def parameters=(new_val)
|
313
289
|
return nil if new_val == @parameters
|
314
|
-
new_val = {} if new_val.nil?
|
290
|
+
new_val = {} if new_val.nil? || (new_val == '')
|
315
291
|
|
316
292
|
### check the values
|
317
|
-
raise JSS::InvalidDataError,
|
318
|
-
|
319
|
-
|
293
|
+
raise JSS::InvalidDataError, ':parameters must be a Hash with keys :parameter4 thru :parameter11' unless \
|
294
|
+
new_val.is_a?(Hash) && ((new_val.keys & PARAMETER_KEYS) == new_val.keys)
|
295
|
+
new_val.each do |_k, v|
|
296
|
+
raise JSS::InvalidDataError, ':parameter values must be strings or nil' unless v.nil? || v.is_a?(String)
|
320
297
|
end
|
321
298
|
|
322
299
|
@parameters = new_val
|
323
300
|
@need_to_update = true
|
324
301
|
end # parameters=
|
325
302
|
|
326
|
-
###
|
327
303
|
### Change one of the stored parameters
|
328
304
|
###
|
329
305
|
### @param param_num[Integer] which param are we setting? must be 4..11
|
@@ -332,16 +308,15 @@ module JSS
|
|
332
308
|
###
|
333
309
|
### @return [void]
|
334
310
|
###
|
335
|
-
def set_parameter
|
336
|
-
raise JSS::NoSuchItemError,
|
311
|
+
def set_parameter(param_num, new_val)
|
312
|
+
raise JSS::NoSuchItemError, 'Parameter numbers must be from 4-11' unless (4..11).cover? param_num
|
337
313
|
pkey = "parameter#{param_num}".to_sym
|
338
|
-
raise JSS::InvalidDataError,
|
314
|
+
raise JSS::InvalidDataError, 'parameter values must be strings or nil' unless new_val.nil? || new_val.is_a?(String)
|
339
315
|
return nil if new_val == @parameters[pkey]
|
340
316
|
@parameters[pkey] = new_val
|
341
317
|
@need_to_update = true
|
342
318
|
end
|
343
319
|
|
344
|
-
###
|
345
320
|
### Change the executable code of this script.
|
346
321
|
###
|
347
322
|
### If the arg is a Pathname instance, or a String starting with "/"
|
@@ -356,20 +331,19 @@ module JSS
|
|
356
331
|
###
|
357
332
|
### @return [void]
|
358
333
|
###
|
359
|
-
def script_contents=
|
360
|
-
|
334
|
+
def script_contents=(new_val)
|
361
335
|
new_code = case new_val
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
336
|
+
when String
|
337
|
+
if new_val.start_with? '/'
|
338
|
+
Pathname.new(new_val).read
|
339
|
+
else
|
340
|
+
new_val
|
341
|
+
end # if
|
342
|
+
when Pathname
|
343
|
+
new_val.read
|
344
|
+
else
|
345
|
+
raise JSS::InvalidDataError, 'New code must be a String (path or code) or Pathname instance'
|
346
|
+
end # case
|
373
347
|
|
374
348
|
raise JSS::InvalidDataError, "Script contents must start with '#!'" unless new_code.start_with? '#!'
|
375
349
|
|
@@ -377,7 +351,6 @@ module JSS
|
|
377
351
|
@need_to_update = true
|
378
352
|
end
|
379
353
|
|
380
|
-
###
|
381
354
|
### Save the @script_contents for this script to a file on the Master Distribution point.
|
382
355
|
###
|
383
356
|
### If you'll be uploading several files you can specify unmount as false, and do it manually when all
|
@@ -391,18 +364,17 @@ module JSS
|
|
391
364
|
###
|
392
365
|
### @return [void]
|
393
366
|
###
|
394
|
-
def upload_master_file(
|
395
|
-
raise JSS::MissingDataError,
|
367
|
+
def upload_master_file(rw_pw, unmount = true)
|
368
|
+
raise JSS::MissingDataError, 'No code specified. Use #code= first.' if @script_contents.nil? || @script_contents.empty?
|
396
369
|
|
397
370
|
mdp = JSS::DistributionPoint.master_distribution_point
|
398
|
-
raise JSS::InvaldDatatError,
|
371
|
+
raise JSS::InvaldDatatError, 'Incorrect password for read-write access to master distribution point.' unless mdp.check_pw :rw, rw_pw
|
399
372
|
|
400
373
|
destination = mdp.mount(rw_pw, :rw) + "#{DIST_POINT_SCRIPTS_FOLDER}/#{@filename}"
|
401
374
|
destination.save @script_contents
|
402
375
|
mdp.unmount if unmount
|
403
376
|
end # upload
|
404
377
|
|
405
|
-
###
|
406
378
|
### Delete the filename from the master distribution point, if it exists.
|
407
379
|
###
|
408
380
|
### If you'll be uploading several files you can specify unmount as false, and do it manually when all
|
@@ -423,11 +395,9 @@ module JSS
|
|
423
395
|
did_it = false
|
424
396
|
end # if exists
|
425
397
|
JSS::DistributionPoint.master_distribution_point.unmount if unmount
|
426
|
-
|
398
|
+
did_it
|
427
399
|
end
|
428
400
|
|
429
|
-
|
430
|
-
###
|
431
401
|
### Run this script on the current machine using the "jamf runScript" command.
|
432
402
|
###
|
433
403
|
### If the script code is available in the {#script_contents} attribute, then that
|
@@ -482,9 +452,8 @@ module JSS
|
|
482
452
|
### p1-p8, and that's how they are expected as options to #run. So if :p1=> "new param" is given as an
|
483
453
|
### aption to #run, it will override any value that the API provided in @parameters[:parameter4]
|
484
454
|
###
|
485
|
-
def run(
|
486
|
-
|
487
|
-
opts[:target] ||= "/"
|
455
|
+
def run(opts = {})
|
456
|
+
opts[:target] ||= '/'
|
488
457
|
opts[:p1] ||= @parameters[:parameter4]
|
489
458
|
opts[:p2] ||= @parameters[:parameter5]
|
490
459
|
opts[:p3] ||= @parameters[:parameter6]
|
@@ -500,14 +469,14 @@ module JSS
|
|
500
469
|
begin
|
501
470
|
|
502
471
|
# do we have the code already? if so, save it out and make it executable
|
503
|
-
if @script_contents
|
472
|
+
if @script_contents && !@script_contents.empty?
|
504
473
|
|
505
474
|
script_path = JSS::Client::DOWNLOADS_FOLDER
|
506
475
|
|
507
476
|
executable = script_path + @filename
|
508
477
|
|
509
478
|
executable.jss_touch
|
510
|
-
executable.chmod
|
479
|
+
executable.chmod 0o700
|
511
480
|
executable.jss_save @script_contents
|
512
481
|
delete_exec = true
|
513
482
|
|
@@ -528,63 +497,60 @@ module JSS
|
|
528
497
|
|
529
498
|
end # if @script_contents and (not @script_contents.empty?)
|
530
499
|
|
531
|
-
|
532
500
|
# build the command as an array.
|
533
|
-
command_arry = [
|
501
|
+
command_arry = ['-script', @filename, '-path', script_path.to_s]
|
534
502
|
|
535
|
-
command_arry <<
|
503
|
+
command_arry << '-target'
|
536
504
|
command_arry << opts[:target].to_s
|
537
505
|
|
538
|
-
command_arry <<
|
506
|
+
command_arry << '-computerName' if opts[:computer_name]
|
539
507
|
command_arry << opts[:computer_name] if opts[:computer_name]
|
540
508
|
|
541
|
-
command_arry <<
|
509
|
+
command_arry << '-username' if opts[:username]
|
542
510
|
command_arry << opts[:username] if opts[:username]
|
543
511
|
|
544
|
-
command_arry <<
|
512
|
+
command_arry << '-p1' if opts[:p1]
|
545
513
|
command_arry << opts[:p1] if opts[:p1]
|
546
514
|
|
547
|
-
command_arry <<
|
515
|
+
command_arry << '-p2' if opts[:p2]
|
548
516
|
command_arry << opts[:p2] if opts[:p2]
|
549
517
|
|
550
|
-
command_arry <<
|
518
|
+
command_arry << '-p3' if opts[:p3]
|
551
519
|
command_arry << opts[:p3] if opts[:p3]
|
552
520
|
|
553
|
-
command_arry <<
|
521
|
+
command_arry << '-p4' if opts[:p4]
|
554
522
|
command_arry << opts[:p4] if opts[:p4]
|
555
523
|
|
556
|
-
command_arry <<
|
524
|
+
command_arry << '-p5' if opts[:p5]
|
557
525
|
command_arry << opts[:p5] if opts[:p5]
|
558
526
|
|
559
|
-
command_arry <<
|
527
|
+
command_arry << '-p6' if opts[:p6]
|
560
528
|
command_arry << opts[:p6] if opts[:p6]
|
561
529
|
|
562
|
-
command_arry <<
|
530
|
+
command_arry << '-p7' if opts[:p7]
|
563
531
|
command_arry << opts[:p7] if opts[:p7]
|
564
532
|
|
565
|
-
command_arry <<
|
533
|
+
command_arry << '-p8' if opts[:p8]
|
566
534
|
command_arry << opts[:p8] if opts[:p8]
|
567
535
|
|
568
|
-
command_arry <<
|
536
|
+
command_arry << '-verbose' if opts[:verbose]
|
569
537
|
|
570
538
|
command = command_arry.shelljoin
|
571
539
|
|
572
|
-
jamf_output = JSS::Client.run_jamf
|
540
|
+
jamf_output = JSS::Client.run_jamf 'runScript', command, opts[:show_output]
|
573
541
|
|
574
542
|
jamf_output =~ /^.*Script exit code: (\d+)(\D|$)/
|
575
543
|
|
576
|
-
script_exitstatus =
|
544
|
+
script_exitstatus = Regexp.last_match(1).to_i
|
577
545
|
|
578
546
|
ensure
|
579
|
-
executable.delete if delete_exec
|
580
|
-
dist_point.unmount if
|
547
|
+
executable.delete if delete_exec && executable.exist?
|
548
|
+
dist_point.unmount if dp_mount_pt && dp_mount_pt.mountpoint? && opts[:unmount]
|
581
549
|
end # begin/ensure
|
582
550
|
|
583
|
-
|
584
|
-
|
551
|
+
[script_exitstatus, jamf_output]
|
585
552
|
end # def run
|
586
553
|
|
587
|
-
|
588
554
|
# aliases under their methods seem to confuse the YARD documenter, so I'm putting them all here.
|
589
555
|
alias oses os_requirements
|
590
556
|
alias oses= os_requirements=
|
@@ -593,19 +559,16 @@ module JSS
|
|
593
559
|
alias contents script_contents
|
594
560
|
alias contents= script_contents=
|
595
561
|
|
596
|
-
|
597
|
-
#####################################
|
598
562
|
### Private Instance Methods
|
599
563
|
#####################################
|
600
564
|
|
601
565
|
private
|
602
566
|
|
603
|
-
###
|
604
567
|
### Return the xml for creating or updating this script in the JSS
|
605
568
|
###
|
606
569
|
def rest_xml
|
607
570
|
doc = REXML::Document.new
|
608
|
-
scpt = doc.add_element
|
571
|
+
scpt = doc.add_element 'script'
|
609
572
|
scpt.add_element('category').text = @category
|
610
573
|
scpt.add_element('filename').text = @filename
|
611
574
|
scpt.add_element('id').text = @id
|
@@ -619,13 +582,14 @@ module JSS
|
|
619
582
|
scpt.add_element('parameters').text = nil
|
620
583
|
else
|
621
584
|
pars = scpt.add_element('parameters')
|
622
|
-
PARAMETER_KEYS.each {|p| pars.add_element(p.to_s).text = @parameters[p]}
|
585
|
+
PARAMETER_KEYS.each { |p| pars.add_element(p.to_s).text = @parameters[p] }
|
623
586
|
end
|
624
587
|
|
625
588
|
scpt.add_element('script_contents_encoded').text = Base64.encode64(@script_contents)
|
626
589
|
|
627
|
-
|
590
|
+
doc.to_s
|
628
591
|
end # rest xml
|
629
592
|
|
630
593
|
end # class Script
|
631
|
-
|
594
|
+
|
595
|
+
end # module
|