Superglobals / öffentliche IP des Routers

Paranoia, rein zur Doku. Der Provider liefert im Ernstfall IPs, die nicht unbedingt stimmen.

Das Log wäre auch eine Möglichkeit.

Ich hatte auch schon mit dem Auswerten der Statusmail (da ist der Logteil) gespielt.

<?
$fritzbox_ip = 'fritz.box';
$fritzgui    = 'http://fritz.box/cgi-bin/webcm';
$fritzseite  = '../html/de/menus/menu2.html';
$password    = 'xxxxxx';

$ch = curl_init('http://' . $fritzbox_ip . '/cgi-bin/webcm?getpage=../html/login_sid.xml');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$login = curl_exec($ch);
curl_close($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"));
   $login = array('getpage' => $fritzseite, 'login:command/response' => $response);
   $sendlogin = http_post_fields($fritzgui, $login);
   preg_match('@<input type="hidden" name="sid" value="([A-Fa-f0-9]{16})" id="uiPostSid">@i', $sendlogin, $matches);
   if (isset($matches[1]) && $matches[1] != '0000000000000000')
   {
      $SID = $matches[1];
   }
   else
   {
      echo "Fehler: Login fehlgeschlagen";
      return;
    }
}

$logInet = file_get_contents("http://fritz.box/system/syslog.lua?tab=internet&sid=".$SID);
preg_match('((?:\d{1,3}\.){3}\d{1,3})i', strip_tags($logInet), $wanIP);
print_r($wanIP);


?>

verstehe ich noch nicht richtig.

Im Log stehen diverse IP Adressen, „rausgegrept“ wird nur die Letzte :eek:.

Update:
PHP Doku gelesen :). Mit preg_match_all gibts alle. Ich spiele mal ein wenig. Einmal am Tag aufrufen und alle IPs des Tages mit Datum und Uhrzeit wären nicht schlecht.

genau so ist es. Da kannst Du dir alles raussortieren mit DNS Servern.

Dann mal für alle meine Änderungen.

Ziel ist es, ein Log-File zu schreiben, in dem alle zugeteilten WAN IPs dokumentiert werden. Ich rufe das Script per Timer nach Mitternacht auf und hole die Werte vom Vortag.
Wenn die Log-Datei nicht existiert wird sie anglegt, inkl. Kopfzeile als CSV.
Im IPS-Verzeichnis muss ein Ordner „log_vars“ existieren.


<?
$fritzbox_ip = 'fritz.box';
$fritzgui    = 'http://fritz.box/cgi-bin/webcm';
$fritzseite  = '../html/de/menus/menu2.html';
$password    = 'xxxxxx';

$ch = curl_init('http://' . $fritzbox_ip . '/cgi-bin/webcm?getpage=../html/login_sid.xml');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$login = curl_exec($ch);
curl_close($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"));
   $login = array('getpage' => $fritzseite, 'login:command/response' => $response);
   $sendlogin = http_post_fields($fritzgui, $login);
   preg_match('@<input type="hidden" name="sid" value="([A-Fa-f0-9]{16})" id="uiPostSid">@i', $sendlogin, $matches);
   if (isset($matches[1]) && $matches[1] != '0000000000000000')
   {
      $SID = $matches[1];
   }
   else
   {
      echo "Fehler: Login fehlgeschlagen";
      return;
    }
}

$logInet = file_get_contents("http://fritz.box/system/syslog.lua?tab=internet&sid=".$SID);

preg_match_all('(.*hergestellt. IP-Adresse: .*)i', strip_tags($logInet), $wanIP);
$wanIP = array_reverse($wanIP[0]);

$lines = '';
$date = date("d.m.y", time() - 86400);
for ( $x = 0; $x < count($wanIP) ; $x++ ) {
	if ( strstr( $wanIP[$x], $date) ) {
   	$lines .= str_replace(', Breitband-PoP: ',';',str_replace(', Gateway: ',';',str_replace(' und ',',',str_replace(', DNS-Server: ',';',substr($wanIP[$x],0,8).";".substr($wanIP[$x],8,8).";".substr($wanIP[$x],78)."
"))));
	}
}

if (!file_exists(IPS_GetKernelDir()."log_vars\WAN_IP.csv")) {
	$handle = fopen( IPS_GetKernelDir()."log_vars\WAN_IP.csv", "a");
	fwrite( $handle, "date;time;IP;DNS;Gateway;POP
");
	fclose($handle);
}

if ($lines) {
   $handle = fopen( IPS_GetKernelDir()."log_vars\WAN_IP.csv", "a");
   fwrite( $handle, $lines);
   fclose($handle);
}
?>

DANKE Rainer :).

Die Werte lassen sich bestimmt auch direkt rausgreifen, so dass die „str_replace“-Orgie nicht notwendig ist, aber mein RegEx-Wissen ist dafür zu klein :(.

Hier gibt es dann noch ein Script über UPnP für die WanIP.