WAN-Traffic von DD-WRT als CSV-Datei

Am 04.09.2021 um 17:47
von ridcully, Kategorie: Blog, Tags: Administration DD-WRT Script Ruby

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

Build @ 2021-10-24T11:13:51+02:00