vaguerent/plugins/provisioners/salt/bootstrap_downloader.rb

59 lines
1.7 KiB
Ruby

require 'open-uri'
require 'digest'
require_relative "./errors"
module VagrantPlugins
module Salt
class BootstrapDownloader
WINDOWS_URL = "https://winbootstrap.saltproject.io"
URL = "https://bootstrap.saltproject.io"
SHA256_SUFFIX = "sha256"
def initialize(guest)
@guest = guest
@logger = Log4r::Logger.new("vagrant::salt::bootstrap_downloader")
end
def source_url
@guest == :windows ? WINDOWS_URL : URL
end
def get_bootstrap_script
@logger.debug "Downloading bootstrap script from #{source_url}"
script_file = download(source_url)
verify_sha256(script_file)
@logger.info "Downloaded and verified salt-bootstrap script"
script_file
end
def verify_sha256(script)
@logger.debug "Downloading sha256 file from #{source_url}/#{SHA256_SUFFIX}"
sha256_file = download("#{source_url}/#{SHA256_SUFFIX}")
sha256 = extract_sha256(sha256_file.read)
sha256_file.close
@logger.debug "Computing sha256 value from script file"
computed_sha256 = Digest::SHA256.hexdigest(script.read)
script.rewind
@logger.debug "Comparing sha256 values"
if computed_sha256 != sha256
@logger.debug "Mismatched sha256, expected #{sha256} but computed #{computed_sha256}"
raise Salt::Errors::InvalidShasumError, source: source_url, expected_sha: sha256, computed_sha: computed_sha256
end
@logger.debug "Sha256 values match"
end
def extract_sha256(text)
text.scan(/\b([a-f0-9]{64})\b/).last.first
end
def download(url)
URI(url).open
end
end
end
end