Aktion nach Ruhezustand

maceis

maceis

Aktives Mitglied
Thread Starter
Dabei seit
24.09.2003
Beiträge
16.880
Reaktionspunkte
626
Hallo zusammen,

ich suche eine Möglichkeit, in einem Skript eine Aktion durchzuführen, abhängig davon, ob der Rechner seit dem letzten Aufruf im Ruhezustand war.

Hintergrund: Ich hab mir einen dyndns Client geschrieben, der meinen Router per SSH abfragt und nur dann ein update auslösen soll, wenn
a) der Router schon mit dem Internet verbunden ist, und
b) die Internetverbindung seit dem letzten update getrennt war.
b klappt nur dann, wenn der Router nicht während des Ruhezustands die Verbindung ins Internet getrennt hat.
 
Wieso legst du nicht beim IP-Wechsel (oder neueinwahl) auf dem Router eine Logdatei an die das aktuelle Datum enthält. Dann kannst du das mit dem Client-Rechner vergleichen und je nach diff einen sync starten oder nicht.... Mal so ne blöde Idee...

Oder hab ich was nicht ganz verstanden?
 
Rakor schrieb:
Wieso legst du nicht beim IP-Wechsel (oder neueinwahl) auf dem Router eine Logdatei an die das aktuelle Datum enthält.
...
Und wie soll ich das machen?
Rakor schrieb:
...
Dann kannst du das mit dem Client-Rechner vergleichen und je nach diff einen sync starten oder nicht.... Mal so ne blöde Idee...

Oder hab ich was nicht ganz verstanden?
Vom Prinzip her könnte das klappen. Allein die technische Umsetzung ist mir noch nicht ganz klar.
 
Wenn du doch per ssh deinen Router abfragen kannst dann kannst du doch bestimmt auch die IP abfragen.
Warum merkst du dir diese IP nicht einfach und wenn die sich ändert dann muss du auch ein DNS Update machen.

Fragt sich nur noch wie oft du das Script anlaufen lässt damit dein DynDNS Eintrag auch immer schön passt.

BTW: warum erfindest du das Rad neu oder gibt es keine fertigen Clients für OSX ?
 
worf schrieb:
Wenn du doch per ssh deinen Router abfragen kannst dann kannst du doch bestimmt auch die IP abfragen.
Warum merkst du dir diese IP nicht einfach und wenn die sich ändert dann muss du auch ein DNS Update machen.
Danke. Das war der Schlag auf den Kopf, den ich gebraucht habe. Ich hab das am "down" Status des Routers aufgehangen, der eben dann verpasst wird, wenn der Rechner im Ruhezustand war.
worf schrieb:
Fragt sich nur noch wie oft du das Script anlaufen lässt damit dein DynDNS Eintrag auch immer schön passt.
Alle fünf Minuten.
worf schrieb:
BTW: warum erfindest du das Rad neu oder gibt es keine fertigen Clients für OSX ?
Aus verschiedenen Gründen.
Es gibt beispielsweise ein Pythonskript mit rund 5000 Zeilen Code (universell einsetzbar), das ist mir zu heavy.
Mein Skript kommt mit rd. 150 Zeilen aus und könnte locker auf unter 100 gekürzt werden.
Andere Clients lösen jedesmal eine Einwahl aus, das will ich auch nicht.
Ganz abgesehen davon wollte ich mal was mit Net::SSH machen, das war dann der Auslöser.
 
Naja ich dachte mir das mit den Wechsel der IP anfangs auch, aber das Problem ist, dass es dann eben nur bei IP-Wechsel den Status erhälst... Solltest du nach einem Reconnect (Zufall will es) die selbe IP bekommen funktioniert das ganze nicht....

Daher dachte ich eben an das Ablegen des Datums in einer Datei. Die ist dann eindeutig.
Das Vorgehen an sich wäre ähnlich. Oder spricht du von so nem "Hardwarerouter"?
 
Weiss ja nicht wie das bei anderen ISP's si läuft aber mir schwebt da eine Aussage im kopf vor (Bei t-online ) ändert sich zwangsweise die IP bei jeder Einwahl.

LG worf
 
selbst wenn das so ist weisst du ja nicht ob es 2 IP-Wechsel in der Zwischenzeit gab ;)
 
Hallo Rakor,

das verstehe ich nicht wofür benötige ich die Info ???

LG Worf
 
Es hängt davon ab was mit dem Prog gemacht werden soll.... Wenn es falls eine Neuverbindung erfolgte (egal ob mit gleicher IP oder einer anderen) ist das wichtig. Wenn du nur auf IP-Gleichheit überprüfst deckst du den Fall, dass du bei dem letzten Wechsel die selbe IP erhalten hast wie beim letzten Vergleich nicht mehr ab.

Blöd zu erklären
 
Danke für Euer Feedback.

Also in meinem Fall ist das so:
Wenn ich nach einer neuen "Einwahl" wieder die selbe IP bekommen sollte, ist das Update nicht erforderlich, denn dann bin ich ja immer noch unter dieser IP erreichbar.

Und ja, Rakor, ich sprech von "so nem Hardwarerouter"; um genau zu sein von einem Cisco 1603R.
Inzwischen weiss ich auch, dass man mit diesem wunderbaren Gerät auch lokal Logdateien anlegen kann. Ist aber gar nimmer nötig.
Anschauen werd' ich mir die Funktion trotzdem mal.
 
Auf besondere Nachfrage hier das Skript, um das es ging.
Ich hab es eigentlich nur für private Zwecke geschrieben, daher nur eingeschränkte Fehlerkontrolle und wenig Konfigurationsmöglichkeiten.
Die Datei /tmp/dyndns.log muss von Hand angelegt werden (z. B. mit `touch /tmp/dyndns.log`).
Alles was hier rot abgedruckt ist muss individuell angepasst werden, falls jemand das Skript selbst verwenden möchte.
Code:
#!/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";
}
 
Zurück
Oben Unten