Class: ChefConfig::Config
- Inherits:
-
Object
- Object
- ChefConfig::Config
- Extended by:
- Mixlib::Config
- Defined in:
- lib/chef-config/config.rb
Class Method Summary collapse
-
._this_file ⇒ Object
Path to this file in the current install.
- .add_event_logger(logger) ⇒ Object
- .add_formatter(name, file_path = nil) ⇒ Object
- .derive_path_from_chef_repo_path(child_path) ⇒ Object
-
.embedded_dir ⇒ Object
If installed via an omnibus installer, this gives the path to the “embedded” directory which contains all of the software packaged with omnibus.
-
.env ⇒ Object
This provides a hook which rspec can stub so that we can avoid twiddling global state in tests.
- .export_no_proxy(value) ⇒ Object private
-
.export_proxies ⇒ Object
Public method that users should call to export proxies to the appropriate environment variables.
-
.export_proxy(scheme, path, user, pass) ⇒ Object
private
Builds a proxy uri and exports it to the appropriate environment variables.
- .find_chef_repo_path(cwd) ⇒ Object
-
.from_string(string, filename) ⇒ Object
Evaluates the given string as config.
-
.guess_internal_locale ⇒ Object
Chef requires an English-language UTF-8 locale to function properly.
- .inspect ⇒ Object
- .is_valid_url?(uri) ⇒ Boolean
-
.path_accessible?(path) ⇒ Boolean
Returns true only if the path exists and is readable and writeable for the user.
- .platform_specific_path(path) ⇒ Object
- .set_defaults_for_nix ⇒ Object
- .set_defaults_for_windows ⇒ Object
- .windows_home_path ⇒ Object
Instance Method Summary collapse
-
#user ⇒ Object
Daemonization Settings ## What user should Chef run as?.
Class Method Details
._this_file ⇒ Object
Path to this file in the current install.
851 852 853 |
# File 'lib/chef-config/config.rb', line 851 def self._this_file File.(__FILE__) end |
.add_event_logger(logger) ⇒ Object
63 64 65 |
# File 'lib/chef-config/config.rb', line 63 def self.add_event_logger(logger) event_handlers << logger end |
.add_formatter(name, file_path = nil) ⇒ Object
59 60 61 |
# File 'lib/chef-config/config.rb', line 59 def self.add_formatter(name, file_path=nil) formatters << [name, file_path] end |
.derive_path_from_chef_repo_path(child_path) ⇒ Object
137 138 139 140 141 142 143 |
# File 'lib/chef-config/config.rb', line 137 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.uniq.map { |path| PathHelper.join(path, child_path)} end end |
.embedded_dir ⇒ Object
If installed via an omnibus installer, this gives the path to the “embedded” directory which contains all of the software packaged with omnibus. This is used to locate the cacert.pem file on windows.
840 841 842 843 844 845 846 847 848 |
# File 'lib/chef-config/config.rb', line 840 def self. Pathname.new(_this_file).ascend do |path| if path.basename.to_s == "embedded" return path.to_s end end nil end |
.env ⇒ Object
This provides a hook which rspec can stub so that we can avoid twiddling global state in tests.
621 622 623 |
# File 'lib/chef-config/config.rb', line 621 def self.env ENV end |
.export_no_proxy(value) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
769 770 771 772 |
# File 'lib/chef-config/config.rb', line 769 def self.export_no_proxy(value) ENV['no_proxy'] = value unless ENV['no_proxy'] ENV['NO_PROXY'] = value unless ENV['NO_PROXY'] end |
.export_proxies ⇒ Object
Public method that users should call to export proxies to the appropriate environment variables. This method should be called after the config file is parsed and loaded. TODO add some post-file-parsing logic that automatically calls this so users don’t have to
730 731 732 733 734 735 |
# File 'lib/chef-config/config.rb', line 730 def self.export_proxies export_proxy("http", http_proxy, http_proxy_user, http_proxy_pass) if http_proxy export_proxy("https", https_proxy, https_proxy_user, https_proxy_pass) if https_proxy export_proxy("ftp", ftp_proxy, ftp_proxy_user, ftp_proxy_pass) if ftp_proxy export_no_proxy(no_proxy) if no_proxy end |
.export_proxy(scheme, path, user, pass) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Builds a proxy uri and exports it to the appropriate environment variables. Examples:
http://username:password@hostname:port
https://username@hostname:port
ftp://hostname:port
when
scheme = "http", "https", or "ftp"
hostport = hostname:port or scheme://hostname:port
user = username
pass = password
747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 |
# File 'lib/chef-config/config.rb', line 747 def self.export_proxy(scheme, path, user, pass) path = "#{scheme}://#{path}" unless path.include?('://') # URI.split returns the following parts: # [scheme, userinfo, host, port, registry, path, opaque, query, fragment] parts = URI.split(URI.encode(path)) # URI::Generic.build requires an integer for the port, but URI::split gives # returns a string for the port. parts[3] = parts[3].to_i if parts[3] if user && !user.empty? userinfo = URI.encode(URI.encode(user), '@:') if pass userinfo << ":#{URI.encode(URI.encode(pass), '@:')}" end parts[1] = userinfo end path = URI::Generic.build(parts).to_s ENV["#{scheme}_proxy".downcase] = path unless ENV["#{scheme}_proxy".downcase] ENV["#{scheme}_proxy".upcase] = path unless ENV["#{scheme}_proxy".upcase] end |
.find_chef_repo_path(cwd) ⇒ Object
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
# File 'lib/chef-config/config.rb', line 121 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.('..', 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 |
.from_string(string, filename) ⇒ Object
Evaluates the given string as config.
filename is used for context in stacktraces, but doesn’t need to be the name of an actual file.
40 41 42 |
# File 'lib/chef-config/config.rb', line 40 def self.from_string(string, filename) self.instance_eval(string, filename, 1) end |
.guess_internal_locale ⇒ Object
Chef requires an English-language UTF-8 locale to function properly. We attempt to use the ‘locale -a’ command and search through a list of preferences until we find one that we can use. On Ubuntu systems we should find ‘C.UTF-8’ and be able to use that even if there is no English locale on the server, but Mac, Solaris, AIX, etc do not have that locale. We then try to find an English locale and fall back to ‘C’ if we do not. The choice of fallback is pick-your-poison. If we try to do the work to return a non-US UTF-8 locale then we fail inside of providers when things like ‘svn info’ return Japanese and we can’t parse them. OTOH, if we pick ‘C’ then we will blow up on UTF-8 characters. Between the warn we throw and the Encoding exception that ruby will throw it is more obvious what is broken if we drop UTF-8 by default rather than drop English.
If there is no ‘locale -a’ then we return ‘en_US.UTF-8’ since that is the most commonly available English UTF-8 locale. However, all modern POSIXen should support ‘locale -a’.
788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 |
# File 'lib/chef-config/config.rb', line 788 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 |
.inspect ⇒ Object
44 45 46 |
# File 'lib/chef-config/config.rb', line 44 def self.inspect configuration.inspect end |
.is_valid_url?(uri) ⇒ Boolean
80 81 82 83 |
# File 'lib/chef-config/config.rb', line 80 def self.is_valid_url? uri url = uri.to_s.strip /^http:\/\// =~ url || /^https:\/\// =~ url || /^chefzero:/ =~ url end |
.path_accessible?(path) ⇒ Boolean
Returns true only if the path exists and is readable and writeable for the user.
236 237 238 |
# File 'lib/chef-config/config.rb', line 236 def self.path_accessible?(path) File.exists?(path) && File.readable?(path) && File.writable?(path) end |
.platform_specific_path(path) ⇒ Object
48 49 50 51 52 53 54 55 56 57 |
# File 'lib/chef-config/config.rb', line 48 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 |
.set_defaults_for_nix ⇒ Object
599 600 601 602 603 604 605 606 607 608 609 |
# File 'lib/chef-config/config.rb', line 599 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 |
.set_defaults_for_windows ⇒ Object
588 589 590 591 592 593 594 595 596 597 |
# File 'lib/chef-config/config.rb', line 588 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 |
.windows_home_path ⇒ Object
625 626 627 628 |
# File 'lib/chef-config/config.rb', line 625 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 |
Instance Method Details
#user ⇒ Object
Daemonization Settings ## What user should Chef run as?
258 |
# File 'lib/chef-config/config.rb', line 258 default :user, nil |