Back in December, I bought the Netgear GS108E gigabit managed switch for my flat’s home network (£25 at the time of writing). It lives in a random cupboard along with my servers and internet router, and so far it has served me very well. However, it’s cheap. The web interface certainly shows off it’s cheapness with limited options and information. The switch also provides no SNMP data, which makes monitoring devices and traffic fairly difficult using tools like PRTG or Munin.
I needed a solution to see what devices were absorbing bandwidth in my flat. Having a horrible 3.5mbps internet connection (thanks BT for your insistence to not upgrade infrastructure in a busy growing residential area in a major city), one device can very quickly suck up bandwidth and it’s always difficult to pinpoint who’s guzzling data. I had set up the port connections so so my room was on port 4, wifi was on port 8 and the living room was on port 7, so I had some way of setting QoS port rules and throttle the ports, but I still had no way of easily monitoring the bandwidth consumption. The only bit of information the switch gives me through the GUI is bytes sent and received.
Hmm, I can use that information. PRTG has a sensor API and a python interpreter.
The final result, I wrote a small python script to scrape this information from the switch and create a custom sensor for PRTG. The script authenticates with the web interface and stores the auth cookie for future use (the switch will only allow a certain number of active sessions at one time). The script then loads the port_statistics.html page allowing me to scrape the bytes sent and received. I load the page twice over a recorded time period, do some maths to convert the difference in bytes into a kbps value, and get a nice readable kbps value.
The script also creates a child class of CustomSensorResult (found in the PRTG paepy library). While the class is incredibly useful and sped up my development time by not having to worry about crafting a json response, it was missing the ability to define size and time units as documented in the PRTG API.
Is it perfect, definitely not. While the script functions, it’s not the most elegantly written thing in the world and can be tidied up heavily. The switch is also not exactly fast to respond to requests, and during testing the script did timeout occasionally or give me really bizarre results, so caching data is certainly needed. Debugging with PRTG is also a challenge, as I’ve not yet found a way of seeing any python error dumps within the GUI.
I’ve missed building little useful scripts like this. It was good fun to build this and develop my python knowledge (and get out my python book to figure out how to properly work with parent classes), and I certainly need to do this more often.
If you find this script useful with any compatible Netgear ProSafe GS switch, please star the git repository or drop me a tweet @mattyribbo. It’s always nice to know that someone found something I wrote handy.