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



  • 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!


Log in to reply