facter 4.0.15 → 4.0.16

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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -0
  3. data/.rubocop_todo.yml +5 -7
  4. data/CHANGELOG.md +33 -0
  5. data/VERSION +1 -1
  6. data/lib/custom_facts/util/parser.rb +1 -1
  7. data/lib/custom_facts/version.rb +1 -1
  8. data/lib/facter.rb +13 -17
  9. data/lib/facts/aix/partitions.rb +15 -0
  10. data/lib/facts/windows/ssh.rb +27 -0
  11. data/lib/facts_utils/uptime_parser.rb +3 -3
  12. data/lib/framework/cli/cli.rb +1 -1
  13. data/lib/framework/config/block_list.rb +1 -4
  14. data/lib/framework/config/config_reader.rb +29 -26
  15. data/lib/framework/core/fact_filter.rb +2 -2
  16. data/lib/framework/core/file_loader.rb +3 -3
  17. data/lib/framework/core/options.rb +57 -64
  18. data/lib/framework/core/options/config_file_options.rb +58 -48
  19. data/lib/framework/core/options/option_store.rb +156 -0
  20. data/lib/framework/core/options/options_validator.rb +42 -2
  21. data/lib/framework/logging/logger.rb +2 -0
  22. data/lib/framework/parsers/query_parser.rb +1 -1
  23. data/lib/models/fact_collection.rb +1 -1
  24. data/lib/resolvers/aix/filesystem_resolver.rb +3 -2
  25. data/lib/resolvers/aix/partitions.rb +86 -0
  26. data/lib/resolvers/aix/utils/odm_query.rb +2 -2
  27. data/lib/resolvers/debian_version.rb +2 -5
  28. data/lib/resolvers/disk_resolver.rb +2 -3
  29. data/lib/resolvers/dmi_resolver.rb +3 -3
  30. data/lib/resolvers/filesystems_resolver.rb +3 -3
  31. data/lib/resolvers/fips_enabled_resolver.rb +1 -4
  32. data/lib/resolvers/hostname_resolver.rb +4 -4
  33. data/lib/resolvers/load_averages_resolver.rb +1 -3
  34. data/lib/resolvers/memory_resolver.rb +2 -2
  35. data/lib/resolvers/mountpoints_resolver.rb +1 -3
  36. data/lib/resolvers/os_release_resolver.rb +3 -6
  37. data/lib/resolvers/partitions.rb +11 -6
  38. data/lib/resolvers/processors_resolver.rb +3 -3
  39. data/lib/resolvers/selinux_resolver.rb +9 -9
  40. data/lib/resolvers/solaris/filesystems_resolver.rb +1 -1
  41. data/lib/resolvers/ssh_resolver.rb +4 -43
  42. data/lib/resolvers/utils/ssh_helper.rb +27 -0
  43. data/lib/resolvers/windows/ssh.rb +47 -0
  44. data/lib/util/file_helper.rb +24 -0
  45. metadata +9 -6
  46. data/lib/framework/core/options/default_options.rb +0 -35
  47. data/lib/framework/core/options/helper_options.rb +0 -52
  48. data/lib/framework/core/options/priority_options.rb +0 -12
  49. data/lib/framework/core/options/validate_options.rb +0 -49
@@ -1,71 +1,81 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Facter
4
- module ConfigFileOptions
5
- def augment_with_config_file_options!(config_path)
6
- conf_reader = Facter::ConfigReader.new(config_path)
7
-
8
- augment_config_path(config_path)
9
- if @priority_options[:is_cli]
10
- augment_cli(conf_reader.cli)
11
- augment_ruby(conf_reader.global)
4
+ class ConfigFileOptions
5
+ class << self
6
+ def init(config_path = nil)
7
+ @options = {}
8
+ Facter::ConfigReader.init(config_path)
9
+
10
+ augment_config_path(config_path)
11
+
12
+ if Options.cli?
13
+ augment_cli(Facter::ConfigReader.cli)
14
+ augment_ruby(Facter::ConfigReader.global)
15
+ end
16
+ augment_custom(Facter::ConfigReader.global)
17
+ augment_external(Facter::ConfigReader.global)
18
+ augment_show_legacy(Facter::ConfigReader.global)
19
+ augment_facts(Facter::ConfigReader.ttls)
20
+ end
21
+
22
+ def get
23
+ @options || {}
12
24
  end
13
- augment_custom(conf_reader.global)
14
- augment_external(conf_reader.global)
15
- augment_show_legacy(conf_reader.global)
16
- augment_facts(conf_reader.ttls)
17
- end
18
25
 
19
- private
26
+ private
20
27
 
21
- def augment_config_path(config_path)
22
- @options[:config] = config_path
23
- end
28
+ def augment_config_path(config_path)
29
+ @options[:config] = config_path
30
+ end
24
31
 
25
- def augment_cli(file_cli_conf)
26
- return unless file_cli_conf
32
+ def augment_cli(file_cli_conf)
33
+ return unless file_cli_conf
27
34
 
28
- @options[:debug] = file_cli_conf['debug'] unless file_cli_conf['debug'].nil?
29
- @options[:trace] = file_cli_conf['trace'] unless file_cli_conf['trace'].nil?
30
- @options[:verbose] = file_cli_conf['verbose'] unless file_cli_conf['verbose'].nil?
31
- @options[:log_level] = file_cli_conf['log-level'].to_sym unless file_cli_conf['log-level'].nil?
32
- end
35
+ @options[:debug] = file_cli_conf['debug'] unless file_cli_conf['debug'].nil?
36
+ @options[:trace] = file_cli_conf['trace'] unless file_cli_conf['trace'].nil?
37
+ @options[:verbose] = file_cli_conf['verbose'] unless file_cli_conf['verbose'].nil?
38
+ @options[:log_level] = file_cli_conf['log-level'].to_sym unless file_cli_conf['log-level'].nil?
39
+ end
40
+
41
+ def augment_custom(file_global_conf)
42
+ return unless file_global_conf
33
43
 
34
- def augment_custom(file_global_conf)
35
- return unless file_global_conf
44
+ if Options.cli?
45
+ @options[:custom_facts] = !file_global_conf['no-custom-facts'] unless file_global_conf['no-custom-facts'].nil?
46
+ end
36
47
 
37
- if @priority_options[:is_cli]
38
- @options[:custom_facts] = !file_global_conf['no-custom-facts'] unless file_global_conf['no-custom-facts'].nil?
48
+ @options[:custom_dir] = file_global_conf['custom-dir'] unless file_global_conf['custom-dir'].nil?
39
49
  end
40
- @options[:custom_dir] = [file_global_conf['custom-dir']].flatten unless file_global_conf['custom-dir'].nil?
41
- end
42
50
 
43
- def augment_external(global_conf)
44
- return unless global_conf
51
+ def augment_external(global_conf)
52
+ return unless global_conf
53
+
54
+ if Options.cli?
55
+ @options[:external_facts] = !global_conf['no-external-facts'] unless global_conf['no-external-facts'].nil?
56
+ end
45
57
 
46
- if @priority_options[:is_cli]
47
- @options[:external_facts] = !global_conf['no-external-facts'] unless global_conf['no-external-facts'].nil?
58
+ @options[:external_dir] = [global_conf['external-dir']].flatten unless global_conf['external-dir'].nil?
48
59
  end
49
- @options[:external_dir] = [global_conf['external-dir']].flatten unless global_conf['external-dir'].nil?
50
- end
51
60
 
52
- def augment_ruby(global_conf)
53
- return unless global_conf
61
+ def augment_ruby(global_conf)
62
+ return unless global_conf
54
63
 
55
- @options[:ruby] = !global_conf['no-ruby'] unless global_conf['no-ruby'].nil?
56
- end
64
+ @options[:ruby] = global_conf['no-ruby'].nil? ? true : !global_conf['no-ruby']
65
+ end
57
66
 
58
- def augment_show_legacy(global_conf)
59
- return unless global_conf
67
+ def augment_show_legacy(global_conf)
68
+ return unless global_conf
60
69
 
61
- @options[:show_legacy] = global_conf['show-legacy'] unless global_conf['show-legacy'].nil?
62
- end
70
+ @options[:show_legacy] = global_conf['show-legacy'] unless global_conf['show-legacy'].nil?
71
+ end
63
72
 
64
- def augment_facts(ttls)
65
- blocked_facts = Facter::BlockList.instance.blocked_facts
66
- @options[:blocked_facts] = blocked_facts unless blocked_facts.nil?
73
+ def augment_facts(ttls)
74
+ blocked_facts = Facter::BlockList.new.blocked_facts
75
+ @options[:blocked_facts] = blocked_facts unless blocked_facts.nil?
67
76
 
68
- @options[:ttls] = ttls unless ttls.nil?
77
+ @options[:ttls] = ttls unless ttls.nil?
78
+ end
69
79
  end
70
80
  end
71
81
  end
@@ -0,0 +1,156 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facter
4
+ class OptionStore
5
+ # default options
6
+ @debug = false
7
+ @trace = false
8
+ @verbose = false
9
+ # TODO: constant is not yet available when running puppet facts
10
+ @log_level = :warn
11
+ @show_legacy = true
12
+ @block = true
13
+ @custom_dir = []
14
+ @custom_facts = true
15
+ @external_dir = []
16
+ @external_facts = true
17
+ @ruby = true
18
+ @blocked_facts = []
19
+ @user_query = []
20
+
21
+ class << self
22
+ attr_reader :debug, :verbose, :log_level, :show_legacy, :trace,
23
+ :custom_dir, :external_dir, :ruby,
24
+ :custom_facts, :blocked_facts
25
+
26
+ attr_accessor :config, :user_query, :strict, :json, :haml, :external_facts,
27
+ :cache, :yaml, :puppet, :ttls, :block, :cli
28
+
29
+ def all
30
+ options = {}
31
+ instance_variables.each do |iv|
32
+ variable_name = iv.to_s.delete('@')
33
+ options[variable_name.to_sym] = OptionStore.send(variable_name.to_sym)
34
+ end
35
+ options
36
+ end
37
+
38
+ def ruby=(bool)
39
+ if bool == true
40
+ @ruby = true
41
+ else
42
+ @ruby = false
43
+ @custom_facts = false
44
+ @blocked_facts << 'ruby'
45
+ end
46
+ end
47
+
48
+ def external_dir=(dirs)
49
+ return unless dirs.any?
50
+
51
+ @external_dir = dirs
52
+ end
53
+
54
+ def blocked_facts=(*facts)
55
+ @blocked_facts += [*facts]
56
+
57
+ @blocked_facts.flatten!
58
+ end
59
+
60
+ def custom_dir=(*dirs)
61
+ return unless dirs.any?
62
+
63
+ @ruby = true
64
+
65
+ @custom_dir = [*dirs]
66
+ @custom_dir.flatten!
67
+ end
68
+
69
+ def debug=(bool)
70
+ if bool == true
71
+ self.log_level = :debug
72
+ else
73
+ @debug = false
74
+ self.log_level = Facter::DEFAULT_LOG_LEVEL
75
+ end
76
+ end
77
+
78
+ def verbose=(bool)
79
+ if bool == true
80
+ @verbose = true
81
+ self.log_level = :info
82
+ else
83
+ @verbose = false
84
+ self.log_level = Facter::DEFAULT_LOG_LEVEL
85
+ end
86
+ end
87
+
88
+ def custom_facts=(bool)
89
+ if bool == true
90
+ @custom_facts = true
91
+ @ruby = true
92
+ else
93
+ @custom_facts = false
94
+ end
95
+ end
96
+
97
+ def log_level=(level)
98
+ level = level.to_sym
99
+ case level
100
+ when :trace
101
+ @log_level = :debug
102
+ @trace = true
103
+ when :debug
104
+ @log_level = :debug
105
+ @debug = true
106
+ else
107
+ @log_level = level
108
+ end
109
+
110
+ Facter::Log.level = @log_level
111
+ Facter.trace(@trace)
112
+ end
113
+
114
+ def show_legacy=(bool)
115
+ if bool == true
116
+ @show_legacy = bool
117
+ @ruby = true
118
+ else
119
+ @show_legacy = false
120
+ end
121
+ end
122
+
123
+ def trace=(bool)
124
+ if bool == true
125
+ self.log_level = :trace
126
+ else
127
+ @log_level = Facter::DEFAULT_LOG_LEVEL
128
+ @trace = false
129
+ Facter.trace(false)
130
+ end
131
+ end
132
+
133
+ def set(key, value)
134
+ send("#{key}=".to_sym, value)
135
+ end
136
+
137
+ def reset
138
+ @debug = false
139
+ @trace = false
140
+ @verbose = false
141
+ # TODO: constant is not yet available when running puppet facts
142
+ @log_level = :warn
143
+ @show_legacy = true
144
+ @block = true
145
+ @custom_dir = []
146
+ @custom_facts = true
147
+ @external_dir = []
148
+ @external_facts = true
149
+ @ruby = true
150
+ @blocked_facts = []
151
+ @user_query = []
152
+ @cli = nil
153
+ end
154
+ end
155
+ end
156
+ end
@@ -33,11 +33,51 @@ module Facter
33
33
  end
34
34
 
35
35
  def self.write_error_and_exit(message)
36
- Options.augment_with_priority_options!(is_cli: true)
37
36
  log = Facter::Log.new(self)
38
37
  log.error(message, true)
39
- Cli.start(['--help'])
38
+ Facter::Cli.start(['--help'])
39
+
40
40
  exit 1
41
41
  end
42
+
43
+ def self.validate_configs(options)
44
+ conflicting_configs(options).each do |op|
45
+ next unless op.values[0] && op.values[1]
46
+
47
+ message = "#{op.keys[0]} and #{op.keys[1]} options conflict: please specify only one"
48
+ write_error_and_exit(message)
49
+ end
50
+ validate_log_options(options)
51
+ end
52
+
53
+ def self.conflicting_configs(options)
54
+ no_ruby = !options[:ruby]
55
+ no_custom_facts = !options[:custom_facts]
56
+ puppet = options[:puppet]
57
+ custom_dir = options[:custom_dir].nil? ? false : options[:custom_dir].any?
58
+ external_dir = options[:external_dir].nil? ? false : options[:external_dir].any?
59
+
60
+ [
61
+ { 'no-ruby' => no_ruby, 'custom-dir' => custom_dir },
62
+ { 'no-external-facts' => !options[:external_facts], 'external-dir' => external_dir },
63
+ { 'no-custom-facts' => no_custom_facts, 'custom-dir' => custom_dir },
64
+ { 'no-ruby' => no_ruby, 'puppet' => puppet },
65
+ { 'no-custom-facts' => no_custom_facts, 'puppet' => puppet }
66
+ ]
67
+ end
68
+
69
+ def self.validate_log_options(options)
70
+ # TODO: find a better way to do this
71
+ return if options[:debug] == true && options[:log_level] == :debug
72
+ return if options[:verbose] == true && options[:log_level] == :info
73
+
74
+ return unless [options[:debug],
75
+ options[:verbose],
76
+ options[:log_level] != Facter::DEFAULT_LOG_LEVEL]
77
+ .count(true) > 1
78
+
79
+ message = 'debug, verbose, and log-level options conflict: please specify only one.'
80
+ write_error_and_exit(message)
81
+ end
42
82
  end
43
83
  end
@@ -4,6 +4,7 @@ require 'logger'
4
4
 
5
5
  module Facter
6
6
  RED = 31
7
+ DEFAULT_LOG_LEVEL = :warn
7
8
 
8
9
  class Log
9
10
  @@legacy_logger = nil
@@ -38,6 +39,7 @@ module Facter
38
39
  return if @@legacy_logger
39
40
 
40
41
  @@legacy_logger = Logger.new(output)
42
+ @@legacy_logger.level = DEFAULT_LOG_LEVEL
41
43
  set_format_for_legacy_logger
42
44
  @@logger.add_logger(@@legacy_logger)
43
45
  end
@@ -71,7 +71,7 @@ module Facter
71
71
  end
72
72
 
73
73
  def found_fact?(fact_name, query_fact)
74
- fact_with_wildcard = fact_name.include?('.*')
74
+ fact_with_wildcard = fact_name.include?('.*') && !query_fact.include?('.')
75
75
 
76
76
  return false if fact_with_wildcard && !query_fact.match("^#{fact_name}$")
77
77
 
@@ -8,7 +8,7 @@ module Facter
8
8
 
9
9
  def build_fact_collection!(facts)
10
10
  facts.each do |fact|
11
- next if fact.type == :core && fact.value.nil?
11
+ next if %i[core legacy].include?(fact.type) && fact.value.nil?
12
12
 
13
13
  bury_fact(fact)
14
14
  end
@@ -15,9 +15,10 @@ module Facter
15
15
  end
16
16
 
17
17
  def read_vtf_file(fact_name)
18
- return unless File.readable?('/etc/vfs')
18
+ file_content = Util::FileHelper.safe_readlines('/etc/vfs')
19
+ return if file_content.empty?
19
20
 
20
- file_content = File.readlines('/etc/vfs').map do |line|
21
+ file_content = file_content.map do |line|
21
22
  next if line =~ /#|%/ # skip lines that are comments or defaultvfs line
22
23
 
23
24
  line.split(' ').first
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facter
4
+ module Resolvers
5
+ module Aix
6
+ class Partitions < BaseResolver
7
+ @log = Facter::Log.new(self)
8
+ @semaphore = Mutex.new
9
+ @fact_list ||= {}
10
+ class << self
11
+ private
12
+
13
+ MEGABYTES_EXPONENT = 1024**2
14
+ GIGABYTES_EXPONENT = 1024**3
15
+
16
+ def post_resolve(fact_name)
17
+ @fact_list.fetch(fact_name) { query_cudv(fact_name) }
18
+ end
19
+
20
+ def query_cudv(fact_name)
21
+ @fact_list[:partitions] = {}
22
+
23
+ odmquery = Facter::ODMQuery.new
24
+ odmquery.equals('PdDvLn', 'logical_volume/lvsubclass/lvtype')
25
+
26
+ result = odmquery.execute
27
+
28
+ return unless result
29
+
30
+ result.each_line do |line|
31
+ next unless line.include?('name')
32
+
33
+ part_name = line.split('=')[1].strip.delete('"')
34
+ part = "/dev/#{part_name}"
35
+ info = populate_from_lslv(part_name)
36
+ @fact_list[:partitions][part] = info if info
37
+ end
38
+
39
+ @fact_list[fact_name]
40
+ end
41
+
42
+ def populate_from_lslv(name)
43
+ stdout, stderr, _status = Open3.capture3("lslv -L #{name}")
44
+ if stdout.empty?
45
+ @log.debug(stderr)
46
+ return
47
+ end
48
+
49
+ info_hash = extract_info(stdout)
50
+ size_bytes = compute_size(info_hash)
51
+
52
+ part_info = {
53
+ filesystem: info_hash['TYPE'],
54
+ size_bytes: size_bytes,
55
+ size: Facter::BytesToHumanReadable.convert(size_bytes)
56
+ }
57
+ mount = info_hash['MOUNTPOINT']
58
+ label = info_hash['LABEL']
59
+ part_info[:mount] = mount unless %r{N/A} =~ mount
60
+ part_info[:label] = label unless /None/ =~ label
61
+ part_info
62
+ end
63
+
64
+ def extract_info(lsl_content)
65
+ lsl_content = lsl_content.strip.split("\n").map do |line|
66
+ next unless /PPs:|PP SIZE|TYPE:|LABEL:|MOUNT/ =~ line
67
+
68
+ line.split(/:|\s\s/).reject(&:empty?)
69
+ end
70
+
71
+ lsl_content.flatten!.select! { |elem| elem }.map! { |elem| elem.delete("\s") }
72
+
73
+ Hash[*lsl_content]
74
+ end
75
+
76
+ def compute_size(info_hash)
77
+ physical_partitions = info_hash['PPs'].to_i
78
+ size_physical_partition = info_hash['PPSIZE']
79
+ exp = size_physical_partition[/mega/] ? MEGABYTES_EXPONENT : GIGABYTES_EXPONENT
80
+ size_physical_partition.to_i * physical_partitions * exp
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end