Texte

Vdirsyncer pour synchroniser CalDAV & CardDAV sur votre poste

Si comme moi, vous avez un serveur comme Baïkal pour gérer vos contacts et vos agendas, vous vous demandez peut-être comment les synchroniser sur votre ordinateur sans utiliser une application comme Thunderbird ou Évolution…

Eh bien, récemment, j'ai découvert Vdirsyncer. Une application en ligne de commande, qui sert justement à ça. C'est l'équivalent CardDAV / CalDAV de ce qu'est OfflineIMAP ou Isync pour les boîtes courriels.

Vdirsyncer se connecte à une source distante pour importer, puis synchroniser les données en local. Les événement de votre calendrier sont par exemple, importés au format standard iCalendar (.ics). Tandis que les contacts sont des fichiers vCard (.vcf). D'autres formats sont aussi disponibles.

Si vous avez un téléphone Android, vous connaissez peut-être DAVx5, qui fait à peu près la même chose.

Des paquets d'installation sont disponibles pour les principales distributions GNU/Linux, ainsi que pour Mac OS, NetBSD, etc. Sinon, installer directement avec les gestionnaires de paquets pour python pipx ou pip.

Pour moi, c'est sous OpenBSD avec pkg_add:

doas pkg_add -v vdirsyncer

Exemple de configuration

D'abord dans votre $HOME, il faut créer le répertoire et fichier de configuration de vdirsyncer:

mkdir .vdirsyncer/ && touch .vdirsyncer/config

Puis les répertoires qui acueilleront les fichiers iCalendar et vCard:

mkdir -p .calendars/nomducalendrier/

mkdir -p .contacts/nomducarnet/

Bloc CalDAV

[general]
status_path = "~/.vdirsyncer/status/"

# -------
# CALDDAV
# -------

[pair my_calendar]
a = "my_calendar_local"
b = "my_calendar_remote"
collections = ["from a", "from b"]

[storage my_calendar_local]
type = "filesystem"
path = "~/.calendars/"
fileext = ".ics"

[storage my_calendar_remote]
type = "caldav"
auth = "digest"
url = "https://monserveur.com/baikal/dav.php/calendars/mon_id/nom_du_calendrier/"
username = "mon_id"
password.fetch = ["command", "~/get-mdp-dav"]

Dans la section [general], il faut ajouter la propriétée status_path. Le dossier status contient des fichiers qui serviront aux métadonnées de synchronisation. Vous n'avez pas besoin de le créer, l'application s'en charge.

La section [pair ...] elle, décrit certaines relations ou comportement qui serviront à la découvrabilité et la synchronisation.

Ensuite les deux autres sections sont pour les paramètres des stockages local et distant.

Pour Baikal je devais renseigner la propriété optionnelle auth, dans votre cas cela ne sera peut-être pas nécessaire. À vérifier.

Et finalement, plutôt que mettre le mot de passe en claire dans le fichier de configuration, j'utilise password.fetch, pour exécuter un script shell qui va récupérer mon mot de passe stocker quelque part sur ma machine:

password.fetch = ["command", "~/get-mdp-dav"]

Une fois que votre configuration vous semble au point, il vous reste à la tester en lançant la commande discover, comme ceci:

vdirsyncer discover

Et si par bonheur vous n'avez aucune erreur, alors il est temps de synchroniser vos données:

vdirsyncer sync

Bloc CardDAV

Bon, pour les carnets d'adresses c'est sensiblement la même chose. Il vous suffit de mettre les bons identifiants et les bons chemins:

# -------
# CARDDAV
# -------

[pair my_contacts]
a = "my_contacts_local"
b = "my_contacts_remote"
collections = ["from a", "from b"]
metadata = ["hs"]

[storage my_contacts_local]
type = "filesystem"
path = "~/.contacts/"
fileext = ".vcf"

[storage my_contacts_remote]
type = "carddav"
auth = "digest"
url = "https://monserveur.com/baikal/dav.php/addressbooks/mon_id/moncarnet/"
username = "mon_id"
password.fetch = ["command", "~/get-mdp-dav"]

Comme tout à l'heure, vous devenez lancer un vdirsyncer discover et un vdirsyncer sync, lorsque votre configuration est au point.

Synchroniser à l'heure

À l'aide d'une cron job (crontab -e), vous pouvez lancer la synchronisation à la fréquence que vous le souhaitez. Pour moi, c'est à l'heure pile:

0 * * * * /usr/local/bin/vdirsyncer sync

Notez que le chemin vers la commande peut différer selon le système d'exploitation.

Ma configuration complète

[general]
status_path = "~/.vdirsyncer/status/"

# -------
# CALDDAV
# -------

[pair my_calendar]
a = "my_calendar_local"
b = "my_calendar_remote"
collections = ["from a", "from b"]

[storage my_calendar_local]
type = "filesystem"
path = "~/.calendars/"
fileext = ".ics"

[storage my_calendar_remote]
type = "caldav"
auth = "digest"
url = "https://monserveur.com/baikal/dav.php/calendars/mon_id/nom_du_calendrier/"
username = "mon_id"
password.fetch = ["command", "~/get-mdp-dav"]

# -------
# CARDDAV
# -------

[pair my_contacts]
a = "my_contacts_local"
b = "my_contacts_remote"
collections = ["from a", "from b"]
metadata = ["hs"]

[storage my_contacts_local]
type = "filesystem"
path = "~/.contacts/"
fileext = ".vcf"

[storage my_contacts_remote]
type = "carddav"
auth = "digest"
url = "https://monserveur.com/baikal/dav.php/addressbooks/mon_id/moncarnet/"
username = "mon_id"
password.fetch = ["command", "~/get-mdp-dav"]

L'utilisation

Une fois que tout se synchronise bien entre votre serveur et votre ordinateur personnel, il ne vous reste plus qu'à vous amusez. Remarquez, votre utilisation de vdirsyncer peut tout simplement se limiter au fait d'avoir des copies locales de sauvegardes de votre calendrier et de cotre carnet d'adresses. Sinon, toute application pouvant tirer profit des formats iCalendar ou vCard, peut en principe interagir avec votre nouvelle installation.

Mais histoire de rester dans le domaine de la ligne commande, je peux vous en proposer deux qui sont souvent associés au nom de vdirsyncer…

Khal

Vue en mode calendrier du logiciel Khal

Khal peut lire et écrire des événements/calendriers dans les dossiers synchronisés par vdirsyncer. Il a aussi un mode interactif qui permet de parcourir et d'éditer à la fois.

Pour avoir la liste des commandes et options consulter le site web ou l'aide (khal --help).

Et la configuration de base est plutôt simple, et doit être placée dans $HOME/.config/khal/config:

[calendars]

[[hs_calendar_local]]
path = ~/.calendars/*
type = discover

[[hs_contacts_local]]
path = ~/.contacts/*
type = discover

[locale]
timeformat = %H:%M
dateformat = %Y-%m-%d
longdateformat = %Y-%m-%d
datetimeformat = %Y-%m-%d %H:%M
longdatetimeformat = %Y-%m-%d %H:%M

[default]
default_calendar = default

Khard

Bon vous l'aurez deviné, Khard est un gestionnaire de carnet d'adresses. À l'instar de Khard, il permet de lister et d'éditer. Sa configuration est dans la même veine que ce que nous avons vu jusqu'à maintenant:

[addressbooks]
[[default]]
path = ~/.contacts/default/

[general]
debug = no
default_action = list
editor = emacsclient, -r, -a, emacs,
merge_editor = vimdiff

[contact table]
display = first_name
group_by_addressbook = no
reverse = no
show_nicknames = no
show_uids = yes
show_kinds = no
sort = last_name
localize_dates = yes
preferred_phone_number_type = pref, cell, home
preferred_email_address_type = pref, work, home

Conclusion

Je ne suis pas encore un utilisateur de longue date, mais je suis enthousiaste par la découverte de vdirsyncer. Tout simplement parce que je cherchais ce genre d'outil depuis un certain temps. L'utilisation de formats simples et standardisés est un gros plus lorsqu'on veut interagir avec ses données sous plusieurs plateformes et applications.

Sinon je suis un utilisateur d'Emacs, entre autres pour lire et rédiger mes courriels (mu4e) et tenir des todo lists (org-mode). Et j'ai découvert deux extensions pour cet environnement, qui interfacent Khal et Khard… Ce qui fera peut-être l'objet d'une suite à ce billet.