adblock: update 4.5.5-6
authorDirk Brenken <redacted>
Tue, 26 May 2026 15:16:35 +0000 (17:16 +0200)
committerDirk Brenken <redacted>
Tue, 26 May 2026 15:17:25 +0000 (17:17 +0200)
- f_search: refactored backup and local block-/allowlist scan to run in parallel
- f_search: raise the search timeout in backups to max. 90 seconds
- f_load: skip f_fetch for search action, no remote download is needed for local lookups
- f_dns: skip destructive paths (file wipe, f_dnsup) for search and report actions
- LuCI: adapt search backend changes in the frontend
- LuCI: minor frontend fixes & improvements

Signed-off-by: Dirk Brenken <redacted>
net/adblock/Makefile
net/adblock/files/adblock.sh

index b270eab38964727e96677c996858f49200a87ae1..fffe8dcb83236ed9b08b4c079072c00cf4da0974 100644 (file)
@@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=adblock
 PKG_VERSION:=4.5.5
-PKG_RELEASE:=5
+PKG_RELEASE:=6
 PKG_LICENSE:=GPL-3.0-or-later
 PKG_MAINTAINER:=Dirk Brenken <dev@brenken.org>
 
index c93f9e7a3cb1c8af3ffedb91c9e430c74c0e58a9..377d6ee652c01de4f1c4d54b3b7e0510b25ce451 100755 (executable)
@@ -135,10 +135,16 @@ f_load() {
 
        # load dns backend and fetch utility
        #
-       if [ "${adb_action}" != "report" ] && [ "${adb_action}" != "mail" ]; then
+       case "${adb_action}" in
+       "report" | "mail") ;;
+       "search")
+               f_dns
+               ;;
+       *)
                f_dns
                f_fetch
-       fi
+               ;;
+       esac
 
        # check if reporting is enabled and tcpdump is available
        #
@@ -497,7 +503,7 @@ f_dns() {
 
        # determine final dns file directory based on dns shifting
        #
-       if [ "${adb_dnsshift}" = "0" ]; then
+       if [ "${adb_dnsshift}" = "0" ] || [ -z "${adb_backupdir}" ]; then
                adb_finaldir="${adb_dnsdir}"
                [ -L "${adb_dnsdir}/${adb_dnsfile}" ] && "${adb_rmcmd}" -f "${adb_dnsdir}/${adb_dnsfile}"
        else
@@ -510,11 +516,13 @@ f_dns() {
                for dir in "${adb_dnsdir:-"/tmp"}" "${adb_backupdir:-"/tmp"}"; do
                        [ ! -d "${dir}" ] && mkdir -p "${dir}"
                done
-               if [ "${adb_dnsflush}" = "1" ] || [ "${free_mem:-"0"}" -lt "64" ]; then
-                       printf '%b' "${adb_dnsheader}" >"${adb_finaldir}/${adb_dnsfile}"
-                       f_dnsup
-               elif [ ! -f "${adb_finaldir}/${adb_dnsfile}" ]; then
-                       printf '%b' "${adb_dnsheader}" >"${adb_finaldir}/${adb_dnsfile}"
+               if [ "${adb_action}" != "search" ] && [ "${adb_action}" != "report" ]; then
+                       if [ "${adb_dnsflush}" = "1" ] || [ "${free_mem:-"0"}" -lt "64" ]; then
+                               printf '%b' "${adb_dnsheader}" >"${adb_finaldir}/${adb_dnsfile}"
+                               f_dnsup
+                       elif [ ! -f "${adb_finaldir}/${adb_dnsfile}" ]; then
+                               printf '%b' "${adb_dnsheader}" >"${adb_finaldir}/${adb_dnsfile}"
+                       fi
                fi
        fi
 
@@ -1456,12 +1464,13 @@ f_switch() {
 # search blocklist for certain (sub-)domains
 #
 f_search() {
-       local rc search res result tmp_result prefix suffix field search_start search_end search_timeout=30 domain="${1}" tld="${1#*.}"
+       local rc cnt res search result result_tmp result_flag result_tc backup_tmp prefix suffix field search_start search_end search_timeout="90" domain="${1}" tld="${1#*.}"
 
-       # prepare result file
+       # prepare result files
        #
-       tmp_result="${adb_rundir}/adblock.search.tmp"
        result="${adb_rundir}/adblock.search"
+       result_tmp="${adb_rundir}/adblock.search.tmp"
+       result_flag="${adb_rundir}/adblock.search.flag"
 
        # input validation
        #
@@ -1520,58 +1529,78 @@ f_search() {
                ;;
        esac
 
-       # initialize tmp_result and start search
+       # initialize result_tmp and start search
        #
-       : >"${tmp_result}"
+       : >"${result_tmp}"
        read -r search_start _ <"/proc/uptime"
        search_start="${search_start%.*}"
 
-       # search recursively for domain and its parent domains until tld is reached
+       # search recursively for max. 3 domain and its parent domains until tld is reached
        #
        while :; do
                search="${domain//./\\.}"
-               res="$("${adb_awkcmd}" -F '/|\"|\t| ' "/^(${prefix}${search}${suffix})$/{i++;if(i<=9){printf \"  + %s\n\",\$${field}}else if(i==10){printf \"  + %s\n\",\"[...]\";exit}}" "${adb_finaldir}/${adb_dnsfile}")"
-               printf '%s\n%s\n%s\n' ":::" "::: domain '${domain}' in active blocklist" ":::" >>"${tmp_result}"
-               printf '%s\n\n' "${res:-"  - no match"}" >>"${tmp_result}"
+               res="$("${adb_awkcmd}" -F '/|\"|\t| ' "/^(${prefix}${search}${suffix})$/{i++;if(i<=3){printf \"  + %s\n\",\$${field}}else if(i==4){printf \"  + %s\n\",\"[...]\";exit}}" "${adb_finaldir}/${adb_dnsfile}")"
+               printf '%s\n%s\n%s\n' ":::" "::: domain '${domain}' in active blocklist" ":::" >>"${result_tmp}"
+               printf '%s\n\n' "${res:-"  - no match"}" >>"${result_tmp}"
                [ "${domain}" = "${tld}" ] && break
                domain="${tld}"
                tld="${domain#*.}"
        done
 
-       # search exactly for domain in backup files and local block-/allowlist
+       # search exactly for the given domain in backup files and local block-/allowlist
        #
        if [ -d "${adb_backupdir}" ]; then
                search="${1//./\\.}"
-               printf '%s\n%s\n%s\n' ":::" "::: domain '${1}' in backups and in local block-/allowlist" ":::" >>"${tmp_result}"
+               printf '%s\n%s\n%s\n' ":::" "::: domain '${1}' in backups and in local block-/allowlist" ":::" >>"${result_tmp}"
+               "${adb_rmcmd}" -f "${result_flag}" "${adb_rundir}"/adblock.search.frag.*
+               result_tc=""
+               cnt="1"
                for file in "${adb_backupdir}/adb_list".*.gz "${adb_blocklist}" "${adb_allowlist}"; do
-                       suffix="${file##*.}"
-                       if [ "${suffix}" = "gz" ]; then
-                               if [ "${adb_tld}" = "1" ]; then
-                                       "${adb_zcatcmd}" "${file}" 2>>"${adb_errorlog}" |
-                                               "${adb_awkcmd}" 'BEGIN{FS="."}{for(f=NF;f>1;f--)printf "%s.",$f;print $1}' |
-                                               "${adb_awkcmd}" -v f="${file##*/}" "BEGIN{rc=1};/^($search|.*\\.${search})$/{i++;if(i<=3){printf \"  + %-30s%s\n\",f,\$1;rc=0}else if(i==4){printf \"  + %-30s%s\n\",f,\"[...]\"}};END{exit rc}" >>"${tmp_result}"
+                       read -r search_end _ </proc/uptime
+                       if [ "$((${search_end%.*} - search_start))" -gt "${search_timeout}" ]; then
+                               result_tc="1"
+                               break
+                       fi
+
+                       # parallel search in backup files and local block-/allowlist,
+                       # exit as soon as a match is found or after 3 matches per file, if more matches are found print truncated result and stop searching further files
+                       (
+                               backup_tmp="${adb_rundir}/adblock.search.frag.$$.${cnt}"
+                               suffix="${file##*.}"
+                               if [ "${suffix}" = "gz" ]; then
+                                       if [ "${adb_tld}" = "1" ]; then
+                                               "${adb_zcatcmd}" "${file}" 2>>"${adb_errorlog}" |
+                                                       "${adb_awkcmd}" 'BEGIN{FS="."}{for(f=NF;f>1;f--)printf "%s.",$f;print $1}' |
+                                                       "${adb_awkcmd}" -v f="${file##*/}" "BEGIN{rc=1};/^($search|.*\\.${search})\$/{i++;if(i<=3){printf \"  + %-30s%s\n\",f,\$1;rc=0}else if(i==4){printf \"  + %-30s%s\n\",f,\"[...]\"}};END{exit rc}" >"${backup_tmp}"
+                                       else
+                                               "${adb_zcatcmd}" "${file}" 2>>"${adb_errorlog}" |
+                                                       "${adb_awkcmd}" -v f="${file##*/}" "BEGIN{rc=1};/^($search|.*\\.${search})\$/{i++;if(i<=3){printf \"  + %-30s%s\n\",f,\$1;rc=0}else if(i==4){printf \"  + %-30s%s\n\",f,\"[...]\"}};END{exit rc}" >"${backup_tmp}"
+                                       fi
+                                       rc="${?}"
                                else
-                                       "${adb_zcatcmd}" "${file}" 2>>"${adb_errorlog}" |
-                                               "${adb_awkcmd}" -v f="${file##*/}" "BEGIN{rc=1};/^($search|.*\\.${search})$/{i++;if(i<=3){printf \"  + %-30s%s\n\",f,\$1;rc=0}else if(i==4){printf \"  + %-30s%s\n\",f,\"[...]\"}};END{exit rc}" >>"${tmp_result}"
+                                       "${adb_awkcmd}" -v f="${file##*/}" "BEGIN{rc=1};/^($search|.*\\.${search})\$/{i++;if(i<=3){printf \"  + %-30s%s\n\",f,\$1;rc=0}else if(i==4){printf \"  + %-30s%s\n\",f,\"[...]\"}};END{exit rc}" "${file}" >"${backup_tmp}"
+                                       rc="${?}"
                                fi
-                               rc="${?}"
-                       else
-                               "${adb_awkcmd}" -v f="${file##*/}" "BEGIN{rc=1};/^($search|.*\\.${search})$/{i++;if(i<=3){printf \"  + %-30s%s\n\",f,\$1;rc=0}else if(i==4){printf \"  + %-30s%s\n\",f,\"[...]\"}};END{exit rc}" "${file}" >>"${tmp_result}"
-                               rc="${?}"
-                       fi
-                       if [ "${rc}" = "0" ]; then
-                               res="true"
-                               read -r search_end _ <"/proc/uptime"
-                               search_end="${search_end%.*}"
-                               if [ "$((search_end - search_start))" -gt "${search_timeout}" ]; then
-                                       printf '%s\n\n' "  - [...]" >>"${tmp_result}"
-                                       break
+                               if [ "${rc}" = "0" ]; then
+                                       : >"${result_flag}"
+                                       "${adb_catcmd}" "${backup_tmp}" >>"${result_tmp}"
                                fi
-                       fi
+                               "${adb_rmcmd}" -f "${backup_tmp}"
+                       ) &
+                       [ "${cnt}" -ge "${adb_cores}" ] && wait -n
+                       cnt="$((cnt + 1))"
                done
-               [ "${res}" != "true" ] && printf '%s\n\n' "  - no match" >>"${tmp_result}"
+               wait
+
+               # if result_tc is set, it means that the search was stopped due to timeout and the result is truncated
+               #
+               if [ -n "${result_tc}" ]; then
+                       printf '%s\n\n' "  - [...]" >>"${result_tmp}"
+               elif [ ! -f "${result_flag}" ]; then
+                       printf '%s\n\n' "  - no match" >>"${result_tmp}"
+               fi
        fi
-       "${adb_mvcmd}" -f "${tmp_result}" "${result}"
+       "${adb_mvcmd}" -f "${result_tmp}" "${result}"
        "${adb_catcmd}" "${result}" 2>>"${adb_errorlog}"
 }
 
@@ -1789,7 +1818,7 @@ f_main() {
                        (
                                f_list safesearch "${entry}"
                        ) &
-                       [ "${cnt}" -gt "${adb_cores}" ] && wait -n
+                       [ "${cnt}" -ge "${adb_cores}" ] && wait -n
                        cnt="$((cnt + 1))"
                done
                wait
@@ -2004,7 +2033,7 @@ f_main() {
                                f_list prepare
                        ) &
                fi
-               [ "${cnt}" -gt "${adb_cores}" ] && wait -n
+               [ "${cnt}" -ge "${adb_cores}" ] && wait -n
                cnt="$((cnt + 1))"
        done
        wait
@@ -2122,7 +2151,7 @@ f_report() {
                                        }
                                ' >"${report_raw}.${cnt}"
                        ) &
-                       [ "${cnt}" -gt "${adb_cores}" ] && wait -n
+                       [ "${cnt}" -ge "${adb_cores}" ] && wait -n
                        cnt="$((cnt + 1))"
                done
                wait
@@ -2296,7 +2325,7 @@ f_report() {
                                        "${adb_fetchcmd}" ${adb_geoparm} "${adb_geourl}/${ip}" 2>>"${adb_errorlog}" |
                                                "${adb_awkcmd}" -v feed="homeIP" '{printf ",{\"%s\": %s}\n",feed,$0}' >"${map_jsn}.${cnt}"
                                ) &
-                               [ "${cnt}" -gt "${adb_cores}" ] && wait -n
+                               [ "${cnt}" -ge "${adb_cores}" ] && wait -n
                                cnt="$((cnt + 1))"
                        done
                        wait
@@ -2320,7 +2349,7 @@ f_report() {
                                                                        "${adb_fetchcmd}" ${adb_geoparm} "${adb_geourl}/${domain}" 2>>"${adb_errorlog}" |
                                                                                "${adb_awkcmd}" -v feed="${domain}" '{printf ",{\"%s\": %s}\n",feed,$0}' >"${map_jsn}.${cnt}"
                                                                ) &
-                                                               [ "${cnt}" -gt "${adb_cores}" ] && wait -n
+                                                               [ "${cnt}" -ge "${adb_cores}" ] && wait -n
                                                                cnt="$((cnt + 1))"
                                                                [ "${cnt}" -ge "45" ] && break
                                                                ;;
git clone https://git.99rst.org/PROJECT