Class: Chef::Application
- Includes:
- Mixlib::CLI
- Defined in:
- lib/chef/application.rb,
lib/chef/application/windows_service.rb
Defined Under Namespace
Classes: Client, Knife, Solo, Wakeup, WindowsService
Class Method Summary collapse
- .debug_stacktrace(e) ⇒ Object
- .exit!(msg, err = -1)) ⇒ Object
-
.fatal!(msg, err = -1)) ⇒ Object
Log a fatal error message to both STDERR and the Logger, exit the application.
Instance Method Summary collapse
-
#configure_chef ⇒ Object
Parse the configuration file.
-
#configure_logging ⇒ Object
Initialize and configure the logger.
-
#initialize ⇒ Application
constructor
A new instance of Application.
-
#reconfigure ⇒ Object
Reconfigure the application.
-
#run ⇒ Object
Get this party started.
-
#run_application ⇒ Object
Actually run the application.
-
#run_chef_client ⇒ Object
Initializes Chef::Client instance and runs it.
-
#setup_application ⇒ Object
Called prior to starting the application, by the run method.
Constructor Details
#initialize ⇒ Application
Returns a new instance of Application.
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/chef/application.rb', line 34 def initialize super @chef_client = nil @chef_client_json = nil trap("TERM") do Chef::Application.fatal!("SIGTERM received, stopping", 1) end trap("INT") do Chef::Application.fatal!("SIGINT received, stopping", 2) end unless Chef::Platform.windows? trap("QUIT") do Chef::Log.info("SIGQUIT received, call stack:\n " + caller.join("\n ")) end trap("HUP") do Chef::Log.info("SIGHUP received, reconfiguring") reconfigure end end # Always switch to a readable directory. Keeps subsequent Dir.chdir() {} # from failing due to permissions when launched as a less privileged user. end |
Class Method Details
.debug_stacktrace(e) ⇒ Object
152 153 154 155 156 157 158 159 160 161 |
# File 'lib/chef/application.rb', line 152 def debug_stacktrace(e) = "#{e.class}: #{e}\n#{e.backtrace.join("\n")}" chef_stacktrace_out = "Generated at #{Time.now.to_s}\n" chef_stacktrace_out += Chef::FileCache.store("chef-stacktrace.out", chef_stacktrace_out) Chef::Log.fatal("Stacktrace dumped to #{Chef::FileCache.load("chef-stacktrace.out", false)}") Chef::Log.debug() true end |
.exit!(msg, err = -1)) ⇒ Object
169 170 171 172 |
# File 'lib/chef/application.rb', line 169 def exit!(msg, err = -1) Chef::Log.debug(msg) Process.exit err end |
.fatal!(msg, err = -1)) ⇒ Object
Log a fatal error message to both STDERR and the Logger, exit the application
164 165 166 167 |
# File 'lib/chef/application.rb', line 164 def fatal!(msg, err = -1) Chef::Log.fatal(msg) Process.exit err end |
Instance Method Details
#configure_chef ⇒ Object
Parse the configuration file
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
# File 'lib/chef/application.rb', line 76 def configure_chef begin case config[:config_file] when /^(http|https):\/\// Chef::REST.new("", nil, nil).fetch(config[:config_file]) { |f| apply_config(f.path) } else ::File::open(config[:config_file]) { |f| apply_config(f.path) } end rescue Errno::ENOENT => error Chef::Log.warn("*****************************************") Chef::Log.warn("Did not find config file: #{config[:config_file]}, using command line options.") Chef::Log.warn("*****************************************") Chef::Config.merge!(config) rescue SocketError => error Chef::Application.fatal!("Error getting config file #{Chef::Config[:config_file]}", 2) rescue Chef::Exceptions::ConfigurationError => error Chef::Application.fatal!("Error processing config file #{Chef::Config[:config_file]} with error #{error.message}", 2) rescue Exception => error Chef::Application.fatal!("Unknown error processing config file #{Chef::Config[:config_file]} with error #{error.message}", 2) end end |
#configure_logging ⇒ Object
Initialize and configure the logger. If the configured log location is not STDOUT, but stdout is a TTY and we’re not daemonizing, we set up a secondary logger with output to stdout. This way, we magically do the right thing when the user has configured logging to a file but they’re running chef in the shell to debug something.
If the user has configured a formatter, then we skip the magical logger to keep the output pretty.
110 111 112 113 114 115 116 117 118 119 120 |
# File 'lib/chef/application.rb', line 110 def configure_logging require 'pp' Chef::Log.init(Chef::Config[:log_location]) if ( Chef::Config[:log_location] != STDOUT ) && STDOUT.tty? && (!Chef::Config[:daemonize]) && (Chef::Config.formatter == "null") stdout_logger = Logger.new(STDOUT) STDOUT.sync = true stdout_logger.formatter = Chef::Log.logger.formatter Chef::Log.loggers << stdout_logger end Chef::Log.level = Chef::Config[:log_level] end |
#reconfigure ⇒ Object
Reconfigure the application. You’ll want to override and super this method.
63 64 65 66 |
# File 'lib/chef/application.rb', line 63 def reconfigure configure_chef configure_logging end |
#run ⇒ Object
Get this party started
69 70 71 72 73 |
# File 'lib/chef/application.rb', line 69 def run reconfigure setup_application run_application end |
#run_application ⇒ Object
Actually run the application
128 129 130 |
# File 'lib/chef/application.rb', line 128 def run_application raise Chef::Exceptions::Application, "#{self.to_s}: you must override run_application" end |
#run_chef_client ⇒ Object
Initializes Chef::Client instance and runs it
133 134 135 136 137 138 139 140 141 142 |
# File 'lib/chef/application.rb', line 133 def run_chef_client @chef_client = Chef::Client.new( @chef_client_json, :override_runlist => config[:override_runlist] ) @chef_client_json = nil @chef_client.run @chef_client = nil end |
#setup_application ⇒ Object
Called prior to starting the application, by the run method
123 124 125 |
# File 'lib/chef/application.rb', line 123 def setup_application raise Chef::Exceptions::Application, "#{self.to_s}: you must override setup_application" end |