smart_proxy_dynflow 0.2.0 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f0d3649273534756b41181d6ff5c4f280cd836064cc1e156882478041c206012
4
- data.tar.gz: ccb29459a346b59e24ccdd1db3e8d78ce1627bb0cd70cd81011f6314d7b9e162
3
+ metadata.gz: ed31ab888b7a2f5fbc4891fe60a0332f5a43347a15175f12f96a3215c0e73447
4
+ data.tar.gz: 534c395d634b227cd5570687e83e3e6d227a8f1898b6fed76a7760c6c66a33e2
5
5
  SHA512:
6
- metadata.gz: 7544fc2af767a45393d48e7bc0fa5fdac1b2e1fa8bdeb62af26af29ab342a2ac22c5c0beacd4ce3fcf0d8d6b3554ae62d80536b6e8d71755a1f6c08577f1fb8c
7
- data.tar.gz: f11e9b70127d83167d53ff19529d0140f121c6909693faa043f94bfd2c5d92ea86b11b93236592c773e95274980f9807d7bbcd231dbf57a2b7dbc4571379fa16
6
+ metadata.gz: a1836fa6ab0f19b43b7321d133d69632bb248ceec3e113a46952c5fc0e5f5170f29fcec0cfd52ade22db7755dcc727c03bb8f1184215787de9e37beaffc3c901
7
+ data.tar.gz: 3a20420452784df395b61cb3f75bba8ef88e8627fd984d17894e9a7003262d74b9beda70ab41eff0843e6816e8c74dc798f89b4b97b4f93d80e1dc7436ac5763
data/Gemfile CHANGED
@@ -7,32 +7,17 @@ group :development do
7
7
  end
8
8
 
9
9
  group :test do
10
- gem 'smart_proxy_dynflow', :path => '.'
11
10
  gem 'smart_proxy', :git => "https://github.com/theforeman/smart-proxy", :branch => "develop"
11
+ gem 'smart_proxy_dynflow', :path => '.'
12
12
 
13
- if RUBY_VERSION < '2.1'
14
- gem 'public_suffix', '< 3'
15
- gem 'rubocop', '< 0.51.0'
16
- gem 'rainbow', '< 3'
17
- else
18
- gem 'rubocop', '~> 0.52.1'
19
- gem 'public_suffix'
20
- end
21
-
22
- if RUBY_VERSION < '2.2'
23
- gem 'rack-test', '< 0.8'
24
- else
25
- gem 'rack-test'
26
- end
13
+ gem 'public_suffix'
14
+ gem 'rack-test'
15
+ gem 'rubocop', '~> 0.52.1'
27
16
  end
28
17
 
29
- if RUBY_VERSION < '2.2'
30
- gem 'sinatra', '< 2'
31
- gem 'rack', '>= 1.1', '< 2.0.0'
32
- else
33
- gem 'sinatra'
34
- gem 'rack', '>= 1.1'
35
- end
18
+ gem 'logging-journald', '~> 2.0', :platforms => [:ruby]
19
+ gem 'rack', '>= 1.1'
20
+ gem 'sinatra'
36
21
 
37
22
  # load bundler.d
38
23
  Dir["#{File.dirname(__FILE__)}/bundler.d/*.rb"].each do |bundle|
@@ -6,18 +6,53 @@ module Proxy
6
6
  class Dynflow
7
7
  class Api < ::Sinatra::Base
8
8
  helpers ::Proxy::Helpers
9
+ helpers ::Proxy::Log
9
10
  helpers ::Proxy::Dynflow::Helpers
10
11
 
11
12
  before do
12
- logger = Proxy::LogBuffer::Decorator.instance
13
13
  content_type :json
14
- if request.env['HTTP_AUTHORIZATION'] && request.env['PATH_INFO'].end_with?('/done')
14
+ if request.env['HTTP_AUTHORIZATION'] && request.path_info =~ %r{/tasks/.*/(update|done)}
15
15
  # Halt running before callbacks if a token is provided and the request is notifying about task being done
16
16
  return
17
+ else
18
+ do_authorize_with_ssl_client
19
+ do_authorize_with_trusted_hosts
17
20
  end
18
21
  end
19
22
 
20
- helpers Sinatra::Authorization
23
+ # TODO: move this to foreman-proxy to reduce code duplicities
24
+ def do_authorize_with_trusted_hosts
25
+ # When :trusted_hosts is given, we check the client against the list
26
+ # HTTPS: test the certificate CN
27
+ # HTTP: test the reverse DNS entry of the remote IP
28
+ trusted_hosts = Proxy::SETTINGS.trusted_hosts
29
+ if trusted_hosts
30
+ if ['yes', 'on', 1].include? request.env['HTTPS'].to_s
31
+ fqdn = https_cert_cn
32
+ source = 'SSL_CLIENT_CERT'
33
+ else
34
+ fqdn = remote_fqdn(Proxy::SETTINGS.forward_verify)
35
+ source = 'REMOTE_ADDR'
36
+ end
37
+ fqdn = fqdn.downcase
38
+ logger.debug "verifying remote client #{fqdn} (based on #{source}) against trusted_hosts #{trusted_hosts}"
39
+
40
+ unless Proxy::SETTINGS.trusted_hosts.include?(fqdn)
41
+ log_halt 403, "Untrusted client #{fqdn} attempted " \
42
+ "to access #{request.path_info}. Check :trusted_hosts: in settings.yml"
43
+ end
44
+ end
45
+ end
46
+
47
+ def do_authorize_with_ssl_client
48
+ if %w[yes on 1].include? request.env['HTTPS'].to_s
49
+ if request.env['SSL_CLIENT_CERT'].to_s.empty?
50
+ log_halt 403, "No client SSL certificate supplied"
51
+ end
52
+ else
53
+ logger.debug('require_ssl_client_verification: skipping, non-HTTPS request')
54
+ end
55
+ end
21
56
 
22
57
  post "/*" do
23
58
  relay_request
@@ -10,15 +10,17 @@ module Proxy
10
10
 
11
11
  def relay(request, from, to)
12
12
  path = request.path.gsub(from, to)
13
- Proxy::LogBuffer::Decorator.instance.debug "Proxy request from #{request.host_with_port}#{request.path} to #{uri.to_s}#{path}"
13
+ message = "Proxy request from #{request.host_with_port}#{request.path} to #{uri}#{path}"
14
+ Proxy::LogBuffer::Decorator.instance.debug message
14
15
  req = case request.env['REQUEST_METHOD']
15
- when 'GET'
16
- request_factory.create_get path, request.env['rack.request.query_hash']
17
- when 'POST'
18
- request_factory.create_post path, request.body.read
16
+ when 'GET'
17
+ request_factory.create_get path, request.env['rack.request.query_hash']
18
+ when 'POST'
19
+ request_factory.create_post path, request.body.read
19
20
  end
20
21
  req['X-Forwarded-For'] = request.env['HTTP_HOST']
21
22
  req['AUTHORIZATION'] = request.env['HTTP_AUTHORIZATION']
23
+ req['X-Request-Id'] = ::Logging.mdc['request']
22
24
  response = send_request req
23
25
  Proxy::LogBuffer::Decorator.instance.debug "Proxy request status #{response.code} - #{response}"
24
26
  response
@@ -1,7 +1,7 @@
1
1
  module Proxy
2
2
  class Dynflow
3
3
  module Helpers
4
- def relay_request(from = /^\/dynflow/, to = '')
4
+ def relay_request(from = %r{^/dynflow}, to = '')
5
5
  response = Proxy::Dynflow::Callback::Core.relay(request, from, to)
6
6
  content_type response.content_type
7
7
  status response.code
@@ -1,7 +1,21 @@
1
- require 'smart_proxy_dynflow/api'
1
+ # Internal core will be used if external core is either disabled or unset
2
+ # and the core gem can be loaded
2
3
 
3
- map "/dynflow" do
4
- map '/'do
5
- run Proxy::Dynflow::Api
4
+ if !::Proxy::Dynflow::Plugin.settings.external_core && Proxy::Dynflow::Plugin.internal_core_available?
5
+ require 'smart_proxy_dynflow_core/api'
6
+ require 'smart_proxy_dynflow_core/launcher'
7
+
8
+ SmartProxyDynflowCore::Settings.load_from_proxy(p)
9
+
10
+ map "/dynflow" do
11
+ SmartProxyDynflowCore::Launcher.route_mapping(self)
12
+ end
13
+ else
14
+ require 'smart_proxy_dynflow/api'
15
+
16
+ map "/dynflow" do
17
+ map '/' do
18
+ run Proxy::Dynflow::Api
19
+ end
6
20
  end
7
21
  end
@@ -4,27 +4,28 @@ require 'proxy/plugin'
4
4
 
5
5
  class Proxy::Dynflow
6
6
  class Plugin < Proxy::Plugin
7
- rackup_path = begin
8
- require 'smart_proxy_dynflow_core'
9
- 'http_config_with_executor.ru'
10
- rescue LoadError
11
- 'http_config.ru'
12
- end
13
- http_rackup_path File.expand_path(rackup_path, File.expand_path("../", __FILE__))
14
- https_rackup_path File.expand_path(rackup_path, File.expand_path("../", __FILE__))
7
+ rackup_path = File.expand_path('http_config.ru', __dir__)
8
+ http_rackup_path rackup_path
9
+ https_rackup_path rackup_path
15
10
 
16
11
  settings_file "dynflow.yml"
17
- requires :foreman_proxy, ">= 1.12.0"
12
+ requires :foreman_proxy, ">= 1.16.0"
18
13
  default_settings :core_url => 'http://localhost:8008'
19
14
  plugin :dynflow, Proxy::Dynflow::VERSION
20
15
 
21
16
  after_activation do
22
- begin
23
- require 'smart_proxy_dynflow_core'
24
- rescue LoadError => e
25
- # Dynflow core is not available in the proxy, will be handled
26
- # by standalone Dynflow core
17
+ # Ensure the core gem is loaded, if configure NOT to use the external core
18
+ if Proxy::Dynflow::Plugin.settings.external_core == false && !internal_core_available?
19
+ raise "'smart_proxy_dynflow_core' gem is required, but not available"
27
20
  end
28
21
  end
22
+
23
+ def self.internal_core_available?
24
+ @core_available ||= begin
25
+ require 'smart_proxy_dynflow_core'
26
+ true
27
+ rescue LoadError # rubocop:disable Lint/HandleExceptions
28
+ end
29
+ end
29
30
  end
30
31
  end
@@ -1,5 +1,5 @@
1
1
  module Proxy
2
2
  class Dynflow
3
- VERSION = '0.2.0'
3
+ VERSION = '0.3.0'.freeze
4
4
  end
5
5
  end
@@ -2,3 +2,8 @@
2
2
  :enabled: true
3
3
  :database: /var/lib/foreman-proxy/dynflow/dynflow.sqlite
4
4
  :core_url: 'http://127.0.0.1:8008'
5
+
6
+ # If true, external core will be used even if the core gem is available
7
+ # If false, the feature will be disabled if the core gem is not available
8
+ # If unset, the process will fallback to external core if the core gem is not available
9
+ # :external_core: true
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_proxy_dynflow
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Nečas
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-05 00:00:00.000000000 Z
11
+ date: 1980-01-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bundler
14
+ name: logging
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.7'
20
- type: :development
19
+ version: '0'
20
+ type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.7'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
28
+ name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '1.7'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '1.7'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -67,33 +67,47 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1'
69
69
  - !ruby/object:Gem::Dependency
70
- name: webmock
70
+ name: rack-test
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '1'
75
+ version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '1'
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: rack-test
84
+ name: rake
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: '10.0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '0'
96
+ version: '10.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: webmock
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1'
97
111
  description: " Use the Dynflow inside Foreman smart proxy\n"
98
112
  email:
99
113
  - inecas@redhat.com
@@ -109,33 +123,31 @@ files:
109
123
  - lib/smart_proxy_dynflow/callback.rb
110
124
  - lib/smart_proxy_dynflow/helpers.rb
111
125
  - lib/smart_proxy_dynflow/http_config.ru
112
- - lib/smart_proxy_dynflow/http_config_with_executor.ru
113
126
  - lib/smart_proxy_dynflow/plugin.rb
114
127
  - lib/smart_proxy_dynflow/proxy_adapter.rb
115
128
  - lib/smart_proxy_dynflow/version.rb
116
129
  - settings.d/dynflow.yml.example
117
130
  homepage: https://github.com/theforeman/smart_proxy_dynflow
118
131
  licenses:
119
- - GPLv3
132
+ - GPL-3.0
120
133
  metadata: {}
121
- post_install_message:
134
+ post_install_message:
122
135
  rdoc_options: []
123
136
  require_paths:
124
137
  - lib
125
138
  required_ruby_version: !ruby/object:Gem::Requirement
126
139
  requirements:
127
- - - ">="
140
+ - - "~>"
128
141
  - !ruby/object:Gem::Version
129
- version: '0'
142
+ version: '2.5'
130
143
  required_rubygems_version: !ruby/object:Gem::Requirement
131
144
  requirements:
132
145
  - - ">="
133
146
  - !ruby/object:Gem::Version
134
147
  version: '0'
135
148
  requirements: []
136
- rubyforge_project:
137
- rubygems_version: 2.7.3
138
- signing_key:
149
+ rubygems_version: 3.1.2
150
+ signing_key:
139
151
  specification_version: 4
140
152
  summary: Dynflow runtime for Foreman smart proxy
141
153
  test_files: []
@@ -1,8 +0,0 @@
1
- require 'smart_proxy_dynflow_core/api'
2
- require 'smart_proxy_dynflow_core/launcher'
3
-
4
- SmartProxyDynflowCore::Settings.load_from_proxy(p)
5
-
6
- map "/dynflow" do
7
- SmartProxyDynflowCore::Launcher.route_mapping(self)
8
- end