summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbin/chef-zero6
-rw-r--r--lib/chef_zero/chef_data/cookbook_data.rb10
-rw-r--r--lib/chef_zero/chef_data/data_normalizer.rb2
-rw-r--r--lib/chef_zero/rest_base.rb5
-rw-r--r--lib/chef_zero/rest_request.rb8
-rw-r--r--lib/chef_zero/server.rb13
-rw-r--r--lib/chef_zero/solr/query/regexpable_query.rb4
-rw-r--r--lib/chef_zero/solr/query/unary_operator.rb6
-rw-r--r--spec/search_spec.rb4
-rw-r--r--spec/server_spec.rb4
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)