#!/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)"