kafo 5.1.0 → 6.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 +4 -4
- data/README.md +1 -0
- data/Rakefile +8 -1
- data/doc/kafo_run.png +0 -0
- data/doc/kafo_run.uml +2 -0
- data/lib/kafo/app_option/declaration.rb +17 -0
- data/lib/kafo/app_option/definition.rb +14 -0
- data/lib/kafo/color_scheme.rb +2 -2
- data/lib/kafo/configuration.rb +26 -8
- data/lib/kafo/exit_handler.rb +1 -1
- data/lib/kafo/help_builders/base.rb +5 -3
- data/lib/kafo/help_builders/basic.rb +13 -2
- data/lib/kafo/hook_context.rb +81 -18
- data/lib/kafo/hooking.rb +27 -14
- data/lib/kafo/kafo_configure.rb +147 -122
- data/lib/kafo/logger.rb +13 -123
- data/lib/kafo/logging.rb +128 -0
- data/lib/kafo/param.rb +3 -3
- data/lib/kafo/progress_bar.rb +13 -1
- data/lib/kafo/puppet_command.rb +8 -1
- data/lib/kafo/puppet_log_parser.rb +10 -4
- data/lib/kafo/puppet_module.rb +6 -6
- data/lib/kafo/scenario_manager.rb +11 -11
- data/lib/kafo/store.rb +1 -1
- data/lib/kafo/string_helper.rb +1 -1
- data/lib/kafo/system_checker.rb +1 -1
- data/lib/kafo/version.rb +1 -1
- data/lib/kafo/wizard.rb +18 -8
- metadata +12 -10
- data/modules/kafo_configure/spec/fixtures/manifests/site.pp +0 -0
data/lib/kafo/logger.rb
CHANGED
@@ -1,138 +1,28 @@
|
|
1
1
|
# encoding: UTF-8
|
2
|
-
require '
|
3
|
-
require 'logging'
|
2
|
+
require 'kafo/logging'
|
4
3
|
|
5
4
|
module Kafo
|
6
5
|
class Logger
|
7
|
-
class << self
|
8
|
-
attr_writer :loggers
|
9
6
|
|
10
|
-
|
11
|
-
@loggers ||= []
|
12
|
-
end
|
13
|
-
|
14
|
-
def buffer
|
15
|
-
@buffer ||= []
|
16
|
-
end
|
17
|
-
|
18
|
-
def error_buffer
|
19
|
-
@error_buffer ||= []
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
PATTERN = "[%5l %d %c] %m\n"
|
24
|
-
Logging.color_scheme('bright',
|
25
|
-
:levels => {
|
26
|
-
:info => :green,
|
27
|
-
:warn => :yellow,
|
28
|
-
:error => :red,
|
29
|
-
:fatal => [:white, :on_red]
|
30
|
-
},
|
31
|
-
:date => :blue,
|
32
|
-
:logger => :cyan,
|
33
|
-
:line => :yellow,
|
34
|
-
:file => :yellow,
|
35
|
-
:method => :yellow
|
36
|
-
)
|
37
|
-
COLOR_LAYOUT = Logging::Layouts::Pattern.new(:pattern => PATTERN, :color_scheme => 'bright')
|
38
|
-
NOCOLOR_LAYOUT = Logging::Layouts::Pattern.new(:pattern => PATTERN, :color_scheme => nil)
|
39
|
-
|
40
|
-
def self.setup_fatal_logger(layout)
|
41
|
-
fatal_logger = Logging.logger['fatal']
|
42
|
-
fatal_logger.level = 'fatal'
|
43
|
-
fatal_logger.appenders = [::Logging.appenders.stderr(:layout => layout)]
|
44
|
-
self.loggers << fatal_logger
|
45
|
-
end
|
46
|
-
|
47
|
-
def self.setup
|
48
|
-
begin
|
49
|
-
FileUtils.mkdir_p(KafoConfigure.config.app[:log_dir], :mode => 0750)
|
50
|
-
rescue Errno::EACCES
|
51
|
-
puts "No permissions to create log dir #{KafoConfigure.config.app[:log_dir]}"
|
52
|
-
end
|
53
|
-
|
54
|
-
logger = Logging.logger['main']
|
55
|
-
filename = KafoConfigure.config.log_file
|
56
|
-
begin
|
57
|
-
logger.appenders = ::Logging.appenders.rolling_file('configure',
|
58
|
-
:filename => filename,
|
59
|
-
:layout => NOCOLOR_LAYOUT,
|
60
|
-
:truncate => true
|
61
|
-
)
|
62
|
-
# set owner and group (it's ignored if attribute is nil)
|
63
|
-
FileUtils.chown KafoConfigure.config.app[:log_owner], KafoConfigure.config.app[:log_group], filename
|
64
|
-
rescue ArgumentError
|
65
|
-
puts "File #{filename} not writeable, won't log anything to file!"
|
66
|
-
end
|
67
|
-
|
68
|
-
logger.level = KafoConfigure.config.app[:log_level]
|
69
|
-
self.loggers << logger
|
70
|
-
|
71
|
-
setup_fatal_logger(color_layout) unless loggers.detect {|l| l.name == 'verbose'}
|
72
|
-
end
|
73
|
-
|
74
|
-
def self.setup_verbose
|
75
|
-
logger = Logging.logger['verbose']
|
76
|
-
logger.level = (KafoConfigure.config && KafoConfigure.config.app[:verbose_log_level]) || :info
|
77
|
-
layout = color_layout
|
78
|
-
logger.appenders = [::Logging.appenders.stdout(:layout => layout)]
|
79
|
-
self.loggers<< logger
|
80
|
-
end
|
7
|
+
attr_reader :logger, :name
|
81
8
|
|
82
|
-
def
|
83
|
-
|
9
|
+
def initialize(name = 'root')
|
10
|
+
@name = name
|
11
|
+
@logger = (name == 'root') ? Logging.root_logger : Logging.add_logger(name)
|
84
12
|
end
|
85
13
|
|
86
|
-
def
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
def self.to_buffer(buffer, *args)
|
91
|
-
buffer << args
|
92
|
-
end
|
93
|
-
|
94
|
-
def self.dump_errors
|
95
|
-
setup_fatal_logger(color_layout) if loggers.empty?
|
96
|
-
unless self.error_buffer.empty?
|
97
|
-
loggers.each { |logger| logger.error 'Errors encountered during run:' }
|
98
|
-
self.dump_buffer(self.error_buffer)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
def dump_errors
|
103
|
-
self.class.dump_errors
|
104
|
-
end
|
105
|
-
|
106
|
-
def self.dump_buffer(buffer)
|
107
|
-
buffer.each do |log|
|
108
|
-
self.loggers.each { |logger| logger.send log[0], *([log[1]].flatten(1)), &log[2] }
|
109
|
-
end
|
110
|
-
buffer.clear
|
111
|
-
end
|
112
|
-
|
113
|
-
def self.color_layout
|
114
|
-
KafoConfigure.use_colors? ? COLOR_LAYOUT : NOCOLOR_LAYOUT
|
115
|
-
end
|
116
|
-
|
117
|
-
def log(name, *args, &block)
|
118
|
-
if self.class.buffering?
|
119
|
-
self.class.to_buffer(self.class.buffer, name, args, &block)
|
14
|
+
def log(level, *args, &block)
|
15
|
+
if Logging.buffering?
|
16
|
+
Logging.to_buffer(@name, level, args, &block)
|
120
17
|
else
|
121
|
-
|
122
|
-
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
%w(warn info debug).each do |name|
|
127
|
-
define_method(name) do |*args, &block|
|
128
|
-
self.log(name, *args, &block)
|
18
|
+
Logging.dump_buffer if Logging.dump_needed?
|
19
|
+
@logger.send(level, *args, &block)
|
129
20
|
end
|
130
21
|
end
|
131
22
|
|
132
|
-
|
133
|
-
define_method(
|
134
|
-
|
135
|
-
self.log(name, *args, &block)
|
23
|
+
Logging::LOG_LEVELS.each do |level|
|
24
|
+
define_method(level) do |*args, &block|
|
25
|
+
log(level, *args, &block)
|
136
26
|
end
|
137
27
|
end
|
138
28
|
end
|
data/lib/kafo/logging.rb
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
require 'logging'
|
5
|
+
|
6
|
+
module Kafo
|
7
|
+
class Logging
|
8
|
+
|
9
|
+
LOG_LEVELS = [:debug, :info, :notice, :warn, :error, :fatal]
|
10
|
+
|
11
|
+
if ::Logging::LEVELS.keys.map(&:to_symbol) != LOG_LEVELS
|
12
|
+
::Logging.init(:debug, :info, :notice, :warn, :error, :fatal)
|
13
|
+
end
|
14
|
+
|
15
|
+
class << self
|
16
|
+
def root_logger
|
17
|
+
@root_logger ||= ::Logging.logger.root
|
18
|
+
end
|
19
|
+
|
20
|
+
def setup(verbose: false)
|
21
|
+
set_color_scheme
|
22
|
+
|
23
|
+
level = KafoConfigure.config.app[:log_level]
|
24
|
+
|
25
|
+
setup_file_logging(
|
26
|
+
level,
|
27
|
+
KafoConfigure.config.app[:log_dir],
|
28
|
+
KafoConfigure.config.app[:log_owner],
|
29
|
+
KafoConfigure.config.app[:log_group]
|
30
|
+
)
|
31
|
+
setup_verbose(level: KafoConfigure.config.app[:verbose_log_level] || level) if verbose
|
32
|
+
end
|
33
|
+
|
34
|
+
def setup_file_logging(log_level, log_dir, log_owner, log_group)
|
35
|
+
filename = KafoConfigure.config.log_file
|
36
|
+
|
37
|
+
begin
|
38
|
+
FileUtils.mkdir_p(log_dir, :mode => 0750)
|
39
|
+
rescue Errno::EACCES
|
40
|
+
puts "No permissions to create log dir #{log_dir}"
|
41
|
+
end
|
42
|
+
|
43
|
+
begin
|
44
|
+
root_logger.appenders = ::Logging.appenders.rolling_file(
|
45
|
+
'configure',
|
46
|
+
level: log_level,
|
47
|
+
filename: filename,
|
48
|
+
layout: layout(color: false),
|
49
|
+
truncate: true,
|
50
|
+
roll_by: 'date'
|
51
|
+
)
|
52
|
+
|
53
|
+
FileUtils.chown(
|
54
|
+
log_owner,
|
55
|
+
log_group,
|
56
|
+
filename
|
57
|
+
)
|
58
|
+
rescue ArgumentError
|
59
|
+
puts "File #{filename} not writeable, won't log anything to file!"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def set_color_scheme
|
64
|
+
::Logging.color_scheme(
|
65
|
+
'bright',
|
66
|
+
:levels => {
|
67
|
+
:info => :cyan,
|
68
|
+
:notice => :green,
|
69
|
+
:warn => :yellow,
|
70
|
+
:error => :red,
|
71
|
+
:fatal => [:white, :on_red]
|
72
|
+
},
|
73
|
+
:date => :blue,
|
74
|
+
:logger => :cyan,
|
75
|
+
:line => :yellow,
|
76
|
+
:file => :yellow,
|
77
|
+
:method => :yellow
|
78
|
+
)
|
79
|
+
end
|
80
|
+
|
81
|
+
def layout(color: false)
|
82
|
+
::Logging::Layouts::Pattern.new(
|
83
|
+
pattern: "%d [%-6l] [%c] %m\n",
|
84
|
+
color_scheme: color ? 'bright' : nil,
|
85
|
+
date_pattern: '%Y-%m-%d %H:%M:%S'
|
86
|
+
)
|
87
|
+
end
|
88
|
+
|
89
|
+
def add_logger(name)
|
90
|
+
::Logging.logger[name]
|
91
|
+
end
|
92
|
+
|
93
|
+
def setup_verbose(level: :notice)
|
94
|
+
root_logger.add_appenders(
|
95
|
+
::Logging.appenders.stdout(
|
96
|
+
'verbose',
|
97
|
+
layout: layout(color: KafoConfigure.use_colors?),
|
98
|
+
level: level
|
99
|
+
)
|
100
|
+
)
|
101
|
+
end
|
102
|
+
|
103
|
+
def buffer
|
104
|
+
@buffer ||= []
|
105
|
+
end
|
106
|
+
|
107
|
+
def buffering?
|
108
|
+
root_logger.appenders.empty?
|
109
|
+
end
|
110
|
+
|
111
|
+
def dump_needed?
|
112
|
+
!buffer.empty?
|
113
|
+
end
|
114
|
+
|
115
|
+
def to_buffer(*args)
|
116
|
+
buffer << args
|
117
|
+
end
|
118
|
+
|
119
|
+
def dump_buffer
|
120
|
+
@buffer.each do |log|
|
121
|
+
::Logging.logger[log[0]].send(log[1], *([log[2]].flatten(2)), &log[3])
|
122
|
+
end
|
123
|
+
@buffer.clear
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
end
|
data/lib/kafo/param.rb
CHANGED
@@ -123,12 +123,12 @@ module Kafo
|
|
123
123
|
@type.multivalued?
|
124
124
|
end
|
125
125
|
|
126
|
-
def <=>
|
126
|
+
def <=>(other)
|
127
127
|
unless @module.configuration.app[:no_prefix]
|
128
|
-
r = self.module_name <=>
|
128
|
+
r = self.module_name <=> other.module_name
|
129
129
|
return r unless r == 0
|
130
130
|
end
|
131
|
-
self.name <=>
|
131
|
+
self.name <=> other.name
|
132
132
|
end
|
133
133
|
|
134
134
|
def visible?(context = [])
|
data/lib/kafo/progress_bar.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: UTF-8
|
2
|
+
require 'highline'
|
2
3
|
require 'powerbar'
|
3
4
|
require 'ansi/code'
|
4
5
|
require 'set'
|
@@ -20,7 +21,7 @@ module Kafo
|
|
20
21
|
@all_lines = 0
|
21
22
|
@total = :unknown
|
22
23
|
@resources = Set.new
|
23
|
-
@term_width =
|
24
|
+
@term_width = terminal_width
|
24
25
|
@bar = PowerBar.new
|
25
26
|
@bar.settings.tty.infinite.template.main = infinite_template
|
26
27
|
@bar.settings.tty.finite.template.main = finite_template
|
@@ -85,6 +86,17 @@ module Kafo
|
|
85
86
|
|
86
87
|
private
|
87
88
|
|
89
|
+
def terminal_width
|
90
|
+
# HighLine 2 has Terminal, 1 has SystemExtensions
|
91
|
+
terminal_size = if HighLine.respond_to?(:default_instance)
|
92
|
+
HighLine.default_instance.terminal.terminal_size
|
93
|
+
else
|
94
|
+
HighLine::SystemExtensions.terminal_size
|
95
|
+
end
|
96
|
+
|
97
|
+
terminal_size ? (terminal_size[0] || 0) : 0
|
98
|
+
end
|
99
|
+
|
88
100
|
def done_message
|
89
101
|
text = 'Done'
|
90
102
|
text + (' ' * (50 - text.length))
|
data/lib/kafo/puppet_command.rb
CHANGED
@@ -43,8 +43,15 @@ module Kafo
|
|
43
43
|
File.join([bin_path, bin_name].compact)
|
44
44
|
end
|
45
45
|
|
46
|
+
def self.is_aio_puppet?
|
47
|
+
puppet_command = search_puppet_path('puppet')
|
48
|
+
File.realpath(puppet_command).start_with?('/opt/puppetlabs')
|
49
|
+
rescue Errno::ENOENT
|
50
|
+
false
|
51
|
+
end
|
52
|
+
|
46
53
|
def self.format_command(command)
|
47
|
-
if
|
54
|
+
if is_aio_puppet?
|
48
55
|
[clean_env_vars, command, :unsetenv_others => true]
|
49
56
|
else
|
50
57
|
[::ENV, command, :unsetenv_others => false]
|
@@ -8,16 +8,22 @@ module Kafo
|
|
8
8
|
method, message = case
|
9
9
|
when line =~ /^Error:(.*)/i || line =~ /^Err:(.*)/i
|
10
10
|
[:error, $1]
|
11
|
-
when line =~ /^
|
12
|
-
[:warn, $1]
|
13
|
-
when line =~ /^Info:(.*)/i
|
11
|
+
when line =~ /^Notice:(.*)/i
|
14
12
|
[:info, $1]
|
15
|
-
when line =~ /^Debug:(.*)/i
|
13
|
+
when line =~ /^Warning:(.*)/i || line =~ /^Debug:(.*)/i || line =~ /^Info:(.*)/i
|
16
14
|
[:debug, $1]
|
17
15
|
else
|
18
16
|
[@last_level.nil? ? :info : @last_level, line]
|
19
17
|
end
|
20
18
|
|
19
|
+
if message.include?('Loading facts') && method != :error
|
20
|
+
method = :debug
|
21
|
+
end
|
22
|
+
|
23
|
+
if message.include?('Applying configuration version')
|
24
|
+
method = :debug
|
25
|
+
end
|
26
|
+
|
21
27
|
@last_level = method
|
22
28
|
return [method, message.chomp.strip]
|
23
29
|
end
|
data/lib/kafo/puppet_module.rb
CHANGED
@@ -96,16 +96,16 @@ module Kafo
|
|
96
96
|
Hash[params.map { |param| [param.name, param.value] }]
|
97
97
|
end
|
98
98
|
|
99
|
-
def <=>
|
99
|
+
def <=>(other)
|
100
100
|
@configuration.app[:low_priority_modules].each do |module_name|
|
101
|
-
return 1 if self.name.include?(module_name) && !
|
102
|
-
return -1 if !self.name.include?(module_name) &&
|
103
|
-
if self.name.include?(module_name) &&
|
104
|
-
return self.name.sub(/.*#{module_name}/, '') <=>
|
101
|
+
return 1 if self.name.include?(module_name) && !other.name.include?(module_name)
|
102
|
+
return -1 if !self.name.include?(module_name) && other.name.include?(module_name)
|
103
|
+
if self.name.include?(module_name) && other.name.include?(module_name)
|
104
|
+
return self.name.sub(/.*#{module_name}/, '') <=> other.name.sub(/.*#{module_name}/, '')
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
108
|
-
self.name <=>
|
108
|
+
self.name <=> other.name
|
109
109
|
end
|
110
110
|
|
111
111
|
private
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: UTF-8
|
2
|
+
require 'highline/import'
|
2
3
|
require 'kafo_wizards'
|
3
4
|
require 'pathname'
|
4
5
|
|
@@ -6,7 +7,8 @@ module Kafo
|
|
6
7
|
class ScenarioManager
|
7
8
|
attr_reader :config_dir, :last_scenario_link, :previous_scenario
|
8
9
|
|
9
|
-
def initialize(config, last_scenario_link_name='last_scenario.yaml')
|
10
|
+
def initialize(config, last_scenario_link_name = 'last_scenario.yaml')
|
11
|
+
@logger = Logger.new('scenario_manager')
|
10
12
|
@config_dir = File.file?(config) ? File.dirname(config) : config
|
11
13
|
@last_scenario_link = File.join(config_dir, last_scenario_link_name)
|
12
14
|
@previous_scenario = File.exist?(last_scenario_link) ? Pathname.new(last_scenario_link).realpath.to_s : nil
|
@@ -76,7 +78,7 @@ module Kafo
|
|
76
78
|
!!(defined?(CONFIG_DIR) && CONFIG_DIR)
|
77
79
|
end
|
78
80
|
|
79
|
-
def scenario_from_args(arg_name='--scenario|-S')
|
81
|
+
def scenario_from_args(arg_name = '--scenario|-S')
|
80
82
|
# try scenario provided in the args via -S or --scenario
|
81
83
|
ARGV.each_with_index do |arg, index|
|
82
84
|
parsed = arg.match(/^(#{arg_name})($|=(?<scenario>\S+))/)
|
@@ -123,7 +125,7 @@ module Kafo
|
|
123
125
|
dump_log_and_exit(0)
|
124
126
|
else
|
125
127
|
confirm_scenario_change(scenario)
|
126
|
-
|
128
|
+
@logger.notice "Scenario #{scenario} was selected"
|
127
129
|
end
|
128
130
|
end
|
129
131
|
end
|
@@ -166,7 +168,7 @@ module Kafo
|
|
166
168
|
elsif !ARGV.include?('--force') && !KafoConfigure.in_help_mode?
|
167
169
|
message = "You are trying to replace existing installation with different scenario. This may lead to unpredictable states. " +
|
168
170
|
"Use --force to override. You can use --compare-scenarios to see the differences"
|
169
|
-
|
171
|
+
@logger.error(message)
|
170
172
|
dump_log_and_exit(:scenario_error)
|
171
173
|
end
|
172
174
|
true
|
@@ -225,19 +227,17 @@ module Kafo
|
|
225
227
|
|
226
228
|
def fail_now(message, exit_code)
|
227
229
|
$stderr.puts "ERROR: #{message}"
|
228
|
-
|
230
|
+
@logger.error message
|
229
231
|
KafoConfigure.exit(exit_code)
|
230
232
|
end
|
231
233
|
|
232
234
|
def dump_log_and_exit(code)
|
233
|
-
if
|
234
|
-
Logger.setup_verbose
|
235
|
-
KafoConfigure.verbose = true
|
235
|
+
if Logging.buffering? && Logging.buffer.any?
|
236
236
|
if !KafoConfigure.config.nil?
|
237
|
-
|
238
|
-
|
237
|
+
Logging.setup(verbose: true)
|
238
|
+
@logger.notice("Log was be written to #{KafoConfigure.config.log_file}")
|
239
239
|
end
|
240
|
-
|
240
|
+
@logger.notice('Logs flushed')
|
241
241
|
end
|
242
242
|
KafoConfigure.exit(code)
|
243
243
|
end
|