Solución al error “Poll UPS failed – Driver not connected” en NAS4Free

Escrito por Sergio De Luz
GNU Linux
0

Es posible que si tienes un SAI (o UPS) conectado a un servidor con NAS4Free, cuando se va el suministro eléctrico, la conexión con el SAI se pierde momentáneamente y el sistema es incapaz de reconocer correctamente el equipo. Al no reconocerlo, no sabremos si se ha reestablecido el suministro eléctrico ni tampoco nos enviarán emails informando del estado de la alimentación.

En nuestro caso, hemos conectado un SAI Salicru SPS SOHO+ 1400VA y hemos tenido este problema. Tal y como os contamos en el análisis, el driver que utiliza es el conocido blazer_usb.

Aunque configuremos correctamente el sistema y lo reconozca, siempre que tengamos un corte de suministro eléctrico, la conexión del SAI con el servidor se pierde durante décimas de segundo, suficiente para que posteriormente el servidor sea incapaz de reestablecer de nuevo la conexión.

SPS_SOHO_1400VA_apertura

Problema Poll UPS failed – Driver not connected

Cuando ocurre este problema, si miramos el log del propio NAS4Free nos indica lo siguiente:

Dec 25 20:12:44     servidor     upsmon[1796]: Poll UPS [salicru@localhost] failed - Driver not connected
Dec 25 20:12:39     servidor     root: Unknown USB device: vendor 0x0665 product 0x5161 bus uhub5
Dec 25 20:12:39     servidor     upsmon[1796]: Poll UPS [salicru@localhost] failed - Driver not connected
Dec 25 20:12:34     servidor     upsmon[1796]: Poll UPS [salicru@localhost] failed - Driver not connected
Dec 25 20:12:29     servidor     upsmon[1796]: Communications with UPS salicru@localhost lost
Dec 25 20:12:29     servidor     upsmon[1796]: Poll UPS [salicru@localhost] failed - Driver not connected
Dec 25 20:12:29     servidor     kernel: ugen0.3: <Cypress Semiconductor> at usbus0
Dec 25 20:12:29     servidor     root: Unknown USB device: vendor 0x0665 product 0x5161 bus uhub5
Dec 25 20:12:25     servidor     upsd[1757]: Can't connect to UPS [salicru] (blazer_usb-salicru): No such file or directory
Dec 25 20:12:25     servidor     blazer_usb[5125]: Permissions problem: Device not configured
Dec 25 20:12:24     servidor     kernel: ugen0.3: <Cypress Semiconductor> at usbus0 (disconnected)

También podéis verlo en esta captura de pantalla:

ups_error_nas4free

Solución al problema UPS failed – Driver not connected

Aunque podría haber varias soluciones a este problema, nosotros hemos realizado una que funciona a la perfección y es modificando un fichero de configuración que se encarga de los avisos.

Lo primero que tenemos que hacer es entrar vía SSH al servidor NAS4Free y escribir en el terminal:

cd /usr/local/bin/

A continuación procedemos a hacer una copia de seguridad del archivo responsable de las alertas por email:

cp upssched-cmd upssched-cmd2

Ahora vamos a editar el fichero con la siguiente orden:

nano upssched-cmd

En el fichero de configuración, para este error valdría únicamente modificar esta parte del script:

COMMBAD)
_notifymessage="La comunicacion con el UPS ${UPSNAME} se ha PERDIDO, ERROR.";
sleep 10;
/usr/local/libexec/nut/upsdrvctl -u root start;;

Lo que hace esta modificación es que cuando el sistema llama a COMMBAD para notificar por email el error de que se ha perdido la conexión, esperamos 10 segundos y posteriormente arrancamos de nuevo el demonio del ups. Una vez que arranca, tendremos otro mensaje diciendo que la comunicación se ha establecido. El sleep de 10 segundos lo podemos cambiar por 5 segundos sin problemas (comprobado que funciona adecuadamente).

Si además queremos que los mensajes que nos envían por email estén en castellano, podéis ver el script completo modificado aquí:

#!/bin/sh
#
# Part of NAS4Free (http://www.nas4free.org).
# Copyright (c) 2012-2013 The NAS4Free Project <info@nas4free.org>.
# All rights reserved.
#
# Portions of freenas (http://www.freenas.org).
# Copyright (c) 2005-2011 by Olivier Cochard <olivier@freenas.org>.
# All rights reserved.
#

. /etc/rc.subr
. /etc/configxml.subr
. /etc/email.subr

name="upssched-cmd"

load_rc_config "${name}"

# Defaults
nut_upssched_forced_shutdown_timer=${nut_upssched_forced_shutdown_timer:-"0"}

case "${NOTIFYTYPE}" in
ONLINE)
_notifymessage="UPS ${UPSNAME} - Equipo funcionando con la luz electrica";;
ONBATT)
_notifymessage="UPS ${UPSNAME} - Corte en el suministro electrico, el sistema funciona con bateria. CUIDADO";;
LOWBATT)
_notifymessage="UPS ${UPSNAME} - Bateria baja";;
FSD)
_notifymessage="UPS ${UPSNAME}: - Forzando el apagado del equipo";;
COMMOK)
_notifymessage="La comunicacion con el UPS ${UPSNAME} se ha establecido correctamente";;
COMMBAD)
_notifymessage="La comunicacion con el UPS ${UPSNAME} se ha PERDIDO, ERROR.";
sleep 10;
/usr/local/libexec/nut/upsdrvctl -u root start;;
SHUTDOWN)
_notifymessage="Finalizando sesion y apagando el equipo.";;
REPLBATT)
_notifymessage="UPS ${UPSNAME} - The battery needs to be replaced!";;
NOCOMM)
_notifymessage="UPS ${UPSNAME} - El UPS no esta disponible";
sleep 10;
/usr/local/libexec/nut/upsdrvctl -u root start;;
NOPARENT)
_notifymessage="No se puede apagar automaticamente el servidor, se necesita
intervencion del administrador.";;
esac

case "${1}" in
shutdown-warning)
_shutdowntimer=`configxml_get "//ups/shutdowntimer"`;
_message="${_notifymessage}.
Apagado inminente en ${_shutdowntimer} segundos.";;

shutdown)
_message="${_notifymessage}.
Se inicia el apagado del equipo.";
shutdown -p now ${_message};;

resume)
_message="${_notifymessage}.
Apagado cancelado.";;

forced-shutdown)
_message="${_notifymessage}.
Apagado forzado inminente en ${nut_upssched_forced_shutdown_timer} minutos.";
shutdown -p +${nut_upssched_forced_shutdown_timer} ${_message};;

notify)
_message="${_notifymessage}";;

*)
_message="Unknown command: ${1}";
esac

# Write message to syslog
logger -t upssched-cmd "${_message}"

# Send email if feature is enabled
if configxml_isset //ups/email/enable; then
# Get configured email recipients and subject.
_recipients=`configxml_get "//ups/email/to" | /usr/bin/tr ";," " "`
_subject=`configxml_get "//ups/email/subject"`

# Send email.
send_email "${_recipients}" "${_subject}" "${_message}"
fi

Simplemente con sustituir todo el texto del script por este que os ponemos, funcionará correctamente, sólo tendríamos que guardar los cambios.

Cómo comprobar que la modificación funciona correctamente

Para comprobar que funciona correctamente, obviamente bastaría con desconectar el SAI de la corriente, pero con tan sólo desconectar el cable USB que comunica el SAI con el servidor durante un segundo es suficiente. Una vez que lo hemos introducido, esperamos unos segundos y veremos que la conexión se ha reestablecido correctamente y el SAI nos muestra adecuadamente qué está ocurriendo.