kafo 6.1.1 → 6.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a9ce6e0d19780eb90d3fce6d40bdb0cc6dad3c249e5f3462cbcfbc5c785abd95
4
- data.tar.gz: 0acbff7b82150ef61629a12bae8769c11fbf509e7458ebe39288493774bdcacf
3
+ metadata.gz: 4298932fae581df1967c430be034c621ed435954ac95acf7cf7b23c9b7692d40
4
+ data.tar.gz: 8ce698b286d5ec94c19adfcfc23e541c8b0599cb1399e689ee00b4413668552c
5
5
  SHA512:
6
- metadata.gz: 3a829dd674a2a4c21593b72b15fd348dcea9f7c555c02a3d3ebcfc3f84fa24abc1f46a38586399e539114a0020c74841efa4622a3b0a4b732e72dfbebe321369
7
- data.tar.gz: d047bafa9ee5b763c14c66f8dd5dfed0f35a2c18babd2609e7567b7d02b8379dd54ac07afe779fc0eb64032bc9044623e86f29f0ce16ce0385a9579f5e8b2235
6
+ metadata.gz: 769146a010f1007993961a0075a03b1cbf9c4055a59bd8259940379662eaa36003ad5a83b746452e8dd0b35ea47640eb1a3064516a7a776d6e8030c6403321a1
7
+ data.tar.gz: dd05194e14a17c54a205b5eacc35677b78fe4f036b8ab851972a8301c59b1e327555dd065772d82476a190d878d50226ed0253afe1c5dc129496ee316555bac3
data/README.md CHANGED
@@ -816,6 +816,32 @@ if app_value(:reset_foreman_db) && !app_value(:noop)
816
816
  end
817
817
  ```
818
818
 
819
+ Hooks can additionally be defined by combining all related stages into a single file
820
+ known as a Multi-stage hook. Multi-stage hooks live in a special directory inside
821
+ the hooks directory: ```$installer_dir/hooks/multi```. Taking the previous example:
822
+
823
+ ```ruby
824
+ # hooks/multi/10-reset_option_feature.rb
825
+ boot do
826
+ app_option '--reset-foreman-db', :flag, 'Drop foreman database first? You will lose all data!', :default => false
827
+ end
828
+
829
+ pre do
830
+ if app_value(:reset_foreman_db) && !app_value(:noop)
831
+ `which foreman-rake > /dev/null 2>&1`
832
+ if $?.success?
833
+ logger.info 'Dropping database!'
834
+ output = `foreman-rake db:drop 2>&1`
835
+ logger.debug output.to_s
836
+ unless $?.success?
837
+ logger.warn "Unable to drop DB, ignoring since it's not fatal, output was: '#{output}''"
838
+ end
839
+ else
840
+ logger.warn 'Foreman not installed yet, can not drop database!'
841
+ end
842
+ end
843
+ end
844
+ ```
819
845
 
820
846
  If you want to add more directories to be search you can use the "hook_dirs" option
821
847
  in the installer configuration file.
data/Rakefile CHANGED
@@ -4,7 +4,7 @@ load 'tasks/jenkins.rake'
4
4
 
5
5
  Rake::TestTask.new('test:ruby') do |t|
6
6
  t.libs << 'lib' << 'test'
7
- t.test_files = FileList['test/**/*_test.rb']
7
+ t.test_files = FileList['test/**/*_test.rb'] - FileList['test/tmp/**/*_test.rb']
8
8
  t.verbose = true
9
9
  end
10
10
 
@@ -31,6 +31,13 @@ namespace 'test' do
31
31
  end
32
32
  end
33
33
 
34
+ begin
35
+ require 'rubocop/rake_task'
36
+ RuboCop::RakeTask.new
37
+ rescue LoadError
38
+ puts 'Rubocop not loaded'
39
+ end
40
+
34
41
  CLEAN.include 'test/tmp'
35
42
 
36
43
  task :test => ['test:ruby', 'test:puppet_modules']
@@ -3,7 +3,6 @@ require_relative 'definition'
3
3
  module Kafo
4
4
  module AppOption
5
5
  module Declaration
6
-
7
6
  include Clamp::Option::Declaration
8
7
 
9
8
  def app_option(switches, type, description, opts = {}, &block)
@@ -13,7 +12,6 @@ module Kafo
13
12
  declared_options << option
14
13
  end
15
14
  end
16
-
17
15
  end
18
16
  end
19
17
  end
@@ -1,7 +1,6 @@
1
1
  module Kafo
2
2
  module AppOption
3
3
  class Definition < Clamp::Option::Definition
4
-
5
4
  def initialize(switches, type, description, options = {})
6
5
  @advanced = options.fetch(:advanced, false)
7
6
  super(switches, type, description, options)
@@ -10,7 +9,6 @@ module Kafo
10
9
  def advanced?
11
10
  @advanced
12
11
  end
13
-
14
12
  end
15
13
  end
16
14
  end
@@ -1,4 +1,4 @@
1
- require 'highline/import'
1
+ require 'highline'
2
2
 
3
3
  module Kafo
4
4
  class ColorScheme
@@ -7,7 +7,7 @@ module Kafo
7
7
  ::ENV['TERM'] && !`which tput 2> /dev/null`.empty? && `tput colors`.to_i > 0
8
8
  end
9
9
 
10
- def initialize(options={})
10
+ def initialize(options = {})
11
11
  @background = options[:background].nil? ? :dark : options[:background]
12
12
  @colors = options[:colors].nil? ? self.class.colors_possible? : options[:colors]
13
13
  end
@@ -5,43 +5,44 @@ require 'kafo/puppet_module'
5
5
  require 'kafo/color_scheme'
6
6
  require 'kafo/data_type_parser'
7
7
  require 'kafo/execution_environment'
8
+ require 'kafo/scenario_option'
8
9
 
9
10
  module Kafo
10
11
  class Configuration
11
12
  attr_reader :config_file, :answer_file, :scenario_id
12
13
 
13
14
  DEFAULT = {
14
- :name => '',
15
- :description => '',
16
- :enabled => true,
17
- :log_dir => '/var/log/kafo',
18
- :log_owner => nil,
19
- :log_group => nil,
20
- :store_dir => '',
21
- :log_name => 'configuration.log',
22
- :log_level => 'notice',
23
- :no_prefix => false,
24
- :mapping => {},
25
- :answer_file => './config/answers.yaml',
26
- :installer_dir => '.',
27
- :module_dirs => ['./modules'],
28
- :colors => Kafo::ColorScheme.colors_possible?,
29
- :color_of_background => :dark,
30
- :hook_dirs => [],
31
- :check_dirs => nil,
32
- :custom => {},
33
- :facts => {},
34
- :low_priority_modules => [],
35
- :verbose => false,
36
- :verbose_log_level => 'notice',
37
- :skip_puppet_version_check => false,
38
- :parser_cache_path => nil,
39
- :ignore_undocumented => nil,
40
- :order => nil,
41
- :hiera_config => nil,
42
- :kafo_modules_dir => nil,
43
- :config_header_file => nil,
44
- :dont_save_answers => nil,
15
+ ScenarioOption::NAME => '',
16
+ ScenarioOption::DESCRIPTION => '',
17
+ ScenarioOption::ENABLED => true,
18
+ ScenarioOption::LOG_DIR => '/var/log/kafo',
19
+ ScenarioOption::LOG_OWNER => nil,
20
+ ScenarioOption::LOG_GROUP => nil,
21
+ ScenarioOption::STORE_DIR => '',
22
+ ScenarioOption::LOG_NAME => 'configuration.log',
23
+ ScenarioOption::LOG_LEVEL => 'notice',
24
+ ScenarioOption::NO_PREFIX => false,
25
+ ScenarioOption::MAPPING => {},
26
+ ScenarioOption::ANSWER_FILE => './config/answers.yaml',
27
+ ScenarioOption::INSTALLER_DIR => '.',
28
+ ScenarioOption::MODULE_DIRS => ['./modules'],
29
+ ScenarioOption::COLORS => Kafo::ColorScheme.colors_possible?,
30
+ ScenarioOption::COLOR_OF_BACKGROUND => :dark,
31
+ ScenarioOption::HOOK_DIRS => [],
32
+ ScenarioOption::CHECK_DIRS => nil,
33
+ ScenarioOption::CUSTOM => {},
34
+ ScenarioOption::FACTS => {},
35
+ ScenarioOption::LOW_PRIORITY_MODULES => [],
36
+ ScenarioOption::VERBOSE => false,
37
+ ScenarioOption::VERBOSE_LOG_LEVEL => 'notice',
38
+ ScenarioOption::SKIP_PUPPET_VERSION_CHECK => false,
39
+ ScenarioOption::PARSER_CACHE_PATH => nil,
40
+ ScenarioOption::IGNORE_UNDOCUMENTED => nil,
41
+ ScenarioOption::ORDER => nil,
42
+ ScenarioOption::HIERA_CONFIG => nil,
43
+ ScenarioOption::KAFO_MODULES_DIR => nil,
44
+ ScenarioOption::CONFIG_HEADER_FILE => nil,
45
+ ScenarioOption::DONT_SAVE_ANSWERS => nil,
45
46
  }
46
47
 
47
48
  def self.get_scenario_id(filename)
@@ -129,7 +130,7 @@ module Kafo
129
130
  def modules
130
131
  @modules ||= begin
131
132
  register_data_types
132
- @data.keys.map { |mod| PuppetModule.new(mod, PuppetModule.find_parser, self).parse }.sort
133
+ @data.keys.map { |mod| PuppetModule.new(mod, configuration: self).parse }.sort
133
134
  end
134
135
  end
135
136
 
@@ -158,7 +159,7 @@ module Kafo
158
159
  end
159
160
 
160
161
  def add_module(name)
161
- mod = PuppetModule.new(name, PuppetModule.find_parser, self).parse
162
+ mod = PuppetModule.new(name, configuration: self).parse
162
163
  unless modules.map(&:name).include?(mod.name)
163
164
  mod.enable
164
165
  @modules << mod
@@ -170,7 +171,7 @@ module Kafo
170
171
  save_configuration(app)
171
172
  end
172
173
 
173
- def migrate_configuration(from_config, options={})
174
+ def migrate_configuration(from_config, options = {})
174
175
  keys_to_skip = options.fetch(:skip, [])
175
176
  keys = [:log_dir, :log_name, :log_level, :no_prefix,
176
177
  :colors, :color_of_background, :custom, :verbose_log_level]
@@ -197,7 +198,7 @@ module Kafo
197
198
  }
198
199
  EOS
199
200
 
200
- @logger.notice 'Loading default values from puppet modules...'
201
+ @logger.info "Loading default values from puppet modules..."
201
202
  command = PuppetCommand.new(dump_manifest, [], puppetconf, self).command
202
203
  stdout, stderr, status = Open3.capture3(*PuppetCommand.format_command(command))
203
204
 
@@ -222,7 +223,7 @@ EOS
222
223
  end
223
224
  end
224
225
 
225
- @logger.notice "... finished"
226
+ @logger.info "... finished loading default values from puppet modules."
226
227
 
227
228
  load_yaml_from_output(stdout.split($/))
228
229
  end
@@ -19,7 +19,9 @@ module Kafo
19
19
  end
20
20
 
21
21
  def typecast(value)
22
- value =~ /\d+/ ? value.to_i : value
22
+ Integer(value)
23
+ rescue TypeError, ArgumentError
24
+ value
23
25
  end
24
26
 
25
27
  def valid?(input, errors = [])
@@ -2,7 +2,9 @@ module Kafo
2
2
  module DataTypes
3
3
  class Numeric < DataType
4
4
  def typecast(value)
5
- value =~ /\d+/ ? value.to_f : value
5
+ Float(value)
6
+ rescue TypeError, ArgumentError
7
+ value
6
8
  end
7
9
 
8
10
  def valid?(input, errors = [])
@@ -8,7 +8,4 @@ module Kafo
8
8
 
9
9
  class ParserError < StandardError
10
10
  end
11
-
12
- class TypeError < StandardError
13
- end
14
11
  end
@@ -34,8 +34,8 @@ module Kafo
34
34
  #
35
35
  # @example
36
36
  # app_option ['-n', '--noop'], :flag, 'Run puppet in noop mode?', :default => false
37
- def app_option(*args)
38
- self.kafo.class.app_option(*args)
37
+ def app_option(*args, &block)
38
+ self.kafo.class.app_option(*args, &block)
39
39
  end
40
40
 
41
41
  # Returns whether the given app option exists. This is useful when there's a conditional option that is
data/lib/kafo/hooking.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'kafo/hook_context'
2
+ require 'kafo/multi_stage_hook'
2
3
 
3
4
  module Kafo
4
5
  class Hooking
@@ -36,6 +37,14 @@ module Kafo
36
37
  register(hook_type, file, &hook_block)
37
38
  end
38
39
  end
40
+
41
+ # Multi stage hooks are special
42
+ Dir.glob(File.join(base_dir, 'multi', '*.rb')).sort.each do |file|
43
+ logger.debug "Loading multi stage hook #{file}"
44
+ hook = File.read(file)
45
+ MultiStageHook.new(file, self, TYPES).instance_eval(hook, file, 1)
46
+ end
47
+
39
48
  @loaded = true
40
49
  end
41
50
  self
@@ -47,13 +56,19 @@ module Kafo
47
56
 
48
57
  def execute(group, log_stage: true)
49
58
  logger = Logger.new(group)
50
- logger.notice "Executing hooks in group #{group}" if log_stage
51
- self.hooks[group].keys.sort_by(&:to_s).each do |name|
59
+ logger.info "Executing hooks in group #{group}" if log_stage
60
+
61
+ sorted_hooks = self.hooks[group].keys.sort do |a, b|
62
+ File.basename(a.to_s) <=> File.basename(b.to_s)
63
+ end
64
+
65
+ sorted_hooks.each do |name|
52
66
  hook = self.hooks[group][name]
53
67
  result = HookContext.execute(self.kafo, logger, &hook)
54
68
  logger.debug "Hook #{name} returned #{result.inspect}"
55
69
  end
56
- logger.notice "All hooks in group #{group} finished" if log_stage
70
+
71
+ logger.info "All hooks in group #{group} finished" if log_stage
57
72
  @group = nil
58
73
  end
59
74
 
@@ -143,7 +143,14 @@ module Kafo
143
143
  # so we limit parsing only to app config options (because of --help and later defined params)
144
144
  parse clamp_app_arguments
145
145
  parse_app_arguments # set values from ARGS to config.app
146
- Logging.setup(verbose: config.app[:verbose]) unless ARGV.any? { |option| ['--help', '--full-help'].include? option }
146
+
147
+ if ARGV.any? { |option| ['--help', '--full-help'].include? option }
148
+ Logging.setup_verbose(level: :error)
149
+ else
150
+ Logging.setup(verbose: config.app[:verbose])
151
+ end
152
+
153
+ logger.notice("Loading installer configuration. This will take some time.")
147
154
  self.class.set_color_scheme
148
155
 
149
156
  self.class.hooking.execute(:init)
@@ -166,6 +173,10 @@ module Kafo
166
173
  def run(*args)
167
174
  started_at = Time.now
168
175
  logger.debug("Running installer with args #{args.inspect}")
176
+ if config.app[:verbose]
177
+ logger.notice("Running installer with log based terminal output at level #{config.app[:verbose_log_level].upcase}.")
178
+ logger.notice("Use -l to set the terminal output log level to ERROR, WARN, NOTICE, INFO, or DEBUG. See --full-help for definitions.")
179
+ end
169
180
  super
170
181
  ensure
171
182
  logger.debug("Installer finished in #{Time.now - started_at} seconds")
@@ -311,6 +322,25 @@ module Kafo
311
322
  self.class.app_option(*args, &block)
312
323
  end
313
324
 
325
+ def terminal_log_levels_message
326
+ if ARGV.include?('--full-help')
327
+ <<~HEREDOC.chomp
328
+ Log level for log based terminal output.
329
+ The available levels are
330
+ ERROR - Only show errors which prevented the installer from completing successfully.
331
+ WARN - Deprecation warnings and other information users may want to be aware of.
332
+ NOTICE - High level information about installer execution and progress.
333
+ INFO - More detailed information about execution and progress. Also shows when the installer makes a change to system configuration.
334
+ DEBUG - Show all information about execution, including configuration items where no change was needed.
335
+ HEREDOC
336
+ else
337
+ <<~HEREDOC.chomp
338
+ Log level for log based terminal output.
339
+ The available levels are ERROR, WARN, NOTICE, INFO, DEBUG. See --full-help for definitions.
340
+ HEREDOC
341
+ end
342
+ end
343
+
314
344
  def set_app_options
315
345
  app_option ['--[no-]colors'], :flag, 'Use color output on STDOUT',
316
346
  :default => config.app[:colors], :advanced => true
@@ -333,7 +363,7 @@ module Kafo
333
363
  :default => false, :advanced => true
334
364
  app_option ['-v', '--[no-]verbose'], :flag, 'Display log on STDOUT instead of progressbar',
335
365
  :default => config.app[:verbose]
336
- app_option ['-l', '--verbose-log-level'], 'LEVEL', 'Log level for verbose mode output',
366
+ app_option ['-l', '--verbose-log-level'], 'LEVEL', terminal_log_levels_message,
337
367
  :default => 'notice'
338
368
  app_option ['-S', '--scenario'], 'SCENARIO', 'Use installation scenario'
339
369
  app_option ['--disable-scenario'], 'SCENARIO', 'Disable installation scenario',
@@ -365,9 +395,9 @@ module Kafo
365
395
  params.sort.each do |param|
366
396
  doc = param.doc.nil? ? 'UNDOCUMENTED' : param.doc.join("\n")
367
397
  app_option parametrize(param), '', doc + " (current: #{param.value_to_s})",
368
- :multivalued => param.multivalued?
398
+ :multivalued => param.multivalued?
369
399
  app_option parametrize(param, 'reset-'), :flag,
370
- "Reset #{param.name} to the default value (#{param.default_to_s})"
400
+ "Reset #{param.name} to the default value (#{param.default_to_s})"
371
401
  end
372
402
  end
373
403
 
@@ -440,7 +470,7 @@ module Kafo
440
470
  end
441
471
 
442
472
  def validate_all(logging = true)
443
- logger.notice 'Running validation checks'
473
+ logger.info "Running validation checks."
444
474
  results = enabled_params.map do |param|
445
475
  result = param.valid?
446
476
  errors = param.validation_errors.join(', ')
@@ -477,13 +507,7 @@ module Kafo
477
507
  log_parser = PuppetLogParser.new
478
508
  logger = Logger.new('configure')
479
509
 
480
- start_message = <<-HEREDOC
481
- Starting system configuration.
482
- The total number of configuration tasks may increase during the run.
483
- Observe logs or specify --verbose-log-level to see individual configuration tasks.
484
- HEREDOC
485
-
486
- logger.notice(start_message.chomp)
510
+ logger.notice("Starting system configuration.")
487
511
 
488
512
  PTY.spawn(*PuppetCommand.format_command(command)) do |stdin, stdout, pid|
489
513
  begin
@@ -492,9 +516,9 @@ HEREDOC
492
516
  method, message = log_parser.parse(line)
493
517
  progress_log(method, message, logger)
494
518
 
495
- if (output = line.match(%r{(.+\]): Starting to evaluate the resource( \((?<count>\d+) of (?<total>\d+)\))?}))
496
- if (output[:count].to_i % 100) == 1 && output[:count].to_i != 1
497
- logger.notice("#{output[:count].to_i - 1} out of #{output[:total]} done.")
519
+ if (output = line.match(/(.+\]): Starting to evaluate the resource( \((?<count>\d+) of (?<total>\d+)\))?/))
520
+ if (output[:count].to_i % 250) == 1 && output[:count].to_i != 1
521
+ logger.notice("#{output[:count].to_i - 1} configuration steps out of #{output[:total]} steps complete.")
498
522
  end
499
523
  end
500
524
 
@@ -0,0 +1,13 @@
1
+ module Kafo
2
+ class MultiStageHook
3
+ def initialize(name, registry, types)
4
+ default_name = name
5
+
6
+ types.each do |hook_type|
7
+ self.class.send(:define_method, hook_type) do |name=nil, &block|
8
+ registry.send(:register, hook_type, name || default_name, &block)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
data/lib/kafo/param.rb CHANGED
@@ -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))
@@ -25,7 +25,7 @@ module Kafo
25
25
  end
26
26
  end
27
27
 
28
- def initialize(identifier, parser = self.class.find_parser, configuration = KafoConfigure.config)
28
+ def initialize(identifier, parser: nil, configuration: KafoConfigure.config)
29
29
  @identifier = identifier
30
30
  @configuration = configuration
31
31
  @name = get_name
@@ -65,6 +65,7 @@ module Kafo
65
65
  def parse(builder_klass = ParamBuilder)
66
66
  @raw_data = @parser_cache.get(identifier, manifest_path) if @parser_cache
67
67
  if @raw_data.nil?
68
+ @parser = self.class.find_parser if @parser.nil?
68
69
  if @parser.nil? || @parser == :none
69
70
  raise ParserError.new("No Puppet module parser is installed and no cache of the file #{manifest_path} is available. Please check debug logs and install optional dependencies for the parser.")
70
71
  else
@@ -96,16 +97,16 @@ module Kafo
96
97
  Hash[params.map { |param| [param.name, param.value] }]
97
98
  end
98
99
 
99
- def <=> o
100
+ def <=>(other)
100
101
  @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}/, '')
102
+ return 1 if self.name.include?(module_name) && !other.name.include?(module_name)
103
+ return -1 if !self.name.include?(module_name) && other.name.include?(module_name)
104
+ if self.name.include?(module_name) && other.name.include?(module_name)
105
+ return self.name.sub(/.*#{module_name}/, '') <=> other.name.sub(/.*#{module_name}/, '')
105
106
  end
106
107
  end
107
108
 
108
- self.name <=> o.name
109
+ self.name <=> other.name
109
110
  end
110
111
 
111
112
  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,7 @@ 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')
10
11
  @logger = Logger.new('scenario_manager')
11
12
  @config_dir = File.file?(config) ? File.dirname(config) : config
12
13
  @last_scenario_link = File.join(config_dir, last_scenario_link_name)
@@ -31,7 +32,7 @@ module Kafo
31
32
  end
32
33
 
33
34
  def list_available_scenarios
34
- say ::HighLine.color("Available scenarios", :notice)
35
+ say ::HighLine.color("Available scenarios", :info)
35
36
  available_scenarios.each do |config_file, content|
36
37
  scenario = File.basename(config_file, '.yaml')
37
38
  use = (File.expand_path(config_file) == @previous_scenario ? 'INSTALLED' : "use: --scenario #{scenario}")
@@ -77,7 +78,7 @@ module Kafo
77
78
  !!(defined?(CONFIG_DIR) && CONFIG_DIR)
78
79
  end
79
80
 
80
- def scenario_from_args(arg_name='--scenario|-S')
81
+ def scenario_from_args(arg_name = '--scenario|-S')
81
82
  # try scenario provided in the args via -S or --scenario
82
83
  ARGV.each_with_index do |arg, index|
83
84
  parsed = arg.match(/^(#{arg_name})($|=(?<scenario>\S+))/)
@@ -111,7 +112,7 @@ module Kafo
111
112
  end
112
113
 
113
114
  def show_scenario_diff(prev_scenario, new_scenario)
114
- say ::HighLine.color("Scenarios are being compared, that may take a while...", :notice)
115
+ say ::HighLine.color("Scenarios are being compared, that may take a while...", :info)
115
116
  prev_conf = load_and_setup_configuration(prev_scenario)
116
117
  new_conf = load_and_setup_configuration(new_scenario)
117
118
  print_scenario_diff(prev_conf, new_conf)
@@ -0,0 +1,92 @@
1
+ module Kafo
2
+ # A class containing constants for all scenario options
3
+ class ScenarioOption
4
+ # @group Basic
5
+
6
+ # Human readable scenario name
7
+ NAME = :name
8
+
9
+ # Description of the installer scenario and its purpose
10
+ DESCRIPTION = :description
11
+
12
+ # Path to answer file, if the file does not exist a $pwd/config/answers.yaml is used as a fallback
13
+ ANSWER_FILE = :answer_file
14
+
15
+ # Enable colors? If you don't touch this, we'll autodetect terminal capabilities
16
+ COLORS = :colors
17
+ # Color scheme, we support :bright and :dark (first is better for white background, dark for black background)
18
+ COLOR_OF_BACKGROUND = :color_of_background
19
+
20
+ # @group Logging
21
+
22
+ # Destination for the log files
23
+ LOG_DIR = :log_dir
24
+ LOG_NAME = :log_name
25
+ LOG_LEVEL = :log_level
26
+ LOG_OWNER = :log_owner
27
+ LOG_GROUP = :log_group
28
+
29
+ # Whether verbose logging is enabled
30
+ VERBOSE = :verbose
31
+
32
+ # When verbose logging is enabled, which level (and up) is shown.
33
+ VERBOSE_LOG_LEVEL = :verbose_log_level
34
+
35
+ # @group State
36
+
37
+ # Custom storage is handy if you use hooks and you must store some
38
+ # configuration which should persist among installer runs. It can be also
39
+ # used for passing value from one hook to another.
40
+ CUSTOM = :custom
41
+
42
+ FACTS = :facts
43
+
44
+ # @group Advanced
45
+
46
+ # Checks, implemented as executable files, are loaded from the listed
47
+ # directories.
48
+ CHECK_DIRS = :check_dirs
49
+
50
+ # Hooks in these extra directories will be loaded, by default they are
51
+ # loaded from $installer_dir/hooks/$type when you specify your directory,
52
+ # it will be search for $yourdir/$type/*.rb
53
+ HOOK_DIRS = :hook_dirs
54
+
55
+ # Option to load puppet modules from a specific path. Optional and
56
+ # $pwd/modules is used by default, multiple dirs are allowed
57
+ MODULE_DIRS = :module_dirs
58
+
59
+ # Kafo has a cache for information parsed from Puppet modules. This
60
+ # determines the location where that information is stored.
61
+ PARSER_CACHE_PATH = :parser_cache_path
62
+
63
+ # By default all module parameters must be documented or an error is
64
+ # raised. This can be used to not raise an error when undocumented
65
+ # parameters are found.
66
+ IGNORE_UNDOCUMENTED = :ignore_undocumented
67
+
68
+ # Kafo tuning, customization of core functionality
69
+
70
+ # An optional mapping of classes
71
+ MAPPING = :mapping
72
+ NO_PREFIX = :no_prefix
73
+ ORDER = :order
74
+ LOW_PRIORITY_MODULES = :low_priority_modules
75
+ HIERA_CONFIG = :hiera_config
76
+ KAFO_MODULES_DIR = :kafo_modules_dir
77
+ CONFIG_HEADER_FILE = :config_header_file
78
+ DONT_SAVE_ANSWERS = :dont_save_answers
79
+
80
+ # These options are in DEFAULT but not in kafo.yaml.example
81
+
82
+ # Whether the scenario is enabled or not
83
+ ENABLED = :enabled
84
+ STORE_DIR = :store_dir
85
+ INSTALLER_DIR = :installer_dir
86
+
87
+ # Puppet modules declare the Puppet version they're compatible with. Kafo
88
+ # implements checks to verify this is correct with the Puppet version
89
+ # that's running. This can be used to bypass the checks
90
+ SKIP_PUPPET_VERSION_CHECK = :skip_puppet_version_check
91
+ end
92
+ end
data/lib/kafo/store.rb CHANGED
@@ -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
data/lib/kafo/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
2
  module Kafo
3
3
  PARSER_CACHE_VERSION = 1
4
- VERSION = "6.1.1"
4
+ VERSION = "6.4.0"
5
5
  end
data/lib/kafo/wizard.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # encoding: UTF-8
2
- require 'highline/import'
2
+ require 'forwardable'
3
+ require 'highline'
3
4
  require 'yaml'
4
5
 
5
6
  module Kafo
@@ -8,14 +9,17 @@ module Kafo
8
9
  Kafo::ENV::LANG =~ /UTF-8\z/
9
10
  end
10
11
 
12
+ extend Forwardable
13
+ def_delegators :@highline, :agree, :ask, :choose, :say
14
+
11
15
  OK = utf_support? ? '✓' : 'y'
12
16
  NO = utf_support? ? '✗' : 'n'
13
17
 
14
- def initialize(kafo)
18
+ def initialize(kafo, input = $stdin, output = $stdout)
15
19
  @kafo = kafo
16
20
  @config = kafo.config
17
21
  @name = @config.app[:name] || 'Kafo'
18
- setup_terminal
22
+ @highline = setup_terminal(input, output)
19
23
  end
20
24
 
21
25
  def run
@@ -68,7 +72,7 @@ END
68
72
 
69
73
  def display_hash
70
74
  data = Hash[@config.modules.map { |mod| [mod.name, mod.enabled? ? mod.params_hash : false] }]
71
- say HighLine.color(YAML.dump(data), :notice)
75
+ say HighLine.color(YAML.dump(data), :info)
72
76
  end
73
77
 
74
78
  def configure_module(mod)
@@ -79,7 +83,7 @@ END
79
83
  menu.prompt = 'Choose an option from the menu... '
80
84
  menu.select_by = :index
81
85
 
82
- menu.choice("Enable/disable #{mod.name} module, current value: #{HighLine.color(mod.enabled?.to_s, :notice)}") { turn_module(mod) }
86
+ menu.choice("Enable/disable #{mod.name} module, current value: #{HighLine.color(mod.enabled?.to_s, :info)}") { turn_module(mod) }
83
87
  if mod.enabled?
84
88
  render_params(mod.primary_parameter_group.params, menu)
85
89
 
@@ -114,7 +118,7 @@ END
114
118
  def render_params(params, menu)
115
119
  params.each do |param|
116
120
  if param.visible?(@kafo.params)
117
- menu.choice "Set #{HighLine.color(param.name, :important)}, current value: #{HighLine.color(param.value_to_s, :notice)}" do
121
+ menu.choice "Set #{HighLine.color(param.name, :important)}, current value: #{HighLine.color(param.value_to_s, :info)}" do
118
122
  configure(param)
119
123
  end
120
124
  end
@@ -141,13 +145,13 @@ END
141
145
  end
142
146
 
143
147
  def configure_single(param)
144
- say "\ncurrent value: #{HighLine.color(param.value_to_s, :notice)}"
148
+ say "\ncurrent value: #{HighLine.color(param.value_to_s, :info)}"
145
149
  ask("new value:")
146
150
  end
147
151
 
148
152
  def configure_multi(param)
149
- say HighLine.color('every line is a separate value, blank line to quit, for hash use key:value syntax', :notice)
150
- say "\ncurrent value: #{HighLine.color(param.value_to_s, :notice)} %>"
153
+ say HighLine.color('every line is a separate value, blank line to quit, for hash use key:value syntax', :info)
154
+ say "\ncurrent value: #{HighLine.color(param.value_to_s, :info)} %>"
151
155
  ask("new value:") do |q|
152
156
  q.gather = ""
153
157
  end
@@ -164,7 +168,7 @@ END
164
168
  say "\n" + HighLine.color("Resetting parameters of module #{mod.name}", :headline)
165
169
  choose do |menu|
166
170
  mod.params.each do |param|
167
- menu.choice "Reset #{HighLine.color(param.name, :important)}, current value: #{HighLine.color(param.value_to_s, :notice)}, default value: #{HighLine.color(param.default_to_s, :notice)}" do
171
+ menu.choice "Reset #{HighLine.color(param.name, :important)}, current value: #{HighLine.color(param.value_to_s, :info)}, default value: #{HighLine.color(param.default_to_s, :info)}" do
168
172
  reset(param)
169
173
  end if param.visible?(@kafo.params)
170
174
  end
@@ -178,11 +182,17 @@ END
178
182
  say "\n" + HighLine.color("Value for #{param.name} reset to default", :important)
179
183
  end
180
184
 
181
- def setup_terminal
182
- $terminal = HighLine.new
183
- data = HighLine::SystemExtensions.terminal_size
184
- $terminal.wrap_at = data.first > 80 ? 80 : data.first if data.first
185
- $terminal.page_at = data.last if data.last
185
+ def setup_terminal(input, output)
186
+ highline = HighLine.new(input, output)
187
+ # HighLine 2 vs 1
188
+ data = if highline.respond_to?(:terminal)
189
+ highline.terminal.terminal_size
190
+ else
191
+ HighLine::SystemExtensions.terminal_size
192
+ end
193
+ highline.wrap_at = data.first > 80 ? 80 : data.first if data.first
194
+ highline.page_at = data.last if data.last
195
+ highline
186
196
  end
187
197
  end
188
198
  end
@@ -9,7 +9,7 @@
9
9
  "requirements": [
10
10
  {
11
11
  "name": "puppet",
12
- "version_requirement": ">= 4.5.0 < 7.0.0"
12
+ "version_requirement": ">= 4.5.0 < 8.0.0"
13
13
  }
14
14
  ]
15
15
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kafo
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.1.1
4
+ version: 6.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marek Hulan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-20 00:00:00.000000000 Z
11
+ date: 2021-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -171,7 +171,7 @@ dependencies:
171
171
  version: 1.6.21
172
172
  - - "<"
173
173
  - !ruby/object:Gem::Version
174
- version: '2.0'
174
+ version: '3.0'
175
175
  type: :runtime
176
176
  prerelease: false
177
177
  version_requirements: !ruby/object:Gem::Requirement
@@ -181,7 +181,7 @@ dependencies:
181
181
  version: 1.6.21
182
182
  - - "<"
183
183
  - !ruby/object:Gem::Version
184
- version: '2.0'
184
+ version: '3.0'
185
185
  - !ruby/object:Gem::Dependency
186
186
  name: powerbar
187
187
  requirement: !ruby/object:Gem::Requirement
@@ -262,6 +262,7 @@ files:
262
262
  - lib/kafo/logging.rb
263
263
  - lib/kafo/migration_context.rb
264
264
  - lib/kafo/migrations.rb
265
+ - lib/kafo/multi_stage_hook.rb
265
266
  - lib/kafo/param.rb
266
267
  - lib/kafo/param_builder.rb
267
268
  - lib/kafo/param_group.rb
@@ -275,6 +276,7 @@ files:
275
276
  - lib/kafo/puppet_log_parser.rb
276
277
  - lib/kafo/puppet_module.rb
277
278
  - lib/kafo/scenario_manager.rb
279
+ - lib/kafo/scenario_option.rb
278
280
  - lib/kafo/store.rb
279
281
  - lib/kafo/string_helper.rb
280
282
  - lib/kafo/system_checker.rb
@@ -293,7 +295,6 @@ files:
293
295
  - modules/kafo_configure/spec/classes/init_spec.rb
294
296
  - modules/kafo_configure/spec/fixtures/hiera/hiera.yaml
295
297
  - modules/kafo_configure/spec/fixtures/hiera/test.yaml
296
- - modules/kafo_configure/spec/fixtures/manifests/site.pp
297
298
  - modules/kafo_configure/spec/fixtures/modules/dummy/manifests/init.pp
298
299
  - modules/kafo_configure/spec/fixtures/modules/dummy/manifests/params.pp
299
300
  - modules/kafo_configure/spec/functions/dump_lookups_spec.rb
@@ -319,7 +320,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
319
320
  - !ruby/object:Gem::Version
320
321
  version: '0'
321
322
  requirements: []
322
- rubygems_version: 3.1.4
323
+ rubygems_version: 3.1.6
323
324
  signing_key:
324
325
  specification_version: 4
325
326
  summary: A gem for making installations based on puppet user friendly