Org-Mode: Sincroniza el calendario con org-caldav
2019-02-15
Índice
- Creando un nuevo calendario
- Guardar usuario y contraseña cifrados 1. Creando el fichero 2. Cifrado y ubicación del fichero
- Ubicación
- Configuración
- Hacks
- Fuente:
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
- Nextcloud: En este articulo explico como obtener la url del calendario para un usuario
- Baikal:
http://BAIKAL-SERVER-URL/cal.php/calendars/USUARIO
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)
machine SERVIDORR#PUERTO port protocolo 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
gpg --gen-key gpg (GnuPG) 2.2.11; Copyright (C) 2018 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Nota: Usa "gpg --full-generate-key" para el diálogo completo de generación de clave. GnuPG debe construir un ID de usuario para identificar su clave. Nombre y apellidos: Carlos M Dirección de correo electrónico: hefistion.arroba.mail.com Ha seleccionado este ID de usuario: "Carlos M <hefistion.arroba.mail.com>" ¿Cambia (N)ombre, (D)irección o (V)ale/(S)alir? v Es necesario generar muchos bytes aleatorios. Es una buena idea realizar alguna otra tarea (trabajar en otra ventana/consola, mover el ratón, usar la red y los discos) durante la generación de números primos. Esto da al generador de números aleatorios mayor oportunidad de recoger suficiente entropía. Es necesario generar muchos bytes aleatorios. Es una buena idea realizar alguna otra tarea (trabajar en otra ventana/consola, mover el ratón, usar la red y los discos) durante la generación de números primos. Esto da al generador de números aleatorios mayor oportunidad de recoger suficiente entropía. gpg: clave XXXXXXXXXXX marcada como de confianza absoluta gpg: creado el directorio '/home/carlos-k/.gnupg/openpgp-revocs.d' gpg: certificado de revocación guardado como '/home/carlos-k/.gnupg/openpgp-revocs.d/XXXXXXXXXXX XXXXXXXXXXX.rev' claves pública y secreta creadas y firmadas. pub rsa2048 2018-11-15 [SC] [caduca: 2020-11-14] XXXXXXXXXXXXXXXXXXXXXXXXXXX uid Carlos M <hefistion.arroba.mail.com> sub rsa2048 2018-11-15 [E] [caduca: 2020-11-14]
Podemos listar las llaves con el comando
gpg -k gpg: comprobando base de datos de confianza gpg: marginals needed: 3 completes needed: 1 trust model: pgp gpg: nivel: 0 validez: 1 firmada: 0 confianza: 0-, 0q, 0n, 0m, 0f, 1u │ gpg: siguiente comprobación de base de datos de confianza el: 2020-11-14 │ /home/carlos-k/.gnupg/pubring.kbx │ --------------------------------- │ pub rsa2048 2018-11-15 [SC] [caduca: 2020-11-14] │ 4A906E4665F07F2DD9E0A559DEF186EA8C4275E3 │ uid [ absoluta ] Carlos M <[email protected]> │ sub rsa2048 2018-11-15 [E] [caduca: 2020-11-14]
-
Permisos
Cambiamos los permisos
chmod 600 .authinfo
-
Cifrado
Finalmente ciframos el fichero
gpg -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
(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
(use-package org-caldav
:ensure t
:bind ([f3] . org-caldav-sync)
:preface
:custom
;; Calendarios a utilizar
(org-caldav-url "http://BAIKAL-SERVER-URL/cal.php/calendars/USUARIO")
(org-caldav-calendars
'((:calendar-id "default"
:files ("~/.personal/agenda/diario.org")
:inbox "~/.personal/agenda/diario-ibx.org")
))
(org-caldav-backup-file "~/.personal/calendario/org-caldav-backup.org")
(org-caldav-save-directory "~/.personal/calendario/")
(org-icalendar-alarm-time 1)
)
Hacks
A continuación pongo una serie de funciones para la sincronización automática y el auto-guardado del calendario
;; sincroniza al cerrar, tambión pide guardar despuós de sincronizar
;; no se pierden cambios
(defun org-caldav-sync-at-close ()
(org-caldav-sync)
(save-some-buffers))
;; sincronización retardada; espera hasta que emacs haya estado inactivo
;; "x" segundos antes de sincronizar. El retraso es importante porque caldav-sync
;; puede tardar cinco o diez segundos, de esta manera, espera hasta que hayas estado
;; inactivo un tiempo para evitar molestar.
(defvar org-caldav-sync-timer nil
"Temporizar `org-caldav-push-timer' se usa para reprogramarse a si mismo, o nil.")
(defun org-caldav-sync-with-delay (secs)
(when org-caldav-sync-timer
(cancel-timer org-caldav-sync-timer))
(setq org-caldav-sync-timer
(run-with-idle-timer
(* 1 secs) nil 'org-caldav-sync)))
;; Esto asegura que los elementos de las tareas pendientes puedan aparecer en el calendario
(setq org-icalendar-include-todo t)
;; Esto garantiza que todos las "deadlines" se muestren y se muestren como fechas de vencimiento
(setq org-icalendar-use-deadline '(event-if-todo event-if-not-todo todo-due))
;; Esto garantiza que los elementos "dedlines" se muestren y se muestren como horas de inicio
(setq org-icalendar-use-scheduled '(todo-start event-if-todo event-if-not-todo))
;; hook de guardado con retraso, con un temporizador de inactividad de cinco minutos
(add-hook 'after-save-hook
(lambda ()
(when (eq major-mode 'org-mode)
(org-caldav-sync-with-delay 300))))
;; Añade hook para el cierre de emacs
(add-hook 'kill-emacs-hook 'org-caldav-sync-at-close)