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.
@@ -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 = [])
@@ -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 = HighLine::SystemExtensions.terminal_size[0] || 0
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))
@@ -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,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 =~ /^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
28
  return [method, message.chomp.strip]
23
29
  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
@@ -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
- KafoConfigure.logger.info "Scenario #{scenario} was selected"
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
- KafoConfigure.logger.error(message)
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
- KafoConfigure.logger.error message
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 Logger.buffering? && Logger.buffer.any?
234
- Logger.setup_verbose
235
- KafoConfigure.verbose = true
235
+ if Logging.buffering? && Logging.buffer.any?
236
236
  if !KafoConfigure.config.nil?
237
- Logger.setup
238
- KafoConfigure.logger.info("Log was be written to #{KafoConfigure.config.log_file}")
237
+ Logging.setup(verbose: true)
238
+ @logger.notice("Log was be written to #{KafoConfigure.config.log_file}")
239
239
  end
240
- KafoConfigure.logger.info('Logs flushed')
240
+ @logger.notice('Logs flushed')
241
241
  end
242
242
  KafoConfigure.exit(code)
243
243
  end