planktoscope/software/scripts/bash/usb_backup.sh

122 lines
3.2 KiB
Bash
Raw Normal View History

#!/bin/bash
# This work is licensed under the Unlicense
# This script is based on https://serverfault.com/a/767079 posted
# by Mike Blackwell, modified to our needs. Credits to the author.
# This script is called from systemd unit file to mount or unmount
# a USB drive.
PATH="$PATH:/usr/bin:/usr/local/bin:/usr/sbin:/usr/local/sbin:/bin:/sbin"
2020-12-01 21:12:29 +01:00
log="echo "
usage()
{
2020-12-01 21:12:29 +01:00
${log} "Usage: $0 device_path (e.g. /dev/sdb1)"
exit 1
}
if [[ $# -ne 1 ]]; then
usage
fi
2020-12-01 21:12:29 +01:00
DEVICE=$1
DEVBASE=$(echo "${DEVICE}" | cut -d'/' -f 3)
SOURCE="/home/pi/data/" # source of files
# See if this drive is already mounted, and if so where
MOUNT_POINT=$(mount | grep "${DEVICE}" | awk '{ print $3 }')
DEV_LABEL=""
do_mount()
{
if [[ -n ${MOUNT_POINT} ]]; then
${log} "Warning: ${DEVICE} is already mounted at ${MOUNT_POINT}"
2020-12-01 21:12:29 +01:00
exit 2
fi
# Get info for this drive: $ID_FS_LABEL and $ID_FS_TYPE
eval '$(blkid -o udev "${DEVICE}" | grep -i -e "ID_FS_LABEL" -e "ID_FS_TYPE")'
# Figure out a mount point to use
LABEL=${ID_FS_LABEL}
if grep -q " /media/${LABEL} " /etc/mtab; then
# Already in use, make a unique one
LABEL+="-${DEVBASE}"
fi
DEV_LABEL="${LABEL}"
# Use the device name in case the drive doesn't have label
if [ -z "${DEV_LABEL}" ]; then
DEV_LABEL="${DEVBASE}"
fi
MOUNT_POINT="/media/${DEV_LABEL}"
${log} "Mount point: ${MOUNT_POINT}"
mkdir -p "${MOUNT_POINT}"
# Global mount options
OPTS="rw,relatime"
# File system type specific mount options
if [[ ${ID_FS_TYPE} == "vfat" ]]; then
OPTS+=",users,gid=100,umask=000,shortname=mixed,utf8=1,flush"
fi
if ! mount -o ${OPTS} "${DEVICE}" "${MOUNT_POINT}"; then
${log} "Error mounting ${DEVICE} (status = $?)"
rmdir "${MOUNT_POINT}"
2020-12-01 21:12:29 +01:00
exit 3
else
# Track the mounted drives
2023-01-19 22:23:42 +01:00
echo "${MOUNT_POINT}:${DEVBASE}" | cat >> "/var/log/usb-mount.track"
fi
${log} "Mounted ${DEVICE} at ${MOUNT_POINT}"
}
do_unmount()
{
if [[ -z ${MOUNT_POINT} ]]; then
${log} "Warning: ${DEVICE} is not mounted"
else
umount -l "${DEVICE}"
${log} "Unmounted ${DEVICE} from ${MOUNT_POINT}"
/bin/rmdir "${MOUNT_POINT}"
sed -i.bak "\@${MOUNT_POINT}@d" /var/log/usb-mount.track
fi
}
do_backup()
{
do_mount
if [[ -z ${MOUNT_POINT} ]]; then
${log} "Warning: ${DEVICE} is not mounted"
else
2020-12-01 21:12:29 +01:00
${log} "Starting to backup the local files"
MACHINE=$(python3 -c "import planktoscope.uuidName as uuidName; print(uuidName.machineName(machine=uuidName.getSerial()).replace(' ','_'))")
BACKUP_FOLDER="${MOUNT_POINT}/planktoscope_data/${MACHINE}"
${log} "Machine name is ${MACHINE}, backup folder is ${BACKUP_FOLDER}"
mkdir -p "$BACKUP_FOLDER"
rsync -rtD --modify-window=1 --update -W --inplace "$SOURCE" "$BACKUP_FOLDER"
${log} "Main copy done, checking integrity now"
2020-12-01 21:12:29 +01:00
if ! python3 -m planktoscope.integrity -c "$BACKUP_FOLDER"; then
${log} "ERROR: Some files were corrupted during the copy!"
do_unmount
exit 4
else
2020-12-01 21:12:29 +01:00
${log} "All files copied successfully!"
fi
do_unmount
fi
}
do_backup