Merge pull request 'Rewrite logic of validation and generation config for dnsmasq' (#2) from rewrite-gen-config into main

Reviewed-on: #2
This commit is contained in:
goodvin 2025-09-09 21:37:29 +03:00
commit 886a3f495f

View file

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