Hallo,
ich habe dieses Projekt derzeit erstmal fertig und möchte es hier bereitstellen.
Wir brauchen mehrere Scripts. Eines dient dem Auslesen der Freigaben aus der Fritzbox:
<?
// String-Variable mit Profil ~HTMLBox anlegen, dieser wird ganz unten der HTML-Code zugewiesen
//Variablen lesen
$fritzbox_ip = GetValue(49286 /*[Fritzbox\Fritzbox - IP]*/);
$fritzseite = '../html/de/menus/menu2.html';
$filename = IPS_GetKernelDir()."\\webfront\\user\\Fritzbox\\PortForwardingDetails.txt";// anpassen
$password = GetValue(48902 /*[Fritzbox\Fritzbox-Passwort]*/);
// Script, das nach Klicken auf html-Button via IPS_RunScriptWaitEx ausgeführt wird, um Regeln zu (de-)aktivieren.
$script_id = 35717 /*[Fritzbox\Freigaben\Fritzbox - Freigaben\Freigaben setzen]*/;
// -----------------------------------------------------------------------------
$ch = curl_init('http://' . $fritzbox_ip . '/cgi-bin/webcm?getpage=../html/login_sid.xml');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$login = curl_exec($ch);
$session_status_simplexml = simplexml_load_string($login);
if ($session_status_simplexml->iswriteaccess == 1)
{
$SID = $session_status_simplexml->SID;
}
else
{
$challenge = $session_status_simplexml->Challenge;
$response = $challenge . '-' . md5(mb_convert_encoding($challenge . '-' . $password, "UCS-2LE", "UTF-8"));
curl_setopt($ch, CURLOPT_POSTFIELDS, "login:command/response={$response}&getpage=../html/de/menus/menu2.html");
preg_match('/name="sid" value="([0-9a-f]*)"/', curl_exec($ch), $matches);
if (isset($matches[1]) && $matches[1] != '0000000000000000')
{
$SID = $matches[1];
}
else
{
echo "Fehler: Login fehlgeschlagen";
return;
}
}
curl_setopt($ch, CURLOPT_POSTFIELDS, "getpage={$fritzseite}&sid={$SID}&var:menu=internet&var:pagename=portfw");
$getPortForwardingDetails = curl_exec($ch);
curl_close($ch);
// echo $getPortForwardingDetails;
$fileHandle = @fopen($filename, 'wb+');
fwrite($fileHandle, $getPortForwardingDetails);
fclose($fileHandle);
$zeile = file_get_contents("../webfront/user/Fritzbox/PortForwardingDetails.txt");
//print_r($zeile);
// -----------------------------------------------------------------------------
// Regel-IDs ermitteln und speichern
// echo "Regeln:
";
preg_match_all('/input type=checkbox id=\"uiViewActivrule([0-9])\"/',$zeile,$regel_id);
//print_r($regel_id);
// -----------------------------------------------------------------------------
// Zustand der Regeln ermitteln und speichern (aktiviert/deaktiviert)
// echo "Regelzustand:
";
preg_match_all('/([activated\" value=\"])([0-9])\" id="uiPostActivrule/', $zeile, $regelzustand);
//print_r($regelzustand[2]);
// -----------------------------------------------------------------------------
// Regelbezeichnung ermitteln und speichern
// echo "Texte:
";
preg_match_all('/<td class=\"c2\".*?>.*?<\/td>/', $zeile, $bezeichnung);
//print_r($bezeichnung);
// -----------------------------------------------------------------------------
// Protokollen ermitteln und speichern
// echo "Protokoll:
";
preg_match_all('/<td class=\"c3\".*?>.*?<\/td>/', $zeile, $protokoll);
//print_r($protokoll);
// -----------------------------------------------------------------------------
// Ports ermitteln und speichern
// echo "Ports:
";
preg_match_all('/<td class=\"c4\".*?>.*?<\/td>/', $zeile, $port);
//print_r($port);
$count = count($port[0]);
$ports = array();
for ($i=0; $i < $count; $i++)
{
$string = $port[0][$i];
preg_match_all("/\('(\d*)','(\d*)','(\d*)'\)/", $string, $ergebnis);
//print_r ($ergebnis);
$teilung = explode("'", $string);
$ports_unter = array($teilung[1], $teilung[3], $teilung[5]);
// print_r ($teilung);
$ports[$i] = $ports_unter;
}
//print_r($ports);
// -----------------------------------------------------------------------------
// Ziel-IP-Adressen ermitteln und speichern
// echo "Ziel-IPs:
";
preg_match_all('/<td class=\"c5\".*?>.*?<\/td>/',$zeile,$matches);
//print_r($matches);
$count = count($matches[0]);
$ip_add = array();
for ($i=0; $i < $count-1; $i++)
{
$string = $matches[0][$i];
//echo $string;
preg_match('((?:\d{1,3}\.){3}\d{1,3})i', $string, $ip);
//print_r ($ip);
$ip_string = $ip[0];
$ip_add[$i] = $ip_string;
}
//print_r($ip_add);
// -----------------------------------------------------------------------------
// Zusammensetzen zu Datensätzen pro Regel
// echo ("Und alles zusammen:
");
for ($i=0; $i < $count-1; $i++)
{
$gesamt[$i] = array($regel_id[1][$i], $bezeichnung[0][$i], $protokoll[0][$i], $ports[$i], $ip_add[$i], $regelzustand[2][$i]);
}
//print_r ($gesamt);
// -----------------------------------------------------------------------------
// html-Code erstellen
$str = '<style type="text/css">
.button {
background-color: #4c5f74;
cursor:hand;
font-family: Arial;
font-weight: bold;
border-color:#000000;}
</style>';
$str .= '<table width="90%" align="center">';
$str .= "<tr><td><b>aktiv</b></td><td><b>Regel-ID</b></td><td><b>Regel-Name</b></td><td><b>Protokoll</b></td><td><b>Quellport(s)</b></td><td><b>Zielport</b></td><td><b>Ziel-IP</b></td></tr>";
for($i=0; $i<$count-1; $i++)
{
$str .= '<tr>';
$str .= '<td align="left">'.strip_tags($gesamt[$i][5]).'</td>';
$str .= '<td align="left">'.strip_tags($gesamt[$i][0]).'</td>';
$str .= '<td align="left">'.strip_tags($gesamt[$i][1]).'</td>';
$str .= '<td align="left">'.strip_tags($gesamt[$i][2]).'</td>';
if ($gesamt[$i][3][1] == "")
{
$str .= '<td align="left">'.strip_tags($gesamt[$i][3][0]).' - '.strip_tags($gesamt[$i][3][0]).'</td>';
}
else
{
$str .= '<td align="left">'.strip_tags($gesamt[$i][3][0]).' - '.strip_tags($gesamt[$i][3][1]).'</td>';
}
$str .= '<td align="left">'.($gesamt[$i][3][2]).'</td>';
$str .= '<td align="left">'.strip_tags($gesamt[$i][4]).'</td>';
if (strip_tags($gesamt[$i][5]) == 0)
{
$str .= '<td align="center">';
$str .= '<input type="button" class="button" value="Aktivieren" onclick="dojo.xhrGet({ url: \'user/dojo/ips_runscriptwaitex.php?script_id='.$script_id.'®el_id='.$i.'®el_wert=ein\' });"/>';
$str .= '<td align="center">';
$str .= '<input type="button" class="button" disabled=true value="Deaktivieren" onclick="dojo.xhrGet({ url: \'user/dojo/ips_runscriptwaitex.php?script_id='.$script_id.'®el_id='.$i.'®el_wert=aus\' });"/>';
}
else
{
$str .= '<td align="center">';
$str .= '<input type="button" class="button" disabled="true" value="Aktivieren" onclick="dojo.xhrGet({ url: \'user/dojo/ips_runscriptwaitex.php?script_id='.$script_id.'®el_id='.$i.'®el_wert=ein\' });"/>';
$str .= '<td align="center">';
$str .= '<input type="button" class="button" value="Deaktivieren" onclick="dojo.xhrGet({ url: \'user/dojo/ips_runscriptwaitex.php?script_id='.$script_id.'®el_id='.$i.'®el_wert=aus\' });"/>';
}
$str .= '</td>';
$str .= '</tr>';
}
$str .= '</table>';
//html in Variable schreiben zum Anzeigen im WF als ~HTMLBox
SetValue (58007 /*[Fritzbox\Freigaben\Fritzbox - Freigaben\Übersicht]*/, $str);
?>
Ein weiteres zum Schalten:
<?
$fritzbox_ip = GetValue(49286 /*[Fritzbox\Fritzbox - IP]*/);
$fritzgui = 'http://'.$fritzbox_ip.'/cgi-bin/webcm';
$password = GetValue(48902 /*[Fritzbox\Fritzbox-Passwort]*/);
$fritzseite = '../html/de/menus/menu2.html';
$ein = '1';
$aus = '0';
$regel_id = $_IPS['ID'];
$einaus = $_IPS['EinAus'];
// -------------------------------------------------------------------------
$ch = curl_init('http://' . $fritzbox_ip . '/cgi-bin/webcm?getpage=../html/login_sid.xml');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$login = curl_exec($ch);
$session_status_simplexml = simplexml_load_string($login);
if ($session_status_simplexml->iswriteaccess == 1)
{
$SID = $session_status_simplexml->SID;
}
else
{
$challenge = $session_status_simplexml->Challenge;
$response = $challenge . '-' . md5(mb_convert_encoding($challenge . '-' . $password, "UCS-2LE", "UTF-8"));
curl_setopt($ch, CURLOPT_POSTFIELDS, "login:command/response={$response}&getpage=../html/de/menus/menu2.html");
preg_match('/name="sid" value="([0-9a-f]*)"/', curl_exec($ch), $matches);
if(isset($matches[1]) && $matches[1] != '0000000000000000')
{
$SID = $matches[1];
}
else
{
echo "Fehler: Login fehlgeschlagen";
return;
}
}
if ($einaus == "ein")
{
curl_setopt($ch, CURLOPT_POSTFIELDS, "sid={$SID}&forwardrules:settings/rule$regel_id/activated={$ein}");
curl_exec($ch);
}
if ($einaus == "aus")
{
curl_setopt($ch, CURLOPT_POSTFIELDS, "sid={$SID}&forwardrules:settings/rule$regel_id/activated={$aus}");
curl_exec($ch);
}
curl_close($ch);
SetValue(37820 /*[Fritzbox\Freigaben\Fritzbox - Freigaben\Letzte Änderung]*/, date("d.m.Y H:i:s", time())." Uhr");
SetValue(33511 /*[Fritzbox\Freigaben\Fritzbox - Freigaben\Letzte Aktion]*/, "Regel ".$regel_id." wurde ".$einaus."geschaltet.");
?>
Das kleinste ist zum Aufrufen des vorherigen bei Klick auf einen der Button im WF und wird unter dem Namen „ips_runscriptwaitex.php“ unter webfront\user\dojo abgelegt.
<?
// es werden übergeben:
// script_id: ausführendes Script
// regel_id: ID der Regel in der Fritzbox
// regel_wert: ein/aus
if (isset($_GET['script_id']) && isset($_GET['regel_id']) && isset($_GET['regel_wert']) )
{
$script_id = (integer)$_GET['script_id'];
$regel_id = (integer)$_GET['regel_id'];
$regel_wert = $_GET['regel_wert'];
IPS_RunScriptWaitEx($script_id, array("ID" => $regel_id, "EinAus" => $regel_wert));
}
?>
Die restlichen Variablen in der Konsole anlegen und die IDs in den Scripten anpassen. „Übersicht“ mit Prfil ~HTMLBox. Dann noch einen Link im WF -fertig. Damit nach Klicken auf einen der Button die Übersicht auch wieder aktualisiert wird, habe ich noch die beiden Variablen für die letzte Aktion eingebaut. Das Auslesen-Script wird bei Änderung und einmal nachts gestartet. Alternativ dann manuell.
Vielen Dank auch an Frad für eine gewissen „Grundsteinlegung“.