inspec 2.3.5 → 2.3.10
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 +4 -4
 - data/CHANGELOG.md +21 -8
 - data/Rakefile +1 -2
 - data/lib/bundles/inspec-compliance/api.rb +3 -353
 - data/lib/bundles/inspec-compliance/configuration.rb +3 -102
 - data/lib/bundles/inspec-compliance/http.rb +3 -115
 - data/lib/bundles/inspec-compliance/support.rb +3 -35
 - data/lib/bundles/inspec-compliance/target.rb +3 -142
 - data/lib/inspec/base_cli.rb +4 -1
 - data/lib/inspec/cli.rb +1 -1
 - data/lib/inspec/control_eval_context.rb +2 -2
 - data/lib/inspec/version.rb +1 -1
 - data/lib/matchers/matchers.rb +3 -3
 - data/lib/{bundles → plugins}/inspec-compliance/README.md +0 -0
 - data/lib/plugins/inspec-compliance/lib/inspec-compliance.rb +12 -0
 - data/lib/plugins/inspec-compliance/lib/inspec-compliance/api.rb +358 -0
 - data/lib/plugins/inspec-compliance/lib/inspec-compliance/api/login.rb +192 -0
 - data/lib/plugins/inspec-compliance/lib/inspec-compliance/cli.rb +266 -0
 - data/lib/plugins/inspec-compliance/lib/inspec-compliance/configuration.rb +103 -0
 - data/lib/plugins/inspec-compliance/lib/inspec-compliance/http.rb +116 -0
 - data/lib/{bundles → plugins/inspec-compliance/lib}/inspec-compliance/images/cc-token.png +0 -0
 - data/lib/plugins/inspec-compliance/lib/inspec-compliance/support.rb +36 -0
 - data/lib/plugins/inspec-compliance/lib/inspec-compliance/target.rb +143 -0
 - data/lib/plugins/inspec-compliance/test/functional/inspec_compliance_test.rb +43 -0
 - data/lib/{bundles → plugins}/inspec-compliance/test/integration/default/cli.rb +0 -0
 - data/lib/plugins/inspec-compliance/test/unit/api/login_test.rb +190 -0
 - data/lib/plugins/inspec-compliance/test/unit/api_test.rb +385 -0
 - data/lib/plugins/inspec-compliance/test/unit/target_test.rb +155 -0
 - data/lib/resources/processes.rb +19 -3
 - metadata +17 -10
 - data/lib/bundles/inspec-compliance.rb +0 -16
 - data/lib/bundles/inspec-compliance/.kitchen.yml +0 -20
 - data/lib/bundles/inspec-compliance/api/login.rb +0 -193
 - data/lib/bundles/inspec-compliance/bootstrap.sh +0 -41
 - data/lib/bundles/inspec-compliance/cli.rb +0 -276
 
| 
         @@ -1,41 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            #!/bin/bash
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            echo "Installing Chef Compliance $deb"
         
     | 
| 
       4 
     | 
    
         
            -
            # select latest package from cache directory
         
     | 
| 
       5 
     | 
    
         
            -
            # deb=$(find /inspec/.cache -name '*.deb' | tail -1)
         
     | 
| 
       6 
     | 
    
         
            -
            # sudo dpkg -i $deb
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
            # use chef compliance package repository
         
     | 
| 
       9 
     | 
    
         
            -
            sudo apt-get install -y apt-transport-https
         
     | 
| 
       10 
     | 
    
         
            -
            sudo apt-get install wget
         
     | 
| 
       11 
     | 
    
         
            -
            wget -qO - https://downloads.chef.io/packages-chef-io-public.key | sudo apt-key add -
         
     | 
| 
       12 
     | 
    
         
            -
            CHANNEL=${CHANNEL:-stable}
         
     | 
| 
       13 
     | 
    
         
            -
            DISTRIBUTION=$(lsb_release --codename | cut -f2)
         
     | 
| 
       14 
     | 
    
         
            -
            echo "found $DISTRIBUTION"
         
     | 
| 
       15 
     | 
    
         
            -
            echo "use $CHANNEL channel"
         
     | 
| 
       16 
     | 
    
         
            -
            echo "deb https://packages.chef.io/$CHANNEL-apt $DISTRIBUTION main" > /etc/apt/sources.list.d/chef-$CHANNEL.list
         
     | 
| 
       17 
     | 
    
         
            -
            sudo apt-get update
         
     | 
| 
       18 
     | 
    
         
            -
            sudo apt-get install chef-compliance
         
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
            sudo chef-compliance-ctl reconfigure --accept-license
         
     | 
| 
       21 
     | 
    
         
            -
            sudo chef-compliance-ctl restart
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
            # finalize setup
         
     | 
| 
       24 
     | 
    
         
            -
            cd /
         
     | 
| 
       25 
     | 
    
         
            -
            /opt/chef-compliance/embedded/service/core/bin/core setup --endpoint "http://127.0.0.1:10500/setup" --login "admin" --password "admin" --name "John Doe" --accept-eula
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
            # wget --no-check-certificate http://127.0.0.1/api/version
         
     | 
| 
       28 
     | 
    
         
            -
            # cat version
         
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
            # install ruby 2.3
         
     | 
| 
       31 
     | 
    
         
            -
            sudo apt-get install -y software-properties-common
         
     | 
| 
       32 
     | 
    
         
            -
            sudo apt-add-repository -y ppa:brightbox/ruby-ng
         
     | 
| 
       33 
     | 
    
         
            -
            sudo apt-get update
         
     | 
| 
       34 
     | 
    
         
            -
            sudo apt-get install -y ruby2.3 ruby2.3-dev
         
     | 
| 
       35 
     | 
    
         
            -
            ruby2.3 -v
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
            # prepare the usage of bundler
         
     | 
| 
       38 
     | 
    
         
            -
            sudo gem install bundler
         
     | 
| 
       39 
     | 
    
         
            -
            cd /inspec
         
     | 
| 
       40 
     | 
    
         
            -
            bundle install
         
     | 
| 
       41 
     | 
    
         
            -
            BUNDLE_GEMFILE=/inspec/Gemfile bundle exec inspec version
         
     | 
| 
         @@ -1,276 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # encoding: utf-8
         
     | 
| 
       2 
     | 
    
         
            -
            # author: Christoph Hartmann
         
     | 
| 
       3 
     | 
    
         
            -
            # author: Dominik Richter
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            require 'thor'
         
     | 
| 
       6 
     | 
    
         
            -
            require 'erb'
         
     | 
| 
       7 
     | 
    
         
            -
            require 'inspec/base_cli'
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
            module Compliance
         
     | 
| 
       10 
     | 
    
         
            -
              class ComplianceCLI < Inspec::BaseCLI
         
     | 
| 
       11 
     | 
    
         
            -
                namespace 'compliance'
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
                # TODO: find another solution, once https://github.com/erikhuda/thor/issues/261 is fixed
         
     | 
| 
       14 
     | 
    
         
            -
                def self.banner(command, _namespace = nil, _subcommand = false)
         
     | 
| 
       15 
     | 
    
         
            -
                  "#{basename} #{subcommand_prefix} #{command.usage}"
         
     | 
| 
       16 
     | 
    
         
            -
                end
         
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
                def self.subcommand_prefix
         
     | 
| 
       19 
     | 
    
         
            -
                  namespace
         
     | 
| 
       20 
     | 
    
         
            -
                end
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                desc "login https://SERVER --insecure --user='USER' --ent='ENTERPRISE' --token='TOKEN'", 'Log in to a Chef Compliance/Chef Automate SERVER'
         
     | 
| 
       23 
     | 
    
         
            -
                long_desc <<-LONGDESC
         
     | 
| 
       24 
     | 
    
         
            -
                  `login` allows you to use InSpec with Chef Automate or a Chef Compliance Server
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
                  You need to a token for communication. More information about token retrieval
         
     | 
| 
       27 
     | 
    
         
            -
                  is available at:
         
     | 
| 
       28 
     | 
    
         
            -
                    https://docs.chef.io/api_automate.html#authentication-methods
         
     | 
| 
       29 
     | 
    
         
            -
                    https://docs.chef.io/api_compliance.html#obtaining-an-api-token
         
     | 
| 
       30 
     | 
    
         
            -
                LONGDESC
         
     | 
| 
       31 
     | 
    
         
            -
                option :insecure, aliases: :k, type: :boolean,
         
     | 
| 
       32 
     | 
    
         
            -
                  desc: 'Explicitly allows InSpec to perform "insecure" SSL connections and transfers'
         
     | 
| 
       33 
     | 
    
         
            -
                option :user, type: :string, required: false,
         
     | 
| 
       34 
     | 
    
         
            -
                  desc: 'Username'
         
     | 
| 
       35 
     | 
    
         
            -
                option :password, type: :string, required: false,
         
     | 
| 
       36 
     | 
    
         
            -
                  desc: 'Password (Chef Compliance Only)'
         
     | 
| 
       37 
     | 
    
         
            -
                option :token, type: :string, required: false,
         
     | 
| 
       38 
     | 
    
         
            -
                  desc: 'Access token'
         
     | 
| 
       39 
     | 
    
         
            -
                option :refresh_token, type: :string, required: false,
         
     | 
| 
       40 
     | 
    
         
            -
                  desc: 'Chef Compliance refresh token (Chef Compliance Only)'
         
     | 
| 
       41 
     | 
    
         
            -
                option :dctoken, type: :string, required: false,
         
     | 
| 
       42 
     | 
    
         
            -
                  desc: 'Data Collector token (Chef Automate Only)'
         
     | 
| 
       43 
     | 
    
         
            -
                option :ent, type: :string, required: false,
         
     | 
| 
       44 
     | 
    
         
            -
                  desc: 'Enterprise for Chef Automate reporting (Chef Automate Only)'
         
     | 
| 
       45 
     | 
    
         
            -
                def login(server)
         
     | 
| 
       46 
     | 
    
         
            -
                  options['server'] = server
         
     | 
| 
       47 
     | 
    
         
            -
                  Compliance::API.login(options)
         
     | 
| 
       48 
     | 
    
         
            -
                  config = Compliance::Configuration.new
         
     | 
| 
       49 
     | 
    
         
            -
                  puts "Stored configuration for Chef #{config['server_type'].capitalize}: #{config['server']}' with user: '#{config['user']}'"
         
     | 
| 
       50 
     | 
    
         
            -
                end
         
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
                desc 'profiles', 'list all available profiles in Chef Compliance'
         
     | 
| 
       53 
     | 
    
         
            -
                option :owner, type: :string, required: false,
         
     | 
| 
       54 
     | 
    
         
            -
                  desc: 'owner whose profiles to list'
         
     | 
| 
       55 
     | 
    
         
            -
                def profiles
         
     | 
| 
       56 
     | 
    
         
            -
                  config = Compliance::Configuration.new
         
     | 
| 
       57 
     | 
    
         
            -
                  return if !loggedin(config)
         
     | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
                  # set owner to config
         
     | 
| 
       60 
     | 
    
         
            -
                  config['owner'] = options['owner'] || config['user']
         
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
       62 
     | 
    
         
            -
                  msg, profiles = Compliance::API.profiles(config)
         
     | 
| 
       63 
     | 
    
         
            -
                  profiles.sort_by! { |hsh| hsh['title'] }
         
     | 
| 
       64 
     | 
    
         
            -
                  if !profiles.empty?
         
     | 
| 
       65 
     | 
    
         
            -
                    # iterate over profiles
         
     | 
| 
       66 
     | 
    
         
            -
                    headline('Available profiles:')
         
     | 
| 
       67 
     | 
    
         
            -
                    profiles.each { |profile|
         
     | 
| 
       68 
     | 
    
         
            -
                      owner = profile['owner_id'] || profile['owner']
         
     | 
| 
       69 
     | 
    
         
            -
                      li("#{profile['title']} v#{profile['version']} (#{mark_text(owner + '/' + profile['name'])})")
         
     | 
| 
       70 
     | 
    
         
            -
                    }
         
     | 
| 
       71 
     | 
    
         
            -
                  else
         
     | 
| 
       72 
     | 
    
         
            -
                    puts msg if msg != 'success'
         
     | 
| 
       73 
     | 
    
         
            -
                    puts 'Could not find any profiles'
         
     | 
| 
       74 
     | 
    
         
            -
                    exit 1
         
     | 
| 
       75 
     | 
    
         
            -
                  end
         
     | 
| 
       76 
     | 
    
         
            -
                rescue Compliance::ServerConfigurationMissing
         
     | 
| 
       77 
     | 
    
         
            -
                  STDERR.puts "\nServer configuration information is missing. Please login using `inspec compliance login`"
         
     | 
| 
       78 
     | 
    
         
            -
                  exit 1
         
     | 
| 
       79 
     | 
    
         
            -
                end
         
     | 
| 
       80 
     | 
    
         
            -
             
     | 
| 
       81 
     | 
    
         
            -
                desc 'exec PROFILE', 'executes a Chef Compliance profile'
         
     | 
| 
       82 
     | 
    
         
            -
                exec_options
         
     | 
| 
       83 
     | 
    
         
            -
                def exec(*tests)
         
     | 
| 
       84 
     | 
    
         
            -
                  config = Compliance::Configuration.new
         
     | 
| 
       85 
     | 
    
         
            -
                  return if !loggedin(config)
         
     | 
| 
       86 
     | 
    
         
            -
                  o = opts(:exec).dup
         
     | 
| 
       87 
     | 
    
         
            -
                  diagnose(o)
         
     | 
| 
       88 
     | 
    
         
            -
                  configure_logger(o)
         
     | 
| 
       89 
     | 
    
         
            -
             
     | 
| 
       90 
     | 
    
         
            -
                  # iterate over tests and add compliance scheme
         
     | 
| 
       91 
     | 
    
         
            -
                  tests = tests.map { |t| 'compliance://' + Compliance::API.sanitize_profile_name(t) }
         
     | 
| 
       92 
     | 
    
         
            -
             
     | 
| 
       93 
     | 
    
         
            -
                  runner = Inspec::Runner.new(o)
         
     | 
| 
       94 
     | 
    
         
            -
                  tests.each { |target| runner.add_target(target) }
         
     | 
| 
       95 
     | 
    
         
            -
             
     | 
| 
       96 
     | 
    
         
            -
                  exit runner.run
         
     | 
| 
       97 
     | 
    
         
            -
                rescue ArgumentError, RuntimeError, Train::UserError => e
         
     | 
| 
       98 
     | 
    
         
            -
                  $stderr.puts e.message
         
     | 
| 
       99 
     | 
    
         
            -
                  exit 1
         
     | 
| 
       100 
     | 
    
         
            -
                end
         
     | 
| 
       101 
     | 
    
         
            -
             
     | 
| 
       102 
     | 
    
         
            -
                desc 'download PROFILE', 'downloads a profile from Chef Compliance'
         
     | 
| 
       103 
     | 
    
         
            -
                option :name, type: :string,
         
     | 
| 
       104 
     | 
    
         
            -
                  desc: 'Name of the archive filename (file type will be added)'
         
     | 
| 
       105 
     | 
    
         
            -
                def download(profile_name)
         
     | 
| 
       106 
     | 
    
         
            -
                  o = options.dup
         
     | 
| 
       107 
     | 
    
         
            -
                  configure_logger(o)
         
     | 
| 
       108 
     | 
    
         
            -
             
     | 
| 
       109 
     | 
    
         
            -
                  config = Compliance::Configuration.new
         
     | 
| 
       110 
     | 
    
         
            -
                  return if !loggedin(config)
         
     | 
| 
       111 
     | 
    
         
            -
             
     | 
| 
       112 
     | 
    
         
            -
                  profile_name = Compliance::API.sanitize_profile_name(profile_name)
         
     | 
| 
       113 
     | 
    
         
            -
                  if Compliance::API.exist?(config, profile_name)
         
     | 
| 
       114 
     | 
    
         
            -
                    puts "Downloading `#{profile_name}`"
         
     | 
| 
       115 
     | 
    
         
            -
             
     | 
| 
       116 
     | 
    
         
            -
                    fetcher = Compliance::Fetcher.resolve(
         
     | 
| 
       117 
     | 
    
         
            -
                      {
         
     | 
| 
       118 
     | 
    
         
            -
                        compliance: profile_name,
         
     | 
| 
       119 
     | 
    
         
            -
                      },
         
     | 
| 
       120 
     | 
    
         
            -
                    )
         
     | 
| 
       121 
     | 
    
         
            -
             
     | 
| 
       122 
     | 
    
         
            -
                    # we provide a name, the fetcher adds the extension
         
     | 
| 
       123 
     | 
    
         
            -
                    _owner, id = profile_name.split('/')
         
     | 
| 
       124 
     | 
    
         
            -
                    file_name = fetcher.fetch(o.name || id)
         
     | 
| 
       125 
     | 
    
         
            -
                    puts "Profile stored to #{file_name}"
         
     | 
| 
       126 
     | 
    
         
            -
                  else
         
     | 
| 
       127 
     | 
    
         
            -
                    puts "Profile #{profile_name} is not available in Chef Compliance."
         
     | 
| 
       128 
     | 
    
         
            -
                    exit 1
         
     | 
| 
       129 
     | 
    
         
            -
                  end
         
     | 
| 
       130 
     | 
    
         
            -
                end
         
     | 
| 
       131 
     | 
    
         
            -
             
     | 
| 
       132 
     | 
    
         
            -
                desc 'upload PATH', 'uploads a local profile to Chef Compliance'
         
     | 
| 
       133 
     | 
    
         
            -
                option :overwrite, type: :boolean, default: false,
         
     | 
| 
       134 
     | 
    
         
            -
                  desc: 'Overwrite existing profile on Server.'
         
     | 
| 
       135 
     | 
    
         
            -
                option :owner, type: :string, required: false,
         
     | 
| 
       136 
     | 
    
         
            -
                  desc: 'Owner that should own the profile'
         
     | 
| 
       137 
     | 
    
         
            -
                def upload(path) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, PerceivedComplexity, Metrics/CyclomaticComplexity
         
     | 
| 
       138 
     | 
    
         
            -
                  config = Compliance::Configuration.new
         
     | 
| 
       139 
     | 
    
         
            -
                  return if !loggedin(config)
         
     | 
| 
       140 
     | 
    
         
            -
             
     | 
| 
       141 
     | 
    
         
            -
                  # set owner to config
         
     | 
| 
       142 
     | 
    
         
            -
                  config['owner'] = options['owner'] || config['user']
         
     | 
| 
       143 
     | 
    
         
            -
             
     | 
| 
       144 
     | 
    
         
            -
                  unless File.exist?(path)
         
     | 
| 
       145 
     | 
    
         
            -
                    puts "Directory #{path} does not exist."
         
     | 
| 
       146 
     | 
    
         
            -
                    exit 1
         
     | 
| 
       147 
     | 
    
         
            -
                  end
         
     | 
| 
       148 
     | 
    
         
            -
             
     | 
| 
       149 
     | 
    
         
            -
                  vendor_deps(path, options) if File.directory?(path)
         
     | 
| 
       150 
     | 
    
         
            -
             
     | 
| 
       151 
     | 
    
         
            -
                  o = options.dup
         
     | 
| 
       152 
     | 
    
         
            -
                  configure_logger(o)
         
     | 
| 
       153 
     | 
    
         
            -
             
     | 
| 
       154 
     | 
    
         
            -
                  # only run against the mock backend, otherwise we run against the local system
         
     | 
| 
       155 
     | 
    
         
            -
                  o[:backend] = Inspec::Backend.create(target: 'mock://')
         
     | 
| 
       156 
     | 
    
         
            -
                  o[:check_mode] = true
         
     | 
| 
       157 
     | 
    
         
            -
                  o[:vendor_cache] = Inspec::Cache.new(o[:vendor_cache])
         
     | 
| 
       158 
     | 
    
         
            -
             
     | 
| 
       159 
     | 
    
         
            -
                  # check the profile, we only allow to upload valid profiles
         
     | 
| 
       160 
     | 
    
         
            -
                  profile = Inspec::Profile.for_target(path, o)
         
     | 
| 
       161 
     | 
    
         
            -
             
     | 
| 
       162 
     | 
    
         
            -
                  # start verification process
         
     | 
| 
       163 
     | 
    
         
            -
                  error_count = 0
         
     | 
| 
       164 
     | 
    
         
            -
                  error = lambda { |msg|
         
     | 
| 
       165 
     | 
    
         
            -
                    error_count += 1
         
     | 
| 
       166 
     | 
    
         
            -
                    puts msg
         
     | 
| 
       167 
     | 
    
         
            -
                  }
         
     | 
| 
       168 
     | 
    
         
            -
             
     | 
| 
       169 
     | 
    
         
            -
                  result = profile.check
         
     | 
| 
       170 
     | 
    
         
            -
                  unless result[:summary][:valid]
         
     | 
| 
       171 
     | 
    
         
            -
                    error.call('Profile check failed. Please fix the profile before upload.')
         
     | 
| 
       172 
     | 
    
         
            -
                  else
         
     | 
| 
       173 
     | 
    
         
            -
                    puts('Profile is valid')
         
     | 
| 
       174 
     | 
    
         
            -
                  end
         
     | 
| 
       175 
     | 
    
         
            -
             
     | 
| 
       176 
     | 
    
         
            -
                  # determine user information
         
     | 
| 
       177 
     | 
    
         
            -
                  if (config['token'].nil? && config['refresh_token'].nil?) || config['user'].nil?
         
     | 
| 
       178 
     | 
    
         
            -
                    error.call('Please login via `inspec compliance login`')
         
     | 
| 
       179 
     | 
    
         
            -
                  end
         
     | 
| 
       180 
     | 
    
         
            -
             
     | 
| 
       181 
     | 
    
         
            -
                  # read profile name from inspec.yml
         
     | 
| 
       182 
     | 
    
         
            -
                  profile_name = profile.params[:name]
         
     | 
| 
       183 
     | 
    
         
            -
             
     | 
| 
       184 
     | 
    
         
            -
                  # read profile version from inspec.yml
         
     | 
| 
       185 
     | 
    
         
            -
                  profile_version = profile.params[:version]
         
     | 
| 
       186 
     | 
    
         
            -
             
     | 
| 
       187 
     | 
    
         
            -
                  # check that the profile is not uploaded already,
         
     | 
| 
       188 
     | 
    
         
            -
                  # confirm upload to the user (overwrite with --force)
         
     | 
| 
       189 
     | 
    
         
            -
                  if Compliance::API.exist?(config, "#{config['owner']}/#{profile_name}##{profile_version}") && !options['overwrite']
         
     | 
| 
       190 
     | 
    
         
            -
                    error.call('Profile exists on the server, use --overwrite')
         
     | 
| 
       191 
     | 
    
         
            -
                  end
         
     | 
| 
       192 
     | 
    
         
            -
             
     | 
| 
       193 
     | 
    
         
            -
                  # abort if we found an error
         
     | 
| 
       194 
     | 
    
         
            -
                  if error_count > 0
         
     | 
| 
       195 
     | 
    
         
            -
                    puts "Found #{error_count} error(s)"
         
     | 
| 
       196 
     | 
    
         
            -
                    exit 1
         
     | 
| 
       197 
     | 
    
         
            -
                  end
         
     | 
| 
       198 
     | 
    
         
            -
             
     | 
| 
       199 
     | 
    
         
            -
                  # if it is a directory, tar it to tmp directory
         
     | 
| 
       200 
     | 
    
         
            -
                  generated = false
         
     | 
| 
       201 
     | 
    
         
            -
                  if File.directory?(path)
         
     | 
| 
       202 
     | 
    
         
            -
                    generated = true
         
     | 
| 
       203 
     | 
    
         
            -
                    archive_path = Dir::Tmpname.create([profile_name, '.tar.gz']) {}
         
     | 
| 
       204 
     | 
    
         
            -
                    puts "Generate temporary profile archive at #{archive_path}"
         
     | 
| 
       205 
     | 
    
         
            -
                    profile.archive({ output: archive_path, ignore_errors: false, overwrite: true })
         
     | 
| 
       206 
     | 
    
         
            -
                  else
         
     | 
| 
       207 
     | 
    
         
            -
                    archive_path = path
         
     | 
| 
       208 
     | 
    
         
            -
                  end
         
     | 
| 
       209 
     | 
    
         
            -
             
     | 
| 
       210 
     | 
    
         
            -
                  puts "Start upload to #{config['owner']}/#{profile_name}"
         
     | 
| 
       211 
     | 
    
         
            -
                  pname = ERB::Util.url_encode(profile_name)
         
     | 
| 
       212 
     | 
    
         
            -
             
     | 
| 
       213 
     | 
    
         
            -
                  if Compliance::API.is_automate_server?(config) || Compliance::API.is_automate2_server?(config)
         
     | 
| 
       214 
     | 
    
         
            -
                    puts 'Uploading to Chef Automate'
         
     | 
| 
       215 
     | 
    
         
            -
                  else
         
     | 
| 
       216 
     | 
    
         
            -
                    puts 'Uploading to Chef Compliance'
         
     | 
| 
       217 
     | 
    
         
            -
                  end
         
     | 
| 
       218 
     | 
    
         
            -
                  success, msg = Compliance::API.upload(config, config['owner'], pname, archive_path)
         
     | 
| 
       219 
     | 
    
         
            -
             
     | 
| 
       220 
     | 
    
         
            -
                  # delete temp file if it was temporary generated
         
     | 
| 
       221 
     | 
    
         
            -
                  File.delete(archive_path) if generated && File.exist?(archive_path)
         
     | 
| 
       222 
     | 
    
         
            -
             
     | 
| 
       223 
     | 
    
         
            -
                  if success
         
     | 
| 
       224 
     | 
    
         
            -
                    puts 'Successfully uploaded profile'
         
     | 
| 
       225 
     | 
    
         
            -
                  else
         
     | 
| 
       226 
     | 
    
         
            -
                    puts 'Error during profile upload:'
         
     | 
| 
       227 
     | 
    
         
            -
                    puts msg
         
     | 
| 
       228 
     | 
    
         
            -
                    exit 1
         
     | 
| 
       229 
     | 
    
         
            -
                  end
         
     | 
| 
       230 
     | 
    
         
            -
                end
         
     | 
| 
       231 
     | 
    
         
            -
             
     | 
| 
       232 
     | 
    
         
            -
                desc 'version', 'displays the version of the Chef Compliance server'
         
     | 
| 
       233 
     | 
    
         
            -
                def version
         
     | 
| 
       234 
     | 
    
         
            -
                  config = Compliance::Configuration.new
         
     | 
| 
       235 
     | 
    
         
            -
                  info = Compliance::API.version(config)
         
     | 
| 
       236 
     | 
    
         
            -
                  if !info.nil? && info['version']
         
     | 
| 
       237 
     | 
    
         
            -
                    puts "Name:    #{info['api']}"
         
     | 
| 
       238 
     | 
    
         
            -
                    puts "Version: #{info['version']}"
         
     | 
| 
       239 
     | 
    
         
            -
                  else
         
     | 
| 
       240 
     | 
    
         
            -
                    puts 'Could not determine server version.'
         
     | 
| 
       241 
     | 
    
         
            -
                    exit 1
         
     | 
| 
       242 
     | 
    
         
            -
                  end
         
     | 
| 
       243 
     | 
    
         
            -
                rescue Compliance::ServerConfigurationMissing
         
     | 
| 
       244 
     | 
    
         
            -
                  puts "\nServer configuration information is missing. Please login using `inspec compliance login`"
         
     | 
| 
       245 
     | 
    
         
            -
                  exit 1
         
     | 
| 
       246 
     | 
    
         
            -
                end
         
     | 
| 
       247 
     | 
    
         
            -
             
     | 
| 
       248 
     | 
    
         
            -
                desc 'logout', 'user logout from Chef Compliance'
         
     | 
| 
       249 
     | 
    
         
            -
                def logout
         
     | 
| 
       250 
     | 
    
         
            -
                  config = Compliance::Configuration.new
         
     | 
| 
       251 
     | 
    
         
            -
                  unless config.supported?(:oidc) || config['token'].nil? || config['server_type'] == 'automate'
         
     | 
| 
       252 
     | 
    
         
            -
                    config = Compliance::Configuration.new
         
     | 
| 
       253 
     | 
    
         
            -
                    url = "#{config['server']}/logout"
         
     | 
| 
       254 
     | 
    
         
            -
                    Compliance::HTTP.post(url, config['token'], config['insecure'], !config.supported?(:oidc))
         
     | 
| 
       255 
     | 
    
         
            -
                  end
         
     | 
| 
       256 
     | 
    
         
            -
                  success = config.destroy
         
     | 
| 
       257 
     | 
    
         
            -
             
     | 
| 
       258 
     | 
    
         
            -
                  if success
         
     | 
| 
       259 
     | 
    
         
            -
                    puts 'Successfully logged out'
         
     | 
| 
       260 
     | 
    
         
            -
                  else
         
     | 
| 
       261 
     | 
    
         
            -
                    puts 'Could not log out'
         
     | 
| 
       262 
     | 
    
         
            -
                  end
         
     | 
| 
       263 
     | 
    
         
            -
                end
         
     | 
| 
       264 
     | 
    
         
            -
             
     | 
| 
       265 
     | 
    
         
            -
                private
         
     | 
| 
       266 
     | 
    
         
            -
             
     | 
| 
       267 
     | 
    
         
            -
                def loggedin(config)
         
     | 
| 
       268 
     | 
    
         
            -
                  serverknown = !config['server'].nil?
         
     | 
| 
       269 
     | 
    
         
            -
                  puts 'You need to login first with `inspec compliance login`' if !serverknown
         
     | 
| 
       270 
     | 
    
         
            -
                  serverknown
         
     | 
| 
       271 
     | 
    
         
            -
                end
         
     | 
| 
       272 
     | 
    
         
            -
              end
         
     | 
| 
       273 
     | 
    
         
            -
             
     | 
| 
       274 
     | 
    
         
            -
              # register the subcommand to Inspec CLI registry
         
     | 
| 
       275 
     | 
    
         
            -
              Inspec::Plugins::CLI.add_subcommand(ComplianceCLI, 'compliance', 'compliance SUBCOMMAND ...', 'Chef Compliance commands', {})
         
     | 
| 
       276 
     | 
    
         
            -
            end
         
     |