Org-Mode: Sincroniza el calendario con org-caldav

6 minutos de lectura

Introducción

Podemos sincronizar el calendario de org-mode con un servidor cal-dav gracias org-caldav.

Como mínimo es necesario tener instalada la versión 24.3 de Emacs y según su desarrollador, org-caldav puede trabajar con los siguientes servidores CalDAV:

  • Owncloud y Nextcloud

  • Google Calendar: aunque es necesario registrar la aplicación en la Consola de Desarrollo de Google para la autentificacion OAuth2.

  • Radicale y Baikal

Personalmente lo he probado con Nextcloud y baikal, funcionando perfectamente en ambos servidores.

Antes de seguir, has de tener presente que org-caldav inserta en cada entrada un campo UID para identificar inequívocamente cada entrada del calendario

Creando un nuevo calendario

Necesitamos conocer la url del calendario en el servidor

Para sincronizar el calendario de forma manual lo haremos mediante M-x org-caldav-sync , introduciremos el usuario y contraseña aunque podemos utilizar un fichero .authinfo para evitar esto.

Guardar usuario y contraseña cifrados

Creando el fichero

Podemos cifrar mediante claves gpg el usuario y contraseña en un fichero llamado .authinfo, (sustituye el numero de PUERTO y las X por tus datos)

1machine SERVIDORR:PUERTO port http login XXXX password XXXXXX

Cifrado y ubicación del fichero

Una vez creado el fichero, lo ciframos, evidentemente deberás de tener creadas tus claves GPG pública y privada

  • Creando las claves

    Para crear tus par de claves

     1
     2  gpg --gen-key
     3
     4
     5  gpg (GnuPG) 2.2.11; Copyright (C) 2018 Free Software Foundation, Inc.
     6  This is free software: you are free to change and redistribute it.
     7  There is NO WARRANTY, to the extent permitted by law.
     8
     9  Nota: Usa "gpg --full-generate-key" para el diálogo completo de generación de clave.
    10
    11  GnuPG debe construir un ID de usuario para identificar su clave.
    12
    13  Nombre y apellidos: Carlos M
    14  Dirección de correo electrónico: hefistion.arroba.mail.com
    15  Ha seleccionado este ID de usuario:
    16      "Carlos M <hefistion.arroba.mail.com>"
    17
    18  ¿Cambia (N)ombre, (D)irección o (V)ale/(S)alir? v
    19  Es necesario generar muchos bytes aleatorios. Es una buena idea realizar
    20  alguna otra tarea (trabajar en otra ventana/consola, mover el ratón, usar
    21  la red y los discos) durante la generación de números primos. Esto da al
    22  generador de números aleatorios mayor oportunidad de recoger suficiente
    23  entropía.
    24  Es necesario generar muchos bytes aleatorios. Es una buena idea realizar
    25  alguna otra tarea (trabajar en otra ventana/consola, mover el ratón, usar
    26  la red y los discos) durante la generación de números primos. Esto da al
    27  generador de números aleatorios mayor oportunidad de recoger suficiente
    28  entropía.
    29  gpg: clave XXXXXXXXXXX marcada como de confianza absoluta
    30  gpg: creado el directorio '/home/carlos-k/.gnupg/openpgp-revocs.d'
    31  gpg: certificado de revocación guardado como '/home/carlos-k/.gnupg/openpgp-revocs.d/XXXXXXXXXXX
    32  XXXXXXXXXXX.rev'
    33  claves pública y secreta creadas y firmadas.
    34  pub   rsa2048 2018-11-15 [SC] [caduca: 2020-11-14]
    35    XXXXXXXXXXXXXXXXXXXXXXXXXXX
    36  uid                      Carlos M <hefistion.arroba.mail.com>
    37  sub   rsa2048 2018-11-15 [E] [caduca: 2020-11-14]
    38#+end_example
    39
    40       Podemos listar las llaves con el comando
    41
    42       #+begin_example
    43
    44  gpg -k
    45  gpg: comprobando base de datos de confianza
    46  gpg: marginals needed: 3  completes needed: 1  trust model: pgp
    47  gpg: nivel: 0  validez:   1  firmada:   0  confianza: 0-, 0q, 0n, 0m, 0f, 1u                       │
    48  gpg: siguiente comprobación de base de datos de confianza el: 2020-11-14                           │
    49  /home/carlos-k/.gnupg/pubring.kbx                                                                  │
    50  ---------------------------------                                                                  │
    51  pub   rsa2048 2018-11-15 [SC] [caduca: 2020-11-14]52    4A906E4665F07F2DD9E0A559DEF186EA8C4275E3                                                     │
    53  uid        [  absoluta ] Carlos M <carlos70@protonmail.com>                                        │
    54  sub   rsa2048 2018-11-15 [E] [caduca: 2020-11-14]
    
  • Permisos

    Cambiamos los permisos

    1chmod 600 .authinfo
    
  • Cifrado

    Finalmente ciframos el fichero

    1
    2gpg -e -r "Carlos M" .authinfo
    

Ubicación

Podemos crear el .authinfo en $home del usuario, aunque podemos configurar nuestro fichero .emacs.d para indicar la ubicación del fichero

1(setq auth-sources '("~/.gnupg/shared/authinfo.gpg"))

Listo ahora ya no pide los datos de conexión, solo necesitaremos introducir la contraseña de nuestra clave GPG para que Emacs descifre el fichero y permita la conexión con le servidor CalDAV

Configuración

Debemos configurar nuestro fichero emacs.d, yo utilizo la tecla de función F3 para efectuar la sincronización manual del calendario, también la podemos efectuar M-x org-caldav-sync.

:files son las ficheros que contienen los eventos que se sincronizaran con el calendario remoto

:inbox es el fichero que donde se descargan los eventos del calendario remoto

Yo voy a sincronizar solo las citas para los dispositivos móviles los proyectos los manejo desde org-mode

 1 (use-package org-caldav
 2:ensure t
 3:bind ([f3] . org-caldav-sync)
 4:preface
 5:custom
 6;; Calendarios a utilizar
 7(org-caldav-url "http://BAIKAL-SERVER-URL/cal.php/calendars/USUARIO")
 8(org-caldav-calendars
 9    '((:calendar-id "default"
10		  :files ("~/.personal/agenda/diario.org")
11		  :inbox "~/.personal/agenda/diario-ibx.org")
12))
13(org-caldav-backup-file "~/.personal/calendario/org-caldav-backup.org")
14(org-caldav-save-directory "~/.personal/calendario/")
15(org-icalendar-alarm-time 1)
16)

Hacks

A continuación pongo una serie de funciones para la sincronización automática y el auto-guardado del calendario

 1
 2;; sincroniza al cerrar, también pide guardar después de sincronizar
 3;; no se pierden cambios
 4(defun org-caldav-sync-at-close ()
 5    (org-caldav-sync)
 6    (save-some-buffers))
 7
 8;; sincronización retardada; espera hasta que emacs haya estado inactivo
 9;; "x" segundos antes de sincronizar. El retraso es importante porque caldav-sync
10;; puede tardar cinco o diez segundos, de esta manera, espera hasta que hayas estado
11;; inactivo un tiempo para evitar molestar.
12(defvar org-caldav-sync-timer nil
13     "Temporizar `org-caldav-push-timer' se usa para reprogramarse a si mismo, o nil.")
14
15(defun org-caldav-sync-with-delay (secs)
16      (when org-caldav-sync-timer
17      (cancel-timer org-caldav-sync-timer))
18(setq org-caldav-sync-timer
19	  (run-with-idle-timer
20	   (* 1 secs) nil 'org-caldav-sync)))
21
22;; Esto asegura que los elementos de las tareas pendientes puedan aparecer en el calendario
23(setq org-icalendar-include-todo t)
24;; Esto garantiza que todos las "deadlines" se muestren y se muestren como fechas de vencimiento
25(setq org-icalendar-use-deadline '(event-if-todo event-if-not-todo todo-due))
26;; Esto garantiza que los elementos "dedlines" se muestren y se muestren como horas de inicio
27(setq org-icalendar-use-scheduled '(todo-start event-if-todo event-if-not-todo))
28;; hook de guardado con retraso, con un temporizador de inactividad de cinco minutos
29(add-hook 'after-save-hook
30  (lambda ()
31      (when (eq major-mode 'org-mode)
32	(org-caldav-sync-with-delay 300))))
33;; Añade hook para el cierre de emacs
34(add-hook 'kill-emacs-hook 'org-caldav-sync-at-close)

Fuente: