Fritzbox Status Dynamic DNS abfragen?

Gibt es die Möglichkeit aus der Fritzbox (7270) im Bereich Online Monitor den Status der Dynamic DNS abzufragen?
Ich habe immer mal wieder Probleme dass es beim morgendlichen Neuaufbau der DSL Verbindung zu Schwierigkeiten kommt. Die DynDns ist dann als fehlerhaft markiert. Wenn ich dann von extern zugreifen will bekomme ich keine Verbindung. Wenn ich dann zu Hause eine neue Verbindung aufbauen lasse ist alles wieder OK. Dies möchte ich automatisch von IPS ausführen lassen.

Hallo,

ich hatte mal ein ähnliches Problem.
Ich habe es so gelöst, indem ich einfach ein Softwareprogramm aufgespielt hat, was die DYNDNS Verbindung auch noch geprüft hatte.
Ich glaube, dass gibt es bei dyndns.com auch zum runter laden. Hast ja eh den PC laufen.
Als Übergangslösung taugt das alle mal.

Nur so als Idee

Du könntest zyklisch ein sys_ping auf deine DynDNS Adresse durchführen.

Sys_Ping("meinrechner.dyndns.com", 1000);

Wenn nicht erreichbar, dann Verbindung reseten. Aber nicht zu oft, falls DynDNS doch mal (wieder) Probleme hat.

Hallo ,

ich habe dies mit Rainer seinem Fritzboxscript gelöst und dieses so erweitert:

$dsl = array('getpage' => $fritzseite, 'sid' => $SID, 'var:menu' => 'internet', 'var:pagename' => 'inetstat');
$getDNSDetails = http_post_fields($fritzgui, $dsl);

preg_match('/state="(.*)"/', $getDNSDetails, $match );
switch ($match[1]){
case 0: $state="Status: Fehler";break;
case 3: $state="Status: angemeldet";break;
case 5: $state="Status: erfolgreich angemeldet";break;
case 97: $state="Status: Account temporär deaktiviert";break;
case 98: $state="Status: Internet nicht verbunden";break;
case 99: $state="Status: unbekannt";break;
default: $state="Status: Anmeldung läuft";break;
}
if(substr_count($getDNSDetails, "showDynDns = true;") < 1) $state = "Status: nicht aktiv";
SetValue(39681 /*[Fritzbox\Status\DynDns]*/,$state);//print_r($match);

moin,

also in den letzten Wochen habe ich auch immer wieder diese dyndns Aussetzer.
Das hat aber erst mit der neuen FritzBox angefangen die ich nach dem Austausch bekommen habe (Blitzschaden).

Irgendwie vermute ich hier schon einen Zusammenhang.
Ist aber sauärgerlich und ich denke da muss ich mir auch was einfallen lassen, bzw. ein Script hinterlegen das im Zweifelsfall die Internetverbindung neu aufbaut.

Gruss
B71

Hi,

deshalb hab ich ne statische IP :wink:

Grüße

Andreas

Hallo,

ich habe seit einiger Zeit die selben Probleme.

Deshalb habe ich mir ein Script geschrieben, welches wanIP und bei DynDNS hinterlegte IP vergleicht und im zweifel einen Update bei DynDNS macht.

<?

echo "WD-Engine Dyndns aktiv 
";


$dyndnsben = "Benutzer"; // Login Name Dyndns Account
$dyndnspass = "Kennwort"; // Passwort Dyndns Account
$dnshost = "dynDNS Domain"; // Dyndns

	//-----------------------------------------------------------------------
	// Ermitteln der bei dyndns hinterlegten IP Adresse
	// durch Abfrage der Hosteinträge
	//-----------------------------------------------------------------------
	$ip = gethostbynamel($dnshost);
	//echo $ip ."
";
	$dnsIP = $ip[0];

	if ($ip == "")
		{
		   echo "DynDNS-IP = konnte nicht ermittelt werdent 
";
		   $dnsIP = "";
		}
	else
		{
			echo "DynDNS-IP = ".$dnsIP ."
";
		}


	//-----------------------------------------------------------------------
	// Ermitteln der bei derzeit aktuellen WAN IP Adresse
	// durch Abfrage bei dyndns mittels checkIP
	//-----------------------------------------------------------------------
	//$string = @file_get_contents("http://checkip.dyndns.com/");
	$string = @file_get_contents("http://WAN-IP.info/");
	If ($string == "false")
	{
	   echo "WAN-IP    = konnte nicht ermittelt werden  
";
	}
	else
	{
		if ($string != "")
		{
			$ip = @GetIP_v4_Addresses($string); //herausfiltern der IP aus dem String
			$wanIP = $ip[0]; // es wird nur eine IP im Array zurück geliefert, deshalb der erste Eintrag
			echo "WAN-IP    = ".$wanIP ."
";
		}
		else
		{
			echo "WAN-IP    = konnte nicht ermittelt werden  
";
			$wanIP = "";
		}
	}

	//-----------------------------------------------------------------------
	// Vergleich der beiden IP Adressen
	//-----------------------------------------------------------------------

	if ($dnsIP == $wanIP)
	{
		echo "Die IP Adressen sind gleich, keine Aktion notwendig";
		return;
	}
	elseif ($dnsIP == "")
	{
	  $result = update_dyndns($dnshost, $wanIP, $dyndnsben, $dyndnspass);
      //echo $result ."
";
      $note = "DynDNS-IP konnte nicht ermittelt werden. Aktualisierung durchgeführt. Ergebnis: ".$result."
";
	  echo $note ."
";
	}
	elseif ($wanIP == "")
	{
		$note = "WAN-IP konnte nicht ermittelt werden.
";
		echo $note ."
";
	}
	else
	{
	   $result = update_dyndns($dnshost, $wanIP, $dyndnsben, $dyndnspass);
		//echo $result;
		$note = "DynDNS-IP konnte nicht ermittelt werden. Aktualisierung durchgeführt. Ergebnis: ".$result ."
";
		echo $note ."
";
	}





//-------------------------------------------------------------------------------
// Funktion zum Filtern von IP Adressen aus einem String
// Übergabe: String
// Rückgabe: Array IP Adressen im Format x.x.x.x
//-------------------------------------------------------------------------------
function GetIP_v4_Addresses($text)
{
   $regex = '/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/';
   preg_match_all($regex, $text, $matches);
   $arrIPs = array();
   $i=0;
   foreach($matches[0] as $match) {
      $arrBlocks = explode('.', $match);
      $bIsIP = true;
      foreach($arrBlocks as $block) {
         if ($block < 0 or $block > 255) {
            $bIsIP = false;
            break;
         }
      }
      if ($bIsIP) {
         $arrIPs[$i] = $match;
         $i++;
      }
   }
   return($arrIPs);
}




//-------------------------------------------------------------------------------
// Funktion zum aktualisieren von Dyndns IP Adressen.
// Übergabe: Domain, neue IP, Benutzer, Passwort
// Rückgabe: Ergebnis als Strings
//-------------------------------------------------------------------------------
function update_dyndns($DOMAIN, $IP, $dyndnsben, $dyndnspass)
{
   @$sock = fsockopen("members.dyndns.org", 80, $errno, $errstr, 30);
   if (!$sock)
      return(FALSE);

   fwrite($sock, "GET /nic/update?hostname=$DOMAIN&myip=$IP HTTP/1.0
");
   fwrite($sock, "Host: members.dyndns.org
");
   fwrite($sock, "Authorization: Basic ".base64_encode($dyndnsben.":".$dyndnspass)."
");
   fwrite($sock, "User-Agent: myUpdater
");
   fwrite($sock, "Accept: */*
");
   fwrite($sock, "
");
   fwrite($sock, "
");

   $headers = "";
   while ($str = trim(fgets($sock, 4096)))
   $headers .= "$str
";

   $body = "";
   while (!feof($sock))
   $body .= fgets($sock, 4096);

   fclose($sock);
	return($body);                               // response oder FALSE
}

?>


Die Funktion zum Update DynDNS und zum Filtern einer IP Adresse aus einem String habe ich auch gegoogelt. Ich habe dies auf einen Trigger mit 5 Minuten gelegt. Bei mir öfter morgens im Log eine Nachricht angezeigt, dass dnyDNS aktualisiert wurde.

Ich hoffe das hilft weiter.

Gruß
Christian

Hi,

ich wollte das Skript grade mal testen, bekomme aber die Meldung:

Parse error:  syntax error, unexpected T_NS_SEPARATOR, expecting ',' or ';' in [Geräte\Dachgeschoss\Test DynDNS] on line 68

Allerdings nutze ich no-ip.info und nicht dyndns direkt!

Hallo,

ich kann das so leider zu Zeit nicht prüfen, da ich nicht auf mein System komme. Ich hatte das Script etwas gekürzt, da es bei mir in eine „größer“ Lösung eingebunden ist, die ich erst demnächst veröffentlichen kann.

Für mich macht aber scheinbar die Zeile 68 keinen Sinn. Was steht in Zeile 68 bei Dir?

Gruß
Christian

Hallo,

es sind 3 Fehler und zwar

  echo $note ."

"; <<-- Fehler

falsch ."
„;
richtig .“
";

Ich weis die Zeilennummern nicht mehr genau ich glaube
68 + 73 + 80

"
" ist glaube ich Zeilenunbruch
Gruß wibo

Hallo,

sorry, manchmal ist man einfach …
Ich habe es im obigen Script geändert. Ich konnte es leider nicht direkt testen bzw. habe nur die Dinge aus meinem Originalscript rausgenommen, die sonst nicht gehen würden.

Vielen Dank Wibo.

Gruß
Christian

Ah danke, ich werde es morgen mal testen aber wenn ich mir den Rest betrachte wird das mit no-ip.info wohl nicht funktionieren.

Hallo,

ja für no-ip.info müsste die Funktion zum Update geändert werden. Die ist für dyndns.org ausgelegt. Infos dazu würde es hiergeben.

Alternativ könnte man bei der FritzBox einen reconnect auslösen. Dann würde ja auch versucht den Dyndns zu aktualisieren. Da die FritzBox aber dabei zur Zeit wohl Probleme hat kann sowas auch mal in einer Endlosschleife enden.

Gruß
Christian

@Heiner,

quasi gesehen, kannst Du hiermit alles abfragen. Musst nur auseinander dröseln. :wink:

<?
$fritzbox_ip = 'fritz.box';
$fritzgui    = 'http://fritz.box/cgi-bin/webcm';
$fritzseite  = '../html/de/menus/menu2.html';
$password    = 'xxxxx';

$ch = curl_init('http://' . $fritzbox_ip . '/cgi-bin/webcm?getpage=../html/login_sid.xml');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$login = curl_exec($ch);
$session_status_simplexml = simplexml_load_string($login);

if ($session_status_simplexml->iswriteaccess == 1)
{
   $SID = $session_status_simplexml->SID;
}
else
{
   $challenge = $session_status_simplexml->Challenge;
   $response = $challenge . '-' . md5(mb_convert_encoding($challenge . '-' . $password, "UCS-2LE", "UTF-8"));
    curl_setopt($ch, CURLOPT_POSTFIELDS, "login:command/response={$response}&getpage=../html/de/menus/menu2.html");
    preg_match('/name="sid" value="([0-9a-f]*)"/', curl_exec($ch), $matches);
   if(isset($matches[1]) && $matches[1] != '0000000000000000')
   {
      $SID = $matches[1];
   }
   else
   {
      echo "Fehler: Login fehlgeschlagen";
      return;
    }
}

$home = file("http://fritz.box/home/home.lua?sid=".$SID);
print_r($home);
preg_match('((?:\d{1,3}\.){3}\d{1,3})i', strip_tags($home[569]), $ip);
echo $ip[0];


?>

Hi zusammen,

vielleicht steh ich aufm Schlauch, http_post_fields soll doch bei einer der nächsten Versionen nicht mehr funzen, daher wollte ich das ganze auf Curl umstricken. Aber … ich komm beim auslesen nicht ganz hinter die logic!

In der ersten Zeile wird doch die Statusseite geladen
und in der zweiten mit http_post_fields auseinandergenommen, oder?
Wie bekomm ich das nun dauerhaft gelöst?

Zum Thema DynDNS Fehler. Bislang hab ich mich so beholfen dass ich bei IP-Wechsel einfach mal 5 Sekunden DynDNS deaktiviert und wieder neu angemeldet hab. Funzte 1a! So ca. einmal in der Woche war das auch nötig! Natürlich wäre „bei Fehler“ die Recourcen schonendere Variante :wink:

Gruß

Kai

Hallo Kai,

hier mal das ganze Script mit Curl:


    $ScriptID = 12345;
	$fritzbox_ip = 'fritz.box';
	$fritzgui    = 'http://fritz.box/cgi-bin/webcm';
	$fritzseite  = '../html/de/menus/menu2.html';
	$password    = 'passwort';

	$ch = curl_init('http://' . $fritzbox_ip . '/cgi-bin/webcm?getpage=../html/login_sid.xml');
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	$login = curl_exec($ch);

	$session_status_simplexml = simplexml_load_string($login);

    if ($session_status_simplexml->iswriteaccess == 1)
    {
       $SID = $session_status_simplexml->SID;
    }
    else
    {
       $challenge = $session_status_simplexml->Challenge;
       $response = $challenge . '-' . md5(mb_convert_encoding($challenge . '-' . $password, "UCS-2LE", "UTF-8"));
        curl_setopt($ch, CURLOPT_POSTFIELDS, "login:command/response={$response}&getpage=../html/de/menus/menu2.html");
        preg_match('/name="sid" value="([0-9a-f]*)"/', curl_exec($ch), $matches);
       if (isset($matches[1]) && $matches[1] != '0000000000000000')
       {
          $SID = $matches[1];
       }
       else
       {
          echo "Fehler: Login fehlgeschlagen";
          return;
        }
    }
$dsl = 'getpage='.$fritzseite.'&sid='.$SID.'&var:menu=internet&var:pagename=inetstat';
curl_setopt($ch, CURLOPT_POSTFIELDS, $dsl);
$getDNSDetails = curl_exec($ch);

curl_close($ch);

preg_match('/state="(.*)"/', $getDNSDetails, $match );
switch ($match[1]){
case 0: $state="Status: Fehler";break;
case 3: $state="Status: angemeldet";break;
case 5: $state="Status: erfolgreich angemeldet";break;
case 97: $state="Status: Account temporär deaktiviert";break;
case 98: $state="Status: Internet nicht verbunden";break;
case 99: $state="Status: unbekannt";break;
default: $state="Status: Anmeldung läuft";break;
}
if(substr_count($getDNSDetails, "showDynDns = true;") < 1) $state = "Status: nicht aktiv";
if ($match[1] != 5 && $match[1] != 3 ) IPS_RunScriptEx($ScriptID /*[Fritzbox\Status\reboot]*/,array( "Status" => $state));
SetValue(39681 /*[Fritzbox\Status\DynDns]*/,$state);

Wenn der Status nicht „angemeldet“ ist, nehme ich über ein extra Script die Spannung kurz von der Box weg.

Gruß
Attain

Hi Attain,

Spannung wegnehmen brauchst net, geht ganz einfach mit DynDNS deaktivieren und 5 Sekunden später wieder aktivieren. Hab ich schon probiert!

dann ich nachher mein Script mal auf Curl um! :slight_smile:

Gruß und Danke!

Kai

@ c.radi
Ich hatte immer wieder Probleme mit der Nichtverfügbarkeit meiner Dyndns Adresse.
Jetzt verwende ich Dein Skript welches SUPER funktioniert. Dein Skript hat für mich den Vorteil daß ich auch weiterhin die Authentifizierung für das Webinterface der Fritzbox verwenden kann da keine Abfrage zur Fritzbox notwendig ist.
Geniales Skript … Danke!!!

Hallo,

aber gerne doch. Ich bin froh, wenn ich auch mal etwas beitragen kann, und nicht nur Nutzer der vielen Dinge im Forum bin.

Gruß
Christian

Also ich pinge meine Dyndns alle 5 min an und wenn das nicht geht dann trenne ich die Stromverrsorgung der Fritzbox für 5 Sekunden. Das protokolliere ich damit man das im Webfront sieht.