onceover 3.18.0 → 3.20.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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -0
  3. data/.github/workflows/tests.yaml +40 -0
  4. data/.rubocop.yml +20 -2
  5. data/Gemfile +0 -13
  6. data/README.md +275 -113
  7. data/Rakefile +23 -6
  8. data/factsets/CentOS-8.3.2011-64.json +485 -0
  9. data/factsets/Debian-10.4-64.json +476 -0
  10. data/factsets/Debian-8.11-64.json +480 -0
  11. data/factsets/Debian-9.12-64.json +476 -0
  12. data/factsets/Ubuntu-20.04-64.json +504 -0
  13. data/factsets/Windows_Server-2008r2-64.json +184 -184
  14. data/factsets/Windows_Server-2012r2-64.json +165 -165
  15. data/factsets/windows-10-64.json +104 -104
  16. data/features/cache.feature +1 -1
  17. data/features/factsets.feature +33 -4
  18. data/features/step_definitions/cache.rb +4 -4
  19. data/features/step_definitions/common.rb +44 -10
  20. data/features/step_definitions/init.rb +2 -2
  21. data/features/windows.feature +5 -0
  22. data/features/zzz_run.feature +22 -3
  23. data/lib/onceover/controlrepo.rb +25 -16
  24. data/lib/onceover/deploy.rb +3 -1
  25. data/lib/onceover/group.rb +3 -1
  26. data/lib/onceover/node.rb +19 -2
  27. data/lib/onceover/rspec/formatters.rb +6 -1
  28. data/lib/onceover/runner.rb +5 -4
  29. data/lib/onceover/test.rb +3 -2
  30. data/lib/onceover/testconfig.rb +14 -5
  31. data/onceover.gemspec +5 -2
  32. data/spec/fixtures/controlrepos/basic/manifests_alternate/site.pp +2 -0
  33. data/spec/fixtures/controlrepos/caching/Puppetfile +17 -17
  34. data/spec/fixtures/controlrepos/caching/manifests/site.pp +1 -0
  35. data/spec/fixtures/controlrepos/caching/spec/factsets/Debian-10-facter-4.json +1091 -0
  36. data/spec/fixtures/controlrepos/caching/spec/onceover.yaml +13 -12
  37. data/spec/fixtures/controlrepos/custom_puppetfile/Puppetfile.custom +3 -0
  38. data/spec/fixtures/controlrepos/custom_puppetfile/environment.conf +7 -0
  39. data/spec/fixtures/controlrepos/factsets/site/role/manifests/trusted_extensions.pp +6 -0
  40. data/spec/fixtures/controlrepos/factsets/site/role/manifests/trusted_external.pp +6 -0
  41. data/spec/fixtures/controlrepos/factsets/spec/factsets/README.md +7 -0
  42. data/spec/fixtures/controlrepos/factsets/spec/factsets/centos7_notrusted.json +530 -0
  43. data/spec/fixtures/controlrepos/factsets/spec/factsets/centos7_trusted_extensions_nested.json +535 -0
  44. data/spec/fixtures/controlrepos/factsets/spec/factsets/centos7_trusted_extensions_top.json +533 -0
  45. data/spec/fixtures/controlrepos/factsets/spec/factsets/centos7_trusted_external_nested.json +537 -0
  46. data/spec/fixtures/controlrepos/factsets/spec/factsets/centos7_trusted_external_top.json +535 -0
  47. data/spec/fixtures/controlrepos/factsets/spec/factsets/centos_7_facter_4.json +706 -0
  48. data/spec/fixtures/controlrepos/windows/Puppetfile +6 -1
  49. data/spec/fixtures/controlrepos/windows/site-modules/role/manifests/choco.pp +9 -0
  50. data/templates/test_spec.rb.erb +5 -1
  51. metadata +85 -18
  52. data/.travis.yml +0 -19
  53. data/appveyor.yml +0 -38
@@ -76,6 +76,10 @@ class Onceover
76
76
  @@existing_controlrepo.facts(filter, 'trusted')
77
77
  end
78
78
 
79
+ def self.trusted_external_facts(filter = nil)
80
+ @@existing_controlrepo.facts(filter, 'trusted_external')
81
+ end
82
+
79
83
  def self.hiera_config_file
80
84
  @@existing_controlrepo.hiera_config_file
81
85
  end
@@ -123,10 +127,16 @@ class Onceover
123
127
  @profile_regex = opts[:profile_regex] ? Regexp.new(opts[:profile_regex]) : /profile[s]?:{2}/
124
128
  @tempdir = opts[:tempdir] || File.expand_path('./.onceover', @root)
125
129
  $temp_modulepath = nil
126
- @manifest = opts[:manifest] || config['manifest'] ? File.expand_path(config['manifest'], @root) : nil
127
130
  @opts = opts
128
131
  logger.level = :debug if @opts[:debug]
129
132
  @@existing_controlrepo = self
133
+
134
+ # Set the manifest option to the fully expanded path if it's used,
135
+ # default to nil
136
+ manifest = opts[:manifest] || config['manifest'] || nil
137
+ if manifest
138
+ @manifest = File.expand_path(manifest, @root)
139
+ end
130
140
  end
131
141
 
132
142
 
@@ -184,7 +194,14 @@ class Onceover
184
194
  all_facts = []
185
195
  logger.debug "Reading factsets"
186
196
  @facts_files.each do |file|
187
- all_facts << read_facts(file)[key]
197
+ facts_from_file = read_facts(file)
198
+ # Facter 4 removed the top level key 'values' and, instead, puts facts
199
+ # at the top level. The conditional below accounts for this.
200
+ if (key.eql?('values') and facts_from_file.has_key?('values')) or !key.eql?('values')
201
+ all_facts << facts_from_file[key]
202
+ else
203
+ all_facts << facts_from_file
204
+ end
188
205
  end
189
206
  if filter
190
207
  # Allow us to pass a hash of facts to filter by
@@ -195,11 +212,7 @@ class Onceover
195
212
  filter.each do |filter_fact,value|
196
213
  matches << keypair_is_in_hash(hash,filter_fact,value)
197
214
  end
198
- if matches.include? false
199
- false
200
- else
201
- true
202
- end
215
+ !matches.include? false
203
216
  end
204
217
  end
205
218
  return all_facts
@@ -420,7 +433,7 @@ class Onceover
420
433
  rescue StandardError
421
434
  raise "modulepath was not found in environment.conf, don't know where to look for roles & profiles"
422
435
  end
423
-
436
+
424
437
  environment_config
425
438
  end
426
439
 
@@ -444,7 +457,7 @@ class Onceover
444
457
  end
445
458
 
446
459
  def temp_manifest
447
- config['manifest'] ? File.expand_path(config['manifest'], @tempdir) : nil
460
+ @manifest
448
461
  end
449
462
 
450
463
  def self.init(repo)
@@ -587,7 +600,7 @@ class Onceover
587
600
 
588
601
  # Loop over each test, executing the user's block on each
589
602
  tests.each do |tst|
590
- block.call(tst.classes[0].name, tst.nodes[0].name, tst.nodes[0].fact_set, testconfig.pre_condition)
603
+ block.call(tst.classes[0].name, tst.nodes[0].name, tst.nodes[0].fact_set, tst.nodes[0].trusted_set, tst.nodes[0].trusted_external_set, testconfig.pre_condition)
591
604
  end
592
605
  end
593
606
 
@@ -620,11 +633,7 @@ class Onceover
620
633
  else
621
634
  matches << false
622
635
  end
623
- if matches.include? false
624
- false
625
- else
626
- true
627
- end
636
+ !matches.include? false
628
637
  end
629
638
 
630
639
  def get_classes(dir)
@@ -642,7 +651,7 @@ class Onceover
642
651
  def find_classname(filename)
643
652
  file = File.new(filename, "r")
644
653
  while (line = file.gets)
645
- begin
654
+ begin
646
655
  if line =~ /^class (\w+(?:::\w+)*)/
647
656
  return $1
648
657
  end
@@ -83,6 +83,7 @@ class Onceover
83
83
  logger.debug "found #{git_branch} as current working branch"
84
84
  # Only try to modify Puppetfile if it exists
85
85
  unless skip_r10k
86
+ FileUtils.copy repo.puppetfile, "#{temp_controlrepo}/Puppetfile"
86
87
  puppetfile_contents = File.read("#{temp_controlrepo}/Puppetfile")
87
88
 
88
89
  logger.debug "replacing :control_branch mentions in the Puppetfile with #{git_branch}"
@@ -118,10 +119,11 @@ class Onceover
118
119
  prod_dir = "#{repo.tempdir}/#{repo.environmentpath}/production"
119
120
  Dir.chdir(prod_dir) do
120
121
  install_cmd = []
121
- install_cmd << "r10k puppetfile install --color --puppetfile #{repo.puppetfile}"
122
+ install_cmd << 'r10k puppetfile install --color'
122
123
  install_cmd << "--force" if force
123
124
  install_cmd << "--config #{repo.r10k_config_file}" if repo.r10k_config_file
124
125
  install_cmd << (logger.level > 0 ? "--verbose" : "--verbose debug") # Enable debugging if we're debugging
126
+ install_cmd << "--trace" if opts[:trace]
125
127
  install_cmd = install_cmd.join(' ')
126
128
  logger.debug "Running #{install_cmd} from #{prod_dir}"
127
129
  system(install_cmd)
@@ -60,6 +60,7 @@ class Onceover
60
60
  @@all
61
61
  end
62
62
 
63
+ # rubocop:disable Lint/DuplicateBranch
63
64
  def self.valid_members?(members)
64
65
  # Check that they are all the same type
65
66
  # Also catch any errors to assume it's invalid
@@ -71,9 +72,10 @@ class Onceover
71
72
  else
72
73
  return false
73
74
  end
74
- rescue StandardErroor
75
+ rescue StandardError
75
76
  return false
76
77
  end
77
78
  end
79
+ # rubocop:enable Lint/DuplicateBranch
78
80
  end
79
81
  end
data/lib/onceover/node.rb CHANGED
@@ -9,6 +9,7 @@ class Onceover
9
9
  attr_accessor :beaker_node
10
10
  attr_accessor :fact_set
11
11
  attr_accessor :trusted_set
12
+ attr_accessor :trusted_external_set
12
13
 
13
14
  def initialize(name)
14
15
  @name = name
@@ -20,10 +21,26 @@ class Onceover
20
21
  File.basename(facts_file, '.json') == name
21
22
  }
22
23
  @fact_set = Onceover::Node.clean_facts(Onceover::Controlrepo.facts[facts_file_index])
24
+
25
+ # First see if we can find a 'trusted' hash at the top level of our factset
23
26
  @trusted_set = Onceover::Controlrepo.trusted_facts[facts_file_index]
27
+ # If we don't find it, attempt to find a 'trusted.extensions' hash nested in our fact_set
28
+ @trusted_set = @fact_set.dig('trusted', 'extensions') if @trusted_set.nil?
29
+ # If we still can't find any, return an empty hash so the following doesn't blow up user written tests:
30
+ # let(:trusted_facts) { trusted_facts }
31
+ @trusted_set = {} if @trusted_set.nil?
32
+
33
+ # First see if we can find a 'trusted_external' hash at the top level of our factset
34
+ @trusted_external_set = Onceover::Controlrepo.trusted_external_facts[facts_file_index]
35
+ # If we don't find it, attempt to find a 'trusted.external' hash nested in our fact_set
36
+ @trusted_external_set = @fact_set.dig('trusted', 'external') if @trusted_external_set.nil?
37
+ # If we still can't find any, return an empty hash so the following doesn't blow up user written tests:
38
+ # let(:trusted_external_data) { trusted_external_data }
39
+ @trusted_external_set = {} if @trusted_external_set.nil?
24
40
  rescue TypeError
25
- @fact_set = nil
26
- @trusted_set = nil
41
+ @fact_set = {}
42
+ @trusted_set = {}
43
+ @trusted_external_set = {}
27
44
  end
28
45
 
29
46
  @@all << self
@@ -12,7 +12,9 @@ class OnceoverFormatter
12
12
  )
13
13
 
14
14
  COMPILATION_ERROR = %r{error during compilation: (?<error>.*)}
15
+ # rubocop:disable Lint/MixedRegexpCaptureTypes
15
16
  ERROR_WITH_LOCATION = %r{(?<error>.*?)\s(at )?(\((file: (?<file>.*?), )?line: (?<line>\d+)(, column: (?<column>\d+))?\))(; )?}
17
+ # rubocop:enable Lint/MixedRegexpCaptureTypes
16
18
  ERROR_WITHOUT_LOCATION = %r{(?<error>.*?)\son node}
17
19
 
18
20
  def initialize output
@@ -72,6 +74,8 @@ class OnceoverFormatter
72
74
  @output << "\n"
73
75
  end
74
76
 
77
+ # rubocop:disable Style/CombinableLoops
78
+ #
75
79
  # This method takes a notification and formats it into a hash that can be
76
80
  # printed easily
77
81
  def extract_failures notification
@@ -90,6 +94,7 @@ class OnceoverFormatter
90
94
 
91
95
  grouped
92
96
  end
97
+ # rubocop:enable Style/CombinableLoops
93
98
 
94
99
  # Extaracts data out of RSpec failres
95
100
  def extract_failure_data(fails)
@@ -309,4 +314,4 @@ class FailureCollector
309
314
  end
310
315
  }
311
316
  end
312
- end
317
+ end
@@ -1,4 +1,5 @@
1
1
  require 'backticks'
2
+ require 'io/console'
2
3
 
3
4
  class Onceover
4
5
  class Runner
@@ -36,8 +37,6 @@ class Onceover
36
37
  # Create spec_helper_accpetance.rb
37
38
  @config.write_spec_helper_acceptance("#{@repo.tempdir}/spec", @repo)
38
39
 
39
- # TODO: Remove all tests that do not match set tags
40
-
41
40
  if @mode.include?(:spec)
42
41
  # Verify all of the spec tests
43
42
  @config.spec_tests.each { |test| @config.verify_spec_test(@repo, test) }
@@ -83,8 +82,10 @@ class Onceover
83
82
  ENV['RUBYOPT'] = ENV['RUBYOPT'].to_s + ' -W0'
84
83
  end
85
84
 
86
- #`bundle install --binstubs`
87
- #`bin/rake spec_standalone`
85
+ # NOTE: This is the way to provide options to rspec according to:
86
+ # https://github.com/puppetlabs/puppetlabs_spec_helper/blob/master/lib/puppetlabs_spec_helper/rake_tasks.rb#L51
87
+ ENV['CI_SPEC_OPTIONS'] = ENV['CI_SPEC_OPTIONS'].to_s + @config.filter_tags.map { |tag| " --tag #{tag}" }.join unless @config.filter_tags.nil?
88
+
88
89
  if @config.opts[:parallel]
89
90
  logger.debug "Running #{@command_prefix}rake parallel_spec from #{@repo.tempdir}"
90
91
  result = run_command(@command_prefix.strip.split, 'rake', 'parallel_spec')
data/lib/onceover/test.rb CHANGED
@@ -25,10 +25,11 @@ class Onceover
25
25
  @classes = []
26
26
  @test_config = test_config
27
27
  @test_config.delete('classes') # remove classes from the config
28
- @tags = @test_config['tags']
29
28
 
30
29
  # Make sure that tags are an array
31
- @test_config['tags'] = [@test_config['tags']].flatten if @test_config['tags']
30
+ @test_config['tags'] ||= []
31
+ @test_config['tags'] = [@test_config['tags']].flatten
32
+ @tags = @test_config['tags']
32
33
 
33
34
  # Get the nodes we are working on
34
35
  if Onceover::Group.find(on_this)
@@ -289,16 +289,25 @@ class Onceover
289
289
  # Remove tests that do not have matching tags
290
290
  tests.keep_if do |test|
291
291
  filter_list.any? do |filter|
292
- if test.send(method)
293
- test.send(method).include?(filter)
294
- else
295
- false
296
- end
292
+ filter_test test, method, filter
297
293
  end
298
294
  end
299
295
  end
300
296
  end
301
297
  tests
302
298
  end
299
+
300
+ def filter_test(test, method, filter)
301
+ if test.send(method)
302
+ if method == 'tags' && filter.start_with?('~')
303
+ filter = filter.sub(/^~/, '')
304
+ ! test.send(method).include?(filter)
305
+ else
306
+ test.send(method).include?(filter)
307
+ end
308
+ else
309
+ false
310
+ end
311
+ end
303
312
  end
304
313
  end
data/onceover.gemspec CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "onceover"
7
- s.version = "3.18.0"
7
+ s.version = "3.20.0"
8
8
  s.authors = ["Dylan Ratcliffe"]
9
9
  s.email = ["dylan.ratcliffe@puppet.com"]
10
10
  s.homepage = "https://github.com/dylanratcliffe/onceover"
@@ -22,7 +22,6 @@ Gem::Specification.new do |s|
22
22
  s.add_runtime_dependency 'colored', '~> 1.2'
23
23
  s.add_runtime_dependency 'cri', '>= 2.6'
24
24
  s.add_runtime_dependency 'deep_merge', '>= 1.0.0'
25
- s.add_runtime_dependency 'facter', '< 4.0.0'
26
25
  s.add_runtime_dependency 'git'
27
26
  s.add_runtime_dependency 'logging', '>= 2.0.0'
28
27
  s.add_runtime_dependency 'multi_json', '~> 1.10'
@@ -37,4 +36,8 @@ Gem::Specification.new do |s|
37
36
  s.add_runtime_dependency 'terminal-table', '>= 1.8.0'
38
37
  s.add_runtime_dependency 'versionomy', '>= 0.5.0'
39
38
 
39
+ s.add_development_dependency 'cucumber', '~> 4.1'
40
+ s.add_development_dependency 'pry', '~> 0.13.1'
41
+ s.add_development_dependency 'rubocop', '~> 1.6', '>= 1.6.1'
42
+ s.add_development_dependency 'rubygems-tasks', '~> 0.2.5'
40
43
  end
@@ -0,0 +1,2 @@
1
+ # This will fail all compilations so that we can quickly tell if it's being used
2
+ fail('Using alternate site.pp')
@@ -1,17 +1,17 @@
1
- forge "http://forge.puppetlabs.com"
2
- #
3
- # I want to download some modules to check if r10k feature in Onceover works correctly.
4
- #
5
-
6
- # Versions should be updated to be the latest at the time you start
7
- mod "puppetlabs/stdlib", '4.11.0'
8
-
9
- # Modules from Git
10
- # Examples: https://github.com/puppetlabs/r10k/blob/master/doc/puppetfile.mkd#examples
11
- mod 'apache',
12
- :git => 'https://github.com/puppetlabs/puppetlabs-apache',
13
- :commit => '83401079053dca11d61945bd9beef9ecf7576cbf'
14
-
15
- #mod 'apache',
16
- # :git => 'https://github.com/puppetlabs/puppetlabs-apache',
17
- # :branch => 'docs_experiment'
1
+ forge "http://forge.puppetlabs.com"
2
+ #
3
+ # I want to download some modules to check if r10k feature in Onceover works correctly.
4
+ #
5
+
6
+ # Versions should be updated to be the latest at the time you start
7
+ mod "puppetlabs/stdlib", '4.11.0'
8
+
9
+ # Modules from Git
10
+ # Examples: https://github.com/puppetlabs/r10k/blob/master/doc/puppetfile.mkd#examples
11
+ mod 'apache',
12
+ :git => 'https://github.com/puppetlabs/puppetlabs-apache',
13
+ :commit => '83401079053dca11d61945bd9beef9ecf7576cbf'
14
+
15
+ #mod 'apache',
16
+ # :git => 'https://github.com/puppetlabs/puppetlabs-apache',
17
+ # :branch => 'docs_experiment'
@@ -29,4 +29,5 @@ node default {
29
29
  # This is where you can declare classes for all nodes.
30
30
  # Example:
31
31
  # class { 'my_class': }
32
+ fail('This was using the manifest setting from environment.conf')
32
33
  }
@@ -0,0 +1,1091 @@
1
+ {
2
+ "os": {
3
+ "architecture": "amd64",
4
+ "release": {
5
+ "full": "10.0",
6
+ "major": "10",
7
+ "minor": "0"
8
+ },
9
+ "distro": {
10
+ "id": "Debian",
11
+ "codename": "buster",
12
+ "description": "Debian GNU/Linux 10 (buster)",
13
+ "release": {
14
+ "full": "10.0",
15
+ "major": "10",
16
+ "minor": "0"
17
+ }
18
+ },
19
+ "hardware": "x86_64",
20
+ "selinux": {
21
+ "enabled": false
22
+ },
23
+ "family": "Debian",
24
+ "name": "Debian"
25
+ },
26
+ "augeas": {
27
+ "version": "1.12.0"
28
+ },
29
+ "partitions": {
30
+ "/dev/mapper/localhost--vg-swap_1": {
31
+ "size_bytes": 4294967296,
32
+ "size": "4.00 GiB",
33
+ "filesystem": "swap",
34
+ "uuid": "e1d39dbf-07b1-40f3-bb00-61c373ff3679"
35
+ },
36
+ "/dev/mapper/localhost--vg-root": {
37
+ "size_bytes": 16919822336,
38
+ "size": "15.76 GiB",
39
+ "filesystem": "ext3",
40
+ "uuid": "d5e15cec-ac09-49ac-a7e9-69a0b4d3bd7a",
41
+ "mount": "/"
42
+ },
43
+ "/dev/sda2": {
44
+ "size_bytes": 1024,
45
+ "size": "1.00 KiB"
46
+ },
47
+ "/dev/sda5": {
48
+ "size_bytes": 21216886784,
49
+ "size": "19.76 GiB",
50
+ "filesystem": "LVM2_member",
51
+ "uuid": "PnWAEL-Qhls-LcWt-U7Rd-Odiy-U0k8-8fNFXY",
52
+ "partuuid": "4b9f600f-05"
53
+ },
54
+ "/dev/sda1": {
55
+ "size_bytes": 254803968,
56
+ "size": "243.00 MiB",
57
+ "filesystem": "ext2",
58
+ "uuid": "6e570548-0c10-405c-abbb-2325c6c85912",
59
+ "partuuid": "4b9f600f-01",
60
+ "mount": "/boot"
61
+ }
62
+ },
63
+ "mountpoints": {
64
+ "/dev": {
65
+ "device": "udev",
66
+ "filesystem": "devtmpfs",
67
+ "options": [
68
+ "rw",
69
+ "nosuid",
70
+ "relatime",
71
+ "size=2004744k",
72
+ "nr_inodes=501186",
73
+ "mode=755"
74
+ ],
75
+ "size_bytes": 2052857856,
76
+ "available_bytes": 2052857856,
77
+ "used_bytes": 0,
78
+ "capacity": "0%",
79
+ "size": "1.91 GiB",
80
+ "available": "1.91 GiB",
81
+ "used": "0 bytes"
82
+ },
83
+ "/dev/pts": {
84
+ "device": "devpts",
85
+ "filesystem": "devpts",
86
+ "options": [
87
+ "rw",
88
+ "nosuid",
89
+ "noexec",
90
+ "relatime",
91
+ "gid=5",
92
+ "mode=620",
93
+ "ptmxmode=000"
94
+ ],
95
+ "size_bytes": 0,
96
+ "available_bytes": 0,
97
+ "used_bytes": 0,
98
+ "capacity": "100%",
99
+ "size": "0 bytes",
100
+ "available": "0 bytes",
101
+ "used": "0 bytes"
102
+ },
103
+ "/run": {
104
+ "device": "tmpfs",
105
+ "filesystem": "tmpfs",
106
+ "options": [
107
+ "rw",
108
+ "nosuid",
109
+ "noexec",
110
+ "relatime",
111
+ "size=404128k",
112
+ "mode=755"
113
+ ],
114
+ "size_bytes": 413827072,
115
+ "available_bytes": 408092672,
116
+ "used_bytes": 5734400,
117
+ "capacity": "1.39%",
118
+ "size": "394.66 MiB",
119
+ "available": "389.19 MiB",
120
+ "used": "5.47 MiB"
121
+ },
122
+ "/": {
123
+ "device": "/dev/mapper/localhost--vg-root",
124
+ "filesystem": "ext3",
125
+ "options": [
126
+ "rw",
127
+ "relatime",
128
+ "errors=remount-ro"
129
+ ],
130
+ "size_bytes": 16586805248,
131
+ "available_bytes": 14209556480,
132
+ "used_bytes": 1531260928,
133
+ "capacity": "9.73%",
134
+ "size": "15.45 GiB",
135
+ "available": "13.23 GiB",
136
+ "used": "1.43 GiB"
137
+ },
138
+ "/dev/shm": {
139
+ "device": "tmpfs",
140
+ "filesystem": "tmpfs",
141
+ "options": [
142
+ "rw",
143
+ "nosuid",
144
+ "nodev"
145
+ ],
146
+ "size_bytes": 2069123072,
147
+ "available_bytes": 2069123072,
148
+ "used_bytes": 0,
149
+ "capacity": "0%",
150
+ "size": "1.93 GiB",
151
+ "available": "1.93 GiB",
152
+ "used": "0 bytes"
153
+ },
154
+ "/run/lock": {
155
+ "device": "tmpfs",
156
+ "filesystem": "tmpfs",
157
+ "options": [
158
+ "rw",
159
+ "nosuid",
160
+ "nodev",
161
+ "noexec",
162
+ "relatime",
163
+ "size=5120k"
164
+ ],
165
+ "size_bytes": 5242880,
166
+ "available_bytes": 5242880,
167
+ "used_bytes": 0,
168
+ "capacity": "0%",
169
+ "size": "5.00 MiB",
170
+ "available": "5.00 MiB",
171
+ "used": "0 bytes"
172
+ },
173
+ "/sys/fs/cgroup": {
174
+ "device": "tmpfs",
175
+ "filesystem": "tmpfs",
176
+ "options": [
177
+ "ro",
178
+ "nosuid",
179
+ "nodev",
180
+ "noexec",
181
+ "mode=755"
182
+ ],
183
+ "size_bytes": 2069123072,
184
+ "available_bytes": 2069123072,
185
+ "used_bytes": 0,
186
+ "capacity": "0%",
187
+ "size": "1.93 GiB",
188
+ "available": "1.93 GiB",
189
+ "used": "0 bytes"
190
+ },
191
+ "/dev/mqueue": {
192
+ "device": "mqueue",
193
+ "filesystem": "mqueue",
194
+ "options": [
195
+ "rw",
196
+ "relatime"
197
+ ],
198
+ "size_bytes": 0,
199
+ "available_bytes": 0,
200
+ "used_bytes": 0,
201
+ "capacity": "100%",
202
+ "size": "0 bytes",
203
+ "available": "0 bytes",
204
+ "used": "0 bytes"
205
+ },
206
+ "/dev/hugepages": {
207
+ "device": "hugetlbfs",
208
+ "filesystem": "hugetlbfs",
209
+ "options": [
210
+ "rw",
211
+ "relatime",
212
+ "pagesize=2M"
213
+ ],
214
+ "size_bytes": 0,
215
+ "available_bytes": 0,
216
+ "used_bytes": 0,
217
+ "capacity": "100%",
218
+ "size": "0 bytes",
219
+ "available": "0 bytes",
220
+ "used": "0 bytes"
221
+ },
222
+ "/boot": {
223
+ "device": "/dev/sda1",
224
+ "filesystem": "ext2",
225
+ "options": [
226
+ "rw",
227
+ "relatime",
228
+ "block_validity",
229
+ "barrier",
230
+ "user_xattr",
231
+ "acl"
232
+ ],
233
+ "size_bytes": 246755328,
234
+ "available_bytes": 183791616,
235
+ "used_bytes": 50224128,
236
+ "capacity": "21.46%",
237
+ "size": "235.32 MiB",
238
+ "available": "175.28 MiB",
239
+ "used": "47.90 MiB"
240
+ },
241
+ "/run/user/0": {
242
+ "device": "tmpfs",
243
+ "filesystem": "tmpfs",
244
+ "options": [
245
+ "rw",
246
+ "nosuid",
247
+ "nodev",
248
+ "relatime",
249
+ "size=404124k",
250
+ "mode=700"
251
+ ],
252
+ "size_bytes": 413822976,
253
+ "available_bytes": 413822976,
254
+ "used_bytes": 0,
255
+ "capacity": "0%",
256
+ "size": "394.65 MiB",
257
+ "available": "394.65 MiB",
258
+ "used": "0 bytes"
259
+ }
260
+ },
261
+ "virtual": "vmware",
262
+ "disks": {
263
+ "sr0": {
264
+ "model": "VMware IDE CDR00",
265
+ "size_bytes": 1073741312,
266
+ "size": "1.00 GiB",
267
+ "vendor": "NECVMWar",
268
+ "type": "hdd"
269
+ },
270
+ "sda": {
271
+ "model": "Virtual disk",
272
+ "size_bytes": 21474836480,
273
+ "size": "20.00 GiB",
274
+ "vendor": "VMware",
275
+ "type": "hdd"
276
+ }
277
+ },
278
+ "kernelversion": "4.19.0",
279
+ "ssh": {
280
+ "rsa": {
281
+ "fingerprints": {
282
+ "sha1": "SSHFP 1 1 05576cc92738720d76248d148747cfa8f32712ff",
283
+ "sha256": "SSHFP 1 2 aed61463793821b34ee97afcb8934c5aa13a473e6dd26a61fda080261c01def0"
284
+ },
285
+ "key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDdoV7A+ji8joSrg4YUCTdFtLt+4Nphb9wBNDlLVdaD03SLXtyFt3vydtKzNjXRPzCSurb96Sfi32hmxHFrimLKMltBuZj0AlLEHlCnYCHDAlgL7cllqxqv5+s0b32cbhmwLx6ghaNk6XDc7hmCZuovnr4b4pHC2mka8P9gl1osb6dTRfsEZiLm3qu1fxMlJU4adS05u1uHAdcX32KF8ty1Q1s9EygwcLfmJOeKTxdA/D4axkuuLuGP48U0KO+ld4tHHb9yVVWKdhoCL3WSMYH7tMA3NRTbsbdEehEvbjQPQprZHk6uCuqcbh7Ua/L8i5/oVCH4FpTF3a+gQeN9wpLj",
286
+ "type": "ssh-rsa"
287
+ },
288
+ "ecdsa": {
289
+ "fingerprints": {
290
+ "sha1": "SSHFP 3 1 108a7a47d204732b908ebb2aa553f797ae85a495",
291
+ "sha256": "SSHFP 3 2 bcaa6eb722707b5a1cb7732f64b4aa303037c24c96731ffa9eb107a062562fb7"
292
+ },
293
+ "key": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBL9WhxtGZBEre40NnExVbI5PBO8uqcIoeqFeDdgr3GItFUKNJaTKJnroImYyiU+GP6pPnyW3wsy9rAENm6AfzsY=",
294
+ "type": "ecdsa-sha2-nistp256"
295
+ },
296
+ "ed25519": {
297
+ "fingerprints": {
298
+ "sha1": "SSHFP 4 1 0701e1636d201ea085c317968e75f26003244255",
299
+ "sha256": "SSHFP 4 2 c8379fec233379a68aa6086d8aa6c1dbd8db39fef95fb5fa8a7cee2b60c27dc7"
300
+ },
301
+ "key": "AAAAC3NzaC1lZDI1NTE5AAAAIJgYWtJU2Dn1mY0wpKIZHfUNb+0BMDTXl+cNciltzpQ3",
302
+ "type": "ssh-ed25519"
303
+ }
304
+ },
305
+ "networking": {
306
+ "scope6": "link",
307
+ "mtu": 1500,
308
+ "ip6": "fe80::250:56ff:fe9a:521a",
309
+ "mac": "00:50:56:9a:52:1a",
310
+ "fqdn": "foo.example.com",
311
+ "netmask6": "ffff:ffff:ffff:ffff::",
312
+ "primary": "ens192",
313
+ "network": "10.16.112.0",
314
+ "netmask": "255.255.240.0",
315
+ "domain": "example.com",
316
+ "dhcp": "10.32.22.9",
317
+ "network6": "fe80::",
318
+ "interfaces": {
319
+ "lo": {
320
+ "bindings": [
321
+ {
322
+ "address": "127.0.0.1",
323
+ "netmask": "255.0.0.0",
324
+ "network": "127.0.0.0"
325
+ }
326
+ ],
327
+ "bindings6": [
328
+ {
329
+ "address": "::1",
330
+ "netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
331
+ "network": "::1",
332
+ "scope6": "host"
333
+ }
334
+ ],
335
+ "mtu": 65536,
336
+ "ip": "127.0.0.1",
337
+ "netmask": "255.0.0.0",
338
+ "network": "127.0.0.0",
339
+ "ip6": "::1",
340
+ "netmask6": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
341
+ "network6": "::1",
342
+ "scope6": "host"
343
+ },
344
+ "ens192": {
345
+ "mac": "00:50:56:9a:52:1a",
346
+ "bindings": [
347
+ {
348
+ "address": "10.16.124.235",
349
+ "netmask": "255.255.240.0",
350
+ "network": "10.16.112.0"
351
+ }
352
+ ],
353
+ "bindings6": [
354
+ {
355
+ "address": "fe80::250:56ff:fe9a:521a",
356
+ "netmask": "ffff:ffff:ffff:ffff::",
357
+ "network": "fe80::",
358
+ "scope6": "link"
359
+ }
360
+ ],
361
+ "mtu": 1500,
362
+ "dhcp": "10.32.22.9",
363
+ "ip": "10.16.124.235",
364
+ "netmask": "255.255.240.0",
365
+ "network": "10.16.112.0",
366
+ "ip6": "fe80::250:56ff:fe9a:521a",
367
+ "netmask6": "ffff:ffff:ffff:ffff::",
368
+ "network6": "fe80::",
369
+ "scope6": "link"
370
+ }
371
+ },
372
+ "hostname": "foo",
373
+ "ip": "10.16.124.235"
374
+ },
375
+ "timezone": "PST",
376
+ "filesystems": "ext2,ext3,ext4",
377
+ "is_virtual": true,
378
+ "processors": {
379
+ "isa": "unknown",
380
+ "physicalcount": 1,
381
+ "models": [
382
+ "Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz",
383
+ "Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz",
384
+ "Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz",
385
+ "Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz"
386
+ ],
387
+ "speed": "2.29 GHz",
388
+ "count": 4
389
+ },
390
+ "dmi": {
391
+ "board": {
392
+ "serial_number": "None",
393
+ "manufacturer": "Intel Corporation",
394
+ "product": "440BX Desktop Reference Platform"
395
+ },
396
+ "chassis": {
397
+ "type": "Other",
398
+ "asset_tag": "No Asset Tag"
399
+ },
400
+ "manufacturer": "VMware, Inc.",
401
+ "product": {
402
+ "name": "VMware Virtual Platform",
403
+ "serial_number": "VMware-42 1a af ad 81 f1 50 f3-13 72 c0 e5 63 24 c6 28",
404
+ "uuid": "adaf1a42-f181-f350-1372-c0e56324c628"
405
+ },
406
+ "bios": {
407
+ "vendor": "Phoenix Technologies LTD",
408
+ "release_date": "12/12/2018",
409
+ "version": "6.00"
410
+ }
411
+ },
412
+ "load_averages": {
413
+ "1m": 0.02,
414
+ "5m": 0.05,
415
+ "15m": 0.02
416
+ },
417
+ "path": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
418
+ "identity": {
419
+ "uid": 0,
420
+ "user": "root",
421
+ "gid": 0,
422
+ "group": "root",
423
+ "privileged": true
424
+ },
425
+ "kernelmajversion": "4.19",
426
+ "kernelrelease": "4.19.0-5-amd64",
427
+ "system_uptime": {
428
+ "days": 0,
429
+ "seconds": 287,
430
+ "hours": 0,
431
+ "uptime": "0:04 hours"
432
+ },
433
+ "facterversion": "4.0.52",
434
+ "ruby": {
435
+ "sitedir": "/opt/puppetlabs/puppet/lib/ruby/site_ruby/2.7.0",
436
+ "platform": "x86_64-linux",
437
+ "version": "2.7.2"
438
+ },
439
+ "fips_enabled": false,
440
+ "hypervisors": {
441
+ "vmware": {
442
+ "version": "ESXi 6.7"
443
+ },
444
+ "ldom": {
445
+ "domain_name": "foo"
446
+ }
447
+ },
448
+ "memory": {
449
+ "system": {
450
+ "total": "3.85 GiB",
451
+ "total_bytes": 4138246144,
452
+ "used_bytes": 440221696,
453
+ "capacity": "10.64%",
454
+ "available_bytes": 3698024448,
455
+ "available": "3.44 GiB",
456
+ "used": "419.83 MiB"
457
+ },
458
+ "swap": {
459
+ "total": "4.00 GiB",
460
+ "total_bytes": 4294963200,
461
+ "used_bytes": 0,
462
+ "capacity": "0.00%",
463
+ "available_bytes": 4294963200,
464
+ "available": "4.00 GiB",
465
+ "used": "0 bytes"
466
+ }
467
+ },
468
+ "kernel": "Linux",
469
+ "puppetversion": "7.5.0",
470
+ "debian_kernel": "#1 SMP Debian 4.19.37-5 (2019-06-19)\n",
471
+ "who2bug": [],
472
+ "puppet_cert_paths": {
473
+ "confdir": "/etc/puppetlabs/puppet",
474
+ "ssldir": "/etc/puppetlabs/puppet/ssl",
475
+ "cert_dir": "/etc/puppetlabs/puppet/ssl/certs",
476
+ "ca_path": "/etc/puppetlabs/puppet/ssl/certs/ca.pem",
477
+ "client_cert_path": "/etc/puppetlabs/puppet/ssl/certs/.pem",
478
+ "client_key_path": "/etc/puppetlabs/puppet/ssl/private_keys/.pem"
479
+ },
480
+ "puppet_files_dir_present": false,
481
+ "puppet_ssldir": "/etc/puppetlabs/puppet/ssl",
482
+ "puppet_digest_algorithm": "sha256",
483
+ "puppet_config": "/etc/puppetlabs/puppet/puppet.conf",
484
+ "puppet_stringify_facts": false,
485
+ "mco_confdir": "/etc/mcollective/etc",
486
+ "context": "",
487
+ "puppet_inventory_metadata": {
488
+ "packages": {
489
+ "collection_enabled": false,
490
+ "last_collection_time": "0.0s"
491
+ }
492
+ },
493
+ "meltdown": {
494
+ "CVE-2017-5753": {
495
+ "CVE": "2017-5753",
496
+ "description": "SPECTRE VARIANT 1",
497
+ "vulnerable": false,
498
+ "info": {
499
+ "hardware": "Mitigation: __user pointer sanitization"
500
+ }
501
+ },
502
+ "CVE-2017-5715": {
503
+ "CVE": "2017-5715",
504
+ "description": "SPECTRE VARIANT 2",
505
+ "vulnerable": false,
506
+ "info": {
507
+ "hardware": "Full retpoline + IBPB are mitigating the vulnerability"
508
+ }
509
+ },
510
+ "CVE-2017-5754": {
511
+ "CVE": "2017-5754",
512
+ "description": "MELTDOWN",
513
+ "vulnerable": false,
514
+ "info": {
515
+ "hardware": "Mitigation: PTI"
516
+ }
517
+ },
518
+ "CVE-2018-3640": {
519
+ "CVE": "2018-3640",
520
+ "description": "VARIANT 3A",
521
+ "vulnerable": false,
522
+ "info": {
523
+ "hardware": "your CPU microcode mitigates the vulnerability"
524
+ }
525
+ },
526
+ "CVE-2018-3639": {
527
+ "CVE": "2018-3639",
528
+ "description": "VARIANT 4",
529
+ "vulnerable": false,
530
+ "info": {
531
+ "hardware": "Mitigation: Speculative Store Bypass disabled via prctl and seccomp"
532
+ }
533
+ },
534
+ "CVE-2018-3615": {
535
+ "CVE": "2018-3615",
536
+ "description": "L1TF SGX",
537
+ "vulnerable": false,
538
+ "info": {
539
+ "hardware": "your CPU vendor reported your CPU model as not vulnerable"
540
+ }
541
+ },
542
+ "CVE-2018-3620": {
543
+ "CVE": "2018-3620",
544
+ "description": "L1TF OS",
545
+ "vulnerable": false,
546
+ "info": {
547
+ "hardware": "Mitigation: PTE Inversion"
548
+ }
549
+ },
550
+ "CVE-2018-3646": {
551
+ "CVE": "2018-3646",
552
+ "description": "L1TF VMM",
553
+ "vulnerable": false,
554
+ "info": {
555
+ "hardware": "this system is not running a hypervisor"
556
+ }
557
+ },
558
+ "CVE-2018-12126": {
559
+ "CVE": "2018-12126",
560
+ "description": "MSBDS",
561
+ "vulnerable": false,
562
+ "info": {
563
+ "hardware": "Mitigation: Clear CPU buffers; SMT Host state unknown"
564
+ }
565
+ },
566
+ "CVE-2018-12130": {
567
+ "CVE": "2018-12130",
568
+ "description": "MFBDS",
569
+ "vulnerable": false,
570
+ "info": {
571
+ "hardware": "Mitigation: Clear CPU buffers; SMT Host state unknown"
572
+ }
573
+ },
574
+ "CVE-2018-12127": {
575
+ "CVE": "2018-12127",
576
+ "description": "MLPDS",
577
+ "vulnerable": false,
578
+ "info": {
579
+ "hardware": "Mitigation: Clear CPU buffers; SMT Host state unknown"
580
+ }
581
+ },
582
+ "CVE-2019-11091": {
583
+ "CVE": "2019-11091",
584
+ "description": "MDSUM",
585
+ "vulnerable": false,
586
+ "info": {
587
+ "hardware": "Mitigation: Clear CPU buffers; SMT Host state unknown"
588
+ }
589
+ }
590
+ },
591
+ "package_provider": "apt",
592
+ "current_environment": "production",
593
+ "puppet_agent_pid": 2614,
594
+ "windows_java_temp": "\\tmp",
595
+ "lvm_support": true,
596
+ "lvm_vgs": 1,
597
+ "lvm_vg_0": "localhost-vg",
598
+ "lvm_vg_localhost-vg_pvs": "/dev/sda5",
599
+ "lvm_pvs": 1,
600
+ "lvm_pv_0": "/dev/sda5",
601
+ "jenkins_plugins": "",
602
+ "python_release": "2.7",
603
+ "python2_release": "2.7",
604
+ "python3_release": "3.7",
605
+ "os_maj_version": "10",
606
+ "is_pe": false,
607
+ "aio_agent_version": "7.4.1.59",
608
+ "vcsrepo_svn_ver": "",
609
+ "number_string": "",
610
+ "apt_reboot_required": false,
611
+ "function": "",
612
+ "aio_agent_build": "7.4.1.59.g5d5199a8a",
613
+ "python_version": "2.7.16",
614
+ "python2_version": "2.7.16",
615
+ "python3_version": "3.7.3",
616
+ "mongodb_is_master": "not_installed",
617
+ "is_valid_hostname": false,
618
+ "iptables_version": "1.8.2",
619
+ "mysql_server_id": 23180442,
620
+ "staging_http_get": "curl",
621
+ "whereami": "pdx",
622
+ "platform_tag": "debian-10-amd64",
623
+ "puppetserver_installed": false,
624
+ "env_temp_variable": "/tmp",
625
+ "docker_home_dirs": {
626
+ "root": "/root",
627
+ "daemon": "/usr/sbin",
628
+ "bin": "/bin",
629
+ "sys": "/dev",
630
+ "sync": "/bin",
631
+ "games": "/usr/games",
632
+ "man": "/var/cache/man",
633
+ "lp": "/var/spool/lpd",
634
+ "mail": "/var/mail",
635
+ "news": "/var/spool/news",
636
+ "uucp": "/var/spool/uucp",
637
+ "proxy": "/bin",
638
+ "www-data": "/var/www",
639
+ "backup": "/var/backups",
640
+ "list": "/var/list",
641
+ "irc": "/var/run/ircd",
642
+ "gnats": "/var/lib/gnats",
643
+ "nobody": "/nonexistent",
644
+ "_apt": "/nonexistent",
645
+ "systemd-timesync": "/run/systemd",
646
+ "systemd-network": "/run/systemd",
647
+ "systemd-resolve": "/run/systemd",
648
+ "messagebus": "/nonexistent",
649
+ "sshd": "/run/sshd",
650
+ "ntp": "/nonexistent",
651
+ "systemd-coredump": "/"
652
+ },
653
+ "apt_has_updates": true,
654
+ "apt_has_dist_updates": true,
655
+ "apt_package_updates": [
656
+ "base-files",
657
+ "ncurses-bin",
658
+ "libperl5.28",
659
+ "perl",
660
+ "perl-base",
661
+ "perl-modules-5.28",
662
+ "bzip2",
663
+ "libbz2-1.0",
664
+ "ncurses-base",
665
+ "libnss-systemd",
666
+ "libsystemd0",
667
+ "libpam-systemd",
668
+ "systemd",
669
+ "udev",
670
+ "libudev1",
671
+ "systemd-sysv",
672
+ "dbus",
673
+ "libdbus-1-3",
674
+ "libexpat1",
675
+ "libjson-c3",
676
+ "libssl1.1",
677
+ "libcryptsetup12",
678
+ "libidn2-0",
679
+ "libp11-kit0",
680
+ "libgnutls30",
681
+ "libzstd1",
682
+ "libapt-pkg5.0",
683
+ "libapt-inst2.0",
684
+ "apt",
685
+ "apt-utils",
686
+ "gpgv",
687
+ "initramfs-tools-core",
688
+ "initramfs-tools",
689
+ "libext2fs2",
690
+ "e2fsprogs",
691
+ "cron",
692
+ "console-setup-linux",
693
+ "console-setup",
694
+ "keyboard-configuration",
695
+ "python2.7",
696
+ "python2.7-minimal",
697
+ "libpython2.7-stdlib",
698
+ "libpython2.7-minimal",
699
+ "libncurses6",
700
+ "libtinfo6",
701
+ "libncursesw6",
702
+ "libsqlite3-0",
703
+ "python3.7",
704
+ "libpython3.7-stdlib",
705
+ "python3.7-minimal",
706
+ "libpython3.7-minimal",
707
+ "tzdata",
708
+ "iproute2",
709
+ "iputils-ping",
710
+ "libicu63",
711
+ "libxml2",
712
+ "bind9-host",
713
+ "libbind9-161",
714
+ "libisccfg163",
715
+ "libisccc161",
716
+ "libdns1104",
717
+ "libisc1100",
718
+ "libcom-err2",
719
+ "libgssapi-krb5-2",
720
+ "libkrb5-3",
721
+ "libkrb5support0",
722
+ "libk5crypto3",
723
+ "liblwres161",
724
+ "file",
725
+ "libmagic1",
726
+ "libmagic-mgc",
727
+ "krb5-locales",
728
+ "libsasl2-modules-db",
729
+ "libsasl2-2",
730
+ "libldap-common",
731
+ "libldap-2.4-2",
732
+ "ncurses-term",
733
+ "openssh-sftp-server",
734
+ "openssh-server",
735
+ "openssh-client",
736
+ "reportbug",
737
+ "gpgsm",
738
+ "gpg-wks-server",
739
+ "gpg-wks-client",
740
+ "gnupg-utils",
741
+ "gpg-agent",
742
+ "gpg",
743
+ "gnupg-l10n",
744
+ "dirmngr",
745
+ "gnupg",
746
+ "gpgconf",
747
+ "python-apt-common",
748
+ "python3-apt",
749
+ "python3-reportbug",
750
+ "openssl",
751
+ "ca-certificates",
752
+ "libnghttp2-14",
753
+ "curl",
754
+ "libcurl4",
755
+ "distro-info-data",
756
+ "fuse",
757
+ "libfuse2",
758
+ "libefivar1",
759
+ "libefiboot1",
760
+ "grub-pc",
761
+ "grub2-common",
762
+ "grub-pc-bin",
763
+ "libfreetype6",
764
+ "grub-common",
765
+ "libcurl3-gnutls",
766
+ "libisc-export1100",
767
+ "libdns-export1104",
768
+ "libglib2.0-0",
769
+ "libglib2.0-data",
770
+ "rake",
771
+ "libruby2.5",
772
+ "libsasl2-modules",
773
+ "libss2",
774
+ "libx11-data",
775
+ "libx11-6",
776
+ "libxslt1.1",
777
+ "linux-libc-dev",
778
+ "open-vm-tools",
779
+ "patch",
780
+ "rubygems-integration",
781
+ "ruby2.5",
782
+ "sudo",
783
+ "unzip"
784
+ ],
785
+ "apt_package_dist_updates": [
786
+ "base-files",
787
+ "ncurses-bin",
788
+ "libperl5.28",
789
+ "perl",
790
+ "perl-base",
791
+ "perl-modules-5.28",
792
+ "bzip2",
793
+ "libbz2-1.0",
794
+ "ncurses-base",
795
+ "libnss-systemd",
796
+ "libsystemd0",
797
+ "libpam-systemd",
798
+ "systemd",
799
+ "udev",
800
+ "libudev1",
801
+ "systemd-sysv",
802
+ "dbus",
803
+ "libdbus-1-3",
804
+ "libexpat1",
805
+ "libjson-c3",
806
+ "libssl1.1",
807
+ "libcryptsetup12",
808
+ "libidn2-0",
809
+ "libp11-kit0",
810
+ "libgnutls30",
811
+ "libzstd1",
812
+ "libapt-pkg5.0",
813
+ "libapt-inst2.0",
814
+ "apt",
815
+ "apt-utils",
816
+ "gpgv",
817
+ "initramfs-tools-core",
818
+ "initramfs-tools",
819
+ "libext2fs2",
820
+ "e2fsprogs",
821
+ "cron",
822
+ "console-setup-linux",
823
+ "console-setup",
824
+ "keyboard-configuration",
825
+ "python2.7",
826
+ "python2.7-minimal",
827
+ "libpython2.7-stdlib",
828
+ "libpython2.7-minimal",
829
+ "libncurses6",
830
+ "libtinfo6",
831
+ "libncursesw6",
832
+ "libsqlite3-0",
833
+ "python3.7",
834
+ "libpython3.7-stdlib",
835
+ "python3.7-minimal",
836
+ "libpython3.7-minimal",
837
+ "tzdata",
838
+ "iproute2",
839
+ "iputils-ping",
840
+ "libicu63",
841
+ "libxml2",
842
+ "bind9-host",
843
+ "libbind9-161",
844
+ "libisccfg163",
845
+ "libisccc161",
846
+ "libdns1104",
847
+ "libisc1100",
848
+ "libcom-err2",
849
+ "libgssapi-krb5-2",
850
+ "libkrb5-3",
851
+ "libkrb5support0",
852
+ "libk5crypto3",
853
+ "liblwres161",
854
+ "file",
855
+ "libmagic1",
856
+ "libmagic-mgc",
857
+ "krb5-locales",
858
+ "libsasl2-modules-db",
859
+ "libsasl2-2",
860
+ "libldap-common",
861
+ "libldap-2.4-2",
862
+ "ncurses-term",
863
+ "openssh-sftp-server",
864
+ "openssh-server",
865
+ "openssh-client",
866
+ "reportbug",
867
+ "gpgsm",
868
+ "gpg-wks-server",
869
+ "gpg-wks-client",
870
+ "gnupg-utils",
871
+ "gpg-agent",
872
+ "gpg",
873
+ "gnupg-l10n",
874
+ "dirmngr",
875
+ "gnupg",
876
+ "gpgconf",
877
+ "python-apt-common",
878
+ "python3-apt",
879
+ "python3-reportbug",
880
+ "openssl",
881
+ "ca-certificates",
882
+ "libnghttp2-14",
883
+ "curl",
884
+ "libcurl4",
885
+ "distro-info-data",
886
+ "fuse",
887
+ "libfuse2",
888
+ "libefivar1",
889
+ "libefiboot1",
890
+ "grub-pc",
891
+ "grub2-common",
892
+ "grub-pc-bin",
893
+ "libfreetype6",
894
+ "grub-common",
895
+ "libcurl3-gnutls",
896
+ "libisc-export1100",
897
+ "libdns-export1104",
898
+ "libglib2.0-0",
899
+ "libglib2.0-data",
900
+ "rake",
901
+ "libruby2.5",
902
+ "libsasl2-modules",
903
+ "libss2",
904
+ "libx11-data",
905
+ "libx11-6",
906
+ "libxslt1.1",
907
+ "linux-image-4.19.0-14-amd64",
908
+ "linux-image-amd64",
909
+ "linux-libc-dev",
910
+ "open-vm-tools",
911
+ "patch",
912
+ "rubygems-integration",
913
+ "ruby2.5",
914
+ "sudo",
915
+ "unzip"
916
+ ],
917
+ "apt_package_security_updates": [
918
+ "libexpat1",
919
+ "libjson-c3",
920
+ "libssl1.1",
921
+ "libidn2-0",
922
+ "libp11-kit0",
923
+ "libzstd1",
924
+ "libapt-pkg5.0",
925
+ "libapt-inst2.0",
926
+ "apt",
927
+ "apt-utils",
928
+ "libicu63",
929
+ "bind9-host",
930
+ "libbind9-161",
931
+ "libisccfg163",
932
+ "libisccc161",
933
+ "libdns1104",
934
+ "libisc1100",
935
+ "libgssapi-krb5-2",
936
+ "libkrb5-3",
937
+ "libkrb5support0",
938
+ "libk5crypto3",
939
+ "liblwres161",
940
+ "krb5-locales",
941
+ "libsasl2-modules-db",
942
+ "libsasl2-2",
943
+ "libldap-common",
944
+ "libldap-2.4-2",
945
+ "python-apt-common",
946
+ "python3-apt",
947
+ "openssl",
948
+ "libnghttp2-14",
949
+ "curl",
950
+ "libcurl4",
951
+ "grub-pc",
952
+ "grub2-common",
953
+ "grub-pc-bin",
954
+ "libfreetype6",
955
+ "grub-common",
956
+ "libcurl3-gnutls",
957
+ "libisc-export1100",
958
+ "libdns-export1104",
959
+ "libsasl2-modules",
960
+ "linux-libc-dev",
961
+ "patch",
962
+ "sudo"
963
+ ],
964
+ "apt_package_security_dist_updates": [
965
+ "libexpat1",
966
+ "libjson-c3",
967
+ "libssl1.1",
968
+ "libidn2-0",
969
+ "libp11-kit0",
970
+ "libzstd1",
971
+ "libapt-pkg5.0",
972
+ "libapt-inst2.0",
973
+ "apt",
974
+ "apt-utils",
975
+ "libicu63",
976
+ "bind9-host",
977
+ "libbind9-161",
978
+ "libisccfg163",
979
+ "libisccc161",
980
+ "libdns1104",
981
+ "libisc1100",
982
+ "libgssapi-krb5-2",
983
+ "libkrb5-3",
984
+ "libkrb5support0",
985
+ "libk5crypto3",
986
+ "liblwres161",
987
+ "krb5-locales",
988
+ "libsasl2-modules-db",
989
+ "libsasl2-2",
990
+ "libldap-common",
991
+ "libldap-2.4-2",
992
+ "python-apt-common",
993
+ "python3-apt",
994
+ "openssl",
995
+ "libnghttp2-14",
996
+ "curl",
997
+ "libcurl4",
998
+ "grub-pc",
999
+ "grub2-common",
1000
+ "grub-pc-bin",
1001
+ "libfreetype6",
1002
+ "grub-common",
1003
+ "libcurl3-gnutls",
1004
+ "libisc-export1100",
1005
+ "libdns-export1104",
1006
+ "libsasl2-modules",
1007
+ "linux-image-4.19.0-14-amd64",
1008
+ "linux-image-amd64",
1009
+ "linux-libc-dev",
1010
+ "patch",
1011
+ "sudo"
1012
+ ],
1013
+ "apt_updates": 128,
1014
+ "apt_dist_updates": 130,
1015
+ "apt_security_updates": 45,
1016
+ "apt_security_dist_updates": 47,
1017
+ "puppet_vardir": "/opt/puppetlabs/puppet/cache",
1018
+ "puppet_environmentpath": "/etc/puppetlabs/code/environments",
1019
+ "puppet_server": "pe-infranext-prod.infc-aws.puppet.net",
1020
+ "systemd": true,
1021
+ "systemd_version": "241",
1022
+ "systemd_internal_services": {
1023
+ "systemd-boot-check-no-failures.service": "disabled",
1024
+ "systemd-fsck-root.service": "enabled-runtime",
1025
+ "systemd-networkd-wait-online.service": "disabled",
1026
+ "systemd-networkd.service": "disabled",
1027
+ "systemd-resolved.service": "disabled",
1028
+ "systemd-time-wait-sync.service": "disabled",
1029
+ "systemd-timesyncd.service": "enabled"
1030
+ },
1031
+ "network_nexthop_ip": "10.16.112.1",
1032
+ "network_primary_interface": "ens192",
1033
+ "network_primary_ip": "10.16.124.235",
1034
+ "prometheus_alert_manager_running": false,
1035
+ "stage": "crusade",
1036
+ "haszfs": false,
1037
+ "apt_update_last_success": 1615413102,
1038
+ "virt_libvirt": false,
1039
+ "classification": {
1040
+ "hostname": "marital-crusade",
1041
+ "parts": [
1042
+ "marital",
1043
+ "",
1044
+ "",
1045
+ "",
1046
+ "crusade",
1047
+ ""
1048
+ ],
1049
+ "version": 0,
1050
+ "group": "marital",
1051
+ "function": "",
1052
+ "number": "",
1053
+ "number_string": "",
1054
+ "context": "",
1055
+ "stage": "crusade",
1056
+ "id": ""
1057
+ },
1058
+ "ip6tables_version": "1.8.2",
1059
+ "root_home": "/root",
1060
+ "primary_ip": "10.16.124.235",
1061
+ "primary_iface": "eth0",
1062
+ "group": "marital",
1063
+ "function_number": "",
1064
+ "platform_symlink_writable": true,
1065
+ "service_provider": "systemd",
1066
+ "pe_patch": {
1067
+ "package_updates": [],
1068
+ "package_update_count": 0,
1069
+ "missing_update_kbs": [],
1070
+ "security_package_updates": [],
1071
+ "security_package_update_count": 0,
1072
+ "blackouts": {},
1073
+ "pinned_packages": [],
1074
+ "last_run": {},
1075
+ "patch_group": "",
1076
+ "reboot_override": "default",
1077
+ "reboots": {
1078
+ "reboot_required": "unknown"
1079
+ },
1080
+ "block_patching_on_warnings": "false",
1081
+ "warnings": {
1082
+ "update_file": "Update file not found, update information invalid",
1083
+ "security_update_file": "Security update file not found, update information invalid"
1084
+ },
1085
+ "blocked": false,
1086
+ "blocked_reasons": []
1087
+ },
1088
+ "domain": "example.com",
1089
+ "fqdn": "foo.example.com",
1090
+ "hostname": "foo"
1091
+ }