Netgate Discussion Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Register
    • Login

    Public RRD Graphs - Die RRD-Graphen der pfSense in eine externe Website einbinde

    Scheduled Pinned Locked Moved Deutsch
    1 Posts 1 Posters 941 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • E
      e-cite
      last edited by

      Hallo,

      auf meinem RaspberryPi (mit Raspbian) möchte ich eine kleine Webseite zur Verwaltung meines Heimnetzwerks einrichten. Das Grundgerüst der Seite steht bereits, Apache mit php läuft, Raspberry ist erreichbar. Nun sollen die RRD-Graphen der pfSense in die Website auf dem Raspberry eingebunden werden.

      Hierzu habe ich im Netz folgende Skripte gefunden: http://captain-slow.dk/2010/09/24/public-rrd-graphs-from-pfsense/

      Leider sind diese Skripte nur für pfSense 1.xx geeiget, ich verwende jedoch 2.1!

      Hab dann die Seite, insbesondere das graph_rrd.php Skript, wie folgt umgebaut:

      require_once("config.inc.php");
      
      if (isset($_GET["file"]) && isset($_GET["interval"]))
      {
      	$curl_handle = curl_init();
      	// Setze Pfad für Cookie
      	curl_setopt($curl_handle, CURLOPT_COOKIEJAR, '/tmp/'.$cookie);
      	curl_setopt($curl_handle, CURLOPT_COOKIEFILE, '/tmp/'.$cookie);
      	curl_setopt($curl_handle, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.12) Gecko/20070508 Firefox/1.5.0.12");
      	curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER,1);
      	curl_setopt($curl_handle, CURLOPT_HEADER, 1);
      	curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, 1);
      	curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT,2);
      
      	// Öffne Login-Page
      	curl_setopt($curl_handle, CURLOPT_URL, $pfsenseprot . "://" . $pfsenseip);
      	$buffer = curl_exec($curl_handle);
      
      	// Suche csrfMagicToken in der Login-Page, erzeuge String mit dem Token nach $token
      	$pattern = "|csrfMagicToken = \"(.*?)\";|";
      	preg_match($pattern,$buffer,$token);
      
      	// Setze speziellen Header zur Übergabe des Tokens
      	curl_setopt($curl_handle, CURLOPT_HEADER, "X-CSRFToken: ".$token[1]);
      	// Übergebe Token
      	curl_setopt($curl_handle, CURLOPT_POST,TRUE);
      	curl_setopt($curl_handle, CURLOPT_POSTFIELDS, '__csrf_magic='.$token[1]);
      	// Übergebe Username und Password
      	curl_setopt($curl_handle, CURL_POSTFIELDS, '&usernamefld=username&passwordfld=password');
      
      	// Hier wird vorerst eine definitiv gültige URL verwendet, da die Optionen der auskommentierten Zeile noch angepasst werden müssen
      	curl_setopt($curl_handle, CURLOPT_URL, $pfsenseprot . "://" . $pfsenseip . "/status_rrd_graph_img.php?database=wan-traffic.rrd&style=inverse&graph=day");
      	//curl_setopt($curl_handle,CURLOPT_URL, $pfsenseprot . "://" . $pfsenseip . "/status_rrd_graph_img.php?interval=" . $_GET["interval"] . "&database=" . $_GET["file"] . "&style=inverse");
      
      	// Lade Bild des RRD-Graphen herunter
      	$buffer = curl_exec($curl_handle);
      
      	if(curl_errno($curl_handle))
      	{
      		echo 'Curl error: ' . curl_error($curl_handle);
      	}
      	else
      	{
      		if (empty($buffer))
      		{
      			print "No picture avalible.";
      		}
      		else
      		{
      			echo "picture";
      			// Auskommentiert um Ausgabe zu sehen
      			//header('Content-Type: image/png');
      			print $buffer;
      		}
      	}
      	// Schliesse Session
      	curl_close($curl_handle);
      }
      ?>
      

      Username und password wurden für den Post ausgetauscht, hier stehen die überprüften Login-Daten eines dafür erzeugten Nutzers, welcher nur Zugriff auf die RRD-Graphen hat. Die Suche nach dem csrfMagicToken ist nötig, da sonst ein CSRF-Error erscheint. Dieses wird aus der Login-Page extrahiert und im Header und per POST übergeben. Das war vorerst die größte Schwierigkeit.

      Mein Problem nun:
      Als Ausgabe erhalte ich weiterhin lediglich das Wort picture (war zu erwarten  :)) und erneut die Login-Page (unformatiert). In den System-Logs der pfSense ist keinerlei Eintrag zu finden, dass sich der User eingeloggt hat.

      Bitte seid mir für den php-Code nicht böse, wahrscheinlich lässt sich manches wesentlich einfacher lösen, bin jedoch noch nicht so versiert in PHP.

      Für eine kleine Hilfestellung, wie ich den erneuten Login umgehen kann, wäre ich euch dankbar.

      Eine Lösung mit SNMP habe ich auch schon in betracht gezogen, jedoch werden die Graphen damit (mit Cacti) nur solange gespeichert, wie der Raspberry online ist. Dies ist jedoch nicht immer gewährleistet, weshalb es mir lieber wäre, die Graphen direkt von der pfSense herunterzuladen.

      Natürlich bin ich auch für eine gänzlich andere Lösung zu überzeugen.

      Vielen Dank bereits im Voraus!

      1 Reply Last reply Reply Quote 0
      • First post
        Last post
      Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.