From 68ed344892fdbf37c4ddd7ff1b76ff6e0db092cf Mon Sep 17 00:00:00 2001 From: Karl Hudgell Date: Wed, 30 Nov 2016 12:10:22 +0000 Subject: [PATCH] new backupscripts --- BackupScript/sysmatt.rpi.backup.gtar | 25 +++++ BackupScript/sysmatt.rpi.restore.sd.card | 128 +++++++++++++++++++++++ 2 files changed, 153 insertions(+) create mode 100644 BackupScript/sysmatt.rpi.backup.gtar create mode 100644 BackupScript/sysmatt.rpi.restore.sd.card diff --git a/BackupScript/sysmatt.rpi.backup.gtar b/BackupScript/sysmatt.rpi.backup.gtar new file mode 100644 index 0000000..ddcb8a1 --- /dev/null +++ b/BackupScript/sysmatt.rpi.backup.gtar @@ -0,0 +1,25 @@ +#!/bin/bash +# 20140804-1708 Matthew E Hoskins / Twitter: @sysmatt (c) GNU GPL + +set -x # debugging + +bomb () { + echo "BOMB: ${1}" + exit 1 +} + +# Default destination directory +DSTDIR=/home/pi/ServerBackups/DeskPi +DEFAULT_DFILE="${DSTDIR}/pi.`uname -n`.`date +%Y%m%d%H%M%S`.backup.tar.gz" + +# If we get a filename on the command line, use it instead of the default. +DFILE="${1:-$DEFAULT_DFILE}" +DEST_DIR_SANITY=`dirname "${DFILE}"` + +# Make sure the destination exists +[ -d "${DEST_DIR_SANITY}" ] || bomb "Destination directory ${DEST_DIR_SANITY} does not exist" + +# Run the tar archive +tar --exclude="${DFILE}" --one-file-system -cvzf "${DFILE}" / /boot + +echo "Created archive: ${DFILE}" diff --git a/BackupScript/sysmatt.rpi.restore.sd.card b/BackupScript/sysmatt.rpi.restore.sd.card new file mode 100644 index 0000000..bb50641 --- /dev/null +++ b/BackupScript/sysmatt.rpi.restore.sd.card @@ -0,0 +1,128 @@ +#!/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}" + +