Descargar de manera automatizada un conjunto numerado de archivos
curl https://uningenieroencasas.es/fotos/foto-[1-50].jpg -o foto-#1
curl https://uningenieroencasas.es/fotos/foto-[1-50].jpg -o foto-#1
Las siguientes tareas las llevaremos a cabo mediante las herramientas de CNTOOLS. Se trata de operaciones rutinarias relativamente sencillas que implican transacciones. Por lo tanto, requerirán del uso de claves de firma que, por precaución, nunca deberían guardarse en el nodo. Existen dos modos de llevar a cabo este tipo de tareas.
En esta entrada, por simplicidad, nos referiremos al modo online y haremos referencia a las claves necesarias para cada operación. Dichas claves deberían conservarse en una unidad externa cifrada y ser copiadas temporalmente al nodo durante los minutos que dura la operación. A continuación deberán ser borradas con un programa de borrado seguro.
Hay ocasiones en las que un servidor es puesto en funcionamiento y posteriormente desatendido e incluso olvidado. Contrariamente a lo que se pudiera pensar, un servidor en estas condiciones puede mantenerse en funcionamiento durante mucho tiempo sin que nadie se ocupe de él e, incluso, sin que sea fácil siquiera acceder a su ubicación para retirarlo de la circulación. Esto no resulta tan raro si pensamos en servidores virtuales o servicios en funcionamiento alojados en servidores más grandes que están suministrando otros servicios de manera simultánea. Esto explicaría por qué el servidor físico sigue recibiendo mantenimiento por parte de responsables que pueden llegar a ignorar durante años la existencia de servicios «fantasma» ejecutándose en sus máquinas.
Sin ir más lejos, yo mismo me he encontrado con esta circunstancia al menos en dos ocasiones. En ambos casos se trataba de páginas web profesionales que habían sido puestas en funcionamiento en servidores compartidos por responsables que luego desaparecieron del mapa. Las páginas pronto quedaron obsoletas sin que fuera posible acceder a ellas para desactivarlas o actualizarlas.
Pues bien. Para evitar que los nodos de Cardano puedan llegar a convertirse en nodos fantasma, degradando así el funcionamiento de la red, los operadores tienen la obligación de renovar unas claves cada tres meses para que el nodo siga teniendo la capacidad de firmar bloques. A este proceso se le llama rotación.
Claves necesarias: cold.skey
ruta: $CNODE_HOME/priv/pool/<pool_name>/
Las recompensas obtenidas tras la firma de bloques se van depositando en una dirección específica dentro de nuestra billetera. Estas recompensas son delegadas en el «pool» de manera automática, por lo que si no queremos disponer de ellas no es necesario realizar ninguna acción. Sin embargo, estrictamente no forman parte de los fondos de la billetera propiamente dicha, así que no nos servirían para cumplir con el «pledge», en caso de que quisiéramos aumentarlo. En cualquier caso, bien porque queramos elevar el «pledge», bien porque queramos transferirlas a otra dirección, antes o después necesitaremos retirarlas.
Importante: Los gestores de billeteras tipo Daedalus o Yoroi incorporan una opción para retirar las recompensas directamente. Esto está muy bien si estamos delegando en cualquier «pool» que no sea el nuestro o siempre que se trate de una billetera diferente de la utilizada para crear el nodo. Sin embargo, si durante la creación del nodo decidimos incorporar una billetera externa generada con Yoroi o Daedalus es muy importante que no realicemos el retiro de las recompensas desde ninguno de estos programas externos, ya que en este caso se rompería la sincronización entre el saldo real y el mostrado en la billetera. Una billetera de este tipo debería utilizarse solamente como herramienta de monitorización. Cualquier transacción deberá realizarse directamente con las herramientas de cliente del nodo.
Claves necesarias: payment.skey, stake.skey
ruta: $CNODE_HOME/priv/wallet/<wallet_name>/
A modo de chuleta, aquí dejo una tabla con el listado de claves del nodo y donde podemos encontrar cada una de ellas.
Clave | hot node | cold node |
---|---|---|
cold.skey | – | X |
cold.vkey | X | X |
hot.vkey | X | X |
hot.skey | X | X |
vrf.vkey | X | X |
vrf.skey | X | X |
Clave | hot node | cold node |
---|---|---|
base.addr | X | X |
reward.addr | X | X |
payment.addr | X | X |
payment.vkey | X | X |
payment.skey | – | X |
stake.vkey | X | X |
stake.skey | – | X |
stake.cert | X | – |
delegation.cert | X | – |
Bien, llegó la hora. Es el momento de atacar el que sin duda es el anzuelo con el que el Sr. Google más nos tiene cogidos de los pelendengues. Todo ese conjunto de servicios con los que casi sin darnos cuenta nos hemos acostumbrado a vivir y que resultan más engorroso sustituir. Me estoy refiriendo, como no, a los servicios de sincronización de datos tales como calendarios, agendas telefónicas, fotografías, archivos, etc. En resumen, todo eso que de unos años a esta parte nos ha dado por llamar «la nube». Y bien llamado, porque la verdad es que es que un poco en las nubes hemos tenido que estar todo este tiempo para pensar que era buena idea dar todos nuestros datos privados a una empresa para que nos los guarde, y pensar que lo iba a hacer «gratis». En fin…
Ponga una «nube» en su vida, bien podría ser el eslógan de la última década. Práctico es, desde luego. Nos permite llevar nuestros datos de aquí para allá y mantenerlos sincronizados en distintos dispositivos, amén de proporcionarnos una sencillísima manera de mantener copias de seguridad. ¿Y qué es una «nube»? Pues lo cierto es que, en la práctica, una «nube» no es sino un ordenador conectado a internet 24×7, fiable y con buena conectividad para que esté siempre accesible. Y esto hace que la solución no sea tan inmediata como en los capítulos anteriores.
Después de darle unas cuantas vueltas, he reducido las posibles soluciones a estas tres posibilidades que voy a sugerir.
Llegados a este punto, quien me conozca un poco seguramente ya habrá adivinado la opción que yo he elegido para mi (una pista: la 1 no es). Quien elija la uno no necesita más instrucciones, ya que el servicio se las proporcionará. Y para todos los demás, digamos que la manera de proceder es prácticamente idéntica para los casos 2 y 3. Así, que vamos allá.
Así que hemos decidido instalar nuestro propia «nube», sea un en un servidor externo o uno propio, por lo que necesitaremos el software adecuado. Y, como siempre, no me voy a detener en analizar las posibles alternativas, sino que me limitaré a señalar la que ha sido adecuada para mí. Y en este caso, el ganador es NextCloud.
Se trata de un software de código abierto que proporciona todos los servicios en nube que utilizamos de manera habitual: calendarios, contactos, archivos, correo electrónico, comunicación… Su código está disponible para la descarga en su página web y está ampliamente documentado. Para su instalación no necesitamos demasiados recursos de computación. Un mini-pc hará la función perfectamente. Como mucho tendremos que asegurarnos de disponer de suficiente espacio de disco duro para nuestras necesidades y, aún en el peor de los casos, seguro que superamos ampliamente los ridículos 15 Gb que nos «regala» el Sr. Google.
La instalación de NextCloud debe hacerse sobre un típico sistema LAMP, acrónimo de Linux, Apache, MySQL y PHP. Es decir, un servidor Linux con servidor web, base de datos y php. Lo mismo que se utiliza para alojar una página web promedio y que cualquier proveedor de alojamiento ya proporciona.
Cuenta la leyenda que en aquellos tiempos en los que internet comenzaba a expandirse y yo todavía tenía pelo, un grupo de programadores decidió poner un poco de orden en aquellas salvajes llanuras de la World Wide Web. Así que se pusieron manos a la obra para crear un servidor web potente y versátil. Pero para no reinventar la rueda, lo que hicieron fue parchear («patch», en inglés) el servidor web por entonces más popular, creado por el Centro Nacional de Aplicaciones de Supercomputación (NCSA por sus siglas en inglés), el NCSA HTTPd. Que durante su desarrollo a manos de un puñado de frikis cachondos lo que comenzara siendo conocido como un «patched server» terminara llamándose «apache server» no tiene nada de sorprendente. Puedo imaginarme perfectamente a los ingenieros partiéndose de risa haciendo el indio mientras picaban código como locos…
Apache ha sido el líder indiscutible de la WWW desde su aparición hasta ahora, si bien últimamente ha empezado a perder terreno a favor de servidores más modernos. En realidad, el Apache que vamos a instalar se llama Apache2. Se trata de la segunda versión del mítico Apache una vez que se decidieron a reescribirlo desde cero, como debe ser.
Los dos directorios con los que hay que bregar son los siguientes:
cd /var/www/
cd /etc/apache2
La instalación trae un sitio por defecto que nos servirá para comprobar que el servidor está funcionando. Dicho sitio se encuentra en /var/www/html y será accesible conectándonos directamente a la IP del servidor.
En la práctica, el sitio web consiste en un único archivo index.html. En el manual de Apache2 se suele indicar que para levantar nuestro sitio web lo que tenemos que hacer es sustituir este archivo por los archivos de nuestro sitio. Sin embargo yo prefiero crear una nueva carpeta y mantener el sitio por defecto. En caso de problemas, tener disponible un sitio por defecto para comprobar el funcionamiento básico del servidor me ha resultado útil más de una vez.
En mi caso, el sitio web adicional para nextcloud irá en: /var/www/nextcloud
sudo mkdir nextcloud
Cada uno de los sitios web que habilitemos en Apache2 lleva el nombre de Servidor Virtual (Virtual Host) Este esquema de configuración permite servir tantos sitios como queramos, distinguiendo unos de otros mediante el nombre DNS con el que accedamos al servidor y/o con el número de puerto. La configuración para cada sitio se guarda en un archivo en el siguiente directorio de sitios disponibles: /etc/apache2/sites-available/
Si miramos el contenido inicial de este directorio veremos dos plantillas preconfiguradas: una para sitios http normales y otra para sitios con SSL habilitado (sitios https). Normalmente en estos archivos especificamos cosas como el puerto, en nombre DNS con el cual nos conectamos, el directorio web, etc. Para configurar el sitio, copiaremos la plantilla deseada y la personalizaremos con un nombre de archivo que identifique a nuestro sitio y modificaremos los parámetros oportunamente.
Por ejemplo, puedo crear un sitio http en nextcloud.conf. Sin embargo, como voy a utilizar SSL, tendré que utilizar la plantilla preconfigurada para SSL que copiaré a un archivo nextcloud-ssl.conf.
Y ahora, para habilitar el sitio:
sudo a2ensite nextcloud.conf
sudo systemctl reload apache2
Y para deshabilitarlo:
sudo a2dissite nextcloud.conf
sudo systemctl reload apache2
Notar que después de habilitar o rehabilitar un sitio, es necesario recargar la configuración
Nota: Estos comandos, en realidad, lo único que hacen es crear y destruir enlaces simbólicos en el directorio /etc/apache2/sites-enabled/ Si no utilizáramos el comando tendríamos que crear estos enlaces manualmente y el resultado sería el mismo. El mismo esquema es el que se utiliza para habilitar y deshabilitar módulos, como veremos a continuación.
Si queremos habilitar SSL, lo cual es sumamente recomendable, habilitaremos el siguiente módulo:
sudo a2enmod ssl
sudo systemctl reload apache2
Nota: Apache2 genera de manera automática un certificado que será utilizado por defecto cuando habilitemos ssh. Este certificado no está firmado por una autoridad de certificados («Certificate Authority, o CA), sino que está autofirmado. Básicamente, lo que esto implica es que no hay una entidad de un nivel superior que garantice que el servidor sea quien dice ser, sino que es el propio servidor el que se identifica a sí mismo. En condiciones normales esto se considera un riesgo de seguridad y el navegador que utilicemos para conectarnos al servidor nos advertirá de ello. Sin embargo, al ser nosotros mismos quienes gestionamos directamente el servidor, podemos obviar este aviso de manera segura (ya que, obviamente, nosotros ya sabemos quienes somos y no necesitemos que nadie nos lo confirme… ¿o no?). Lo importante es que el acceso a los datos se estará realizando por un canal cifrado, que es de lo que se trata. Sin embargo, si tal aviso nos resulta engorroso, somos un poco obsesivos o el servicio lo van a utilizar terceras personas que no tienen por qué fiarse de nosotros, podemos recurrir a un certificado gratuito generado y firmado por una CA de verdad, como es Let’s Encrypt.
Ahora, sí, resulta que quiero un certificado de verdad. En primer lugar instalo el programa Certbot. Se trata de un software que, mediante el protocolo ACME (Sí, no es coña) nos permite verificar que tenemos control sobre el dominio al cual irá asociado el certificado. Para ello será necesario tener previamente un sitio web funcionando con HTTP, en el puerto 80, en el mismo dominio para el cual voy a solicitar el certificado. Puede ser cualquier sitio, incluso el sitio por defecto de Apache2. Además, una vez instalado el certificado, el sitio se puede deshabilitar.
sudo apt update
sudo apt install software-properties-common
sudo apt install python3-certbot-apache
Ahora vamos a obtener e instalar el certificado. Y, como para casi todo en esta vida, hay dos posibles maneras: la fácil y la buena.
Así que vamos con la buena. Primero, generamos el certificado.
sudo certbot certonly --apache
Me preguntará el dominio y una dirección de email administrativa de contacto y generará el certificado y la clave privada que dejará en los respectivos directorios:
/etc/letsencrypt/live/mi-dominio.com/fullchain.pem
/etc/letsencrypt/live/mi-dominio.com/privkey.pem
Y, ahora sí, configuramos nuestro sitio web añadiendo la ubicación del certificado al archivo de «Virtual Host» en Apache2
sudo nano /etc/apache2/sites-available/nextcloud-ssl.conf
SSLCertificateFile /etc/letsencrypt/live/mi-dominio.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mi-dominio.com/privkey.pem
Y no nos olvidemos de comentar las líneas que se refieren al certificado autofirmado, ya que no es el que queremos usar
#SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
#SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
Y ya está listo. No olvidemos recargar el servicio Apache2
Si queremos comprobar los certificados instalados
sudo certbot certificates
Si queremos eliminar algún certificado
sudo certbot delete --cert-name <nombre-certificado>
Si queremos renovar un certificado próximo a caducar (duran 90 días)
sudo certbot renew --cert-name <nombre-certificado>
Si sólo queremos comprobar el buen funcionamiento de la renovación
sudo certbot renew --dry-run
Nota: Tanto para la generación de un certificado como para su renovación será necesario tener un sitio web habilitado en el mismo dominio en el puerto 80, es decir, accesible con HTTP. Una vez instalado o renovado el certificado, el sitio web en el puerto 80 puede ser deshabilitado.
Ningún misterio en este punto, sobre todo si seguimos las instrucciones de instalación de Nextcloud en las que se instalan todos los módulos recomendados. Únicamente recordar que siempre resulta muy conveniente colocar en el directorio raíz de nuestro sitio web un archivo de tipo php que llame a la instrucción phpinfo(). De esta manera contamos con una sencilla pero eficaz herramienta de depuración que nos permita comprobar el correcto funcionamiento de nuestra instalación de PHP. Para simplificar las cosas, el archivo en cuestión se llamará, simplemente, phpinfo.php
nano phpinfo.php
<?php
// Muestra toda la información, por defecto INFO_ALL
phpinfo();
?>
Éste es el nombre de uno de los sistemas de gestión de bases de datos relacionales de código abierto más populares en la actualidad y que, de hecho, es el aconsejado para la instalación de Nextcloud.
Si bien en el encabezamiento del artículo hablábamos de que la M de un sistema LAMP hacía referencia a MySQL, MariaDB es una opción equivalente y que, en general, es más recomendada. Sus principales impulsores fueron los mismos que crearon MySQL con la diferencia de que ésta fue desarrollada en Oracle Corporation mientras que para MariaDB se creo una fundación que se comprometió a mantener el código bajo licencia GPL. Este compromiso nunca lo tuvo Oracle, más allá de una cierta voluntad inicial, y lo cierto es que algunos módulos de MySQL ya están bajo licencia privativa. Teniendo en cuenta que MariaDB es totalmente compatible con MySQL y que las malas lenguas dicen que rinde mejor, la elección parece clara.
Una vez instalada, el primer paso es conectar con el motor de base de datos. Observar que ejecutamos el comando con sudo, de manera que no es necesario identificarse específicamente para la base de datos.
sudo mariadb
En primer lugar creamos la base de datos
CREATE DATABASE nextcloud_db;
A continuación creamos un usuario y le otorgamos permisos
GRANT ALL PRIVILEGES ON nextcloud_db.* TO 'nextcloud_usr'@localhost IDENTIFIED BY 'password';
Y no nos olvidemos de aplicar los cambios
FLUSH PRIVILEGES;
Y por si os lo estabais preguntando, la razón del curioso nombre de esta base de datos reside en la tradición de su principal creador, un tal Ulf Michael Widenius (al que, por razones obvias, sus amigos llaman Monty) de incluir en la denominación de sus creaciones los nombres de sus hijos. Así, su primer hijo, My, dio lugar a MySQL, mientras que su segunda hija, María, inspiró MariaDB. Muy tierno, el tío Monty.
Existen varios métodos para instalar un servidor de Nextcloud. La instalación web es posiblemente la más sencilla de todas y tiene la ventaja de que el procedimiento es idéntico tanto si la instalación la hacemos en un espacio de alojamiento compartido como en un servidor personal. Consiste, básicamente, en descargar un archivo llamado setup-nextcloud.php, colocarlo en la raíz de nuestro sitio web y dirigirnos a él desde cualquier navegador. Nos aparecerá un asistente de instalación y lo único que tenemos que hacer es seguir las instrucciones e ir aportando la información necesaria.
Por cierto, en el momento de escribir esta entrada lo cierto es que encontré la web de Nextcloud un tanto confusa, así que para ahorrar trabajo el manual de instalación se encuentra aquí, con un práctico ejemplo de instalación en Ubuntu. Respecto a la descarga del archivo php para la instalación en web, el enlace proporcionado en dicho manual no es de mucha utilidad, y al final no me quedó otra que recurrir a la misma página de github donde se encuentra el proyecto. Supongo que poco a poco irán poniendo orden.
Un tema importante, por cuestión de seguridad, se refiere al hecho de que los archivos se encuentran por defecto dentro del directorio web mientras que el archivo .htacces está desactivado. Recordemos que el archivo .htaccess es un método clásico que permite restringir el acceso a los directorios que se encuentran dentro del directorio de nuestra web. Sin embargo, este método no es del todo fiable y, además, compromete el rendimiento del servidor. Es por ello que, por defecto, se encuentra deshabilitado. Una discusión interesante se encuentra en el siguiente artículo:
https://httpd.apache.org/docs/2.4/howto/htaccess.html#when
Entonces, para mantener a salvo nuestros archivos, lo mejor es colocar el directorio de datos fuera de la raíz de documentos del sitio web. El problema es que, una vez realizada la instalación, para mover el directorio de datos no basta con modificar la entrada en el archivo de configuración, sino que habría que corregir múltiples entradas en la base de datos. Este procedimiento está oficialmente desaconsejado por el equipo de Nextcloud, que recomienda, en su lugar, seleccionar el directorio definitivo durante la instalación.
Nota sobre permisos: Es importante que el directorio de datos pertenezca al usuario y grupo www-data que es bajo el que se ejecuta Apache2. También es importante que dicho directorio no se encuentre dentro de una ruta que lo haga inaccesible debido a la falta de acceso de ejecución sobre alguno de los directorios de la misma. En mi caso, el directorio de usuario pertenece a www-data:www-data con permisos 750 y se encuentra dentro de una unidad de disco montada en un directorio con propiedad root:root y permisos 755. Si nos fijamos, es el mismo esquema que siguen los directorios de usuario dentro de /home en una instalación regular de Linux.
Una vez instalado el servidor podemos acceder al panel de control del mismo en la dirección https://<mi_dominio//index.php/apps/dashboard/
Una vez allí, una página me mostrará una lista de asuntos que resulta necesario optimizar. Esta lista puede variar de un servidor a otro. Aquí me limitaré a comentar algunos de los cambios que, según mi experiencia, suelen ser los más habituales, o bien aquellos con los que me he ido encontrando a lo largo de la experimentación con Nextcloud.
Es habitual tener que introducir algunas modificaciones en el archivo de configuración de PHP, php.ini Para ello, lo primero es localizar dicho archivo de configuración, ya que según la instalación pueden existir varios y es necesario saber cuál es el que se está cargando. La manera de averiguarlo es consultar el archivo de depuración de PHP mencionado antes, es decir, la página phpinfo.php
En mi caso: /etc/php/8.1/fpm/php.ini
Un cambio clásico suele ser el ajuste del límite de memoria al valor recomendado: 128M -> 512M
Como siempre, cualquier cambio a la configuración de PHP requiere reiniciar el servicio
sudo systemctl restart php8.1-fpm
También suele ser frecuente la recomendación de instalar algunos paquetes adicionales, tales como php-imagick y para el soporte svg, libmagickcore-6.q16-6-extra (que, por cierto, viene entre los paquetes sugeridos)
php-intl
Un error común que se nos muestra en la sección de vista general incluye el siguiente mensaje:
No se ha podido ejecutar el trabajo cron vía CLI. Han aparecido los siguientes errores técnicos:
Tu directorio de datos es inválido Asegúrate de que existe un archivo llamado «.ocdata» en la raíz del directorio de datos.
Y además en rojo, lo que acojona un poco. Al parecer tiene que ver con la manera en la que el servidor ejecuta las tareas de manera periódica. Desconozco la razón del aviso, pero una manera de solucionarlo es seleccionar CRON en la sección de Ajustes básicos y añadir una tarea que viene en el propio directorio de instalación de Nextcloud ya que, al parecer, esta tarea no se registra sola:
sudo su
crontab -u www-data -e
*/5 * * * * /usr/bin/php /var/www/nextcloud/cron.php
También nos podemos encontrar con un error al intentar conectar con los protocolos CalDAV. Esto es debido a que la resolución correcta de las rutas de cada protocolo se encuentran especificadas en el archivo .htaccess, el cual, como ya hemos visto, está deshabilitado por defecto. Una solución es habilitarlo sólo para nuestro sitio web añadiendo estas línes al archivo de «Virtual Host»:
<Directory /var/www/nextcloud/>
AllowOverride All
</Directory>
Instalo la cache con apt install php-apcu
Se creará el archivo de configuración de php /etc/php/8.1/conf.d/20-apcu.ini En él añado las siguientes líneas (encontradas por ahí…)
apc.enabled=1
apc.file_update_protection=2
apc.optimization=0
apc.shm_size=256M
apc.include_once_override=0
apc.shm_segments=1
apc.ttl=7200
apc.user_ttl=7200
apc.gc_ttl=3600
apc.num_files_hint=1024
apc.enable_cli=0
apc.max_file_size=5M
apc.cache_by_default=1
apc.use_request_time=1
apc.slam_defense=0
apc.stat_ctime=0
apc.canonicalize=1
apc.write_lock=1
apc.report_autofilter=0
apc.rfc1867=0
apc.rfc1867_prefix =upload_
apc.rfc1867_name=APC_UPLOAD_PROGRESS
apc.rfc1867_freq=0
apc.rfc1867_ttl=3600
apc.lazy_classes=0
apc.lazy_functions=0
Le indico a nextcloud que utilice apcu en su archivo de configuración
sudo nano /var/www/nextcloud/config/config.php
'memcache.distributed' => '\\OC\\Memcache\\APCu',
'memcache.local' => '\\OC\\Memcache\\APCu',
Reinicio, y a funcionar
sudo systemctl restart php8.1-fpm.service
sudo systemctl restart apache2.service
El inquietante «Octopus Anti-monopoly», del artista americano George Luks, 1899
LUKS, además de un peculiar artista norteamericano, son las siglas para «Linux Unified Key Setup», que vendría a ser un conjunto de especificaciones para el cifrado de discos duros. Aunque su nombre deja claro que fue creado inicialmente para trabajar en entornos Linux, la realidad es que su implementación ha originado un estándar que es en la práctica independiente de plataforma y que puede ser utilizado por diferentes herramientas en sistemas diferentes. Concretamente, LUKS trabaja sobre dispositivos de bloque, por lo que el contenido del mismo resulta arbitrario, pudiendo funcionar con cualquier sistema de archivos. Además, aunque el cifrado del volumen se realiza con una única clave maestra, LUKS proporciona un sistema para que múltiples usuarios con distintas claves puedan acceder a dicha clave maestra. Para ello, cada volumen LUKS dispone de una cabecera con un conjunto de ranuras (slots), cada una de las cuales puede almacenar una clave de cifrado junto con los parámetros necesarios para el manejo de la misma. El número de ranuras dependerá de la versión de implementación de LUKS, siendo 8 lo más habitual. Cada clave almacenada en cada ranura permitirá el acceso a la clave maestra y, por lo tanto, el descifrado del volumen, con la ventaja de que estas claves individuales pueden ser añadidas y eliminadas a discreción, lo que permite gestionar la estrategia de accesos al volumen sin que el cifrado maestro se vea afectado..
LUKS puede ser utilizado tanto para cifrar particiones individuales como sistemas de archivos completos, incluyendo la partición de arranque. Esto es especialmente útil en portátiles, teniendo en cuenta el riesgo que supone para nuestra privacidad cualquier percance que pudiera terminar con nuestros preciados datos en manos de desconocidos.
Para el cifrado del sistema de archivos completo los asistentes de instalación de la mayoría de las distribuciones de Linux suelen incluir una opción para realizarlo de manera transparente durante la instalación, por lo que no nos vamos a detener en este punto.
En nuestro caso nos centraremos en el cifrado de un disco completo al margen de nuestro disco de sistema, ya sea porque se trate de un disco externo con copias de seguridad que queremos llevar de aquí para allá, ya sea porque queremos que los datos del disco secundario de nuestro ordenador de escritorio estén a buen recaudo.
Para empezar, lo primero es asegurarnos de que tenemos instalado el paquete «cryptsetup»
sudo apt install cryptsetup
Y, a continuación, ciframos el disco completo:
sudo cryptsetup -v -y luksFormat /dev/sda
Tras lo cual nos pedirá una frase de contraseña
Observar que como estamos cifrando el disco duro completo el nombre de dispositivo corresponde a un volumen entero, no a una partición
Una vez cifrado el disco duro podremos darle el formato deseado (recordemos que, a diferencia de otros sistemas de cifrado de disco duro, LUKS es totalmente independiente del formato y compatible con cualquier formato de disco)
Supongamos que tenemos un disco duro externo para copias de seguridad que, al conectarlo, se muestra en /dev/sdb, y que queremos descifrarlo y montarlo en el directorio /mnt/external
Comenzamos utilizando el comando cryptsetup para abrir el volumen cifrado y añadirlo al mapeador de dispositivos (Device Mapper) con el nombre que elijamos, en este caso, «encrypted_volume».
sudo cryptsetup luksOpen /dev/sdb encrypted_volume
Si aún no hemos creado un punto de montaje, para el caso de nuestro disco duro externo…
sudo mkdir /mnt/external
… y montamos utilizando el nombre previamente asignado en el mapeador
sudo mount /dev/mapper/encrypted_volume /mnt/external
Lo mismo pero al revés. Desmontamos el volumen y cerramos el volumen cifrado.
sudo umount /mnt/external
sudo cryptsetup luksClose encrypted_volume
Si lo que queremos es que el montaje de la unidad cifrada se realice automáticamente al arrancar el sistema necesitamos realizar los dos pasos configurando los respectivos archivos crypttab y fstab. En este caso se tratará de un disco interno que se muestra en /dev/sda y que queremos montar en /mnt/datos
sudo nano /etc/crypttab
# <target name> <source device> <key file> <options>
encrypted_volume /dev/sda none
La opción «none» indica que no queremos especificar un archivo de clave.
En este momento podemos reiniciar la máquina y ver qué pasa: Durante el arranque, el sistema intentará abrir el dispositivo cifrado y al no disponer de un archivo de clave nos la pedirá de manera interactiva. Una vez introducida el volumen quedará descifrado, mapeado y listo para ser montado.
sudo nano /etc/fstab
# disco cifrado
/dev/mapper/encrypted_volume /mnt/datos ext4 defaults 0 2
Ahora podemos reiniciar de nuevo. El sistema nos mostrará un diálogo para pedirnos la contraseña y, al finalizar el arranque, el disco estará montado y disponible en nuestro sistema de archivos.
Puede interesarnos que el montaje de la unidad cifrada se realice sin necesidad de introducir manualmente la contraseña. Esto es particularmente útil cuando queremos iniciar servidores de forma remota o automática. Existen varias maneras de implementar esta función, pero la más sencilla consiste en utilizar un fichero de clave almacenado en el propio servidor.
Que quede claro: el fichero puede ser cualquiera y tener cualquier contenido. Es habitual crear largos archivos con una sucesión aleatoria de datos pero, sinceramente, si alguien se hace con el fichero, tanto da la complejidad del mismo. Para que el fichero pueda ser utilizado para descifrar el disco deberá ser añadido a una de las ranuras de la cabecera del volumen LUKS
Por convención, guardaremos el fichero en la siguiente ruta:
/root/luks_keyfile
A continuación añadimos el fichero a las claves de LUKS
sudo cryptsetup luksAddKey /dev/sda/ /root/luks_keyfile
Nos pedirá una contraseña válida para este volumen.
Ahora, para que el descifrado se realice con dicho fichero, sólo queda especificarlo en el archivo crypttab en lugar de «none»
sudo nano /etc/crypttab
# <target name> <source device> <key file> <options>
encrypted_volume /dev/sda /root/luks_keyfile
Y… ya está.
Nota: En tanto que cualquier fichero puede servir de clave y, en este caso, debe residir necesariamente en el servidor, es una buena idea disimular un poco de qué fichero se trata. En este ejemplo se lo hemos puesto a huevo a cualquiera que se quiera hacer con el contenido de nuestro disco duro (aunque si nos roban el servidor, teniendo en cuenta que se monta solo, tampoco harían falta muchas luces). En cualquier caso, si lo que queremos es ponerlo un poquito más difícil a un ladrón despistado, la posibilidad más obvia es utilizar un fichero arbitrario con un nombre arbitrario y un contenido arbitrario guardado en un lugar arbitrario. Ah! y no debemos tener miedo de perderlo, ya que la contraseña que hayamos utilizado para cifrar inicialmente el volumen siempre nos va a servir.
Cuando deja de funcionar, no siempre es porque se hayan caído los servidores de myopenhab.org… A veces me he encontrado con el servicio desconfigurado. Si ya lo hemos probado todo, el siguiente procedimiento suele funcionar.
sudo systemctl stop openhab2
sudo openhab-cli clean-cache
sudo systemctl start openhab2
cat /var/lib/openhab2/uuid
cat /var/lib/openhab2/openhabcloud/secret
Si queremos habilitar nuestro controlador domótico para gestionar una red Z-Wave necesitaremos incorporar un dispositivo que actúe como puerta de enlace entre la red y nuestro software de control Openhab. Estos dispositivos suelen venir en forma de «dongle» USB y sea cual sea la manera en que nuestro software se comunique con él, siempre deberemos especificar el puerto serie virtual al que se encuentra conectado. Sabiendo que son muchos los puertos serie virtuales que un sistema linux es capaz de crear, necesitaremos identificar correctamente cuál corresponde al dispositivo que queremos manejar.
Nota: Si bien nuestro propósito es conectar un «dongle» que nos permita gestionar una red domótica inalámbrica, todo el procedimiento aquí descrito es igualmente válido para cualquier dispositivo USB que enchufemos a nuestra máquina.
La manera clásica de hacer esto consiste en listar los dispositivos de este tipo antes y después de enchufar el adaptador y ver qué nueva línea es la que aparece en el listado.
ls -l /dev/tty*
En nuestro caso, acabamos de conectar un dongle Z-Wave Gen5 de la marca Aeotec, y lo que obtenemos es el puerto serie virtual se llama: /dev/ttyACM0
Si ahora, por ejemplo, hacemos lo mismo con el adaptador Zigbee Sonoff mientras está enchufado el anterior, veremos que aparece un segundo puerto: /dev/ttyUSB0
En principio, con estos datos ya tendríamos suficiente. Sin embargo, el problema de que la asignación de puerto se realice dinámicamente es que el puerto serie asignado al adaptador puede variar cada vez que el sistema se reinicie o, incluso, cada vez que el dispositivo se desenchufe, dependiendo de los puertos disponibles, con lo cual la configuración que hayamos ajustado para nuestro software dejará de tener sentido. De hecho, la asignación anterior de puertos podría depender, simplemente, de los puertos USB utilizados o, incluso, del orden en el que se enchufan. Para evitarlo es preciso crear una regla de persistencia.
Lo primero es obtener la información que identifica unívocamente a nuestro adaptador, concretamente dos números hexadecimales llamados «idVendor» e «idProduct». Esto se consigue listando los dispositivos USB reconocidos por el sistema. Y, para evitar confusiones, como antes, mejor hacerlo antes y después de enchufarlo.
Por ejemplo, antes de enchufar ningún adaptador obtenemos esto:
lsusb
Bus 001 Device 003: ID 058f:6254 Alcor Micro Corp. USB Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Todos estos dispositivos corresponden, simplemente, al Hub USB. Sin embargo, si enchufamos el adaptador Z-Wave vemos esto:
lsusb
Bus 001 Device 003: ID 058f:6254 Alcor Micro Corp. USB Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 004: ID 0658:0200 Sigma Designs, Inc. Aeotec Z-Stick Gen5 (ZW090) - UZB
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Y después de enchufar los dos, esto otro:
lsusb
Bus 001 Device 003: ID 058f:6254 Alcor Micro Corp. USB Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 005: ID 10c4:ea60 Silicon Labs CP210x UART Bridge
Bus 004 Device 004: ID 0658:0200 Sigma Designs, Inc. Aeotec Z-Stick Gen5 (ZW090) - UZB
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
En este formato, lo que nos interesa son los dos números hexadecimales que aparecen después de ID, de esta forma <idVendor>:<idProduct>
Ahora creamos el siguiente archivo en el que añadimos una línea por cada dispositivo, especificando los ID’s obtenidos en el paso anterior y un nombre facilmente reconocible:
sudo nano /etc/udev/rules.d/usb-serial.rules
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="0658", ATTRS{idProduct}=="0200", SYMLINK+="ttyUSB-AEON-ZWAVE"
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="10C4", ATTRS{idProduct}=="EA60", SYMLINK+="ttyUSB-SONOFF-ZIGBEE"
Esto creará un enlace simbólico entre el nombre que nosotros especifiquemos para cada dispositivo y el puerto al que se asigne cada vez, independientemente de cuál se trate.
Ahora, si comprobamos el listado de los dispositivos de tipo puerto serie (tras reiniciar):
ls -l /dev/tty*
crw-rw-rw- 1 root tty 5, 0 May 16 19:15 /dev/tty
crw--w---- 1 root tty 4, 0 May 15 22:38 /dev/tty0
crw--w---- 1 root tty 4, 1 May 15 22:39 /dev/tty1
crw--w---- 1 root tty 4, 2 May 15 22:38 /dev/tty2
crw--w---- 1 root tty 4, 3 May 15 22:38 /dev/tty3
crw--w---- 1 root tty 4, 4 May 15 22:38 /dev/tty4
crw--w---- 1 root tty 4, 5 May 15 22:38 /dev/tty5
crw--w---- 1 root tty 4, 6 May 15 22:38 /dev/tty6
crw--w---- 1 root tty 4, 60 May 15 22:38 /dev/tty60
crw--w---- 1 root tty 4, 61 May 15 22:38 /dev/tty61
crw--w---- 1 root tty 4, 62 May 15 22:38 /dev/tty62
crw--w---- 1 root tty 4, 63 May 15 22:38 /dev/tty63
crw--w---- 1 root tty 4, 7 May 15 22:38 /dev/tty7
crw--w---- 1 root tty 4, 8 May 15 22:38 /dev/tty8
crw--w---- 1 root tty 4, 9 May 15 22:38 /dev/tty9
crw-rw---- 1 root dialout 166, 0 May 16 19:25 /dev/ttyACM0
lrwxrwxrwx 1 root root 7 May 15 22:38 /dev/ttyUSB-AEON-ZWAVE -> ttyACM0
lrwxrwxrwx 1 root root 7 May 15 22:38 /dev/ttyUSB-SONOFF-ZIGBEE -> ttyUSB0
crw-rw---- 1 root dialout 188, 0 May 16 18:17 /dev/ttyUSB0
crw------- 1 root root 5, 3 May 15 22:38 /dev/ttyprintk
Podemos comprobar los nombres elegidos por nosotros y los puertos a los que hacen referencia en este momento. Por cierto, también observamos que para acceder a estos puertos es necesario ser root o pertenecer al grupo dialout
Ahora ya podemos indicar al software que vaya a utilizar el dispositivo el puerto serie en cuestión. En el caso de que dicho software sea openhab, necesitaremos que su entorno de configuración reconozca estos nombres para hacerlos disponibles en el contexto del programa. Para ello modificamos el archivo de configuración de entorno en /etc/default/openhab añadiendo la siguiente opción en la sección correspondiente:
sudo nano /etc/default/openhab
EXTRA_JAVA_OPTS="-Dgnu.io.rxtx.SerialPorts=/dev/ttyUSB-AEON-ZWAVE:/dev/ttyUSB-SONOFF-ZIGBEE"
Y ya sólo necesitaríamos configurar los puertos correctos en la interfaz de OpenHab que corresponda al servicio en cuestión. En nuestro ejemplo, los Addons correspondientes a las redes Z-Wave y Zigbee.
Hasta la fecha de empezar a escribir estas notas, los dispositivos inalámbricos que componían mi sistema doméstico eran de dos tipos: Wifi, con protocolo MQTT y Z-Wave. Como en algún momento dejaré documentado, los dispositivos Wifi tenían la ventaja de ser muy económicos, y el inconveniente de que todos funcionaban con una aplicación propietaria, por lo que si queríamos conectarlos con un protocolo abierto resultaba necesario un pequeño hackeo. Por su parte, los dispositivos Z-Wave tenían la ventaja de funcionar «out of the box» pero el grave problema de ser más caros que el jamón. Respecto a Zigbee, lo cierto es que ha estado siendo durante todos estos años el niño perdido de la domótica. Diseñado como un protocolo con bajos requerimientos de hardware y, por ende, de elección para la fabricación de dispositivos potencialmente baratos, había sido tan pobremente adoptado que los pocos dispositivos que había eran raros y con precios no precisamente competitivos… En fin!
Sin embargo, ahora las cosas están cambiando. Raros engendros como Alexa o Google Assistant están consiguiendo que la domótica, relanzada ahora con el nombre de «hogar digital», este pasando de ser una chaladura de cuatro frikis asociada a pelis japos futuristas a convertirse casi, casi en un deporte nacional. Como consecuencia, estoy empezando a ver aparecer dispositivos Zigbee de diversas marcas más o menos reconocidas y a precios similares a los productos Wifi chinos. Por cierto, que entre ellos está una línea de productos de Ikea. Así que decidí que era momento de dedicarles un poco de atención y empezar a aprovechar el tirón.
Lo primero para empezar a funcionar con Zigbee será adquirir y configurar un coordinador universal. Por supuesto, cada marca ofrece su propio coordinador con su app, pero por mal camino iríamos si para aprovechar un protocolo estándar nos liáramos con hardware particular de cada fabricante. Estos coordinadores universales suelen venir con la forma de un dongle USB, y lo que nos interesa es que pueda ser manejado por nuestro controlador domótico. A día de hoy, Openhab dispone de un Addon para Zigbee, pero desgraciadamente se encuentra todavía un poco en pañales y no son muchos los coordinadores con los que puede funcionar sin problemas. En concreto, le había echado el ojo a un coordinador universal que acaba de sacar Sonoff con bastante buena pinta y a un precio bastante interesante, pero que el Addon de Openhab aún no puede reconocer. Existen coordinadores más caros, más antiguos y menos disponibles que sí son compatibles pero, la verdad, no me parece una buena idea tener que morir a este palo.
Afortunadamente ya hace tiempo que existe una solución, bastante más madura, que tiene pinta de provisional pero que bien pudiera quedarse de manera definitiva en función de como evolucionen las cosas. Y se llama Zigbee2MQTT
Como su nombre indica, se trata de un puente entre ambos protocolos. En la práctica consiste en un software independiente que se ejecuta al margen de Openhab, de manera similar al broker MQTT. Zigbe2MQTT puede manejar un buen puñado de coordinadores, entre ellos el que acabo de mencionar de Sonoff, así que decidí probarlo y darle tiempo al equipo que está trabajando en el Addon para ver qué pasa. Y a la vez ir probando el puente y comprobar su versatilidad.
El funcionamiento es bastante sencillo. Por un lado, Zigbe2MQTT se conecta al coordinador para gestionar la red Zigbee, comunicándose directamente con un montón de dispositivos compatibles. Y, por otro, se enlaza al broker MQTT que uno tenga previamente instalado en su controlador domótico permitiendo así la monitorización y control de todos los dispositivos Zigbee mediante mensajes MQTT enviados y recibidos por el broker. Así, para manejar estos dispositivos desde Openhab lo único que tenemos que hacer es añadirlos como cosas genéricas MQTT. Parece sencillo, ¿no?
La instalación de Zigbee2MQTT viene bastante bien explicada en su página web. Dejo aquí unas notas de las vueltas que tuve que dar para hacer funcionar el tema.
1.- El software se descarga de Github y se compila en la propia máquina. Una vez hecho, lo instalamos como un servicio. Hasta aquí, ningún misterio.
2.- Si seguimos el proceso de instalación sugerido, el archivo de configuración se guarda en
nano /opt/zigbee2mqtt/data/configuration.yaml
3.- En este fichero conviene hacer algunos cambios. Unos claramente sugeridos en las intrucciones, otros no tanto. Por ejemplo, para manejar el software desde la interfaz web incluida en el paquete es preciso añadir las siguientes líneas al fichero de configuración:
frontend:
port: 8081
Ojo, que el puerto por defecto es el 8080 que coincide con el de Openhab. De ahí que haya decidido cambiarlo al 8081.
También conviene modificar, por seguridad, el parámetro que permite que cualquier dispositivo Zigbee detectado pueda conectarse sin más (y habilitar esta característica a mano desde la interfaz cada vez que la necesitemos)
permit_join: false
El resto de cambios, como la especificación del puerto serie o la generación de una clave de red personalizada son claramente explicados en las indicaciones. Respecto del puerto serie, dos indicaciones:
Ambas indicaciones vienen explicadas aquí.
Ya he mencionado qué coordinador elegí para comenzar mis pruebas. Ahora presentaré el primer dispositivo Zigbee en incorporarse a mis filas: Una bombilla regulable de la marca Osram que encontré en Amazon por menos de 10€
Como hemos indicado, una vez instalado el software la interfaz Web nos permite añadir dispositivos y controlarlos directamente desde la propia interfaz. Ahora bien, si queremos controlar los dispositivos a través del broker MQTT necesitamos conocer la estructura de los mensajes, lo que puede variar un poco de un dispositivo a otro. Para ello, nada como la aplicación MQTT Explorer, directamente disponible desde los repositorios de SNAP,
Operando sobre el dispositivo y fisgando con el explorer podemos ver los mensajes que alcanzan al broker. El «topic» para todos ellos es de la forma zigbee2mqtt/nombre-dispositivo/ y el «payload» del mensaje es una cadena de tipo JSON con los valores de las variables relevantes. Concretamente, para mi bombilla:
{»brightness»:124,»linkquality»:90,»state»:»ON»,»update»:{«state»:»available»}}
El prefijo del «topic» es por defecto zigbee2mqtt, pero puede ser modificado en el archivo de configuración. Y el nombre del dispositivo también puede ser personalizado desde la interfaz web una vez nos conectamos a él.
Sin embargo, si desde el explorer enviamos a dicho «topic» una cadena con la misma estructura y los valores que nosotros queremos, resulta que no pasa nada!!!
Tras mucho darle vueltas y ponerme a trazar diagramas encuentro lo evidente. La pista me la dio la variable «linkquality». Obviamente, esta variable se genera tras la recepción del mensaje, ya que no tiene ningún sentido establecer la calidad del enlace antes de que éste tenga lugar, más que nada porque aún no se conoce. Como estamos operando el dispositivo directamente a través de la red Zigbee, estos mensajes que puedo leer en el explorador son solamente aquellos que van de Zigbee2MQTT hacia el broker MQTT. Es decir, son mensajes que informan del estado del dispositivo después de que éste haya cambiado su estado. Así que, si queremos modificar el estado del dispositivo enviando mensajes al broker desde otro programa, tal como el MQTT Explorer u Openhab, ¿cómo lo hacemos? Rebuscando un poco por ahí, ya no recuerdo dónde, di con la solución, bastante simple pero un poco puñetera si, como yo, no sabemos bien lo que estamos estamos buscando:
Los mensajes que queremos que alcancen el dispositivo han de ir dirigidos a este topic: zigbee2mqtt/nombre-dispositivo/set, y la carga útil del mensaje es, simplemente, la variable que queremos modificar en formato JSON. Por ejemplo:
zigbee2mqtt/nombre-dispositivo/set {«brightness»:124}
o bien:
zigbee2mqtt/nombre-dispositivo/set {«state»:»ON»}
Y… voilà!
Pues eso, una entrada rápida para dejar registro del calvario que supone, en ocasiones, actualizar a una versión nueva y radiante de Ubuntu. El asunto: un servidor con LMS deja de funcionar al actualizar a Ubuntu 22.04, así, sin más.
Algún día daré cuenta de cómo es eso de instalar un sistema de audio distribuido por toda la casa con software libre y hardware casero. Algo a la altura de los carísimos sistemas propietarios de varias marcas de prestigio pero al alcance de cualquier bolsillo modesto. Una auténtica gozada. Y prácticamente gratis. Envidia, ¿¿eh??
Pero ahora vamos al lío. Lo primero es recabar un poco de información.
1.- Lo primero, ojear el estado del servicio logitechmediaserver. Al parecer no se está ejecutando y cada vez que lo arranco muere inmediatamente:
$sudo systemctl status logitechmediaserver
○ logitechmediaserver.service - Logitech Media Server
Loaded: loaded (/lib/systemd/system/logitechmediaserver.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Wed 2022-05-11 00:47:56 CEST; 1s ago
Process: 113300 ExecStart=/usr/sbin/squeezeboxserver --prefsdir $PREFSDIR --logdir $LOGDIR --cachedir $CACHEDIR --charset $CHARS>
Main PID: 113300 (code=exited, status=0/SUCCESS)
CPU: 450ms
May 11 00:47:56 blackstone squeezeboxserver[113300]: If you're running some unsupported Linux/Unix platform, please use the buildme.>
May 11 00:47:56 blackstone squeezeboxserver[113300]: script located here:
May 11 00:47:56 blackstone squeezeboxserver[113300]: https://github.com/Logitech/slimserver-vendor/tree/public/8.2/CPAN
May 11 00:47:56 blackstone squeezeboxserver[113300]: If 8.2 is outdated by the time you read this, Replace "8.2" with the major vers>
May 11 00:47:56 blackstone squeezeboxserver[113300]: You should never need to do this if you're on Windows or Mac OSX. If the instal>
May 11 00:47:56 blackstone squeezeboxserver[113300]: don't work for you, ask for help and/or report a bug.
May 11 00:47:56 blackstone squeezeboxserver[113300]: *******
May 11 00:47:56 blackstone squeezeboxserver[113300]:
May 11 00:47:56 blackstone squeezeboxserver[113300]: Exiting..
May 11 00:47:56 blackstone systemd[1]: logitechmediaserver.service: Deactivated successfully.
2.- Para tener una idea de por qué se aborta puedo correr el servidor directamente desde el ejecutable:
$squeezeboxserver
The following modules failed to load: DBI EV XML::Parser::Expat HTML::Parser JSON::XS Digest::SHA1 YAML::XS Sub::Name
Lo que ya me está indicando un problema con la carga de los módulos de Perl el cual, por cierto, está instalado en su última versión.
3.- Veamos un poco más información sobre la versión de Perl actualmente instalada:
$perl -v
This is perl 5, version 34, subversion 0 (v5.34.0) built for x86_64-linux-gnu-thread-multi
(with 50 registered patches, see perl -V for more detail)
Copyright 1987-2021, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
Es decir, que tenemos la versión v5.34. ¿Y por qué no cargan los módulos? Pues vaya usted a saber. O mejor aún, búsquelo usted en DuckDuckGo (je, je…)
La primera idea es que la actualización a Ubuntu 22.04 haya implicado un cambio a una versión más reciente de Perl (no comprobado) y que cuando LMS se ejecuta busca los módulos correspondientes a esta versión. Pero como LMS se instaló con una versión de Perl anterior, dichos módulos, simplemente, no están. Así que lo lógico parece reinstalar LMS (y, de paso, instalar la última versión). Sin embargo, esto no parece funcionar…
Así que me fijo en los mensajes de la primera salida, que había pasado por alto, y veo que los muchachos de Logitech en realidad ya me han dejado una pista que seguir, aunque de una manera un pelín críptica. Ubuntu NO es, o al menos hasta la fecha no lo era, una plataforma no soportada para su Media Server (Por eso la primera vez ni seguí leyendo) Pero, como lo cierto es que no está funcionando, empecé a pensar que, de hecho, ahora SÍ que lo es. De modo que me puse a seguir el rastro de migas.
El enlace lleva a un repositorio de github con un software que hay que compilar para parchear la instalación del servidor. También hay un archivo de ayuda (README.md) con unas austeras indicaciones de qué hacer con este software. Así que cloné el repositorio, lo compilé con el script proporcionado (buildme.sh) y realicé la copia de las dos carpetas generadas a la ruta donde squeezeboxserver está instalado, tal como indican las instrucciones. Por cierto, que me costó un poco encontrar la dichosa ruta, así que la dejo anotada aquí:
$cd /usr/share/squeezeboxserver/CPAN/arch/
Curioseando en esta carpeta compruebo, para mi sorpresa, que hay compilaciones instaladas automáticamente con cada una de las versiones anteriores, pero ninguna para la actual versión de Perl, la 5.34. Es decir, que cada instalador ha generado su carpeta con sus módulos salvo la última ¿Y eso por qué? Efectivamente, algo aquí no está funcionando bien. Y, efectivamente, una vez compilado el software y copiado a la ruta en cuestión, mi querido Logitech Media Server vuelve a funcionar. Eso sí, queda sin explicar por qué ya no se incluyen automáticamente estos módulos durante la instalación, si es que los de Logitech han decidido dejar de dar soporte a Ubuntu, si tiene que ver con la versión de Perl o qué, por lo que no sabemos qué pasará cando haya nuevas actualizaciones. Como siempre, cruzaremos ese puente cuando lleguemos a él. Y si eso… ya lo comentaremos.
… en el mar es lo mejor 𝅘𝅥𝅰 𝄞 ¿Alguien se acuerda de la canción de los payasos de la tele? Qué tiempos aquellos… en los que se podían surcar los procelosos mares de internet sin tener a un señor de negro subido a la chepa. Por cierto, dejaré un enlace a la canción al final del artículo, por eso de la nostalgia, y tal…
Empecemos por el principio. Ahora bien, no voy a meterme a hacer una comparativa en cuanto a navegadores. Si quieres una, hay miles en internet (Si no me crees puedes buscarlas en Google, je, je…). Aquí me limitaré a mostrar algunas conclusiones. Y en este punto lo tengo claro: Mozilla Firefox.
Es un proyecto de código abierto, apoyado por una comunidad madura y comprometida, con un desarrollo de largo recorrido, continuo y con frecuentes actualizaciones. Está construido desde su base con la privacidad como objetivo y aunque quizás no sea de los más espectaculares en rendimiento y prestaciones, funciona francamente bien. Por algo es el navegador predeterminado en Ubuntu y para mí es más que suficiente.
Respecto a los navegadores basados en Chrome diré que hay algunos que son estupendos, pero todos tienen un pequeño inconveniente: y es que están basados en Chrome. Y sí, ya sé que a partir del código abierto de Chrome se puede hacer un buen navegador que no comprometa la privacidad y tal. Pero ya desde el título de esta entrada dejo claro que lo que quiero es alejarme lo más posible de Google así que… ajo y agua.
Migrar desde Chrome a Firefox resulta muy sencillo, ya que el propio Firefox permite realizar la importación de todos los datos de navegación de un navegador a otro. Sin embargo, una de las cosas que quizás tiene peor resueltas es el tema del uso de varios perfiles dentro de una misma cuenta, algo que a mí me resulta muy útil. De hecho, las opciones para crear perfiles y cambiar de uno a otro no están a la vista. Es necesario ingresar en una página local introduciendo la expresión about:profiles en la barra de direcciones. Una solución un tanto rara, la verdad, pero que se arregla añadiendo un marcador a la barra de marcadores. No es elegante pero funciona.
Ni que decir tiene que si queremos mantener una navegación suficientemente privada no basta con utilizar este navegador (ni cualquier otro). Por defecto Firefox adopta medidas como la ocultación de la ubicación y el bloqueo de rastreadores, sin embargo es importante tener mucho cuidado a la hora de instalar complementos que puedan comprometer la privacidad.
Pero quizás, incluso antes de pensar en cambiar de navegador merece la pena reflexionar sobre el buscador. ¿Alguien se acuerda de Altavista? ¿O de Yahoo? ¿Cuándo y cómo llegamos a convencernos de que buscar en Internet era equivalente a buscar en Google? Tan acostumbrados estamos que da escalofríos sólo pensarlo.
Y no es cuestión baladí. Aquí conviene tener presente que la privacidad va en dos sentidos (por lo menos): que los buscadores no almacenen nuestras búsquedas es sólo una parte. Luego está la neutralidad de los resultados que el buscador arroja, incluyendo publicidad, o resultados que el buscador deduce que son «más relevantes» para nosotros, como les gusta llamar a estas compañías el hecho de mostrarnos aquella información que más fácil nos va a entrar para satisfacer a un tiempo nuestros impulsos y sus intereses.
(Dejo este enlace a un artículo que me resultó bastante interesante)
Igual que antes, no me enredaré en comparativas y me limitaré a señalar a DuckDuckGo como la opción más interesante. Merece la pena configurarlo como buscador por defecto. Por cierto, existe un complemento para Firefox llamado DuckDuckGo Privacy Essentials que resulta muy interesante instalar. Entre otras cosas, nos va informando de todos los rastreadores y anuncios que nos va bloqueando conforme navegamos, lo cual no hace sino contribuir a ponernos los pelos de punta al hacernos conscientes de hasta qué punto las grandes plataformas se dedicaban a cotillear en nuestras cosas cuando aún no usábamos estas herramientas.
En el caso del móvil tenemos tres navegadores que merece la pena utilizar para reemplazar tanto a Chrome como al navegador que traiga nuestro móvil por defecto y que, por cierto, suele ser un churro:
Edición de mayo de 2022: Recientemente he sabido acerca de un acuerdo de sindicación entre DuckDuckGo y Microsoft que impide a la primera compañía bloquear los rastreos por parte de la segunda. Al parecer, esto ocurriría exclucivamente en el navegador de Android y no en los de escritorio, siempre según fuentes de Duckduckgo, claro. Por lo tanto, la mejor opción para Android sigue siendo, siempre en mi humilde opinión, Mozilla Firefox. No obstante, no está de más tener también instalada la aplicación móvil de DuckDuckGo para disponer del widget de búsqueda como sustituto del de Google.
Y en el próximo capítulo espero dedicarme al peliagudo tema de los calendarios y las agendas de contactos. Uno de los anzuelos que más enganchados nos mantienen al ojo que todo lo ve.
Nos vemos pronto. Y de momento, ahora sí, para los nostálgicos, tal y como estaba prometido… la canción:
Los que llevamos un tiempo funcionando con Dropbox en ubuntu hemos tenido ocasión de ver diversos comportamientos raros con el indicador de la aplicación en el área de notificación. En ocasiones, directamente desaparecía. Otras, el menú no se despliega o no funciona. Normalmente, rebuscando un poco por la red termino encontrando una solución pero, inevitablemente, para la próxima vez que me encuentro con el mismo error en una nueva instalación ya me he olvidado.
Por cierto, decir que escribo esto justo después de instalar la versión 21.10 de Ubuntu y eso me lleva pasando por lo menos desde hace unos seis o siete años… y ahí sigue. Haciendo un poco de historia y revolviendo un poco por Internet, parece que la cosa comenzó en la versión 14.04 y afectaba a los escritorios no Unity. Lo malo es que cuando Unity desapareció definitivamente nadie se molestó en reparar el paquete con lo cual el error ha seguido propagándose hasta nuestros días. Afortunadamente tenemos dos noticias, una buena y otra mejor.
La buena noticia es que la reparación es bastante sencilla y que se aplica en unos minutos. Y la mejor, es que los mantenedores de la distribución Ubuntu Mate han parcheado el paquete en sus repositorios oficiales desde la versión 16.04. Así que tenemos dos maneras de solucionar la cosa:
1.- Aplicamos el apaño a mano, o bien…
2.- …instalamos directamente el paquete de Ubuntu Mate en lugar del habitual. Su nombre es caja-dropbox
Por cierto, que esta información está tomada de este artículo pero por si acaso dejo también el código del apaño aquí a mano. Nunca se sabe…
cp ~/.config/autostart/dropbox.desktop ~/.config/autostart/start_dropbox.desktop
sed -i 's/^Exec=.*/Exec=dbus-launch dropbox start -i/' ~/.config/autostart/start_dropbox.desktop
dropbox autostart n
mkdir -p ~/.local/share/applications/
cp /usr/share/applications/dropbox.desktop ~/.local/share/applications/
sed -i 's/^Exec=.*/Exec=dbus-launch dropbox start -i/' ~/.local/share/applications/dropbox.desktop