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 +1 -0
- data/lib/ringleader/app.rb +32 -6
- data/lib/ringleader/controller.rb +1 -1
- data/lib/ringleader/process.rb +3 -4
- data/lib/ringleader/server.rb +22 -21
- data/lib/ringleader/version.rb +1 -1
- data/lib/ringleader/wait_for_port.rb +6 -2
- data/lib/ringleader.rb +0 -1
- data/ringleader.gemspec +3 -3
- metadata +9 -9
- data/lib/ringleader/socket_proxy.rb +0 -42
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.9.3-p392
|
data/lib/ringleader/app.rb
CHANGED
@@ -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
|
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(
|
96
|
-
|
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
|
data/lib/ringleader/process.rb
CHANGED
@@ -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.
|
data/lib/ringleader/server.rb
CHANGED
@@ -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
|
17
|
+
route request if request
|
19
18
|
end
|
20
19
|
|
21
20
|
# thanks to dcell explorer for this code
|
22
|
-
def route(
|
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
|
-
|
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
|
35
|
+
when "GET"
|
37
36
|
if path == "apps"
|
38
|
-
app_index
|
37
|
+
app_index request
|
39
38
|
elsif path =~ %r(^apps/\w+)
|
40
|
-
show_app path, request
|
39
|
+
show_app path, request
|
41
40
|
else
|
42
|
-
static_file path,
|
41
|
+
static_file path, request
|
43
42
|
end
|
44
|
-
when
|
45
|
-
update_app path, request
|
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(
|
50
|
+
def app_index(request)
|
50
51
|
json = @controller.apps.map { |app| app_as_json(app) }.to_json
|
51
|
-
|
52
|
+
request.respond :ok, json
|
52
53
|
debug "GET /apps: 200"
|
53
54
|
end
|
54
55
|
|
55
|
-
def static_file(path,
|
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
|
-
|
61
|
+
request.respond :ok, {"Content-type" => mime_type}, file
|
61
62
|
end
|
62
63
|
debug "GET #{path}: 200"
|
63
64
|
else
|
64
|
-
|
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,
|
70
|
+
def show_app(uri, request)
|
70
71
|
_, name, _ = uri.split("/")
|
71
72
|
app = @controller.app name
|
72
73
|
if app
|
73
|
-
|
74
|
+
request.respond :ok, app_as_json(app).to_json
|
74
75
|
debug "GET #{uri}: 200"
|
75
76
|
else
|
76
|
-
|
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,
|
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
|
-
|
87
|
+
request.respond :ok, app_as_json(app).to_json
|
87
88
|
debug "POST #{uri}: 200"
|
88
89
|
else
|
89
|
-
|
90
|
+
request.respond :not_found, "Not found"
|
90
91
|
debug "POST #{uri}: 404"
|
91
92
|
end
|
92
93
|
end
|
data/lib/ringleader/version.rb
CHANGED
@@ -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.
|
20
|
-
gem.add_dependency "celluloid-io", "~> 0.
|
21
|
-
gem.add_dependency "reel", "~> 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.
|
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-
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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
|