From 73bf37ee8c193bbc448800981746bb4dd24bab0c Mon Sep 17 00:00:00 2001 From: bolvan Date: Sat, 11 May 2019 12:27:01 +0300 Subject: [PATCH] move to native systemd. use links , no copy --- docs/changes.txt | 10 +++ docs/readme.txt | 53 ++++++++----- init.d/systemd/zapret.service | 17 +++++ install_easy.sh | 136 +++++++++++++--------------------- uninstall_easy.sh | 71 ++++++++---------- 5 files changed, 140 insertions(+), 147 deletions(-) create mode 100644 init.d/systemd/zapret.service diff --git a/docs/changes.txt b/docs/changes.txt index e492d09..731a36b 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -118,3 +118,13 @@ v23 major init system rewrite openwrt : separate firewall include /etc/firewall.zapret install_easy.sh : easy setup on openwrt, debian, ubuntu, centos, fedora, opensuse + +v24 + +separate config from init scripts +gzip support in ipset/*.sh and tpws + +v25 + +init : move to native systemd units +use links to units, init scripts and firewall includes, no more copying diff --git a/docs/readme.txt b/docs/readme.txt index 958c790..d1a4dfe 100644 --- a/docs/readme.txt +++ b/docs/readme.txt @@ -1,4 +1,4 @@ -zapret v.24 +zapret v.25 Для чего это надо ----------------- @@ -281,12 +281,12 @@ TPWS_OPT_HTTPS="--split-pos=3" /opt/zapret/install_bin.sh АЛЬТЕРНАТИВА : зайти в tpws,nfq,ip2net,mdig, в каждом выполнить make. Получите динамические бинарики под вашу ось. -Скопировать скрипт запуска : - cp /opt/zapret/init.d/sysv/zapret /etc/init.d - Настроить параметры согласно разделу "Выбор параметров". -Принять изменения скрипта в systemd : +Создать ссылку на service unit в systemd : + ln -fs /opt/zapret/init.d/systemd/zapret.service /lib/systemd/system + +Принять изменения в systemd : systemctl daemon-reload Включить автозапуск службы : @@ -342,7 +342,22 @@ OpenSUSE Новые OpenSUSE основаны на systemd и менеджере пакетов zypper. Установить пакеты : - zypper install curl ipset + zypper --non-interactive install curl ipset + +Далее все аналогично debian, кроме расположения systemd. +В opensuse он находится не в /lib/systemd, а в /usr/lib/systemd. +Правильная команда будет : + + ln -fs /opt/zapret/init.d/systemd/zapret.service /usr/lib/systemd/system + +Arch linux +---------- + +Построен на базе systemd. По умолчанию отсутствует cron. + +Установить пакеты : + pacman -Syy + pacman --noconfirm -S ipset curl cronie Далее все аналогично debian. @@ -358,7 +373,12 @@ git и curl по умолчанию могут присутствовать, ips emerge ipset -Настраиваем все как в debian, но опуская все, касаемое systemd. +Подключаем init скрипт : + + ln -fs /opt/zapret/init.d/sysv/zapret /etc/init.d + rc-update add zapret + +Далее все как в debian, исключая все, касаемое systemd. Шпаргалка по управлению службой : @@ -371,7 +391,7 @@ stop : rc-service zapret stop ----------------- Ты простой юзер ? Не хочешь ни во что вникать, а хочешь нажать и чтобы сразу заработало ? -Пользуешься ubuntu, debian , centos , fedora, opensuse ? Тогда этот вариант для тебя. +Пользуешься системой на базе systemd ? Тогда этот вариант для тебя. Есть шансы, что оно заработает с минимумом усилий. Запусти терминал и в нем вбивай команды : # su @@ -395,16 +415,9 @@ stop : rc-service zapret stop Для более гибкой настройки перед запуском инсталятора следует выполнить раздел "Выбор параметров". -Эти скрипты будут работать и на других системах на базе systemd при условии, что -systemd собран с поддержкой sysvinit и имеется следующий файл : -/lib/systemd/system-generators/systemd-sysv-generator -ИЛИ -/usr/lib/systemd/system-generators/systemd-sysv-generator -К сожалению, некоторые дистрибутивы имеют systemd без sysvinit support (arch linux). -А так же есть необходимые программы : -ipset -curl -Их можно установить вручную при помощи менеджера пакетов вашей ОС. +Если система на базе systemd, но используется не поддерживаемый инсталятором менеджер пакетов +или названия пакетов не соответствуют прописанным в инсталятор, пакеты нужно установить вручную. +Требуется : ipset curl cron Фаерволлы --------- @@ -486,8 +499,8 @@ ipset можно выкинуть, если не будем пользовать Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики. /opt/zapret/install_bin.sh -Скопировать скрипт запуска : - cp /opt/zapret/init.d/openwrt/zapret /etc/init.d +Создать ссылку на скрипт запуска : + ln -fs /opt/zapret/init.d/openwrt/zapret /etc/init.d Настроить параметры согласно разделу "Выбор параметров". diff --git a/init.d/systemd/zapret.service b/init.d/systemd/zapret.service new file mode 100644 index 0000000..d79b5dd --- /dev/null +++ b/init.d/systemd/zapret.service @@ -0,0 +1,17 @@ +[Unit] +After=network-online.target +Wants=network-online.target + +[Service] +Type=forking +Restart=no +TimeoutSec=30sec +IgnoreSIGPIPE=no +KillMode=process +GuessMainPID=no +RemainAfterExit=yes +ExecStart=/opt/zapret/init.d/sysv/zapret start +ExecStop=/opt/zapret/init.d/sysv/zapret stop + +[Install] +WantedBy=multi-user.target diff --git a/install_easy.sh b/install_easy.sh index bbd79ce..c405351 100755 --- a/install_easy.sh +++ b/install_easy.sh @@ -9,11 +9,12 @@ ZAPRET_CONFIG=$EXEDIR/config . "$ZAPRET_CONFIG" -SYSTEMD_SYSV_GENERATOR=/lib/systemd/system-generators/systemd-sysv-generator -SYSTEMD_SYSV_GENERATOR2=/usr$SYSTEMD_SYSV_GENERATOR - GET_LIST="$EXEDIR/ipset/get_config.sh" GET_LIST_PREFIX=/ipset/get_ +INIT_SCRIPT=/etc/init.d/zapret + +SYSTEMD_SYSTEM_DIR=/lib/systemd/system +[ -d "$SYSTEMD_SYSTEM_DIR" ] || SYSTEMD_SYSTEM_DIR=/usr/lib/systemd/system exists() { @@ -66,17 +67,12 @@ random() check_system() { - echo \* checking system ... + echo \* checking system SYSTEM="" SYSTEMCTL=$(whichq systemctl) if [ -x "$SYSTEMCTL" ] ; then - [ -x "$SYSTEMD_SYSV_GENERATOR" ] || [ -x "$SYSTEMD_SYSV_GENERATOR2" ] || { - echo systemd is present but it does not support sysvinit compatibility - echo $SYSTEMD_SYSV_GENERATOR is required - exitp 5 - } SYSTEM=systemd elif [ -f "/etc/openwrt_release" ] && exists opkg && exists uci ; then SYSTEM=openwrt @@ -101,7 +97,7 @@ get_bin_arch() install_binaries() { - echo \* installing binaries ... + echo \* installing binaries call_install_bin } @@ -168,13 +164,14 @@ select_getlist() read A if [ "$A" != 'N' ] && [ "$A" != 'n' ]; then if [ "${MODE%hostlist*}" != "$MODE" ] ; then - GETLISTS="get_hostlist.sh" - GETLIST_DEF="get_hostlist.sh" + local GL_OLD=$GETLIST + GETLIST="get_hostlist.sh" + [ "$GL_OLD" != "$GET_LIST" ] && write_config_var GETLIST else GETLISTS="get_user.sh get_antizapret.sh get_combined.sh get_reestr.sh" GETLIST_DEF="get_antizapret.sh" + ask_list GETLIST "$GETLISTS" "$GETLIST_DEF" && write_config_var GETLIST fi - ask_list GETLIST "$GETLISTS" "$GETLIST_DEF" && write_config_var GETLIST return fi fi @@ -210,7 +207,7 @@ check_location() { # $1 - copy function - echo \* checking location ... + echo \* checking location # use inodes in case something is linked [ -d "$ZAPRET_BASE" ] && [ $(get_dir_inode "$EXEDIR") = $(get_dir_inode "$ZAPRET_BASE") ] || { @@ -247,7 +244,7 @@ crontab_add() # $1 - hour min # $2 - hour max [ -x "$GET_LIST" ] && { - echo \* adding crontab entry ... + echo \* adding crontab entry CRONTMP=/tmp/cron.tmp crontab -l >$CRONTMP @@ -265,12 +262,13 @@ crontab_add() check_prerequisites_linux() { - echo \* checking prerequisites ... + echo \* checking prerequisites - if exists ipset && exists curl ; then + # arch linux can miss cron + if exists ipset && exists curl && exists crontab ; then echo everything is present else - echo \* installing prerequisites ... + echo \* installing prerequisites APTGET=$(whichq apt-get) YUM=$(whichq yum) @@ -278,23 +276,23 @@ check_prerequisites_linux() ZYPPER=$(whichq zypper) if [ -x "$APTGET" ] ; then "$APTGET" update - "$APTGET" install -y --no-install-recommends ipset curl dnsutils || { + "$APTGET" install -y --no-install-recommends ipset curl dnsutils cron || { echo could not install prerequisites exitp 6 } elif [ -x "$YUM" ] ; then - "$YUM" -y install curl ipset || { + "$YUM" -y install curl ipset cronie || { echo could not install prerequisites exitp 6 } elif [ -x "$PACMAN" ] ; then "$PACMAN" -Syy - "$PACMAN" --noconfirm -S ipset curl || { + "$PACMAN" --noconfirm -S ipset curl cronie || { echo could not install prerequisites exitp 6 } elif [ -x "$ZYPPER" ] ; then - "$ZYPPER" --non-interactive install ipset curl || { + "$ZYPPER" --non-interactive install ipset curl cron || { echo could not install prerequisites exitp 6 } @@ -306,63 +304,43 @@ check_prerequisites_linux() fi } -install_sysv_init() + +service_install_systemd() { - echo \* installing init script ... - - [ -x "$INIT_SCRIPT" ] && "$INIT_SCRIPT" stop - - script_mode=Y - [ -f "$INIT_SCRIPT" ] && - { - [ $(md5file "$INIT_SCRIPT") = $(md5file "$INIT_SCRIPT_SRC") ] || - { - echo $INIT_SCRIPT already exists and differs from $INIT_SCRIPT_SRC - echo Y = overwrite with new version - echo N = exit - echo L = leave current version and continue - read script_mode - case "${script_mode}" in - Y|y|L|l) - ;; - *) - echo aborted - exitp 3 - ;; - esac - } - } - - if [ "$script_mode" = "Y" ] || [ "$script_mode" = "y" ]; then - echo "copying : $INIT_SCRIPT_SRC => $INIT_SCRIPT" - cp -f "$INIT_SCRIPT_SRC" "$INIT_SCRIPT" - fi -} - -register_sysv_init_systemd() -{ - echo \* registering init script ... + echo \* installing zapret service + [ -f "$INIT_SCRIPT" ] && rm -f "$INIT_SCRIPT" + ln -fs "$EXEDIR/init.d/systemd/zapret.service" "$SYSTEMD_SYSTEM_DIR" "$SYSTEMCTL" daemon-reload "$SYSTEMCTL" enable zapret || { - echo could not register $INIT_SCRIPT with systemd + echo could not enable systemd service exitp 20 } } service_stop_systemd() { - echo \* stopping service and unregistering init script + echo \* stopping zapret service + "$SYSTEMCTL" daemon-reload "$SYSTEMCTL" disable zapret "$SYSTEMCTL" stop zapret } +service_start_systemd() +{ + echo \* starting zapret service + + systemctl start zapret || { + echo could not start zapret service + exitp 30 + } +} download_list() { [ -x "$GET_LIST" ] && { - echo \* downloading blocked ip/host list ... + echo \* downloading blocked ip/host list # can be txt or txt.gz rm -f "$EXEDIR/ipset/zapret-ip.txt"* "$EXEDIR/ipset/zapret-ip-user.txt"* \ @@ -375,28 +353,16 @@ download_list() } } -service_start_systemd() -{ - echo \* starting zapret service ... - - systemctl start zapret || { - echo could not start zapret service - exitp 30 - } -} - install_systemd() { INIT_SCRIPT_SRC=$EXEDIR/init.d/sysv/zapret - INIT_SCRIPT=/etc/init.d/zapret check_location copy_all check_prerequisites_linux service_stop_systemd install_binaries ask_config - install_sysv_init - register_sysv_init_systemd + service_install_systemd download_list # desktop system : likely it will be up at daytime crontab_add 9 21 @@ -428,7 +394,7 @@ check_packages_openwrt() check_prerequisites_openwrt() { - echo \* checking prerequisites ... + echo \* checking prerequisites local PKGS="iptables-mod-extra iptables-mod-nfqueue iptables-mod-filter iptables-mod-ipopt ipset curl" local UPD=0 @@ -437,7 +403,7 @@ check_prerequisites_openwrt() if check_kmod iptable_raw && check_packages_openwrt $PKGS ; then echo everything is present else - echo \* installing prerequisites ... + echo \* installing prerequisites opkg update UPD=1 @@ -530,7 +496,7 @@ openwrt_fw_section_configure() install_openwrt_firewall() { - echo \* installing firewall script ... + echo \* installing firewall script [ -n "MODE" ] || { echo should specify MODE in $ZAPRET_CONFIG @@ -543,15 +509,15 @@ install_openwrt_firewall() openwrt_fw_section_del return } - echo "copying : $FW_SCRIPT_SRC => $OPENWRT_FW_INCLUDE" - cp -f "$FW_SCRIPT_SRC" "$OPENWRT_FW_INCLUDE" + echo "linking : $FW_SCRIPT_SRC => $OPENWRT_FW_INCLUDE" + ln -fs "$FW_SCRIPT_SRC" "$OPENWRT_FW_INCLUDE" openwrt_fw_section_configure } restart_openwrt_firewall() { - echo \* restarting firewall ... + echo \* restarting firewall fw3 -q restart || { echo could not restart firewall @@ -559,16 +525,18 @@ restart_openwrt_firewall() } } -register_sysv_init() +install_sysv_init() { - echo \* registering init script ... - + echo \* installing init script + + [ -x "$INIT_SCRIPT" ] && "$INIT_SCRIPT" stop + ln -fs "$INIT_SCRIPT_SRC" "$INIT_SCRIPT" "$INIT_SCRIPT" enable } service_start_sysv() { - echo \* starting zapret service ... + echo \* starting zapret service "$INIT_SCRIPT" start || { echo could not start zapret service @@ -581,7 +549,6 @@ service_start_sysv() install_openwrt() { INIT_SCRIPT_SRC=$EXEDIR/init.d/openwrt/zapret - INIT_SCRIPT=/etc/init.d/zapret FW_SCRIPT_SRC_DIR=$EXEDIR/init.d/openwrt/firewall.zapret OPENWRT_FW_INCLUDE=/etc/firewall.zapret @@ -590,7 +557,6 @@ install_openwrt() install_binaries ask_config install_sysv_init - register_sysv_init download_list # router system : works 24/7. night is the best time crontab_add 0 6 diff --git a/uninstall_easy.sh b/uninstall_easy.sh index 8b94373..2700bb9 100755 --- a/uninstall_easy.sh +++ b/uninstall_easy.sh @@ -5,6 +5,8 @@ SCRIPT=$(readlink -f "$0") EXEDIR=$(dirname "$SCRIPT") GET_IPLIST_PREFIX=/ipset/get_ +SYSTEMD_SYSTEM_DIR=/lib/systemd/system +[ -d "$SYSTEMD_SYSTEM_DIR" ] || SYSTEMD_SYSTEM_DIR=/usr/lib/systemd/system exists() { @@ -39,7 +41,7 @@ md5file() check_system() { - echo \* checking system ... + echo \* checking system SYSTEM="" SYSTEMCTL=$(whichq systemctl) @@ -56,44 +58,9 @@ check_system() } -service_stop_systemd() -{ - echo \* stopping service and unregistering init script - - "$SYSTEMCTL" disable zapret - "$SYSTEMCTL" stop zapret -} - -remove_sysv_init() -{ - echo \* removing init script ... - - script_mode=Y - [ -f "$INIT_SCRIPT" ] && - { - [ $(md5file "$INIT_SCRIPT") = $(md5file "$INIT_SCRIPT_SRC") ] || - { - echo $INIT_SCRIPT already exists and differs from $INIT_SCRIPT_SRC - echo Y = remove it - echo L = leave it - read script_mode - } - if [ "$script_mode" = "Y" ] || [ "$script_mode" = "y" ]; then - rm -vf $INIT_SCRIPT - fi - } -} - -cleanup_systemd() -{ - echo \* systemd cleanup ... - - "$SYSTEMCTL" daemon-reload -} - crontab_del() { - echo \* removing crontab entry ... + echo \* removing crontab entry CRONTMP=/tmp/cron.tmp crontab -l >$CRONTMP @@ -108,19 +75,39 @@ crontab_del() } +service_stop_systemd() +{ + echo \* stopping zapret service + + "$SYSTEMCTL" daemon-reload + "$SYSTEMCTL" disable zapret + "$SYSTEMCTL" stop zapret +} + +service_remove_systemd() +{ + echo \* removing zapret service + + rm -f "$SYSTEMD_SYSTEM_DIR/zapret.service" + "$SYSTEMCTL" daemon-reload +} + + remove_systemd() { INIT_SCRIPT_SRC=$EXEDIR/init.d/sysv/zapret INIT_SCRIPT=/etc/init.d/zapret service_stop_systemd - remove_sysv_init - cleanup_systemd + service_remove_systemd crontab_del } + + + openwrt_fw_section_find() { # echoes section number @@ -150,7 +137,7 @@ openwrt_fw_section_del() remove_openwrt_firewall() { - echo \* removing firewall script ... + echo \* removing firewall script openwrt_fw_section_del [ -f "$OPENWRT_FW_INCLUDE" ] && rm -f "$OPENWRT_FW_INCLUDE" @@ -158,7 +145,7 @@ remove_openwrt_firewall() restart_openwrt_firewall() { - echo \* restarting firewall ... + echo \* restarting firewall fw3 -q restart || { echo could not restart firewall @@ -169,7 +156,7 @@ restart_openwrt_firewall() service_remove_sysv() { - echo \* removing zapret service ... + echo \* removing zapret service [ -x "$INIT_SCRIPT" ] && { "$INIT_SCRIPT" disable