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.
@@ -1,138 +1,28 @@
1
1
  # encoding: UTF-8
2
- require 'fileutils'
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
- def loggers
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 self.buffering?
83
- KafoConfigure.verbose.nil? || ((KafoConfigure.verbose && !loggers.detect {|l| l.name == 'verbose'}) || self.loggers.empty?)
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 self.dump_needed?
87
- !self.buffer.empty?
88
- end
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
- self.class.dump_buffer(self.class.buffer) if self.class.dump_needed?
122
- self.class.loggers.each { |logger| logger.send name, *args, &block }
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
- %w(fatal error).each do |name|
133
- define_method(name) do |*args, &block|
134
- self.class.to_buffer(self.class.error_buffer, name, *args, &block)
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
@@ -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
@@ -123,12 +123,12 @@ module Kafo
123
123
  @type.multivalued?
124
124
  end
125
125
 
126
- def <=> o
126
+ def <=>(other)
127
127
  unless @module.configuration.app[:no_prefix]
128
- r = self.module_name <=> o.module_name
128
+ r = self.module_name <=> other.module_name
129
129
  return r unless r == 0
130
130
  end
131
- self.name <=> o.name
131
+ self.name <=> other.name
132
132
  end
133
133
 
134
134
  def visible?(context = [])
@@ -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 search_puppet_path('puppet').start_with?('/opt/puppetlabs')
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 =~ /^Warning:(.*)/i || line =~ /^Notice:(.*)/i
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
@@ -96,16 +96,16 @@ module Kafo
96
96
  Hash[params.map { |param| [param.name, param.value] }]
97
97
  end
98
98
 
99
- def <=> o
99
+ def <=>(other)
100
100
  @configuration.app[:low_priority_modules].each do |module_name|
101
- return 1 if self.name.include?(module_name) && !o.name.include?(module_name)
102
- return -1 if !self.name.include?(module_name) && o.name.include?(module_name)
103
- if self.name.include?(module_name) && o.name.include?(module_name)
104
- return self.name.sub(/.*#{module_name}/, '') <=> o.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 <=> o.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
- KafoConfigure.logger.info "Scenario #{scenario} was selected"
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
- KafoConfigure.logger.error(message)
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
- KafoConfigure.logger.error message
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 Logger.buffering? && Logger.buffer.any?
234
- Logger.setup_verbose
235
- KafoConfigure.verbose = true
234
+ if Logging.buffering? && Logging.buffer.any?
236
235
  if !KafoConfigure.config.nil?
237
- Logger.setup
238
- KafoConfigure.logger.info("Log was be written to #{KafoConfigure.config.log_file}")
236
+ Logging.setup(verbose: true)
237
+ @logger.notice("Log was be written to #{KafoConfigure.config.log_file}")
239
238
  end
240
- KafoConfigure.logger.info('Logs flushed')
239
+ @logger.notice('Logs flushed')
241
240
  end
242
241
  KafoConfigure.exit(code)
243
242
  end
@@ -4,7 +4,7 @@ module Kafo
4
4
  class Store
5
5
  attr_accessor :data
6
6
 
7
- def initialize(path=nil)
7
+ def initialize(path = nil)
8
8
  @data = {}
9
9
  load_path(path) if path
10
10
  end
@@ -18,7 +18,7 @@ module Kafo
18
18
  "#{prefix}#{d(param.name)}"
19
19
  end
20
20
 
21
- def parametrize(param, prefix='')
21
+ def parametrize(param, prefix = '')
22
22
  "--#{prefix}#{with_prefix(param)}"
23
23
  end
24
24
  end