#!/bin/bash
#
# This script is responsible for copying data to a USB key.  When it is
# invoked, the following environment variables will be passed in:
#
#  USB_BLOCK_DEVICE  Path to raw block device (eg: /dev/sdb)
#
#  USB_MOUNT_DIR     Path to a mount point reserved for this process
#
#  USB_MASTER_ROOT   Path to source data to be copied to the key
#
#  USB_VOLUME_NAME   The volume name to apply
#

set -e;  # abort with non-zero exit status if any command fails

die () {
    echo "$@"
    exit 1
}

test -n "${USB_BLOCK_DEVICE}" || die "USB_BLOCK_DEVICE not set"
test -n "${USB_MOUNT_DIR}"    || die "USB_MOUNT_DIR not set"
test -n "${USB_MASTER_ROOT}"  || die "USB_MASTER_ROOT not set"

echo "Preparing to copy to: ${USB_BLOCK_DEVICE}"
echo "  Mount point: ${USB_MOUNT_DIR}"
echo "  Master root: ${USB_MASTER_ROOT}"

# We'll specifically refer to the first partition

FS_BLOCK_DEVICE="${USB_BLOCK_DEVICE}1"

STEPS=7

# Format the device

mkfs -t vfat -n ${USB_VOLUME_NAME} ${FS_BLOCK_DEVICE}

echo "{1/${STEPS}}"

# Mount the device

test -d ${USB_MOUNT_DIR} || mkdir -p ${USB_MOUNT_DIR}
mount ${FS_BLOCK_DEVICE} ${USB_MOUNT_DIR}
echo "{2/${STEPS}}"

# Copy the files

cp -r ${USB_MASTER_ROOT}/. ${USB_MOUNT_DIR}
echo "{3/${STEPS}}"

# Unmount the volume (graceful unmount to ensure data is synced)

umount ${FS_BLOCK_DEVICE}
echo "{4/${STEPS}}"

# Remount the volume
sleep 1
mount ${FS_BLOCK_DEVICE} ${USB_MOUNT_DIR}
echo "{5/${STEPS}}"

# Check the file contents
cd ${USB_MOUNT_DIR}
COPY_SUM="$(find . -type f -print0 | xargs -0 md5sum | sort | md5sum - | awk '{print $1}')"
cd /

ORIG_SUM="$(cat ${USB_MASTER_ROOT}.md5sum)"

test "$ORIG_SUM" = "$COPY_SUM" || die "Checksum of copied files does not match"
echo "{6/${STEPS}}"

# Unmount the volume

umount ${FS_BLOCK_DEVICE}
echo "{7/${STEPS}}"

exit 0;