ringleader 1.1.5.pre0 → 1.1.5.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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