smart_proxy_dynflow_core 0.0.7 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5742c7365ff184933fcacedca67dec98085b1b41
4
- data.tar.gz: 31049cda89e6ccb7e4d467f3566b44fe9614bb57
3
+ metadata.gz: b0d120d38258eec260af438b2eadf540a2015236
4
+ data.tar.gz: a2d72f30ab1d4e7e31249f9273d5b630b4277966
5
5
  SHA512:
6
- metadata.gz: 15c260cd39034346bde7e66240d61210607406b41b3609ec41db1d3f76f16854f58a0ca773f112c5cd6f02c13292551b2f94a64d691f50de6f5eee9aec8505ee
7
- data.tar.gz: 4d119c22a2e8a1e888a732d4f0456195733aafdb734ae0df592711146c07ae24c32514bdeb1e41e06a7bff551074d91ac5df62b1c8c81d78c7ba58073a297ea8
6
+ metadata.gz: 67325b2dbb85f4c7a6cefcd61fc4e6b39ff529ae6478da19e32b583f347435f6cba301f9606ea6d7699557d218ac8e37701fee8009b4ec1dc9e8f24b70783183
7
+ data.tar.gz: f1ff5e54f435e69080a61c28727ec77ae68506e902bc8a3df36e170f6e827a8eb42c95093267b4d3a4a7175e8bdd813dcce454e7123e7411aba8b62e84de8803
data/Gemfile CHANGED
@@ -3,11 +3,13 @@ source 'https://rubygems.org'
3
3
  gemspec :name => 'smart_proxy_dynflow_core'
4
4
 
5
5
  group :development do
6
- gem 'smart_proxy', :git => "https://github.com/theforeman/smart-proxy", :branch => "develop"
7
6
  gem 'pry'
8
7
  end
9
8
 
10
- gem 'smart_proxy_dynflow', :path => '.'
9
+ group :test do
10
+ gem 'smart_proxy_dynflow', :path => '.'
11
+ gem 'smart_proxy', :git => "https://github.com/theforeman/smart-proxy", :branch => "develop"
12
+ end
11
13
 
12
14
  # load local gemfile
13
15
  local_gemfile = File.join(File.dirname(__FILE__), 'Gemfile.local.rb')
@@ -0,0 +1,2 @@
1
+ gem 'pry'
2
+ gem 'smart_proxy_remote_execution_ssh_core', :path => '../smart_proxy_remote_execution_ssh'
@@ -16,3 +16,5 @@
16
16
  # :ssl_ca_file: ssl/ca.pem
17
17
  # :ssl_private_key: ssl/localhost.pem
18
18
  # :ssl_certificate: ssl/certs/localhost.pem
19
+
20
+ # :log_file: /var/log/foreman-proxy/smart_proxy_dynflow_core.log
@@ -0,0 +1,95 @@
1
+ #!/bin/bash
2
+ #
3
+ # Init script for foreman smart proxy dynflow core service
4
+ #
5
+ # chkconfig: - 85 15
6
+ # description: Init script for foreman proxy dynflow core service
7
+
8
+ # Source function library.
9
+ . /etc/rc.d/init.d/functions
10
+
11
+ prog=smart_proxy_dynflow_core
12
+ RETVAL=0
13
+ SMART_PROXY_DYNFLOW_SCL_ROOT=/opt/theforeman/tfm/root
14
+ SMART_PROXY_DYNFLOW_CORE_PID=${SMART_PROXY_DYNFLOW_SCL_ROOT}/var/run/$prog/$prog.pid
15
+ SMART_PROXY_DYNFLOW_CORE_USER=${SMART_PROXY_DYNFLOW_CORE_USER:-foreman-proxy}
16
+
17
+ . /opt/theforeman/tfm/service-environment
18
+ . scl_source enable $TFM_SCLS_ENABLED
19
+
20
+ start() {
21
+ echo -n $"Starting $prog: "
22
+ daemon --user ${SMART_PROXY_DYNFLOW_CORE_USER} ${SMART_PROXY_DYNFLOW_SCL_ROOT}/usr/bin/smart_proxy_dynflow_core > /dev/null
23
+ RETVAL=$?
24
+ if [ $RETVAL = 0 ]
25
+ then
26
+ echo_success
27
+ else
28
+ echo_failure
29
+ fi
30
+
31
+ echo
32
+ return $RETVAL
33
+ }
34
+
35
+ stop() {
36
+ echo -n $"Stopping $prog: "
37
+ if [ -f ${SMART_PROXY_DYNFLOW_CORE_PID} ]; then
38
+ killproc -p ${SMART_PROXY_DYNFLOW_CORE_PID}
39
+ RETVAL=$?
40
+ else
41
+ echo -n $"$prog was not running.";
42
+ failure $"$prog was not running.";
43
+ echo
44
+ return 1
45
+ fi
46
+ echo
47
+ [ $RETVAL -eq 0 ] && rm -f ${SMART_PROXY_DYNFLOW_CORE_PID}
48
+ return $RETVAL
49
+ }
50
+
51
+ logrotate() {
52
+ echo -n $"Rotating logs for $prog: "
53
+ if [ -f ${SMART_PROXY_DYNFLOW_CORE_PID} ]; then
54
+ killproc -p ${SMART_PROXY_DYNFLOW_CORE_PID} $prog -USR1
55
+ RETVAL=$?
56
+ echo
57
+ else
58
+ echo -n $"$prog was not running.";
59
+ failure $"$prog was not running.";
60
+ echo
61
+ return 1
62
+ fi
63
+ return $RETVAL
64
+ }
65
+
66
+ # See how we were called.
67
+ case "$1" in
68
+ start)
69
+ start
70
+ ;;
71
+ stop)
72
+ stop
73
+ ;;
74
+ status)
75
+ echo -n "$prog"
76
+ status -p $SMART_PROXY_DYNFLOW_CORE_PID
77
+ RETVAL=$?
78
+ ;;
79
+ restart)
80
+ stop
81
+ start
82
+ ;;
83
+ condrestart)
84
+ stop
85
+ [ $? -eq 0 ] && start
86
+ ;;
87
+ logrotate)
88
+ logrotate
89
+ ;;
90
+ *)
91
+ echo $"Usage: $prog {start|stop|restart|condrestart|logrotate}"
92
+ exit 1
93
+ esac
94
+
95
+ exit $RETVAL
@@ -0,0 +1,14 @@
1
+ [Unit]
2
+ Description=Foreman smart proxy dynflow core service
3
+ Documentation=https://github.com/theforeman/smart_proxy_dynflow
4
+ After=network.target remote-fs.target nss-lookup.target
5
+
6
+ [Service]
7
+ Type=simple
8
+ User=foreman-proxy
9
+ PIDFile=/opt/theforeman/tfm/root/var/run/smart_proxy_dynflow_core/smart_proxy_dynflow_core.pid
10
+ EnvironmentFile=/opt/theforeman/tfm/service-environment
11
+ ExecStart=/usr/bin/scl enable $TFM_SCLS_ENABLED -- /opt/theforeman/tfm/root/usr/bin/smart_proxy_dynflow_core
12
+
13
+ [Install]
14
+ WantedBy=multi-user.target
@@ -1,3 +1,4 @@
1
+ require 'smart_proxy_dynflow_core/log'
1
2
  require 'smart_proxy_dynflow_core/settings'
2
3
  require 'smart_proxy_dynflow_core/core'
3
4
  require 'smart_proxy_dynflow_core/helpers'
@@ -7,6 +7,7 @@ module SmartProxyDynflowCore
7
7
  helpers Helpers
8
8
 
9
9
  before do
10
+ logger = Log.instance
10
11
  authorize_with_ssl_client
11
12
  content_type :json
12
13
  end
@@ -18,8 +18,7 @@ module SmartProxyDynflowCore
18
18
 
19
19
  db_file = Settings.instance.database
20
20
  if db_file.nil? || db_file.empty?
21
- # TODO: Use some kind of logger
22
- STDERR.puts "Could not open DB for dynflow at '#{db_file}', will keep data in memory. Restart will drop all dynflow data."
21
+ Log.instance.warn "Could not open DB for dynflow at '#{db_file}', will keep data in memory. Restart will drop all dynflow data."
23
22
  else
24
23
  db_conn_string += "/#{db_file}"
25
24
  end
@@ -41,7 +40,11 @@ module SmartProxyDynflowCore
41
40
  end
42
41
 
43
42
  def logger_adapter
44
- ::Dynflow::LoggerAdapters::Simple.new $stderr, 0
43
+ if Settings.instance.standalone
44
+ Log::ProxyAdapter.new(Log.instance, Log.instance.level)
45
+ else
46
+ Log::ProxyAdapter.new(Proxy::LogBuffer::Decorator.instance, Log.instance.level)
47
+ end
45
48
  end
46
49
 
47
50
  class << self
@@ -8,14 +8,11 @@ module SmartProxyDynflowCore
8
8
  if %w(yes on 1).include? request.env['HTTPS'].to_s
9
9
  if request.env['SSL_CLIENT_CERT'].to_s.empty?
10
10
  status 403
11
- # TODO: Use a logger
12
- STDERR.puts "No client SSL certificate supplied"
11
+ Log.instance.error "No client SSL certificate supplied"
13
12
  halt MultiJson.dump(:error => "No client SSL certificate supplied")
14
13
  end
15
14
  else
16
- # TODO: Use a logger
17
- # logger.debug('require_ssl_client_verification: skipping, non-HTTPS request')
18
- puts 'require_ssl_client_verification: skipping, non-HTTPS request'
15
+ Log.instance.debug 'require_ssl_client_verification: skipping, non-HTTPS request'
19
16
  end
20
17
  end
21
18
 
@@ -27,6 +27,7 @@ module SmartProxyDynflowCore
27
27
  possible_config_dirs.select { |config_dir| File.directory? config_dir }.each do |config_dir|
28
28
  break if load_config_dir(config_dir) && one_config
29
29
  end
30
+ Settings.loaded!
30
31
  end
31
32
 
32
33
  def self.route_mapping(rack_builder)
@@ -43,12 +44,10 @@ module SmartProxyDynflowCore
43
44
 
44
45
  def rack_settings
45
46
  settings = if https_enabled?
46
- # TODO: Use a logger
47
- puts "Using HTTPS"
47
+ Log.instance.debug "Using HTTPS"
48
48
  https_app
49
49
  else
50
- # TODO: Use a logger
51
- puts "Using HTTP"
50
+ Log.instance.debug "Using HTTP"
52
51
  {}
53
52
  end
54
53
  settings.merge(base_settings)
@@ -65,7 +64,9 @@ module SmartProxyDynflowCore
65
64
  :app => app,
66
65
  :Host => Settings.instance.listen,
67
66
  :Port => Settings.instance.port,
68
- :daemonize => false
67
+ :daemonize => false,
68
+ :AccessLog => [[Log.log_file, WEBrick::AccessLog::COMMON_LOG_FORMAT]],
69
+ :Logger => Log.instance
69
70
  }
70
71
  end
71
72
 
@@ -94,26 +95,21 @@ module SmartProxyDynflowCore
94
95
  def ssl_private_key
95
96
  OpenSSL::PKey::RSA.new(File.read(Settings.instance.ssl_private_key))
96
97
  rescue Exception => e
97
- # TODO: Use a logger
98
- STDERR.puts "Unable to load private SSL key. Are the values correct in settings.yml and do permissions allow reading?: #{e}"
99
- # logger.error "Unable to load private SSL key. Are the values correct in settings.yml and do permissions allow reading?: #{e}"
98
+ Log.instance.fatal "Unable to load private SSL key. Are the values correct in settings.yml and do permissions allow reading?: #{e}"
100
99
  raise e
101
100
  end
102
101
 
103
102
  def ssl_certificate
104
103
  OpenSSL::X509::Certificate.new(File.read(Settings.instance.ssl_certificate))
105
104
  rescue Exception => e
106
- # TODO: Use a logger
107
- STDERR.puts "Unable to load SSL certificate. Are the values correct in settings.yml and do permissions allow reading?: #{e}"
108
- # logger.error "Unable to load SSL certificate. Are the values correct in settings.yml and do permissions allow reading?: #{e}"
105
+ Log.instance.fatal "Unable to load SSL certificate. Are the values correct in settings.yml and do permissions allow reading?: #{e}"
109
106
  raise e
110
107
  end
111
108
 
112
109
  def load_config_dir(dir)
113
110
  settings_yml = File.join(dir, 'settings.yml')
114
111
  if File.exist? settings_yml
115
- # TODO: Use a logger
116
- puts "Loading settings from #{dir}"
112
+ Log.instance.debug "Loading settings from #{dir}"
117
113
  Settings.load_global_settings settings_yml
118
114
  Dir[File.join(dir, 'settings.d', '*.yml')].each { |path| Settings.load_plugin_settings(path) }
119
115
  true
@@ -0,0 +1,54 @@
1
+ require 'logger'
2
+ require 'dynflow'
3
+
4
+ module SmartProxyDynflowCore
5
+ class Log < ::Logger
6
+
7
+ alias_method :write, :debug
8
+
9
+ class << self
10
+ def instance
11
+ if @logger.nil?
12
+ @logger = Logger.new log_file
13
+ @logger.level = log_level
14
+ end
15
+ @logger
16
+ end
17
+
18
+ def instance=(logger)
19
+ @logger = logger
20
+ end
21
+
22
+ def reload!
23
+ @logger = nil
24
+ instance
25
+ end
26
+
27
+ def log_level
28
+ if Settings.instance.loaded && Settings.instance.log_level
29
+ ::Logger.const_get(Settings.instance.log_level.upcase)
30
+ else
31
+ Logger::WARN
32
+ end
33
+ end
34
+
35
+ def log_file
36
+ if Settings.instance.loaded && Settings.instance.log_file
37
+ Settings.instance.log_file
38
+ else
39
+ $stdout
40
+ end
41
+ end
42
+ end
43
+
44
+ class ProxyAdapter < ::Dynflow::LoggerAdapters::Simple
45
+ def initialize(logger, level = Logger::DEBUG, formatters = [::Dynflow::LoggerAdapters::Formatters::Exception])
46
+ @logger = logger
47
+ @logger.level = level
48
+ @logger.formatter = method(:formatter).to_proc
49
+ @action_logger = apply_formatters ProgNameWrapper.new(@logger, ' action'), formatters
50
+ @dynflow_logger = apply_formatters ProgNameWrapper.new(@logger, 'dynflow'), formatters
51
+ end
52
+ end
53
+ end
54
+ end
@@ -15,9 +15,16 @@ module SmartProxyDynflowCore
15
15
  :ssl_private_key => nil,
16
16
  :ssl_certificate => nil,
17
17
  :standalone => false,
18
- :plugins => {}
18
+ :log_file => '/var/log/foreman-proxy/smart_proxy_dynflow_core.log',
19
+ :log_level => :ERROR,
20
+ :plugins => {},
21
+ :loaded => false
19
22
  }
20
23
 
24
+ PROXY_SETTINGS = [:ssl_certificate, :ssl_ca_file, :ssl_private_key, :foreman_url,
25
+ :log_file, :log_level]
26
+ PLUGIN_SETTINGS = [:database, :core_url, :console_auth]
27
+
21
28
  def initialize(settings = {})
22
29
  super(DEFAULT_SETTINGS.merge(settings))
23
30
  end
@@ -34,15 +41,22 @@ module SmartProxyDynflowCore
34
41
  end
35
42
  end
36
43
 
44
+ def self.loaded!
45
+ Settings.instance.loaded = true
46
+ Log.instance.info 'Settings loaded, reloading logger'
47
+ Log.reload!
48
+ end
49
+
37
50
  def self.load_from_proxy(plugin)
38
- [:ssl_certificate, :ssl_ca_file, :ssl_private_key, :foreman_url].each do |key|
51
+ PROXY_SETTINGS.each do |key|
39
52
  SETTINGS[key] = Proxy::SETTINGS[key]
40
53
  end
41
54
  SETTINGS.callback_url = SETTINGS.foreman_url
42
- [:database, :core_url, :console_auth].each do |key|
55
+ PLUGIN_SETTINGS.each do |key|
43
56
  SETTINGS[key] = plugin.settings[key]
44
57
  end
45
58
  SETTINGS.plugins.values.each { |plugin| plugin.load_settings_from_proxy }
59
+ Settings.loaded!
46
60
  end
47
61
 
48
62
  def self.load_plugin_settings(path)
@@ -1,3 +1,3 @@
1
1
  module SmartProxyDynflowCore
2
- VERSION = '0.0.7'
2
+ VERSION = '0.1.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_proxy_dynflow_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Nečas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-18 00:00:00.000000000 Z
11
+ date: 2016-06-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -192,7 +192,8 @@ dependencies:
192
192
  - - ">="
193
193
  - !ruby/object:Gem::Version
194
194
  version: '0'
195
- description: " Use the Dynflow inside Foreman smart proxy\n"
195
+ description: |2
196
+ Use the Dynflow inside Foreman smart proxy
196
197
  email:
197
198
  - inecas@redhat.com
198
199
  executables: []
@@ -202,8 +203,11 @@ files:
202
203
  - Gemfile
203
204
  - LICENSE
204
205
  - bin/smart_proxy_dynflow_core
206
+ - bundler.d/Gemfile.local.rb
205
207
  - bundler.d/dynflow.rb
206
208
  - config/settings.yml.example
209
+ - deploy/smart_proxy_dynflow_core.init
210
+ - deploy/smart_proxy_dynflow_core.service
207
211
  - lib/smart_proxy_dynflow_core.rb
208
212
  - lib/smart_proxy_dynflow_core/api.rb
209
213
  - lib/smart_proxy_dynflow_core/bundler_helper.rb
@@ -211,6 +215,7 @@ files:
211
215
  - lib/smart_proxy_dynflow_core/core.rb
212
216
  - lib/smart_proxy_dynflow_core/helpers.rb
213
217
  - lib/smart_proxy_dynflow_core/launcher.rb
218
+ - lib/smart_proxy_dynflow_core/log.rb
214
219
  - lib/smart_proxy_dynflow_core/settings.rb
215
220
  - lib/smart_proxy_dynflow_core/testing.rb
216
221
  - lib/smart_proxy_dynflow_core/version.rb
@@ -234,9 +239,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
234
239
  version: '0'
235
240
  requirements: []
236
241
  rubyforge_project:
237
- rubygems_version: 2.4.8
242
+ rubygems_version: 2.4.5
238
243
  signing_key:
239
244
  specification_version: 4
240
245
  summary: Dynflow runtime for Foreman smart proxy
241
246
  test_files: []
242
- has_rdoc: