Class: ChefConfig::Config

Inherits:
Object
  • Object
show all
Extended by:
Mixlib::Config
Defined in:
lib/chef-config/config.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

._this_fileObject

Path to this file in the current install.



851
852
853
# File 'lib/chef-config/config.rb', line 851

def self._this_file
  File.expand_path(__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_dirObject

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.embedded_dir
  Pathname.new(_this_file).ascend do |path|
    if path.basename.to_s == "embedded"
      return path.to_s
    end
  end

  nil
end

.envObject

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_proxiesObject

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.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

.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_localeObject

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

.inspectObject



44
45
46
# File 'lib/chef-config/config.rb', line 44

def self.inspect
  configuration.inspect
end

.is_valid_url?(uri) ⇒ Boolean

Returns:

  • (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.

Returns:

  • (Boolean)


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_nixObject



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_windowsObject



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_pathObject



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

#userObject

Daemonization Settings ## What user should Chef run as?



258
# File 'lib/chef-config/config.rb', line 258

default :user, nil