Fritz!Box DSL monitoring in Python
Let’s start off the year with a small home project. I have a Fritz!Box 7430 DSL gateway (wireless router and VDSL modem). After I ran into degraded performance, I wanted to record how my line performs. The box has a web interface with mighty functionalities and it exposes nerdy data - although I’m still looking for the obvious "disconnect DSL" button, dude please. The interface is surprisingly clear compared to the standard market crap (bbox I’m looking at you). It’s more expansive than a Sagem counterpart but it’s well worth it.
So you can get info like:
-
Current throughput
-
Maximum attainable throughput
-
S/N ratio
-
CRC error count
-
Approximate cable length
and much more that I can imagine a use case for.
But it does not record historic info, so I have no way to nag my ISP about reduced performance over the long run. And an error may be present long before I realise it (for instance after I started playing an online game or after I elected to Netflix and chill).
The obvious geeky thing to do was to write a tool that collects the relevant data. Python was the tool I needed for the job.
The main obstacle was to figure out how to simulate the login screen. For some reason (maybe an illusion of security by obfuscation?), the login process relies on a javascript md5
encoded challenge. After I figured out what was going on, I found code emulating that process on GitHub and re-used it.
Too bad the FritzBox firmware is confused about how to handle data. On some pages, you can see JSON served by the box. But unfortunately, the info I need where stored on a page fully generated in HTML. So I went for good old ugly HTML scraping.
I still have to figure out how to interpret data and how to act on them. Probably I’ll add simple alerts for obvious cases.
In the meantime, here it is, licensed under GNU GPL.
Happy hacking