depot3 3.0.15 → 3.0.20
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 +21 -1
- data/README.md +6 -6
- data/bin/d3 +3 -3
- data/bin/d3admin +257 -293
- data/lib/d3/admin/add.rb +98 -94
- data/lib/d3/admin/interactive.rb +195 -161
- data/lib/d3/admin/options.rb +424 -412
- data/lib/d3/admin/prefs.rb +73 -42
- data/lib/d3/admin/validate.rb +50 -43
- data/lib/d3/client/auth.rb +4 -2
- data/lib/d3/client/class_methods.rb +169 -119
- data/lib/d3/client/receipt.rb +2 -2
- data/lib/d3/database.rb +167 -180
- data/lib/d3/log.rb +2 -3
- data/lib/d3/package/server_actions.rb +2 -3
- data/lib/d3/package/validate.rb +63 -70
- data/lib/d3/version.rb +1 -2
- 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: d3d60e7335e71cc42cfc47dc4e475f0a4b5237de
|
4
|
+
data.tar.gz: 85731430c8d7fbdc501a8ab72ef2dc68b7936594
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7d8c26bddb9d57ead819dce286f3f2977fd96054a221cdd10e7f0b7ca21b1050c23f3a98bcc841b2146eb25daa02f8f6b017605d6ffe6959dcc1eabd4007aece
|
7
|
+
data.tar.gz: 9792ad3083342ab81257eace8ab0f0d9413fcbb94152a3e19ef62ee5f987c15ac76bb60c3d361de642e98e5edb8a0e663ce9bb92534844578207bde3621aa034
|
data/CHANGES.md
CHANGED
@@ -1,6 +1,26 @@
|
|
1
1
|
# Change History
|
2
2
|
|
3
|
-
## v3.0.
|
3
|
+
## v3.0.20 - 2018-06-27
|
4
|
+
- Added: validate that a pkg is available via cloud before trying to install it that way
|
5
|
+
- Change: better backtrace logging
|
6
|
+
- Change: better error reporting when client passwd retrieval fails
|
7
|
+
- Fix: bug preventing puppies to install from the puppy queue
|
8
|
+
|
9
|
+
## v3.0.19 - 2018-03-31
|
10
|
+
- Added: signing identity and signing prefs to d3admin add, when building .pkgs
|
11
|
+
- Added: A default description editer (e.g. vi, emacs, pico) can be saved in admin prefs
|
12
|
+
- Fix: return nil when asked for current foreground application on client, and there is none.
|
13
|
+
|
14
|
+
## v3.0.18 - 2017-12-01
|
15
|
+
- Change: D3::Client.install: freeze prev. installed rcpts when 'freeze on install' requested.
|
16
|
+
|
17
|
+
## v3.0.17 - 2017-07-14
|
18
|
+
- Fix: D3::Package.upload_master_file, call #update after #super
|
19
|
+
|
20
|
+
## v3.0.16 - 2017-04-10
|
21
|
+
- Update: Max DB schema version bumped for 9.98 and 9.99
|
22
|
+
|
23
|
+
## v3.0.15 - 2017-02-28
|
4
24
|
- Bugfix: now correctly finds the most recent timestamp for an expiration path coming to the foreground
|
5
25
|
|
6
26
|
## v3.0.14 - 2016-12-08
|
data/README.md
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# d3 - Command line package and patch management for Casper
|
2
2
|
|
3
|
-
d3 is a package deployment and patch management system for OS X that enhances
|
4
|
-
[
|
3
|
+
d3 (a.k.a. depot3) is a package deployment and patch management system for OS X that enhances
|
4
|
+
[Jamf Pro](https://www.jamf.com/products/jamf-pro/), an enterprise-level management system for Apple devices from [JAMF Software](http://www.jamf.com/). It was created by [Pixar Animation Studios](http://www.pixar.com/).
|
5
5
|
|
6
6
|
|
7
|
-
d3 adds these capabilities and more to
|
7
|
+
d3 adds these capabilities and more to Jamf Pro's package handling:
|
8
8
|
|
9
9
|
* Automatic software updates on clients when new versions are released on the server
|
10
10
|
* Pre-release piloting of new packages
|
@@ -14,7 +14,7 @@ d3 adds these capabilities and more to Casper's package handling:
|
|
14
14
|
* Both the client and admin tools are command-line only and fully scriptable
|
15
15
|
* Admin command-line options allow integration with developer workflows and package-retrieval tools
|
16
16
|
|
17
|
-
d3 is written in Ruby and available as a rubygem called ['depot3'](https://rubygems.org/gems/depot3). It interfaces with
|
17
|
+
d3 is written in Ruby and available as a rubygem called ['depot3'](https://rubygems.org/gems/depot3). It interfaces with Jamf Pro via its REST API using [ruby-jss](https://github.com/PixarAnimationStudios/ruby-jss), a ruby module that provides simple and powerful access to the API. It also uses Jamf Pro's backend MySQL database directly to provide enhanced features.
|
18
18
|
|
19
19
|
## DOCUMENTATION
|
20
20
|
|
@@ -22,7 +22,7 @@ Full user/administrator documentation is available at the [GitHub project's wiki
|
|
22
22
|
|
23
23
|
The developer documentation for the D3 ruby module is at [http://www.rubydoc.info/gems/depot3](http://www.rubydoc.info/gems/depot3).
|
24
24
|
|
25
|
-
Also check out [ruby-jss](https://github.com/PixarAnimationStudios/ruby-jss), which is used by d3, but is useful for working with the
|
25
|
+
Also check out [ruby-jss](https://github.com/PixarAnimationStudios/ruby-jss), which is used by d3, but is useful for working with the Jamf Pro REST API in any project.
|
26
26
|
|
27
27
|
|
28
28
|
## CONTACT
|
@@ -33,7 +33,7 @@ Also check out [ruby-jss](https://github.com/PixarAnimationStudios/ruby-jss), wh
|
|
33
33
|
|
34
34
|
## LICENSE
|
35
35
|
|
36
|
-
Copyright
|
36
|
+
Copyright 2017 Pixar
|
37
37
|
|
38
38
|
Licensed under the Apache License, Version 2.0 (the "Apache License")
|
39
39
|
with the following modification; you may not use d3 except in
|
data/bin/d3
CHANGED
@@ -332,10 +332,10 @@ begin
|
|
332
332
|
app = App.new(ARGV)
|
333
333
|
app.run
|
334
334
|
|
335
|
-
rescue
|
335
|
+
rescue => e
|
336
336
|
# handle exceptions not handled elsewhere
|
337
|
-
D3.log "An error occurred: #{
|
338
|
-
D3.log_backtrace
|
337
|
+
D3.log "An error occurred: #{e.class}: #{e}", :fatal
|
338
|
+
D3.log_backtrace e
|
339
339
|
exit 1
|
340
340
|
ensure
|
341
341
|
if JSS::API.connected?
|
data/bin/d3admin
CHANGED
@@ -44,8 +44,6 @@
|
|
44
44
|
# Load libraries
|
45
45
|
require 'd3'
|
46
46
|
|
47
|
-
|
48
|
-
|
49
47
|
######################
|
50
48
|
# The Script Object
|
51
49
|
######################
|
@@ -53,19 +51,16 @@ class App
|
|
53
51
|
|
54
52
|
### Setup
|
55
53
|
def initialize
|
56
|
-
|
57
54
|
### parse the commandline
|
58
55
|
parse_commandline
|
59
56
|
|
60
57
|
# 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?
|
62
|
-
|
63
|
-
end #initialize
|
58
|
+
raise "d3admin can't make server changes as root" if JSS.superuser? && (!@action =~ /^[hsr]/)
|
59
|
+
end # initialize
|
64
60
|
|
65
61
|
### Run
|
66
62
|
def run
|
67
|
-
|
68
|
-
if @action == "help"
|
63
|
+
if @action == 'help'
|
69
64
|
show_help @options.helptype
|
70
65
|
return
|
71
66
|
end
|
@@ -73,7 +68,7 @@ class App
|
|
73
68
|
# run config if it hasn't ever run
|
74
69
|
unless D3::Admin::Prefs.prefs[:last_config] || JSS.superuser?
|
75
70
|
puts
|
76
|
-
puts
|
71
|
+
puts '******** INITIAL D3ADMIN CONFIGURATION ********'
|
77
72
|
puts
|
78
73
|
config
|
79
74
|
# but dont run it again if that's the action chosen
|
@@ -84,12 +79,12 @@ class App
|
|
84
79
|
@admin = @options.admin || ENV['USER']
|
85
80
|
|
86
81
|
# admin can't be a badmin
|
87
|
-
if D3.badmins.include? @admin
|
82
|
+
if (D3.badmins.include? @admin) && (D3::Admin::ACTIONS_NEEDING_ADMIN.include? @action)
|
88
83
|
raise D3::PermissionError, "d3admin cannot do '#{@action}' as #{@admin}."
|
89
84
|
end
|
90
85
|
|
91
86
|
# config before connecting
|
92
|
-
if @action =~ /^c/
|
87
|
+
if @action =~ /^c/ && !JSS.superuser?
|
93
88
|
config
|
94
89
|
return
|
95
90
|
end
|
@@ -103,43 +98,40 @@ class App
|
|
103
98
|
|
104
99
|
case @action
|
105
100
|
|
106
|
-
|
107
|
-
|
101
|
+
when /^a/ then
|
102
|
+
add_pilot_package
|
108
103
|
|
109
|
-
|
110
|
-
|
104
|
+
when /^e/ then
|
105
|
+
edit_package
|
111
106
|
|
112
|
-
|
113
|
-
|
107
|
+
when /^l/ then
|
108
|
+
make_package_live
|
114
109
|
|
115
|
-
|
116
|
-
|
110
|
+
when /^d/ then
|
111
|
+
delete_package
|
117
112
|
|
118
|
-
|
119
|
-
|
113
|
+
when /^i/ then
|
114
|
+
show_package_info
|
120
115
|
|
121
|
-
|
122
|
-
|
116
|
+
when /^s/ then
|
117
|
+
search
|
123
118
|
|
124
|
-
|
125
|
-
|
119
|
+
when /^r/ then
|
120
|
+
show_report
|
126
121
|
|
127
|
-
|
128
|
-
|
122
|
+
else
|
123
|
+
raise ArgumentError, "#{D3::Admin::Help::USAGE}\nUnknown action, must be one of #{D3::Admin::ACTIONS.join(', ')}"
|
129
124
|
|
130
125
|
end # case
|
131
|
-
|
132
|
-
|
133
|
-
end #run
|
126
|
+
end # run
|
134
127
|
|
135
128
|
### Parse the command line
|
136
129
|
###
|
137
130
|
### @return [void]
|
138
131
|
###
|
139
132
|
def parse_commandline
|
140
|
-
|
141
133
|
# Debugging file? if so, always set debug.
|
142
|
-
ARGV <<
|
134
|
+
ARGV << '--debug' if D3::DEBUG_FILE.exist?
|
143
135
|
|
144
136
|
# this holds everything that comes from the commandline
|
145
137
|
# or from prompting the user
|
@@ -153,145 +145,144 @@ class App
|
|
153
145
|
@options.status = []
|
154
146
|
|
155
147
|
### see Admin::CLIOpts
|
156
|
-
opt_arry = D3::Admin::OPTIONS.values.map{|o| o[:cli] }
|
157
|
-
opts = GetoptLong.new
|
148
|
+
opt_arry = D3::Admin::OPTIONS.values.map { |o| o[:cli] }
|
149
|
+
opts = GetoptLong.new(*opt_arry)
|
158
150
|
|
159
151
|
opts.each do |opt, arg|
|
160
152
|
case opt
|
161
153
|
|
162
|
-
#
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
raise ArgumentError, "--reboot must be 'y' or 'n'"
|
256
|
-
end
|
154
|
+
# General
|
155
|
+
when '--help'
|
156
|
+
@action = 'help'
|
157
|
+
@options.helptype = :help
|
158
|
+
break
|
159
|
+
when '--extended-help'
|
160
|
+
@action = 'help'
|
161
|
+
@options.helptype = :extended_help
|
162
|
+
break
|
163
|
+
when '--debug'
|
164
|
+
D3::Admin.debug = true
|
165
|
+
when '--d3-version'
|
166
|
+
@action = 'help'
|
167
|
+
@options.helptype = :show_d3_version
|
168
|
+
break
|
169
|
+
when '--walkthru'
|
170
|
+
@options.walkthru = true
|
171
|
+
when '--auto-confirm'
|
172
|
+
@options.auto_confirm = true
|
173
|
+
when '--admin'
|
174
|
+
@options.admin = arg
|
175
|
+
|
176
|
+
# Search and Report
|
177
|
+
when '--status'
|
178
|
+
@options.status += arg.split(/,\s*/)
|
179
|
+
when '--queue'
|
180
|
+
@options.report_q = true
|
181
|
+
when '--frozen'
|
182
|
+
@options.report_frozen = true
|
183
|
+
when '--computers'
|
184
|
+
@options.report_computers = true
|
185
|
+
when '--groups'
|
186
|
+
@options.search_groups = true
|
187
|
+
|
188
|
+
# Add/Edit
|
189
|
+
when '--import'
|
190
|
+
@options.import = true
|
191
|
+
@options.import_from = arg.empty? ? nil : arg
|
192
|
+
when '--no-inherit'
|
193
|
+
@options.no_inherit = true
|
194
|
+
when '--basename'
|
195
|
+
@options.basename = arg
|
196
|
+
when '--version'
|
197
|
+
@options.version = arg
|
198
|
+
when '--revision'
|
199
|
+
@options.revision = arg
|
200
|
+
when '--description'
|
201
|
+
@options.description = arg
|
202
|
+
when '--package-name'
|
203
|
+
@options.package_name = arg
|
204
|
+
when '--filename'
|
205
|
+
@options.filename = arg
|
206
|
+
when '--edition'
|
207
|
+
@options.edition = arg
|
208
|
+
when '--source-path'
|
209
|
+
@options.source_path = arg
|
210
|
+
when '--dmg'
|
211
|
+
@options.package_build_type = 'd'
|
212
|
+
when '--preserve-owners'
|
213
|
+
@options.pkg_preserve_owners = 'y'
|
214
|
+
when '--pkg-id'
|
215
|
+
@options.pkg_identifier = arg
|
216
|
+
when '--workspace'
|
217
|
+
@options.workspace = arg
|
218
|
+
when '--pre-install'
|
219
|
+
@options.pre_install = arg
|
220
|
+
when '--post-install'
|
221
|
+
@options.post_install = arg
|
222
|
+
when '--pre-remove'
|
223
|
+
@options.pre_remove = arg
|
224
|
+
when '--post-remove'
|
225
|
+
@options.post_remove = arg
|
226
|
+
when '--auto-groups'
|
227
|
+
@options.auto_groups = arg
|
228
|
+
when '--excluded-groups'
|
229
|
+
@options.excluded_groups = arg
|
230
|
+
when '--prohibiting-processes'
|
231
|
+
@options.prohibiting_processes = arg
|
232
|
+
when '--cpu_type'
|
233
|
+
@options.cpu_type = arg
|
234
|
+
when '--category'
|
235
|
+
@options.category = arg
|
236
|
+
|
237
|
+
when '--reboot'
|
238
|
+
# dft is no, so if arg is empty or /^n(o)$/i, it should be nil,
|
239
|
+
# otherwise must be /^y(es)$/i
|
240
|
+
if arg.empty? || arg =~ /^no?$/i
|
241
|
+
@options.reboot = 'n'
|
242
|
+
elsif arg =~ /^y(es)?$/i
|
243
|
+
@options.reboot = 'y'
|
244
|
+
else
|
245
|
+
raise ArgumentError, "--reboot must be 'y' or 'n'"
|
246
|
+
end
|
257
247
|
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
248
|
+
when '--remove-first'
|
249
|
+
# dft is no, so if arg is empty or /^n(o)$/i, it should be nil,
|
250
|
+
# otherwise must be /^y(es)$/i
|
251
|
+
if arg.empty? || arg =~ /^no?$/i
|
252
|
+
@options.remove_first = 'n'
|
253
|
+
elsif arg =~ /^y(es)?$/i
|
254
|
+
@options.remove_first = 'y'
|
255
|
+
else
|
256
|
+
raise ArgumentError, "--remove-first must be 'y' or 'n'"
|
257
|
+
end
|
268
258
|
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
259
|
+
when '--removable'
|
260
|
+
# dft is yes, so if arg is empty or /^y(es)$/i, it should be nil,
|
261
|
+
# otherwise must be /^n(o)$/i
|
262
|
+
if arg.empty? || arg =~ /^y(es)?$/i
|
263
|
+
@options.removable = 'y'
|
264
|
+
elsif arg =~ /^no?$/i
|
265
|
+
@options.removable = 'n'
|
266
|
+
else
|
267
|
+
raise ArgumentError, "--removable must be 'y' or 'n'"
|
268
|
+
end
|
279
269
|
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
270
|
+
when '--oses'
|
271
|
+
@options.oses = arg
|
272
|
+
when '--expiration'
|
273
|
+
@options.expiration = arg
|
274
|
+
when '--expiration-path', '--expiration_paths'
|
275
|
+
@options.expiration_paths = arg
|
286
276
|
|
287
|
-
#
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
277
|
+
# Delete
|
278
|
+
when '--keep-scripts'
|
279
|
+
@options.keep_scripts = 'y'
|
280
|
+
when '--keep-in-jss'
|
281
|
+
@options.keep_in_jss = 'y'
|
292
282
|
|
293
283
|
end # case
|
294
284
|
end # opts.each
|
285
|
+
return if @action == 'help'
|
295
286
|
|
296
287
|
# the action is always the first thing in ARGV
|
297
288
|
# after the options have been removed
|
@@ -302,40 +293,39 @@ class App
|
|
302
293
|
end
|
303
294
|
|
304
295
|
# one or more letters is all we need to specify the action...
|
305
|
-
@action = D3::Admin::ACTIONS.select{|a| a.start_with? action_arg}.first
|
296
|
+
@action = D3::Admin::ACTIONS.select { |a| a.start_with? action_arg }.first
|
306
297
|
|
307
|
-
unless @action
|
298
|
+
unless @action && (D3::Admin::ACTIONS.include? @action)
|
308
299
|
raise ArgumentError, "#{D3::Admin::Help::USAGE}\nAction, must be one of #{D3::Admin::ACTIONS.join(', ')}"
|
309
300
|
end
|
310
301
|
|
311
302
|
# anything remaining in ARGV is one or more targets
|
312
303
|
# to work on.
|
313
304
|
@targets = ARGV
|
314
|
-
|
315
305
|
end # parse_commandline
|
316
306
|
|
317
307
|
### Show the help message
|
318
308
|
###
|
319
309
|
### @return [void]
|
320
310
|
###
|
321
|
-
def show_help
|
311
|
+
def show_help(type)
|
322
312
|
text = case type
|
323
313
|
when :help
|
324
|
-
|
314
|
+
D3::Admin::Help.help_text
|
325
315
|
when :extended_help
|
326
316
|
D3::Admin::Help.extended_help_text
|
327
317
|
when :show_d3_version
|
328
318
|
d3_version_text
|
329
319
|
end
|
330
320
|
D3.less_text text
|
331
|
-
|
332
|
-
end #show help
|
321
|
+
true
|
322
|
+
end # show help
|
333
323
|
|
334
324
|
### the d3 version text to spew
|
335
325
|
###
|
336
326
|
### @return [String] the text
|
337
327
|
def d3_version_text
|
338
|
-
|
328
|
+
<<-ENDVERS
|
339
329
|
D3 module version: #{D3::VERSION}
|
340
330
|
JSS module version: #{JSS::VERSION}
|
341
331
|
ENDVERS
|
@@ -344,22 +334,20 @@ ENDVERS
|
|
344
334
|
### Add a new pilot package from an existing
|
345
335
|
### JSS package
|
346
336
|
def import_pilot_pkg_from_jss
|
347
|
-
|
348
337
|
if @options.walkthru
|
349
338
|
@options.import_from = D3::Admin::Interactive.get_value :import unless @options.import_from
|
350
339
|
@options.version = D3::Admin::Interactive.get_value :version
|
351
340
|
@options.revision = D3::Admin::Interactive.get_value :revision
|
352
341
|
else
|
353
|
-
raise JSS::MissingDataError,
|
354
|
-
raise JSS::MissingDataError,
|
342
|
+
raise JSS::MissingDataError, 'A version must be provided with --version' unless @options.version
|
343
|
+
raise JSS::MissingDataError, 'A revision must be provided with --revision' unless @options.revision
|
355
344
|
end # if walk thru
|
356
345
|
|
357
|
-
imported_pkg = D3::Package.import(
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
)
|
346
|
+
imported_pkg = D3::Package.import(@options.import_from,
|
347
|
+
basename: @options.basename,
|
348
|
+
version: @options.version,
|
349
|
+
revision: @options.revision,
|
350
|
+
dist_pw: D3::Admin::Auth.rw_credentials(:dist)[:password])
|
363
351
|
imported_pkg.admin = @admin
|
364
352
|
edit_package imported_pkg
|
365
353
|
end
|
@@ -376,13 +364,12 @@ ENDVERS
|
|
376
364
|
### @return [void]
|
377
365
|
###
|
378
366
|
def add_pilot_package
|
379
|
-
|
380
367
|
## we must have a basename before going farther
|
381
368
|
@options.basename = @targets.first
|
382
369
|
if @options.walkthru
|
383
370
|
@options.basename ||= D3::Admin::Interactive.get_basename
|
384
371
|
else
|
385
|
-
raise ArgumentError,
|
372
|
+
raise ArgumentError, 'A basename must be provided as a target. Use -H for help' unless @options.basename
|
386
373
|
end
|
387
374
|
|
388
375
|
if @options.import
|
@@ -390,7 +377,7 @@ ENDVERS
|
|
390
377
|
return
|
391
378
|
end
|
392
379
|
|
393
|
-
puts
|
380
|
+
puts 'Adding a new pilot package to d3...'
|
394
381
|
|
395
382
|
# this holds the validated data used for making the new pkg
|
396
383
|
new_package_options = OpenStruct.new
|
@@ -408,7 +395,7 @@ ENDVERS
|
|
408
395
|
|
409
396
|
# if we were given a new version but not a new revision,
|
410
397
|
# set the new revision to 1
|
411
|
-
if @options[:version]
|
398
|
+
if @options[:version] && @options[:version] != default_options[:version]
|
412
399
|
@options[:revision] ||= 1
|
413
400
|
@options[:edition] ||= "#{@options.basename}-#{@options[:version]}-#{@options[:revision]}"
|
414
401
|
@options.package_name ||= @options[:edition]
|
@@ -419,7 +406,6 @@ ENDVERS
|
|
419
406
|
# for any options that weren't given on the commandline, use the defaults
|
420
407
|
default_options.each_pair { |opt, val| @options[opt] ||= val }
|
421
408
|
|
422
|
-
|
423
409
|
new_package_options = D3::Admin::Add.add_pilot_cli(@options)
|
424
410
|
|
425
411
|
##########################
|
@@ -436,7 +422,7 @@ ENDVERS
|
|
436
422
|
opts_to_confirm += D3::Admin::Add::BUILD_OPTIONS if new_package_options.package_build_type
|
437
423
|
opts_to_confirm += D3::Admin::Add::PKG_OPTIONS if new_package_options.package_build_type == :pkg
|
438
424
|
|
439
|
-
#D3::Admin::Add::NEW_PKG_OPTIONS.each do |opt|
|
425
|
+
# D3::Admin::Add::NEW_PKG_OPTIONS.each do |opt|
|
440
426
|
opts_to_confirm.each do |opt|
|
441
427
|
lbl = D3::Admin::OPTIONS[opt][:label]
|
442
428
|
if D3::Admin::OPTIONS[opt][:display_conversion]
|
@@ -444,11 +430,11 @@ ENDVERS
|
|
444
430
|
else
|
445
431
|
disp = new_package_options[opt]
|
446
432
|
end
|
447
|
-
lines <<
|
433
|
+
lines << "#{lbl}: #{disp}"
|
448
434
|
end
|
449
435
|
settings_conf_disp = "\n******* New d3 Package Settings *******\n"
|
450
|
-
settings_conf_disp += "Edition: #{
|
451
|
-
settings_conf_disp += "Basename: #{
|
436
|
+
settings_conf_disp += "Edition: #{new_package_options.edition}\n"
|
437
|
+
settings_conf_disp += "Basename: #{new_package_options.basename}\n"
|
452
438
|
settings_conf_disp += lines.join "\n"
|
453
439
|
settings_conf_disp += "\n"
|
454
440
|
puts settings_conf_disp
|
@@ -459,10 +445,9 @@ ENDVERS
|
|
459
445
|
|
460
446
|
D3::Admin::Add.add_new_package new_package_options
|
461
447
|
|
462
|
-
puts
|
448
|
+
puts 'Done!'
|
463
449
|
puts "To pilot it, run 'sudo d3 install #{new_package_options.edition}' on a test machine."
|
464
450
|
puts "To make it live, run 'd3admin live #{new_package_options.edition}' on your machine."
|
465
|
-
|
466
451
|
end # add pilot
|
467
452
|
|
468
453
|
### Make a package live.
|
@@ -470,11 +455,10 @@ ENDVERS
|
|
470
455
|
### @return [void]
|
471
456
|
###
|
472
457
|
def make_package_live
|
473
|
-
|
474
458
|
pkg_id = get_pkg_from_cli_or_prompt
|
475
459
|
|
476
460
|
if pkg_id.nil?
|
477
|
-
puts
|
461
|
+
puts 'No edition given to make live or no matching package found'
|
478
462
|
return
|
479
463
|
end
|
480
464
|
pkg = D3::Package.new id: pkg_id
|
@@ -485,33 +469,33 @@ ENDVERS
|
|
485
469
|
end
|
486
470
|
|
487
471
|
# is this a rollback?
|
488
|
-
rollback_warning =
|
489
|
-
if pkg.skipped?
|
472
|
+
rollback_warning = ''
|
473
|
+
if pkg.skipped? || pkg.deprecated?
|
490
474
|
rollback_warning = "\n\nWARNING: You're rolling back to an older edition!\n"
|
491
475
|
rollback_warning += "ALL non-frozen installs of '#{pkg.basename}' will be downgraded to this edition! \n"
|
492
476
|
end
|
493
477
|
|
494
478
|
# is the prev. live pkg in use in any policies?
|
495
|
-
policy_warning =
|
479
|
+
policy_warning = ''
|
496
480
|
pkg_id_being_deprecated = D3::Package.basenames_to_live_ids[pkg.basename]
|
497
481
|
if pkg_id_being_deprecated
|
498
482
|
outgoing_pkg = D3::Package.new(id: pkg_id_being_deprecated)
|
499
|
-
pols_used_by_old_pkg
|
483
|
+
pols_used_by_old_pkg = outgoing_pkg.policy_ids
|
500
484
|
unless pols_used_by_old_pkg.empty?
|
501
|
-
names = pols_used_by_old_pkg.map{|pid| JSS::Policy.map_all_ids_to(:name)[pid]}.join(', ')
|
485
|
+
names = pols_used_by_old_pkg.map { |pid| JSS::Policy.map_all_ids_to(:name)[pid] }.join(', ')
|
502
486
|
policy_warning = "\n\nWARNING: the current live package is in use by these Casper Policies:\n"
|
503
487
|
policy_warning += " #{names}\n"
|
504
|
-
policy_warning +=
|
488
|
+
policy_warning += 'You might want to update them to use the new live package.'
|
505
489
|
end # unless empty
|
506
490
|
end # if pkg_id_being_deprecated
|
507
491
|
|
508
|
-
confirm "Make #{pkg.edition} live for basename '#{pkg.basename}'#{rollback_warning}#{policy_warning}"
|
492
|
+
confirm "Make #{pkg.edition} live for basename '#{pkg.basename}'#{rollback_warning}#{policy_warning}", ''
|
509
493
|
|
510
494
|
pkg.make_live @admin
|
511
495
|
|
512
|
-
puts
|
496
|
+
puts 'Done!'
|
513
497
|
puts "New installs of basename '#{pkg.basename}' will get #{pkg.version}-#{pkg.revision}"
|
514
|
-
puts
|
498
|
+
puts 'Existing installs will be updated at the next d3 sync.'
|
515
499
|
end
|
516
500
|
|
517
501
|
### Edit an existing or importing package
|
@@ -521,23 +505,20 @@ ENDVERS
|
|
521
505
|
###
|
522
506
|
### @return [void]
|
523
507
|
###
|
524
|
-
def edit_package
|
525
|
-
|
508
|
+
def edit_package(pkg = nil)
|
526
509
|
unless pkg
|
527
510
|
pkg_id = get_pkg_from_cli_or_prompt
|
528
511
|
pkg = pkg_id ? D3::Package.new(id: pkg_id) : nil
|
529
512
|
end
|
530
513
|
if pkg.nil?
|
531
|
-
puts
|
514
|
+
puts 'No targets given to edit or no matching package found'
|
532
515
|
return
|
533
516
|
end
|
534
517
|
|
535
|
-
|
536
518
|
if @options.walkthru
|
537
519
|
changes_to_make = D3::Admin::Edit.loop_thru_editing_walkthru pkg
|
538
520
|
else
|
539
|
-
|
540
|
-
changes_to_make = D3::Admin::Edit.validate_cli_edits (@options)
|
521
|
+
changes_to_make = D3::Admin::Edit.validate_cli_edits(@options)
|
541
522
|
end # if @options.walkthru
|
542
523
|
|
543
524
|
# Confirm the edition is still good if vers or rev changed
|
@@ -546,20 +527,19 @@ ENDVERS
|
|
546
527
|
# Confirm the auto and excl groups don't conflict with each other
|
547
528
|
D3::Admin::Edit.check_for_new_group_overlaps pkg, changes_to_make
|
548
529
|
|
549
|
-
|
550
530
|
# exit if no changes on edit
|
551
|
-
if changes_to_make.empty?
|
552
|
-
|
553
|
-
|
531
|
+
if changes_to_make.empty? && !@options.import
|
532
|
+
puts 'No changes to make!'
|
533
|
+
return
|
554
534
|
end
|
555
535
|
|
556
536
|
# confirm
|
557
537
|
if @options.import
|
558
538
|
confirm_heading = "Import #{pkg.edition}, JSS id #{pkg.id}, into d3"
|
559
|
-
conf_deets =
|
539
|
+
conf_deets = 'with these non-default settings...'
|
560
540
|
else
|
561
541
|
confirm_heading = "Make changes to #{pkg.edition}, JSS id #{pkg.id}"
|
562
|
-
conf_deets =
|
542
|
+
conf_deets = 'Here are the changes...'
|
563
543
|
end
|
564
544
|
|
565
545
|
D3::Admin::Edit::EDITING_OPTIONS.each do |opt|
|
@@ -583,8 +563,7 @@ ENDVERS
|
|
583
563
|
# make the changes
|
584
564
|
D3::Admin::Edit.process_edits pkg, changes_to_make
|
585
565
|
|
586
|
-
puts @options.import ?
|
587
|
-
|
566
|
+
puts @options.import ? 'Done: the package has been imported to d3.' : 'Done! Your changes have been saved.'
|
588
567
|
end # edit_pkg
|
589
568
|
|
590
569
|
### delete a pkg, optionallay archiving it
|
@@ -592,41 +571,39 @@ ENDVERS
|
|
592
571
|
### @return [void]
|
593
572
|
###
|
594
573
|
def delete_package
|
595
|
-
|
596
574
|
pkg_id = get_pkg_from_cli_or_prompt
|
597
575
|
|
598
576
|
if pkg_id.nil?
|
599
|
-
puts
|
577
|
+
puts 'No targets given to delete or no matching package found'
|
600
578
|
return
|
601
579
|
end
|
602
580
|
|
603
581
|
# check to see if the pkg is missing
|
604
|
-
if D3::Package.package_data[pkg_id][:status] == :missing || (
|
582
|
+
if D3::Package.package_data[pkg_id][:status] == :missing || (!JSS::Package.all_ids.include? pkg_id)
|
605
583
|
delete_missing_package pkg_id
|
606
584
|
return
|
607
585
|
else
|
608
586
|
pkg = D3::Package.new id: pkg_id
|
609
587
|
end
|
610
588
|
|
611
|
-
got_scripts =
|
589
|
+
got_scripts = !pkg.script_ids.values.empty?
|
612
590
|
|
613
591
|
if got_scripts
|
614
592
|
|
615
593
|
if @options.walkthru
|
616
|
-
@options.keep_scripts =
|
594
|
+
@options.keep_scripts = D3::Admin::Interactive.get_value(:get_keep_scripts, default = 'n', check_method = :validate_yes_no)
|
617
595
|
|
618
596
|
@options.keep_in_jss = D3::Admin::Interactive.get_value(:get_keep_in_jss, default = 'n', check_method = :validate_yes_no)
|
619
597
|
end # if @options.walkthru
|
620
598
|
|
621
|
-
|
622
599
|
if @options.keep_scripts
|
623
|
-
deets =
|
600
|
+
deets = ' - Keeping pre- or post- scripts in the JSS'
|
624
601
|
else
|
625
|
-
deets =
|
602
|
+
deets = ' - Deleting pre- or post- scripts not used elsewhere'
|
626
603
|
end # if @options.keep_scripts
|
627
604
|
|
628
605
|
else
|
629
|
-
deets =
|
606
|
+
deets = ' - No pre- or post- scripts to delete'
|
630
607
|
end # if got_scripts
|
631
608
|
|
632
609
|
if @options.keep_in_jss
|
@@ -638,22 +615,21 @@ ENDVERS
|
|
638
615
|
confirm "DELETE #{pkg.edition}, JSS id #{pkg.id}\nDist.Point Filename: #{pkg.filename}", deets
|
639
616
|
|
640
617
|
if @options.keep_scripts && got_scripts
|
641
|
-
puts
|
618
|
+
puts 'Scanning for other packages or policies using pre- or post- scripts before deleting...'
|
642
619
|
end
|
643
620
|
|
644
621
|
script_actions = pkg.delete(
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
622
|
+
admin: @admin,
|
623
|
+
keep_scripts: @options.keep_scripts,
|
624
|
+
keep_in_jss: @options.keep_in_jss,
|
625
|
+
rwpw: D3::Admin::Auth.rw_credentials(:dist)[:password]
|
626
|
+
)
|
650
627
|
|
651
628
|
unless script_actions.empty?
|
652
|
-
puts "Here' what happened to the scripts:"
|
629
|
+
puts "Here's what happened to the scripts:"
|
653
630
|
puts script_actions.join "\n"
|
654
631
|
end
|
655
632
|
puts "Done! #{pkg.edition} has been deleted"
|
656
|
-
|
657
633
|
end # delete package
|
658
634
|
|
659
635
|
### Delete a package that's missing from the JSS
|
@@ -661,15 +637,15 @@ ENDVERS
|
|
661
637
|
###
|
662
638
|
def delete_missing_package (pkgid)
|
663
639
|
pkg_data = D3::Package.package_data[pkgid]
|
664
|
-
script_ids = [pkg_data[:pre_install_script_id], pkg_data[:post_install_script_id], pkg_data[:pre_remove_script_id], pkg_data[:post_remove_script_id]
|
640
|
+
script_ids = [pkg_data[:pre_install_script_id], pkg_data[:post_install_script_id], pkg_data[:pre_remove_script_id], pkg_data[:post_remove_script_id]].compact
|
665
641
|
|
666
642
|
if script_ids.empty?
|
667
|
-
deets =
|
643
|
+
deets = ' - No pre- or post- scripts to delete'
|
668
644
|
else
|
669
645
|
if @options.keep_scripts
|
670
|
-
deets =
|
646
|
+
deets = ' - Keeping pre- or post- scripts in the JSS'
|
671
647
|
else
|
672
|
-
deets =
|
648
|
+
deets = ' - Deleting pre- or post- scripts not in use elsewhere'
|
673
649
|
end # if @options.keep_scripts
|
674
650
|
end # if script_ids.empty?
|
675
651
|
|
@@ -678,8 +654,8 @@ ENDVERS
|
|
678
654
|
JSS::DB_CNX.db.query "DELETE FROM #{D3::Database::PACKAGE_TABLE[:table_name]} WHERE package_id = #{pkgid}"
|
679
655
|
puts "Package #{pkg_data[:edition]} deleted."
|
680
656
|
|
681
|
-
if
|
682
|
-
puts
|
657
|
+
if !@options.keep_scripts && !script_ids.empty?
|
658
|
+
puts 'Scanning for other packages or policies using pre- or post- scripts before deleting...'
|
683
659
|
policy_scripts = D3.policy_scripts
|
684
660
|
script_ids.each do |victim_script_id|
|
685
661
|
next unless JSS::Script.all_ids.include? victim_script_id
|
@@ -693,15 +669,14 @@ ENDVERS
|
|
693
669
|
end
|
694
670
|
end # policy scripts.each
|
695
671
|
d3_users = (D3::Package.packages_for_script(victim_script_id) - [pkgid])
|
696
|
-
d3_users.each{|
|
697
|
-
if pol_users.empty?
|
672
|
+
d3_users.each { |pid| puts "Script '#{victim_script_name}' in use by d3 edition '#{D3::Package.ids_to_editions[pid]}'" }
|
673
|
+
if pol_users.empty? && d3_users.empty?
|
698
674
|
JSS::Script.new(id: victim_script_id).delete
|
699
675
|
puts "Deleted script '#{victim_script_name}'"
|
700
676
|
end
|
701
677
|
end # do script id
|
702
678
|
end # if @options.keep_scripts && (not script_ids.empty?)
|
703
|
-
|
704
|
-
end # delete_missing_package (pkgid)
|
679
|
+
end # delete_missing_package(pkgid)
|
705
680
|
|
706
681
|
### Get an existing pkg id from the user via prompt (if walkthru) or the
|
707
682
|
### first thing listed in @targets. We don't instantiate the pkg here
|
@@ -710,11 +685,11 @@ ENDVERS
|
|
710
685
|
### @return [Ingeter, nil] an existing d3 pkg id if one was chosen
|
711
686
|
###
|
712
687
|
def get_pkg_from_cli_or_prompt
|
713
|
-
if @options.walkthru
|
688
|
+
if @options.walkthru && @targets.first.nil?
|
714
689
|
D3::Admin::Interactive.get_value :get_existing_package, nil, :validate_existing_package
|
715
690
|
else
|
716
691
|
pkg_data = D3::Package.find_package(@targets.first, :hash)
|
717
|
-
|
692
|
+
pkg_data ? pkg_data[:id] : nil
|
718
693
|
end
|
719
694
|
end
|
720
695
|
|
@@ -729,21 +704,20 @@ ENDVERS
|
|
729
704
|
### @param details[String] The details requireing confirmation
|
730
705
|
###
|
731
706
|
###
|
732
|
-
def confirm
|
733
|
-
|
707
|
+
def confirm(action, details = nil)
|
734
708
|
puts
|
735
|
-
puts
|
709
|
+
puts '*****************************************'
|
736
710
|
puts "Ahoy there! You are about to:\n#{action}"
|
737
|
-
puts
|
711
|
+
puts '*****************************************'
|
738
712
|
puts details if details
|
739
713
|
|
740
714
|
if @options.auto_confirm
|
741
|
-
puts
|
715
|
+
puts 'auto-confirmed! Here we go.....'
|
742
716
|
else
|
743
717
|
puts
|
744
|
-
reply = Readline.readline(
|
718
|
+
reply = Readline.readline('Are you SURE? (y/n): ', false)
|
745
719
|
return true if reply =~ /^y/i
|
746
|
-
puts
|
720
|
+
puts 'Cancelled - wise choice!'
|
747
721
|
exit 0
|
748
722
|
end # if autoconfirm
|
749
723
|
end # confirm
|
@@ -753,11 +727,10 @@ ENDVERS
|
|
753
727
|
### @return [void]
|
754
728
|
###
|
755
729
|
def show_package_info
|
756
|
-
|
757
730
|
pkg_id = get_pkg_from_cli_or_prompt
|
758
731
|
|
759
732
|
if pkg_id.nil?
|
760
|
-
puts
|
733
|
+
puts 'No targets given or no matching package found'
|
761
734
|
return
|
762
735
|
end
|
763
736
|
|
@@ -772,10 +745,10 @@ ENDDEETS
|
|
772
745
|
pkg_deets += "Basename: #{pkg.basename}\n"
|
773
746
|
pkg_deets += "Version: #{pkg.version}\n"
|
774
747
|
pkg_deets += "Revision: #{pkg.revision}\n"
|
775
|
-
pkg_deets += "Added to on: #{pkg.added_date.strftime
|
748
|
+
pkg_deets += "Added to on: #{pkg.added_date.strftime '%Y-%m-%d'}\n"
|
776
749
|
pkg_deets += "Added by: #{pkg.added_by}\n"
|
777
750
|
if pkg.release_date
|
778
|
-
pkg_deets += "Released on: #{pkg.release_date.strftime
|
751
|
+
pkg_deets += "Released on: #{pkg.release_date.strftime '%Y-%m-%d'}\n"
|
779
752
|
pkg_deets += "Released by: #{pkg.released_by}\n"
|
780
753
|
end
|
781
754
|
|
@@ -784,15 +757,14 @@ ENDDEETS
|
|
784
757
|
next if done.include? opt
|
785
758
|
label = D3::Admin::OPTIONS[opt][:label]
|
786
759
|
if D3::Admin::OPTIONS[opt][:display_conversion]
|
787
|
-
val_display = D3::Admin::OPTIONS[opt][:display_conversion].call(pkg.send
|
760
|
+
val_display = D3::Admin::OPTIONS[opt][:display_conversion].call(pkg.send(opt))
|
788
761
|
else
|
789
|
-
val_display =
|
762
|
+
val_display = pkg.send opt
|
790
763
|
end
|
791
|
-
val_display = val_display.to_s.empty? ?
|
764
|
+
val_display = val_display.to_s.empty? ? 'none' : val_display
|
792
765
|
pkg_deets += "#{label}: #{val_display}\n"
|
793
766
|
end
|
794
767
|
|
795
|
-
|
796
768
|
puts pkg_deets
|
797
769
|
puts
|
798
770
|
end # show_package_info
|
@@ -806,22 +778,22 @@ ENDDEETS
|
|
806
778
|
|
807
779
|
if @options.walkthru
|
808
780
|
# prompt for search type?
|
809
|
-
|
810
|
-
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
781
|
+
search_for = D3::Admin::Interactive.prompt_for_data(
|
782
|
+
desc: "SEARCH PACKAGES BY?\nAre you searching for packages by basename, or by scoped groups?\nEnter 'b' or 'g'",
|
783
|
+
prompt: 'Basenames or Groups',
|
784
|
+
default: 'b',
|
785
|
+
required: false
|
786
|
+
)
|
815
787
|
@options.search_groups = true if search_for =~ /^g/i
|
816
788
|
|
817
789
|
@targets = [D3::Admin::Interactive.get_search_target] if @targets.empty?
|
818
790
|
@options.status = D3::Admin::Interactive.get_status_for_filter.split(/,\s*/) if @options.status.empty?
|
819
|
-
end #if @options.walkthru
|
791
|
+
end # if @options.walkthru
|
820
792
|
|
821
|
-
@options.status = [] if @options.status.include?
|
793
|
+
@options.status = [] if @options.status.include? 'all'
|
822
794
|
|
823
795
|
# show all pkgs or group scope
|
824
|
-
if @targets.empty?
|
796
|
+
if @targets.empty? || @targets.include?('all')
|
825
797
|
if @options.search_groups
|
826
798
|
D3::Admin::Report.list_all_pkgs_with_scope @options.status
|
827
799
|
else
|
@@ -832,14 +804,13 @@ ENDDEETS
|
|
832
804
|
|
833
805
|
# show specific basenames or group scopes
|
834
806
|
@targets.each do |search_target|
|
835
|
-
|
836
|
-
# groups?
|
807
|
+
# Groups?
|
837
808
|
if @options.search_groups
|
838
|
-
found_groups = JSS::ComputerGroup.all_names.select{|gn| gn =~ /#{search_target}/}
|
809
|
+
found_groups = JSS::ComputerGroup.all_names.select { |gn| gn =~ /#{search_target}/ }
|
839
810
|
if found_groups.empty?
|
840
811
|
puts "No computer groups in Casper match '#{search_target}'"
|
841
812
|
else
|
842
|
-
found_groups.each {|fgn|
|
813
|
+
found_groups.each { |fgn|
|
843
814
|
D3::Admin::Report.list_scoped_installs fgn, @options.status, :auto
|
844
815
|
D3::Admin::Report.list_scoped_installs fgn, @options.status, :excluded
|
845
816
|
} # found_groups.each
|
@@ -847,11 +818,11 @@ ENDDEETS
|
|
847
818
|
|
848
819
|
# basenames
|
849
820
|
else
|
850
|
-
found_basenames = D3::Package.all_basenames.select{|bn| bn =~ /#{search_target}/}
|
821
|
+
found_basenames = D3::Package.all_basenames.select { |bn| bn =~ /#{search_target}/ }
|
851
822
|
if found_basenames.empty?
|
852
823
|
puts "No basenames in d3 match '#{search_target}'"
|
853
824
|
else
|
854
|
-
found_basenames.each {|fbn| D3::Admin::Report.list_packages fbn, @options.status }
|
825
|
+
found_basenames.each { |fbn| D3::Admin::Report.list_packages fbn, @options.status }
|
855
826
|
end # if found_basenames.empty?
|
856
827
|
end # if @options.search_groups
|
857
828
|
end # @targets.each do |search_target|
|
@@ -872,13 +843,13 @@ ENDDEETS
|
|
872
843
|
if @targets.empty?
|
873
844
|
one_or_all = D3::Admin::Interactive.prompt_for_data(
|
874
845
|
desc: "ALL COMPUTERS?\nAre you reporting for a single computer or all computers?\nEnter 'all' for all computers, '1' for one",
|
875
|
-
prompt:
|
846
|
+
prompt: 'All or 1',
|
876
847
|
default: 'all',
|
877
848
|
required: false
|
878
849
|
)
|
879
850
|
|
880
851
|
# basename report across computers
|
881
|
-
if one_or_all ==
|
852
|
+
if one_or_all == 'all'
|
882
853
|
@targets = [(D3::Admin::Interactive.get_value :get_basename, nil, :validate_basename)]
|
883
854
|
|
884
855
|
# reporting single computers
|
@@ -891,34 +862,32 @@ ENDDEETS
|
|
891
862
|
|
892
863
|
# prompt for rcpts or puppies
|
893
864
|
rcpts_or_pups = D3::Admin::Interactive.prompt_for_data(
|
894
|
-
|
895
|
-
|
896
|
-
|
897
|
-
|
865
|
+
desc: "RECEIPTS OR PUPPIES?\nShould the report list receipts or pending puppytime installs?\nEnter 'r' for receipts, 'p' for puppies",
|
866
|
+
prompt: 'Receipts or puppies',
|
867
|
+
required: false,
|
868
|
+
default: 'r'
|
898
869
|
)
|
899
|
-
@options.report_q
|
870
|
+
@options.report_q = rcpts_or_pups =~ /^p/i ? true : false
|
900
871
|
|
901
872
|
# prompt for status or frozen
|
902
873
|
@options.status = D3::Admin::Interactive.get_status_for_filter(:with_frozen).split(/,\s*/) if @options.status.empty?
|
903
874
|
|
904
|
-
end #if @options.walkthru
|
875
|
+
end # if @options.walkthru
|
905
876
|
|
906
|
-
@options.status = [] if @options.status.include?
|
877
|
+
@options.status = [] if @options.status.include? 'all'
|
907
878
|
|
908
879
|
# pass the --frozen option with the --status options, since
|
909
880
|
# its treated like a pseudo-status, and thats where walkthru puts it too
|
910
|
-
@options.status <<
|
881
|
+
@options.status << 'frozen' if @options.report_frozen
|
911
882
|
|
912
883
|
reporting = @options.report_q ? :puppies : :receipts
|
913
884
|
|
914
|
-
|
915
885
|
if @targets.empty?
|
916
|
-
puts
|
886
|
+
puts 'No basename or computer name given for report'
|
917
887
|
return
|
918
888
|
end
|
919
889
|
|
920
890
|
@targets.each do |target|
|
921
|
-
|
922
891
|
# report puppies
|
923
892
|
if reporting == :puppies
|
924
893
|
if @options.report_computers
|
@@ -951,7 +920,6 @@ ENDDEETS
|
|
951
920
|
### @return [void]
|
952
921
|
###
|
953
922
|
def config
|
954
|
-
|
955
923
|
if @targets.include? 'display'
|
956
924
|
D3::Admin::Prefs.display_config
|
957
925
|
else
|
@@ -959,16 +927,12 @@ ENDDEETS
|
|
959
927
|
end
|
960
928
|
end # config
|
961
929
|
|
962
|
-
|
963
930
|
end # class App
|
964
931
|
|
965
|
-
|
966
|
-
|
967
|
-
|
968
932
|
### save terminal state incase user interrupts during readline or less
|
969
933
|
if $stdin.tty?
|
970
934
|
stty_save = `stty -g`.chomp
|
971
|
-
trap(
|
935
|
+
trap('SIGINT') do
|
972
936
|
puts "\nCancelled! Woot!"
|
973
937
|
system('stty', stty_save)
|
974
938
|
exit 0
|
@@ -979,8 +943,8 @@ begin
|
|
979
943
|
app = App.new
|
980
944
|
app.run
|
981
945
|
rescue
|
982
|
-
puts "An error occurred: #{
|
983
|
-
puts
|
946
|
+
puts "An error occurred: #{$ERROR_INFO.class}: #{$ERROR_INFO}!"
|
947
|
+
puts $ERROR_POSITION if D3::Admin.debug
|
984
948
|
exit 1
|
985
949
|
ensure
|
986
950
|
if D3::Admin::Auth.connected?
|