Files
zapret.installer/zapret-control.sh
Snowy-Fluffy fd896e8f28 bug fx
2025-06-21 13:59:01 +03:00

952 lines
34 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
set -e
if [ "$(id -u)" -eq 0 ]; then
SUDO=""
else
if command -v sudo > /dev/null 2>&1; then
SUDO="sudo"
elif command -v doas > /dev/null 2>&1; then
SUDO="doas"
else
echo "Скрипт не может быть выполнен не от имени суперпользователя."
exit 1
fi
fi
if [[ $EUID -ne 0 ]]; then
exec $SUDO "$0" "$@"
fi
error_exit() {
$TPUT_E
echo -e "\e[31mОшибка:\e[0m $1" >&2
exit 1
}
check_fs() {
if [ "$(awk '$2 == "/" {print $4}' /proc/mounts)" = "ro" ]; then
error_exit "файловая система только для чтения, не могу продолжить."
fi
}
detect_init() {
GET_LIST_PREFIX=/ipset/get_
SYSTEMD_DIR=/lib/systemd
[ -d "$SYSTEMD_DIR" ] || SYSTEMD_DIR=/usr/lib/systemd
[ -d "$SYSTEMD_DIR" ] && SYSTEMD_SYSTEM_DIR="$SYSTEMD_DIR/system"
INIT_SCRIPT=/etc/init.d/zapret
if [ -d /run/systemd/system ]; then
INIT_SYSTEM="systemd"
elif [ $SYSTEM == openwrt ]; then
INIT_SYSTEM="procd"
elif command -v openrc-init >/dev/null 2>&1; then
INIT_SYSTEM="openrc"
elif command -v runit >/dev/null 2>&1; then
INIT_SYSTEM="runit"
[ -f /etc/os-release ] && . /etc/os-release
if [ $ID = artix ]; then
INIT_SYSTEM="runit-artix"
fi
elif [ -x /sbin/init ] && /sbin/init --version 2>&1 | grep -qi "sysv init"; then
INIT_SYSTEM="sysvinit"
else
error_exit "Не удалось определить init."
fi
}
check_zapret_exist() {
case "$INIT_SYSTEM" in
systemd)
if [ -f /etc/systemd/system/timers.target.wants/zapret-list-update.timer ]; then
service_exists=true
else
service_exists=false
fi
;;
procd)
if [ -f /etc/init.d/zapret ]; then
service_exists=true
else
service_exists=false
fi
;;
runit)
ls /var/service | grep -q "zapret" && service_exists=true || service_exists=false
;;
runit-artix)
ls /run/runit/service | grep -q "zapret" && service_exists=true || service_exists=false
;;
openrc)
rc-service -l | grep -q "zapret" && service_exists=true || service_exists=false
;;
sysvinit)
[ -f /etc/init.d/zapret ] && service_exists=true || service_exists=false
;;
*)
ZAPRET_EXIST=false
return
;;
esac
if [ -d /opt/zapret ]; then
dir_exists=true
[ -d /opt/zapret/binaries ] && binaries_exists=true || binaries_exists=false
else
dir_exists=false
binaries_exists=false
fi
if [ "$service_exists" = true ] && [ "$dir_exists" = true ] && [ "$binaries_exists" = true ]; then
ZAPRET_EXIST=true
else
ZAPRET_EXIST=false
fi
}
check_zapret_status() {
case "$INIT_SYSTEM" in
systemd)
ZAPRET_ACTIVE=$(systemctl show -p ActiveState zapret | cut -d= -f2 || true)
ZAPRET_ENABLED=$(systemctl is-enabled zapret 2>/dev/null || echo "false")
ZAPRET_SUBSTATE=$(systemctl show -p SubState zapret | cut -d= -f2)
if [[ "$ZAPRET_ACTIVE" == "active" && "$ZAPRET_SUBSTATE" == "running" ]]; then
ZAPRET_ACTIVE=true
else
ZAPRET_ACTIVE=false
fi
if [[ "$ZAPRET_ENABLED" == "enabled" ]]; then
ZAPRET_ENABLED=true
else
ZAPRET_ENABLED=false
fi
if [[ "$ZAPRET_ENABLED" == "not-found" ]]; then
ZAPRET_ENABLED=false
fi
;;
openrc)
rc-service zapret status >/dev/null 2>&1 && ZAPRET_ACTIVE=true || ZAPRET_ACTIVE=false
rc-update show | grep -q zapret && ZAPRET_ENABLED=true || ZAPRET_ENABLED=false
;;
procd)
if /etc/init.d/zapret status | grep -q "running"; then
ZAPRET_ACTIVE=true
else
ZAPRET_ACTIVE=false
fi
if ls /etc/rc.d/ | grep -q zapret >/dev/null 2>&1; then
ZAPRET_ENABLED=true
else
ZAPRET_ENABLED=false
fi
;;
runit)
sv status zapret | grep -q "run" && ZAPRET_ACTIVE=true || ZAPRET_ACTIVE=false
ls /var/service | grep -q "zapret" && ZAPRET_ENABLED=true || ZAPRET_ENABLED=false
;;
runit-artix)
sv status zapret | grep -q "run" && ZAPRET_ACTIVE=true || ZAPRET_ACTIVE=false
ls /run/runit/service | grep -q "zapret" && ZAPRET_ENABLED=true || ZAPRET_ENABLED=false
;;
sysvinit)
service zapret status >/dev/null 2>&1 && ZAPRET_ACTIVE=true || ZAPRET_ACTIVE=false
;;
esac
}
exists()
{
which "$1" >/dev/null 2>/dev/null
}
existf()
{
type "$1" >/dev/null 2>/dev/null
}
whichq()
{
which $1 2>/dev/null
}
check_openwrt() {
if grep -q '^ID="openwrt"$' /etc/os-release; then
SYSTEM=openwrt
fi
}
check_tput() {
if command -v tput &>/dev/null; then
TPUT_B="tput smcup"
TPUT_E="tput rmcup"
else
TPUT_B=""
TPUT_E=""
fi
}
is_network_error() {
local log="$1"
echo "$log" | grep -qiE "timed out|recv failure|unexpected disconnect|early EOF|RPC failed|curl.*recv"
}
try_again() {
local error_message="$1"
shift
local -a command=("$@")
local attempt=0
local max_attempts=3
local success=0
while (( attempt < max_attempts )); do
((attempt++))
(( attempt > 1 )) && echo -e "\e[33mПопытка $attempt из $max_attempts...\e[0m"
output=$("${command[@]}" 2>&1) && success=1 && break
if ! is_network_error "$output"; then
echo "$output" >&2
error_exit "не удалось склонировать репозиторий."
fi
sleep 2
done
(( success == 0 )) && error_exit "$error_message"
}
get_fwtype() {
[ -n "$FWTYPE" ] && return
local UNAME="$(uname)"
case "$UNAME" in
Linux)
if [[ $SYSTEM == openwrt ]]; then
if exists iptables; then
iptables_version=$(iptables --version 2>&1)
if [[ "$iptables_version" == *"legacy"* ]]; then
FWTYPE="iptables"
return 0
elif [[ "$iptables_version" == *"nf_tables"* ]]; then
FWTYPE="nftables"
return 0
else
echo -e "\e[1;33m⚠ Не удалось определить тип файрвола.\e[0m"
echo -e "По умолчанию будет использован: \e[1;36mnftables\e[0m"
echo -e "\e[2m(Можно изменить в /opt/zapret/config)\e[0m"
echo -e "⏳ Продолжаю через 5 секунд..."
FWTYPE="nftables"
sleep 5
return 0
fi
else
echo -e "\e[1;33m⚠ iptables не найден. Используется по умолчанию: \e[1;36mnftables\e[0m"
echo -e "\e[2m(Можно изменить в /opt/zapret/config)\e[0m"
echo -e "⏳ Продолжаю через 5 секунд..."
FWTYPE="nftables"
sleep 5
return 0
fi
fi
if exists iptables; then
iptables_version=$(iptables -V 2>&1)
if [[ "$iptables_version" == *"legacy"* ]]; then
FWTYPE="iptables"
elif [[ "$iptables_version" == *"nf_tables"* ]]; then
FWTYPE="nftables"
else
echo -e "\e[1;33m⚠ Не удалось определить тип файрвола.\e[0m"
echo -e "По умолчанию используется: \e[1;36miptables\e[0m"
echo -e "\e[2m(Можно изменить в /opt/zapret/config)\e[0m"
echo -e "⏳ Продолжаю через 5 секунд..."
FWTYPE="iptables"
sleep 5
fi
else
echo -e "\e[1;31m❌ iptables не найден!\e[0m"
echo -e "По умолчанию используется: \e[1;36miptables\e[0m"
echo -e "\e[2m(Можно изменить в /opt/zapret/config)\e[0m"
echo -e "⏳ Продолжаю через 5 секунд..."
FWTYPE="iptables"
sleep 5
fi
;;
FreeBSD)
if exists ipfw ; then
FWTYPE="ipfw"
else
echo -e "\e[1;33m⚠ ipfw не найден!\e[0m"
echo -e "По умолчанию используется: \e[1;36miptables\e[0m"
echo -e "\e[2m(Можно изменить в /opt/zapret/config)\e[0m"
echo -e "⏳ Продолжаю через 5 секунд..."
FWTYPE="iptables"
sleep 5
fi
;;
*)
echo -e "\e[1;31m❌ Неизвестная система: $UNAME\e[0m"
echo -e "По умолчанию используется: \e[1;36miptables\e[0m"
echo -e "\e[2m(Можно изменить в /opt/zapret/config)\e[0m"
echo -e "⏳ Продолжаю через 5 секунд..."
FWTYPE="iptables"
sleep 5
;;
esac
}
manage_service() {
case "$INIT_SYSTEM" in
systemd)
SYSTEMD_PAGER=cat systemctl "$1" zapret
;;
openrc)
rc-service zapret "$1"
;;
runit|runit-artix)
sv "$1" zapret
;;
sysvinit)
service zapret "$1"
;;
procd)
service zapret "$1"
esac
}
manage_autostart() {
case "$INIT_SYSTEM" in
systemd)
systemctl "$1" zapret
;;
runit)
if [[ "$1" == "enable" ]]; then
ln -fs /opt/zapret/init.d/runit/zapret/ /var/service/
else
rm -f /var/service/zapret
fi
;;
runit-artix)
if [[ "$1" == "enable" ]]; then
ln -fs /opt/zapret/init.d/runit/zapret/ /run/runit/service/
else
rm -f /run/runit/service/zapret
fi
;;
sysvinit)
if [[ "$1" == "enable" ]]; then
update-rc.d zapret defaults
else
update-rc.d -f zapret remove
fi
;;
openrc)
service zapret "$1"
;;
procd)
service zapret "$1"
esac
}
install_dependencies() {
kernel="$(uname -s)"
if [ "$kernel" = "Linux" ]; then
. /etc/os-release
declare -A command_by_ID=(
["arch"]="pacman -S --noconfirm ipset "
["artix"]="pacman -S --noconfirm ipset "
["debian"]="apt-get install -y iptables ipset "
["fedora"]="dnf install -y iptables ipset"
["ubuntu"]="apt-get install -y iptables ipset"
["mint"]="apt-get install -y iptables ipset"
["centos"]="yum install -y ipset iptables"
["void"]="xbps-install -y iptables ipset"
["gentoo"]="emerge net-firewall/iptables net-firewall/ipset"
["opensuse"]="zypper install -y iptables ipset"
["openwrt"]="opkg install iptables ipset"
["altlinux"]="apt-get install -y iptables ipset"
)
if [[ -v command_by_ID[$ID] ]]; then
eval "${command_by_ID[$ID]}"
else
for like in $ID_LIKE; do
if [[ -n "${command_by_ID[$like]}" ]]; then
eval "${command_by_ID[$like]}"
break
fi
done
fi
elif [ "$kernel" = "Darwin" ]; then
error_exit "macOS не поддерживается на данный момент."
else
echo "Неизвестная ОС: ${kernel}. Установите iptables и ipset самостоятельно." bash -c 'read -p "Нажмите Enter для продолжения..."'
fi
}
toggle_service() {
while true; do
clear
echo -e "\e[1;36m╔═════════════════════════════════════════════════╗"
echo -e "║ 🛠️ Управление сервисом Запрета ║"
echo -e "╚═════════════════════════════════════════════════╝\e[0m"
if [[ $ZAPRET_ACTIVE == true ]]; then
echo -e " \e[1;32m✔ Запрет запущен\e[0m"
else
echo -e " \e[1;31m❌ Запрет выключен\e[0m"
fi
if [[ $ZAPRET_ENABLED == true ]]; then
echo -e " \e[1;32m🔁 Запрет в автозагрузке\e[0m"
else
echo -e " \e[1;33m⏹ Запрет не в автозагрузке\e[0m"
fi
echo ""
echo -e " \e[1;33m1)\e[0m $( [[ $ZAPRET_ENABLED == true ]] && echo "🚫 Убрать из автозагрузки" || echo "✅ Добавить в автозагрузку" )"
echo -e " \e[1;32m2)\e[0m $( [[ $ZAPRET_ACTIVE == true ]] && echo "⛔ Выключить Запрет" || echo "▶️ Включить Запрет" )"
echo -e " \e[1;36m3)\e[0m 🔍 Посмотреть статус Запрета"
echo -e " \e[1;35m4)\e[0m 🔄 Перезапустить Запрет"
echo -e " \e[1;31m5)\e[0m 🚪 Выйти в меню"
echo ""
echo -e "\e[1;96m✨ Сделано с любовью 💙\e[0m by: \e[4;94mhttps://t.me/linux_hi\e[0m"
echo ""
read -p $'\e[1;36mВыберите действие: \e[0m' CHOICE
case "$CHOICE" in
1)
[[ $ZAPRET_ENABLED == true ]] && manage_autostart disable || manage_autostart enable
main_menu
;;
2)
[[ $ZAPRET_ACTIVE == true ]] && manage_service stop || manage_service start
main_menu
;;
3)
manage_service status
read -p $'\e[1;36mНажмите Enter для продолжения...\e[0m'
main_menu
;;
4)
manage_service restart
main_menu
;;
5)
main_menu
;;
*)
echo -e "\e[1;31m❌ Неверный ввод! Попробуйте снова.\e[0m"
sleep 2
;;
esac
done
}
main_menu() {
while true; do
clear
check_zapret_status
check_zapret_exist
echo -e "\e[1;36m╔════════════════════════════════════════════╗"
echo -e "║ ⚙️ Меню управления Запретом ║"
echo -e "╚════════════════════════════════════════════╝\e[0m"
if [[ $ZAPRET_ACTIVE == true ]]; then
echo -e " \e[1;32m✔ Запрет запущен\e[0m"
else
echo -e " \e[1;31m❌ Запрет выключен\e[0m"
fi
if [[ $ZAPRET_ENABLED == true ]]; then
echo -e " \e[1;32m🔁 Запрет в автозагрузке\e[0m"
else
echo -e " \e[1;33m⏹ Запрет не в автозагрузке\e[0m"
fi
echo ""
if [[ $ZAPRET_EXIST == true ]]; then
echo -e " \e[1;33m1)\e[0m 🔄 Проверить на обновления и обновить"
echo -e " \e[1;36m2)\e[0m ⚙️ Сменить конфигурацию запрета"
echo -e " \e[1;35m3)\e[0m 🛠️ Управление сервисом запрета"
echo -e " \e[1;31m4)\e[0m 🗑️ Удалить Запрет"
echo -e " \e[1;34m5)\e[0m 🚪 Выйти"
else
echo -e " \e[1;32m1)\e[0m 📥 Установить Запрет"
echo -e " \e[1;36m2)\e[0m 📜 Проверить скрипт на обновления"
echo -e " \e[1;34m3)\e[0m 🚪 Выйти"
fi
echo ""
echo -e "\e[1;96m✨ Сделано с любовью 💙\e[0m by: \e[4;94mhttps://t.me/linux_hi\e[0m"
echo ""
if [[ $ZAPRET_EXIST == true ]]; then
read -p $'\e[1;36mВыберите действие: \e[0m' CHOICE
case "$CHOICE" in
1) update_zapret_menu;;
2) change_configuration;;
3) toggle_service;;
4) uninstall_zapret;;
5) $TPUT_E; exit 0;;
*) echo -e "\e[1;31m❌ Неверный ввод! Попробуйте снова.\e[0m"; sleep 2;;
esac
else
read -p $'\e[1;36mВыберите действие: \e[0m' CHOICE
case "$CHOICE" in
1) install_zapret; main_menu;;
2) update_script;;
3) tput rmcup; exit 0;;
*) echo -e "\e[1;31m❌ Неверный ввод! Попробуйте снова.\e[0m"; sleep 2;;
esac
fi
done
}
install_zapret() {
install_dependencies
if [[ $dir_exists == true ]]; then
read -p "На вашем компьютере был найден запрет (/opt/zapret). Для продолжения его необходимо удалить. Вы действительно хотите удалить запрет (/opt/zapret) и продолжить? (y/N): " answer
case "$answer" in
[Yy]* )
if [[ -f /opt/zapret/uninstall_easy.sh ]]; then
cd /opt/zapret
sed -i '235s/ask_yes_no N/ask_yes_no Y/' /opt/zapret/common/installer.sh
yes "" | ./uninstall_easy.sh
sed -i '235s/ask_yes_no N/ask_yes_no Y/' /opt/zapret/common/installer.sh
fi
rm -rf /opt/zapret
echo "Удаляю zapret..."
cd /
sleep 3
;;
* )
main_menu
;;
esac
fi
echo "Клонирую репозиторий..."
sleep 2
git clone https://github.com/bol-van/zapret /opt/zapret
echo "Клонирую репозиторий..."
git clone https://github.com/Snowy-Fluffy/zapret.cfgs /opt/zapret/zapret.cfgs
echo "Клонирование успешно завершено."
rm -rf /opt/zapret/binaries
echo -e "\e[45mКлонирую релиз запрета...\e[0m"
if [[ ! -d /opt/zapret.installer/zapret.binaries/ ]]; then
rm -rf /opt/zapret.installer/zapret.binaries/
fi
mkdir -p /opt/zapret.installer/zapret.binaries/zapret
if ! curl -L -o /opt/zapret.installer/zapret.binaries/zapret/zapret-v71.1.1.tar.gz https://github.com/bol-van/zapret/releases/download/v71.1.1/zapret-v71.1.1.tar.gz; then
rm -rf /opt/zapret /tmp/zapret
error_exit "не удалось получить релиз запрета."
fi
echo "Получение запрета завершено."
if ! tar -xzf /opt/zapret.installer/zapret.binaries/zapret/zapret-v71.1.1.tar.gz -C /opt/zapret.installer/zapret.binaries/zapret/; then
rm -rf /opt/zapret.installer/
error_exit "не удалось разархивировать архив с релизом запрета."
fi
cp -r /opt/zapret.installer/zapret.binaries/zapret/zapret-v71.1.1/binaries/ /opt/zapret/binaries
cd /opt/zapret
sed -i '235s/ask_yes_no N/ask_yes_no Y/' /opt/zapret/common/installer.sh
yes "" | ./install_easy.sh
sed -i '235s/ask_yes_no N/ask_yes_no Y/' /opt/zapret/common/installer.sh
cp -r /opt/zapret.installer/zapret-control.sh /bin/zapret || error_exit "не удалось скопировать скрипт в /bin"
chmod +x /bin/zapret
rm -f /opt/zapret/config
cp -r /opt/zapret/zapret.cfgs/configurations/general /opt/zapret/config || error_exit "не удалось автоматически скопировать конфиг"
rm -f /opt/zapret/ipset/zapret-hosts-user.txt
cp -r /opt/zapret/zapret.cfgs/lists/list-basic.txt /opt/zapret/ipset/zapret-hosts-user.txt || error_exit "не удалось автоматически скопировать хостлист"
cp -r /opt/zapret/zapret.cfgs/lists/ipset-discord.txt /opt/zapret/ipset/ipset-discord.txt || error_exit "не удалось автоматически скопировать ипсет"
if [[ INIT_SYSTEM = runit ]]; then
read -p "Для окончания установки необходимо перезапустить ваше устройство. Перезапустить его сейчас? (Y/n): " answer
case "$answer" in
[Yy]* )
reboot
;;
[Nn]* )
TPUT_E
exit 1
;;
* )
reboot
;;
esac
else
manage_service restart
configure_zapret_conf
fi
}
change_configuration() {
while true; do
clear
cur_conf
cur_list
echo -e "\e[1;36m╔══════════════════════════════════════════════╗"
echo -e "║ ⚙️ Управление конфигурацией Запрета ║"
echo -e "╚══════════════════════════════════════════════╝\e[0m"
echo -e " \e[1;33m📌 Используемая стратегия:\e[0m \e[1;32m$cr_cnf\e[0m"
echo -e " \e[1;33m📜 Используемый хостлист:\e[0m \e[1;32m$cr_lst\e[0m"
echo ""
echo -e " \e[1;34m1)\e[0m 🔁 Сменить стратегию"
echo -e " \e[1;34m2)\e[0m 📄 Сменить лист обхода"
echo -e " \e[1;34m3)\e[0m Добавить IP или домены в лист"
echo -e " \e[1;34m4)\e[0m Удалить IP или домены из листа"
echo -e " \e[1;34m5)\e[0m 🔍 Найти IP или домены в листе"
echo -e " \e[1;31m6)\e[0m 🚪 Выйти в меню"
echo ""
echo -e "\e[1;96m✨ Сделано с любовью 💙\e[0m by: \e[4;94mhttps://t.me/linux_hi\e[0m"
echo ""
read -p $'\e[1;36mВыберите действие: \e[0m' CHOICE
case "$CHOICE" in
1) configure_zapret_conf ;;
2) configure_zapret_list ;;
3) add_to_zapret ;;
4) delete_from_zapret ;;
5) search_in_zapret ;;
6) main_menu ;;
*) echo -e "\e[1;31m❌ Неверный ввод! Попробуйте снова.\e[0m"; sleep 2 ;;
esac
done
}
update_zapret_menu(){
while true; do
clear
echo -e "\e[1;36m╔════════════════════════════════════╗"
echo -e "║ 🔄 Обновление Запрета ║"
echo -e "╚════════════════════════════════════╝\e[0m"
echo -e " \e[1;33m1)\e[0m 🔧 Обновить \e[33mzapret и скрипт\e[0m \e[2m(не рекомендуется)\e[0m"
echo -e " \e[1;32m2)\e[0m 📜 Обновить только \e[32mскрипт\e[0m"
echo -e " \e[1;31m3)\e[0m 🚪 Выйти в меню"
echo ""
echo -e "\e[1;96m✨ Сделано с любовью 💙\e[0m by: \e[4;94mhttps://t.me/linux_hi\e[0m"
echo ""
read -p $'\e[1;36mВыберите действие: \e[0m' CHOICE
case "$CHOICE" in
1) update_zapret;;
2) update_installed_script;;
3) main_menu;;
*) echo -e "\e[1;31m❌ Неверный ввод! Попробуйте снова.\e[0m"; sleep 2;;
esac
done
}
update_zapret() {
if [[ -d /opt/zapret ]]; then
cd /opt/zapret && git fetch origin master; git reset --hard origin/master
fi
if [[ -d /opt/zapret/zapret.cfgs ]]; then
cd /opt/zapret/zapret.cfgs && git fetch origin main; git reset --hard origin/main
fi
if [[ -d /opt/zapret.installer/ ]]; then
cd /opt/zapret.installer/ && git fetch origin main; git reset --hard origin/main
rm -f /bin/zapret
ln -s /opt/zapret.installer/zapret-control.sh /bin/zapret || error_exit "не удалось создать символическую ссылку"
fi
manage_service restart
bash -c 'read -p "Нажмите Enter для продолжения..."'
exec "$0" "$@"
}
update_script() {
if [[ -d /opt/zapret/zapret.cfgs ]]; then
cd /opt/zapret/zapret.cfgs && git fetch origin main; git reset --hard origin/main
fi
if [[ -d /opt/zapret.installer/ ]]; then
cd /opt/zapret.installer/ && git fetch origin main; git reset --hard origin/main
fi
rm -f /bin/zapret
ln -s /opt/zapret.installer/zapret-control.sh /bin/zapret || error_exit "не удалось создать символическую ссылку"
bash -c 'read -p "Нажмите Enter для продолжения..."'
exec "$0" "$@"
}
update_installed_script() {
if [[ -d /opt/zapret/zapret.cfgs ]]; then
cd /opt/zapret/zapret.cfgs && git fetch origin main; git reset --hard origin/main
fi
if [[ -d /opt/zapret.installer/ ]]; then
cd /opt/zapret.installer/ && git fetch origin main; git reset --hard origin/main
rm -f /bin/zapret
ln -s /opt/zapret.installer/zapret-control.sh /bin/zapret || error_exit "не удалось создать символическую ссылку"
manage_service restart
fi
bash -c 'read -p "Нажмите Enter для продолжения..."'
exec "$0" "$@"
}
add_to_zapret() {
read -p "Введите IP-адреса или домены для добавления в лист (разделяйте пробелами, запятыми или |)(Enter и пустой ввод для отмены): " input
if [[ -z "$input" ]]; then
main_menu
fi
IFS=',| ' read -ra ADDRESSES <<< "$input"
for address in "${ADDRESSES[@]}"; do
address=$(echo "$address" | xargs)
if [[ -n "$address" && ! $(grep -Fxq "$address" "/opt/zapret/ipset/zapret-hosts-user.txt") ]]; then
echo "$address" >> "/opt/zapret/ipset/zapret-hosts-user.txt"
echo "Добавлено: $address"
else
echo "Уже существует: $address"
fi
done
manage_service restart
echo "Готово"
sleep 2
main_menu
}
delete_from_zapret() {
read -p "Введите IP-адреса или домены для удаления из листа (разделяйте пробелами, запятыми или |)(Enter и пустой ввод для отмены): " input
if [[ -z "$input" ]]; then
main_menu
fi
IFS=',| ' read -ra ADDRESSES <<< "$input"
for address in "${ADDRESSES[@]}"; do
address=$(echo "$address" | xargs)
if [[ -n "$address" ]]; then
if grep -Fxq "$address" "/opt/zapret/ipset/zapret-hosts-user.txt"; then
sed -i "\|^$address\$|d" "/opt/zapret/ipset/zapret-hosts-user.txt"
echo "Удалено: $address"
else
echo "Не найдено: $address"
fi
fi
done
manage_service restart
echo "Готово"
sleep 2
main_menu
}
search_in_zapret() {
read -p "Введите домен или IP-адрес для поиска в хостлисте (Enter и пустой ввод для отмены): " keyword
if [[ -z "$keyword" ]]; then
main_menu
fi
matches=$(grep "$keyword" "/opt/zapret/ipset/zapret-hosts-user.txt")
if [[ -n "$matches" ]]; then
echo "Найденные записи:"
echo "$matches"
bash -c 'read -p "Нажмите Enter для продолжения..."'
else
echo "Совпадений не найдено."
sleep 2
main_menu
fi
}
cur_conf() {
cr_cnf="неизвестно"
if [[ -f /opt/zapret/config ]]; then
mkdir -p /tmp/zapret.installer-tmp/
cp -r /opt/zapret/config /tmp/zapret.installer-tmp/config
sed -i "s/^FWTYPE=.*/FWTYPE=iptables/" /tmp/zapret.installer-tmp/config
for file in /opt/zapret/zapret.cfgs/configurations/*; do
if [[ -f "$file" && "$(sha256sum "$file" | awk '{print $1}')" == "$(sha256sum /tmp/zapret.installer-tmp/config | awk '{print $1}')" ]]; then
cr_cnf="$(basename "$file")"
break
fi
done
fi
}
cur_list() {
cr_lst="неизвестно"
if [[ -f /opt/zapret/config ]]; then
for file in /opt/zapret/zapret.cfgs/lists/*; do
if [[ -f "$file" && "$(sha256sum "$file" | awk '{print $1}')" == "$(sha256sum /opt/zapret/ipset/zapret-hosts-user.txt | awk '{print $1}')" ]]; then
cr_lst="$(basename "$file")"
break
fi
done
fi
}
configure_zapret_conf() {
if [[ ! -d /opt/zapret/zapret.cfgs ]]; then
echo -e "\e[35mКлонирую конфигурации...\e[0m"
manage_service stop
git clone https://github.com/Snowy-Fluffy/zapret.cfgs /opt/zapret/zapret.cfgs
echo -e "\e[32mКлонирование успешно завершено.\e[0m"
manage_service start
sleep 2
fi
if [[ -d /opt/zapret/zapret.cfgs ]]; then
echo "Проверяю наличие на обновление конфигураций..."
manage_service stop
cd /opt/zapret/zapret.cfgs && git fetch origin main; git reset --hard origin/main
manage_service start
sleep 2
fi
clear
echo "Выберите стратегию (можно поменять в любой момент, запустив Меню управления запретом еще раз):"
PS3="Введите номер стратегии (по умолчанию 'general'): "
select CONF in $(for f in /opt/zapret/zapret.cfgs/configurations/*; do echo "$(basename "$f" | tr ' ' '.')"; done) "Отмена"; do
if [[ "$CONF" == "Отмена" ]]; then
main_menu
elif [[ -n "$CONF" ]]; then
CONFIG_PATH="/opt/zapret/zapret.cfgs/configurations/${CONF//./ }"
rm -f /opt/zapret/config
cp "$CONFIG_PATH" /opt/zapret/config || error_exit "не удалось скопировать стратегию"
echo "Стратегия '$CONF' установлена."
sleep 2
break
else
echo "Неверный выбор, попробуйте снова."
fi
done
get_fwtype
sed -i "s/^FWTYPE=.*/FWTYPE=$FWTYPE/" /opt/zapret/config
manage_service restart
main_menu
}
configure_zapret_list() {
if [[ ! -d /opt/zapret/zapret.cfgs ]]; then
echo -e "\e[35mКлонирую конфигурации...\e[0m"
manage_service stop
git clone https://github.com/Snowy-Fluffy/zapret.cfgs /opt/zapret/zapret.cfgs
manage service start
echo -e "\e[32mКлонирование успешно завершено.\e[0m"
sleep 2
fi
if [[ -d /opt/zapret/zapret.cfgs ]]; then
echo "Проверяю наличие на обновление конфигураций..."
manage_service stop
cd /opt/zapret/zapret.cfgs && git fetch origin main; git reset --hard origin/main
manage_service start
sleep 2
fi
clear
echo -e "\e[36mВыберите хостлист (можно поменять в любой момент, запустив Меню управления запретом еще раз):\e[0m"
PS3="Введите номер листа (по умолчанию 'list-basic.txt'): "
select LIST in $(for f in /opt/zapret/zapret.cfgs/lists/list*; do echo "$(basename "$f")"; done) "Отмена"; do
if [[ "$LIST" == "Отмена" ]]; then
main_menu
elif [[ -n "$LIST" ]]; then
LIST_PATH="/opt/zapret/zapret.cfgs/lists/$LIST"
rm -f /opt/zapret/ipset/zapret-hosts-user.txt
cp "$LIST_PATH" /opt/zapret/ipset/zapret-hosts-user.txt || error_exit "не удалось скопировать хостлист"
echo -e "\e[32mХостлист '$LIST' установлен.\e[0m"
sleep 2
break
else
echo -e "\e[31mНеверный выбор, попробуйте снова.\e[0m"
fi
done
manage_service restart
main_menu
}
uninstall_zapret() {
read -p "Вы действительно хотите удалить запрет? (y/N): " answer
case "$answer" in
[Yy]* )
if [[ -f /opt/zapret/uninstall_easy.sh ]]; then
cd /opt/zapret
yes "" | ./uninstall_easy.sh
fi
rm -rf /opt/zapret
rm -rf /opt/zapret.installer/
rm -r /bin/zapret
echo "Удаляю zapret..."
sleep 3
;;
* )
main_menu
;;
esac
}
check_openwrt
check_tput
$TPUT_B
check_fs
detect_init
main_menu