diff --git a/backup-tar/backup.sh b/backup-tar/backup.sh index dd8f4a768818d4ec9380fba118c7b5d026e7ecf9..5165156035e81236fb1e9f5cc4994d22fd026f4d 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