<?php
/*
Version vom 17.01.2007 by Karl Loncarek
Dieses Skript dient als Hilfsmittel für den Einsatz mit mehreren
Routern. Es können z.B. die IP-Adressen übergeben werden (ähnlich
wie bei dyndns). Die Informationen werden über Parameter in der URL
übergeben. Hierzu muss ein benutzerdefinierter DNS-Anbieter
eingestellt werden.
Beispiel, das mit meiner Fitz!Box funktioniert (Update-URL):
...../RouterTool.php?myip=<ipaddr>&n=2
Diese Parameter können übergeben werden (mehrere mit "&" verknüpfen):
myip
für die Übergabe der dynamischen IP-Adresse gedacht
Beispiel: ...../RouterTool.php?myip=192.168.1.1
n
für Einträge mehrerer Router; "n" ist die Nummer des Eintrags
wenn "n" nicht angegeben wird, wird der erste Eintrag bearbeitet
Beispiel: ...../RouterTool.php?myip=192.168.1.1&n=2
comment
für zusätzlichen Kommentar, der zusammen mit Parametern
angezeigt wird
Beispiel: ...../RouterTool.php?comment=Router zu Hause
wakeip
für die Übergabe einer eigenen Wake-on-LAN IP-Adresse.
Mehr zu Wake-on-LAN weiter unten.
Beispiel: ...../RouterTool.php?wakeip=192.168.1.255
wake
die für Wake-on-LAN notwendige MAC-Adresse.
Mehr zu Wake-on-LAN weiter unten.
Beispiel: ...../RouterTool.php?wake=00-12-AB-34-CD-56
wird kein Wert übergeben, wird das Magic Paket zur
gespeicherten IP-Adresse verschickt, einziger erlaubter
zusätzlicher Parameter ist "n".
ftp
für die Übergabe einer IP zum FTP-Server (evtl. mit Port)
Beispiel: ...../RouterTool.php?ftp=192.168.1.5:40
wird kein Wert übergeben wird direkt zum FTP-Server weiter-
geleitet, einziger erlaubter zusätzlicher Parameter ist "n".
web
für die Übergabe einer IP zum Webserver (evtl. mit Port)
Beispiel: ...../RouterTool.php?web=192.168.1.5:8080
wird kein Wert übergeben wird direkt zum FTP-Server weiter-
geleitet, einziger erlaubter zusätzlicher Parameter ist "n".
del
löscht existierende Einträge. Zu löschender Eintrag kann als
Wert oder mit "n" übergeben werden. Der Wert wiegt schwerer.
Beispiel: ...../RouterTool.php?del=3
Um die gespeichertern Parameter anzuzeigen einfach Skript ohne
Parameter aufrufen:
...../RouterTool.php
Wake-on-LAN:
Damit Wake-on-LAN funktionieren kann, muss es im BIOS und unter Windows
aktiviert werden. Eventuell ist auch ein Verbindungskabel von der Netzwerk-
karte zum Mainboard notwendig. Das Wake-on-LAN Paket wird üblicherweise
an die Broadcast-Adresse, z.B. 192.168.1.255 geschickt. Bei einem Router ist
das normalerweise nicht möglich. Daher muss beim Router eine Portregel
erstellt werden, die den Port 9 zur internen Brodcast-Adresse umleitet.
(Derzeit bei der Fritz!Box nicht ohne weiteres möglich)
*/
$datei = "RouterTool.txt"; //Dateiname als Speicherort für die IP-Adressen
$daten = array(); //enthällt alle Daten. Jeder Arrayeintrag ist wieder array
# gespeicherte Informationen pro Eintrag:
# Kommentar - Datum/Uhrzeit - IP-Adresse - FTP-Adresse - Webserver Adresse - Wake on LAN IP-Adresse - MAC-Adresse
$params = 7; //Anzahl der zuspeichernden Parameter
# sendet magic packet für Wake on LAN über IP-Adresse $ip, Port $port an MAC-Adresse $mac
function wake($ip, $mac, $port)
{
$mac = str_replace("-", "", $mac); // "-" aus MAC-Adresse entfernen, falls vorhanden
if(strlen($mac)<12) return false; //MAC-Adresse ist zu kurz, abbrechen
$mac = chr(hexdec(substr($mac,0,2))).chr(hexdec(substr($mac,2,2))).chr(hexdec(substr($mac,4,2))).chr(hexdec(substr($mac,6,2))).chr(hexdec(substr($mac,8,2))).chr(hexdec(substr($mac,10,2))); //MAC-Adresse in Zeichn konvertieren
$nic = fsockopen("udp://" . $ip, $port); //UDP-Paket schicken
if($nic)
{
$packet = chr(0xFF).chr(0xFF).chr(0xFF).chr(0xFF).chr(0xFF).chr(0xFF); // 6x FF senden
$packet .= $mac.$mac.$mac.$mac.$mac.$mac.$mac.$mac.$mac.$mac.$mac.$mac.$mac.$mac.$mac.$mac; //16x MAC-Adresse senden
}
$ret = fwrite($nic, $packet);
fclose($nic);
if($ret) return true; //hat alles geklappt
return false; //Fehler aufgetreten
}
# lädt IP_Adressen und weitere Informationen
function loaddata($file)
{
if (file_exists($file)) //existiert die Datei?
{
$fp = fopen($file, "r"); //Inhalt der Datei einlesen
$inhalt = fread ($fp, filesize($file));
fclose($fp);
$data=explode("\n",$inhalt); //Daten in array einlesen
return $data;
}
}
# speichert IP_Adressen und weitere Informationen
function savedata($file,$data)
{
if ($fp = fopen($file, "w")) //Informationen abspeichern
{
fwrite($fp,implode("\n",$data));
fclose($fp);
return true;
}
else return false;
}
# übernimmt übergebene Parameter aus der URL
function getparameters($data)
{
global $params;
if(isset($_GET['n'])) $counter = $_GET['n']; //Nummer des Eintrags übernehmen
if($counter == "") $counter = 1; //falls kein Parameter übergeben wird auf 1 setzen
if($_GET['del']) $counter = $_GET['del']; //Gibt an welcher Eintrag gelöscht werden soll
# Daten nur dannübernehmen, wenn Parameter mit URL übergeben wurden
for ($i = 0; $i <= ($params-1); $i++ ) //unbelegte Variablen setzen (wichtig fürs abspeichern)
{
if(!isset($data[(($counter-1)*$params)+$i])) $data[(($counter-1)*$params)+$i] = "";
}
if(isset($_GET['comment'])) //wurde Kommentar zu den aktuellen Einträgen übergeben
{
$data[(($counter-1)*$params)+0] = $_GET['comment'];
}
if (count($_GET)) // aktuelle Zeit, wenn ein Parameter übergeben wurde
{
$data[(($counter-1)*$params)+1] = strftime('%d.%m.%Y, %H:%M Uhr',time());
}
if (isset($_GET['myip'])) //wurde parameter myip=... übergeben?
{
$data[(($counter-1)*$params)+2] = $_GET['myip']; //IP-Adresse aus parameter übernehmen
if ($data[(($counter-1)*$params)+2] == "") $data[(($counter-1)*$params)+2] = $_SERVER['REMOTE_ADDR']; //falls keine IP übergeben wurde, die Internet-IP ermitteln
}
# if($data[(($counter-1)*$params)+3] == "") $data[(($counter-1)*$params)+3] = $data[(($counter-1)*$params)+2]; //Haupt-IP-Adresse übernehmen
if(isset($_GET['ftp'])) //eurde Parameter ftp übergeben?
{
if($_GET['ftp']) $data[(($counter-1)*$params)+3] = $_GET['ftp'];
}
# if($data[(($counter-1)*$params)+4] == "") $data[(($counter-1)*$params)+4] = $data[(($counter-1)*$params)+2]; //Haupt-IP-Adresse übernehmen
if(isset($_GET['web'])) //eurde Parameter web übergeben?
{
if($_GET['web']) $data[(($counter-1)*$params)+4] = $_GET['web'];
}
if(isset($_GET['wake'])) //Wake on LAN durchführen
{
if($_GET['wake']) //MAC-Adresse für Wake on LAN aus parameter übernehmen
{
$data[(($counter-1)*$params)+5] = $_GET['wake'];
}
}
# if(($data[(($counter-1)*$params)+6] == "") && $data[(($counter-1)*$params)+5]) $data[(($counter-1)*$params)+6] = $data[(($counter-1)*$params)+2]; //Haupt-IP-Adresse übernehmen
if(isset($_GET['wakeip'])) //Wake on LAN IP-Adresse
{
if($_GET['wakeip']) $data[(($counter-1)*$params)+6] = $_GET['wakeip'];
}
ksort($data); //Daten sortieren
#Einträge löschen
if(isset($_GET['del']))
{
if($deleteentry) $counter = $deleteentry;
for ($i = ($params-1); $i >= 0; $i-- ) //Array-Einträge löschen
{
unset($data[(($counter-1)*$params)+$i]);
}
}
return explode("\n",implode("\n",$data));
}
# zeigt gespeicherte Daten an
function showdata($data)
{
global $params;
# Verhindern, dass Seite aus Cache geladen wird, HTML-Kopf anzeigen
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Datum in der Vergangenheit
print "<html>\n<head>\n<title>Externe IP-Adresse des DSL-Zugangs zuhause</title>\n<style type='text/css'>\n";
print "th{text-align:left;padding:0 0 0 3em;color:#666;vertical-align:top;width:15em;}\n";
print "td{font-weight:bold;font-family:monospace;padding:0;}\n";
print "table{width:100%;}\n";
print "a{text-decoration: none;color:#000;display:block;}\na:hover{color:#00D;background-color:#DDD;}\n";
print "small a{color:#CCC;display:inline;}\nsmall a:hover{color:#F00;background-color:transparent;}\n";
print "\n</style></head>\n<body>\n"; //HTML-Kopf
if(isset($_GET['del'])) print "<h3>Status: Eintrag gelöscht!</h3><hr \>\n";
if(isset($_GET['wake']) && ($_GET['wake'] == "")) print "<h3>Status: Wake-on-LAN Paket verschickt!</h3><hr \>\n";
$i = 1;
$ipaddress = $data[(($i-1)*$params)+2]; //Haupt-IP-Adresse zwischenspeichern
$ftpaddress = $ipaddress;
$webaddress = $ipaddress;
$woladdress = $ipaddress;
do
{
print "<h2>Eintrag $i: <small><small><small><a href='RouterTool.php?del=$i'>LÖSCHEN</a></small></small></small></h2>\n";
print "<table cellspacing='0'>\n";
print "<tr><th>Kommentar:</th><td>".$data[(($i-1)*$params)+0]."</td></tr>\n";
print "<tr><th>Stand von:</th><td>".$data[(($i-1)*$params)+1]."</td></tr>\n";
print "<tr><th>WAN IP-Adresse:</th><td>".$ipaddress."</td></tr>\n";
if ($data[(($i-1)*$params)+3] != "") $ftpaddress = $data[(($i-1)*$params)+3]; //Wenn keine FTP-Adresse vorhanden, Haupt-IP-Adresse verwenden
print "<tr><th>FTP IP-Adresse:</th><td><a href='ftp://".$ftpaddress."' title='Mit FTP verbinden'>ftp://".$ftpaddress."</a></td></tr>\n";
if ($data[(($i-1)*$params)+4] != "") $webaddress = $data[(($i-1)*$params)+4]; //Wenn keine WEB-Adresse vorhanden, Haupt-IP-Adresse verwenden
print "<tr><th>Webserver IP-Adresse:</th><td><a href='http://".$webaddress."' title='Mit Webserver verbinden'>http://".$webaddress."</a></td></tr>\n";
if ($data[(($i-1)*$params)+6] != "") $woladdress = $data[(($i-1)*$params)+6]; //Wenn keine Wake-on-LAN-Adresse vorhanden, Haupt-IP-Adresse verwenden
if ($data[(($i-1)*$params)+5] == "") $woladdress = ""; //Wenn keine MAC angegeben ist, macht Wake-on-LAN IP-Adresse keinen Sinn
print "<tr><th>Wake-on-LAN MAC-Adresse:</th><td><a href='RouterTool.php?wake&n=$i' title='Wake-on-LAN Paket an ".$woladdress." senden'>".$data[(($i-1)*$params)+5]."</a></td></tr>\n";
print "<tr><th>Wake-on-LAN IP-Adresse:</th><td><a href='RouterTool.php?wake&n=$i' title='Wake-on-LAN Paket an ".$woladdress." senden'>".$woladdress."</a></td></tr>\n";
print "</table>\n";
$i++;
}
while (($i*$params)<= count($data));
print "\n</body>\n"; //HTML-Seite beenden
}
# führt Aktion gemäß Parameter in URL aus
function doaction($data)
{
global $params;
if(isset($_GET['n'])) $counter = $_GET['n']; //Nummer des Eintrags übernehmen
if($counter == "") $counter = 1; //falls kein Parameter übergeben wird auf 1 setzen
if(((isset($_GET['ftp']) && (count($_GET) == 1)) || (isset($_GET['ftp']) && isset($_GET['n']) && (count($_GET) == 2))) && ($_GET['ftp'] == "")) //direkt zu FTP-Adresse umleiten
{ //nur wenn "ftp" ohne parameter angegeben wird
header("Location: ftp://".$data[(($counter-1)*$params)+3]); //direkt zur FTP-Adresse umleiten
exit();
}
if(((isset($_GET['web']) && (count($_GET) == 1)) || (isset($_GET['web']) && isset($_GET['n']) && (count($_GET) == 2))) && ($_GET['web'] == "")) //direkt zu Webserver-Adresse umleiten
{ //nur wenn "ftp" ohne parameter angegeben wird
header("Location: http://".$data[(($counter-1)*$params)+4]); //direkt zur FTP-Adresse umleiten
exit();
}
if((isset($_GET['wake']) && (count($_GET) == 1)) || (isset($_GET['wake']) && isset($_GET['n']) && (count($_GET) == 2)) && ($_GET['wake'] == "")) //Wake on LAN Paket senden
{
wake($data[(($counter-1)*$params)+6], $data[(($counter-1)*$params)+5], 9); //Paket über Port 9 schicken
}
}
##### Ab hier beginnt das eigentliche Programm
# Daten einlesen
$daten = loaddata($datei);
# Übergebene Parameter auslesen
$daten = getparameters($daten);
# Daten abspeichern
savedata($datei,$daten);
# Aktion durchführen
doaction($daten);
# Daten anzeigen
showdata($daten);
?>