My omnium-gatherom of scripts and source code.
at main 95 lines 2.5 kB view raw
1#!/usr/bin/env bash 2# dependencies: 3# tar, xz, stat, par2create (from par2cmdline package), md5sum, du, awk, jq 4set -e 5 6check_command() { 7 CMD="$1" 8 9 if ! command -v "$CMD" 2>&1 /dev/null 10 then 11 echo "$CMD could not be found" 12 exit 1 13 fi 14} 15 16echo "Checking for dependencies:" 17check_command awk 18check_command du 19check_command find 20check_command jq 21check_command md5sum 22check_command par2create 23check_command stat 24check_command tar 25check_command xz 26echo "All dependencies found!" 27 28ARCHIVE_DB="$HOME"/.local/state/archives.json 29 30create_archive() { 31 ARCHIVE_NAME="$1" 32 ARCHIVE_DESTINATION="$2" 33 TARGET="$3" 34 35 echo "Creating tar for $TARGET." 36 tar cfP "$ARCHIVE_NAME".tar "$TARGET" 37 mv "$ARCHIVE_NAME".tar "$ARCHIVE_DESTINATION" 38 echo "Finished creating tar for $TARGET, proceeding to archive." 39 40 cd "$ARCHIVE_DESTINATION" || exit 0 41 [ -f "$ARCHIVE_NAME".tar.xz ] && rm "$ARCHIVE_NAME".tar.xz 42 xz -v -e -9 "$ARCHIVE_NAME".tar 43 DIR_SIZE="$(du -sh "$TARGET" | awk '{print $1}')" 44 ARCHIVE_SIZE="$(du -sh "$ARCHIVE_NAME".tar.xz | awk '{print $1}')" 45 echo "Finished archiving $TARGET." 46 echo "Compressed $TARGET ($DIR_SIZE) to $ARCHIVE_NAME ($ARCHIVE_SIZE)" 47} 48 49create_parchive() { 50 echo "Creating parity archive with 1 index file and 1 block file." 51 ARCHIVE="$1" 52 find . -name '*par2' -exec rm {} \; 53 par2create -r30 -n1 "$ARCHIVE" 54} 55 56update_json() { 57 INDEX="$1" 58 ARCHIVE_TIME="$2" 59 UPLOAD_TIME="$3" 60 MD5SUM="$4" 61 62 FOO="$(jq ".[$INDEX].timestamps.last_archive = $ARCHIVE_TIME" < "$ARCHIVE_DB" \ 63 | jq ".[$INDEX].timestamps.last_upload = $UPLOAD_TIME" \ 64 | jq ".[$INDEX].md5sum = \"$MD5SUM"\")" 65 echo "$FOO" > "$ARCHIVE_DB" 66} 67 68ARCHIVE_COUNT="$(jq '.[].name' < "$ARCHIVE_DB" | wc -l)" 69ARCHIVE_COUNT="$((ARCHIVE_COUNT - 1))" 70for i in $(seq 0 "$ARCHIVE_COUNT") 71do 72 JSON="$(jq ".[$i]" < "$ARCHIVE_DB")" 73 TARGET="$(echo "$JSON" | jq -r '.target')" 74 TARGET="${TARGET/#\~/$HOME}" 75 ARCHIVE="$(echo "$JSON" | jq '.archive')" 76 ARCHIVE_NAME="$(echo "$ARCHIVE" | jq -r '.name')" 77 ARCHIVE_PATH="$(echo "$ARCHIVE" | jq -r '.destination')" 78 ARCHIVE_PATH="${ARCHIVE_PATH/#\~/$HOME}" 79 SYNC_COMMAND="$(echo "$JSON" | jq -r '.sync_command')" 80 81 mkdir -p "$ARCHIVE_PATH" 82 83 create_archive "$ARCHIVE_NAME" "$ARCHIVE_PATH" "$TARGET" 84 85 create_parchive "$ARCHIVE_NAME".tar.xz 86 87 ARCHIVE_TIME="$(stat -c %W "$ARCHIVE_NAME".tar.xz)" 88 MD5SUM="$(md5sum "$ARCHIVE_NAME".tar.xz | awk '{print $1}')" 89 90 echo "Running sync command: $SYNC_COMMAND" 91 bash -c "$SYNC_COMMAND" 92 UPLOAD_TIME="$(date +%s)" 93 94 update_json "$i" "$ARCHIVE_TIME" "$UPLOAD_TIME" "$MD5SUM" 95done