class Cloudkeeper::Managers::ImageListManager

Attributes

image_list[R]
openssl_store[R]

Public Class Methods

new() click to toggle source
# File lib/cloudkeeper/managers/image_list_manager.rb, line 11
def initialize
  @openssl_store = OpenSSL::X509::Store.new
  @openssl_store.add_path Cloudkeeper::Settings[:'ca-dir'] if Cloudkeeper::Settings[:'ca-dir']
end

Public Instance Methods

download_image_list() click to toggle source
# File lib/cloudkeeper/managers/image_list_manager.rb, line 16
def download_image_list
  logger.debug 'Downloading fresh image lists...'
  url = Cloudkeeper::Settings[:'image-list']
  Dir.mktmpdir('cloudkeeper') { |dir| retrieve_image_list url, dir }
rescue Cloudkeeper::Errors::ImageList::DownloadError, Cloudkeeper::Errors::ImageList::VerificationError,
       Cloudkeeper::Errors::Parsing::ParsingError, OpenSSL::PKCS7::PKCS7Error, JSON::ParserError => ex
  raise Cloudkeeper::Errors::ImageList::ImageListError, "Image list #{url.inspect} couldn't be downloaded\n#{ex.message}"
end

Private Instance Methods

convert_image_list(image_list_hash) click to toggle source
# File lib/cloudkeeper/managers/image_list_manager.rb, line 62
def convert_image_list(image_list_hash)
  Cloudkeeper::Entities::ImageList.from_hash image_list_hash
end
download_image_list_file(url, dir) click to toggle source
# File lib/cloudkeeper/managers/image_list_manager.rb, line 31
def download_image_list_file(url, dir)
  logger.debug "Downloading image list from #{url.inspect}"
  Cloudkeeper::Utils::URL.check!(url)
  uri = URI.parse url

  filename = generate_filename(uri, dir)
  response = make_request uri

  if response.success?
    File.write filename, response.body
    return filename
  end

  raise Cloudkeeper::Errors::ImageList::RetrievalError,
        "couldn't download image list from url #{url.inspect}\n#{response.to_hash.inspect}"
rescue Cloudkeeper::Errors::ImageList::RetrievalError, Cloudkeeper::Errors::InvalidURLError, ::IOError,
       ::Faraday::ClientError => ex
  raise Cloudkeeper::Errors::ImageList::DownloadError, ex
end
generate_filename(uri, dir) click to toggle source
# File lib/cloudkeeper/managers/image_list_manager.rb, line 58
def generate_filename(uri, dir)
  File.join(dir, Cloudkeeper::Utils::Filename.sanitize("#{uri.host}#{uri.path}"))
end
load_image_list(file) click to toggle source
# File lib/cloudkeeper/managers/image_list_manager.rb, line 66
def load_image_list(file)
  content = File.read(file)
  pkcs7 = OpenSSL::PKCS7.read_smime(content)
  verify_image_list!(pkcs7, file) if Cloudkeeper::Settings[:'verify-image-lists']

  JSON.parse pkcs7.data
rescue OpenSSL::PKCS7::PKCS7Error => ex
  raise ex if Cloudkeeper::Settings[:'verify-image-lists']

  JSON.parse content
end
make_request(uri) click to toggle source
# File lib/cloudkeeper/managers/image_list_manager.rb, line 51
def make_request(uri)
  ssl = {}
  ssl = { ca_path: Cloudkeeper::Settings[:'ca-dir'], cert_store: OpenSSL::X509::Store.new } if Cloudkeeper::Settings[:'ca-dir']
  conn = Faraday.new url: uri, ssl: ssl
  conn.get
end
retrieve_image_list(url, dir) click to toggle source
# File lib/cloudkeeper/managers/image_list_manager.rb, line 27
def retrieve_image_list(url, dir)
  @image_list = convert_image_list(load_image_list(download_image_list_file(url, dir)))
end
verify_image_list!(pkcs7, file) click to toggle source
# File lib/cloudkeeper/managers/image_list_manager.rb, line 78
def verify_image_list!(pkcs7, file)
  raise Cloudkeeper::Errors::ImageList::VerificationError, "image list #{file.inspect} cannot be verified" \
    unless pkcs7.verify([], openssl_store)
end