#!/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 </. /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