diff --git a/install.sh b/install.sh index 67f7709..2335741 100644 --- a/install.sh +++ b/install.sh @@ -261,10 +261,16 @@ probe_server_cli() { [ -n "$_RET_NOTE" ] && set_alias_note "$ip" "$_RET_NOTE" if [ ${#pings[@]} -eq 0 ]; then - echo -e "${YELLOW}[WARN] Сервер не отвечает на ICMP ping.${NC}" - echo -e "${WHITE}(Это нормально для VLESS/XRay — ICMP часто заблокирован)${NC}" - echo -e "${WHITE}TCP-проверка будет доступна после добавления правила.${NC}" - read -p "Продолжить? (y/n): " ans + echo -e "${YELLOW}━━━ Сервер не ответил на ICMP ping ━━━${NC}" + echo -e "${WHITE}Это нормально для VLESS / XRay / Reality — они часто блокируют ICMP.${NC}" + echo -e "${WHITE}После добавления правила ping будет работать через TCP.${NC}" + echo "" + echo -e "${CYAN}Если хотите включить ICMP на удалённом сервере:${NC}" + echo -e " ${WHITE}ssh root@${ip}${NC}" + echo -e " ${GREEN}sysctl -w net.ipv4.icmp_echo_ignore_all=0${NC}" + echo -e " ${GREEN}echo 'net.ipv4.icmp_echo_ignore_all=0' >> /etc/sysctl.conf${NC}" + echo "" + read -p "Продолжить добавление? (y/n): " ans [[ "$ans" != "y" ]] && return 1 fi return 0 @@ -307,7 +313,9 @@ probe_server_tg() { pavg=$(printf '%s\n' "${pings[@]}" | awk '{s+=$1} END {printf "%.2f", s/NR}') result+="Среднее: ${pavg}ms | Потеряно: $plost/3\n" else - result+="Сервер не отвечает\n" + result+="Сервер не отвечает на ICMP\n" + result+="(Нормально для XRay/VLESS)\n" + result+="TCP-ping заработает после добавления.\n" fi echo "$result" } @@ -695,18 +703,42 @@ manage_aliases_menu() { self_update() { local repo_url="https://raw.githubusercontent.com/anten-ka/kaskad-pro/main/install.sh" - local update_token; update_token=$(bot_get_state "system" "UPDATE_TOKEN" 2>/dev/null) + local update_token + update_token=$(bot_get_state "system" "UPDATE_TOKEN" 2>/dev/null) + [ -z "$update_token" ] && update_token=$(grep "^GITHUB_PAT=" "$KASKAD_CONF" 2>/dev/null | cut -d'"' -f2) echo -e "${YELLOW}[*] Загрузка обновления...${NC}" local ok=0 - [ -n "$update_token" ] && curl -sL -H "Authorization: token $update_token" "$repo_url" -o /tmp/kaskad_update.sh 2>/dev/null && ok=1 - [ "$ok" -eq 0 ] && wget -qO /tmp/kaskad_update.sh "$repo_url" 2>/dev/null && ok=1 - [ "$ok" -eq 0 ] && [ -n "$update_token" ] && wget -qO /tmp/kaskad_update.sh --header="Authorization: token $update_token" "$repo_url" 2>/dev/null && ok=1 + [ -n "$update_token" ] && curl -sL -H "Authorization: token $update_token" "$repo_url" -o /tmp/kaskad_update.sh 2>/dev/null \ + && head -1 /tmp/kaskad_update.sh 2>/dev/null | grep -q "#!/bin/bash" && ok=1 + if [ "$ok" -eq 0 ]; then + curl -sL "$repo_url" -o /tmp/kaskad_update.sh 2>/dev/null \ + && head -1 /tmp/kaskad_update.sh 2>/dev/null | grep -q "#!/bin/bash" && ok=1 + fi + if [ "$ok" -eq 0 ]; then + echo -e "${RED}Не удалось скачать. Репозиторий приватный.${NC}" + echo -e "${WHITE}Введите GitHub PAT (токен доступа) или Enter для отмены:${NC}" + echo -e "${CYAN}(Создать: GitHub → Settings → Developer settings → Personal access tokens)${NC}" + read -p "> " new_token + if [ -n "$new_token" ]; then + curl -sL -H "Authorization: token $new_token" "$repo_url" -o /tmp/kaskad_update.sh 2>/dev/null \ + && head -1 /tmp/kaskad_update.sh 2>/dev/null | grep -q "#!/bin/bash" && ok=1 + if [ "$ok" -eq 1 ]; then + mkdir -p "$BOT_STATE_DIR" + bot_set_state "system" "UPDATE_TOKEN=$new_token" + save_config_val "GITHUB_PAT" "$new_token" + echo -e "${GREEN}Токен сохранён для будущих обновлений.${NC}" + else + echo -e "${RED}Токен не подошёл или ошибка сети.${NC}" + fi + fi + fi if [ "$ok" -eq 1 ] && [ -s /tmp/kaskad_update.sh ]; then cp -f /tmp/kaskad_update.sh /usr/local/bin/gokaskad; chmod +x /usr/local/bin/gokaskad; rm -f /tmp/kaskad_update.sh systemctl restart kaskad-bot 2>/dev/null; systemctl restart kaskad-monitor 2>/dev/null echo -e "${GREEN}[OK] Обновлён! Перезапустите: gokaskad${NC}"; log_action "Self-update completed" else - echo -e "${RED}[ERROR] Не удалось.${NC}"; rm -f /tmp/kaskad_update.sh + [ "$ok" -eq 0 ] && echo -e "${RED}[ERROR] Не удалось обновить.${NC}" + rm -f /tmp/kaskad_update.sh fi read -p "Нажмите Enter..." } @@ -801,7 +833,18 @@ ping_live() { done trap - INT - echo ""; read -p "Нажмите Enter для возврата в меню..." + echo "" + if [ ${#results[@]} -eq 0 ] && [ "$count" -gt 0 ]; then + echo -e "${YELLOW}━━━ Сервер не ответил ни разу ━━━${NC}" + echo -e "${WHITE}ICMP заблокирован, а TCP-соединение не удалось.${NC}" + echo "" + echo -e "${CYAN}Чтобы включить ping на удалённом сервере:${NC}" + echo -e " ${WHITE}ssh root@${ip}${NC}" + echo -e " ${GREEN}sysctl -w net.ipv4.icmp_echo_ignore_all=0${NC}" + echo -e " ${GREEN}echo 'net.ipv4.icmp_echo_ignore_all=0' >> /etc/sysctl.conf${NC}" + echo "" + fi + read -p "Нажмите Enter для возврата в меню..." } ping_menu() { @@ -1236,8 +1279,11 @@ bot_handle_callback() { tg_edit "$chat_id" "$msg_id" "🏓 $lb\nРежим:" "$(kbd_ping_opts "$ip")" ;; po:*) local ip="${data#po:}"; local lb; lb=$(fmt_ip_short "$ip") ( local ms; ms=$(smart_ping "$ip" 3) - [ -n "$ms" ] && tg_send "$chat_id" "🏓 $lb\n${ms} ms" "$(kbd_back)" > /dev/null \ - || tg_send "$chat_id" "🏓 $lb\ntimeout" "$(kbd_back)" > /dev/null ) & ;; + if [ -n "$ms" ]; then + tg_send "$chat_id" "🏓 $lb\n${ms} ms" "$(kbd_back)" > /dev/null + else + tg_send "$chat_id" "🏓 $lb\ntimeout\n\nICMP заблокирован на сервере.\nВключить:\nsysctl -w net.ipv4.icmp_echo_ignore_all=0" "$(kbd_back)" > /dev/null + fi ) & ;; p10:*) local ip="${data#p10:}"; local lb; lb=$(fmt_ip_short "$ip") ( local resp; resp=$(tg_send "$chat_id" "🏓 $lb (10x)..." "") local mid; mid=$(echo "$resp" | jq -r '.result.message_id // empty')