summaryrefslogtreecommitdiff
path: root/nut/titanium
diff options
context:
space:
mode:
authorpants <niklasjo2004@gmail.com>2026-09-21 14:16:02 -0700
committerpants <niklasjo2004@gmail.com>2026-09-21 14:16:02 -0700
commit40f81d08239763c2b5c05af63f17e3fd098d978d (patch)
treeb4475da076490a5fadc69904ad26bcf4ac46b9fc /nut/titanium
init
Diffstat (limited to 'nut/titanium')
-rw-r--r--nut/titanium/nut.conf78
-rw-r--r--nut/titanium/ups.conf221
-rw-r--r--nut/titanium/upsd.conf186
-rw-r--r--nut/titanium/upsd.users82
-rw-r--r--nut/titanium/upsmon.conf540
-rw-r--r--nut/titanium/upssched.conf124
6 files changed, 1231 insertions, 0 deletions
diff --git a/nut/titanium/nut.conf b/nut/titanium/nut.conf
new file mode 100644
index 0000000..5da7122
--- /dev/null
+++ b/nut/titanium/nut.conf
@@ -0,0 +1,78 @@
+# Network UPS Tools: example nut.conf
+#
+# This file tries to standardize the various files being found in the field,
+# like /etc/default/nut on Debian based systems, /etc/sysconfig/ups on RedHat
+# based systems, ... Distribution's init script or service unit/method script
+# should source this file to see which component(s) has to be started.
+# Some scripts and units provided by NUT project itself may also look into
+# this file for optional configuration about OS integration.
+#
+# IMPORTANT NOTES:
+# This file is intended to be sourced by standard POSIX shell scripts
+# (so there is no guaranteed `export VAR=VAL` syntax) and additionally
+# by systemd on Linux (no guaranteed expansion of variables).
+# You MUST NOT use spaces around the equal sign!
+# Practical support for this file and its settings currently varies between
+# various OS packages and NUT sample scripts, but should converge over time.
+#
+# See also: `man nut.conf` (usually in Manual pages Section 5,
+# for Configuration files)
+#
+##############################################################################
+# General section
+##############################################################################
+# The MODE determines which part of the NUT is to be started, and which
+# configuration files must be modified.
+#
+# The values of MODE can be:
+# - none: NUT is not configured, or use the Integrated Power Management, or use
+# some external system to startup NUT components. So nothing is to be started
+# by scripts or services bundled with NUT packages.
+# - standalone: This mode address a local only configuration, with 1 UPS
+# protecting the local system. This implies to start the 3 NUT layers (driver,
+# upsd and upsmon) and the matching configuration files. This mode can also
+# address UPS redundancy.
+# - netserver: same as for the standalone configuration, but also need
+# some more network access controls (firewall, tcp-wrappers) and possibly a
+# specific LISTEN directive in upsd.conf.
+# Since this MODE is opened to the network, a special care should be applied
+# to security concerns.
+# - netclient: this mode only requires upsmon (and tools it may be using, like
+# upssched or custom scripts) to monitor a remote NUT server and possibly
+# shut down this system (part of upsmon must run as root then).
+
+MODE=standalone
+
+# Uncomment this to allow starting the service even if `ups.conf` has no device
+# sections configured at the moment. This environment variable overrides the
+# built-in "false" flag in `upsd`, and an optional same-named default flag that
+# can be set in `upsd.conf`. If you want a data server always running, even if
+# it initially has nothing to serve (may be live-reloaded later, when devices
+# become configured), this option is for you.
+#ALLOW_NO_DEVICE=true
+#export ALLOW_NO_DEVICE
+
+# The optional 'UPSD_OPTIONS' allow to set upsd specific command-line options.
+# It is ignored when 'MODE' above indicates that no upsd should be running.
+# It may be redundant in comparison to options which can be set in `upsd.conf`.
+#UPSD_OPTIONS=
+
+# The optional 'UPSMON_OPTIONS' allow to set upsmon specific command-line options.
+# It is ignored when 'MODE' above indicates that no upsmon should be running.
+# It may be redundant in comparison to options which can be set in `upsmon.conf`.
+#UPSMON_OPTIONS=
+
+# If the optional 'POWEROFF_WAIT' is configured (to a value that can be handled
+# by `/bin/sleep` on the current system - typically an integer with the number
+# of seconds for a delay, but not always limited to that syntax), and the current
+# system which manages one or more UPS devices would not only command it to shut
+# down, but also try to avoid the "Power race". Caveats emptor, see NUT FAQ and
+# other docs for details.
+#POWEROFF_WAIT=3600
+
+# The optional 'POWEROFF_QUIET' setting controls if the NUT shutdown integration
+# scripts or service units would emit messages about their activity (or lack
+# thereof). By default they may be verbose, to aid post-mortem troubleshooting
+# via logs or console captures.
+# Set to `true` to avoid that trove of information, if you consider it noise.
+#POWEROFF_QUIET=true
diff --git a/nut/titanium/ups.conf b/nut/titanium/ups.conf
new file mode 100644
index 0000000..21f765a
--- /dev/null
+++ b/nut/titanium/ups.conf
@@ -0,0 +1,221 @@
+[ups]
+ driver = usbhid-ups
+ port = auto
+ vendorid = 0764
+ productid = 0601
+# Network UPS Tools: example ups.conf
+#
+# --- SECURITY NOTE ---
+#
+# If you use snmp-ups and set a community string in here, you
+# will have to secure this file to keep other users from obtaining
+# that string. It needs to be readable by upsdrvctl and any drivers,
+# and by upsd.
+#
+# ---
+#
+# This is where you configure all the UPSes that this system will be
+# monitoring directly. These are usually attached to serial ports, but
+# USB devices and SNMP devices are also supported.
+#
+# This file is used by upsdrvctl to start and stop your driver(s), and
+# is also used by upsd to determine which drivers to monitor. The
+# drivers themselves also read this file for configuration directives.
+#
+# The general form is:
+#
+# [upsname]
+# driver = <drivername>
+# port = <portname>
+# < any other directives here >
+#
+# The section header ([upsname]) can be just about anything as long as
+# it is a single word inside brackets. upsd uses this to uniquely
+# identify a UPS on this system.
+#
+# If you have a UPS called snoopy, your section header would be "[snoopy]".
+# On a system called "doghouse", the line in your upsmon.conf to monitor
+# and manage it would look something like this:
+#
+# MONITOR snoopy@doghouse 1 monuser mypassword primary
+#
+# It might look like this if monitoring in "secondary" mode (without any
+# ability to directly manage the UPS) from a different system:
+#
+# MONITOR snoopy@doghouse 1 monuser mypassword secondary
+#
+# Configuration directives
+# ------------------------
+#
+# These directives are used by upsdrvctl only and should be specified outside
+# of a driver definition:
+#
+# maxretry: OPTIONAL. Specify the number of attempts to start the driver(s),
+# in case of failure, before giving up. A delay of 'retrydelay' is
+# inserted between each attempt. Caution should be taken when using
+# this option, since it can impact the time taken by your system to
+# start.
+#
+# The built-in default is 1 attempt.
+#
+# retrydelay: OPTIONAL. Specify the delay between each restart attempt of the
+# driver(s), as specified by 'maxretry'. Caution should be taken
+# when using this option, since it can impact the time taken by your
+# system to start.
+#
+# The default is 5 seconds.
+#
+# chroot: OPTIONAL. Used for securing. See man page for details.
+#
+# driverpath: OPTIONAL. Used for custom setups. See man page for details.
+#
+# nowait: OPTIONAL. Tell upsdrvctl to not wait at all for the driver(s)
+# to execute the requested command. Fire and forget.
+#
+# pollinterval: OPTIONAL. The status of the UPS will be refreshed after a
+# maximum delay which is controlled by this setting (default
+# 2 seconds). This may be useful if the driver is creating too
+# much of a load on your system or network.
+# Note that some drivers also have an option called *pollfreq*
+# which controls how frequently some of the less critical
+# parameters are polled. See respective driver man pages.
+#
+
+# Set maxretry to 3 by default, this should mitigate race with slow devices:
+#maxretry = 3
+
+# These directives can be set outside and inside a driver definition, with
+# slightly different meanings per context:
+#
+# maxstartdelay: OPTIONAL. This can be set as a global variable
+# above your first UPS definition and it can also be
+# set in a UPS section. This value controls how long
+# upsdrvctl will wait for the driver to finish starting.
+# This keeps your system from getting stuck due to a
+# broken driver or UPS.
+# Note that after this time upsdrvctl would just move
+# along with its business (whether retrying the same
+# driver if `maxretry>1`, or trying another driver if
+# starting them all, or just eventually exit); however,
+# each such most recently started "stuck" driver process
+# may be further initializing in the background, and
+# might even succeed eventually.
+# They would not be actively killed by upsdrvctl after
+# this timeout expires.
+#
+# The default is 45 seconds.
+#
+# debug_min: OPTIONAL. Specify a minimum debug level for all driver daemons
+# (when specified at global level), or for this driver daemon
+# (when specified in a driver section), e.g. for troubleshooting
+# a deployment. This does not directly impact the foreground or
+# background running mode. If both the global and driver level
+# `debug_min` are set, the driver-level setting takes precedence.
+# Command-line option `-D` can only increase this verbosity level.
+#
+# user, group: OPTIONAL. Overrides the compiled-in (also global-section,
+# when used in driver section) default unprivileged user/group
+# name for NUT device driver. Impacts access rights used for
+# the socket file access (group) and communication ports (user).
+#
+# synchronous: OPTIONAL. The driver work by default in asynchronous
+# mode (like *no*) with fallback to synchronous if sending
+# fails (i.e *synchronous=auto*). This means that all data
+# are pushed by the driver on the communication socket to
+# upsd (Unix socket on Unix, Named pipe on Windows) without
+# waiting for these data to be actually consumed. With
+# some HW, such as ePDUs, that can produce a lot of data,
+# asynchronous mode may cause some congestion, resulting in
+# the socket to be full, and the driver to appear as not
+# connected. By enabling the 'synchronous' flag
+# (value = 'yes'), the driver will wait for data to be
+# consumed by upsd, prior to publishing more. This can be
+# enabled either globally or per driver.
+#
+# The default is 'no' (i.e. asynchronous mode) for backward
+# compatibility of the driver behavior.
+#
+
+# These directives are common to all drivers that support ups.conf:
+#
+# driver: REQUIRED. Specify the program to run to talk to this UPS.
+# apcsmart, bestups, and sec are some examples.
+#
+# port: REQUIRED. The serial port where your UPS is connected.
+# For example:
+# /dev/ttyS0 is usually the first port on Linux boxes.
+# "\\\\.\\COM1" is the first port on Windows boxes (note that
+# the backslash characters themselves must be escaped,
+# for the NUT configuration parser to yield "\\.\COM1").
+#
+# sdorder: OPTIONAL. When you have multiple UPSes on your system, you
+# usually need to turn them off in a certain order. upsdrvctl
+# shuts down all the 0s, then the 1s, 2s, and so on. To exclude
+# a UPS from the shutdown sequence, set this to -1.
+#
+# The default value for this parameter is 0.
+#
+# desc: optional, to keep a note of the UPS purpose, location, etc.
+#
+# nolock: optional, and not recommended for use in this file.
+#
+# If you put nolock in here, the driver will not lock the
+# serial port every time it starts. This may allow other
+# processes to seize the port if you start more than one by
+# mistake.
+#
+# This is only intended to be used on systems where locking
+# absolutely must be disabled for the software to work.
+#
+# ignorelb: OPTIONAL. Ignore low battery condition reported by device,
+# and evaluate remaining battery charge or runtime instead.
+# See man page for details.
+#
+# usb_set_altinterface(=num): OPTIONAL. Require that NUT calls this method
+# to set the interface, even if 0 (default). Some devices require
+# the call to initialize; others however can get stuck due to it -
+# so it is not called by default. Yet others can be composite
+# devices which use a non-zero interface to represent the UPS.
+#
+# default.<variable>: OPTIONAL. Set a default value for <variable> which is
+# used in case the UPS doesn't provide a value, but which will be
+# overwritten if a value is available from the UPS, e.g.:
+# default.input.voltage.nominal = 230
+# will report the nominal input voltage to be 230, unless the UPS
+# eventually tells us differently.
+#
+# override.<variable>: OPTIONAL. Set a value for <value> that overrides
+# (for NUT) any value that may be read from the UPS.
+# Used for overriding values from the UPS that are clearly wrong
+# (e.g. some devices report wrong values for battery voltage):
+# override.battery.voltage.nominal = 12
+# Use with caution! This will only change the appearance of the
+# variable to the outside world (and NUT calculations), internally
+# in the UPS the original value is used.
+#
+# Anything else is passed through to the hardware-specific part of
+# the driver.
+#
+# Examples
+# --------
+#
+# A simple example for a UPS called "powerpal" that uses the blazer_ser
+# driver on /dev/ttyS0 is:
+#
+# [powerpal]
+# driver = blazer_ser
+# port = /dev/ttyS0
+# desc = "Web server"
+#
+# If your UPS driver requires additional settings, you can specify them
+# here. For example, if it supports a setting of "1234" for the
+# variable "cable", it would look like this:
+#
+# [myups]
+# driver = mydriver
+# port = /dev/ttyS1
+# cable = 1234
+# desc = "Something descriptive"
+#
+# To find out if your driver supports any extra settings, start it with
+# the -h option and/or read the driver's documentation.
diff --git a/nut/titanium/upsd.conf b/nut/titanium/upsd.conf
new file mode 100644
index 0000000..78fe0fa
--- /dev/null
+++ b/nut/titanium/upsd.conf
@@ -0,0 +1,186 @@
+#LISTEN 127.0.0.1 3493
+# Network UPS Tools: example upsd configuration file
+#
+# This file contains access control data, you should keep it secure.
+#
+# It should only be readable by the user that upsd becomes. See the FAQ.
+#
+# Each entry below provides usage and default value.
+#
+# For more information, refer to upsd.conf manual page.
+
+# =======================================================================
+# MAXAGE <seconds>
+# MAXAGE 15
+#
+# This defaults to 15 seconds. After a UPS driver has stopped updating
+# the data for this many seconds, upsd marks it stale and stops making
+# that information available to clients. After all, the only thing worse
+# than no data is bad data.
+#
+# You should only use this if your driver has difficulties keeping
+# the data fresh within the normal 15 second interval. Watch the syslog
+# for notifications from upsd about staleness.
+
+# =======================================================================
+# TRACKINGDELAY <seconds>
+# TRACKINGDELAY 3600
+#
+# This defaults to 1 hour. When instant commands and variables setting status
+# tracking is enabled, status execution information are kept during this
+# amount of time, and then cleaned up.
+
+# =======================================================================
+# ALLOW_NO_DEVICE <Boolean>
+# ALLOW_NO_DEVICE true
+#
+# Normally upsd requires that at least one device section is defined in ups.conf
+# when the daemon starts, to serve its data. For automatically managed services
+# it may be preferred to have upsd always running, and reload the configuration
+# when power devices become defined.
+#
+# Boolean values 'true', 'yes', 'on' and '1' mean that the server would not
+# refuse to start with zero device sections found in ups.conf.
+#
+# Boolean values 'false', 'no', 'off' and '0' mean that the server should refuse
+# to start if zero device sections were found in ups.conf. This is the default.
+
+# =======================================================================
+# STATEPATH <path>
+# STATEPATH /var/run/nut
+#
+# Tell upsd to look for the driver state sockets in 'path' rather
+# than the default that was compiled into the program.
+
+# =======================================================================
+# LISTEN <IP address or name> [<port>]
+# LISTEN 127.0.0.1 3493
+# LISTEN ::1 3493
+# LISTEN myhostname 83493
+# LISTEN myhostname.mydomain
+#
+# With no LISTEN statement, the default is localhost and port 3493.
+# In case of IP v4 or v6 disabled kernel, only the available one will
+# be used.
+# Note that it is not true for Windows platforms. You shouldn't use IPv6 in
+# your configuration files unless you have IPv6 installed.
+#
+# As a special case, `LISTEN * <port>` (with an asterisk) will try
+# to listen on "ANY" IP address for both IPv6 (::0) and IPv4 (0.0.0.0),
+# subject to `upsd` command-line arguments, or system configuration.
+# Note that if the system supports IPv4-mapped IPv6 addressing per RFC-3493,
+# and does not allow to disable this mode, then there may be one listening
+# socket to handle both address families.
+#
+# One or more LISTEN statements give the IP address (or name that
+# resolves to such an address) for upsd to listen on, optionally with
+# a port number.
+#
+# As an example, a machine with a LAN and a WAN interface that also
+# functions as a router and firewall might be configured to listen
+# only on the LAN interface.
+#
+# This will only be read at startup of upsd. If you make changes here,
+# you'll need to restart upsd, as reload will have no effect.
+#
+# Please note that older NUT releases could have been using the IPv4-mapped
+# IPv6 addressing (sometimes also known as "dual-stack") mode, if provided
+# by the system. Current versions (since NUT v2.8.1 release) explicitly try
+# to restrict their listening sockets to only support one address family on
+# each socket, and so avoid IPv4-mapped mode where possible.
+
+# =======================================================================
+# MAXCONN <connections>
+# MAXCONN 1024
+#
+# This defaults to maximum number allowed on your system. Each UPS, each
+# LISTEN address and each client count as one connection. If the server
+# runs out of connections, it will no longer accept new incoming client
+# connections. Only set this if you know exactly what you're doing.
+
+# =======================================================================
+# CERTFILE <certificate file>
+# CERTFILE /usr/local/ups/etc/upsd.pem
+#
+# When compiled with SSL support with OpenSSL backend,
+# you can enter the certificate file here.
+# The certificates must be in PEM format and must be sorted starting with
+# the subject's certificate (server certificate), followed by intermediate
+# CA certificates (if applicable_ and the highest level (root) CA. It should
+# end with the server key. See 'docs/security.txt' or the Security chapter of
+# NUT user manual for more information on the SSL support in NUT.
+#
+# See 'docs/security.txt' or the Security chapter of NUT user manual
+# for more information on the SSL support in NUT.
+
+# =======================================================================
+# CERTPATH <certificate file or directory>
+# CERTPATH /usr/local/ups/etc/cert/upsd
+#
+# When compiled with SSL support with NSS backend,
+# you can enter the certificate path here.
+# Certificates are stored in a dedicated database (split into 3 files).
+# Specify the path of the database directory.
+#
+# See 'docs/security.txt' or the Security chapter of NUT user manual
+# for more information on the SSL support in NUT.
+
+# =======================================================================
+# CERTIDENT <certificate name> <database password>
+# CERTIDENT "my nut server" "MyPasSw0rD"
+#
+# When compiled with SSL support with NSS backend,
+# you can specify the certificate name to retrieve from database to
+# authenticate itself and the password
+# required to access certificate related private key.
+#
+# See 'docs/security.txt' or the Security chapter of NUT user manual
+# for more information on the SSL support in NUT.
+
+# =======================================================================
+# CERTREQUEST <certificate request level>
+# CERTREQUEST REQUIRE
+#
+# When compiled with SSL support with NSS backend and client certificate
+# validation (disabled by default, see 'docs/security.txt'),
+# you can specify if upsd requests or requires client's' certificates.
+# Possible values are :
+# - 0 to not request to clients to provide any certificate
+# - 1 to require to all clients a certificate
+# - 2 to require to all clients a valid certificate
+#
+# See 'docs/security.txt' or the Security chapter of NUT user manual
+# for more information on the SSL support in NUT.
+
+# =======================================================================
+# DISABLE_WEAK_SSL <Boolean>
+# DISABLE_WEAK_SSL true
+#
+# Tell upsd to disable older/weak SSL/TLS protocols and ciphers.
+#
+# With relatively recent versions of OpenSSL or NSS it will be restricted
+# to TLSv1.2 or better.
+#
+# Unless you have really ancient clients, you probably want to enable this.
+# Currently disabled by default to ensure compatibility with existing setups.
+
+# =======================================================================
+# DEBUG_MIN <Integer>
+# DEBUG_MIN 2
+#
+# Optionally specify a minimum debug level for `upsd` data daemon, e.g. for
+# troubleshooting a deployment, without impacting foreground or background
+# running mode directly, and without need to edit init-scripts or service
+# unit definitions. Note that command-line option `-D` can only increase
+# this verbosity level.
+#
+# NOTE: if the running daemon receives a `reload` command, presence of the
+# `DEBUG_MIN NUMBER` value in the configuration file can be used to tune
+# debugging verbosity in the running service daemon (it is recommended to
+# comment it away or set the minimum to explicit zero when done, to avoid
+# huge journals and I/O system abuse). Keep in mind that for this run-time
+# tuning, the `DEBUG_MIN` value *present* in *reloaded* configuration files
+# is applied instantly and overrides any previously set value, from file
+# or CLI options, regardless of older logging level being higher or lower
+# than the newly found number; a missing (or commented away) value however
+# does not change the previously active logging verbosity.
diff --git a/nut/titanium/upsd.users b/nut/titanium/upsd.users
new file mode 100644
index 0000000..2023caf
--- /dev/null
+++ b/nut/titanium/upsd.users
@@ -0,0 +1,82 @@
+[admin]
+ password = baller
+ actions = set
+ actions = fsd
+ instcmds = all
+ upsmon primary
+
+# Network UPS Tools: Example upsd.users
+#
+# This file sets the permissions for upsd - the UPS network daemon.
+# Users are defined here, are given passwords, and their privileges are
+# controlled here too. Since this file will contain passwords, keep it
+# secure, with only enough permissions for upsd to read it.
+
+# --------------------------------------------------------------------------
+
+# Each user gets a section. To start a section, put the username in
+# brackets on a line by itself. To set something for that user, specify
+# it under that section heading. The username is case-sensitive, so
+# admin and AdMiN are two different users.
+#
+# Possible settings:
+#
+# password: The user's password. This is case-sensitive.
+#
+# --------------------------------------------------------------------------
+#
+# actions: Let the user do certain things with upsd.
+#
+# Valid actions are:
+#
+# SET - change the value of certain variables in the UPS
+# FSD - set the "forced shutdown" flag in the UPS
+#
+# --------------------------------------------------------------------------
+#
+# instcmds: Let the user initiate specific instant commands. Use "ALL"
+# to grant all commands automatically. There are many possible
+# commands, so use 'upscmd -l' to see what your hardware supports. Here
+# are a few examples:
+#
+# test.panel.start - Start a front panel test
+# test.battery.start - Start battery test
+# test.battery.stop - Stop battery test
+# calibrate.start - Start calibration
+# calibrate.stop - Stop calibration
+#
+# --------------------------------------------------------------------------
+#
+# Example:
+#
+# [admin]
+# password = mypass
+# actions = SET
+# instcmds = ALL
+#
+
+#
+# --- Configuring for a user who can execute tests only
+#
+# [testuser]
+# password = pass
+# instcmds = test.battery.start
+# instcmds = test.battery.stop
+
+#
+# --- Configuring for upsmon
+#
+# To add a NUT user for your upsmon, with a particular role, use this example:
+#
+# [monuser]
+# password = pass
+# upsmon primary
+# or
+# upsmon secondary
+#
+# The matching MONITOR line in your upsmon.conf would look like this:
+#
+# MONITOR myups@localhost 1 monuser pass primary (or secondary)
+#
+# See comments in the upsmon.conf(.sample) file for details about this
+# keyword and the difference of NUT secondary and primary systems.
diff --git a/nut/titanium/upsmon.conf b/nut/titanium/upsmon.conf
new file mode 100644
index 0000000..63b91e5
--- /dev/null
+++ b/nut/titanium/upsmon.conf
@@ -0,0 +1,540 @@
+MONITOR ups@localhost 1 admin baller primary
+# Network UPS Tools: example upsmon configuration
+#
+# This file contains passwords, so keep it secure.
+
+# --------------------------------------------------------------------------
+# RUN_AS_USER <userid>
+#
+# By default, upsmon splits into two processes. One stays as root and
+# waits to run the SHUTDOWNCMD. The other one switches to another userid
+# and does everything else.
+#
+# The default unprivileged user is set at compile-time with the option
+# 'configure --with-user=...'
+#
+# You can override it with '-u <user>' when starting upsmon, or just
+# define it here for convenience.
+#
+# Note: if you plan to use the reload feature, this file (upsmon.conf)
+# must be readable by this user! Since it contains passwords, DO NOT
+# make it world-readable. Also, do not make it writable by the upsmon
+# user, since it creates an opportunity for an attack by changing the
+# SHUTDOWNCMD to something malicious.
+#
+# For best results, you should create a new normal user like "nutmon",
+# and make it a member of a "nut" group or similar. Then specify it
+# here and grant read access to the upsmon.conf for that group.
+#
+# This user should not have write access to upsmon.conf.
+#
+# (Unprivileged) OS account to run as:
+# RUN_AS_USER nut
+
+# --------------------------------------------------------------------------
+# MONITOR <system> <powervalue> <username> <password> ("primary"|"secondary")
+#
+# List systems you want to monitor. Not all of these may supply power
+# to the system running upsmon, but if you want to watch it, it has to
+# be in this section.
+#
+# You must have at least one of these declared.
+#
+# <system> is a UPS identifier in the form <upsname>@<hostname>[:<port>]
+# like ups@localhost, su700@mybox, etc.
+#
+# Examples:
+#
+# - "su700@mybox" means a UPS called "su700" on a system called "mybox"
+#
+# - "fenton@bigbox:5678" is a UPS called "fenton" on a system called
+# "bigbox" which runs upsd on port "5678".
+#
+# The UPS names like "su700" and "fenton" are set in your ups.conf
+# in [brackets] which identify a section for a particular driver.
+#
+# If the ups.conf on host "doghouse" has a section called "snoopy", the
+# identifier for it would be "snoopy@doghouse".
+#
+# <powervalue> is an integer - the number of power supplies that this UPS
+# feeds on this system. Most personal computers only have one power supply,
+# so this value is normally set to 1, while most modern servers have at least
+# two. You need a pretty big or special box to have any other value here.
+#
+# You can also set this to 0 for a system that doesn't take any power
+# from the MONITORed supply, which you still want to monitor (e.g. for an
+# administrative workstation fed from a different circuit than the datacenter
+# servers it monitors). Use <powervalue> if 0 when you want to hear about
+# changes for a given UPS without shutting down when it goes critical.
+#
+# <username> and <password> must match an entry in that system's
+# upsd.users. If your NUT username is "monuser" and your password is
+# "blah", the upsd.users would look like this:
+#
+# [monuser]
+# password = blah
+# upsmon primary # (or secondary)
+#
+# "primary" means this system will shutdown last, allowing the secondary
+# systems time to shutdown first.
+#
+# "secondary" means this system shuts down immediately when power goes
+# critical and less than MINSUPPLIES power sources have reliable input feeds.
+#
+# The general assumption is that the "primary" system is the one with direct
+# connection to an UPS (such as serial or USB cable), so the primary system
+# runs the NUT driver and 'upsd' server locally and can manage the device,
+# and it would often tell the UPS to completely power itself off as a step
+# in power-race avoidance (see POWERDOWNFLAG for details).
+#
+# Also, since the primary system stays up the longest, it suffers higher risks
+# of ungraceful shutdown if the estimation of remaining runtime (or of the
+# time it takes to shut down this system) was guessed wrong. By consequence,
+# the "secondary" systems typically monitor the power environment state
+# through the 'upsd' processes running on the remote (often "primary") systems
+# and do not directly interact with an UPS (no local NUT drivers are running
+# on the secondary systems). As such, secondaries typically shut down as
+# soon as there is a sufficiently long power outage, or a low-battery alert
+# from the UPS, or a loss of connection to the primary while the power was
+# last known to be missing.
+#
+# This assumption and configuration can also make sense for networked UPSes,
+# where a rack full of servers might overload the communications capacity
+# of the networked management card on the UPS - in this case you might either
+# reduce the 'snmp-ups' or 'netxml-ups' driver polling rate, or dedicate a
+# "primary" server and set up the rest as "secondary" systems.
+#
+# In case of such large setups as mentioned above, beware also that shutdown
+# times of the rack done all at once can substantially differ from smaller
+# scale experiments with single-server shutdowns, since systems can compete
+# for shared storage and other limited resources as they go down (and also
+# not everyone may safely shut down simultaneously - e.g. a NAS or DB server
+# would better go down after all its clients). You would be well served by
+# higher-end UPSes with manageable thresholds to declare a critical state.
+#
+# Examples:
+#
+# MONITOR myups@bigserver 1 upswired blah primary
+# MONITOR su700@server.example.com 1 monuser secretpass secondary
+# MONITOR myups@localhost 1 monuser pass primary # (or secondary)
+
+# --------------------------------------------------------------------------
+# MINSUPPLIES <num>
+#
+# Give the number of power supplies that must be receiving power to keep
+# this system running. Most systems have one power supply, so you would
+# put "1" in this field.
+#
+# Large/expensive server type systems usually have more, and can run with
+# a few missing. Some of these can run with 2 out of 4, for example,
+# so you'd set that to 2. The idea is to keep the box running as long
+# as possible, right?
+#
+# Obviously you have to put the redundant supplies on different UPS circuits
+# for this to make sense! See big-servers.txt in the docs subdirectory
+# for more information and ideas on how to use this feature.
+
+MINSUPPLIES 1
+
+# --------------------------------------------------------------------------
+# SHUTDOWNCMD "<command>"
+#
+# upsmon runs this command when the system needs to be brought down.
+#
+# This should work just about everywhere ... if it doesn't, well, change it,
+# perhaps to a more complicated custom script.
+#
+# Note that while you experiment with the initial setup and want to test how
+# your configuration reacts to power state changes and ultimately when power
+# is reported to go critical, but do not want your system to actually turn
+# off, consider setting the SHUTDOWNCMD temporarily to do something benign -
+# such as posting a message with 'logger' or 'wall' or 'mailx'. Do be careful
+# to plug the UPS back into the wall in a timely fashion.
+#
+# For Windows setup use something like:
+# SHUTDOWNCMD "C:\\WINDOWS\\system32\\shutdown.exe -s -t 0"
+# If you have command line using space character you have to add double quote to them, like this:
+# SHUTDOWNCMD "\"C:\\Program Files\\some command.bat\" -first_arg -second_arg"
+# Or use the old DOS 8.3 file name, like this:
+# SHUTDOWNCMD "C:\\PROGRA~1\\SOMECO~1.bat -first_arg -second_arg"
+
+SHUTDOWNCMD "/sbin/shutdown -h +0"
+
+# --------------------------------------------------------------------------
+# SHUTDOWNEXIT <boolean|num>
+#
+# After initiating shutdown, should this upsmon daemon itself exit?
+# By doing so NUT secondary systems can tell the NUT primary that
+# it can proceed with its own shutdown and eventually tell the UPS
+# to cut power for the load. ("Yes" by default)
+#
+# Some "secondary" systems with workloads that take considerable time
+# to stop (e.g. virtual machines or large databases) can benefit from
+# reporting (by virtue of logging off the data server) that they are
+# ready for the "primary" system to begin its own shutdown and eventually
+# to tell the UPS to cut the power - not as soon as they have triggered
+# their own shutdown, but at a later point (e.g. when the upsmon service
+# is stopped AFTER the heavier workloads).
+#
+# Note that the actual ability to complete such shutdown depends on the
+# remaining battery run-time at the moment when UPS power state becomes
+# considered critical and the shutdowns begin. You may also have to tune
+# HOSTSYNC on the NUT primary to be long enough for those secondaries to
+# stop their services. In practice, it may be worthwhile to investigate
+# ways to trigger shutdowns earlier on these systems, e.g. by setting up
+# `upssched` integration, or `dummy-ups` driver with overrides for stricter
+# `battery.charge` or `battery.runtime` triggers than used by the rest of
+# your servers.
+#
+# This option supports Boolean-style strings (yes/on/true or no/off/false)
+# or numbers to define a delay (in seconds) between calling SHUTDOWNCMD
+# and exiting the daemon. Zero means immediate exit (default), negative
+# values mean never exiting on its own accord.
+#
+#SHUTDOWNEXIT yes
+
+# --------------------------------------------------------------------------
+# NOTIFYCMD <command>
+#
+# upsmon calls this to send messages when things happen
+#
+# This command is called with the full text of the message (from NOTIFYMSG)
+# as one argument.
+#
+# The environment string NOTIFYTYPE will contain the type string of
+# whatever caused this event to happen.
+#
+# The environment string UPSNAME will contain the name of the system/device
+# that generated the change.
+#
+# Note that this is only called for NOTIFY events that have EXEC set with
+# NOTIFYFLAG. See NOTIFYFLAG below for more details.
+#
+# Making this some sort of shell script might not be a bad idea.
+# Alternately you can use the upssched program as your NOTIFYCMD for some
+# more complex setups (e.g. to ease handling of notification storms).
+# For more information and ideas, see docs/scheduling.txt
+#
+# Example:
+# NOTIFYCMD /usr/bin/notifyme
+
+# --------------------------------------------------------------------------
+# POLLFREQ <n>
+#
+# Polling frequency for normal activities, measured in seconds.
+#
+# Adjust this to keep upsmon from flooding your network, but don't make
+# it too high or it may miss certain short-lived power events.
+
+POLLFREQ 5
+
+# --------------------------------------------------------------------------
+# POLLFREQALERT <n>
+#
+# Polling frequency in seconds while UPS on battery.
+#
+# You can make this number lower than POLLFREQ, which will make updates
+# faster when any UPS is running on battery. This is a good way to tune
+# network load if you have a lot of these things running.
+#
+# The default is 5 seconds for both this and POLLFREQ.
+
+POLLFREQALERT 5
+
+# --------------------------------------------------------------------------
+# HOSTSYNC - How long upsmon will wait before giving up on another upsmon
+#
+# The primary upsmon process uses this number when waiting for secondary
+# systems to disconnect once it has set the forced shutdown (FSD) flag.
+# If they don't disconnect after this many seconds, it goes on without them.
+#
+# Similarly, upsmon secondary processes wait up to this interval for the
+# primary upsmon to set FSD when an UPS they are monitoring goes critical -
+# that is, on battery and low battery. If the primary doesn't do its job,
+# the secondaries will shut down anyway to avoid damage to the file systems.
+#
+# This "wait for FSD" is done to avoid races where the status changes
+# to critical and back between polls by the primary.
+
+HOSTSYNC 15
+
+# --------------------------------------------------------------------------
+# DEADTIME - Interval to wait before declaring a stale ups "dead"
+#
+# upsmon requires a UPS to provide status information every few seconds
+# (see POLLFREQ and POLLFREQALERT) to keep things updated. If the status
+# fetch fails, the UPS is marked stale. If it stays stale for more than
+# DEADTIME seconds, the UPS is marked dead.
+#
+# A dead UPS that was last known to be on battery is assumed to have gone
+# to a low battery condition. This may force a shutdown if it is providing
+# a critical amount of power to your system.
+#
+# Note: DEADTIME should be a multiple of POLLFREQ and POLLFREQALERT.
+# Otherwise you'll have "dead" UPSes simply because upsmon isn't polling
+# them quickly enough. Rule of thumb: take the larger of the two
+# POLLFREQ values, and multiply by 3.
+
+DEADTIME 15
+
+# --------------------------------------------------------------------------
+# POWERDOWNFLAG - Flag file for forcing UPS shutdown on the primary system
+#
+# upsmon will create a file with this name in primary mode when it's time
+# to shut down the load. You should check for this file's existence in
+# your shutdown scripts and run 'upsdrvctl shutdown' if it exists, to tell
+# the UPS(es) to power off.
+#
+# See the config-notes.txt file in the docs subdirectory for more information.
+# Refer to the section:
+# [[UPS_shutdown]] "Configuring automatic shutdowns for low battery events"
+# or refer to the online version.
+#
+# For Windows setup use something like:
+# POWERDOWNFLAG "C:\\killpower"
+#
+# For Unix/Linux systems the legacy default is:
+# POWERDOWNFLAG /etc/killpower
+POWERDOWNFLAG "/etc/killpower"
+
+# --------------------------------------------------------------------------
+# NOTIFYMSG - change messages sent by upsmon when certain events occur
+#
+# You can change the default messages to something else if you like.
+#
+# NOTIFYMSG <notify type> "message"
+#
+# NOTIFYMSG ONLINE "UPS %s on line power"
+# NOTIFYMSG ONBATT "UPS %s on battery"
+# NOTIFYMSG LOWBATT "UPS %s battery is low"
+# NOTIFYMSG FSD "UPS %s: forced shutdown in progress"
+# NOTIFYMSG COMMOK "Communications with UPS %s established"
+# NOTIFYMSG COMMBAD "Communications with UPS %s lost"
+# NOTIFYMSG SHUTDOWN "Auto logout and shutdown proceeding"
+# NOTIFYMSG REPLBATT "UPS %s battery needs to be replaced"
+# NOTIFYMSG NOCOMM "UPS %s is unavailable"
+# NOTIFYMSG NOPARENT "upsmon parent process died - shutdown impossible"
+# NOTIFYMSG CAL "UPS %s: calibration in progress"
+# NOTIFYMSG OFF "UPS %s: administratively OFF or asleep"
+# NOTIFYMSG NOTOFF "UPS %s: no longer administratively OFF or asleep"
+# NOTIFYMSG BYPASS "UPS %s: on bypass (powered, not protecting)"
+# NOTIFYMSG NOTBYPASS "UPS %s: no longer on bypass"
+#
+# Note that %s is replaced with the identifier of the UPS in question.
+#
+# Possible values for <notify type>:
+#
+# ONLINE : UPS is back online
+# ONBATT : UPS is on battery
+# LOWBATT : UPS has a low battery (if also on battery, it's "critical")
+# FSD : UPS is being shutdown by the primary (FSD = "Forced Shutdown")
+# COMMOK : Communications established with the UPS
+# COMMBAD : Communications lost to the UPS
+# SHUTDOWN : The system is being shutdown
+# REPLBATT : The UPS battery is bad and needs to be replaced
+# NOCOMM : A UPS is unavailable (can't be contacted for monitoring)
+# NOPARENT : The process that shuts down the system has died (shutdown impossible)
+
+# --------------------------------------------------------------------------
+# NOTIFYFLAG - change behavior of upsmon when NOTIFY events occur
+#
+# By default, upsmon sends walls (global messages to all logged in users)
+# and writes to the syslog when things happen.
+# Except for Windows where upsmon only writes to the syslog by default.
+# You can change this.
+#
+# NOTIFYFLAG <notify type> <flag>[+<flag>][+<flag>] ...
+#
+# NOTIFYFLAG ONLINE SYSLOG+WALL
+# NOTIFYFLAG ONBATT SYSLOG+WALL
+# NOTIFYFLAG LOWBATT SYSLOG+WALL
+# NOTIFYFLAG FSD SYSLOG+WALL
+# NOTIFYFLAG COMMOK SYSLOG+WALL
+# NOTIFYFLAG COMMBAD SYSLOG+WALL
+# NOTIFYFLAG SHUTDOWN SYSLOG+WALL
+# NOTIFYFLAG REPLBATT SYSLOG+WALL
+# NOTIFYFLAG NOCOMM SYSLOG+WALL
+# NOTIFYFLAG NOPARENT SYSLOG+WALL
+#
+# Possible values for the flags:
+#
+# SYSLOG - Write the message in the syslog
+# WALL - Write the message to all users on the system
+# EXEC - Execute NOTIFYCMD (see above) with the message
+# IGNORE - Don't do anything
+#
+# If you use IGNORE, don't use any other flags on the same line.
+
+# --------------------------------------------------------------------------
+# OFFDURATION - put "OFF" state into effect if it persists for this many seconds
+#
+# NUT supports an "administrative OFF" for power devices which can be managed to
+# turn off their application workload, while the UPS or ePDU remains accessible
+# for monitoring and management. This toggle allows to delay propagation of such
+# state into a known loss of a feed (possibly triggering FSD on `upsmon` clients
+# which `MONITOR` the device and are in fact still alive -- e.g. with multiple
+# power sources or because they as the load are not really turned off), because
+# when some devices begin battery calibration, they report "OFF" for a few seconds
+# and only then they might report "CAL" after switching all the power relays --
+# thus causing false-positives for `upsmon` FSD trigger.
+#
+# A negative value means to disable decreasing the counter of working power
+# supplies in such cases, and a zero makes the effect of detected "OFF" state
+# immediate. Built-in default value is 30 (seconds).
+
+OFFDURATION 30
+
+# --------------------------------------------------------------------------
+# RBWARNTIME - replace battery warning time in seconds
+#
+# upsmon will normally warn you about a battery that needs to be replaced
+# every 43200 seconds, which is 12 hours. It does this by triggering a
+# NOTIFY_REPLBATT which is then handled by the usual notify structure
+# you've defined above.
+#
+# If this number is not to your liking, override it here.
+
+RBWARNTIME 43200
+
+# --------------------------------------------------------------------------
+# NOCOMMWARNTIME - no communications warning time in seconds
+#
+# upsmon will let you know through the usual notify system if it can't
+# talk to any of the UPS entries that are defined in this file. It will
+# trigger a NOTIFY_NOCOMM by default every 300 seconds unless you
+# change the interval with this directive.
+
+NOCOMMWARNTIME 300
+
+# --------------------------------------------------------------------------
+# POLLFAIL_LOG_THROTTLE_MAX - device poll failure logging throttle
+#
+# upsmon normally reports polling failures for each device that are in place
+# for each POLLFREQ loop (e.g. "Data stale" or "Driver not connected") to
+# system log as configured. If your devices are expected to be AWOL for an
+# extended timeframe, you can use this throttle to reduce the stress on
+# syslog traffic and storage, by posting these messages only once in every
+# several loop cycles, and when the error condition has changed or cleared.
+# A negative value means standard behavior, and a zero value means to never
+# repeat the message (log only on start and end/change of the failure state).
+#
+#POLLFAIL_LOG_THROTTLE_MAX 100
+
+# --------------------------------------------------------------------------
+# FINALDELAY - last sleep interval before shutting down the system
+#
+# On a primary, upsmon will wait this long after sending the NOTIFY_SHUTDOWN
+# before executing your SHUTDOWNCMD. If you need to do something in between
+# those events, increase this number. Remember, at this point your UPS is
+# almost depleted, so don't make this too high. If needed, on high-end UPS
+# devices you can usually configure when the low-battery state is announced
+# based on estimated remaining run-time or on charge level of the batteries.
+#
+# Alternatively, you can set this very low so you don't wait around when
+# it's time to shut down. Some UPSes don't give much warning for low
+# battery and will require a value of 0 here for a safe shutdown.
+#
+# Note: If FINALDELAY on the secondary is greater than HOSTSYNC on the
+# primary, the primary will give up waiting for that secondary system
+# to disconnect.
+
+FINALDELAY 5
+
+# --------------------------------------------------------------------------
+# CERTPATH - path to certificates (database directory or directory with CA's)
+#
+# When compiled with SSL support, you can enter the certificate path here.
+#
+# With NSS:
+# Certificates are stored in a dedicated database (split into 3 files).
+# Specify the path of the database directory.
+#
+# CERTPATH /etc/nut/cert/upsmon
+#
+# With OpenSSL:
+# Directory containing CA certificates in PEM format, used to verify
+# the server certificate presented by the upsd server. The files each
+# contain one CA certificate. The files are looked up by the CA subject
+# name hash value, which must hence be available.
+#
+# CERTPATH /usr/ssl/certs
+#
+# See 'docs/security.txt' or the Security chapter of NUT user manual
+# for more information on the SSL support in NUT.
+
+# --------------------------------------------------------------------------
+# CERTIDENT - self certificate name and database password
+# CERTIDENT <certificate name> <database password>
+#
+# When compiled with SSL support with NSS, you can specify the certificate
+# name to retrieve from database to authenticate itself and the password
+# required to access certificate related private key.
+#
+# CERTIDENT "my nut monitor" "MyPasSw0rD"
+#
+# See 'docs/security.txt' or the Security chapter of NUT user manual
+# for more information on the SSL support in NUT.
+
+# --------------------------------------------------------------------------
+# CERTHOST - security properties for an host
+# CERTHOST <hostname> <certificate name> <certverify> <forcessl>
+#
+# When compiled with SSL support with NSS, you can specify security directive
+# for each server you can contact.
+# Each entry maps server name with the expected certificate name and flags
+# indicating if the server certificate is verified and if the connection
+# must be secure.
+#
+# CERTHOST localhost "My nut server" 1 1
+#
+# See 'docs/security.txt' or the Security chapter of NUT user manual
+# for more information on the SSL support in NUT.
+
+# --------------------------------------------------------------------------
+# CERTVERIFY - make upsmon verify all connections with certificates
+# CERTVERIFY 1
+#
+# When compiled with SSL support, make upsmon verify all connections with
+# certificates.
+# Without this, there is no guarantee that the upsd is the right host.
+# Enabling this greatly reduces the risk of man in the middle attacks.
+# This effectively forces the use of SSL, so don't use this unless
+# all of your upsd hosts are ready for SSL and have their certificates
+# in order.
+# When compiled with NSS support of SSL, can be overridden for host
+# specified with a CERTHOST directive.
+
+
+# --------------------------------------------------------------------------
+# FORCESSL - force upsmon to use SSL
+# FORCESSL 1
+#
+# When compiled with SSL, specify that a secured connection must be used
+# to communicate with upsd.
+# If you don't use 'CERTVERIFY 1', then this will at least make sure
+# that nobody can sniff your sessions without a large effort. Setting
+# this will make upsmon drop connections if the remote upsd doesn't
+# support SSL, so don't use it unless all of them have it running.
+# When compiled with NSS support of SSL, can be overridden for host
+# specified with a CERTHOST directive.
+
+# --------------------------------------------------------------------------
+# DEBUG_MIN - specify minimal debugging level for upsmon daemon
+# e.g. DEBUG_MIN 6
+#
+# Optionally specify a minimum debug level for `upsmon` daemon, e.g. for
+# troubleshooting a deployment, without impacting foreground or background
+# running mode directly, and without need to edit init-scripts or service
+# unit definitions. Note that command-line option `-D` can only increase
+# this verbosity level.
+#
+# NOTE: if the running daemon receives a `reload` command, presence of the
+# `DEBUG_MIN NUMBER` value in the configuration file can be used to tune
+# debugging verbosity in the running service daemon (it is recommended to
+# comment it away or set the minimum to explicit zero when done, to avoid
+# huge journals and I/O system abuse). Keep in mind that for this run-time
+# tuning, the `DEBUG_MIN` value *present* in *reloaded* configuration files
+# is applied instantly and overrides any previously set value, from file
+# or CLI options, regardless of older logging level being higher or lower
+# than the newly found number; a missing (or commented away) value however
+# does not change the previously active logging verbosity.
diff --git a/nut/titanium/upssched.conf b/nut/titanium/upssched.conf
new file mode 100644
index 0000000..0db4507
--- /dev/null
+++ b/nut/titanium/upssched.conf
@@ -0,0 +1,124 @@
+# Network UPS Tools - upssched.conf sample file
+#
+# ============================================================================
+#
+# CMDSCRIPT <scriptname>
+#
+# This script gets called to invoke commands for timers that trigger.
+# It is given a single argument - the <timername> in your
+# AT ... START-TIMER defines.
+#
+# *** This must be defined *before* the first AT line. Otherwise the
+# program will complain and exit without doing anything.
+#
+# A shell script with a big case..esac construct should work nicely for this.
+# An example has been provided to help you get started.
+
+CMDSCRIPT /usr/bin/upssched-cmd
+
+# ============================================================================
+#
+# PIPEFN <filename>
+#
+# This sets the file name of the FIFO that will pass communications between
+# processes to start and stop timers. This should be set to some path where
+# normal users can't create the file, due to the possibility of symlinking
+# and other evil.
+#
+# Note: if you are running Solaris or similar, the permissions that
+# upssched sets on this file *are not enough* to keep you safe. If
+# your OS ignores the permissions on a FIFO, then you MUST put this in
+# a protected directory!
+#
+# Note 2: by default, upsmon will run upssched as whatever user you have
+# defined with RUN_AS_USER in upsmon.conf. Make sure that user can
+# create files and write to files in the path you use for PIPEFN and
+# LOCKFN.
+#
+# My recommendation: create a special directory for upssched, make it
+# owned by your upsmon user, then use it for both.
+#
+# This is commented out by default to make you visit this file and think
+# about how your system works before potentially opening a hole.
+#
+# PIPEFN /run/nut/upssched/upssched.pipe
+
+# ============================================================================
+#
+# LOCKFN <filename>
+#
+# REQUIRED. This was added after version 1.2.1.
+#
+# upssched needs to be able to create this filename in order to avoid
+# a race condition when two events are dispatched from upsmon at nearly
+# the same time. This file will only exist briefly. It must not be
+# created by any other process.
+#
+# You should put this in the same directory as PIPEFN.
+#
+# LOCKFN /run/nut/upssched/upssched.lock
+
+# ============================================================================
+#
+# AT <notifytype> <upsname> <command>
+#
+# Define a handler for a specific event <notifytype> on UPS <upsname>.
+#
+# <upsname> can be the special value * to apply this handler to every
+# possible value of <upsname>.
+#
+# Run the command <command> via your CMDSCRIPT when it happens.
+#
+# Note that any AT that matches both the <notifytype> and the <upsname>
+# for the current event will be used.
+
+# ============================================================================
+#
+# Possible AT commands
+#
+# - START-TIMER <timername> <interval>
+#
+# Start a timer called <timername> that will trigger after <interval>
+# seconds, calling your CMDSCRIPT with <timername> as the first
+# argument.
+#
+# Example:
+# 1) Start a timer that will execute when communication with any UPS (*) has
+# been gone for 10 seconds
+#
+# AT COMMBAD * START-TIMER upsgone 10
+#
+# 2) Start a timer that will execute when any UPS (*) has been running
+# on battery for 30 seconds
+#
+# AT ONBATT * START-TIMER onbattwarn 30
+
+# -----------------------------------------------------------------------
+#
+# - CANCEL-TIMER <timername> [cmd]
+#
+# Cancel a running timer called <timername>, if possible. If the timer
+# has passed then pass the optional argument <cmd> to CMDSCRIPT.
+#
+# Example:
+# 1) If a specific UPS (myups@localhost) communication is restored, then stop
+# the timer before it triggers
+#
+# AT COMMOK myups@localhost CANCEL-TIMER upsgone
+#
+# 2) If any UPS (*) reverts to utility power, then stop the timer before it
+# triggers
+#
+# AT ONLINE * CANCEL-TIMER onbattwarn
+
+# -----------------------------------------------------------------------
+#
+# - EXECUTE <command>
+#
+# Immediately pass <command> as an argument to CMDSCRIPT.
+#
+# Example:
+# If any UPS (*) reverts to utility power, then execute
+# 'ups-back-on-line' via CMDSCRIPT.
+#
+# AT ONLINE * EXECUTE ups-back-on-line