#!/bin/bash 
# 20140804-1708 Matthew E Hoskins / Twitter: @sysmatt (c) GNU GPL

SDCARD_DEVICE="${1:?You must specify one SD CARD DEVICE to destroy}"
PI_BACKUP_SLASH="${2:?You must specify one PI BACKUP SLASH GTAR file}"
shift; shift;
# Any remaining args are added to TAR command line

# Extra operations which can be done in ENV Vars
# PI_OVERWRITE_ETC_HOSTNAME="new-hostname"
# PI_OPENVPN_CONFIG_FILE="/some/source/client.conf"



# Temp random mountpoint under /tmp
MOUNTPOINT="/tmp/pi.sd.${RANDOM}${$}"

bomb (){
	echo "BOMB: ${1}"
	exit 1
}

[ -x "/sbin/mkfs.vfat" ] || bomb "/sbin/mkfs.vfat Missing"

echo ""
echo "=== ${SDCARD_DEVICE} Current Partition Table - To be destroyed! ==="
parted --script ${SDCARD_DEVICE} "print"
echo ""
read -p "PRESS ENTER to DESTROY ${SDCARD_DEVICE}, Press CTRL-c to abort" 

parted --script "${SDCARD_DEVICE}"  "mklabel msdos"
parted --script "${SDCARD_DEVICE}"  "mkpart primary fat16 1MiB 64MB"
parted --script "${SDCARD_DEVICE}"  "mkpart primary ext4 64MB -1s"
parted --script "${SDCARD_DEVICE}"  print
mkfs.vfat  "${SDCARD_DEVICE}1"
mkfs.ext4 -F -j "${SDCARD_DEVICE}2" 
mkdir -p "${MOUNTPOINT}"
mount "${SDCARD_DEVICE}2" "${MOUNTPOINT}"
mkdir -p "${MOUNTPOINT}/boot"
mount "${SDCARD_DEVICE}1" "${MOUNTPOINT}/boot"
df -h "${MOUNTPOINT}"
df -h "${MOUNTPOINT}/boot"
read -p "Press ENTER To begin image restore"
tar $@ -xvzf  "${PI_BACKUP_SLASH}" -C "${MOUNTPOINT}"

# Begin NOOBS fixup / Recommended by @KevinSidwar / 20140829-1744-MEH
ORIG_SLASHDEV_FOUND=`cat "${MOUNTPOINT}/etc/fstab"| grep " / "     |grep -v "^#" |awk '{ print $1; }'`
ORIG_BOOTDEV_FOUND=`cat  "${MOUNTPOINT}/etc/fstab"| grep " /boot " |grep -v "^#" |awk '{ print $1; }'`

# Hardcoded
NEW_SLASHDEV="/dev/mmcblk0p2"
NEW_BOOTDEV="/dev/mmcblk0p1"

# Defaults just in case the above search of fstab is a miss
ORIG_SLASHDEV="${ORIG_SLASHDEV_FOUND:-$NEW_SLASHDEV}"
ORIG_BOOTDEV="${ORIG_BOOTDEV_FOUND:-$NEW_BOOTDEV}"


echo "ORIG_SLASHDEV[${ORIG_SLASHDEV}] NEW_SLASHDEV[${NEW_SLASHDEV}] ORIG_BOOTDEV[${ORIG_BOOTDEV}] NEW_BOOTDEV[${NEW_BOOTDEV}]"

FILE_FSTAB="${MOUNTPOINT}/etc/fstab"
FILE_CMDLINE="${MOUNTPOINT}/boot/cmdline.txt"
FILE_OS_CONFIG_JSON="${MOUNTPOINT}/boot/os_config.json"

if [  "${ORIG_SLASHDEV}" != "${NEW_SLASHDEV}"  -o   "${ORIG_BOOTDEV}" != "${NEW_BOOTDEV}"  ]
then
	echo "CONFIGURATION CONVERSION NECESSARY - Devices do not match, modifying files. "

	THISFILE="${FILE_FSTAB}"
	if [ -e "${THISFILE}" ] 
	then
		echo "Fixing ${THISFILE}"
		cp -f "${THISFILE}" "${THISFILE}.old"
		cat "${THISFILE}.old" |sed -e "s#${ORIG_SLASHDEV}#%NEW_SLASHDEV%# ; s#${ORIG_BOOTDEV}#%NEW_BOOTDEV%#"  > "${THISFILE}.i"
		cat "${THISFILE}.i"   |sed -e "s#%NEW_SLASHDEV%#${NEW_SLASHDEV}# ; s#%NEW_BOOTDEV%#${NEW_BOOTDEV}#"    >"${THISFILE}"
		rm -f "${THISFILE}.i"
	fi

	THISFILE="${FILE_CMDLINE}"
	if [ -e "${THISFILE}" ] 
	then
		echo "Fixing ${THISFILE}"
		cp -f "${THISFILE}" "${THISFILE}.old"
		cat "${THISFILE}.old" |sed -e "s#${ORIG_SLASHDEV}#%NEW_SLASHDEV%# ; s#${ORIG_BOOTDEV}#%NEW_BOOTDEV%#"  > "${THISFILE}.i"
		cat "${THISFILE}.i"   |sed -e "s#%NEW_SLASHDEV%#${NEW_SLASHDEV}# ; s#%NEW_BOOTDEV%#${NEW_BOOTDEV}#"    >"${THISFILE}"
		rm -f "${THISFILE}.i"
	fi

	THISFILE="${FILE_OS_CONFIG_JSON}"
	if [ -e "${THISFILE}" ] 
	then
		echo "Fixing ${THISFILE}"
		cp -f "${THISFILE}" "${THISFILE}.old"
		cat "${THISFILE}.old" |sed -e "s#${ORIG_SLASHDEV}#%NEW_SLASHDEV%# ; s#${ORIG_BOOTDEV}#%NEW_BOOTDEV%#"  > "${THISFILE}.i"
		cat "${THISFILE}.i"   |sed -e "s#%NEW_SLASHDEV%#${NEW_SLASHDEV}# ; s#%NEW_BOOTDEV%#${NEW_BOOTDEV}#"    >"${THISFILE}"
		rm -f "${THISFILE}.i"
	fi

fi
# End Noobs fixup
if [ -n "${PI_OVERWRITE_ETC_HOSTNAME}" ] 
then
	# Write a new /etc/hostname
	echo "Writing new /etc/hostname with [${PI_OVERWRITE_ETC_HOSTNAME}] to ${MOUNTPOINT}/etc/hostname"
	echo "${PI_OVERWRITE_ETC_HOSTNAME}" > "${MOUNTPOINT}/etc/hostname"
fi

if [ -e "${PI_OPENVPN_CONFIG_FILE}" ] 
then
	echo "Writing OpenVPN config [${PI_OPENVPN_CONFIG_FILE}] to ${MOUNTPOINT}/etc/openvpn/"
	rm -f ${MOUNTPOINT}/etc/openvpn/*.conf
	cp -f "${PI_OPENVPN_CONFIG_FILE}" "${MOUNTPOINT}/etc/openvpn/"
fi

echo ""
echo ""
echo =DONE=
echo "The SD is mounted at: ${MOUNTPOINT}"
echo "Now would be a good time to make modifications in another shell session..."
read -p "Press ENTER To unmount or CTRL-c to exit leaving mounted."
echo ""
echo "Working. This may take a moment..."
echo ""
set -x
umount "${MOUNTPOINT}/boot"
umount "${MOUNTPOINT}"