From a3930e12d965f2eb164737bc8c398881fd1ca4fe Mon Sep 17 00:00:00 2001 From: bolvan Date: Sat, 11 May 2019 20:02:21 +0300 Subject: [PATCH] systemd: use timers instead of cron --- docs/readme.txt | 59 ++++++++---- init.d/systemd/zapret-list-update.service | 13 +++ init.d/systemd/zapret-list-update.timer | 11 +++ install_easy.sh | 104 +++++++++++++++------- ipset/get_config.sh | 2 +- uninstall_easy.sh | 17 +++- 6 files changed, 156 insertions(+), 50 deletions(-) create mode 100644 init.d/systemd/zapret-list-update.service create mode 100644 init.d/systemd/zapret-list-update.timer diff --git a/docs/readme.txt b/docs/readme.txt index a77dab1..13fbf9e 100644 --- a/docs/readme.txt +++ b/docs/readme.txt @@ -246,7 +246,8 @@ TPWS_OPT_HTTP="--hostspell=HOST --split-http-req=method" TPWS_OPT_HTTPS="--split-pos=3" Параметр 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 : 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 : systemctl daemon-reload Включить автозапуск службы : 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 - Создать строчку "0 12 */2 * * /opt/zapret/ipset/get_config.sh" +Включить таймер обновления листа : + systemctl enable zapret-list-update.timer Запустить службу : systemctl start zapret @@ -315,14 +319,16 @@ TPWS_OPT_HTTPS="--split-pos=3" Попробуйте снять дамп в wireshark или "tcpdump -vvv -X host ", посмотрите действительно ли первый сегмент TCP уходит коротким и меняется ли регистр "Host:". -Шпаргалка по управлению службой : +Шпаргалка по управлению службой и таймером : enable auto start : systemctl enable zapret disable auto start : systemctl disable zapret start : sytemctl start zapret stop : systemctl stop zapret status, output messages : systemctl status zapret +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.* Centos 7+, Fedora ----------------- @@ -345,18 +351,20 @@ OpenSUSE Далее все аналогично debian, кроме расположения 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 Arch linux ---------- -Построен на базе systemd. По умолчанию отсутствует cron. +Построен на базе systemd. Установить пакеты : pacman -Syy - pacman --noconfirm -S ipset curl cronie + pacman --noconfirm -S ipset curl Далее все аналогично debian. @@ -372,12 +380,29 @@ git и curl по умолчанию могут присутствовать, ips 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 rc-update add zapret -Далее все как в debian, исключая все, касаемое systemd. +Запустить службу : + + rc-service zapret start Шпаргалка по управлению службой : @@ -416,7 +441,7 @@ stop : rc-service zapret stop Если система на базе systemd, но используется не поддерживаемый инсталятором менеджер пакетов или названия пакетов не соответствуют прописанным в инсталятор, пакеты нужно установить вручную. -Требуется : ipset curl cron +Требуется : ipset curl Фаерволлы --------- @@ -508,7 +533,7 @@ ipset можно выкинуть, если не будем пользовать По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены. Выполнить скрипт обновления листа : /opt/zapret/ipset/get_config.sh -Зашедулить задание обновления листа : +Зашедулить обновление листа : crontab -e Создать строчку "0 12 */2 * * /opt/zapret/ipset/get_config.sh" diff --git a/init.d/systemd/zapret-list-update.service b/init.d/systemd/zapret-list-update.service new file mode 100644 index 0000000..eeee1b0 --- /dev/null +++ b/init.d/systemd/zapret-list-update.service @@ -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 diff --git a/init.d/systemd/zapret-list-update.timer b/init.d/systemd/zapret-list-update.timer new file mode 100644 index 0000000..3035531 --- /dev/null +++ b/init.d/systemd/zapret-list-update.timer @@ -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 diff --git a/install_easy.sh b/install_easy.sh index c5f8778..35e5490 100755 --- a/install_easy.sh +++ b/install_easy.sh @@ -227,6 +227,8 @@ check_location() exitp 3 fi fi + local B=$(dirname "$ZAPRET_BASE") + [ -d "$B" ] || mkdir -p "$B" $1 "$EXEDIR" "$ZAPRET_BASE" echo relaunching itself from $ZAPRET_BASE 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() { echo \* checking prerequisites - # arch linux can miss cron - if exists ipset && exists curl && exists crontab ; then + if exists ipset && exists curl ; then echo everything is present else echo \* installing prerequisites @@ -274,25 +254,31 @@ check_prerequisites_linux() YUM=$(whichq yum) PACMAN=$(whichq pacman) ZYPPER=$(whichq zypper) + EOPKG=$(whichq eopkg) if [ -x "$APTGET" ] ; then "$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 exitp 6 } elif [ -x "$YUM" ] ; then - "$YUM" -y install curl ipset cronie || { + "$YUM" -y install curl ipset || { echo could not install prerequisites exitp 6 } elif [ -x "$PACMAN" ] ; then "$PACMAN" -Syy - "$PACMAN" --noconfirm -S ipset curl cronie || { + "$PACMAN" --noconfirm -S ipset curl || { echo could not install prerequisites exitp 6 } 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 exitp 6 } @@ -331,12 +317,31 @@ service_start_systemd() { echo \* starting zapret service - systemctl start zapret || { + "$SYSTEMCTL" start zapret || { echo could not start zapret service 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() { [ -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() { INIT_SCRIPT_SRC=$EXEDIR/init.d/sysv/zapret @@ -364,15 +405,16 @@ install_systemd() ask_config service_install_systemd download_list - # desktop system : likely it will be up at daytime - crontab_add 9 21 + # in case its left from old version of zapret + crontab_del_quiet + # now we use systemd timers + timer_install_systemd service_start_systemd } - check_kmod() { [ -f "/lib/modules/$(uname -r)/$1.ko" ] diff --git a/ipset/get_config.sh b/ipset/get_config.sh index dbca605..ae93650 100755 --- a/ipset/get_config.sh +++ b/ipset/get_config.sh @@ -7,4 +7,4 @@ EXEDIR=$(dirname "$SCRIPT") . "$EXEDIR/../config" [ -z "$GETLIST" ] && exit 0 -[ -x "$EXEDIR/$GETLIST" ] && "$EXEDIR/$GETLIST" +[ -x "$EXEDIR/$GETLIST" ] && exec "$EXEDIR/$GETLIST" diff --git a/uninstall_easy.sh b/uninstall_easy.sh index bdb0086..c4ba93b 100755 --- a/uninstall_easy.sh +++ b/uninstall_easy.sh @@ -60,6 +60,8 @@ check_system() crontab_del() { + exists crontab || return + echo \* removing crontab entry CRONTMP=/tmp/cron.tmp @@ -92,6 +94,18 @@ service_remove_systemd() "$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() { @@ -100,7 +114,8 @@ remove_systemd() service_stop_systemd service_remove_systemd - crontab_del + timer_remove_systemd + crontab_del }