SquidGuard-Listen self-managed via GitLab (Shell-Runner)
Beispiel-Setup: ein Repo je AG fuer Zugriffskontrolle, zentrales Deploy-Repo mit Validierung, Rollout auf beide Proxys, DB-Rebuild je Gruppe und Auto-Rollback auf den letzten guten Stand. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Executable
+62
@@ -0,0 +1,62 @@
|
||||
#!/usr/bin/env bash
|
||||
# /usr/local/sbin/squidguard-rebuild.sh <AG0N>
|
||||
# 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"
|
||||
Reference in New Issue
Block a user