class ForemanScapClient::BaseClient
Constants
- CONFIG_FILE
Attributes
config[R]
policy_id[R]
Public Instance Methods
run(policy_id, skip_upload = false)
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 16 def run(policy_id, skip_upload = false) @policy_id = policy_id load_config ensure_scan_files run_in_tmpdir skip_upload end
Private Instance Methods
bzip()
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 119 def bzip puts 'DEBUG: running: ' + bzip_command result = `#{bzip_command}` if !$?.success? puts 'bzip failed' puts results exit(2) end end
bzip_command()
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 115 def bzip_command "/usr/bin/env bzip2 #{results_path}" end
download_uri(download_path)
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 198 def download_uri(download_path) foreman_proxy_uri + "#{download_path}" end
ensure_file(dir, download_path, type_humanized)
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 179 def ensure_file(dir, download_path, type_humanized) return if File.exist?(policy_from_config[dir]) puts "File #{policy_from_config[dir]} is missing. Downloading it from proxy." begin FileUtils.mkdir_p(File.dirname(policy_from_config[dir])) uri = URI.parse(download_uri(policy_from_config[download_path])) puts "Download #{type_humanized} xml from: #{uri}" request = generate_https_object(uri).get(uri.path) request.value content_xml = request.body open(policy_from_config[dir], 'wb') do |file| file << content_xml end rescue StandardError => e puts "#{type_humanized} is missing and download failed with error: #{e.message}" exit(5) end end
ensure_policy_exists()
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 172 def ensure_policy_exists if policy_from_config.nil? puts "Policy id #{@policy_id} not found." exit(1) end end
ensure_scan_files()
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 25 def ensure_scan_files raise NotImplementedError end
foreman_proxy_uri()
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 149 def foreman_proxy_uri foreman_proxy_fqdn = config[:server] foreman_proxy_port = config[:port] "https://#{foreman_proxy_fqdn}:#{foreman_proxy_port}" end
foreman_upload_result(response)
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 202 def foreman_upload_result(response) begin print_upload_result JSON.parse(response.body) rescue StandardError => e # rescue and print nothing if older proxy version does not respond with json we expect end end
generate_https_object(uri)
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 155 def generate_https_object(uri) https = Net::HTTP.new(uri.host, uri.port) https.use_ssl = true https.ciphers = config[:ciphers] if config[:ciphers] https.verify_mode = OpenSSL::SSL::VERIFY_PEER https.ca_file = config[:ca_file] begin https.cert = OpenSSL::X509::Certificate.new File.read(config[:host_certificate]) https.key = OpenSSL::PKey.read File.read(config[:host_private_key]) rescue StandardError => e puts 'Unable to load certs' puts e.message exit(3) end https end
http_proxy_uri()
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 100 def http_proxy_uri return nil unless config[:http_proxy_server] && config[:http_proxy_port] http_proxy_server = config[:http_proxy_server] http_proxy_port = config[:http_proxy_port] "http://#{http_proxy_server}:#{http_proxy_port}" end
load_config()
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 60 def load_config @config ||= YAML.load_file(CONFIG_FILE) ensure_policy_exists rescue => e puts 'Config file could not be loaded' puts e.message exit(1) end
policy_from_config()
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 56 def policy_from_config config && config[policy_namespace] && config[policy_namespace][@policy_id] end
policy_namespace()
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 29 def policy_namespace raise NotImplementedError end
print_upload_result(parsed)
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 210 def print_upload_result(parsed) if parsed['id'] puts "Report uploaded, report id: #{parsed['id']}" else puts "Report not uploaded from proxy to Foreman server, cause: #{parsed['result']}" end end
results_bzip_path()
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 111 def results_bzip_path "#{results_path}.bz2" end
results_path()
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 107 def results_path "#{@tmp_dir}/results.xml" end
run_in_tmpdir(skip_upload)
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 41 def run_in_tmpdir(skip_upload) if skip_upload @tmp_dir = Dir.mktmpdir scan bzip else Dir.mktmpdir do |dir| @tmp_dir = dir scan bzip upload end end end
run_scan()
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 76 def run_scan stdout_str, error_str, result = Open3.capture3(scan_command_env_vars, scan_command) if result.success? || result.exitstatus == 2 error_str.each_line { |item| print item if item.start_with?('WARNING:') || item.start_with?('Downloading') } @report = results_path else puts 'Scan failed' puts stdout_str puts error_str exit(2) end end
scan()
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 69 def scan puts "DEBUG: running: " + scan_command puts "with ENV vars: #{scan_command_env_vars}" unless scan_command_env_vars.empty? run_scan end
scan_command()
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 37 def scan_command raise NotImplementedError end
scan_command_env_vars()
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 89 def scan_command_env_vars if http_proxy_uri { 'HTTP_PROXY' => http_proxy_uri, 'HTTPS_PROXY' => http_proxy_uri } else {} end end
upload()
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 129 def upload uri = URI.parse(upload_uri) puts "Uploading results to #{uri}" https = generate_https_object(uri) https.read_timeout = config[:timeout] if config[:timeout] request = Net::HTTP::Post.new uri.path request.body = File.read(results_bzip_path) request['Content-Type'] = 'text/xml' request['Content-Encoding'] = 'x-bzip2' begin res = https.request(request) value = res.value foreman_upload_result res rescue StandardError => e puts res.body if res puts "Upload failed: #{e.message}" exit(4) end end
upload_uri()
click to toggle source
# File lib/foreman_scap_client/base_client.rb, line 33 def upload_uri raise NotImplementedError end