Uninterruptable Power Supply
Introduction
The primary goal of the Network UPS Tools (NUT) project is to provide reliable monitoring of UPS hardware and ensure safe shutdowns of the systems which are connected.
The default configuration of NUT, will keep your connected systems operational until a critical battery state is reached (ie battery is nearing exhaustion) and then power down your server/equipment in a controlled fashion. See http://www.networkupstools.org/
Default Configuration (USB)
The default configuration in SME Server as set by the database properties for 'nut' is
Model = usbhid-ups status = disabled type = service
Most USB connected UPS's will work with these default settings. If using a USB connection just enable nut as follows:
config setprop nut status enabled signal-event post-upgrade signal-event reboot
If your USB UPS does not work properly OR you have a serial device then follow the Configuration Options below as required.
Configuration Options
Not all UPS's are supported by USB or the usbhid-ups driver. However NUT supports many UPS's and can be configured under SME Server easily.
Serial Connection
- Find the configuration details for your model of UPS. Refer to: http://www.networkupstools.org/compat/stable.html and make note of the driver name and upstype number (if any) in the third column.
- From the consol issue the following commands:
config setprop nut Model <model>
config setprop nut Device <device>
config setprop nut Type <type>
config setprop nut status enabled
Where:
<model> and <type> are the driver name and type number found above.
<device> is the serial port that the UPS is connected to eg. /dev/ttyS0. It also possible to use a more readable symlink. See HowTo on udev - symlinks for details. Note: The case of Model, Device and Type. - Check: config show nut
- Apply changes and restart server: signal-event post-upgrade signal-event reboot Alternatively, without NUT running or requiring a server reboot: expand-template /etc/sysconfig/ups expand-template /etc/ups/ups.conf expand-template /etc/ups/upssched.conf expand-template /etc/ups/upsmon.conf expand-template /etc/ups/upsd.users expand-template /etc/ups/upsd.conf /etc/rc7.d/S38nut start
- Confirm server is communicating with UPS: upsc UPS@localhost Whenever a UPS event occurs Emails are sent to the admin account.
Configuring as a slave
Set configuration values:
config setprop nut SlaveUPS UPS@192.168.33.11 config setprop nut Master no
Where 192.168.33.11 is your UPS master, that is the computer that is in direct communication with the UPS. The hostname of that computer may also work.
Apply changes and restart server:
signal-event post-upgrade signal-event reboot
Confirm server is communicating with master:
upsc UPS@192.168.33.11
Conecting multiple UPS's
To be added http://bugs.contribs.org/show_bug.cgi?id=629
UPS Variables and Commands
In some cases you may wish to modify variables on the actual UPS such as the Low Charge/LOWBATTERY setting. This requires the use of the upsrw command and UPS administrative privileges.
You may also want to control the UPS directly from the command line by issuing UPS commands. This requires use of the upscmd command and UPS administrative privileges. {Warning box|In general, the UPS data should be left protected and changes to it or issuing of commands well thought out. If you wish to make data changes or issue commands then the administrative privileges can be enabled as below and should then be disabled.}
UPS Administrative Privileges
In order to be able to use upsrw and upscmd it is necessary to have a suitable additional user defined in the upsd.users configuration file.
In order to create a suitable user we will use SME Servers templating system and configuration database.
First we need to create a suitable template fragment
mkdir -p /etc/e-smith/templates-custom/etc/ups/upsd.users cd /etc/e-smith/templates-custom/etc/ups/upsd.users
Create and edit a new file called 'admin'
{ # create admin user for upsd to allow setting of # UPS parameters via upsrw $OUT .= ""; return unless (($nut{AdminUser} || 'disabled') eq 'enabled'); return unless (($nut{AdminPass} || ) ne ); $OUT .= "\n"; $OUT .= " [admin]\n"; $OUT .= " password = $nut{AdminPass}\n"; if ( ($nut{Master} || 'yes') ne 'no') { $OUT .= " allowfrom = localhost\n"; } else { $OUT .= " allowfrom = localhost localnet\n"; } $OUT .= " actions = set\n"; $OUT .= " instcmds = all\n"; }
Create two new database properties for nut
config setprop nut AdminUser enabled (This enables the creation of the user in the template above) config setprop nut AdminPass admin (This sets a password for the admin user. Set to whatever you want)
Now, to get upsd to recognise the new user with the required administrative privileges we expand the template and reload the upsd configuration
/sbin/e-smith/expand-template /etc/ups/upsd.users /usr/sbin/upsd -c reload
Setting UPS Variables
In order to set UPS variables it is necessary to have enabled a user with administrative privileges as above first.
In the examples below, it is assumed your UPS name is UPS', that it is local, that the administrative user is admin and password admin. You can verify your UPS name via:
upsc -l
To view a complete list of the UPS variables
upsc UPS
To determine the modifiable variables for your UPS execute the command:
upsrw UPS
You can now modify the variables you wish using a command similar to:
upsrw -s battery.charge.low=20 -u admin -p admin UPS
Where the value after -s should be one of the parameters identified by the upsrw ups command. You can of course verify your changes using
upsrw UPS
or
upsc UPS
After you are done, clean up by disabling the upsd administrative user admin:
More information on upsrw can be found at:
- Manual page: man upsrw
- Upsrw examples: [1]
Modifying shutdown time delay
The following changes to NUT configuration will shut down the server a specified time after receiving the "on battery" signal (the example given is for 2 minutes).
To create a timed shutdown before the BATTLOW signal is received, it is necessary to configure upssched and have a script handle the UPS events (upsmon cannot do this).
config setprop nut status enabled config setprop nut Model megatec_usb config setprop nut Type auto
Create and edit a custom template
mkdir -p /etc/e-smith/templates-custom/etc/ups/upsmon.conf pico -w /etc/e-smith/templates-custom/etc/ups/upsmon.conf/NOTIFYCMD
Add the following:
NOTIFYCMD /usr/sbin/upssched
Save & exit
Ctrl o Ctrl x
Create and edit a custom template
mkdir -p /etc/e-smith/templates-custom/etc/ups/upssched.conf pico -w /etc/e-smith/templates-custom/etc/ups/upssched.conf/01CONFIG
Add the following:
CMDSCRIPT /sbin/e-smith/nutUPS.cmd PIPEFN /tmp/upspipe LOCKFN /tmp/upslock AT COMMBAD * EXECUTE commbad AT COMMOK * EXECUTE commok AT NOCOMM * EXECUTE nocomm AT ONBATT * EXECUTE powerout AT ONBATT * START-TIMER shutdownnow 120 AT LOWBATT * EXECUTE shutdowncritical AT ONLINE * CANCEL-TIMER shutdownnow AT ONLINE * EXECUTE powerup
In the above set the line AT ONBATT * START-TIMER shutdownnow 120 to how many seconds after ONBATT signal you want to shut down
Save & exit
Ctrl o Ctrl x
Create the script
pico -w /sbin/e-smith/nutUPS.cmd
Add the following:
#! /bin/sh case $1 in commbad) /bin/echo "UPS communications failure on `date`." | /bin/mail -s"UPS communications LOST" admin /usr/bin/wall "UPS communications failure." ;; commok) /bin/echo "UPS communications restored on `date`." | /bin/mail -s"UPS communications restored" admin /usr/bin/wall "UPS communications restored." ;; nocomm) /bin/echo "UPS communications cannot be established on `date`." | /bin/mail -s"UPS uncontactable" admin /usr/bin/wall "UPS communications cannot be established." ;; powerout) /bin/echo "Power failure on `date`." | /bin/mail -s"UPS on battery" admin /usr/bin/wall "UPS on battery. Shutdown in 60 seconds...." ;; shutdownnow) /bin/echo "UPS has been on battery for 60 seconds. Starting orderly shutdown on `date`." | /bin/mail -s"UPS on battery for 60 seconds" admin /usr/bin/wall "UPS has been on battery for 60 seconds. Shutting down NOW!!!!" /usr/bin/sudo /sbin/e-smith/signal-event halt ;; shutdowncritical) /bin/echo "UPS battery level CRITICAL. Starting EMERGENCY shutdown on `date`." | /bin/mail -s"UPS battery CRITICAL" admin /usr/bin/wall "UPS battery level CRITICAL. Shutting down NOW!!!!" /usr/bin/sudo /sbin/e-smith/signal-event halt ;; powerup) /bin/echo "Power restored on `date`." | /bin/mail -s"UPS on line" admin /usr/bin/wall "UPS on line. Shutdown aborted." ;; *) /bin/echo "Unrecognized command: $1" ;; esac
Create a custom template
mkdir -p /etc/e-smith/templates-custom/etc/sudoers/30nut
Add the following
nut ALL=NOPASSWD: ALL
To complete the process
signal-event post-upgrade signal-event reboot
Aditional Information
There are template fragments in /etc/e-smith/templates/etc/ups that control the config files located in /etc/ups. The default settings should be OK for most situations.
An example of doing this can be found in the forum: http://forums.contribs.org/index.php?topic=40668.0
For information on configuration parameters:
man ups.conf man upsd.conf man upsd.users man upsmon.conf man upssched.conf
For general information:
man upsd man nutupsdrv
The NUT website is here
http://www.networkupstools.org/
From that website you can glean which configuration setting does what function
Then modify the NUT config file, by creating a custom template, expanding template and restarting service