hag;tracker.huawei;wildcard/native.huawei-onlydomains.txt
hag;tracker.lgwebos;wildcard/native.lgwebos-onlydomains.txt
hag;tracker.oppo-realme;wildcard/native.oppo-realme-onlydomains.txt
+hag;tracker.roku;wildcard/native.roku-onlydomains.txt
hag;tracker.samsung;wildcard/native.samsung-onlydomains.txt
hag;tracker.tiktok;wildcard/native.tiktok-onlydomains.txt
hag;tracker.tiktok.extended;wildcard/native.tiktok.extended-onlydomains.txt
hag;urlshortener;wildcard/urlshortener-onlydomains.txt
hag;abusetlds;wildcard/spam-tlds-onlydomains.txt
hag;social;wildcard/social-onlydomains.txt
+hag;dga-7days;domains/dga7.txt
+hag;dga-14days;domains/dga14.txt
+hag;dga-30days;domains/dga30.txt
hag;nrd-7days;domains/nrd7.txt
hag;nrd-14days;domains/nrd14-8.txt
hag;nrd-21days;domains/nrd21-15.txt
ipf;phishing;phishing/domains.txt
ipf;piracy;piracy/domains.txt
ipf;porn;porn/domains.txt
+ipf;shopping;shopping/domains.txt
ipf;smart-tv;smart-tv/domains.txt
ipf;social;social/domains.txt
+ipf;streaming;streaming/domains.txt
ipf;violence;violence/domains.txt
stb;standard;hosts
stb;standard-fakenews;alternates/fakenews/hosts
stb;standard-fakenews-gambling;alternates/fakenews-gambling/hosts
stb;standard-fakenews-gambling-porn;alternates/fakenews-gambling-porn/hosts
-stb;standard-fakenews-gambling-porn-social;alternates/fakenews-porn-social/hosts
+stb;standard-fakenews-gambling-porn-social;alternates/fakenews-gambling-porn-social/hosts
stb;standard-fakenews-gambling-social;alternates/fakenews-gambling-social/hosts
stb;standard-fakenews-porn;alternates/fakenews-porn/hosts
stb;standard-fakenews-porn-social;alternates/fakenews-porn-social/hosts
stb;fakenews;alternates/fakenews-only/hosts
stb;fakenews-gambling;alternates/fakenews-gambling-only/hosts
stb;fakenews-gambling-porn;alternates/fakenews-gambling-porn-only/hosts
-stb;fakenews-gambling-porn-social;alternates/fakenews-porn-social-only/hosts
+stb;fakenews-gambling-porn-social;alternates/fakenews-gambling-porn-social-only/hosts
stb;fakenews-gambling-social;alternates/fakenews-gambling-social-only/hosts
stb;fakenews-porn;alternates/fakenews-porn-only/hosts
stb;fakenews-porn-social;alternates/fakenews-porn-social-only/hosts
local cmd pri_cmd="${1}" sec_cmd="${2}"
cmd="$(command -v "${pri_cmd}" 2>/dev/null)"
- if [ ! -x "${cmd}" ]; then
+ if [ -z "${cmd}" ]; then
if [ -n "${sec_cmd}" ]; then
[ "${sec_cmd}" = "optional" ] && return
cmd="$(command -v "${sec_cmd}" 2>/dev/null)"
fi
- if [ -x "${cmd}" ]; then
+ if [ -n "${cmd}" ]; then
printf '%s' "${cmd}"
else
f_log "emerg" "command '${pri_cmd:-"-"}'/'${sec_cmd:-"-"}' not found"
adb_errorlog="/dev/null"
fi
- # fetch installed packages amd system information
+ # fetch installed packages and system information
#
adb_packages="$("${adb_ubuscmd}" -S call rpc-sys packagelist '{ "all": true }' 2>>"${adb_errorlog}")"
adb_bver="$(printf '%s' "${adb_packages}" | "${adb_jsoncmd}" -ql1 -e '@.packages.adblock')"
)
sleep 1
bg_pid="$("${adb_pgrepcmd}" -nf "${adb_reportdir}/adb_report.pcap")"
- f_log "info" "tcpdump backgound process started for interface: ${adb_repiface}, port: ${adb_repport}, dir: ${adb_reportdir}, pid: ${bg_pid}"
+ f_log "info" "tcpdump background process started for interface: ${adb_repiface}, port: ${adb_repport}, dir: ${adb_reportdir}, pid: ${bg_pid}"
else
f_log "info" "please set the reporting interface 'adb_repiface' and reporting directory 'adb_reportdir' manually"
fi
# domain validation
#
f_chkdom() {
- local type prefix column separator check
+ local type prefix column separator
case "${1}" in
"feed" | "local")
;;
esac
- check="${adb_lookupdomain//./\\.}"
- "${adb_awkcmd}" -v type="${type}" -v pre="${prefix}" -v col="${column}" -v chk="${check}" -F "${separator}" '
+ "${adb_awkcmd}" -v type="${type}" -v pre="${prefix}" -v col="${column}" -v chk="${adb_lookupdomain}" -F "${separator}" '
{
domain = $col
# remove carriage returns and trim the input
# check optional search prefix
if (pre != "" && index($0, pre) != 1) next
# skip empty lines, comments and special domains
- if (domain == "" || domain ~ ("^(#|localhost|loopback|" chk ")")) next
+ if (domain == "" || domain ~ /^(#|localhost|loopback)/ || index(domain, chk) == 1) next
# no domain with trailing dot
if (substr(domain, length(domain), 1) == ".") next
# check total length (253 characters)
;;
esac
- if [ -x "$(command -v "${dns}")" ]; then
+ if command -v "${dns}" >/dev/null 2>&1; then
adb_dns="${dns}"
uci_set adblock global adb_dns "${dns}"
f_uci "adblock"
done
fi
- if [ "${adb_dns}" != "raw" ] && [ ! -x "$(command -v "${adb_dns}")" ]; then
+ if [ "${adb_dns}" != "raw" ] && ! command -v "${adb_dns}" >/dev/null 2>&1; then
f_log "err" "dns backend not found, please set 'adb_dns' manually"
fi
}
;;
"unbound")
- adb_dnscachecmd="$(command -v unbound-control)"
+ adb_dnscachecmd="$(f_cmd unbound-control optional)"
adb_dnsinstance=""
adb_dnsuser="unbound"
adb_dnsdir="${adb_dnsdir:-"/var/lib/unbound"}"
}
;;
"named")
- adb_dnscachecmd="$(command -v rndc)"
+ adb_dnscachecmd="$(f_cmd rndc optional)"
adb_dnsinstance=""
adb_dnsuser="bind"
adb_dnsdir="${adb_dnsdir:-"/var/lib/bind"}"
f_fetch() {
local fetch fetch_list insecure update="0"
- adb_fetchcmd="$(command -v "${adb_fetchcmd}")"
- if [ ! -x "${adb_fetchcmd}" ]; then
+ adb_fetchcmd="$(command -v "${adb_fetchcmd}" 2>/dev/null)"
+ if [ -z "${adb_fetchcmd}" ]; then
fetch_list="curl wget-ssl libustream-openssl libustream-wolfssl libustream-mbedtls"
for fetch in ${fetch_list}; do
case "${adb_packages}" in *"\"${fetch}\""*)
fetch="uclient-fetch"
;;
esac
- if [ -x "$(command -v "${fetch}")" ]; then
+ adb_fetchcmd="$(command -v "${fetch}" 2>/dev/null)"
+ if [ -n "${adb_fetchcmd}" ]; then
update="1"
- adb_fetchcmd="$(command -v "${fetch}")"
uci_set adblock global adb_fetchcmd "${fetch}"
f_uci "adblock"
break
done
fi
- [ ! -x "${adb_fetchcmd}" ] && f_log "err" "download utility with SSL support not found, please set 'adb_fetchcmd' manually"
+ [ -z "${adb_fetchcmd}" ] && f_log "err" "download utility with SSL support not found, please set 'adb_fetchcmd' manually"
case "${adb_fetchcmd##*/}" in
"curl")
# compare http code and etag id with stored values, update etag file and return code accordingly
#
- etag_cnt="$("${adb_grepcmd}" -c "^${feed} " "${adb_backupdir}/adblock.etag")"
+ etag_cnt="$("${adb_awkcmd}" -v f="${feed}" '$1 == f { n++ } END { print n+0 }' "${adb_backupdir}/adblock.etag")"
if [ "${http_code}" = "200" ] && [ "${etag_cnt}" = "${feed_cnt}" ] && [ -n "${etag_id}" ] &&
- "${adb_grepcmd}" -q "^${feed} ${feed_suffix}[[:space:]]\+${etag_id}\$" "${adb_backupdir}/adblock.etag"; then
+ "${adb_awkcmd}" -v f="${feed}" -v s="${feed_suffix}" -v e="${etag_id}" '
+ BEGIN { rc = 1; p = f " " s }
+ index($0, p) == 1 {
+ rest = substr($0, length(p) + 1)
+ sub(/^[[:space:]]+/, "", rest)
+ if (rest == e) { rc = 0; exit }
+ }
+ END { exit rc }' "${adb_backupdir}/adblock.etag"; then
out_rc="0"
elif [ -n "${etag_id}" ]; then
# otherwise only remove the entry with the matching feed suffix (feed url) to allow multiple sources for the same feed
#
if [ "${feed_cnt}" -lt "${etag_cnt}" ]; then
- "${adb_sedcmd}" -i "/^${feed} /d" "${adb_backupdir}/adblock.etag"
+ "${adb_awkcmd}" -v f="${feed}" '$1 != f' \
+ "${adb_backupdir}/adblock.etag" >"${adb_backupdir}/adblock.etag.new"
else
- "${adb_sedcmd}" -i "/^${feed} ${feed_suffix//\//\\/}/d" "${adb_backupdir}/adblock.etag"
+ "${adb_awkcmd}" -v f="${feed}" -v s="${feed_suffix}" '
+ BEGIN { p = f " " s }
+ index($0, p) != 1' \
+ "${adb_backupdir}/adblock.etag" >"${adb_backupdir}/adblock.etag.new"
fi
- printf '%-80s%s\n' "${feed} ${feed_suffix}" "${etag_id}" >>"${adb_backupdir}/adblock.etag"
+ "${adb_mvcmd}" -f "${adb_backupdir}/adblock.etag.new" "${adb_backupdir}/adblock.etag"
+ printf '%s\t%s\n' "${feed} ${feed_suffix}" "${etag_id}" >>"${adb_backupdir}/adblock.etag"
out_rc="2"
fi
"boot" | "start" | "restart" | "resume") ;;
*)
- [ -n "${src_name}" ] && [ "${out_rc}" != "0" ] && adb_feed="${adb_feed/${src_name}/}"
+ if [ -n "${src_name}" ] && [ "${out_rc}" != "0" ]; then
+ adb_feed=" ${adb_feed} "
+ adb_feed="${adb_feed// ${src_name} / }"
+ adb_feed="${adb_feed# }"
+ adb_feed="${adb_feed% }"
+ fi
;;
esac
;;
"remove")
"${adb_rmcmd}" "${adb_backupdir}/adb_list.${src_name}.gz" 2>>"${adb_errorlog}"
out_rc="${?}"
- adb_feed="${adb_feed/${src_name}/}"
+ adb_feed=" ${adb_feed} "
+ adb_feed="${adb_feed// ${src_name} / }"
+ adb_feed="${adb_feed# }"
+ adb_feed="${adb_feed% }"
;;
"merge")
src_name=""
# check if feed is defined in configuration, if not remove it from feed list and continue with next one
#
if ! json_select "${src_name}" >/dev/null 2>&1; then
- adb_feed="${adb_feed/${src_name}/}"
+ adb_feed=" ${adb_feed} "
+ adb_feed="${adb_feed// ${src_name} / }"
+ adb_feed="${adb_feed# }"
+ adb_feed="${adb_feed% }"
continue
fi
src_rc="${?}"
if [ "${src_rc}" = "0" ] && [ -s "${src_tmparchive}" ]; then
src_suffix="${adb_src_suffix_utcapitole:-"domains"}"
- src_list="$(tar -tzf "${src_tmparchive}" 2>>"${adb_errorlog}")"
- for src_item in ${src_cat}; do
- src_entries="${src_entries} $(printf '%s' "${src_list}" | "${adb_grepcmd}" -E "${src_item}/${src_suffix}$")"
- done
+ src_entries="$(tar -tzf "${src_tmparchive}" 2>>"${adb_errorlog}" | "${adb_awkcmd}" \
+ -v cats="${src_cat}" -v sfx="${src_suffix}" '
+ BEGIN { n = split(cats, c, " ") }
+ { for (i = 1; i <= n; i++) if ($0 ~ "(^|/)" c[i] "/" sfx "$") print }')"
if [ -n "${src_entries}" ]; then
tar -xOzf "${src_tmparchive}" ${src_entries} 2>>"${adb_errorlog}" >"${src_tmpload}"
src_rc="${?}"
}
next
}
- END {
- # no fallback
- }
' >"${report_raw}.${cnt}"
) &
[ "${cnt}" -gt "${adb_cores}" ] && wait -n