DynDNS Client mit Perl Programmieren

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

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.


Anbieter: nmq​rstx-18­@yahoo.de, die Seite verwendet funktionsbedingt einen Session-Cookie und ist Bestandteil meines nach modernen Aspekten in Perl entwickelten Frameworks.