ringleader 1.1.5.pre0 → 1.1.5.pre1

Sign up to get free protection for your applications and to get access to all the features.
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 1.9.3-p392
@@ -35,9 +35,16 @@ module Ringleader
35
35
  end
36
36
  end
37
37
 
38
- def stop
38
+ def stop(forever=false)
39
39
  return unless @process.running?
40
40
  info "stopping #{@config.name}..."
41
+
42
+ if forever
43
+ # stop processing requests
44
+ @server.close
45
+ @server = nil
46
+ end
47
+
41
48
  stop_activity_timer
42
49
  @process.stop
43
50
  end
@@ -61,15 +68,17 @@ module Ringleader
61
68
  info "disabling #{@config.name}..."
62
69
  return unless @server
63
70
  stop_activity_timer
64
- @process.stop
65
71
  @server.close
66
72
  @server = nil
73
+ @process.stop
67
74
  @enabled = false
68
75
  end
69
76
 
70
- def finalize
71
- @server.close if @server
77
+ def close_server_socket
78
+ @server.close if @server && !@server.closed?
79
+ @server = nil
72
80
  end
81
+ finalizer :close_server_socket
73
82
 
74
83
  def run
75
84
  info "listening for connections for #{@config.name} on #{@config.host}:#{@config.server_port}"
@@ -92,8 +101,16 @@ module Ringleader
92
101
  end
93
102
  end
94
103
 
95
- def proxy_to_app(socket)
96
- SocketProxy.new socket, @config.host, @config.app_port
104
+ def proxy_to_app(upstream)
105
+ debug "proxying to #{@config.host}:#{@config.app_port}"
106
+
107
+ downstream = TCPSocket.new(@config.host, @config.app_port)
108
+ async.proxy downstream, upstream
109
+ async.proxy upstream, downstream
110
+
111
+ rescue IOError, SystemCallError => e
112
+ error "could not proxy to #{@config.host}:#{@config.app_port}: #{e}"
113
+ upstream.close
97
114
  end
98
115
 
99
116
  def start_activity_timer
@@ -118,5 +135,14 @@ module Ringleader
118
135
  end
119
136
  end
120
137
 
138
+ def proxy(from, to)
139
+ ::IO.copy_stream from, to
140
+ rescue IOError, SystemCallError
141
+ # from or to were closed or connection was reset
142
+ ensure
143
+ from.close unless from.closed?
144
+ to.close unless to.closed?
145
+ end
146
+
121
147
  end
122
148
  end
@@ -23,7 +23,7 @@ module Ringleader
23
23
  @stopping = true
24
24
  info "shutting down..."
25
25
  @apps.values.map do |app|
26
- Thread.new { app.stop if app.alive? }
26
+ Thread.new { app.stop(:forever) if app.alive? }
27
27
  end.map(&:join)
28
28
  end
29
29
  end
@@ -30,7 +30,6 @@ module Ringleader
30
30
  #
31
31
  # Returns true if the app started, false if not.
32
32
  def start
33
- return false if @stopping
34
33
  if @running
35
34
  true
36
35
  elsif @starting
@@ -55,7 +54,6 @@ module Ringleader
55
54
  # zombies), use KILL instead.
56
55
  def stop
57
56
  return unless @pid
58
- @stopping = true
59
57
 
60
58
  children = child_pids @pid
61
59
 
@@ -96,7 +94,6 @@ module Ringleader
96
94
  @pid = nil
97
95
  @wait_for_port.terminate if @wait_for_port.alive?
98
96
  @wait_for_exit.terminate if @wait_for_exit.alive?
99
- @stopping = nil
100
97
  signal :running, false
101
98
  end
102
99
 
@@ -156,8 +153,10 @@ module Ringleader
156
153
  socket = TCPSocket.new config.host, config.app_port
157
154
  socket.close
158
155
  true
159
- rescue Errno::ECONNREFUSED
156
+ rescue Errno::ECONNREFUSED, Errno::ETIMEDOUT
160
157
  false
158
+ rescue IOError, SystemCallError => e
159
+ error "unexpected error when checking status: #{e}"
161
160
  end
162
161
 
163
162
  # Internal: proxy output streams to the logger.
@@ -1,6 +1,5 @@
1
1
  module Ringleader
2
2
  class Server < Reel::Server
3
- include Celluloid::IO # hurk
4
3
  include Celluloid::Logger
5
4
 
6
5
  ASSET_PATH = Pathname.new(File.expand_path("../../../assets", __FILE__))
@@ -15,11 +14,11 @@ module Ringleader
15
14
 
16
15
  def on_connection(connection)
17
16
  request = connection.request
18
- route connection, request if request
17
+ route request if request
19
18
  end
20
19
 
21
20
  # thanks to dcell explorer for this code
22
- def route(connection, request)
21
+ def route(request)
23
22
  if request.url == "/"
24
23
  path = "index.html"
25
24
  else
@@ -27,66 +26,68 @@ module Ringleader
27
26
  end
28
27
 
29
28
  if !path or path[".."]
30
- connection.respond :not_found, "Not found"
29
+ request.respond :not_found, "Not found"
31
30
  debug "404 #{path}"
32
31
  return
33
32
  end
34
33
 
35
34
  case request.method
36
- when :get
35
+ when "GET"
37
36
  if path == "apps"
38
- app_index connection
37
+ app_index request
39
38
  elsif path =~ %r(^apps/\w+)
40
- show_app path, request.body, connection
39
+ show_app path, request
41
40
  else
42
- static_file path, connection
41
+ static_file path, request
43
42
  end
44
- when :post
45
- update_app path, request.body, connection
43
+ when "POST"
44
+ update_app path, request
45
+ else
46
+ error "unknown #{request.method} request to #{request.url}"
46
47
  end
47
48
  end
48
49
 
49
- def app_index(connection)
50
+ def app_index(request)
50
51
  json = @controller.apps.map { |app| app_as_json(app) }.to_json
51
- connection.respond :ok, json
52
+ request.respond :ok, json
52
53
  debug "GET /apps: 200"
53
54
  end
54
55
 
55
- def static_file(path, connection)
56
+ def static_file(path, request)
56
57
  filename = ASSET_PATH + path
57
58
  if filename.exist?
58
59
  mime_type = content_type_for filename.extname
59
60
  filename.open("r") do |file|
60
- connection.respond :ok, {"Content-type" => mime_type}, file
61
+ request.respond :ok, {"Content-type" => mime_type}, file
61
62
  end
62
63
  debug "GET #{path}: 200"
63
64
  else
64
- connection.respond :not_found, "Not found"
65
+ request.respond :not_found, "Not found"
65
66
  debug "GET #{path}: 404"
66
67
  end
67
68
  end
68
69
 
69
- def show_app(uri, body, connection)
70
+ def show_app(uri, request)
70
71
  _, name, _ = uri.split("/")
71
72
  app = @controller.app name
72
73
  if app
73
- connection.respond :ok, app_as_json(app).to_json
74
+ request.respond :ok, app_as_json(app).to_json
74
75
  debug "GET #{uri}: 200"
75
76
  else
76
- connection.respond :not_found, "Not found"
77
+ request.respond :not_found, "Not found"
77
78
  debug "GET #{uri}: 404"
78
79
  end
79
80
  end
80
81
 
81
- def update_app(uri, body, connection)
82
+ def update_app(uri, request)
82
83
  _, name, action = uri.split("/")
83
84
  app = @controller.app name
84
85
  if app && ACTIONS.include?(action)
85
86
  app.send action
86
- connection.respond :ok, app_as_json(app).to_json
87
+ request.respond :ok, app_as_json(app).to_json
87
88
  debug "POST #{uri}: 200"
88
89
  else
89
- connection.respond :not_found, "Not found"
90
+ request.respond :not_found, "Not found"
90
91
  debug "POST #{uri}: 404"
91
92
  end
92
93
  end
@@ -1,3 +1,3 @@
1
1
  module Ringleader
2
- VERSION = "1.1.5.pre0"
2
+ VERSION = "1.1.5.pre1"
3
3
  end
@@ -11,9 +11,13 @@ module Ringleader
11
11
  def wait
12
12
  begin
13
13
  TCPSocket.new @host, @port
14
- rescue Errno::ECONNREFUSED
15
- sleep 0.5
14
+ rescue Errno::ECONNREFUSED, Errno::ETIMEDOUT
16
15
  debug "#{@host}:#{@port} not open yet"
16
+ sleep 0.5
17
+ retry
18
+ rescue IOError, SystemCallError => e
19
+ error "unexpected error while waiting for port: #{e}"
20
+ sleep 0.5
17
21
  retry
18
22
  end
19
23
  debug "#{@host}:#{@port} open"
data/lib/ringleader.rb CHANGED
@@ -21,7 +21,6 @@ require "ringleader/name_logger"
21
21
  require "ringleader/wait_for_exit"
22
22
  require "ringleader/wait_for_port"
23
23
  require "ringleader/process"
24
- require "ringleader/socket_proxy"
25
24
  require "ringleader/app"
26
25
  require "ringleader/app_serializer"
27
26
  require "ringleader/controller"
data/ringleader.gemspec CHANGED
@@ -16,9 +16,9 @@ Gem::Specification.new do |gem|
16
16
  gem.version = Ringleader::VERSION
17
17
  gem.required_ruby_version = "> 1.9.3"
18
18
 
19
- gem.add_dependency "celluloid", "~> 0.12.4"
20
- gem.add_dependency "celluloid-io", "~> 0.12.0"
21
- gem.add_dependency "reel", "~> 0.1.0"
19
+ gem.add_dependency "celluloid", "~> 0.13.0"
20
+ gem.add_dependency "celluloid-io", "~> 0.13.1"
21
+ gem.add_dependency "reel", "~> 0.3.0"
22
22
  gem.add_dependency "trollop", "~> 1.16.2"
23
23
  gem.add_dependency "rainbow", "~> 1.1.4"
24
24
  gem.add_dependency "color", "~> 1.4.1"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ringleader
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.5.pre0
4
+ version: 1.1.5.pre1
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-03 00:00:00.000000000 Z
12
+ date: 2013-04-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: celluloid
@@ -18,7 +18,7 @@ dependencies:
18
18
  requirements:
19
19
  - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: 0.12.4
21
+ version: 0.13.0
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
- version: 0.12.4
29
+ version: 0.13.0
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: celluloid-io
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -34,7 +34,7 @@ dependencies:
34
34
  requirements:
35
35
  - - ~>
36
36
  - !ruby/object:Gem::Version
37
- version: 0.12.0
37
+ version: 0.13.1
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -42,7 +42,7 @@ dependencies:
42
42
  requirements:
43
43
  - - ~>
44
44
  - !ruby/object:Gem::Version
45
- version: 0.12.0
45
+ version: 0.13.1
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: reel
48
48
  requirement: !ruby/object:Gem::Requirement
@@ -50,7 +50,7 @@ dependencies:
50
50
  requirements:
51
51
  - - ~>
52
52
  - !ruby/object:Gem::Version
53
- version: 0.1.0
53
+ version: 0.3.0
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
@@ -58,7 +58,7 @@ dependencies:
58
58
  requirements:
59
59
  - - ~>
60
60
  - !ruby/object:Gem::Version
61
- version: 0.1.0
61
+ version: 0.3.0
62
62
  - !ruby/object:Gem::Dependency
63
63
  name: trollop
64
64
  requirement: !ruby/object:Gem::Requirement
@@ -181,6 +181,7 @@ extra_rdoc_files: []
181
181
  files:
182
182
  - .gitignore
183
183
  - .rspec
184
+ - .ruby-version
184
185
  - .rvmrc
185
186
  - CHANGES.md
186
187
  - Gemfile
@@ -226,7 +227,6 @@ files:
226
227
  - lib/ringleader/name_logger.rb
227
228
  - lib/ringleader/process.rb
228
229
  - lib/ringleader/server.rb
229
- - lib/ringleader/socket_proxy.rb
230
230
  - lib/ringleader/version.rb
231
231
  - lib/ringleader/wait_for_exit.rb
232
232
  - lib/ringleader/wait_for_port.rb
@@ -1,42 +0,0 @@
1
- module Ringleader
2
-
3
- # Proxies data to and from a server socket to a new downstream connection.
4
- #
5
- # This is fire-and-forget: create the SocketProxy and off it goes.
6
- #
7
- # Closes the server connection when proxying is complete and terminates the
8
- # actor.
9
- class SocketProxy
10
- include Celluloid::IO
11
- include Celluloid::Logger
12
-
13
- def initialize(upstream, host, port)
14
- @upstream = upstream
15
-
16
- debug "proxying to #{host}:#{port}"
17
- @socket = TCPSocket.new(host, port)
18
-
19
- async.proxy @socket, @upstream
20
- async.proxy @upstream, @socket
21
-
22
- rescue Errno::ECONNREFUSED
23
- error "could not proxy to #{host}:#{port}"
24
- @upstream.close
25
- terminate
26
- end
27
-
28
- def proxy(from, to)
29
- ::IO.copy_stream from, to
30
- rescue EOFError
31
- # from or to were closed
32
- rescue IOError, SystemCallError => e
33
- # something else went wrong, like a connection reset or timeout: log it
34
- error e
35
- ensure
36
- from.close unless from.closed?
37
- to.close unless to.closed?
38
- terminate
39
- end
40
- end
41
-
42
- end