#!/usr/bin/env bash # dependencies: # tar, xz, stat, par2create (from par2cmdline package), md5sum, du, awk, jq set -e check_command() { CMD="$1" if ! command -v "$CMD" 2>&1 /dev/null then gum log -l "fatal" "Executable: $CMD was not found." exit 1 fi } gum log -t kitchen -l info "Checking for dependencies:" check_command awk check_command du check_command find check_command jq check_command md5sum check_command par2create check_command stat check_command tar check_command xz gum log -t kitchen -l info "All dependencies found!" ARCHIVE_DB="$HOME"/.local/state/archives.json create_archive() { ARCHIVE_NAME="$1" ARCHIVE_DESTINATION="$2" TARGET="$3" gum log -t kitchen -l info "Creating tar for $TARGET." tar cfP "$ARCHIVE_NAME".tar "$TARGET" mv "$ARCHIVE_NAME".tar "$ARCHIVE_DESTINATION" gum log -t kitchen -l info "Finished creating tar for $TARGET." gum log -l info "Proceeding to archive." cd "$ARCHIVE_DESTINATION" || exit 0 [ -f "$ARCHIVE_NAME".tar.xz ] && rm "$ARCHIVE_NAME".tar.xz && gum log -t kitchen -l info "Removed old $ARCHIVE_NAME.tar.xz." gum log -l info -t kitchen "Compressing: $ARCHIVE_NAME.tar" xz -v -e -9 "$ARCHIVE_NAME".tar DIR_SIZE="$(du -sh "$TARGET" | awk '{print $1}')" ARCHIVE_SIZE="$(du -sh "$ARCHIVE_NAME".tar.xz | awk '{print $1}')" gum log -l info -t kitchen "Finished archiving $TARGET." gum style --bold "Compressed $TARGET ($DIR_SIZE) to $ARCHIVE_NAME ($ARCHIVE_SIZE)." } create_parchive() { gum log -l info -t kitchen "Creating parity archive." ARCHIVE="$1" find . -name '*par2' -exec rm {} \; par2create -r30 -n1 "$ARCHIVE" } update_json() { INDEX="$1" ARCHIVE_TIME="$2" UPLOAD_TIME="$3" MD5SUM="$4" FOO="$(jq ".[$INDEX].timestamps.last_archive = $ARCHIVE_TIME" < "$ARCHIVE_DB" \ | jq ".[$INDEX].timestamps.last_upload = $UPLOAD_TIME" \ | jq ".[$INDEX].md5sum = \"$MD5SUM"\")" echo "$FOO" > "$ARCHIVE_DB" } ARCHIVE_COUNT="$(jq '.[].name' < "$ARCHIVE_DB" | wc -l)" ARCHIVE_COUNT="$((ARCHIVE_COUNT - 1))" for i in $(seq 0 "$ARCHIVE_COUNT") do JSON="$(jq ".[$i]" < "$ARCHIVE_DB")" TARGET="$(echo "$JSON" | jq -r '.target')" TARGET="${TARGET/#\~/$HOME}" ARCHIVE="$(echo "$JSON" | jq '.archive')" ARCHIVE_NAME="$(echo "$ARCHIVE" | jq -r '.name')" ARCHIVE_PATH="$(echo "$ARCHIVE" | jq -r '.destination')" ARCHIVE_PATH="${ARCHIVE_PATH/#\~/$HOME}" SYNC_COMMAND="$(echo "$JSON" | jq -r '.sync_command')" mkdir -p "$ARCHIVE_PATH" create_archive "$ARCHIVE_NAME" "$ARCHIVE_PATH" "$TARGET" create_parchive "$ARCHIVE_NAME".tar.xz ARCHIVE_TIME="$(stat -c %W "$ARCHIVE_NAME".tar.xz)" MD5SUM="$(md5sum "$ARCHIVE_NAME".tar.xz | awk '{print $1}')" bash -c "$SYNC_COMMAND"; UPLOAD_TIME="$(date +%s)" update_json "$i" "$ARCHIVE_TIME" "$UPLOAD_TIME" "$MD5SUM" done