diff --git a/.forgejo/workflows/deploy.yaml b/.forgejo/workflows/deploy.yaml index 93d1b3c..71b987f 100644 --- a/.forgejo/workflows/deploy.yaml +++ b/.forgejo/workflows/deploy.yaml @@ -29,6 +29,8 @@ jobs: # Имя контейнера Pi-hole DOCKER_CONTAINER: pihole + IGNORE_PARTS: "doubleclick google yandex" + steps: - name: Checkout repository uses: actions/checkout@v3 diff --git a/.forgejo/workflows/scheduled-deploy.yaml b/.forgejo/workflows/scheduled-deploy.yaml index 7a3376a..8010cb6 100644 --- a/.forgejo/workflows/scheduled-deploy.yaml +++ b/.forgejo/workflows/scheduled-deploy.yaml @@ -17,6 +17,7 @@ jobs: API_URL: http://10.100.1.2:3000/domains?domain= TARGET_DIR: /opt/appdata/pihole/etc/dnsmasq.d DOCKER_CONTAINER: pihole + IGNORE_PARTS: "doubleclick google yandex" steps: - name: Checkout repository diff --git a/scripts/generate-configs.sh b/scripts/generate-configs.sh index 9ada0c9..218406a 100644 --- a/scripts/generate-configs.sh +++ b/scripts/generate-configs.sh @@ -12,6 +12,9 @@ RESOLVE_CONF="${RESOLVE_CONF:-/tmp/92-resolve-bbrkn.conf}" API_URL="${CHROME_SERVER:-http://127.0.0.1:3000}/domains?domain=" DNS_SERVER="${DNS_SERVER:-8.8.8.8}" +# Игнорируемые части доменов (разделитель — пробел) +IGNORE_PARTS="${IGNORE_PARTS:-}" + # Debug knobs DEBUG="${DEBUG:-0}" DEBUG_LOG="${DEBUG_LOG:-/tmp/generate-configs.debug.log}" @@ -32,7 +35,7 @@ if ! command -v jq >/dev/null 2>&1; then err "jq is required"; exit 2; fi if [ "$DEBUG" != "0" ]; then : > "$DEBUG_LOG"; dbg "Debugging enabled"; fi log "Starting generate-configs.sh" -dbg "ENV: INPUT_FILE=$INPUT_FILE IPSET_CONF=$IPSET_CONF RESOLVE_CONF=$RESOLVE_CONF API_URL=$API_URL DNS_SERVER=$DNS_SERVER DRY_RUN=$DRY_RUN" +dbg "ENV: INPUT_FILE=$INPUT_FILE IPSET_CONF=$IPSET_CONF RESOLVE_CONF=$RESOLVE_CONF API_URL=$API_URL DNS_SERVER=$DNS_SERVER IGNORE_PARTS='$IGNORE_PARTS' DRY_RUN=$DRY_RUN" if ! $DRY_RUN; then : > "$IPSET_CONF" @@ -45,12 +48,16 @@ declare -A SOURCES declare -A ERRORS declare -A VALID_SITES +# для отчёта по игнорируемым доменам +declare -A IGNORED_DOMAINS + total_lines=0 normalized_ok=0 normalized_skip=0 api_success=0 api_error=0 related_total=0 +ignored_total=0 normalize_domain() { local raw="$1" @@ -64,6 +71,18 @@ normalize_domain() { return 0 } +should_ignore_domain() { + local dom="$1" + for part in $IGNORE_PARTS; do + if [[ "$dom" == *"$part"* ]]; then + dbg " -> IGNORE domain '$dom' (matched '$part')" + IGNORED_DOMAINS["$dom"]="$part" + return 0 + fi + done + return 1 +} + if [ ! -f "$INPUT_FILE" ]; then err "Input file not found: $INPUT_FILE" exit 3 @@ -87,6 +106,12 @@ while IFS= read -r line || [ -n "$line" ]; do normalized_ok=$((normalized_ok+1)) dbg " -> NORMALIZED: $dom_norm" + # Игнорируем по подстрокам + if should_ignore_domain "$dom_norm"; then + ignored_total=$((ignored_total+1)) + continue + fi + max_attempts=5 attempt=0 resp="" @@ -155,6 +180,12 @@ while IFS= read -r line || [ -n "$line" ]; do for s in "${subs[@]}"; do nd="$(normalize_domain "$s" || true)" [ -z "$nd" ] && continue + + if should_ignore_domain "$nd"; then + ignored_total=$((ignored_total+1)) + continue + fi + EXPANDED["$nd"]=1 [ -z "${SOURCES[$nd]:-}" ] && SOURCES["$nd"]="related" related_total=$((related_total+1)) @@ -177,6 +208,7 @@ echo "Raw input lines: $raw_total_lines" echo "Processed lines: $total_lines" echo "Normalized OK: $normalized_ok" echo "Normalized skipped: $normalized_skip" +echo "Ignored (by IGNORE_PARTS): $ignored_total" echo echo "API success (sites): $api_success" echo "API error/ignored: $api_error" @@ -185,6 +217,13 @@ echo "Final unique domains: ${#ALL_DOMAINS[@]}" echo echo "---- VALID BASE SITES ----" printf '%s\n' "${!VALID_SITES[@]}" | sort +echo +if [ "$ignored_total" -gt 0 ]; then + echo "---- IGNORED DOMAINS ----" + for d in $(printf '%s\n' "${!IGNORED_DOMAINS[@]}" | sort); do + printf '%s (matched: %s)\n' "$d" "${IGNORED_DOMAINS[$d]}" + done +fi echo "===== END DEBUG REPORT =====" if [ "$DEBUG" != "0" ]; then