bin/d3admin in depot3-3.0.15 vs bin/d3admin in depot3-3.0.20
- old
+ new
@@ -42,56 +42,51 @@
############
# Load libraries
require 'd3'
-
-
######################
# The Script Object
######################
class App
### Setup
def initialize
-
### parse the commandline
parse_commandline
# can't be run as root other than help, search or report - no keychain, among other things
- raise "d3admin can't make server changes as root" if JSS.superuser? and (not @action =~ /^[hsr]/)
+ raise "d3admin can't make server changes as root" if JSS.superuser? && (!@action =~ /^[hsr]/)
+ end # initialize
- end #initialize
-
### Run
def run
-
- if @action == "help"
+ if @action == 'help'
show_help @options.helptype
return
end
# run config if it hasn't ever run
unless D3::Admin::Prefs.prefs[:last_config] || JSS.superuser?
puts
- puts "******** INITIAL D3ADMIN CONFIGURATION ********"
+ puts '******** INITIAL D3ADMIN CONFIGURATION ********'
puts
config
# but dont run it again if that's the action chosen
return if @action =~ /^c/
end
### our admin is us
@admin = @options.admin || ENV['USER']
# admin can't be a badmin
- if D3.badmins.include? @admin and D3::Admin::ACTIONS_NEEDING_ADMIN.include? @action
+ if (D3.badmins.include? @admin) && (D3::Admin::ACTIONS_NEEDING_ADMIN.include? @action)
raise D3::PermissionError, "d3admin cannot do '#{@action}' as #{@admin}."
end
# config before connecting
- if @action =~ /^c/ and !JSS.superuser?
+ if @action =~ /^c/ && !JSS.superuser?
config
return
end
### connect to the server, prompting for info as needed
@@ -101,47 +96,44 @@
D3::Admin::Auth.connect
end
case @action
- when /^a/ then
- add_pilot_package
+ when /^a/ then
+ add_pilot_package
- when /^e/ then
- edit_package
+ when /^e/ then
+ edit_package
- when /^l/ then
- make_package_live
+ when /^l/ then
+ make_package_live
- when /^d/ then
- delete_package
+ when /^d/ then
+ delete_package
- when /^i/ then
- show_package_info
+ when /^i/ then
+ show_package_info
- when /^s/ then
- search
+ when /^s/ then
+ search
- when /^r/ then
- show_report
+ when /^r/ then
+ show_report
- else
- raise ArgumentError, "#{D3::Admin::Help::USAGE}\nUnknown action, must be one of #{D3::Admin::ACTIONS.join(', ')}"
+ else
+ raise ArgumentError, "#{D3::Admin::Help::USAGE}\nUnknown action, must be one of #{D3::Admin::ACTIONS.join(', ')}"
end # case
+ end # run
-
- end #run
-
### Parse the command line
###
### @return [void]
###
def parse_commandline
-
# Debugging file? if so, always set debug.
- ARGV << "--debug" if D3::DEBUG_FILE.exist?
+ ARGV << '--debug' if D3::DEBUG_FILE.exist?
# this holds everything that comes from the commandline
# or from prompting the user
@options = OpenStruct.new
@@ -151,217 +143,213 @@
# --status can be given multiple times, or can be a comma-separated list.
# the results end up in this array
@options.status = []
### see Admin::CLIOpts
- opt_arry = D3::Admin::OPTIONS.values.map{|o| o[:cli] }
- opts = GetoptLong.new *opt_arry
+ opt_arry = D3::Admin::OPTIONS.values.map { |o| o[:cli] }
+ opts = GetoptLong.new(*opt_arry)
opts.each do |opt, arg|
case opt
- #general
- when '--help'
- @action = "help"
- @options.helptype = :help
- return
- when '--extended-help'
- @action = "help"
- @options.helptype = :extended_help
- return
- when '--debug'
- D3::Admin.debug = true
+ # General
+ when '--help'
+ @action = 'help'
+ @options.helptype = :help
+ break
+ when '--extended-help'
+ @action = 'help'
+ @options.helptype = :extended_help
+ break
+ when '--debug'
+ D3::Admin.debug = true
+ when '--d3-version'
+ @action = 'help'
+ @options.helptype = :show_d3_version
+ break
+ when '--walkthru'
+ @options.walkthru = true
+ when '--auto-confirm'
+ @options.auto_confirm = true
+ when '--admin'
+ @options.admin = arg
- when '--d3-version'
- @action = "help"
- @options.helptype = :show_d3_version
- return
+ # Search and Report
+ when '--status'
+ @options.status += arg.split(/,\s*/)
+ when '--queue'
+ @options.report_q = true
+ when '--frozen'
+ @options.report_frozen = true
+ when '--computers'
+ @options.report_computers = true
+ when '--groups'
+ @options.search_groups = true
- when '--walkthru'
- @options.walkthru = true
- when '--auto-confirm'
- @options.auto_confirm = true
+ # Add/Edit
+ when '--import'
+ @options.import = true
+ @options.import_from = arg.empty? ? nil : arg
+ when '--no-inherit'
+ @options.no_inherit = true
+ when '--basename'
+ @options.basename = arg
+ when '--version'
+ @options.version = arg
+ when '--revision'
+ @options.revision = arg
+ when '--description'
+ @options.description = arg
+ when '--package-name'
+ @options.package_name = arg
+ when '--filename'
+ @options.filename = arg
+ when '--edition'
+ @options.edition = arg
+ when '--source-path'
+ @options.source_path = arg
+ when '--dmg'
+ @options.package_build_type = 'd'
+ when '--preserve-owners'
+ @options.pkg_preserve_owners = 'y'
+ when '--pkg-id'
+ @options.pkg_identifier = arg
+ when '--workspace'
+ @options.workspace = arg
+ when '--pre-install'
+ @options.pre_install = arg
+ when '--post-install'
+ @options.post_install = arg
+ when '--pre-remove'
+ @options.pre_remove = arg
+ when '--post-remove'
+ @options.post_remove = arg
+ when '--auto-groups'
+ @options.auto_groups = arg
+ when '--excluded-groups'
+ @options.excluded_groups = arg
+ when '--prohibiting-processes'
+ @options.prohibiting_processes = arg
+ when '--cpu_type'
+ @options.cpu_type = arg
+ when '--category'
+ @options.category = arg
- when '--admin'
- @options.admin = arg
+ when '--reboot'
+ # dft is no, so if arg is empty or /^n(o)$/i, it should be nil,
+ # otherwise must be /^y(es)$/i
+ if arg.empty? || arg =~ /^no?$/i
+ @options.reboot = 'n'
+ elsif arg =~ /^y(es)?$/i
+ @options.reboot = 'y'
+ else
+ raise ArgumentError, "--reboot must be 'y' or 'n'"
+ end
- # search and report
- when '--status'
- @options.status += arg.split(/,\s*/)
- when '--queue'
- @options.report_q = true
- when '--frozen'
- @options.report_frozen = true
- when '--computers'
- @options.report_computers = true
- when '--groups'
- @options.search_groups = true
- # add/edit
- when '--import'
- @options.import = true
- @options.import_from = arg.empty? ? nil : arg
- when '--no-inherit'
- @options.no_inherit = true
- when '--basename'
- @options.basename = arg
- when '--version'
- @options.version = arg
- when '--revision'
- @options.revision = arg
- when '--description'
- @options.description = arg
- when '--package-name'
- @options.package_name = arg
- when '--filename'
- @options.filename = arg
- when '--edition'
- @options.edition = arg
- when '--source-path'
- @options.source_path = arg
- when '--dmg'
- @options.package_build_type = 'd'
- when '--preserve-owners'
- @options.pkg_preserve_owners = 'y'
- when '--pkg-id'
- @options.pkg_identifier = arg
- when '--workspace'
- @options.workspace = arg
- when '--pre-install'
- @options.pre_install = arg
- when '--post-install'
- @options.post_install = arg
- when '--pre-remove'
- @options.pre_remove = arg
- when '--post-remove'
- @options.post_remove = arg
- when '--auto-groups'
- @options.auto_groups = arg
- when '--excluded-groups'
- @options.excluded_groups = arg
- when '--prohibiting-processes'
- @options.prohibiting_processes = arg
- when '--cpu_type'
- @options.cpu_type = arg
- when '--category'
- @options.category = arg
+ when '--remove-first'
+ # dft is no, so if arg is empty or /^n(o)$/i, it should be nil,
+ # otherwise must be /^y(es)$/i
+ if arg.empty? || arg =~ /^no?$/i
+ @options.remove_first = 'n'
+ elsif arg =~ /^y(es)?$/i
+ @options.remove_first = 'y'
+ else
+ raise ArgumentError, "--remove-first must be 'y' or 'n'"
+ end
- when '--reboot'
- # dft is no, so if arg is empty or /^n(o)$/i, it should be nil,
- # otherwise must be /^y(es)$/i
- if arg.empty? or arg =~ /^no?$/i
- @options.reboot = "n"
- elsif arg =~ /^y(es)?$/i
- @options.reboot = "y"
- else
- raise ArgumentError, "--reboot must be 'y' or 'n'"
- end
+ when '--removable'
+ # dft is yes, so if arg is empty or /^y(es)$/i, it should be nil,
+ # otherwise must be /^n(o)$/i
+ if arg.empty? || arg =~ /^y(es)?$/i
+ @options.removable = 'y'
+ elsif arg =~ /^no?$/i
+ @options.removable = 'n'
+ else
+ raise ArgumentError, "--removable must be 'y' or 'n'"
+ end
- when '--remove-first'
- # dft is no, so if arg is empty or /^n(o)$/i, it should be nil,
- # otherwise must be /^y(es)$/i
- if arg.empty? or arg =~ /^no?$/i
- @options.remove_first = "n"
- elsif arg =~ /^y(es)?$/i
- @options.remove_first = "y"
- else
- raise ArgumentError, "--remove-first must be 'y' or 'n'"
- end
+ when '--oses'
+ @options.oses = arg
+ when '--expiration'
+ @options.expiration = arg
+ when '--expiration-path', '--expiration_paths'
+ @options.expiration_paths = arg
- when '--removable'
- # dft is yes, so if arg is empty or /^y(es)$/i, it should be nil,
- # otherwise must be /^n(o)$/i
- if arg.empty? or arg =~ /^y(es)?$/i
- @options.removable = "y"
- elsif arg =~ /^no?$/i
- @options.removable = "n"
- else
- raise ArgumentError, "--removable must be 'y' or 'n'"
- end
+ # Delete
+ when '--keep-scripts'
+ @options.keep_scripts = 'y'
+ when '--keep-in-jss'
+ @options.keep_in_jss = 'y'
- when '--oses'
- @options.oses = arg
- when '--expiration'
- @options.expiration = arg
- when '--expiration-path', '--expiration_paths'
- @options.expiration_paths = arg
-
- # delete
- when '--keep-scripts'
- @options.keep_scripts = 'y'
- when '--keep-in-jss'
- @options.keep_in_jss = 'y'
-
end # case
end # opts.each
+ return if @action == 'help'
# the action is always the first thing in ARGV
# after the options have been removed
action_arg = ARGV.shift
unless action_arg
raise ArgumentError, "#{D3::Admin::Help::USAGE}\nAction, must be one of #{D3::Admin::ACTIONS.join(', ')}"
end
# one or more letters is all we need to specify the action...
- @action = D3::Admin::ACTIONS.select{|a| a.start_with? action_arg}.first
+ @action = D3::Admin::ACTIONS.select { |a| a.start_with? action_arg }.first
- unless @action and D3::Admin::ACTIONS.include? @action
+ unless @action && (D3::Admin::ACTIONS.include? @action)
raise ArgumentError, "#{D3::Admin::Help::USAGE}\nAction, must be one of #{D3::Admin::ACTIONS.join(', ')}"
end
# anything remaining in ARGV is one or more targets
# to work on.
@targets = ARGV
-
end # parse_commandline
### Show the help message
###
### @return [void]
###
- def show_help (type)
+ def show_help(type)
text = case type
when :help
- D3::Admin::Help.help_text
+ D3::Admin::Help.help_text
when :extended_help
D3::Admin::Help.extended_help_text
when :show_d3_version
d3_version_text
end
D3.less_text text
- return true
- end #show help
+ true
+ end # show help
### the d3 version text to spew
###
### @return [String] the text
def d3_version_text
- <<-ENDVERS
+ <<-ENDVERS
D3 module version: #{D3::VERSION}
JSS module version: #{JSS::VERSION}
ENDVERS
end
### Add a new pilot package from an existing
### JSS package
def import_pilot_pkg_from_jss
-
if @options.walkthru
@options.import_from = D3::Admin::Interactive.get_value :import unless @options.import_from
@options.version = D3::Admin::Interactive.get_value :version
@options.revision = D3::Admin::Interactive.get_value :revision
else
- raise JSS::MissingDataError, "A version must be provided with --version" unless @options.version
- raise JSS::MissingDataError, "A revision must be provided with --revision" unless @options.revision
+ raise JSS::MissingDataError, 'A version must be provided with --version' unless @options.version
+ raise JSS::MissingDataError, 'A revision must be provided with --revision' unless @options.revision
end # if walk thru
- imported_pkg = D3::Package.import( @options.import_from,
- basename: @options.basename,
- version: @options.version,
- revision: @options.revision,
- dist_pw: D3::Admin::Auth.rw_credentials(:dist)[:password]
- )
+ imported_pkg = D3::Package.import(@options.import_from,
+ basename: @options.basename,
+ version: @options.version,
+ revision: @options.revision,
+ dist_pw: D3::Admin::Auth.rw_credentials(:dist)[:password])
imported_pkg.admin = @admin
edit_package imported_pkg
end
### Add a new package to d3 for piloting
@@ -374,25 +362,24 @@
### making the new package
###
### @return [void]
###
def add_pilot_package
-
## we must have a basename before going farther
@options.basename = @targets.first
if @options.walkthru
@options.basename ||= D3::Admin::Interactive.get_basename
else
- raise ArgumentError, "A basename must be provided as a target. Use -H for help" unless @options.basename
+ raise ArgumentError, 'A basename must be provided as a target. Use -H for help' unless @options.basename
end
if @options.import
import_pilot_pkg_from_jss
return
end
- puts "Adding a new pilot package to d3..."
+ puts 'Adding a new pilot package to d3...'
# this holds the validated data used for making the new pkg
new_package_options = OpenStruct.new
# now figure out our default values..
@@ -406,22 +393,21 @@
# via the commandline
else
# if we were given a new version but not a new revision,
# set the new revision to 1
- if @options[:version] and @options[:version] != default_options[:version]
+ if @options[:version] && @options[:version] != default_options[:version]
@options[:revision] ||= 1
@options[:edition] ||= "#{@options.basename}-#{@options[:version]}-#{@options[:revision]}"
@options.package_name ||= @options[:edition]
@options.filename ||= "#{@options[:edition]}.#{default_options.package_build_type}"
end
# for any options that weren't given on the commandline, use the defaults
default_options.each_pair { |opt, val| @options[opt] ||= val }
-
new_package_options = D3::Admin::Add.add_pilot_cli(@options)
##########################
end # if @options.walkthru
@@ -434,134 +420,128 @@
opts_to_confirm = D3::Admin::Add::NEW_PKG_OPTIONS
opts_to_confirm += D3::Admin::Add::BUILD_OPTIONS if new_package_options.package_build_type
opts_to_confirm += D3::Admin::Add::PKG_OPTIONS if new_package_options.package_build_type == :pkg
- #D3::Admin::Add::NEW_PKG_OPTIONS.each do |opt|
+ # D3::Admin::Add::NEW_PKG_OPTIONS.each do |opt|
opts_to_confirm.each do |opt|
lbl = D3::Admin::OPTIONS[opt][:label]
if D3::Admin::OPTIONS[opt][:display_conversion]
disp = D3::Admin::OPTIONS[opt][:display_conversion].call(new_package_options[opt])
else
disp = new_package_options[opt]
end
- lines << "#{lbl}: #{disp}"
+ lines << "#{lbl}: #{disp}"
end
settings_conf_disp = "\n******* New d3 Package Settings *******\n"
- settings_conf_disp += "Edition: #{ new_package_options.edition}\n"
- settings_conf_disp += "Basename: #{ new_package_options.basename}\n"
+ settings_conf_disp += "Edition: #{new_package_options.edition}\n"
+ settings_conf_disp += "Basename: #{new_package_options.basename}\n"
settings_conf_disp += lines.join "\n"
settings_conf_disp += "\n"
puts settings_conf_disp
end
# Get confirmation
confirm "Create a new package '#{new_package_options.edition}' in d3\nwith settings shown above."
D3::Admin::Add.add_new_package new_package_options
- puts "Done!"
+ puts 'Done!'
puts "To pilot it, run 'sudo d3 install #{new_package_options.edition}' on a test machine."
puts "To make it live, run 'd3admin live #{new_package_options.edition}' on your machine."
-
end # add pilot
### Make a package live.
###
### @return [void]
###
def make_package_live
-
pkg_id = get_pkg_from_cli_or_prompt
if pkg_id.nil?
- puts "No edition given to make live or no matching package found"
+ puts 'No edition given to make live or no matching package found'
return
end
pkg = D3::Package.new id: pkg_id
if pkg.status == :live
puts "Doh, '#{pkg.edition}' is already live"
return
end
# is this a rollback?
- rollback_warning = ""
- if pkg.skipped? or pkg.deprecated?
+ rollback_warning = ''
+ if pkg.skipped? || pkg.deprecated?
rollback_warning = "\n\nWARNING: You're rolling back to an older edition!\n"
rollback_warning += "ALL non-frozen installs of '#{pkg.basename}' will be downgraded to this edition! \n"
end
# is the prev. live pkg in use in any policies?
- policy_warning = ""
+ policy_warning = ''
pkg_id_being_deprecated = D3::Package.basenames_to_live_ids[pkg.basename]
if pkg_id_being_deprecated
outgoing_pkg = D3::Package.new(id: pkg_id_being_deprecated)
- pols_used_by_old_pkg = outgoing_pkg.policy_ids
+ pols_used_by_old_pkg = outgoing_pkg.policy_ids
unless pols_used_by_old_pkg.empty?
- names = pols_used_by_old_pkg.map{|pid| JSS::Policy.map_all_ids_to(:name)[pid]}.join(', ')
+ names = pols_used_by_old_pkg.map { |pid| JSS::Policy.map_all_ids_to(:name)[pid] }.join(', ')
policy_warning = "\n\nWARNING: the current live package is in use by these Casper Policies:\n"
policy_warning += " #{names}\n"
- policy_warning += "You might want to update them to use the new live package."
+ policy_warning += 'You might want to update them to use the new live package.'
end # unless empty
end # if pkg_id_being_deprecated
- confirm "Make #{pkg.edition} live for basename '#{pkg.basename}'#{rollback_warning}#{policy_warning}" , ""
+ confirm "Make #{pkg.edition} live for basename '#{pkg.basename}'#{rollback_warning}#{policy_warning}", ''
pkg.make_live @admin
- puts "Done!"
+ puts 'Done!'
puts "New installs of basename '#{pkg.basename}' will get #{pkg.version}-#{pkg.revision}"
- puts "Existing installs will be updated at the next d3 sync."
+ puts 'Existing installs will be updated at the next d3 sync.'
end
### Edit an existing or importing package
###
### @param pkg[D3::Package, nil] A possibly unsaved D3::Package to edit.
### This is usually used for importing JSS pkgs into d3.
###
### @return [void]
###
- def edit_package (pkg=nil)
-
+ def edit_package(pkg = nil)
unless pkg
pkg_id = get_pkg_from_cli_or_prompt
pkg = pkg_id ? D3::Package.new(id: pkg_id) : nil
end
if pkg.nil?
- puts "No targets given to edit or no matching package found"
+ puts 'No targets given to edit or no matching package found'
return
end
-
if @options.walkthru
changes_to_make = D3::Admin::Edit.loop_thru_editing_walkthru pkg
else
-
- changes_to_make = D3::Admin::Edit.validate_cli_edits (@options)
+ changes_to_make = D3::Admin::Edit.validate_cli_edits(@options)
end # if @options.walkthru
# Confirm the edition is still good if vers or rev changed
changes_to_make = D3::Admin::Edit.check_new_edition pkg, changes_to_make
# Confirm the auto and excl groups don't conflict with each other
D3::Admin::Edit.check_for_new_group_overlaps pkg, changes_to_make
-
# exit if no changes on edit
- if changes_to_make.empty? and not @options.import
- puts "No changes to make!"
- return
+ if changes_to_make.empty? && !@options.import
+ puts 'No changes to make!'
+ return
end
# confirm
if @options.import
confirm_heading = "Import #{pkg.edition}, JSS id #{pkg.id}, into d3"
- conf_deets = "with these non-default settings..."
+ conf_deets = 'with these non-default settings...'
else
confirm_heading = "Make changes to #{pkg.edition}, JSS id #{pkg.id}"
- conf_deets = "Here are the changes..."
+ conf_deets = 'Here are the changes...'
end
D3::Admin::Edit::EDITING_OPTIONS.each do |opt|
next unless changes_to_make.keys.include? opt
new_val = changes_to_make[opt]
@@ -581,54 +561,51 @@
pkg.save if @options.import
# make the changes
D3::Admin::Edit.process_edits pkg, changes_to_make
- puts @options.import ? "Done: the package has been imported to d3." : "Done! Your changes have been saved."
-
+ puts @options.import ? 'Done: the package has been imported to d3.' : 'Done! Your changes have been saved.'
end # edit_pkg
### delete a pkg, optionallay archiving it
###
### @return [void]
###
def delete_package
-
pkg_id = get_pkg_from_cli_or_prompt
if pkg_id.nil?
- puts "No targets given to delete or no matching package found"
+ puts 'No targets given to delete or no matching package found'
return
end
# check to see if the pkg is missing
- if D3::Package.package_data[pkg_id][:status] == :missing || (not JSS::Package.all_ids.include? pkg_id)
+ if D3::Package.package_data[pkg_id][:status] == :missing || (!JSS::Package.all_ids.include? pkg_id)
delete_missing_package pkg_id
return
else
pkg = D3::Package.new id: pkg_id
end
- got_scripts = (not pkg.script_ids.values.empty?)
+ got_scripts = !pkg.script_ids.values.empty?
if got_scripts
if @options.walkthru
- @options.keep_scripts = D3::Admin::Interactive.get_value(:get_keep_scripts, default = 'n', check_method = :validate_yes_no)
+ @options.keep_scripts = D3::Admin::Interactive.get_value(:get_keep_scripts, default = 'n', check_method = :validate_yes_no)
@options.keep_in_jss = D3::Admin::Interactive.get_value(:get_keep_in_jss, default = 'n', check_method = :validate_yes_no)
end # if @options.walkthru
-
if @options.keep_scripts
- deets = " - Keeping pre- or post- scripts in the JSS"
+ deets = ' - Keeping pre- or post- scripts in the JSS'
else
- deets = " - Deleting pre- or post- scripts not used elsewhere"
+ deets = ' - Deleting pre- or post- scripts not used elsewhere'
end # if @options.keep_scripts
else
- deets = " - No pre- or post- scripts to delete"
+ deets = ' - No pre- or post- scripts to delete'
end # if got_scripts
if @options.keep_in_jss
deets += "\n - Leaving the Casper package in the JSS"
else
@@ -636,52 +613,51 @@
end
confirm "DELETE #{pkg.edition}, JSS id #{pkg.id}\nDist.Point Filename: #{pkg.filename}", deets
if @options.keep_scripts && got_scripts
- puts "Scanning for other packages or policies using pre- or post- scripts before deleting..."
+ puts 'Scanning for other packages or policies using pre- or post- scripts before deleting...'
end
script_actions = pkg.delete(
- admin: @admin,
- keep_scripts: @options.keep_scripts,
- keep_in_jss: @options.keep_in_jss,
- rwpw: D3::Admin::Auth.rw_credentials(:dist)[:password]
- )
+ admin: @admin,
+ keep_scripts: @options.keep_scripts,
+ keep_in_jss: @options.keep_in_jss,
+ rwpw: D3::Admin::Auth.rw_credentials(:dist)[:password]
+ )
unless script_actions.empty?
- puts "Here' what happened to the scripts:"
+ puts "Here's what happened to the scripts:"
puts script_actions.join "\n"
end
puts "Done! #{pkg.edition} has been deleted"
-
end # delete package
### Delete a package that's missing from the JSS
###
###
def delete_missing_package (pkgid)
pkg_data = D3::Package.package_data[pkgid]
- 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
+ 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
if script_ids.empty?
- deets = " - No pre- or post- scripts to delete"
+ deets = ' - No pre- or post- scripts to delete'
else
if @options.keep_scripts
- deets = " - Keeping pre- or post- scripts in the JSS"
+ deets = ' - Keeping pre- or post- scripts in the JSS'
else
- deets = " - Deleting pre- or post- scripts not in use elsewhere"
+ deets = ' - Deleting pre- or post- scripts not in use elsewhere'
end # if @options.keep_scripts
end # if script_ids.empty?
confirm "DELETE #{pkg_data[:edition]}\n** Already missing from the JSS **", deets
JSS::DB_CNX.db.query "DELETE FROM #{D3::Database::PACKAGE_TABLE[:table_name]} WHERE package_id = #{pkgid}"
puts "Package #{pkg_data[:edition]} deleted."
- if (not @options.keep_scripts) && (not script_ids.empty?)
- puts "Scanning for other packages or policies using pre- or post- scripts before deleting..."
+ if !@options.keep_scripts && !script_ids.empty?
+ puts 'Scanning for other packages or policies using pre- or post- scripts before deleting...'
policy_scripts = D3.policy_scripts
script_ids.each do |victim_script_id|
next unless JSS::Script.all_ids.include? victim_script_id
victim_script_name = JSS::Script.map_all_ids_to(:name)[victim_script_id]
@@ -691,32 +667,31 @@
puts "Script '#{victim_script_name}' in use by policy '#{pol}'"
pol_users << pol
end
end # policy scripts.each
d3_users = (D3::Package.packages_for_script(victim_script_id) - [pkgid])
- d3_users.each{|pkgid| puts "Script '#{victim_script_name}' in use by d3 edition '#{D3::Package.ids_to_editions[pkgid]}'" }
- if pol_users.empty? and d3_users.empty?
+ d3_users.each { |pid| puts "Script '#{victim_script_name}' in use by d3 edition '#{D3::Package.ids_to_editions[pid]}'" }
+ if pol_users.empty? && d3_users.empty?
JSS::Script.new(id: victim_script_id).delete
puts "Deleted script '#{victim_script_name}'"
end
end # do script id
end # if @options.keep_scripts && (not script_ids.empty?)
+ end # delete_missing_package(pkgid)
- end # delete_missing_package (pkgid)
-
### Get an existing pkg id from the user via prompt (if walkthru) or the
### first thing listed in @targets. We don't instantiate the pkg here
### because it might be :missing in the JSS.
###
### @return [Ingeter, nil] an existing d3 pkg id if one was chosen
###
def get_pkg_from_cli_or_prompt
- if @options.walkthru and @targets.first.nil?
+ if @options.walkthru && @targets.first.nil?
D3::Admin::Interactive.get_value :get_existing_package, nil, :validate_existing_package
else
pkg_data = D3::Package.find_package(@targets.first, :hash)
- return pkg_data ? pkg_data[:id] : nil
+ pkg_data ? pkg_data[:id] : nil
end
end
### Get confirmation before making any changes to a pkg.
###
@@ -727,39 +702,37 @@
### @param action[String] a textual representation of what we're confirming
###
### @param details[String] The details requireing confirmation
###
###
- def confirm (action, details = nil)
-
+ def confirm(action, details = nil)
puts
- puts "*****************************************"
+ puts '*****************************************'
puts "Ahoy there! You are about to:\n#{action}"
- puts "*****************************************"
+ puts '*****************************************'
puts details if details
if @options.auto_confirm
- puts "auto-confirmed! Here we go....."
+ puts 'auto-confirmed! Here we go.....'
else
puts
- reply = Readline.readline("Are you SURE? (y/n): ", false)
+ reply = Readline.readline('Are you SURE? (y/n): ', false)
return true if reply =~ /^y/i
- puts "Cancelled - wise choice!"
+ puts 'Cancelled - wise choice!'
exit 0
end # if autoconfirm
end # confirm
### show details about an existing package
###
### @return [void]
###
def show_package_info
-
pkg_id = get_pkg_from_cli_or_prompt
if pkg_id.nil?
- puts "No targets given or no matching package found"
+ puts 'No targets given or no matching package found'
return
end
pkg = D3::Package.new id: pkg_id
@@ -770,31 +743,30 @@
****************************************
ENDDEETS
pkg_deets += "Basename: #{pkg.basename}\n"
pkg_deets += "Version: #{pkg.version}\n"
pkg_deets += "Revision: #{pkg.revision}\n"
- pkg_deets += "Added to on: #{pkg.added_date.strftime "%Y-%m-%d"}\n"
+ pkg_deets += "Added to on: #{pkg.added_date.strftime '%Y-%m-%d'}\n"
pkg_deets += "Added by: #{pkg.added_by}\n"
if pkg.release_date
- pkg_deets += "Released on: #{pkg.release_date.strftime "%Y-%m-%d"}\n"
+ pkg_deets += "Released on: #{pkg.release_date.strftime '%Y-%m-%d'}\n"
pkg_deets += "Released by: #{pkg.released_by}\n"
end
done = [:basename, :version, :revision, :added_by, :added_date, :released_by, :release_date]
D3::Admin::Edit::EDITING_OPTIONS.each do |opt|
next if done.include? opt
label = D3::Admin::OPTIONS[opt][:label]
if D3::Admin::OPTIONS[opt][:display_conversion]
- val_display = D3::Admin::OPTIONS[opt][:display_conversion].call(pkg.send opt)
+ val_display = D3::Admin::OPTIONS[opt][:display_conversion].call(pkg.send(opt))
else
- val_display = pkg.send opt
+ val_display = pkg.send opt
end
- val_display = val_display.to_s.empty? ? "none" : val_display
+ val_display = val_display.to_s.empty? ? 'none' : val_display
pkg_deets += "#{label}: #{val_display}\n"
end
-
puts pkg_deets
puts
end # show_package_info
### search for and print a list of packages in d3
@@ -804,56 +776,55 @@
def search
D3::Admin::Report.connect_for_reports
if @options.walkthru
# prompt for search type?
- search_for = D3::Admin::Interactive.prompt_for_data(
- desc: "SEARCH PACKAGES BY?\nAre you searching for packages by basename, or by scoped groups?\nEnter 'b' or 'g'",
- prompt: "Basenames or Groups",
- default: 'b',
- required: false
- )
+ search_for = D3::Admin::Interactive.prompt_for_data(
+ desc: "SEARCH PACKAGES BY?\nAre you searching for packages by basename, or by scoped groups?\nEnter 'b' or 'g'",
+ prompt: 'Basenames or Groups',
+ default: 'b',
+ required: false
+ )
@options.search_groups = true if search_for =~ /^g/i
@targets = [D3::Admin::Interactive.get_search_target] if @targets.empty?
@options.status = D3::Admin::Interactive.get_status_for_filter.split(/,\s*/) if @options.status.empty?
- end #if @options.walkthru
+ end # if @options.walkthru
- @options.status = [] if @options.status.include? "all"
+ @options.status = [] if @options.status.include? 'all'
# show all pkgs or group scope
- if @targets.empty? or @targets.include? "all"
+ if @targets.empty? || @targets.include?('all')
if @options.search_groups
D3::Admin::Report.list_all_pkgs_with_scope @options.status
else
D3::Admin::Report.list_packages nil, @options.status
end
return
end
# show specific basenames or group scopes
@targets.each do |search_target|
-
- # groups?
+ # Groups?
if @options.search_groups
- found_groups = JSS::ComputerGroup.all_names.select{|gn| gn =~ /#{search_target}/}
+ found_groups = JSS::ComputerGroup.all_names.select { |gn| gn =~ /#{search_target}/ }
if found_groups.empty?
puts "No computer groups in Casper match '#{search_target}'"
else
- found_groups.each {|fgn|
+ found_groups.each { |fgn|
D3::Admin::Report.list_scoped_installs fgn, @options.status, :auto
D3::Admin::Report.list_scoped_installs fgn, @options.status, :excluded
} # found_groups.each
end # if found_groups.empty?
# basenames
else
- found_basenames = D3::Package.all_basenames.select{|bn| bn =~ /#{search_target}/}
+ found_basenames = D3::Package.all_basenames.select { |bn| bn =~ /#{search_target}/ }
if found_basenames.empty?
puts "No basenames in d3 match '#{search_target}'"
else
- found_basenames.each {|fbn| D3::Admin::Report.list_packages fbn, @options.status }
+ found_basenames.each { |fbn| D3::Admin::Report.list_packages fbn, @options.status }
end # if found_basenames.empty?
end # if @options.search_groups
end # @targets.each do |search_target|
end # def search
@@ -870,17 +841,17 @@
# prompt for target?
if @targets.empty?
one_or_all = D3::Admin::Interactive.prompt_for_data(
desc: "ALL COMPUTERS?\nAre you reporting for a single computer or all computers?\nEnter 'all' for all computers, '1' for one",
- prompt: "All or 1",
+ prompt: 'All or 1',
default: 'all',
required: false
)
# basename report across computers
- if one_or_all == "all"
+ if one_or_all == 'all'
@targets = [(D3::Admin::Interactive.get_value :get_basename, nil, :validate_basename)]
# reporting single computers
else
@options.report_computers = true
@@ -889,38 +860,36 @@
end
end # if targets empty
# prompt for rcpts or puppies
rcpts_or_pups = D3::Admin::Interactive.prompt_for_data(
- desc: "RECEIPTS OR PUPPIES?\nShould the report list receipts or pending puppytime installs?\nEnter 'r' for receipts, 'p' for puppies",
- prompt: "Receipts or puppies",
- required: false,
- default: 'r'
+ desc: "RECEIPTS OR PUPPIES?\nShould the report list receipts or pending puppytime installs?\nEnter 'r' for receipts, 'p' for puppies",
+ prompt: 'Receipts or puppies',
+ required: false,
+ default: 'r'
)
- @options.report_q = rcpts_or_pups =~ /^p/i ? true : false
+ @options.report_q = rcpts_or_pups =~ /^p/i ? true : false
# prompt for status or frozen
@options.status = D3::Admin::Interactive.get_status_for_filter(:with_frozen).split(/,\s*/) if @options.status.empty?
- end #if @options.walkthru
+ end # if @options.walkthru
- @options.status = [] if @options.status.include? "all"
+ @options.status = [] if @options.status.include? 'all'
# pass the --frozen option with the --status options, since
# its treated like a pseudo-status, and thats where walkthru puts it too
- @options.status << "frozen" if @options.report_frozen
+ @options.status << 'frozen' if @options.report_frozen
reporting = @options.report_q ? :puppies : :receipts
-
if @targets.empty?
- puts "No basename or computer name given for report"
+ puts 'No basename or computer name given for report'
return
end
@targets.each do |target|
-
# report puppies
if reporting == :puppies
if @options.report_computers
D3::Admin::Report.report_single_puppy_queue target, @options.status
else
@@ -949,39 +918,34 @@
### set it.
###
### @return [void]
###
def config
-
if @targets.include? 'display'
D3::Admin::Prefs.display_config
else
D3::Admin::Prefs.config @targets, @options
end
end # config
-
end # class App
-
-
-
### save terminal state incase user interrupts during readline or less
if $stdin.tty?
stty_save = `stty -g`.chomp
- trap("SIGINT") do
+ trap('SIGINT') do
puts "\nCancelled! Woot!"
system('stty', stty_save)
exit 0
end
end
begin
app = App.new
app.run
rescue
- puts "An error occurred: #{$!.class}: #{$!}"
- puts $@ if D3::Admin.debug
+ puts "An error occurred: #{$ERROR_INFO.class}: #{$ERROR_INFO}!"
+ puts $ERROR_POSITION if D3::Admin.debug
exit 1
ensure
if D3::Admin::Auth.connected?
# JSS::DistributionPoint.master_distribution_point.unmount if JSS::DistributionPoint.master_distribution_point.mounted?
D3::Admin::Auth.disconnect