51 lines
1.9 KiB
Bash
51 lines
1.9 KiB
Bash
#!/bin/bash
|
||
set -euo pipefail
|
||
|
||
INPUT_FILE="domains.txt"
|
||
IPSET_CONF="/tmp/91-ipset-bbrkn.conf"
|
||
RESOLVE_CONF="/tmp/92-resolve-bbrkn.conf"
|
||
|
||
# Очистка выходных файлов
|
||
: > "$IPSET_CONF"
|
||
: > "$RESOLVE_CONF"
|
||
|
||
echo "Generating configuration files..."
|
||
|
||
normalize_domain() {
|
||
local raw="$1"
|
||
# Удаляем комментарии после домена (inline), обрезаем пробелы
|
||
raw="$(echo "$raw" | sed -E 's/#.*$//' | awk '{$1=$1};1')"
|
||
# Пустые строки отбрасываем
|
||
[ -z "$raw" ] && return 1
|
||
# Приводим к нижнему регистру
|
||
raw="$(echo "$raw" | tr '[:upper:]' '[:lower:]')"
|
||
# Удаляем лидирующее "*." (wildcard из пользовательского файла)
|
||
raw="$(echo "$raw" | sed -E 's/^\*\.\s*//')"
|
||
# Удаляем лидирующие точки (исторически dnsmasq игнорирует их)
|
||
raw="$(echo "$raw" | sed -E 's/^\.+//')"
|
||
# Удаляем финальные точки (FQDN с точкой на конце)
|
||
raw="$(echo "$raw" | sed -E 's/\.+$//')"
|
||
# Удаляем дублирующиеся точки внутри
|
||
raw="$(echo "$raw" | sed -E 's/\.+/./g')"
|
||
# Базовая проверка формата домена: label(.label)+, tld >=2
|
||
if echo "$raw" | grep -Eq '^[a-z0-9-]+(\.[a-z0-9-]+)+$' && \
|
||
echo "$raw" | grep -Eq '\.[a-z]{2,}$'; then
|
||
printf '%s' "$raw"
|
||
return 0
|
||
else
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# Читаем вход и генерируем конфиги
|
||
while IFS= read -r line || [ -n "$line" ]; do
|
||
dom="$(normalize_domain "$line" || true)"
|
||
[ -z "$dom" ] && continue
|
||
echo "ipset=/$dom/bbrkn" >> "$IPSET_CONF"
|
||
echo "server=/$dom/8.8.8.8" >> "$RESOLVE_CONF"
|
||
done < "$INPUT_FILE"
|
||
|
||
echo "Configuration files generated:"
|
||
echo "- $IPSET_CONF ($(wc -l < "$IPSET_CONF") entries)"
|
||
echo "- $RESOLVE_CONF ($(wc -l < "$RESOLVE_CONF") entries)"
|
||
|