martes, mayo 04, 2010

FreeBSD + Network UPS Tools

Requerimientos:
FreeBSD Instalado

Manuales:
http://www.networkupstools.org/
http://people.freebsd.org/~thierry/nut_FreeBSD_HowTo.txt
http://opensource.mgeups.com/howto.htm#test-cfg

Otros manuales:
http://taquiones.net/sysadmin/nut.html
http://www.lissyara.su/articles/freebsd/programms/network_ups_tools/
http://www.usebox.net/jjm/ups-obsd/

/usr/local/share/doc/nut

Datos de la tarjeta SNMP en la UPS
http://www.ingrasys.com/Product/usha/pd_usha_1.aspx

1) Instalar el port nut
#cd /usr/ports/sysutils/nut
# cd make config

Solo activo las opciones
[ ] SERIAL
[ ] USB
[X] SNMP
[X] NEON
[ ] HAL
[X] IPV6
[ ] DEVEL
[ ] CGI

Guardar y salir

# make install clean

2) Crear los archivos de configuracion

# cd /usr/local/etc/nut/

# cp ups.conf.sample ups.conf
---
[myups]
driver = snmp-ups
port = 192.168.1.252
#cable = 1234
desc = "UPS Pinnacle Plus 10000T"
---

# cp upsd.conf.sample upsd.conf
---
LISTEN 127.0.0.1 3493
---
# cp upsd.users.sample upsd.users
---
[admin]
password = mypass
actions = SET
instcmds = ALL

[upsmon]
password = pass
upsmon master
MONITOR myups@localhost 1 monuser pass master
---

# cp upsmon.conf.sample upsmon.conf
---
MONITOR myups@localhost 1 monuser mypass master
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h +0"
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5
---

Asegurando un poco los archivos de configuracion
# chown root:uucp /usr/local/etc/nut/upsd.conf
# chmod 0640 /usr/local/etc/nut/upsd.conf
# chown root:uucp /usr/local/etc/nut/upsd.users
# chmod 0640 /usr/local/etc/nut/upsd.users

Por defecto parece que requiere un directorio cuando esta corriendo,
en el configure.txt lo comenta en el numeral 5
# mkdir -p /var/state/ups
# chmod 0770 /var/state/ups
# chown uucp:wheel /var/state/ups

Tambien requiere otro directorio en /var/db/nut/upssched para el upssched.conf (upssched.pipe y upssched.lock)
# mkdir /var/db/nut/upssched
# chown uucp:uucp /var/db/nut/upssched

3) Hacer que inicie con el sistema agregando en /etc/rc.conf las lineas
---
# Activamos Network UPS Tools
nut_enable="YES"
nut_upslog_enable="YES"
nut_upsmon_enable="YES"
---

4) Iniciar el servicio [sart|stop]
# /usr/local/etc/rc.d/nut start
---
Network UPS Tools - UPS driver controller 2.4.1
Network UPS Tools - Generic SNMP UPS driver 0.44 (2.4.1)
Detected Model 10K on host 192.168.1.252 (mib: ietf 1.3)
[myups] unhandled ASN 0x5 recieved from 1.3.6.1.2.1.33.1.2.3.0
[myups] unhandled ASN 0x5 recieved from 1.3.6.1.2.1.33.1.2.6.0
[myups] unhandled ASN 0x5 recieved from 1.3.6.1.2.1.33.1.4.2.0
Starting nut.
Network UPS Tools upsd 2.4.1
/usr/local/etc/nut/upsd.conf is world readable
listening on 127.0.0.1 port 3493
Connected to UPS [myups]: snmp-ups-myups
/usr/local/etc/nut/upsd.users is world readable
---

Hay que iniciar los otros dos
# /usr/local/etc/rc.d/nut_upsmon start
# /usr/local/etc/rc.d/nut_upslog start


5) Solicitar informacion de la ups
# upsc myups@localhost
---
battery.charge: 100.00
battery.runtime.low: 0
battery.temperature: 32.00
battery.voltage: 256.80
driver.name: snmp-ups
driver.parameter.pollinterval: 2
driver.parameter.port: 192.168.1.252
driver.version: 2.4.1
driver.version.internal: 0.44
input.current: 0.00
input.frequency: 60.00
input.phases: 1.00
input.quality: 34.00
input.voltage: 2060.00
output.current: 0.00
output.phases: 1.00
output.realpower: 0.00
output.voltage: 2300.00
ups.firmware: Ver P7.0
ups.firmware.aux: AlphaLink Card v4.26 (SN 1117027624120)
ups.load: 64.00
ups.mfr: UPS
ups.model: Model 10K
ups.power: 0.00
ups.serial:
ups.status: OL
ups.test.result:
---

Para ver como va la cosa
# tail -f /var/log/messages

http://opensource.mgeups.com/howto.htm#test-cfg

Nota:
Se cambio la parte original ups_name@localhost por myups@localhost

To view the list of available settable variables, use the following command:
upsrw myups@localhost

To set the low battery level (which trigger shutdown), use the following command:
upsrw -s battery.charge.low=20 -u admin -p mypass myups@localhost

To view the list of available settable variables, use the following command:
upscmd -l myups@localhost

To execute a battery test, use the following command:
upscmd -u admin -p mypass myups@localhost battery.test

Actualizacion:
Active la opcion [X] cgi y re-instale el port

# edit /usr/local/etc/apache22/httpd.conf
agrego las siguientes lineas:
---
<Directory /usr/local/www/nut>
AllowOverride Options FileInfo
Order deny,allow
Allow from all
</Directory>

<Directory /usr/local/www/nut/cgi>
Options ExecCGI
</Directory>

ScriptAlias /nut/cgi/ /usr/local/www/nut/cgi/
Alias /nut /usr/local/www/nut/
---

Por defecto el port crea los directorios

# ls /usr/local/www/cgi-bin/nut/
upsimage.cgi upsset.cgi upsstats.cgi

# ls /usr/local/www/nut/
bottom.html header.html index.html nut-banner.png

Pero aun no se como hacer en el httpd.conf para que el sitio este en un lugar y que se pueda ejecutar los .cgi que estan en otro!

Para solucionarlo, copiare el contenido de /usr/local/www/cgi-bin/nut/ en una carpeta que creare dentro de /usr/local/www/nut/cgi

# mkdir /usr/local/www/nut/cgi
# cp /usr/local/cgi-bin/nut/*.cgi /usr/local/www/nut/cgi

El codigo del archivo /usr/local/www/nut/header.html apunta a los .cgi , pero los hago apuntar dentro de /usr/local/www/nut/cgi

# edit /usr/local/www/nut/header.html

Asi quedaron las lineas ya modificadas

<a href=/nut/cgi/upsstats.cgi target=mainFrame>Statistics</a>

<a href=/nut/cgi/upsset.cgi target=mainFrame>Settings</a>

adicionalmente con la activacion de [X] CGI se crearon otros archivos dentro de /usr/local/etc/nut/

Aqui pongo el contenido de todos luego del cambio:

# egrep -v '#|^ *$' hosts.conf
MONITOR myups@localhost "My UPS"

# egrep -v '#|^ *$' nut.conf
MODE = none

# egrep -v '#|^ *$' ups.conf
[myups]
driver = snmp-ups
port = 192.168.1.252
desc = "My UPS"

# egrep -v '#|^ *$' upsd.conf
LISTEN 127.0.0.1 3493
LISTEN 192.168.1.1 3493 (esta es la ip fija que da a la lan)

# egrep -v '#|^ *$' upsmon.conf
MONITOR myups@localhost 1 upsmon pass master
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h +0"
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5

# egrep -v '#|^ *$' upssched.conf
CMDSCRIPT /usr/local/bin/upssched-cmd

# egrep -v '#|^ *$' upsset.conf
este no tiene nada activado

# egrep -v '#|^ *$' upsd.users
[admin]
password = mypass
actions = SET
instcmds = ALL
[upsmon]
password = pass
upsmon master
MONITOR myups@localhost 1 monuser pass master

copio un par de archivos .html.sample

# cp upsstats-single.html.sample upsstats-single.html
# cp upsstats.html.sample upsstats.html

Re-inicio el servicio

# /usr/local/etc/rc.d/nut restart

Para ver si la cosa del html funciona, ingreso a
http://ipdemiservidor/nut

Nota2:
Ya encontre la razon de que me diera errores al tratar de compartir los cgi del nut, la razon era una linea en el /usr/local/etc/apache22/httpd.conf
la linea que daba problemas era:
ScriptAlias /cgi-bin/ "/usr/local/www/apache22/cgi-bin/"

Si la desactivo con un #, puedo crear toda la entrada asi:
# Modificacion para Network UPS Tools inicio

# Para el sitio
<Directory /usr/local/www/nut>
AllowOverride Options FileInfo
Order deny,allow
Allow from all
</Directory>

<Directory /usr/local/www/nut/cgi>
Options ExecCGI
</Directory>

#ScriptAlias /nut/cgi/ /usr/local/www/nut/cgi/
Alias /nut /usr/local/www/nut/

# Notas:
# * Los CGI los pone en el directorio /usr/local/www/cgi-bin/nut
# * Para poder ejecutar los cgi en el directorio de instalacion, desactivo (#) una linea
# de arriba que dice:
# ScriptAlias /cgi-bin/ "/usr/local/www/apache22/cgi-bin/"
# ya que parece que no se requiere actualmente para nadie
#
# Para los CGI
<Directory /usr/local/www/cgi-bin/nut>
AllowOverride Options FileInfo
Order deny,allow
Allow from all
</Directory>

<Directory /usr/local/www/cgi-bin/nut>
Options ExecCGI
</Directory>

ScriptAlias /cgi-bin/nut/ /usr/local/www/cgi-bin/nut/
Alias /cgi-bin/ /usr/local/www/cgi-bin/nut/

# Modificacion para Network UPS Tools fin

Logicamente, con esta solucion ya no es necesario la carpeta /usr/local/www/nut/cgi y tampoco hay que poner a apuntar los links en /usr/local/www/nut/header.html a otros lugares.

Nota3:
Tambien tengo una ups de la marca CyberPower System

y para el FreeBSD 8 en el archivo de la ups tengo esto:
# egrep -v '#|^ *$' ups.conf
[CPS425SL]
driver = genericups
port = /dev/cuau0
upstype = 7
desc = "CyberPower Systems 425SL 425VA / CPS425SL"

Hay que anotar que en FreeBSD 8 el nombre de los COM cambio:
http://www.freebsd.org/releases/8.0R/relnotes-detailed.html

COM1 /dev/cuau0
COM2 /dev/cuau1

Hasta este punto, cuando la UPS llega al nivel critico de las baterias, apaga el servidor.

Otra opcion interesante es poder programar un apagado en el servidor luego de que la UPS esta agotando las baterias, por ejemplo luego de 60 segundos...

Para esto hay que usar upssched y agregarle unas lineas, aqui dejo las modificaciones:

# egrep -v '#|^ *$' /usr/local/etc/nut/upsmon.conf
MONITOR myups@localhost 1 upsmon pass master
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h +0"
NOTIFYCMD /usr/local/sbin/upssched
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower
NOTIFYMSG ONBATT "%s is on battery"
NOTIFYMSG ONLINE "%s is back online"
NOTIFYMSG LOWBATT "%s has a low battery!"
NOTIFYMSG SHUTDOWN "System is being shutdown!"
NOTIFYFLAG ONBATT SYSLOG+EXEC
NOTIFYFLAG ONLINE SYSLOG+EXEC
NOTIFYFLAG LOWBATT SYSLOG+EXEC
NOTIFYFLAG SHUTDOWN SYSLOG+EXEC
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5

# egrep -v '#|^ *$' /usr/local/etc/nut/upssched.conf
CMDSCRIPT /usr/local/bin/upssched-cmd
PIPEFN /var/db/nut/upssched/upssched.pipe
LOCKFN /var/db/nut/upssched/upssched.lock
AT ONBATT * START-TIMER ONBATT 60 <- los 60 seg
AT ONLINE * CANCEL-TIMER ONBATT
AT LOWBATT * EXECUTE LOWBATT
AT SHUTDOWN * EXECUTE SHUTDOWN

# egrep -v '#|^ *$' /usr/local/bin/upssched-cmd
case $1 in
ONBATT)
echo ONBATT TIMEOUT | mail -s "UPS Notify" reidrac
/usr/local/sbin/upsmon -c fsd
;;
LOWBATT)
echo LOWBATT | mail -s "UPS Notify" reidrac
;;
SHUTDOWN)
echo SHUTDOWN | mail -s "UPS Notify" reidrac
;;
*)
logger -t upssched-cmd "Unrecognized command: $1"
;;
esac

Re-inicio upsmon para que tome la nueva configuracion
# /usr/local/etc/rc.d/nut_upsmon restart

No hay comentarios.: