ruby-jss 2.1.0b5 → 2.1.1
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.
- checksums.yaml +4 -4
- data/CHANGES.md +15 -1
- data/bin/cgrouper +3 -6
- data/bin/netseg-update +9 -5
- data/lib/jamf/api/classic/api_objects/computer.rb +1 -1
- data/lib/jamf/api/classic/api_objects/distribution_point.rb +17 -41
- data/lib/jamf/api/classic/api_objects/patch_title.rb +4 -4
- data/lib/jamf/api/classic/api_objects/policy.rb +77 -55
- data/lib/jamf/api/classic/xml_workaround.rb +3 -1
- data/lib/jamf/api/connection/attributes.rb +8 -8
- data/lib/jamf/api/connection/classic_api.rb +10 -1
- data/lib/jamf/api/connection/constants.rb +2 -0
- data/lib/jamf/api/connection/jamf_pro_api.rb +7 -1
- data/lib/jamf/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: efe85ea732df2a1ce119273c532084459fdb9ebe6316d62ab7afa533d9c4adc8
|
4
|
+
data.tar.gz: e42de1baecb51f2886d704e63818d24063d4332a0b17170c2977aa3e336656a5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a0874d08b6c7fc3aa93c207c81ab3a09c0b822e5f035ddb5192144d04fbe3a846db6c6528a8150cd81a2ee9f994155d4b7ba396d11ef7ecf565c9330b99aae6
|
7
|
+
data.tar.gz: fb3bdf758de69f290974def92a42ff279f1c98611373116304fbe618b0536f59361d892c3444db88c952c2208bb7cfbf0763cba8a959bd84cffb3ca5f8bee8e7
|
data/CHANGES.md
CHANGED
@@ -14,7 +14,19 @@ __Please update all installations of ruby-jss to at least v1.6.0.__
|
|
14
14
|
|
15
15
|
Many many thanks to actae0n of Blacksun Hackers Club for reporting this issue and providing examples of how it could be exploited.
|
16
16
|
|
17
|
-
|
17
|
+
--------
|
18
|
+
|
19
|
+
## \[2.1.1] - 2022-11-07
|
20
|
+
|
21
|
+
### Fixed & Deprecated
|
22
|
+
|
23
|
+
- The classic API no longer includes SHA256 hashes of various passwords - the data value is there, but only contains a string of asterisks. As such, ruby-jss can no longer use those to validate some passwords before trying to use them. The methods doing so are still present, but only return `true`. If an incorrect password is given, the underlying process that uses it will fail on its own.
|
24
|
+
These methods will be removed in a future version of ruby-jss:
|
25
|
+
- `Jamf::DistributionPoint#check_pw` Used mostly by the `Jamf::DistributionPoint#mount` method
|
26
|
+
- `Jamf::Policy.verify_management_password`
|
27
|
+
|
28
|
+
|
29
|
+
## \[2.1.0] - 2022-10-10
|
18
30
|
|
19
31
|
### Added
|
20
32
|
|
@@ -34,6 +46,8 @@ Many many thanks to actae0n of Blacksun Hackers Club for reporting this issue an
|
|
34
46
|
- A few internal rescues of a deprecated exception class
|
35
47
|
- Removed auto-loading of deprecation files; now explicitly loaded.
|
36
48
|
- A few Ruby 2 => Ruby 3 bugs - method params needing double-splats (Thanks to @Timelost for reporting this one)
|
49
|
+
- Ensure resource paths don't start with a slash
|
50
|
+
- Setting the timeouts on an existing API connection object now works.
|
37
51
|
|
38
52
|
## \[2.0.0] - 2022-09-12
|
39
53
|
|
data/bin/cgrouper
CHANGED
@@ -55,7 +55,7 @@ class App
|
|
55
55
|
###
|
56
56
|
### set up
|
57
57
|
###
|
58
|
-
def initialize
|
58
|
+
def initialize
|
59
59
|
@debug = false
|
60
60
|
|
61
61
|
# define the options
|
@@ -207,7 +207,7 @@ class App
|
|
207
207
|
|
208
208
|
# smart groups can't have some things done to them
|
209
209
|
if ACTIONS_FOR_STATIC_GROUPS_ONLY.include? @options.action and @group.smart?
|
210
|
-
raise InvalidTypeError,
|
210
|
+
raise InvalidTypeError,
|
211
211
|
"You can't do that to a smart group. Use the JSS WebApp if needed."
|
212
212
|
end
|
213
213
|
|
@@ -384,7 +384,6 @@ Notes:
|
|
384
384
|
return unless @options.action == :create_group or confirm "add computers to group '#{@group.name}'"
|
385
385
|
|
386
386
|
@options.computers.each do |c|
|
387
|
-
|
388
387
|
@group.add_member c
|
389
388
|
rescue JSS::NoSuchItemError
|
390
389
|
puts "#{$!} - skipping"
|
@@ -404,11 +403,9 @@ Notes:
|
|
404
403
|
return unless confirm "remove computers from group '#{@group.name}'"
|
405
404
|
|
406
405
|
@options.computers.each do |c|
|
407
|
-
|
408
406
|
@group.remove_member c
|
409
407
|
rescue JSS::NoSuchItemError
|
410
408
|
puts "#{$!} - skipping"
|
411
|
-
|
412
409
|
end
|
413
410
|
@group.update
|
414
411
|
end
|
@@ -459,7 +456,7 @@ end # class App
|
|
459
456
|
|
460
457
|
#######################################
|
461
458
|
begin
|
462
|
-
app = App.new
|
459
|
+
app = App.new
|
463
460
|
app.run
|
464
461
|
rescue
|
465
462
|
# handle exceptions not handled elsewhere
|
data/bin/netseg-update
CHANGED
@@ -55,13 +55,13 @@ class App
|
|
55
55
|
|
56
56
|
USAGE = "Usage: #{PROG_NAME} [options] [--help] /path/to/file".freeze
|
57
57
|
|
58
|
-
POTENTIAL_COLUMNS = %i
|
58
|
+
POTENTIAL_COLUMNS = %i[name starting ending cidr mask].freeze
|
59
59
|
|
60
60
|
DEFAULT_CACHE_FILE = Pathname.new('~/.last_subnet_update').expand_path
|
61
61
|
|
62
62
|
DEFAULT_DELIMITER = "\t".freeze
|
63
63
|
|
64
|
-
DEFAULT_COLUMNS = [
|
64
|
+
DEFAULT_COLUMNS = %i[name starting ending].freeze
|
65
65
|
|
66
66
|
DEFAULT_MANUAL_PREFIX = 'Manual-'.freeze
|
67
67
|
|
@@ -84,7 +84,7 @@ class App
|
|
84
84
|
|
85
85
|
attr_reader :debug
|
86
86
|
|
87
|
-
def initialize
|
87
|
+
def initialize
|
88
88
|
@getpass = $stdin.tty? ? :prompt : :stdin
|
89
89
|
set_defaults
|
90
90
|
parse_cli
|
@@ -183,7 +183,7 @@ Options:
|
|
183
183
|
-V, --no-verify-cert - Allow self-signed, unverified SSL certificate
|
184
184
|
-T, --timeout secs - specify the JSS API timeout
|
185
185
|
-N, --no-op - Don't make any changes in the JSS, just report what would
|
186
|
-
have
|
186
|
+
have been changed.
|
187
187
|
-H, --help - show this help
|
188
188
|
--debug - show the ruby backtrace when errors occur
|
189
189
|
|
@@ -254,6 +254,7 @@ Notes:
|
|
254
254
|
lines.each do |line|
|
255
255
|
parsed_line = parse_a_data_line line
|
256
256
|
next unless parsed_line
|
257
|
+
|
257
258
|
name = parsed_line.delete :name
|
258
259
|
parsed_data[name] = parsed_line
|
259
260
|
end
|
@@ -273,6 +274,7 @@ Notes:
|
|
273
274
|
@columns.include?(:ending) || \
|
274
275
|
@columns.include?(:cidr) || \
|
275
276
|
@columns.include?(:mask)
|
277
|
+
|
276
278
|
@use_cidr = (@columns.include?(:cidr) || @columns.include?(:mask))
|
277
279
|
end
|
278
280
|
|
@@ -296,11 +298,13 @@ Notes:
|
|
296
298
|
# read in the file
|
297
299
|
@raw_data = @file.read
|
298
300
|
return true unless @cache_file.exist?
|
301
|
+
|
299
302
|
@raw_data != @cache_file.read
|
300
303
|
end
|
301
304
|
|
302
305
|
def cache_latest_data
|
303
306
|
return if @noop
|
307
|
+
|
304
308
|
@cache_file.jss_save @raw_data
|
305
309
|
end
|
306
310
|
|
@@ -375,7 +379,7 @@ end # app
|
|
375
379
|
# create the app and go
|
376
380
|
begin
|
377
381
|
debug = ARGV.include? '--debug'
|
378
|
-
app = App.new
|
382
|
+
app = App.new
|
379
383
|
app.run
|
380
384
|
rescue
|
381
385
|
# handle exceptions not handled elsewhere
|
@@ -440,7 +440,7 @@ module Jamf
|
|
440
440
|
cnx = api if api
|
441
441
|
|
442
442
|
id = valid_id ident, cnx: cnx
|
443
|
-
raise "No computer matches identifier: #{ident}" unless id
|
443
|
+
raise Jamf::NoSuchItemError, "No computer matches identifier: #{ident}" unless id
|
444
444
|
|
445
445
|
end_date ||= start_date
|
446
446
|
start_date = Jamf.parse_time start_date
|
@@ -259,8 +259,8 @@ module Jamf
|
|
259
259
|
attr_reader :ssh_password_sha256
|
260
260
|
|
261
261
|
def initialize(**args)
|
262
|
-
super
|
263
|
-
|
262
|
+
super
|
263
|
+
|
264
264
|
@ip_address = @init_data[:ip_address]
|
265
265
|
@local_path = @init_data[:local_path]
|
266
266
|
@enable_load_balancing = @init_data[:enable_load_balancing]
|
@@ -294,44 +294,28 @@ module Jamf
|
|
294
294
|
|
295
295
|
@port = @init_data[:ssh_password]
|
296
296
|
|
297
|
-
# Note, as of Casper 9.3:
|
298
|
-
# :management_password_md5=>"xxxxx"
|
299
|
-
# and
|
300
|
-
# :management_password_sha256=> "xxxxxxxxxx"
|
301
|
-
# Are the read/write password
|
302
|
-
#
|
303
|
-
# An empty passwd is
|
304
|
-
# MD5 = d41d8cd98f00b204e9800998ecf8427e
|
305
|
-
# SHA256 = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
306
|
-
#
|
307
|
-
# Seemms the read-only pw isn't available in the API
|
308
|
-
|
309
297
|
# if we mount for fileservice, where's the mountpoint?
|
310
298
|
@mountpoint = DEFAULT_MOUNTPOINT_DIR + "#{DEFAULT_MOUNTPOINT_PREFIX}#{@id}"
|
311
299
|
end # init
|
312
300
|
|
313
|
-
#
|
301
|
+
# @deprecated The API no longer sends SHA256 hashed password data, and instead
|
302
|
+
# only has a string of asterisks, meaning we can no longer use it to validate
|
303
|
+
# passwords before attempting to use them. Instead, the processes that use
|
304
|
+
# them, e.g. mounting a Dist. Point, will fail on their own if the pw is not
|
305
|
+
# valid.
|
314
306
|
#
|
315
|
-
#
|
307
|
+
# This method remains defined for backward-compatibility with any existing
|
308
|
+
# code that calls it. but it will always return true. It will be removed in
|
309
|
+
# a future version
|
316
310
|
#
|
317
|
-
# @param
|
311
|
+
# @param user[Symbol] ignored
|
318
312
|
#
|
319
|
-
# @
|
320
|
-
# nil is returned if there is no password set in the JSS.
|
313
|
+
# @param pw[String] ignored
|
321
314
|
#
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
when :rw then @read_write_password_sha256
|
327
|
-
when :ro then @read_only_password_sha256
|
328
|
-
when :http then @http_password_sha256
|
329
|
-
when :ssh then @ssh_password_sha256
|
330
|
-
end # case
|
331
|
-
|
332
|
-
return nil if sha256 == EMPTY_PW_256
|
333
|
-
|
334
|
-
sha256 == Digest::SHA2.new(256).update(pw).to_s
|
315
|
+
# @return [TrueClass] Allow the process calling this to continue.
|
316
|
+
#
|
317
|
+
def check_pw(_user = nil, _pw = nil)
|
318
|
+
true
|
335
319
|
end
|
336
320
|
|
337
321
|
# Check to see if this dist point is reachable for downloads (read-only)
|
@@ -350,7 +334,6 @@ module Jamf
|
|
350
334
|
def reachable_for_download?(pw = '', check_http = true)
|
351
335
|
return :http if check_http && http_reachable?(pw)
|
352
336
|
return :mountable if mounted?
|
353
|
-
return false unless check_pw :ro, pw
|
354
337
|
|
355
338
|
begin
|
356
339
|
mount pw, :ro
|
@@ -371,7 +354,6 @@ module Jamf
|
|
371
354
|
#
|
372
355
|
def reachable_for_upload?(pw)
|
373
356
|
return :mountable if mounted?
|
374
|
-
return false unless check_pw :rw, pw
|
375
357
|
|
376
358
|
begin
|
377
359
|
mount pw, :rw
|
@@ -413,12 +395,6 @@ module Jamf
|
|
413
395
|
pw
|
414
396
|
end
|
415
397
|
|
416
|
-
pwok = check_pw(access, password)
|
417
|
-
unless pwok
|
418
|
-
msg = pwok.nil? ? "No #{access} password set in the JSS" : "Incorrect password for #{access} account"
|
419
|
-
raise Jamf::InvalidDataError, msg
|
420
|
-
end
|
421
|
-
|
422
398
|
username = access == :ro ? @read_only_username : @read_write_username
|
423
399
|
|
424
400
|
safe_pw = CGI.escape password.to_s
|
@@ -481,7 +457,7 @@ module Jamf
|
|
481
457
|
private
|
482
458
|
|
483
459
|
# can the dp be reached for http downloads?
|
484
|
-
def http_reachable?(pw)
|
460
|
+
def http_reachable?(pw = nil)
|
485
461
|
return false unless http_downloads_enabled
|
486
462
|
|
487
463
|
url =
|
@@ -154,7 +154,7 @@ module Jamf
|
|
154
154
|
# when fetching a specific version, this is a valid version
|
155
155
|
UNKNOWN_VERSION_ID = 'Unknown'.freeze
|
156
156
|
|
157
|
-
REPORTS_RSRC_BASE = '
|
157
|
+
REPORTS_RSRC_BASE = 'patchreports/patchsoftwaretitleid'.freeze
|
158
158
|
|
159
159
|
# Class Methods
|
160
160
|
#######################################
|
@@ -233,7 +233,7 @@ module Jamf
|
|
233
233
|
all(refresh, cnx: cnx).map { |i| i[:source_name_id] }
|
234
234
|
end
|
235
235
|
|
236
|
-
# Get a patch report for a softwaretitle,
|
236
|
+
# Get a patch report for a softwaretitle, without fetching an instance.
|
237
237
|
# Defaults to reporting all versions. Specifiying a version will be faster.
|
238
238
|
#
|
239
239
|
# The Hash returned has 3 keys:
|
@@ -269,6 +269,7 @@ module Jamf
|
|
269
269
|
|
270
270
|
# TODO: remove this and adjust parsing when jamf fixes the JSON
|
271
271
|
raw_report = XMLWorkaround.data_via_xml(rsrc, PATCH_REPORT_DATA_MAP, cnx)[:patch_report]
|
272
|
+
|
272
273
|
report = {}
|
273
274
|
report[:total_computers] = raw_report[:total_computers]
|
274
275
|
report[:total_versions] = raw_report[:total_versions]
|
@@ -312,7 +313,7 @@ module Jamf
|
|
312
313
|
# so all other lookup values have to be converted to ID before
|
313
314
|
# the call to super
|
314
315
|
#
|
315
|
-
def self.fetch(identifier = nil, **params)
|
316
|
+
def self.fetch(identifier = nil, **params)
|
316
317
|
# default connection if unspecified
|
317
318
|
cnx = params.delete :cnx
|
318
319
|
cnx ||= params.delete :api # backward compatibility, deprecated
|
@@ -472,7 +473,6 @@ module Jamf
|
|
472
473
|
# wrapper to fetch versions after creating
|
473
474
|
def create
|
474
475
|
super
|
475
|
-
|
476
476
|
end
|
477
477
|
|
478
478
|
# wrapper to clear @changed_pkgs after updating
|
@@ -166,7 +166,7 @@ module Jamf
|
|
166
166
|
selected: 'Currently Selected Startup Disk (No Bless)',
|
167
167
|
netboot: 'NetBoot',
|
168
168
|
os_installer: 'inPlaceOSUpgradeDirectory'
|
169
|
-
}.freeze #
|
169
|
+
}.freeze # NOTE: any other value in :specify_startup is a path to some other drive to boot from, e.g. /Volumes/Foo
|
170
170
|
|
171
171
|
ACCOUNT_ACTIONS = {
|
172
172
|
create: 'Create',
|
@@ -200,9 +200,9 @@ module Jamf
|
|
200
200
|
}.freeze
|
201
201
|
|
202
202
|
DISK_ENCRYPTION_ACTIONS = {
|
203
|
-
apply:
|
204
|
-
remediate:
|
205
|
-
none:
|
203
|
+
apply: 'apply',
|
204
|
+
remediate: 'remediate',
|
205
|
+
none: 'none'
|
206
206
|
}
|
207
207
|
|
208
208
|
PRINTER_ACTIONS = {
|
@@ -751,7 +751,7 @@ module Jamf
|
|
751
751
|
@management_account = amaint[:management_account]
|
752
752
|
@accounts = amaint[:accounts]
|
753
753
|
|
754
|
-
@packages = @init_data[:package_configuration][:packages]
|
754
|
+
@packages = @init_data[:package_configuration][:packages] || []
|
755
755
|
|
756
756
|
@scripts = @init_data[:scripts]
|
757
757
|
|
@@ -815,6 +815,7 @@ module Jamf
|
|
815
815
|
#
|
816
816
|
def enabled=(new_val)
|
817
817
|
return if @enabled == new_val
|
818
|
+
|
818
819
|
@enabled = Jamf::Validate.boolean new_val
|
819
820
|
@need_to_update = true
|
820
821
|
end
|
@@ -868,9 +869,7 @@ module Jamf
|
|
868
869
|
|
869
870
|
# if the event is not 'none' and attempts is <= 0,
|
870
871
|
# set events to 1, or the API won't accept it
|
871
|
-
|
872
|
-
@retry_attempts = 1 unless @retry_attempts.positive?
|
873
|
-
end
|
872
|
+
@retry_attempts = 1 if !(evt == RETRY_EVENTS[:none]) && !@retry_attempts.positive?
|
874
873
|
|
875
874
|
@retry_event = evt
|
876
875
|
@need_to_update = true
|
@@ -934,6 +933,7 @@ module Jamf
|
|
934
933
|
#
|
935
934
|
def target_drive=(path_to_drive)
|
936
935
|
raise Jamf::InvalidDataError, 'Path to target drive must be absolute' unless path_to_drive.to_s.start_with? '/'
|
936
|
+
|
937
937
|
@target_drive = path_to_drive.to_s
|
938
938
|
@need_to_update = true
|
939
939
|
end
|
@@ -946,6 +946,7 @@ module Jamf
|
|
946
946
|
#
|
947
947
|
def offline=(new_val)
|
948
948
|
raise Jamf::InvalidDataError, 'New value must be boolean true or false' unless Jamf::TRUE_FALSE.include? new_val
|
949
|
+
|
949
950
|
@offline = new_val
|
950
951
|
@need_to_update = true
|
951
952
|
end
|
@@ -960,6 +961,7 @@ module Jamf
|
|
960
961
|
#
|
961
962
|
def set_trigger_event(type, new_val)
|
962
963
|
raise Jamf::InvalidDataError, "Trigger type must be one of #{TRIGGER_EVENTS.keys.join(', ')}" unless TRIGGER_EVENTS.key?(type)
|
964
|
+
|
963
965
|
if type == :custom
|
964
966
|
raise Jamf::InvalidDataError, 'Custom triggers must be Strings' unless new_val.is_a? String
|
965
967
|
else
|
@@ -977,6 +979,7 @@ module Jamf
|
|
977
979
|
#
|
978
980
|
def server_side_activation=(activation)
|
979
981
|
raise Jamf::InvalidDataError, 'Activation must be a Time' unless activation.is_a? Time
|
982
|
+
|
980
983
|
@server_side_limitations[:activation] = activation
|
981
984
|
@need_to_update = true
|
982
985
|
end
|
@@ -989,6 +992,7 @@ module Jamf
|
|
989
992
|
#
|
990
993
|
def server_side_expiration=(expiration)
|
991
994
|
raise Jamf::InvalidDataError, 'Expiration must be a Time' unless expiration.is_a? Time
|
995
|
+
|
992
996
|
@server_side_limitations[:expiration] = expiration
|
993
997
|
@need_to_update = true
|
994
998
|
end
|
@@ -999,6 +1003,7 @@ module Jamf
|
|
999
1003
|
#
|
1000
1004
|
def verify_startup_disk=(bool)
|
1001
1005
|
return if @verify_startup_disk == bool
|
1006
|
+
|
1002
1007
|
@verify_startup_disk = Jamf::Validate.boolean bool
|
1003
1008
|
@need_to_update = true
|
1004
1009
|
end
|
@@ -1007,6 +1012,7 @@ module Jamf
|
|
1007
1012
|
#
|
1008
1013
|
def permissions_repair=(bool)
|
1009
1014
|
return if @permissions_repair == bool
|
1015
|
+
|
1010
1016
|
@permissions_repair = Jamf::Validate.boolean bool
|
1011
1017
|
@need_to_update = true
|
1012
1018
|
end
|
@@ -1015,6 +1021,7 @@ module Jamf
|
|
1015
1021
|
#
|
1016
1022
|
def recon=(bool)
|
1017
1023
|
return if @recon == bool
|
1024
|
+
|
1018
1025
|
@recon = Jamf::Validate.boolean bool
|
1019
1026
|
@need_to_update = true
|
1020
1027
|
end
|
@@ -1024,6 +1031,7 @@ module Jamf
|
|
1024
1031
|
#
|
1025
1032
|
def fix_byhost=(bool)
|
1026
1033
|
return if @fix_byhost == bool
|
1034
|
+
|
1027
1035
|
@fix_byhost = Jamf::Validate.boolean bool
|
1028
1036
|
@need_to_update = true
|
1029
1037
|
end
|
@@ -1032,6 +1040,7 @@ module Jamf
|
|
1032
1040
|
#
|
1033
1041
|
def reset_name=(bool)
|
1034
1042
|
return if @reset_name == bool
|
1043
|
+
|
1035
1044
|
@reset_name = Jamf::Validate.boolean bool
|
1036
1045
|
@need_to_update = true
|
1037
1046
|
end
|
@@ -1040,6 +1049,7 @@ module Jamf
|
|
1040
1049
|
#
|
1041
1050
|
def flush_system_cache=(bool)
|
1042
1051
|
return if @flush_system_cache == bool
|
1052
|
+
|
1043
1053
|
@flush_system_cache = Jamf::Validate.boolean bool
|
1044
1054
|
@need_to_update = true
|
1045
1055
|
end # see attr_reader :recon
|
@@ -1048,6 +1058,7 @@ module Jamf
|
|
1048
1058
|
#
|
1049
1059
|
def install_cached_pkgs=(bool)
|
1050
1060
|
return if @install_cached_pkgs == bool
|
1061
|
+
|
1051
1062
|
@install_cached_pkgs = Jamf::Validate.boolean bool
|
1052
1063
|
@need_to_update = true
|
1053
1064
|
end
|
@@ -1056,6 +1067,7 @@ module Jamf
|
|
1056
1067
|
#
|
1057
1068
|
def flush_user_cache=(bool)
|
1058
1069
|
return if @flush_user_cache == bool
|
1070
|
+
|
1059
1071
|
@flush_user_cache = Jamf::Validate.boolean bool
|
1060
1072
|
@need_to_update = true
|
1061
1073
|
end
|
@@ -1071,6 +1083,7 @@ module Jamf
|
|
1071
1083
|
#
|
1072
1084
|
def no_user_logged_in=(no_user_option)
|
1073
1085
|
raise Jamf::InvalidDataError, "no_user_logged_in options: #{NO_USER_LOGGED_IN.join(', ')}" unless NO_USER_LOGGED_IN.include? no_user_option
|
1086
|
+
|
1074
1087
|
@reboot_options[:no_user_logged_in] = no_user_option
|
1075
1088
|
@need_to_update = true
|
1076
1089
|
end
|
@@ -1083,6 +1096,7 @@ module Jamf
|
|
1083
1096
|
#
|
1084
1097
|
def user_logged_in=(logged_in_option)
|
1085
1098
|
raise Jamf::InvalidDataError, "user_logged_in options: #{USER_LOGGED_IN.join(', ')}" unless USER_LOGGED_IN.include? logged_in_option
|
1099
|
+
|
1086
1100
|
@reboot_options[:user_logged_in] = logged_in_option
|
1087
1101
|
@need_to_update = true
|
1088
1102
|
end
|
@@ -1095,6 +1109,7 @@ module Jamf
|
|
1095
1109
|
#
|
1096
1110
|
def reboot_message=(message)
|
1097
1111
|
raise Jamf::InvalidDataError, 'Reboot message must be a String' unless message.is_a? String
|
1112
|
+
|
1098
1113
|
@reboot_options[:message] = message
|
1099
1114
|
@need_to_update = true
|
1100
1115
|
end
|
@@ -1107,6 +1122,7 @@ module Jamf
|
|
1107
1122
|
# @return [void] description of returned object
|
1108
1123
|
def user_message_start=(message)
|
1109
1124
|
raise Jamf::InvalidDataError, 'User message must be a String' unless message.is_a? String
|
1125
|
+
|
1110
1126
|
@user_message_start = message
|
1111
1127
|
@need_to_update = true
|
1112
1128
|
end
|
@@ -1118,6 +1134,7 @@ module Jamf
|
|
1118
1134
|
# @return [void] description of returned object
|
1119
1135
|
def user_message_end=(message)
|
1120
1136
|
raise Jamf::InvalidDataError, 'User message must be a String' unless message.is_a? String
|
1137
|
+
|
1121
1138
|
@user_message_finish = message
|
1122
1139
|
@need_to_update = true
|
1123
1140
|
end
|
@@ -1133,6 +1150,7 @@ module Jamf
|
|
1133
1150
|
#
|
1134
1151
|
def startup_disk=(startup_disk_option)
|
1135
1152
|
raise Jamf::InvalidDataError, "#{startup_disk_option} is not a valid Startup Disk" unless startup_disk_option.is_a? String
|
1153
|
+
|
1136
1154
|
@reboot_options[:startup_disk] = 'Specify Local Startup Disk'
|
1137
1155
|
self.specify_startup = startup_disk_option
|
1138
1156
|
@need_to_update = true
|
@@ -1147,6 +1165,7 @@ module Jamf
|
|
1147
1165
|
#
|
1148
1166
|
def specify_startup=(startup_volume)
|
1149
1167
|
raise Jamf::InvalidDataError, "#{startup_volume} is not a valid Startup Disk" unless startup_volume.is_a? String
|
1168
|
+
|
1150
1169
|
@reboot_options[:specify_startup] = startup_volume
|
1151
1170
|
@need_to_update = true
|
1152
1171
|
end
|
@@ -1172,6 +1191,7 @@ module Jamf
|
|
1172
1191
|
#
|
1173
1192
|
def minutes_until_reboot=(minutes)
|
1174
1193
|
raise Jamf::InvalidDataError, 'Minutes until reboot must be an Integer' unless minutes.is_a? Integer
|
1194
|
+
|
1175
1195
|
@reboot_options[:minutes_until_reboot] = minutes
|
1176
1196
|
@need_to_update = true
|
1177
1197
|
end
|
@@ -1185,6 +1205,7 @@ module Jamf
|
|
1185
1205
|
#
|
1186
1206
|
def file_vault_2_reboot=(fv_bool)
|
1187
1207
|
raise Jamf::InvalidDataError, 'FileVault 2 Reboot must be a Boolean' unless fv_bool.jss_boolean?
|
1208
|
+
|
1188
1209
|
@reboot_options[:file_vault_2_reboot] = fv_bool
|
1189
1210
|
@need_to_update = true
|
1190
1211
|
end
|
@@ -1206,6 +1227,7 @@ module Jamf
|
|
1206
1227
|
#
|
1207
1228
|
def run_command=(command)
|
1208
1229
|
raise Jamf::InvalidDataError, 'Command to run must be a String' unless command.is_a? String
|
1230
|
+
|
1209
1231
|
@files_processes[:run_command] = command
|
1210
1232
|
@need_to_update = true
|
1211
1233
|
end
|
@@ -1262,7 +1284,7 @@ module Jamf
|
|
1262
1284
|
#
|
1263
1285
|
def search_by_path
|
1264
1286
|
if @files_processes[:search_by_path].nil?
|
1265
|
-
|
1287
|
+
nil
|
1266
1288
|
else
|
1267
1289
|
Pathname.new @files_processes[:search_by_path]
|
1268
1290
|
end
|
@@ -1289,6 +1311,7 @@ module Jamf
|
|
1289
1311
|
#
|
1290
1312
|
def set_search_by_path(path, delete = false)
|
1291
1313
|
raise Jamf::InvalidDataError, 'Path to search for must be a String or a Pathname' unless path.is_a?(String) || path.is_a?(Pathname)
|
1314
|
+
|
1292
1315
|
@files_processes[:search_by_path] = path.to_s
|
1293
1316
|
@files_processes[:delete_file] = delete ? true : false
|
1294
1317
|
@need_to_update = true
|
@@ -1308,6 +1331,7 @@ module Jamf
|
|
1308
1331
|
#
|
1309
1332
|
def spotlight_search=(term)
|
1310
1333
|
raise Jamf::InvalidDataError, 'Spotlight search term must be a String' unless term.is_a? String
|
1334
|
+
|
1311
1335
|
@files_processes[:spotlight_search] = term
|
1312
1336
|
@need_to_update = true
|
1313
1337
|
end
|
@@ -1326,6 +1350,7 @@ module Jamf
|
|
1326
1350
|
#
|
1327
1351
|
def locate_file=(term)
|
1328
1352
|
raise Jamf::InvalidDataError, 'Term to locate must be a String' unless term.is_a? String
|
1353
|
+
|
1329
1354
|
@files_processes[:locate_file] = term
|
1330
1355
|
@need_to_update = true
|
1331
1356
|
end
|
@@ -1571,7 +1596,6 @@ module Jamf
|
|
1571
1596
|
@directory_bindings
|
1572
1597
|
end
|
1573
1598
|
|
1574
|
-
|
1575
1599
|
# Remove a directory binding from this policy by name or id
|
1576
1600
|
#
|
1577
1601
|
# @param identifier [String,Integer] the name or id of the directory binding to remove
|
@@ -1596,7 +1620,6 @@ module Jamf
|
|
1596
1620
|
@dock_items.map { |p| p[:name] }
|
1597
1621
|
end
|
1598
1622
|
|
1599
|
-
|
1600
1623
|
###### Printers
|
1601
1624
|
|
1602
1625
|
# Add a specific printer object to the policy.
|
@@ -1661,7 +1684,7 @@ module Jamf
|
|
1661
1684
|
|
1662
1685
|
name = Jamf::DockItem.map_all_ids_to(:name, cnx: @cnx)[id]
|
1663
1686
|
|
1664
|
-
@dock_items << {id: id, name: name, action: DOCK_ITEM_ACTIONS[action]}
|
1687
|
+
@dock_items << { id: id, name: name, action: DOCK_ITEM_ACTIONS[action] }
|
1665
1688
|
|
1666
1689
|
@need_to_update = true
|
1667
1690
|
@dock_items
|
@@ -1677,24 +1700,18 @@ module Jamf
|
|
1677
1700
|
|
1678
1701
|
# @return [Array] the id's of the printers handled by the policy
|
1679
1702
|
def printer_ids
|
1680
|
-
|
1681
|
-
|
1682
|
-
|
1683
|
-
return []
|
1684
|
-
end
|
1703
|
+
@printers.map { |p| p[:id] }
|
1704
|
+
rescue TypeError
|
1705
|
+
[]
|
1685
1706
|
end
|
1686
1707
|
|
1687
1708
|
# @return [Array] the names of the printers handled by the policy
|
1688
1709
|
def printer_names
|
1689
|
-
|
1690
|
-
|
1691
|
-
|
1692
|
-
return []
|
1693
|
-
end
|
1710
|
+
@printers.map { |p| p[:name] }
|
1711
|
+
rescue TypeError
|
1712
|
+
[]
|
1694
1713
|
end
|
1695
1714
|
|
1696
|
-
|
1697
|
-
|
1698
1715
|
###### Disk Encryption
|
1699
1716
|
|
1700
1717
|
# Sets the Disk Encryption application to "Remediate" and sets the remediation key type to individual.
|
@@ -1703,12 +1720,12 @@ module Jamf
|
|
1703
1720
|
#
|
1704
1721
|
# @return [Void]
|
1705
1722
|
#
|
1706
|
-
def reissue_key
|
1723
|
+
def reissue_key
|
1707
1724
|
if @disk_encryption[:action] != DISK_ENCRYPTION_ACTIONS[:remediate]
|
1708
1725
|
# Setting New Action
|
1709
1726
|
hash = {
|
1710
1727
|
action: DISK_ENCRYPTION_ACTIONS[:remediate],
|
1711
|
-
remediate_key_type:
|
1728
|
+
remediate_key_type: 'Individual'
|
1712
1729
|
}
|
1713
1730
|
|
1714
1731
|
@disk_encryption = hash
|
@@ -1716,12 +1733,10 @@ module Jamf
|
|
1716
1733
|
|
1717
1734
|
else
|
1718
1735
|
# Update
|
1719
|
-
|
1736
|
+
nil
|
1720
1737
|
end
|
1721
|
-
|
1722
1738
|
end
|
1723
1739
|
|
1724
|
-
|
1725
1740
|
# Sets the Disk Encryption application to "Apply" and sets the correct disk encryption configuration ID using either the name or id.
|
1726
1741
|
#
|
1727
1742
|
# @author Tyler Morgan
|
@@ -1729,7 +1744,6 @@ module Jamf
|
|
1729
1744
|
# @return [Void]
|
1730
1745
|
#
|
1731
1746
|
def apply_encryption_configuration(identifier)
|
1732
|
-
|
1733
1747
|
id = Jamf::DiskEncryptionConfiguration.valid_id identifier
|
1734
1748
|
|
1735
1749
|
return if id.nil?
|
@@ -1744,14 +1758,13 @@ module Jamf
|
|
1744
1758
|
@need_to_update = true
|
1745
1759
|
end
|
1746
1760
|
|
1747
|
-
|
1748
1761
|
# Removes the Disk Encryption settings associated with this specific policy.
|
1749
1762
|
#
|
1750
1763
|
# @author Tyler Morgan
|
1751
1764
|
#
|
1752
1765
|
# @return [Void]
|
1753
1766
|
#
|
1754
|
-
def remove_encryption_configuration
|
1767
|
+
def remove_encryption_configuration
|
1755
1768
|
hash = {
|
1756
1769
|
action: DISK_ENCRYPTION_ACTIONS[:none]
|
1757
1770
|
}
|
@@ -1774,16 +1787,16 @@ module Jamf
|
|
1774
1787
|
|
1775
1788
|
management_data = {}
|
1776
1789
|
|
1777
|
-
if
|
1778
|
-
raise Jamf::MissingDataError,
|
1790
|
+
if %i[change_pw reset_pw].include?(action)
|
1791
|
+
raise Jamf::MissingDataError, ':password must be provided when changing management account password' if opts[:password].nil?
|
1779
1792
|
|
1780
1793
|
management_data = {
|
1781
1794
|
action: MGMT_ACCOUNT_ACTIONS[action],
|
1782
1795
|
managed_password: opts[:password]
|
1783
1796
|
}
|
1784
|
-
elsif
|
1785
|
-
raise Jamf::MissingDataError,
|
1786
|
-
raise Jamf::InvalidDataError,
|
1797
|
+
elsif %i[reset_random generate_pw].include?(action)
|
1798
|
+
raise Jamf::MissingDataError, ':password_length must be provided when setting a random password' if opts[:password_length].nil?
|
1799
|
+
raise Jamf::InvalidDataError, ':password_length must be an Integer' unless opts[:password_length].is_a? Integer
|
1787
1800
|
|
1788
1801
|
management_data = {
|
1789
1802
|
action: MGMT_ACCOUNT_ACTIONS[action],
|
@@ -1800,21 +1813,23 @@ module Jamf
|
|
1800
1813
|
@need_to_update = true
|
1801
1814
|
|
1802
1815
|
@management_account
|
1803
|
-
|
1804
1816
|
end
|
1805
1817
|
|
1806
|
-
#
|
1818
|
+
# @deprecated The API no longer sends SHA256 hashed password data, and instead
|
1819
|
+
# only has a string of asterisks, meaning we can no longer use it to validate
|
1820
|
+
# passwords before attempting to use them. Instead, the processes that use
|
1821
|
+
# the password will fail on their own if the pw is not valid.
|
1807
1822
|
#
|
1808
|
-
#
|
1823
|
+
# This method remains defined for backward-compatibility with any existing
|
1824
|
+
# code that calls it. but it will always return true. Itwill be removed in
|
1825
|
+
# a future version
|
1809
1826
|
#
|
1810
|
-
# @
|
1827
|
+
# @param password[String] ignored
|
1811
1828
|
#
|
1812
|
-
|
1813
|
-
|
1814
|
-
|
1815
|
-
|
1816
|
-
|
1817
|
-
return Digest::SHA256.hexdigest(password).to_s == @management_account[:managed_password_sha256].to_s
|
1829
|
+
# @return [TrueClass] Allow the process calling this to continue.
|
1830
|
+
#
|
1831
|
+
def verify_management_password(_password = nil)
|
1832
|
+
true
|
1818
1833
|
end
|
1819
1834
|
|
1820
1835
|
###### Actions
|
@@ -1829,8 +1844,10 @@ module Jamf
|
|
1829
1844
|
#
|
1830
1845
|
def run(show_output = false)
|
1831
1846
|
return nil unless enabled?
|
1847
|
+
|
1832
1848
|
output = Jamf::Client.run_jamf('policy', "-id #{id}", show_output)
|
1833
1849
|
return nil if output.include? 'No policies were found for the ID'
|
1850
|
+
|
1834
1851
|
$CHILD_STATUS.exitstatus.zero? ? true : false
|
1835
1852
|
end
|
1836
1853
|
alias execute run
|
@@ -1944,6 +1961,7 @@ module Jamf
|
|
1944
1961
|
|
1945
1962
|
id = Jamf::Script.valid_id identifier, cnx: @cnx
|
1946
1963
|
raise Jamf::NoSuchItemError, "No script matches '#{identifier}'" unless id
|
1964
|
+
|
1947
1965
|
id
|
1948
1966
|
end
|
1949
1967
|
|
@@ -1963,12 +1981,13 @@ module Jamf
|
|
1963
1981
|
else Jamf::Validate.integer(opts[:position])
|
1964
1982
|
end
|
1965
1983
|
|
1966
|
-
|
1967
|
-
|
1984
|
+
# if the given position is past the end, set it to -1 (the end)
|
1985
|
+
opts[:position] = -1 if opts[:position] > @directory_bindings.size
|
1986
|
+
|
1987
|
+
id = Jamf::DirectoryBinding.valid_id identifier, cnx: @cnx
|
1988
|
+
raise Jamf::NoSuchItemError, "No directory binding matches '#{identifier}'" unless id
|
1968
1989
|
|
1969
|
-
|
1970
|
-
raise Jamf::NoSuchItemError, "No directory binding matches '#{identifier}'" unless id
|
1971
|
-
id
|
1990
|
+
id
|
1972
1991
|
end
|
1973
1992
|
|
1974
1993
|
# Raises an error if the printer being added isn't valid, additionally checks the options and sets defaults where possible.
|
@@ -1994,14 +2013,17 @@ module Jamf
|
|
1994
2013
|
raise Jamf::MissingDataError, "action must be provided, must be one of :#{PRINTER_ACTIONS.keys.join(':,')}." if opts[:action].nil?
|
1995
2014
|
raise Jamf::InvalidDataError, "action must be one of :#{PRINTER_ACTIONS.keys.join(',:')}." unless PRINTER_ACTIONS.keys.include? opts[:action]
|
1996
2015
|
|
1997
|
-
|
1998
2016
|
# Checks if the make_default option is valid, and sets the default if needed.
|
1999
|
-
|
2017
|
+
unless opts[:make_default].is_a?(TrueClass) || opts[:make_default].is_a?(FalseClass) || opts[:make_default].nil?
|
2018
|
+
raise Jamf::InvalidDataError,
|
2019
|
+
'make_default must be either true or false.'
|
2020
|
+
end
|
2000
2021
|
|
2001
2022
|
opts[:make_default] = false if opts[:make_default].nil?
|
2002
2023
|
|
2003
2024
|
id = Jamf::Printer.valid_id identifier, cnx: @cnx
|
2004
2025
|
raise Jamf::NoSuchItemError, "No printer matches '#{identifier}'" unless id
|
2026
|
+
|
2005
2027
|
id
|
2006
2028
|
end
|
2007
2029
|
|
@@ -2081,7 +2103,7 @@ module Jamf
|
|
2081
2103
|
|
2082
2104
|
disk_encryption = obj.add_element 'disk_encryption'
|
2083
2105
|
|
2084
|
-
@disk_encryption.each do |k,v|
|
2106
|
+
@disk_encryption.each do |k, v|
|
2085
2107
|
disk_encryption.add_element(k.to_s).text = v.to_s
|
2086
2108
|
end
|
2087
2109
|
|
@@ -150,7 +150,8 @@ module Jamf
|
|
150
150
|
element ? element.text.to_f : model
|
151
151
|
when nil
|
152
152
|
return nil unless element
|
153
|
-
|
153
|
+
|
154
|
+
element.text.downcase == TRUE_STRING
|
154
155
|
when Array
|
155
156
|
element ? elem_as_array(model.first, element) : []
|
156
157
|
when Hash
|
@@ -176,6 +177,7 @@ module Jamf
|
|
176
177
|
return unless size_elems.count == 1
|
177
178
|
return if size_elem.has_elements?
|
178
179
|
return unless size_elem.text.jss_integer?
|
180
|
+
|
179
181
|
elem.delete_element size_elem
|
180
182
|
end
|
181
183
|
|
@@ -74,15 +74,15 @@ module Jamf
|
|
74
74
|
attr_reader :sticky_session
|
75
75
|
alias sticky_session? sticky_session
|
76
76
|
alias sticky? sticky_session
|
77
|
-
|
77
|
+
|
78
78
|
# @return [String, nil] The current sticky_session cookie. nil unless
|
79
79
|
# sticky_session is set to true, either as a param to 'connect' or via
|
80
80
|
# #sticky_session=
|
81
81
|
#
|
82
|
-
# When set via .connect, the cookie is gleaned from the token creation
|
82
|
+
# When set via .connect, the cookie is gleaned from the token creation
|
83
83
|
# reponse. When set via #sticky_session=, a HEAD request is made, and the
|
84
84
|
# cookie will be in the response.
|
85
|
-
#
|
85
|
+
#
|
86
86
|
# Only valid when the connection is to a Jamf Cloud server.
|
87
87
|
attr_reader :sticky_session_cookie
|
88
88
|
|
@@ -100,7 +100,7 @@ module Jamf
|
|
100
100
|
|
101
101
|
# convert boolean-y to boolean
|
102
102
|
value = value ? true : false
|
103
|
-
|
103
|
+
|
104
104
|
return if @sticky_session == value
|
105
105
|
|
106
106
|
if value
|
@@ -125,8 +125,8 @@ module Jamf
|
|
125
125
|
#
|
126
126
|
def timeout=(new_timeout)
|
127
127
|
@timeout = new_timeout.to_i
|
128
|
-
@c_cnx
|
129
|
-
@jp_cnx
|
128
|
+
@c_cnx.options.timeout = @timeout if @c_cnx
|
129
|
+
@jp_cnx.options.timeout = @timeout if @jp_cnx
|
130
130
|
end
|
131
131
|
|
132
132
|
# Reset the open-connection timeout for the rest connection
|
@@ -137,8 +137,8 @@ module Jamf
|
|
137
137
|
#
|
138
138
|
def open_timeout=(new_timeout)
|
139
139
|
@open_timeout = new_timeout.to_i
|
140
|
-
@c_cnx
|
141
|
-
@jp_cnx
|
140
|
+
@c_cnx.options.open_timeout = @open_timeout if @c_cnx
|
141
|
+
@jp_cnx.options.open_timeout = @open_timeout if @jp_cnx
|
142
142
|
end
|
143
143
|
|
144
144
|
# @return [URI::HTTPS] the base URL to the server
|
@@ -59,6 +59,8 @@ module Jamf
|
|
59
59
|
# @return [Hash,String] the result of the get
|
60
60
|
#
|
61
61
|
def c_get(rsrc, format = :json, raw_json: false)
|
62
|
+
rsrc = rsrc.delete_prefix Jamf::Connection::SLASH
|
63
|
+
|
62
64
|
validate_connected @c_cnx
|
63
65
|
raise Jamf::InvalidDataError, 'format must be :json or :xml' unless Jamf::Connection::GET_FORMATS.include?(format)
|
64
66
|
|
@@ -92,6 +94,8 @@ module Jamf
|
|
92
94
|
def c_post(rsrc, xml)
|
93
95
|
validate_connected @c_cnx
|
94
96
|
|
97
|
+
rsrc = rsrc.delete_prefix Jamf::Connection::SLASH
|
98
|
+
|
95
99
|
# convert CRs & to
|
96
100
|
xml&.gsub!(/\r/, ' ')
|
97
101
|
|
@@ -125,6 +129,8 @@ module Jamf
|
|
125
129
|
def c_put(rsrc, xml)
|
126
130
|
validate_connected @c_cnx
|
127
131
|
|
132
|
+
rsrc = rsrc.delete_prefix Jamf::Connection::SLASH
|
133
|
+
|
128
134
|
# convert CRs & to
|
129
135
|
xml.gsub!(/\r/, ' ')
|
130
136
|
|
@@ -157,6 +163,8 @@ module Jamf
|
|
157
163
|
validate_connected @c_cnx
|
158
164
|
raise MissingDataError, 'Missing :rsrc' if rsrc.nil?
|
159
165
|
|
166
|
+
rsrc = rsrc.delete_prefix Jamf::Connection::SLASH
|
167
|
+
|
160
168
|
# delete the resource
|
161
169
|
resp =
|
162
170
|
@c_cnx.delete(rsrc) do |req|
|
@@ -188,6 +196,7 @@ module Jamf
|
|
188
196
|
#
|
189
197
|
def upload(rsrc, local_file)
|
190
198
|
validate_connected @c_cnx
|
199
|
+
rsrc = rsrc.delete_prefix Jamf::Connection::SLASH
|
191
200
|
|
192
201
|
# the upload file object for faraday
|
193
202
|
local_file = Pathname.new local_file
|
@@ -223,7 +232,7 @@ module Jamf
|
|
223
232
|
|
224
233
|
cnx.options[:timeout] = @timeout
|
225
234
|
cnx.options[:open_timeout] = @open_timeout
|
226
|
-
|
235
|
+
|
227
236
|
cnx.request :multipart
|
228
237
|
cnx.request :url_encoded
|
229
238
|
|
@@ -53,11 +53,12 @@ module Jamf
|
|
53
53
|
|
54
54
|
# @param rsrc[String] the resource to get
|
55
55
|
# (the part of the API url after the '/api/' )
|
56
|
-
|
56
|
+
|
57
57
|
# @return [Hash] the result of the get
|
58
58
|
#######################################################
|
59
59
|
def jp_get(rsrc)
|
60
60
|
validate_connected @jp_cnx
|
61
|
+
rsrc = rsrc.delete_prefix Jamf::Connection::SLASH
|
61
62
|
resp = @jp_cnx.get(rsrc) do |req|
|
62
63
|
# Modify the request here if needed.
|
63
64
|
# puts "JPAPI Cookie is: #{req.headers['Cookie']}"
|
@@ -82,6 +83,7 @@ module Jamf
|
|
82
83
|
#######################################################
|
83
84
|
def jp_post(rsrc, data)
|
84
85
|
validate_connected @jp_cnx
|
86
|
+
rsrc = rsrc.delete_prefix Jamf::Connection::SLASH
|
85
87
|
resp = @jp_cnx.post(rsrc) do |req|
|
86
88
|
req.body = data
|
87
89
|
end
|
@@ -104,6 +106,7 @@ module Jamf
|
|
104
106
|
#######################################################
|
105
107
|
def jp_put(rsrc, data)
|
106
108
|
validate_connected @jp_cnx
|
109
|
+
rsrc = rsrc.delete_prefix Jamf::Connection::SLASH
|
107
110
|
resp = @jp_cnx.put(rsrc) do |req|
|
108
111
|
req.body = data
|
109
112
|
end
|
@@ -126,6 +129,7 @@ module Jamf
|
|
126
129
|
#######################################################
|
127
130
|
def jp_patch(rsrc, data)
|
128
131
|
validate_connected @jp_cnx
|
132
|
+
rsrc = rsrc.delete_prefix Jamf::Connection::SLASH
|
129
133
|
resp = @jp_cnx.patch(rsrc) do |req|
|
130
134
|
req.body = data
|
131
135
|
end
|
@@ -146,6 +150,7 @@ module Jamf
|
|
146
150
|
#######################################################
|
147
151
|
def jp_delete(rsrc)
|
148
152
|
validate_connected @jp_cnx
|
153
|
+
rsrc = rsrc.delete_prefix Jamf::Connection::SLASH
|
149
154
|
resp = @jp_cnx.delete rsrc
|
150
155
|
@last_http_response = resp
|
151
156
|
return resp.body if resp.success?
|
@@ -159,6 +164,7 @@ module Jamf
|
|
159
164
|
# a temporary Faraday connection object
|
160
165
|
#######################################################
|
161
166
|
def jp_download(rsrc)
|
167
|
+
rsrc = rsrc.delete_prefix Jamf::Connection::SLASH
|
162
168
|
temp_cnx = create_jp_connection(parse_json: false)
|
163
169
|
resp = temp_cnx.get rsrc
|
164
170
|
@last_http_response = resp
|
data/lib/jamf/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-jss
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Lasell
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2022-09
|
13
|
+
date: 2022-11-09 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: CFPropertyList
|
@@ -824,9 +824,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
824
824
|
version: 2.6.3
|
825
825
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
826
826
|
requirements:
|
827
|
-
- - "
|
827
|
+
- - ">="
|
828
828
|
- !ruby/object:Gem::Version
|
829
|
-
version:
|
829
|
+
version: '0'
|
830
830
|
requirements: []
|
831
831
|
rubygems_version: 3.0.3.1
|
832
832
|
signing_key:
|