chef-config 12.5.1 → 12.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3434a9979123f796c68bcf60049eff88bf93ce83
4
- data.tar.gz: b33597d8c90263a4bea0a4358e804be0ff065e32
3
+ metadata.gz: 657659650232e1f20d20c8cceda2319dbbee9275
4
+ data.tar.gz: 5f0cae5b96b02972dad1c301fd519d74f0ad65dc
5
5
  SHA512:
6
- metadata.gz: c5d6bf5b9ad5b89e4001068ab2161d1a99b3f14aa6d35d996f40f4642525067dc3947547bba72efd6f7c45bc40b81e25733fcd8d3c800de9f5b587a2b63351bc
7
- data.tar.gz: 8c55a928932d2a60299b39166777ae0f3fc538d069a1083d749c4496f4552d8dff17b0a4a9fc681fbb306c275363e85f12adefc788a0fde54bcf5522aa2b65ba
6
+ metadata.gz: 4fe4c7d72f78259fffa316f4702f76a6fe3e7bf56c4e144f987eab0006b791f379514e4d53ec3ad90024cc8545722be3e04cc221dbd21d4d930e958f5c8d7ef4
7
+ data.tar.gz: b5c0b623957b8b30a3e75631fb7f96d9780cda43cbef580467cbad299714633a97d50649dba996e13117115cd09b870a926d49ec894bc4ae1809362a5bedcd1d
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'chef-config/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "chef-config"
8
+ spec.version = ChefConfig::VERSION
9
+ spec.authors = ["Adam Jacob"]
10
+ spec.email = ["adam@chef.io"]
11
+
12
+ spec.summary = %q{Chef's default configuration and config loading}
13
+ spec.homepage = "https://github.com/chef/chef"
14
+ spec.license = "Apache-2.0"
15
+
16
+ spec.require_paths = ["lib"]
17
+
18
+ spec.add_dependency "mixlib-shellout", "~> 2.0"
19
+ spec.add_dependency "mixlib-config", "~> 2.0"
20
+
21
+ spec.add_development_dependency "rake", "~> 10.0"
22
+
23
+ %w(rspec-core rspec-expectations rspec-mocks).each do |rspec|
24
+ spec.add_development_dependency(rspec, "~> 3.2")
25
+ end
26
+
27
+ spec.files = %w(Rakefile LICENSE README.md) + Dir.glob("*.gemspec") +
28
+ Dir.glob("{lib,spec}/**/*", File::FNM_DOTMATCH).reject {|f| File.directory?(f) }
29
+
30
+ spec.bindir = "bin"
31
+ spec.executables = []
32
+ end
@@ -26,6 +26,7 @@ require 'chef-config/logger'
26
26
  require 'chef-config/windows'
27
27
  require 'chef-config/path_helper'
28
28
  require 'mixlib/shellout'
29
+ require 'uri'
29
30
 
30
31
  module ChefConfig
31
32
 
@@ -76,12 +77,21 @@ module ChefConfig
76
77
 
77
78
  default :formatters, []
78
79
 
80
+ def self.is_valid_url? uri
81
+ url = uri.to_s.strip
82
+ /^http:\/\// =~ url || /^https:\/\// =~ url || /^chefzero:/ =~ url
83
+ end
79
84
  # Override the config dispatch to set the value of multiple server options simultaneously
80
85
  #
81
86
  # === Parameters
82
87
  # url<String>:: String to be set for all of the chef-server-api URL's
83
88
  #
84
- configurable(:chef_server_url).writes_value { |url| url.to_s.strip }
89
+ configurable(:chef_server_url).writes_value do |uri|
90
+ unless is_valid_url? uri
91
+ raise ConfigurationError, "#{uri} is an invalid chef_server_url."
92
+ end
93
+ uri.to_s.strip
94
+ end
85
95
 
86
96
  # When you are using ActiveSupport, they monkey-patch 'daemonize' into Kernel.
87
97
  # So while this is basically identical to what method_missing would do, we pull
@@ -271,6 +281,9 @@ module ChefConfig
271
281
  # Using `force_logger` causes chef to default to logger output when STDOUT is a tty
272
282
  default :force_logger, false
273
283
 
284
+ # Using 'stream_execute_output' will have Chef always stream the execute output
285
+ default :stream_execute_output, false
286
+
274
287
  default :http_retry_count, 5
275
288
  default :http_retry_delay, 5
276
289
  default :interval, nil
@@ -300,7 +313,7 @@ module ChefConfig
300
313
  default :host, 'localhost'
301
314
  default :port, 8889.upto(9999) # Will try ports from 8889-9999 until one works
302
315
  end
303
- default :chef_server_url, "https://localhost:443"
316
+ default :chef_server_url, "https://localhost:443"
304
317
 
305
318
  default(:chef_server_root) do
306
319
  # if the chef_server_url is a path to an organization, aka
@@ -698,6 +711,66 @@ module ChefConfig
698
711
  config_context :chefdk do
699
712
  end
700
713
 
714
+ configurable(:http_proxy)
715
+ configurable(:http_proxy_user)
716
+ configurable(:http_proxy_pass)
717
+ configurable(:https_proxy)
718
+ configurable(:https_proxy_user)
719
+ configurable(:https_proxy_pass)
720
+ configurable(:ftp_proxy)
721
+ configurable(:ftp_proxy_user)
722
+ configurable(:ftp_proxy_pass)
723
+ configurable(:no_proxy)
724
+
725
+ # Public method that users should call to export proxies to the appropriate
726
+ # environment variables. This method should be called after the config file is
727
+ # parsed and loaded.
728
+ # TODO add some post-file-parsing logic that automatically calls this so
729
+ # users don't have to
730
+ def self.export_proxies
731
+ export_proxy("http", http_proxy, http_proxy_user, http_proxy_pass) if http_proxy
732
+ export_proxy("https", https_proxy, https_proxy_user, https_proxy_pass) if https_proxy
733
+ export_proxy("ftp", ftp_proxy, ftp_proxy_user, ftp_proxy_pass) if ftp_proxy
734
+ export_no_proxy(no_proxy) if no_proxy
735
+ end
736
+
737
+ # Builds a proxy uri and exports it to the appropriate environment variables. Examples:
738
+ # http://username:password@hostname:port
739
+ # https://username@hostname:port
740
+ # ftp://hostname:port
741
+ # when
742
+ # scheme = "http", "https", or "ftp"
743
+ # hostport = hostname:port or scheme://hostname:port
744
+ # user = username
745
+ # pass = password
746
+ # @api private
747
+ def self.export_proxy(scheme, path, user, pass)
748
+ path = "#{scheme}://#{path}" unless path.include?('://')
749
+ # URI.split returns the following parts:
750
+ # [scheme, userinfo, host, port, registry, path, opaque, query, fragment]
751
+ parts = URI.split(URI.encode(path))
752
+ # URI::Generic.build requires an integer for the port, but URI::split gives
753
+ # returns a string for the port.
754
+ parts[3] = parts[3].to_i if parts[3]
755
+ if user && !user.empty?
756
+ userinfo = URI.encode(URI.encode(user), '@:')
757
+ if pass
758
+ userinfo << ":#{URI.encode(URI.encode(pass), '@:')}"
759
+ end
760
+ parts[1] = userinfo
761
+ end
762
+
763
+ path = URI::Generic.build(parts).to_s
764
+ ENV["#{scheme}_proxy".downcase] = path unless ENV["#{scheme}_proxy".downcase]
765
+ ENV["#{scheme}_proxy".upcase] = path unless ENV["#{scheme}_proxy".upcase]
766
+ end
767
+
768
+ # @api private
769
+ def self.export_no_proxy(value)
770
+ ENV['no_proxy'] = value unless ENV['no_proxy']
771
+ ENV['NO_PROXY'] = value unless ENV['NO_PROXY']
772
+ end
773
+
701
774
  # Chef requires an English-language UTF-8 locale to function properly. We attempt
702
775
  # to use the 'locale -a' command and search through a list of preferences until we
703
776
  # find one that we can use. On Ubuntu systems we should find 'C.UTF-8' and be
@@ -21,7 +21,7 @@
21
21
 
22
22
  module ChefConfig
23
23
  CHEFCONFIG_ROOT = File.dirname(File.expand_path(File.dirname(__FILE__)))
24
- VERSION = '12.5.1'
24
+ VERSION = '12.6.0'
25
25
  end
26
26
 
27
27
  #
@@ -60,6 +60,12 @@ RSpec.describe ChefConfig::Config do
60
60
  expect(ChefConfig::Config.chef_server_url).to eq("https://junglist.gen.nz")
61
61
  end
62
62
  end
63
+
64
+ context "when the url is invalid" do
65
+ it "raises an exception" do
66
+ expect { ChefConfig::Config.chef_server_url = "127.0.0.1" }.to raise_error(ChefConfig::ConfigurationError)
67
+ end
68
+ end
63
69
  end
64
70
 
65
71
  describe "when configuring formatters" do
@@ -264,6 +270,10 @@ RSpec.describe ChefConfig::Config do
264
270
  end
265
271
  end
266
272
 
273
+ it "ChefConfig::Config[:stream_execute_output] defaults to false" do
274
+ expect(ChefConfig::Config[:stream_execute_output]).to eq(false)
275
+ end
276
+
267
277
  it "ChefConfig::Config[:file_backup_path] defaults to /var/chef/backup" do
268
278
  allow(ChefConfig::Config).to receive(:cache_path).and_return(primary_cache_path)
269
279
  backup_path = is_windows ? "#{primary_cache_path}\\backup" : "#{primary_cache_path}/backup"
@@ -561,6 +571,125 @@ RSpec.describe ChefConfig::Config do
561
571
  end
562
572
  end
563
573
 
574
+ describe "export_proxies" do
575
+ let(:http_proxy) { "http://localhost:7979" }
576
+ let(:https_proxy) { "https://localhost:7979" }
577
+ let(:ftp_proxy) { "ftp://localhost:7979" }
578
+ let(:proxy_user) { "http_user" }
579
+ let(:proxy_pass) { "http_pass" }
580
+
581
+ context "when http_proxy, proxy_pass and proxy_user are set" do
582
+ before do
583
+ ChefConfig::Config.http_proxy = http_proxy
584
+ ChefConfig::Config.http_proxy_user = proxy_user
585
+ ChefConfig::Config.http_proxy_pass = proxy_pass
586
+ end
587
+ it "exports ENV['http_proxy']" do
588
+ expect(ENV).to receive(:[]=).with('http_proxy', "http://http_user:http_pass@localhost:7979")
589
+ expect(ENV).to receive(:[]=).with('HTTP_PROXY', "http://http_user:http_pass@localhost:7979")
590
+ ChefConfig::Config.export_proxies
591
+ end
592
+ end
593
+
594
+ context "when https_proxy, proxy_pass and proxy_user are set" do
595
+ before do
596
+ ChefConfig::Config.https_proxy = https_proxy
597
+ ChefConfig::Config.https_proxy_user = proxy_user
598
+ ChefConfig::Config.https_proxy_pass = proxy_pass
599
+ end
600
+ it "exports ENV['https_proxy']" do
601
+ expect(ENV).to receive(:[]=).with('https_proxy', "https://http_user:http_pass@localhost:7979")
602
+ expect(ENV).to receive(:[]=).with('HTTPS_PROXY', "https://http_user:http_pass@localhost:7979")
603
+ ChefConfig::Config.export_proxies
604
+ end
605
+ end
606
+
607
+ context "when ftp_proxy, proxy_pass and proxy_user are set" do
608
+ before do
609
+ ChefConfig::Config.ftp_proxy = ftp_proxy
610
+ ChefConfig::Config.ftp_proxy_user = proxy_user
611
+ ChefConfig::Config.ftp_proxy_pass = proxy_pass
612
+ end
613
+ it "exports ENV['ftp_proxy']" do
614
+ expect(ENV).to receive(:[]=).with('ftp_proxy', "ftp://http_user:http_pass@localhost:7979")
615
+ expect(ENV).to receive(:[]=).with('FTP_PROXY', "ftp://http_user:http_pass@localhost:7979")
616
+ ChefConfig::Config.export_proxies
617
+ end
618
+ end
619
+
620
+ shared_examples "no user pass" do
621
+ it "does not populate the user or password" do
622
+ expect(ENV).to receive(:[]=).with('http_proxy', "http://localhost:7979")
623
+ expect(ENV).to receive(:[]=).with('HTTP_PROXY', "http://localhost:7979")
624
+ ChefConfig::Config.export_proxies
625
+ end
626
+ end
627
+
628
+ context "when proxy_pass and proxy_user are passed as empty strings" do
629
+ before do
630
+ ChefConfig::Config.http_proxy = http_proxy
631
+ ChefConfig::Config.http_proxy_user = ""
632
+ ChefConfig::Config.http_proxy_pass = proxy_pass
633
+ end
634
+ include_examples "no user pass"
635
+ end
636
+
637
+ context "when proxy_pass and proxy_user are not provided" do
638
+ before do
639
+ ChefConfig::Config.http_proxy = http_proxy
640
+ end
641
+ include_examples "no user pass"
642
+ end
643
+
644
+ context "when the proxy is provided without a scheme" do
645
+ before do
646
+ ChefConfig::Config.http_proxy = "localhost:1111"
647
+ end
648
+ it "automatically adds the scheme to the proxy url" do
649
+ expect(ENV).to receive(:[]=).with('http_proxy', "http://localhost:1111")
650
+ expect(ENV).to receive(:[]=).with('HTTP_PROXY', "http://localhost:1111")
651
+ ChefConfig::Config.export_proxies
652
+ end
653
+ end
654
+
655
+ shared_examples "no export" do
656
+ it "does not export any proxy settings" do
657
+ ChefConfig::Config.export_proxies
658
+ expect(ENV['http_proxy']).to eq(nil)
659
+ expect(ENV['https_proxy']).to eq(nil)
660
+ expect(ENV['ftp_proxy']).to eq(nil)
661
+ expect(ENV['no_proxy']).to eq(nil)
662
+ end
663
+ end
664
+
665
+ context "when nothing is set" do
666
+ include_examples "no export"
667
+ end
668
+
669
+ context "when all the users and passwords are set but no proxies are set" do
670
+ before do
671
+ ChefConfig::Config.http_proxy_user = proxy_user
672
+ ChefConfig::Config.http_proxy_pass = proxy_pass
673
+ ChefConfig::Config.https_proxy_user = proxy_user
674
+ ChefConfig::Config.https_proxy_pass = proxy_pass
675
+ ChefConfig::Config.ftp_proxy_user = proxy_user
676
+ ChefConfig::Config.ftp_proxy_pass = proxy_pass
677
+ end
678
+ include_examples "no export"
679
+ end
680
+
681
+ context "no_proxy is set" do
682
+ before do
683
+ ChefConfig::Config.no_proxy = "localhost"
684
+ end
685
+ it "exports ENV['no_proxy']" do
686
+ expect(ENV).to receive(:[]=).with('no_proxy', "localhost")
687
+ expect(ENV).to receive(:[]=).with('NO_PROXY', "localhost")
688
+ ChefConfig::Config.export_proxies
689
+ end
690
+ end
691
+ end
692
+
564
693
  describe "allowing chefdk configuration outside of chefdk" do
565
694
 
566
695
  it "allows arbitrary settings in the chefdk config context" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-config
3
3
  version: !ruby/object:Gem::Version
4
- version: 12.5.1
4
+ version: 12.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Jacob
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-08 00:00:00.000000000 Z
11
+ date: 2015-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mixlib-shellout
@@ -104,6 +104,7 @@ files:
104
104
  - LICENSE
105
105
  - README.md
106
106
  - Rakefile
107
+ - chef-config.gemspec
107
108
  - lib/chef-config.rb
108
109
  - lib/chef-config/config.rb
109
110
  - lib/chef-config/exceptions.rb