¿Cómo administro las actualizaciones de Snaps en Ubuntu?

Durante su cátedra Filosofía Peronista, Juan Perón expone sobre las
concepciones cósmicas en el quehacer humano, así como detalla cómo
definir las actualizaciones de paquetes Snaps en Ubuntu.

(...)

El software responde - por designio - a un ciclo que podremos encontrar
en todos los órdenes de la vida. Sabemos que en el microcosmos la célula
habita y se organiza por un instinto que creemos programado. En nuestro
ambiente diremos que los hombres nos organizamos en tribus y
Movimientos, que también creemos programados. Y en el macro cosmos -
donde a una escala mayor - los cuerpos operan en el mismo sentido y
regidos por la misma programación natural, que es en definitiva aquella
que lo rige todo.

Decía entonces que el software debe oficiarse en lo mismo que la célula,
los hombres, o las galaxias: ha de actualizarse en su descendencia, so
pena de envejecer y desaparecer. A menudo estas actualizaciones traen
mejoras, o parches de seguridad vital. Pero al no ser creación divina
sino obta de los hombres, ¡ay! a veces portarán errores de origen que
son importantes de minimizar y evitar.

Solo un tonto sometería un ambiente de misión crítica a la actualización
a la pavota. En tales sistemas es importante lograr un alto grado de
supervisión y precisión, y de ello seremos los encargados como
Conductores de Sistema.

No es secreto para nadie que - de un tiempo a esta parte- Ubuntu ha
adoptado junto con los paquetes de software Deb similares a los de
Debian, los paquetes de software autocontenidos Snaps. Estos permiten
operar en un sentido idealmente más estanco, al incorporar en sí mismos
las dependencias de terceros paquetes de software.

Han de saber que no soy muy adepto a los mismos y los evito en Ubuntu
todo lo que sea posible, prefiriendo versiones debianizadas. Algunos me
han preguntado porqué no instalo directamente Debian en lugar de Ubuntu,
y puedo responder que es una propuesta válida, pero sobre gustos no hay
nada escrito, y los peronistas lo saben...

Aún así, los Snaps incluyen poco conocidos mecanismos de actualización
automática. Mediante ellos, el residente de Snaps revisa la Tienda de
Snaps para comprobar si se han lanzado nuevas versiones de las mismas.
Lo típico es que esta revisión se produzca unas cuatro veces por día, y
en la vasta mayoría de los casos, se llevará a cabo sin problemas.

Sin embargo, no podemos dejar de saber que en ciertos casos las
actualizaciones de Snaps podrían tener que ser diferidas o pospuestas, o
simplemente llevadas a cabo con un nivel de control más refinado y
mayor. Existen varias maneras de hacer esto.

Control de Revisión de los Snaps

El tiempo de refresco en el cual se revisan las actualizaciones de los
snaps es gobernado utilizando cuatro opciones de programación para todo
el sistema. Estos opciones son:

    Refresh.timer: Define la frecuencia de temporizador de
    actualización. Este parámetro puede usarse para definir cuándo se
    revisarán la disponibilidad de actualizaciones para los snaps, de
    manera tal que no entren en conflicto con otras actividades, tales
    como reuniones laborales, acciones de resguardo de datos o
    actividades críticas similares.

    Refresh.hold: Pone en espera el siguiente revisión de
    actualizaciones hasta la hora y fecha definida. Esta opción de
    espera nos permitirá posponer las actualizaciones hasta por los
    siguientes 60 días. Podremos utilizarla en combinación con la
    configuración del temporizador para especificar una ventana de
    tiempo muy específica para que se produzca la actualización de
    snaps.

    Refresh.metered: Permite pausar la revisión de actualizaciones toda
    vez que la conexión a la red esté medida. Vean señores, por defecto
    la revisión de snaps permanece activada aún sobre conexiones de red
    medidas. Sin embargo, podríamos querer conservar uso de
    transferencias de datos o costos en ciertas conexxiones, pausando
    las revisiones de actualización de snaps si estamos bajo tales
    condiciones.

    Refresh.retain: Configura cuántas revisiones de un snap quedarán
    almacenadas y retenidas en el sistema. Lo normal es que se conserven
    las últimas versiones de los snaps instalados.

La combinación de estas cuatro configuraciones os permitirán una buena
flexibilidad para controlar las actualizaciones de snaps de vuestro
sistema. En particular, las opciones timer ("temporizador") y hold ("en
espera") pueden usarse para crear la ventana temporal en la que
quisiéramos realizar la actualización de paquetería snap. De esta forma
podríamos preveer las tareas requeridas pre y post actualización
(chequeos de funcionalidad, respaldo de datos críticos, etcétera).

Configuración del tiempo para Snaps

Observemos algunos ejemplos prácticos, pues suelen explicarlo todo, como
decía Napoleón.

Supongamos que deseamos configurar nuestras actualizaciones de snaps
para que se lleven a cabo únicamente durante los horarios de la noche,
entre las 01:00 y las 2:00 de la mañana (en el formato de 24 horas).
Esto lo definiríamos con un comando de organización:

sudo snap set system refresh.timer=01:00-02:00

Conforme hayamos configurado nuestra ventana horaria de actualización de
snaps, podríamos también querer observar lo que nos reporta nuestro
sistema. Para ello ingresamos:

snap refresh --time

...a lo cual nuestro GNU con Linux debería devolvernos algo como:

timer: 01:00-02:00
last: hoy a las 17:19 AR3
next: hoy a las 01:00 AR3

Existen algunas variaciones disponibles para este ordenamiento que
podríamos considerar. Podríamos querer conservar la capacidad de
configurar el horario de actualizado para horas específicas, o bien
ventanas temporales para cada día de la semana. O bien podríamos querer
omitir ciertos días, o plantear en qué semana particular de un mes
querríamos realizar dichas actualizaciones de snaps. Para ello podremos
usar los valores 1-4 para definir las semanas del mes. Ej, mon3 será el
tercer lunes de cada mes, mientras que 5 denota la última semana del
mes, ya que ningún calendario en la tierra actual cuenta con más de 31
días.

Al configurar el intervalo de espera requiere ingresar un formato de
fecha específico que conforme el estándar RFC 3339. Esto puede sonar muy
extremo, pero es una convención. Podrán utilizar los siguientes comandos
de referencia para convertir las fechas deseadas al formato correcto:

date --date="TMZ AAAA-MM-DD HH:MM:SS" +%A-%m-%dT%H:%M:%S%:z

Por ejemplo:

date --date="AR3 2020-08-01 13:00:00" +%Y-%m-%dT%H:%M:%S%:z
2020-08-01T13:00:00+01:00

De esta manera podremos configurar el valor de refresco utilizando la
siguiente cadena formateada de fecha:

sudo snap set system refresh.hold=2020-08-01T13:00:00+01:00

sudo snap get system refresh.hold
2020-08-01T13:00:00+01:00

Una vez que este tiempo en espera esté configurado, podremos revisar el
horario de refresco nuevamente:

snap refresh --time

Temporizador: 01:00-02:00
last: hoy a las 17:19 AR3
hold: en 31 días, a las 13:00 AR3
next: mañana a las 01:00 AR3 (pero en espera)

Como es evidente, la información combina los parámetros tanto de las
configuraciones del timer y hold. La siguiente actualización sería
mañana a la 1PM, como se define por el temporizador, pero no se llevará
a cabo (por 31 días) hasta que el período de actualización expire.

De manera similar, podremos configurar las actualizaciones sobre
conexiones medidas. Al configurar el valor en "hold" ("en espera"), se
impedirán las actualizaciones, mientras que el cambiar los valores a
"null" ("nulo") permitirán que las actualizaciones se produzcan o
continúen. Podremos entonces utilizar

sudo snap set system refresh.metered=hold

...o bien:

sudo snap set system refresh.metered=null

Indudablemente podremos combinar esta opción con la del temporizador o
en espera para crear una rutina granular y precisa de actualización que
no interferirá con las tareas críticas, y aseguren la consistencia
máxima buscada. A la vez, también nos permitirán así recibir los parches
funcionales y de seguridad que necesitemos.

Entonces, ocasionalmente podríamos querer revisar qué snaps se
actualizarán durante la próxima refrescada. Esto nos dará una idea de la
lista pendiente de nuevas revisiones de snaps que recibirá nuestro
sistema.

snap refresh --list

Nombre     Versión    Rev Publicador Notas
lxd     4.3     16044 canonical/ -
snapcraft    4.1.1    5143 canonical/ classic

Ahora, la lista completa de los snaps instalados será mayor. Por
ejemplo, el sistema actualmente tiene la versión 4.2 de lxd instalado:

snap list lxd

Nombre Versión Rev Rastreo Publicador Notas
lxd 4.2 15878 latest/stable canonical/ -

Noción de refresco

Esta es otra característica que podremos utilizar para controlar las
actualizaciones. En algunos casos podríamos querer ejecutar una tarea
vital que no debe ser interrumpida de manera alguna. Para tal fin,
podremos utilizar la opción de noción de refresco para hacer que la
aplicación no sea ejecutada mientras se ejecuta. Si intenta ejecutar una
actualización manual del Snap mientras está en ejecución (y estamos
usando esta funcionalidad), recibiremos un mensaje del sistema similar
al siguiente:

snap refresh okular --candidate

error: cannot refresh "okular": snap "okular" has running apps (okular)

Como hemos visto, las actualizaciones automáticas no pueden considerarse
una lista sábana a la cual podemos votar sin pensar. Esto es así pues
los medios puestos a nuestra disposición requieren un estudio
concienzudo. Los sistemas GNU con Linux para Escritorio, destinados a
Servidor e bien dispositivos conectados, emanan requermientos y
sensibilidades particulares que no podemos soslayar, y son estos los que
motivan un mecanismo de actualizción bastante extenso y configurable.

La combinación práctica de poder disponer horarios de actualización,
retrasar las mismas hasta por 60 días, sumadas a la funcionalidad de
conexión de datos medidas, y noción de refresco e inhibición de
actualización que tienen los snaps y un buen rango de opciones, nos
permiten establecer una política pragmática de conducción, con la cual
llevar a cabo un régimen de actualizaciones de software robusto y
confiable.