#!/bin/sh

# We only want this file to be executed at most once per day, so we stat a cache
# file before running the rest of the code
cache_file='/home/flyingscorpio/.cache/borg_backup_hood_last_executed'
if [ -f "$cache_file" ]; then
  cache_stat=$(stat -c %y "$cache_file" | cut -d' ' -f1)
  today=$(date +%Y-%m-%d)
  if [ "$cache_stat" = "$today" ]; then
    echo "The borg backup was already executed today" && exit 0
  fi
fi
touch "$cache_file"

# Setting this so the repo does not need to be given on the command line:
BORG_REPO=ssh://flyingscorpio@2px.info:22/~/"$(hostname)".borg
export BORG_REPO

export BORG_PASSPHRASE='ribosome66'

# some helpers and error handling:
info() { printf "\n%s %s\n\n" "$(date)" "$*" >&2; }
trap 'echo $(date) Backup interrupted >&2; exit 2' INT TERM

info "Starting backup"

# Backup the most important directories into an archive named after
# the machine this script is currently running on:
borg create                     	       \
  --verbose                     	       \
  --filter AME                  	       \
  --list                        	       \
  --stats                       	       \
  --show-rc                     	       \
  --compression lz4             	       \
  --exclude-caches              	       \
  --exclude '/home/*/.*/*'  	 	         \
  --exclude '/home/*/.*'  	 	           \
  --exclude '/home/*/builds/*'    	     \
  --exclude '/home/*/github_dotfiles/*'  \
  --exclude '/home/*/github_misc/*'  	   \
  --exclude '/home/*/Keepass/*' 	       \
  --exclude '/home/*/Lessons/*' 	       \
  --exclude '/home/*/Music/*'	 	         \
  --exclude '/home/*/PersonnalScripts/*' \
  --exclude '/home/*/RootMe/*'	 	       \
  --exclude '/home/*/SetupCockpit/*'	   \
  --exclude '/home/*/SRC/*'	 	           \
  --exclude '/home/*/VirtualBox VMs/*'	 \
  --exclude '/home/*/Videos/*'	 	       \
  --exclude '/var/cache/*'      	       \
  --exclude '/var/log/*'      	 	       \
  --exclude '/var/tmp/*'        	       \
                                	       \
  ::'{hostname}-{now}'          	       \
  /etc                          	       \
  /home                         	       \
  /root                         	       \
  /var                          	       \

backup_exit=$?

info "Pruning repository"

# Use the `prune` subcommand to maintain 7 daily, 4 weekly and 6 monthly
# archives of THIS machine. The '{hostname}-' prefix is very important to
# limit prune's operation to this machine's archives and not apply to
# other machines' archives also:
borg prune                               \
  --list                                 \
  --prefix '{hostname}-'                 \
  --show-rc                              \
  --keep-daily    7                      \
  --keep-weekly   4                      \
  --keep-monthly  6                      \

prune_exit=$?

# Use highest exit code as global exit code
global_exit=$(( backup_exit > prune_exit ? backup_exit : prune_exit ))

if [ ${global_exit} -eq 0 ]; then
  info "Backup and Prune finished succesfully"
elif [ ${global_exit} -eq 1 ]; then
  info "Backup and/or Prune finished with warnings"
else
  info "Backup and/or Prune finished with errors"
fi

exit ${global_exit}