From 44179dac63484d7bbb43fd8df42a7b8503caa2c6 Mon Sep 17 00:00:00 2001 From: Kirill Kodanev Date: Tue, 9 Sep 2025 21:35:32 +0300 Subject: [PATCH] Rewrite logic of validation and generation config for dnsmasq --- scripts/generate-configs.sh | 55 ++++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 16 deletions(-) diff --git a/scripts/generate-configs.sh b/scripts/generate-configs.sh index f9b8ae7..ed6c44a 100644 --- a/scripts/generate-configs.sh +++ b/scripts/generate-configs.sh @@ -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" - - # Добавляем в resolve конфигурацию - echo "server=/$domain/8.8.8.8" >> "$RESOLVE_CONF" -done <<< "$DOMAINS" +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)" +