invoker 1.2.0.pre1 → 1.2.0.pre2
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/Gemfile +1 -1
- data/invoker.gemspec +1 -0
- data/lib/invoker.rb +23 -9
- data/lib/invoker/daemon.rb +2 -2
- data/lib/invoker/power/balancer.rb +17 -55
- data/lib/invoker/power/config.rb +14 -8
- data/lib/invoker/power/http_parser.rb +68 -0
- data/lib/invoker/power/setup.rb +1 -1
- data/lib/invoker/power/setup/distro/base.rb +41 -0
- data/lib/invoker/power/setup/distro/redhat.rb +17 -0
- data/lib/invoker/power/setup/distro/ubuntu.rb +11 -0
- data/lib/invoker/power/setup/linux_setup.rb +11 -13
- data/lib/invoker/version.rb +1 -1
- data/spec/invoker/config_spec.rb +1 -1
- data/spec/invoker/invoker_spec.rb +7 -1
- data/spec/invoker/power/config_spec.rb +8 -15
- data/spec/invoker/power/http_parser_spec.rb +32 -0
- data/spec/invoker/power/setup/linux_setup_spec.rb +17 -6
- data/spec/invoker/power/setup/osx_setup_spec.rb +1 -1
- data/spec/support/mock_setup_file.rb +12 -16
- metadata +48 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0522d780189e4589e2b918f4b3618ca6b84b0759
|
4
|
+
data.tar.gz: fd335e383fde399c6970a287c07d5b24ca5a7f6e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc0847a296deb3db14ac14342a3c7acdd42bd1642954aff5807333bf71699793d29d488f89477df843a12fb451af4e6dc4b379b02926b70dd050c4bfaf8680c1
|
7
|
+
data.tar.gz: 2a24694f1ebf7262478a376b7b23a4fcdf3386cfbf55101e0380299e34414ed8805e993f3f4bb45c0b2e429890922907f55d65c38c735417eede8336e8fb5436
|
data/Gemfile
CHANGED
data/invoker.gemspec
CHANGED
@@ -33,6 +33,7 @@ Gem::Specification.new do |s|
|
|
33
33
|
s.add_dependency("em-proxy", "~> 0.1")
|
34
34
|
s.add_dependency("rubydns", "~> 0.7")
|
35
35
|
s.add_dependency("uuid", "~> 2.3")
|
36
|
+
s.add_dependency("facter", "~> 2.0")
|
36
37
|
s.add_dependency("http-parser-lite", "~> 0.6")
|
37
38
|
s.add_dependency("dotenv", "~> 0.9")
|
38
39
|
s.add_development_dependency("rspec")
|
data/lib/invoker.rb
CHANGED
@@ -8,6 +8,7 @@ require "uuid"
|
|
8
8
|
require "json"
|
9
9
|
require "rainbow"
|
10
10
|
require "rainbow/ext/string"
|
11
|
+
require "etc"
|
11
12
|
|
12
13
|
require "invoker/version"
|
13
14
|
require "invoker/logger"
|
@@ -64,7 +65,7 @@ module Invoker
|
|
64
65
|
end
|
65
66
|
|
66
67
|
def can_run_balancer?(throw_warning = true)
|
67
|
-
return true if File.exist?(Invoker::Power::Config
|
68
|
+
return true if File.exist?(Invoker::Power::Config.config_file)
|
68
69
|
|
69
70
|
if throw_warning
|
70
71
|
Invoker::Logger.puts("Invoker has detected setup has not been run. Domain feature will not work without running setup command.".color(:red))
|
@@ -73,18 +74,18 @@ module Invoker
|
|
73
74
|
end
|
74
75
|
|
75
76
|
def setup_config_location
|
76
|
-
|
77
|
-
return
|
77
|
+
config_dir = Invoker::Power::Config.config_dir
|
78
|
+
return config_dir if Dir.exist?(config_dir)
|
78
79
|
|
79
|
-
if File.exist?(
|
80
|
-
old_config = File.read(
|
81
|
-
FileUtils.rm_f(
|
80
|
+
if File.exist?(config_dir)
|
81
|
+
old_config = File.read(config_dir)
|
82
|
+
FileUtils.rm_f(config_dir)
|
82
83
|
end
|
83
84
|
|
84
|
-
FileUtils.mkdir(
|
85
|
+
FileUtils.mkdir(config_dir)
|
85
86
|
|
86
|
-
migrate_old_config(old_config,
|
87
|
-
|
87
|
+
migrate_old_config(old_config, config_dir) if old_config
|
88
|
+
config_dir
|
88
89
|
end
|
89
90
|
|
90
91
|
def run_without_bundler
|
@@ -116,5 +117,18 @@ module Invoker
|
|
116
117
|
file.write(old_config)
|
117
118
|
end
|
118
119
|
end
|
120
|
+
|
121
|
+
# On some platforms `Dir.home` or `ENV['HOME']` does not return home directory of user.
|
122
|
+
# this is especially true, after effective and real user id of process
|
123
|
+
# has been changed.
|
124
|
+
#
|
125
|
+
# @return [String] home directory of the user
|
126
|
+
def home
|
127
|
+
if File.writable?(Dir.home)
|
128
|
+
Dir.home
|
129
|
+
else
|
130
|
+
Etc.getpwuid(Process.uid).dir
|
131
|
+
end
|
132
|
+
end
|
119
133
|
end
|
120
134
|
end
|
data/lib/invoker/daemon.rb
CHANGED
@@ -24,7 +24,7 @@ module Invoker
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def pid_file
|
27
|
-
File.join(
|
27
|
+
File.join(Invoker.home, ".invoker", "#{process_name}.pid")
|
28
28
|
end
|
29
29
|
|
30
30
|
def pid
|
@@ -32,7 +32,7 @@ module Invoker
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def log_file
|
35
|
-
File.join(
|
35
|
+
File.join(Invoker.home, ".invoker", "#{process_name}.log")
|
36
36
|
end
|
37
37
|
|
38
38
|
def daemonize
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'em-proxy'
|
2
2
|
require 'http-parser'
|
3
|
+
require "invoker/power/http_parser"
|
3
4
|
|
4
5
|
module Invoker
|
5
6
|
module Power
|
@@ -19,37 +20,6 @@ module Invoker
|
|
19
20
|
end
|
20
21
|
end
|
21
22
|
|
22
|
-
class BalancerParser
|
23
|
-
attr_accessor :host, :parser
|
24
|
-
def initialize
|
25
|
-
@parser = HTTP::Parser.new()
|
26
|
-
@header = {}
|
27
|
-
@parser.on_headers_complete { headers_received() }
|
28
|
-
@parser.on_header_field { |field_name|
|
29
|
-
@last_key = field_name
|
30
|
-
}
|
31
|
-
@parser.on_header_value { |value| header_value_received(value) }
|
32
|
-
end
|
33
|
-
|
34
|
-
def headers_received
|
35
|
-
@header_completion_callback.call(@header)
|
36
|
-
end
|
37
|
-
|
38
|
-
def header_value_received(value)
|
39
|
-
@header[@last_key] = value
|
40
|
-
end
|
41
|
-
|
42
|
-
def on_headers_complete(&block)
|
43
|
-
@header_completion_callback = block
|
44
|
-
end
|
45
|
-
|
46
|
-
def reset; @parser.reset(); end
|
47
|
-
|
48
|
-
def <<(data)
|
49
|
-
@parser << data
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
23
|
class Balancer
|
54
24
|
attr_accessor :connection, :http_parser, :session, :protocol
|
55
25
|
DEV_MATCH_REGEX = /([\w-]+)\.dev(\:\d+)?$/
|
@@ -71,49 +41,42 @@ module Invoker
|
|
71
41
|
def initialize(connection, protocol)
|
72
42
|
@connection = connection
|
73
43
|
@protocol = protocol
|
74
|
-
@http_parser =
|
44
|
+
@http_parser = HttpParser.new(protocol)
|
75
45
|
@session = nil
|
76
46
|
@buffer = []
|
77
47
|
end
|
78
48
|
|
79
|
-
# insert X_FORWARDED_PROTO_ so as rails can identify the request as coming from
|
80
|
-
# https
|
81
|
-
def insert_forwarded_proto_header(data)
|
82
|
-
if data =~ /\r\n\r\n/ && data !~ /X_FORWARDED_PROTO/i && protocol == 'https'
|
83
|
-
data.gsub(/\r\n\r\n/, "\r\nX_FORWARDED_PROTO: #{protocol}\r\n\r\n")
|
84
|
-
else
|
85
|
-
data
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
49
|
def install_callbacks
|
90
|
-
http_parser.on_headers_complete { |
|
50
|
+
http_parser.on_headers_complete { |headers| headers_received(headers) }
|
51
|
+
http_parser.on_message_complete { |full_message| complete_message_received(full_message) }
|
91
52
|
connection.on_data { |data| upstream_data(data) }
|
92
53
|
connection.on_response { |backend, data| backend_data(backend, data) }
|
93
54
|
connection.on_finish { |backend, name| frontend_disconnect(backend, name) }
|
94
55
|
end
|
95
56
|
|
96
|
-
def
|
57
|
+
def complete_message_received(full_message)
|
58
|
+
connection.relay_to_servers(full_message)
|
59
|
+
http_parser.reset
|
60
|
+
end
|
61
|
+
|
62
|
+
def headers_received(headers)
|
63
|
+
if @session
|
64
|
+
return
|
65
|
+
end
|
97
66
|
@session = UUID.generate()
|
98
|
-
dns_check_response = select_backend_config(
|
67
|
+
dns_check_response = select_backend_config(headers['Host'])
|
99
68
|
if dns_check_response && dns_check_response.port
|
100
69
|
connection.server(session, host: '0.0.0.0', port: dns_check_response.port)
|
101
|
-
connection.relay_to_servers(insert_forwarded_proto_header(@buffer.join))
|
102
|
-
@buffer = []
|
103
70
|
else
|
104
71
|
return_error_page(404)
|
72
|
+
http_parser.reset
|
105
73
|
connection.close_connection_after_writing
|
106
74
|
end
|
107
75
|
end
|
108
76
|
|
109
77
|
def upstream_data(data)
|
110
|
-
|
111
|
-
|
112
|
-
append_for_http_parsing(data)
|
113
|
-
nil
|
114
|
-
else
|
115
|
-
insert_forwarded_proto_header(data)
|
116
|
-
end
|
78
|
+
append_for_http_parsing(data)
|
79
|
+
nil
|
117
80
|
end
|
118
81
|
|
119
82
|
def append_for_http_parsing(data)
|
@@ -131,7 +94,6 @@ module Invoker
|
|
131
94
|
def frontend_disconnect(backend, name)
|
132
95
|
http_parser.reset
|
133
96
|
unless @backend_data
|
134
|
-
Invoker::Logger.puts("\nApplication #{name} not running. Returning error page.".color(:red))
|
135
97
|
return_error_page(503)
|
136
98
|
end
|
137
99
|
@backend_data = false
|
data/lib/invoker/power/config.rb
CHANGED
@@ -6,32 +6,38 @@ module Invoker
|
|
6
6
|
class ConfigExists < StandardError; end
|
7
7
|
|
8
8
|
class Config
|
9
|
-
CONFIG_LOCATION = File.join(Dir.home, ".invoker", "config")
|
10
|
-
|
11
9
|
def self.has_config?
|
12
|
-
File.exist?(
|
10
|
+
File.exist?(config_file)
|
13
11
|
end
|
14
12
|
|
15
13
|
def self.create(options = {})
|
16
14
|
if has_config?
|
17
|
-
raise ConfigExists, "Config file already exists at location #{
|
15
|
+
raise ConfigExists, "Config file already exists at location #{config_file}"
|
18
16
|
end
|
19
17
|
config = new(options)
|
20
18
|
config.save
|
21
19
|
end
|
22
20
|
|
23
21
|
def self.delete
|
24
|
-
if File.exist?(
|
25
|
-
File.delete(
|
22
|
+
if File.exist?(config_file)
|
23
|
+
File.delete(config_file)
|
26
24
|
end
|
27
25
|
end
|
28
26
|
|
27
|
+
def self.config_file
|
28
|
+
File.join(Invoker.home, ".invoker", "config")
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.config_dir
|
32
|
+
File.join(Invoker.home, ".invoker")
|
33
|
+
end
|
34
|
+
|
29
35
|
def initialize(options = {})
|
30
36
|
@config = options
|
31
37
|
end
|
32
38
|
|
33
39
|
def self.load_config
|
34
|
-
config_hash = File.open(
|
40
|
+
config_hash = File.open(config_file, "r") { |fl| YAML.load(fl) }
|
35
41
|
new(config_hash)
|
36
42
|
end
|
37
43
|
|
@@ -60,7 +66,7 @@ module Invoker
|
|
60
66
|
end
|
61
67
|
|
62
68
|
def save
|
63
|
-
File.open(
|
69
|
+
File.open(self.class.config_file, "w") do |fl|
|
64
70
|
YAML.dump(@config, fl)
|
65
71
|
end
|
66
72
|
self
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module Invoker
|
2
|
+
module Power
|
3
|
+
class HttpParser
|
4
|
+
attr_accessor :host, :parser, :protocol
|
5
|
+
|
6
|
+
def initialize(protocol)
|
7
|
+
@protocol = protocol
|
8
|
+
@parser = HTTP::Parser.new
|
9
|
+
@header = {}
|
10
|
+
initialize_message_content
|
11
|
+
parser.on_headers_complete { complete_headers_received }
|
12
|
+
parser.on_header_field { |field_name| @last_key = field_name }
|
13
|
+
parser.on_header_value { |field_value| header_value_received(field_value) }
|
14
|
+
|
15
|
+
parser.on_message_complete { complete_message_received }
|
16
|
+
end
|
17
|
+
|
18
|
+
# define a callback for invoking when complete header is parsed
|
19
|
+
def on_headers_complete(&block)
|
20
|
+
@on_headers_complete_callback = block
|
21
|
+
end
|
22
|
+
|
23
|
+
def header_value_received(value)
|
24
|
+
@header[@last_key] = value
|
25
|
+
end
|
26
|
+
|
27
|
+
# define a callback to invoke when a full http message is received
|
28
|
+
def on_message_complete(&block)
|
29
|
+
@on_message_complete_callback = block
|
30
|
+
end
|
31
|
+
|
32
|
+
def reset
|
33
|
+
@header = {}
|
34
|
+
initialize_message_content
|
35
|
+
parser.reset
|
36
|
+
end
|
37
|
+
|
38
|
+
def << data
|
39
|
+
@full_message.write(data)
|
40
|
+
parser << data
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def complete_message_received
|
46
|
+
full_message_string = @full_message.string.dup
|
47
|
+
if full_message_string =~ /\r\n\r\n/
|
48
|
+
full_message_string.sub!(/\r\n\r\n/, "\r\nX_FORWARDED_PROTO: #{protocol}\r\n\r\n")
|
49
|
+
end
|
50
|
+
if @on_message_complete_callback
|
51
|
+
@on_message_complete_callback.call(full_message_string)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def initialize_message_content
|
56
|
+
@full_message = StringIO.new
|
57
|
+
@full_message.set_encoding('ASCII-8BIT')
|
58
|
+
end
|
59
|
+
|
60
|
+
# gets invoker when complete header is received
|
61
|
+
def complete_headers_received
|
62
|
+
if @on_headers_complete_callback
|
63
|
+
@on_headers_complete_callback.call(@header)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/lib/invoker/power/setup.rb
CHANGED
@@ -0,0 +1,41 @@
|
|
1
|
+
module Invoker
|
2
|
+
module Power
|
3
|
+
module Distro
|
4
|
+
class Base
|
5
|
+
RESOLVER_FILE = "/etc/dnsmasq.d/dev-tld"
|
6
|
+
RINETD_FILE = "/etc/rinetd.conf"
|
7
|
+
|
8
|
+
def self.distro_installer
|
9
|
+
case Facter[:operatingsystem].value
|
10
|
+
when "Ubuntu"
|
11
|
+
require "invoker/power/setup/distro/ubuntu"
|
12
|
+
Ubuntu.new
|
13
|
+
when "Fedora"
|
14
|
+
require "invoker/power/setup/distro/redhat"
|
15
|
+
Redhat.new
|
16
|
+
else
|
17
|
+
raise "Your selected distro is not supported by Invoker"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def resolver_file
|
22
|
+
RESOLVER_FILE
|
23
|
+
end
|
24
|
+
|
25
|
+
def rinetd_file
|
26
|
+
RINETD_FILE
|
27
|
+
end
|
28
|
+
|
29
|
+
# Install required software
|
30
|
+
def install_required_software
|
31
|
+
raise "Unimplemented"
|
32
|
+
end
|
33
|
+
|
34
|
+
def restart_services
|
35
|
+
system("service rinetd restart")
|
36
|
+
system("service dnsmasq restart")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Invoker
|
2
|
+
module Power
|
3
|
+
module Distro
|
4
|
+
class Redhat < Base
|
5
|
+
def install_required_software
|
6
|
+
system("yum --assumeyes install dnsmasq rinetd")
|
7
|
+
end
|
8
|
+
|
9
|
+
def restart_services
|
10
|
+
system("systemctl enable rinetd")
|
11
|
+
system("service rinetd restart")
|
12
|
+
system("service dnsmasq restart")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,16 +1,19 @@
|
|
1
|
+
require "invoker/power/setup/distro/base"
|
2
|
+
require "facter"
|
3
|
+
|
1
4
|
module Invoker
|
2
5
|
module Power
|
3
6
|
class LinuxSetup < Setup
|
4
|
-
|
5
|
-
RINETD_FILE = "/etc/rinetd.conf"
|
7
|
+
attr_accessor :distro_installer
|
6
8
|
|
7
9
|
def setup_invoker
|
8
10
|
if get_user_confirmation?
|
11
|
+
initialize_distro_installer
|
9
12
|
find_open_ports
|
10
|
-
install_required_software
|
13
|
+
distro_installer.install_required_software
|
11
14
|
install_resolver
|
12
15
|
install_port_forwarder
|
13
|
-
restart_services
|
16
|
+
distro_installer.restart_services
|
14
17
|
drop_to_normal_user
|
15
18
|
create_config_file
|
16
19
|
else
|
@@ -34,23 +37,18 @@ module Invoker
|
|
34
37
|
|
35
38
|
private
|
36
39
|
|
37
|
-
def
|
38
|
-
|
39
|
-
system("/etc/init.d/dnsmasq restart")
|
40
|
-
end
|
41
|
-
|
42
|
-
def install_required_software
|
43
|
-
system("apt-get --assume-yes install dnsmasq rinetd")
|
40
|
+
def initialize_distro_installer
|
41
|
+
@distro_installer = Invoker::Power::Distro::Base.distro_installer
|
44
42
|
end
|
45
43
|
|
46
44
|
def install_resolver
|
47
|
-
File.open(
|
45
|
+
File.open(distro_installer.resolver_file, "w") do |fl|
|
48
46
|
fl.write(tld_setup)
|
49
47
|
end
|
50
48
|
end
|
51
49
|
|
52
50
|
def install_port_forwarder
|
53
|
-
File.open(
|
51
|
+
File.open(distro_installer.rinetd_file, "a") do |fl|
|
54
52
|
fl << "\n"
|
55
53
|
fl << rinetd_setup(port_finder.http_port, port_finder.https_port)
|
56
54
|
end
|
data/lib/invoker/version.rb
CHANGED
data/spec/invoker/config_spec.rb
CHANGED
@@ -114,7 +114,7 @@ command = ls
|
|
114
114
|
end
|
115
115
|
|
116
116
|
it "loads config if platform is darwin and power config file exists" do
|
117
|
-
File.open(Invoker::Power::Config
|
117
|
+
File.open(Invoker::Power::Config.config_file, "w") { |fl| fl.puts "sample" }
|
118
118
|
Invoker::Power::Config.expects(:load_config).once
|
119
119
|
Invoker::Parsers::Config.new(@file.path, 9000)
|
120
120
|
end
|
@@ -19,7 +19,7 @@ describe "Invoker" do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
it "should return true if setup was run properly" do
|
22
|
-
File.open(Invoker::Power::Config
|
22
|
+
File.open(Invoker::Power::Config.config_file, "w") {|fl|
|
23
23
|
fl.write("hello")
|
24
24
|
}
|
25
25
|
expect(Invoker.can_run_balancer?).to be_true
|
@@ -61,4 +61,10 @@ describe "Invoker" do
|
|
61
61
|
end
|
62
62
|
end
|
63
63
|
end
|
64
|
+
|
65
|
+
describe "#home" do
|
66
|
+
it "should return home directory using etc module" do
|
67
|
+
expect(Invoker.home).to eql ENV['HOME']
|
68
|
+
end
|
69
|
+
end
|
64
70
|
end
|
@@ -3,22 +3,15 @@ require "spec_helper"
|
|
3
3
|
describe "Invoker Power configuration" do
|
4
4
|
describe "#create" do
|
5
5
|
it "should create a config file given a hash" do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
dns_port: 1200, http_port: 1201, ipfw_rule_number: 010
|
11
|
-
)
|
12
|
-
expect(File.exists?(Invoker::Power::Config::CONFIG_LOCATION)).to be_true
|
6
|
+
config = Invoker::Power::Config.create(
|
7
|
+
dns_port: 1200, http_port: 1201, ipfw_rule_number: 010
|
8
|
+
)
|
9
|
+
expect(File.exist?(Invoker::Power::Config.config_file)).to be_true
|
13
10
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
ensure
|
19
|
-
File.exists?(Invoker::Power::Config::CONFIG_LOCATION) &&
|
20
|
-
File.delete(Invoker::Power::Config::CONFIG_LOCATION)
|
21
|
-
end
|
11
|
+
config = Invoker::Power::Config.load_config()
|
12
|
+
expect(config.dns_port).to eq(1200)
|
13
|
+
expect(config.http_port).to eq(1201)
|
14
|
+
expect(config.ipfw_rule_number).to eq(010)
|
22
15
|
end
|
23
16
|
end
|
24
17
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Invoker::Power::HttpParser do
|
4
|
+
let(:parser) { Invoker::Power::HttpParser.new('https') }
|
5
|
+
|
6
|
+
describe "complete message received" do
|
7
|
+
before { parser.reset }
|
8
|
+
it "should call header received with full header" do
|
9
|
+
@header = nil
|
10
|
+
parser.on_headers_complete { |header| @header = header }
|
11
|
+
parser << "HTTP/1.1 200 OK\r\n"
|
12
|
+
parser << "Content-Type: text/plain;charset=utf-8\r\n"
|
13
|
+
parser << "Content-Length: 5\r\n"
|
14
|
+
parser << "Connection: close\r\n\r\n"
|
15
|
+
parser << "hello"
|
16
|
+
|
17
|
+
expect(@header['Content-Type']).to eql "text/plain;charset=utf-8"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should return complete message with x_forwarded added" do
|
21
|
+
complete_message = nil
|
22
|
+
parser.on_message_complete { |message| complete_message = message }
|
23
|
+
parser.on_headers_complete { |header| @header = header }
|
24
|
+
parser << "HTTP/1.1 200 OK\r\n"
|
25
|
+
parser << "Content-Type: text/plain;charset=utf-8\r\n"
|
26
|
+
parser << "Content-Length: 5\r\n"
|
27
|
+
parser << "Connection: close\r\n\r\n"
|
28
|
+
parser << "hello"
|
29
|
+
expect(complete_message).to match(/X_FORWARDED_PROTO:/i)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -1,16 +1,23 @@
|
|
1
1
|
require "spec_helper"
|
2
|
+
require "invoker/power/setup/distro/ubuntu"
|
2
3
|
|
3
4
|
describe Invoker::Power::LinuxSetup do
|
4
5
|
let(:invoker_setup) { Invoker::Power::LinuxSetup.new }
|
6
|
+
let(:distro_installer) { Invoker::Power::Distro::Ubuntu.new }
|
7
|
+
|
5
8
|
describe "should only proceed after user confirmation" do
|
9
|
+
before { invoker_setup.distro_installer = distro_installer }
|
10
|
+
|
6
11
|
it "should create config file with port" do
|
12
|
+
invoker_setup.expects(:initialize_distro_installer).returns(true)
|
7
13
|
invoker_setup.expects(:get_user_confirmation?).returns(true)
|
8
|
-
invoker_setup.expects(:install_required_software).returns(true)
|
9
14
|
invoker_setup.expects(:install_resolver).returns(true)
|
10
15
|
invoker_setup.expects(:install_port_forwarder).returns(true)
|
11
|
-
invoker_setup.expects(:restart_services).returns(true)
|
12
16
|
invoker_setup.expects(:drop_to_normal_user).returns(true)
|
13
17
|
|
18
|
+
distro_installer.expects(:install_required_software)
|
19
|
+
distro_installer.expects(:restart_services)
|
20
|
+
|
14
21
|
invoker_setup.setup_invoker
|
15
22
|
|
16
23
|
config = Invoker::Power::Config.load_config
|
@@ -21,21 +28,25 @@ describe Invoker::Power::LinuxSetup do
|
|
21
28
|
end
|
22
29
|
|
23
30
|
describe "configuring dnsmasq and rinetd" do
|
31
|
+
before { invoker_setup.distro_installer = distro_installer }
|
32
|
+
|
24
33
|
it "should create proper config file" do
|
34
|
+
invoker_setup.expects(:initialize_distro_installer).returns(true)
|
25
35
|
invoker_setup.expects(:get_user_confirmation?).returns(true)
|
26
|
-
invoker_setup.expects(:install_required_software).returns(true)
|
27
|
-
invoker_setup.expects(:restart_services).returns(true)
|
28
36
|
invoker_setup.expects(:drop_to_normal_user).returns(true)
|
29
37
|
|
38
|
+
distro_installer.expects(:install_required_software)
|
39
|
+
distro_installer.expects(:restart_services)
|
40
|
+
|
30
41
|
invoker_setup.setup_invoker
|
31
42
|
|
32
43
|
config = Invoker::Power::Config.load_config
|
33
44
|
|
34
|
-
dnsmasq_content = File.read(
|
45
|
+
dnsmasq_content = File.read(distro_installer.resolver_file)
|
35
46
|
expect(dnsmasq_content.strip).to_not be_empty
|
36
47
|
expect(dnsmasq_content).to match(/dev/)
|
37
48
|
|
38
|
-
rinetd_content = File.read(
|
49
|
+
rinetd_content = File.read(distro_installer.rinetd_file)
|
39
50
|
expect(rinetd_content.strip).to_not be_empty
|
40
51
|
expect(rinetd_content.strip).to match(/#{config.https_port}/)
|
41
52
|
expect(rinetd_content.strip).to match(/#{config.http_port}/)
|
@@ -20,7 +20,7 @@ describe Invoker::Power::OsxSetup do
|
|
20
20
|
|
21
21
|
describe "when a setup file exists" do
|
22
22
|
it "should throw error about existing file" do
|
23
|
-
File.open(Invoker::Power::Config
|
23
|
+
File.open(Invoker::Power::Config.config_file, "w") {|fl|
|
24
24
|
fl.write("foo test")
|
25
25
|
}
|
26
26
|
Invoker::Power::Setup.any_instance.expects(:setup_invoker).never
|
@@ -23,16 +23,14 @@ module MockSetupFile
|
|
23
23
|
private
|
24
24
|
|
25
25
|
def setup_invoker_config
|
26
|
-
|
27
|
-
Invoker::Power::Config.
|
26
|
+
Invoker::Power::Config.stubs(:config_file).returns("/tmp/.invoker/config")
|
27
|
+
Invoker::Power::Config.stubs(:config_dir).returns("/tmp/.invoker")
|
28
28
|
safe_make_directory("/tmp/.invoker")
|
29
|
-
safe_remove_file(Invoker::Power::Config
|
29
|
+
safe_remove_file(Invoker::Power::Config.config_file)
|
30
30
|
end
|
31
31
|
|
32
32
|
def restore_invoker_config
|
33
|
-
safe_remove_file(Invoker::Power::Config
|
34
|
-
Invoker::Power::Config.const_set(:CONFIG_LOCATION, @old_config)
|
35
|
-
$VERBOSE = @original_verbosity
|
33
|
+
safe_remove_file(Invoker::Power::Config.config_file)
|
36
34
|
end
|
37
35
|
|
38
36
|
def restore_osx_resolver_setup
|
@@ -51,18 +49,16 @@ module MockSetupFile
|
|
51
49
|
end
|
52
50
|
|
53
51
|
def setup_linux_resolver_path
|
54
|
-
@old_linux_resolver = Invoker::Power::
|
55
|
-
@old_rinetd_config = Invoker::Power::
|
56
|
-
Invoker::Power::
|
57
|
-
Invoker::Power::
|
58
|
-
safe_remove_file(Invoker::Power::LinuxSetup::RESOLVER_FILE)
|
59
|
-
safe_remove_file(Invoker::Power::LinuxSetup::RINETD_FILE)
|
52
|
+
@old_linux_resolver = Invoker::Power::Distro::Base::RESOLVER_FILE
|
53
|
+
@old_rinetd_config = Invoker::Power::Distro::Base::RINETD_FILE
|
54
|
+
Invoker::Power::Distro::Base.const_set(:RESOLVER_FILE, "/tmp/dev-tld")
|
55
|
+
Invoker::Power::Distro::Base.const_set(:RINETD_FILE, "/tmp/rinetd.conf")
|
60
56
|
end
|
61
57
|
|
62
58
|
def restore_linux_resolver_path
|
63
|
-
safe_remove_file(Invoker::Power::
|
64
|
-
safe_remove_file(Invoker::Power::
|
65
|
-
Invoker::Power::
|
66
|
-
Invoker::Power::
|
59
|
+
safe_remove_file(Invoker::Power::Distro::Base::RESOLVER_FILE)
|
60
|
+
safe_remove_file(Invoker::Power::Distro::Base::RINETD_FILE)
|
61
|
+
Invoker::Power::Distro::Base.const_set(:RESOLVER_FILE, @old_linux_resolver)
|
62
|
+
Invoker::Power::Distro::Base.const_set(:RINETD_FILE, @old_rinetd_config)
|
67
63
|
end
|
68
64
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: invoker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.0.
|
4
|
+
version: 1.2.0.pre2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hemant Kumar
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-06-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
@@ -123,6 +123,20 @@ dependencies:
|
|
123
123
|
- - "~>"
|
124
124
|
- !ruby/object:Gem::Version
|
125
125
|
version: '2.3'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: facter
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - "~>"
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '2.0'
|
133
|
+
type: :runtime
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - "~>"
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '2.0'
|
126
140
|
- !ruby/object:Gem::Dependency
|
127
141
|
name: http-parser-lite
|
128
142
|
requirement: !ruby/object:Gem::Requirement
|
@@ -245,11 +259,15 @@ files:
|
|
245
259
|
- lib/invoker/power/balancer.rb
|
246
260
|
- lib/invoker/power/config.rb
|
247
261
|
- lib/invoker/power/dns.rb
|
262
|
+
- lib/invoker/power/http_parser.rb
|
248
263
|
- lib/invoker/power/http_response.rb
|
249
264
|
- lib/invoker/power/port_finder.rb
|
250
265
|
- lib/invoker/power/power.rb
|
251
266
|
- lib/invoker/power/powerup.rb
|
252
267
|
- lib/invoker/power/setup.rb
|
268
|
+
- lib/invoker/power/setup/distro/base.rb
|
269
|
+
- lib/invoker/power/setup/distro/redhat.rb
|
270
|
+
- lib/invoker/power/setup/distro/ubuntu.rb
|
253
271
|
- lib/invoker/power/setup/linux_setup.rb
|
254
272
|
- lib/invoker/power/setup/osx_setup.rb
|
255
273
|
- lib/invoker/power/templates/404.html
|
@@ -276,6 +294,7 @@ files:
|
|
276
294
|
- spec/invoker/ipc/unix_client_spec.rb
|
277
295
|
- spec/invoker/power/balancer_spec.rb
|
278
296
|
- spec/invoker/power/config_spec.rb
|
297
|
+
- spec/invoker/power/http_parser_spec.rb
|
279
298
|
- spec/invoker/power/http_response_spec.rb
|
280
299
|
- spec/invoker/power/port_finder_spec.rb
|
281
300
|
- spec/invoker/power/setup/linux_setup_spec.rb
|
@@ -309,5 +328,31 @@ rubygems_version: 2.2.2
|
|
309
328
|
signing_key:
|
310
329
|
specification_version: 4
|
311
330
|
summary: Something small for Process management
|
312
|
-
test_files:
|
331
|
+
test_files:
|
332
|
+
- spec/invoker/cli/pinger_spec.rb
|
333
|
+
- spec/invoker/cli/tail_watcher_spec.rb
|
334
|
+
- spec/invoker/cli_spec.rb
|
335
|
+
- spec/invoker/command_worker_spec.rb
|
336
|
+
- spec/invoker/commander_spec.rb
|
337
|
+
- spec/invoker/config_spec.rb
|
338
|
+
- spec/invoker/daemon_spec.rb
|
339
|
+
- spec/invoker/event/manager_spec.rb
|
340
|
+
- spec/invoker/invoker_spec.rb
|
341
|
+
- spec/invoker/ipc/client_handler_spec.rb
|
342
|
+
- spec/invoker/ipc/dns_check_command_spec.rb
|
343
|
+
- spec/invoker/ipc/message/list_response_spec.rb
|
344
|
+
- spec/invoker/ipc/message_spec.rb
|
345
|
+
- spec/invoker/ipc/unix_client_spec.rb
|
346
|
+
- spec/invoker/power/balancer_spec.rb
|
347
|
+
- spec/invoker/power/config_spec.rb
|
348
|
+
- spec/invoker/power/http_parser_spec.rb
|
349
|
+
- spec/invoker/power/http_response_spec.rb
|
350
|
+
- spec/invoker/power/port_finder_spec.rb
|
351
|
+
- spec/invoker/power/setup/linux_setup_spec.rb
|
352
|
+
- spec/invoker/power/setup/osx_setup_spec.rb
|
353
|
+
- spec/invoker/power/setup_spec.rb
|
354
|
+
- spec/invoker/process_manager_spec.rb
|
355
|
+
- spec/invoker/reactor_spec.rb
|
356
|
+
- spec/spec_helper.rb
|
357
|
+
- spec/support/mock_setup_file.rb
|
313
358
|
has_rdoc:
|