diff options
-rwxr-xr-x | bin/chef-zero | 6 | ||||
-rw-r--r-- | lib/chef_zero/chef_data/cookbook_data.rb | 10 | ||||
-rw-r--r-- | lib/chef_zero/chef_data/data_normalizer.rb | 2 | ||||
-rw-r--r-- | lib/chef_zero/rest_base.rb | 5 | ||||
-rw-r--r-- | lib/chef_zero/rest_request.rb | 8 | ||||
-rw-r--r-- | lib/chef_zero/server.rb | 13 | ||||
-rw-r--r-- | lib/chef_zero/solr/query/regexpable_query.rb | 4 | ||||
-rw-r--r-- | lib/chef_zero/solr/query/unary_operator.rb | 6 | ||||
-rw-r--r-- | spec/search_spec.rb | 4 | ||||
-rw-r--r-- | spec/server_spec.rb | 4 |
10 files changed, 48 insertions, 14 deletions
diff --git a/bin/chef-zero b/bin/chef-zero index 03b6d01..33fc0e1 100755 --- a/bin/chef-zero +++ b/bin/chef-zero @@ -99,7 +99,11 @@ if options[:daemon] Process.daemon(true) server.start(true) else - abort 'Process.daemon requires Ruby >= 1.9' + if ENV['OS'] == 'Windows_NT' + abort 'Daemonization is not supported on Windows. Running 'start chef-zero' will fork the process.' + else + abort 'Process.daemon requires Ruby >= 1.9' + end end else server.start(true) diff --git a/lib/chef_zero/chef_data/cookbook_data.rb b/lib/chef_zero/chef_data/cookbook_data.rb index e690fde..4fd0320 100644 --- a/lib/chef_zero/chef_data/cookbook_data.rb +++ b/lib/chef_zero/chef_data/cookbook_data.rb @@ -129,11 +129,15 @@ module ChefZero self[key][cookbook] = version_constraints.first || ">= 0.0.0" end - def method_missing(key, value = nil) - if value.nil? + def method_missing(key, *values) + if values.nil? self[key.to_sym] else - store key.to_sym, value + if values.length > 1 + store key.to_sym, values + else + store key.to_sym, values.first + end end end end diff --git a/lib/chef_zero/chef_data/data_normalizer.rb b/lib/chef_zero/chef_data/data_normalizer.rb index da3802d..e819f1d 100644 --- a/lib/chef_zero/chef_data/data_normalizer.rb +++ b/lib/chef_zero/chef_data/data_normalizer.rb @@ -163,7 +163,7 @@ module ChefZero node['chef_type'] ||= 'node' node['chef_environment'] ||= '_default' node['override'] ||= {} - node['normal'] ||= {} + node['normal'] ||= {"tags" => []} node['default'] ||= {} node['automatic'] ||= {} node['run_list'] ||= [] diff --git a/lib/chef_zero/rest_base.rb b/lib/chef_zero/rest_base.rb index 71f6f15..929aa8f 100644 --- a/lib/chef_zero/rest_base.rb +++ b/lib/chef_zero/rest_base.rb @@ -61,7 +61,7 @@ module ChefZero begin self.send(method, request) rescue RestErrorResponse => e - ChefZero::Log.info("#{e.inspect}\n#{e.backtrace.join("\n")}") + ChefZero::Log.debug("#{e.inspect}\n#{e.backtrace.join("\n")}") error(e.response_code, e.error) end end @@ -80,6 +80,7 @@ module ChefZero def get_data(request, rest_path=nil, *options) rest_path ||= request.rest_path + rest_path = rest_path.map { |v| URI.decode(v) } begin data_store.get(rest_path, request) rescue DataStore::DataNotFoundError @@ -276,7 +277,7 @@ module ChefZero end def self.build_uri(base_uri, rest_path) - "#{base_uri}/#{rest_path.join('/')}" + "#{base_uri}/#{rest_path.map { |v| URI.escape(v) }.join('/')}" end def populate_defaults(request, response) diff --git a/lib/chef_zero/rest_request.rb b/lib/chef_zero/rest_request.rb index f18ce4d..c12ea31 100644 --- a/lib/chef_zero/rest_request.rb +++ b/lib/chef_zero/rest_request.rb @@ -14,7 +14,13 @@ module ChefZero attr_accessor :rest_base_prefix def base_uri - @base_uri ||= "#{env['rack.url_scheme']}://#{env['HTTP_HOST']}#{env['SCRIPT_NAME']}" + # Load balancer awareness + if env['HTTP_X_FORWARDED_PROTO'] + scheme = env['HTTP_X_FORWARDED_PROTO'] + else + scheme = env['rack.url_scheme'] + end + @base_uri ||= "#{scheme}://#{env['HTTP_HOST']}#{env['SCRIPT_NAME']}" end def base_uri=(value) diff --git a/lib/chef_zero/server.rb b/lib/chef_zero/server.rb index 31c8baa..19744b1 100644 --- a/lib/chef_zero/server.rb +++ b/lib/chef_zero/server.rb @@ -284,7 +284,9 @@ module ChefZero :DoNotListen => true, :AccessLog => [], :Logger => WEBrick::Log.new(StringIO.new, 7), + :RequestTimeout => 300, :SSLEnable => options[:ssl], + :SSLOptions => ssl_opts, :SSLCertName => [ [ 'CN', WEBrick::Utils::getservername ] ], :StartCallback => proc { @running = true @@ -708,5 +710,16 @@ module ChefZero end value end + + ## Disable unsecure ssl + ## Ref: https://www.ruby-lang.org/en/news/2014/10/27/changing-default-settings-of-ext-openssl/ + def ssl_opts + ssl_opts = OpenSSL::SSL::OP_ALL + ssl_opts &= ~OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS if defined?(OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS) + ssl_opts |= OpenSSL::SSL::OP_NO_COMPRESSION if defined?(OpenSSL::SSL::OP_NO_COMPRESSION) + ssl_opts |= OpenSSL::SSL::OP_NO_SSLv2 if defined?(OpenSSL::SSL::OP_NO_SSLv2) + ssl_opts |= OpenSSL::SSL::OP_NO_SSLv3 if defined?(OpenSSL::SSL::OP_NO_SSLv3) + ssl_opts + end end end diff --git a/lib/chef_zero/solr/query/regexpable_query.rb b/lib/chef_zero/solr/query/regexpable_query.rb index 241e675..cebc011 100644 --- a/lib/chef_zero/solr/query/regexpable_query.rb +++ b/lib/chef_zero/solr/query/regexpable_query.rb @@ -21,8 +21,8 @@ module ChefZero end DEFAULT_FIELD = "text" - WORD_CHARACTER = "[A-Za-z0-9@._':]" - NON_WORD_CHARACTER = "[^A-Za-z0-9@._':]" + WORD_CHARACTER = "[A-Za-z0-9@._':\-]" + NON_WORD_CHARACTER = "[^A-Za-z0-9@._':\-]" end end end diff --git a/lib/chef_zero/solr/query/unary_operator.rb b/lib/chef_zero/solr/query/unary_operator.rb index fc46c0d..a873932 100644 --- a/lib/chef_zero/solr/query/unary_operator.rb +++ b/lib/chef_zero/solr/query/unary_operator.rb @@ -16,8 +16,7 @@ module ChefZero def matches_doc?(doc) case @operator - when '-' - when 'NOT' + when '-', 'NOT' !operand.matches_doc?(doc) when '+' # TODO This operator uses relevance to eliminate other, unrelated @@ -28,8 +27,7 @@ module ChefZero def matches_values?(values) case @operator - when '-' - when 'NOT' + when '-', 'NOT' !operand.matches_values?(values) when '+' # TODO This operator uses relevance to eliminate other, unrelated diff --git a/spec/search_spec.rb b/spec/search_spec.rb index df0522c..54392a6 100644 --- a/spec/search_spec.rb +++ b/spec/search_spec.rb @@ -24,6 +24,10 @@ describe ChefZero::Solr::SolrParser do search_for('foo:[a TO c]').size.should eq(1) end + it "handles -" do + search_for('-foo:a').size.should eq(1) + end + it "handles wildcard ranges" do search_for('foo:[* TO c]').size.should eq(1) search_for('foo:[c TO *]').size.should eq(1) diff --git a/spec/server_spec.rb b/spec/server_spec.rb index d46084f..123a13e 100644 --- a/spec/server_spec.rb +++ b/spec/server_spec.rb @@ -27,6 +27,10 @@ describe ChefZero::Server do expect { ChefZero::Server.new(:port => 8889.upto(8889)).start_background }.to raise_error Errno::EADDRINUSE end + it 'has a very patient request timeout' do + expect(@server.server.config[:RequestTimeout]).to eq 300 + end + context 'accept headers' do def get_nodes(accepts) uri = URI(@server.url) |