Skip to content

Instantly share code, notes, and snippets.

@gigawatts
Created December 20, 2020 02:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gigawatts/5e7b44fd3fb9286c17ab98ecb38a899e to your computer and use it in GitHub Desktop.
Save gigawatts/5e7b44fd3fb9286c17ab98ecb38a899e to your computer and use it in GitHub Desktop.
Motorola / Arris SurfBoard modem signal monitoring script
#!/bin/bash
## Monitors 4 upstream and 4 downstream bonding channels from a SurfBoard cable modem
## Sends the data to InfluxDB
URL="http://192.168.100.1/cmSignalData.htm"
INFLUX="http://my-influxdb-server:8086"
db="network"
FILE="/tmp/cmSignalData.htm"
rm -f $FILE
curl -ks ${URL} -o $FILE >/dev/null 2>&1
## Set to "true" to monitor 8 downstream bonding channels
EIGHT="false"
## Downstream Ch IDs
dsch2=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[2]/td[2]' - | awk -F'<td>' '{print $2}' | awk -F' </td>' '{print $1}' | tr -cd '[:print:]')
dsch3=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[2]/td[3]' - | awk -F'<td>' '{print $2}' | awk -F' </td>' '{print $1}' | tr -cd '[:print:]')
dsch4=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[2]/td[4]' - | awk -F'<td>' '{print $2}' | awk -F' </td>' '{print $1}' | tr -cd '[:print:]')
dsch5=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[2]/td[5]' - | awk -F'<td>' '{print $2}' | awk -F' </td>' '{print $1}' | tr -cd '[:print:]')
if [[ $EIGHT == "true" ]]; then
dsch6=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[2]/td[6]' - | awk -F'<td>' '{print $2}' | awk -F' </td>' '{print $1}' | tr -cd '[:print:]')
dsch7=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[2]/td[7]' - | awk -F'<td>' '{print $2}' | awk -F' </td>' '{print $1}' | tr -cd '[:print:]')
dsch8=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[2]/td[8]' - | awk -F'<td>' '{print $2}' | awk -F' </td>' '{print $1}' | tr -cd '[:print:]')
dsch9=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[2]/td[9]' - | awk -F'<td>' '{print $2}' | awk -F' </td>' '{print $1}' | tr -cd '[:print:]')
fi
## Downstream Power Levels
dspl2=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[6]/td[2]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
dspl3=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[6]/td[3]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
dspl4=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[6]/td[4]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
dspl5=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[6]/td[5]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
if [[ $EIGHT == "true" ]]; then
dspl6=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[6]/td[6]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
dspl7=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[6]/td[7]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
dspl8=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[6]/td[8]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
dspl9=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[6]/td[9]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
fi
## Downstream Signal to Noise Ratio
dssnr2=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[4]/td[2]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
dssnr3=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[4]/td[3]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
dssnr4=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[4]/td[4]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
dssnr5=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[4]/td[5]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
if [[ $EIGHT == "true" ]]; then
dssnr6=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[4]/td[6]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
dssnr7=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[4]/td[7]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
dssnr8=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[4]/td[8]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
dssnr9=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[4]/td[9]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
fi
## Downstream channel freq
dsf2=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[3]/td[2]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
dsf3=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[3]/td[3]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
dsf4=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[3]/td[4]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
dsf5=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[3]/td[5]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
if [[ $EIGHT == "true" ]]; then
dsf6=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[3]/td[6]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
dsf7=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[3]/td[7]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
dsf8=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[3]/td[8]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
dsf9=$(cat $FILE | xmllint --html --xpath '/html/body/center[1]/table/tbody/tr[3]/td[9]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
fi
## Downstream Signal Status
## Unerrored codewords
dsuec2=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[3]/td[2]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
dsuec3=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[3]/td[3]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
dsuec4=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[3]/td[4]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
dsuec5=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[3]/td[5]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
if [[ $EIGHT == "true" ]]; then
dsuec6=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[3]/td[6]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
dsuec7=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[3]/td[7]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
dsuec8=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[3]/td[8]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
dsuec9=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[3]/td[9]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
fi
## correctable codewords
dscc2=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[4]/td[2]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
dscc3=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[4]/td[3]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
dscc4=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[4]/td[4]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
dscc5=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[4]/td[5]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
if [[ $EIGHT == "true" ]]; then
dscc6=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[4]/td[6]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
dscc7=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[4]/td[7]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
dscc8=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[4]/td[8]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
dscc9=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[4]/td[9]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
fi
## uncorrectable codewords
dsucc2=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[5]/td[2]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
dsucc3=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[5]/td[3]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
dsucc4=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[5]/td[4]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
dsucc5=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[5]/td[5]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
if [[ $EIGHT == "true" ]]; then
dsucc6=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[5]/td[6]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
dsucc7=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[5]/td[7]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
dsucc8=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[5]/td[8]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
dsucc9=$(cat $FILE | xmllint --html --xpath '/html/body/center[3]/table/tbody/tr[5]/td[9]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
fi
########################################################
## Upstream Ch IDs
usch2=$(cat $FILE | xmllint --html --xpath '/html/body/center[2]/table/tbody/tr[2]/td[2]' - | awk -F'<td>' '{print $2}' | awk -F' </td>' '{print $1}' | tr -cd '[:print:]' )
usch3=$(cat $FILE | xmllint --html --xpath '/html/body/center[2]/table/tbody/tr[2]/td[3]' - | awk -F'<td>' '{print $2}' | awk -F' </td>' '{print $1}' | tr -cd '[:print:]')
usch4=$(cat $FILE | xmllint --html --xpath '/html/body/center[2]/table/tbody/tr[2]/td[4]' - | awk -F'<td>' '{print $2}' | awk -F' </td>' '{print $1}' | tr -cd '[:print:]')
usch5=$(cat $FILE | xmllint --html --xpath '/html/body/center[2]/table/tbody/tr[2]/td[5]' - | awk -F'<td>' '{print $2}' | awk -F' </td>' '{print $1}' | tr -cd '[:print:]')
## Upstream Power Levels
uspl2=$(cat $FILE | xmllint --html --xpath '/html/body/center[2]/table/tbody/tr[6]/td[2]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
uspl3=$(cat $FILE | xmllint --html --xpath '/html/body/center[2]/table/tbody/tr[6]/td[3]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
uspl4=$(cat $FILE | xmllint --html --xpath '/html/body/center[2]/table/tbody/tr[6]/td[4]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
uspl5=$(cat $FILE | xmllint --html --xpath '/html/body/center[2]/table/tbody/tr[6]/td[5]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
## Upstream Ranging Status
usrs2=$(cat $FILE | xmllint --html --xpath '/html/body/center[2]/table/tbody/tr[8]/td[2]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
usrs3=$(cat $FILE | xmllint --html --xpath '/html/body/center[2]/table/tbody/tr[8]/td[3]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
usrs4=$(cat $FILE | xmllint --html --xpath '/html/body/center[2]/table/tbody/tr[8]/td[4]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
usrs5=$(cat $FILE | xmllint --html --xpath '/html/body/center[2]/table/tbody/tr[8]/td[5]' - | awk -F'<td>' '{print $2}' | awk -F'</td>' '{print $1}' | tr -cd '[:print:]')
usrsb2=$(if [ $usrs2 == "Success" ]; then echo 0; else echo 1; fi)
usrsb3=$(if [ $usrs3 == "Success" ]; then echo 0; else echo 1; fi)
usrsb4=$(if [ $usrs4 == "Success" ]; then echo 0; else echo 1; fi)
usrsb5=$(if [ $usrs5 == "Success" ]; then echo 0; else echo 1; fi)
## Upstream channel freq
usf2=$(cat $FILE | xmllint --html --xpath '/html/body/center[2]/table/tbody/tr[3]/td[2]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
usf3=$(cat $FILE | xmllint --html --xpath '/html/body/center[2]/table/tbody/tr[3]/td[3]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
usf4=$(cat $FILE | xmllint --html --xpath '/html/body/center[2]/table/tbody/tr[3]/td[4]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
usf5=$(cat $FILE | xmllint --html --xpath '/html/body/center[2]/table/tbody/tr[3]/td[5]' - | awk -F'<td>' '{print $2}' | awk -F' ' '{print $1}')
#################################################
## Print everything
echo "Downstream Ch: $dsch2 Freq: $(($dsf2/1000/1000)) MHz Power: $dspl2 dBmV SNR: $dssnr2 dB Unerrored: $dsuec2 Correctable: $dscc2 Uncorrectable: $dsucc2"
echo "Downstream Ch: $dsch3 Freq: $(($dsf3/1000/1000)) MHz Power: $dspl3 dBmV SNR: $dssnr3 dB Unerrored: $dsuec3 Correctable: $dscc3 Uncorrectable: $dsucc3"
echo "Downstream Ch: $dsch4 Freq: $(($dsf4/1000/1000)) MHz Power: $dspl4 dBmV SNR: $dssnr4 dB Unerrored: $dsuec4 Correctable: $dscc4 Uncorrectable: $dsucc4"
echo "Downstream Ch: $dsch5 Freq: $(($dsf5/1000/1000)) MHz Power: $dspl5 dBmV SNR: $dssnr5 dB Unerrored: $dsuec5 Correctable: $dscc5 Uncorrectable: $dsucc5"
if [[ $EIGHT == "true" ]]; then
echo "Downstream Ch: $dsch6 Freq: $(($dsf6/1000/1000)) MHz Power: $dspl6 dBmV SNR: $dssnr6 dB Unerrored: $dsuec6 Correctable: $dscc6 Uncorrectable: $dsucc6"
echo "Downstream Ch: $dsch7 Freq: $(($dsf7/1000/1000)) MHz Power: $dspl7 dBmV SNR: $dssnr7 dB Unerrored: $dsuec7 Correctable: $dscc7 Uncorrectable: $dsucc7"
echo "Downstream Ch: $dsch8 Freq: $(($dsf8/1000/1000)) MHz Power: $dspl8 dBmV SNR: $dssnr8 dB Unerrored: $dsuec8 Correctable: $dscc8 Uncorrectable: $dsucc8"
echo "Downstream Ch: $dsch9 Freq: $(($dsf9/1000/1000)) MHz Power: $dspl9 dBmV SNR: $dssnr9 dB Unerrored: $dsuec9 Correctable: $dscc9 Uncorrectable: $dsucc9"
fi
echo "Upstream Ch: $usch2 Freq: $(($usf2/1000/1000)) MHz Power: $uspl2 dBmV Status: $usrs2"
echo "Upstream Ch: $usch3 Freq: $(($usf3/1000/1000)) MHz Power: $uspl3 dBmV Status: $usrs3"
echo "Upstream Ch: $usch4 Freq: $(($usf4/1000/1000)) MHz Power: $uspl4 dBmV Status: $usrs4"
echo "Upstream Ch: $usch5 Freq: $(($usf5/1000/1000)) MHz Power: $uspl5 dBmV Status: $usrs5"
## Send to InfluxDB
# Downstream
curl -s -i -XPOST $INFLUX'/write?db='$db'&precision=m' --data-binary 'modem,dir=down,ch='"$dsch2"' freq='"$dsf2"',power='"$dspl2"',snr='"$dssnr2" -o /dev/null 2>&1
curl -s -i -XPOST $INFLUX'/write?db='$db'&precision=m' --data-binary 'modem,dir=down,ch='"$dsch3"' freq='"$dsf3"',power='"$dspl3"',snr='"$dssnr3" -o /dev/null 2>&1
curl -s -i -XPOST $INFLUX'/write?db='$db'&precision=m' --data-binary 'modem,dir=down,ch='"$dsch4"' freq='"$dsf4"',power='"$dspl4"',snr='"$dssnr4" -o /dev/null 2>&1
curl -s -i -XPOST $INFLUX'/write?db='$db'&precision=m' --data-binary 'modem,dir=down,ch='"$dsch5"' freq='"$dsf5"',power='"$dspl5"',snr='"$dssnr5" -o /dev/null 2>&1
if [[ $EIGHT == "true" ]]; then
curl -s -i -XPOST $INFLUX'/write?db='$db'&precision=m' --data-binary 'modem,dir=down,ch='"$dsch6"' freq='"$dsf6"',power='"$dspl6"',snr='"$dssnr6" -o /dev/null 2>&1
curl -s -i -XPOST $INFLUX'/write?db='$db'&precision=m' --data-binary 'modem,dir=down,ch='"$dsch7"' freq='"$dsf7"',power='"$dspl7"',snr='"$dssnr7" -o /dev/null 2>&1
curl -s -i -XPOST $INFLUX'/write?db='$db'&precision=m' --data-binary 'modem,dir=down,ch='"$dsch8"' freq='"$dsf8"',power='"$dspl8"',snr='"$dssnr8" -o /dev/null 2>&1
curl -s -i -XPOST $INFLUX'/write?db='$db'&precision=m' --data-binary 'modem,dir=down,ch='"$dsch9"' freq='"$dsf9"',power='"$dspl9"',snr='"$dssnr9" -o /dev/null 2>&1
fi
# Upstream
curl -s -i -XPOST $INFLUX'/write?db='$db'&precision=m' --data-binary 'modem,dir=up,ch='"$usch2"' freq='"$usf2"',power='"$uspl2"',status='"$usrsb2" -o /dev/null 2>&1
curl -s -i -XPOST $INFLUX'/write?db='$db'&precision=m' --data-binary 'modem,dir=up,ch='"$usch3"' freq='"$usf3"',power='"$uspl3"',status='"$usrsb3" -o /dev/null 2>&1
curl -s -i -XPOST $INFLUX'/write?db='$db'&precision=m' --data-binary 'modem,dir=up,ch='"$usch4"' freq='"$usf4"',power='"$uspl4"',status='"$usrsb4" -o /dev/null 2>&1
curl -s -i -XPOST $INFLUX'/write?db='$db'&precision=m' --data-binary 'modem,dir=up,ch='"$usch5"' freq='"$usf5"',power='"$uspl5"',status='"$usrsb5" -o /dev/null 2>&1
rm -f $FILE
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment