Class: Chef::Config

Inherits:
Object show all
Extended by:
Mixin::ShellOut, Mixlib::Config
Defined in:
lib/chef/config.rb

Constant Summary collapse

PathHelper =
Chef::Util::PathHelper

Constants included from Mixin::ShellOut

Mixin::ShellOut::DEPRECATED_OPTIONS

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Mixin::ShellOut

run_command_compatible_options, shell_out, shell_out!, shell_out_with_systems_locale, shell_out_with_systems_locale!

Class Method Details

._this_fileObject

Path to this file in the current install.



689
690
691
# File 'lib/chef/config.rb', line 689

def self._this_file
  File.expand_path(__FILE__)
end

.add_event_logger(logger) ⇒ Object



81
82
83
# File 'lib/chef/config.rb', line 81

def self.add_event_logger(logger)
  event_handlers << logger
end

.add_formatter(name, file_path = nil) ⇒ Object



77
78
79
# File 'lib/chef/config.rb', line 77

def self.add_formatter(name, file_path=nil)
  formatters << [name, file_path]
end

.derive_path_from_chef_repo_path(child_path) ⇒ Object



146
147
148
149
150
151
152
# File 'lib/chef/config.rb', line 146

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

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



678
679
680
681
682
683
684
685
686
# File 'lib/chef/config.rb', line 678

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.



543
544
545
# File 'lib/chef/config.rb', line 543

def self.env
  ENV
end

.find_chef_repo_path(cwd) ⇒ Object



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/chef/config.rb', line 130

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
      Chef::Log.warn("No cookbooks directory found at or above current directory.  Assuming #{Dir.pwd}.")
      return Dir.pwd
    end
    path = new_path
  end
  Chef::Log.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.



41
42
43
# File 'lib/chef/config.rb', line 41

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



628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
# File 'lib/chef/config.rb', line 628

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.
  locales = shell_out_with_systems_locale!("locale -a").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
      Chef::Log.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 Chef::Platform.windows?
    Chef::Log.debug "Defaulting to locale en_US.UTF-8 on Windows, until it matters that we do something else."
  else
    Chef::Log.debug "No usable locale -a command found, assuming you have en_US.UTF-8 installed."
  end
  'en_US.UTF-8'
end

.inspectObject



62
63
64
# File 'lib/chef/config.rb', line 62

def self.inspect
  configuration.inspect
end

.manage_secret_keyObject

Manages the chef secret session key

Returns

<newkey>

A new or retrieved session key



49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/chef/config.rb', line 49

def self.manage_secret_key
  newkey = nil
  if Chef::FileCache.has_key?("chef_server_cookie_id")
    newkey = Chef::FileCache.load("chef_server_cookie_id")
  else
    chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
    newkey = ""
    40.times { |i| newkey << chars[rand(chars.size-1)] }
    Chef::FileCache.store("chef_server_cookie_id", newkey)
  end
  newkey
end

.path_accessible?(path) ⇒ Boolean

Returns true only if the path exists and is readable and writeable for the user.

Returns:

  • (Boolean)


241
242
243
# File 'lib/chef/config.rb', line 241

def self.path_accessible?(path)
  File.exists?(path) && File.readable?(path) && File.writable?(path)
end

.platform_specific_path(path) ⇒ Object



66
67
68
69
70
71
72
73
74
75
# File 'lib/chef/config.rb', line 66

def self.platform_specific_path(path)
  path = PathHelper.cleanpath(path)
  if Chef::Platform.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



521
522
523
524
525
526
527
528
529
530
531
# File 'lib/chef/config.rb', line 521

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



510
511
512
513
514
515
516
517
518
519
# File 'lib/chef/config.rb', line 510

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



547
548
549
# File 'lib/chef/config.rb', line 547

def self.windows_home_path
  env['SYSTEMDRIVE'] + env['HOMEPATH'] if env['SYSTEMDRIVE'] && env['HOMEPATH']
end

Instance Method Details

#userObject

Daemonization Settings ## What user should Chef run as?



263
# File 'lib/chef/config.rb', line 263

default :user, nil