59 lines
1.7 KiB
Ruby
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
|