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 или хостов. для обновления списка заблокированных ip или хостов.
Он же вызывается через get_config.sh из запланированных заданий (crontab или systemd timer). Он же вызывается через 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*
По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены.
Выполнить скрипт обновления листа :
/opt/zapret/ipset/get_config.sh
Зашедулить задание обновления листа :
crontab -e
systemctl enable zapret-list-update.timer systemctl enable zapret-list-update.timer
Запустить службу : Запустить службу :
@@ -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
timer info : systemctl list-timer timer info : systemctl list-timer
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.* 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
zypper --non-interactive install curl ipset zypper --non-interactive install curl ipset
Далее все аналогично 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-list-update.service /usr/lib/systemd/system
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.timer /usr/lib/systemd/system ln -fs /opt/zapret/init.d/systemd/zapret-list-update.timer /usr/lib/systemd/system
Arch linux Arch linux
---------- ----------
Построен на базе systemd. Построен на базе systemd.
Установить пакеты : Установить пакеты :
pacman -Syy pacman -Syy
pacman --noconfirm -S ipset curl pacman --noconfirm -S ipset curl
Далее все аналогично debian. Далее все аналогично debian.
@@ -372,12 +380,29 @@ git и curl по умолчанию могут присутствовать, ips
git и curl по умолчанию могут присутствовать, ipset отсутствует. git и curl по умолчанию могут присутствовать, ipset отсутствует.
emerge ipset emerge ipset
Настроить параметры согласно разделу "Выбор параметров".
Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики.
/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 скрипт : Подключить 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
Запустить службу :
rc-service zapret start rc-service zapret start
Шпаргалка по управлению службой : Шпаргалка по управлению службой :
@@ -416,7 +441,7 @@ stop : rc-service zapret stop
Для более гибкой настройки перед запуском инсталятора следует выполнить раздел "Выбор параметров". Для более гибкой настройки перед запуском инсталятора следует выполнить раздел "Выбор параметров".
Если система на базе systemd, но используется не поддерживаемый инсталятором менеджер пакетов Если система на базе systemd, но используется не поддерживаемый инсталятором менеджер пакетов
или названия пакетов не соответствуют прописанным в инсталятор, пакеты нужно установить вручную. или названия пакетов не соответствуют прописанным в инсталятор, пакеты нужно установить вручную.
Требуется : ipset curl Требуется : ipset curl
Фаерволлы Фаерволлы
@@ -508,7 +533,7 @@ ipset можно выкинуть, если не будем пользовать
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* 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/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
} }