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
+57
@@ -0,0 +1,57 @@
|
||||
#!/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"
|
||||
Reference in New Issue
Block a user