|
@@ -0,0 +1,81 @@
|
|
|
|
|
+#!/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
|