utm-backup.sh 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. # ---- CONFIG ----
  4. UTM_DIR="$HOME/Library/Containers/com.utmapp.UTM/Data/Documents"
  5. VM_NAME="Personal Fedora.utm"
  6. REMOTE_HOST="rhea.local"
  7. REMOTE_DIR="/tank/backups/utm"
  8. KEEP=5
  9. DATE="$(date +%Y-%m-%d_%H-%M-%S)"
  10. BASENAME="${VM_NAME%.utm}_$DATE"
  11. ARCHIVE="/tmp/$BASENAME.tar.gz"
  12. # ---- SANITY CHECKS ----
  13. if [[ ! -d "$UTM_DIR/$VM_NAME" ]]; then
  14. echo "ERROR: VM not found: $UTM_DIR/$VM_NAME"
  15. exit 1
  16. fi
  17. # Optional: refuse if VM might be running
  18. if pgrep -f "$VM_NAME" >/dev/null; then
  19. echo "ERROR: VM appears to be running. Shut it down first."
  20. exit 1
  21. fi
  22. # ---- CREATE ARCHIVE ----
  23. echo "Creating compressed archive..."
  24. tar -C "$UTM_DIR" -czf "$ARCHIVE" "$VM_NAME"
  25. # ---- COPY ----
  26. echo "Uploading $ARCHIVE → $REMOTE_HOST:$REMOTE_DIR/"
  27. scp "$ARCHIVE" "$REMOTE_HOST:$REMOTE_DIR/"
  28. # ---- REMOTE ROTATION ----
  29. echo "Pruning old backups on remote (keeping last $KEEP)..."
  30. ssh "$REMOTE_HOST" "
  31. ls -dt $REMOTE_DIR/${VM_NAME%.utm}_*.tar.gz 2>/dev/null \
  32. | tail -n +$((KEEP + 1)) \
  33. | xargs -r rm -f
  34. "
  35. # ---- CLEANUP ----
  36. rm -f "$ARCHIVE"
  37. echo "Backup complete."