From 9ece30fa7c70f7e31ce9e3f37ef202b582c7c88c Mon Sep 17 00:00:00 2001
From: root <root@pontos01.fi.muni.cz>
Date: Sat, 7 Mar 2020 11:21:55 +0100
Subject: [PATCH] tar backup type autodetect + parallel compression

---
 backup-tar/backup.sh | 27 ++++++++++++++++++++++++---
 1 file changed, 24 insertions(+), 3 deletions(-)

diff --git a/backup-tar/backup.sh b/backup-tar/backup.sh
index dd8f4a7..5165156 100755
--- a/backup-tar/backup.sh
+++ b/backup-tar/backup.sh
@@ -2,18 +2,38 @@
 
 set -e
 
+COMPRESS_THRS=$(($(nproc) / 4))
+[[ $COMPRESS_THRS -eq 0 ]] && COMPRESS_THRS=1
+[[ $COMPRESS_THRS -gt 8 ]] && COMPRESS_THRS=8
+
 fail() {
     echo "$1" >&2
     exit 1
 }
 
-[[ "$1" = "full" ]] || [[ "$1" = "weekly" ]] || [[ "$1" = "daily" ]] || \
+TYPE=$1
+[[ "$TYPE" ]] || {
+    set -x
+    LAST_FULL=$(date --date=$(ls *.snar | sort | grep full | tail -n1 | sed 's/[.].*$//') +%s)
+    LAST_BIG=$(date --date=$(ls *.snar | sort | grep '\(full\|weekly\)' | tail -n1 | sed 's/[.].*$//') +%s)
+    NOW=$(date +%s)
+    # do a full backup every 8 weeks
+    if [[ $(($NOW - $LAST_FULL)) -ge $((3600 * 24 * 7 * 8)) ]]; then
+        TYPE=full
+    elif [[ $(($NOW - $LAST_BIG)) -ge $((3600 * 24 * 7)) ]]; then
+        TYPE=weekly
+    else
+        TYPE=daily
+    fi
+    set +x
+    echo "Performing $TYPE backup (autodetected)" >&2
+}
+[[ "$TYPE" = "full" ]] || [[ "$TYPE" = "weekly" ]] || [[ "$TYPE" = "daily" ]] || \
     fail "usage: $0 [full|weekly|daily]"
 
 TARGET=backup-$HOSTNAME@antea
 LOCAL_HOME_ID=$(stat -c %d /home)
 SOURCES=$(comm -12 <(getent passwd | cut -d: -f6 | sort) <(for i in /home/*; do [[ $(stat -c %d $i) -eq $LOCAL_HOME_ID ]] && echo $i; done))
-TYPE=$1
 TIMESTAMP=$(date +"%Y-%m-%d")
 
 BACKUP_FILE=${TYPE}/${TIMESTAMP}.tar.xz
@@ -36,5 +56,6 @@ fi
 set -x
 
 ssh $TARGET "mkdir -p $TYPE"
-tar --create --xz --xattrs --acls --listed-incremental=$INCFILE $SOURCES | ssh $TARGET "cat > $BACKUP_FILE"
+tar --create --xattrs --acls --listed-incremental=$INCFILE $SOURCES | \
+    xz -T$COMPRESS_THRS -3 | ssh $TARGET "cat > $BACKUP_FILE"
 scp $INCFILE $TARGET:$INCFILE_TGT
-- 
GitLab