v2.3.0: Lite/Pro rebrand, submenu system, traffic stats, bot stats

This commit is contained in:
anten-ka
2026-04-08 21:49:03 +03:00
parent 364501d66d
commit 6ec2123f83
11 changed files with 884 additions and 387 deletions

View File

@@ -1,6 +1,6 @@
#!/bin/bash
# ══════════════════════════════════════════════════════════════════════════════
# GoTelegram v2.2.1 — MTProxy на ядре telemt (Rust + Tokio)
# GoTelegram v2.3.0 — MTProxy на ядре telemt (Rust + Tokio)
# Anti-DPI • Fake TLS • TCP Splice • JA3/JA4 Resistance
#
# Установка:
@@ -20,8 +20,9 @@ source "$LIB_DIR/telemt_config.sh"
source "$LIB_DIR/website.sh"
source "$LIB_DIR/templates_catalog.sh"
source "$LIB_DIR/backup.sh"
[ -f "$LIB_DIR/stats.sh" ] && source "$LIB_DIR/stats.sh"
# ── Главное меню ─────────────────────────────────────────────────────────────
# ── Главное меню (Compact Dashboard + 5 Top-Level Items) ──────────────────────
show_main_menu() {
local proxy_status bot_status nginx_st mode domain secret port ip link ssl_expiry
proxy_status=$(telemt_status)
@@ -33,14 +34,14 @@ show_main_menu() {
port=$(get_config_value port 2>/dev/null || echo "443")
ip=$(get_server_ip 2>/dev/null || echo "N/A")
local W=60
local W=54
local line; line=$(printf '━%.0s' $(seq 1 $W))
local line2; line2=$(printf '─%.0s' $(seq 1 $W))
# ── Заголовок ──
echo ""
echo -e " ${BOLD}${CYAN}${line}${NC}"
echo -e " ${BOLD}${CYAN}${NC} ${BOLD}${WHITE}GoTelegram v${GOTELEGRAM_VERSION}${NC} Панель мониторинга ${BOLD}${CYAN}${NC}"
echo -e " ${BOLD}${CYAN}${NC} ${BOLD}${WHITE}GoTelegram v${GOTELEGRAM_VERSION}${NC} Панель управления ${BOLD}${CYAN}${NC}"
echo -e " ${BOLD}${CYAN}${line}${NC}"
# ── Здоровье сервисов ──
@@ -62,10 +63,10 @@ show_main_menu() {
running) nginx_icon="●"; nginx_color="${GREEN}" ;;
*) nginx_icon="✗"; nginx_color="${RED}" ;;
esac
echo -e " ${nginx_color}${nginx_icon}${NC} nginx ${nginx_color}${nginx_st}${NC} ${DIM}(127.0.0.1:8443)${NC}"
echo -e " ${nginx_icon}${nginx_color}${NC} nginx ${nginx_color}${nginx_st}${NC} ${DIM}(127.0.0.1:8443)${NC}"
# Site (stealth)
if [ "$mode" = "stealth" ] && [ -n "$domain" ]; then
# Site (pro)
if [ "$mode" = "pro" ] && [ -n "$domain" ]; then
local site_icon site_color
if curl -sk --max-time 3 "https://${domain}/" -o /dev/null 2>/dev/null; then
site_icon="●"; site_color="${GREEN}"
@@ -96,7 +97,7 @@ show_main_menu() {
# ── Прокси-ссылка + QR ──
if [ -n "$secret" ] && [ "$proxy_status" = "running" ]; then
if [ "$mode" = "stealth" ] && [ -n "$domain" ]; then
if [ "$mode" = "pro" ] && [ -n "$domain" ]; then
local raw_secret faketls_secret domain_hex
raw_secret="$secret"
domain_hex=$(printf '%s' "$domain" | xxd -p | tr -d '\n')
@@ -117,27 +118,129 @@ show_main_menu() {
echo ""
fi
else
echo -e " ${DIM}Прокси не настроен. Выберите п.1 для установки.${NC}"
echo -e " ${DIM}Прокси не настроен. Выберите пункт 1.${NC}"
echo ""
fi
# ── Меню ──
echo -e " ${DIM}${line2}${NC}"
echo -e " ${DIM}ПРОКСИ${NC} ${DIM}УПРАВЛЕНИЕ${NC}"
echo -e " ${CYAN}1${NC}) Установить / Обновить ${CYAN}8${NC}) Бекап"
echo -e " ${CYAN}2${NC}) Статус подробно ${CYAN}9${NC}) Восстановить"
echo -e " ${CYAN}3${NC}) Скопировать ссылку ${CYAN}10${NC}) Обновить telemt"
echo -e " ${CYAN}4${NC}) Поделиться ключом ${CYAN}11${NC}) Сайт / SSL"
echo -e " ${CYAN}5${NC}) Перезапуск"
echo -e " ${CYAN}6${NC}) Логи ${DIM}БОТ И ПРОЧЕЕ${NC}"
echo -e " ${CYAN}7${NC}) Сменить режим / шаблон ${CYAN}12${NC}) Telegram-бот"
echo -e " ${CYAN}13${NC}) Удалить всё"
echo -e " ${CYAN}0${NC}) ${DIM}Выход${NC} ${CYAN}14${NC}) Промо"
echo -e " ${CYAN}1${NC}) Прокси ▸"
echo -e " ${CYAN}2${NC}) Статистика ▸"
echo -e " ${CYAN}3${NC}) Управление ▸"
echo -e " ${CYAN}4${NC}) Telegram-бот ▸"
echo -e " ${CYAN}5${NC}) О программе ▸"
echo -e " ${CYAN}0${NC}) ${DIM}Выход${NC}"
echo -e " ${DIM}${line2}${NC}"
echo -e " ${DIM}Обновление через 30 сек${NC}"
echo -e " ${DIM}Обновление через 1 сек${NC}"
echo -ne " ${WHITE}${NC}"
}
# ── Подменю: Прокси ──────────────────────────────────────────────────────────
submenu_proxy() {
while true; do
echo ""
echo -e " ${BOLD}${WHITE}🚀 ПРОКСИ${NC}"
echo -e " ${DIM}$(printf '─%.0s' {1..54})${NC}"
echo -e " ${CYAN}1${NC}) Установить / Обновить"
echo -e " ${CYAN}2${NC}) Статус подробно"
echo -e " ${CYAN}3${NC}) Скопировать ссылку"
echo -e " ${CYAN}4${NC}) Поделиться ключом"
echo -e " ${CYAN}5${NC}) Перезапуск"
echo -e " ${CYAN}6${NC}) Логи"
echo -e " ${CYAN}7${NC}) Сменить режим / шаблон"
echo -e " ${CYAN}0${NC}) « Назад"
echo -e " ${DIM}$(printf '─%.0s' {1..54})${NC}"
echo -ne " ${WHITE}Выбор:${NC} "
read -r ch
case "$ch" in
1) menu_install ;;
2) menu_status ;;
3) menu_link ;;
4) menu_share ;;
5) menu_restart ;;
6) menu_logs ;;
7) menu_change_mode ;;
0) break ;;
*) log_error "Неверный выбор" ;;
esac
echo ""
echo -ne " ${DIM}Нажмите Enter...${NC}"
read -r
done
}
# ── Подменю: Управление ──────────────────────────────────────────────────────
submenu_manage() {
while true; do
echo ""
echo -e " ${BOLD}${WHITE}⚙️ УПРАВЛЕНИЕ${NC}"
echo -e " ${DIM}$(printf '─%.0s' {1..54})${NC}"
echo -e " ${CYAN}1${NC}) Бекап"
echo -e " ${CYAN}2${NC}) Восстановить"
echo -e " ${CYAN}3${NC}) Обновить telemt"
echo -e " ${CYAN}4${NC}) Сайт / SSL"
echo -e " ${CYAN}5${NC}) Удалить"
echo -e " ${CYAN}0${NC}) « Назад"
echo -e " ${DIM}$(printf '─%.0s' {1..54})${NC}"
echo -ne " ${WHITE}Выбор:${NC} "
read -r ch
case "$ch" in
1) interactive_backup ;;
2) interactive_restore ;;
3) update_telemt ;;
4) menu_website ;;
5) menu_remove ;;
0) break ;;
*) log_error "Неверный выбор" ;;
esac
echo ""
echo -ne " ${DIM}Нажмите Enter...${NC}"
read -r
done
}
# ── Подменю: О программе ─────────────────────────────────────────────────────
submenu_about() {
while true; do
echo ""
echo -e " ${BOLD}${WHITE} О ПРОГРАММЕ${NC}"
echo -e " ${DIM}$(printf '─%.0s' {1..54})${NC}"
echo -e " ${CYAN}1${NC}) Информация о версии"
echo -e " ${CYAN}2${NC}) Промо / Донат"
echo -e " ${CYAN}0${NC}) « Назад"
echo -e " ${DIM}$(printf '─%.0s' {1..54})${NC}"
echo -ne " ${WHITE}Выбор:${NC} "
read -r ch
case "$ch" in
1) menu_version ;;
2) menu_promo ;;
0) break ;;
*) log_error "Неверный выбор" ;;
esac
echo ""
echo -ne " ${DIM}Нажмите Enter...${NC}"
read -r
done
}
# ── Информация о версии ──────────────────────────────────────────────────────
menu_version() {
echo ""
echo -e " ${BOLD}${WHITE}🔍 Информация${NC}"
echo -e " ${DIM}$(printf '─%.0s' {1..54})${NC}"
echo -e " ${WHITE}GoTelegram:${NC} v${GOTELEGRAM_VERSION}"
echo -e " ${WHITE}Ядро:${NC} telemt (Rust + Tokio)"
echo -e " ${WHITE}Технология:${NC} Anti-DPI, Fake TLS, TCP Splice"
echo -e " ${WHITE}Лицензия:${NC} MIT"
echo -e " ${DIM}$(printf '─%.0s' {1..54})${NC}"
}
# ── Установка: выбор режима ──────────────────────────────────────────────────
menu_install() {
# Проверяем v1
@@ -154,29 +257,29 @@ menu_install() {
echo ""
echo -e " ${BOLD}${WHITE}🎭 Выберите режим маскировки:${NC}"
echo -e " ${DIM}$(printf '─%.0s' {1..55})${NC}"
echo -e " ${CYAN}1)${NC} ${GREEN}Quick${NC} — маскировка под популярный сайт"
echo -e " ${CYAN}1)${NC} ${GREEN}Lite${NC} — маскировка под популярный сайт"
echo -e " ${DIM}Быстро, без домена. telemt маскирует трафик${NC}"
echo -e " ${DIM}под выбранный сайт (google.com и т.д.)${NC}"
echo ""
echo -e " ${CYAN}2)${NC} ${MAGENTA}🛡 Stealth${NC} — свой сайт + полная маскировка"
echo -e " ${CYAN}2)${NC} ${MAGENTA}🛡 Pro${NC} — свой сайт + полная маскировка"
echo -e " ${DIM}nginx + SSL + HTML-шаблон + telemt.${NC}"
echo -e " ${DIM}DPI видит реальный сайт с реальным сертификатом.${NC}"
echo -e " ${DIM}Требует: домен, направленный на этот сервер.${NC}"
echo -e " ${DIM}Требует: домен, направленный на этот сервер.{{NC}"
echo -e " ${DIM}$(printf '─%.0s' {1..55})${NC}"
echo -ne " ${WHITE}Выбор (1/2):${NC} "
read -r mode_choice
mode_choice="${mode_choice:-}"
case "$mode_choice" in
1) install_quick_mode ;;
2) install_stealth_mode ;;
1) install_lite_mode ;;
2) install_pro_mode ;;
*) log_error "Неверный выбор: ${mode_choice:-<пусто>}" ;;
esac
}
# ── Quick-режим ──────────────────────────────────────────────────────────────
install_quick_mode() {
log_step "Установка Quick-режима"
# ── Lite-режим ──────────────────────────────────────────────────────────────
install_lite_mode() {
log_step "Установка Lite-режима"
# Выбор домена
local domain
@@ -200,7 +303,7 @@ install_quick_mode() {
echo -e " IP: ${CYAN}${ip}${NC}"
echo -e " Порт: ${CYAN}${port}${NC}"
echo -e " Маскировка: ${CYAN}${domain}${NC}"
echo -e " Режим: ${GREEN}Quick${NC}"
echo -e " Режим: ${GREEN}Lite${NC}"
echo ""
if ! confirm "Установить прокси?"; then
@@ -212,7 +315,7 @@ install_quick_mode() {
install_telemt_full || return
# Генерируем конфиг telemt
generate_telemt_toml "$secret" "$port" "quick" "$domain" "443"
generate_telemt_toml "$secret" "$port" "lite" "$domain" "443"
# Валидация
validate_telemt_config || return
@@ -221,19 +324,19 @@ install_quick_mode() {
start_telemt || return
# Сохраняем GoTelegram конфиг
save_gotelegram_config "telemt" "quick" "$port" "$secret" "$domain" "" ""
save_gotelegram_config "telemt" "lite" "$port" "$secret" "$domain" "" ""
# Благодарности
show_credits
# Результат
show_proxy_info
log_success "GoTelegram v${GOTELEGRAM_VERSION} установлен! (Quick-режим)"
log_success "GoTelegram v${GOTELEGRAM_VERSION} установлен! (Lite-режим)"
}
# ── Stealth-режим ────────────────────────────────────────────────────────────
install_stealth_mode() {
log_step "Установка Stealth-режима"
# ── Pro-режим ────────────────────────────────────────────────────────────────
install_pro_mode() {
log_step "Установка Pro-режима"
# Ввод домена
echo ""
@@ -266,7 +369,7 @@ install_stealth_mode() {
template_dir=$(interactive_template_selection)
[ $? -ne 0 ] && return
# Архитектура Stealth:
# Архитектура Pro:
# telemt слушает на 0.0.0.0:443 (принимает ВСЕ подключения)
# nginx слушает на 127.0.0.1:8443 с SSL (обслуживает сайт)
# MTProxy клиент → :443 → telemt (проксирует)
@@ -291,7 +394,7 @@ install_stealth_mode() {
echo -e " ${BOLD}${WHITE}📋 Конфигурация:${NC}"
echo -e " Домен: ${CYAN}${user_domain}${NC}"
echo -e " Порт: ${CYAN}443 (telemt + nginx внутри)${NC}"
echo -e " Режим: ${MAGENTA}Stealth (fake-TLS)${NC}"
echo -e " Режим: ${MAGENTA}Pro (fake-TLS)${NC}"
echo ""
if ! confirm "Установить прокси + сайт?"; then
@@ -303,10 +406,10 @@ install_stealth_mode() {
install_telemt_full || return
# Конфиг telemt: слушает 443, маскировка на локальный nginx через dns_override
generate_telemt_toml "$raw_secret" "443" "stealth" "$user_domain" "$nginx_internal_port"
generate_telemt_toml "$raw_secret" "443" "pro" "$user_domain" "$nginx_internal_port"
# Настройка сайта (nginx на внутреннем порту + certbot + шаблон)
setup_stealth_mode "$user_domain" "$template_dir" "$nginx_internal_port" "$ssl_email" || return
setup_pro_mode "$user_domain" "$template_dir" "$nginx_internal_port" "$ssl_email" || return
# Останавливаем nginx на 443 перед запуском telemt (telemt займёт 443)
# nginx уже перенастроен на внутренний порт
@@ -318,22 +421,22 @@ install_stealth_mode() {
# Сохраняем конфиг
local tpl_id
tpl_id=$(basename "$template_dir")
save_gotelegram_config "telemt" "stealth" "443" "$raw_secret" "$user_domain" "$user_domain" "$tpl_id"
save_gotelegram_config "telemt" "pro" "443" "$raw_secret" "$user_domain" "$user_domain" "$tpl_id"
# Результат — используем домен и fake-TLS ссылку
show_proxy_info_stealth "$user_domain" "$faketls_secret"
show_proxy_info_pro "$user_domain" "$faketls_secret"
echo -e " ${WHITE}Сайт:${NC} ${GREEN}https://${user_domain}${NC}"
log_success "GoTelegram v${GOTELEGRAM_VERSION} установлен! (Stealth-режим)"
log_success "GoTelegram v${GOTELEGRAM_VERSION} установлен! (Pro-режим)"
}
# ── Статус ───────────────────────────────────────────────────────────────────
menu_status() {
show_proxy_info
# Дополнительно для stealth
# Дополнительно для pro
local mode
mode=$(config_get mode 2>/dev/null)
if [ "$mode" = "stealth" ]; then
if [ "$mode" = "pro" ]; then
local domain
domain=$(config_get domain 2>/dev/null)
if [ -n "$domain" ]; then
@@ -396,7 +499,7 @@ menu_restart() {
restart_telemt
local mode
mode=$(config_get mode 2>/dev/null)
if [ "$mode" = "stealth" ]; then
if [ "$mode" = "pro" ]; then
restart_nginx
fi
}
@@ -417,16 +520,16 @@ menu_change_mode() {
echo ""
echo -e " ${WHITE}Текущий режим:${NC} ${CYAN}${current_mode}${NC}"
echo ""
echo -e " ${CYAN}1)${NC} Сменить шаблон сайта (только stealth)"
echo -e " ${CYAN}2)${NC} Переключить режим (quick ↔ stealth)"
echo -e " ${CYAN}0)${NC} Назад"
echo -e " ${CYAN}1${NC}) Сменить шаблон сайта (только pro)"
echo -e " ${CYAN}2${NC}) Переключить режим (lite ↔ pro)"
echo -e " ${CYAN}0${NC}) Назад"
echo -ne " ${WHITE}Выбор:${NC} "
read -r ch
case "$ch" in
1)
if [ "$current_mode" != "stealth" ]; then
log_error "Смена шаблона доступна только в stealth-режиме"
if [ "$current_mode" != "pro" ]; then
log_error "Смена шаблона доступна только в pro-режиме"
return
fi
local template_dir
@@ -443,12 +546,13 @@ menu_change_mode() {
esac
}
# ── Управление сайтом ───────────────────────────────────────────────────────
# ── Управление сайтом ───────────────────────────────────────────────────────
menu_website() {
local mode
mode=$(config_get mode 2>/dev/null)
if [ "$mode" != "stealth" ]; then
log_info "Управление сайтом доступно только в stealth-режиме"
if [ "$mode" != "pro" ]; then
log_info "Управление сайтом доступно только в pro-режиме"
return
fi
@@ -460,10 +564,10 @@ menu_website() {
echo -e " Домен: ${CYAN}${domain}${NC}"
echo -e " SSL до: $(get_ssl_expiry "$domain")"
echo ""
echo -e " ${CYAN}1)${NC} Обновить SSL сертификат"
echo -e " ${CYAN}2)${NC} Перезапустить nginx"
echo -e " ${CYAN}3)${NC} Сменить шаблон"
echo -e " ${CYAN}0)${NC} Назад"
echo -e " ${CYAN}1${NC}) Обновить SSL сертификат"
echo -e " ${CYAN}2${NC}) Перезапустить nginx"
echo -e " ${CYAN}3${NC}) Сменить шаблон"
echo -e " ${CYAN}0${NC}) Назад"
echo -ne " ${WHITE}Выбор:${NC} "
read -r ch
@@ -484,10 +588,10 @@ menu_remove() {
echo ""
echo -e " ${BOLD}${RED}🗑 Удаление GoTelegram${NC}"
echo -e " ${DIM}$(printf '─%.0s' {1..55})${NC}"
echo -e " ${CYAN}1)${NC} Удалить только прокси (telemt)"
echo -e " ${CYAN}2)${NC} Удалить только Telegram-бота"
echo -e " ${CYAN}3)${NC} Удалить всё (прокси + бот + настройки)"
echo -e " ${CYAN}0)${NC} Назад"
echo -e " ${CYAN}1${NC}) Удалить только прокси (telemt)"
echo -e " ${CYAN}2${NC}) Удалить только Telegram-бота"
echo -e " ${CYAN}3${NC}) Удалить всё (прокси + бот + настройки)"
echo -e " ${CYAN}0${NC}) Назад"
echo -ne " ${WHITE}Выбор:${NC} "
read -r rm_choice
@@ -501,8 +605,8 @@ menu_remove() {
remove_telemt
local mode
mode=$(config_get mode 2>/dev/null)
if [ "$mode" = "stealth" ]; then
remove_stealth_mode
if [ "$mode" = "pro" ]; then
remove_pro_mode
fi
rm -f "$GOTELEGRAM_CONFIG"
log_success "Прокси удалён"
@@ -520,8 +624,8 @@ menu_remove() {
remove_telemt
local mode
mode=$(config_get mode 2>/dev/null)
if [ "$mode" = "stealth" ]; then
remove_stealth_mode
if [ "$mode" = "pro" ]; then
remove_pro_mode
fi
rm -f "$GOTELEGRAM_CONFIG"
# Бот
@@ -563,21 +667,21 @@ menu_bot() {
running)
echo -e " Статус: ${GREEN}● Работает${NC}"
echo ""
echo -e " ${CYAN}1)${NC} 📊 Статус бота"
echo -e " ${CYAN}2)${NC} 📋 Логи бота"
echo -e " ${CYAN}3)${NC} 🔄 Перезапустить бота"
echo -e " ${CYAN}4)${NC} ⏹ Остановить бота"
echo -e " ${CYAN}5)${NC} ⚙️ Настройки (.env)"
echo -e " ${CYAN}6)${NC} 🗑 Удалить бота"
echo -e " ${CYAN}1${NC}) 📊 Статус бота"
echo -e " ${CYAN}2${NC}) 📋 Логи бота"
echo -e " ${CYAN}3${NC}) 🔄 Перезапустить бота"
echo -e " ${CYAN}4${NC}) ⏹ Остановить бота"
echo -e " ${CYAN}5${NC}) ⚙️ Настройки (.env)"
echo -e " ${CYAN}6${NC}) 🗑 Удалить бота"
;;
stopped)
echo -e " Статус: ${YELLOW}○ Остановлен${NC}"
echo ""
echo -e " ${CYAN}1)${NC} 📊 Статус бота"
echo -e " ${CYAN}2)${NC} 📋 Логи бота"
echo -e " ${CYAN}3)${NC} ▶️ Запустить бота"
echo -e " ${CYAN}5)${NC} ⚙️ Настройки (.env)"
echo -e " ${CYAN}6)${NC} 🗑 Удалить бота"
echo -e " ${CYAN}1${NC}) 📊 Статус бота"
echo -e " ${CYAN}2${NC}) 📋 Логи бота"
echo -e " ${CYAN}3${NC}) ▶️ Запустить бота"
echo -e " ${CYAN}5${NC}) ⚙️ Настройки (.env)"
echo -e " ${CYAN}6${NC}) 🗑 Удалить бота"
;;
*)
echo -e " Статус: ${RED}Не установлен${NC}"
@@ -585,11 +689,11 @@ menu_bot() {
echo -e " ${DIM}Бот позволяет управлять прокси прямо из Telegram:${NC}"
echo -e " ${DIM}статус, перезапуск, смена режима, бекап, QR-код.${NC}"
echo ""
echo -e " ${CYAN}1)${NC} 🔧 Установить бота"
echo -e " ${CYAN}1${NC}) 🔧 Установить бота"
;;
esac
echo -e " ${CYAN}0)${NC} « Назад"
echo -e " ${CYAN}0${NC}) « Назад"
echo -e " ${DIM}$(printf '─%.0s' {1..55})${NC}"
echo -ne " ${WHITE}Выбор:${NC} "
read -r ch
@@ -762,9 +866,9 @@ bot_edit_config() {
fi
echo ""
echo -e " ${CYAN}1)${NC} Сменить BOT_TOKEN"
echo -e " ${CYAN}2)${NC} Изменить ALLOWED_IDS"
echo -e " ${CYAN}0)${NC} Назад"
echo -e " ${CYAN}1${NC}) Сменить BOT_TOKEN"
echo -e " ${CYAN}2${NC}) Изменить ALLOWED_IDS"
echo -e " ${CYAN}0${NC}) Назад"
echo -ne " ${WHITE}Выбор:${NC} "
read -r ch
@@ -842,33 +946,74 @@ main() {
while true; do
clear
show_main_menu
# Auto-refresh: 30 sec timeout
if read -t 30 -r choice; then
# Auto-refresh: 1 sec timeout
if read -t 1 -r choice; then
case "$choice" in
1) menu_install ;;
2) menu_status ;;
3) menu_link ;;
4) menu_share ;;
5) menu_restart ;;
6) menu_logs ;;
7) menu_change_mode ;;
8) interactive_backup ;;
9) interactive_restore ;;
10) update_telemt ;;
11) menu_website ;;
12) menu_bot ;;
13) menu_remove ;;
14) menu_promo ;;
1) submenu_proxy ;;
2) submenu_stats ;;
3) submenu_manage ;;
4) menu_bot ;;
5) submenu_about ;;
0|q|exit) echo ""; log_info "До встречи! 👋"; exit 0 ;;
*) log_error "Неверный выбор" ;;
esac
echo ""
echo -ne " ${DIM}Нажмите Enter для возврата в меню...${NC}"
read -r
fi
# If read timed out, loop refreshes the dashboard
done
}
# ── Статистика (авто-обновление 1 сек) ──────────────────────────────────────
submenu_stats() {
# Инициализируем статистику при первом входе
if type stats_init &>/dev/null; then
stats_init 2>/dev/null
fi
while true; do
clear
echo ""
echo -e " ${BOLD}${WHITE}📊 Статистика трафика${NC}"
echo -e " ${DIM}$(printf '─%.0s' {1..54})${NC}"
if type show_traffic_stats &>/dev/null; then
show_traffic_stats
else
echo -e " ${DIM}Модуль статистики не загружен.${NC}"
echo -e " ${DIM}Файл lib/stats.sh не найден.${NC}"
fi
echo -e " ${DIM}$(printf '─%.0s' {1..54})${NC}"
local stats_on="вкл"
if type toggle_stats &>/dev/null; then
local cfg_val
cfg_val=$(config_get stats_enabled 2>/dev/null || echo "true")
[ "$cfg_val" = "false" ] && stats_on="выкл"
fi
echo -e " ${CYAN}1${NC}) Вкл/Выкл подсчёт (сейчас: ${stats_on})"
echo -e " ${CYAN}2${NC}) Установить/обновить сборщик статистики"
echo -e " ${CYAN}0${NC}) ${DIM}← Назад${NC}"
echo -e " ${DIM}$(printf '─%.0s' {1..54})${NC}"
echo -e " ${DIM}Обновление через 1 сек${NC}"
echo -ne " ${WHITE}${NC}"
if read -t 1 -r ch; then
case "$ch" in
1)
if type toggle_stats &>/dev/null; then
toggle_stats
echo -ne " ${DIM}Нажмите Enter...${NC}"; read -r
fi
;;
2)
if type install_stats_collector &>/dev/null; then
install_stats_collector
echo -ne " ${DIM}Нажмите Enter...${NC}"; read -r
fi
;;
0|"") return ;;
esac
fi
done
}
main "$@"