class ForemanScapClient::Client
Public Instance Methods
run(policy_id)
click to toggle source
# File lib/foreman_scap_client/client.rb, line 12 def run(policy_id) @policy_id = policy_id ensure_scan_file Dir.mktmpdir do |dir| @tmp_dir = dir scan bzip upload end end
Private Instance Methods
bzip()
click to toggle source
# File lib/foreman_scap_client/client.rb, line 66 def bzip puts 'DEBUG: running: ' + bzip_command result = %x`#{bzip_command}` if !$?.success? puts 'bzip failed' puts results exit(2) end end
bzip_command()
click to toggle source
# File lib/foreman_scap_client/client.rb, line 62 def bzip_command "/usr/bin/bzip2 #{results_path}" end
config()
click to toggle source
# File lib/foreman_scap_client/client.rb, line 25 def config @config ||= YAML.load_file(CONFIG_FILE) rescue => e puts 'Config file could not be loaded' puts e.message exit(1) end
download_uri(download_path)
click to toggle source
# File lib/foreman_scap_client/client.rb, line 139 def download_uri(download_path) foreman_proxy_uri + "#{download_path}" end
ensure_scan_file()
click to toggle source
# File lib/foreman_scap_client/client.rb, line 120 def ensure_scan_file return if File.exist?(config[@policy_id][:content_path]) puts "File #{config[@policy_id][:content_path]} is missing. Downloading it from proxy" begin FileUtils.mkdir_p(File.dirname(config[@policy_id][:content_path])) uri = URI.parse(download_uri(config[@policy_id][:download_path])) puts "Download scap content xml from: #{uri}" request = generate_https_object(uri).get(uri.path) request.value scap_content_xml = request.body open(config[@policy_id][:content_path], 'wb') do |file| file << scap_content_xml end rescue StandardError => e puts "SCAP file is missing and download failed with error: #{e.message}" exit(5) end end
foreman_proxy_uri()
click to toggle source
# File lib/foreman_scap_client/client.rb, line 98 def foreman_proxy_uri foreman_proxy_fqdn = config[:server] foreman_proxy_port = config[:port] "https://#{foreman_proxy_fqdn}:#{foreman_proxy_port}" end
generate_https_object(uri)
click to toggle source
# File lib/foreman_scap_client/client.rb, line 104 def generate_https_object(uri) https = Net::HTTP.new(uri.host, uri.port) https.use_ssl = true 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::RSA.new File.read(config[:host_private_key]) rescue StandardError => e puts 'Unable to load certs' puts e.message exit(3) end https end
results_bzip_path()
click to toggle source
# File lib/foreman_scap_client/client.rb, line 49 def results_bzip_path "#{results_path}.bz2" end
results_path()
click to toggle source
# File lib/foreman_scap_client/client.rb, line 45 def results_path "#{@tmp_dir}/results.xml" end
scan()
click to toggle source
# File lib/foreman_scap_client/client.rb, line 33 def scan puts "DEBUG: running: " + scan_command result = %x`#{scan_command}` if $?.success? || $?.exitstatus == 2 @report = results_path else puts 'Scan failed' puts result exit(2) end end
scan_command()
click to toggle source
# File lib/foreman_scap_client/client.rb, line 53 def scan_command if config[@policy_id] && config[@policy_id][:profile] && !config[@policy_id][:profile].empty? profile = "--profile #{config[@policy_id][:profile]}" else profile = '' end "oscap xccdf eval #{profile} --results-arf #{results_path} #{config[@policy_id][:content_path]}" end
upload()
click to toggle source
# File lib/foreman_scap_client/client.rb, line 76 def upload uri = URI.parse(upload_uri) puts "Uploading results to #{uri}" https = generate_https_object(uri) 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) res.value 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/client.rb, line 94 def upload_uri foreman_proxy_uri + "/compliance/arf/#{@policy_id}" end