640 - Sincronizar Termux en Android con Linux
Como mantener sincronizada la configuración de #termux en #android con la configuración de #linux utilizando un repositorio #git y disponible en #github
Tal y como comenté en el anterior episodio del podcast, en el 639, que titulé Pass y GoPass, gestión de contraseñas en Linux y Android, había cometido un error importante a la hora de tratar la configuración de Termux. Creé un repositorio específico de archivos de configuración de Termux, completamente diferenciado del de Linux. Esto me obliga a mantener dos repositorios, uno para Linux y otro para Termux. Y esto es un error. Lo ideal es mantener un solo repositorio, y sincronizarlo entre Linux y Termux. En las últimas semanas estoy programando mucho con Neovim, y esto me lleva a modificar continuamente la configuración, y por tanto los dotfiles. Y claro, cuando utilizaba Termux, me encontraba que todas esas actualizaciones no estaban, y tenía que implementarlas y esto es precisamente lo que quiero evitar. Así, que finalmente me puse manos a la obra y utilicé un solo repositorio con algunas particularidades. Así, en este episodio te hablaré sobre como sincronizar Termux en Android con Linux.
Sincronizar Termux en Android con Linux
Un grave error
Como te comentaba, cometí un grave error al mantener dos repositorios, uno para Linux y otro para Termux. Esto me obliga a mantener dos repositorios, y a sincronizarlos manualmente. Y esto es un error. Lo ideal es mantener un solo repositorio, y sincronizarlo entre Linux y Termux.
Inicialmente podrías pensar que no es tanto problema, simplemente se trata de tocar unos pocos archivos de configuración entre uno y otro. Sin embargo, la realidad es que si que es un verdadero problema. Porque normalmente, se tocan varios archivos de configuración, y al final, esto de modificar en dos repositorios, se vuelve algo tan tedioso que terminas por no hacerlo.
La reinstalación
Lo primero que hice fue reinstalar Termux en Android. El objetivo era comenzar desde cero, para evitar malos vicios.
Actualmente manejo tres fuentes para mis dotfiles. Dos fuentes contienen información sensible, que no debe estar disponible en ningún sitio, es decir, que no debe ser pública, la tercera fuente que son los archivos de configuración que están disponibles en mis dotfiles en GitHub.
ssh y gpg
La primera de las fuentes es la que corresponde a las claves y configuración de ssh
y gpg
. Esta no está disponible en ningún repositorio. Esta está actualizada utilizando Borg Backup, del que te he hablado en otros episodios.
En este caso en lugar de recuperarlo de un backup, lo que hice fue copiar directamente desde mi equipo hasta Android. Para ello utilicé una herramienta, de la que te hablé en el episodio 544 del podcast titulado Entre Android y Linux con LocalSend. LocalSend, es una estupenda herramienta para este tipo de operaciones de copia de información sensible, porque no utiliza servidores de terceros ni nada similar. Es una conexión directa entre dispositivos.
Así simplemente lo que tuve que hacer es enviar los dos directorios. Por un lado el directorio .gnupg
, que contiene todo lo referente a mis claves gpg
y por otro lado el directorio .ssh
, que tiene todo lo referente a las claves ssh
, y la configuración para acceder a los distintos servidores.
Por otro lado también tenía que sincronizar todas las claves que utilizo con Pass
, tal y como te conté en el episodio 639. Para ello simplemente copié el directorio .password-store
que es donde se almacenan todas las claves. Estas claves las tengo sincronizadas de forma sencilla entre los dispositivos utilizando gitea
, que es un clon de github
que tengo en mi servidor. Simplemente tengo que ejecutar el siguiente comando,
pass git pull
Y en caso de que modifique cualquier contraseña en Android o en Linux, hago el correspondiente commit
y empujo la rama.
Un solo repositorio para Android y Linux
El siguiente paso es mantener un único repositorio para Android y Linux. Para ello, aquellos archivos de configuración que sean distinto entre ambos sistemas operativos los unifico mediante un archivo jinja
. Sobre los archivos jinja
te hablé en el episodio 583 titulado El poder de Jinja y Python. Pero en este caso, en lugar de utilizar Python, estoy utilizando la herramienta que te comenté que implementé hace unos episodios llamada jinrender
.
Esto me permite, para aquellas configuraciones que son distintas entre Android y Linux, mantener un solo archivo de configuración, y a partir de este generar los archivos de configuración específicos para cada uno de los sistemas operativos.
Por ejemplo, el archivo fish_variables
es distinto en ambos sistemas operativos, así he creado un archivo llamado fish_variables.jinja
donde para el caso de mi equipo de escritorio tengo lo siguiente,
{% if env.MACHINE == "archi" -%}
SETUVAR DOCKER_HOST:/run/user/1000/docker\x2esock
SETUVAR --export MACHINE:archi
SETUVAR --export TERM:kitty
{% endif -%}
De esta manera al renderizar este archivo en Android esto no apareceré en esa configuración.
Si te fijas estoy utilizando una variable específica llamada MACHINE
. Inicialmente iba a utilizar la variable HOSTNAME
, pero esta variable ya está definida en el sistema, y no quería sobrescribirla. Así que he optado por utilizar una variable específica para este caso.
De esta sencilla manera puedo controlar perfectamente que va en uno archivo de configuración y que va en otro, dependiendo del sistema operativo en el que se va a instalar.
Borrando de Git
Esto me ha llevado a encontrarme con un problema. Y es que en el repositorio de yadm
tengo archivos que no quiero que estén en el repositorio. Por ejemplo, el archivo fish_variables
que te he comentado antes. La solución es sencilla. Por un lado añadir el archivo fish_variables
al archivo .gitignore
y por otro lado utilizar la herramienta git-filter-repo
para eliminar este archivo del repositorio.
Y es que esto de borrar información sensible de un repositorio es algo que hay que hacer con cuidado. No se trata simplemente de borrar el archivo, porque este archivo puede estar en el historial del repositorio. Así que lo que hice fue lo siguiente,
git-filter-repo --path .config/fish/fish_variables --invert-paths
Indicar que git-filter-repo
es una utilidad implementada en Python que está disponible desde los repositorios AUR de Arch Linux, y que es suficientemente rápida y eficaz para estos menesteres.
Por otro lado, está el problema de yadm
, ¿donde borrar esos archivos?. Al final lo que hice fue clonar el repositorio de dotfiles
, modificarlo y empujarlo a la fuerza.
Borg backup
Por otro lado, me encontré con que podía realizar copias de seguridad de Android al igual que lo estaba haciendo con Linux, utilizando Borg Backup
. Simplemente tienes que instalar en Termux BorgBackup y configurarlo.
En mi caso particular, todavía no lo tengo, porque quiero, de nuevo, personalizar el script que utilizo en Linux para que me sirva igualmente en Android, y no tener dos scripts diferentes. Pero esto es algo que tengo pendiente.
Así actualmente tengo un archivo llamado backup.sh.jinja
que al renderizarlo, dependiendiendo de donde me encuentre hace algo o no hace nada….
Conclusión
Con esto he concluido con todo lo referente a los archivos de configuración en Linux y Android. Por supuesto que todavía me queda trabajo que hacer, sobre todo para terminar de personalizar las plantillas, y esto, lo vas a poder ver reflejado en los próximos días y semanas en mis dotfiles, pero siguiendo el camino que acabo de explicarte.
buen articulo