219 - Empaquetar Telegram o pon un script en tu vida
Como empaqueto Telegram para el repositorio ppa:atareao/telegram, y como hice para que siempre esté actualizado poniendo un script en tu vida
En cuantas ocasiones te has enfrentado al dilema de automatizar algo en tu vida o no hacerlo. Y en el caso de decidir no hacerlo, ¿en cuantas ocasiones te has encontrado con la situación de que ese algo lo has vuelto a hacer una y otra vez?. Y no solo me refiero a un script. Por ejemplo, la plantilla de un documento de texto, o una hoja de cálculo, o incluso una macro en una hoja de cálculo. O cualquier otra cosa, aunque no tenga que ver con el mundo 2.0. Sin embargo, en este podcast, te voy a hablar precisamente sobre el mundo 2.0, y como he resuelto una situación, que me persigue durante años. De ahí el título del podcast sobre un script en tu vida.
A mi me sucede muy a menudo, eso de pensar, para que tengo que hacer un script si esto no lo voy a utilizar mas. Error. Siempre que me enfrento a esta situación, y opto por no hacer el script o la automatización que sea, termino repitiendo en innumerables ocasiones ¿porque no lo hice en ese momento?.
Empaquetando Telegram o pon un script en tu vida.
Empaquetando Telegram
Los antecedentes
No se exactamente cuando apareció la primera versión de Telegram para escritorio. Posiblemente fuera por el 2014 o el 2015. Lo que si tengo claro, es que esto representó toda una revolución para mi.
Desde el primer momento pensé en lo cómodo que sería, para mi y para otros, poder instalar Telegram desde repositorio. Así que se me ocurrió crear un repositorio en Launchpad para que tu, al igual que otros se pudiera instalar Telegram con total comodidad.
Aquí obvié un asunto. Y es que cuando lo instalas de esta forma no puedes actualizarlo. Por lo que tienes que esperar hasta que me doy cuenta de que hay una nueva versión o bien, alguien me manda un correo de que ya se liberó una nueva versión.
Esto no sería gran inconveniente, si no fuera, porque los chicos de Telegram, sacan versiones como si no hubiera un mañana, y me despisto. Así que aquí es donde empieza la historia de pon un script en tu vida.
Otra opción es posible
Como muy bien sabes, la solución es sencilla. Te bajas el paquete desde la página de Telegram, lo desempaquetas lo ejecutas y te olvidas. Cuando aparece una nueva versión, actualizas, y si lo haces de esta forma, es posible, y problema solucionado.
Sin embargo, hay muchos, que siguen prefiriendo hacerlo desde el repositorio de Launchpad, desde el PPA. ¿Cual es la razón? Supongo que será por comodidad. Pero tampoco lo se.
Un sentimiento de frustración
Esto de no tener el paquete de Telegram en su última versión, me produce ansia. Se que no estoy obligado a ofrecerlo, pero cada uno, es cada uno, y es imposible cambiarlo.
Así, llevo bastante tiempo con idea de poner solución a este problema. Y la solución, no es dejar de ofrecer Telegram desde el repositorio, si no hacerlo de forma completamente automatizada. De forma que no sea necesaria mi intervención.
¿Porque no abandonarlo? Pues simplemente, porque yo no soy así, la verdad. Pero además, está el reto, la motivación, la sensación de euforia que se consigue, cuando resuelves cualquier situación.
Pero además de esto, en los últimos tiempos, he ido añadiendo otros paquetes de tercero a alguno de los repositorios que gestiono. Sin embargo, estos se encuentran en la misma situación. No están a la última. Y es algo que es fácilmente solucionable.
La solución es pon un script en tu vida. Aunque como verás a continuación, uno no ha sido suficiente, sino que he tenido que hacer dos.
Antiguamente
Desde hace unos 5 años o mas, utilizo un sencillo script para empaquetar las aplicaciones que hago en Ubuntu. Este script se ha visto modificado con el paso del tiempo.
Esto es algo realmente interesante, y que siempre me llama la atención. Cada vez que veo alguna pieza de código que he desarrollado hace algún tiempo, y no hace falta que sea mucho, siempre pienso que lo podía hacer de otra forma o mejor… Esto es un verdadero problema.
El siguiente paso, fue añadir unas pocas líneas de código, para realizar la descarga de los binarios de Telegram. Simplemente descargaba el binario comprobara mediante el hash o suma de comprobación si era diferente de la versión que tenía descargada, y en ese caso, lo empaquetaba y lo subía.
El siguiente paso, que tenía que hacer era ir al repositorio y comprobar que se había subido correctamente. Esperaba un tiempo, dependiendo del que podían ser desde unos pocos minutos a unas horas y también de la carga de los servidores de Launchpad. Una vez empaquetado para una versión, desde Launchpad creaba los correspondientes para las otras versiones de Ubuntu.
Como ves, un proceso muy tedioso y que en ocasiones me llevaba mucho tiempo. Así que la mejor solución es poner un script en tu vida.
La solución
La solución, como he adelantado anteriormente, tiene dos partes. La primera es la automatización completa del proceso de creación del paquete y la subida al repositorio.
Aquí, he hecho pocos cambios, pero no por ello menos interesantes.
- Uno de los problemas con los que me encontraba era conocer la versión de Telegram, que me estaba descargando. Sin embargo, esto era realmente sencillo, porque viene en el propio nombre del archivo que descargo. Ahora, no necesito descargar el archivo y comprobar si es distinto al previo. Simplemente compara la versión del que quiero descargar, como la versión del anterior, que está en el archivo
changelog
. - He limpiado y simplificado el código. Esto es algo a lo que me refería anteriormente, de cada vez que veo el código de un script o de lo que sea.
El siguiente problema con el que me enfrentaba era como crear distintas versiones del paquete que había subido.
Para esto, existe una librería para Python, disponible desde los repositorios. Sin embargo, no he sido capaz de hacerla funcionar. La solución ha sido implementarla desde cero utilizando Requests. Esto me ha llevado mas tiempo del que esperaba, pero menos tiempo que intentar descifrar el funcionamiento de la librería de Python.
A partir de aquí, todo es relativamente sencillo. Simplemente se trata de un bucle que vigile si ya se ha creado el paquete en Launchpad. Una vez creado, a hacer los correspondientes para las otras versiones.
Actualmente estoy subiendo Telegram en versión Focal, y utilizando este script empaqueto también para Xenial, Bionic y Groovy. Son tres llamadas a la API de Launchpad que realizan este trabajo. Sin necesidad de que esté vigilante.
Un poco de información
Por supuesto, a esto le he añadido dos detalles importantes, el primero es que he creado el correspondiente servicio en Systemd y su Timer. Con algo tan sencillo como lo que puedes ver a continuación. De esta forma, todos los días se ejecuta el script, realiza las comprobaciones pertinentes, y el paquete de Telegram, está siempre a la última.
Para hacer todo esto, me he aprovechado de nuevo, del tutorial sobre trabajar con Systemd. El servicio es tan sencillo como lo que ves a continuación,
[Unit]
Description=Update telegram launchpad package
[Service]
Type=oneshot
ExecStart=/bin/bash /home/lorenzo/telegram-updates/update.sh
Mientras que el timer, tiene el siguiente aspecto,
[Unit]
Description=Check and update Telegram every day
[Timer]
OnBootSec=15min
OnUnitActiveSec=1d
[Install]
WantedBy=timers.target
Esto quiere decir, que se ejecutará la primera vez que se inicie tu servidor, ya sea la Raspberry o un VPS o la máquina donde lo estás ejecutando. Por otro lado, a partir de ese momento se ejecutará una vez al día. Pero si en el mismo día se reinicia dos veces tu máquina no se lanzará dos veces el servicio solo una.
Ahora solo te queda copiar ambos archivos a ~/.config/systemd/user/
y habilitar e iniciar el timer,
systemctl --user enable telegram-updates.timer
systemctl --user start telegram-updates.timer
Y así se ejecutará la primera vez.
Lo siguiente es estar informado. Para esto, como no un mensaje enviado a mi cuenta de Telegram, cada vez que se libera una nueva versión, o en el caso de que se produzca un error. Algo tan sencillo como lo que puedes ver a continuación.
Para la parte informativa, haré como en otras ocasiones. Guardo las credenciales en otro archivo, y le asigno propiedades de solo lectura para mi usuario, para dejarlo mínimamente protegido, y ejecuto lo siguiente,
source /home/lorenzo/.telegram_keys
message "Telegram updated to $VERSION"
curl -s -X POST $URL -d chat_id=$CHANNEL -d text="$message" > /dev/null 2>&1
Y con este pon un script en tu vida, he intentado resolver el problema de la frustración. Ya me contarás tu caso.