DynDNS Control Panel

Squeez

New Member
Ich habe dasselbe Problem. Es handelt sich um ein CentOS 6-System mit Plesk 11.5 und DCP 1.2.1. Ich habe den Wrapper wie angegeben neu compiliert, aber eine Aktualisierung über das Token schlägt fehl:
The requested URL /xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx was not found on this server.

Ansonsten scheint es zu funktionieren und es wird auch nach Aktivierung der Domain automatisch die korrekte IP eingetragen. Nach einem Versuch über das Token zu aktualisieren wird dann allerdings die IP des Servers eingetragen.

Was könnte man noch versuchen?
 
Last edited by a moderator:

HMnet

Registered User
Hi an ALLE!

Ich setze das DCP jetzt schon ne Weile ein und alles läuft gut - außer:

Immer häufiger erhlate ich folgende Meldung:
Screenshot.jpg

Das System ist ein Debian 7.4 64-bit mit aktuellem Plesk 11.5.30 MU39.

Kann ich irgendwo die "Seriennummeranzahl" erhöhen?

Grüße, Thomas
 

HMnet

Registered User
Hey,

da hab' ich doch was gefunden:
http://kb.parallels.com/en/114983

Ich hoffe, das hilft:
Code:
This SOA serial number format does not allow changing DNS zone more than 25 times a day (for Plesk version over 10.0) and 50 times a day for earlier versions.

Lösung:
Code:
Change SOA serial number format to UNIX timestamp. For that disable option "Use serial number format recommended by IETF and RIPE" on the SOA Records page of DNS Settings. The option is disabled by default.

With this serial number format DNS zone may be changed forever.

Ich kann es leider erst Morgen testen, da ich für heute keinerlei Änderungen mehr an den SOA-Einträgen vornehmen kann.

Vielleicht hilft es ja auch jemandem,
Grüße, Thomas

ANMEKRUNG:
Die Einstellung hat den gewünschten Effekt gebracht!
 
Last edited by a moderator:

MarS

New Member
Moin moin,

nachdem mich das Script zur Verzweiflung gebracht hatte, funktioniert es jetzt mit etwas "grips".

Zum Hintergrund, ich fahre einen Root Server bei Strato und habe zuhause eine NAS-Box (Synology), die ich gern aus allerwelt erreichen möchte. Da dyndns aktuell mit Schließung des freien DynDNS Hostings droht, habe ich die Lösung von Matthias Hackbarth dankend aufgenommen und eingebaut, leider aber nur mit mäßigen Erfolg.

Mein DDNS Updater auf der Synology kann zwar vieles, aber die "eingebaute" Token-Lösung natürlich nicht. Der Update-Mechanismus selber funktionierte nur von der Plesk Konsole auf den DNS Server, nicht jedoch vom Update. Und schlussendlich wird der DNS Server im Zweifelsfall mit jedem Request upgedate't (Tip ... das erzeugt das oben genannte serial overlow Problem).

Deshalb hier meine überarbeitete Datei: dcp/dynupd/index.php
PHP:
<?php
/*
Plesk DynDNS Control Panel (Version see version.php) - GUI for Plesk to build and administrate a DynDNS Service

Copyright (C) [2013 [Matthias Hackbarth / www.haggybear.de]

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, see <http://www.gnu.org/licenses/>.
*/

require("dbs/hosts.php");

// bevor ich die funktionalität unter php mühsam suche ....
function strtokenizer( $s, $delim) {
  $n00 = 0;
  $pos = 0;
  $posOld = 0;
  $a00 = array();
  while( ($pos = strpos( $s, $delim, $pos)) !== FALSE) {
    $a00[$n00] = substr( $s, $posOld, $pos-$posOld);
    $n00 += 1;
    $pos += strlen( $delim);
    $posOld = $pos;
  }
  $a00[$n00] = substr( $s, $posOld);
  return $a00;
}

function parse_query( $s) {
  $a01 = array();
  $a00 = strtokenizer( $s, "&");
  foreach( $a00 as $key => $value) {
    if( ($pos = strpos( $value, "=")) === FALSE) {
      // simple param
      $a01[$key]=$value;
      $a01[$value]="";
    }
    else {
      $a01[$key]=substr( $value, 0, $pos);
      $a01[$a01[$key]]=substr( $value, $pos + strlen( "="));
    }
  }
  return $a01;
}

// SCRIPT_URI funktionierte bei mir nicht .... 
//$url = parse_url($_SERVER["SCRIPT_URI"]);
//$host = str_replace("dynupd.","",$url["host"]);
$url = parse_url( $_SERVER["REQUEST_URI"]);
$host = $_SERVER['HTTP_HOST'];
if( strcasecmp( substr( $host, 0, 7), "dynupd.") == 0) {
  $host = substr( $host, 7);
}
$token = "";
$type = "";

// Aktualisierung mit Token habe ich nicht gefunden ... ich nehme mal den dyndns-Request zusätzlich mit auf
if( ( $url['path'] == "/dyndns/update") ||
    ( $url['path'] == "/nic/update")) {
  // protocols: 3322
  // protocols: allinkl, direktdomains, dyndns2, gratisdns_de, gratisdns_dk?, joker, opendns, ovh, selfhost, spdns,
  //            strato, changeip, cloudflare1
  $q = parse_query( $url['query']);
  if( !isset( $q['system'])) {
    // changeip, cloudflare1
    $token = $q['hostname'];
    $type = "dyndns";
  }
  else if( $q['system'] == "dyndns") {
    // 3322, allinkl, direktdomains, dyndns2, gratisdns_de, gratisdns_dk?, joker, opendns, ovh, selfhost, spdns, strato, changeip, cloudflare1
    $token = $q['hostname'];
    $type = "dyndns";
  }
}
else {
  $token = substr($url["path"], 1);
}

if( !empty($token) && $token == $dynhost[$host]["token"]){
   exec('sh/wrapper "1" "configs"',$out);
   $outNew = array();
   for($i=0;$i<count($out);$i++){
      $tmp = trim($out[$i]);
      if(!empty($tmp)) {
         $outNew[]=$tmp;
      }
   }

   DEFINE("DB_PWD",$outNew[0]);
   DEFINE("PSA_PATH",$outNew[1]);
   DEFINE("VHOSTS_PATH",$outNew[2]);

   require("../config.inc.php");
   require("../paa.class.php");
   require("../dcp.class.php");

   // ich klau' mir mal die alte IP aus der "lokalen" Datenbank
   require("dbs/hosts.php");
   $oldIP = $dynhost[$host];

   $dom = explode(".",$host);
   $domain = $dom[count($dom)-2].".".$dom[count($dom)-1];

   $dcp = new dcp(new s(),$_GET,array(DB_HOST,DB_NAME,DB_USR,DB_PWD));
   $ip = str_replace("::ffff:","",$_SERVER["REMOTE_ADDR"]);

   // netter Variablenname ... is changed ist aber die Langform
   $ischg = false;

   // und jetzt wird nur noch aktualisiert, wenn die ausgelieferte IP mit der letzten übergebenen nicht überein stimmt
   // Update 1: wenn man es schon in textform schreibt, sollte man es auch programmieren
   // if( $oldIP == $ip) {
   if( $oldIP != $ip) {
      $_POST["hostname"] = $host;
      $dcp->deactivate();
      $dcp->activate($ip,$dynhost[$host]["token"],$dynhost[$host]["orgip"]);
      $dcp->setSqlEntry($host,$ip);
      // komischerweise versucht man hier die "master domain" zu aktualisieren, also abc.de, nicht eine 
      // mögliche subdomain, z.B. ddns.abc.de ... also aktualisiert sich hier das DNS nicht.
      // Update 1: ich habe es wieder entfernt. keine Ahnung, warum es mit der Änderung plötzlich funktioniert hatte :-/
      // exec('sh/wrapper "1" "refreshdns" "'.PSA_PATH.'/bin/dns" "'.$host.'"');
      exec('sh/wrapper "1" "refreshdns" "'.PSA_PATH.'/bin/dns" "'.$domain.'"');

      // merke, es hat sich was geändert (für dyndns notwendig)
      $ischg = true;
   }

   // und jetzt Rückgabewerte mit dyndns Berücksichtigung
   if( $type == "dyndns") {
      if( $ischg) {
         // ip hat sich geändert
         echo "good ".$ip;
      }
      else {
         // ip hat sich nicht geändert
         echo "nochg ".$ip;
      }
   }
   else {
      // token Lösung
      echo "OK";
   }
}
else {
   if( $type == "dyndns") {
     // dyndns fehlermeldung ... host unbekannt
     echo "nohost";
   }
   else {
      // token Lösung
      echo "ERROR";
   }
}


class s{
      function chkLevel($i){
               return true;
               }
}
?>

Bitte jetzt nicht schreien, es ist nur eine provisorische Anpassung, damit es tut. Die Authorisierung habe ich ganz gestrichen, habe sowieso keine Rückmeldung dazu, könnte man aber einbauen (Domain User Abfrage?, separate Login/PWD-Daten).

Auf jedem Fall bin ich gespannt, wie es mit diesem Tool weiter geht ... und Matthias kann sich auch gern bei mir melden :)

Gute Nacht,
MarS.

// Update 1
Sorry, irgendwie war dann doch was durchgefallen. Ich habe den Quelltext direkt geändert, damit man nicht anfängt, hier zu suchen oder man einen nicht funktionierendes Teil nimmt.
 
Last edited by a moderator:

haggybear

Registered User
Hallo MarS,
danke für Deine Änderungen. So ganz verstanden habe ich allerdings nicht was Du mit Deiner "Tokenizer" Funktion bezwecken willst.

Ich kann aber einen Kommentar in Deinem Code beantworten:

// komischerweise versucht man hier die "master domain" zu aktualisieren, also abc.de, nicht eine
// mögliche subdomain, z.B. ddns.abc.de ... also aktualisiert sich hier das DNS nicht.

Dieser Schritt aktualisiert gar nichts, der bewirkt nur das der Bind neustartet und die Zonen die vorher mittels SQL eingetragen wurden aktiv werden.

Gruß
Haggy
 

MarS

New Member
Moin moin Haggy,

So ganz verstanden habe ich allerdings nicht was Du mit Deiner "Tokenizer" Funktion bezwecken willst.
Naja, war nur schnell hingeworfen, um den Query-String aufzuteilen. Genutzt wird es direkt in der nächsten Funktion :)

Ich kann aber einen Kommentar in Deinem Code beantworten:

mars said:
// komischerweise versucht man hier die "master domain" zu aktualisieren, also abc.de, nicht eine
// mögliche subdomain, z.B. ddns.abc.de ... also aktualisiert sich hier das DNS nicht.

Dieser Schritt aktualisiert gar nichts, der bewirkt nur das der Bind neustartet und die Zonen die vorher mittels SQL eingetragen wurden aktiv werden.
Naja .. der Kommentar ist zugegebenermaßen laienhaft ... außerdem ist mir ein kleiner Fehler passiert, zumal es so spät (früh) war. Ich hatte wohl zu viel experimentiert ... trotzdem korrigiere ich den Code direkt im ersten Beitrag ...
 

HMnet

Registered User
Moin Haggy,

ich hätte mal ne Frage :D:

Ich hatte gestern einen Fehler in der dbs/hosts.php - da hat sich mittendrin ein ?> eingeschmuggelt, daraufhin war logischerweise die Darstellung in Plesk im Eimer.
Dabei viel mir auf, dass in dieser Datei alle Update-Zugriffe kontinuierlich mitgeloggt werden. Das ist ja nicht schlecht, allerdings wird die Datei immer größer. Kann die irgendwie bereinigt werden?
Andererseits, im Moment liegt sie bei 1MB. Ich hatte 1 Host ca. 1/2 Jahr in Betrieb - jetzt allerdings habe ich ca. 20 Hosts drin, d.h. die wird schon recht schnell wachsen.

Grüße, Thomas
 

martinJhenne

New Member
Keine IP-History

zu #48:

Nur den letzten Eintrag in der hosts.php und damit keine IP-History, bekommst Du so:

In /opt/psa/admin/htdocs/dcp/dcp.class.php folgendes ändern:

Neue Funktion vor function activateFirst($ip){ einfügen:
Code:
      function activateCleanup($hostname){   
      	       require("dbs/hosts.php");            
               $cfg = file("dbs/hosts.php");
               $cfgNew = array();
               for($i=0;$i<count($cfg);$i++){
                   if(!stristr($cfg[$i],'["'.$hostname.'"]')) $cfgNew[] = $cfg[$i];
                   }
               file_put_contents("dbs/hosts.php",implode("",$cfgNew));
               }

In der Funktion function activate($ip,$token,$orgip){
die Zeile
Code:
$this->activateCleanup($_POST["hostname"]);
vor dieser einfügen:
Code:
$cfg = file_get_contents("dbs/hosts.php");

Dürfte meines erachtens keine negativen Auswirkungen haben!
 

martinJhenne

New Member
Bug "No connection"

Mit Plesk 11.5.30 Update #41 und einer frischen Installation von DCP erhalte ich beim updaten der IP-Adresse die Fehlermeldung "No connection".

Ein
Code:
echo $outNew[0];
in der Datei ./dynupd/index.php zeigt warum:

Hinter dem Datenbankschlüssel kommt noch ein /opt/psa
$AES-128-XXXXXXXXXXXXXX== /opt/psa

Das ganze $out Array sieht so aus:
Code:
Array ( [0] => $AES-128-XXXXXXXXXXXXXX== /opt/psa [1] => /var/www/vhosts )

Ich musste den wrapper wie in der Anleitung beschrieben neu kompilieren. Sonst kommt die Meldung "Host x.y.z kann nicht aktiviert werden, da der Nameserver nicht auf dieser Maschine läuft!"

Ich vermute den Bug daher in dem wrapper!
 

martinJhenne

New Member
IPv6 notwenig wegen Dual Stack Lite des Providers

Mein Provider m-net wird in Zukunft DSL-Zugänge nur noch über IPv6 und Dual Stack Lite realisieren.

Dringende Bitte daher: AAAA Update für IPv6 und evtl. die möglichkeit IPv4 Update zu deaktivieren - am besten per URL-Parameter z.B: &ipv6only
 
Last edited by a moderator:

HMnet

Registered User
Zu #50:

Ich habe komischerweise seit gestern Abend (ich habe das Root-PW und das Plesk-PW geändert) genau den selben Fehler:
Beim Update kommt: "No Connection."

Das echo $outNew[0]; in der index.php gibt folgendes:

Code:
$AES-128-XXXXXXXXX /opt/psaNo connection.

Das /opt/psa gehört wohl eigentlich in $outNew[1] rein, denn in $outNew[1] steht jetzt "/var/www/vhosts" drin und $outNew[2] ist leer.

Leider kann ich das Problem durch eine Rekompilierung des wrappers nicht lösen.

Jemand noch ne Idee?

Grüße!

P.S. Ich setze Debian 7.4 - 64-bit und Plesk 11.5.30 MU43 ein - keine frische Installation...
 
Last edited by a moderator:

HMnet

Registered User
Wenn ich die Konstanten manuell in der dynupd/index.php setze:

PHP:
   DEFINE("DB_PWD","\$AES-128-XXXXXXXXXXX");
   DEFINE("PSA_PATH","/opt/psa");
   DEFINE("VHOSTS_PATH","/var/www/vhosts");

Dann funktioniert es wieder!

Das Problem ist wohl wirklich der wrapper, der das PW nun in Kombination mit dem PSA_PATH ausliest...
 
Last edited by a moderator:

stephan_s

New Member
Guten Tag,

[...] Es ist zwar überall die IP in Plesk geändert aber per DIG oder ping ist immer noch die alte IP eingetragen.

Hat jemand ne Ahnung woran das liegen kann?

Hallo,

ich habe das gleiche Problem. Server ist bei Host Europe, Plesk 11.5 auf Ubuntu 10.04 LTS.

Alles funktioniert soweit einwandfrei, die korrekte IP ist im DynDNS Control Panel eingetragen, auch in der DNS-Zone und in der Datei hosts.php. Aber ein dig liefert nicht die neue IP aus. Wenn ich dann auf der Konsole

/opt/psa/admin/sbin/dnsmng --update <domain>

eingebe stimmt hinterher die Ausgabe von dig.

Den Wrapper habe ich zum test mal neu kompliert, hat aber leider nichts gebracht. Ich könnte jetzt natürlich nen Cronjob anlegen, der minütlich den Konsolenbefehl ausführt, aber das empfinde ich als "unschön"

Hat jemand einen Tip für mich, wo ich suchen könnte? In welchem Logfile würden denn eventuelle Fehlermeldungen aufschlagen?

TIA
Stephan
 

stephan_s

New Member
ich konnte das Problem jetzt beheben: In der Datei

/opt/psa/admin/htdocs/dcp/dynupd/index.php

wird in Zeile 44 über den Wrapper das DNS aktualisiert:

exec('sh/wrapper "1" "refreshdns" "'.PSA_PATH.'/bin/dns" "'.$domain.'"');


$domain wird dabei aus $host erzeugt und dabei auf die Haupt-Domain reduziert (home.domain.de => domain.de). Bei mir hat die Subdomain aber eine eigene DNS-Zone, dort wird die dynamische IP auch eingetragen. Da der Wrapper aber nur die Zone der Haupdomain aktualisiert, liefert eine DNS-Anfrage dann die veraltete IP.

Ich lasse jetzt einfach die subdomain ebenfalls aktualisieren und habe die folgende Zeile zusätzlich eingefügt:

exec('sh/wrapper "1" "refreshdns" "'.PSA_PATH.'/bin/dns" "'.$host.'"');


Damit klappt jetzt alles einwandfrei. Ob das nun ein Konfigurations-Fehler meinerseits ist oder ein Bug kann ich nicht genau sagen...

Gruß
Stephan
 

Janko

New Member
Hi Leute,

ich habe mir auch mal das Addon installiert. Über das Plesk Interface funktioniert ein IP Update ohne Probleme.
Ich mußte zwar auch diese Änderung vornehmen damit das Addon nicht nörgelt wegen MasterDNS:
Code:
$view = (@in_array($data->host,$this->noDyns))?true:true;

Leider funktioniert aber kein IP Update per URL Aufruf.
Die Seite bleibt einfach weiß.

Ich habe auch bereits die Lösung auf Post #53 probiert. Leider kam dann nur noch die Meldung "Error".

Hat sonst noch wer eine Lösung?
 

Janko

New Member
Hallo Haggy,

Code:
BS 	Debian 7.5
Panel-Version 	11.5.30 Update #47

Gibt es schon eine "Bridge" zu INWX?
 
Top