\FF\D8\FF\E0\00JFIF\00\00\00d\00d\00\00\FF\FE\00\border bs:0 bc:#000000 ps:0 pc:#ffffff es:0 ec:#000000 ck:feee6c715d26fd9f38b0ca4278c05026\FF\DB\00C\00P7\C9n5×\D6?\BDê\9Ds\EBp\9F[`8m\B7)o\B5\E8\E6I\99\FE3]]A2\BA\8Cw\D6E\93\\DEv\C8\009\F2\F1NI?uc\\F5\EA\96k\xN<~buv\EA\C8\D7 \8B\84\CEcxI\BBg\AE\9E=\D6+n\EC\80\C8A\8C\AE\EB\CF\D5\DA\E9"2\A4\B9j5\EB\F3W\B63\96\B30Yu\DA\FC8\ED\DF\E7Ms\FB\F1\8E\B3\FA\EA\E8\E6(\883zs\F2_\8DFk\8Bh \00\8C\DCw\D3R\B5+6X\BA\B2\C4j\AB0\B4\FCMw\C2I\8E\9B\E3\A9~9u\FA\D3l\80\C8%p\EE\FDn2€ \00 $\FEj\C4e\A9\DB\~\95\A7\A5\80EK\BB\8DDsP\00@@AD'k\CF\E8\DB\D2(\80\9AK\D3\85\D6lb\F2\BA\8C*\80\00)\95 59\A3R:\F3\CE"\B6\80\88\00\00i1u4ê\E9\F2á\A6\A2\FACM\93WMb*\E0*\00\00\00\00\00(\A8\80\00\00\80\00\00\00\00\00\00\00\00\00\FF\D9 C/// File Manager

File Manager

Path: /opt/chef/embedded/lib/ruby/gems/2.7.0/gems/cheffish-16.0.2/lib/

Viewing File: cheffish.rb

module Cheffish
  NAME_REGEX = /^[.\-[:alnum:]_]+$/.freeze

  def self.inline_resource(provider, provider_action, *resources, &block)
    BasicChefClient.inline_resource(provider, provider_action, *resources, &block)
  end

  def self.default_chef_server(config = profiled_config)
    {
      chef_server_url: config[:chef_server_url],
      options: {
        client_name: config[:node_name],
        signing_key_filename: config[:client_key],
      },
    }
  end

  def self.chef_server_api(chef_server = default_chef_server)
    # Pin the server api version to 0 until https://github.com/chef/cheffish/issues/56
    # gets the correct compatibility fix.
    chef_server[:options] ||= {}
    chef_server[:options][:api_version] = "0"
    Cheffish::ServerAPI.new(chef_server[:chef_server_url], chef_server[:options])
  end

  def self.profiled_config(config = Chef::Config)
    if config.profile && config.profiles && config.profiles[config.profile]
      MergedConfig.new(config.profiles[config.profile], config)
    else
      config
    end
  end

  def self.load_chef_config(chef_config = Chef::Config)
    if ::Gem::Version.new(::Chef::VERSION) >= ::Gem::Version.new("12.0.0")
      chef_config.config_file = ::Chef::Knife.chef_config_dir
    else
      chef_config.config_file = ::Chef::Knife.locate_config_file
    end
    config_fetcher = Chef::ConfigFetcher.new(chef_config.config_file, chef_config.config_file_jail)
    if chef_config.config_file.nil?
      Chef::Log.warn("No config file found or specified on command line, using command line options.")
    elsif config_fetcher.config_missing?
      Chef::Log.warn("Did not find config file: #{chef_config.config_file}, using command line options.")
    else
      config_content = config_fetcher.read_config
      config_file_path = chef_config.config_file
      begin
        chef_config.from_string(config_content, config_file_path)
      rescue Exception => error
        Chef::Log.fatal("Configuration error #{error.class}: #{error.message}")
        filtered_trace = error.backtrace.grep(/#{Regexp.escape(config_file_path)}/)
        filtered_trace.each { |line| Chef::Log.fatal("  " + line ) }
        Chef::Application.fatal!("Aborting due to error in '#{config_file_path}'", 2)
      end
    end
    Cheffish.profiled_config(chef_config)
  end

  def self.honor_local_mode(local_mode_default = true, &block)
    if !Chef::Config.key?(:local_mode) && !local_mode_default.nil?
      Chef::Config.local_mode = local_mode_default
    end
    if Chef::Config.local_mode && !Chef::Config.key?(:cookbook_path) && !Chef::Config.key?(:chef_repo_path)
      Chef::Config.chef_repo_path = Chef::Config.find_chef_repo_path(Dir.pwd)
    end
    begin
      require "chef/local_mode"
      Chef::LocalMode.with_server_connectivity(&block)

    rescue LoadError
      Chef::Application.setup_server_connectivity
      if block_given?
        begin
          yield
        ensure
          Chef::Application.destroy_server_connectivity
        end
      end
    end
  end

  def self.get_private_key(name, config = profiled_config)
    key, _key_path = get_private_key_with_path(name, config)
    key
  end

  def self.get_private_key_with_path(name, config = profiled_config)
    if config[:private_keys] && config[:private_keys][name]
      named_key = config[:private_keys][name]
      if named_key.is_a?(String)
        Chef::Log.info("Got key #{name} from Chef::Config.private_keys.#{name}, which points at #{named_key}.  Reading key from there ...")
        return [ IO.read(named_key), named_key]
      else
        Chef::Log.info("Got key #{name} raw from Chef::Config.private_keys.#{name}.")
        return [ named_key.to_pem, nil ]
      end
    elsif config[:private_key_paths]
      config[:private_key_paths].each do |private_key_path|
        next unless File.exist?(private_key_path)

        Dir.entries(private_key_path).sort.each do |key|
          ext = File.extname(key)
          if key == name || ext == "" || ext == ".pem"
            key_name = key[0..-(ext.length + 1)]
            if key_name == name || key == name
              Chef::Log.info("Reading key #{name} from file #{private_key_path}/#{key}")
              return [ IO.read("#{private_key_path}/#{key}"), "#{private_key_path}/#{key}" ]
            end
          end
        end
      end
    end
    nil
  end

  def self.node_attributes(klass)
    klass.include Cheffish::NodeProperties
  end
end

# Include all recipe objects so require 'cheffish' brings in the whole recipe DSL

require "chef/run_list/run_list_item"
require_relative "cheffish/basic_chef_client"
require_relative "cheffish/server_api"
require "chef/knife"
require "chef/config_fetcher"
require "chef/log"
require "chef/application"
require_relative "cheffish/recipe_dsl"
require_relative "cheffish/node_properties"