#!/bin/bash
#
# This script is responsible for copying data from a USB 'Master' 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 directory for files to be copied from the key
#

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 from: ${USB_BLOCK_DEVICE}"

# We'll specifically refer to the first partition

FS_BLOCK_DEVICE="${USB_BLOCK_DEVICE}1"

# Mount the device

test -d ${USB_MOUNT_DIR} || mkdir -p ${USB_MOUNT_DIR}
mount ${FS_BLOCK_DEVICE} ${USB_MOUNT_DIR}

# Copy the files

sleep 1
echo "Copying the files ..."
cp -r ${USB_MOUNT_DIR}/. ${USB_MASTER_ROOT}


# Get a checksum for the source files on the USB device

sleep 1
echo "Verifying copied files ..."
cd ${USB_MOUNT_DIR}
ORIG_SUM="$(find . -type f -print0 | xargs -0 md5sum | sort | md5sum - | awk '{print $1}')"

cd ${USB_MASTER_ROOT}
COPY_SUM="$(find . -type f -print0 | xargs -0 md5sum | sort | md5sum - | awk '{print $1}')"

test "$ORIG_SUM" = "$COPY_SUM" || die "Checksum of copied files does not match"

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

sleep 1
echo "Unmounting USB device ..."
umount ${FS_BLOCK_DEVICE}

# Save the checksum

echo "$ORIG_SUM" > ${USB_MASTER_ROOT}.md5sum

echo "Successfully read master key";

exit 0;