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')