lib/berkshelf/config.rb
require "mixlib/config" unless defined?(Mixlib::Config)
require "openssl" unless defined?(OpenSSL)
# we need this method, but have to inject it into mixlib-config directly
# to have it available from config contexts
module Mixlib
module Config
def each(&block)
save(true).each(&block)
end
end
end
module Berkshelf
class Config
class << self
# @return [String]
def store_location
File.join(Berkshelf.berkshelf_path, "config.json")
end
# @return [String]
def local_location
ENV["BERKSHELF_CONFIG"] || File.join(".", ".berkshelf", "config.json")
end
# @return [String]
def path
path = File.exist?(local_location) ? local_location : store_location
File.expand_path(path)
end
# @param [Berkshelf::Config] config
def set_config(config)
@instance = config
end
# @param [String] new_path
def set_path(new_path)
@instance = nil
end
# Instantiate and return or just return the currently instantiated Berkshelf
# configuration
#
# @return [Config]
def instance
@instance ||= new(path)
coerce_ssl
end
# Reload the currently instantiated Berkshelf configuration
#
# @return [Config]
def reload
@instance = nil
instance
end
# force proper X509 types from any configuration strings
#
# @return [Config]
def coerce_ssl
ssl = @instance[:ssl]
ssl[:ca_cert] = OpenSSL::X509::Certificate.new(File.read(ssl[:ca_cert])) if ssl[:ca_cert] && ssl[:ca_cert].is_a?(String)
ssl[:client_cert] = OpenSSL::X509::Certificate.new(File.read(ssl[:client_cert])) if ssl[:client_cert] && ssl[:client_cert].is_a?(String)
ssl[:client_key] = OpenSSL::PKey::RSA.new(File.read(ssl[:client_key])) if ssl[:client_key] && ssl[:client_key].is_a?(String)
@instance
end
def from_file(path)
new(path)
end
end
attr_accessor :path
# @param [String] path
def initialize(path = self.class.path)
# this is a bit tricky, mixlib-config wants to extend a class and create effectively a global config object while
# what we want to do is use an instance, so we create an anonymous class and shove it into an instance variable.
# this is actually similar to what mixlib-config itself does to create config contexts.
@klass = Class.new
@klass.extend(Mixlib::Config)
@klass.extend(BerksConfig)
@path = File.expand_path(path)
@klass.from_file(@path) if File.exist?(@path)
# yeah, if !File.exist?() you just get back an empty config object
Berkshelf.ui.warn "The `cookbook.copyright' config is deprecated and will be removed in a future release." unless cookbook.copyright.nil?
Berkshelf.ui.warn "The `cookbook.email' config is deprecated and will be removed in a future release." unless cookbook.email.nil?
Berkshelf.ui.warn "The `cookbook.license' config is deprecated and will be removed in a future release." unless cookbook.license.nil?
Berkshelf.ui.warn "The `vagrant.vm.box' config is deprecated and will be removed in a future release." unless vagrant.vm.box.nil?
Berkshelf.ui.warn "The `vagrant.vm.forward_port' config is deprecated and will be removed in a future release." unless vagrant.vm.forward_port.nil?
Berkshelf.ui.warn "The `vagrant.vm.provision' config is deprecated and will be removed in a future release." unless vagrant.vm.provision.nil?
Berkshelf.ui.warn "The `vagrant.vm.omnibus.version' config is deprecated and will be removed in a future release." unless vagrant.vm.omnibus.version.nil?
end
def method_missing(method, *args, &block)
@klass.send(method, *args, &block)
end
module BerksConfig
def self.extended(base)
base.class_exec do
config_strict_mode true
config_context :api do
default :timeout, "30"
end
config_context :chef do
default :chef_server_url, Berkshelf.chef_config.chef_server_url
default :validation_client_name, Berkshelf.chef_config.validation_client_name
default :validation_key_path, Berkshelf.chef_config.validation_key
default :client_key, Berkshelf.chef_config.client_key
default :node_name, Berkshelf.chef_config.node_name
default :trusted_certs_dir, Berkshelf.chef_config.trusted_certs_dir
default :artifactory_api_key, Berkshelf.chef_config.artifactory_api_key
end
config_context :cookbook do
default :copyright, nil
default :email, nil
default :license, nil
end
default :allowed_licenses, []
default :raise_license_exception, false
config_context :vagrant do
config_context :vm do
default :box, nil
default :forward_port, nil
default :provision, nil
config_context :omnibus do
default :version, nil
end
end
end
config_context :ssl do
default :verify, true
default :cert_store, false
default :ca_file, nil
default :ca_path, nil
default :ca_cert, nil
default :client_cert, nil
default :client_key, nil
end
default :github, []
default :gitlab, []
# :git, :ssh, or :https
default :github_protocol, :https
end
end
end
end
end