DynDNS Client mit Perl Programmieren

DNS Einträge dynamisch aktualisieren, das braucht einen Service und einen Client [Perl]

DynDNS ​braucht ​Provider, ​der ​den ​Service ​(Dienst, ​DDNSS) ​bereitstellt, ​und ​einen ​Client, ​welcher ​mit ​dem ​Dienst ​kommuniziert. ​Somit ​ist ​DynDNS ​eine ​Client/Server-Anwendung ​und ​dieser ​Artikel ​wird ​etwas ​mehr ​zum ​Verständnis ​beitragen, ​indem ​er ​die ​Funktionsweise ​des ​Clients ​erklärt. ​Eine ​Solchen ​selbst ​aufzusetzen ​ist ​nämlich ​gar ​nicht ​so ​kompliziert ​und ​andererseits ​auch ​notwendig, ​weil ​nicht ​jeder ​Router ​im ​Heimnetzwerk ​einen ​DDNSS ​unterstützt.

Ein ​DDNSS-Client ​muss ​Folgendes ​tun:

1. ​Die ​aktuelle ​eigene ​IP-Adresse ​feststellen,
2. ​Bei ​Änderung ​der ​IP-Adresse ​einen ​Update-Request ​zum ​Server ​senden.

Zu ​(1) ​wird ​ein ​Webservice ​benötigt, ​der ​die ​REMOTE_ADDR ​liefert:
my ​$req ​= ​HTTPRequest->common(
 ​ ​ ​ ​method ​ ​ ​ ​ ​ ​ ​ ​=> ​'GET',
 ​ ​ ​ ​host ​ ​ ​ ​ ​ ​ ​ ​ ​ ​=> ​'handwerkzeugs.de',
 ​ ​ ​ ​uri ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​=> ​'/proxytest.html',
) ​|| ​die ​$@;

my ​$ip_current ​= ​$req->response_header->{'x-remote-addr'} ​|| ​'';

Die ​IP-Adresse ​steht ​also ​in ​einem ​Response-Header, ​der ​Webservice ​kann ​die ​aber ​auch ​im ​Body ​liefern, ​wenn ​der ​Request ​mit ​dem ​Parameter ​?remote_addr=1 ​erfolgt. ​Zum ​Vergleich, ​ob ​sich ​die ​Adresse ​geändert ​hat, ​wird ​sie ​aus ​einer ​lokalen ​Datei ​gelesen:

my ​$ip_stored ​= ​do{
 ​ ​ ​ ​my ​$fh ​= ​IO::File->new;
 ​ ​ ​ ​$fh->open($ipfile, ​O_CREAT|O_RDONLY) ​|| ​die ​$!;
 ​ ​ ​ ​read($fh, ​my ​$addr, ​-s ​$fh);
 ​ ​ ​ ​$fh->close;
 ​ ​ ​ ​$addr ​|| ​'';
};

Zum ​Schluss ​bleibt ​nur ​noch ​eine ​Kontrollstruktur ​über ​das, ​was ​zu ​tun ​ist:

if($ip_current ​ne ​$ip_stored){
 ​ ​ ​ ​print ​"Update\n";
 ​ ​ ​ ​my ​$r ​= ​HTTPsRequest->common(
 ​ ​ ​ ​ ​ ​ ​ ​method ​ ​ ​ ​ ​ ​ ​ ​=> ​'GET',
 ​ ​ ​ ​ ​ ​ ​ ​host ​ ​ ​ ​ ​ ​ ​ ​ ​ ​=> ​'www.dnshome.de',
 ​ ​ ​ ​ ​ ​ ​ ​uri ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​=> ​'/dyndns.php',
 ​ ​ ​ ​ ​ ​ ​ ​Authorization ​=> ​sprintf("Basic ​%s", ​encode_base64('USERNAME:PASSWORD')),
 ​ ​ ​ ​);

 ​ ​ ​ ​# ​Datei ​mit ​geänderter ​IP ​Addresse ​neu ​beschreiben

 ​ ​ ​ ​my ​$fh ​= ​IO::File->new;
 ​ ​ ​ ​$fh->open($ipfile, ​O_RDWR|O_TRUNC) ​|| ​die ​$!;
 ​ ​ ​ ​$fh->print($ip_current);
 ​ ​ ​ ​$fh->close;
}
else{
 ​ ​ ​ ​print ​"Aktuell\n";
}

Dieses ​Script ​wird ​nun ​noch ​in ​die ​Crontab ​eingetragen ​und ​jede ​Minute ​aufgerufen. ​Das ​ist ​Alles.

Für ​den ​CRON-Daemon ​unter ​Win32 ​empfiehlt ​sich ​Win32::Daemon ​bzw. ​der ​Dienst ​CRONw ​welcher ​damit ​gemacht ​ist.


Datenschutzerklärung: Diese Seite dient rein privaten Zwecken. Auf den für diese Domäne installierten Seiten werden grundsätzlich keine personenbezogenen Daten erhoben. Das Loggen der Zugriffe mit Ihrer Remote Adresse erfolgt beim Provider soweit das technisch erforderlich ist. nmq​rstx-18­@yahoo.de