Files
squidguard-gitlab/deploy-repo/scripts/validate.sh
T
maierch d3638d49ae 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>
2026-07-28 16:39:13 +02:00

58 lines
1.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# validate.sh <domain|url> <datei>
# Prueft eine squidGuard-Domain- bzw. URL-Liste auf gueltiges Format,
# damit eine kaputte Zeile nicht den DB-Rebuild auf dem Proxy stoert.
set -euo pipefail
type=${1:?Typ fehlt (domain|url)}
file=${2:?Datei fehlt}
[ -f "$file" ] || { echo "Datei fehlt: $file" >&2; exit 1; }
domain_re='^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$'
url_re='^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}(/[^[:space:]]*)?$'
errors=0
lineno=0
while IFS= read -r line || [ -n "$line" ]; do
lineno=$((lineno + 1))
# Leerzeilen sind erlaubt und werden ignoriert
[ -z "${line//[[:space:]]/}" ] && continue
# squidGuard-DB-Listen kennen KEINE Kommentare -> '#' waere eine echte Domain
case "$line" in
\#*) echo "$file:$lineno: Kommentare (#) sind in squidGuard-Listen nicht erlaubt" >&2
errors=$((errors + 1)); continue ;;
esac
# kein Schema
if printf '%s' "$line" | grep -qiE '://'; then
echo "$file:$lineno: Schema (z.B. http://) nicht erlaubt: $line" >&2
errors=$((errors + 1)); continue
fi
# keine Grossbuchstaben (squidGuard matcht case-sensitiv auf lowercase)
lower=$(printf '%s' "$line" | tr 'A-Z' 'a-z')
if [ "$lower" != "$line" ]; then
echo "$file:$lineno: Grossbuchstaben nicht erlaubt: $line" >&2
errors=$((errors + 1)); continue
fi
case "$type" in
domain)
printf '%s' "$line" | grep -qE "$domain_re" \
|| { echo "$file:$lineno: keine gueltige Domain: $line" >&2; errors=$((errors + 1)); } ;;
url)
printf '%s' "$line" | grep -qE "$url_re" \
|| { echo "$file:$lineno: keine gueltige URL: $line" >&2; errors=$((errors + 1)); } ;;
*) echo "Unbekannter Typ: $type" >&2; exit 2 ;;
esac
done < "$file"
if [ "$errors" -gt 0 ]; then
echo "Validierung fehlgeschlagen: $errors Fehler in $file" >&2
exit 1
fi
echo "OK: $file"