{"id":615,"date":"2017-11-08T02:27:18","date_gmt":"2017-11-08T02:27:18","guid":{"rendered":"http:\/\/blog.datentraeger.li\/?p=615"},"modified":"2018-03-22T09:32:38","modified_gmt":"2018-03-22T09:32:38","slug":"card-und-caldav-im-terminal","status":"publish","type":"post","link":"https:\/\/blog.datentraeger.li\/?p=615","title":{"rendered":"Card- und CalDAV im terminal"},"content":{"rendered":"<p>Um&#8217;s grad vorweg zu nennen: Vieles hier hab ich von <a href=\"https:\/\/blog.florianheinle.de\/kalender-und-kontakte-kommandozeile\" target=\"_blank\" rel=\"noopener\">Florian Heinle&#8217;s Blog<\/a> abgeschaut, welchen ich beim initialen Testen als erste Anlaufstelle verwendet hab. Im Gegensatz zu ihm hab ich aber die Debian-Packages verwendet.<\/p>\n<p>Wie&#8217;s halt so ist, h\u00e4tte ich das gern bei mir selbst dokumentiert.<\/p>\n<p>Als erstes monitiert man mal die Packages <a href=\"https:\/\/packages.debian.org\/search?suite=all&amp;section=all&amp;arch=any&amp;searchon=names&amp;keywords=khard\" target=\"_blank\" rel=\"noopener\">khard<\/a>, <a href=\"https:\/\/packages.debian.org\/search?keywords=khal&amp;searchon=names&amp;suite=all&amp;section=all\" target=\"_blank\" rel=\"noopener\">khal<\/a> und <a href=\"https:\/\/packages.debian.org\/search?suite=all&amp;section=all&amp;arch=any&amp;searchon=names&amp;keywords=vdirsyncer\" target=\"_blank\" rel=\"noopener\">vdirsyncer<\/a>.<\/p>\n<h2>Sync einrichten<\/h2>\n<p>~\/.config\/vdirsyncer\/config (siehe auch <a href=\"https:\/\/vdirsyncer.pimutils.org\/en\/stable\/tutorial.html#configuration\" target=\"_blank\" rel=\"noopener\">vdirsyncer Tutorial<\/a>)<\/p>\n<pre class=\"lang:sh decode:true\"># Move it to ~\/.vdirsyncer\/config or ~\/.config\/vdirsyncer\/config and edit it.\r\n# Run `vdirsyncer --help` for CLI usage.\r\n#\r\n# Optional parameters are commented out.\r\n# This file doesn't document all available parameters, see\r\n# http:\/\/vdirsyncer.readthedocs.org\/ for the rest of them.\r\n\r\n[general]\r\n# A folder where vdirsyncer can store some metadata about each pair.\r\n# pfad gequotet... https:\/\/github.com\/pimutils\/vdirsyncer\/issues\/645\r\nstatus_path = \"~\/.vdirsyncer\/status\/\"\r\n\r\n#Kontakte\r\n[pair privat_kontakte]\r\na = \"privat_kontakte_lokal\"\r\nb = \"privat_kontakte_remote\"\r\ncollections = [\"from a\", \"from b\"]\r\n\r\n[storage privat_kontakte_lokal]\r\ntype = \"filesystem\"\r\npath = \"~\/.pim\/contacts\"\r\nfileext = \".vcf\"\r\n\r\n[storage privat_kontakte_remote]\r\ntype = \"carddav\"\r\nurl = \"https:\/\/mail.foo.bar\/SOGo\/dav\/peter@foo.bar\/Contacts\/personal\/\"\r\nusername = \"peter@foo.bar\"\r\npassword = \"password\"\r\nauth = \"basic\"\r\n\r\n#Kalender\r\n[pair privat_kalender]\r\na = \"privat_kalender_lokal\"\r\nb = \"privat_kalender_remote\"\r\ncollections = [\"from a\", \"from b\"]\r\nmetadata = [\"color\"]\r\n\r\n[storage privat_kalender_lokal]\r\ntype = \"filesystem\"\r\npath = \"~\/.pim\/calendars\/\"\r\nfileext = \".ics\"\r\n\r\n[storage privat_kalender_remote]\r\ntype = \"caldav\"\r\nurl = \"https:\/\/mail.foo.bar\/SOGo\/dav\/peter@foo.bar\/Calendar\/personal\/\"\r\nauth = \"basic\"\r\nusername = \"peter@foo.bar\"\r\npassword = \"password\"<\/pre>\n<h3>initiale Konfiguration<\/h3>\n<p>Dies ist nur einmalig n\u00f6tig, oder falls neue Kalender- bzw. Kontakte-Folder hinzugef\u00fcgt werden.<\/p>\n<pre class=\"lang:sh decode:true\">peter@jessie:~$ vdirsyncer discover\r\nDiscovering collections for pair privat_kontakte\r\nprivat_kontakte_lokal:\r\nprivat_kontakte_remote:\r\n  - \"personal\" (\"Personal Address Book\")\r\nwarning: No collection \"personal\" found for storage privat_kontakte_lokal.\r\nShould vdirsyncer attempt to create it? [y\/N]: y\r\nSaved for privat_kontakte: collections = [\"personal\"]\r\nDiscovering collections for pair privat_kalender\r\nprivat_kalender_lokal:\r\nprivat_kalender_remote:\r\n  - \"personal\" (\"Personal Calendar\")\r\nwarning: No collection \"personal\" found for storage privat_kalender_lokal.\r\nShould vdirsyncer attempt to create it? [y\/N]: y\r\nSaved for privat_kalender: collections = [\"personal\"]\r\npeter@jessie:~$ vdirsyncer metasync\r\nMetasyncing privat_kontakte\/personal\r\nMetasyncing privat_kalender\/personal\r\nCopying color to privat_kalender_lokal\/personal<\/pre>\n<p>Nun kann der Sync durchgef\u00fchrt werden<\/p>\n<pre class=\"lang:sh decode:true\">vdirsyncer sync<\/pre>\n<p>mit vdirsyncer -vdebug sync kann man sich mehr Details beim Sync anzeigen lassen.<\/p>\n<h3>Cron f\u00fcr automatischen Sync<\/h3>\n<p>Da man in der Regel nicht gern st\u00e4ndig manuell erst einen Sync macht, damit man up-to-date ist, richtet man am schlausten einen simplen cron ein. Ich mach&#8217;s alle 5 Minuten.<\/p>\n<pre class=\"lang:sh decode:true \">*\/5 * * * * \/usr\/bin\/vdirsyncer sync<\/pre>\n<h2>Kontakte mit khard<\/h2>\n<p>Beim ersten Start wird gleich reklamiert, wenn das Config nicht vorhanden ist<\/p>\n<pre class=\"lang:sh decode:true \">peter@peanut:~$ khard\r\nConfig file \/home\/peter\/.config\/khard\/khard.conf not available<\/pre>\n<p>Also kopieren wir am einfachsten mal die Beispielconfig her und passen dort die Pfade entsprechend an<\/p>\n<pre class=\"lang:sh decode:true \">mkdir ~\/.config\/khard\/\r\ncp \/usr\/share\/doc\/khard\/examples\/khard\/khard.conf.example ~\/.config\/khard\/khard.conf<\/pre>\n<h3>Usage<\/h3>\n<p>Mit &#8216;khard ls &lt;suchbegriff&gt;&#8217; kann man recht bequem Kontakte suchen. verwendet man &#8216;details&#8217;, werden alle Informationen zum Kontakt angezeigt.<\/p>\n<pre class=\"lang:sh decode:true \">peter@peanut:~$ khard ls peter\r\nAddress book: personal\r\nIndex    Name                Phone                        E-Mail                          UID                 \r\n1        Peter ABC                                        work: peter.abc@example.com     C6B7BE55-01         \r\n2        Peter Beck          cell: +41 xx xx xxx xx xx    home: peter@foobar.com          5E6                 \r\n...<\/pre>\n<p>Der Parameter &#8216;&#8211;help&#8217; zeigt alle weiteren ben\u00f6tigten Parameter an. Recht selbsterkl\u00e4rend.<\/p>\n<h3>Integration in mutt<\/h3>\n<p>Mit dieser Erg\u00e4nzung in .muttrc kann man Adressen mit dem Tabulator vervollst\u00e4ndigen und khard sehr bequem mit Mutt verwenden.<\/p>\n<pre class=\"lang:sh decode:true \">set query_command= \"khard email --parsable --search-in-source-files %s\"\r\nbind editor &lt;Tab&gt; complete-query\r\nbind editor ^T    complete\r\nmacro index,pager A \\\r\n    \"&lt;pipe-message&gt;khard add-email&lt;return&gt;\" \\\r\n        \"add the sender email address to khard\"<\/pre>\n<p>Zudem kann man mit &#8216;A&#8217; Adressen als neue Kontakte hinzuf\u00fcgen (in der Auflistung der Mails oder wenn das entsprechende Mail ge\u00f6ffnet wurde).<\/p>\n<h2>Kalender mit khal<\/h2>\n<p>Die Konfiguration von khal ist recht simpel, einfach die gew\u00fcnschen Kalender, die wir in vdirsyncer definiert haben, angeben in .config\/khal\/config und schon l\u00e4uft das Teil (inital etwas l\u00e4nger, was ja verst\u00e4ndlich ist). Der muss wohl einfach wissen, wo er die ics-Files zu suchen hat.<\/p>\n<pre class=\"lang:default decode:true \">[calendars]\r\n\r\n[[calendars]]\r\npath = ~\/.pim\/calendars\/*\r\ntype = discover<\/pre>\n<p>Um nur schnell die aktuellen Termine anzuzeigen, reicht es aus, einfach &#8216;khal&#8217; einzugeben.<\/p>\n<p>M\u00f6chte man Termine anlegen \/ bearbeiten, startet man &#8216;ikhal&#8217;. Mit &#8216;?&#8217; kann man die wichtigsten Tasten anzeigen. Der Rest ist recht selbsterkl\u00e4rend, finde ich.<\/p>\n<h3>commands<\/h3>\n<p>Anstatt via ikhal kann man aber auch direkt via commanline einen Termin setzen, z.B.:<\/p>\n<pre class=\"lang:sh decode:true \">khal -a personal new 08.11. 19:30 19:35 Test via cli :: das ist ein test<\/pre>\n<p>ganzt\u00e4gige Termine gibt man einfach ohne Zeitangabe an<\/p>\n<pre class=\"lang:default decode:true\">khal new -a personal 19.11. Abflug Ferien<\/pre>\n<p>mit der &#8220;-a&#8221;-Option kann der entsprechende Kalender gew\u00e4hlt werden. Das ganze wird nach diesem Schema abgesetzt:<\/p>\n<pre class=\"lang:default decode:true \">Usage: khal new [OPTIONS] [START [END | DELTA] [TIMEZONE] [SUMMARY] [::DESCRIPTION]]\r\n<\/pre>\n<p>Die wichtigsten Optionen hier sind:<\/p>\n<div id=\"id1\" class=\"section\">\n<ul class=\"simple\">\n<li><strong>-l, \u2013location=LOCATION<\/strong> Ort festlegen<\/li>\n<li><strong>-g, \u2013categories=CATEGORIES<\/strong> kommagetrennte Liste von Kategoriern. Einige Server unterst\u00fctzen nicht mehrere Kategorien&#8230;<\/li>\n<li><strong>-r, \u2013repeat=RRULE<\/strong> Ereignis-Wiederholung. Erlaubte Werte sind <cite>daily<\/cite>, <cite>weekly<\/cite>, <cite>monthly<\/cite> und <cite>yearly<\/cite><\/li>\n<li><strong>-u, \u2013until=UNTIL<\/strong> spezifizieren, wie lange das Ereignis dauern soll<\/li>\n<li><strong>\u2013alarm DURATION<\/strong> Erinnerung vor dem Start des Ereignisses, <em>sollte etwa so aussehen<\/em> <cite>1day 10minutes<\/cite> oder <cite>1d3H10m<\/cite>, negative <em>Werte<\/em> starten nach dem Start des Ereignis.<\/li>\n<\/ul>\n<h4>weitere Beispiele<\/h4>\n<pre class=\"lang:default decode:true\">khal new 18:00 Awesome Event<\/pre>\n<\/div>\n<p>Ereignis heute um 18 Uhr mit Standardzeit von 1 Stunde im Standardkalender<\/p>\n<pre class=\"lang:default decode:true \">khal new tomorrow 16:30 Kaffeepause<\/pre>\n<p>Ereignis morgen um 16:30<\/p>\n<pre class=\"lang:default decode:true \">khal new 25.10. 18:00 24:00 Another Event :: with Alice and Bob<\/pre>\n<p>adds a new event on 25th of October lasting from 18:00 to 24:00 with an additional description<\/p>\n<pre class=\"lang:default decode:true \">khal new -a work 26.07. Great Event -g meeting -r weekly<\/pre>\n<p>Ein ganzt\u00e4giges Ereignis am 26. Juli im Kalender &#8220;work&#8221;, welches w\u00f6chentlich wiederholt wird.<\/p>\n<pre class=\"lang:default decode:true \">khal new 13:30 Meeting :: test --alarms 10minutes<\/pre>\n<p>Ein Meeting um 13:30 mit einem Reminder 10 Minuten davor.<\/p>\n<p>Detailliertere Informationen findet man beispielsweise <a href=\"https:\/\/khal.readthedocs.io\/en\/latest\/usage.html\" target=\"_blank\" rel=\"noopener\">hier<\/a>.<\/p>\n<h3>Android \/ EAS<\/h3>\n<p>Wenn ich Kontakte in khal anlege, werden die wunderbar zum Server synchronisiert, auch Thunderbird und Webmail zeigen alles an. Jedoch motzt mein Android, welches via EAS verbunden ist, dass es nicht synchronisieren konnte.<\/p>\n<p><del>Ob das nun ein EAS, SOGo oder khal-Problem ist, ist mir nicht ganz klar. Ich tendiere, dass es mit EAS etwas zu tun hat, sonst w\u00fcrde TB und das Webmail ja auch nix anzeigen\/motzen. Muss mal CalDAV am Handy einrichten und damit testen.<\/del><\/p>\n<p>EDIT: Hab heute grad mal DAVdroid montiert &#8211; mittels Card- \/ CalDAV bestehen absolut keine Probleme mit dem Sync auf Android&#8230;.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"Um&#8217;s grad vorweg zu nennen: Vieles hier hab ich von Florian Heinle&#8217;s Blog abgeschaut, welchen ich beim initialen Testen als erste Anlaufstelle verwendet hab. Im Gegensatz zu ihm hab ich aber die Debian-Packages verwendet. Wie&#8217;s halt so ist, h\u00e4tte ich das gern bei mir selbst dokumentiert. Als erstes monitiert man&hellip;\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[36,4,23,9],"tags":[],"class_list":["post-615","post","type-post","status-publish","format-standard","hentry","category-cli","category-debiangnu-linux","category-groupware","category-it"],"_links":{"self":[{"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/posts\/615","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=615"}],"version-history":[{"count":26,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/posts\/615\/revisions"}],"predecessor-version":[{"id":1297,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/posts\/615\/revisions\/1297"}],"wp:attachment":[{"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=615"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=615"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=615"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}