systemd: use timers instead of cron

This commit is contained in:
bolvan 2019-05-11 20:02:21 +03:00
parent 0ed31488dd
commit a3930e12d9
6 changed files with 156 additions and 50 deletions

View File

@ -246,7 +246,8 @@ TPWS_OPT_HTTP="--hostspell=HOST --split-http-req=method"
TPWS_OPT_HTTPS="--split-pos=3" TPWS_OPT_HTTPS="--split-pos=3"
Параметр GETLIST указывает инсталятору install_easy.sh какой скрипт дергать Параметр GETLIST указывает инсталятору install_easy.sh какой скрипт дергать
для обновления списка заблокированных ip или хостов. Он же вносится в crontab. для обновления списка заблокированных ip или хостов.
Он же вызывается через get_config.sh из запланированных заданий (crontab или systemd timer).
Поместите сюда название скрипта, который будете использовать для обновления листов. Поместите сюда название скрипта, который будете использовать для обновления листов.
Если не нужно, то параметр следует закомментировать. Если не нужно, то параметр следует закомментировать.
@ -286,20 +287,23 @@ TPWS_OPT_HTTPS="--split-pos=3"
Создать ссылку на service unit в systemd : Создать ссылку на service unit в systemd :
ln -fs /opt/zapret/init.d/systemd/zapret.service /lib/systemd/system ln -fs /opt/zapret/init.d/systemd/zapret.service /lib/systemd/system
Удалить старые листы, если они были созданы ранее :
rm /opt/zapret/ipset/zapret-ip.txt* /opt/zapret/ipset/zapret-ip-user.txt* /opt/zapret/ipset/zapret-ip-ipban.txt* /opt/zapret/ipset/zapret-ip-user-ipban.txt* /opt/zapret/ipset/zapret-hosts.txt*
По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены.
Выполнить скрипт обновления листа :
/opt/zapret/ipset/get_config.sh
Настроить таймер systemd для обновления листа :
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.service /lib/systemd/system
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.timer /lib/systemd/system
Принять изменения в systemd : Принять изменения в systemd :
systemctl daemon-reload systemctl daemon-reload
Включить автозапуск службы : Включить автозапуск службы :
systemctl enable zapret systemctl enable zapret
Удалить старые листы, если они были созданы ранее : Включить таймер обновления листа :
rm /opt/zapret/ipset/zapret-ip.txt* /opt/zapret/ipset/zapret-ip-user.txt* /opt/zapret/ipset/zapret-ip-ipban.txt* /opt/zapret/ipset/zapret-ip-user-ipban.txt* /opt/zapret/ipset/zapret-hosts.txt* systemctl enable zapret-list-update.timer
По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены.
Выполнить скрипт обновления листа :
/opt/zapret/ipset/get_config.sh
Зашедулить задание обновления листа :
crontab -e
Создать строчку "0 12 */2 * * /opt/zapret/ipset/get_config.sh"
Запустить службу : Запустить службу :
systemctl start zapret systemctl start zapret
@ -315,14 +319,16 @@ TPWS_OPT_HTTPS="--split-pos=3"
Попробуйте снять дамп в wireshark или "tcpdump -vvv -X host <ip>", посмотрите действительно ли первый Попробуйте снять дамп в wireshark или "tcpdump -vvv -X host <ip>", посмотрите действительно ли первый
сегмент TCP уходит коротким и меняется ли регистр "Host:". сегмент TCP уходит коротким и меняется ли регистр "Host:".
Шпаргалка по управлению службой : Шпаргалка по управлению службой и таймером :
enable auto start : systemctl enable zapret enable auto start : systemctl enable zapret
disable auto start : systemctl disable zapret disable auto start : systemctl disable zapret
start : sytemctl start zapret start : sytemctl start zapret
stop : systemctl stop zapret stop : systemctl stop zapret
status, output messages : systemctl status zapret status, output messages : systemctl status zapret
timer info : systemctl list-timer
delete service : systemctl disable zapret ; rm /lib/systemd/system/zapret.service delete service : systemctl disable zapret ; rm /lib/systemd/system/zapret.service
delete timer : systemctl disable zapret-list-update.timer ; rm /lib/systemd/system/zapret-list-update.*
Centos 7+, Fedora Centos 7+, Fedora
----------------- -----------------
@ -345,18 +351,20 @@ OpenSUSE
Далее все аналогично debian, кроме расположения systemd. Далее все аналогично debian, кроме расположения systemd.
В opensuse он находится не в /lib/systemd, а в /usr/lib/systemd. В opensuse он находится не в /lib/systemd, а в /usr/lib/systemd.
Правильная команда будет : Правильные команды будут :
ln -fs /opt/zapret/init.d/systemd/zapret.service /usr/lib/systemd/system ln -fs /opt/zapret/init.d/systemd/zapret.service /usr/lib/systemd/system
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.service /usr/lib/systemd/system
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.timer /usr/lib/systemd/system
Arch linux Arch linux
---------- ----------
Построен на базе systemd. По умолчанию отсутствует cron. Построен на базе systemd.
Установить пакеты : Установить пакеты :
pacman -Syy pacman -Syy
pacman --noconfirm -S ipset curl cronie pacman --noconfirm -S ipset curl
Далее все аналогично debian. Далее все аналогично debian.
@ -372,12 +380,29 @@ git и curl по умолчанию могут присутствовать, ips
emerge ipset emerge ipset
Подключаем init скрипт : Настроить параметры согласно разделу "Выбор параметров".
Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики.
/opt/zapret/install_bin.sh
АЛЬТЕРНАТИВА : зайти в tpws,nfq,ip2net,mdig, в каждом выполнить make. Получите динамические бинарики под вашу ось.
Удалить старые листы, если они были созданы ранее :
rm /opt/zapret/ipset/zapret-ip.txt* /opt/zapret/ipset/zapret-ip-user.txt* /opt/zapret/ipset/zapret-ip-ipban.txt* /opt/zapret/ipset/zapret-ip-user-ipban.txt* /opt/zapret/ipset/zapret-hosts.txt*
По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены.
Выполнить скрипт обновления листа :
/opt/zapret/ipset/get_config.sh
Зашедулить обновление листа :
crontab -e
Создать строчку "0 12 */2 * * /opt/zapret/ipset/get_config.sh"
Подключить init скрипт :
ln -fs /opt/zapret/init.d/sysv/zapret /etc/init.d ln -fs /opt/zapret/init.d/sysv/zapret /etc/init.d
rc-update add zapret rc-update add zapret
Далее все как в debian, исключая все, касаемое systemd. Запустить службу :
rc-service zapret start
Шпаргалка по управлению службой : Шпаргалка по управлению службой :
@ -416,7 +441,7 @@ stop : rc-service zapret stop
Если система на базе systemd, но используется не поддерживаемый инсталятором менеджер пакетов Если система на базе systemd, но используется не поддерживаемый инсталятором менеджер пакетов
или названия пакетов не соответствуют прописанным в инсталятор, пакеты нужно установить вручную. или названия пакетов не соответствуют прописанным в инсталятор, пакеты нужно установить вручную.
Требуется : ipset curl cron Требуется : ipset curl
Фаерволлы Фаерволлы
--------- ---------
@ -508,7 +533,7 @@ ipset можно выкинуть, если не будем пользовать
По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены. По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены.
Выполнить скрипт обновления листа : Выполнить скрипт обновления листа :
/opt/zapret/ipset/get_config.sh /opt/zapret/ipset/get_config.sh
Зашедулить задание обновления листа : Зашедулить обновление листа :
crontab -e crontab -e
Создать строчку "0 12 */2 * * /opt/zapret/ipset/get_config.sh" Создать строчку "0 12 */2 * * /opt/zapret/ipset/get_config.sh"

View File

@ -0,0 +1,13 @@
[Unit]
Description=zapret ip/host list update
[Service]
Restart=no
IgnoreSIGPIPE=no
KillMode=control-group
GuessMainPID=no
RemainAfterExit=no
ExecStart=/opt/zapret/ipset/get_config.sh
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,11 @@
[Unit]
Description=zapret ip/host list update timer
[Timer]
OnCalendar=*-*-* 00:00:00
RandomizedDelaySec=86400
Persistent=true
Unit=zapret-list-update.service
[Install]
WantedBy=timers.target

View File

@ -227,6 +227,8 @@ check_location()
exitp 3 exitp 3
fi fi
fi fi
local B=$(dirname "$ZAPRET_BASE")
[ -d "$B" ] || mkdir -p "$B"
$1 "$EXEDIR" "$ZAPRET_BASE" $1 "$EXEDIR" "$ZAPRET_BASE"
echo relaunching itself from $ZAPRET_BASE echo relaunching itself from $ZAPRET_BASE
exec $ZAPRET_BASE/$(basename $0) exec $ZAPRET_BASE/$(basename $0)
@ -239,33 +241,11 @@ check_location()
} }
crontab_add()
{
# $1 - hour min
# $2 - hour max
[ -x "$GET_LIST" ] && {
echo \* adding crontab entry
CRONTMP=/tmp/cron.tmp
crontab -l >$CRONTMP
if grep -q "$GET_LIST_PREFIX" $CRONTMP; then
echo some entries already exist in crontab. check if this is corrent :
grep "$GET_LIST_PREFIX" $CRONTMP
else
echo "$(random 0 59) $(random $1 $2) */2 * * $GET_LIST" >>$CRONTMP
crontab $CRONTMP
fi
rm -f $CRONTMP
}
}
check_prerequisites_linux() check_prerequisites_linux()
{ {
echo \* checking prerequisites echo \* checking prerequisites
# arch linux can miss cron if exists ipset && exists curl ; then
if exists ipset && exists curl && exists crontab ; then
echo everything is present echo everything is present
else else
echo \* installing prerequisites echo \* installing prerequisites
@ -274,25 +254,31 @@ check_prerequisites_linux()
YUM=$(whichq yum) YUM=$(whichq yum)
PACMAN=$(whichq pacman) PACMAN=$(whichq pacman)
ZYPPER=$(whichq zypper) ZYPPER=$(whichq zypper)
EOPKG=$(whichq eopkg)
if [ -x "$APTGET" ] ; then if [ -x "$APTGET" ] ; then
"$APTGET" update "$APTGET" update
"$APTGET" install -y --no-install-recommends ipset curl dnsutils cron || { "$APTGET" install -y --no-install-recommends ipset curl dnsutils || {
echo could not install prerequisites echo could not install prerequisites
exitp 6 exitp 6
} }
elif [ -x "$YUM" ] ; then elif [ -x "$YUM" ] ; then
"$YUM" -y install curl ipset cronie || { "$YUM" -y install curl ipset || {
echo could not install prerequisites echo could not install prerequisites
exitp 6 exitp 6
} }
elif [ -x "$PACMAN" ] ; then elif [ -x "$PACMAN" ] ; then
"$PACMAN" -Syy "$PACMAN" -Syy
"$PACMAN" --noconfirm -S ipset curl cronie || { "$PACMAN" --noconfirm -S ipset curl || {
echo could not install prerequisites echo could not install prerequisites
exitp 6 exitp 6
} }
elif [ -x "$ZYPPER" ] ; then elif [ -x "$ZYPPER" ] ; then
"$ZYPPER" --non-interactive install ipset curl cron || { "$ZYPPER" --non-interactive install ipset curl || {
echo could not install prerequisites
exitp 6
}
elif [ -x "$EOPKG" ] ; then
"$EOPKG" -y install ipset curl || {
echo could not install prerequisites echo could not install prerequisites
exitp 6 exitp 6
} }
@ -331,12 +317,31 @@ service_start_systemd()
{ {
echo \* starting zapret service echo \* starting zapret service
systemctl start zapret || { "$SYSTEMCTL" start zapret || {
echo could not start zapret service echo could not start zapret service
exitp 30 exitp 30
} }
} }
timer_install_systemd()
{
echo \* installing zapret-list-update timer
"$SYSTEMCTL" disable zapret-list-update.timer
"$SYSTEMCTL" stop zapret-list-update.timer
ln -fs "$EXEDIR/init.d/systemd/zapret-list-update.service" "$SYSTEMD_SYSTEM_DIR"
ln -fs "$EXEDIR/init.d/systemd/zapret-list-update.timer" "$SYSTEMD_SYSTEM_DIR"
"$SYSTEMCTL" daemon-reload
"$SYSTEMCTL" enable zapret-list-update.timer || {
echo could not enable zapret-list-update.timer
exitp 20
}
"$SYSTEMCTL" start zapret-list-update.timer || {
echo could not start zapret-list-update.timer
exitp 30
}
}
download_list() download_list()
{ {
[ -x "$GET_LIST" ] && { [ -x "$GET_LIST" ] && {
@ -353,6 +358,42 @@ download_list()
} }
} }
crontab_del_quiet()
{
exists crontab || return
CRONTMP=/tmp/cron.tmp
crontab -l >$CRONTMP
if grep -q "$GET_IPLIST_PREFIX" $CRONTMP; then
grep -v "$GET_IPLIST_PREFIX" $CRONTMP >$CRONTMP.2
crontab $CRONTMP.2
rm -f $CRONTMP.2
fi
rm -f $CRONTMP
}
crontab_add()
{
# $1 - hour min
# $2 - hour max
[ -x "$GET_LIST" ] && {
echo \* adding crontab entry
CRONTMP=/tmp/cron.tmp
crontab -l >$CRONTMP
if grep -q "$GET_LIST_PREFIX" $CRONTMP; then
echo some entries already exist in crontab. check if this is corrent :
grep "$GET_LIST_PREFIX" $CRONTMP
else
echo "$(random 0 59) $(random $1 $2) */2 * * $GET_LIST" >>$CRONTMP
crontab $CRONTMP
fi
rm -f $CRONTMP
}
}
install_systemd() install_systemd()
{ {
INIT_SCRIPT_SRC=$EXEDIR/init.d/sysv/zapret INIT_SCRIPT_SRC=$EXEDIR/init.d/sysv/zapret
@ -364,15 +405,16 @@ install_systemd()
ask_config ask_config
service_install_systemd service_install_systemd
download_list download_list
# desktop system : likely it will be up at daytime # in case its left from old version of zapret
crontab_add 9 21 crontab_del_quiet
# now we use systemd timers
timer_install_systemd
service_start_systemd service_start_systemd
} }
check_kmod() check_kmod()
{ {
[ -f "/lib/modules/$(uname -r)/$1.ko" ] [ -f "/lib/modules/$(uname -r)/$1.ko" ]

View File

@ -7,4 +7,4 @@ EXEDIR=$(dirname "$SCRIPT")
. "$EXEDIR/../config" . "$EXEDIR/../config"
[ -z "$GETLIST" ] && exit 0 [ -z "$GETLIST" ] && exit 0
[ -x "$EXEDIR/$GETLIST" ] && "$EXEDIR/$GETLIST" [ -x "$EXEDIR/$GETLIST" ] && exec "$EXEDIR/$GETLIST"

View File

@ -60,6 +60,8 @@ check_system()
crontab_del() crontab_del()
{ {
exists crontab || return
echo \* removing crontab entry echo \* removing crontab entry
CRONTMP=/tmp/cron.tmp CRONTMP=/tmp/cron.tmp
@ -92,6 +94,18 @@ service_remove_systemd()
"$SYSTEMCTL" daemon-reload "$SYSTEMCTL" daemon-reload
} }
timer_remove_systemd()
{
echo \* removing zapret-list-update timer
"$SYSTEMCTL" daemon-reload
"$SYSTEMCTL" disable zapret-list-update.timer
"$SYSTEMCTL" stop zapret-list-update.timer
rm -f "$SYSTEMD_SYSTEM_DIR/zapret-list-update.service" "$SYSTEMD_SYSTEM_DIR/zapret-list-update.timer"
"$SYSTEMCTL" daemon-reload
}
remove_systemd() remove_systemd()
{ {
@ -100,7 +114,8 @@ remove_systemd()
service_stop_systemd service_stop_systemd
service_remove_systemd service_remove_systemd
crontab_del timer_remove_systemd
crontab_del
} }