This is a Python script to scrape stats from the Arris cable modem web interface. Results are meant to be sent to InfluxDB for use with Grafana, but also currently supports AWS Timestream and Splunk. This orginally started as a fork of https://github.com/billimek/SB6183-stats-for-influxdb
I no longer have cable internet, thus cannot develop this project any further. I will merge reasonable PRs that come in, but I will have no way to test the changes.
In late Oct 2020, Comcast deployed firmware updates to the SB8200 which now require authenticating against the modem. If your modem requires authentication (you get a login page when browsing to https://192.168.100.1/), then you must edit your config.ini file (or set the matching ENV variables) and set modem_auth_required
to True
, and set modem_password
appropriately. By default, your modem's password is the last eight characters of the serial number, located on a sticker on the bottom of the modem.
In October of 2021, Comcast again deployed new firmware that changed how authentication is handled. The old login method is no longer supported, but if you are with a different carrier and still need the old login functionality, use release v1.2.0. I have no way to test the old auth scheme, which is why it's no longer supported.
This supports both InfluxDB 1.x and InfluxDB 2.x. See the Config Settings section below for options. With InfluxDB 1.x, influx_host
is the only required setting if your Influx server does not require authentication. It will attempt to create the database if it doesn't exist. For InfluxDB 2.x, change influx_major_version
to 2
, and also supply your url, org, bucket, and token with write access with the appropriate settings outlined below.
See other environment variables in Config Settings. This image is automatically rebuilt every month.
docker pull afraley/arris_cable_modem_stats
docker run \
-e modem_auth_required=True \
-e modem_password='last eight characters of the serial number' \
-e influx_host='influxhost.local' \
--restart unless-stopped \
afraley/arris_cable_modem_stats
Run in a Docker container with the following (see other environment variables in Config Settings):
docker build -t arris_stats .
docker run \
-e modem_auth_required=True \
-e modem_password='last eight characters of the serial number' \
-e influx_host='influxhost.local' \
--restart unless-stopped \
arris_stats
Install Python 3.8.x or later
Clone repo and
$ cd arris_cable_modem_stats/src
Install virtualenv
$ python3 -m pip install virtualenv
Create and activate virtualenv
$ python3 -m venv venv
$ source venv/bin/activate
Install pip dependencies
python3 -m pip install -r requirements.txt
Edit config.ini and change influx_host to your influxdb server
If your cable modem requires authentication, edit config.ini and set:
modem_auth_required = True
modem_password = last_8_chars_of_modem_serial
Run arris_stats.py
python3 arris_stats.py --config config.ini
Config settings can be provided by the config.ini file, or set as ENV variables. If you run arris_stats.py with --config config.ini, ENV settings will be ignored.
log_level = debug|info|warning|error
debug
info
the defaultwarning
error
destination = influxdb
influxdb
requires all influx_* params to be populatedtimestream
requires all timestream_* params to be populatedsplunk
requires all splunk_* params to be populatedstdout_json
will send the data to standard output in JSON format, great with log_level=error
to suppress messagessleep_interval = 300
modem_url = https://192.168.100.1/cmconnectionstatus.html
http://192.168.100.1/RgConnect.asp
modem_verify_ssl = False
modem_auth_required = False
modem_username = admin
modem_password = None
modem_model = sb8200
sb6183
, sb8200
, t25
exit_on_auth_error = True
exit_on_html_error = True
clear_auth_token_on_html_error = True
sleep_before_exit = True
Influx Settings
influx_major_version = 1
Influx major version 1.x or 2.xinflux_verify_ssl = True
influx_host = localhost
influx_port = 8086
influx_database = cable_modem_stats
This will be created automatically if it caninflux_username = None
influx_password = None
influx_use_ssl = False
influx_org = None
influx_url = http://influx.localdomain:8086
influx_bucket = cable_modem_stats
Must already exist, token must have write accessinflux_token = None
AWS Timestream Settings
timestream_aws_access_key_id = None
timestream_aws_secret_access_key = None
timestream_database = cable_modem_stats
timestream_table = cable_modem_stats
timestream_aws_region = us-east-1
Splunk Settings
splunk_host = None
splunk_port = 8088
splunk_token = None
splunk_ssl = False
splunk_verify_ssl = True
splunk_source = arris_cable_modem_stats
You can enable debug logs in three ways:
python3 arris_stats.py --debug --config config.ini
log_level = debug
log_level = debug
The database will be created automatically if the user has permissions (defaults to anonymous access). See Config Settings above for a list of ENV variables (or config.ini options).
Database and table are required to be created ahead of time using appropriate settings for your use-case. See Config Settings above for a list of ENV variables (or config.ini options).
Basic support for sending stats to Splunk is available. Stats are sent as _json data to the Splunk HTTP Event Collector. To setup Splunk:
destination = splunk
There are two Grafana examples. The first only relies on the Python script from this repo, while the second relies on Telegraf.
/etc/telegraf/telegraf.d/
(customize IPs/hosts to your liking)