Provided by: powstatd_1.5.1-9.1_amd64 bug

NAME

       powstatd - a configurable UPS monitor.

SYNOPSIS

       powstatd [ -t | -k ]

DESCRIPTION

       powstatd  is  a  configurable  UPS monitoring daemon designed to work with SysVinit (e.g.,
       most Linux distributions).

       powstatd monitors a serial connection from a "dumb" or "relay" UPS for power failures  and
       shuts  the  machine  down gracefully if the power remains off for more than a prespecified
       interval.  powstatd can also be configured to allow a master machine  to  control  several
       slave  machines connected to the same UPS via a network connection. This allows you to run
       several machines off the same UPS, with only one of the machines actually reading the  UPS
       status  over  the  serial  line.  When compiled with appropriate options enabled, powstatd
       also provides security by means  of  fast  encryption  of  master/slave  communication  to
       prevent malicious shutdown of slave systems.

       powstatd has two options:

       -t     Test  mode. Used to explore what a given UPS signals under various failure modes as
              an aid to constructing an appropriate configuration file. When  operating  in  test
              mode,  powstatd  doesn't  actually  signal init, so while changes in UPS status are
              detected, they are not acted upon. See configuration information for more details.

       -k     Kill mode.  Directs powstatd to attempt to shut down the  UPS.   Most  UPS  systems
              will  ignore the shutdown signal unless the power is actually off. By shutting down
              the  UPS,  powstatd  ensures  that  once  the  main  power  returns  the  UPS  will
              automatically turn on and cause the machine to reboot.

CAVEATS

       powstatd  uses  the  connectionless  UDP protocol to communicate UPS status from master to
       slave. To keep just anyone from generating a UDP packet that will shut your slave  machine
       down  when  encrypted  master/slave  communication  is not in use, the slave checks the IP
       address of origin in the UDP packet it receives. If your master has more than one  network
       card, a master with multiple addresses may provide an unexpected IP address, which results
       in the slave ignoring (legitimate) status reports.

       So when you have a machine with multiple network cards, you must either  ensure  that  the
       master  has  a  unique  IP  address  (try  connecting  the single-NIC slave to the UPS and
       demoting  the  dual-NIC  master  to  slave  instead),  or   use   encrypted   master/slave
       communication,   which  does  not  need  to  check  IP  source  addresses  thanks  to  the
       cryptographic measures used.

       When using encrypted master/slave communication, powstatd also uses a  timestamp  to  foil
       replay  attacks.  Outdated  status  messages  (as  defined by a compile-time constant) are
       simply rejected; thus master and slave clocks should be  reasonably  synchronized  (using,
       for example, the NTP protocol) or valid status messages may be rejected.

CONFIGURATION

       powstatd  is  configured  via  a  configuration  file, /etc/powstatd.conf by default, that
       specifies the serial line behavior of the UPS under its various failure modes (note  that,
       if  compiled  with  appropriate  security  option enabled, powstatd will require that file
       permissions on the configuration file deny rwx access to "group" or "other").

       To configure your UPS, follow these steps:

       0.  Edit the Makefile to suit your installation. In particular,  the  secure  master/slave
       communication  protocol  is  selected/deselected  by  making the appropriate change to the
       definition of CFLGS in the Makefile. Note that users outside the United States wishing  to
       use the secure communication protocol will first need to download the public-domain ANSI C
       implementation     of     TEA,     the      Tiny      Encryption      Algorithm,      from
       ftp://vader.eeng.brad.ac.uk/pub/crypto/xtea.c

       1.  Compile powstatd:

          % make

       or, if you are compiling on a DEC Alpha platform:

          % make alpha

       2.   Make sure your new UPS is completely charged and is connected to your machine via the
       serial monitoring line provided by the UPS manufacturer to your machine (if  you  did  not
       get  such a monitoring line with your UPS, see the the UPS-HOWTO for information on how to
       make one).

       3.  In order to configure powstatd, make sure your machine is not powered from the UPS but
       is  instead  plugged  directly  into  the  wall outlet (your UPS should still, however, be
       connected to the machine via the serial monitoring line). Instead, plug a  desk  light  or
       radio into the UPS.

       4.   Determine  what  serial  line  is connected to your UPS and create an initial copy of
       /etc/powstatd.conf (you can look at the  sample  powstatd.conf.*  files  included  in  the
       distribution) containing a single line specifying the serial line, e.g.:

          watch ttyS0

       5.   As  root,  run  powstatd  in  test  mode (you'll have to be root to have rw access to
       /dev/ttyS0 or whatever device corresponds to your UPS monitoring line).

          % ./powstatd -t

       Hit ^C to stop after you see something like:

          CTS  DSR  DCD  RNG    RxD  TxD    DTR  RTS    STATUS
          1    0    1    1      0    0      0    1      OK
          1    0    1    1      0    0      0    1      OK
          1    0    1    1      0    0      0    1      OK
          1    0    1    1      0    0      0    1      OK

       The output describes the state of the serial connection between the UPS and the  computer.
       Since  the  signaling  needs of a UPS/computer connection are really quite low (just a few
       bits), we aren't really using the serial connection as it was  designed  to  be  used  for
       higher-throughput applications. Instead, we'll use the individual control and transmission
       lines in the nine wire standard connector a bit differently.

       Of the nine wires, six are of particular interest: four "input" control lines  (CTS,  DSR,
       DCD, RNG) and two "output" control lines (DTR, RTS).  The remaining three lines consist of
       an electrical ground and the two transmission lines (TxD and  RxD,  one  running  in  each
       direction);  the latter are typically used for asynchronous serial information rather than
       for control. Most "dumb" UPS systems ignore the transmission lines  and  operate  only  by
       toggling  combinations of the four "input" wires to indicate the status of the UPS and the
       two "output" wires to send commands back to the UPS from  the  computer  (for  now,  we'll
       assume that the current UPS is one of these).

       Since the UPS is fully charged and the power is on, we want to play with the configuration
       in /etc/powstatd.conf until STATUS reads OK, and not LOW or FAIL. Provided we are actually
       watching the correct serial line, getting STATUS to read OK entails setting initial values
       for the output lines DTR and RTS (of course, it makes no  sense  to  try  to  set  initial
       values on the input lines). Try adding permutations of init values like:

          init dtr 1
          init rts 1

       until you get the OK status reading.

       6.  Repeat step 4, but this time pull the plug on the UPS and then reinsert it after a few
       seconds. Observe changes in the values for the input lines; it should be easy to determine
       what line corresponds to power failure. For example:

          CTS  DSR  DCD  RNG    DTR  RTS    STATUS
          1    0    1    1      0    1      OK
          1    0    1    1      0    1      OK
          1    0    1    1      0    1      OK
          1    0    1    1      0    1      OK
          0    0    1    1      0    1      FAIL   <- plug pulled
          0    0    1    1      0    1      FAIL
          0    0    1    1      0    1      FAIL
          0    0    1    1      0    1      FAIL
          1    0    1    1      0    1      OK     <- plug reinserted
          1    0    1    1      0    1      OK
          1    0    1    1      0    1      OK

       would  indicate  that  CTS going to 0 corresponds to a power failure. If you leave the UPS
       unplugged long enough to discharge (this may take quite a while  even  with  a  good  size
       light bulb!), the UPS should signal a battery failure in a similar fashion, e.g.,

          CTS  DSR  DCD  RNG    DTR  RTS    STATUS
          0    0    0    1      0    1      LOW
          0    0    0    1      0    1      LOW
          0    0    0    1      0    1      LOW
          0    0    0    1      0    1      LOW

       7.  At this point, you should know the power failure and low battery signals.  Now we must
       determine the appropriate UPS shutdown signal. Fortunately, for most  UPS  systems,  there
       are  only  4 possible simple signals. With the UPS on battery power (e.g., unplugged), try
       adding each of the following lines into /etc/powstatd.conf in turn:

          kill dtr 0
          kill dtr 1
          kill rts 0
          kill rts 1

       for each trial, try issuing the command:

          % ./powstatd -k

       one of the line specifications should cause the desk lamp or radio to turn off; that's the
       one  you  want.  Important:  be aware that many UPS have a "dead time" after the signal is
       sent before the UPS turns itself off; this "dead time" can be as long as 30-45 seconds! So
       don't  be  too  impatient  here or you won't know which signal is responsible for actually
       turning the UPS off.

       8.  At this point configuration should  be  complete.  For  example,  for  the  Cyberpower
       Power99  325/385/450/500VA  models,  a  reasonable  /etc/powstatd.conf  configuration file
       reads:

          watch ttyS0
          fail cts 0
          low dcd 0
          init rts 1
          init dtr 0
          kill dtr 1

       9.  If you have other machines running off the same UPS, include one or more slave entries
       specifying their names in the master's configuration file:

          slave slave1.domain.edu
          slave slave2.domain.edu

       The  slave  machines'  configuration files /etc/powstatd.conf should contain a single line
       specifying the name of the master machine that is actually monitoring the  UPS  that  also
       powers the slave:

          watch master.domain.edu

       If  you intend to run more than 2 slaves off a very large UPS, you will need to adjust the
       MAXSLAVES parameter in the source code accordingly and then recompile.

       If powstatd is compiled with the appropriate security option enabled, encryption  is  used
       to protect slaves from malicious shutdown messages. An identical password directive should
       therefore appear in both master and slave configuration files:

          password MyPasswordHere

       In addition to encrypting status information, powstatd will  encrypt  generate  and  check
       timestamps in order to foil replay attacks.

       10.   Make  sure  your  inittab  file  contains appropriate lines to invoke powstatd.fail,
       powstatd.low, and powstatd.ok:

          # UPS signals a power outage.
          pf:12345:powerfail:/sbin/powstatd.fail

          # UPS signals power restored before the shutdown kicks in.
          pr:12345:powerokwait:/sbin/powstatd.ok

          # UPS signals low battery power: emergency shutdown.
          pn:12345:powerfailnow:/sbin/powstatd.low

       11.  Edit scripts powstatd.ok, powstatd.fail, and powstatd.low to adjust time  parameters,
       if desired.

       12.  "make install", then reboot the machine. If you don't want to reboot, issue instead:

          % /etc/rc.d/init.d/powstatd start
          % /sbin/init q

   How It Works:
       powstatd is initiated as a daemon in runlevels 3 and 5.

       A  UPS  can only be in one of three states; OK, FAIL, or LOW. Usually, when the main power
       is on, the UPS is operating in the OK state; when power fails, the  UPS  changes  to  FAIL
       mode,  from which it can either recover and return to OK (if the power is restored) or can
       move to LOW (if the battery starts running out of juice before the power returns).

       powstatd monitors the UPS condition. When the state changes, powstatd writes the new state
       of  the UPS in /etc/powerstatus and then signals init (the mother of all processes) of the
       change in the UPS condition. The init process receives this notice  (a  SIGPWR  interrupt)
       and checks /etc/powerstatus to see if it contains "OK", "FAIL" or "LOW".

       The contents of /etc/powerstatus tells init (which is configured by the /etc/inittab file)
       to run one of three scripts: powstatd.fail, powstatd.ok, or powstatd.low The init  process
       then removes /etc/powerstatus so as not to be confused on subsequent interrupts.

       powstatd.fail
              initiates a timed shutdown -h (halt) in background, on the assumption that if power
              is restored the shutdown can be cancelled.

       powstatd.ok
              cancels the running shutdown and notifies all users that power is restored  and  no
              shutdown is imminent.

       powstatd.low
              cancels  the running shutdown and initiates an immediate shutdown -h in foreground;
              this means once the UPS tells you the battery is  low,  you  will  indeed  shutdown
              (there is no recovery).

       Note  that  as you halt the machine, the shutdown sequence invokes powstatd one last time,
       but this time with the kill flag (-k), forcing the UPS to turn off, but only if the UPS is
       indeed  in  either  the FAIL or LOW state (in any case, most supplies will ignore the kill
       signal if power is still available). In this fashion, once the  power  eventually  returns
       (even after a day or two), the system should automatically restart without intervention.

   Troubleshooting:
       1.   If  your machine doesn't seem to notice power status changes even when the UPS daemon
       is signalling them, try adjusting the location of the powerstatus  file  by  changing  the
       value of STATUS in the Makefile and recompiling. Some versions of the init process look in
       /var/log/powerstatus rather than the default /etc/powerstatus.

       2.  If your machine keeps shutting down  even  when  the  power  is  on,  you're  probably
       watching  the  wrong  serial  line.  To  recover, try rebooting in single user mode (issue
       "linux 1" at the LILO prompt) and  disable  powstatd  by  renaming  /etc/powstatd.conf  to
       something else. Reboot and you should be able to fix the configuration.

       3.  Some older UPS systems as well as some homebuilt cable connections (see the UPS HowTo)
       may require that UPS shutdown signals be sent on the transmission line rather than on  one
       of  the  signaling  lines.  Usually, this implies that a serial break signal (e.g., a long
       series of zeros) is required for the UPS to shut down. For these situations, you  can  use
       the special configuration file command

          kill break

       to obtain the appropriate behavior.

       4.   If your slave machines keep rejecting seemingly valid status messages from the master
       when using encrypted master/slave communication, first make sure they are running the same
       version  of  the software. Otherwise, try changing the definition of "outdated" at compile
       time (MAXCLOCKDRIFT) and recompiling. If you are not using NTP or some other mechanism  to
       ensure  that  master  and slave clocks are reasonably synchronized, you may well be better
       off running powstatd compiled without -DSECURE.

       5.  Some older versions of init are not capable  of  invoking  one  of  several  different
       scripts  (e.g.,  powstatd.ok,  powstatd.fail,  powstatd.low)  on  receipt  of SIGPWR under
       different circumstances. Instead, they always invoke the  same  script,  which  must  then
       handle the control logic (i.e., deciding whether to shutdown gracefully, abort a shutdown,
       or shutdown immediately) internally (SPARC/Solaris and SGI/Irix apparently  fall  in  this
       catagory).  If  you  have  such a version of init, look at the sample script powstatd.dumb
       included in the distribution for an example of how to go about handling this case.

ACKNOWLEDGEMENTS

       I learned a lot from reading the publically-available source code for other UPS monitoring
       packages,  like  genpower,  powerd and upsd.  I wrote powstatd primarily because the exact
       combination of features or configuration options I required were not available with  these
       other packages.

       Peter  Galbraith  (galbraithp@dfo-mpo.gc.ca),  the  powstatd  Debian  package  maintainer,
       provided numerous suggestions and bug fixes, as did Philippe  Troin  (phil@fifi.org),  who
       was  the  first  to  suggest  using, e.g., MD5-based digital signatures to avoid malicious
       shutdowns. Nick Holgate (holgate@debian.org) suggested an extension to powstatd  signaling
       capabilities  in  order  to  support UPS systems that require a break signal for shutdown.
       Nicolas Simonds (nic@bridge.com) provided information about changes to the code  for  both
       SPARC/Solaris and SGI/Irix.

       TEA,  or  the  Tiny Encription Algorithm, is due to David Wheeler and Roger Needham of the
       Cambridge Computer Laboratory. Their implementation, used here, is in the public domain.

       Alberto Maria Segre
       segre@cs.uiowa.edu
       S378 Pappajohn Building
       The University of Iowa
       Iowa City, IA  52242-1000.