Add support to find all domains
Some checks failed
Deploy DNS Configuration / deploy (push) Failing after 34s

This commit is contained in:
g00dvin 2025-09-11 14:09:16 +03:00
parent 2019a7661d
commit ec0cfa2adf
4 changed files with 128 additions and 33 deletions

View file

@ -11,7 +11,7 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: Validate domains file - name: Validate domains file
run: | run: |
if [ ! -f domains.txt ]; then if [ ! -f domains.txt ]; then
@ -26,12 +26,21 @@ jobs:
fi fi
done done
- name: Generate dnsmasq configuration files - name: Prepare Makefile
run: | run: |
chmod +x scripts/generate-configs.sh chmod +x generate-configs.sh
./scripts/generate-configs.sh chmod +x deploy-to-gateway.sh
- name: Deploy to gateway - name: Run workflow (clean → check → all)
run: | run: |
chmod +x scripts/deploy-to-gateway.sh make clean
./scripts/deploy-to-gateway.sh make check
make all
- name: Upload configs as artifacts
uses: actions/upload-artifact@v3
with:
name: dnsmasq-configs
path: |
/tmp/91-ipset-bbrkn.conf
/tmp/92-resolve-bbrkn.conf

46
Makefile Normal file
View file

@ -0,0 +1,46 @@
# ==========================
# Makefile для проекта BBRKN
# ==========================
DOMAINS := domains.txt
GEN_SCRIPT := ./generate-configs.sh
DEPLOY_SCRIPT := ./deploy-to-gateway.sh
IPSET_CONF := /tmp/91-ipset-bbrkn.conf
RESOLVE_CONF := /tmp/92-resolve-bbrkn.conf
# Генерация конфигов
generate:
@echo ">>> Генерация конфигурационных файлов из $(DOMAINS)"
$(GEN_SCRIPT)
# Тестовый прогон (генерация + просмотр кусков файлов, но без деплоя)
test: generate
@echo ">>> Тестовый прогон (без деплоя)"
@echo "--- IPSET CONFIG ($(IPSET_CONF)) ---"
@head -n 10 $(IPSET_CONF) || true
@echo "... (всего $$(wc -l < $(IPSET_CONF)) строк)"
@echo
@echo "--- RESOLVE CONFIG ($(RESOLVE_CONF)) ---"
@head -n 10 $(RESOLVE_CONF) || true
@echo "... (всего $$(wc -l < $(RESOLVE_CONF)) строк)"
# Проверка: только сводка из generate-configs.sh
check:
@echo ">>> Проверка списка доменов (без генерации файлов)"
$(GEN_SCRIPT) --dry-run
# Деплой на шлюз (Pi-hole)
deploy: generate
@echo ">>> Деплой на шлюз"
$(DEPLOY_SCRIPT)
# Полный цикл: генерация + деплой
all: deploy
# Уборка временных файлов
clean:
@echo ">>> Удаление временных файлов"
@rm -f $(IPSET_CONF) $(RESOLVE_CONF)
.PHONY: generate test check deploy all clean

View file

@ -68,8 +68,6 @@ aurora.web.telegram.org
autoconfig.telegram.org autoconfig.telegram.org
autodiscover.telegram.org autodiscover.telegram.org
bbs.telegram.org bbs.telegram.org
beta.telegram.org
blog.telegram.org
booktracker.org booktracker.org
bt1.t-ru.org bt1.t-ru.org
bt2.rutracker.cc bt2.rutracker.cc

View file

@ -4,48 +4,90 @@ set -euo pipefail
INPUT_FILE="domains.txt" INPUT_FILE="domains.txt"
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"
API_URL="http://10.100.1.2:3000/domains?domain="
# Очистка выходных файлов DRY_RUN=false
: > "$IPSET_CONF" if [[ "${1:-}" == "--dry-run" ]]; then
: > "$RESOLVE_CONF" DRY_RUN=true
fi
echo "Generating configuration files..." 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() { normalize_domain() {
local raw="$1" local raw="$1"
# Удаляем комментарии после домена (inline), обрезаем пробелы raw="$(echo "$raw" | sed -E 's/#.*$//' | awk '{$1=$1};1')" || return 1
raw="$(echo "$raw" | sed -E 's/#.*$//' | awk '{$1=$1};1')"
# Пустые строки отбрасываем
[ -z "$raw" ] && return 1 [ -z "$raw" ] && return 1
# Приводим к нижнему регистру
raw="$(echo "$raw" | tr '[:upper:]' '[:lower:]')" raw="$(echo "$raw" | tr '[:upper:]' '[:lower:]')"
# Удаляем лидирующее "*." (wildcard из пользовательского файла) raw="$(echo "$raw" | sed -E 's/^\*\.\s*//; s/^\.+//; s/\.+$//; s/\.+/./g')"
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-]+)+$' && \ if echo "$raw" | grep -Eq '^[a-z0-9-]+(\.[a-z0-9-]+)+$' && \
echo "$raw" | grep -Eq '\.[a-z]{2,}$'; then echo "$raw" | grep -Eq '\.[a-z]{2,}$'; then
printf '%s' "$raw" printf '%s' "$raw"
return 0
else else
return 1 return 1
fi fi
} }
# Читаем вход и генерируем конфиги # Обработка доменов из входного списка
while IFS= read -r line || [ -n "$line" ]; do while IFS= read -r line || [ -n "$line" ]; do
dom="$(normalize_domain "$line" || true)" dom="$(normalize_domain "$line" || true)"
[ -z "$dom" ] && continue [ -z "$dom" ] && continue
echo "ipset=/$dom/bbrkn" >> "$IPSET_CONF"
echo "server=/$dom/8.8.8.8" >> "$RESOLVE_CONF" 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" done < "$INPUT_FILE"
echo "Configuration files generated:" # Сортировка доменов
echo "- $IPSET_CONF ($(wc -l < "$IPSET_CONF") entries)" mapfile -t ALL_DOMAINS < <(printf "%s\n" "${!EXPANDED[@]}" | sort -u)
echo "- $RESOLVE_CONF ($(wc -l < "$RESOLVE_CONF") entries)"
# Генерация конфигов
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 "========================"