server.preinst 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #!/bin/bash
  2. # preinst for smartbotic-database (server)
  3. # v1.9.5: snapshot data dir before deb upgrade (after old prerm stops the service).
  4. set -e
  5. DATA_DIR=/var/lib/smartbotic-database
  6. BACKUP_ROOT="${SMARTBOTIC_DB_BACKUP_ROOT:-/var/backups/smartbotic-database}"
  7. RETENTION="${SMARTBOTIC_DB_BACKUP_RETENTION:-3}"
  8. case "$1" in
  9. upgrade)
  10. if [ "${SMARTBOTIC_DB_SKIP_BACKUP:-0}" = "1" ]; then
  11. echo "smartbotic-database: SMARTBOTIC_DB_SKIP_BACKUP=1, skipping pre-upgrade backup"
  12. exit 0
  13. fi
  14. if [ ! -d "$DATA_DIR" ] || [ -z "$(ls -A "$DATA_DIR" 2>/dev/null)" ]; then
  15. echo "smartbotic-database: $DATA_DIR is empty or missing, nothing to back up"
  16. exit 0
  17. fi
  18. DATA_KB=$(du -sk "$DATA_DIR" | awk '{print $1}')
  19. if [ -z "$DATA_KB" ] || ! [ "$DATA_KB" -gt 0 ] 2>/dev/null; then
  20. echo "smartbotic-database: failed to measure $DATA_DIR size" >&2
  21. exit 1
  22. fi
  23. REQ_KB=$((DATA_KB * 12 / 10))
  24. mkdir -p "$BACKUP_ROOT"
  25. FREE_KB=$(df -P "$BACKUP_ROOT" | awk 'NR==2 {print $4}')
  26. if [ -z "$FREE_KB" ] || ! [ "$FREE_KB" -gt 0 ] 2>/dev/null; then
  27. echo "smartbotic-database: failed to measure free space at $BACKUP_ROOT" >&2
  28. exit 1
  29. fi
  30. if [ "$FREE_KB" -lt "$REQ_KB" ]; then
  31. cat >&2 <<EOF
  32. smartbotic-database: insufficient disk space for pre-upgrade backup
  33. data size : ${DATA_KB} KB
  34. required (1.2x) : ${REQ_KB} KB
  35. free at : ${BACKUP_ROOT} (${FREE_KB} KB)
  36. Free up space, point SMARTBOTIC_DB_BACKUP_ROOT at a larger volume, or
  37. override with SMARTBOTIC_DB_SKIP_BACKUP=1 apt upgrade smartbotic-database.
  38. To restore from backup if upgrade fails:
  39. systemctl stop smartbotic-database
  40. rm -rf /var/lib/smartbotic-database/*
  41. cp -a ${BACKUP_ROOT}/<latest>/. /var/lib/smartbotic-database/
  42. chown -R smartbotic-db:smartbotic-db /var/lib/smartbotic-database
  43. systemctl start smartbotic-database
  44. EOF
  45. exit 1
  46. fi
  47. TS=$(date -u +%Y%m%dT%H%M%SZ)
  48. OLD_VERSION="${2:-unknown}"
  49. BACKUP_DIR="$BACKUP_ROOT/pre-upgrade-${TS}-from-${OLD_VERSION}"
  50. BACKUP_TMP="${BACKUP_DIR}.tmp"
  51. echo "smartbotic-database: backing up $DATA_DIR to $BACKUP_DIR (${DATA_KB} KB)..."
  52. mkdir -p "$BACKUP_TMP"
  53. # Atomic-backup pattern: stage in .tmp, rename on success. If anything below
  54. # fails (including set -e unwinding), the trap wipes the partial dir so it
  55. # never gets mistaken for a complete backup by the retention sweep.
  56. trap 'rm -rf "$BACKUP_TMP"' ERR EXIT
  57. cp -a "$DATA_DIR/." "$BACKUP_TMP/"
  58. echo "$OLD_VERSION" > "$BACKUP_TMP/.from-version"
  59. echo "$TS" > "$BACKUP_TMP/.timestamp"
  60. mv "$BACKUP_TMP" "$BACKUP_DIR"
  61. trap - ERR EXIT
  62. # Retention: keep the newest $RETENTION backups, delete the rest.
  63. # Runs AFTER trap is cleared so a retention failure cannot wipe the final backup.
  64. ls -1dt "$BACKUP_ROOT"/pre-upgrade-* 2>/dev/null | tail -n +$((RETENTION + 1)) | xargs -r rm -rf
  65. echo "smartbotic-database: backup complete"
  66. ;;
  67. install|abort-upgrade) ;;
  68. *) echo "preinst called with unknown argument '$1'" >&2; exit 1 ;;
  69. esac
  70. exit 0