Rewrite logic of validation and generation config for dnsmasq #2

Merged
goodvin merged 1 commit from rewrite-gen-config into main 2025-09-09 21:37:30 +03:00

View file

@ -1,28 +1,51 @@
#!/bin/bash
set -e
set -euo pipefail
# Читаем домены из файла, исключая комментарии и пустые строки
DOMAINS=$(grep -v '^#' domains.txt | grep -v '^$')
# Создаем временные файлы
INPUT_FILE="domains.txt"
IPSET_CONF="/tmp/91-ipset-bbrkn.conf"
RESOLVE_CONF="/tmp/92-resolve-bbrkn.conf"
# Очищаем файлы
> "$IPSET_CONF"
> "$RESOLVE_CONF"
# Очистка выходных файлов
: > "$IPSET_CONF"
: > "$RESOLVE_CONF"
echo "Generating configuration files..."
# Генерируем конфигурации для каждого домена
while read -r domain; do
# Добавляем в ipset конфигурацию
echo "ipset=/$domain/bbrkn" >> "$IPSET_CONF"
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
}
# Добавляем в resolve конфигурацию
echo "server=/$domain/8.8.8.8" >> "$RESOLVE_CONF"
done <<< "$DOMAINS"
# Читаем вход и генерируем конфиги
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)"