Add support to find all domains
Some checks failed
Deploy DNS Configuration / deploy (push) Failing after 34s
Some checks failed
Deploy DNS Configuration / deploy (push) Failing after 34s
This commit is contained in:
parent
2019a7661d
commit
ec0cfa2adf
4 changed files with 128 additions and 33 deletions
|
|
@ -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
46
Makefile
Normal 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
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 "========================"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue