class ChefConfig::Config
def self._this_file
def self._this_file File.expand_path(__FILE__) end
def self.add_event_logger(logger)
def self.add_event_logger(logger) event_handlers << logger end
def self.add_formatter(name, file_path=nil)
def self.add_formatter(name, file_path=nil) formatters << [name, file_path] end
def self.derive_path_from_chef_repo_path(child_path)
def self.derive_path_from_chef_repo_path(child_path) if chef_repo_path.kind_of?(String) PathHelper.join(chef_repo_path, child_path) else chef_repo_path.map { |path| PathHelper.join(path, child_path)} end end
def self.embedded_dir
"embedded" directory which contains all of the software packaged with
If installed via an omnibus installer, this gives the path to the
def self.embedded_dir Pathname.new(_this_file).ascend do |path| if path.basename.to_s == "embedded" return path.to_s end end nil end
def self.env
This provides a hook which rspec can stub so that we can avoid twiddling
def self.env ENV end
def self.find_chef_repo_path(cwd)
def self.find_chef_repo_path(cwd) # In local mode, we auto-discover the repo root by looking for a path with "cookbooks" under it. # This allows us to run config-free. path = cwd until File.directory?(PathHelper.join(path, "cookbooks")) new_path = File.expand_path('..', path) if new_path == path ChefConfig.logger.warn("No cookbooks directory found at or above current directory. Assuming #{Dir.pwd}.") return Dir.pwd end path = new_path end ChefConfig.logger.info("Auto-discovered chef repository at #{path}") path end
def self.from_string(string, filename)
Evaluates the given string as config.
def self.from_string(string, filename) self.instance_eval(string, filename, 1) end
def self.guess_internal_locale
If there is no 'locale -a' then we return 'en_US.UTF-8' since that is the most commonly
default rather than drop English.
exception that ruby will throw it is more obvious what is broken if we drop UTF-8 by
we will blow up on UTF-8 characters. Between the warn we throw and the Encoding
things like 'svn info' return Japanese and we can't parse them. OTOH, if we pick 'C' then
to do the work to return a non-US UTF-8 locale then we fail inside of providers when
back to 'C' if we do not. The choice of fallback is pick-your-poison. If we try
AIX, etc do not have that locale. We then try to find an English locale and fall
able to use that even if there is no English locale on the server, but Mac, Solaris,
find one that we can use. On Ubuntu systems we should find 'C.UTF-8' and be
to use the 'locale -a' command and search through a list of preferences until we
Chef requires an English-language UTF-8 locale to function properly. We attempt
def self.guess_internal_locale # https://github.com/opscode/chef/issues/2181 # Some systems have the `locale -a` command, but the result has # invalid characters for the default encoding. # # For example, on CentOS 6 with ENV['LANG'] = "en_US.UTF-8", # `locale -a`.split fails with ArgumentError invalid UTF-8 encoding. cmd = Mixlib::ShellOut.new("locale -a").run_command cmd.error! locales = cmd.stdout.split case when locales.include?('C.UTF-8') 'C.UTF-8' when locales.include?('en_US.UTF-8'), locales.include?('en_US.utf8') 'en_US.UTF-8' when locales.include?('en.UTF-8') 'en.UTF-8' else # Will match en_ZZ.UTF-8, en_ZZ.utf-8, en_ZZ.UTF8, en_ZZ.utf8 guesses = locales.select { |l| l =~ /^en_.*UTF-?8$/i } unless guesses.empty? guessed_locale = guesses.first # Transform into the form en_ZZ.UTF-8 guessed_locale.gsub(/UTF-?8$/i, "UTF-8") else ChefConfig.logger.warn "Please install an English UTF-8 locale for Chef to use, falling back to C locale and disabling UTF-8 support." 'C' end end rescue if ChefConfig.windows? ChefConfig.logger.debug "Defaulting to locale en_US.UTF-8 on Windows, until it matters that we do something else." else ChefConfig.logger.debug "No usable locale -a command found, assuming you have en_US.UTF-8 installed." end 'en_US.UTF-8' end
def self.inspect
def self.inspect configuration.inspect end
def self.path_accessible?(path)
def self.path_accessible?(path) File.exists?(path) && File.readable?(path) && File.writable?(path) end
def self.platform_specific_path(path)
def self.platform_specific_path(path) path = PathHelper.cleanpath(path) if ChefConfig.windows? # turns \etc\chef\client.rb and \var\chef\client.rb into C:/chef/client.rb if env['SYSTEMDRIVE'] && path[0] == '\\' && path.split('\\')[2] == 'chef' path = PathHelper.join(env['SYSTEMDRIVE'], path.split('\\', 3)[2]) end end path end
def self.set_defaults_for_nix
def self.set_defaults_for_nix # Those lists of regular expressions define what chef considers a # valid user and group name # # user/group cannot start with '-', '+' or '~' # user/group cannot contain ':', ',' or non-space-whitespace or null byte # everything else is allowed (UTF-8, spaces, etc) and we delegate to your O/S useradd program to barf or not # copies: http://anonscm.debian.org/viewvc/pkg-shadow/debian/trunk/debian/patches/506_relaxed_usernames?view=markup default :user_valid_regex, [ /^[^-+~:,\t\r\n\f\0]+[^:,\t\r\n\f\0]*$/ ] default :group_valid_regex, [ /^[^-+~:,\t\r\n\f\0]+[^:,\t\r\n\f\0]*$/ ] end
def self.set_defaults_for_windows
def self.set_defaults_for_windows # Those lists of regular expressions define what chef considers a # valid user and group name # From http://technet.microsoft.com/en-us/library/cc776019(WS.10).aspx principal_valid_regex_part = '[^"\/\\\\\[\]\:;|=,+*?<>]+' default :user_valid_regex, [ /^(#{principal_valid_regex_part}\\)?#{principal_valid_regex_part}$/ ] default :group_valid_regex, [ /^(#{principal_valid_regex_part}\\)?#{principal_valid_regex_part}$/ ] default :fatal_windows_admin_check, false end
def self.windows_home_path
def self.windows_home_path ChefConfig.logger.deprecation("Chef::Config.windows_home_path is now deprecated. Consider using Chef::Util::PathHelper.home instead.") PathHelper.home end