diff options
Diffstat (limited to 'lib/chef/compliance')
-rw-r--r-- | lib/chef/compliance/default_attributes.rb | 2 | ||||
-rw-r--r-- | lib/chef/compliance/reporter/cli.rb | 68 | ||||
-rw-r--r-- | lib/chef/compliance/runner.rb | 3 |
3 files changed, 72 insertions, 1 deletions
diff --git a/lib/chef/compliance/default_attributes.rb b/lib/chef/compliance/default_attributes.rb index 9b368d4f64..ee57be7b89 100644 --- a/lib/chef/compliance/default_attributes.rb +++ b/lib/chef/compliance/default_attributes.rb @@ -27,7 +27,7 @@ class Chef # Controls what is done with the resulting report after the Chef InSpec run. # Accepts a single string value or an array of multiple values. - # Accepted values: 'chef-server-automate', 'chef-automate', 'json-file', 'audit-enforcer' + # Accepted values: 'chef-server-automate', 'chef-automate', 'json-file', 'audit-enforcer', 'cli' "reporter" => "json-file", # Controls if Chef InSpec profiles should be fetched from Chef Automate or Chef Infra Server diff --git a/lib/chef/compliance/reporter/cli.rb b/lib/chef/compliance/reporter/cli.rb new file mode 100644 index 0000000000..c0908ebc34 --- /dev/null +++ b/lib/chef/compliance/reporter/cli.rb @@ -0,0 +1,68 @@ +class Chef + module Compliance + module Reporter + class Cli + def send_report(report) + # iterate over each profile and control + output = [] + report[:profiles].each do |profile| + next if profile[:controls].nil? + + output << "\n" + output << profile[:title] + profile[:controls].each do |control| + next if control[:results].nil? + + output << "\t#{control[:title]}" + control[:results].each do |result| + output << format_result(result) + end + end + end + output << "\n" + puts output.join("\n") + end + + private + + def format_result(result) + output = [] + found = false + if result[:status] == 'failed' + if result[:code_desc] + found = true + output << "\t\t\033[31m\xE2\x9D\x8C #{result[:code_desc]}\033[0m" + end + if result[:message] + if found + result[:message].split(/\n/).reject(&:empty?).each do |m| + output << "\t\t\t\033[31m#{m}\033[0m" + end + else + prefix = "\xE2\x9D\x8C" + result[:message].split(/\n/).reject(&:empty?).each do |m| + output << "\t\t\033[31m#{prefix}#{m}\033[0m" + prefix = '' + end + end + found = true + end + unless found + output << "\t\t\033[31m\xE2\x9D\x8C #{result[:status]}\033[0m" + end + else + found = false + if result[:code_desc] + found = true + output << "\t\t\033[32m\xE2\x9C\x94 #{result[:code_desc]}\033[0m" + end + unless found + output << "\t\t\033[32m\xE2\x9C\x94 #{result[:status]}\033[0m" + end + end + output + end + end + end + end +end diff --git a/lib/chef/compliance/runner.rb b/lib/chef/compliance/runner.rb index 8ab80e11ff..f37d93ff1e 100644 --- a/lib/chef/compliance/runner.rb +++ b/lib/chef/compliance/runner.rb @@ -4,6 +4,7 @@ require_relative "default_attributes" require_relative "reporter/automate" require_relative "reporter/chef_server_automate" require_relative "reporter/compliance_enforcer" +require_relative "reporter/cli" require_relative "reporter/json_file" class Chef @@ -241,6 +242,8 @@ class Chef Chef::Compliance::Reporter::JsonFile.new(file: path) when "audit-enforcer" Chef::Compliance::Reporter::ComplianceEnforcer.new + when "cli" + Chef::Compliance::Reporter::Cli.new else raise "'#{reporter_type}' is not a supported reporter for Compliance Phase." end |