Files
2025-12-28 22:46:07 +01:00

204 lines
6.6 KiB
Bash

#!/bin/bash
# Fixed TP-Link M7350 Status Parser
HOST="192.168.0.1"
echo "=== TP-Link M7350 Status ==="
# Login (same as before)
echo -e "\n1. Getting nonce..."
NONCE_RESPONSE=$(curl -s -X POST \
-H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
-H "X-Requested-With: XMLHttpRequest" \
-H "Referer: http://$HOST/login.html" \
-d '{"module":"authenticator","action":0}' \
"http://$HOST/cgi-bin/auth_cgi")
NONCE=$(echo "$NONCE_RESPONSE" | sed -n 's/.*"nonce":[[:space:]]*"\([^"]*\)".*/\1/p')
echo "Nonce: $NONCE"
read -s -p "Enter password: " PASSWORD
echo
DIGEST=$(echo -n "${PASSWORD}:${NONCE}" | md5sum | cut -d' ' -f1)
echo "Digest: $DIGEST"
echo -e "\n2. Logging in..."
LOGIN_RESPONSE=$(curl -s -X POST \
-H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
-H "X-Requested-With: XMLHttpRequest" \
-H "Referer: http://$HOST/login.html" \
-d "{\"module\":\"authenticator\",\"action\":1,\"digest\":\"$DIGEST\"}" \
"http://$HOST/cgi-bin/auth_cgi")
TOKEN=$(echo "$LOGIN_RESPONSE" | sed -n 's/.*"token":[[:space:]]*"\([^"]*\)".*/\1/p')
if [ -z "$TOKEN" ]; then
echo "✗ Login failed!"
exit 1
fi
echo "✓ Login successful!"
echo "Token: $TOKEN"
# Get status
echo -e "\n3. Fetching status..."
STATUS_JSON=$(curl -s -X POST \
-H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
-H "X-Requested-With: XMLHttpRequest" \
-H "Referer: http://$HOST/settings.html" \
-d "{\"token\":\"$TOKEN\",\"module\":\"status\",\"action\":0}" \
"http://$HOST/cgi-bin/web_cgi")
# Save raw JSON
echo "$STATUS_JSON" > /tmp/status_debug.json
# Debug: Show the actual JSON around wlan
echo -e "\n=== DEBUG: Looking for SSID in JSON ==="
echo "Searching for 'wlan' and surrounding lines:"
echo "$STATUS_JSON" | grep -n -A5 -B2 '"wlan"'
echo -e "\nSearching for 'ssid' anywhere:"
echo "$STATUS_JSON" | grep -n -i '"ssid"'
# Better parsing function
parse_json_value() {
local json="$1"
local key="$2"
# Method 1: Look for "key": "value" pattern
echo "$json" | grep -o "\"$key\":\"[^\"]*\"" | head -1 | cut -d'"' -f4
# If not found, try "key": value (without quotes)
if [ -z "$result" ]; then
echo "$json" | grep -o "\"$key\":[^,}]*" | head -1 | sed 's/.*://' | tr -d '[:space:]"'
fi
}
# Parse all values
echo -e "\n=== PARSING VALUES ==="
# WAN section
WAN_SECTION=$(echo "$STATUS_JSON" | sed -n '/"wan":/,/^[[:space:]]*}/p')
echo "WAN section found: $(echo "$WAN_SECTION" | wc -l) lines"
CONNECT_STATUS=$(echo "$WAN_SECTION" | grep '"connectStatus"' | awk '{print $2}' | tr -d ',')
NETWORK_TYPE=$(echo "$WAN_SECTION" | grep '"networkType"' | awk '{print $2}' | tr -d ',')
IPV4=$(echo "$WAN_SECTION" | grep '"ipv4"' | cut -d'"' -f4)
TOTAL_STATS=$(echo "$WAN_SECTION" | grep '"totalStatistics"' | cut -d'"' -f4)
# Show what we found
echo "Found totalStatistics: '$TOTAL_STATS'"
# WLAN section
WLAN_SECTION=$(echo "$STATUS_JSON" | sed -n '/"wlan":/,/^[[:space:]]*}/p')
echo "WLAN section found: $(echo "$WLAN_SECTION" | wc -l) lines"
SSID=$(echo "$WLAN_SECTION" | grep '"ssid"' | cut -d'"' -f4)
# If still not found, try different approach
if [ -z "$SSID" ]; then
echo "Trying alternative SSID search..."
SSID=$(echo "$STATUS_JSON" | grep -o '"ssid":"[^"]*"' | head -1 | cut -d'"' -f4)
fi
# Connected devices
DEVICES_SECTION=$(echo "$STATUS_JSON" | sed -n '/"connectedDevices":/,/^[[:space:]]*}/p')
CLIENTS=$(echo "$DEVICES_SECTION" | grep '"number"' | awk '{print $2}' | tr -d ',')
# Device info
DEVICE_SECTION=$(echo "$STATUS_JSON" | sed -n '/"deviceInfo":/,/^[[:space:]]*}/p')
MODEL=$(echo "$DEVICE_SECTION" | grep '"model"' | cut -d'"' -f4)
FIRMWARE=$(echo "$DEVICE_SECTION" | grep '"firmwareVer"' | cut -d'"' -f4)
MAC=$(echo "$DEVICE_SECTION" | grep '"mac"' | cut -d'"' -f4)
IMEI=$(echo "$DEVICE_SECTION" | grep '"imei"' | cut -d'"' -f4)
# Monthly data - try different field names
MONTHLY_DATA="N/A"
for field in totalStatistics totalData dataUsed monthlyData; do
value=$(echo "$STATUS_JSON" | grep -i "\"$field\"" | head -1 | cut -d'"' -f4)
if [ -n "$value" ] && [ "$value" != "null" ]; then
MONTHLY_DATA="$value"
break
fi
done
# === FIXED BYTE CONVERSION ===
# Convert bytes to GB properly
if [[ "$MONTHLY_DATA" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then
# Remove decimal part to get integer bytes
MONTHLY_BYTES=$(echo "$MONTHLY_DATA" | cut -d'.' -f1)
# Convert bytes to GB using awk (works even if bc is not available)
# 1 GB = 1024 * 1024 * 1024 = 1073741824 bytes
if command -v awk >/dev/null 2>&1; then
MONTHLY_GB=$(awk -v bytes="$MONTHLY_BYTES" 'BEGIN {printf "%.2f", bytes / 1073741824}')
MONTHLY_DISPLAY="${MONTHLY_GB} GB"
else
# Fallback: simple division
MONTHLY_GB=$((MONTHLY_BYTES / 1073741824))
MONTHLY_MB=$(( (MONTHLY_BYTES % 1073741824) / 1048576 ))
MONTHLY_DISPLAY="${MONTHLY_GB}.${MONTHLY_MB} GB"
fi
else
MONTHLY_DISPLAY="$MONTHLY_DATA"
MONTHLY_BYTES="N/A"
fi
# === END FIX ===
# Convert connection status
case $CONNECT_STATUS in
4) CONNECT_TEXT="Connected" ;;
1) CONNECT_TEXT="Disconnected" ;;
2) CONNECT_TEXT="Connecting" ;;
3) CONNECT_TEXT="Disconnecting" ;;
*) CONNECT_TEXT="Unknown ($CONNECT_STATUS)" ;;
esac
# Convert network type
case $NETWORK_TYPE in
3) NETWORK_TEXT="LTE" ;;
2) NETWORK_TEXT="WCDMA" ;;
1) NETWORK_TEXT="GSM" ;;
0) NETWORK_TEXT="No Service" ;;
*) NETWORK_TEXT="Unknown ($NETWORK_TYPE)" ;;
esac
# Display results
echo -e "\n=== FINAL STATUS ==="
echo "Connection Status: $CONNECT_TEXT"
echo "Network Type: $NETWORK_TEXT"
echo "IPv4 Address: ${IPV4:-N/A}"
echo "SSID: ${SSID:-N/A}"
echo "Current Clients: ${CLIENTS:-N/A}"
echo "Monthly Used: ${MONTHLY_DISPLAY}"
if [[ "$MONTHLY_BYTES" =~ ^[0-9]+$ ]]; then
echo " (Raw bytes: $MONTHLY_BYTES)"
fi
echo "Model: ${MODEL:-N/A}"
echo "Firmware: ${FIRMWARE:-N/A}"
echo "MAC: ${MAC:-N/A}"
# Save to file
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
cat > "status_final_${TIMESTAMP}.txt" << EOF
=== TP-Link M7350 Status ===
Timestamp: $TIMESTAMP
Connection Status: $CONNECT_TEXT
Network Type: $NETWORK_TEXT
IPv4 Address: ${IPV4}
SSID: ${SSID}
Current Clients: ${CLIENTS}
Monthly Used: ${MONTHLY_DISPLAY}
Monthly Used (bytes): ${MONTHLY_BYTES}
Model: ${MODEL}
Firmware: ${FIRMWARE}
MAC: ${MAC}
EOF
echo -e "\n✓ Saved to: status_final_${TIMESTAMP}.txt"
echo -e "\n=== RAW JSON EXCERPT ==="
echo "Showing JSON around key sections:"
echo "$STATUS_JSON" | head -c 800
echo "..."
read -n1 -r -p "Press any key to continue..."