lib/chef/application/knife.rb in knife-17.10.95 vs lib/chef/application/knife.rb in knife-17.10.163

- old
+ new

@@ -1,234 +1,234 @@ -# -# Author:: Adam Jacob (<adam@chef.io) -# Copyright:: Copyright (c) Chef Software Inc. -# License:: Apache License, Version 2.0 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require "chef/application" -require_relative "../knife" -require "mixlib/log" -require "ohai/config" -module Net - autoload :HTTP, "net/http" -end -require "chef-utils/dist" unless defined?(ChefUtils::Dist) - -class Chef::Application::Knife < Chef::Application - - NO_COMMAND_GIVEN = "You need to pass a sub-command (e.g., knife SUB-COMMAND)\n".freeze - - banner "Usage: knife sub-command (options)" - - option :config_file, - short: "-c CONFIG", - long: "--config CONFIG", - description: "The configuration file to use.", - proc: lambda { |path| File.expand_path(path, Dir.pwd) } - - option :config_option, - long: "--config-option OPTION=VALUE", - description: "Override a single configuration option.", - proc: lambda { |option, existing| - (existing ||= []) << option - existing - } - - verbosity_level = 0 - option :verbosity, - short: "-V", - long: "--verbose", - description: "More verbose output. Use twice (-VV) for additional verbosity and three times (-VVV) for maximum verbosity.", - proc: Proc.new { verbosity_level += 1 }, - default: 0 - - option :color, - long: "--[no-]color", - boolean: true, - default: true, - description: "Use colored output, defaults to enabled." - - option :environment, - short: "-E ENVIRONMENT", - long: "--environment ENVIRONMENT", - description: "Set the #{ChefUtils::Dist::Infra::PRODUCT} environment (except for in searches, where this will be flagrantly ignored)." - - option :editor, - short: "-e EDITOR", - long: "--editor EDITOR", - description: "Set the editor to use for interactive commands.", - default: ENV["EDITOR"] - - option :disable_editing, - short: "-d", - long: "--disable-editing", - description: "Do not open EDITOR, just accept the data as is.", - boolean: true, - default: false - - option :help, - short: "-h", - long: "--help", - description: "Show this help message.", - on: :tail, - boolean: true - - option :node_name, - short: "-u USER", - long: "--user USER", - description: "#{ChefUtils::Dist::Server::PRODUCT} API client username." - - option :client_key, - short: "-k KEY", - long: "--key KEY", - description: "#{ChefUtils::Dist::Server::PRODUCT} API client key.", - proc: lambda { |path| File.expand_path(path, Dir.pwd) } - - option :chef_server_url, - short: "-s URL", - long: "--server-url URL", - description: "#{ChefUtils::Dist::Server::PRODUCT} URL." - - option :yes, - short: "-y", - long: "--yes", - description: "Say yes to all prompts for confirmation." - - option :defaults, - long: "--defaults", - description: "Accept default values for all questions." - - option :print_after, - long: "--print-after", - description: "Show the data after a destructive operation." - - option :format, - short: "-F FORMAT", - long: "--format FORMAT", - description: "Which format to use for output.", - in: %w{summary text json yaml pp}, - default: "summary" - - option :local_mode, - short: "-z", - long: "--local-mode", - description: "Point knife commands at local repository instead of #{ChefUtils::Dist::Server::PRODUCT}.", - boolean: true - - option :chef_zero_host, - long: "--chef-zero-host HOST", - description: "Host to start #{ChefUtils::Dist::Zero::PRODUCT} on." - - option :chef_zero_port, - long: "--chef-zero-port PORT", - description: "Port (or port range) to start #{ChefUtils::Dist::Zero::PRODUCT} on. Port ranges like 1000,1010 or 8889-9999 will try all given ports until one works." - - option :listen, - long: "--[no-]listen", - description: "Whether a local mode (-z) server binds to a port.", - boolean: false - - option :version, - short: "-v", - long: "--version", - description: "Show #{ChefUtils::Dist::Infra::PRODUCT} version.", - boolean: true, - proc: lambda { |v| puts "#{ChefUtils::Dist::Infra::PRODUCT}: #{::Chef::VERSION}" }, - exit: 0 - - option :fips, - long: "--[no-]fips", - description: "Enable FIPS mode.", - boolean: true, - default: nil - - option :profile, - long: "--profile PROFILE", - description: "The credentials profile to select." - - # Run knife - def run - ChefConfig::PathHelper.per_tool_home_environment = "KNIFE_HOME" - Mixlib::Log::Formatter.show_time = false - validate_and_parse_options - quiet_traps - Chef::Knife.run(ARGV, options) - exit 0 - end - - private - - def quiet_traps - trap("TERM") do - exit 1 - end - - trap("INT") do - exit 2 - end - end - - def validate_and_parse_options - # Checking ARGV validity *before* parse_options because parse_options - # mangles ARGV in some situations - if no_command_given? - print_help_and_exit(1, NO_COMMAND_GIVEN) - elsif no_subcommand_given? - if want_help? || want_version? - print_help_and_exit(0) - else - print_help_and_exit(2, NO_COMMAND_GIVEN) - end - end - end - - def no_subcommand_given? - ARGV[0] =~ /^-/ - end - - def no_command_given? - ARGV.empty? - end - - def want_help? - ARGV[0] =~ /^(--help|-h)$/ - end - - def want_version? - ARGV[0] =~ /^(--version|-v)$/ - end - - def print_help_and_exit(exitcode = 1, fatal_message = nil) - Chef::Log.error(fatal_message) if fatal_message - - begin - parse_options - rescue OptionParser::InvalidOption => e - puts "#{e}\n" - end - - if want_help? - puts "#{ChefUtils::Dist::Infra::PRODUCT}: #{Chef::VERSION}" - puts - puts "Docs: #{ChefUtils::Dist::Org::KNIFE_DOCS}" - puts "Patents: #{ChefUtils::Dist::Org::PATENTS}" - puts - end - - puts opt_parser - puts - Chef::Knife.list_commands - exit exitcode - end - -end +# +# Author:: Adam Jacob (<adam@chef.io) +# Copyright:: Copyright (c) Chef Software Inc. +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +require "chef/application" +require_relative "../knife" +require "mixlib/log" +require "ohai/config" +module Net + autoload :HTTP, "net/http" +end +require "chef-utils/dist" unless defined?(ChefUtils::Dist) + +class Chef::Application::Knife < Chef::Application + + NO_COMMAND_GIVEN = "You need to pass a sub-command (e.g., knife SUB-COMMAND)\n".freeze + + banner "Usage: knife sub-command (options)" + + option :config_file, + short: "-c CONFIG", + long: "--config CONFIG", + description: "The configuration file to use.", + proc: lambda { |path| File.expand_path(path, Dir.pwd) } + + option :config_option, + long: "--config-option OPTION=VALUE", + description: "Override a single configuration option.", + proc: lambda { |option, existing| + (existing ||= []) << option + existing + } + + verbosity_level = 0 + option :verbosity, + short: "-V", + long: "--verbose", + description: "More verbose output. Use twice (-VV) for additional verbosity and three times (-VVV) for maximum verbosity.", + proc: Proc.new { verbosity_level += 1 }, + default: 0 + + option :color, + long: "--[no-]color", + boolean: true, + default: true, + description: "Use colored output, defaults to enabled." + + option :environment, + short: "-E ENVIRONMENT", + long: "--environment ENVIRONMENT", + description: "Set the #{ChefUtils::Dist::Infra::PRODUCT} environment (except for in searches, where this will be flagrantly ignored)." + + option :editor, + short: "-e EDITOR", + long: "--editor EDITOR", + description: "Set the editor to use for interactive commands.", + default: ENV["EDITOR"] + + option :disable_editing, + short: "-d", + long: "--disable-editing", + description: "Do not open EDITOR, just accept the data as is.", + boolean: true, + default: false + + option :help, + short: "-h", + long: "--help", + description: "Show this help message.", + on: :tail, + boolean: true + + option :node_name, + short: "-u USER", + long: "--user USER", + description: "#{ChefUtils::Dist::Server::PRODUCT} API client username." + + option :client_key, + short: "-k KEY", + long: "--key KEY", + description: "#{ChefUtils::Dist::Server::PRODUCT} API client key.", + proc: lambda { |path| File.expand_path(path, Dir.pwd) } + + option :chef_server_url, + short: "-s URL", + long: "--server-url URL", + description: "#{ChefUtils::Dist::Server::PRODUCT} URL." + + option :yes, + short: "-y", + long: "--yes", + description: "Say yes to all prompts for confirmation." + + option :defaults, + long: "--defaults", + description: "Accept default values for all questions." + + option :print_after, + long: "--print-after", + description: "Show the data after a destructive operation." + + option :format, + short: "-F FORMAT", + long: "--format FORMAT", + description: "Which format to use for output.", + in: %w{summary text json yaml pp}, + default: "summary" + + option :local_mode, + short: "-z", + long: "--local-mode", + description: "Point knife commands at local repository instead of #{ChefUtils::Dist::Server::PRODUCT}.", + boolean: true + + option :chef_zero_host, + long: "--chef-zero-host HOST", + description: "Host to start #{ChefUtils::Dist::Zero::PRODUCT} on." + + option :chef_zero_port, + long: "--chef-zero-port PORT", + description: "Port (or port range) to start #{ChefUtils::Dist::Zero::PRODUCT} on. Port ranges like 1000,1010 or 8889-9999 will try all given ports until one works." + + option :listen, + long: "--[no-]listen", + description: "Whether a local mode (-z) server binds to a port.", + boolean: false + + option :version, + short: "-v", + long: "--version", + description: "Show #{ChefUtils::Dist::Infra::PRODUCT} version.", + boolean: true, + proc: lambda { |v| puts "#{ChefUtils::Dist::Infra::PRODUCT}: #{::Chef::VERSION}" }, + exit: 0 + + option :fips, + long: "--[no-]fips", + description: "Enable FIPS mode.", + boolean: true, + default: nil + + option :profile, + long: "--profile PROFILE", + description: "The credentials profile to select." + + # Run knife + def run + ChefConfig::PathHelper.per_tool_home_environment = "KNIFE_HOME" + Mixlib::Log::Formatter.show_time = false + validate_and_parse_options + quiet_traps + Chef::Knife.run(ARGV, options) + exit 0 + end + + private + + def quiet_traps + trap("TERM") do + exit 1 + end + + trap("INT") do + exit 2 + end + end + + def validate_and_parse_options + # Checking ARGV validity *before* parse_options because parse_options + # mangles ARGV in some situations + if no_command_given? + print_help_and_exit(1, NO_COMMAND_GIVEN) + elsif no_subcommand_given? + if want_help? || want_version? + print_help_and_exit(0) + else + print_help_and_exit(2, NO_COMMAND_GIVEN) + end + end + end + + def no_subcommand_given? + ARGV[0] =~ /^-/ + end + + def no_command_given? + ARGV.empty? + end + + def want_help? + ARGV[0] =~ /^(--help|-h)$/ + end + + def want_version? + ARGV[0] =~ /^(--version|-v)$/ + end + + def print_help_and_exit(exitcode = 1, fatal_message = nil) + Chef::Log.error(fatal_message) if fatal_message + + begin + parse_options + rescue OptionParser::InvalidOption => e + puts "#{e}\n" + end + + if want_help? + puts "#{ChefUtils::Dist::Infra::PRODUCT}: #{Chef::VERSION}" + puts + puts "Docs: #{ChefUtils::Dist::Org::KNIFE_DOCS}" + puts "Patents: #{ChefUtils::Dist::Org::PATENTS}" + puts + end + + puts opt_parser + puts + Chef::Knife.list_commands + exit exitcode + end + +end