#!/bin/bash

# Backup Hetzner Storagebox (Alpha) used by VPS for service data.

NAS_DEVICE_NAME="Hetzner Storagebox (Alpha)"
RCHAT_NOTIFIER="${HOME}/repos/utilities/rocketchat_notifier.sh"
SOURCE_MOUNTPOINT="/media/hetzner-storagebox-alpha"
LOCAL_MOUNTPOINT="/media/my-passport"

function clean_up() {
	# Dismount NAS
	echo "INFO Dismounting ${NAS_DEVICE_NAME}."
	sudo umount /media/hetzner-storagebox-alpha/

	# Turn on VPN
	echo "INFO Re-connecting Mullvad VPN."
	mullvad connect
	exit
}

# Turn off VPN
echo "INFO Attempting backup of ${NAS_DEVICE_NAME} NAS device."
echo "INFO Checking VPN status."

mullvad status | grep "Disconnected" 2>&1
STATUS=$?
if [ $STATUS -eq 0 ]; then
	echo "INFO VPN is not connected. Proceeding."
else
	echo "INFO Mullvad VPN is connected. Disconnecting."
	mullvad disconnect
fi

# Check source disk is mounted
if mountpoint -q ${LOCAL_MOUNTPOINT}; then
	echo "INFO Local disk /media/my-passport mounted. Proceeding."
else
	echo "INFO Local disk not mounted. Mounting /media/my-passport."
	sudo mount ${LOCAL_MOUNTPOINT}
	if mountpoint -q ${LOCAL_MOUNTPOINT}; then
		echo "INFO Mounted /media/my-passport"
	else
		$RCHAT_NOTIFIER "backups" "error" \
			"Could not complete scheduled backup of ${NAS_DEVICE_NAME}. Local backup disk (/media/my-passport) not mounted."
		clean_up
	fi
fi

# Mount NAS locally
sudo mount -t cifs -v //u455282.your-storagebox.de/backup /media/hetzner-storagebox-alpha -o \
	credentials=/etc/hetzner-storagebox-alpha-credentials,uid=1000,gid=1000,file_mode=0775,dir_mode=0775,vers=3.0

if mountpoint -q ${SOURCE_MOUNTPOINT}; then
	echo "INFO Mounted ${NAS_DEVICE_NAME} device to /media/hetzner-storagebox-alpha"
else
	$RCHAT_NOTIFIER "backups" "error" \
		"Could not complete scheduled ${NAS_DEVICE_NAME} backup. Source disk (/media/hetzner-storagebox-alpha) not mounted."
	clean_up
fi

# Create backup (ignoring lock files)

echo "INFO Beginning backup."

sudo rsync -avzP --delete --no-perms \
	--exclude="*.lock" \
	--exclude="*.bleve/store/root.bolt" \
	--exclude="mongo/db/mongod.lock" \
	"$SOURCE_MOUNTPOINT/" "$LOCAL_MOUNTPOINT/vps_backups/hetzner_storagebox_alpha"

STATUS=$?
if [ $STATUS -eq 0 ]; then
	$RCHAT_NOTIFIER "backups" "success" \
		"Created backup of ${NAS_DEVICE_NAME}."
	# 23 = partial backup, 24 = some vanished files, both != major failure
elif [ $STATUS -eq 23 ] || [ $STATUS -eq 24 ]; then
	$RCHAT_NOTIFIER "backups" "success" \
		"Created backup of ${NAS_DEVICE_NAME}. A few files could not be copied."
else
	$RCHAT_NOTIFIER "backups" "error" \
		"Failed to create backup of ${NAS_DEVICE_NAME}: problem with rsync (exit code $STATUS)."
fi

clean_up