kafo 6.2.1 → 6.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +59 -0
- data/lib/kafo/configuration.rb +36 -35
- data/lib/kafo/data_type.rb +1 -1
- data/lib/kafo/data_type_parser.rb +1 -1
- data/lib/kafo/data_types/integer.rb +3 -1
- data/lib/kafo/data_types/numeric.rb +3 -1
- data/lib/kafo/data_types/scalar.rb +1 -1
- data/lib/kafo/data_types/{variant.rb → wrapped_data_type.rb} +5 -4
- data/lib/kafo/exceptions.rb +0 -3
- data/lib/kafo/fact_writer.rb +3 -4
- data/lib/kafo/hook_context.rb +2 -2
- data/lib/kafo/hooking.rb +9 -0
- data/lib/kafo/kafo_configure.rb +41 -21
- data/lib/kafo/logger.rb +7 -1
- data/lib/kafo/logging.rb +1 -1
- data/lib/kafo/multi_stage_hook.rb +13 -0
- data/lib/kafo/puppet_module.rb +3 -2
- data/lib/kafo/scenario_option.rb +92 -0
- data/lib/kafo/version.rb +1 -1
- data/lib/kafo/wizard.rb +1 -1
- data/modules/kafo_configure/lib/puppet/functions/kafo_configure/dump_lookups.rb +8 -1
- data/modules/kafo_configure/lib/puppet/functions/kafo_configure/dump_variables.rb +7 -1
- data/modules/kafo_configure/metadata.json +1 -1
- data/modules/kafo_configure/spec/fixtures/hiera/test.yaml +5 -0
- data/modules/kafo_configure/spec/fixtures/modules/dummy/manifests/init.pp +1 -0
- data/modules/kafo_configure/spec/fixtures/modules/dummy/manifests/params.pp +1 -0
- data/modules/kafo_configure/spec/functions/dump_lookups_spec.rb +1 -0
- data/modules/kafo_configure/spec/functions/dump_variables_spec.rb +1 -0
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 674a595f056324470ff9175d38779f7ab8c153e044ab4892dc99ca0d6487b7ba
|
4
|
+
data.tar.gz: 83ffe976aa56291ebad41e0e7ba22d72908bbe299d926bb1af1aa5b1fbef0a75
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a8b66a8f86409186fbf2ed5fde7b6b7eb9f6e2fadf4ab33234df205fa4702cadae85021ef043ea096f5450e8735d6b81fade0d81530f2aae43a929dfa2ac8866
|
7
|
+
data.tar.gz: bc3475cace0ec33b3ffb983f8d5921e75b1695908b6f5386b716c3e90434e9ba69f18e38af2c8c0c35372887cec1cfa167ac45c9edb10294fe55cd1384d50ab8
|
data/README.md
CHANGED
@@ -493,6 +493,39 @@ as key:value.
|
|
493
493
|
When parsing the value, the first colon divides key and value. All other
|
494
494
|
colons are ignored.
|
495
495
|
|
496
|
+
## Sensitive arguments
|
497
|
+
|
498
|
+
Puppet's `Sensitive` data type can be used as long as it's configured in Hiera
|
499
|
+
too. Given the following manifest:
|
500
|
+
|
501
|
+
```puppet
|
502
|
+
class example (
|
503
|
+
Sensitive[String[1]] $password,
|
504
|
+
) {
|
505
|
+
```
|
506
|
+
|
507
|
+
Here the following Hiera configuration is needed:
|
508
|
+
```yaml
|
509
|
+
lookup_options:
|
510
|
+
example::password:
|
511
|
+
convert_to: "Sensitive"
|
512
|
+
```
|
513
|
+
|
514
|
+
This is based on [Puppet's documentation](https://puppet.com/docs/puppet/6/securing-sensitive-data.html).
|
515
|
+
|
516
|
+
Note that to provide a default inside the manifest inheritance must be used.
|
517
|
+
|
518
|
+
```puppet
|
519
|
+
class example (
|
520
|
+
Sensitive[String[1]] $password = $example::params::password,
|
521
|
+
) inherits example::params {
|
522
|
+
}
|
523
|
+
|
524
|
+
class example::params {
|
525
|
+
$password = Sensitive('supersecret')
|
526
|
+
}
|
527
|
+
```
|
528
|
+
|
496
529
|
## Default values
|
497
530
|
|
498
531
|
Default values for parameters are read from the class definitions in the
|
@@ -816,6 +849,32 @@ if app_value(:reset_foreman_db) && !app_value(:noop)
|
|
816
849
|
end
|
817
850
|
```
|
818
851
|
|
852
|
+
Hooks can additionally be defined by combining all related stages into a single file
|
853
|
+
known as a Multi-stage hook. Multi-stage hooks live in a special directory inside
|
854
|
+
the hooks directory: ```$installer_dir/hooks/multi```. Taking the previous example:
|
855
|
+
|
856
|
+
```ruby
|
857
|
+
# hooks/multi/10-reset_option_feature.rb
|
858
|
+
boot do
|
859
|
+
app_option '--reset-foreman-db', :flag, 'Drop foreman database first? You will lose all data!', :default => false
|
860
|
+
end
|
861
|
+
|
862
|
+
pre do
|
863
|
+
if app_value(:reset_foreman_db) && !app_value(:noop)
|
864
|
+
`which foreman-rake > /dev/null 2>&1`
|
865
|
+
if $?.success?
|
866
|
+
logger.info 'Dropping database!'
|
867
|
+
output = `foreman-rake db:drop 2>&1`
|
868
|
+
logger.debug output.to_s
|
869
|
+
unless $?.success?
|
870
|
+
logger.warn "Unable to drop DB, ignoring since it's not fatal, output was: '#{output}''"
|
871
|
+
end
|
872
|
+
else
|
873
|
+
logger.warn 'Foreman not installed yet, can not drop database!'
|
874
|
+
end
|
875
|
+
end
|
876
|
+
end
|
877
|
+
```
|
819
878
|
|
820
879
|
If you want to add more directories to be search you can use the "hook_dirs" option
|
821
880
|
in the installer configuration file.
|
data/lib/kafo/configuration.rb
CHANGED
@@ -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
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
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,
|
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,
|
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
|
@@ -197,7 +198,7 @@ module Kafo
|
|
197
198
|
}
|
198
199
|
EOS
|
199
200
|
|
200
|
-
@logger.
|
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.
|
226
|
+
@logger.info "... finished loading default values from puppet modules."
|
226
227
|
|
227
228
|
load_yaml_from_output(stdout.split($/))
|
228
229
|
end
|
data/lib/kafo/data_type.rb
CHANGED
@@ -7,7 +7,7 @@ module Kafo
|
|
7
7
|
def_delegators :@inner_type, :condition_value, :dump_default, :multivalued?, :typecast, :valid?
|
8
8
|
|
9
9
|
def initialize
|
10
|
-
@inner_type = DataTypes::
|
10
|
+
@inner_type = DataTypes::WrappedDataType.new('Integer', 'Float', 'String', 'Boolean', 'Regexp')
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Kafo
|
2
2
|
module DataTypes
|
3
|
-
class
|
3
|
+
class WrappedDataType < DataType
|
4
4
|
def initialize(*inner_types)
|
5
5
|
@inner_types = inner_types.map { |t| DataType.new_from_string(t) }
|
6
6
|
end
|
@@ -16,7 +16,7 @@ module Kafo
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def multivalued?
|
19
|
-
@inner_types.any?
|
19
|
+
@inner_types.any?(&:multivalued?)
|
20
20
|
end
|
21
21
|
|
22
22
|
def to_s
|
@@ -33,7 +33,7 @@ module Kafo
|
|
33
33
|
if type
|
34
34
|
type.valid?(value, errors)
|
35
35
|
else
|
36
|
-
errors << "#{value} is not one of #{
|
36
|
+
errors << "#{value} is not one of #{self}"
|
37
37
|
false
|
38
38
|
end
|
39
39
|
end
|
@@ -45,6 +45,7 @@ module Kafo
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
-
DataType.register_type('
|
48
|
+
DataType.register_type('Sensitive', WrappedDataType)
|
49
|
+
DataType.register_type('Variant', WrappedDataType)
|
49
50
|
end
|
50
51
|
end
|
data/lib/kafo/exceptions.rb
CHANGED
data/lib/kafo/fact_writer.rb
CHANGED
@@ -14,10 +14,9 @@ module Kafo
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def self.wrapper
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
Facter.add(:kafo) { setcode { YAML.load_file(File.join(__dir__, '#{DATA_FILENAME}')) } }
|
17
|
+
<<~WRAPPER
|
18
|
+
require 'yaml'
|
19
|
+
Facter.add(:kafo) { setcode { YAML.load_file(File.join(__dir__, '#{DATA_FILENAME}')) } }
|
21
20
|
WRAPPER
|
22
21
|
end
|
23
22
|
end
|
data/lib/kafo/hook_context.rb
CHANGED
@@ -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
|
data/lib/kafo/kafo_configure.rb
CHANGED
@@ -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
|
-
|
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',
|
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',
|
@@ -440,7 +470,7 @@ module Kafo
|
|
440
470
|
end
|
441
471
|
|
442
472
|
def validate_all(logging = true)
|
443
|
-
logger.
|
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
|
-
|
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,17 +516,17 @@ HEREDOC
|
|
492
516
|
method, message = log_parser.parse(line)
|
493
517
|
progress_log(method, message, logger)
|
494
518
|
|
495
|
-
if (output = line.match(
|
496
|
-
if (output[:count].to_i %
|
497
|
-
logger.notice("#{output[:count].to_i - 1} out of #{output[:total]}
|
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
|
|
501
525
|
@progress_bar.update(line) if @progress_bar
|
502
526
|
end
|
503
527
|
rescue Errno::EIO # we reach end of input
|
504
|
-
exit_status = PTY.check(pid, true)
|
505
|
-
if exit_status.nil? # process is still running
|
528
|
+
exit_status = PTY.check(pid, true)
|
529
|
+
if exit_status.nil? # process is still running
|
506
530
|
begin
|
507
531
|
Process.wait(pid)
|
508
532
|
rescue Errno::ECHILD # process could exit meanwhile so we rescue
|
@@ -511,7 +535,7 @@ HEREDOC
|
|
511
535
|
end
|
512
536
|
end
|
513
537
|
end
|
514
|
-
rescue PTY::ChildExited => e # could be raised by
|
538
|
+
rescue PTY::ChildExited => e # could be raised by PTY.check
|
515
539
|
self.class.exit_handler.exit_code = e.status.exitstatus
|
516
540
|
end
|
517
541
|
|
@@ -540,11 +564,7 @@ HEREDOC
|
|
540
564
|
end
|
541
565
|
|
542
566
|
def normalize_encoding(line)
|
543
|
-
|
544
|
-
line.valid_encoding? ? line : line.encode('UTF-16be', :invalid => :replace, :replace => '?').encode('UTF-8')
|
545
|
-
else # Ruby 1.8.7, doesn't worry about invalid encodings
|
546
|
-
line
|
547
|
-
end
|
567
|
+
line.valid_encoding? ? line : line.encode('UTF-16be', :invalid => :replace, :replace => '?').encode('UTF-8')
|
548
568
|
end
|
549
569
|
end
|
550
570
|
end
|
data/lib/kafo/logger.rb
CHANGED
@@ -13,7 +13,13 @@ module Kafo
|
|
13
13
|
|
14
14
|
def log(level, *args, &block)
|
15
15
|
if Logging.buffering?
|
16
|
-
|
16
|
+
if block_given?
|
17
|
+
data = yield
|
18
|
+
else
|
19
|
+
data = args
|
20
|
+
end
|
21
|
+
|
22
|
+
Logging.to_buffer(@name, ::Logging::LogEvent.new(@name, ::Logging::LEVELS[level.to_s], data, false))
|
17
23
|
else
|
18
24
|
Logging.dump_buffer if Logging.dump_needed?
|
19
25
|
@logger.send(level, *args, &block)
|
data/lib/kafo/logging.rb
CHANGED
@@ -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/puppet_module.rb
CHANGED
@@ -25,7 +25,7 @@ module Kafo
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
def initialize(identifier, parser
|
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
|
@@ -80,7 +81,7 @@ module Kafo
|
|
80
81
|
|
81
82
|
self
|
82
83
|
rescue ConfigurationException => e
|
83
|
-
@logger.fatal "Unable to
|
84
|
+
@logger.fatal "Unable to parse #{manifest_path} because of: #{e.message}"
|
84
85
|
KafoConfigure.exit(:manifest_error)
|
85
86
|
end
|
86
87
|
|
@@ -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/version.rb
CHANGED
data/lib/kafo/wizard.rb
CHANGED
@@ -15,7 +15,7 @@ module Kafo
|
|
15
15
|
OK = utf_support? ? '✓' : 'y'
|
16
16
|
NO = utf_support? ? '✗' : 'n'
|
17
17
|
|
18
|
-
def initialize(kafo, input
|
18
|
+
def initialize(kafo, input = $stdin, output = $stdout)
|
19
19
|
@kafo = kafo
|
20
20
|
@config = kafo.config
|
21
21
|
@name = @config.app[:name] || 'Kafo'
|
@@ -10,6 +10,13 @@ Puppet::Functions.create_function(:'kafo_configure::dump_lookups') do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def dump_lookups(parameters)
|
13
|
-
Hash[parameters.map { |param| [param,
|
13
|
+
Hash[parameters.map { |param| [param, lookup(param)] }]
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def lookup(param)
|
19
|
+
value = call_function('lookup', [param], 'default_value' => nil)
|
20
|
+
value.respond_to?(:unwrap) ? value.unwrap : value
|
14
21
|
end
|
15
22
|
end
|
@@ -8,6 +8,12 @@ Puppet::Functions.create_function(:'kafo_configure::dump_variables') do
|
|
8
8
|
|
9
9
|
def dump_variables(variables)
|
10
10
|
scope = closure_scope
|
11
|
-
Hash[variables.map { |var| [var, scope[var]] }]
|
11
|
+
Hash[variables.map { |var| [var, unwrap(scope[var])] }]
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def unwrap(value)
|
17
|
+
value.respond_to?(:unwrap) ? value.unwrap : value
|
12
18
|
end
|
13
19
|
end
|
@@ -4,4 +4,5 @@ describe 'kafo_configure::dump_lookups' do
|
|
4
4
|
let(:hiera_config) { 'spec/fixtures/hiera/hiera.yaml' }
|
5
5
|
it { is_expected.to run.with_params([]).and_return({}) }
|
6
6
|
it { is_expected.to run.with_params(['my_module::param']).and_return({'my_module::param' => 'override'}) }
|
7
|
+
it { is_expected.to run.with_params(['my_module::password']).and_return({'my_module::password' => 'batteryhorsestaple'}) }
|
7
8
|
end
|
@@ -6,5 +6,6 @@ describe 'kafo_configure::dump_variables' do
|
|
6
6
|
context 'with values' do
|
7
7
|
let(:pre_condition) { 'include dummy' }
|
8
8
|
it { is_expected.to run.with_params(['dummy::first']).and_return({'dummy::first' => 'foo'}) }
|
9
|
+
it { is_expected.to run.with_params(['dummy::password']).and_return({'dummy::password' => 'supersecret'}) }
|
9
10
|
end
|
10
11
|
end
|
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.
|
4
|
+
version: 6.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marek Hulan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-05-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -245,7 +245,7 @@ files:
|
|
245
245
|
- lib/kafo/data_types/tuple.rb
|
246
246
|
- lib/kafo/data_types/type_reference.rb
|
247
247
|
- lib/kafo/data_types/undef.rb
|
248
|
-
- lib/kafo/data_types/
|
248
|
+
- lib/kafo/data_types/wrapped_data_type.rb
|
249
249
|
- lib/kafo/exceptions.rb
|
250
250
|
- lib/kafo/execution_environment.rb
|
251
251
|
- lib/kafo/exit_handler.rb
|
@@ -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
|
@@ -318,7 +320,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
318
320
|
- !ruby/object:Gem::Version
|
319
321
|
version: '0'
|
320
322
|
requirements: []
|
321
|
-
rubygems_version: 3.
|
323
|
+
rubygems_version: 3.2.22
|
322
324
|
signing_key:
|
323
325
|
specification_version: 4
|
324
326
|
summary: A gem for making installations based on puppet user friendly
|