z2k/z2k_cleanup.sh
necronicle bbd4b5bf1f fix: comprehensive code review — 40 fixes across 14 files
Critical: CRLF→LF in hostlists (broke nfqws2 matching), die in pipe
subshell (errors silently ignored), update_z2k /bin/sh overwrite guard,
missing quic_rutracker blob registration, telemetry race condition
(multi-process merge).

Security: sed injection via user input → grep -vxF, grep -qx → -qxF
for domain matching, chmod 777/666 → 755/644 + chown nobody,
predictable /tmp/z2k cleanup before mkdir.

High: PID path mismatch /opt/var/run → /var/run, zapret2_nat chain in
cleanup, orphaned tcpdump on monitor stop, cross-filesystem mv → cp+rm,
base.sh re-source clobber fix.

Medium: version mismatch, root check for default install path, early
exit for help/version, backup/restore dir fix, awk special chars,
HTTP RKN failure_detector, youtube_tcp_tcp typo, hostlist warning,
kernel module regex anchoring, state eviction + locking in Lua.

Dead code removed (~200 lines): check_installation_status,
menu_view_strategy, apply_category_strategies, update_init_section,
get_init_tcp/udp_params, TEST_DOMAINS, HTTP_STRATEGIES_CONF,
check_keenetic_specifics, discord_tcp variable.

Added .gitattributes to enforce LF line endings.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 00:38:58 +03:00

260 lines
9.5 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

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/sh
# z2k_cleanup.sh — полная зачистка zapret / zapret2 / nfqws / nfqws2
# Для экстренных случаев: зависшие процессы, остатки после удаления и т.д.
#
# ВНИМАНИЕ: Этот скрипт удаляет ВСЁ связанное с zapret и zapret2:
# - Процессы nfqws / nfqws2 (kill -9)
# - Init-скрипты S99zapret / S99zapret2
# - Netfilter хуки
# - Iptables цепочки и правила zapret/zapret2
# - Директории /opt/zapret и /opt/zapret2 (ПОЛНОСТЬЮ)
# - Временные файлы
#
# Использование:
# curl -fsSL https://raw.githubusercontent.com/necronicle/z2k/master/z2k_cleanup.sh | sh
# или
# sh z2k_cleanup.sh
set -e
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_info() { printf "${GREEN}[+]${NC} %s\n" "$1"; }
log_warn() { printf "${YELLOW}[!]${NC} %s\n" "$1"; }
log_error() { printf "${RED}[X]${NC} %s\n" "$1"; }
log_skip() { printf " %s\n" "$1"; }
echo ""
echo "============================================"
echo " z2k_cleanup — полная зачистка zapret(2)"
echo "============================================"
echo ""
log_warn "ВНИМАНИЕ: Будут удалены ВСЕ файлы zapret и zapret2!"
log_warn "Директории /opt/zapret и /opt/zapret2 будут удалены полностью."
echo ""
# ==========================================
# 1. Остановка init-скриптов (мягкая попытка)
# ==========================================
log_info "Попытка мягкой остановки через init-скрипты..."
for init in /opt/etc/init.d/S99zapret2 /opt/etc/init.d/S99zapret; do
if [ -x "$init" ]; then
log_info "Останавливаю: $init stop"
"$init" stop 2>/dev/null || log_warn " $init stop вернул ошибку (не критично)"
fi
done
# ==========================================
# 2. Убийство всех процессов nfqws / nfqws2
# ==========================================
log_info "Поиск и завершение процессов nfqws / nfqws2..."
killed=0
for proc_name in nfqws2 nfqws; do
pids=$(pidof "$proc_name" 2>/dev/null || true)
if [ -n "$pids" ]; then
for pid in $pids; do
log_warn " Убиваю $proc_name (PID $pid)"
kill -9 "$pid" 2>/dev/null || true
killed=$((killed + 1))
done
fi
done
# Дополнительный поиск через ps (на случай если pidof не нашёл)
for proc_name in nfqws2 nfqws; do
ps_pids=$(ps w 2>/dev/null | grep "[n]fq" | grep "$proc_name" | awk '{print $1}' || true)
if [ -n "$ps_pids" ]; then
for pid in $ps_pids; do
log_warn " Убиваю $proc_name (PID $pid, найден через ps)"
kill -9 "$pid" 2>/dev/null || true
killed=$((killed + 1))
done
fi
done
if [ "$killed" -eq 0 ]; then
log_skip "Запущенных процессов nfqws/nfqws2 не найдено"
else
log_info "Завершено процессов: $killed"
fi
# ==========================================
# 3. Очистка iptables правил и цепочек
# ==========================================
log_info "Очистка iptables правил zapret/zapret2..."
# Список известных цепочек zapret/zapret2
chains_mangle="ZAPRET ZAPRET2 z2k_connmark"
chains_nat="z2k_masq_fix zapret2_nat"
chains_raw="z2k_dpi_rst"
# Удаление из mangle
for chain in $chains_mangle; do
# Удалить ссылки из стандартных цепочек
for parent in POSTROUTING PREROUTING FORWARD; do
while iptables -t mangle -C "$parent" -j "$chain" 2>/dev/null; do
iptables -t mangle -D "$parent" -j "$chain" 2>/dev/null || break
log_info " Удалена ссылка mangle/$parent -> $chain"
done
while ip6tables -t mangle -C "$parent" -j "$chain" 2>/dev/null; do
ip6tables -t mangle -D "$parent" -j "$chain" 2>/dev/null || break
log_info " Удалена ссылка mangle/$parent -> $chain (IPv6)"
done
done
# Flush и удаление самой цепочки
iptables -t mangle -F "$chain" 2>/dev/null && log_info " Очищена mangle/$chain"
iptables -t mangle -X "$chain" 2>/dev/null && log_info " Удалена mangle/$chain"
ip6tables -t mangle -F "$chain" 2>/dev/null && log_info " Очищена mangle/$chain (IPv6)"
ip6tables -t mangle -X "$chain" 2>/dev/null && log_info " Удалена mangle/$chain (IPv6)"
done
# Удаление из nat
for chain in $chains_nat; do
while iptables -t nat -C POSTROUTING -j "$chain" 2>/dev/null; do
iptables -t nat -D POSTROUTING -j "$chain" 2>/dev/null || break
done
iptables -t nat -F "$chain" 2>/dev/null && log_info " Очищена nat/$chain"
iptables -t nat -X "$chain" 2>/dev/null && log_info " Удалена nat/$chain"
done
# Удаление из raw
for chain in $chains_raw; do
while iptables -t raw -C PREROUTING -j "$chain" 2>/dev/null; do
iptables -t raw -D PREROUTING -j "$chain" 2>/dev/null || break
done
iptables -t raw -F "$chain" 2>/dev/null && log_info " Очищена raw/$chain"
iptables -t raw -X "$chain" 2>/dev/null && log_info " Удалена raw/$chain"
done
# Поиск и удаление любых оставшихся правил с упоминанием nfqws/zapret
for table in mangle nat raw filter; do
# Ищем правила с nfqueue (nfqws использует NFQUEUE target)
rule_nums=$(iptables -t "$table" -L POSTROUTING --line-numbers -n 2>/dev/null \
| grep -i "NFQUEUE\|zapret\|nfqws\|z2k" | awk '{print $1}' | sort -rn || true)
for num in $rule_nums; do
iptables -t "$table" -D POSTROUTING "$num" 2>/dev/null && \
log_info " Удалено правило POSTROUTING #$num из $table"
done
done
# ==========================================
# 4. Удаление init-скриптов
# ==========================================
log_info "Удаление init-скриптов..."
for init in /opt/etc/init.d/S99zapret2 /opt/etc/init.d/S99zapret \
/opt/etc/init.d/S99nfqws /opt/etc/init.d/S99nfqws2; do
if [ -f "$init" ]; then
rm -f "$init"
log_info " Удалён: $init"
fi
done
# ==========================================
# 5. Удаление netfilter хуков
# ==========================================
log_info "Удаление netfilter хуков..."
for hook in /opt/etc/ndm/netfilter.d/000-zapret2.sh \
/opt/etc/ndm/netfilter.d/000-zapret.sh \
/opt/etc/ndm/netfilter.d/*zapret*; do
if [ -f "$hook" ]; then
rm -f "$hook"
log_info " Удалён: $hook"
fi
done
# ==========================================
# 6. Удаление директорий
# ==========================================
log_info "Удаление директорий zapret/zapret2..."
for dir in /opt/zapret2 /opt/zapret; do
if [ -d "$dir" ]; then
rm -rf "$dir"
log_info " Удалена: $dir"
else
log_skip "$dir не найдена (уже удалена)"
fi
done
# ==========================================
# 7. Очистка временных файлов
# ==========================================
log_info "Очистка временных файлов..."
for tmpdir in /tmp/z2k /tmp/zapret /tmp/zapret2 /tmp/blockcheck*; do
if [ -e "$tmpdir" ]; then
rm -rf "$tmpdir"
log_info " Удалён: $tmpdir"
fi
done
# ==========================================
# 8. Очистка ipset (если остались)
# ==========================================
log_info "Очистка ipset..."
for setname in zapret zapret2 z2k; do
if ipset list "$setname" >/dev/null 2>&1; then
ipset destroy "$setname" 2>/dev/null && log_info " Удалён ipset: $setname"
fi
done
# Поиск ipset с zapret в имени
ipset_list=$(ipset list -n 2>/dev/null | grep -i "zapret\|z2k" || true)
for setname in $ipset_list; do
ipset destroy "$setname" 2>/dev/null && log_info " Удалён ipset: $setname"
done
# ==========================================
# 9. Финальная проверка
# ==========================================
echo ""
log_info "=== Финальная проверка ==="
# Проверка процессов
remaining=$(ps w 2>/dev/null | grep -c "[n]fqws" || echo 0)
if [ "$remaining" -gt 0 ]; then
log_error "Остались запущенные процессы nfqws! Проверьте: ps | grep nfqws"
else
log_info "Процессы nfqws/nfqws2: не найдены"
fi
# Проверка директорий
for dir in /opt/zapret /opt/zapret2; do
if [ -d "$dir" ]; then
log_error "Директория всё ещё существует: $dir"
else
log_info "Директория удалена: $dir"
fi
done
# Проверка init-скриптов
for init in /opt/etc/init.d/S99zapret /opt/etc/init.d/S99zapret2; do
if [ -f "$init" ]; then
log_error "Init-скрипт всё ещё существует: $init"
fi
done
echo ""
echo "============================================"
log_info "Зачистка завершена."
log_info "Для переустановки z2k:"
echo " curl -fsSL https://raw.githubusercontent.com/necronicle/z2k/master/z2k.sh | sh"
echo "============================================"
echo ""