Fix smart_ping subshell: return method|ms, update all callers, iptables ICMP hint

Made-with: Cursor
This commit is contained in:
anten-ka
2026-03-07 15:42:49 +03:00
parent 41ff2a9c41
commit 3f82c7ad10

View File

@@ -227,14 +227,15 @@ probe_server_cli() {
local -a pings=() local -a pings=()
local plost=0 local plost=0
for n in 1 2 3; do for n in 1 2 3; do
local ms local raw method="" ms=""
ms=$(smart_ping "$ip" 3 "$port") raw=$(smart_ping "$ip" 3 "$port")
if [ -n "$ms" ]; then if [ -n "$raw" ]; then
method="${raw%%|*}"; ms="${raw#*|}"
pings+=("$ms") pings+=("$ms")
echo -e " #$n: ${GREEN}${ms}ms${NC} ${CYAN}[${_PING_METHOD}]${NC}" echo -e " #$n: ${GREEN}${ms}ms${NC} ${CYAN}[$method]${NC}"
else else
((plost++)) ((plost++))
echo -e " #$n: ${RED}timeout${NC} ${WHITE}[ICMP fail$([ -n "$port" ] && echo ", TCP:$port fail")]${NC}" echo -e " #$n: ${RED}timeout${NC} ${WHITE}[ICMP$([ -n "$port" ] && echo "+TCP:$port")]${NC}"
fi fi
[ "$n" -lt 3 ] && sleep 1 [ "$n" -lt 3 ] && sleep 1
done done
@@ -297,11 +298,12 @@ probe_server_tg() {
local -a pings=() local -a pings=()
local plost=0 local plost=0
for n in 1 2 3; do for n in 1 2 3; do
local ms local raw method="" ms=""
ms=$(smart_ping "$ip" 3 "$port") raw=$(smart_ping "$ip" 3 "$port")
if [ -n "$ms" ]; then if [ -n "$raw" ]; then
method="${raw%%|*}"; ms="${raw#*|}"
pings+=("$ms") pings+=("$ms")
result+=" #$n: ${ms}ms [${_PING_METHOD}]\n" result+=" #$n: ${ms}ms [$method]\n"
else else
((plost++)) ((plost++))
result+=" #$n: timeout\n" result+=" #$n: timeout\n"
@@ -428,18 +430,15 @@ tcp_ping() {
echo "$ms" echo "$ms"
} }
_PING_METHOD=""
smart_ping() { smart_ping() {
local ip="$1" tout="${2:-3}" port="${3:-}" local ip="$1" tout="${2:-3}" port="${3:-}"
_PING_METHOD=""
local ms local ms
ms=$(ping -c 1 -W "$tout" "$ip" 2>/dev/null | sed -n 's/.*time=\([0-9.]*\).*/\1/p') ms=$(ping -c 1 -W "$tout" "$ip" 2>/dev/null | sed -n 's/.*time=\([0-9.]*\).*/\1/p')
if [ -n "$ms" ]; then _PING_METHOD="ICMP"; echo "$ms"; return 0; fi if [ -n "$ms" ]; then echo "ICMP|$ms"; return 0; fi
[ -z "$port" ] && port=$(get_port_for_ip "$ip") [ -z "$port" ] && port=$(get_port_for_ip "$ip")
[ -z "$port" ] && return 1 [ -z "$port" ] && return 1
ms=$(tcp_ping "$ip" "$port" "$tout") ms=$(tcp_ping "$ip" "$port" "$tout")
if [ -n "$ms" ]; then _PING_METHOD="TCP:${port}"; echo "$ms"; return 0; fi if [ -n "$ms" ]; then echo "TCP:${port}|$ms"; return 0; fi
return 1 return 1
} }
@@ -784,8 +783,9 @@ ping_live() {
[ -n "$_port" ] && _mode="ICMP/TCP:${_port}" [ -n "$_port" ] && _mode="ICMP/TCP:${_port}"
while [ "$running" -eq 1 ]; do while [ "$running" -eq 1 ]; do
local ms local raw method="" ms=""
ms=$(smart_ping "$ip" 3 "${_port:-}") raw=$(smart_ping "$ip" 3 "${_port:-}")
if [ -n "$raw" ]; then method="${raw%%|*}"; ms="${raw#*|}"; fi
((count++)) ((count++))
clear clear
@@ -797,7 +797,7 @@ ping_live() {
results+=("$ms") results+=("$ms")
local bar local bar
bar=$(make_ping_bar "$ms") bar=$(make_ping_bar "$ms")
printf " ${GREEN}#%-4d %7sms${NC} ${CYAN}[%s]${NC} %b\n" "$count" "$ms" "$_PING_METHOD" "$bar" printf " ${GREEN}#%-4d %7sms${NC} ${CYAN}[%s]${NC} %b\n" "$count" "$ms" "$method" "$bar"
else else
((lost++)) ((lost++))
printf " ${RED}#%-4d ------${NC} " "$count" printf " ${RED}#%-4d ------${NC} " "$count"
@@ -839,12 +839,13 @@ ping_live() {
echo "" echo ""
if [ ${#results[@]} -eq 0 ] && [ "$count" -gt 0 ]; then if [ ${#results[@]} -eq 0 ] && [ "$count" -gt 0 ]; then
echo -e "${YELLOW}━━━ Сервер не ответил ни разу ━━━${NC}" echo -e "${YELLOW}━━━ Сервер не ответил ни разу ━━━${NC}"
echo -e "${WHITE}ICMP заблокирован, а TCP-соединение не удалось.${NC}" echo -e "${WHITE}ICMP заблокирован$([ -n "$_port" ] && echo " и TCP:$_port не удался").${NC}"
echo "" echo ""
echo -e "${CYAN}Чтобы включить ping на удалённом сервере:${NC}" echo -e "${CYAN}Чтобы включить ping на удалённом сервере:${NC}"
echo -e " ${WHITE}ssh root@${ip}${NC}" echo -e " ${WHITE}ssh root@${ip}${NC}"
echo -e " ${GREEN}sysctl -w net.ipv4.icmp_echo_ignore_all=0${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 -e " ${GREEN}echo 'net.ipv4.icmp_echo_ignore_all=0' >> /etc/sysctl.conf${NC}"
echo -e " ${GREEN}iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT${NC}"
echo "" echo ""
fi fi
read -p "Нажмите Enter для возврата в меню..." read -p "Нажмите Enter для возврата в меню..."
@@ -962,8 +963,9 @@ monitor_daemon() {
[ -f "$ckf" ] && lc=$(cat "$ckf") [ -f "$ckf" ] && lc=$(cat "$ckf")
if (( now - lc >= MON_INTERVAL )); then if (( now - lc >= MON_INTERVAL )); then
echo "$now" > "$ckf" echo "$now" > "$ckf"
local pr; pr=$(smart_ping "$MON_IP" 3) local pr_raw; pr_raw=$(smart_ping "$MON_IP" 3)
if [ -z "$pr" ]; then local pr="${pr_raw#*|}"
if [ -z "$pr" ] || [ -z "$pr_raw" ]; then
monitor_alert "$MON_IP" "TIMEOUT" "$MON_THRESHOLD" "$MON_COOLDOWN" monitor_alert "$MON_IP" "TIMEOUT" "$MON_THRESHOLD" "$MON_COOLDOWN"
else else
local pi; pi=$(awk "BEGIN {printf \"%d\", $pr + 0.5}") local pi; pi=$(awk "BEGIN {printf \"%d\", $pr + 0.5}")
@@ -1281,24 +1283,29 @@ bot_handle_callback() {
ps:*) local ip="${data#ps:}"; local lb; lb=$(fmt_ip_short "$ip") ps:*) local ip="${data#ps:}"; local lb; lb=$(fmt_ip_short "$ip")
tg_edit "$chat_id" "$msg_id" "🏓 <b>$lb</b>\nРежим:" "$(kbd_ping_opts "$ip")" ;; tg_edit "$chat_id" "$msg_id" "🏓 <b>$lb</b>\nРежим:" "$(kbd_ping_opts "$ip")" ;;
po:*) local ip="${data#po:}"; local lb; lb=$(fmt_ip_short "$ip") po:*) local ip="${data#po:}"; local lb; lb=$(fmt_ip_short "$ip")
( local ms; ms=$(smart_ping "$ip" 3) ( local raw; raw=$(smart_ping "$ip" 3)
if [ -n "$ms" ]; then if [ -n "$raw" ]; then
tg_send "$chat_id" "🏓 <b>$lb</b>\n<code>${ms} ms</code>" "$(kbd_back)" > /dev/null local mtd="${raw%%|*}" pms="${raw#*|}"
tg_send "$chat_id" "🏓 <b>$lb</b>\n<code>${pms} ms</code> [$mtd]" "$(kbd_back)" > /dev/null
else else
tg_send "$chat_id" "🏓 <b>$lb</b>\n<code>timeout</code>\n\n<i>ICMP заблокирован на сервере.\nВключить:</i>\n<code>sysctl -w net.ipv4.icmp_echo_ignore_all=0</code>" "$(kbd_back)" > /dev/null tg_send "$chat_id" "🏓 <b>$lb</b>\n<code>timeout</code>\n\n<i>Сервер не ответил.\nВключите ping:</i>\n<code>sysctl -w net.ipv4.icmp_echo_ignore_all=0</code>\n<code>iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT</code>" "$(kbd_back)" > /dev/null
fi ) & ;; fi ) & ;;
p10:*) local ip="${data#p10:}"; local lb; lb=$(fmt_ip_short "$ip") p10:*) local ip="${data#p10:}"; local lb; lb=$(fmt_ip_short "$ip")
( local resp; resp=$(tg_send "$chat_id" "🏓 $lb (10x)..." "") ( local resp; resp=$(tg_send "$chat_id" "🏓 $lb (10x)..." "")
local mid; mid=$(echo "$resp" | jq -r '.result.message_id // empty') local mid; mid=$(echo "$resp" | jq -r '.result.message_id // empty')
local -a res=(); local lost=0 txt="" local -a res=(); local lost=0 txt=""
for n in $(seq 1 10); do for n in $(seq 1 10); do
local ms; ms=$(smart_ping "$ip" 3) local raw; raw=$(smart_ping "$ip" 3)
[ -n "$ms" ] && res+=("$ms") && txt+="#$n: ${ms}ms\n" || { ((lost++)); txt+="#$n: timeout\n"; } if [ -n "$raw" ]; then
local mtd="${raw%%|*}" pms="${raw#*|}"
res+=("$pms"); txt+="#$n: ${pms}ms [$mtd]\n"
else ((lost++)); txt+="#$n: timeout\n"; fi
sleep 1 sleep 1
done done
local sm="🏓 <b>$lb (10x)</b>\n${txt}" local sm="🏓 <b>$lb (10x)</b>\n${txt}"
[ ${#res[@]} -gt 0 ] && { local av; av=$(printf '%s\n' "${res[@]}" | awk '{s+=$1} END {printf "%.2f",s/NR}'); sm+="\n<b>Среднее: ${av}ms</b>"; } [ ${#res[@]} -gt 0 ] && { local av; av=$(printf '%s\n' "${res[@]}" | awk '{s+=$1} END {printf "%.2f",s/NR}'); sm+="\n<b>Среднее: ${av}ms</b>"; }
sm+="\nПотеряно: $lost/10" sm+="\nПотеряно: $lost/10"
if [ ${#res[@]} -eq 0 ]; then sm+="\n\n<i>Включите ping:</i>\n<code>sysctl -w net.ipv4.icmp_echo_ignore_all=0</code>"; fi
[ -n "$mid" ] && tg_edit "$chat_id" "$mid" "$sm" "$(kbd_back)" > /dev/null || tg_send "$chat_id" "$sm" "$(kbd_back)" > /dev/null [ -n "$mid" ] && tg_edit "$chat_id" "$mid" "$sm" "$(kbd_back)" > /dev/null || tg_send "$chat_id" "$sm" "$(kbd_back)" > /dev/null
) & ;; ) & ;;
p60:*) local ip="${data#p60:}"; local lb; lb=$(fmt_ip_short "$ip") p60:*) local ip="${data#p60:}"; local lb; lb=$(fmt_ip_short "$ip")
@@ -1306,8 +1313,10 @@ bot_handle_callback() {
local mid; mid=$(echo "$resp" | jq -r '.result.message_id // empty') local mid; mid=$(echo "$resp" | jq -r '.result.message_id // empty')
local -a res=(); local lost=0 local -a res=(); local lost=0
for n in $(seq 1 60); do for n in $(seq 1 60); do
local ms; ms=$(smart_ping "$ip" 3) local raw; raw=$(smart_ping "$ip" 3)
[ -n "$ms" ] && res+=("$ms") || ((lost++)) if [ -n "$raw" ]; then
local pms="${raw#*|}"; res+=("$pms")
else ((lost++)); fi
if (( n % 10 == 0 )) && [ -n "$mid" ]; then if (( n % 10 == 0 )) && [ -n "$mid" ]; then
local p="🏓 <b>$lb</b>: ${n}/60с\nОК: ${#res[@]} | Lost: $lost" local p="🏓 <b>$lb</b>: ${n}/60с\nОК: ${#res[@]} | Lost: $lost"
[ ${#res[@]} -gt 0 ] && { local pa; pa=$(printf '%s\n' "${res[@]}" | awk '{s+=$1} END {printf "%.2f",s/NR}'); p+="\nСред: ${pa}ms"; } [ ${#res[@]} -gt 0 ] && { local pa; pa=$(printf '%s\n' "${res[@]}" | awk '{s+=$1} END {printf "%.2f",s/NR}'); p+="\nСред: ${pa}ms"; }
@@ -1319,6 +1328,7 @@ bot_handle_callback() {
local st; st=$(printf '%s\n' "${res[@]}" | awk 'BEGIN{mn=999999;mx=0;s=0}{s+=$1;if($1<mn)mn=$1;if($1>mx)mx=$1}END{printf "%.2f|%.2f|%.2f",mn,mx,s/NR}') local st; st=$(printf '%s\n' "${res[@]}" | awk 'BEGIN{mn=999999;mx=0;s=0}{s+=$1;if($1<mn)mn=$1;if($1>mx)mx=$1}END{printf "%.2f|%.2f|%.2f",mn,mx,s/NR}')
IFS='|' read -r sn sx sa <<< "$st"; sm+="Мин: ${sn}ms\nМакс: ${sx}ms\nСред: ${sa}ms\n" IFS='|' read -r sn sx sa <<< "$st"; sm+="Мин: ${sn}ms\nМакс: ${sx}ms\nСред: ${sa}ms\n"
fi; sm+="Потеряно: $lost/60" fi; sm+="Потеряно: $lost/60"
if [ ${#res[@]} -eq 0 ]; then sm+="\n\n<i>Включите ping:</i>\n<code>sysctl -w net.ipv4.icmp_echo_ignore_all=0</code>"; fi
[ -n "$mid" ] && tg_edit "$chat_id" "$mid" "$sm" "$(kbd_back)" > /dev/null || tg_send "$chat_id" "$sm" "$(kbd_back)" > /dev/null [ -n "$mid" ] && tg_edit "$chat_id" "$mid" "$sm" "$(kbd_back)" > /dev/null || tg_send "$chat_id" "$sm" "$(kbd_back)" > /dev/null
) & ;; ) & ;;