My omnium-gatherom of scripts and source code.
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