#!/bin/perl #!/usr/bin/perl ### # Dieses kleine Perl-script dient als kleine Verwaltungsliste fuer # dynamische IP-Adressen. Schiebe das Perl-Script einfach auf einen # Webserver. # Um jetzt die IP-Adresse eines Clients zu verwalten, trägst du # beispielsweise einen cronjob ein, welcher in regelmaessigen # Abstaenden wget wie folgt aufruft; # wget --cache=off --post-data "do=update&server=MyServer" -O - http://www.meinedomain.de/cgi-bin/servermanager.cgi # Mittels des wird jeder Client identifiziert und die # IP-Adresse laesst sich dann durch Angabe dieser ID ueber Aufruf # des Perl-Scripts in einem Browser ermitteln. # Es empfiehlt sich im spaeteren produktivem Einsatz statt eines # cronjobs einfach die Zeile in ein Shellscript zu schreiben und # dieses in /etc/ppp/ip-up/* zu hinterlegen um eine Aktualisierung # der IP-Adresse nur bei eventuellen Bedarf durch zu führen. ### my $logfile = '/htdocs/www/cgi-data/servermanager.log'; use Fcntl qw(:flock O_RDONLY O_RDWR O_CREAT); my($b,%param); ($ENV{REQUEST_METHOD} eq 'GET') ? ($b=$ENV{QUERY_STRING}) : (read(STDIN,$b,$ENV{CONTENT_LENGTH})); foreach(split(/&/,$b)) { my($n,$v)=split(/=/,$_); $v =~ tr/+/ /; $v =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/ge; $v =~ s{[\n\t\r\e\0]+}{}g; $param{$n}=$v; } if(! $param{server}) { print "content-type: text/html\n\n". "ServerManager</head><body>". "<form action='servermanager.cgi' method='post'>". "Server: <input type='text' name='server' value='' />". "<input type='submit' value='submit' />". "</form>". "</body></html>\n"; } elsif($param{'do'} eq 'update') { sysopen(LOG,$logfile,O_RDWR|O_CREAT) or &PrintResult("Cannot write logfile!"); my $time = time; my @log; foreach(<LOG>) { my($server) = split("/\#/",$_); next unless $server; if($server eq $param{'server'}) { push(@log, $server.'#'.$ENV{REMOTE_ADDR}.'#'.$time."\n"); last; } else { push(@log, $_); } } push(@log,$param{'server'}.'#'.$ENV{REMOTE_ADDR}.'#'.$time."\n") unless $done; seek(LOG,0,0); truncate(LOG,0); print LOG @log; close(LOG) or &PrintResult("Cannot close logfile!"); &PrintResult("IP $ENV{REMOTE_ADDR} for server $param{server} updated!"); } else { sysopen(LOG,$logfile,O_RDONLY) or &PrintResult("Cannot read logfile!"); foreach(<LOG>) { my($server,$ip,$time) = split("/\#/",$_); next unless $server; if($server eq $param{server}) { &PrintResult("<html><head><title>ServerManager</head><body>". "Server: $server<br />\n". "IP-Address: $ip<br />\n". "Last update: ".&GetDate($time)."<br />\n". "Now: ".&GetDate(time)."<br />\n". "</body></html>"); } } close(LOG); &PrintResult("No server $param{server} registered!") if(! $done); } sub PrintResult { my($res) = @_; print "content-type: text/html\n\n".$res."\n"; exit; } sub GetDate { my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = gmtime($_[0]); return sprintf("%04d-%02d-%02d %02d:%02d",($year+1900),($mon+1),$mday,$hour,$min); }