Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
FAILOVER(8)			   NUT Manual			     FAILOVER(8)

NAME
     failover - UPS Failover Driver

SYNOPSIS
     failover -h

     failover -a UPS_NAME [OPTIONS]

	 Note

	 This man page only documents the specific features of the failover dri-
	 ver. For information about the core driver, see nutupsdrv(8).

DESCRIPTION
     The  failover driver acts as a smart proxy for multiple "real" UPS drivers.
     It connects to and monitors these underlying UPS drivers through their  lo-
     cal  UNIX	sockets (or Windows named pipes), continuously evaluating health
     and suitability for "primary" duty according to a set of user  configurable
     rules and priorities.

     At  any  given time, failover designates one UPS driver as the primary, and
     presents its commands, variables and status to the outside world as  if  it
     were  directly  talking  to  that	UPS. From the perspective of the clients
     (such as upsmon(8) or upsc(8)), the failover driver behaves like any single
     UPS, abstracting away the underlying redundancy, and allowing for	seamless
     transitioning between all monitored UPS drivers and their datasets.

     The driver dynamically promotes or demotes the primary UPS driver based on:

     *	 Socket availability and communication status

     *	 Data freshness and UPS online/offline indicators

     *	 User-defined status filters (e.g., presence or absence of OL, LB, ...)

     *	 Administrative  override via control commands (force.primary, force.ig-
	 nore)

     If the current primary becomes unavailable or no longer meets the criteria,
     the driver automatically fails over to a more suitable driver. During tran-
     sitions, it ensures that any data is switched out	instantly,  without  the
     upsd(8) considering it as stale or the clients acting on any previously de-
     graded status.

     When no suitable primary is available, a configurable fallback state is en-
     tered:

     *	 Keep last primary and declare the data as stale

     *	 Raise ALARM and declare the data as stale

     *	 Raise ALARM and set forced shutdown (FSD)

     Different communication media can be used to connect to individual UPS dri-
     vers  (e.g.,  USB, Serial, Ethernet). failover communicates directly at the
     socket level and therefore does not rely on upsd(8) being active.

EXTRA ARGUMENTS
     This driver supports the following settings:

     port=drivername-devicename,drivername2-devicename2,...
	 Required. Specifies the local sockets (or Windows named pipes)  of  the
	 underlying  UPS drivers to be tracked. Entries must either be a path or
	 follow the format drivername-devicename,  as  used  by  NUT's	internal
	 socket naming convention (e.g.  usbhid-ups-myups). Multiple entries are
	 comma-separated with no spaces.

     inittime=seconds
	 Optional. Sets a grace period after driver startup during which the ab-
	 sence	of  a primary is tolerated. This allows time for underlying dri-
	 vers to initialize. For networked connections or drivers  that  require
	 "lock-picking"  their	communication protocol, consider increasing this
	 value to accommodate potential longer delays. Defaults to 30 seconds.

     deadtime=seconds
	 Optional. Sets a grace period in seconds after which  a  non-responsive
	 UPS driver is considered dead. Defaults to 30 seconds.

     relogtime=seconds
	 Optional.  Time  interval in which repeated connection failure logs are
	 emitted for a UPS, reducing log spam during  unstable	conditions.  De-
	 faults to 5 seconds.

     noprimarytime=seconds
	 Optional. Duration to wait without a suitable primary UPS driver before
	 entering  the	configured  fallback mode (fsdmode). Defaults to 15 sec-
	 onds.

     maxconnfails=count
	 Optional. Number of consecutive connection  failures  allowed	per  UPS
	 driver before entering into the cooldown period (coolofftime). Defaults
	 to 5.

     coolofftime=seconds
	 Optional.  Cooldown period during which the driver pauses reconnect at-
	 tempts after exceeding maxconnfails. Defaults to 15 seconds.

     fsdmode=0|1|2
	 Optional. Defines the behavior when no suitable primary UPS  driver  is
	 found after noprimarytime has elapsed. Defaults to 0.

	 *   0:  Do  not  demote  the  last primary, but mark its data as stale.
	     This is similar to how a regular UPS driver would	behave	when  it
	     loses  its connection to the target UPS device.  upsmon(8) will act
	     on the last known (online or not) status, and decide itself whether
	     that UPS should be considered critical.

	 *   1: Demote the primary, raise ALARM, and mark the data as stale  af-
	     ter  an additional few seconds have elapsed (ensuring full propaga-
	     tion).  This will cause upsmon(8) to detect that  a  device  previ-
	     ously  in	an alarm state has lost its connection, consider the UPS
	     driver critical, and possibly trigger a forced shutdown  (FSD)  due
	     to depletion of MINSUPPLIES.

	 *   2:  Demote the primary, raise ALARM, and immediately set FSD.  This
	     will set FSD from the driver side and preempt upsmon(8) from  rais-
	     ing  it itself. This mode is for setups where immediate shutdown is
	     warranted, regardless of anything else, and getting FSD out to  the
	     clients as fast as just possible.

     checkruntime=0|1|2|3
	 Optional.  Controls  how  battery.runtime values are used to break ties
	 between non-fully-online UPS devices at priority 3 or lower. Has no ef-
	 fect on initial priority selection or when strictfiltering is	enabled.
	 Defaults to 1.

	 *   0:  Disabled.   No  runtime comparison is done. The first candidate
	     with the best priority is selected according to the  order  of  the
	     port argument.

	 *   1:  Compare battery.runtime.  The UPS with the higher value is pre-
	     ferred. If the value is missing or invalid, the UPS cannot win  the
	     tie-break.

	 *   2:  Compare  battery.runtime.low.	The UPS with the higher value is
	     preferred. If the value is missing or invalid, the UPS  cannot  win
	     the tie-break.

	 *   3:  Compare  both variables strictly.  The UPS is preferred only if
	     it has both a higher battery.runtime and battery.runtime.low value.
	     If either is missing or invalid, the UPS cannot win the tie-break.

     strictfiltering=0|1
	 Optional. If set to 1, only UPS drivers matching the configured  status
	 filters  are  considered  for	promotion  to  primary. If set to 0, the
	 hard-coded default logic is also  considered  when  no  status  filters
	 match (read more about this in the section PRIORITIES). Defaults to 0.

     status_have_any=OL,CHRG,...
	 Optional.  If	any of these comma-separated tokens are present in a UPS
	 driver's ups.status, it passes this status filtering criteria. Defaults
	 to unset.

     status_have_all=OL,CHRG,...
	 Optional. All listed comma-separated tokens must be present in ups.sta-
	 tus for the UPS driver to pass this status filtering criteria. Defaults
	 to unset.

     status_nothave_any=OB,OFF,...
	 Optional. If  any  of	these  comma-separated	tokens	are  present  in
	 ups.status,  the  UPS driver does not pass this status filtering crite-
	 ria. Defaults to unset.

     status_nothave_all=OB,LB,...
	 Optional. If  all  of	these  comma-separated	tokens	are  present  in
	 ups.status,  the  UPS driver does not pass this status filtering crite-
	 ria. Defaults to unset.

	 Note

	 The status_* arguments are primarily intended to adjust  the  weighting
	 of  UPS  drivers,  allowing some to be prioritized over others based on
	 their status. For example, a driver reporting	OL  might  be  preferred
	 over one reporting ALARM OL. While strictfiltering can be enabled, sta-
	 tus  filters  are  most effective when used in combination with the de-
	 fault set of connectivity-based PRIORITIES. For more details,	see  the
	 respective section further below.

IMPLEMENTATION
     The  port	argument  in  the  ups.conf(5) should reference the local driver
     sockets (or Windows named pipes) that the "real" UPS drivers are  using.  A
     basic default setup with multiple drivers could look like this:

	   [realups]
	      driver = usbhid-ups
	      port = auto

	   [realups2]
	      driver = usbhid-ups
	      port = auto

	   [failover]
	      driver = failover
	      port = usbhid-ups-realups,usbhid-ups-realups2

     Any upsmon(8) clients would be set to monitor the failover UPS.

     The driver fully supports setting variables and performing instant commands
     on  the  currently  elected  primary UPS driver, which are proxied and with
     end-to-end tracking also being possible (upscmd(8) and  upsrw(8)  -w).  You
     may  notice  some	variables  and commands will be prefixed with upstream.,
     this is to clearly separate the upstream commands from  those  of	failover
     itself.

     For your convenience, additional administrative commands are exposed to di-
     rectly  influence and override the primary election process, e.g. for main-
     tenance:

     *	 <socketname>.force.ignore [seconds] prevents the specified  UPS  driver
	 from  being  selected as primary for the given duration, or permanently
	 if a negative value is used. A value of  0  resets  this  override  and
	 re-enables selection.

     *	 <socketname>.force.primary [seconds] forces the specified UPS driver to
	 be  treated with the highest priority for the given duration, or perma-
	 nently if a negative value is used. A value of 0 resets this override.

     Calling either command without an argument has the same effect  as  passing
     0, but only for that specific override - it does not affect the other.

PRIORITIES
     As outlined above, primaries are dynamically elected based on their current
     state and according to a strict set of user influenceable priorities, which
     are:

     *	 0  (highest):	UPS  driver was forced to the top by administrative com-
	 mand.

     *	 1: UPS driver has passed the user-defined status filters.

     *	 2: UPS driver has fresh data and is online (in status OL).

     *	 3: UPS driver has fresh data, but may not be fully online.

     *	 4 (lowest): UPS driver is alive, but may not have fresh data.

     The UPS driver with the highest calculated priority is chosen  as	primary,
     ties  are	resolved through order of the socket names given within the port
     argument.

     For the user-defined status filters, the following internal  order  is  re-
     spected:

      1. status_nothave_any (first)

      2. status_have_all

      3. status_nothave_all

      4. status_have_any (last)

     If strictfiltering is enabled, priorities 2 to 4 are not applicable.

     If  no  user-defined status filters are set, the priority 1 is not applica-
     ble.

	 Note

	 The base requirement for any election is  the	UPS  socket  being  con-
	 nectable and the UPS driver having published at least one full batch of
	 data  during  its  lifetime. UPS driver not fulfilling that requirement
	 are always disqualified.

RATIONALE
     In complex power environments, presenting a single,  consistent  source  of
     UPS information to upsmon(8) is sometimes preferable to monitoring multiple
     independent  drivers  directly. The failover driver serves as a bridge, al-
     lowing upsmon(8) to make decisions based on  the  most  suitable  available
     data, without having to interpret conflicting inputs or degraded sources.

     Originally  designed  for	use  cases such as dual-PSU systems or redundant
     communication paths to a single UPS, failover also supports  more	advanced
     setups  -	for  example,  when multiple UPSes feed a shared downstream load
     (via STS/ATS switches), or when  drivers  vary  in  reliability.  In  these
     cases,  the  driver can be combined with external logic or scripting to dy-
     namically adjust primary selection  and  facilitate  graceful  degradation.
     Such setups may also benefit from further integration with the clone family
     of  drivers,  such  as clone(8) or clone-outlet(8), for greater granularity
     and monitoring control down to the outlet level.

     Additionally, in more niche scenarios, some third-party NUT integrations or
     graphical interfaces may be limited to monitoring a single UPS  device.  In
     such  cases,  failover can help by exposing only the most relevant or high-
     est-priority data source, allowing those tools to operate within their con-
     straints without missing critical information.

     Ultimately, this driver enables more nuanced power monitoring  and  control
     than  binary online/offline logic alone, allowing administrators to respond
     to degraded conditions early - before they escalate into critical events or
     require upsmon(8) to take action.

LIMITATIONS
     When using failover for redundancy between multiple UPS  drivers  connected
     to the same underlying UPS device, data is not multiplexed between the dri-
     vers.  As	a  result, some data points may be available in some drivers but
     not in others.

     For checkruntime considerations, the unit of both battery.runtime and  bat-
     tery.runtime.low  is  assumed  to be seconds. UPS drivers that report these
     values using different units are  considered  non-compliant  with	the  NUT
     variable standards and should be reported to the NUT developers as faulty.

AUTHOR
     Sebastian Kuttnig <sebastian.kuttnig@gmail.com>

SEE ALSO
     upscmd(8),   upsrw(8),   ups.conf(5),   upsc(8),  upsmon(8),  nutupsdrv(8),
     clone(8), clone-outlet(8)

   Internet Resources:
     The NUT (Network UPS Tools) home page: https://www.networkupstools.org/

Network UPS Tools 2.8.5.	   08/04/2026			     FAILOVER(8)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=failover&sektion=8&manpath=FreeBSD+Ports+15.1.quarterly>

home | help