move to native systemd. use links , no copy

This commit is contained in:
bolvan 2019-05-11 12:27:01 +03:00
parent cd059aefea
commit 73bf37ee8c
5 changed files with 140 additions and 147 deletions

View File

@ -118,3 +118,13 @@ v23
major init system rewrite major init system rewrite
openwrt : separate firewall include /etc/firewall.zapret openwrt : separate firewall include /etc/firewall.zapret
install_easy.sh : easy setup on openwrt, debian, ubuntu, centos, fedora, opensuse 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

View File

@ -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 /opt/zapret/install_bin.sh
АЛЬТЕРНАТИВА : зайти в tpws,nfq,ip2net,mdig, в каждом выполнить make. Получите динамические бинарики под вашу ось. АЛЬТЕРНАТИВА : зайти в 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 systemctl daemon-reload
Включить автозапуск службы : Включить автозапуск службы :
@ -342,7 +342,22 @@ OpenSUSE
Новые OpenSUSE основаны на systemd и менеджере пакетов zypper. Новые 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. Далее все аналогично debian.
@ -358,7 +373,12 @@ git и curl по умолчанию могут присутствовать, ips
emerge ipset 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 # su
@ -395,16 +415,9 @@ stop : rc-service zapret stop
Для более гибкой настройки перед запуском инсталятора следует выполнить раздел "Выбор параметров". Для более гибкой настройки перед запуском инсталятора следует выполнить раздел "Выбор параметров".
Эти скрипты будут работать и на других системах на базе systemd при условии, что Если система на базе systemd, но используется не поддерживаемый инсталятором менеджер пакетов
systemd собран с поддержкой sysvinit и имеется следующий файл : или названия пакетов не соответствуют прописанным в инсталятор, пакеты нужно установить вручную.
/lib/systemd/system-generators/systemd-sysv-generator Требуется : ipset curl cron
ИЛИ
/usr/lib/systemd/system-generators/systemd-sysv-generator
К сожалению, некоторые дистрибутивы имеют systemd без sysvinit support (arch linux).
А так же есть необходимые программы :
ipset
curl
Их можно установить вручную при помощи менеджера пакетов вашей ОС.
Фаерволлы Фаерволлы
--------- ---------
@ -486,8 +499,8 @@ ipset можно выкинуть, если не будем пользовать
Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики. Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики.
/opt/zapret/install_bin.sh /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
Настроить параметры согласно разделу "Выбор параметров". Настроить параметры согласно разделу "Выбор параметров".

View File

@ -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

View File

@ -9,11 +9,12 @@ ZAPRET_CONFIG=$EXEDIR/config
. "$ZAPRET_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="$EXEDIR/ipset/get_config.sh"
GET_LIST_PREFIX=/ipset/get_ 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() exists()
{ {
@ -66,17 +67,12 @@ random()
check_system() check_system()
{ {
echo \* checking system ... echo \* checking system
SYSTEM="" SYSTEM=""
SYSTEMCTL=$(whichq systemctl) SYSTEMCTL=$(whichq systemctl)
if [ -x "$SYSTEMCTL" ] ; then 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 SYSTEM=systemd
elif [ -f "/etc/openwrt_release" ] && exists opkg && exists uci ; then elif [ -f "/etc/openwrt_release" ] && exists opkg && exists uci ; then
SYSTEM=openwrt SYSTEM=openwrt
@ -101,7 +97,7 @@ get_bin_arch()
install_binaries() install_binaries()
{ {
echo \* installing binaries ... echo \* installing binaries
call_install_bin call_install_bin
} }
@ -168,13 +164,14 @@ select_getlist()
read A read A
if [ "$A" != 'N' ] && [ "$A" != 'n' ]; then if [ "$A" != 'N' ] && [ "$A" != 'n' ]; then
if [ "${MODE%hostlist*}" != "$MODE" ] ; then if [ "${MODE%hostlist*}" != "$MODE" ] ; then
GETLISTS="get_hostlist.sh" local GL_OLD=$GETLIST
GETLIST_DEF="get_hostlist.sh" GETLIST="get_hostlist.sh"
[ "$GL_OLD" != "$GET_LIST" ] && write_config_var GETLIST
else else
GETLISTS="get_user.sh get_antizapret.sh get_combined.sh get_reestr.sh" GETLISTS="get_user.sh get_antizapret.sh get_combined.sh get_reestr.sh"
GETLIST_DEF="get_antizapret.sh" GETLIST_DEF="get_antizapret.sh"
ask_list GETLIST "$GETLISTS" "$GETLIST_DEF" && write_config_var GETLIST
fi fi
ask_list GETLIST "$GETLISTS" "$GETLIST_DEF" && write_config_var GETLIST
return return
fi fi
fi fi
@ -210,7 +207,7 @@ check_location()
{ {
# $1 - copy function # $1 - copy function
echo \* checking location ... echo \* checking location
# use inodes in case something is linked # use inodes in case something is linked
[ -d "$ZAPRET_BASE" ] && [ $(get_dir_inode "$EXEDIR") = $(get_dir_inode "$ZAPRET_BASE") ] || { [ -d "$ZAPRET_BASE" ] && [ $(get_dir_inode "$EXEDIR") = $(get_dir_inode "$ZAPRET_BASE") ] || {
@ -247,7 +244,7 @@ crontab_add()
# $1 - hour min # $1 - hour min
# $2 - hour max # $2 - hour max
[ -x "$GET_LIST" ] && { [ -x "$GET_LIST" ] && {
echo \* adding crontab entry ... echo \* adding crontab entry
CRONTMP=/tmp/cron.tmp CRONTMP=/tmp/cron.tmp
crontab -l >$CRONTMP crontab -l >$CRONTMP
@ -265,12 +262,13 @@ crontab_add()
check_prerequisites_linux() 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 echo everything is present
else else
echo \* installing prerequisites ... echo \* installing prerequisites
APTGET=$(whichq apt-get) APTGET=$(whichq apt-get)
YUM=$(whichq yum) YUM=$(whichq yum)
@ -278,23 +276,23 @@ check_prerequisites_linux()
ZYPPER=$(whichq zypper) ZYPPER=$(whichq zypper)
if [ -x "$APTGET" ] ; then if [ -x "$APTGET" ] ; then
"$APTGET" update "$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 echo could not install prerequisites
exitp 6 exitp 6
} }
elif [ -x "$YUM" ] ; then elif [ -x "$YUM" ] ; then
"$YUM" -y install curl ipset || { "$YUM" -y install curl ipset cronie || {
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 || { "$PACMAN" --noconfirm -S ipset curl cronie || {
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 || { "$ZYPPER" --non-interactive install ipset curl cron || {
echo could not install prerequisites echo could not install prerequisites
exitp 6 exitp 6
} }
@ -306,63 +304,43 @@ check_prerequisites_linux()
fi fi
} }
install_sysv_init()
service_install_systemd()
{ {
echo \* installing init script ... echo \* installing zapret service
[ -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 ...
[ -f "$INIT_SCRIPT" ] && rm -f "$INIT_SCRIPT"
ln -fs "$EXEDIR/init.d/systemd/zapret.service" "$SYSTEMD_SYSTEM_DIR"
"$SYSTEMCTL" daemon-reload "$SYSTEMCTL" daemon-reload
"$SYSTEMCTL" enable zapret || { "$SYSTEMCTL" enable zapret || {
echo could not register $INIT_SCRIPT with systemd echo could not enable systemd service
exitp 20 exitp 20
} }
} }
service_stop_systemd() service_stop_systemd()
{ {
echo \* stopping service and unregistering init script echo \* stopping zapret service
"$SYSTEMCTL" daemon-reload
"$SYSTEMCTL" disable zapret "$SYSTEMCTL" disable zapret
"$SYSTEMCTL" stop zapret "$SYSTEMCTL" stop zapret
} }
service_start_systemd()
{
echo \* starting zapret service
systemctl start zapret || {
echo could not start zapret service
exitp 30
}
}
download_list() download_list()
{ {
[ -x "$GET_LIST" ] && { [ -x "$GET_LIST" ] && {
echo \* downloading blocked ip/host list ... echo \* downloading blocked ip/host list
# can be txt or txt.gz # can be txt or txt.gz
rm -f "$EXEDIR/ipset/zapret-ip.txt"* "$EXEDIR/ipset/zapret-ip-user.txt"* \ 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() install_systemd()
{ {
INIT_SCRIPT_SRC=$EXEDIR/init.d/sysv/zapret INIT_SCRIPT_SRC=$EXEDIR/init.d/sysv/zapret
INIT_SCRIPT=/etc/init.d/zapret
check_location copy_all check_location copy_all
check_prerequisites_linux check_prerequisites_linux
service_stop_systemd service_stop_systemd
install_binaries install_binaries
ask_config ask_config
install_sysv_init service_install_systemd
register_sysv_init_systemd
download_list download_list
# desktop system : likely it will be up at daytime # desktop system : likely it will be up at daytime
crontab_add 9 21 crontab_add 9 21
@ -428,7 +394,7 @@ check_packages_openwrt()
check_prerequisites_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 PKGS="iptables-mod-extra iptables-mod-nfqueue iptables-mod-filter iptables-mod-ipopt ipset curl"
local UPD=0 local UPD=0
@ -437,7 +403,7 @@ check_prerequisites_openwrt()
if check_kmod iptable_raw && check_packages_openwrt $PKGS ; then if check_kmod iptable_raw && check_packages_openwrt $PKGS ; then
echo everything is present echo everything is present
else else
echo \* installing prerequisites ... echo \* installing prerequisites
opkg update opkg update
UPD=1 UPD=1
@ -530,7 +496,7 @@ openwrt_fw_section_configure()
install_openwrt_firewall() install_openwrt_firewall()
{ {
echo \* installing firewall script ... echo \* installing firewall script
[ -n "MODE" ] || { [ -n "MODE" ] || {
echo should specify MODE in $ZAPRET_CONFIG echo should specify MODE in $ZAPRET_CONFIG
@ -543,15 +509,15 @@ install_openwrt_firewall()
openwrt_fw_section_del openwrt_fw_section_del
return return
} }
echo "copying : $FW_SCRIPT_SRC => $OPENWRT_FW_INCLUDE" echo "linking : $FW_SCRIPT_SRC => $OPENWRT_FW_INCLUDE"
cp -f "$FW_SCRIPT_SRC" "$OPENWRT_FW_INCLUDE" ln -fs "$FW_SCRIPT_SRC" "$OPENWRT_FW_INCLUDE"
openwrt_fw_section_configure openwrt_fw_section_configure
} }
restart_openwrt_firewall() restart_openwrt_firewall()
{ {
echo \* restarting firewall ... echo \* restarting firewall
fw3 -q restart || { fw3 -q restart || {
echo could not restart firewall 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 "$INIT_SCRIPT" enable
} }
service_start_sysv() service_start_sysv()
{ {
echo \* starting zapret service ... echo \* starting zapret service
"$INIT_SCRIPT" start || { "$INIT_SCRIPT" start || {
echo could not start zapret service echo could not start zapret service
@ -581,7 +549,6 @@ service_start_sysv()
install_openwrt() install_openwrt()
{ {
INIT_SCRIPT_SRC=$EXEDIR/init.d/openwrt/zapret INIT_SCRIPT_SRC=$EXEDIR/init.d/openwrt/zapret
INIT_SCRIPT=/etc/init.d/zapret
FW_SCRIPT_SRC_DIR=$EXEDIR/init.d/openwrt/firewall.zapret FW_SCRIPT_SRC_DIR=$EXEDIR/init.d/openwrt/firewall.zapret
OPENWRT_FW_INCLUDE=/etc/firewall.zapret OPENWRT_FW_INCLUDE=/etc/firewall.zapret
@ -590,7 +557,6 @@ install_openwrt()
install_binaries install_binaries
ask_config ask_config
install_sysv_init install_sysv_init
register_sysv_init
download_list download_list
# router system : works 24/7. night is the best time # router system : works 24/7. night is the best time
crontab_add 0 6 crontab_add 0 6

View File

@ -5,6 +5,8 @@
SCRIPT=$(readlink -f "$0") SCRIPT=$(readlink -f "$0")
EXEDIR=$(dirname "$SCRIPT") EXEDIR=$(dirname "$SCRIPT")
GET_IPLIST_PREFIX=/ipset/get_ GET_IPLIST_PREFIX=/ipset/get_
SYSTEMD_SYSTEM_DIR=/lib/systemd/system
[ -d "$SYSTEMD_SYSTEM_DIR" ] || SYSTEMD_SYSTEM_DIR=/usr/lib/systemd/system
exists() exists()
{ {
@ -39,7 +41,7 @@ md5file()
check_system() check_system()
{ {
echo \* checking system ... echo \* checking system
SYSTEM="" SYSTEM=""
SYSTEMCTL=$(whichq systemctl) 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() crontab_del()
{ {
echo \* removing crontab entry ... echo \* removing crontab entry
CRONTMP=/tmp/cron.tmp CRONTMP=/tmp/cron.tmp
crontab -l >$CRONTMP 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() remove_systemd()
{ {
INIT_SCRIPT_SRC=$EXEDIR/init.d/sysv/zapret INIT_SCRIPT_SRC=$EXEDIR/init.d/sysv/zapret
INIT_SCRIPT=/etc/init.d/zapret INIT_SCRIPT=/etc/init.d/zapret
service_stop_systemd service_stop_systemd
remove_sysv_init service_remove_systemd
cleanup_systemd
crontab_del crontab_del
} }
openwrt_fw_section_find() openwrt_fw_section_find()
{ {
# echoes section number # echoes section number
@ -150,7 +137,7 @@ openwrt_fw_section_del()
remove_openwrt_firewall() remove_openwrt_firewall()
{ {
echo \* removing firewall script ... echo \* removing firewall script
openwrt_fw_section_del openwrt_fw_section_del
[ -f "$OPENWRT_FW_INCLUDE" ] && rm -f "$OPENWRT_FW_INCLUDE" [ -f "$OPENWRT_FW_INCLUDE" ] && rm -f "$OPENWRT_FW_INCLUDE"
@ -158,7 +145,7 @@ remove_openwrt_firewall()
restart_openwrt_firewall() restart_openwrt_firewall()
{ {
echo \* restarting firewall ... echo \* restarting firewall
fw3 -q restart || { fw3 -q restart || {
echo could not restart firewall echo could not restart firewall
@ -169,7 +156,7 @@ restart_openwrt_firewall()
service_remove_sysv() service_remove_sysv()
{ {
echo \* removing zapret service ... echo \* removing zapret service
[ -x "$INIT_SCRIPT" ] && { [ -x "$INIT_SCRIPT" ] && {
"$INIT_SCRIPT" disable "$INIT_SCRIPT" disable