carddav2fb - angepaßte Version

OK Fehleranzeige war aus.

der Fehler ist
Fatal error: Uncaught exception 'Exception' with message 'Woops, something's gone wrong! The CardDAV server returned the http status code 404.' in /home/www/remote/lib/CardDAV-PHP/carddav.php:285 Stack trace: #0 /home/www/remote/carddav2fb.php(99): carddav_backend->get() #1 /home/www/remote/carddav2fb.php(61): CardDAV2FB->get_carddav_entries() #2 {main} thrown in /home/www/remote/lib/CardDAV-PHP/carddav.php on line 285

Kann mir einer helfen?
 
Hi,

erst einmal vielen Dank für dieses Tool. Ich konnte es nach einer kleiner Modifikation mit dem Baikal-Server auf meinem Synology-NAS zum Laufen kriegen. Und zwar darf bei Baikal die vcf-Erweiterung nicht vorhanden sein (sonst kommt Fehler 404), daher habe ich eine Konfig-Option hinzugefügt.

Ausserdem habe ich noch den Teil mit der Ausgabe in eine Datei an den Anfang der Funktion upload_to_fb, denn ich wollte es vorab testen, ohne die Bilder auf die Fritzbox zu laden.

Code:
diff --git a/carddav2fb.php b/carddav2fb.php
index 4fd9b52..554f85c 100644
--- a/carddav2fb.php
+++ b/carddav2fb.php
@@ -143,6 +143,7 @@ class CardDAV2FB {
       print " " . $conf['url'] . PHP_EOL;
       $carddav = new CardDavPHP\CardDavBackend($conf['url']);
       $carddav->setAuth($conf['user'], $conf['pw']);
+      $carddav->setVcardExtension($conf['extension']);
       $xmldata =  $carddav->get();
 
       // identify if we received UTF-8 encoded data from the
@@ -409,6 +410,16 @@ class CardDAV2FB {
 
   public function upload_to_fb() {
 
+    // if the user wants to save the xml to a separate file, we do so now
+    if (array_key_exists('output_file',$this->config)) {
+      $output = fopen($this->config['output_file'], 'w');
+      if ($output) {
+        fwrite($output, $this->fbxml);
+        fclose($output);
+      }
+      return 0;
+    };
+
     // now we upload the photo jpgs first being stored in the
     // temp directory.
 
@@ -455,16 +466,6 @@ class CardDAV2FB {
     // close ftp connection
     ftp_close($conn_id);
 
-    // if the user wants to save the xml to a separate file, we do so now
-    if (array_key_exists('output_file',$this->config)) {
-      $output = fopen($this->config['output_file'], 'w');
-      if ($output) {
-        fwrite($output, $this->fbxml);
-        fclose($output);
-      }
-      return 0;
-    };
-
     // lets post the phonebook xml to the FRITZ!Box
     print " Uploading Phonebook XML" . PHP_EOL;
     try
diff --git a/config.example.php b/config.example.php
index 69f07ab..569b886 100644
--- a/config.example.php
+++ b/config.example.php
@@ -37,12 +37,15 @@ $config['carddav'][0] = array(
   'url' => 'https://raspserver/owncloud/remote.php/carddav/addressbooks/fritzbox/fb_contacts',
   // user name/password for CardDAV access
   'user' => 'oc_username',
-  'pw' => 'oc_password'
+  'pw' => 'oc_password',
+  // vcf extension
+  'extension' => '.vcf'
 );
 
 // second
 //$config['carddav'][1] = array(
 //  'url' => 'https://raspserver/owncloud/remote.php/carddav/addressbooks/fritzbox/fb_contacts_second',
 //  'user' => 'oc_username',
-//  'pw' => 'oc_password'
+//  'pw' => 'oc_password',
+//  'extension' => '.vcf'
 //);

Gruß,
Whoopie
 
erst einmal vielen Dank für dieses Tool. Ich konnte es nach einer kleiner Modifikation mit dem Baikal-Server auf meinem Synology-NAS zum Laufen kriegen. Und zwar darf bei Baikal die vcf-Erweiterung nicht vorhanden sein (sonst kommt Fehler 404), daher habe ich eine Konfig-Option hinzugefügt.

Ausserdem habe ich noch den Teil mit der Ausgabe in eine Datei an den Anfang der Funktion upload_to_fb, denn ich wollte es vorab testen, ohne die Bilder auf die Fritzbox zu laden.

[...]

Hallo und danke für deine Anpassungen die ich auch gerne übernehmen werde. Es wäre allerdings gut wenn du bitte auf Github einen entsprechenden pull request auslösen könntest statt das diff hier zu posten.
 
Ich habe keinen github-Account, sondern nur das git lokal geklont. Wäre es trotzdem möglich, die Änderungen zu übernehmen?
 
Ich habe keinen github-Account, sondern nur das git lokal geklont. Wäre es trotzdem möglich, die Änderungen zu übernehmen?

Ok, kein Problem. Hab deine Änderungen (nach kleiner Anpassung meinerseits) entsprechend übernommen in Github. Danke dafür.
 
Ich musste übrigens noch etwas in CardDAV-PHP ändern, damit die Exceptions funktionieren. Die Lösung hatte ich hier gefunden.

Code:
diff --git a/carddav.php b/carddav.php
index 47398a9..e5ef0b5 100644
--- a/carddav.php
+++ b/carddav.php
@@ -346,7 +346,7 @@ class CardDavBackend
                 }
         }
 
-        throw new Exception(
+        throw new \Exception(
             "Woops, something's gone wrong! The CardDAV server returned the http status code {$result['http_code']}.",
             self::EXCEPTION_WRONG_HTTP_STATUS_CODE_GET
         );
@@ -371,7 +371,7 @@ class CardDavBackend
                 return $result['response'];
         }
 
-        throw new Exception(
+        throw new \Exception(
             "Woops, something's gone wrong! The CardDAV server returned the http status code {$result['http_code']}.",
             self::EXCEPTION_WRONG_HTTP_STATUS_CODE_GET_VCARD
         );
@@ -412,7 +412,7 @@ class CardDavBackend
 
         }
 
-        throw new Exception(
+        throw new \Exception(
             "Woops, something's gone wrong! The CardDAV server returned the http status code {$result['http_code']}.",
             self::EXCEPTION_WRONG_HTTP_STATUS_CODE_GET_XML_VCARD
         );
@@ -473,7 +473,7 @@ class CardDavBackend
                 return true;
         }
 
-        throw new Exception(
+        throw new \Exception(
             "Woops, something's gone wrong! The CardDAV server returned the http status code {$result['http_code']}.",
             self::EXCEPTION_WRONG_HTTP_STATUS_CODE_DELETE
         );
@@ -500,7 +500,7 @@ class CardDavBackend
                 return $vcard_id;
         }
 
-        throw new Exception(
+        throw new \Exception(
             "Woops, something's gone wrong! The CardDAV server returned the http status code {$result['http_code']}.",
             self::EXCEPTION_WRONG_HTTP_STATUS_CODE_ADD
         );
@@ -518,7 +518,7 @@ class CardDavBackend
         try {
             return $this->add($vcard, $vcard_id);
         } catch (Exception $e) {
-            throw new Exception($e->getMessage(), self::EXCEPTION_WRONG_HTTP_STATUS_CODE_UPDATE);
+            throw new \Exception($e->getMessage(), self::EXCEPTION_WRONG_HTTP_STATUS_CODE_UPDATE);
         }
     }
 
@@ -536,7 +536,7 @@ class CardDavBackend
         try {
             $xml = new \SimpleXMLElement($response);
         } catch (Exception $e) {
-            throw new Exception(
+            throw new \Exception(
                 "The XML response seems to be malformed and can't be simplified!",
                 self::EXCEPTION_MALFORMED_XML_RESPONSE,
                 $e
@@ -721,7 +721,7 @@ class CardDavBackend
 
             return $vcard_id;
         } catch (Exception $e) {
-            throw new Exception($e->getMessage(), self::EXCEPTION_COULD_NOT_GENERATE_NEW_VCARD_ID);
+            throw new \Exception($e->getMessage(), self::EXCEPTION_COULD_NOT_GENERATE_NEW_VCARD_ID);
         }
     }
 
Ich musste übrigens noch etwas in CardDAV-PHP ändern, damit die Exceptions funktionieren. Die Lösung hatte ich hier gefunden.

Code:
[...]

Danke auch für diese Anpassung. Habe Sie entsprechend integriert (https://github.com/jens-maus/CardDAV-PHP/commit/6c7bbadbb40c14933c5419cba347a7f012f0f590).

Wenn du aber in Zukunft weitere Änderungen machst wäre es wirklich einfacher du legst dir nen Github account zu und sendet entsprechende pull requests.
 
Hallo,

ich gebe meine Kontakte über ein Android Smartphone ein und synce dann per carddav sync auf einen Baikal Server auf einer Synology NAS.

Beim Aufruf vom Sync Script für die Fritzbox bekomme ich dann folgende Meldung:

Notice: Undefined variable: argc in /volume2/web/carddav2fb/carddav2fb.php on line 26 Get all entries from CardDAV server(s)... Done. Transform to FritzBox XML File... Done. Upload to fritzbox at fritz.box...Done. FritzBox: FRITZ!Box Telefonbuch wiederhergestellt


Trotz der Fehlermeldung am Anfang scheint es zu funktionieren. Leider werden aber nur die Telefonnummern übertragen und keine Email Adressen.
Liegt das an der Fehlermeldung oder läuft da sonst was schief. Hat jemand eine Idee wie sich das beheben lässt?


Mfg, Apropo

Edit:

Die Telefonnummern werden auch nicht richtig zugeordnet. Festnetz, Mobil usw. werden durcheinander geschmissen.
 
Zuletzt bearbeitet:
Bei mir funktioniert die Git-Version leider nicht. Ich erhalte folgende Fehlermeldung:
Code:
Response of login call to /login_sid.lua in initSID was not xml-formatted

Die Version, die im ersten Post verlinkt ist, funktioniert aber glücklicherweise. Allerdings hätte ich noch einen Verbesserungsvorschlag: Könnte man nicht die jeweils letzte xml-Datei aufheben und dann z.B. mit md5sum überprüfen, ob es überhaupt Änderungen gegeben hat bevor wieder alles übertragen wird?
 
Wenn du aber in Zukunft weitere Änderungen machst wäre es wirklich einfacher du legst dir nen Github account zu und sendet entsprechende pull requests.

Kurze Frage an dich Damato,

wie bekomme ich das komma zwischen Nach- und Vorname weg? Leider sind meine bisherigen versuche gescheitert es an zu passen. Ggf. könntest du weiterhelfen :)
Danke im Voraus

Gruß
BC
 
Zuletzt bearbeitet:
initSID was not xml-formatted

Bei mir funktioniert die Git-Version leider nicht. Ich erhalte folgende Fehlermeldung:
Code:
Response of login call to /login_sid.lua in initSID was not xml-formatted

Die Version, die im ersten Post verlinkt ist, funktioniert aber glücklicherweise.

Hallo SirTux,

mir geht es genauso beim remote login auf eine Box. Lokal funktioniert alles prima.
Betrifft das bei dir auch nur remote?

Welche Version meinst du, die funktionieren soll? Die aus dem ersten Post in diesem Thread?
 
mir geht es genauso beim remote login auf eine Box. Lokal funktioniert alles prima.
Betrifft das bei dir auch nur remote?

Du meinst es funktioniert, wenn man das Script direkt auf der FritzBox laufen läßt? Dies habe ich jedenfalls nicht getestet. Ich lasse es auf dem Owncloud-Server laufen.

Welche Version meinst du, die funktionieren soll? Die aus dem ersten Post in diesem Thread?

Genau die ja.
 
Du meinst es funktioniert, wenn man das Script direkt auf der FritzBox laufen läßt? Dies habe ich jedenfalls nicht getestet. Ich lasse es auf dem Owncloud-Server laufen.

Nein, ich meine es so, wie bei dir. Das Script läuft auf dem Büroserver, auf dem sich auch Owncloud befindet und greift erfolgreich auf die lokale Fritzbox zu.
Möchte ich aber eine andere config verwenden, um z.B. auf die Fritzbox daheim ein Telefonbuch hochzuladen, schlägt es mit o.g. Fehler fehl.
 
Das ist seltsam. Bei mir laufen die zwar in unterschiedlichen Subnetzen, aber der Zugriff erfolgt ja dennoch "lokal".
 
Tatsächlich, das erste Script läuft durch. Allerdings nur über die interne IP der entfernten Box via VPN. Der Login von außen scheitert, sowohl via IP als auch via DNS.
 
Hallo,

erst mal vielen Dank für das Script. Bin endlich mal dazu gekommen es zu installieren,
und nun einen Schritt weiter im Bestreben auf konsistente Adressbücher auf allen Systemen/Geräten.
(Eine Schande, dass AVM es nicht schafft einen nativen CardDav-Import auf der Fritzbox zu implementieren..)

Allerdings habe ich hier das selbe Problem wie Sir Tux:
Code:
Response of login call to /login_sid.lua in initSID was not xml-formatted
...wenn ich die Git-Version verwende.
Die Meldung kommt nach dem Hochladen der Bilder (was offenbar noch klappt,
denn die liegen danach im FTP-Verzeichnis).
Dann kommt " Uploading Phonebook XML" und danach der Error.
Es landen keine Kontakte im Telefonbuch.

Ich habe dann die Version aus dem ersten Post versucht,
damit geht es tatsächlich, die Kontakte landen im Fritz-Telefonbuch,
allerdings habe ich dort beim Import auch Fehlermeldungen:

Code:
PHP Warning:  in_array() expects parameter 2 to be array, string given in /home/uw/carddav/carddav2fb.php on line 152
PHP Warning:  in_array() expects parameter 2 to be array, string given in /home/uw/carddav/carddav2fb.php on line 155
PHP Warning:  in_array() expects parameter 2 to be array, string given in /home/uw/carddav/carddav2fb.php on line 158
(mehrfach)

Der Server, auf dem das Script läuft und die Fritzbox sind bei mir im gleichen Subnetz,
Fritzbox ist 7430 mit V6.26...
 
Das es per Login von aussen nicht funktioniert,
scheint damit zusammen zu hängen,
dass die Fritzbox für die Zugriffe von aussen ein anderes Login-Verfahren benutzt.

Dafür ist in der Fritzbox Api Conf (fritzbox_user.conf.php)
folgendes vorgesehen:
# if needed, enable remote config here
#$this->config->setItem('enable_remote_config', true);
#$this->config->setItem('remote_config_user', 'test');
#$this->config->setItem('remote_config_password', 'test123');

aber so wie ich das sehe, kann man das in der config.php nicht setzen....

Leider löst das mein Problem nicht, ich logge mich nicht remote ein, sondern lokal.
Immerhin habe ich rausgefunden, dass es trotzdem wohl ein Login-Problem ist.
Die Fehlermeldung bezieht sich wohl nicht auf die Phonebook.xml-Datei, wie ich dachte,
sondern auf eine Datei, die die Fritzbox-API von der Fritzbox zieht, um die SID zu ermiiteln.
Diese Datei scheint bei mir leer zu sein... :(
 
so - hier noch schnell die Auflösung des Rätsels:

das Problem lag zunächst mal darin, dass bei mir login_sid.lua folgendes zurück geliefert hat:
Code:
<SessionInfo>
  <SID>0000000000000000</SID>
  <Challenge>a18f0760</Challenge>
  <BlockTime>0</BlockTime>
  [B]<Rights/>[/B]
  </SessionInfo>
und das ist keine gültige XML Datei, da hier eindeutig der Knoten "<Rights/>" nicht syntaktisch korrekt ist.
Wird wohl ein Bug in der 6.26 auf meiner 7430 sein. Muss ich mal an AVM melden.

Nachdem ich die XML-Prüfung in der Fritbox-Api erst mal entschärft habe, gabs dann noch ein hold-up mit
nicht akzeptiertem self-signed SSL certficate, dass ich gelöst habe, indem ich das Certificate mit
Chrome runtergeladen habe, nach /usr/local/share/ca-certificates/ kopiert und mit
Code:
sudo update-ca-certificates
meinem Server bekannt gemacht habe.

Jetzt läuft der Import...
 
Seit der Umstellungen des Login-Verfahrens bei g00gle konnte meine Fritzbox die Telefonbücher nicht mehr importieren, in 6.05 ist das Zweischrittverfahren noch nicht drin und für meine 7270 gibt's keine neuere Firmware. Deshalb hab ich unlängst die Version von damato installiert und die hat fast auf Anhieb funktioniert. Erst hat git clone keine Dateien aus den Unterverzeichnissen gezogen, aber das lies sich korrigieren.

Dann bekam ich auch Login-Fehler, ich weiß nicht mehr wie die Meldungen genau waren. Der Fehler war, ich hatte die IP-Adresse der FritzBox eingetragen. Die Login API hat aber eine Funktion, die alles andere als "fritz.box" als Remote-Login interpretiert. Deshalb habe ich meinem Pi fritz.box über die /etc/hosts bekannt gemacht und das so in der config eingetragen, seitdem funktioniert das einwandfrei.

FB 7270 mit 6.05, Baikal lokal auf dem Pi, auf dem auch das Skript läuft. Lokaler Login ist bei mir auf "nur mit FritzBox Kennwort" eingestellt.

@SirTux, wenn Du mal die komplette Ausgabe des Skriptaufrufs postest, kann man vielleicht erschließen, wo genau das Problem liegt. Die Meldungen sind nicht immer wirklich aufschlussreich, aber wenn man die Notice und Warnings von PHP berücksichtigt, kommt man recht schnell dahinter, wo es klemmt.

[OT]Ich hab das Skript übrigens noch so umgebastelt, dass es eine FB-taugliche XML von meinem Webhoster runterlädt, die dort aus einer MySQL-DB erzeugt wird. Wenn ich jetzt dann mal Zeit habe, kommt noch eine dritte Version zum Einsatz, die die Kontakte direkt von g00gle einlesen wird. g00gle2fb ist mittlerweile auch in Betrieb.[/OT]
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.