#!/bin/sh # postinst โ€” install and upgrade paths (spec ยง7). # # dpkg calls: postinst configure [most-recently-configured-version] # fresh install: $1 = "configure" # upgrade: $1 = "configure" (old version as $2 when available) # # rpm calls: %post $1 = 1 (fresh install) / 2 (upgrade) # (handled by packaging/rpm/post.sh) # # Install: sysusers, tmpfiles, daemon-reload โ€” nothing else (dormant). # Upgrade: snapshot, migration, daemon-reload, conditional timer restart. set -eu STORE_DIR="/var/lib/fenris" STORE_DB="${STORE_DIR}/observations.db" STORE_BAK="${STORE_DIR}/observations.db.bak" VENV_PYTHON="/opt/fenris/bin/python3" case "${1:-}" in configure) if [ -n "${2:-}" ]; then # Upgrade โ€” $2 is the old version # Snapshot observation store (one generation) if [ -f "${STORE_DB}" ]; then cp "${STORE_DB}" "${STORE_BAK}" 2>/dev/null || true fi # Forward-only schema migration if [ -x "${VENV_PYTHON}" ] && [ -f "${STORE_DB}" ]; then "${VENV_PYTHON}" -c " from fenris.store import migrate_to_latest from pathlib import Path n = migrate_to_latest(Path('${STORE_DB}')) print(f'Fenris migration: {n} step(s) applied') if n else None " 2>&1 || echo "Fenris: migration skipped (store not yet initialized)" fi # Restart collect timer only if unit contents changed AND it is active for unit in fenris-collect.timer fenris-collect.service; do if systemctl is-active --quiet "${unit}" 2>/dev/null; then TMPFILE="$(mktemp)" systemctl cat "${unit}" > "${TMPFILE}" 2>/dev/null || true UNIT_PATH="/usr/lib/systemd/system/${unit}" if ! diff -q "${TMPFILE}" "${UNIT_PATH}" > /dev/null 2>&1; then systemctl restart "${unit}" 2>/dev/null || true fi rm -f "${TMPFILE}" fi done fi # Always run on both fresh install and upgrade systemd-sysusers || true systemd-tmpfiles --create || true systemctl daemon-reload || true ;; abort-upgrade|abort-install|disappear) ;; esac