#!/bin/bash set -euo pipefail INPUT_FILE="domains.txt" IPSET_CONF="/tmp/91-ipset-bbrkn.conf" RESOLVE_CONF="/tmp/92-resolve-bbrkn.conf" API_URL="http://10.100.1.2:3000/domains?domain=" DRY_RUN=false if [[ "${1:-}" == "--dry-run" ]]; then DRY_RUN=true fi if ! $DRY_RUN; then : > "$IPSET_CONF" : > "$RESOLVE_CONF" fi declare -A DOM_ROLE # роли для исходных доменов: site/service declare -A EXPANDED # все уникальные домены (ключи = домены) declare -A SOURCES # источник: base или related normalize_domain() { local raw="$1" raw="$(echo "$raw" | sed -E 's/#.*$//' | awk '{$1=$1};1')" || return 1 [ -z "$raw" ] && return 1 raw="$(echo "$raw" | tr '[:upper:]' '[:lower:]')" raw="$(echo "$raw" | sed -E 's/^\*\.\s*//; s/^\.+//; s/\.+$//; s/\.+/./g')" if echo "$raw" | grep -Eq '^[a-z0-9-]+(\.[a-z0-9-]+)+$' && \ echo "$raw" | grep -Eq '\.[a-z]{2,}$'; then printf '%s' "$raw" else return 1 fi } # Обработка доменов из входного списка while IFS= read -r line || [ -n "$line" ]; do dom="$(normalize_domain "$line" || true)" [ -z "$dom" ] && continue echo "Querying service for $dom..." resp="$(curl -s --max-time 15 "${API_URL}${dom}" || true)" if echo "$resp" | grep -q '"domains"'; then DOM_ROLE["$dom"]="site" EXPANDED["$dom"]=1 SOURCES["$dom"]="base" mapfile -t subs < <(echo "$resp" | jq -r '.domains[]?') for s in "${subs[@]}"; do nd="$(normalize_domain "$s" || true)" [ -n "$nd" ] || continue EXPANDED["$nd"]=1 [[ -z "${SOURCES[$nd]:-}" ]] && SOURCES["$nd"]="related" done else DOM_ROLE["$dom"]="service" EXPANDED["$dom"]=1 SOURCES["$dom"]="base" fi done < "$INPUT_FILE" # Сортировка доменов mapfile -t ALL_DOMAINS < <(printf "%s\n" "${!EXPANDED[@]}" | sort -u) # Генерация конфигов if ! $DRY_RUN; then for d in "${ALL_DOMAINS[@]}"; do echo "ipset=/$d/bbrkn" >> "$IPSET_CONF" echo "server=/$d/8.8.8.8" >> "$RESOLVE_CONF" done fi # Подсчёты count_in=$(wc -l < "$INPUT_FILE") count_total=${#ALL_DOMAINS[@]} count_base=$(printf "%s\n" "${!SOURCES[@]}" | grep -c '.*' || true) count_related=$(printf "%s\n" "${!SOURCES[@]}" | grep -c '.*' || true) count_related=$(( count_total - count_in )) # Отладочный вывод echo echo "===== DEBUG REPORT =====" echo "Original domains file: $count_in entries" echo "Final unique domains: $count_total" echo " - Base domains: $count_in" echo " - Related domains: $count_related" echo while IFS= read -r line || [ -n "$line" ]; do dom="$(normalize_domain "$line" || true)" [ -n "$dom" ] && echo "$dom - ${DOM_ROLE[$dom]:-unknown}" done < "$INPUT_FILE" echo "========================"