#!/usr/bin/env bash # validate.sh # 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"