Beantwoord

Connect Box - DOCSIS-info uitlezen buiten webinterface

  • 15 februari 2020
  • 30 reacties
  • 1929 keer bekeken

Reputatie 6
Badge +7

Weet iemand of het mogelijk is om de signaalniveaus en SNR’s van de downstream en upstream kanalen van de Connect Box uit te lezen buiten de webinterface om?

Ik zou deze informatie graag opnemen in Nagios, momenteel staat het modem niet in mijn monitoring omdat ik het niet kan pingen. Modem staat in bridgemodus voor IPv4.

Ik zie dat er wel XML wordt opgevraagd bij bekijken van de betreffende pagina’s (http://192.168.100.1/xml/getter.xml) maar het lukt mij niet om deze op te vragen via bijvoorbeeld Postman, ook niet als ik de cookie opgeef in de headers.

Software: CH7465LG-NCIP-6.12.18.25-2p5-NOSH

icon

Best beantwoord door jarielcapitain 20 maart 2020, 21:52

@tobiastheebe 

Ik weet niet of je al succes hebt gehad.

 

Na wat speurwerk ben ik ook nog een andere python versie gevonden om data te krijgen vanuit de connect box, en dit werk voor mij.

python-connect-box

 

Wat toevoegingen:

Vereist is python  minimaal 3.6.
 
Ook is nodig  aiohttp:
pip3 install aiohttp.
pip3 install connect_box 

in __init_.py verander host 192.168.0.1 in 192.168.178.1 

Data extracted voorbeelden:

DownstreamChannel(frequency=412000000, powerLevel=-4, modulation='256qam', id='24', snr=38.605, preRs=154607131870, postRs=458674, qamLocked=True, fecLocked=True, mpegLocked=True),
UpstreamChannel(frequency=52000000, powerLevel=52, symbolRate='5.120', id='1', modulation='16qam', type='3', t1Timeouts=0, t2Timeouts=0, t3Timeouts=56, t4Timeouts=0, channelType='ATDMA', messageType=29),
Device(mac='32:46:9A:17:E6:A6', hostname='Unknown', ip=IPv4Address('192.168.178.2'))


 

 

Bekijk origineel

Dit topic is gesloten. Staat je antwoord hier niet bij, stel dan je vraag in een nieuw topic.

30 Reacties

Reputatie 3
Badge +3

De reden dat je geen replay kunt doen van de request is omdat er een functie in de javascript zit die de laatste sessieToken uit de cookie gebruikt om een nieuwe request te maken (functie updateToken), waar die laatste waarde wil onderdeel is van de volgende request. Gezien je ook maar met een gebruiker kunt inloggen snap je vast dat het voor een proof op concept wel aan de praat te krijgen is. Het begin is NoticeLogin() te implementeren die je in common_api.js kunt vinden.

Het mooiste zou natuurlijk zijn om een SNMP toegang te hebben en eigenlijk is het onvoorstelbaar dat dit soort functionaliteit niet in het modem zou zitten. Of bewust door Ziggo wordt uitgezet. 

Ik zou zelf ook wel geïnteresseerd zijn in een stukje code dat dit kan monitoren. Bij ADSL kun je hier ook veel beteren inzichten uit krijgen dan KPN zelf heeft.

Dit vind je vast interessant: https://github.com/ties/compal_CH7465LG_py

Reputatie 6
Badge +7

Dank voor de reactie en de link. Het gebrek aan SNMP is inderdaad vervelend. Ik verwacht dat het geen beperking is van de hardware, maar eerder van de Ziggo-firmware.

Ik ga eens kijken of ik uit de voeten kan met de code, heb zelf (nog) geen ervaring met Python.

Reputatie 6
Badge +7

Ik kom er (nog) niet echt uit, wellicht door mijn gebrek aan ervaring met Python. Het liefst zou ik iets met PHP hebben, daar werk ik wel af en toe mee.

:~/download/compal_CH7465LG_py $ python setup.py
Traceback (most recent call last):
File "setup.py", line 2, in <module>
from setuptools import setup, find_packages
ImportError: No module named setuptools

Wanneer ik dit stukje code probeer te draaien:

import os
import time
from compal import *

modem = Compal('192.168.100.1', os.environ['ROUTER_CODE'])
modem.login()

# Or find all possible functions of the modem:
scan = FuncScanner(modem, 0, os.environ['ROUTER_CODE'])
while scan.current_pos < 101:
print(scan.scan().text)

# If you want to go back to 'normal':
# modem.reboot() # or
# modem.factory_reset()

# And logout
modem.logout()
:~/download/compal_CH7465LG_py $ python test.py
Traceback (most recent call last):
File "test.py", line 3, in <module>
from compal import *
File "/home/me/download/compal_CH7465LG_py/compal/__init__.py", line 354
def add_forward(self, local_ip, ext_port, int_port, proto: Proto,
^
SyntaxError: invalid syntax

De developer geeft overigens zelf aan, dat hij de scripts alleen voor zijn use case heeft geschreven.

Reputatie 6
Badge +7

@tobiastheebe 

Ik weet niet of je al succes hebt gehad.

 

Na wat speurwerk ben ik ook nog een andere python versie gevonden om data te krijgen vanuit de connect box, en dit werk voor mij.

python-connect-box

 

Wat toevoegingen:

Vereist is python  minimaal 3.6.
 
Ook is nodig  aiohttp:
pip3 install aiohttp.
pip3 install connect_box 

in __init_.py verander host 192.168.0.1 in 192.168.178.1 

Data extracted voorbeelden:

DownstreamChannel(frequency=412000000, powerLevel=-4, modulation='256qam', id='24', snr=38.605, preRs=154607131870, postRs=458674, qamLocked=True, fecLocked=True, mpegLocked=True),
UpstreamChannel(frequency=52000000, powerLevel=52, symbolRate='5.120', id='1', modulation='16qam', type='3', t1Timeouts=0, t2Timeouts=0, t3Timeouts=56, t4Timeouts=0, channelType='ATDMA', messageType=29),
Device(mac='32:46:9A:17:E6:A6', hostname='Unknown', ip=IPv4Address('192.168.178.2'))


 

 

Reputatie 6
Badge +7

Dank, ga ik proberen!

Update: gelukt! Het was nog best was uitzoekwerk voor een beginnende Python-gebruiker zoals ik. Om mijn Raspberry Pi (waar Nagios op draait) heb ik zowel Python 2.7 als 3.7 staan en ik moest pip installeren voor die laatste vanwege de vereiste die jij ook noemde in jouw bericht. In eerste instantie had ik pip alleen voor 2.7 geïnstalleerd en dat leverde foutmeldingen op bij het installeren van aiohttp. Toen eenmaal pip beschikbaar was voor 3.7 kon ik probleemloos de modules installeren (aiohttp en connect_box). Vervolgens nog even IP-adres (in mijn geval 192.168.100.1 vanwege bridge mode) en wachtwoord aanpassen in respectievelijk connect_box\__init__.py en example.py en tenslotte kon ik example.py uitvoeren (uiteraard slechts een klein gedeelte van de output):

:~/download/python-connect-box $ python3 example.py
[DownstreamChannel(frequency=458000000, powerLevel=9, modulation='256qam', id='24', snr=38.983, preRs=84710548030, postRs=2813, qamLocked=True, fecLocked=True, mpegLocked=True),
[UpstreamChannel(frequency=36000000, powerLevel=40, symbolRate='5.120', id='3', modulation='64qam', type='3', t1Timeouts=0, t2Timeouts=0, t3Timeouts=7, t4Timeouts=0, channelType='ATDMA', messageType=29),

Commando’s die ik heb uitgevoerd om het geheel te laten werken:

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3.7 get-pip.py
cd python-connect-box/
~/.local/bin/pip3.7 install aiohttp
~/.local/bin/pip3.7 install connect_box
python3 example.py

Voor de volledigheid, dit werkte dus niet:

~/.local/bin/pip install aiohttp

Nu nog uitvogelen hoe ik dit netjes in Nagios ga krijgen, maar het begin is er!

Reputatie 6
Badge +7

Nog vergeten te vermelden: ik had ook python3-dev nodig.

Het gaaf, ik heb zelf veelervaring met python, dus ik ga hier zeker in duiken.

 

ipv nagios ga ik dit koppelen met Grafana + influxdb met een sidestep naar domiticz, alles op een raspberry pi

Reputatie 6
Badge +7

@Fennie 

Ik gebruik Node.js + Node-red.

Een nadeel is de beperkte logging functie van de connectbox. Ik gebruik een ververs rate van 30 minuten om nog een beperkte log te zien in de connecbox.

Veel succes in ieder geval

bijgaand een plaatje van T3 errors.

 

Reputatie 7

Zeer interessant. Heb je ook grafieken van de signaalsterkte/tijd op de upstream kanalen en de post RS errors/tijd op de downstream kanalen?

Reputatie 6
Badge +7

 

Huidige Signaal sterkte is op de grafiek maar kan wel gelogd worden, tijd is lastig ivm 30m interval. maar zoals op de grafiek te zien is rond 20-23 uur hoge t3 errors.

 

 

I can log downstream power level, snr, postRS, preRS, freq , channel id,

Upstream channel , power T3 etc errors 

 

De kwaliteit van mijn signaal is niet super maar heb er geen problemen mee.

Modem on line +/- 60 dagen vandaar het hoge aantal postRS.

 

PS dit is met een compal modem.

 

Reputatie 7

Jammer dat de upstream signaalsterkte/tijd ontbreekt, want dat is nu net informatie die eigenlijk standaard al in het modem in grafiek vorm zou moeten worden getoond omdat het veel zegt over de stabiliteit van de verbinding tussen modem en CMTS. Bij een stabiele verbinding blijft de upstream signaalsterkte namelijk over een langere periode gelijk. Wanneer de signaalsterkte echter blijft variëren dan is dat een teken dat de CMTS het modem instructies blijft sturen om de signaalsterkte aan te passen omdat de CMTS problemen heeft met de ontvangst van het door de modem verzonden signaal.

Ook is het een duidelijke aanwijzing dat het modem besloten heeft om een kabel interface reset uit te voeren als de signaalsterkte van alle upstream kanalen opeens van een hoge naar een lage waarde gaat. Dat zijn signaal onderbrekingen die je niet wilt hebben, maar veelal niet inzichtelijk zijn door gebrekkige logging van de Connectbox modems. Als de signaalsterkte van één upstream opeens van een hoge naar een lage waarde gaat, dan is dat een aanwijzing dat de CMTS het modem een abort opdracht heeft gegeven om de upstream te blijven gebruiken waarna het modem alleen die specifieke upstream heeft gereset in de hoop dat de upstream dan wel constant blijft. Dat zou ook in de log terug moeten komen als een TCS melding.

Verder zeggen natuurlijk ook de T4 meldingen veel over de stabiliteit van het modem aangezien iedere T4 in ieder geval moet leiden tot een volledige reset van de kabel interface. Het modem moet er in dergelijke gevallen immers vanuit gaan dat de CMTS problemen heeft waardoor geen van de upstream kanalen nog langer bruikbaar zijn en/of het geen packets meer ontvangt via de downstream kanalen.

Echt Cool 😎. Kunnen jullie een stappenplannetje delen met de community?

Reputatie 6
Badge +7

Mooie grafiekjes, @jarielcapitain. Bij de implementatie die ik nu gebruik heb ik geen idee hoe ik deze moet aanpassen om een ander soort output uit te krijgen. Nu krijg ik voor de downstream en upstream channels alleen een array van objects (de channels) terug. Als ik deze data (performance data in Nagios-terminologie) verder wil verwerken buiten Nagios (specifiek gebruik ik nagiosgraph), dan moet ik uit het script output in een bepaalde opmaak krijgen en voor in Nagios zelf zou het ook fijn zijn om de output data er netjes uit te laten zien. Als de performance data zou lukken, dan kan ik signal strength/SNR per channel en errors uitzetten tegen tijd.

Ik vind Python nog steeds niet echt fijn om mee te werken (ligt aan mij wegens gebrek aan ervaring), met PHP zou ik waarschijnlijk wel verder komen. Ik zou dit best zelf willen schrijven (iedereen die scripts voor de Connect Box schrijft, lijkt Python te gebruiken) maar loop al vast op de authenticatiefase. Ik heb geprobeerd om dit af te lezen uit de Python-code die ik nu gebruik, maar kan er geen chocola van maken...

Reputatie 6
Badge +7

@tobiastheebe 

Optie 1 Installeer Node.js en Node-Red.

 

Dit is een voorbeeld voor de upstream channels. Elke node heeft een bepaalde functie + de mogelijkheid om in een functie node je eigen wensen toe te passen.

Hier op tweakers meer informatie Node-Red.

 

Voorbeeld flow voor mijn Upstream kanalen

 

Optie 2

Doorgaan met PHP.

  1. pas je pythonscript aan voor alleen downloads.
  2. plaats een # voor  upstream en connected devices await en print Hiermee rijg je alleen de downstream channels
    """Get the data from an UPC Connect Box."""
    import asyncio
    from pprint import pprint

    import aiohttp

    from connect_box import ConnectBox


    async def main():
    """Sample code to retrieve the data from an UPC Connect Box."""
    async with aiohttp.ClientSession() as session:
    client = ConnectBox(session, "password")

    # Print details about the downstream channel connectivity
    await client.async_get_downstream()
    pprint(client.ds_channels)

    # Print details about the upstream channel connectivity
    #await client.async_get_upstream()
    #pprint(client.us_channels)

    # Print details about the connected devices
    #await client.async_get_devices()
    #pprint(client.devices)

    await client.async_close_session()


    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

     

  3. voor de downstream object gebruik ik reg expression om tekens te verwijderen en split functie om de kanalen in individuele objecten, dit is ook in PHP aanwezig. Hetzelfde geld voor de kanalen objecten. Dit is wel voor node-red. maar geef je wel een idee

    var y =msg.payload;
    //var x =msg.payload;
    y =y.replace(/DownstreamChannel/g, '');
    y =y.replace(/\(/g, '');//(
    y =y.replace(/\)/g, '');//)
    y =y.replace(/\[/g, '');//[
    y =y.replace(/"/g, '');//"
    y =y.replace(/=/g, ':');//vervang = door :

    y=y.split('\n');//split the channels op \n

    msg ={payload:y};
    return msg;

    Zie hoe het gaat 

Reputatie 6
Badge +7

Ik ben hier inmiddels weer wat verder mee gekomen dankzij deze git repo: https://github.com/TBD/upcdevices/blob/master/devices.sh. Met twee simpele cURL requests kun je bijvoorbeeld als volgt de downstream data ophalen in XML:

curl -I -s http://192.168.100.1/common_page/login.html
curl -s http://192.168.100.1/xml/getter.xml --data "token=1234567890&fun=10"

In de eerste request wordt alleen de header opgevraagd, in de response wordt de te gebruiken token getoond. Met fun (haha) kun je de gewenste functie kiezen:

CMD_LOGIN = 15
CMD_LOGOUT = 16
CMD_DEVICES = 123
CMD_DOWNSTREAM = 10
CMD_UPSTREAM = 11

Door omzetten van de XML naar JSON o.i.d. moet het nu wel lukken om de output verder te verwerken. Ik ga hier dus weer verder mee experimenteren c.q. een stukje PHP schrijven dat fun als argument accepteert.

Wat ik wel bizar vind is dat ik het wachtwoord van het modem niet nodig heb voor authenticatie?

This is not a true login; we're abusing the fact that this router is buggy and will happily spit out a valid session token for any random request.

Bron: https://github.com/TeMPOraL/cl-compal-ch7465lg/blob/master/main.lisp

 

Meer functies:

 1 gets data about the cable network access
2 gets details about the cable modem (mode, version, mac, serial, uptime, ...)
5 gets operational status data
6 gets data about frequency plan and locked channel frequency
10 gets list of downstream channels and their quality, returns dictionary with array of downstream channels
11 gets list of upstream channels and their quality, returns dictionary with array of upstream channels
12 returns data of unerrored, correctable and uncorrectable frames for downstream
136 gets data about operational status, chip and tuner temperatures (temps in degF?)

123, 128, 136, 143, 144 runtime status/settings

136 temperature
137, 143, 147 port status (137 with "ethflaplistFile; 147 - only ethflaplistFile - NULL)
144 service status (complete)

15 full login (func 15) = open login page, then login with password to gain full access to xmlrpc
16 logout
133 reboot

Bron: https://gist.github.com/zajdee/7025a4e9221089208e667c7a2eefbc22

Reputatie 6
Badge +7

Dit is wat ik tot nu toe (na een paar uurtjes zwoegen) in elkaar heb gezet:

:~/ch7465lg $ php check_ch7465lg.php
Downstream Channels:
24 (458 MHz, 256QAM): 9 dBmV power at 38.983 dB SNR, 3064 post-RS errors
23 (450 MHz, 256QAM): 8 dBmV power at 38.605 dB SNR, 3175 post-RS errors
22 (442 MHz, 256QAM): 8 dBmV power at 38.605 dB SNR, 3650 post-RS errors
21 (434 MHz, 256QAM): 8 dBmV power at 38.605 dB SNR, 3490 post-RS errors
20 (426 MHz, 256QAM): 8 dBmV power at 38.983 dB SNR, 3493 post-RS errors
19 (418 MHz, 256QAM): 8 dBmV power at 38.983 dB SNR, 3873 post-RS errors
18 (410 MHz, 256QAM): 8 dBmV power at 38.605 dB SNR, 4316 post-RS errors
17 (402 MHz, 256QAM): 8 dBmV power at 38.605 dB SNR, 2817 post-RS errors
16 (394 MHz, 256QAM): 8 dBmV power at 38.983 dB SNR, 3638 post-RS errors
15 (386 MHz, 256QAM): 8 dBmV power at 38.983 dB SNR, 3039 post-RS errors
14 (378 MHz, 256QAM): 8 dBmV power at 38.983 dB SNR, 3717 post-RS errors
13 (370 MHz, 256QAM): 8 dBmV power at 38.605 dB SNR, 3379 post-RS errors
12 (362 MHz, 256QAM): 8 dBmV power at 38.605 dB SNR, 3181 post-RS errors
11 (354 MHz, 256QAM): 8 dBmV power at 38.983 dB SNR, 3263 post-RS errors
10 (346 MHz, 256QAM): 7 dBmV power at 38.605 dB SNR, 2800 post-RS errors
9 (338 MHz, 256QAM): 7 dBmV power at 38.983 dB SNR, 3010 post-RS errors
8 (330 MHz, 256QAM): 7 dBmV power at 38.983 dB SNR, 3308 post-RS errors
7 (322 MHz, 256QAM): 7 dBmV power at 38.605 dB SNR, 3818 post-RS errors
6 (314 MHz, 256QAM): 7 dBmV power at 38.605 dB SNR, 3386 post-RS errors
5 (306 MHz, 256QAM): 7 dBmV power at 38.605 dB SNR, 3136 post-RS errors
4 (298 MHz, 256QAM): 7 dBmV power at 38.605 dB SNR, 3376 post-RS errors
3 (290 MHz, 256QAM): 6 dBmV power at 38.983 dB SNR, 3915 post-RS errors
2 (282 MHz, 256QAM): 6 dBmV power at 38.983 dB SNR, 4098 post-RS errors
1 (274 MHz, 256QAM): 6 dBmV power at 38.983 dB SNR, 4051 post-RS errors

Upstream Channels:
3 (36 MHz, 64QAM): 40 dBmV power
4 (58.8 MHz, 64QAM): 41 dBmV power
2 (44.5 MHz, 64QAM): 40 dBmV power
1 (52 MHz, 64QAM): 41 dBmV power

In principe is dit alle informatie die ik Nagios wil gaan zetten. Ik moet het script nog even uitsplitsen zodat ik downstream en upstream apart kan opvragen, zodat ik deze in Nagios elk in een eigen service kan zetten. Verder moet het nog worden uitgebreid voor de performance data.

Tot nu toe is dit één bestand met 82 regels code. Ik zal het script hier delen als iemand geïnteresseerd is.

Reputatie 6
Badge +7

  Dit is hoe het er nu uitziet in Nagios, ben best tevreden.

Nu nog even bedenken hoe ik de performance data ga aanpakken zodat ik de grafiekjes kan laten genereren. Ik wil i.i.g. het volgende erin gaan zetten: power levels en SNR’s van de downstream channels + power levels en T3 timeouts van de upstream channels.

Update: hier is dan het begin van de eerste grafieken:

 

Mooi werk. Zijn dat echt je Post RS errors, lijkt me wat veel...

Reputatie 6
Badge +7

@tobiastheebe 

Wat ik wel bizar vind is dat ik het wachtwoord van het modem niet nodig heb voor authenticatie?

Klopt Gebeurt bij mij hetzelfde. 

Mooi werk en bedankt voor de linken. Heb zelf ook nog verder gezocht maar kon niets vinden.

@efok

Deze post errors valt nog wel mee, Ik zit op de 200.000 na 70 dagen.

Reputatie 6
Badge +7

Mijn modem zit nu op een uptime van 53 dagen. Ik ben niet echt blij met de RS en T3 errors, maar het schijnt dat je bij de Connect Box met bepaalde zaken maar moet leven…

 

Reputatie 5
Badge +5

Leuk script @tobiastheebe kan je het misschien delen in een Github Gist of iets dergelijks?

Reputatie 6
Badge +7

@ArieKanarie Hierbij: https://gitlab.com/tobias.theebe/ch7465lg-nagios. Let op: het script is nog vrij ruw en specifiek voor Nagios gebouwd.

Reputatie 6
Badge +7

@tobiastheebe 

Nu je toch lekker bezig ben kijk eens naar function “fun=12”

Deze geeft weer <signal><dsid>24</dsid><unerrored>212273446280</unerrored><correctable>466128</correctable><uncorrectable>59163</uncorrectable></signal>

De unerrored geeft weer de preRs.

Correctable de post RS (gecorrigeerd dus ) 

uncorrectable  Deze worden dus niet weergegeven in de compal 

Reputatie 6
Badge +7

Handig! Bij mij geldt schijnbaar: uncorrectable = correctable * 4, voor alle downstream channels.

Reputatie 6
Badge +7
Ook wel interessant: in de downstream grafiek van de afgelopen 20 uur is het signaal overdag (12:00-18:00), gemiddeld 1 dBmV lager. Invloed van temperatuur op de CAI-kabel?