AkurAI Build
Menu

AkurAI-Build

public

Latest change b2fb6810b8844f39a9752f65118c05ffecf28160 - Fold AkurAI EC2 operations into Build CLI by Ólafur Búi Ólafsson

set -euo pipefail
sudo systemctl is-enabled --quiet akurai-tasks-backup.timer
sudo systemctl is-active --quiet akurai-tasks-backup.timer
sudo systemctl show akurai-tasks-backup.service -p Result --value | grep -qx success
latest="$(sudo find /var/backups/akurai-tasks -maxdepth 1 -type f -name 'akurai-tasks-*.tar.gpg' -printf '%T@ %p\n' | sort -nr | head -1 | cut -d' ' -f2-)"
[ -n "$latest" ] && sudo test -s "$latest"
[ "$(sudo stat -c %a "$latest")" = 600 ]
[ "$(sudo stat -c %U:%G "$latest")" = root:root ]
header="$(sudo od -An -N16 -tx1 "$latest" | tr -d ' \n')"
[ "$header" != 414b555241495f42545245455f563100 ]
scratch="$(sudo mktemp -d /var/backups/akurai-tasks/.verify-XXXXXXXX)"
cleanup() { sudo rm -rf "$scratch"; }
trap cleanup EXIT
sudo gpg --batch --homedir /etc/akurai-tasks-backup/gnupg --decrypt "$latest" |
  sudo tar -xf - -C "$scratch"
backup="$(sudo find "$scratch" -maxdepth 1 -type f -name 'akurai-tasks-*.db' -print -quit)"
[ -n "$backup" ] && sudo test -s "$backup" && sudo test -s "$backup.manifest.json"
expected="$(sudo python3 - "$backup.manifest.json" <<'PY'
import json
import sys
print(json.load(open(sys.argv[1], encoding="utf-8"))["sha256"])
PY
)"
actual="$(sudo sha256sum "$backup" | cut -d' ' -f1)"
[ "$actual" = "$expected" ]
sudo /opt/akurai-tasks/bin/akurai-tasks --db "$scratch/restored.db" restore "$backup" >/dev/null
sudo /opt/akurai-tasks/bin/akurai-tasks --db "$scratch/restored.db" doctor >/dev/null
count="$(sudo find /var/backups/akurai-tasks -maxdepth 1 -type f -name 'akurai-tasks-*.tar.gpg' | wc -l)"
mtime="$(sudo stat -c %y "$latest" | cut -d. -f1)Z"
printf 'timer=active latest=%s backups=%s encryption=gpg recovery=verified\n' "$mtime" "$count"