WAN-Traffic von DD-WRT als CSV-Datei
Am 04.09.2021 um 17:47von , Kategorie: Blog, Tags:
Ich habe einen Router der mit der kostenlosen DD-WRT-Firmware läuft. Jetzt hatte ich die dumme Idee, ich möchte gerne die WAN-Traffic-Statistik etwas genauer auswerten. Im wesentlichen geht es mir um den kumulierten Traffic im Monat. Das wird zwar im Web-Interface angezeigt, jedoch gibt es keine saubere monatliche Statistik. Wenn man nun aber die Daten aus dem Web-Interface auslesen könnte, und in eine CSV-Datei schreiben könnte, wäre ein einfaches Auswerten mit jeder Tabellenkalkulation möglich.
Also habe ich mir ein kleines Ruby-Script geschrieben, was exakt das tut. Es lädt das Webinterface und ermittelt die angezeigten Werte, die hinterher einfach auf dem Bildschirm ausgegeben werden. Leitet man die Ausgabe auf der Konsole in eine Datei um, ergibt das ganze eine CSV-Datei, die mit jeder Tabellenkalkulation geöffnet und ausgewertet werden kann.
Falls jemand Interesse hat - hier das Script:
# DD-WRT-Router-Details
ip = "10.0.1.1"
user = "admin"
password = "einsehrgeheimespasswortdashiernichtstehendarf"
# Welche Monate sollen geladen werden. Array mit Monat-Jahr als String.
whatToLoad = ["11-2020", "12-2020", "1-2021", "2-2021", "3-2021",
"4-2021", "5-2021", "6-2021", "7-2021", "8-2021", "9-2021"]
# Imports die wir brauchen
require 'net/http'
require 'openssl'
require 'date'
# CSV-Header
puts "\"date\",\"incoming mb\",\"outgoing mb\""
# Daten laden
for what in whatToLoad do
uri = URI("https://#{ip}/ttgraph.cgi?#{what}")
response = {}
Net::HTTP.start(uri.host, uri.port,
:use_ssl => uri.scheme == 'https',
:verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|
request = Net::HTTP::Get.new uri.request_uri
request.basic_auth user, password
response = http.request request # Net::HTTPResponse object
end
return puts "FAILED" unless response.body
# Magisches RegExp um aus der geladenen HTML-Datei
# die Werte zu extrahieren
re = /\('([^\(]+) \(Incoming: ([0-9]+) MB \/ Outgoing: ([0-9]+) MB\)'\)" /
matches = response.body.scan re
# Daten ausgeben
for item in matches
d = Date.parse(item[0]).strftime("%Y-%m-%d")
puts "#{d},#{item[1]},#{item[2]}"
end
end