# while true
do
uptime; upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep percentage
sleep 10
done
Y lo dejo corriendo mientras va informando. Cuando la batería llega al final y se apaga, tengo en el terminal el registro del tiempo y proceso de descarga. No olvidar cambiar "battery_BAT0" por el identificador de la batería en cuestión, ya que algunas veces difiere.
"Después del juego es antes del juego"
Sepp Herberger
lunes, 26 de octubre de 2026
Visualizar el proceso de descarga de la batería de un portátil.
Ya dediqué una entrada al tema de testeo de baterías de portátiles. Esto es solo un apunte: un bucle que hago cuando quiero comprobar si un portátil tiene bien la batería y ver como se va descargando a lo largo del tiempo. El proceso consiste en encender el o los portátiles, conectarme a ellos por ssh o tmux-cssh y lanzar este comando en el shell:
lunes, 19 de octubre de 2026
Poner fondo fijo en escritorio Linux - XFCE.
1. Introduccción.
De vez en cuando nos piden poner un fondo fijo en el escritorio de todo el personal, con motivo de alguna efeméride o para impedir que los alumnos cambien su fondo de escritorio. La solución mas sencilla es cambiar el escritorio a nivel de máquina y bloquearlo por políticas que impidan su cambio.
Nuestros escritorios usan XFCE, por lo que esta tarea es bastante fácil. Desconozco si será posible para otros tipos de escritorio.
2. Cambio a nivel de máquina.
La configuración global del fondo de escritorio en XFCE se guarda en: /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml. La de cada usuario se guarda en $HOME/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml. Para poner un fondo de escritorio fijo que se imponga a los de los usuarios individuales debemos meter en /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml esta configuración:
El fondo elegido se pondría en /var/cache/fondo.jpg, que es una carpeta a la que tienen acceso todas las cuentas y se mantiene entre reinicios.
3. Tarea puppet.
Meter esto a mano equipo a equipo es un poco fastidioso, asi que lo mejor es hacerlo mediante una tarea puppet:
El único contratiempo es el relatado en la tarea puppet: si nos fijamos el fichero .xml tiene entradas repetidas dentro en función de si la salida es VGA, HDMI, DP, etc, etc. Si en un ordenador concreto no funciona es porque necesita otra configuración más para su dispositivo de salida. En ese caso no queda otra que investigar cual es el nombre de dicho dispositivo y añadirla al fichero .xml base.
Para ello el procedimiento es definir manualemente un fondo usando el entorno gráfico y mirar luego como queda el fichero $HOME/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml del usuario donde hemos definido el escritorio. Allí estará la nomenclatura usada por su dispositivo de salida concreto. Yo mismo empezé con un xml mas pequeño que ha ido creciendo confirme he ido probando en distantas máquinas.
4. Por comandos/scripts.
Otra opción sería copiar un xfce4-desktop.xml al home de los usuarios afectado, machacando $HOME/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml. Esto se puede hacer una sola vez con un bucle si los homes están en el servidor NFS o bien en cada inicio de sesión, máquina a máquina, si los homes están en local.
Otra alternativa es hacer un script que lo actualice mediante comandos, en lugar de sobreescribir $HOME/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml. Sería :
Si queremos ver la configuración de xfce4-desktop aplicada al usuario actual podemos abrir un terminal y escribir:
Seguiremos...
De vez en cuando nos piden poner un fondo fijo en el escritorio de todo el personal, con motivo de alguna efeméride o para impedir que los alumnos cambien su fondo de escritorio. La solución mas sencilla es cambiar el escritorio a nivel de máquina y bloquearlo por políticas que impidan su cambio.
Nuestros escritorios usan XFCE, por lo que esta tarea es bastante fácil. Desconozco si será posible para otros tipos de escritorio.
2. Cambio a nivel de máquina.
La configuración global del fondo de escritorio en XFCE se guarda en: /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml. La de cada usuario se guarda en $HOME/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml. Para poner un fondo de escritorio fijo que se imponga a los de los usuarios individuales debemos meter en /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml esta configuración:
<?xml version="1.0" encoding="UTF-8"?>
<channel name="xfce4-desktop" version="1.0" locked="*" unlocked="root">
<property name="desktop-icons" type="empty">
<property name="style" type="empty"/>
<property name="file-icons" type="empty">
<property name="show-home" type="empty"/>
<property name="show-filesystem" type="empty"/>
<property name="show-removable" type="empty"/>
<property name="show-trash" type="empty"/>
</property>
</property>
<property name="backdrop" type="empty">
<property name="screen0" type="empty">
<property name="monitor0" type="empty">
<property name="image-path" type="empty"/>
<property name="image-style" type="empty"/>
<property name="image-show" type="empty"/>
<property name="workspace0" type="empty">
<property name="color-style" type="int" value="0"/>
<property name="image-style" type="int" value="4"/>
<property name="last-image" type="string" value="/var/cache/fondo.jpg"/>
<property name="image-path" type="string" value="/var/cache/fondo.jpg"/>
</property>
</property>
<property name="monitor1" type="empty">
<property name="image-path" type="empty"/>
<property name="image-style" type="empty"/>
<property name="image-show" type="empty"/>
<property name="workspace0" type="empty">
<property name="color-style" type="int" value="0"/>
<property name="image-style" type="int" value="4"/>
<property name="last-image" type="string" value="/var/cache/fondo.jpg"/>
<property name="image-path" type="string" value="/var/cache/fondo.jpg"/>
</property>
</property>
<property name="monitoreDP-1" type="empty">
<property name="workspace0" type="empty">
<property name="color-style" type="int" value="0"/>
<property name="image-style" type="int" value="4"/>
<property name="last-image" type="string" value="/var/cache/fondo.jpg"/>
<property name="image-path" type="string" value="/var/cache/fondo.jpg"/>
</property>
</property>
<property name="monitorVGA-0" type="empty">
<property name="workspace0" type="empty">
<property name="color-style" type="int" value="0"/>
<property name="image-style" type="int" value="4"/>
<property name="last-image" type="string" value="/var/cache/fondo.jpg"/>
<property name="image-path" type="string" value="/var/cache/fondo.jpg"/>
</property>
</property>
<property name="monitorHDMI-0" type="empty">
<property name="workspace0" type="empty">
<property name="color-style" type="int" value="0"/>
<property name="image-style" type="int" value="4"/>
<property name="last-image" type="string" value="/var/cache/fondo.jpg"/>
<property name="image-path" type="string" value="/var/cache/fondo.jpg"/>
</property>
</property>
<property name="monitorVGA-1" type="empty">
<property name="workspace0" type="empty">
<property name="color-style" type="int" value="0"/>
<property name="image-style" type="int" value="4"/>
<property name="last-image" type="string" value="/var/cache/fondo.jpg"/>
<property name="image-path" type="string" value="/var/cache/fondo.jpg"/>
</property>
</property>
<property name="monitorDVI-I-0" type="empty">
<property name="workspace0" type="empty">
<property name="color-style" type="int" value="0"/>
<property name="image-style" type="int" value="4"/>
<property name="last-image" type="string" value="/var/cache/fondo.jpg"/>
<property name="image-path" type="string" value="/var/cache/fondo.jpg"/>
</property>
</property>
<property name="monitorHDMI-1" type="empty">
<property name="workspace0" type="empty">
<property name="color-style" type="int" value="0"/>
<property name="image-style" type="int" value="4"/>
<property name="last-image" type="string" value="/var/cache/fondo.jpg"/>
<property name="image-path" type="string" value="/var/cache/fondo.jpg"/>
</property>
</property>
<property name="monitorDP-3" type="empty">
<property name="workspace0" type="empty">
<property name="color-style" type="int" value="0"/>
<property name="image-style" type="int" value="4"/>
<property name="last-image" type="string" value="/var/cache/fondo.jpg"/>
<property name="image-path" type="string" value="/var/cache/fondo.jpg"/>
</property>
</property>
<property name="monitorDP-1" type="empty">
<property name="workspace0" type="empty">
<property name="color-style" type="int" value="0"/>
<property name="image-style" type="int" value="4"/>
<property name="last-image" type="string" value="/var/cache/fondo.jpg"/>
<property name="image-path" type="string" value="/var/cache/fondo.jpg"/>
</property>
</property>
<property name="monitorDisplayPort-0" type="empty">
<property name="workspace0" type="empty">
<property name="color-style" type="int" value="0"/>
<property name="image-style" type="int" value="4"/>
<property name="last-image" type="string" value="/var/cache/fondo.jpg"/>
<property name="image-path" type="string" value="/var/cache/fondo.jpg"/>
</property>
</property>
</property>
</property>
<property name="last" type="empty">
<property name="window-width" type="int" value="664"/>
<property name="window-height" type="int" value="545"/>
</property>
</channel>
La clave está en "locked="*" unlocked="root">", que hace que toda la configuración descrita en ese fichero esté bloqueada de forma general para todo el mundo, excepto para el usuario root. Esta configuración se impone sobre la configuración personal de cada usuario en su carpeta privda.
El fondo elegido se pondría en /var/cache/fondo.jpg, que es una carpeta a la que tienen acceso todas las cuentas y se mantiene entre reinicios.
3. Tarea puppet.
Meter esto a mano equipo a equipo es un poco fastidioso, asi que lo mejor es hacerlo mediante una tarea puppet:
class xubuntu_fondo {
#El fichero .xml tiene entradas repetidas dentro en función de si la salida es VGA, HDMI, DP, etc, etc.
#Si en un ordenador concreto no funciona es porque necesita otra configuración, no queda otra que investigar cual es
#y añadirla al fichero .xml base
file {"/etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml" :
owner => root , group => root , mode => '0644' ,
source => "puppet:///modules/xubuntu_fondo/xfce4-desktop.xml"
}
file {"/var/cache/fondo.jpg" :
owner => root , group => root , mode => '0644' ,
source => "puppet:///modules/xubuntu_fondo/fondo.jpg
}
}
Simplemente habría que poner xfce4-desktop.xml y fondo.jpg en el directorio files de la tarea puppet y listo, ya funcionaría.
El único contratiempo es el relatado en la tarea puppet: si nos fijamos el fichero .xml tiene entradas repetidas dentro en función de si la salida es VGA, HDMI, DP, etc, etc. Si en un ordenador concreto no funciona es porque necesita otra configuración más para su dispositivo de salida. En ese caso no queda otra que investigar cual es el nombre de dicho dispositivo y añadirla al fichero .xml base.
Para ello el procedimiento es definir manualemente un fondo usando el entorno gráfico y mirar luego como queda el fichero $HOME/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml del usuario donde hemos definido el escritorio. Allí estará la nomenclatura usada por su dispositivo de salida concreto. Yo mismo empezé con un xml mas pequeño que ha ido creciendo confirme he ido probando en distantas máquinas.
4. Por comandos/scripts.
Otra opción sería copiar un xfce4-desktop.xml al home de los usuarios afectado, machacando $HOME/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml. Esto se puede hacer una sola vez con un bucle si los homes están en el servidor NFS o bien en cada inicio de sesión, máquina a máquina, si los homes están en local.
Otra alternativa es hacer un script que lo actualice mediante comandos, en lugar de sobreescribir $HOME/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml. Sería :
#!/bin/bash
FONDO="/var/cache/fondofijo.jpg"
# Aplicar el fondo a todos los monitores
for i in $(xfconf-query -c xfce4-desktop -p /backdrop -l | grep -E "screen.*/monitor.*/(image-path|last-image)$"); do
xfconf-query -c xfce4-desktop -p "$i" -s "$FONDO"
done
# Ajustar el modo de imagen a 'relleno' (expandir para cubrir)
for i in $(xfconf-query -c xfce4-desktop -p /backdrop -l | grep -E "screen.*/monitor.*/image-style$"); do
# Crear la propiedad si no existe
if ! xfconf-query -c xfce4-desktop -p "$i" -l 2>/dev/null; then
xfconf-query -c xfce4-desktop -p "$i" --create -t int -s 4
else
xfconf-query -c xfce4-desktop -p "$i" -s 4
fi
done
# Eliminar configuraciones residuales de monitores no conectados
xfconf-query -c xfce4-desktop -p /backdrop/screen0/monitoreDP-1/workspace0/image-style --reset 2>/dev/null
xfconf-query -c xfce4-desktop -p /backdrop/screen0/monitoreDP/workspace0/image-style --reset 2>/dev/null
# Mostrar las configuraciones actuales de xfce4-desktop : xfconf-query -c xfce4-desktop -lv
# Forzar la recarga del fondo
xfdesktop --reload
exit 0
Este script se debe ejecutar con la sesión iniciada del usuario al que queremos cambiar el fondo, ya que xfconf-query solo funciona con la sesión gráfica XFCE iniciada.
Si queremos ver la configuración de xfce4-desktop aplicada al usuario actual podemos abrir un terminal y escribir:
# xfconf-query -c xfce4-desktop -lv
Como ampliación podemos ver todo lo que se puede bloquear en XFCE en esta otra entrada.
Seguiremos...
jueves, 11 de junio de 2026
Monitorización de SAI Phasak SIRIUS 1560VA con nut
Bueno, nos han mandado SAI nuevos para reemplazar los que van fallando. En concreto ahora nos toca un Phasak SIRIUS 1560VA. Una vez instalado físicamente nos toca configurar el nut para monitorizarlo de forma correcta. Enchufo el cable USB al PC donde tengo la monitorización (el servidor del centro) y a ver que sale:
Nos vemos!
# lsusb
Bus 002 Device 026: ID 1a86:7523 QinHeng Electronics CH340 serial converter
Es raro, se identifica como un puerto Serie-USB. Este tipo de dispositivos se manejan con el dispositivo /dev/ttyUSBx. El problema es que cada vez que lo enchufas, desenchufas o pasa algo con la conexión el número final cambia, por lo que no podemos saber si será ttyUSB0, ttyUSB1, ttyUSB2.... Vamos a arreglar eso haciendo que siempre tenga un nombre fijo:
# nano /etc/udev/rules.d/99-ups.rules
Con contenido:
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ttyUPS_phasak"
Ahora siempre se llamará /dev/ttyUPS_phasak. Vamos a aplicar los cambios:
# udevadm control --reload-rules
# udevadm trigger
Siguiente paso: dar permisos al usuario nut para acceder a /dev/ttyUPS_phasak.
# usermod -aG dialout nut
Con esto ya podemos añadir el dispositivo a la configuración de nut en /etc/nut/ups.conf (Internet me ha recomendado usar el driver blazer_ser):
...
[phasak]
driver = blazer_ser
port = /dev/ttyUPS_phasak
desc = "UPS Phasak"
....
Vamos a reiniciar todo para que se apliquen los cambios:
# upsdrvctl stop
# upsdrvctl start
# systemctl restart nut-server
Y vamos a ver si se establece la conexión:
# upsc phasak
Init SSL without certificate database
battery.charge: 100
battery.voltage: 27.10
battery.voltage.high: 26.00
battery.voltage.low: 20.80
battery.voltage.nominal: 24.0
device.type: ups
driver.name: blazer_ser
driver.parameter.pollinterval: 2
driver.parameter.port: /dev/ttyUSB0
driver.parameter.synchronous: auto
driver.version: 2.8.0
driver.version.internal: 1.58
input.current.nominal: 6.0
input.frequency: 50.0
input.frequency.nominal: 50
input.voltage: 235.0
input.voltage.fault: 0.0
input.voltage.nominal: 230
output.voltage: 235.0
ups.beeper.status: enabled
ups.delay.shutdown: 30
ups.delay.start: 180
ups.load: 9
ups.status: OL
ups.temperature: 25.0
ups.type: offline / line interactive
Yeah, funciona! Ahora solo falta añadir al fichero /etc/nut/upsmon.conf el identificador del SAI para poder monitorizarlo:
MONITOR phasak@localhost 1 admin pontupassword primary
El resto de la configuración del NUT, su cliente y sus alertas está requeteexplicada en otras entradas pasadas del blog, puedes empezar por esta entrada.
Nos vemos!
jueves, 4 de diciembre de 2025
Evitar el aviso "Google Chrome no está actualizado" / Solución 2.
Ya puse en su día un truco para evitar que Google Chrome nos moleste al arrancar diciendo que no estaba actualizado. El artículo era este. El problema es que obliga a cambiar en cada máquina el fichero .desktop que se utiliza para abrir Chrome, lo cual no queda muy elegante.
Ahora he encontrado e implementado otra solución que me parece mas sencilla, ya que consiste en copiar dos ficheros dentro de /etc que anulan la aparición del mensaje. Los ficheros con el contenido a poner son:
Ahora he encontrado e implementado otra solución que me parece mas sencilla, ya que consiste en copiar dos ficheros dentro de /etc que anulan la aparición del mensaje. Los ficheros con el contenido a poner son:
- /etc/default/google-chrome:
repo_add_once="false" repo_reenable_on_distupgrade="false" - /etc/opt/chrome/policies/managed/component_update.json:
{ "ComponentUpdatesEnabled": "false" }
miércoles, 24 de septiembre de 2025
Fijar velocidad de red en puertos de un dispositivo OpenWRT
Tengo un dispositivo OpenWRT actuando de switch de red y, debido a la malidad calidad del cableado de red, he tenido problemas de estabilidad de la conexión, con cortes intermitentes. Analizando el tráfico de red veo que salta entre 100Mbps y 1000Mbps cada cierto tiempo, provocando un microcorte que congela la conexión a la red interna e Internet.
La solución que he encontrado es fijar a velocidad de 100Mbps el puerto concreto donde va la conexión con la red del centro, de manera que no hay ningún tipo de negociación.
Lo primero es saber cual es el nombre del puerto, eso lo hacemos con:
La solución que he encontrado es fijar a velocidad de 100Mbps el puerto concreto donde va la conexión con la red del centro, de manera que no hay ningún tipo de negociación.
Lo primero es saber cual es el nombre del puerto, eso lo hacemos con:
# brctl show:
bridge name bridge id STP enabled interfaces
br-lan 7fff.6c7220153a30 no lan4
lan2
wan
lan3
lan1
En mi caso es el puerto "wan", solo hay que mirar las etiquetas que tiene la entrada rj45 donde va la conexión que falla. Lo siguiente es poner un script de autoarranque que fije esa velocidad:
# cat /etc/hotplug.d/iface/99-fix-speed
#!/bin/sh
[ "$ACTION" = ifup ] || exit 0
if [ "$INTERFACE" = "lan" ]; then
ethtool -s wan speed 100 duplex full autoneg on
fi
Reiniciando el dispositivo vemos si tiene la velocidad correcta con:
# ethtool wan
Las pruebas posteriores me confirman que un este truquito la señal es mucho mas estable y casi no hay microcortes.
miércoles, 10 de septiembre de 2025
Actualizar BIOS desde FreeDOS+USB
Me ha pasado varias veces que actualizando hardware en equipos algo antiguos he tenido que actualizar la BIOS. El problema viene cuando esa actualización necesita usar MS-DOS (no hay forma de actualizar usando Linux, Windows o a través de la propia BIOS) y el equipo no tiene disquetera ni lector de CD (y además y no ya no tengo ni disquetes ni CDs). Otra opción es arracancar un sistema MS.DOS por red usando PXE, pero es demasiado rebuscdao.
En ese caso la solución más sencilla que he encontrado es bajar una imagen de FreeDOS (clon libre de MS-DOS), meter en ella los ficheros necesarios para la actualización y grabarla en un pendrive usando Rufus (Unetbootin me ha dado casi siempre problemas con este tipo de imágenes).
Vamos a ver un ejemplo práctico. Quiero actualizar una placa base Gigabyte GA-H61M-DS2 (rev. 2.0) a la BIOS versión F9. La descargo desde aqui y las descomprimo. Los ficheros son:
Este fichero contiene dentro una imagen de anrranque FreeDOS. Hay que montarla y meter dentro los 3 ficheros anteriores para que al arrancar podamos disponer de ellos. Como está en un formato de imagen FreeDOS no se monta con un simple "mount -o loop", hay que hacer alguna operación adicional. Lo primero es hacer
offset = 63 * 512 = 32256
Entonces el comando para montar la imagen sería:
Hecho esto podemos acceder en /mnt al contenido de la imagen. Haremos
Luego arrancamos en el PC con ese pendrive y se cargará el FreeDOS. Nos preguntará si queremos instalar FreeDOS pero no, cancelamos la instalación y nos lleva al prompt X:\> de los viejos tiempos. Una vez allí hacemos;
En ese caso la solución más sencilla que he encontrado es bajar una imagen de FreeDOS (clon libre de MS-DOS), meter en ella los ficheros necesarios para la actualización y grabarla en un pendrive usando Rufus (Unetbootin me ha dado casi siempre problemas con este tipo de imágenes).
Vamos a ver un ejemplo práctico. Quiero actualizar una placa base Gigabyte GA-H61M-DS2 (rev. 2.0) a la BIOS versión F9. La descargo desde aqui y las descomprimo. Los ficheros son:
Efiflash.exe
h61mds22.f9
autoexec.bat
Ahora descargo la imagen FreeDOS desde aqui: https://freedos.org/download/. Descargamos la imagen FullUSB y descomprimos el .zip extrayendo el fichero FD12FULL.img.
Este fichero contiene dentro una imagen de anrranque FreeDOS. Hay que montarla y meter dentro los 3 ficheros anteriores para que al arrancar podamos disponer de ellos. Como está en un formato de imagen FreeDOS no se monta con un simple "mount -o loop", hay que hacer alguna operación adicional. Lo primero es hacer
# fdisk -l FD14FULL.img
FD14FULL.img1 * 63 2096639 2096577 1023,7M c W95 FAT32 (LBA)
Esto nos dice que dentro hay una partición FAT32 (LBA), que empieza en el sector 63 y como sector tiene normalmente 512 bytes, tenemos que calcular el offset:
offset = 63 * 512 = 32256
Entonces el comando para montar la imagen sería:
# sudo mount -o loop,offset=32256 -t vfat FD14FULL.img /mnt
/mnt es el directorio donde se montará la imagen. Evidentemente se puede cambiar por otro.
-t vfat indica que es FAT32.
offset le dice a mount en que punto del fichero .img comienza la partición como tal. Si no se indica el comando mount no puede montarla.
Hecho esto podemos acceder en /mnt al contenido de la imagen. Haremos
# cd /mnt
# mkdir BIOSH61M
# cd BIOSH61M
# cp ...../Efiflash.exe .
# cp ...../h61mds22.f9 .
# cp ...../autoexec.bat .
# cd /root
# umount /mnt
Con esto ya tenemos el fichero IMG con el contenido correcto dentro. Desde un Windows y usando Rufus metemos la imagen IMG en un pendrive..
Luego arrancamos en el PC con ese pendrive y se cargará el FreeDOS. Nos preguntará si queremos instalar FreeDOS pero no, cancelamos la instalación y nos lleva al prompt X:\> de los viejos tiempos. Una vez allí hacemos;
CD BIOS...
EFIFLASH.EXE H61MDS22.F9
Dejamos que acabe y listo, ya tenemos la BIOS actualizada...
miércoles, 3 de septiembre de 2025
Downgrade de Mi Fitness (Xiaomi Wear) para exportar rutas a GPX
Eso de que actualicen una aplicación para "Fix some bugs" y aprovechen para quitar funcionalidades sin dar mas explicaciones me revienta. Soy usuario de la aplicación Mi Fitness (Xiaomi Wear) que uso con el reloj Xiaomi SmartBand. Aparte de las funciones normales de estos chismes, el que yo tengo permite grabar una ruta de senderismo y exportarla de forma gráfica (para el postureo) y en formato GPX, para usarla posteriormente con otros programas y webs de senderismo.
En la última actualización, la 3.43.1i (03-08-2025) la opción de exportar a GPX ha desaparecido sin ningún tipo de justificación. Simplemente la han quitado.
Como esto no puede quedar asi, aparte de quejarme y enviar un correo al típico buzón que tienen conectado con /dev/null, me he puesto a buscar una versión previa de la aplicación para instalarla. Al final la versión "3.33.7i (333007) November 5, 2024" me ha servido ya que es bastante moderna y conserva la funcionalidad de exportar a GPX.
Como Google Play no ofrece versiones antiguas de las apk tenemos que usar una tienda alternativa de confianza para ello, como la Aurora Store o Aptoide, que permiten instalar versiones antiguas de las aplicaciónes. Simplemente instalamos el APK de dicha tienda y buscamos la aplicación y versión correcta.
Tambien tengo aquí el apk para descargar e instalar manualmente.
Ahora solo tenemos que marcar la aplicación para que no se actualice automáticamente y decir que no cuando Android nos pregunte de vez en cuando si queremos subir de versión.
Espero que no se vuelva a repetir.
En la última actualización, la 3.43.1i (03-08-2025) la opción de exportar a GPX ha desaparecido sin ningún tipo de justificación. Simplemente la han quitado.
Como esto no puede quedar asi, aparte de quejarme y enviar un correo al típico buzón que tienen conectado con /dev/null, me he puesto a buscar una versión previa de la aplicación para instalarla. Al final la versión "3.33.7i (333007) November 5, 2024" me ha servido ya que es bastante moderna y conserva la funcionalidad de exportar a GPX.
Como Google Play no ofrece versiones antiguas de las apk tenemos que usar una tienda alternativa de confianza para ello, como la Aurora Store o Aptoide, que permiten instalar versiones antiguas de las aplicaciónes. Simplemente instalamos el APK de dicha tienda y buscamos la aplicación y versión correcta.
Tambien tengo aquí el apk para descargar e instalar manualmente.
Ahora solo tenemos que marcar la aplicación para que no se actualice automáticamente y decir que no cuando Android nos pregunte de vez en cuando si queremos subir de versión.
Espero que no se vuelva a repetir.
jueves, 19 de junio de 2025
Captura de tráfico de red sin tener gestión de los switchs.
Ultimamente para ciertas cosas (husmeo de tráfico SNMP y RTP de chismes de los que no consigo documentación alguna) he tenido que hacer capturas del tráfico de red. Si tuviera el control de mis switchs podría hacer port mirroring, pero por desgracia en la red educativa no tengo esa opción.
La otra solución es hacer newtork tap: interponer un dispositivo (por ejemplo un portátil, una Raspberry Pi o un chisme diseñado para capturar tráfico de red) en la boca del switch que quiero monitorizar y capturar todo el tráfico que por alli pasa.
Para poder interponerlo necesitamos que el dispositivo tenga dos tarjetas de red, una para conectar a la boca del switch otra para conectar el cable que originalmente iba conectado a ella. Como lo de tener dos tarjetas de red en un portátil no es muy normal (de hecho hoy en dia los hay que vienen sin conexion ethernet) lo que hacemos es usar adaptadores USB-RJ45, que nos dan un puerto de red ethernet a partir de un puerto USB. Veamos un esquema generado por IA:
Otra opción posible es interponerlo no entre una boca del switch y la red, sino entre la boca de red de un dispositivo que queramos espiar (un PC, una impresora, etc) y el resto de la red.
Una vez tenemos la conexión hay que configuar la máquina. El truco está en crear un bridge por software entre ambas tarjetas de red, darle una IP de nuestra red al bridge y capturar el tráfico de red sobre él. De esta manera, todo el tráfico de red que salga de ese puerto del switch pasará por el bridge y será capturado:
La otra solución es hacer newtork tap: interponer un dispositivo (por ejemplo un portátil, una Raspberry Pi o un chisme diseñado para capturar tráfico de red) en la boca del switch que quiero monitorizar y capturar todo el tráfico que por alli pasa.
Para poder interponerlo necesitamos que el dispositivo tenga dos tarjetas de red, una para conectar a la boca del switch otra para conectar el cable que originalmente iba conectado a ella. Como lo de tener dos tarjetas de red en un portátil no es muy normal (de hecho hoy en dia los hay que vienen sin conexion ethernet) lo que hacemos es usar adaptadores USB-RJ45, que nos dan un puerto de red ethernet a partir de un puerto USB. Veamos un esquema generado por IA:
Otra opción posible es interponerlo no entre una boca del switch y la red, sino entre la boca de red de un dispositivo que queramos espiar (un PC, una impresora, etc) y el resto de la red.
Una vez tenemos la conexión hay que configuar la máquina. El truco está en crear un bridge por software entre ambas tarjetas de red, darle una IP de nuestra red al bridge y capturar el tráfico de red sobre él. De esta manera, todo el tráfico de red que salga de ese puerto del switch pasará por el bridge y será capturado:
# ip link add name br0 type bridge
# ip link set eno1 master br0
# ip link set eno2 master br0
# ip link set eno1 up
# ip link set eno2 up
# ip link set br0 up
# ifconfig br0 192.168.1.5 up
Simplemente cambiamos eno1, eno2 y 192.168.1.5 por los nombres adecuados y la IP que queramos poner. Luego solo queda capturar:
# tcpdump -i br0 -w captura.pcap
Con esta orden se capturará todo el tráfico que pase por la conexión donde hemos interpuesto el dispositivo. Ese fichero .pcap podremos luego abrirlo con wireshark y husmear dentro. Por supuesto, podemos poner filtros en la captura usando los parámetros de tcpdump, tipo:
# tcpdump -i br0 src host 192.168.1.100 and \( tcp or udp \) -w captura.pcap
Para finalizar, el uso de tcpdump es solo una posibilidad, hay otras muchas opciones de captura de tráfico para que cada cual elija la que más coraje le dé. Bueno, pues con esto podremos monitorizar de forma transparente la actividad en un punto de nuestra red.
viernes, 25 de abril de 2025
Aplicación web local para OCR de documentos.
Muchas veces nos preguntan como convertir un documento escaneado o fotografiado en texto. Aunque hay diversas herramientas gratuitas basadas en Tesseract OCR con el tiempo he visto que los más sencillo es una aplicación web local para toda nuestra red. La solución viene de manos de ScribeOCR.
El interfaz es muy sencillo, nos deja subir uno o varios ficheros con la imagen, hacer algunos ajustes sobre el idioma y la calidad y con "Recognize" lanzar el proceso de reconocimiento.
Una vez concluido nos marca con un resaltado el texto extraído y desde ahí podemos descargarlo en diversos formatos:
El fichero descargado puede abrirse con el editor correspondiente (yo he usado formato .txt), donde aparece el texto bruto ya reconocido (con sus deficiencias que habrá que corregir a mano, como podemos apreciar):
Veamos ahora como se instala ScribeOCR. Lo ideal es hacerlo en un servidor o máquina que esté accesible de forma continua en nuestra red:
El interfaz es muy sencillo, nos deja subir uno o varios ficheros con la imagen, hacer algunos ajustes sobre el idioma y la calidad y con "Recognize" lanzar el proceso de reconocimiento.
Una vez concluido nos marca con un resaltado el texto extraído y desde ahí podemos descargarlo en diversos formatos:
El fichero descargado puede abrirse con el editor correspondiente (yo he usado formato .txt), donde aparece el texto bruto ya reconocido (con sus deficiencias que habrá que corregir a mano, como podemos apreciar):
Veamos ahora como se instala ScribeOCR. Lo ideal es hacerlo en un servidor o máquina que esté accesible de forma continua en nuestra red:
# apt-get install npm
# mkdir /opt
# cd /opt
# git clone --recursive https://github.com/scribeocr/scribeocr.git
# cd scribeocr
# npm i
Una vez instalado podemos lanzarlo a mano con:
# npx http-server /opt/scribeocr -p 8081
Ahí nos mostrará con un mensaje que está escuchando en el puerto web 8081. Si abrimos ese puerto en un navegador con http://ip-maquina:8081 tendremos acceso al interface web y podremos realizar el proceso de OCR desde cualquier sitio de la red. Evidentemente tener que levantar a mano el servidor web con ScribeOCR es un fastidio, mejor invocarlo mediante un servicio systemd:
# cat /etc/systemd/system/http-server.service
[Unit]
Description=HTTP Server using npx
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/bin/npx http-server /opt/scribeocr -p 8081
WorkingDirectory=/opt/scribeocr
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
Una vez creado el fichero .service, activamos el servicio:
# systemctl daemon-reload
# systemctl enable http-server.service
# systemctl start http-server.service
# systemctl status http-server.service
Y ya tenemos listo el servicio de OCR en red para uso del público en general.
miércoles, 9 de abril de 2025
Hacer funcionar DNIe en Ubuntu.
De vez en cuando un usuario me pide utilizar el DNIe en los sistemas Ubuntu. Dado que no existe un único paquete que resuelva todos los pasos de forma automática me hice una guia:
1. Instalación de software básico.
Los primeros paquetes a instalar son:
2. Lectores Smartcad Probados.
He trabajado con estos lectores verificando que funcionan:
3. Configuración de navegadores.
Con instalar los paquetes anteriores no es suficiente. Hay que configurar los navegadores web para que detecten y manejen el DNIe. Además esta configuración no es general de la máquina: hay que hacerla para cada usuario vaya a usar el DNIe.
Se puede hacer de dos maneras: con ratón entrando en la configuración del navegador o mediante comandos. Yo prefiero usar los comandos porque es mucho más rápido.
3.1. Configuración de Google Chrome.
Configuración gráfica:
3.2. Configuración de Firefox.
Configuración gráfica:
4. Bonus Track: Autofirma y ConfiguradorFNMT.
Para tener todo el entorno relacionado con la firma digital bien, se aconseja instalar además:
5. Scripts.
Todo lo anterior en scripts:
1. Instalación de software básico.
Los primeros paquetes a instalar son:
# apt-get install pcscd pcsc-tools libccid libnss3-tools
Luego debemos instalar el paquete libpkcs11-dnie, que se descarga desde https://www.dnielectronico.es/.
# dpkg -i libpkcs11-dnie_X.Y.Z_amd64.deb
La versión X.Y.Z depende de nuestra versión de Ubuntu, cada cual que ponga la que le corresponde. Para Xubuntu 22.04 es 1.6.8. En mi caso tengo un repositorio reprepro privado para mi red, de tal manera que subo alli los paquetes sueltos que descargo. En este escenario puedo instalar el paquete con apt-get:
# apt-get update
# apt-get install libpkcs11-dnie
Una vez instalado todo, metememos el DNIe en el lector y vemos si es detectado con:
# pcsc_scan
Si todo ha ido bien deberia mostrarse información sobre como el lector detecta el DNIe español.
2. Lectores Smartcad Probados.
He trabajado con estos lectores verificando que funcionan:
- SCM Microsystems Inc. SCR 3310 [CCID Interface] 00 00. Es el lector oficial que regalaba el Ministerio del Interior. En lsusb se muestra como "04e6:5116 SCM Microsystems, Inc. SCR331-LC1 / SCR3310 SmartCard Reader".
- Generic Smart Card Reader Interface [Smart Card Reader Interface] (20070818000000000) 00 00. Este lector es un lector común clonico. Se detecta por lsusb como "0bda:0165 Realtek Semiconductor Corp."
- Teclados HP: 03f0:104a HP, Inc HP USB Smartcard CCID Keyboard. Son unos teclados con lector SmartCard integrado que nos mandaron a los centros hace años. Se detecta como "0: Hewlett Packard HP USB Smartcard CCID Keyboard [HP Smartcard Keyboard] (15082100001733) 00 00"
3. Configuración de navegadores.
Con instalar los paquetes anteriores no es suficiente. Hay que configurar los navegadores web para que detecten y manejen el DNIe. Además esta configuración no es general de la máquina: hay que hacerla para cada usuario vaya a usar el DNIe.
Se puede hacer de dos maneras: con ratón entrando en la configuración del navegador o mediante comandos. Yo prefiero usar los comandos porque es mucho más rápido.
3.1. Configuración de Google Chrome.
Configuración gráfica:
- Configuración > Configuración > Configuración avanzada > Privacidad y seguridad > Más > Gestionar certificados -> PIN DNIe -> Desbloquear
- Entidades Emisoras -> Importar -> /usr/share/libpkcs11-dnie/ac_raiz_dnie.crt -> Aceptar -> Confiar en todo -> Aceptar
- Cerrar chrome "pkill --oldest chrome".
- Instalar libreria dnie en home usario:
# mkdir -p $HOME/.pki/nssdb # modutil -force -add "DNI-e" -libfile /usr/lib/libpkcs11-dnie.so -dbdir sql:$HOME/.pki/nssdb # modutil -list -dbdir sql:$HOME/.pki/nssdb - Instalar certificado DG Policia:
# certutil -A -n "DNIe" -t "CT,C,C" -i /usr/share/libpkcs11-dnie/AC\ RAIZ\ DNIE\ 2.crt -d $HOME/.pki/nssdb # certutil -L -d sql:$HOME/.pki/nssdb
3.2. Configuración de Firefox.
Configuración gráfica:
- Privacidad y seguridad -> Dispositivos de seguridad -> Cargar -> Nombre DNIe y añadimos la ruta del Archivo del módulo: /usr/lib/libpkcs11-dnie.so -> Aceptar
- Ver certificados (no seria necesario seguramente, el certificado de la DG Policia ya viene de serie) -> Autoridades -> pinchamos en Importar: /usr/share/libpkcs11-dnie/AC\ RAIZ\ DNIE\ 2.crt -> Aceptar -> Confiar en todo -> Aceptar
- Cerrar firefox: "pkill --oldest firefox"
- Instalar libreria dnie en todos los perfiles firefox del home del usuario.
# rm -f /tmp/pkcs11.txt # echo "library=/usr/lib/libpkcs11-dnie.so" >> /tmp/pkcs11.txt # echo "name=DNI-e" >> /tmp/pkcs11.txt # perfiles=$(ls $HOME/.mozilla/firefox/ | grep .default) # for i in $perfiles; do cp /tmp/pkcs11.txt $HOME/.mozilla/firefox/$i/pkcs11.txt done # find $HOME/.mozilla/firefox | grep pkcs11.txt - Instalar certificado DG Policia en todos los perfiles firefox del home del usuario: no es necesario, viene de serie en Firefox. Podemos confirmar que está con el comando:
# for i in $(ls $HOME/.mozilla/firefox/ | grep .default) ; do certutil -L -d $HOME/.mozilla/firefox/$i done
4. Bonus Track: Autofirma y ConfiguradorFNMT.
Para tener todo el entorno relacionado con la firma digital bien, se aconseja instalar además:
- Autofirma: firma documentos digitalmente. Se descarga desde: https://firmaelectronica.gob.es/ciudadanos/descargas. Aqui ya conté como solucionar los problemas con autofirma.
- ConfiguradorFNMT: necesario para trabajar con los certificados de la FNMT. Se descarga desde aqui.
5. Scripts.
Todo lo anterior en scripts:
# cat 01-instala-software.sh
#!/bin/bash
echo "Instalando software general. Le pediremos la contraseña de root si es necesaria"
su -c "apt-get install -y pcscd pcsc-tools libccid libnss3-tools"
echo "Instalando software especificio DNIe (paquete libpkcs11-dnie). Si no está en el repositorio puede descargarlo"
echo " de la página de Descargas del DNIe https://www.dnielectronico.es/portaldnie/PRF1_Cons02.action?pag=REF_1110."
echo " Version Xubuntu 18 = 1.5.3"
echo " Version Xubuntu 22 = 1.6.8"
echo " E instale el paquete .deb con dpkg -i ..."
su -c "apt-get install libpkcs11-dnie"
echo "Todo instalado puede probar si se detecta el lector y el DNIe con el comando pcsc_scan ejecutado como root."
exit 0
Scripts para ejecutar con cada usuario que necesite tener acceso al DNIe:
# cat cat 02-configura-dnie-google-chrome.sh
#!/bin/bash
echo "Instalando libreria y certificados en Google Chrome."
echo "Si se borra el perfil del usuario habria que reinstalar de nuevo."
echo "Cerramos google-chrome."
pkill --oldest chrome
echo ""
echo "Instalando libreria libpkcs11-dnie.so"
mkdir -p $HOME/.pki/nssdb
modutil -force -add "DNI-e" -libfile /usr/lib/libpkcs11-dnie.so -dbdir sql:$HOME/.pki/nssdb
echo ""
echo "Instalando certificado AC\ RAIZ\ DNIE\ 2.crt "
certutil -A -n "DNIe" -t "CT,C,C" -i /usr/share/libpkcs11-dnie/AC\ RAIZ\ DNIE\ 2.crt -d $HOME/.pki/nssdb
echo ""
echo "Instalado. Puede verificar que está correcto haciendo:"
echo ' modutil -list -dbdir sql:$HOME/.pki/nssdb'
echo ' certutil -L -d sql:$HOME/.pki/nssdb'
# cat 03-configura-dnie-firefox.sh
#!/bin/bash
echo "Instalando libreria y certificados en Firefox."
echo "Si se borra el perfil del navegador habria que reinstalar de nuevo."
echo "Cerramos Firefox."
pkill --oldest firefox
#Libreria acceso lector DNIe - Firefox
rm -f /tmp/pkcs11.txt
echo "library=/usr/lib/libpkcs11-dnie.so" >> /tmp/pkcs11.txt
echo "name=DNI-e" >> /tmp/pkcs11.txt
echo "Instalando libreria libpkcs11-dnie.so"
perfiles=$(ls $HOME/.mozilla/firefox/ | grep .default)
for i in $perfiles
do
cp /tmp/pkcs11.txt $HOME/.mozilla/firefox/$i/pkcs11.txt
done
echo ""
echo "No es necesario instalar certificado de la Dirección General de la Policía. Viene por defecto en Firefox."
echo ""
#Descomentar si queremos instalarlo en cualquier caso.
#perfiles=$(ls $HOME/.mozilla/firefox/ | grep .default)
#for i in $perfiles
#do
# certutil -A -n "DNIe" -t "CT,C,C" -i /usr/share/libpkcs11-dnie/AC\ RAIZ\ DNIE\ 2.crt -d $HOME/.mozilla/firefox/$i
#done
echo "Instalado. Puede verificar que está instalado todo haciendo:"
echo ' find $HOME/.mozilla/firefox | grep pkcs11.txt'
echo ' for i in $(ls $HOME/.mozilla/firefox/ | grep .default)'
echo ' do'
echo ' certutil -L -d $HOME/.mozilla/firefox/$i'
echo ' done'
exit 0
Creo que con esto está todo, a no ser que a alguien se le ocurra algún artefacto más relacionado con los certificados digitales.
viernes, 7 de marzo de 2025
Problemas de Autofirma con el navegador web.
AutoFirma es una aplicación ideal e intuitiva para firmar digitalmente documentos. Hay veces en que no se usa de forma interactiva por el usuario, sino que se lanza desde una página web para firmar un documento o petición generada al vuelo. Es lo que sucede, por poner un ejemplo cercano, con la pagina web de Registro de la Junta de Extremadura.
El problema que se presenta a veces es que directamente AutoFirma en esta página web no funciona. Hay muchos motivos para que no funcione, ya que los procesos de firma y manejo de certificados digitales dependen de muchos factores y servicios web externos y cuando falla la versión y/o la comunicación con alguno, falla todo. El mensaje de error que obtenía era este: Cuando me sucede esto, lo que suelo hacer es, con el mismo ordenador, probar en servicios de conocida robustez que usan el certificado digital, y asi descartar que sea un problema local de la página donde estoy trabajando. Para probar el certificado digital, la página de la Carpeta Ciudadana es ideal. Para probar AutoFirma, la página de test de autofirma de los Registradores de la Propiedad es también muy buena. Si fallan estas páginas al probarlas podemos estar casi seguros de que el problema es de la configuración de nuestras máquinas.
Descartando que tenemos AutoFirma actualizado, la versión correcta de Java (a día de hoy openjdk 11.X) y nuestro certificado digital en regla lo único que nos queda es confirmar que AutoFirma está correctamente configurado en nuestro ordenador.
Uno de los motivos más frecuentes es que el certificado raíz de AutoFirma_ROOT.cer no ha quedado bien instalado (o se ha desinstalado) en el navegador web. Pasa mas de lo que debiera. Este certificado está en la ruta /usr/lib/AutoFirma/AutoFirma_ROOT.cer y hay que proceder a instarlo dentro del perfil del navegador del usuario.
Hay 3 formas de hacerlo:
El problema que se presenta a veces es que directamente AutoFirma en esta página web no funciona. Hay muchos motivos para que no funcione, ya que los procesos de firma y manejo de certificados digitales dependen de muchos factores y servicios web externos y cuando falla la versión y/o la comunicación con alguno, falla todo. El mensaje de error que obtenía era este: Cuando me sucede esto, lo que suelo hacer es, con el mismo ordenador, probar en servicios de conocida robustez que usan el certificado digital, y asi descartar que sea un problema local de la página donde estoy trabajando. Para probar el certificado digital, la página de la Carpeta Ciudadana es ideal. Para probar AutoFirma, la página de test de autofirma de los Registradores de la Propiedad es también muy buena. Si fallan estas páginas al probarlas podemos estar casi seguros de que el problema es de la configuración de nuestras máquinas.
Descartando que tenemos AutoFirma actualizado, la versión correcta de Java (a día de hoy openjdk 11.X) y nuestro certificado digital en regla lo único que nos queda es confirmar que AutoFirma está correctamente configurado en nuestro ordenador.
Uno de los motivos más frecuentes es que el certificado raíz de AutoFirma_ROOT.cer no ha quedado bien instalado (o se ha desinstalado) en el navegador web. Pasa mas de lo que debiera. Este certificado está en la ruta /usr/lib/AutoFirma/AutoFirma_ROOT.cer y hay que proceder a instarlo dentro del perfil del navegador del usuario.
Hay 3 formas de hacerlo:
- Desde la propia aplicación de AutoFirma: abrimos la aplicación y vamos a Herramientas-Restaurar Instalación. Esta opción, por algún motivo que se me escapa, nos pedirá la contraseña de root para instalar el certificado localmente, pero solucionará el problema.
- A mano en el navegador: añadir el fichero /usr/lib/AutoFirma/AutoFirma_ROOT.cer dentro de la opción de "Autoridades/Entidades Emisoras" de la configuración de certificados de los navegadores, marcando todas las opciones de configuración que nos ofrecen.
- Mediante línea de comando, con este script tan majo:
# cat configura-cert-autofima.sh #!/bin/bash certificado="/usr/lib/AutoFirma/AutoFirma_ROOT.cer" echo "Instalando $certificado en Chrome y Firefox" if ! test -e "$certificado" then echo "No encuentro $certificado" exit 0 fi #Cerramos chrome pkill --oldest chrome echo "Instalando certificado $certificado en Chrome" certutil -A -n "AutoFirmaRoot" -t "CT,C,C" -i "$certificado" -d $HOME/.pki/nssdb echo "" echo "Instalado. Puede verificar que está correcto haciendo:" echo ' certutil -L -d sql:$HOME/.pki/nssdb' #Cerramos firefox pkill --oldest firefox echo "Instalando certificado $certificado en Firefox" perfiles=$(ls $HOME/.mozilla/firefox/ | grep .default) for i in $perfiles do certutil -A -n "AutoFirmaRoot" -t "CT,C,C" -i "$certificado" -d $HOME/.mozilla/firefox/$i done echo "Instalado. Puede verificar que está instalado mirando en la configuración de Certificados (Servidores/Autorizados) en su Firefox." exit 0
miércoles, 5 de marzo de 2025
Monitorización del SAI con nut en Debian 12.
Ya hemos tratado varias veces en el pasado de este blog el tema de la monitorización del SAI del servidor desde Debian. Vamos a hacer ahora una recopilación de todo lo aplicado otras veces montado sobre Debian 12, que es el sistema que usamos a día de hoy. Vamos allá.
SAI que tenemos: un Salicru SPS One, que conectado por USB se detecta así:
Vamos ahora a ver los distintos ficheros de configuración. El primero es ups.conf, que tiene los datos para conecar al SAI. Una buena manera de saber que ponemos aquí es usar la salida del comando "nut-scanner".
SAI que tenemos: un Salicru SPS One, que conectado por USB se detecta así:
# lsusb
...
Bus 002 Device 004: ID 0665:5161 Cypress Semiconductor USB to Serial
...
Paquetes a instalar:
# apt-get install nut-client nut-server nut-cgi
Antes de empezar la configuración se aconseja tener un servidor de correo activo para poder enviar los mensajes de cambio de estado del SAI. En el Apartado 2 de esta entrada del blog cuento como montar el sistema que mejor me ha funcionado: postfix reenviando los correos a través de una cuenta de gmail.com
Vamos ahora a ver los distintos ficheros de configuración. El primero es ups.conf, que tiene los datos para conecar al SAI. Una buena manera de saber que ponemos aquí es usar la salida del comando "nut-scanner".
# cat /etc/nut/ups.conf
maxretry = 3
[salicru]
driver = "nutdrv_qx"
port = "auto"
vendorid = "0665"
productid = "5161"
product = "HID UPS"
serial = ""
vendor = "HID UPS"
Los otros ficheros quedarían:
# cat /etc/nut/upsd.conf
LISTEN 127.0.0.1
LISTEN 172.1.1.2 # PONER LA IP de la maquina donde se ejecuta la monitorización
LISTEN 0.0.0.0 3493
# cat /etc/nut/upsd.users
[admin]
password = mipasswordfavorita
actions = set
actions = fsd
instcmds = ALL
upsmon primary
# cat /etc/nut/hosts.conf
MONITOR salicru@localhost "SAI Salicru Servidor"
# cat /etc/nut/nut.conf
MODE=standalone
# cat /etc/nut/upsmon.conf
RUN_AS_USER nut
MONITOR salicru@localhost 1 admin mipasswordfavorita primary
MINSUPPLIES 1
SHUTDOWNCMD "/usr/local/bin/apagar_servidores.sh"
NOTIFYCMD "/sbin/upssched"
NOTIFYMSG ONLINE "UPS: Normal state"
NOTIFYMSG ONBATT "UPS: On battery"
NOTIFYMSG LOWBATT "UPS: Battery low"
NOTIFYMSG FSD "UPS: Starting shutdown"
NOTIFYMSG COMMOK "UPS: Communication restored"
NOTIFYMSG COMMBAD "UPS: Communication lose"
NOTIFYMSG SHUTDOWN "UPS: Shutting down"
NOTIFYMSG NOCOMM "UPS: No communication"
NOTIFYMSG REPLBATT "UPS: Replace battery"
NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC
NOTIFYFLAG FSD SYSLOG+WALL+EXEC
NOTIFYFLAG COMMOK SYSLOG+WALL+EXEC
NOTIFYFLAG COMMBAD SYSLOG+WALL+EXEC
NOTIFYFLAG SHUTDOWN SYSLOG+WALL+EXEC
NOTIFYFLAG NOCOMM SYSLOG+WALL+EXEC
NOTIFYFLAG REPLBATT SYSLOG+WALL+EXEC
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5
# cat /etc/nut/upsset.conf
# Network UPS Tools - upsset.conf sample file
#
# This file is provided to ensure that you do not expose your upsd server
# to the world upon installing the CGI programs. Specifically, it keeps
# the upsset.cgi program from running until you have assured it that you
# have secured your web server's CGI directory.
#
# By default, your web server will probably let anyone access upsset.cgi
# once it is installed. This means that anyone could attempt to crack
# upsd logins since they would appear to be coming from your web server,
# rather than the outside world, slipping through any ACL/ACCESS definitions.
#
# For this reason, you *MUST* first secure your CGI programs before
# enabling upsset in this configuration file. If you can't do this in
# your web server, then you should *not* run this program.
#
# For Apache, the .htaccess file can be used in the directory with the
# programs. You'll need something like this:
#
# <Files upsset.cgi>
# deny from all
# allow from your.network.addresses
# </Files>
#
# You will probably have to set "AllowOverride Limit" for this directory in
# your server-level configuration file as well.
#
# If this doesn't make sense, then stop reading and leave this program alone.
#
# Assuming you have all this done (and it works), then you may uncomment
# the line below and start using upsset.cgi through your web browser.
#
###
I_HAVE_SECURED_MY_CGI_DIRECTORY
###
# cat /etc/nut/upssched.conf
CMDSCRIPT /usr/local/bin/avisoups.sh
PIPEFN /tmp/upssched.pipe
LOCKFN /tmp/upssched.lock
AT ONBATT * START-TIMER ups-on-battery-shutdown 600
AT ONLINE * CANCEL-TIMER ups-on-battery-shutdown
AT ONBATT * START-TIMER ups-on-battery 5
AT ONLINE * CANCEL-TIMER ups-on-battery
AT ONLINE * EXECUTE ups-back-on-line
AT REPLBATT * EXECUTE ups-change_battery
AT LOWBATT * EXECUTE ups-low-battery
AT COMMOK * EXECUTE ups-comunication-ok
AT COMMBAD * EXECUTE ups-comunication-bad
AT NOCOMM * EXECUTE ups-nocomm
AT FSD * EXECUTE ups-fsd
AT SHUTDOWN * EXECUTE ups-shutdown
Para probar que funciona podemos reiniciar los servicios e intentar conectar manualmente con SAI a ver si nos da los datos de carga, voltaje y demás:
# service nut-server restart
# service nut-monitor restart
# upsc salicru
Init SSL without certificate database
battery.charge: 100
battery.voltage: 27.10
battery.voltage.high: 26.00
battery.voltage.low: 20.80
battery.voltage.nominal: 24.0
device.type: ups
driver.name: nutdrv_qx
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.product: HID UPS
driver.parameter.productid: 5161
driver.parameter.serial:
driver.parameter.synchronous: auto
driver.parameter.vendor: HID UPS
driver.parameter.vendorid: 0665
driver.version: 2.8.0
driver.version.data: Mustek 0.07
driver.version.internal: 0.32
driver.version.usb: libusb-1.0.26 (API: 0x1000109)
input.current.nominal: 6.0
input.frequency: 50.1
input.frequency.nominal: 50
input.voltage: 232.7
input.voltage.fault: 232.7
input.voltage.nominal: 230
output.voltage: 234.8
ups.beeper.status: enabled
ups.delay.shutdown: 30
ups.delay.start: 180
ups.load: 10
ups.productid: 5161
ups.status: OL
ups.type: offline / line interactive
ups.vendorid: 0665
Con lo anterior se ha instalado un interface web al que podemos acceder en la URL: "http://ip-maquina/cgi-bin/nut/upsstats.cgi?host=salicru@localhost". De los diferentes ficheros .cgi que permiten gestionar vía web el SAI me gusta dejar, por temas de seguridad, el fichero "upsset.cgi" sin permisos:
ls -l /usr/lib/cgi-bin/nut/
total 140
-rwxr-xr-x 1 root root 45416 ene 25 2023 upsimage.cgi
-rwx------ 1 root root 43336 ene 25 2023 upsset.cgi
-rwxr-xr-x 1 root root 47456 ene 25 2023 upsstats.cgi
Ahora muestro los scripts que uso para manejar los eventos y comunicarlos al servidor:
# cat /usr/local/bin/apagar_servidores.sh
#!/bin/bash
# Ejecutado desde upsmon.conf cuando se la la orden de apagado de servidores.
function mailSend() {
echo "$2" | mail -s "$1" -a "From: Avisos.ies <tu.correo@gmail.com>" tu.correo@educarex.es
}
FECHA=$(date)
estado=$(upsc salicru ups.status 2> /dev/null)
en_bateria=$(echo $estado | tr ' ' '\n' | grep "OB")
if [ -z $en_bateria ] #Si en up.status no parece OB, no estamos en bateria. Es un SHUTDOWNCMD innecesario
then
MESSAGE_MAIL="Evento SHUTDOWNCMD pero estado $estado. No apagamos el servidor"
mailSend "$FECHA => $MESSAGE_MAIL" "[UPS] Evento SHUTDOWNCMD"
echo "$FECHA => SAI: $MESSAGE_MAIL" >> /var/log/sai.log # /var/log/sai.log permisos 644 y nut:nut
else
MESSAGE_MAIL="Apagado servidor por evento SHUTDOWNCMD"
mailSend "$FECHA => $MESSAGE_MAIL" "[UPS] Evento SHUTDOWNCMD"
echo "$FECHA => SAI: $MESSAGE_MAIL" >> /var/log/sai.log # /var/log/sai.log permisos 644 y nut:nut
ssh root@tercero "/sbin/shutdown -h +0"
sleep 10
/sbin/shutdown -h +0
fi
exit 0
# cat /usr/local/bin/avisoups.sh
#!/bin/bash
function mailSend() {
echo "$2" | mail -s "$1" -a "From: Avisos.ies <tu.correo@gmail.com>" tu.correo@educarex.es
}
MESSAGE_MAIL=""
EVENT_TYPE=$1
APAGADO=0
FECHA=$(date)
case "$EVENT_TYPE" in
"ups-on-battery-shutdown")
MESSAGE_MAIL="UPS on battery: shutdown now"
APAGADO=1
;;
"ups-on-battery")
MESSAGE_MAIL="UPS on battery: warning"
;;
"ups-comunication-bad")
MESSAGE_MAIL="Communications with UPS lost"
;;
"ups-change_battery")
MESSAGE_MAIL="UPS battery needs to be replaced"
;;
"ups-back-on-line")
MESSAGE_MAIL="UPS on line power"
;;
"ups-low-battery")
MESSAGE_MAIL="UPS battery is low"
;;
"ups-comunication-ok")
MESSAGE_MAIL="Communications with UPS established"
;;
"ups-nocomm")
MESSAGE_MAIL="No communication with UPS"
;;
"ups-fsd")
MESSAGE_MAIL="UPS FSD: forced shutdown received"
APAGADO=1
;;
"ups-shutdown")
MESSAGE_MAIL="UPS shutdown: shutdown received"
APAGADO=1
;;
esac
mailSend "$FECHA => $MESSAGE_MAIL" "[UPS] Event $EVENT_TYPE de SAI Virgen de Guadalupe:"
echo "$FECHA => SAI: $MESSAGE_MAIL" >> /var/log/sai.log
if [ $APAGADO = "1" ]
then
sleep 30
/usr/local/bin/apagar_servidores.sh
fi
Por último, si tenemos monit podemos controlar que los servicios están levantados:
# cat /etc/monit/conf.d/monitrc.nut
check process nut-monitor with pidfile /var/run/nut/upsmon.pid
group nut
start program = "/bin/systemctl start nut-monitor.service"
stop program = "/bin/systemctl stop nut-monitor.service"
if not exist then restart
if 5 restarts within 5 cycles then timeout
check process nut-server matching "/lib/nut/upsd"
group nut
start program = "/bin/systemctl start nut-server.service"
stop program = "/bin/systemctl stop nut-server.service"
if not exist then restart
if 5 restarts within 5 cycles then timeout
Y con esto lo tenemos ya, el porqué de todas las cosas que se configuran en estos ficheros está explicado en los anteriores artículos dedicados a nut en este blog. Espero que este sea la entrada definitiva.
martes, 25 de febrero de 2025
OpenWRT: unir todos los puertos de red bajo el mismo bridge.
Tenemos por los centros muchos routers DIR‑860L sobrantes de las antiguas pizarras digitales. Ya he dedicado varios articulos a estos router porque que me parecen bastante interesantes.
Lo primero que suelo hacer es quitarles el sistema DD-WRT que traen de serie y poner un OpenWRT que es mucho más versatil y parecido a un Linux.
Estos router traen 5 puertos GigaEthernet. 4 de ellos están en un mismo bridge, llamado LAN, y el otro puerto está aparte y es el puerto WAN del router, lo que permite que por defecto el router interconecte 2 redes cableadas distintas, en distintas VLANs, y enrute el tráfico entre ambas.
Pero puede ser que no queramos eso, sino que los 5 puertos ethernet estén en la misma red. Eso convierte el router en un miniswitch de 5 puertos GigaEthernet, el cual nos puede venir bien en algunas estancias del centro. Para unir los 5 puertos una vez hemos cargado OpenWRT los pasos son sencillos:
Editamos /etc/config/network para que quede asi:
Bueno, pues con esto podemos reaprovechar mejor esos router ociosos que nos dejaron las pizarras Siatic.
Lo primero que suelo hacer es quitarles el sistema DD-WRT que traen de serie y poner un OpenWRT que es mucho más versatil y parecido a un Linux.
Estos router traen 5 puertos GigaEthernet. 4 de ellos están en un mismo bridge, llamado LAN, y el otro puerto está aparte y es el puerto WAN del router, lo que permite que por defecto el router interconecte 2 redes cableadas distintas, en distintas VLANs, y enrute el tráfico entre ambas.
Pero puede ser que no queramos eso, sino que los 5 puertos ethernet estén en la misma red. Eso convierte el router en un miniswitch de 5 puertos GigaEthernet, el cual nos puede venir bien en algunas estancias del centro. Para unir los 5 puertos una vez hemos cargado OpenWRT los pasos son sencillos:
Editamos /etc/config/network para que quede asi:
config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'
config globals 'globals'
option ula_prefix 'fdda:86a9:b1ad::/48'
config interface 'lan'
option force_link '1'
option macaddr '9a:45:4a:fb:74:c1'
option type 'bridge'
option proto 'dhcp'
option ip6assign '60'
option _orig_ifname 'eth0.1 radio0.network1 radio1.network1'
option _orig_bridge 'true'
option ifname 'eth0.1 eth0.2'
config switch
option name 'switch0'
option reset '1'
option enable_vlan '1'
config switch_vlan
option device 'switch0'
option vlan '1'
option ports '0 1 2 3 4 6t'
option vid '1'
Comentarios:
- La macaddr habrá que cambiarla para poner la tuya.
- Vease que todo se mete en la misma VLAN, la otra VLAN que tenía el router desaparece.
- En ports metemos todos los puertos dentro del bridge, de manera que están en la misma red y no hay que enrutar el tráfico entre ellos.
Bueno, pues con esto podemos reaprovechar mejor esos router ociosos que nos dejaron las pizarras Siatic.
回头见!
viernes, 14 de febrero de 2025
Paquete hp-health para servidores HP con Debian modernos.
A los que tenemos servidores HP el paquete hp-health viene muy bien para monitorizar (por ejemplo con monit) distintos parámetros físicos, como la temperatura, los ventiladores o el estado de las fuentes de alimentación redudantes que trae.
El paquete mas actualizado que ofrece HP para Debian en https://downloads.linux.hpe.com/SDR/repo/mcp/pool/non-free/ es hp-health_10.80-1874.10_amd64.deb, de 2019.
Si lo intentamos instalar sobre Debian 11 o superior con "dpkg -i health_10.80-1874.10_amd64.deb" nos da problemas de dependencias por librerías obsoletas. Muchas veces, cuando pasa esto la explicación es que las versiones o nombres de las librerias vinculadas están puestas a piñon y si pudieramos editar el .deb y cambiar esas dependencias por versiones mas modernas el paquete se instalaría sin problema. Vamos a ello:
El paquete mas actualizado que ofrece HP para Debian en https://downloads.linux.hpe.com/SDR/repo/mcp/pool/non-free/ es hp-health_10.80-1874.10_amd64.deb, de 2019.
Si lo intentamos instalar sobre Debian 11 o superior con "dpkg -i health_10.80-1874.10_amd64.deb" nos da problemas de dependencias por librerías obsoletas. Muchas veces, cuando pasa esto la explicación es que las versiones o nombres de las librerias vinculadas están puestas a piñon y si pudieramos editar el .deb y cambiar esas dependencias por versiones mas modernas el paquete se instalaría sin problema. Vamos a ello:
# wget https://downloads.linux.hpe.com/SDR/repo/mcp/pool/non-free/hp-health_10.80-1874.10_amd64.deb
# dpkg-deb -R hp-health_10.80-1874.10_amd64.deb hp-health
# nano hp-health/DEBIAN/control
En este fichero se guardan las dependencias. Tenemos que editar la linea "Version: XXX" para poner una versión mayor, por ejemplo "Version: 10.81" y la linea "Depends: XX" para poner las versiones actuales de las librerías que nos han dado error al intentar instalar el paquete. En mi caso, para instalarlo sobre Debian 12 lo debemos dejar así:
Depends: libc6 (>= 2.14), binutils, dmidecode, pciutils, libc6-i386 | lib32gcc-s1
Simplemente, en este caso cambiamos "libc6-i686 | lib32gcc1" por "libc6-i386 | lib32gcc-s1", su equivalente en Debian 12. Una vez editado el fichero de control reempaquetamos todo en un nuevo .deb:
# dpkg -b hp-health hp-health_10.81_amd64.deb
# dpkg -i hp-health_10.81_amd64.deb
Y con esto se instala sin problemas en nuestro Debian. Ya tenemos el paquete disponible para otra temporada.
viernes, 7 de febrero de 2025
Mirror para los repositorios de paquetes de Ubuntu 22.
Siempre me gusta hacer un mirror local de los repositorios de paquetes más frecuentes, ya que esto garantiza que mis equipos se actualizarán dentro de la red local sin depender de servicios ni conexiones externas. Ya traté esto en este articulo de hace 10 años, cuando trabajabamos con Debian. Ahora voy a contar como montarlo en Ubuntu 22.
Antaño usamos la utilidad debmirror. Las cosas han cambiado y ahora usaremos una herramienta más sencilla, apt-mirror. Primero instalamos el paquete en el servidor donde vamos a crear el repositorio mirror de paquetes:
Todo se descargará en var/spool/apt-mirror/mirror. Para poder hacer uso del repositorio clonado en nuestra red hay que instalar apache2 y hacer que /var/www/html/ubuntu apunte a /var/spool/apt-mirror/mirror:
Y ya está, una vez completado veremos que los apt-get y pkgsync van bastante más rápidos y apenas saturan nuestra salida a Internet.
Antaño usamos la utilidad debmirror. Las cosas han cambiado y ahora usaremos una herramienta más sencilla, apt-mirror. Primero instalamos el paquete en el servidor donde vamos a crear el repositorio mirror de paquetes:
# apt-get install apt-mirror
En /etc/apt/mirror.list metemos la lista de repositorios a clonar. Este configuración, a diferencia de la antigua debmirror, tiene un formato similar a los sources.list habituales de Debian/Ubuntu:
############# config ##################
#
# set base_path /var/spool/apt-mirror
#
# set mirror_path /mirror
# set skel_path /skel
# set var_path /var
# set cleanscript /clean.sh
# set defaultarch >running host architecture<
# set postmirror_script /postmirror.sh
# set run_postmirror 0
set cleanscript /clean.sh
set defaultarch amd64 #Solo amd64
set nthreads 20
set _tilde 0
#set limit_rate 1000k
############# end config ##############
#------------------------------------------------------------------------------#
# OFFICIAL UBUNTU REPOS #
#------------------------------------------------------------------------------#
deb-amd64 http://es.archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse
deb-amd64 http://es.archive.ubuntu.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-amd64 http://es.archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-amd64 http://security.ubuntu.com/ubuntu jammy-security main restricted universe multiverse
#######################
# REPOS DE LA SECCION #
#######################
deb-amd64 http://desarrollo.educarex.es/solointranet/ubuntu/jammy/ jammy linex
deb-amd64 http://linex.educarex.es/ubuntu/jammy/ jammy linex
###### 3rd Party Binary Repos
deb-amd64 http://dl.google.com/linux/earth/deb/ stable main
clean http://es.archive.ubuntu.com/ubuntu
clean http://desarrollo.educarex.es/solointranet/ubuntu
clean http://linex.educarex.es/ubuntu
clean http://desarrollo.educarex.es/es.archive.ubuntu.com/ubuntu
En el fichero anterior configuramos la clonación de los repos de Ubuntu Jammy, el repositorio interno de nuestra red (desarrollo.educarex.es y linex.educarex.es) y el repositorio de Google Earth. Solo clono los paquetes amd64, ya que la versión i386 de los paquetes tiene un uso marginal, ocupa mucho y no tengo suficiente espacio de disco para clonar dicha parte.
Todo se descargará en var/spool/apt-mirror/mirror. Para poder hacer uso del repositorio clonado en nuestra red hay que instalar apache2 y hacer que /var/www/html/ubuntu apunte a /var/spool/apt-mirror/mirror:
# ln -sf /var/spool/apt-mirror/mirror /var/www/html/ubuntu
Para que los repositorios se clonen diariamente creamos los ficheros /etc/cron.d/apt-mirror y /etc/cron.d/apt-mirror-die:
# cat /etc/cron.d/apt-mirror
# Regular cron jobs for the apt-mirror package
00 22 * * * apt-mirror rm -f /var/spool/apt-mirror/var/apt-mirror.lock; /usr/bin/apt-mirror > /var/spool/apt-mirror/var/cron.log
# cat /etc/cron.d/apt-mirror-die
# Matar el proceso apt-mirror
00 01 * * * root /usr/bin/killall -9 apt-mirror
A las 22:00 se lanza apt-mirror y tres horas después se corta. Por supuesto podemos cambiar estas horas para ajustar a nuestro caso. Harán falta varios días para bajar todos los repositorios completos, ya que el total son 670GB, repartidos así:
# du -sh *
5,4G desarrollo.educarex.es
111M dl.google.com
389G es.archive.ubuntu.com
574M linex.educarex.es
275G security.ubuntu.com
Si tenemos prisa siempre podemos forzar la actualización a mano o lanzar el siguiente comando para ver si está todo ya bajado:
# apt-mirror
Una vez tenemos los repositorios clonados hay que distribuir a nuestros clientes unos ficheros *.list que apunten al mirror local en lugar de a los repositorios externos a la red. Tendriamos este /etc/apt/sources.list:
#Arquitectura amd64 tira del repositorio local
deb [arch=amd64] http://servidor-mirror/ubuntu/es.archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse
deb [arch=amd64] http://servidor-mirror/ubuntu/es.archive.ubuntu.com/ubuntu/ jammy-updates main restricted universe multiverse
deb [arch=amd64] http://servidor-mirror/ubuntu/es.archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse
deb [arch=amd64] http://servidor-mirror/ubuntu/security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
#Arquitectura i386 tira de repositorios en Internet
deb [arch=i386] http://es.archive.ubuntu.com/ubuntu jammy main restricted universe multiverse
deb [arch=i386] http://es.archive.ubuntu.com/ubuntu jammy-updates main restricted universe multiverse
deb [arch=i386] http://es.archive.ubuntu.com/ubuntu jammy-backports main restricted universe multiverse
deb [arch=i386] http://security.ubuntu.com/ubuntu jammy-security main restricted universe multiverse
Fichero /etc/apt/sources.list.d/repoXubuntuLinex.list:
#Repositorio Linex Desarrollo
deb [arch=amd64] http://servidor-mirror/ubuntu/desarrollo.educarex.es/solointranet/ubuntu/jammy jammy linex
deb [arch=i386] http://desarrollo.educarex.es/solointranet/ubuntu/jammy/ jammy linex
#Repositorio Linex para Ubuntu
deb [arch=amd64] http://servidor-mirror/ubuntu/linex.educarex.es/ubuntu/jammy jammy linex
deb [arch=i386] http://linex.educarex.es/ubuntu/jammy/ jammy linex
Fichero /etc/apt/sources.list.d/google.list:
#Google Earth
deb [ arch=amd64 ] http://servidor-mirror/ubuntu/dl.google.com/linux/earth/deb/ stable main
En los ficheros anteriores cambiamos "servidor-mirror" por el nombre o ip de nuestro mirror local. Lo más cómodo es distribuir estos tres ficheros *.list mediante una tarea puppet y una vez hecho esto hacer "apt-get update" en los clientes para que sincronicen con los mirrors locales.
Y ya está, una vez completado veremos que los apt-get y pkgsync van bastante más rápidos y apenas saturan nuestra salida a Internet.
domingo, 26 de enero de 2025
Chequear y reparar el sistema de ficheros Linux en el arranque.
Por algún motivo los ordenador AIO que nos han mandado a los centros educativos tienen ciertos problemas con el disco SSD. Con mas frecuencia de la esperade te encuentras con que en el arranque ha encontrado que el sistema de ficheros está corrupto y se parado en el prompt del initramfs para que hagas un chequeo y reparación de disco.
Es una lata tener que ir a hacer ese chequeo a mano cada vez que pasa, así que vendría bien que se hiciese de forma autómatica. La buena noticia es que se puede. Solo hay que editar /etc/default/grub y modificar la línea:
Es una lata tener que ir a hacer ese chequeo a mano cada vez que pasa, así que vendría bien que se hiciese de forma autómatica. La buena noticia es que se puede. Solo hay que editar /etc/default/grub y modificar la línea:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash fsck.mode=force fsck.repair=yes"
Con fsck.mode=force fsck.repair=yes le decimos que haga chequeo de disco y, si procede, lo repare. Para aplicar esta configuración tenemos que hacer además un:
# update-grub
El pero de esto es que el arranque se ralentiza un poco (en los AIO apenas se nota porque tienen un disco rápido y solo se suelen encender de forma automática una vez al día). La ventaja es que nos ahorramos esos molestos viajes a escribir un fscs y darle a enter.
viernes, 24 de enero de 2025
Evitar el aviso "Google Chrome no está actualizado"
El Google Chrome siempre quiere estar actualizado. Tan pronto como la versión es un poco antigua te presenta en la parte superior derecha el mensaje de que no está actualizado y necesita una actualizacion ya mismo. Si estamos en un entorno donde las actualizaciones están controladas y escalonadas eso provoca que muchas veces ese mensaje esté presente en el navegador.
Por algún motivo eso parece provocar una profunda zozobra en algunos usuarios, hasta el punto de que intentan insistentemente tener el navegador actualizado al último byte. Si además no tienen los permisos para actualizarlo eso genera una cierta frustración que acaban intentando contagiar al sysadmin.
Una buena opción para evitar esto consiste en hacer que Chrome no muestre tal mensaje y deje de dar la vara con que debería estar actualizado. Lo ideal seria que hubiese un fichero de configuración para regular esto, pero parece ser que no se le ha ocurrido a nadie en Google. Afortunadamente se puede anular el mensaje usando un parámetro en el comando que invoca a Chrome:
En resumen: ojos que no ven, corazón que no siente.
Por algún motivo eso parece provocar una profunda zozobra en algunos usuarios, hasta el punto de que intentan insistentemente tener el navegador actualizado al último byte. Si además no tienen los permisos para actualizarlo eso genera una cierta frustración que acaban intentando contagiar al sysadmin.
Una buena opción para evitar esto consiste en hacer que Chrome no muestre tal mensaje y deje de dar la vara con que debería estar actualizado. Lo ideal seria que hubiese un fichero de configuración para regular esto, pero parece ser que no se le ha ocurrido a nadie en Google. Afortunadamente se puede anular el mensaje usando un parámetro en el comando que invoca a Chrome:
# google-chrome-stable --simulate-outdated-no-au='Tue, 31 Dec 2099 23:59:59 GMT'
Con esto decimos que hasta el 2099 no se preocupe por las actualizaciones. Como los usuarios no lanzan Chrome desde la linea de comandos lo adecuado sería editar /usr/share/applications/google-chrome.desktop (y en general todos los google-chrome.desktop que tengamos en los escritorios y en cualquier otro lado) y cambiar dentro esta línea:
Exec=/usr/bin/google-chrome-stable --simulate-outdated-no-au='Tue, 31 Dec 2099 23:59:59 GMT' %U
Tras eso habria que ejecutar un "update-desktop-database".
En resumen: ojos que no ven, corazón que no siente.
jueves, 23 de enero de 2025
Obtener los parámetros de uso de un disco duro en Linux
Cuando queremos saber el estado de uso y salud de un disco duro en Windows podemos usar herramientas como CrystalDiskInfo. No solo vale para discos internos, también funciona normalmente para discos conectados mediante USB ya que la mayoría de los chipsets que convierten SATA a USB permite enviar información de uso al PC.
Por supuesto, en Linux tenemos nuestra propia solución. La mas simple es usar el programa smartctl del paquete smartmontools.
De regalo también tenemos una versión gráfica que permite además realizar tests de discos. Se llama gsmartmontools (aviso: debe ejecutarse con permisos de superusuario para funcionar). He aquí una captura:
El interfaz es bastante mas espartano que el de CrystalDiskInfo y no muestra imágenes de waifus, pero la información que da es igual de válida.
Por supuesto, en Linux tenemos nuestra propia solución. La mas simple es usar el programa smartctl del paquete smartmontools.
# smartctl --all /dev/sdb
smartctl 7.4 2023-08-01 r5530 [x86_64-linux-6.8.0-39-generic] (local build)
Copyright (C) 2002-23, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF INFORMATION SECTION ===
Model Family: Seagate Barracuda 7200.14 (AF)
Device Model: ST2000DM001-1ER164
.....
.....
SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate 0x002f 102 099 006 Pre-fail Always - 4651736
3 Spin_Up_Time 0x0023 097 095 000 Pre-fail Always - 0
4 Start_Stop_Count 0x0032 094 094 020 Old_age Always - 6262
5 Reallocated_Sector_Ct 0x0033 100 100 010 Pre-fail Always - 0
7 Seek_Error_Rate 0x002f 076 060 030 Pre-fail Always - 46075685
9 Power_On_Hours 0x0032 097 097 000 Old_age Always - 3270
10 Spin_Retry_Count 0x0033 100 100 097 Pre-fail Always - 0
12 Power_Cycle_Count 0x0032 094 094 020 Old_age Always - 6260
......
En un interfaz de consola nos muestra los mismos parámetros que CrystalDiskInfo. De todos estos datos los mas significativos son:
9 Power_On_Hours 0x0032 097 097 000 Old_age Always - 3270
12 Power_Cycle_Count 0x0032 094 094 020 Old_age Always - 6260
Siendo los mas importantes Power_On_Hours (las horas de uso del disco duro, 3270 horas en este caso) y Power_Cycle_Count (el número de arranques que ha tenido, 6262 en este caso).
De regalo también tenemos una versión gráfica que permite además realizar tests de discos. Se llama gsmartmontools (aviso: debe ejecutarse con permisos de superusuario para funcionar). He aquí una captura:
El interfaz es bastante mas espartano que el de CrystalDiskInfo y no muestra imágenes de waifus, pero la información que da es igual de válida.
domingo, 19 de enero de 2025
Convertir una impresora USB en una impresora de red mediante OpenWRT
Cuando tenemos una impresora USB y queremos compartirla en una red podemos hacer lo típico: conectarla a un PC y compartirla desde allí, pero queda mas profesional y glamouroso convertirla en una impresora de red con su IP propia sin tener que depender de un PC de usuario que puede estar apagado o encendido.
Para ello sólo necesitamos un punto de acceso wifi o router wifi casero que cuente con un puerto USB y tenga OpenWRT instalado. Ese tema lo hemos tratado largo y tendido en el blog y hay mucha documentación en Internet al respecto.
Una vez configurado el dispositivo OpenWRT debemos conectarlo a la red local con una dirección IP fija, esto dependerá de cada caso y puede hacerse via ethernet o como cliente de la red wifi. Es también un tema visto anteriormente en el bloq en esta entrada y esta otra entrada.
En mi caso conecto el OpenWRT a una red wifi, ya que donde quiero poner la impresora no hay puntos de red cercanos. La configuración seria algo así como:
Hemos dicho que el servivio p910nd escuchará en el puerto 9100, pero no hay que olvidar abrirlo en el firewall de OpenWRT:
再见,同志!
Para ello sólo necesitamos un punto de acceso wifi o router wifi casero que cuente con un puerto USB y tenga OpenWRT instalado. Ese tema lo hemos tratado largo y tendido en el blog y hay mucha documentación en Internet al respecto.
Una vez configurado el dispositivo OpenWRT debemos conectarlo a la red local con una dirección IP fija, esto dependerá de cada caso y puede hacerse via ethernet o como cliente de la red wifi. Es también un tema visto anteriormente en el bloq en esta entrada y esta otra entrada.
En mi caso conecto el OpenWRT a una red wifi, ya que donde quiero poner la impresora no hay puntos de red cercanos. La configuración seria algo así como:
# cat /etc/config/wireless
config wifi-device 'radio0'
option type 'mac80211'
option hwmode '11g'
option path 'pci0000:00/0000:00:00.0/0000:01:00.0/bcma0:1'
option disabled '0'
option country 'ES'
config wifi-iface 'wifinet0'
option ssid 'NOMBRE_RED'
option device 'radio0'
option mode 'sta'
option key 'PASSWORD_RED'
option network 'wwan'
option encryption 'psk2'
La red cableada la dejo con una IP fija por mi propia tranquilidad, aunque no la voy a usar para nada:
# cat /etc/config/network
config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'
config globals 'globals'
option ula_prefix 'fda2:68de:6428::/48'
config interface 'lan'
option type 'bridge'
option ifname 'eth0.1'
option proto 'static'
option ipaddr '192.168.2.1'
option netmask '255.255.255.0'
option ip6assign '60'
config switch
option name 'switch0'
option reset '1'
option enable_vlan '1'
config switch_vlan
option device 'switch0'
option vlan '1'
option ports '0 1 2 3 8t'
config interface 'wan'
option proto 'dhcp'
config interface 'wwan'
option proto 'dhcp'
Hecho esto, instalo los paquetes de OpenWRT necesarios para compartir la impresora USB:
# opkg update
# opkg install kmod-usb-printer
# opkg install p910nd luci-app-p910nd
# opkg install usbutils
A continuación pincho la impresora USB en el router y verifico que ha sido detectada con:
# lsusb
Si todo ha ido bien, debe haber creado en /dev un dispositivo para la impresora:
# ls /dev/usb/lp*
/dev/usb/lp0
Bien, nuestra impresora es /dev/usb/lp0. A continuación configuramos el servico p919nd, que es el encargado de compartir nuestra impresora USB por la red local.
# cat /etc/config/p910nd
config p910nd
option device '/dev/usb/lp0'
option runas_root '0'
option mdns '0'
option mdns_ty 'My Printer Manufacturer/Model'
option mdns_note 'Basement'
option enabled '1'
option port '0'
option bidirectional '1'
Puntualizaciones:
- En algunos modelos de impresora el parámetro bidirectional debe valer 0. No hay regla, es cuestión de prueba y error.
- Cambiar device según el nombre del dispositivo detectado en /dev/usb/...
- El port con valor 0 hará que la impresora escuche en el puerto TCP 9100. Puede tener los valores 0, 1 y 2 (9100, 9101 y 9102), compartiendo en 3 puestos distintos hasta tres impresoras.
- Los parámetros mdns tienen que ver con el protocolo Bonjour y yo no los uso. Si te gusta usar esos protocolos tan vociferantes tienes mas información al respecto en este enlace.
Hemos dicho que el servivio p910nd escuchará en el puerto 9100, pero no hay que olvidar abrirlo en el firewall de OpenWRT:
# cat /etc/config/firewall
...
...
...
#Allow attached network printer
config 'rule'
option name 'p910nd'
option 'src' 'lan wan'
option 'proto' 'tcp'
option 'dest_port' '9100'
option 'target' 'ACCEPT'
Una vez definido todo, reiniciamos los servicios:
# /etc/init.d/firewall restart
# /etc/init.d/p910nd restart
Y verificamos que el proceso p910nd está corriendo:
# ps w | grep 910
1282 p910nd 936 S {p910nd} /usr/sbin/p9100d -d -b -f /dev/usb/lp0 0
Ya en plan maniático plus, tampoco está de más verificar desde un PC de la red (repito: un PC distinto al router con el que estamos trabajando) que el puerto 9100 está abierto en el openwrt:
# nc -zv ip-router 9100
Connection to ip-router 9100 port [tcp/*] succeeded!
Con esto ya tenemos todo, solo faltaría configurar la impresora en los clientes que vayan a usarla. En este enlace se explica en detalle como hacerlo para Windows y OSX/Linux. Yo por mi parte como uso Linux simplemente añado esto a /etc/cups/printers.conf:
<Printer HP-ML1210>
PrinterId 488303
UUID urn:uuid:8a19c7aa-3365-356a-70cd-736155c2fcfc
Info
Location
MakeModel Samsung ML-1210 Foomatic/gdi (recommended)
DeviceURI socket://ip-router:9100
State Idle
StateTime 1737140264
ConfigTime 1737134460
Type 8392708
Accepting Yes
Shared No
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
OpPolicy default
ErrorPolicy retry-job
</Printer>
Cada cual deberá cambiar la ip-router y el Modelo/Driver de impresora según sea su caso. Usar CUPS para añadir la impresora en lugar de editar mano el printers.conf siempre es una buena idea.
再见,同志!
viernes, 8 de noviembre de 2024
Baterías genéricas para HP x360 310 G2
Nuestros ordenadores "HP x360 310 G2" llevan ya muchos años con nosotros y las báterías modelo HV03XL que tienen están empezando a fallar. De momento se pueden encontrar baterías genéricas sobre 35-40€ (usualmente de marca Voltistar) y originales de HP por mas de 80€.
Después de comprar e instalar varias baterías genéricas sin tener problemas de repente me encontré con que en algunos portátiles no se reconocían. Al ponerlas el equipo se encendía pero no lograba arrancar, se quedaba colgado sin avanzar en los mensajes de arranque de la BIOS. Después de dar muchas vueltas comprobé la versión de la BIOS y me di cuenta de que tengo portátiles con BIOS F35 y otros con BIOS F57A. Los que tienen esta última BIOS no admiten baterías genéricas. Una vez más, HP ha hecho de las suyas y ha puesto un firmware que rechaza productos no certificados por ellos simplemente porque son así de malvados.
Bueno, pues la solución es hacer un downgrade de la BIOS, desde F57A a F35. Y aquí surgen nuevos problemas:
El siguiente problema es como hacer el downgrade de la BIOS en los equipos que tienen F57A. Esto lo cuentan aquí: https://www.bios-mods.com/forum/showthread.php?tid=40777. Enlazan una versión "adaptada" del software de HP que si permite escribir BIOS anteriores a la actual, saltando la restricción de HP.
He juntado aquí todo: https://drive.google.com/file/d/1RNHaK0esv-Xz_2dpepKwLQ6NZnoW_FvF. Ahi está el fichero InsydeFlash625 y el fichero con la bios F48 (08074.fd, que es el 08074.bin comentado antes con la extensión cambiada). Las instrucciones son:
Después de comprar e instalar varias baterías genéricas sin tener problemas de repente me encontré con que en algunos portátiles no se reconocían. Al ponerlas el equipo se encendía pero no lograba arrancar, se quedaba colgado sin avanzar en los mensajes de arranque de la BIOS. Después de dar muchas vueltas comprobé la versión de la BIOS y me di cuenta de que tengo portátiles con BIOS F35 y otros con BIOS F57A. Los que tienen esta última BIOS no admiten baterías genéricas. Una vez más, HP ha hecho de las suyas y ha puesto un firmware que rechaza productos no certificados por ellos simplemente porque son así de malvados.
Bueno, pues la solución es hacer un downgrade de la BIOS, desde F57A a F35. Y aquí surgen nuevos problemas:
- En la web de HP la BIOS mas antigua que puede descargarse fácilmente la F54A. Esa BIOS también rechaza baterías genéricas.
- Anteriormente, HP tenía un sitio FTP donde podías buscar software antiguo (ftp.hp.com/pub/softpaq/). Este sitio ya no está disponible usando protoclo FTP desde hace unos años y es imposible hacer una búsqueda sobre él.
- El software de actualización de las BIOS de HP no permite hacer downgrade de BIOS. No podemos instalar BIOS anteriores a la que ya tenemos.
- https://ftp.hp.com/pub/softpaq/sp80001-80500/sp80294.html
- https://ftp.hp.com/pub/softpaq/sp77001-77500/sp77168.html
El siguiente problema es como hacer el downgrade de la BIOS en los equipos que tienen F57A. Esto lo cuentan aquí: https://www.bios-mods.com/forum/showthread.php?tid=40777. Enlazan una versión "adaptada" del software de HP que si permite escribir BIOS anteriores a la actual, saltando la restricción de HP.
He juntado aquí todo: https://drive.google.com/file/d/1RNHaK0esv-Xz_2dpepKwLQ6NZnoW_FvF. Ahi está el fichero InsydeFlash625 y el fichero con la bios F48 (08074.fd, que es el 08074.bin comentado antes con la extensión cambiada). Las instrucciones son:
- En el portátil donde queremos cambiar la BIOS, arrancamos con Windows y con un usuario administrador descargamos el fichero anterior y lo descomprimimos.
- Ejecuta el fichero HPFlashWinx64.exe. Paciencia, se toma su tiempo. Verás como te avisa de que vas a bajar la BIOS a la F48. Sigue los pasos y asegurate de que el portátil está conectado a la corriente y que no se va a interrumpir el proceso.
- La escritura de la BIOS se hace en parte en Windows, luego el portátil se apaga y al encenderlo a mano se realiza la segunda fase de actualización.
Suscribirse a:
Entradas (Atom)







