DDNS Updater 2: Cloudflare V2 API funktioniert nicht mehr

moontear

Benutzer
Mitglied seit
24. August 2016
Beiträge
6
Punkte für Reaktionen
0
Punkte
0
Wenn man ein Cloudflare Update durchführen möchte kommt die folgende Meldung im Debug Log:

'This API has been deprecated in favor of API v4, available at https://api.cloudflare.com'

Aktuell gibt es auch nur ein Cloudflare Modul welches v2 der API verwendet. Das Script in folgendem Beitrag funktioniert, entspricht aber nicht dem DDNS Modul Schema: https://www.synology-forum.de/showt...pdater-2-Cloudflare-error&p=531888#post531888

Leider ist es auch nicht so einfach ein neues Modul zu erstellen für Cloudflare v4, weil die aktuelle api_request Methode (in Tools.pm) nicht das setzen von Headern erlaubt (mit Ausnahme des hardcodierten useragents).
 
Zuletzt bearbeitet:

moontear

Benutzer
Mitglied seit
24. August 2016
Beiträge
6
Punkte für Reaktionen
0
Punkte
0
Aktueller Stand: Ich habe eine neue API-Request Funktion gebaut, die auch mit zusätzlichen Headern klarkommt.

In der Datei Tools.pm folgendes oben ergänzen:
Rich (BBCode):
our @EXPORT_OK   = qw(detect_ip_system analyze_ip api_request api_request2 get_ip domain2ip canonify_url check_result build_updatevars exec_script);

Rich (BBCode):
sub api_request2 {
     my $class = shift;
     my ($url,$ipv6,$ssl,$auth,$rqmethod,$pdata,$referer,$ctime,$mtime,$additionalheaders) = @_;
     my %additionalheaders = %{$additionalheaders};
     
     $ctime              ||= 10;
     $mtime              ||= 30;
     $ssl                ||= 0;
     $auth               ||= {'login' => undef, 'password' => undef};
     $rqmethod           ||= 'GET';
     $pdata              ||= {};
     $referer            ||= '';
     $useragent          ||= '';
     my $keep_alive      = 30;
     my $tcp_nodelay     = '';
     my $proto = 'http';
     my $dubody = {
          '--ipv6'            => $ipv6,
          '--connect-timeout' => $ctime,
          '--max-time'        => $mtime,
          '--keepalive-time'  => $keep_alive,
          '--tcp-nodelay'     => $tcp_nodelay
     };
     $dubody->{'--referer'} = $referer if ($referer);
     my $postbody = {%{$dubody}, %{$pdata}};
#print Dumper($auth);
#print Dumper($postbody);
#exit;
     if ($ssl) {
          $url =~ s/http:/https:/i;
          $proto = 'https';
     } else {
          $url =~ s/https:/http:/i;
     }
     my ($ret,$code,$http_code,$curl_code,$err);
     $ENV{'PLIENT_DEBUG'} = $ENV{'DDU_DEBUG'};
     my $webpost = plient_support($proto, $rqmethod);
     if ($webpost) {
          my %headers;
          my %tmpheaders = ('User-Agent' => $useragent);
          if (%additionalheaders) {
            %headers = (%tmpheaders,%additionalheaders);
          } else {
            %headers = %tmpheaders;
          }

          $ret = plient(
               $rqmethod,
               $url,
               {
                    'headers' => {%headers},
                    'user' => $auth->{'login'},
                    'password' => $auth->{'password'},
                    'body' => $postbody
               }
          );
#print $ret;
          # if there is always a return code beside http and curl error, filter http and curl error to get provider response
          # prio #1
          $err = 0;
          $code = $ret;
          $ret =~ s/(http_code\:|curl\:)(.*?)$//g;

          if ($code =~ m/curl:(.*?)\n/) {
          # prio #2 - curl error code
               $curl_code = DDNSUpdater::Functions->trim($1);
               $err = ($curl_code ne "" ? 1000 : 0);
               $code = "curl:".$curl_code;
#print "curl:$curl_code\n";
          } elsif ($code =~ m/http_code\:(.*?)\n/) {
          # prio #3 - http error code
               $http_code = DDNSUpdater::Functions->trim($1);
               $err = ($http_code == 0 || $http_code >= 400 ? 1000 : 0);
               $http_code = ($http_code == 0) ? '000' : $http_code;
               $code = "http:".$http_code;
#print "http:$http_code\n";
          }
#print $err,$code,$ret;
#exit;
          return ($err,$code,$ret);
     } else {
          return (1000,uc($proto)." not available","");
     }
}

Und angehängt ist die Work in Progress Version der Cloudflare V4 API (cloudflare4.pm Modul). Anhang anzeigen cloudflare4.txt
 

moontear

Benutzer
Mitglied seit
24. August 2016
Beiträge
6
Punkte für Reaktionen
0
Punkte
0
Fertig.

Angehängt ist das Cloudflare4 Modul [ddnsupdater2/lib/DDNSUpdater/Module]: Anhang anzeigen cloudflare4.txt . Das Modul ist ein wenig "länger" als andere Module, da es letztendlich drei Web Requests sind: Cloudflare Zone ID abholen anhand des Domain Namens, DNS Eintrag ID abholen anhand des Eintragnamens und dann der IP/TTL Update des Eintrags.

Leider funktioniert dieses nicht ohne Grundlegende Änderungen an einigen Dingen:

Plient unterstützt aktuell leider noch überhaupt nicht HTTP PUT (für das Updaten von DNS Einträgen), deswegen musste ich die Implementierung im curl Handler selber nachbauen.
Den DDUD Tools kann ich keine zusätzlichen Header mitgeben, deswegen auch hier eine extra Methode (api_request2).

Konfiguration sobald man alle Dateien ausgetauscht / ersetzt hat:
  1. Protocol konfigurieren
  2. Provider konfigurieren
  3. Host konfigurieren

Protocol
Config_Protocol.jpg

Provider
Config_Provider.jpg

Host
Config_Host.jpg
 

fraenK

Benutzer
Mitglied seit
22. Januar 2019
Beiträge
4
Punkte für Reaktionen
0
Punkte
1
Danke für das Update!

Man muss noch cloudflare4 in ddnsupdater2/etc/modules.json hinzufügen/aktivieren, richtig? Sonst erscheint es bei mir nicht in der Modul-Auswahl.

Ist folgende Zeile in der cloudflare4.pm korrekt? Erzeugt bei mir einen fehlerhaften Aufruf "name=domain.de.domain.de" -> "no dns record id found"
my $wantedname = $updatevars->{'tags'}->{'dnsrecordname'}.".".$updatevars->{'tags'}->{'domain'};
 

moontear

Benutzer
Mitglied seit
24. August 2016
Beiträge
6
Punkte für Reaktionen
0
Punkte
0
Sehr guter Fund, ja stimmt die modules.json ( Anhang anzeigen modules.txt ) muss genau wie du sagst angepasst werden.

Mir erscheint dein "name=domain.de.domain.de" falsch, guck dir nochmal meine Beispielkonfiguration an:

Host: zuhause
Domain: example.org

Ergibt dann in der Zeile $wantedname = zuhause.example.org [dnsrecordname + domain] - dieser Eintrag (zuhause.example.org) muss auch schon so in Cloudflare existieren, das Script legt keinen Eintrag an. Zum debuggen auf jeden Fall das Debug Log ansehen / aktivieren. Das Script funktioniert in dieser Form bei mir ohne Probleme und ich habe für meine Domain (z.B. "example.org") einen A-Record (z.B. "zuhause") definiert der über DDNSUpdater schön aktuell gehalten wird.
 

fraenK

Benutzer
Mitglied seit
22. Januar 2019
Beiträge
4
Punkte für Reaktionen
0
Punkte
1
Funktioniert das auch ohne Subdomain?
 

jshessen

Benutzer
Mitglied seit
10. März 2019
Beiträge
4
Punkte für Reaktionen
0
Punkte
1
<I'm sorry for the English response>

This post was quite helpful, thank you @moontear.

A quick note, on manually updating the files

root@Catacomb:/var/packages/ddnsupdater2# ls -altr
total 136
drwxrwxrwx 3 root root 4096 Apr 2 2010 scripts
drwxrwxrwx 2 root root 4096 May 7 2015 WIZARD_UIFILES
-rwxrwxrwx 1 root root 111754 Mar 10 14:20 INFO
drwxr-xr-x 40 root root 4096 Mar 10 14:20 ..
lrwxrwxrwx 1 root root 31 Mar 10 14:20 target -> /volume1/@appstore/ddnsupdater2
lrwxrwxrwx 1 root root 35 Mar 10 14:20 etc -> /usr/syno/etc/packages/ddnsupdater2

If you navigate to "/volume1/@appstore/ddnsupdater2/etc", we seem to only see the default files. Digging back into the package path, I was able to modify the "modules.json/txt" from the package directory "/var/packages/ddnsupdater2/etc" and then build up from the referenced screenshots.
 

darrell_duff

Benutzer
Mitglied seit
01. April 2019
Beiträge
3
Punkte für Reaktionen
0
Punkte
0
I have this working on my system finally, but the proxy is being set to false and disconnects the secure cloudflare connection. Is there a way to have this set to true, so the DDNS updates the ip address on cloudflare and doesn't remove the proxy for cloudflare?
Thanks again in advance! This forum is very helpful.
 
Zuletzt bearbeitet:

jshessen

Benutzer
Mitglied seit
10. März 2019
Beiträge
4
Punkte für Reaktionen
0
Punkte
1
I have modified the cloudflare4.pm file to honor an additional custom parameter defined in the protocol configuration to allow for an additional API value to be passed. This allows for the Cloudflare proxy to be enabled (or not as desired).

Anhang anzeigen cloudflare4_pm_.txt
protocol_config.jpg
 

darrell_duff

Benutzer
Mitglied seit
01. April 2019
Beiträge
3
Punkte für Reaktionen
0
Punkte
0
Thanks for the update. I haven't applied it yet, but I looked at the updates in the file and everything looks good. This is great work and I definitely appreiciate it.
 

darrell_duff

Benutzer
Mitglied seit
01. April 2019
Beiträge
3
Punkte für Reaktionen
0
Punkte
0
I just got home today and gave the new cloudlfare4.pm file a try and these are the logs from today with proxied set to true or false.

2019/04/02 16:52:41 FAILED : updating emby, status: http:400
2019/04/02 16:52:41 WARNING : put for Plient::protocol::HTTPS is not officially supported yet at /volume1/@appstore/ddnsupdater2/sbin/../lib/Plient/Protocol.pm line 17.
2019/04/02 16:52:40 INFO : Force update of emby by user!
 

jshessen

Benutzer
Mitglied seit
10. März 2019
Beiträge
4
Punkte für Reaktionen
0
Punkte
1
Just a note, I have been running this code for over a year, this quit working last month, and I finally had the time to dig in a bit. It seems that some of the return code status updates are now being returned as a multi-line string (vs. a single line). This required me to update the file to include the Perl regex multi-line option. I update lines 88 and 133:

if ($error == 0 && $ret =~ m/^({.*?})$/is)
 

Heaven1976

Benutzer
Mitglied seit
25. November 2018
Beiträge
124
Punkte für Reaktionen
0
Punkte
16
versteh leider nur bahnhof hier wie muss ich da was ändern damit es mit cloudflare v4 funktioniert?
 

jshessen

Benutzer
Mitglied seit
10. März 2019
Beiträge
4
Punkte für Reaktionen
0
Punkte
1
via Google Translate

Sie sollten den Anweisungen folgen, die über meinem @moontear in #3 veröffentlicht wurden.

Dies ist erforderlich, um Folgendes herunterzuladen:
/var/packages/ddnsupdater2/target/lib/Plient/Handler/curl.pm
und
/var/packages/ddnsupdater2/target/lib/DDNSUpdater/Tools.pm

Sie möchten auch die cloudflare4.pm hinzufügen / ersetzen (wieder angebracht) /var/packages/ddnsupdater2/target/lib/DDNSUpdater/Module/cloudflare4.pm

(Die Hauptänderung bestand darin, die Fehlerprüfung zu aktualisieren, um Übereinstimmungen ohne Berücksichtigung des Falls zu ermöglichen)
 

Anhänge

  • cloudflare4_pm_.txt
    12,4 KB · Aufrufe: 5

Heaven1976

Benutzer
Mitglied seit
25. November 2018
Beiträge
124
Punkte für Reaktionen
0
Punkte
16
habe hier alles so gemacht wie es da steht und cloudflare4 erscheint nicht einmal in dem menü
also funktioniert leider nicht mehr. eine richtige anleitung wäre gut.

am besten ne anleitung mit allen dateien und pfade weil ich bin hier nach anleitung vorgegangen aber nix passiert
 
Zuletzt bearbeitet:

fraenK

Benutzer
Mitglied seit
22. Januar 2019
Beiträge
4
Punkte für Reaktionen
0
Punkte
1
@Heaven1976 Hast du auch diese Datei modifiziert?
Danke für das Update!

Man muss noch cloudflare4 in ddnsupdater2/etc/modules.json hinzufügen/aktivieren, richtig? Sonst erscheint es bei mir nicht in der Modul-Auswahl.

Ist folgende Zeile in der cloudflare4.pm korrekt? Erzeugt bei mir einen fehlerhaften Aufruf "name=domain.de.domain.de" -> "no dns record id found"
my $wantedname = $updatevars->{'tags'}->{'dnsrecordname'}.".".$updatevars->{'tags'}->{'domain'};
 

fraenK

Benutzer
Mitglied seit
22. Januar 2019
Beiträge
4
Punkte für Reaktionen
0
Punkte
1
I just got home today and gave the new cloudlfare4.pm file a try and these are the logs from today with proxied set to true or false.

2019/04/02 16:52:41 FAILED : updating emby, status: http:400
2019/04/02 16:52:41 WARNING : put for Plient::protocol::HTTPS is not officially supported yet at /volume1/@appstore/ddnsupdater2/sbin/../lib/Plient/Protocol.pm line 17.
2019/04/02 16:52:40 INFO : Force update of emby by user!
Did you find the reason for this HTTPS warning?
 
  AdBlocker gefunden!

Du bist nicht hier, um Support für Adblocker zu erhalten, denn dein Adblocker funktioniert bereits ;-)

Klar machen Adblocker einen guten Job, aber sie blockieren auch nützliche Funktionen.

Das Forum wird mit einem hohen technischen, zeitlichen und finanziellen Aufwand kostenfrei zur Verfügung gestellt. Wir zeigen keine offensive oder Themen fremde Werbung. Bitte unterstütze dieses Forum, in dem du deinen Adblocker für diese Seite deaktivierst.