Alexa-DeskControl/BackupScript/sysmatt.rpi.restore.sd.card
2016-11-30 12:10:22 +00:00

129 lines
4.3 KiB
Bash

#!/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}"