summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Keiser <jkeiser@opscode.com>2013-11-01 15:52:51 -0700
committerJohn Keiser <jkeiser@opscode.com>2013-11-01 15:52:51 -0700
commit63e16286e3e0550171d446ba18b765d4345246f0 (patch)
tree2474eb36ea7dcd08d7beb25ff655e9dfbd0c8675
parentadf232fad983980ba70825989c99682c0ff07975 (diff)
downloadchef-zero-63e16286e3e0550171d446ba18b765d4345246f0.tar.gz
Use webrick when puma is not available
-rw-r--r--chef-zero.gemspec2
-rw-r--r--lib/chef_zero/server.rb85
2 files changed, 67 insertions, 20 deletions
diff --git a/chef-zero.gemspec b/chef-zero.gemspec
index a24462a..1d67a3a 100644
--- a/chef-zero.gemspec
+++ b/chef-zero.gemspec
@@ -12,11 +12,11 @@ Gem::Specification.new do |s|
s.homepage = 'http://www.opscode.com'
s.license = 'Apache 2.0'
- s.add_dependency 'puma', '~> 1.6'
s.add_dependency 'mixlib-log', '~> 1.3'
s.add_dependency 'hashie', '~> 2.0'
s.add_dependency 'moneta', '< 0.7.0' # For chef, see CHEF-3721
s.add_dependency 'json'
+ s.add_dependency 'rack'
s.add_development_dependency 'rake'
s.add_development_dependency 'rspec'
diff --git a/lib/chef_zero/server.rb b/lib/chef_zero/server.rb
index 77a45a1..d090e40 100644
--- a/lib/chef_zero/server.rb
+++ b/lib/chef_zero/server.rb
@@ -17,7 +17,6 @@
#
require 'openssl'
-require 'puma'
require 'rubygems'
require 'timeout'
@@ -67,40 +66,76 @@ module ChefZero
def initialize(options = {})
options = DEFAULT_OPTIONS.merge(options)
+ @options = options
@url = "http://#{options[:host]}:#{options[:port]}"
@generate_real_keys = options[:generate_real_keys]
ChefZero::Log.level = options[:log_level].to_sym
- @server = Puma::Server.new(make_app, Puma::Events.new(STDERR, STDOUT))
- if options[:socket]
- @server.add_unix_listener(options[:socket])
- else
- @server.add_tcp_listener(options[:host], options[:port])
+ begin
+ require 'puma'
+ @server = Puma::Server.new(make_app, Puma::Events.new(STDERR, STDOUT))
+ if options[:socket]
+ @server.add_unix_listener(options[:socket])
+ else
+ @server.add_tcp_listener(options[:host], options[:port])
+ end
+ @server_type = :puma
+ rescue LoadError
+ require 'rack'
+ @server_type = :webrick
end
-
@data_store = options[:data_store] || DataStore::MemoryStore.new
end
+ attr_reader :options
attr_reader :server
attr_reader :data_store
attr_reader :url
include ChefZero::Endpoints
- def start(options = {})
- if options[:publish]
+ def start(start_options = {})
+ if start_options[:publish]
puts ">> Starting Chef Zero (v#{ChefZero::VERSION})..."
- puts ">> Puma (v#{Puma::Const::PUMA_VERSION}) is listening at #{url}"
+ case @server_type
+ when :puma
+ puts ">> Puma (v#{Puma::Const::PUMA_VERSION}) is listening at #{url}"
+ when :webrick
+ puts ">> WEBrick (v#{WEBrick::VERSION}) on Rack (v#{Rack.release}) is listening at #{url}"
+ end
puts ">> Press CTRL+C to stop"
end
begin
- thread = server.run.join
+ case @server_type
+ when :puma
+ server.run.join
+ when :webrick
+ Rack::Handler::WEBrick.run(
+ make_app,
+ :BindAddress => @options[:host],
+ :Port => @options[:port],
+ :AccessLog => [],
+ :Logger => WEBrick::Log::new("/dev/null", 7)
+ ) do |server|
+ @server = server
+ end
+ end
rescue Object, Interrupt
- puts "\n>> Stopping Puma..."
- server.stop(true) if running?
+ puts "\n>> Stopping Chef Zero ..."
+ case @server_type
+ when :puma
+ server.stop(true) if running?
+ else
+ end
+ ensure
+ case @server_type
+ when :webrick
+ @server = nil
+ else
+ end
end
end
@@ -125,17 +160,29 @@ module ChefZero
end
def running?
- !!server.running
+ case @server_type
+ when :puma
+ !!server.running
+ when :webrick
+ !!@server
+ end
end
def stop(wait = 5)
- server.stop(true)
- if @thread
- @thread.join(wait)
+ case @server_type
+ when :puma
+ server.stop(true)
+ if @thread
+ @thread.join(wait)
+ end
+ when :webrick
+ @thread.kill if @thread
end
rescue
- ChefZero::Log.error "Server did not stop within #{wait} seconds. Killing..."
- @thread.kill if @thread
+ if @thread
+ ChefZero::Log.error "Server did not stop within #{wait} seconds. Killing..."
+ @thread.kill
+ end
ensure
@thread = nil
end