kafo 5.0.1 → 6.1.2
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 +7 -0
- 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 +1 -1
- data/lib/kafo/configuration.rb +30 -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 +87 -19
- data/lib/kafo/hooking.rb +20 -13
- 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/puppet_command.rb +8 -1
- data/lib/kafo/puppet_log_parser.rb +11 -5
- data/lib/kafo/puppet_module.rb +6 -6
- data/lib/kafo/scenario_manager.rb +10 -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
- metadata +10 -7
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/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,18 +8,24 @@ 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
|
-
return [method, message.chomp]
|
28
|
+
return [method, message.chomp.strip]
|
23
29
|
end
|
24
30
|
end
|
25
31
|
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
|
@@ -6,7 +6,8 @@ module Kafo
|
|
6
6
|
class ScenarioManager
|
7
7
|
attr_reader :config_dir, :last_scenario_link, :previous_scenario
|
8
8
|
|
9
|
-
def initialize(config, last_scenario_link_name='last_scenario.yaml')
|
9
|
+
def initialize(config, last_scenario_link_name = 'last_scenario.yaml')
|
10
|
+
@logger = Logger.new('scenario_manager')
|
10
11
|
@config_dir = File.file?(config) ? File.dirname(config) : config
|
11
12
|
@last_scenario_link = File.join(config_dir, last_scenario_link_name)
|
12
13
|
@previous_scenario = File.exist?(last_scenario_link) ? Pathname.new(last_scenario_link).realpath.to_s : nil
|
@@ -76,7 +77,7 @@ module Kafo
|
|
76
77
|
!!(defined?(CONFIG_DIR) && CONFIG_DIR)
|
77
78
|
end
|
78
79
|
|
79
|
-
def scenario_from_args(arg_name='--scenario|-S')
|
80
|
+
def scenario_from_args(arg_name = '--scenario|-S')
|
80
81
|
# try scenario provided in the args via -S or --scenario
|
81
82
|
ARGV.each_with_index do |arg, index|
|
82
83
|
parsed = arg.match(/^(#{arg_name})($|=(?<scenario>\S+))/)
|
@@ -123,7 +124,7 @@ module Kafo
|
|
123
124
|
dump_log_and_exit(0)
|
124
125
|
else
|
125
126
|
confirm_scenario_change(scenario)
|
126
|
-
|
127
|
+
@logger.notice "Scenario #{scenario} was selected"
|
127
128
|
end
|
128
129
|
end
|
129
130
|
end
|
@@ -166,7 +167,7 @@ module Kafo
|
|
166
167
|
elsif !ARGV.include?('--force') && !KafoConfigure.in_help_mode?
|
167
168
|
message = "You are trying to replace existing installation with different scenario. This may lead to unpredictable states. " +
|
168
169
|
"Use --force to override. You can use --compare-scenarios to see the differences"
|
169
|
-
|
170
|
+
@logger.error(message)
|
170
171
|
dump_log_and_exit(:scenario_error)
|
171
172
|
end
|
172
173
|
true
|
@@ -225,19 +226,17 @@ module Kafo
|
|
225
226
|
|
226
227
|
def fail_now(message, exit_code)
|
227
228
|
$stderr.puts "ERROR: #{message}"
|
228
|
-
|
229
|
+
@logger.error message
|
229
230
|
KafoConfigure.exit(exit_code)
|
230
231
|
end
|
231
232
|
|
232
233
|
def dump_log_and_exit(code)
|
233
|
-
if
|
234
|
-
Logger.setup_verbose
|
235
|
-
KafoConfigure.verbose = true
|
234
|
+
if Logging.buffering? && Logging.buffer.any?
|
236
235
|
if !KafoConfigure.config.nil?
|
237
|
-
|
238
|
-
|
236
|
+
Logging.setup(verbose: true)
|
237
|
+
@logger.notice("Log was be written to #{KafoConfigure.config.log_file}")
|
239
238
|
end
|
240
|
-
|
239
|
+
@logger.notice('Logs flushed')
|
241
240
|
end
|
242
241
|
KafoConfigure.exit(code)
|
243
242
|
end
|
data/lib/kafo/store.rb
CHANGED