LINUX.ORG.RU

Исключения при сортировке

 , , ,


1

1

Блокирую рекламные домены на роутере с развернутым entware. Есть скрипт который качает список_блокировки.txt собранный васянами

#!/bin/sh

curl --compressed https://adaway.org/hosts.txt \
| awk '{sub("\r$", ""); sub("^www\\.", "", $2); if ($0 && $0 !~ /^#/ && $2 && $2 !~ /^$/ && $2 != "localhost") print "server=/." $2 "/";}' \
| sort -u > /opt/etc/adblock.dnsmasq

if [ ! -e "/opt/etc/init.d/S56dnsmasq" ]; then
  restart_dhcpd
else
  /opt/etc/init.d/S56dnsmasq restart
fi

и формирует список исключений для dnsmasq вида

server=/reklama.zadolbala.com/

Список не плох, но васяны мечтают заблокировать весь мир и понапихали в список чего непопадя, поэтому хотелось бы некоторые домены из списка не учитывать при формировании списка для dnsmasq. Как лучше реализовать это в рамках данного скрипта?



Последнее исправление: Grantrol (всего исправлений: 4)

Делаешь белый список в отдельном файле (одна подстрока на строку), потом пайпишь дополнительно с grep -vFf white_list_file. Еще не забудь закрывающую одинарную кавычку в своем скрипте.

lu4nik ★★★
()

некоторые домены из списка не учитывать

Даже интересно, какие домены могли из этого списка понадобиться.

gedisdone ★★★
()
Ответ на: комментарий от legolegs

Извиняюсь, криво закопипастил. Отредактировал.

Grantrol
() автор топика
Ответ на: комментарий от Grantrol

Так что ли?

#!/bin/sh

curl --compressed https://adaway.org/hosts.txt \
| awk '{sub("\r$", ""); sub("^www\\.", "", $2); if ($0 && $0 !~ /^#/ && $2 && $2 !~ /^$/ && $2 != "localhost") print "server=/." $2 "/";}' \
| grep -vFf > /opt/etc/white_list_file
| sort -u > /opt/etc/adblock.dnsmasq

if [ ! -e "/opt/etc/init.d/S56dnsmasq" ]; then
  restart_dhcpd
else
  /opt/etc/init.d/S56dnsmasq restart
fi
Grantrol
() автор топика

Да подавитесь. Сортирует 2:39 минут, зато результат - загляденье. Никаким sort-ом так не отсортируешь.

#!/usr/bin/env bash

REMOVE=(
ssl.google-analytics.com
video-stats.video.google.com
)

declare -Ai A
declare -a in
declare -ai x
declare -i i

set -f

# compare function.
q_cmp() {
	local IFS=.
	local -a d1 d2
	local -i i j
	d1=(${in[$1]})
	d2=(${in[$2]})
	for ((i = ${#d1[@]}-1, j = ${#d2[@]}-1; ; i--, j--)); do
		[[ i -lt 0 ]] && return 0
		[[ j -lt 0 ]] && return 1
		[[ ${d1[i]} < ${d2[j]} ]] && return 0
		[[ ${d1[i]} > ${d2[j]} ]] && return 1
	done
}

qsort() {
   local -i n k

   if [[ $2 ]]; then
	local -ai x
	for i in ${l[@]:1:$2-1}; do
		if q_cmp $i $1; then
			x[n++]=i
		else
			l[k++]=i
		fi
	done

	case ${n:-1} in
	 1) ;;
	 2) q_cmp ${x[1]} ${x[0]} && { i=x[0]; x[0]=x[1]; x[1]=i; };;
	 *) qsort ${x[0]};;
	esac
	case $k in
	 '') l=(${x[@]} $1);;
	 1) l=(${x[@]} $1 ${l[0]});;
	 2) q_cmp ${l[1]} ${l[0]}; l=(${x[@]} $1 ${l[$?^1]} ${l[$?]});;
	 *) qsort ${l[0]} $k; l=(${x[@]} $1 ${l[@]:0:k});;
	esac
   else
	local -ai l
	for i in ${x[@]:1}; do
		if q_cmp $i $1; then
			x[n++]=i
		else
			l[k++]=i
		fi
	done

	case $n in
	 '') x=();;
	 1) x=(${x[0]});;
	 2) q_cmp ${x[1]} ${x[0]}; x=(${x[$?^1]} ${x[$?]});;
	 *) x=(${x[@]:0:n}); qsort ${x[0]};;
	esac
	case $k in
	 '') x[n]=$1;;
	 1) x+=($1 ${l[0]});;
	 2) q_cmp ${l[1]} ${l[0]}; x+=($1 ${l[$?^1]} ${l[$?]});;
	 *) qsort ${l[0]} $k; x+=($1 ${l[@]});;
	esac
   fi
}

while read ip fqn; do
	[[ -z $ip || -z $fqn || ${ip:0:1} = '#' || $fqn = localhost ]] && continue
	for r in "${REMOVE[@]}"; do
		[[ $r = "$fqn" ]] && continue 2
	done
	A["$fqn"]=1
done < <(curl --compressed https://adaway.org/hosts.txt | tr -d '\r')

in=("${!A[@]}")
x=("${!in[@]}")
[[ ${#x[*]} -gt 1 ]] && qsort 0

for r in ${x[@]}; do
	echo "server=/${in[r]}/"
done > /opt/etc/adblock.dnsmasq

vodz ★★★★★
()
Ответ на: комментарий от Grantrol

Чего-то не выполняется.

Если оно не понимает скобочку, то у вас не bash, хотя в тегах заявлен он.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Padavan. Я не думал что там есть какие-то серьезные отличия.

/opt/home/admin # bash


BusyBox v1.30.1 (2019-05-10 22:31:41 MSK) built-in shell (ash)
Enter 'help' for a list of built-in commands.```
Grantrol
() автор топика
Ответ на: комментарий от Grantrol

Прошивка от какого-то padavan.

А я про то, что bash больше всего busybox вместе взятого и padavan ваш вовсе не при чём. Отличия там в принципе огромные.

vodz ★★★★★
()

Я бы запилил список с доменами, которые блокировать не следует, а потом бы использовал его в grep -v.

список исключений для dnsmasq вида

Он может работать с файлами в hosts-формате, меньше парсить придется, пишете в конфиг addn-hosts=/opt/etc/adblock.dnsmasq (ну или какой там путь у вас).

Рекомендую поднять на том айпишнике, куда вы редиректите запросы, простенький вебсервер (я использую встроенный в питон), который будет отвечать на запросы - отдавать файлики с закомментированной строкой (чтоб он не был пустой) на *.html\*.js\*.css, однопиксельные gif\png\jpeg (прозрачные там где это поддерживается), ну и потом посмотреть логи и добавить что потребуется - без этого периодически сталкивался с проблемами типа "попробовали запустить рекламу, отвалились с таймаутом - надо все блокировать и ругаться" (особенно на мобильных приложениях).

anonymous
()
Ответ на: комментарий от vodz

Это, конечно, круто, но я ничего не понял.

Grantrol
() автор топика
Ответ на: комментарий от anonymous

Рекомендую поднять на том айпишнике, куда вы редиректите запросы, простенький вебсервер (я использую встроенный в питон), который будет отвечать на запросы - отдавать файлики с закомментированной строкой (чтоб он не был пустой) на *.html\*.js\*.css, однопиксельные gif\png\jpeg

Ну лет так 10 назад это было правильно, а теперь разве в условиях повального https это работает?

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

Ну вот теперь буду знать. Много что в скрипте переписывать придется под ash?

Вот то что умеет этот шел:

Built-in commands:
------------------
        . : [ [[ alias bg break cd chdir continue echo eval exec exit
        export false fg hash help history jobs kill let local printf
        pwd read readonly return set shift source test times trap true
        type ulimit umask unalias unset wait
Grantrol
() автор топика
Последнее исправление: Grantrol (всего исправлений: 1)
Ответ на: комментарий от Grantrol

Много что в скрипте переписывать придется под ash?

Мой скрипт не получится просто переписать, ибо бессмысленно, он будет ещё раз так в несколько тормознее. Попробуйте изучить awk, так всего-то надо в ваш изначальный скрипт добавить цикл сравнений с вашими исключениями. Да и чем вам grep -v, что тут советуют не угодил?

vodz ★★★★★
()
Ответ на: комментарий от vodz

Да не получается что-то. Вот такая конструкция не работает:

#!/bin/sh

curl --compressed https://adaway.org/hosts.txt \
| grep -vFf /opt/etc/white_list.txt
| awk '{sub("\r$", ""); sub("^www\\.", "", $2); if ($0 && $0 !~ /^#/ && $2 && $2 !~ /^$/ && $2 != "localhost") print "server=/." $2 "/";}' \
| sort -u > /opt/etc/adblock.dnsmasq

if [ ! -e "/opt/etc/init.d/S56dnsmasq" ]; then
  restart_dhcpd
else
  /opt/etc/init.d/S56dnsmasq restart
fi

Выдает в конце

/opt/bin/adblock_update.sh: line 5: syntax error: unexpected "|"

очищает файл white_list.txt и не применяет исключения прописанные там.

Grantrol
() автор топика
Последнее исправление: Grantrol (всего исправлений: 1)
Ответ на: комментарий от vodz

Точно. Спасибо, теперь все работает как надо.

Grantrol
() автор топика

Вот рабочий скрипт с белым списком, если вдруг кому-то нужно будет.

#!/bin/sh

curl --compressed https://adaway.org/hosts.txt \
| grep -vFf /opt/etc/white_list.txt \
| awk '{sub("\r$", ""); sub("^www\\.", "", $2); if ($0 && $0 !~ /^#/ && $2 && $2 !~ /^$/ && $2 != "localhost") print "server=/." $2 "/";}' \
| sort -u > /opt/etc/adblock.dnsmasq

if [ ! -e "/opt/etc/init.d/S56dnsmasq" ]; then
  restart_dhcpd
else
  /opt/etc/init.d/S56dnsmasq restart
fi
Grantrol
() автор топика
Ответ на: комментарий от Grantrol

Вот рабочий скрипт с белым списком

Собственно я написал тот свой по причине, что sort здесь делает только хуже, оригинальная сортировка красивее, нагляднее и при наличии кешируещего DNS-а еще и быстрее прорезольвится. Оригинал сделан скорее всего руками — не на 100% точный по сортировке, есть несколько повторов. Но повторы можно вылечить командой uniq.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

Да нету там повторяющихся строк, если я правильно команду ввел.

/opt/home/admin # uniq -d /opt/etc/adblock.dnsmasq

Дает пустой выхлоп.

Grantrol
() автор топика
Последнее исправление: Grantrol (всего исправлений: 1)
Ответ на: комментарий от Grantrol

После sort -u их не будет. Но оригинал содержит две app.adjust.com

vodz ★★★★★
()
Ответ на: комментарий от Grantrol

Вот рабочий скрипт с белым списком, если вдруг кому-то нужно будет.

Вот быстрый, с правильной сортировкой доменов, на ash без awk/grep и файла со списком (список внутри скрипта).

REMOVE="localhost ssl.google-analytics.com video-stats.video.google.com"

revd() {
        local l="$1" o s
        while true; do
                s=${l%%$2*}
                o=$s${o:+$3}$o
                [ "x$s" = "x$l" ] && break
                l=${l#$s$2}
        done
        echo "$4$o"
}

curl --compressed https://adaway.org/hosts.txt \
| while read ip fqn; do
        [ -z "$ip" ] && continue
        l=${ip#?}
        [ "x${ip%"$l"}"  = 'x#' ] && continue
        for r in $REMOVE; do
                [ "x$r" = "x$fqn" ] && continue 2
        done
        revd "$fqn" . ' '
done | sort -u | while read r; do revd "$r" ' ' . server=; done > /opt/etc/adblock.dnsmasq

if [ ! -e "/opt/etc/init.d/S56dnsmasq" ]; then
  restart_dhcpd
else
  /opt/etc/init.d/S56dnsmasq restart
fi

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 4)
14 августа 2020 г.
Ответ на: комментарий от vodz

Решил тут вдруг перейти на другой список блокировки. Но там список немного по-другому сформирован. В использованном мною списке строки идут формата

127.0.0.1 reklama.zadolbala

а я хочу использовать этот список. В нем строки идут формата

0.0.0.0 reklama.zadolbala

Надо как-то отредактировать в скрипте строку awk, но не могу сообразить как правильно.

#!/bin/sh
curl --compressed https://schakal.ru/hosts/hosts.txt \
| grep -vFf /opt/etc/white_list.txt \
| awk '{sub("\r$", ""); sub("^www\\.", "", $2); if ($0 && $0 !~ /^#/ && $2 && $2 !~ /^$/ && $2 != "localhost") print "server=/." $2 "/";}' \
| sort -u > /opt/etc/adblock.dnsmasq

if [ ! -e "/opt/etc/init.d/S56dnsmasq" ]; then
  restart_dhcpd
else
  /opt/etc/init.d/S56dnsmasq restart
fi
Grantrol
() автор топика
Ответ на: комментарий от vodz

ошибку выдает

/opt/bin/adblock_update.sh: line 5: syntax error: unexpected "|"

И потом там в строчке есть упоминание про локалхост, а 0.0.0.0 вроде как не он.

Grantrol
() автор топика
Последнее исправление: Grantrol (всего исправлений: 1)
Ответ на: комментарий от Grantrol

ошибку выдает

Ну у вас строка разорвалась на две. Надо б изучать инструменты, которыми пользуетесь.

И потом там в строчке есть упоминание про локалхост, а 0.0.0.0 вроде как не он.

Там localhost для исключения localhost из файла как имя хоста. Он есть в обоих списках, так как это hosts, а не список для фильтрации.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

ну хорошо, и в каком же месте она разорвалась? У меня никаких разрывов. С одним списком блокировки все нормально, со вторым ошибка.

#!/bin/sh

curl --compressed https://schakal.ru/hosts/hosts.txt \
#curl --compressed https://adaway.org/hosts.txt \
| grep -vFf /opt/etc/white_list.txt \
| awk '{sub("\r$", ""); sub("^www\\.", "", $2); if ($0 && $0 !~ /^#/ && $2 && $2 !~ /^$/ && $2 != "localhost") print "server=/." $2 "/";}' \
| sort -u > /opt/etc/adblock.dnsmasq

if [ ! -e "/opt/etc/init.d/S56dnsmasq" ]; then
  restart_dhcpd
else
  /opt/etc/init.d/S56dnsmasq restart
fi
Grantrol
() автор топика
Ответ на: комментарий от Grantrol

ну хорошо, и в каком же месте она разорвалась?

Оно вам даже номер сказало. в пятой строке у вас получилась команда с '|' в начале. Поместите второй curl как комментарий наверх первым и всё заработает.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Чтобы темы не плодить, каким образом можно узнать что потребляет память? Ежедневно ОЗУ куда-то утекает, никогда такого не было и вот опять. Подозрения что началось это обновления из entware.

Grantrol
() автор топика
Ответ на: комментарий от Grantrol

Ну, очевидно, надо мониторить долгоживущие процессы и писать разработчикам. В busybox сейчас мода отказываться от fork, но о освобождении памяти там думают в последнюю очередь.

vodz ★★★★★
()
Ответ на: комментарий от vodz

С потреблением памяти процессами вроде все нормально.

              total        used        free      shared  buff/cache   available
Mem:         256104      154476       47904           0       53724           0
-/+ buffers/cache:       154476      101628
Swap:             0           0           0
CPU:  0.0% usr  0.0% sys  0.0% nic 99.6% idle  0.0% io  0.0% irq  0.1% sirq
Load average: 0.04 0.03 0.01 2/71 32271
  PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND
  473     1 admin    S     4088  1.5   3  0.1 /usr/sbin/httpd -s 443
  534     1 admin    S     657m262.4   3  0.0 dnscrypt-proxy -config /opt/etc/dnscrypt-proxy.toml
 7761     1 admin    S    35448 13.8   2  0.0 tor -f /opt/etc/tor/torrc
27949     1 nobody   S    15340  5.9   0  0.0 /usr/sbin/dnsmasq
  481     1 admin    S     3760  1.4   1  0.0 /usr/sbin/sshd -o PasswordAuthentication=no
32264   481 admin    S     3748  1.4   0  0.0 sshd: admin@pts/0
26426     1 admin    S     3476  1.3   3  0.0 /bin/inadyn --config /etc/inadyn.conf
  585     1 admin    S     3344  1.3   1  0.0 /opt/bin/iperf3 -s -D
  558     1 admin    S     2344  0.9   2  0.0 cron -s
  492     1 admin    S     1880  0.7   3  0.0 /sbin/rstats
  483     1 admin    S     1736  0.6   0  0.0 /sbin/watchdog
    1     0 admin    S     1736  0.6   0  0.0 /sbin/init
  442     1 admin    S     1728  0.6   2  0.0 /sbin/detect_internet
  440     1 admin    S     1728  0.6   0  0.0 /sbin/detect_link
  468     1 admin    S     1720  0.6   1  0.0 /usr/sbin/pppd file /tmp/ppp/options.wan0
32266 32264 admin    S     1720  0.6   0  0.0 -sh
  495     1 admin    S     1692  0.6   0  0.0 /bin/sh
32271 32266 admin    R     1688  0.6   1  0.0 top
  456     1 admin    S     1684  0.6   3  0.0 /sbin/udhcpc -i eth3 -s /tmp/udhcpc.script -p /var/run/udhcpc0.pid -t4 -T4
  391     1 admin    S     1680  0.6   2  0.0 /sbin/syslogd -s1024 -b0 -S -D -O /tmp/syslog.log
  475     1 admin    S     1680  0.6   1  0.0 telnetd
  393     1 admin    S     1676  0.6   1  0.0 /sbin/klogd
  488     1 admin    S     1348  0.5   3  0.0 /bin/lld2d br0
  490     1 admin    S     1240  0.4   1  0.0 /usr/sbin/networkmap -w
  420     2 admin    SW       0  0.0   2  0.0 [RtmpMlmeTask]
  419     2 admin    SW       0  0.0   2  0.0 [RtmpCmdQTask]
   13     2 admin    SW       0  0.0   2  0.0 [ksoftirqd/2]
  500     2 admin    SW       0  0.0   2  0.0 [ubi_bgt0d]
  399     2 admin    SW       0  0.0   1  0.0 [RtmpMlmeTask]
    9     2 admin    SW       0  0.0   1  0.0 [ksoftirqd/1]
  260     2 admin    SW       0  0.0   1  0.0 [kworker/1:1]
  259     2 admin    SW       0  0.0   2  0.0 [kworker/2:1]
  258     2 admin    SW       0  0.0   3  0.0 [kworker/3:1]
   11     2 admin    SW       0  0.0   2  0.0 [migration/2]
   10     2 admin    SW       0  0.0   0  0.0 [kworker/0:1]
  516     2 admin    SW       0  0.0   1  0.0 [ubifs_bgt0_0]
    7     2 admin    SW       0  0.0   1  0.0 [migration/1]
   16     2 admin    SW       0  0.0   3  0.0 [ksoftirqd/3]
    5     2 admin    SW       0  0.0   0  0.0 [kworker/u:0]
    6     2 admin    SW       0  0.0   0  0.0 [migration/0]
   14     2 admin    SW       0  0.0   3  0.0 [migration/3]
    3     2 admin    SW       0  0.0   0  0.0 [ksoftirqd/0]
    8     2 admin    SW       0  0.0   1  0.0 [kworker/1:0]
  141     2 admin    SW       0  0.0   1  0.0 [fsnotify_mark]
   97     2 admin    SW       0  0.0   0  0.0 [sync_supers]
    2     0 admin    SW       0  0.0   1  0.0 [kthreadd]

Из entware установлен tor, dnsmasq, dnscrypt, крутиться кое-какие скрипты, кое-что через крон автоматизировано. Но память ежедневно куда-то утекает.

Grantrol
() автор топика
Ответ на: комментарий от vodz

В том и дело что изменений существенных с потреблением памяти процессами не происходит, но память утекает.

Grantrol
() автор топика
Ответ на: комментарий от Grantrol

В том и дело что изменений существенных с потреблением памяти процессами не происходит, но память утекает.

Это взаимопротиворечивое бла-бла.

vodz ★★★★★
()
Ответ на: комментарий от vodz

В смысле? Я выложил выхлоп комманд top и free с одного роутера в один момент времени, это они выводят взаимоисключающие данные. В выхлопе top нет процесса который потреблял бы столько памяти, сколько израсходовано в выхлопе free. Можешь посчитать на калькуляторе. Поэтому и не понятно.

Grantrol
() автор топика
Ответ на: комментарий от Grantrol

В выхлопе top нет процесса который потреблял бы столько памяти,

Выражение «течёт память» означает, что свободная память с течением времени уменьшается. Потому и вам предложен мониторинг.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от Grantrol

куда-то утекает.

657m262.4 3 0.0 dnscrypt-proxy -config /opt/etc/dnscrypt-proxy.toml

657m

Куда же утекает память? Давайте-ка подумаем. Кастаните кто-нибудь Линуса, без него не разгадать эту загадку.

anonymous
()
Ответ на: комментарий от vodz

dnscrypt-proxy2 ее потребляет. Перезапуск процесса освобождает оперативу. Пока в кроне задал перезапуск процесса раз в неделю, но думаю это не очень правильный костыль. Может в настройках что подшаманить можно?

Grantrol
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.