falcon 0.42.3 → 0.44.0
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
- 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)
|