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 +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
|