simp-beaker-helpers 1.7.3 → 1.7.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c7de1dfcac5f44c9466b55ae675bfe3191ecf512
4
- data.tar.gz: fd4d1615265b83861e702fad89e3250051444e85
3
+ metadata.gz: 6a1a9c3f3df01d3c9a497cb8eb9d0172405fdc6c
4
+ data.tar.gz: b9466a65c5077ccacc5777c6ae45779450496fa2
5
5
  SHA512:
6
- metadata.gz: e22ef74e3d2fdaa17a893441fa8efd24d26c7e5b00e402c7d2905d2cd2a69e6c555d94d76bb1e3423228b672ff2c0244e33215646d796299f4f464e1fa6a2460
7
- data.tar.gz: 249acf36822fe694fd6468c03136ea221448c06b3739cb4ae7d189ee6bfbdabdeb18d4f63dc2f33d64b5231b64a8d3ffbc0f98e636f05ab83caa5587928b5656
6
+ metadata.gz: 3c860415c95d94cc9cade8a86d4c44bedd99c8290f048cba7abb398ee3ab07aae9d7aec03b161ad9bfb509e322cbeee721533abdb8e8658fb75f026201adcfed
7
+ data.tar.gz: 0a4253533c535ac4959ba68a317e8695a165a116d72f2a3c1c33abc42d4cd4d322408b76c261d983ea4c8a46b943d3e62d0aab1160abed36baa16f3b5be1555b
@@ -1,15 +1,39 @@
1
1
  ---
2
2
  language: ruby
3
3
  cache: bundler
4
-
4
+ sudo: false
5
+ before_install:
6
+ - rm Gemfile.lock || true
7
+ bundler_args: "--without development --path .vendor"
8
+ notifications:
9
+ email: false
5
10
  rvm:
6
11
  - 2.1.9
7
-
12
+ - 2.3.3
8
13
  env:
9
14
  - SIMP_SKIP_NON_SIMPOS_TESTS=1
10
-
11
-
12
15
  script:
13
- - 'bundle exec rake spec'
14
-
15
-
16
+ - bundle exec rake spec
17
+ matrix:
18
+ fast_finish: true
19
+ before_deploy:
20
+ - bundle exec rake clobber
21
+ - "export GEM_VERSION=`ruby -r ./lib/simp/beaker_helpers/version.rb -e 'puts Simp::BeakerHelpers::VERSION'`"
22
+ - '[[ $TRAVIS_TAG =~ ^${GEM_VERSION}$ ]]'
23
+ deploy:
24
+ - provider: rubygems
25
+ gemspec: simp-beaker-helpers.gemspec
26
+ gem: simp-beaker-helpers
27
+ api_key:
28
+ secure: "AlnBx0dBSxn+S97n0h14ltKUOA+6v0bc7QZPIcwGJV9nnf1hKH3pf9La1TVknEx7XgpAcM9jusQJ7hBlqvSq8z8SFF0bZk1EgSRIKc1cuYPLiGyUM2O7+AFHyCy3iCnPvKeoQmE/BJb5O1dGnbmSbf4A0fqLxA7jiHG1j7z+cnmJB1i67wovDfl13TsOXyBfbespWBMMc0BKAw56FPs9XggAk2cNusS3hd5tqW1AZPT2/xwt+d8ngkmO96u8QcichYRFQ+w+XW4H0w935wNg/dWiskJlt7TIYVAh4Ko5s2DZKf52Tne8TugALSn0LhRatpp7sw1FTTpteCW8UqK8uwGC2hM4pZViAOv4P1YObz2IPOZPriBl+cCayJdMKnotkUJliAMnw5TLiSWKLou+S0Pdj2h3fJZWdOEwRPMzIVoJtsOHG3GdNcPL6f7iU0vP/wr6FeR3uWa+fA7NHRi2Du955O8JpogjdrW08ahcAEwhtI3A4mrA08wN09axsrwr093uDRm/5h4FHyAhExJ0YiA/6kcPpUvILcLStyHe0RQDICQMdsQo2DSbnL65w3QjFa2fML2Shf9cRwX06+ia2BxozWzFD/6p3RiRtPxphnbFiUdjYSGWcwCcUgbJx9SW04lSSxOhpyItuXgxZqiybkzstXd6riu5zwg1R8TWk34="
29
+ on:
30
+ tags: true
31
+ rvm: 2.1.9
32
+ condition: "($SKIP_PUBLISH != true)"
33
+ - provider: releases
34
+ api_key:
35
+ secure: "RoQepMSpEzpTLgSYP1apB8AcKNMoumqe/emNg9lIu4T55t7fCPVZFmoTL2/VCjpGpBY3SL6PijSRelY6B1bri+6SFz/hlWhCQ8t1hodrEX23ieFBwWyLI7TFvrCjVejkJwaj7N2nYUQBv8YxScbRp4daFaDhrPJMrfqKZUlBBQ2KEUvqienOn7Tdt4OQ7/ThRXlhBm8OGjZfaKyWDyJykef+yC1scJrl8HA71XRHxho/iojTRPqJJCKW1QNmomVWAwK6ZEvb2WrD27yZN60wEcygdbmzKxlAXrfp13Ho+ir2GjRXJr1VKNPecFTDe21fDFMLZ5VxZgOJ7TWnhz2UAQIPjDTLzEMuJci7DDvRCWMJ17pYurm0OGAeKPWZbtf5PLYouKvnjNsfY8vy+Ip6MqmhiXqqLSO9XN/jgEVFPHj8pOj0DDq6PtTB8dNJj7g60Ak0Uj5iole4/ef1DHv803/t9J6IVqULmYZREqeTg24KkZLfTSEbkhYMGjbCZGaSAGhAFLAAjEDTM19/k50TXnNt5smn31Mqt45PULcrHP4+t6hM+IsX9w05aOlcvfwWiBm9nPlBPeRn59wZ64+T729i5wgkhFcHmYE/2Ql1Hvz5FebyxJQziyw6eRvCVASTtFEkuT+Noy3v4u3G4fQl/S2OeCP4v6Fs0wlImzFE1lA="
36
+ on:
37
+ tags: true
38
+ rvm: 2.1.9
39
+ condition: "($SKIP_PUBLISH != true)"
@@ -4,6 +4,11 @@
4
4
  # - https://docs.puppet.com/puppet/latest/about_agent.html
5
5
  #
6
6
  version_mappings:
7
+ '5.0.0': '5.0.0'
8
+ '4.10.4': '1.10.4'
9
+ '4.10.3': '1.10.3'
10
+ '4.10.2': '1.10.2'
11
+ '4.10.1': '1.10.1'
7
12
  '4.10.0': '1.10.0'
8
13
  '4.9.4': '1.9.3'
9
14
  '4.9.3': '1.9.2'
@@ -2,7 +2,14 @@ module Simp; end
2
2
 
3
3
  module Simp::BeakerHelpers
4
4
  require 'simp/beaker_helpers/version'
5
- DEFAULT_PUPPET_AGENT_VERSION = '1.8.3'
5
+ require 'simp/beaker_helpers/inspec'
6
+ require 'simp/beaker_helpers/ssg'
7
+
8
+ # This is the *oldest* version that the latest release of SIMP supports
9
+ #
10
+ # This is done so that we know if some new thing that we're using breaks the
11
+ # oldest system that we support.
12
+ DEFAULT_PUPPET_AGENT_VERSION = '1.7.1'
6
13
 
7
14
  # use the `puppet fact` face to look up facts on an SUT
8
15
  def pfact_on(sut, fact_name)
@@ -596,5 +603,4 @@ done
596
603
  require 'beaker/puppet_install_helper'
597
604
  run_puppet_install_helper(puppet_install_type, puppet_agent_version)
598
605
  end
599
-
600
606
  end
@@ -0,0 +1,169 @@
1
+ module Simp::BeakerHelpers
2
+
3
+ # Helpers for working with Inspec
4
+ class Inspec
5
+ # Create a new Inspec helper for the specified host against the specified profile
6
+ #
7
+ # @param sut
8
+ # The SUT against which to run
9
+ #
10
+ # @param profile
11
+ # The name of the profile against which to run
12
+ #
13
+ def initialize(sut, profile)
14
+ @sut = sut
15
+
16
+ @sut.install_package('inspec')
17
+
18
+ @sut_profile_dir = '/tmp/inspec_tests'
19
+
20
+ output_dir = File.absolute_path('sec_results/inspec')
21
+
22
+ unless File.directory?(output_dir)
23
+ FileUtils.mkdir_p(output_dir)
24
+ end
25
+
26
+ inspec_fixtures = File.join(fixtures_path, 'inspec_profiles')
27
+ os = fact_on(@sut, 'operatingsystem')
28
+ os_rel = fact_on(@sut, 'operatingsystemmajrelease')
29
+
30
+ @inspec_result_file = File.join(output_dir, "#{@sut.hostname}-inspec-#{Time.now.to_i}")
31
+
32
+ scp_to(@sut, File.join(inspec_fixtures, "#{os}-#{os_rel}-#{profile}"), @sut_profile_dir)
33
+
34
+ # The results of the inspec scan in Hash form
35
+ @inspec_results = {}
36
+ end
37
+
38
+ # Run the inspec tests and record the results
39
+ def run
40
+ sut_inspec_results = '/tmp/inspec_results.json'
41
+
42
+ inspec_cmd = "inspec exec --format json #{@sut_profile_dir} > #{sut_inspec_results}"
43
+ result = on(@sut, inspec_cmd, :accept_all_exit_codes => true)
44
+
45
+ tmpdir = Dir.mktmpdir
46
+ begin
47
+ Dir.chdir(tmpdir) do
48
+ scp_from(@sut, sut_inspec_results, '.')
49
+
50
+ local_inspec_results = File.basename(sut_inspec_results)
51
+
52
+ if File.exist?(local_inspec_results)
53
+ begin
54
+ @inspec_results = JSON.load(File.read(local_inspec_results))
55
+ rescue JSON::ParserError, JSON::GeneratorError
56
+ @inspec_results = nil
57
+ end
58
+ end
59
+ end
60
+ ensure
61
+ FileUtils.remove_entry_secure tmpdir
62
+ end
63
+
64
+ unless @inspec_results
65
+ File.open(@inspec_result_file + '.err', 'w') do |fh|
66
+ fh.puts(result.stderr.strip)
67
+ end
68
+
69
+ err_msg = ["Error running inspec command #{inspec_cmd}"]
70
+ err_msg << "Error captured in #{@inspec_result_file}" + '.err'
71
+
72
+ fail(err_msg.join("\n"))
73
+ end
74
+ end
75
+
76
+ # Output the report
77
+ #
78
+ # @param report
79
+ # The inspec results Hash
80
+ #
81
+ def write_report(report)
82
+ File.open(@inspec_result_file + '.json', 'w') do |fh|
83
+ fh.puts(JSON.pretty_generate(@inspec_results))
84
+ end
85
+
86
+ File.open(@inspec_result_file + '.report', 'w') do |fh|
87
+ fh.puts(report[:report].uncolor)
88
+ end
89
+ end
90
+
91
+ # Process the results of an InSpec run
92
+ #
93
+ # @return [Hash] A Hash of statistics and a formatted report
94
+ #
95
+ def process_inspec_results
96
+ require 'highline'
97
+
98
+ HighLine.colorize_strings
99
+
100
+ stats = {
101
+ :passed => 0,
102
+ :failed => 0,
103
+ :skipped => 0,
104
+ :report => []
105
+ }
106
+
107
+ profiles = @inspec_results['profiles']
108
+
109
+ profiles.each do |profile|
110
+ stats[:report] << "Name: #{profile['name']}"
111
+
112
+ profile['controls'].each do |control|
113
+ title = control['title']
114
+
115
+ if title.length > 72
116
+ title = title[0..71] + '(...)'
117
+ end
118
+
119
+ title_chunks = control['title'].scan(/.{1,72}\W|.{1,72}/).map(&:strip)
120
+
121
+ stats[:report] << "\n Control: #{title_chunks.shift}"
122
+ unless title_chunks.empty?
123
+ title_chunks.map!{|x| x = " #{x}"}
124
+ stats[:report] << title_chunks.join("\n")
125
+ end
126
+
127
+ if control['results']
128
+ status = control['results'].first['status']
129
+ else
130
+ status = 'skipped'
131
+ end
132
+
133
+ status_str = " Status: "
134
+ if status == 'skipped'
135
+ stats[:skipped] += 1
136
+
137
+ stats[:report] << status_str + status.yellow
138
+ stats[:report] << " File: #{control['source_location']['ref']}"
139
+ elsif status =~ /^fail/
140
+ stats[:failed] += 1
141
+
142
+ stats[:report] << status_str + status.red
143
+ stats[:report] << " File: #{control['source_location']['ref']}"
144
+ else
145
+ stats[:passed] += 1
146
+
147
+ stats[:report] << status_str + status.green
148
+ end
149
+ end
150
+
151
+ stats[:report] << "\n Statistics:"
152
+ stats[:report] << " * Passed: #{stats[:passed].to_s.green}"
153
+ stats[:report] << " * Failed: #{stats[:failed].to_s.red}"
154
+ stats[:report] << " * Skipped: #{stats[:skipped].to_s.yellow}"
155
+
156
+ score = 0
157
+ if (stats[:passed] + stats[:failed]) > 0
158
+ score = ((stats[:passed].to_f/(stats[:passed] + stats[:failed])) * 100.0).round(0)
159
+ end
160
+
161
+ stats[:report] << " * Score: #{score}%"
162
+ end
163
+
164
+ stats[:report] = stats[:report].join("\n")
165
+
166
+ return stats
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,133 @@
1
+ module Simp::BeakerHelpers
2
+ # Helpers for working with the SCAP Security Guide
3
+ class SSG
4
+
5
+ if ENV['BEAKER_ssg_repo']
6
+ GIT_REPO = ENV['BEAKER_ssg_repo']
7
+ else
8
+ GIT_REPO = 'https://github.com/OpenSCAP/scap-security-guide.git'
9
+ end
10
+
11
+ EL_PACKAGES = [
12
+ 'git',
13
+ 'cmake',
14
+ 'openscap-utils',
15
+ 'openscap-python',
16
+ 'python-lxml'
17
+ ]
18
+
19
+ OS_INFO = {
20
+ 'RedHat' => {
21
+ '6' => {
22
+ 'required_packages' => EL_PACKAGES,
23
+ 'ssg' => {
24
+ 'target' => 'rhel6',
25
+ 'datastream' => 'ssg-rhel6-ds.xml'
26
+ }
27
+ },
28
+ '7' => {
29
+ 'required_packages' => EL_PACKAGES,
30
+ 'ssg' => {
31
+ 'target' => 'rhel7',
32
+ 'datastream' => 'ssg-rhel7-ds.xml'
33
+ }
34
+ }
35
+ },
36
+ 'CentOS' => {
37
+ '6' => {
38
+ 'required_packages' => EL_PACKAGES,
39
+ 'ssg' => {
40
+ 'target' => 'rhel6',
41
+ 'datastream' => 'ssg-rhel6-ds.xml'
42
+ }
43
+ },
44
+ '7' => {
45
+ 'required_packages' => EL_PACKAGES,
46
+ 'ssg' => {
47
+ 'target' => 'centos7',
48
+ 'datastream' => 'ssg-centos7-ds.xml'
49
+ }
50
+ }
51
+ }
52
+ }
53
+
54
+ # Create a new SSG helper for the specified host
55
+ #
56
+ # @param sut
57
+ # The SUT against which to run
58
+ #
59
+ def initialize(sut)
60
+ @sut = sut
61
+
62
+ @os = fact_on(@sut, 'operatingsystem')
63
+ @os_rel = fact_on(@sut, 'operatingsystemmajrelease')
64
+
65
+ unless OS_INFO[@os]
66
+ fail("Error: The '#{@os}' Operating System is not supported")
67
+ end
68
+
69
+ OS_INFO[@os][@os_rel]['required_packages'].each do |pkg|
70
+ @sut.install_package(pkg)
71
+ end
72
+
73
+ @output_dir = File.absolute_path('sec_results/ssg')
74
+
75
+ unless File.directory?(@output_dir)
76
+ FileUtils.mkdir_p(@output_dir)
77
+ end
78
+
79
+ @result_file = "#{@sut.hostname}-ssg-#{Time.now.to_i}"
80
+
81
+ get_ssg_datastream
82
+ end
83
+
84
+ def target
85
+ OS_INFO[@os][@os_rel]['ssg']['target']
86
+ end
87
+
88
+ def remediate(profile)
89
+ evaluate(profile, true)
90
+ end
91
+
92
+ def evaluate(profile, remediate=false)
93
+ cmd = 'cd scap-security-guide && oscap xccdf eval'
94
+
95
+ if remediate
96
+ cmd += ' --remediate'
97
+ end
98
+
99
+ cmd += %( --profile #{profile} --results #{@result_file}.xml --report #{@result_file}.html #{OS_INFO[@os][@os_rel]['ssg']['datastream']})
100
+
101
+ # We accept all exit codes here because there have occasionally been
102
+ # failures in the SSG content and we're not testing that.
103
+
104
+ on(@sut, cmd, :accept_all_exit_codes => true)
105
+
106
+ ['xml', 'html'].each do |ext|
107
+ path = "scap-security-guide/#{@result_file}.#{ext}"
108
+ scp_from(@sut, path, @output_dir)
109
+
110
+ fail("Could not retrieve #{path} from #{@sut}") unless File.exist?(File.join(@output_dir, "#{@result_file}.#{ext}"))
111
+ end
112
+ end
113
+
114
+ private
115
+
116
+ def get_ssg_datastream
117
+ # Allow users to point at a specific SSG release 'tar.bz2' file
118
+ ssg_release = ENV['BEAKER_ssg_release']
119
+
120
+ # Grab the latest SSG release in fixtures if it exists
121
+ ssg_release ||= Dir.glob('spec/fixtures/ssg_releases/*.bz2').last
122
+
123
+ if ssg_release
124
+ scp_to(@sut, ssg_release)
125
+
126
+ on(@sut, %(mkdir -p scap-security-guide && tar -xj -C scap-security-guide --strip-components 1 -f #{ssg_release} && cp scap-security-guide/*ds.xml ~))
127
+ else
128
+ on(@sut, %(git clone #{GIT_REPO}))
129
+ on(@sut, %(cd scap-security-guide/build; cmake ../; make -j4 #{OS_INFO[@os][@os_rel]['ssg']['target']}-content && cp *ds.xml ~))
130
+ end
131
+ end
132
+ end
133
+ end
@@ -1,5 +1,5 @@
1
1
  module Simp; end
2
2
 
3
3
  module Simp::BeakerHelpers
4
- VERSION = '1.7.3'
4
+ VERSION = '1.7.4'
5
5
  end
@@ -14,6 +14,7 @@ module Simp::Rake
14
14
 
15
15
  ::CLEAN.include( %{#{@base_dir}/log} )
16
16
  ::CLEAN.include( %{#{@base_dir}/junit} )
17
+ ::CLEAN.include( %{#{@base_dir}/sec_results} )
17
18
 
18
19
  yield self if block_given?
19
20
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simp-beaker-helpers
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.3
4
+ version: 1.7.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Tessmer
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-06-16 00:00:00.000000000 Z
12
+ date: 2017-07-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: beaker
@@ -60,6 +60,8 @@ files:
60
60
  - files/pki/template_host.cnf
61
61
  - files/puppet-agent-versions.yaml
62
62
  - lib/simp/beaker_helpers.rb
63
+ - lib/simp/beaker_helpers/inspec.rb
64
+ - lib/simp/beaker_helpers/ssg.rb
63
65
  - lib/simp/beaker_helpers/version.rb
64
66
  - lib/simp/rake/beaker.rb
65
67
  - simp-beaker-helpers.gemspec
@@ -91,15 +93,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
91
93
  version: '0'
92
94
  requirements: []
93
95
  rubyforge_project:
94
- rubygems_version: 2.4.8
96
+ rubygems_version: 2.4.5
95
97
  signing_key:
96
98
  specification_version: 4
97
99
  summary: beaker helper methods for SIMP
98
- test_files:
99
- - spec/acceptance/enable_fips_spec.rb
100
- - spec/acceptance/fixture_modules_spec.rb
101
- - spec/acceptance/nodesets/default.yml
102
- - spec/acceptance/pki_tests_spec.rb
103
- - spec/acceptance/set_hieradata_on_spec.rb
104
- - spec/acceptance/write_hieradata_to_spec.rb
105
- - spec/spec_helper_acceptance.rb
100
+ test_files: []