#!/bin/bash # 运行状态检测: 容器 + ESL 命令 + sofia 网关状态 + 活动呼叫数 # 注: ESL ACL=rfc1918.auto 不含 loopback → fs_cli 必须 -H 走非 loopback 源地址; # 且需显式 -P 8021 -p <密码> (fs_cli 默认 localhost+ClueCon) set -uo pipefail PASS="esl_mock_a95a037399153e9092b653fc" ok=0; fail=0 pass() { echo "PASS $1"; ok=$((ok+1)); } faill() { echo "FAIL $1"; fail=$((fail+1)); } running() { [ -n "$(docker ps -q -f name=$1)" ]; } fsc() { # fsc <容器> local ip ip=$(docker exec "$1" hostname -i 2>/dev/null | awk '{print $1}') docker exec "$1" fs_cli -H "$ip" -P 8021 -p "$PASS" "${@:2}" 2>/dev/null } echo "== 容器状态" docker ps --filter "name=fs" --format "{{.Names}}\t{{.Status}}" echo "== ESL (fs_cli status)" for c in fs1 fs2; do if running "$c"; then out=$(fsc "$c" -x "status" | head -1) if echo "$out" | grep -q "^UP"; then pass "$c ESL status: ${out:0:60}" else faill "$c ESL status: ${out:-none}" fi else echo "SKIP $c (未运行)" fi done echo "== sofia 网关 (mock-trunk)" for c in fs1 fs2; do if running "$c"; then state=$(fsc "$c" -x "sofia status gateway mock-trunk" | awk -F'[:\t ]+' '/^State/{print $2}') case "$state" in REGED|NOREG) pass "$c gateway mock-trunk State=$state" ;; *) faill "$c gateway mock-trunk State=${state:-none}" ;; esac fi done echo "== 活动呼叫" if running fs1; then n=$(fsc fs1 -x "show calls count" | grep total | awk '{print $1}') [ -n "$n" ] && pass "fs1 active calls=$n" || faill "fs1 active calls" fi echo echo "result: ok=$ok fail=$fail" [ $fail -eq 0 ]