depot3 3.0.9 → 3.0.11
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/bin/d3 +18 -2
- data/bin/d3admin +55 -85
- data/bin/d3helper +1 -1
- data/lib/d3/admin/add.rb +11 -2
- data/lib/d3/admin/auth.rb +20 -3
- data/lib/d3/admin/edit.rb +1 -1
- data/lib/d3/admin/help.rb +13 -12
- data/lib/d3/admin/interactive.rb +17 -17
- data/lib/d3/admin/options.rb +10 -10
- data/lib/d3/admin/report.rb +23 -6
- data/lib/d3/admin/validate.rb +12 -0
- data/lib/d3/basename.rb +16 -1
- data/lib/d3/client/auth.rb +2 -2
- data/lib/d3/client/class_methods.rb +83 -45
- data/lib/d3/client/cli.rb +11 -0
- data/lib/d3/client/help.rb +1 -0
- data/lib/d3/client/receipt.rb +25 -22
- data/lib/d3/database.rb +10 -5
- data/lib/d3/log.rb +34 -38
- data/lib/d3/package/constructor.rb +4 -1
- data/lib/d3/package/getters.rb +1 -1
- data/lib/d3/package/private_methods.rb +1 -1
- data/lib/d3/package/questions.rb +1 -1
- data/lib/d3/package/server_actions.rb +9 -9
- data/lib/d3/package/setters.rb +37 -10
- data/lib/d3/package/validate.rb +25 -6
- data/lib/d3/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dd0846668a4adffcd65b2f18acb90ea9e2d358fc
|
4
|
+
data.tar.gz: 536dd741fc281d3a85f734338e9212c65c41c50f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d4bfebc0d804c371cae8e11a2e83acd62c5407a8165c55a7269dd0aa7ccf2370d27a56eb137c6c602d5ecbbb69aa9404a36d875e687fb8276594aacb8f31531f
|
7
|
+
data.tar.gz: cafd61d158574ebc192b34f0d8e3102e0929e28310cebccf75c870c21e1ef35019e217df45f3df6ace3f23a39d7e13b2f57f18e126702bd5e3096125e200f65b
|
data/bin/d3
CHANGED
@@ -243,6 +243,9 @@ class App
|
|
243
243
|
when :thaw then
|
244
244
|
D3::Client.thaw_receipts @targets
|
245
245
|
|
246
|
+
when :forget then
|
247
|
+
D3::Client.forget_receipts @targets
|
248
|
+
|
246
249
|
when :list_available then
|
247
250
|
D3::Client.list_available @options.force
|
248
251
|
|
@@ -261,6 +264,9 @@ class App
|
|
261
264
|
when :list_puppies then
|
262
265
|
D3::Client.list_pending_puppies
|
263
266
|
|
267
|
+
when :list_queue then
|
268
|
+
D3::Client.list_pending_puppies
|
269
|
+
|
264
270
|
when :list_details then
|
265
271
|
D3::Client.list_details @targets
|
266
272
|
|
@@ -305,8 +311,18 @@ end # class App
|
|
305
311
|
############
|
306
312
|
# Do it
|
307
313
|
############
|
308
|
-
|
309
|
-
|
314
|
+
|
315
|
+
|
316
|
+
### save terminal state incase user interrupts during readline or less
|
317
|
+
if $stdin.tty?
|
318
|
+
stty_save = `stty -g`.chomp
|
319
|
+
trap("SIGINT") do
|
320
|
+
puts "\nCancelled! Woot!"
|
321
|
+
system('stty', stty_save)
|
322
|
+
exit 0
|
323
|
+
end
|
324
|
+
end
|
325
|
+
|
310
326
|
|
311
327
|
begin
|
312
328
|
# if needed, set debugging even before we make the app
|
data/bin/d3admin
CHANGED
@@ -57,8 +57,8 @@ class App
|
|
57
57
|
### parse the commandline
|
58
58
|
parse_commandline
|
59
59
|
|
60
|
-
# can't
|
61
|
-
raise "d3admin can't
|
60
|
+
# can't be run as root other than help, search or report - no keychain, among other things
|
61
|
+
raise "d3admin can't make server changes as root" if JSS.superuser? and (not @action =~ /^[hsr]/)
|
62
62
|
|
63
63
|
end #initialize
|
64
64
|
|
@@ -274,12 +274,12 @@ class App
|
|
274
274
|
@options.oses = arg
|
275
275
|
when '--expiration'
|
276
276
|
@options.expiration = arg
|
277
|
-
when '--expiration-path'
|
278
|
-
@options.
|
277
|
+
when '--expiration-path', '--expiration_paths'
|
278
|
+
@options.expiration_paths = arg
|
279
279
|
|
280
280
|
# delete
|
281
|
-
when '--
|
282
|
-
@options.
|
281
|
+
when '--keep-scripts'
|
282
|
+
@options.keep_scripts = 'y'
|
283
283
|
when '--keep-in-jss'
|
284
284
|
@options.keep_in_jss = 'y'
|
285
285
|
|
@@ -398,12 +398,21 @@ ENDVERS
|
|
398
398
|
|
399
399
|
# via the commandline
|
400
400
|
else
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
401
|
+
|
402
|
+
# if we were given a new version but not a new revision,
|
403
|
+
# set the new revision to 1
|
404
|
+
if @options[:version] and @options[:version] != default_options[:version]
|
405
|
+
@options[:revision] ||= 1
|
406
|
+
@options[:edition] ||= "#{@options.basename}-#{@options[:version]}-#{@options[:revision]}"
|
407
|
+
@options.package_name ||= @options[:edition]
|
408
|
+
@options.filename ||= "#{@options[:edition]}.#{default_options.package_build_type}"
|
409
|
+
|
405
410
|
end
|
406
411
|
|
412
|
+
# for any options that weren't given on the commandline, use the defaults
|
413
|
+
default_options.each_pair { |opt, val| @options[opt] ||= val }
|
414
|
+
|
415
|
+
|
407
416
|
new_package_options = D3::Admin::Add.add_pilot_cli(@options)
|
408
417
|
|
409
418
|
##########################
|
@@ -594,17 +603,21 @@ ENDVERS
|
|
594
603
|
|
595
604
|
got_scripts = (not pkg.script_ids.values.empty?)
|
596
605
|
|
597
|
-
if @options.walkthru
|
598
|
-
@options.delete_scripts = D3::Admin::Interactive.get_value(:get_delete_scripts, default = 'n', check_method = :validate_yes_no)
|
599
|
-
@options.keep_in_jss = D3::Admin::Interactive.get_value(:get_keep_in_jss, default = 'n', check_method = :validate_yes_no)
|
600
|
-
end
|
601
|
-
|
602
606
|
if got_scripts
|
603
|
-
|
604
|
-
|
605
|
-
|
607
|
+
|
608
|
+
if @options.walkthru
|
609
|
+
@options.keep_scripts = D3::Admin::Interactive.get_value(:get_keep_scripts, default = 'n', check_method = :validate_yes_no)
|
610
|
+
|
611
|
+
@options.keep_in_jss = D3::Admin::Interactive.get_value(:get_keep_in_jss, default = 'n', check_method = :validate_yes_no)
|
612
|
+
end # if @options.walkthru
|
613
|
+
|
614
|
+
|
615
|
+
if @options.keep_scripts
|
606
616
|
deets = " - Keeping pre- or post- scripts in the JSS"
|
607
|
-
|
617
|
+
else
|
618
|
+
deets = " - Deleting pre- or post- scripts not used elsewhere"
|
619
|
+
end # if @options.keep_scripts
|
620
|
+
|
608
621
|
else
|
609
622
|
deets = " - No pre- or post- scripts to delete"
|
610
623
|
end # if got_scripts
|
@@ -617,13 +630,13 @@ ENDVERS
|
|
617
630
|
|
618
631
|
confirm "DELETE #{pkg.edition}, JSS id #{pkg.id}\nDist.Point Filename: #{pkg.filename}", deets
|
619
632
|
|
620
|
-
if @options.
|
633
|
+
if @options.keep_scripts && got_scripts
|
621
634
|
puts "Scanning for other packages or policies using pre- or post- scripts before deleting..."
|
622
635
|
end
|
623
636
|
|
624
637
|
script_actions = pkg.delete(
|
625
638
|
admin: @admin,
|
626
|
-
|
639
|
+
keep_scripts: @options.keep_scripts,
|
627
640
|
keep_in_jss: @options.keep_in_jss,
|
628
641
|
rwpw: D3::Admin::Auth.rw_credentials(:dist)[:password]
|
629
642
|
)
|
@@ -646,11 +659,11 @@ ENDVERS
|
|
646
659
|
if script_ids.empty?
|
647
660
|
deets = " - No pre- or post- scripts to delete"
|
648
661
|
else
|
649
|
-
if @options.
|
650
|
-
deets = " - Deleting pre- or post- scripts not in use elsewhere"
|
651
|
-
else
|
662
|
+
if @options.keep_scripts
|
652
663
|
deets = " - Keeping pre- or post- scripts in the JSS"
|
653
|
-
|
664
|
+
else
|
665
|
+
deets = " - Deleting pre- or post- scripts not in use elsewhere"
|
666
|
+
end # if @options.keep_scripts
|
654
667
|
end # if script_ids.empty?
|
655
668
|
|
656
669
|
confirm "DELETE #{pkg_data[:edition]}\n** Already missing from the JSS **", deets
|
@@ -658,7 +671,7 @@ ENDVERS
|
|
658
671
|
JSS::DB_CNX.db.query "DELETE FROM #{D3::Database::PACKAGE_TABLE[:table_name]} WHERE package_id = #{pkgid}"
|
659
672
|
puts "Package #{pkg_data[:edition]} deleted."
|
660
673
|
|
661
|
-
if @options.
|
674
|
+
if (not @options.keep_scripts) && (not script_ids.empty?)
|
662
675
|
puts "Scanning for other packages or policies using pre- or post- scripts before deleting..."
|
663
676
|
policy_scripts = D3.policy_scripts
|
664
677
|
script_ids.each do |victim_script_id|
|
@@ -679,7 +692,7 @@ ENDVERS
|
|
679
692
|
puts "Deleted script '#{victim_script_name}'"
|
680
693
|
end
|
681
694
|
end # do script id
|
682
|
-
end # if @options.
|
695
|
+
end # if @options.keep_scripts && (not script_ids.empty?)
|
683
696
|
|
684
697
|
end # delete_missing_package (pkgid)
|
685
698
|
|
@@ -837,13 +850,6 @@ ENDDEETS
|
|
837
850
|
end # @targets.each do |search_target|
|
838
851
|
end # def search
|
839
852
|
|
840
|
-
### show a list of packges on the server
|
841
|
-
def show_package_list (basename, statuses)
|
842
|
-
|
843
|
-
D3::Admin::Report.show_list basename, @options.status
|
844
|
-
|
845
|
-
end # show_package_list
|
846
|
-
|
847
853
|
### show a report
|
848
854
|
###
|
849
855
|
### @return [void]
|
@@ -923,6 +929,9 @@ ENDDEETS
|
|
923
929
|
end
|
924
930
|
|
925
931
|
end # if reporting puppies
|
932
|
+
|
933
|
+
# blank line between reports, for clarity
|
934
|
+
puts
|
926
935
|
end # targets each
|
927
936
|
end # show_report
|
928
937
|
|
@@ -941,73 +950,34 @@ ENDDEETS
|
|
941
950
|
else
|
942
951
|
D3::Admin::Prefs.config @targets, @options
|
943
952
|
end
|
944
|
-
|
945
|
-
# if @options.walkthru
|
946
|
-
# tgt = D3::Admin::Interactive.get_value :get_config_target, "all"
|
947
|
-
# @targets = [tgt]
|
948
|
-
# end
|
949
|
-
#
|
950
|
-
# if @targets.empty? or @targets.include?("all")
|
951
|
-
# @targets = D3::Admin::CONFIG_TARGETS - ["all"]
|
952
|
-
# end
|
953
|
-
#
|
954
|
-
# @targets.each do |target|
|
955
|
-
# case target
|
956
|
-
# when"jss"
|
957
|
-
# puts "******** JSS-API LOCATION AND READ-WRITE CREDENTIALS ********"
|
958
|
-
# D3::Admin::Auth.ask_for_rw_credentials :jss
|
959
|
-
#
|
960
|
-
# when "db"
|
961
|
-
# puts "******** JSS MYSQL LOCATION AND READ-WRITE CREDENTIALS ********"
|
962
|
-
# D3::Admin::Auth.ask_for_rw_credentials :db
|
963
|
-
#
|
964
|
-
# when "dist"
|
965
|
-
# puts "******** MASTER DIST-POINT READ-WRITE PASSWORD ********"
|
966
|
-
# D3::Admin::Auth.ask_for_rw_credentials :dist
|
967
|
-
#
|
968
|
-
# when "workspace"
|
969
|
-
# puts "******** LOCAL PKG/DMG BUILD WORKSPACE ********"
|
970
|
-
# pth = D3::Admin::Interactive.get_value :workspace, D3::Admin::Prefs.prefs[:workspace]
|
971
|
-
# D3::Admin::Prefs.set_pref :workspace, pth
|
972
|
-
# D3::Admin::Prefs.save_prefs
|
973
|
-
# puts "Thank you, the path has been saved in your d3admin prefs"
|
974
|
-
# puts
|
975
|
-
#
|
976
|
-
# when "pkg-id-prefix"
|
977
|
-
# puts "******** .PKG IDENTIFIER PREFIX ********"
|
978
|
-
# pfx = D3::Admin::Interactive.get_value(:get_pkg_identifier_prefix, D3::Admin::Prefs.prefs[:apple_pkg_id_prefix], :validate_package_identifier_prefix)
|
979
|
-
# D3::Admin::Prefs.set_pref :apple_pkg_id_prefix, pfx
|
980
|
-
# D3::Admin::Prefs.save_prefs
|
981
|
-
# puts "Thank you, the prefix has been saved in your d3admin prefs"
|
982
|
-
# puts
|
983
|
-
# else
|
984
|
-
# puts "(skipping unknown config setting: #{target}"
|
985
|
-
# end # case
|
986
|
-
# end # targets.each
|
987
953
|
end # config
|
988
954
|
|
989
955
|
|
990
956
|
end # class App
|
991
957
|
|
992
958
|
|
993
|
-
### Create and run the application
|
994
959
|
|
995
|
-
|
996
|
-
|
997
|
-
|
960
|
+
|
961
|
+
### save terminal state incase user interrupts during readline or less
|
962
|
+
if $stdin.tty?
|
963
|
+
stty_save = `stty -g`.chomp
|
964
|
+
trap("SIGINT") do
|
965
|
+
puts "\nCancelled! Woot!"
|
966
|
+
system('stty', stty_save)
|
967
|
+
exit 0
|
968
|
+
end
|
969
|
+
end
|
998
970
|
|
999
971
|
begin
|
1000
972
|
app = App.new
|
1001
973
|
app.run
|
1002
974
|
rescue
|
1003
|
-
# handle exceptions
|
1004
975
|
puts "An error occurred: #{$!.class}: #{$!}"
|
1005
976
|
puts $@ if D3::Admin.debug
|
1006
977
|
exit 1
|
1007
978
|
ensure
|
1008
|
-
|
1009
|
-
|
1010
|
-
JSS::DistributionPoint.master_distribution_point.unmount if JSS::DistributionPoint.master_distribution_point.mounted?
|
979
|
+
if D3::Admin::Auth.connected?
|
980
|
+
# JSS::DistributionPoint.master_distribution_point.unmount if JSS::DistributionPoint.master_distribution_point.mounted?
|
1011
981
|
D3::Admin::Auth.disconnect
|
1012
982
|
end
|
1013
983
|
end # begin
|
data/bin/d3helper
CHANGED
@@ -325,7 +325,7 @@ Watch a parade of cute puppies while these items are installed:
|
|
325
325
|
:installed_at => jss_rcpt.mtime,
|
326
326
|
:removable => d3_pkg.removable,
|
327
327
|
:expiration => d3_pkg.expiration,
|
328
|
-
:
|
328
|
+
:expiration_paths => d3_pkg.expiration_paths,
|
329
329
|
:prohibiting_process => d3_pkg.prohibiting_process,
|
330
330
|
:pre_remove_script_id => d3_pkg.pre_remove_script_id,
|
331
331
|
:post_remove_script_id => d3_pkg.post_remove_script_id
|
data/lib/d3/admin/add.rb
CHANGED
@@ -54,7 +54,7 @@ module D3
|
|
54
54
|
pre_remove
|
55
55
|
post_remove
|
56
56
|
expiration
|
57
|
-
|
57
|
+
expiration_paths
|
58
58
|
source_path
|
59
59
|
}.map{|i| i.to_sym}
|
60
60
|
|
@@ -115,6 +115,7 @@ END_HEADER
|
|
115
115
|
# Here the value we're actually editing
|
116
116
|
current_opt_value = options[chosen_opt]
|
117
117
|
|
118
|
+
|
118
119
|
# if we're editing version or revision, and the current pkg or filenames are
|
119
120
|
# based on them then make a note to update the names when we get the new values
|
120
121
|
if chosen_opt == :basename or chosen_opt == :version or chosen_opt == :revision
|
@@ -137,6 +138,14 @@ END_HEADER
|
|
137
138
|
# prompt for a new value and put it in place
|
138
139
|
options[chosen_opt] = D3::Admin::Interactive.get_value(chosen_opt, current_opt_value, nil)
|
139
140
|
|
141
|
+
# if we changed the version, reset the revision to 1 and update values as needed
|
142
|
+
if chosen_opt == :version and options[chosen_opt] != current_opt_value
|
143
|
+
options[:revision] = 1
|
144
|
+
update_edition = true
|
145
|
+
update_pkg_name = options.package_name.start_with? options.edition
|
146
|
+
update_filename = options.filename.start_with? options.edition
|
147
|
+
end
|
148
|
+
|
140
149
|
# if we edited the version or revision, we might need to update names and edition
|
141
150
|
options.edition = "#{options.basename}-#{options.version}-#{options.revision}" if update_edition
|
142
151
|
options.package_name = "#{options.edition}.#{options.package_build_type}" if update_pkg_name
|
@@ -271,7 +280,7 @@ END_HEADER
|
|
271
280
|
|
272
281
|
# expiration path if expiration
|
273
282
|
if options_from_user[:expiration] > 0
|
274
|
-
errors << "expiration path cannot be empty if expiration is > 0 ." unless options_from_user[:
|
283
|
+
errors << "expiration path cannot be empty if expiration is > 0 ." unless options_from_user[:expiration_paths]
|
275
284
|
end
|
276
285
|
return [options_from_user, errors]
|
277
286
|
end # validate_all_new_package_options
|
data/lib/d3/admin/auth.rb
CHANGED
@@ -50,6 +50,9 @@ module D3
|
|
50
50
|
KEYCHAIN_DIST_SERVICE = KEYCHAIN_SERVICE_BASE + ".distribution"
|
51
51
|
KEYCHAIN_DIST_LABEL = KEYCHAIN_LABEL_BASE + ".distribution"
|
52
52
|
|
53
|
+
@@connected = false
|
54
|
+
|
55
|
+
|
53
56
|
### Connect to the JSS API and MySQL DB
|
54
57
|
### with admin credentials from the keychain
|
55
58
|
###
|
@@ -62,15 +65,31 @@ module D3
|
|
62
65
|
JSS::DB_CNX.connect :user => db[:user], :pw => db[:password], :connect_timeout => 10
|
63
66
|
JSS::API.connect :user => api[:user], :pw => api[:password], :open_timeout => 10
|
64
67
|
D3::Database.check_schema_version
|
68
|
+
|
69
|
+
@@connected = true
|
70
|
+
|
65
71
|
return JSS::API.cnx.options[:server]
|
66
72
|
end
|
67
73
|
|
68
|
-
|
74
|
+
### Disconnect admin credentials from the JSS API and MySQL DB
|
75
|
+
###
|
76
|
+
### @return [void]
|
77
|
+
###
|
69
78
|
def disconnect
|
70
79
|
JSS::API.disconnect if JSS::API.connected?
|
71
80
|
JSS::DB_CNX.disconnect if JSS::DB_CNX.connected?
|
81
|
+
@@connected = false
|
72
82
|
end
|
73
83
|
|
84
|
+
### Are we currently connected as an admin?
|
85
|
+
###
|
86
|
+
### return [Boolean]
|
87
|
+
###
|
88
|
+
def connected?
|
89
|
+
@@connected
|
90
|
+
end
|
91
|
+
|
92
|
+
|
74
93
|
### Fetch read-write credentials from the login keychain
|
75
94
|
###
|
76
95
|
### If the login keychain is locked, the user will be prompted
|
@@ -449,8 +468,6 @@ module D3
|
|
449
468
|
raise JSS::AuthenticationError, "Three incorrect attempts to unlock keychain" if tries == 3
|
450
469
|
return true
|
451
470
|
end # unlock keychain
|
452
|
-
|
453
|
-
|
454
471
|
end # module Auth
|
455
472
|
|
456
473
|
### @see D3::Admin::Auth.connect
|
data/lib/d3/admin/edit.rb
CHANGED
data/lib/d3/admin/help.rb
CHANGED
@@ -92,11 +92,12 @@ Action add and edit:
|
|
92
92
|
-c, --cpu <type> Limit installation to 'intel' or 'ppc'
|
93
93
|
-C, --category <category> The JSS Category for this package
|
94
94
|
-X, --expiration <days> Auto-uninstall if unused for <days>
|
95
|
-
-P, --expiration-path <path>
|
95
|
+
-P, --expiration-path(s) <path> Path(s) to executable(s) that must be used
|
96
|
+
(Multiple paths should be comma separated)
|
96
97
|
|
97
98
|
Action delete:
|
98
|
-
--
|
99
|
-
--keep-in-jss Delete from d3 but leave in
|
99
|
+
--keep-scripts Keep pre-/post- scripts in Casper
|
100
|
+
--keep-in-jss Delete pkg from d3 but leave in Casper
|
100
101
|
|
101
102
|
Action search or report:
|
102
103
|
-S, --status <status> Limit package list to this status
|
@@ -347,18 +348,19 @@ Action add and edit:
|
|
347
348
|
and expiration must be allowed in the
|
348
349
|
client config.
|
349
350
|
|
350
|
-
-P, --expiration-path <path>
|
351
|
-
within the expiration period to
|
352
|
-
being uninstalled
|
351
|
+
-P, --expiration-path(s) <path> The path(s) to the executable(s) the must
|
352
|
+
be used within the expiration period to
|
353
|
+
avoid being uninstalled
|
353
354
|
|
354
355
|
Action delete:
|
355
356
|
|
356
|
-
--
|
357
|
-
|
358
|
-
|
357
|
+
--keep-scripts Keep any scripts associated with this pkg
|
358
|
+
in Casper. Note: scripts used by other
|
359
|
+
packages or polices are never deleted.
|
359
360
|
|
360
|
-
--keep-in-jss Leave the package in
|
361
|
-
it from d3
|
361
|
+
--keep-in-jss Leave the package in Casper after deleting
|
362
|
+
it from d3. Note: packages used by
|
363
|
+
policies are never deleted from Casper.
|
362
364
|
|
363
365
|
|
364
366
|
Action search:
|
@@ -394,4 +396,3 @@ ENDHELP
|
|
394
396
|
end # module help
|
395
397
|
end # module admin
|
396
398
|
end # module D3
|
397
|
-
|
data/lib/d3/admin/interactive.rb
CHANGED
@@ -830,37 +830,38 @@ Enter the number of days, or 0 for no expiration.
|
|
830
830
|
prompt_for_data(desc: desc, prompt: "Expiration days", default: default, required: true)
|
831
831
|
end
|
832
832
|
|
833
|
-
### Get the path to the
|
833
|
+
### Get the path to the executable(s) to monitor for expiration
|
834
834
|
###
|
835
|
-
### @param default[Pathname, String] the
|
835
|
+
### @param default[String, Pathname, Array<String,Pathname>] the path(s)
|
836
836
|
###
|
837
|
-
### @return [Pathname] the path to the
|
837
|
+
### @return [Array<Pathname>] the path(s) to the executable
|
838
838
|
###
|
839
|
-
def
|
839
|
+
def get_expiration_paths (default = 'n')
|
840
840
|
desc = <<-END_DESC
|
841
|
-
EXPIRATION PATH
|
842
|
-
Enter the path to
|
843
|
-
to prevent expiration.
|
844
|
-
E.g.
|
841
|
+
EXPIRATION PATH(S)
|
842
|
+
Enter the path(s) to the executable(s) that must be used
|
843
|
+
to prevent expiration. Multiple paths should be separated by commas, spaces
|
844
|
+
should not be escaped. E.g.
|
845
|
+
/Applications/Google Chrome.app/Contents/MacOS/Google Chrome, /Applications/Firefox.app/Contents/MacOS/firefox
|
845
846
|
Enter 'n' for none
|
846
847
|
END_DESC
|
847
|
-
prompt_for_data(desc: desc, prompt: "Expiration Path", default: default, required: true)
|
848
|
+
prompt_for_data(desc: desc, prompt: "Expiration Path(s)", default: default, required: true)
|
848
849
|
end
|
849
850
|
|
850
|
-
### when deleting a pkg, should its pre- and post- scripts be
|
851
|
+
### when deleting a pkg, should its pre- and post- scripts be kept?
|
851
852
|
###
|
852
853
|
### @param default[String] the default answer when user hits return
|
853
854
|
###
|
854
855
|
### @return [String] the users response
|
855
856
|
###
|
856
|
-
def
|
857
|
+
def get_keep_scripts (default = 'n')
|
857
858
|
desc = <<-END_DESC
|
858
|
-
|
859
|
+
KEEP ASSOCIATED SCRIPTS IN CASPER?
|
859
860
|
When deleting a package, should any associated scripts
|
860
|
-
(pre-install, post-install, pre-remove, post-remove)
|
861
|
+
(pre-install, post-install, pre-remove, post-remove) be kept in Casper?
|
861
862
|
|
862
863
|
NOTE: If any other d3 packages or policies are using the scripts
|
863
|
-
they won't be deleted
|
864
|
+
they won't be deleted. The other users of the scripts will be reported.
|
864
865
|
Enter 'y' or 'n'
|
865
866
|
END_DESC
|
866
867
|
prompt_for_data(desc: desc, prompt: "Delete Scripts? (y/n)", default: default, required: true)
|
@@ -874,8 +875,8 @@ Enter 'y' or 'n'
|
|
874
875
|
###
|
875
876
|
def get_keep_in_jss (default = 'n')
|
876
877
|
desc = <<-END_DESC
|
877
|
-
KEEP THE PACKAGE IN
|
878
|
-
When deleting a package, should it be kept as a
|
878
|
+
KEEP THE PACKAGE IN CASPER?
|
879
|
+
When deleting a package, should it be kept as a Casper package
|
879
880
|
and only deleted from d3?
|
880
881
|
Enter 'y' or 'n'
|
881
882
|
END_DESC
|
@@ -970,4 +971,3 @@ END_DESC
|
|
970
971
|
end # module
|
971
972
|
end # module Admin
|
972
973
|
end # module D3
|
973
|
-
|
data/lib/d3/admin/options.rb
CHANGED
@@ -348,14 +348,14 @@ module D3
|
|
348
348
|
:unsetable => true,
|
349
349
|
:validate => :validate_expiration
|
350
350
|
},
|
351
|
-
|
351
|
+
expiration_paths: {
|
352
352
|
:default => nil,
|
353
|
-
:cli => [ '--expiration-path', '-P', GetoptLong::REQUIRED_ARGUMENT ],
|
354
|
-
:label=> "Expiration Path",
|
355
|
-
:display_conversion =>
|
356
|
-
:get => :
|
353
|
+
:cli => [ '--expiration-path', '--expiration-paths', '-P', GetoptLong::REQUIRED_ARGUMENT ],
|
354
|
+
:label=> "Expiration Path(s)",
|
355
|
+
:display_conversion => D3::Database::ARRAY_OF_PATHNAMES_TO_COMMA_STRING ,
|
356
|
+
:get => :get_expiration_paths,
|
357
357
|
:unsetable => true,
|
358
|
-
:validate => :
|
358
|
+
:validate => :validate_expiration_paths
|
359
359
|
},
|
360
360
|
description: {
|
361
361
|
:default => '',
|
@@ -415,12 +415,12 @@ module D3
|
|
415
415
|
|
416
416
|
|
417
417
|
# Delete
|
418
|
-
|
418
|
+
keep_scripts: {
|
419
419
|
:default => nil,
|
420
|
-
:cli => [ '--
|
421
|
-
:label => "
|
420
|
+
:cli => [ '--keep-scripts', GetoptLong::NO_ARGUMENT ],
|
421
|
+
:label => "Keep associated scripts in Casper",
|
422
422
|
:display_conversion => DISPLAY_TRUE_FALSE,
|
423
|
-
:get => :
|
423
|
+
:get => :get_keep_scripts,
|
424
424
|
:validate => :validate_yes_no
|
425
425
|
},
|
426
426
|
keep_in_jss: {
|
data/lib/d3/admin/report.rb
CHANGED
@@ -522,14 +522,33 @@ module D3
|
|
522
522
|
###### Data gathering
|
523
523
|
|
524
524
|
### Reconnect to both the API and DB with a much larger timeout, and
|
525
|
-
### using an alternate DB server if one is defined.
|
525
|
+
### using an alternate DB server if one is defined. Also connect with
|
526
|
+
### the read-only accts, since rw isn't needed, retrieving the pws
|
527
|
+
### requires an admin keychain, which makes automated reporting
|
528
|
+
### unpleasant.
|
526
529
|
###
|
527
530
|
### @return [Hash<String>] the hostnames of the connected JSS & MySQL servers
|
528
531
|
###
|
529
532
|
def connect_for_reports
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
+
if JSS.superuser?
|
534
|
+
jss_user = D3::CONFIG.client_jss_ro_user
|
535
|
+
jss_user ||= JSS::CONFIG.api_username
|
536
|
+
jss_pw = D3::Client.get_ro_pass(:jss)
|
537
|
+
|
538
|
+
db_user = D3::CONFIG.client_db_ro_user
|
539
|
+
db_user ||= JSS::CONFIG.db_username
|
540
|
+
db_pw = D3::Client.get_ro_pass(:db)
|
541
|
+
|
542
|
+
else
|
543
|
+
api = D3::Admin::Auth.rw_credentials :jss
|
544
|
+
jss_user = api[:user]
|
545
|
+
jss_pw = api[:password]
|
546
|
+
|
547
|
+
db = D3::Admin::Auth.rw_credentials :db
|
548
|
+
db_user = db[:user]
|
549
|
+
db_pw = db[:password]
|
550
|
+
end
|
551
|
+
D3.connect_for_reports jss_user, jss_pw, db_user, db_pw
|
533
552
|
end # connect for report
|
534
553
|
|
535
554
|
### Get the raw data for a client-install report, from the EA if available
|
@@ -541,8 +560,6 @@ module D3
|
|
541
560
|
### @return [Array<Hash>] The data for doing client install reports
|
542
561
|
###
|
543
562
|
def computer_receipts_data
|
544
|
-
puts "Querying Casper for receipt data..."
|
545
|
-
|
546
563
|
the_data = computer_receipts_ea_data
|
547
564
|
return the_data if the_data
|
548
565
|
return computer_receipts_jamf_data
|
data/lib/d3/admin/validate.rb
CHANGED
@@ -397,6 +397,18 @@ module D3
|
|
397
397
|
D3::Package::Validate.validate_expiration exp
|
398
398
|
end
|
399
399
|
|
400
|
+
### Confirm the validity of one or more expiration paths.
|
401
|
+
### Any string that starts with a / is valid.
|
402
|
+
### The strings "n" or "none" returns an empty array.
|
403
|
+
###
|
404
|
+
### @param paths[Pathname, String, Array<String,Pathname>] the path(s) to check
|
405
|
+
###
|
406
|
+
### @return [Array<Pathname>] the valid path
|
407
|
+
###
|
408
|
+
def validate_expiration_paths (paths)
|
409
|
+
D3::Package::Validate.validate_expiration_paths paths
|
410
|
+
end
|
411
|
+
|
400
412
|
### Confirm the validity of an expiration path.
|
401
413
|
### any string that starts with a / is valid.
|
402
414
|
###
|
data/lib/d3/basename.rb
CHANGED
@@ -121,7 +121,7 @@ module D3
|
|
121
121
|
attr_reader :expiration
|
122
122
|
|
123
123
|
# @return [String] the path to the executable that needs come to the foreground to prevent expiration
|
124
|
-
attr_reader :
|
124
|
+
attr_reader :expiration_paths
|
125
125
|
|
126
126
|
|
127
127
|
################# Public Instance Methods #################
|
@@ -213,6 +213,21 @@ module D3
|
|
213
213
|
raise JSS::InvalidDataError, "status must be one of :#{STATUSES.join(', :')}" unless STATUSES.include? new_status
|
214
214
|
@status = new_status
|
215
215
|
end
|
216
|
+
|
217
|
+
### Does a given array of pathnames have the same elements as
|
218
|
+
### @expiration_paths regardless of order?
|
219
|
+
###
|
220
|
+
### This is generally used to compare two @expiration_paths
|
221
|
+
### arrays for "equality"
|
222
|
+
###
|
223
|
+
### @param other_exp_paths[Array] An array if Pathnames to compare to @expiration_paths
|
224
|
+
###
|
225
|
+
### @return [Boolean] Are they the same aside from order?
|
226
|
+
###
|
227
|
+
def expiration_paths_match?(other_exp_paths)
|
228
|
+
return false unless @expiration_paths.length == other_exp_paths.length
|
229
|
+
(@expiration_paths - other_exp_paths).empty?
|
230
|
+
end
|
216
231
|
|
217
232
|
end # module Basename
|
218
233
|
end # module PixD3
|