433 lines
8.6 KiB
Bash
Executable file
433 lines
8.6 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
#########################################################
|
|
#Script to create backups
|
|
#V0.1.0-1 -- 2021-12-05
|
|
#
|
|
#Fliegerjohn
|
|
#########################################################
|
|
|
|
#
|
|
# Description
|
|
#
|
|
|
|
#
|
|
# Usage
|
|
#
|
|
|
|
# To create a new repo
|
|
#
|
|
# ./abackup.sh
|
|
|
|
#
|
|
# variables
|
|
#
|
|
|
|
# Path to the configfile
|
|
configdir="$HOME/.abackup"
|
|
configfile="abackup.conf"
|
|
|
|
# Hier werden die zu sichernden Ordner gespeichert
|
|
backupdirsconf="backupdirs.conf"
|
|
# Hier werden die zu ignorierende Ordner gespeichert
|
|
excludebackupdirsconf="excludebackupdirs.conf"
|
|
|
|
#
|
|
# Passwortoption
|
|
#
|
|
#For the password, several options exists:
|
|
#1 - keyfile and backup password
|
|
#2 - only keyfile
|
|
#3 - only password
|
|
pwoption=1
|
|
|
|
# Storage location keyfile
|
|
pwdir="$HOME/.keys"
|
|
|
|
# Keyfile
|
|
keyfile="abackup-secret.key"
|
|
|
|
# Path of restic installation
|
|
resticbin=`type -tp restic`
|
|
|
|
# Path to the repository
|
|
repodir=`pwd`
|
|
|
|
# Get time
|
|
datum=`date`
|
|
|
|
|
|
########################
|
|
# Funktionen #
|
|
########################
|
|
|
|
# Generate abackup-secret.key
|
|
abackupkeygen() {
|
|
|
|
if [ ! -d "${pwdir}" ]
|
|
then
|
|
mkdir -p "${pwdir}"
|
|
fi
|
|
|
|
if [ ! -e "${pwdir}/${keyfile}" ]
|
|
then
|
|
echo "Generate abackup-secret.key at $pwdir/$keyfile"
|
|
dd if=/dev/urandom bs=512 skip=1 count=16 > $pwdir/$keyfile
|
|
chmod 600 $pwdir/$keyfile
|
|
else
|
|
echo "Keyfile $pwdir/$keyfile already exists"
|
|
fi
|
|
|
|
}
|
|
|
|
# Config in datei speichern
|
|
saveconfig() {
|
|
if [[ -e "$configdir/$configfile" ]]
|
|
then
|
|
time=`date +%+4Y-%m-%d-%H:%I:%S`
|
|
echo "The configfile already exists, it will be copied to $configdir/confbackup/!"
|
|
if [[ ! -d "$configdir/confbackup" ]]
|
|
then
|
|
mkdir $configdir/confbackup
|
|
fi
|
|
|
|
mv $configdir/$configfile $configdir/confbackup/abackup$time.conf
|
|
fi
|
|
|
|
# Check the configdir
|
|
if [[ ! -d "$configdir" ]]; then mkdir -p $configdir; fi
|
|
|
|
# Write config
|
|
touch "$configdir/$configfile"
|
|
echo "########################################
|
|
#Thats the configfile for abackup.
|
|
#Read the README.md vor more Informations.
|
|
#
|
|
########################################
|
|
#
|
|
#
|
|
## Location of keyfile
|
|
#
|
|
pwdir="$pwdir"
|
|
keyfile="$keyfile"
|
|
|
|
#
|
|
## Options for password
|
|
#
|
|
#For the password, several options exists:
|
|
#1 - keyfile and backup password
|
|
#2 - only keyfile
|
|
#3 - only password
|
|
pwoption="$pwoption"
|
|
|
|
#
|
|
## Path to the installation of restic
|
|
#
|
|
resticbin="$resticbin"
|
|
|
|
#
|
|
## Path to the repository
|
|
#
|
|
repodir="$repodir"
|
|
|
|
|
|
" >> $configdir/$configfile
|
|
echo "Config saved to $configdir/$configfile"
|
|
|
|
}
|
|
|
|
#
|
|
# Create new repository
|
|
#
|
|
resticrepoadd() {
|
|
|
|
# Check if restic is installed
|
|
if [[ ! -x ${resticbin} ]]
|
|
then
|
|
echo "Could not find restic."
|
|
exit 1
|
|
fi
|
|
|
|
# Ask user the for the location of the repository
|
|
echo "#
|
|
##########################################################
|
|
#"
|
|
printf "Where should we create the new repo?
|
|
Please enter the full path (default=$repodir): "
|
|
read answer_repodir
|
|
|
|
if [[ -n "$answer_repodir" ]]
|
|
then
|
|
repodir=$answer_repodir
|
|
fi
|
|
|
|
# Check if a repository is existing. If not it creates one.
|
|
if [[ ! -d "${repodir}" ]]
|
|
then
|
|
echo "Create repodir!"
|
|
mkdir -p "${repodir}"
|
|
else
|
|
echo "Repodir already exists!"
|
|
fi
|
|
|
|
# Ask which password should be used.
|
|
echo "#
|
|
##########################################################
|
|
#"
|
|
printf "For the password, several options exists:
|
|
1 - keyfile and backup password
|
|
2 - only keyfile
|
|
3 - only password
|
|
|
|
Please choose one (default=$pwoption): "
|
|
read answer_pwoption
|
|
|
|
if [[ -n "$answer_pwoption" ]]
|
|
then
|
|
pwoption=$answer_pwoption
|
|
fi
|
|
|
|
# Start creation of repository
|
|
echo "#
|
|
##########################################################
|
|
#"
|
|
echo "Start to preparing a new repository at $datum"
|
|
case "$pwoption" in
|
|
1)
|
|
abackupkeygen
|
|
$resticbin init --password-file $pwdir/$keyfile --repo $repodir
|
|
$resticbin -r $repodir key add --password-file $pwdir/$keyfile
|
|
$resticbin -r $repodir key list --password-file $pwdir/$keyfile
|
|
;;
|
|
|
|
2)
|
|
abackupkeygen
|
|
$resticbin init --password-file $pwdir/$keyfile --repo $repodir
|
|
|
|
;;
|
|
|
|
3)
|
|
$resticbin init --repo $repodir
|
|
;;
|
|
|
|
esac
|
|
|
|
# Save config if desired
|
|
echo "#
|
|
##########################################################
|
|
#"
|
|
printf "Do you want to save your config? (y/n)(default=y): "
|
|
read answer_saveconfig
|
|
|
|
if [[ ! -n "$answer_saveconfig" ]]
|
|
then
|
|
answer_saveconfig=y
|
|
fi
|
|
|
|
if [[ "$answer_saveconfig" = "y" ]]
|
|
then
|
|
echo ""
|
|
printf "Where do you want to save the config? (default=$configdir): "
|
|
read answer_configdir
|
|
|
|
if [[ -n "$answer_configdir" ]]
|
|
then
|
|
configdir=$answer_configdir
|
|
fi
|
|
|
|
saveconfig
|
|
|
|
elif [[ "$saveconfig" = "n" ]]
|
|
then
|
|
echo "Exit without saving!"
|
|
else
|
|
echo "Wrong argument. Exit without saving!"
|
|
exit 1
|
|
fi
|
|
|
|
|
|
}
|
|
|
|
savebackupdirs() {
|
|
# Check the configdir
|
|
|
|
if [[ ! -d "$configdir" ]]; then mkdir -p $configdir; fi
|
|
|
|
# Ask for the dirs to backup
|
|
printf "Please enter the dirs you want to backup: "
|
|
read answer_backupdirs
|
|
array_backupdirs=( $answer_backupdirs )
|
|
|
|
if [[ -e $configdir/$backupdirsconf ]]; then echo "Delete old $backupdirsconf and write a new one." && rm $configdir/$backupdirsconf; fi
|
|
touch $configdir/$backupdirsconf
|
|
echo "###############################################################
|
|
# Here you can write down which dirs you want to backup! #
|
|
###############################################################" >> $configdir/$backupdirsconf
|
|
for backupdir in ${array_backupdirs[*]}
|
|
do
|
|
if [[ ! -d "$backupdir" ]]; then echo "ERROR! Cant find dir $backupdir!" && exit 1; fi
|
|
echo $backupdir >> $configdir/$backupdirsconf
|
|
done
|
|
|
|
|
|
# Ask for the dirs to exclude
|
|
printf "Do you want tho exclude dirs? Write the paths down: "
|
|
read answer_excludebackupdirs
|
|
array_excludebackupdirs=( $answer_excludebackupdirs )
|
|
|
|
if [[ -e $configdir/$excludebackupdirsconf ]]; then echo "Delete old $excludebackupdirsconf and write a new one." && rm $configdir/$excludebackupdirsconf; fi
|
|
touch $configdir/$excludebackupdirsconf
|
|
echo "##########################################################
|
|
# Here you can write down which dirs you don't want to backup! #
|
|
##########################################################" >> $configdir/$excludebackupdirsconf
|
|
for excludebackupdir in ${array_excludebackupdirs[*]}
|
|
do
|
|
if [[ ! -d "$excludebackupdir" ]]; then echo "ERROR! Cant find dir $excludebackupdir!" && exit 1; fi
|
|
echo $excludebackupdir >> $configdir/$excludebackupdirsconf
|
|
done
|
|
|
|
}
|
|
#
|
|
## Create backup
|
|
#
|
|
backup() {
|
|
|
|
echo "Let's create a backup!"
|
|
|
|
# Check if a configfile exists in the backupdir
|
|
if [[ -e "${configdir}/${backupdirsconf}" ]]
|
|
then
|
|
echo "Take a backup of the dirs listed in $configdir/$backupdirsconf!"
|
|
|
|
# Ask for the passwordoption
|
|
# With keyfile
|
|
if [[ "$pwoption" < "3" ]]; then
|
|
$resticbin -r $repodir backup --files-from $configdir/$backupdirsconf --exclude-file=$configdir/$excludebackupdirsconf --password-file="$pwdir/$keyfile"; fi
|
|
# Without keyfile
|
|
if [[ "$pwoption" = "3" ]]; then
|
|
$resticbin -r $repodir backup --files-from $configdir/$backupdirsconf --exclude-file=$configdir/$excludebackupdirsconf; fi
|
|
|
|
else
|
|
printf "There is no config for backupdirs!
|
|
Do you want to make a list of backupdirs at $configdir/$backupdirsconf?
|
|
1 - yes
|
|
2 - no, want to get it manualy
|
|
(default=1): "
|
|
|
|
read answer_backupdirs
|
|
echo ""
|
|
|
|
# Set standard if input is empty
|
|
if [[ ! -n "$answer_backupdirs" ]]
|
|
then
|
|
answer_backupdirs=1
|
|
fi
|
|
|
|
# Ask for the folders to backup
|
|
if [[ "$answer_backupdirs" = "1" ]]
|
|
then
|
|
savebackupdirs
|
|
backup
|
|
|
|
elif [[ "$answer_backupdirs" = "2" ]]
|
|
then
|
|
printf "Please enter the dirs you want to backup: "
|
|
read backupdirs
|
|
|
|
printf "Do you want tho exclude dirs? Write the paths down: "
|
|
read excludebackupdirs
|
|
|
|
# Ask for the passwordoption
|
|
# With keyfile
|
|
if [[ "$pwoption" < "3" ]]; then
|
|
$resticbin -r $repodir backup $backupdirs --exclude=$excludebackupdirs --password-file="$pwdir/$keyfile"; fi
|
|
# Without keyfile
|
|
if [[ "$pwoption" = "3" ]]; then
|
|
$resticbin -r $repodir backup $backupdirs --exclude=$excludebackupdirs; fi
|
|
|
|
else
|
|
echo "Wrong argument. Exit!"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
}
|
|
|
|
#
|
|
## Read config
|
|
#
|
|
readconfig() {
|
|
|
|
if [[ -e "${configdir}/${configfile}" ]]
|
|
then
|
|
echo "There is an available config at $configdir/$configfile!"
|
|
. $configdir/$configfile
|
|
else
|
|
echo "There is no existing config at $configdir/$configfile!"
|
|
fi
|
|
|
|
}
|
|
|
|
#
|
|
printhelp() {
|
|
echo "
|
|
###########################
|
|
#Use of the Backupscript: #
|
|
###########################
|
|
#
|
|
## Add a new restic-repo
|
|
#
|
|
./abackup --add-restic-repo
|
|
|
|
#
|
|
## Take a backup
|
|
#
|
|
./abackup --backup
|
|
|
|
#
|
|
## Print this help
|
|
#
|
|
./abackup --help
|
|
|
|
"
|
|
}
|
|
|
|
########################
|
|
# Main programm #
|
|
########################
|
|
|
|
|
|
# What is to be done
|
|
case "$1" in
|
|
--add-restic-repo)
|
|
readconfig
|
|
resticrepoadd
|
|
exit 0
|
|
;;
|
|
|
|
--add-new-backupdirs)
|
|
readconfig
|
|
savebackupdirs
|
|
exit 0
|
|
;;
|
|
|
|
--backup)
|
|
readconfig
|
|
backup
|
|
exit 0
|
|
;;
|
|
|
|
--restore)
|
|
echo "Later that comand will restore your data!"
|
|
exit 0
|
|
;;
|
|
|
|
--help)
|
|
printhelp
|
|
exit 0
|
|
;;
|
|
esac
|
|
|
|
printhelp
|
|
|
|
|