| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- #!/bin/bash
- # preinst for smartbotic-database (server)
- # v1.9.5: snapshot data dir before deb upgrade (after old prerm stops the service).
- set -e
- DATA_DIR=/var/lib/smartbotic-database
- BACKUP_ROOT="${SMARTBOTIC_DB_BACKUP_ROOT:-/var/backups/smartbotic-database}"
- RETENTION="${SMARTBOTIC_DB_BACKUP_RETENTION:-3}"
- case "$1" in
- upgrade)
- if [ "${SMARTBOTIC_DB_SKIP_BACKUP:-0}" = "1" ]; then
- echo "smartbotic-database: SMARTBOTIC_DB_SKIP_BACKUP=1, skipping pre-upgrade backup"
- exit 0
- fi
- if [ ! -d "$DATA_DIR" ] || [ -z "$(ls -A "$DATA_DIR" 2>/dev/null)" ]; then
- echo "smartbotic-database: $DATA_DIR is empty or missing, nothing to back up"
- exit 0
- fi
- DATA_KB=$(du -sk "$DATA_DIR" | awk '{print $1}')
- if [ -z "$DATA_KB" ] || ! [ "$DATA_KB" -gt 0 ] 2>/dev/null; then
- echo "smartbotic-database: failed to measure $DATA_DIR size" >&2
- exit 1
- fi
- REQ_KB=$((DATA_KB * 12 / 10))
- mkdir -p "$BACKUP_ROOT"
- FREE_KB=$(df -P "$BACKUP_ROOT" | awk 'NR==2 {print $4}')
- if [ -z "$FREE_KB" ] || ! [ "$FREE_KB" -gt 0 ] 2>/dev/null; then
- echo "smartbotic-database: failed to measure free space at $BACKUP_ROOT" >&2
- exit 1
- fi
- if [ "$FREE_KB" -lt "$REQ_KB" ]; then
- cat >&2 <<EOF
- smartbotic-database: insufficient disk space for pre-upgrade backup
- data size : ${DATA_KB} KB
- required (1.2x) : ${REQ_KB} KB
- free at : ${BACKUP_ROOT} (${FREE_KB} KB)
- Free up space, point SMARTBOTIC_DB_BACKUP_ROOT at a larger volume, or
- override with SMARTBOTIC_DB_SKIP_BACKUP=1 apt upgrade smartbotic-database.
- To restore from backup if upgrade fails:
- systemctl stop smartbotic-database
- rm -rf /var/lib/smartbotic-database/*
- cp -a ${BACKUP_ROOT}/<latest>/. /var/lib/smartbotic-database/
- chown -R smartbotic-db:smartbotic-db /var/lib/smartbotic-database
- systemctl start smartbotic-database
- EOF
- exit 1
- fi
- TS=$(date -u +%Y%m%dT%H%M%SZ)
- OLD_VERSION="${2:-unknown}"
- BACKUP_DIR="$BACKUP_ROOT/pre-upgrade-${TS}-from-${OLD_VERSION}"
- BACKUP_TMP="${BACKUP_DIR}.tmp"
- echo "smartbotic-database: backing up $DATA_DIR to $BACKUP_DIR (${DATA_KB} KB)..."
- mkdir -p "$BACKUP_TMP"
- # Atomic-backup pattern: stage in .tmp, rename on success. If anything below
- # fails (including set -e unwinding), the trap wipes the partial dir so it
- # never gets mistaken for a complete backup by the retention sweep.
- trap 'rm -rf "$BACKUP_TMP"' ERR EXIT
- cp -a "$DATA_DIR/." "$BACKUP_TMP/"
- echo "$OLD_VERSION" > "$BACKUP_TMP/.from-version"
- echo "$TS" > "$BACKUP_TMP/.timestamp"
- mv "$BACKUP_TMP" "$BACKUP_DIR"
- trap - ERR EXIT
- # Retention: keep the newest $RETENTION backups, delete the rest.
- # Runs AFTER trap is cleared so a retention failure cannot wipe the final backup.
- ls -1dt "$BACKUP_ROOT"/pre-upgrade-* 2>/dev/null | tail -n +$((RETENTION + 1)) | xargs -r rm -rf
- echo "smartbotic-database: backup complete"
- ;;
- install|abort-upgrade) ;;
- *) echo "preinst called with unknown argument '$1'" >&2; exit 1 ;;
- esac
- exit 0
|