#!/usr/bin/env bash # /usr/local/sbin/squidguard-rebuild.sh # Root-owned (0755). Wird vom Deploy-User via sudo aufgerufen. # Uebernimmt die Staging-Dateien einer Gruppe und baut NUR deren .db neu. # Bei einem Fehler wird der letzte funktionierende Stand automatisch # zurueckgerollt, damit die Gruppe nicht offline geht. set -euo pipefail ag=${1:-} case "$ag" in AG0[1-8]) ;; # nur die erlaubten Gruppen *) echo "Ungueltige Gruppe: '$ag'" >&2; exit 2 ;; esac DB=/var/lib/squidguard/db IN=/var/lib/squidguard/incoming BK=/var/lib/squidguard/backup CONF=/etc/squidguard/squidGuard.conf PROXY_USER=proxy # Debian/Ubuntu: proxy RHEL: squid for f in "${ag}domain" "${ag}url"; do [ -f "$IN/$ag/$f" ] || { echo "Staging-Datei fehlt: $IN/$ag/$f" >&2; exit 3; } done install -d -o "$PROXY_USER" -g "$PROXY_USER" -m 0755 "$DB/$ag" "$BK/$ag" # --- 1) Letzten funktionierenden Stand sichern (Quelllisten + .db) -------- # rsync spiegelt exakt (auch Loeschungen), sodass BK immer der letzte # erfolgreich uebernommene Stand dieser Gruppe ist. rsync -a --delete "$DB/$ag/" "$BK/$ag/" restore() { echo "Rebuild fuer $ag fehlgeschlagen -> Rollback auf letzten guten Stand" >&2 rsync -a --delete "$BK/$ag/" "$DB/$ag/" } # --- 2) Neue Quelllisten uebernehmen ------------------------------------- install -o "$PROXY_USER" -g "$PROXY_USER" -m 0644 "$IN/$ag/${ag}domain" "$DB/$ag/${ag}domain" install -o "$PROXY_USER" -g "$PROXY_USER" -m 0644 "$IN/$ag/${ag}url" "$DB/$ag/${ag}url" # --- 3) .db je Liste neu bauen, als Squid-User, mit Fehlererkennung ------ rebuild_one() { local list=$1 out rc out=$(sudo -u "$PROXY_USER" squidGuard -c "$CONF" -C "$list" 2>&1) || rc=$? rc=${rc:-0} echo "$out" # squidGuard liefert nicht immer einen aussagekraeftigen Exit-Code: # zusaetzlich stderr und Existenz/Groesse der .db pruefen. if [ "$rc" -ne 0 ] \ || printf '%s' "$out" | grep -qiE 'error|fatal|went not through' \ || [ ! -s "$DB/$list.db" ]; then return 1 fi return 0 } if ! rebuild_one "$ag/${ag}domain" || ! rebuild_one "$ag/${ag}url"; then restore exit 4 fi echo "rebuilt $ag"