config check + new features

This commit is contained in:
Snowy-Fluffy
2026-01-03 15:45:56 +03:00
parent 203377e4aa
commit 3fef63801f
5 changed files with 339 additions and 2 deletions

View File

@@ -129,7 +129,10 @@ toggle_game_mode() {
if [[ $game_mode_status == "включен" ]]; then
rm -f /opt/zapret/ipset/ipset-game.txt
touch /opt/zapret/ipset/ipset-game.txt || error_exit "не удалось создать ipset для игрвого режима"
echo "203.0.113.77" >> /opt/zapret/ipset/ipset-game.txt
else
rm -f /opt/zapret/ipset/ipset-game.txt
touch /opt/zapret/ipset/ipset-game.txt || error_exit "не удалось создать ipset для игрвого режима"
echo "0.0.0.0/0" >> /opt/zapret/ipset/ipset-game.txt
fi
manage_service restart
@@ -345,3 +348,264 @@ search_in_zapret() {
main_menu
}
test_domain() {
local domain="$1"
local results=()
domain=$(echo "$domain" | sed 's/#.*//' | xargs)
[[ -z "$domain" ]] && return
if [[ "$domain" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
ping_result=$(ping -c 2 -W 2 "$domain" 2>/dev/null | grep -E "rtt min/avg/max/mdev" | awk -F'/' '{print $5}')
if [[ -n "$ping_result" ]]; then
results=("${ping_result}ms" "N/A" "N/A" "N/A")
else
results=("FAIL" "N/A" "N/A" "N/A")
fi
else
ping_result=$(ping -c 2 -W 2 "$domain" 2>/dev/null | grep -E "rtt min/avg/max/mdev" | awk -F'/' '{print $5}')
if [[ -n "$ping_result" ]]; then
results+=("${ping_result}ms")
else
results+=("FAIL")
fi
http_result=$(timeout 5 curl -s -o /dev/null -w "%{http_code}" "http://$domain" 2>/dev/null || echo "FAIL")
if [[ "$http_result" =~ ^[0-9]+$ ]]; then
results+=("HTTP:$http_result")
else
results+=("FAIL")
fi
tls12_result=$(timeout 5 curl -s -o /dev/null -w "%{http_code}" --tlsv1.2 "https://$domain" 2>/dev/null || echo "FAIL")
if [[ "$tls12_result" =~ ^[0-9]+$ ]]; then
results+=("TLS1.2:$tls12_result")
else
results+=("FAIL")
fi
tls13_result=$(timeout 5 curl -s -o /dev/null -w "%{http_code}" --tlsv1.3 "https://$domain" 2>/dev/null || echo "FAIL")
if [[ "$tls13_result" =~ ^[0-9]+$ ]]; then
results+=("TLS1.3:$tls13_result")
else
results+=("FAIL")
fi
fi
echo "${results[@]}"
}
print_table_header() {
echo "┌─────────────────────────────────────────────────────────────────────────────┐"
printf "│ %-30s │ %-8s │ %-10s │ %-10s │ %-10s │\n" "Домен/IP" "Ping" "HTTP" "TLS1.2" "TLS1.3"
echo "├─────────────────────────────────────────────────────────────────────────────┤"
}
print_table_row() {
local domain="$1"
local ping="$2"
local http="$3"
local tls12="$4"
local tls13="$5"
local display_domain="$domain"
if [[ ${#domain} -gt 30 ]]; then
display_domain="${domain:0:27}..."
fi
printf "│ %-30s %-8s %-10s %-10s %-10s \n" "$display_domain" "$ping" "$http" "$tls12" "$tls13"
}
test_all_domains() {
local config_name="$1"
local list_path="$2"
local total=0
local available=0
echo "┌─────────────────────────────────────────────────────────────────────────────┐"
echo "│ Стратегия: $config_name"
echo "├─────────────────────────────────────────────────────────────────────────────┤"
print_table_header
local results_lines=()
while IFS= read -r line || [[ -n "$line" ]]; do
line=$(echo "$line" | sed 's/#.*//' | xargs)
[[ -z "$line" ]] && continue
total=$((total + 1))
results=($(test_domain "$line"))
local is_available=0
if [[ "${results[0]}" != "FAIL" ]] && \
([[ "${results[2]}" =~ ^TLS1\.2:[23] ]] || [[ "${results[3]}" =~ ^TLS1\.3:[23] ]]); then
available=$((available + 1))
is_available=1
fi
results_lines+=("$line|${results[0]}|${results[1]}|${results[2]}|${results[3]}|$is_available")
done < "$list_path"
for line_info in "${results_lines[@]}"; do
IFS='|' read -r domain ping http tls12 tls13 is_available <<< "$line_info"
print_table_row "$domain" "$ping" "$http" "$tls12" "$tls13"
done
echo "├─────────────────────────────────────────────────────────────────────────────┤"
printf "│ Доступно: %d/%d доменов/IP │\n" "$available" "$total"
echo "└─────────────────────────────────────────────────────────────────────────────┘"
echo ""
echo "$available"
}
apply_config() {
local config="$1"
echo -e "\e[33mПрименяем стратегию: $config\e[0m"
CONFIG_PATH="/opt/zapret/zapret.cfgs/configurations/$config"
if [[ ! -f "$CONFIG_PATH" ]]; then
echo -e "\e[31mФайл конфигурации не найден: $CONFIG_PATH\e[0m"
fi
rm -f /opt/zapret/config
cp "$CONFIG_PATH" /opt/zapret/config || error_exit "не удалось скопировать стратегию"
get_fwtype
sed -i "s/^FWTYPE=.*/FWTYPE=$FWTYPE/" /opt/zapret/config
manage_service restart
}
check_conf() {
configure_zapret_list
check_list
echo -e "\e[36mНачинаем проверку всех стратегий...\e[0m"
echo -e "\e[33mВсего стратегий: ${#configs[@]}\e[0m"
echo ""
stats_file="/tmp/zapret_final_stats_$$.txt"
> "$stats_file"
local best_config=""
local best_available=0
local total_domains=0
total_domains=0
while IFS= read -r line || [[ -n "$line" ]]; do
line=$(echo "$line" | sed 's/#.*//' | xargs)
[[ -n "$line" ]] && total_domains=$((total_domains + 1))
done < "$LIST_PATH"
for config in "${configs[@]}"; do
echo "──────────────────────────────────────────────────────────────────────────────"
echo ""
if ! apply_config "$config"; then
echo -e "\e[31mНе удалось применить стратегию: $config\e[0m"
echo ""
continue
fi
available=$(test_all_domains "$config" "$LIST_PATH" | tee /dev/tty | tail -1)
if [[ "$available" =~ ^[0-9]+$ ]]; then
echo "$config $available" >> "$stats_file"
if [[ $available -gt $best_available ]]; then
best_available=$available
best_config="$config"
fi
else
echo -e "\e[31mОшибка при тестировании стратегии: $config\e[0m"
fi
done
echo ""
echo -e "\e[42m\e[30m╔══════════════════════════════════════════════════════════════════════════╗\e[0m"
echo -e "\e[42m\e[30m║ ИТОГОВЫЙ РЕЗУЛЬТАТ ║\e[0m"
echo -e "\e[42m\e[30m╠══════════════════════════════════════════════════════════════════════════╣\e[0m"
echo -e "\e[42m\e[30m║ ║\e[0m"
printf "\e[42m\e[30m║ Лучшая стратегия: %-52s ║\n\e[0m" "$best_config"
printf "\e[42m\e[30m║ Доступно доменов/IP: %-3d из %-3d (%.1f%%) ║\n\e[0m" "$best_available" "$total_domains" $(echo "scale=1; $best_available * 100 / $total_domains" | bc)
echo -e "\e[42m\e[30m║ ║\e[0m"
echo -e "\e[42m\e[30m╚══════════════════════════════════════════════════════════════════════════╝\e[0m"
echo ""
echo -e "\e[33mПрименяем лучшую стратегию: $best_config\e[0m"
apply_config "$best_config"
if [[ -f "$stats_file" ]] && [[ $(wc -l < "$stats_file") -gt 0 ]]; then
echo ""
echo -e "\e[36mСтатистика по всем стратегиям:\e[0m"
echo "┌──────────────────────────────────────────────────────┐"
printf "│ %-30s │ %-10s │ %-6s │\n" "Стратегия" "Доступно" "%"
echo "├──────────────────────────────────────────────────────┤"
while read -r line; do
read -r config count <<< "$line"
if [[ "$count" =~ ^[0-9]+$ ]] && [[ $total_domains -gt 0 ]]; then
percentage=$(echo "scale=1; $count * 100 / $total_domains" | bc)
printf "│ %-30s │ %-10s │ %-5s%% │\n" "$config" "$count/$total_domains" "$percentage"
fi
done < "$stats_file"
echo "└──────────────────────────────────────────────────────┘"
fi
rm -f "$stats_file"
return 0
}
check_list() {
LINE_COUNT=$(wc -l < "/opt/zapret/ipset/zapret-hosts-user.txt" 2>/dev/null || echo "0")
if [ "$LINE_COUNT" = "0" ] && [ -s "/opt/zapret/ipset/zapret-hosts-user.txt" ]; then
LINE_COUNT=$(awk 'END{print NR}' "/opt/zapret/ipset/zapret-hosts-user.txt" 2>/dev/null || echo "0")
fi
if ! [[ "$LINE_COUNT" =~ ^[0-9]+$ ]]; then
echo "Ошибка: Не удалось подсчитать строки в файле"
exit 1
fi
echo "В выбраном листе $LINE_COUNT доменов/айпи."
if [ "$LINE_COUNT" -gt 100 ]; then
echo "Проверка может занять *ОЧЕНЬ* много времени!"
echo ""
read -p "Нажмите Enter для продолжения или Ctrl+C для отмены... "
fi
}
check_conf_simple() {
rm -f /opt/zapret/ipset/zapret-hosts-user.txt
cp -r /opt/zapret/zapret.cfgs/lists/list-simple.txt /opt/zapret/ipset/zapret-hosts-user.txt
check_list
echo -e "\e[36mНачинаем проверку всех стратегий...\e[0m"
echo -e "\e[33mВсего стратегий: ${#configs[@]}\e[0m"
echo ""
stats_file="/tmp/zapret_final_stats_$$.txt"
> "$stats_file"
local best_config=""
local best_available=0
local total_domains=0
total_domains=0
while IFS= read -r line || [[ -n "$line" ]]; do
line=$(echo "$line" | sed 's/#.*//' | xargs)
[[ -n "$line" ]] && total_domains=$((total_domains + 1))
done < "$LIST_PATH"
for config in "${configs[@]}"; do
echo "──────────────────────────────────────────────────────────────────────────────"
echo ""
if ! apply_config "$config"; then
echo -e "\e[31mНе удалось применить стратегию: $config\e[0m"
echo ""
continue
fi
available=$(test_all_domains "$config" "$LIST_PATH" | tee /dev/tty | tail -1)
if [[ "$available" =~ ^[0-9]+$ ]]; then
echo "$config $available" >> "$stats_file"
if [[ $available -gt $best_available ]]; then
best_available=$available
best_config="$config"
fi
else
echo -e "\e[31mОшибка при тестировании стратегии: $config\e[0m"
fi
done
echo ""
echo -e "\e[42m\e[30m╔══════════════════════════════════════════════════════════════════════════╗\e[0m"
echo -e "\e[42m\e[30m║ ИТОГОВЫЙ РЕЗУЛЬТАТ ║\e[0m"
echo -e "\e[42m\e[30m╠══════════════════════════════════════════════════════════════════════════╣\e[0m"
echo -e "\e[42m\e[30m║ ║\e[0m"
printf "\e[42m\e[30m║ Лучшая стратегия: %-52s ║\n\e[0m" "$best_config"
printf "\e[42m\e[30m║ Доступно доменов/IP: %-3d из %-3d (%.1f%%) ║\n\e[0m" "$best_available" "$total_domains" $(echo "scale=1; $best_available * 100 / $total_domains" | bc)
echo -e "\e[42m\e[30m║ ║\e[0m"
echo -e "\e[42m\e[30m╚══════════════════════════════════════════════════════════════════════════╝\e[0m"
echo ""
echo -e "\e[33mПрименяем лучшую стратегию: $best_config\e[0m"
apply_config "$best_config"
if [[ -f "$stats_file" ]] && [[ $(wc -l < "$stats_file") -gt 0 ]]; then
echo ""
echo -e "\e[36mСтатистика по всем стратегиям:\e[0m"
echo "┌──────────────────────────────────────────────────────┐"
printf "│ %-30s │ %-10s │ %-6s │\n" "Стратегия" "Доступно" "%"
echo "├──────────────────────────────────────────────────────┤"
while read -r line; do
read -r config count <<< "$line"
if [[ "$count" =~ ^[0-9]+$ ]] && [[ $total_domains -gt 0 ]]; then
percentage=$(echo "scale=1; $count * 100 / $total_domains" | bc)
printf "│ %-30s │ %-10s │ %-5s%% │\n" "$config" "$count/$total_domains" "$percentage"
fi
done < "$stats_file"
echo "└──────────────────────────────────────────────────────┘"
fi
rm -f "$stats_file"
return 0
}

View File

@@ -292,7 +292,7 @@ update_zapret() {
rm -rf $TEMP_DIR_BIN
rm -f /opt/zapret/config
cp -r /opt/zapret/zapret.cfgs/configurations/general /opt/zapret/config || error_exit "не удалось автоматически скопировать конфиг"
cp -r /opt/zapret/zapret.cfgs/bin/* /opt/zapret/files/fake || error_exit "не удалось автоматически скопировать fake bin"
cp -r /opt/zapret/zapret.cfgs/bin/* /opt/zapret/files/fake/ || error_exit "не удалось автоматически скопировать fake bin"
rm -f /opt/zapret/ipset/zapret-hosts-user.txt
touch /opt/zapret/ipset/ipset-game.txt || error_exit "не удалось автоматически создать game ipset"
cp -r /opt/zapret/zapret.cfgs/lists/list-basic.txt /opt/zapret/ipset/zapret-hosts-user.txt || error_exit "не удалось автоматически скопировать хостлист"

View File

@@ -107,6 +107,8 @@ change_configuration() {
echo -e " \e[1;34m6)\e[0m Найти IP или домены в листе"
echo -e " \e[1;34m7)\e[0m Установить стратегию из файла (путь)"
echo -e " \e[1;34m8)\e[0m Установить хостлист из файла (путь)"
echo -e " \e[1;34m9)\e[0m Редактировать стратегию напрямую"
echo -e " \e[1;34m10)\e[0m Редактировать хостлист напрямую"
echo ""
echo -e "\e[1;96mСделано\e[0m by: \e[4;94mhttps://t.me/linux_hi\e[0m"
echo ""
@@ -114,18 +116,66 @@ change_configuration() {
read -p $'\e[1;36mВыберите действие: \e[0m' CHOICE
case "$CHOICE" in
1) toggle_game_mode ;;
2) configure_zapret_conf ;;
2) configure_zapret_menu ;;
3) configure_zapret_list ;;
4) add_to_zapret ;;
5) delete_from_zapret ;;
6) search_in_zapret ;;
7) configure_custom_conf_path ;;
8) configure_custom_list_path ;;
9) open_editor /opt/zapret/config ;;
10) open_editor /opt/zapret/ipset/zapret-hosts-user.txt ;;
0) main_menu ;;
*) echo -e "\e[1;31mНеверный ввод! Попробуйте снова.\e[0m"; sleep 2 ;;
esac
done
}
configure_zapret_menu(){
while true; do
clear
cur_conf
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;31m0)\e[0m Выйти в меню"
echo -e " \e[1;34m1)\e[0m Выбрать стратегию вручную"
echo -e " \e[1;34m2)\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) auto_conf_check;;
0) main_menu;;
*) echo -e "\e[1;31m Неверный ввод! Попробуйте снова.\e[0m"; sleep 2;;
esac
done
}
auto_conf_check(){
while true; do
clear
cur_conf
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;31m0)\e[0m Выйти в меню"
echo -e " \e[1;34m1)\e[0m Подобрать стратегию автоматически"
echo -e " \e[1;34m2)\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) check_conf_simple;;
2) check_conf;;
0) main_menu;;
*) echo -e "\e[1;31m Неверный ввод! Попробуйте снова.\e[0m"; sleep 2;;
esac
done
}
update_zapret_menu(){
while true; do

View File

@@ -71,3 +71,25 @@ try_again() {
(( success == 0 )) && error_exit "$error_message"
}
open_editor() {
local file_path="$1"
if [ ! -f "$1" ]; then
error_exit "заданного файла не существует"
fi
if [ -z "$EDITOR" ] || [ ! -n "$EDITOR" ]; then
echo "Переменная EDITOR пуста"
echo ""
echo "Продолжаю через 5 секунд..."
sleep 5
main_menu
fi
"$EDITOR" "$1"
main_menu
}
fast_exit(){
$TPUT_E
echo "Выход по запросу пользователя"
exit 1
}

View File

@@ -25,6 +25,7 @@ fi
if [[ $EUID -ne 0 ]]; then
exec $SUDO "$0" "$@"
fi
trap fast_exit SIGINT
check_openwrt
check_tput
$TPUT_B