Skip to content

Instantly share code, notes, and snippets.

@bacongravy
Created February 1, 2019 21:40
Show Gist options
  • Save bacongravy/5851b0187a77e5f6fe50710337a7659b to your computer and use it in GitHub Desktop.
Save bacongravy/5851b0187a77e5f6fe50710337a7659b to your computer and use it in GitHub Desktop.
The origin of the `vagrant-package-vmware` project
#!/bin/sh -e
INPUT_DIR="$1"
OUTPUT_PATH="$2"
#####
log_info() {
echo " \033[0;32m-- $*\033[0m" 1>&2
}
log_error() {
echo " \033[0;31m-- $*\033[0m" 1>&2
}
bail() {
log_error "$1"
exit 1
}
if [ $(id -u) -eq 0 -a -n "$SUDO_USER" ]; then
bail "Script must be NOT be run as root with sudo."
fi
#####
if [ -z "$INPUT_DIR" ]; then
bail "Input environment not specified."
fi
if [ -z "$OUTPUT_PATH" ]; then
bail "Output path not specified."
fi
VMWARE_FUSION_APP="$(osascript -e 'POSIX path of (path to application "VMware Fusion")')"
if [ -z "$VMWARE_FUSION_APP" -o ! -e "$VMWARE_FUSION_APP" ]; then
bail "VMware Fusion not found."
fi
VMWARE_VDISKMANAGER="$VMWARE_FUSION_APP/Contents/Library/vmware-vdiskmanager"
#####
SCRIPT_DIR="$(cd "$(dirname "$0")"; pwd)"
TEMP_DIR=$(/usr/bin/mktemp -d -t repackage_box)
PROJECT_DIR="$TEMP_DIR/project"
BOX_DIR="$TEMP_DIR/box"
OUTPUT_BOX="$TEMP_DIR/out.box"
OUTPUT_NAME="$(basename "$OUTPUT_PATH" .box)"
#####
cleanup() {
trap - EXIT INT TERM
VAGRANT_CWD="$PROJECT_DIR" vagrant destroy --force > /dev/null 2>&1 || true
rm -rf "$TEMP_DIR" > /dev/null 2>&1 || true
[[ $SIG == EXIT ]] || kill -$SIG $$ || true
}
for sig in EXIT INT TERM; do
trap "SIG=$sig; cleanup;" $sig
done
#####
log_info "Merging input environment disk with base box to create new box..."
mkdir "$PROJECT_DIR"
mkdir "$BOX_DIR"
alias js-eval="osascript -l JavaScript -e"
INPUT_BOX_MACHINE_UUID=$(cat "$INPUT_DIR/.vagrant/machines/default/vmware_fusion/index_uuid")
INPUT_BOX_MACHINE_INDEX=$(cat ~/.vagrant.d/data/machine-index/index)
INPUT_BOX_NAME=$(js-eval "JSON.parse('$INPUT_BOX_MACHINE_INDEX').machines['$INPUT_BOX_MACHINE_UUID'].extra_data.box.name")
INPUT_BOX_VERSION=$(js-eval "JSON.parse('$INPUT_BOX_MACHINE_INDEX').machines['$INPUT_BOX_MACHINE_UUID'].extra_data.box.version")
INPUT_BOX_VM_DIR=~/.vagrant.d/boxes/"$INPUT_BOX_NAME"/"$INPUT_BOX_VERSION"/vmware_fusion
INPUT_BOX_VM_VMX="$(find "$INPUT_BOX_VM_DIR" -name "*.vmx" -print -quit)"
INPUT_BOX_VM_VMX_NAME="$(basename "$INPUT_BOX_VM_VMX")"
cp "$INPUT_BOX_VM_DIR/Vagrantfile" "$BOX_DIR/"
cp "$INPUT_BOX_VM_DIR/metadata.json" "$BOX_DIR/"
sed 's/\(sata0:0\.file[nN]ame\) *= *"\(.*\)"/\1 = "disk.vmdk"/' "$INPUT_BOX_VM_VMX" > "$BOX_DIR/$INPUT_BOX_VM_VMX_NAME"
INPUT_BOX_MACHINE_DIR=$(dirname `cat "$INPUT_DIR/.vagrant/machines/default/vmware_fusion/id"`)
INPUT_BOX_MACHINE_VMX="$(find "$INPUT_BOX_MACHINE_DIR" -name "*.vmx" -print -quit)"
INPUT_BOX_MACHINE_DISK_NAME="$(cat "$INPUT_BOX_MACHINE_VMX" | awk -F " ?= ?" 'tolower($0) ~ /sata0:0\.filename/ { gsub(/"/, "", $2); print $2 }')"
"$VMWARE_VDISKMANAGER" -t 0 -r "$INPUT_BOX_MACHINE_DIR/$INPUT_BOX_MACHINE_DISK_NAME" "$BOX_DIR/disk.vmdk"
log_info "Packaging box..."
pushd "$BOX_DIR"
tar czf "$OUTPUT_BOX" ./*
popd
mv "$OUTPUT_BOX" "$OUTPUT_PATH"
log_info "Box created. Run 'vagrant box add $OUTPUT_PATH --name $OUTPUT_NAME' to add the box."
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment