d3638d49ae
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>
58 lines
1.9 KiB
Bash
Executable File
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"
|