52 lines
1.7 KiB
Ruby
52 lines
1.7 KiB
Ruby
# Copyright (c) HashiCorp, Inc.
|
|
# SPDX-License-Identifier: BUSL-1.1
|
|
|
|
require "tempfile"
|
|
require "fileutils"
|
|
require "pathname"
|
|
require "vagrant/util/directory"
|
|
require "vagrant/util/subprocess"
|
|
|
|
module Vagrant
|
|
module Util
|
|
module Caps
|
|
module BuildISO
|
|
|
|
# Builds an iso given a compatible iso_command
|
|
#
|
|
# @param [List<String>] command to build iso
|
|
# @param [Pathname] input directory for iso build
|
|
# @param [Pathname] output file for iso build
|
|
def build_iso(iso_command, source_directory, file_destination)
|
|
FileUtils.mkdir_p(file_destination.dirname)
|
|
if !file_destination.exist? || Vagrant::Util::Directory.directory_changed?(source_directory, file_destination.mtime)
|
|
result = Vagrant::Util::Subprocess.execute(*iso_command)
|
|
if result.exit_code != 0
|
|
raise Vagrant::Errors::ISOBuildFailed, cmd: iso_command.join(" "), stdout: result.stdout, stderr: result.stderr
|
|
end
|
|
end
|
|
end
|
|
|
|
protected
|
|
|
|
def ensure_output_iso(file_destination)
|
|
if file_destination.nil?
|
|
tmpfile = Tempfile.new(["vagrant", ".iso"])
|
|
file_destination = Pathname.new(tmpfile.path)
|
|
tmpfile.close
|
|
tmpfile.unlink
|
|
else
|
|
file_destination = Pathname.new(file_destination.to_s)
|
|
# If the file destination path is a folder, target the output to a randomly named
|
|
# file in that dir
|
|
if file_destination.extname != ".iso"
|
|
file_destination = file_destination.join("#{SecureRandom.hex(3)}_vagrant.iso")
|
|
end
|
|
end
|
|
file_destination
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|