{"id":932,"date":"2020-05-03T23:33:15","date_gmt":"2020-05-03T21:33:15","guid":{"rendered":"https:\/\/benedikt-merz.de\/Blog\/?p=932"},"modified":"2020-05-03T23:36:23","modified_gmt":"2020-05-03T21:36:23","slug":"twinkle-telefonbuch-und-carddav","status":"publish","type":"post","link":"https:\/\/benedikt-merz.de\/Blog\/?p=932","title":{"rendered":"Twinkle-Telefonbuch und CardDav"},"content":{"rendered":"\n<p>Um am PC \u00fcber das Festnetz zu telefonieren verwende ich das Linux-Programm Twinkle. Es ist so konfiguriert, dass es auf die FritzBox als VoIP-Telefon zugreift.<\/p>\n\n\n\n<p>Was mir bis jetzt gefehlt hat, war ein Zugriff von Twinkle auf meine Kontakte im Nextcloud. Mit vdirsyncer und einem kleinen Skript klappt dies jetzt auch.<\/p>\n\n\n\n<p>Hier eine kurze Anleitung.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">vdirsyncer<\/h2>\n\n\n\n<p>Um die Kontakte lokal als .vcf-Datei auf meinen Rechner zu bekommen, nutze ich vdirsyncer. Die Installation ist bei den meisten Linux-Distributionen mit<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt-get install vdirsyncer<\/code><\/pre>\n\n\n\n<p>schnell erledigt. Anschlie\u00dfend muss die Konfiguration in der Datei ~\/.config\/vdirsyncer\/config angelegt werden. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;general]\nstatus_path = \"~\/.vdirsyncer\/status\/\"\n\n&#91;pair kontakte]\na = \"kontakte_lokal\"\nb = \"kontakte_remote\"\ncollections = &#91;\"from a\", \"from b\"]\n\n&#91;storage kontakte_lokal]\ntype = \"filesystem\"\npath = \"~\/.pim\/contacts\"\nfileext = \".vcf\"\n\n&#91;storage kontakte_remote]\ntype = \"carddav\"\nurl = \"https:\/\/SERVER\"\nauth = \"basic\"\nusername = \"USER\"\npassword = \"PASSWORT\"\nread_only = true<\/code><\/pre>\n\n\n\n<p>\u00dcber pair werden die lokalen mit den Server-Kontakten zur Synchronisation verkn\u00fcpft. Die storage-Eintr\u00e4ge legen den Speicherort und den Zugriff darauf fest. Um sicher zu gehen, dass die Kontakte auf dem Server nicht \u00fcberschrieben werden, habe ich sie mit &#8222;read_only&#8220; versehen.<\/p>\n\n\n\n<p>Falls der Server ein selbst-signiertes Zertifikat verwendet, kann man \u00fcber den verify_fingerprint die Zertifikatspr\u00fcfung umgehen.<\/p>\n\n\n\n<p><a rel=\"noreferrer noopener\" href=\"https:\/\/vdirsyncer.pimutils.org\/en\/stable\/index.html\" target=\"_blank\">Hier<\/a> gibt es eine detaillierte Beschreibung von vdirsyncer.<\/p>\n\n\n\n<p>Vor der Synchronisation l\u00e4sst man \u00fcber<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vdirsyncer discover<\/code><\/pre>\n\n\n\n<p>den Server nach Adressb\u00fcchern durchsuchen. Bei erstmaliger Ausf\u00fchrung muss man best\u00e4tigen, dass das oder die Adressb\u00fccher lokal angelegt werden.<\/p>\n\n\n\n<p>Die eigentliche Synchronisation startet man mit dem Befehl<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vdirsyncer sync<\/code><\/pre>\n\n\n\n<p>Nun liegen die Kontakte lokal unter ~\/.pim\/contacts\/&lt;name_des_adressbuchs>\/ als .vcf-Dateien.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Erstellen des Twinkle-Adressbuchs<\/h2>\n\n\n\n<p>Das Adressbuch von Twinkle ist in der Datei ~\/.twinkle\/twinkle.ab zu finden. Jede Zeile stellt einen Eintrag dar.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># first_name|infix_name|last_name|sip_address|remark<\/code><\/pre>\n\n\n\n<p>F\u00fcr das Parsen der .vcf-Dateien und das Erstellen der Adressbuch-Datei habe ich mir ein kleines Skript erstellt.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n# Ermittelt Vorname und Nachname in einer vcf-Datei, die als Parameter \u00fcbergeben wird\nfunction finde_name() {\n datei_suche=$1\n nachname_gefunden=`awk -F: '{ if ($1==\"N\") {print $2}}' $datei_suche | head -1 | cut -d';' -f 1|tr -d \"\\015\"`\n vorname_gefunden=`awk -F: '{ if ($1==\"N\") {print $2}}' $datei_suche | head -1 | cut -d';' -f 2|tr -d \"\\015\"`\n}\n\n# Holen der vcf-Dateien vom Server\nvdirsyncer sync\n\n# Datei-Aufbau als erste Zeile schreiben\necho '# first_name|infix_name|last_name|sip_address|remark' > ~\/.twinkle\/twinkle.ab\n\n# Durch alle vcf-Dateien laufen\nfor file in $(ls ~\/.pim\/contacts\/contacts\/*.vcf); do\n # Vor- und Nachname finden\n finde_name \"$file\"\n # Alle Telefonnummern suchen\n for nummer_gefunden in $(awk -F\\; '{ if ($1==\"TEL\") {print $2 $3}}' $file | cut -d':' -f 2|tr -d &#91;:blank:]|tr -d \"\\015\"); do\n  # Jede Telefonnummer als einzelnen Eintrag in das Telefonbuch schreiben\n  echo \"$vorname_gefunden||$nachname_gefunden|sip:$nummer_gefunden@fritz.box|\" >> ~\/.twinkle\/twinkle.ab\n done\ndone<\/code><\/pre>\n\n\n\n<p>Zum Ermitteln des Kontakt-Namens verwendet das Skript den Eintrag N in der vcf-Datei. Dies entspricht dem detaillierten Namen. Der &#8222;friendly name&#8220; FN in den Kontakten wird ignoriert.<\/p>\n\n\n\n<p>In der Zeile, in der der Adressbucheintrag geschrieben wird, muss fritz.box gegebenenfalls durch den Sip-Server ersetzt werden.<\/p>\n\n\n\n<p>Achtung! Das Skript \u00fcberschreibt beim Ausf\u00fchren das Twinkle-Adressbuch.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Um am PC \u00fcber das Festnetz zu telefonieren verwende ich das Linux-Programm Twinkle. Es ist so konfiguriert, dass es auf die FritzBox als VoIP-Telefon zugreift. Was mir bis jetzt gefehlt hat, war ein Zugriff von Twinkle auf meine Kontakte im Nextcloud. Mit vdirsyncer und einem kleinen Skript klappt dies jetzt auch. Hier eine kurze Anleitung.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[101,102,99,100,103],"class_list":["post-932","post","type-post","status-publish","format-standard","hentry","category-technik","tag-carddav","tag-linux","tag-twinkle","tag-vdirsyncer","tag-voip"],"_links":{"self":[{"href":"https:\/\/benedikt-merz.de\/Blog\/index.php?rest_route=\/wp\/v2\/posts\/932","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/benedikt-merz.de\/Blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/benedikt-merz.de\/Blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/benedikt-merz.de\/Blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/benedikt-merz.de\/Blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=932"}],"version-history":[{"count":4,"href":"https:\/\/benedikt-merz.de\/Blog\/index.php?rest_route=\/wp\/v2\/posts\/932\/revisions"}],"predecessor-version":[{"id":936,"href":"https:\/\/benedikt-merz.de\/Blog\/index.php?rest_route=\/wp\/v2\/posts\/932\/revisions\/936"}],"wp:attachment":[{"href":"https:\/\/benedikt-merz.de\/Blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=932"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/benedikt-merz.de\/Blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=932"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/benedikt-merz.de\/Blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=932"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}