#!/usr/bin/perl
### dynamo.pl
### Version 1.2
use strict;
use warnings;
use Net::SSH::Perl;
use Net::SSH::Perl::Cipher;
my ($host,$user,$pw) = qw/[COLOR=red]router.my.domain user password[/COLOR]/; # Credentials
print "---------------------------------------------\n";
my $line = `date "+%d.%m.%y - %H:%M:%S ["`;
$line .= `hostname`."]";
$line =~ s/\n//g;
print "$line dynamo.pl\n";
$ARGV[0]="" unless defined $ARGV[0];
if ($ARGV[0] eq "-f") {
print "Update wird erzwungen\n";
my $router_ip = get_routerip();
update_dyndns($router_ip);
exit;
}
my $ssh = Net::SSH::Perl->new($host,
port => 22,
cipher => Net::SSH::Perl::Cipher::name(2),
debug => 0);
$ssh->login($user, $pw);
my $cmd = "sh pppoe ses"; # Onlinestatus prüfen
my($out, $err) = $ssh->cmd($cmd);
my $log ="/tmp/dyndns.log";
if ($out =~ /\bUP\b/) {
print "Verbindung zum Internet ist hergestellt\n";
my $router_ip = get_routerip();
print "Router IP:\t$router_ip\n";
open LOG, "<", $log or die "Could't open $log: $!\n";
my $lookup_ip=<LOG>;
chomp $lookup_ip;
print "dynDNS IP:\t$lookup_ip\n";
if ( $lookup_ip eq $router_ip ) {
print "dyndns Update nicht erforderlich\n";
}
else {
print "dyndns Update wird durchgeführt\n";
update_dyndns($router_ip);
}
}
elsif ($out =~ /\bDOWN\b/) {
print "Verbindung zum Internet ist nicht hergestellt\n";
print "dynamo.pl wird beendet.\n";
}
else {
print "\n\t+++ Es ist ein Fehler aufgetreten +++\n"
}
my $wan_ip;
sub get_routerip {
my ($host,$user,$pw) = qw/[COLOR=red]router.my.domain user password[/COLOR]/; # Credentials
my $ssh = Net::SSH::Perl->new($host,
port => 22,
cipher => Net::SSH::Perl::Cipher::name(2),
debug => 0);
$ssh->login($user, $pw);
my $cmd = "sh ip int d1";
($wan_ip, $err) = $ssh->cmd($cmd);
$wan_ip =~ s/.*Internet address.*(\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/$1/m;
$wan_ip= $1;
return $wan_ip;
}
sub update_dyndns {
my $dynhost = "[COLOR=red]myhost.dyndns.net[/COLOR]"; # dynDNS-host
$wan_ip = $_[0];
my $updatehost = "members.dyndns.org";
my $query = "/nic/update";
$query .= '?system=dyndns&hostname='.$dynhost."&wan_ip=".$wan_ip;
my $fakeagent = "Mozilla/4.76 [en] (X11; U; Linux 2.4.1-0.1.9 i586)";
my $authstring = "Authorization: Basic [COLOR=red]ydGluOmFtZXRpc3RobWFjbWF[/COLOR]"; # base64 Auth
my $httpprint = "GET $query HTTP/1.0\\nHOST:$updatehost\\nUSER-AGENT:$fakeagent\\n$authstring\\n\\n";
system("printf \'$httpprint\' | nc -w 5 $updatehost 80 > /tmp/nc.data");
open ANTW, "<", "/tmp/nc.data" or die "Es ist ein Fehler aufgetreten: $!";
my @antw = <ANTW>;
close ANTW;
if ( $antw[6] =~ /good/) {
print "Update erfolgreich\n";
wlog();
}
elsif ($antw[6] =~ /nochg/) {
print "Update nicht erforderlich - nochg\n";
wlog();
}
elsif ( $antw[6] =~ /abuse/) { print "dynDNS verweigert update\n"; }
else { print "$antw[6]\n"; }
}
sub wlog {
open LOG, ">", $log or die "Could't open $log: $!\n";
print LOG "$wan_ip";
}