#!/usr/bin/env bash

SCRIPT_ROOT=$(dirname $(readlink -f "$0"))
. "${SCRIPT_ROOT}/common.sh" || exit 1

assert_inside_chroot

DEFINE_string data_dir "" "Directory containing downloaded release artifacts"
DEFINE_string board "" "Board to sign artifacts for"
DEFINE_string version "" "Version to sign artifacts for"
DEFINE_integer n_signatures "2" "Number of signatures this release will be signed with"
DEFINE_string output_dir "" "Output directory"
DEFINE_string gpg_key "" "Value for '--default-key' argument to gpg --sign"

FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"

set -e

data_dir="${FLAGS_data_dir}/${FLAGS_board}/${FLAGS_version}"
output_dir="${FLAGS_output_dir}/${FLAGS_board}/${FLAGS_version}"
mkdir -p "$output_dir"

cleanup() {
	# core_sign_update expects to unpack this too, so we'll clean it up.
	rm -f "${data_dir}/coreos_production_update.bin"

	rm -f "${data_dir}/update"
	rm -f "${data_dir}/update.hash"
}

trap cleanup INT TERM EXIT

# delta_generator expects a list of colon-separated sizes for signature hash algorithms in order to
# build the update payload protobuf properly. Since we already assume sha256 elsewhere in
# core_sign_update, do it here as well.
signature_sizes=""
for i in $(seq 1 $FLAGS_n_signatures); do
	signature_sizes="${signature_sizes}:256"
done
signature_sizes="${signature_sizes:1:${#signature_sizes}}"

echo "===     Verifying update payload...     ==="
gpg2 --verify "${data_dir}/coreos_production_update.bin.bz2.sig"
gpg2 --verify "${data_dir}/coreos_production_image.vmlinuz.sig"
gpg2 --verify "${data_dir}/coreos_production_update.zip.sig"
echo "===   Decompressing update payload...   ==="
bunzip2 --keep "${data_dir}/coreos_production_update.bin.bz2"

echo "=== Creating signable update payload... ==="
delta_generator \
	-new_image "${data_dir}/coreos_production_update.bin" \
	-new_kernel "${data_dir}/coreos_production_image.vmlinuz" \
	-out_file "${data_dir}/update"
delta_generator \
	--signature_size ${signature_sizes} \
	--in_file "${data_dir}/update" \
	--out_hash_file "${data_dir}/update.hash"

echo "===      Signing update payload...      ==="
if [[ -z "${FLAGS_gpg_key}" ]]; then
	gpg2 \
		--output "${output_dir}/update.sig.$(whoami)" \
		--armor --detach-sign "${data_dir}/update.hash"
else
	gpg2 \
		--local-user "$FLAGS_gpg_key" \
		--output "${output_dir}/update.sig.$(whoami)" \
		--armor --detach-sign "${data_dir}/update.hash"
fi
echo "=== Update payload signed successfully. ==="

echo "===     Verifying torcx manifest...     ==="
gpg2 --verify "${data_dir}/torcx_manifest.json.sig"
echo "===      Signing torcx manifest...      ==="
if [[ -z "${FLAGS_gpg_key}" ]]; then
	gpg2 \
		--output "${output_dir}/torcx_manifest.json.sig.$(whoami)" \
		--detach-sign --armor "${data_dir}/torcx_manifest.json"
else
	gpg2 \
		--local-user "$FLAGS_gpg_key" \
		--output "${output_dir}/torcx_manifest.json.sig.$(whoami)" \
		--detach-sign --armor "${data_dir}/torcx_manifest.json"
fi
echo "=== Torcx manifest signed successfully. ==="
