#!/bin/bash

########################################################################
## Antud skript on varukoopiate tegemiseks mingist kataloogist või
## kataloogidest kuskile selleks eraldatud partitsioonile (soovitatavalt
## eemaldataval andmekandjal).
#
## Skript eeldab, et käivitatakse juurkasutajana ja ei tee selle kohta
## ühtegi kontrolloperatsiooni.
#
## Skripti kasutamiseks võiks selle kopeerida /usr/local/sbin kataloogi
## ja siis tegema skriptis vajalikud muudatused. Kindlasti tuleb üle
## vaadata ja korrigeerida seadistusread, mis tulevad kohe pärast seda
## kommentaariplokki.
#
## Skript eeldab LUKS krüpteeritud partitsiooni varukoopiate tarvis,
## antud partitsioon tuleb luua ja ette valmistada.
## <nurksulgudes olev osa tuleb asendada vastavalt olukorrale>
#
# cryptsetup luksFormat <partitsioon>
# cryptsetup luksUUID <partitsioon>
## Viimase käsuga saadud UUID tuleb kopeerida siia faili vastavale reale.
#
## Soovi korral on võimalus teha võtmefail, ka see tuleb siia faili kirja 
## panna. Kaval oleks aga valida sama võtmefail (kui selline leidub),
## mis on sellel partitsioonil, millelt andmeid varundatakse.
# dd if=/dev/urandom of=<võtmefail> bs=1M count=1
# cryptsetup luksAddKey <partitsioon> <võtmefail>
#
# cryptsetup open --type luks --allow-discards --key-file <võtmefail> <partitsioon> <varukoopianimi>
# mkfs.ext4 /dev/mapper/<varukoopianimi>
# cryptsetup close <varukoopianimi>
########################################################################

LUKSDEVICEUUID="" # LUKS seadme UUID
LUKSDEVICEKEY="" # LUKS seadme võtmefail (valikuline)
BACKUPNAME="backup" # varukoopianimi
MOUNTPOINT="/mnt/backup" # haakepunkt
BACKUPDIRECTORIES=("/home/user" "/root") # nimekiri kataloogidest mida peaks varundama
RSYNCBASEOPTIONS='--quiet --relative --recursive --links --perms --executability --acls --owner --group --times --delete-during  --ignore-errors'
RSYNCEXTRAOPTIONS='--exclude=*/.cache/ --exclude=*/.thumbnails/'


# Kontrolloperatsioonid:
if [ -e "/dev/mapper/${BACKUPNAME}" ]; then
	echo "/dev/mapper/${BACKUPNAME} on juba kasutuses!"
	exit
fi

if [ ! "`mount | grep "${MOUNTPOINT}"`"  == "" ]; then
	echo "${MOUNTPOINT} on juba haakepunktina kasutuses."
	exit
fi

BACKUPDEVICE="`findfs UUID="${LUKSDEVICEUUID}"`"
if [ ! -e "${BACKUPDEVICE}" ]; then
	echo "Ei leidnud seadet varukoopiate jaoks!"
	exit
fi

mkdir -p "${MOUNTPOINT}"
if [ ! -e "${MOUNTPOINT}" ]; then
	echo "${MOUNTPOINT} ei eksisteeri ja loomine ebaõnnestus!"
	exit
fi

# Krüpto avamine
if [ "${LUKSDEVICEKEY}" == "" ]; then
	cryptsetup open --type luks --allow-discards "${BACKUPDEVICE}" "${BACKUPNAME}"
else
	if [ -e "${LUKSDEVICEKEY}" ]; then
		cryptsetup open --type luks --allow-discards --key-file "${LUKSDEVICEKEY}" "${BACKUPDEVICE}" "${BACKUPNAME}"
	else
		echo "Võtmefaili ${LUKSDEVICEKEY} ei eksisteeri!"
		exit
	fi
fi

if [ ! -e "/dev/mapper/${BACKUPNAME}" ]; then
	echo "Luks krüpteeringu avamine ebaõnnestus!"
	exit
fi

# Haakimine
mount "/dev/mapper/${BACKUPNAME}" "${MOUNTPOINT}"
if [ ${?} -ne 0 ]; then
	echo "/dev/mapper/${BACKUPNAME} haakimine asukohta ${MOUNTPOINT} ebaõnnestus! Vajuta ENTER, krüptoseadme sulgemiseks."
	read -n 1 ANS
	cryptsetup close "${BACKUPNAME}"
	exit
fi

echo "Varukoopiate seade on ühendatud, teha varukoopiad? [Y/n]"
read -n 1 ANS
if [ "${ANS}" == "n" ]; then
	umount -Rf "${MOUNTPOINT}"
	cryptsetup close "${BACKUPNAME}"
	sync
fi

# Varundamine
for i in ${!BACKUPDIRECTORIES[*]}; do
	cd "`dirname "${BACKUPDIRECTORIES[$i]}"`"
	rsync ${RSYNCBASEOPTIONS} ${RSYNCEXTRAOPTIONS} \
	"`basename "${BACKUPDIRECTORIES[$i]}"`" "${MOUNTPOINT}"
done

# Lõpetamine
echo "Valmis!"
df -h "/dev/mapper/${BACKUPNAME}"

echo -e "\nHaakida lahti? [Y]"
read -n 1 ANS
umount -Rf "${MOUNTPOINT}"
cryptsetup close "${BACKUPNAME}"
sync
