envoy-proxy 0.0.16 → 0.0.17
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.
- checksums.yaml +4 -4
- data/README.md +34 -0
- data/lib/envoy/client/channel.rb +49 -2
- data/lib/envoy/client/command.rb +29 -52
- data/lib/envoy/client/option_parser.rb +59 -0
- data/lib/envoy/client/trunk.rb +6 -2
- data/lib/envoy/server/channel.rb +1 -0
- data/lib/envoy/server/web.rb +12 -4
- data/lib/envoy/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c6a64248f11bee0dcc828dfd58f77809175820a
|
4
|
+
data.tar.gz: 67ec9e035d118f7d0b80ef6ddecc9da019b72597
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 395ebb8755c9fafc317e17778b3d45b467f654af150dc98f1fb317a55f7acb4ca426efa63e6118abcdec33486137983ae5623fbf33eec867aa3f237274f1c5dc
|
7
|
+
data.tar.gz: 8cd6ed01cc0b23a387aa765914721db7116b5f72f773e907041745d21aeabcf6174ac8ffcda6c22d2be3c92b1246398ab2db0441d5386f2b272ea8c260812f0d
|
data/README.md
CHANGED
@@ -29,3 +29,37 @@ specified host and port, which default to 0.0.0.0 and 8080.
|
|
29
29
|
If KEY is specified, clients _must_ specify that key.
|
30
30
|
|
31
31
|
The ZONE specifies the domain name suffix.
|
32
|
+
|
33
|
+
## Advanced Client Configuration
|
34
|
+
|
35
|
+
The client will search up from the current directory for a .envoy file. If it
|
36
|
+
exists, it must be a YAML file containing either one hash of command line
|
37
|
+
options, or an array of multiple options. This file can also contain settings
|
38
|
+
which will execute a command if a local connection is refused.
|
39
|
+
|
40
|
+
| Option | Description | Default |
|
41
|
+
| ------------- | ----------------------- | - |
|
42
|
+
| `host` | The domain name prefix | None |
|
43
|
+
| `local_port` | The local port to use | None |
|
44
|
+
| `local_host` | The local host to use | 127.0.0.1 |
|
45
|
+
| `server_host` | The server host to use | p45.eu |
|
46
|
+
| `server_port` | The server port to use | 8282 |
|
47
|
+
| `tls` | Use TLS in the server connections | false |
|
48
|
+
| `verbose` | Be noisy | false |
|
49
|
+
| `command` | A command to run if a local connection is refused | None |
|
50
|
+
| `command_delay` | Number of seconds to wait before reconnecting, after starting a command | 1 |
|
51
|
+
| `dir` | A directory to change to | . |
|
52
|
+
|
53
|
+
If no host is specified, a random one is selected by the server.
|
54
|
+
If no local port is specified, a random one is selected by the client.
|
55
|
+
The command is processed for % substitions against the configuration hash,
|
56
|
+
including any randomly selected local port.
|
57
|
+
|
58
|
+
e.g. To start a rails app, you might use this configuration:
|
59
|
+
|
60
|
+
host: my_app
|
61
|
+
dir: ~/apps/my_app
|
62
|
+
command: rails s -p %{local_port}
|
63
|
+
|
64
|
+
You can still specify a constant local port, if you prefer that.
|
65
|
+
|
data/lib/envoy/client/channel.rb
CHANGED
@@ -1,20 +1,65 @@
|
|
1
1
|
|
2
2
|
module Envoy
|
3
|
+
|
3
4
|
module Client
|
4
5
|
|
5
6
|
module Channel
|
6
7
|
|
7
8
|
def initialize id, client
|
8
9
|
@id, @client = id, client
|
10
|
+
@buffer = ""
|
9
11
|
super()
|
10
12
|
end
|
11
13
|
|
14
|
+
def connection_completed
|
15
|
+
send_data @buffer, true
|
16
|
+
@buffer = nil
|
17
|
+
end
|
18
|
+
|
19
|
+
def send_data data, force = false
|
20
|
+
if !@buffer or force
|
21
|
+
super data
|
22
|
+
else
|
23
|
+
@buffer << data
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
12
27
|
def receive_data data
|
13
28
|
@client.send_object :stream, @id, data
|
14
29
|
end
|
15
30
|
|
16
|
-
def
|
17
|
-
@client.
|
31
|
+
def reconnect
|
32
|
+
super @client.options[:local_host], @client.options[:local_port]
|
33
|
+
end
|
34
|
+
|
35
|
+
def unbind e
|
36
|
+
if e == Errno::ECONNREFUSED
|
37
|
+
if @tried_starting
|
38
|
+
@client.log "Service isn't running, but starting it didn't really work out."
|
39
|
+
@client.send_object :close, @id, 502
|
40
|
+
elsif cmd = @client.options[:command]
|
41
|
+
cmd = cmd % @client.options
|
42
|
+
@client.log "Service doesn't seem to be running. Trying to start it now..."
|
43
|
+
@tried_starting = true
|
44
|
+
Dir.chdir File.expand_path(@client.options[:dir]) do
|
45
|
+
fork do
|
46
|
+
#Process.daemon(true, false)
|
47
|
+
ENV.delete("GEM_HOME")
|
48
|
+
ENV.delete("GEM_PATH")
|
49
|
+
ENV.delete("BUNDLE_BIN_PATH")
|
50
|
+
ENV.delete("BUNDLE_GEMFILE")
|
51
|
+
system cmd
|
52
|
+
end
|
53
|
+
end
|
54
|
+
EM.add_timer @client.options[:delay] do
|
55
|
+
reconnect
|
56
|
+
end
|
57
|
+
end
|
58
|
+
elsif e
|
59
|
+
@client.log e.inspect
|
60
|
+
else
|
61
|
+
@client.send_object :close, @id
|
62
|
+
end
|
18
63
|
end
|
19
64
|
|
20
65
|
end
|
@@ -31,4 +76,6 @@ module Envoy
|
|
31
76
|
end
|
32
77
|
|
33
78
|
end
|
79
|
+
|
34
80
|
end
|
81
|
+
|
data/lib/envoy/client/command.rb
CHANGED
@@ -1,61 +1,38 @@
|
|
1
1
|
require 'envoy/client/trunk'
|
2
|
+
require 'envoy/client/option_parser'
|
2
3
|
require 'envoy/version'
|
4
|
+
require 'yaml'
|
3
5
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
}
|
6
|
+
def find_config
|
7
|
+
dirs = Dir.pwd.split("/")
|
8
|
+
r = dirs.reduce([]) do |m, x|
|
9
|
+
[[*m[0], x], *m]
|
10
|
+
end.map do |p|
|
11
|
+
p.join("/") + "/.envoy"
|
12
|
+
end.each do |p|
|
13
|
+
return p if File.exist?(p)
|
14
|
+
end
|
15
|
+
false
|
16
|
+
end
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
options[:hosts] ||= []
|
21
|
-
options[:hosts] << v
|
22
|
-
end
|
23
|
-
op.on "-k", "--key KEY" do |v|
|
24
|
-
options[:key] = v
|
25
|
-
end
|
26
|
-
op.on "-t", "--[no-]tls", "Encrypt communications with the envoy server" do |v|
|
27
|
-
options[:tls] = v
|
28
|
-
end
|
29
|
-
op.on "-s", "--server SERVER", "Specify envoy/proxylocal server" do |v|
|
30
|
-
host, port = v.split(":")
|
31
|
-
options[:server_host] = host
|
32
|
-
options[:server_port] ||= port
|
33
|
-
end
|
34
|
-
op.on "-v", "--[no-]verbose", "Be noisy about what's happening" do |v|
|
35
|
-
options[:verbose] = v
|
36
|
-
end
|
37
|
-
op.on "-h", "--help", "Show this message" do
|
38
|
-
puts op
|
39
|
-
exit
|
40
|
-
end
|
41
|
-
op.on "--version" do
|
42
|
-
puts Envoy::VERSION
|
43
|
-
exit
|
44
|
-
end
|
45
|
-
op.parse!
|
46
|
-
case ARGV[0]
|
47
|
-
when /^(\d+)$/
|
48
|
-
options[:local_port] = $1
|
49
|
-
when /^(\[[^\]+]\]|[^:]+):(\d+)$/x
|
50
|
-
options[:local_host] = $1
|
51
|
-
options[:local_port] = $2
|
52
|
-
when /^(.*)$/
|
53
|
-
options[:local_host] = $1
|
54
|
-
end
|
18
|
+
def load_config
|
19
|
+
conf = YAML.load(File.read(find_config))
|
20
|
+
conf.is_a?(Array) ? conf : [conf]
|
55
21
|
end
|
56
22
|
|
23
|
+
options = parse_options
|
24
|
+
|
57
25
|
unless EM.reactor_running?
|
58
26
|
EM.run do
|
59
|
-
|
27
|
+
load_config.each do |config|
|
28
|
+
config["local_port"] ||= rand(16383) + 49152
|
29
|
+
config = options.merge(config)
|
30
|
+
config["hosts"] ||= [config.delete("host")]
|
31
|
+
config = config.each_with_object({}) do |(k, v), h|
|
32
|
+
h[k.to_sym] = v
|
33
|
+
end
|
34
|
+
Envoy::Client::Trunk.start p config
|
35
|
+
end
|
60
36
|
end
|
61
|
-
end
|
37
|
+
end
|
38
|
+
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
3
|
+
def default_options
|
4
|
+
{
|
5
|
+
"server_host" => 'p45.eu',
|
6
|
+
"server_port" => "8282",
|
7
|
+
"local_host" => '127.0.0.1',
|
8
|
+
"tls" => false,
|
9
|
+
"verbose" => false,
|
10
|
+
"version" => Envoy::VERSION,
|
11
|
+
"command_delay" => 1,
|
12
|
+
"dir" => "."
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
def parse_options
|
17
|
+
options = default_options
|
18
|
+
OptionParser.new do |op|
|
19
|
+
op.banner = "Usage: #{$0} [options] [[HOST:]PORT]"
|
20
|
+
op.on "--host HOST", "Allocate this domain label on the proxy" do |v|
|
21
|
+
options["hosts"] ||= []
|
22
|
+
options["hosts"] << v
|
23
|
+
end
|
24
|
+
op.on "-k", "--key KEY" do |v|
|
25
|
+
options["key"] = v
|
26
|
+
end
|
27
|
+
op.on "-t", "--[no-]tls", "Encrypt communications with the envoy server" do |v|
|
28
|
+
options["tls"] = v
|
29
|
+
end
|
30
|
+
op.on "-s", "--server SERVER", "Specify envoy/proxylocal server" do |v|
|
31
|
+
host, port = v.split(":")
|
32
|
+
options["server_host"] = host
|
33
|
+
options["server_port"] ||= port
|
34
|
+
end
|
35
|
+
op.on "-v", "--[no-]verbose", "Be noisy about what's happening" do |v|
|
36
|
+
options["verbose"] = v
|
37
|
+
end
|
38
|
+
op.on "-h", "--help", "Show this message" do
|
39
|
+
puts op
|
40
|
+
exit
|
41
|
+
end
|
42
|
+
op.on "--version" do
|
43
|
+
puts Envoy::VERSION
|
44
|
+
exit
|
45
|
+
end
|
46
|
+
op.parse!
|
47
|
+
case ARGV[0]
|
48
|
+
when /^(\d+)$/
|
49
|
+
options["local_port"] = $1
|
50
|
+
when /^(\[[^\]+]\]|[^:]+):(\d+)$/x
|
51
|
+
options["local_host"] = $1
|
52
|
+
options["local_port"] = $2
|
53
|
+
when /^(.*)$/
|
54
|
+
options["local_host"] = $1
|
55
|
+
end
|
56
|
+
end
|
57
|
+
options
|
58
|
+
end
|
59
|
+
|
data/lib/envoy/client/trunk.rb
CHANGED
@@ -42,11 +42,15 @@ module Envoy
|
|
42
42
|
def receive_keepalive
|
43
43
|
end
|
44
44
|
|
45
|
-
def
|
45
|
+
def log message
|
46
46
|
t = Time.now.strftime("%F %T")
|
47
47
|
STDERR.puts t + " " + message.split("\n").join("\n#{t.gsub(/./, ' ')} ")
|
48
48
|
end
|
49
49
|
|
50
|
+
def receive_message message
|
51
|
+
log message
|
52
|
+
end
|
53
|
+
|
50
54
|
def receive_halt
|
51
55
|
@halting = true
|
52
56
|
EventMachine.stop_event_loop
|
@@ -84,4 +88,4 @@ module Envoy
|
|
84
88
|
end
|
85
89
|
|
86
90
|
end
|
87
|
-
end
|
91
|
+
end
|
data/lib/envoy/server/channel.rb
CHANGED
data/lib/envoy/server/web.rb
CHANGED
@@ -11,7 +11,18 @@ module Envoy
|
|
11
11
|
@connection = "close"
|
12
12
|
end
|
13
13
|
|
14
|
+
def send_page status, message
|
15
|
+
send_data "HTTP/1.0 #{status} Message\r\n"
|
16
|
+
send_data "Content-Type: text/plain\r\n"
|
17
|
+
send_data "\r\n"
|
18
|
+
send_data "#{message}\r\n"
|
19
|
+
end
|
20
|
+
|
14
21
|
def close code
|
22
|
+
case code
|
23
|
+
when 502
|
24
|
+
send_page code, "The service isn't running, and couldn't be started."
|
25
|
+
end
|
15
26
|
close_connection(true)
|
16
27
|
end
|
17
28
|
|
@@ -42,10 +53,7 @@ module Envoy
|
|
42
53
|
@header << line + "\r\n"
|
43
54
|
end
|
44
55
|
rescue RuntimeError => e
|
45
|
-
|
46
|
-
send_data "Content-Type: text/plain\r\n"
|
47
|
-
send_data "\r\n"
|
48
|
-
send_data "#{e.message}\r\n"
|
56
|
+
send_page 500, e.inspect
|
49
57
|
close_connection true
|
50
58
|
end
|
51
59
|
|
data/lib/envoy/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: envoy-proxy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Baum
|
@@ -85,6 +85,7 @@ files:
|
|
85
85
|
- envoy-proxy.gemspec
|
86
86
|
- lib/envoy/client/channel.rb
|
87
87
|
- lib/envoy/client/command.rb
|
88
|
+
- lib/envoy/client/option_parser.rb
|
88
89
|
- lib/envoy/client/trunk.rb
|
89
90
|
- lib/envoy/protocol.rb
|
90
91
|
- lib/envoy/server/channel.rb
|