falcon 0.42.3 → 0.44.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/bake/falcon/supervisor.rb +3 -1
- data/changes.md +22 -0
- data/lib/falcon/command/host.rb +7 -50
- data/lib/falcon/command/paths.rb +2 -19
- data/lib/falcon/command/proxy.rb +21 -33
- data/lib/falcon/command/redirect.rb +22 -33
- data/lib/falcon/command/serve.rb +44 -82
- data/lib/falcon/command/supervisor.rb +2 -19
- data/lib/falcon/command/top.rb +2 -19
- data/lib/falcon/command/virtual.rb +16 -41
- data/lib/falcon/command.rb +3 -19
- data/lib/falcon/configuration.rb +28 -142
- data/lib/falcon/endpoint.rb +2 -19
- data/lib/falcon/environment/application.rb +60 -0
- data/lib/falcon/environment/lets_encrypt_tls.rb +34 -0
- data/lib/falcon/environment/proxy.rb +109 -0
- data/lib/falcon/environment/rack.rb +20 -0
- data/lib/falcon/environment/rackup.rb +26 -0
- data/lib/falcon/environment/redirect.rb +50 -0
- data/lib/falcon/environment/self_signed_tls.rb +45 -0
- data/lib/falcon/environment/server.rb +69 -0
- data/lib/falcon/environment/supervisor.rb +40 -0
- data/lib/falcon/environment/tls.rb +97 -0
- data/lib/falcon/environment.rb +13 -0
- data/lib/falcon/middleware/proxy.rb +3 -20
- data/lib/falcon/middleware/redirect.rb +2 -19
- data/lib/falcon/middleware/verbose.rb +2 -19
- data/lib/falcon/proxy_endpoint.rb +2 -19
- data/lib/falcon/railtie.rb +10 -0
- data/lib/falcon/server.rb +2 -19
- data/lib/falcon/service/server.rb +84 -0
- data/lib/falcon/service/supervisor.rb +5 -21
- data/lib/falcon/{controller → service}/virtual.rb +72 -36
- data/lib/falcon/tls.rb +2 -19
- data/lib/falcon/version.rb +3 -20
- data/lib/falcon.rb +5 -19
- data/lib/rack/handler/falcon.rb +4 -0
- data/lib/rackup/handler/falcon.rb +83 -0
- data/license.md +41 -0
- data/readme.md +60 -0
- data.tar.gz.sig +0 -0
- metadata +37 -117
- metadata.gz.sig +0 -0
- data/lib/.DS_Store +0 -0
- data/lib/falcon/controller/host.rb +0 -72
- data/lib/falcon/controller/proxy.rb +0 -126
- data/lib/falcon/controller/redirect.rb +0 -76
- data/lib/falcon/controller/serve.rb +0 -126
- data/lib/falcon/environments/application.rb +0 -72
- data/lib/falcon/environments/lets_encrypt_tls.rb +0 -47
- data/lib/falcon/environments/proxy.rb +0 -37
- data/lib/falcon/environments/rack.rb +0 -50
- data/lib/falcon/environments/self_signed_tls.rb +0 -55
- data/lib/falcon/environments/supervisor.rb +0 -51
- data/lib/falcon/environments/tls.rb +0 -103
- data/lib/falcon/environments.rb +0 -31
- data/lib/falcon/service/application.rb +0 -115
- data/lib/falcon/service/generic.rb +0 -78
- data/lib/falcon/service/proxy.rb +0 -66
- data/lib/falcon/services.rb +0 -99
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2019-2024, by Samuel Williams.
|
5
|
+
|
6
|
+
require_relative '../service/supervisor'
|
7
|
+
require_relative '../environment'
|
8
|
+
|
9
|
+
module Falcon
|
10
|
+
module Environment
|
11
|
+
# Provides an environment for hosting a supervisor which can monitor multiple applications.
|
12
|
+
module Supervisor
|
13
|
+
# The name of the supervisor
|
14
|
+
# @returns [String]
|
15
|
+
def name
|
16
|
+
"supervisor"
|
17
|
+
end
|
18
|
+
|
19
|
+
# The IPC path to use for communication with the supervisor.
|
20
|
+
# @returns [String]
|
21
|
+
def ipc_path
|
22
|
+
::File.expand_path("supervisor.ipc", root)
|
23
|
+
end
|
24
|
+
|
25
|
+
# The endpoint the supervisor will bind to.
|
26
|
+
# @returns [Async::IO::Endpoint]
|
27
|
+
def endpoint
|
28
|
+
Async::IO::Endpoint.unix(ipc_path)
|
29
|
+
end
|
30
|
+
|
31
|
+
# The service class to use for the supervisor.
|
32
|
+
# @returns [Class]
|
33
|
+
def service_class
|
34
|
+
::Falcon::Service::Supervisor
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
LEGACY_ENVIRONMENTS[:supervisor] = Supervisor
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2019-2024, by Samuel Williams.
|
5
|
+
|
6
|
+
require_relative '../tls'
|
7
|
+
require_relative '../environment'
|
8
|
+
|
9
|
+
module Falcon
|
10
|
+
module Environment
|
11
|
+
# Provides an environment that exposes a TLS context for hosting a secure web application.
|
12
|
+
module TLS
|
13
|
+
# The default session identifier for the session cache.
|
14
|
+
# @returns [String]
|
15
|
+
def ssl_session_id
|
16
|
+
"falcon"
|
17
|
+
end
|
18
|
+
|
19
|
+
# The supported ciphers.
|
20
|
+
# @returns [Array(String)]
|
21
|
+
def ssl_ciphers
|
22
|
+
Falcon::TLS::SERVER_CIPHERS
|
23
|
+
end
|
24
|
+
|
25
|
+
# The public certificate path.
|
26
|
+
# @returns [String]
|
27
|
+
def ssl_certificate_path
|
28
|
+
File.expand_path("ssl/certificate.pem", root)
|
29
|
+
end
|
30
|
+
|
31
|
+
# The list of certificates loaded from that path.
|
32
|
+
# @returns [Array(OpenSSL::X509::Certificate)]
|
33
|
+
def ssl_certificates
|
34
|
+
OpenSSL::X509::Certificate.load_file(ssl_certificate_path)
|
35
|
+
end
|
36
|
+
|
37
|
+
# The main certificate.
|
38
|
+
# @returns [OpenSSL::X509::Certificate]
|
39
|
+
def ssl_certificate
|
40
|
+
ssl_certificates[0]
|
41
|
+
end
|
42
|
+
|
43
|
+
# The certificate chain.
|
44
|
+
# @returns [Array(OpenSSL::X509::Certificate)]
|
45
|
+
def ssl_certificate_chain
|
46
|
+
ssl_certificates[1..-1]
|
47
|
+
end
|
48
|
+
|
49
|
+
# The private key path.
|
50
|
+
# @returns [String]
|
51
|
+
def ssl_private_key_path
|
52
|
+
File.expand_path("ssl/private.key", root)
|
53
|
+
end
|
54
|
+
|
55
|
+
# The private key.
|
56
|
+
# @returns [OpenSSL::PKey::RSA]
|
57
|
+
def ssl_private_key
|
58
|
+
OpenSSL::PKey::RSA.new(File.read(ssl_private_key_path))
|
59
|
+
end
|
60
|
+
|
61
|
+
# The SSL context to use for incoming connections.
|
62
|
+
# @returns [OpenSSL::SSL::SSLContext]
|
63
|
+
def ssl_context
|
64
|
+
OpenSSL::SSL::SSLContext.new.tap do |context|
|
65
|
+
context.add_certificate(ssl_certificate, ssl_private_key, ssl_certificate_chain)
|
66
|
+
|
67
|
+
context.session_cache_mode = OpenSSL::SSL::SSLContext::SESSION_CACHE_CLIENT
|
68
|
+
context.session_id_context = ssl_session_id
|
69
|
+
|
70
|
+
context.alpn_select_cb = lambda do |protocols|
|
71
|
+
if protocols.include? "h2"
|
72
|
+
return "h2"
|
73
|
+
elsif protocols.include? "http/1.1"
|
74
|
+
return "http/1.1"
|
75
|
+
elsif protocols.include? "http/1.0"
|
76
|
+
return "http/1.0"
|
77
|
+
else
|
78
|
+
return nil
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# TODO Ruby 2.4 requires using ssl_version.
|
83
|
+
context.ssl_version = :TLSv1_2_server
|
84
|
+
|
85
|
+
context.set_params(
|
86
|
+
ciphers: ssl_ciphers,
|
87
|
+
verify_mode: OpenSSL::SSL::VERIFY_NONE,
|
88
|
+
)
|
89
|
+
|
90
|
+
context.setup
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
LEGACY_ENVIRONMENTS[:tls] = TLS
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2019-2024, by Samuel Williams.
|
5
|
+
|
6
|
+
module Falcon
|
7
|
+
# Pre-defined environments for hosting web applications.
|
8
|
+
#
|
9
|
+
# See {Configuration::Loader#load} for more details.
|
10
|
+
module Environment
|
11
|
+
LEGACY_ENVIRONMENTS = {}
|
12
|
+
end
|
13
|
+
end
|
@@ -1,24 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
# of this software and associated documentation files (the "Software"), to deal
|
7
|
-
# in the Software without restriction, including without limitation the rights
|
8
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
# copies of the Software, and to permit persons to whom the Software is
|
10
|
-
# furnished to do so, subject to the following conditions:
|
11
|
-
#
|
12
|
-
# The above copyright notice and this permission notice shall be included in
|
13
|
-
# all copies or substantial portions of the Software.
|
14
|
-
#
|
15
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
-
# THE SOFTWARE.
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2018-2023, by Samuel Williams.
|
22
5
|
|
23
6
|
require 'async/http/client'
|
24
7
|
require 'protocol/http/headers'
|
@@ -58,7 +41,7 @@ module Falcon
|
|
58
41
|
|
59
42
|
# Initialize the proxy middleware.
|
60
43
|
# @parameter app [Protocol::HTTP::Middleware] The middleware to use if a request can't be proxied.
|
61
|
-
# @parameter hosts [
|
44
|
+
# @parameter hosts [Hash(String, Service::Proxy)] The host applications to proxy to.
|
62
45
|
def initialize(app, hosts)
|
63
46
|
super(app)
|
64
47
|
|
@@ -1,24 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
# of this software and associated documentation files (the "Software"), to deal
|
7
|
-
# in the Software without restriction, including without limitation the rights
|
8
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
# copies of the Software, and to permit persons to whom the Software is
|
10
|
-
# furnished to do so, subject to the following conditions:
|
11
|
-
#
|
12
|
-
# The above copyright notice and this permission notice shall be included in
|
13
|
-
# all copies or substantial portions of the Software.
|
14
|
-
#
|
15
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
-
# THE SOFTWARE.
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2018-2023, by Samuel Williams.
|
22
5
|
|
23
6
|
require 'async/http/client'
|
24
7
|
|
@@ -1,24 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
# of this software and associated documentation files (the "Software"), to deal
|
7
|
-
# in the Software without restriction, including without limitation the rights
|
8
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
# copies of the Software, and to permit persons to whom the Software is
|
10
|
-
# furnished to do so, subject to the following conditions:
|
11
|
-
#
|
12
|
-
# The above copyright notice and this permission notice shall be included in
|
13
|
-
# all copies or substantial portions of the Software.
|
14
|
-
#
|
15
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
-
# THE SOFTWARE.
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2018-2023, by Samuel Williams.
|
22
5
|
|
23
6
|
require 'console'
|
24
7
|
require 'async/http/statistics'
|
@@ -1,24 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
# of this software and associated documentation files (the "Software"), to deal
|
7
|
-
# in the Software without restriction, including without limitation the rights
|
8
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
# copies of the Software, and to permit persons to whom the Software is
|
10
|
-
# furnished to do so, subject to the following conditions:
|
11
|
-
#
|
12
|
-
# The above copyright notice and this permission notice shall be included in
|
13
|
-
# all copies or substantial portions of the Software.
|
14
|
-
#
|
15
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
-
# THE SOFTWARE.
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2019-2023, by Samuel Williams.
|
22
5
|
|
23
6
|
require 'async/io/unix_endpoint'
|
24
7
|
|
data/lib/falcon/server.rb
CHANGED
@@ -1,24 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
# of this software and associated documentation files (the "Software"), to deal
|
7
|
-
# in the Software without restriction, including without limitation the rights
|
8
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
# copies of the Software, and to permit persons to whom the Software is
|
10
|
-
# furnished to do so, subject to the following conditions:
|
11
|
-
#
|
12
|
-
# The above copyright notice and this permission notice shall be included in
|
13
|
-
# all copies or substantial portions of the Software.
|
14
|
-
#
|
15
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
-
# THE SOFTWARE.
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2017-2023, by Samuel Williams.
|
22
5
|
|
23
6
|
require 'async/http/server'
|
24
7
|
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2020-2024, by Samuel Williams.
|
5
|
+
# Copyright, 2020, by Michael Adams.
|
6
|
+
|
7
|
+
require 'async/service/generic'
|
8
|
+
require 'async/http/endpoint'
|
9
|
+
|
10
|
+
require_relative '../server'
|
11
|
+
|
12
|
+
module Falcon
|
13
|
+
module Service
|
14
|
+
class Server < Async::Service::Generic
|
15
|
+
def initialize(...)
|
16
|
+
super
|
17
|
+
|
18
|
+
@bound_endpoint = nil
|
19
|
+
end
|
20
|
+
|
21
|
+
# Preload any resources specified by the environment.
|
22
|
+
def preload!
|
23
|
+
root = @evaluator.root
|
24
|
+
|
25
|
+
if scripts = @evaluator.preload
|
26
|
+
scripts = Array(scripts)
|
27
|
+
|
28
|
+
scripts.each do |path|
|
29
|
+
Console.logger.info(self) {"Preloading #{path}..."}
|
30
|
+
full_path = File.expand_path(path, root)
|
31
|
+
load(full_path)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Prepare the bound endpoint for the server.
|
37
|
+
def start
|
38
|
+
@endpoint = @evaluator.endpoint
|
39
|
+
|
40
|
+
Sync do
|
41
|
+
@bound_endpoint = @endpoint.bound
|
42
|
+
end
|
43
|
+
|
44
|
+
preload!
|
45
|
+
|
46
|
+
Console.logger.info(self) {"Starting #{self.name} on #{@endpoint}"}
|
47
|
+
|
48
|
+
super
|
49
|
+
end
|
50
|
+
|
51
|
+
# Setup the container with the application instance.
|
52
|
+
# @parameter container [Async::Container::Generic]
|
53
|
+
def setup(container)
|
54
|
+
container_options = @evaluator.container_options
|
55
|
+
|
56
|
+
container.run(name: self.name, **container_options) do |instance|
|
57
|
+
evaluator = @environment.evaluator
|
58
|
+
|
59
|
+
Async do |task|
|
60
|
+
server = Falcon::Server.new(evaluator.middleware, @bound_endpoint, protocol: @endpoint.protocol, scheme: @endpoint.scheme)
|
61
|
+
|
62
|
+
server.run
|
63
|
+
|
64
|
+
instance.ready!
|
65
|
+
|
66
|
+
task.children.each(&:wait)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Close the bound endpoint.
|
72
|
+
def stop(...)
|
73
|
+
if @bound_endpoint
|
74
|
+
@bound_endpoint.close
|
75
|
+
@bound_endpoint = nil
|
76
|
+
end
|
77
|
+
|
78
|
+
@endpoint = nil
|
79
|
+
|
80
|
+
super
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -1,38 +1,22 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
# of this software and associated documentation files (the "Software"), to deal
|
7
|
-
# in the Software without restriction, including without limitation the rights
|
8
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
# copies of the Software, and to permit persons to whom the Software is
|
10
|
-
# furnished to do so, subject to the following conditions:
|
11
|
-
#
|
12
|
-
# The above copyright notice and this permission notice shall be included in
|
13
|
-
# all copies or substantial portions of the Software.
|
14
|
-
#
|
15
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
-
# THE SOFTWARE.
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2019-2024, by Samuel Williams.
|
22
5
|
|
23
6
|
require 'process/metrics'
|
24
7
|
require 'json'
|
25
8
|
|
26
9
|
require 'async/io/endpoint'
|
27
10
|
require 'async/io/shared_endpoint'
|
11
|
+
require 'async/service/generic'
|
28
12
|
|
29
13
|
module Falcon
|
30
14
|
module Service
|
31
15
|
# Implements a host supervisor which can restart the host services and provide various metrics about the running processes.
|
32
|
-
class Supervisor < Generic
|
16
|
+
class Supervisor < Async::Service::Generic
|
33
17
|
# Initialize the supervisor using the given environment.
|
34
18
|
# @parameter environment [Build::Environment]
|
35
|
-
def initialize(
|
19
|
+
def initialize(...)
|
36
20
|
super
|
37
21
|
|
38
22
|
@bound_endpoint = nil
|
@@ -1,42 +1,76 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
# of this software and associated documentation files (the "Software"), to deal
|
7
|
-
# in the Software without restriction, including without limitation the rights
|
8
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
# copies of the Software, and to permit persons to whom the Software is
|
10
|
-
# furnished to do so, subject to the following conditions:
|
11
|
-
#
|
12
|
-
# The above copyright notice and this permission notice shall be included in
|
13
|
-
# all copies or substantial portions of the Software.
|
14
|
-
#
|
15
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
-
# THE SOFTWARE.
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2024, by Samuel Williams.
|
22
5
|
|
23
|
-
require 'async/
|
6
|
+
require 'async/service/generic'
|
24
7
|
|
25
8
|
module Falcon
|
26
|
-
module
|
9
|
+
module Service
|
27
10
|
# A controller which mananages several virtual hosts.
|
28
11
|
# Spawns instances of {Proxy} and {Redirect} to handle incoming requests.
|
29
12
|
#
|
30
13
|
# A virtual host is an application bound to a specific authority (essentially a hostname). The virtual controller manages multiple hosts and allows a single server to host multiple applications easily.
|
31
|
-
class Virtual < Async::
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
14
|
+
class Virtual < Async::Service::Generic
|
15
|
+
module Environment
|
16
|
+
# The service class to use for the virtual host.
|
17
|
+
# @returns [Class]
|
18
|
+
def service_class
|
19
|
+
Virtual
|
20
|
+
end
|
21
|
+
|
22
|
+
def name
|
23
|
+
service_class.name
|
24
|
+
end
|
25
|
+
|
26
|
+
# All the falcon application configuration paths.
|
27
|
+
# @returns [Array(String)] Paths to the falcon application configuration files.
|
28
|
+
def configuration_paths
|
29
|
+
["/srv/http/*/falcon.rb"]
|
30
|
+
end
|
36
31
|
|
37
|
-
|
32
|
+
def configuration
|
33
|
+
::Async::Service::Configuration.load(configuration_paths)
|
34
|
+
end
|
35
|
+
|
36
|
+
# The URI to bind the `HTTPS` -> `falcon host` proxy.
|
37
|
+
def bind_secure
|
38
|
+
"https://[::]:443"
|
39
|
+
end
|
40
|
+
|
41
|
+
# The URI to bind the `HTTP` -> `HTTPS` redirector.
|
42
|
+
def bind_insecure
|
43
|
+
"http://[::]:80"
|
44
|
+
end
|
38
45
|
|
39
|
-
|
46
|
+
# The connection timeout to use for incoming connections.
|
47
|
+
def timeout
|
48
|
+
10.0
|
49
|
+
end
|
50
|
+
|
51
|
+
# # The insecure endpoint for connecting to the {Redirect} instance.
|
52
|
+
# def insecure_endpoint(**options)
|
53
|
+
# Async::HTTP::Endpoint.parse(bind_insecure, **options)
|
54
|
+
# end
|
55
|
+
|
56
|
+
# # The secure endpoint for connecting to the {Proxy} instance.
|
57
|
+
# def secure_endpoint(**options)
|
58
|
+
# Async::HTTP::Endpoint.parse(bind_secure, **options)
|
59
|
+
# end
|
60
|
+
|
61
|
+
# # An endpoint suitable for connecting to the specified hostname.
|
62
|
+
# def host_endpoint(hostname, **options)
|
63
|
+
# endpoint = secure_endpoint(**options)
|
64
|
+
|
65
|
+
# url = URI.parse(bind_secure)
|
66
|
+
# url.hostname = hostname
|
67
|
+
|
68
|
+
# return Async::HTTP::Endpoint.new(url, hostname: endpoint.hostname)
|
69
|
+
# end
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.included(target)
|
73
|
+
target.include(Environnment)
|
40
74
|
end
|
41
75
|
|
42
76
|
# Drop privileges according to the user and group of the specified path.
|
@@ -87,7 +121,9 @@ module Falcon
|
|
87
121
|
end
|
88
122
|
|
89
123
|
container.reload do
|
90
|
-
@
|
124
|
+
evaluator = @environment.evaluator
|
125
|
+
|
126
|
+
evaluator.configuration_paths.each do |path|
|
91
127
|
path = File.expand_path(path)
|
92
128
|
root = File.dirname(path)
|
93
129
|
|
@@ -96,18 +132,18 @@ module Falcon
|
|
96
132
|
|
97
133
|
container.spawn(name: "Falcon Redirector", restart: true, key: :redirect) do |instance|
|
98
134
|
instance.exec(falcon_path, "redirect",
|
99
|
-
"--bind",
|
100
|
-
"--timeout",
|
101
|
-
"--redirect",
|
102
|
-
|
135
|
+
"--bind", evaluator.bind_insecure,
|
136
|
+
"--timeout", evaluator.timeout.to_s,
|
137
|
+
"--redirect", evaluator.bind_secure,
|
138
|
+
*evaluator.configuration_paths, ready: false
|
103
139
|
)
|
104
140
|
end
|
105
141
|
|
106
142
|
container.spawn(name: "Falcon Proxy", restart: true, key: :proxy) do |instance|
|
107
143
|
instance.exec(falcon_path, "proxy",
|
108
|
-
"--bind",
|
109
|
-
"--timeout",
|
110
|
-
|
144
|
+
"--bind", evaluator.bind_secure,
|
145
|
+
"--timeout", evaluator.timeout.to_s,
|
146
|
+
*evaluator.configuration_paths, ready: false
|
111
147
|
)
|
112
148
|
end
|
113
149
|
end
|
data/lib/falcon/tls.rb
CHANGED
@@ -1,24 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
# of this software and associated documentation files (the "Software"), to deal
|
7
|
-
# in the Software without restriction, including without limitation the rights
|
8
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
# copies of the Software, and to permit persons to whom the Software is
|
10
|
-
# furnished to do so, subject to the following conditions:
|
11
|
-
#
|
12
|
-
# The above copyright notice and this permission notice shall be included in
|
13
|
-
# all copies or substantial portions of the Software.
|
14
|
-
#
|
15
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
-
# THE SOFTWARE.
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2020-2023, by Samuel Williams.
|
22
5
|
|
23
6
|
module Falcon
|
24
7
|
module TLS
|
data/lib/falcon/version.rb
CHANGED
@@ -1,25 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
# of this software and associated documentation files (the "Software"), to deal
|
7
|
-
# in the Software without restriction, including without limitation the rights
|
8
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
# copies of the Software, and to permit persons to whom the Software is
|
10
|
-
# furnished to do so, subject to the following conditions:
|
11
|
-
#
|
12
|
-
# The above copyright notice and this permission notice shall be included in
|
13
|
-
# all copies or substantial portions of the Software.
|
14
|
-
#
|
15
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
-
# THE SOFTWARE.
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2017-2024, by Samuel Williams.
|
22
5
|
|
23
6
|
module Falcon
|
24
|
-
VERSION = "0.
|
7
|
+
VERSION = "0.44.0"
|
25
8
|
end
|
data/lib/falcon.rb
CHANGED
@@ -1,23 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
# of this software and associated documentation files (the "Software"), to deal
|
7
|
-
# in the Software without restriction, including without limitation the rights
|
8
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
# copies of the Software, and to permit persons to whom the Software is
|
10
|
-
# furnished to do so, subject to the following conditions:
|
11
|
-
#
|
12
|
-
# The above copyright notice and this permission notice shall be included in
|
13
|
-
# all copies or substantial portions of the Software.
|
14
|
-
#
|
15
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
-
# THE SOFTWARE.
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2017-2024, by Samuel Williams.
|
22
5
|
|
23
6
|
require_relative "falcon/server"
|
7
|
+
|
8
|
+
# Falcon, running on Rails, requires specific configuration:
|
9
|
+
require_relative "falcon/railtie" if defined?(Rails::Railtie)
|