#!/bin/bash # JARVIS VoIP Phone Probe — runs every minute on PVE1 # Pings all Yealink phones + checks FusionPBX SIP registration (read-only) # 200.3 is on an external FusionPBX — ping only, no SIP check JARVIS_URL="https://165.22.1.228" JARVIS_HOST="jarvis.orbishosting.com" REG_KEY="f846a9aaf7ce9a61742c63c87c4186052a71d2a580c65518" FUSION_HOST="134.209.72.226" # IP|alias|extension(none=skip SIP check)|mac PHONES=( "10.48.200.2|Yealink — Myron Main (Ext 1000)|1000|80:5e:c0:35:04:77" "10.48.200.3|Yealink — United Mirror & Glass (External SIP)|none|c4:fc:22:28:63:71" "10.48.200.43|Yealink T48S — Tommy Main (Ext 1001)|1001|80:5e:0c:15:0c:4f" "10.48.200.86|Yealink — Myron Vanguard WiFi (Offline During Work Hrs)|none|" "10.48.200.65|Yealink — Myron Vanguard Work (Ext 1003)|1003|c4:fc:22:13:e1:89" ) # Get SIP registrations from FusionPBX (read-only) REG_OUTPUT=$(ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 -o BatchMode=yes \ root@$FUSION_HOST "fs_cli -x 'show registrations'" 2>/dev/null || echo "") DEVICES="[" FIRST=1 for PHONE in "${PHONES[@]}"; do IFS='|' read -r IP ALIAS EXT MAC <<< "$PHONE" # Ping probe if ping -c 1 -W 2 "$IP" > /dev/null 2>&1; then STATUS="online" else STATUS="offline" fi # SIP check — skip for external phones (ext=none) if [ "$EXT" = "none" ]; then SIP="external" elif [ -n "$REG_OUTPUT" ] && echo "$REG_OUTPUT" | grep -q "^${EXT},"; then SIP="registered" else SIP="unregistered" fi [ $FIRST -eq 0 ] && DEVICES+="," DEVICES+="{\"ip\":\"$IP\",\"alias\":\"$ALIAS\",\"mac\":\"$MAC\",\"vendor\":\"Yealink\",\"status\":\"$STATUS\",\"sip_status\":\"$SIP\",\"extension\":\"$EXT\"}" FIRST=0 done DEVICES+="]" curl -sk --max-time 10 \ -X POST "$JARVIS_URL/api/netscan" \ -H "Host: $JARVIS_HOST" \ -H "Content-Type: application/json" \ -H "X-Registration-Key: $REG_KEY" \ -d "{\"devices\":$DEVICES}" > /dev/null 2>&1