Netzwerk-Freigaben der Fritzbox per IPS steuern

Hallo,

möchte nun mal auch etwas zurückgeben, was ich von euch an Informationen erhalten habe…

Mit diesem Skript, ist es möglich, Fritzbox-Freigaben per IPS zu aktiveren bzw. zu deaktivieren.

Der Dank gilt an alle Helfenden :slight_smile:

Um eine bestimmte Freigabe (Fritzbox- Internet - Freigaben) zu aktivieren bzw. deaktivieren, wird folgendes Skript benötigt:

<?
if($_IPS['SENDER'] == "WebFront")
{
    $fritzbox_ip = '192.168.10.1';
    $fritzgui    = 'http://192.168.10.1/cgi-bin/webcm';
    $fritzseite  = '../html/de/menus/menu2.html';
    $password    = 'xxxxxxxxxxxx';
    $ein         = '1';
    $aus         = '0';
    $nr          = '1'; // Welche Freigabe soll gändert werden

    $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($_IPS['VALUE'])
    {
        curl_setopt($ch, CURLOPT_POSTFIELDS, "sid={$SID}&forwardrules:settings/rule$nr/activated={$ein}");
        curl_exec($ch);
    }
    else
    {
       curl_setopt($ch, CURLOPT_POSTFIELDS, "sid={$SID}&forwardrules:settings/rule$nr/activated={$aus}");
       curl_exec($ch);
    }
    curl_close($ch);
    SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);


}
?>

Entscheidend ist die Angabe der Nummer der Freigabe:

$nr = ‚1‘; // Welche Freigabe soll gändert werden

Einfach eine entsprechende Boolean Variable je Freigabe erstellen und das o.g. Skript je Aktion hinterlegen.

Somit könnt ihr bequem per Toogle die Freigabe steuern :wink:

Viele Grüße

Hallo,

Wollte mich auch daran machen, etwas derartiges zu basteln. Dein Script funktioniert gut. Ich würde mir wünschen, das es die Namen und die Nummer der Rules vorher ausliest. Dadurch kann man dann entscheiden, welche Regel man (de-)aktivieren kann.

Was ist immer noch nicht bei den ganzen Fritzbox-Script: Wo gibts du die Seite an, auf der du die Eingaben per Curl hinschickst? Alles vo diesem ist doch bloß das Login und die Prüfung auf eine SID, oder?

if($_IPS['VALUE'])

    {
        curl_setopt($ch, CURLOPT_POSTFIELDS, "sid={$SID}&forwardrules:settings/rule$nr/activated={$ein}");
        curl_exec($ch);
    }
    else
    {
       curl_setopt($ch, CURLOPT_POSTFIELDS, "sid={$SID}&forwardrules:settings/rule$nr/activated={$aus}");
       curl_exec($ch);
    }
    curl_close($ch);

Einen Zusammenhang zw. beidem kann man im Quelltext sehen, aber wie diesen auslesen? Dann mit pregmatch in Richtung suchen … Ich scheitere aber an der URL zu dieser Seite, um diese per file_get_contents als String zu bekommen. Habe hier schnell mal eine sinnlose Regel zum Handy erstellt.:rolleyes: Rule 8 mit dem Namen MS Remotedesktop.

<tr>
<td class="c1">
<input type=checkbox id="uiViewActivrule8" onclick="uiOnChangeActivated('uiViewActivrule8','uiPostActivrule8'); return true;">
</td>
<td class="c2">MS Remotedesktop</td>
<td class="c3">TCP</td>
<td class="c4"><script type="text/javascript">document.write(PortRange('3389','3389','3389'));</script></td>
<td class="c5"><script type="text/javascript">document.write(NameFromIp("192.168.20.254"));</script></td>
<td class="c6"><script type="text/javascript">document.write(PortRange('3389','3389','3389'));</script></td>
<td class="Iconbutton">
<script type="text/javascript">document.write(IconBtn("uiViewEditrule8", "uiDoEdit('rule8')", "Bearbeiten", "bearbeiten.gif"));</script>
<td class="Iconbutton">
<script type="text/javascript">document.write(IconBtn("uiViewDeleterule8", "uiDoDelete('rule8')", "Löschen", "loeschen.gif"));</script>
</tr>

Hallo,

bin ein wenig weiter. Scheitere aber vermutlich am regulären Ausdruck. Dieses Script gibt mir nur den ersten Treffer (Regel0) aus. Am Ende möchte ich eine Liste mit Freigaben (Namen und interner Regelnummer) haben. Diese sollen dann im WF angezeigt und per Click (de-)aktivierbar sein.

Im Prinzip geht es um die Texte, die innerhalb dieses Tags stehen (also MS Remotedesktop):

<td class="c2">MS Remotedesktop</td>

und die Regel-ID (hier die 8):

<input type=checkbox id="uiViewActivrule8" onclick="uiOnChangeActivated('uiViewActivrule8','uiPostActivrule8'); return true;">
<?
$fritzbox_ip = 'fritz.box';
$fritzseite  = '../html/de/menus/menu2.html';
$filename    = IPS_GetKernelDir()."\\webfront\\user\\Fritzbox\\PortForwardingDetails.txt";// anpassen
$password    = 'xxxx';

$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);

$lines = file_get_contents("../webfront/user/Fritzbox/PortForwardingDetails.txt");


//print_r($lines);
//$pattern = '!<td class="c2">(.*)<\/td>!';
$pattern = '/<td class="c2">(.*)<\/td>/';
preg_match($pattern, $lines, $matches);
print_r($matches);


?>

Hi,

ich werde mir das heute Abend mal anschauen. Dein Vorhaben die Regeln auszulesen ist natürlich viel charmanter :wink:

Grüße

Hallo,

bin ein Stück weiter. Ich konnte mir dieses extrahieren:

document.write(PortRange('3389','3389','3389'));

Nun möchte ich per pregmatch die drei Zahlen der Ports „von Port“, „bis Port“, „zu Port“ daraus haben. Mit dem Regex

preg_match_all('/([0-9]+){1,5}/', $string, $test);

kommt das raus.

Array
(
    [0] => Array
        (
            [0] => 4
            [1] => 3389
            [2] => 3389
            [3] => 3389
        )

    [1] => Array
        (
            [0] => 4
            [1] => 3389
            [2] => 3389
            [3] => 3389
        )

)

Warum zweimal und warum im ersten Array-Element eine 4 steht, möchte ich hier mal erfragen und evtl. auch eine Alternative. Habe mal feige diese Variante zur Zeit am Laufen.

$teilung = explode("'", $string);
$ports_unter = array($teilung[1], $teilung[3], $teilung[5]);

Mit Regex muss das doch auch gehen, zumal sich der String ändern könnte, aber die Ports als Zahlen bestehen bleiben.
Hat jemand Ideen?

Moin Frad,

ich hatte wieder mal Zeit gefunden, weil ich neulich Verwendung dafür hatte.
Ziel ist es immer noch, die Freigaben zu lesen und am schönsten diese dann per Schaltfläche (Button) im Webfront zu aktivieren bzw. sie zu deaktivieren.

Eine tabellarische Übersicht incl. der Buttons habe ich jetzt gebastelt. Mit Standardfunktionen geht da auch was. Aber wie bekomme ich es hin, durch den Klick IPS-Funktionen bzw. -scripte auszuführen? Und das mit der Parameterübergabe, hier die ID der Freigabe? (Die werden beim Anlagen des html-Codes in einer Schleife mit eingetragen.)

Hier der Code:

<?

// zusätzlich eine 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]*/);

$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);


// -----------------------------------------------------------------------------
// 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);
//   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]);
	}
print_r ($gesamt);


// -----------------------------------------------------------------------------
// html-Code erstellen

$str = "<table width='90%' align='center'>"; // Farbe anpassen oder style entfernen
$str .= "<tr><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][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>';

	$str .= '<td align="center">';
	$str .= '<input type="button" name="aktiv" value="Neues Browserfenster" onClick="window.open()">'; // ein neues Browserfenster öffnet sich

	$str .= '<td align="center">';
	$str .= '<input type="button" name="deaktiv" value="Meldung mit ID ..." onclick="alert(\'Es wird Freigabe mit der ID (bin im Moment noch üerfragt, wie ich hier die ID aus php hineinbekomme)\')">'; // eine Meldung wird eingeblendet

   $str .= '</td>';
   $str .= '</tr>';
   }

$str .= '</table>';

//html in Variable schreiben zum Anzeigen im WF als ~HTMLBox
SetValue (58007 /*[Fritzbox\Freigaben\Freigabe\Freigabe html]*/, $str);

?>

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.'&regel_id='.$i.'&regel_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.'&regel_id='.$i.'&regel_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.'&regel_id='.$i.'&regel_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.'&regel_id='.$i.'&regel_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“.

Hi,

echt coole Sache!!! Meine PHP Kenntnisse hätten dazu leider nicht ausgereicht.

Danke!

Hallo hrahlers,
coole Idee. Hab versucht das lt. Anleitung umzusetzen. WF bekomm ich angezeigt (sind Features drin die ich sicher auch noch anders wo gebrauchen kann.). Leider kann ich die Freigaben nicht schalten. Im Schalt-Script bekmm ich folgenden Fehler:

IPS-Err-PHP … Notice: Undefined index: ID … on Line 12

und

IPS-Err-PHP … Notice: Undefined index: EinAus … on Line 13

Hab ich irgend wo was übersehen was ich anpssen muss?

Hallo Wolfgang,

aus der Hüfte geschossen: hast du evtl. derzeit keine Freigaben in dieser Fritzbox? Das Array wird nicht korrekt befüllt. Also keine Elemente drin. Leg doch mal eine Freigabe in der FB an. Was wird denn im WF angezeigt?

Hallo Andreas,
Freigaben hab ich genug. Anbei einige screenshots. Was mich verwundert hat ist der dojo-Pfad. Von der Umsetzung liegt ein screenshot bei. Was sonst bei mir noch anders ist: die FB, hab „nur“ eine 7270 v2 FW 05.22
Hoffe, dass es damit trotzdem funktioniert.
Danke für Deine Hilfe.

Hallo Andreas,

funktioniert alles perfekt. (Wenn man auch noch die Scriptid fürs schalten richtig angibt.)

Sorry für die Fragen,

Hallo,

Vielen Dank dafür.

Nach einem kleinen Layer-8 Problem hab ich das Script auch zum laufen bekommen

Kleine Frage aber dennoch: Könnte man die Farben der Buttons ändern, wenn ja wo ?
Die Farbe hebt sich schlecht von meinem dunklen Hintergrund an, die würde ich gerne etwas farbiger machen.

Danke und Grüsse

Hallo hrahlers,

welche OS-Version läuft auf Deiner Fritz!Box? Mein Script läuft zwar, aber in der Variable $getPortForwardingDetails finde ich keine Freigabe-Infos und dementsprechend ist meine Ausgabeliste auch leer? Mein Fritz!Box 7390 läuft mit der neuesten Labor-Version 05.27-23565 BETA.

Danke für die Unterstützung!

Hallo Tuxtom007,

die Farben habe ich nur mal schnell festgelegt. Diese werden im Script mit in die HTMLBox-Variable eingetragen.

// -----------------------------------------------------------------------------
// html-Code erstellen

$str = '<style type="text/css">
.button {
background-color: #4c5f74;
cursor:hand;
font-family: Arial;
font-weight: bold;
border-color:#000000;}
</style>';

Du kannst ein wenig mit der „background-color“ umherspielen. Nimmst du anstelle von #4c5f74 den Wert #4c3324, sieht der Button eher bräunlich aus. Auch kannst du in den style-Tags noch mehr Formatierungen einbauen. Schau einfach mal nach css und html-Farben bei der Suchmaschine deiner Wahl. In der Regel legt man größerer Dinge in einer CSS-Datei fest und bindet diese in das html-File ein, zumal man das Farbschema dann auch in anderen html-Files verwenden kann und sich eine Änderung auf alle Ansichten auswirkt. In diesem Fall reicht mir das jedenfalls.

Hallo Joe,

habe noch den Stand von 05.20 auf der FB. Wenn du in Zeile 47 (bei mir) mit

echo $getPortForwardingDetails; 

anzeigen lässt, sieht es in der Ausgabe unten in der IPS-Konsole so aus, als wäre nichts drin. Scrolle (Scriptausgabe Text) rechts runter oder schalte auf html-Ansicht (-> Abbild der Freigabenseite der Weboberfläche wird angezeigt ohne Bildchen). Dann wird vermutlich auch was stehen. Hoffe ich.

Das Auslesen mit Login etc. habe ich übrigens den Fritzbox-Scripts von RWN entnommen. Auch mit der 2.6 geht das bei mir mit curl.

Es wird die Webseite mit dem Link

http://fritz.box/cgi-bin/webcm?getpage=../html/de/menus/menu2.html&var:menu=internet&var:pagename=portfw&sid=fac5ca7258962494&")

per curl_exec ausglesen und in $getPortForwardingDetails gespeichert. Möglicherweise ist der Link in der 05.27 zu den Portfreigaben ein anderer. Dann muss du das entsprechend anpassen. Die „sid“ ist jedemal eine andere (Login) und wird daher auch als Variable angegeben.

Hallo hrahlers,

Danke für die Infos.

Ich hatte zwischenzeitlich mit Tante Googles Hilfe selber mal ein paar Sachen probiert, war aber mit dem Ergebnissen noch nicht so wirklich zufrieden. Werde mal in ner ruhigen Minute weiterbasteln.

P.S. falls es interessiert, bei mir läuft das Script problemlos mit eine FB 6360Cable mit Firmware: FRITZ!OS 05.24 ( die wird eh vom Kabelprovider vorgeben und kann nicht geändert werden )

Hallo,

seit heute funktioniert das Script nicht mehr bei mir, die eingerichteten Freigaben können nicht mehr gelesen werden.

Grund: heute nacht wurde meine FritzBox 6360 vom Provider mit einer neuen Firmware-Version 5.28 betankt, scheint sich wohl einiges geändert zu haben.

Ich gehe mal auf Fehlersuche.

Hallo,

wie auch in diversen andere Thread zu lesen ist, hat AVM einiges an der Firmware geändert, so das der Login nicht mehr mit der selben Prozedur funktioniert.

Da ich nun mittlerweile meinen Remotezugang komplett auf VPN umgestellt ( Notebook, Handy, Tablet ) habe, benötige ich dei Freigaben nicht mehr und hab das Script aus meinem IPS entfernt.

Danke erstmal für dieses Script, läuft bei mir wunderbar :D.
Kleine Anmerkung, die Zielports werden immer identisch den Quellports gesetzt (also nicht korrekt ausgelesen).
Ist aber nur ein kosmetisches Problem im Webfront.
Hier das Script in korrigierter Variante:

FW-Freischaltungen_Auslesen:

 <?

// String-Variable mit Profil ~HTMLBox anlegen, dieser wird ganz unten der HTML-Code zugewiesen


//Variablen lesen
$fritzbox_ip    = GetValue(46138 /*[Geräteparameter und Status\Monitoring\(001) Router AVM Fritzbox 7270v3\IP]*/);
$fritzseite        = '../html/de/menus/menu2.html';
$filename        = IPS_GetKernelDir()."\\webfront\\user\\Fritzbox\\PortForwardingDetails.txt";// anpassen
$password        = GetValue(39899 /*[Geräteparameter und Status\Monitoring\(001) Router AVM Fritzbox 7270v3\Passwort]*/);

// Script, das nach Klicken auf html-Button via IPS_RunScriptWaitEx ausgeführt wird, um Regeln zu (de-)aktivieren.
$script_id     = 37801 /*[eigene Module\Fritzbox\Fritzbox Firewall\FW_Freischaltungen 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);


// -----------------------------------------------------------------------------
// Quell-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-Ports ermitteln und speichern

// echo "Ports:
";
preg_match_all('/<td class=\"c6\".*?>.*?<\/td>/', $zeile, $zport);
//print_r($zport);
$count = count($zport[0]);
$zports = array();

for ($i=0; $i < $count-1; $i++)
    {
    $string = $zport[0][$i];

    preg_match_all("/\('(\d*)','(\d*)','(\d*)'\)/", $string, $ergebnis);
    //print_r ($ergebnis);
    $teilung = explode("'", $string);
    if(empty($teilung[3])){
    $ports_unter = array($teilung[1], $teilung[3], $teilung[5]);
    }else{
    $ports_unter = array($teilung[1], $teilung[3], $teilung[5],$teilung[5]+($teilung[3]-$teilung[1]));
    }
    //print_r ($ports_unter);
    $ports[$i] = $ports_unter;
    }
//    print_r($zports);

// -----------------------------------------------------------------------------
// 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 {
color:#ffffff;
background-color:transparent;
cursor:hand;
font-family: Arial;
font-weight: bold;
border:1px solid #3B3B4D;
margin:0px;
}
input[disabled]
{
color:#222222;
}

</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(s)</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]).'</td>';
       }
    else
       {
        $str .= '<td align="left">'.strip_tags($gesamt[$i][3][0]).' - '.strip_tags($gesamt[$i][3][1]).'</td>';
       }
       
	 if (array_key_exists(3,$gesamt[$i][3])){
	   $str .= '<td align="left">'.strip_tags($gesamt[$i][3][2]).' - '.strip_tags($gesamt[$i][3][3]).'</td>';
	 }else{
	   $str .= '<td align="left">'.($gesamt[$i][3][2]).'</td>';
	 }
   
	//print_r($gesamt[$i]);
   $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/ips_runscriptwaitex.php?script_id='.$script_id.'&regel_id='.$i.'&regel_wert=ein\' });"/>';

    $str .= '<td align="center">';
    $str .= '<input type="button" class="button" disabled=true value="Deaktivieren" onclick="dojo.xhrGet({ url: \'user/ips_runscriptwaitex.php?script_id='.$script_id.'&regel_id='.$i.'&regel_wert=aus\' });"/>';
        }
    else
       {
    $str .= '<td align="center">';
    $str .= '<input type="button"  class="button" disabled="true" value="Aktivieren" onclick="dojo.xhrGet({ url: \'user/ips_runscriptwaitex.php?script_id='.$script_id.'&regel_id='.$i.'&regel_wert=ein\' });"/>';

    $str .= '<td align="center">';
    $str .= '<input type="button"  class="button" value="Deaktivieren" onclick="dojo.xhrGet({ url: \'user/ips_runscriptwaitex.php?script_id='.$script_id.'&regel_id='.$i.'&regel_wert=aus\' });"/>';
        }

   $str .= '</td>';
   $str .= '</tr>';
   }

$str .= '</table>';

//html in Variable schreiben zum Anzeigen im WF als ~HTMLBox
SetValue (53288 /*[eigene Module\Fritzbox\Fritzbox Firewall\freigaben]*/, $str);

?>

Mit den Stylesheet-Änderungen sieht es dann übrigens so aus: