runtime_config 0.2.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 +7 -0
- data/README.md +41 -0
- data/lib/runtime_config.rb +4 -0
- data/lib/runtime_config/conf.html.erb +72 -0
- data/lib/runtime_config/conf_param.rb +19 -0
- data/lib/runtime_config/middleware.rb +115 -0
- data/lib/runtime_config/version.rb +5 -0
- metadata +70 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 58dcecc281bda9d8d52d275e0e1fc5f4df94ac14
|
4
|
+
data.tar.gz: fc338520a97a7331942645e19a864ff3e4c5f51e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 89d4ef80414aa18f57efd1b51129a9765419945fec1ec1de4bdac5b49c3b1658dc9f0c793ffadfd599e0da754fdf5a0f06c245838507eb0a5abf85a6a669b6db
|
7
|
+
data.tar.gz: 9acb0d7089ed1117e161d38b0a0fabca65a0ada2865bac0c5c09e11959bb1a8292b6dc7b20a009c78ff538ddd2cd3de7b6ebc33a9baabca1e9bae13f048c4260
|
data/README.md
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# Runtime Conf Tool [](https://badge.fury.io/rb/runtime_config)
|
2
|
+
|
3
|
+
A middleware to change configuration parameters at runtime for Rails 5.
|
4
|
+
|
5
|
+
## Installation and Usage
|
6
|
+
|
7
|
+
- Add this to your `Gemfile`:
|
8
|
+
|
9
|
+
`gem 'runtime_config'`
|
10
|
+
|
11
|
+
- Add to `config/environments/development.rb` (_path_ option is not mandatory, '/dev' is the default value):
|
12
|
+
|
13
|
+
`config.middleware.use RuntimeConfig::Middleware, path: '/some_path'`
|
14
|
+
|
15
|
+
- Open the path (or the one set in the option): **/dev**
|
16
|
+
|
17
|
+
## Features
|
18
|
+
|
19
|
+
- Change log level
|
20
|
+
- Filter log lines using a RegExp
|
21
|
+
- Enable/disable catching errors
|
22
|
+
- Eneble/disable verbose query logs
|
23
|
+
- Toggle cache
|
24
|
+
- Clear cache
|
25
|
+
- Restart server
|
26
|
+
|
27
|
+
## Preview
|
28
|
+
|
29
|
+

|
30
|
+
|
31
|
+
## Do you like it? Star it!
|
32
|
+
|
33
|
+
If you use this component just star it. A developer is more motivated to improve a project when there is some interest.
|
34
|
+
|
35
|
+
## Contributors
|
36
|
+
|
37
|
+
- [Mattia Roccoberton](http://blocknot.es) - creator, maintainer
|
38
|
+
|
39
|
+
## License
|
40
|
+
|
41
|
+
[MIT](LICENSE.txt)
|
@@ -0,0 +1,72 @@
|
|
1
|
+
<!doctype html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Runtime Conf Tool</title>
|
5
|
+
<link rel="stylesheet" href="//cdn.rawgit.com/milligram/milligram/master/dist/milligram.min.css">
|
6
|
+
<style>
|
7
|
+
.button { height: 2.2rem; line-height: 2.2rem; }
|
8
|
+
.mono { background: #ddd; font-family: monospace; }
|
9
|
+
.row { align-items: flex-end; }
|
10
|
+
#form_filter_logs { margin-bottom: 0; }
|
11
|
+
</style>
|
12
|
+
</head>
|
13
|
+
<body>
|
14
|
+
<div class="container">
|
15
|
+
<div class="row">
|
16
|
+
<div class="column">
|
17
|
+
<h3><a href="<%= @options[:path] %>">Runtime Conf Tool</a></h3>
|
18
|
+
</div>
|
19
|
+
</div>
|
20
|
+
<div class="row">
|
21
|
+
<div class="column">
|
22
|
+
Set log level to: <br/>
|
23
|
+
<%= RuntimeConfig::LOGGER_SEVERITY.map{ |level| '<a class="button" href="?log=' + level + '">' + level + '</a>' }.join(' ') %>
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
<div class="row">
|
27
|
+
<div class="column column-50">
|
28
|
+
<a class="button" href="?restart">Restart server</a>
|
29
|
+
<a class="button" href="?cache">Toggle cache (*)</a>
|
30
|
+
<a class="button" href="?cache_clear=1">Clear cache (*)</a>
|
31
|
+
</div>
|
32
|
+
<div class="column">
|
33
|
+
Catch errors (404, 500, etc.):<br/>
|
34
|
+
<a class="button" href="?catch_errors=1">ON (*)</a>
|
35
|
+
<a class="button button-outline" href="?catch_errors=0">OFF (*)</a>
|
36
|
+
</div>
|
37
|
+
<div class="column">
|
38
|
+
Verbose query logs:<br/>
|
39
|
+
<a class="button" href="?verbose_query_logs=1">ON (*)</a>
|
40
|
+
<a class="button button-outline" href="?verbose_query_logs=0">OFF (*)</a>
|
41
|
+
</div>
|
42
|
+
</div>
|
43
|
+
<div class="row">
|
44
|
+
<div class="column column-80">
|
45
|
+
Filter logs (using a Regexp, ex. <span class="mono">app/views</span>) (*): <br/>
|
46
|
+
<form method="get" id="form_filter_logs">
|
47
|
+
<input type="text" name="filter_logs" />
|
48
|
+
</form>
|
49
|
+
</div>
|
50
|
+
<div class="column">
|
51
|
+
<input type="button" value="Filter" onclick="Javascript: document.querySelector('#form_filter_logs').submit()" />
|
52
|
+
</div>
|
53
|
+
</div>
|
54
|
+
<div class="row">
|
55
|
+
<div class="column">
|
56
|
+
<em>(*) restarts the server</em><br/>
|
57
|
+
<pre><code><% if @actions && @actions.any? %>
|
58
|
+
<%= @actions.join("\n") %>
|
59
|
+
<% else %>
|
60
|
+
Rails.logger.level: <b><%= RuntimeConfig::LOGGER_SEVERITY[Rails.logger.level] %></b>
|
61
|
+
Rails.application.config.active_record.verbose_query_logs: <b><%= Rails.application.config.active_record.verbose_query_logs %></b>
|
62
|
+
Rails.application.config.consider_all_requests_local: <b><%= Rails.application.config.consider_all_requests_local %></b>
|
63
|
+
|
64
|
+
Rails.cache: <b><%= Rails.application.config.cache_store == :null_store ? '-' : Rails.cache.inspect %></b>
|
65
|
+
Rails.application.config.cache_store: <b><%= Rails.application.config.cache_store %></b>
|
66
|
+
Rails.application.config.action_controller.perform_caching: <b><%= Rails.application.config.action_controller.perform_caching %></b>
|
67
|
+
<% end %></code></pre>
|
68
|
+
</div>
|
69
|
+
</div>
|
70
|
+
</div>
|
71
|
+
</body>
|
72
|
+
</html>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuntimeConfig
|
4
|
+
class ConfParam
|
5
|
+
attr_reader :exec, :conf, :opt, :parent
|
6
|
+
|
7
|
+
def initialize(opt, parent, conf, exec = nil)
|
8
|
+
@opt = opt
|
9
|
+
@parent = parent
|
10
|
+
@conf = conf
|
11
|
+
@exec = exec
|
12
|
+
end
|
13
|
+
|
14
|
+
def set(value)
|
15
|
+
@parent.send("#{@conf}=", value) if @parent
|
16
|
+
@exec.call(value) if @exec
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuntimeConfig
|
4
|
+
LOGGER_SEVERITY = %w[debug info warn error fatal unknown].freeze # https://github.com/ruby/ruby/blob/trunk/lib/logger.rb
|
5
|
+
|
6
|
+
class Middleware
|
7
|
+
def initialize(app, options = {})
|
8
|
+
@app = app
|
9
|
+
@params = {
|
10
|
+
assets_logs: ConfParam.new(:assets_logs, Rails.configuration.assets, :quiet),
|
11
|
+
catch_errors: ConfParam.new(:catch_errors, Rails.configuration, :consider_all_requests_local),
|
12
|
+
filter_logs: ConfParam.new(:filter_logs, nil, :filter_logs, ->(value) {
|
13
|
+
regexp = Regexp.new value, Regexp::IGNORECASE
|
14
|
+
Rails.logger = ActiveSupport::Logger.new STDOUT
|
15
|
+
Rails.logger.formatter = proc do |_severity, _time, _progname, msg|
|
16
|
+
"#{msg}\n" if msg =~ regexp
|
17
|
+
end
|
18
|
+
}),
|
19
|
+
verbose_query_logs: ConfParam.new(:verbose_query_logs, Rails.configuration.active_record, :verbose_query_logs),
|
20
|
+
}
|
21
|
+
@options = (options || {}).symbolize_keys
|
22
|
+
@options[:path] ||= '/dev'
|
23
|
+
|
24
|
+
Rails.configuration.after_initialize do
|
25
|
+
params_load.each do |k, v|
|
26
|
+
@params[k.to_sym].set v
|
27
|
+
end
|
28
|
+
params_reset
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def call(env)
|
33
|
+
req = Rack::Request.new(env)
|
34
|
+
return @app.call(env) unless req.path == @options[:path]
|
35
|
+
|
36
|
+
restart = false
|
37
|
+
@actions = []
|
38
|
+
if LOGGER_SEVERITY.include?((req.params['log'] || '').downcase)
|
39
|
+
level = "Logger::#{req.params['log'].upcase}"
|
40
|
+
Rails.logger.level = level.constantize
|
41
|
+
@actions.push "Logger level set to: #{level}"
|
42
|
+
end
|
43
|
+
if req.params.include? 'cache'
|
44
|
+
Rails.application.load_tasks
|
45
|
+
Rake::Task['dev:cache'].invoke
|
46
|
+
@actions.push 'Invoked dev:cache'
|
47
|
+
end
|
48
|
+
# if req.params.include? 'assets_logs' # NOTE: not working
|
49
|
+
# # Rails.configuration.assets.quiet = false
|
50
|
+
# params_save(@params[:assets_logs], req.params['assets_logs'] == '1')
|
51
|
+
# @actions.push "assets_logs: #{req.params['assets_logs'] == '1'}"
|
52
|
+
# restart = true
|
53
|
+
# end
|
54
|
+
if req.params.include? 'catch_errors'
|
55
|
+
params_save(@params[:catch_errors], req.params['catch_errors'] == '1')
|
56
|
+
@actions.push "catch_errors: #{req.params['catch_errors'] == '1'}"
|
57
|
+
restart = true
|
58
|
+
end
|
59
|
+
if req.params.include? 'cache_clear'
|
60
|
+
Rails.cache.clear
|
61
|
+
@actions.push "cache_clear: #{req.params['cache_clear'] == '1'}"
|
62
|
+
restart = true
|
63
|
+
end
|
64
|
+
if req.params.include? 'filter_logs'
|
65
|
+
params_save(@params[:filter_logs], req.params['filter_logs'].strip)
|
66
|
+
@actions.push "filter logs: #{req.params['filter_logs'].strip}"
|
67
|
+
restart = true
|
68
|
+
end
|
69
|
+
if req.params.include? 'verbose_query_logs'
|
70
|
+
params_save(@params[:verbose_query_logs], req.params['verbose_query_logs'] == '1')
|
71
|
+
@actions.push "verbose_query_logs: #{req.params['verbose_query_logs'] == '1'}"
|
72
|
+
restart = true
|
73
|
+
end
|
74
|
+
restart = true if req.params.include? 'restart'
|
75
|
+
if restart
|
76
|
+
restart_server
|
77
|
+
@actions.push 'Restarting server'
|
78
|
+
end
|
79
|
+
|
80
|
+
[
|
81
|
+
200,
|
82
|
+
{ 'Content-Type' => 'text/html' },
|
83
|
+
[ERB.new(
|
84
|
+
File.read(
|
85
|
+
File.join(File.dirname(__FILE__), 'conf.html.erb')
|
86
|
+
)
|
87
|
+
).result(binding)]
|
88
|
+
]
|
89
|
+
end
|
90
|
+
|
91
|
+
private
|
92
|
+
|
93
|
+
def params_load
|
94
|
+
JSON.parse Rails.root.join('tmp', '_runtime_config.txt').read
|
95
|
+
rescue StandardError
|
96
|
+
{}
|
97
|
+
end
|
98
|
+
|
99
|
+
def params_reset
|
100
|
+
Rails.root.join('tmp', '_runtime_config.txt').unlink
|
101
|
+
rescue StandardError
|
102
|
+
nil
|
103
|
+
end
|
104
|
+
|
105
|
+
def params_save(param, value)
|
106
|
+
Rails.root.join('tmp', '_runtime_config.txt').open('w') do |f|
|
107
|
+
f.puts({ param.opt => value }.to_json)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def restart_server
|
112
|
+
FileUtils.touch Rails.root.join('tmp', 'restart.txt').to_s
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
metadata
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: runtime_config
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mattia Roccoberton
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-02-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5.0'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '6.0'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '5.0'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '6.0'
|
33
|
+
description:
|
34
|
+
email:
|
35
|
+
- mat@blocknot.es
|
36
|
+
executables: []
|
37
|
+
extensions: []
|
38
|
+
extra_rdoc_files: []
|
39
|
+
files:
|
40
|
+
- README.md
|
41
|
+
- lib/runtime_config.rb
|
42
|
+
- lib/runtime_config/conf.html.erb
|
43
|
+
- lib/runtime_config/conf_param.rb
|
44
|
+
- lib/runtime_config/middleware.rb
|
45
|
+
- lib/runtime_config/version.rb
|
46
|
+
homepage: https://github.com/blocknotes/runtime_config
|
47
|
+
licenses:
|
48
|
+
- MIT
|
49
|
+
metadata: {}
|
50
|
+
post_install_message:
|
51
|
+
rdoc_options: []
|
52
|
+
require_paths:
|
53
|
+
- lib
|
54
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0'
|
59
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
requirements: []
|
65
|
+
rubyforge_project:
|
66
|
+
rubygems_version: 2.5.2.3
|
67
|
+
signing_key:
|
68
|
+
specification_version: 4
|
69
|
+
summary: A middleware to change configuration parameters at runtime for Rails 5
|
70
|
+
test_files: []
|