summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc9271.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/rfc/rfc9271.txt')
-rw-r--r--doc/rfc/rfc9271.txt2814
1 files changed, 2814 insertions, 0 deletions
diff --git a/doc/rfc/rfc9271.txt b/doc/rfc/rfc9271.txt
new file mode 100644
index 0000000..0090725
--- /dev/null
+++ b/doc/rfc/rfc9271.txt
@@ -0,0 +1,2814 @@
+
+
+
+
+Independent Submission R. Price, Ed.
+Request for Comments: 9271 Network UPS Tools Project
+Category: Informational August 2022
+ISSN: 2070-1721
+
+
+ Uninterruptible Power Supply (UPS) Management Protocol -- Commands and
+ Responses
+
+Abstract
+
+ This document describes the command/response protocol currently used
+ in the management of Uninterruptible Power Supply (UPS) units and
+ other power devices often deployed in small offices and in IT
+ installations subject to an erratic public power supply. The UPS
+ units typically interface to an Attachment Daemon in the system they
+ protect. This daemon is in turn polled by a Management Daemon that
+ notifies users and system administrators of power supply incidents
+ and automates system shutdown decisions. The commands and responses
+ described by this document are exchanged between the UPS Attachment
+ Daemon and the Management Daemon. The practice current when this
+ protocol was first developed risks weak security, and this is
+ addressed in the Security Considerations sections of this document.
+
+Status of This Memo
+
+ This document is not an Internet Standards Track specification; it is
+ published for informational purposes.
+
+ This is a contribution to the RFC Series, independently of any other
+ RFC stream. The RFC Editor has chosen to publish this document at
+ its discretion and makes no statement about its value for
+ implementation or deployment. Documents approved for publication by
+ the RFC Editor are not candidates for any level of Internet Standard;
+ see Section 2 of RFC 7841.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ https://www.rfc-editor.org/info/rfc9271.
+
+Copyright Notice
+
+ Copyright (c) 2022 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (https://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document.
+
+Table of Contents
+
+ 1. Introduction
+ 1.1. Current Practice
+ 1.1.1. NUT Project
+ 1.1.2. The Shutdown Story
+ 1.1.3. How to Read this Document
+ 1.2. Additional Information
+ 1.3. Requirements Language
+ 2. Terminology
+ 2.1. Administrative User
+ 2.2. Attachment Daemon
+ 2.3. Driver
+ 2.4. Event
+ 2.5. Instant Command
+ 2.6. Management Daemon
+ 2.7. Primary
+ 2.8. Secondary
+ 2.9. Session
+ 2.10. UPS Status
+ 2.11. UPS Variable
+ 3. Protocol Overview
+ 4. Protocol Specification
+ 4.1. Notation Used in this Specification
+ 4.2. Commands
+ 4.2.1. ATTACH
+ 4.2.2. DETACH
+ 4.2.3. FSD
+ 4.2.4. GET
+ 4.2.4.1. GET CMDDESC
+ 4.2.4.2. GET DESC
+ 4.2.4.3. GET NUMATTACH
+ 4.2.4.4. GET TYPE
+ 4.2.4.5. GET UPSDESC
+ 4.2.4.6. GET VAR
+ 4.2.5. HELP
+ 4.2.6. INSTCMD
+ 4.2.7. LIST
+ 4.2.7.1. LIST CLIENT
+ 4.2.7.2. LIST CMD
+ 4.2.7.3. LIST ENUM
+ 4.2.7.4. LIST RANGE
+ 4.2.7.5. LIST RW
+ 4.2.7.6. LIST UPS
+ 4.2.7.7. LIST VAR
+ 4.2.8. PASSWORD
+ 4.2.9. PRIMARY
+ 4.2.10. PROTVER
+ 4.2.11. SET
+ 4.2.12. STARTTLS
+ 4.2.12.1. Key Infrastructure and Self-Signed Certificates
+ 4.2.13. USERNAME
+ 4.2.14. VER
+ 4.3. Summary of Responses
+ 4.3.1. Response When Command Succeeds
+ 4.3.2. Error Responses
+ 4.4. An ABNF of the Commands
+ 4.4.1. Responses to Commands
+ 5. Statuses and Events
+ 5.1. Status Symbols
+ 5.2. Events
+ 6. Security Considerations
+ 6.1. Current General Security Practice
+ 6.2. Communication Security Requirements
+ 6.2.1. Certificate Security
+ 6.3. Attacks and Defenses
+ 6.3.1. Eavesdropping
+ 6.3.1.1. Misplaced Declarations Requiring TLS
+ 6.3.1.2. Weak Protection in Previous Version 2.7.4
+ 6.3.2. Man-in-the-Middle
+ 6.3.3. Masquerade Attack: Agent Verification
+ 6.3.4. Message Insertion, Deletion, and Modification
+ 6.3.5. Replay
+ 6.3.6. Denial of Service
+ 7. IANA Considerations
+ 8. Implementation Status
+ 8.1. Inclusion in Software Distributions
+ 8.2. Recommended Minimum Support
+ 8.2.1. Desktop PC Variables
+ 8.2.2. Unattended Servers and Additional Variables
+ 8.2.3. Commands and Other Technical Terms
+ 8.2.4. Support for Earlier Versions
+ 9. References
+ 9.1. Normative References
+ 9.2. Informative References
+ Appendix A. Variables
+ A.1. Typical UPS Variables
+ A.2. Typical UPS Readable and Writable Variables
+ A.3. Typical UPS Instant Commands
+ Appendix B. The Shutdown Story for System and UPS
+ Appendix C. Technical Terms: Historical Differences
+ Appendix D. Security Defenses in Release 2.7.4
+ D.1. Shims
+ D.1.1. Attachment Daemon Shim
+ D.1.2. Management Daemon Shim
+ D.2. TLS Tunnels
+ D.3. VPN
+ D.4. VLAN
+ Appendix E. Administrative Security
+ E.1. Management of Administrative Users
+ E.2. An Administrative User of a Client Management Daemon
+ E.2.1. An Administrative User Logs into a Short Session
+ E.2.2. An Administrative User Logs into a Long Session
+ Acknowledgments
+ Author's Address
+
+1. Introduction
+
+1.1. Current Practice
+
+ This document describes UPS management techniques and current UPS
+ management practice published by the Network UPS Tools (NUT) Project.
+ The document is based on version 2.8.0 of the NUT Project software,
+ which supports version 1.3 of the NUT protocol.
+
+ Since May 2002, the protocol described by this document has been
+ operating on IANA port 3493/TCP (nut).
+
+1.1.1. NUT Project
+
+ The primary goal of the Network UPS Tools (NUT) Project software
+ [NUT] is to provide support for power devices, such as UPSs. The
+ project has been in operation since 1998, with a major rework in
+ 2003. It operates through a user mailing list [nut-upsuser], a
+ developer mailing list [nut-upsdev], a website [NUT], and a GitHub
+ repository [nut-repository]. See [githist] and Appendix J of
+ [History] for a history of the project.
+
+1.1.2. The Shutdown Story
+
+ The Shutdown Story section (see Appendix B) describes the current UPS
+ management practice for performing a managed shutdown of unattended
+ infrastructure after an unscheduled failure of the public power
+ supply in order to minimize the risk of corruption to data processed
+ by this infrastructure.
+
+1.1.3. How to Read this Document
+
+ As a simplification to ease reading, the term "UPS" is used when
+ "Managed Power Device" would be more complete. The reader should
+ understand the simple "UPS" to include other managed power devices.
+
+ The statuses and events appearing in this document are named with
+ short text-form names, some of which are abbreviations. A full list
+ of the statuses can be found in Section 5.1, while the events are
+ listed in Section 5.2.
+
+ This document refers to the "public power supply". Other texts
+ frequently refer to "utility power", "input source power", or even
+ "wall power".
+
+1.2. Additional Information
+
+ Additional information about the NUT Project is available in the
+ project documentation [Documentation]. Requests for further
+ information about this protocol and related technical matters may be
+ addressed to the mailing list [nut-upsuser] of the NUT Project.
+
+1.3. Requirements Language
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
+ "OPTIONAL" in this document are to be interpreted as described in
+ BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
+ capitals, as shown here.
+
+2. Terminology
+
+ The following technical terms appear in this document. They are
+ listed in alphabetical order.
+
+2.1. Administrative User
+
+ In current practice, the commands and other functions offered by the
+ Attachment Daemon are made available to a set of users known as
+ Management Daemons. These Management Daemons authenticate to the
+ Attachment Daemon with basic credentials (username and password).
+ Although called "users", the administrative users are not system
+ users; they are specific to an Attachment Daemon and are listed in a
+ text file (currently upsd.users) that is read by the Attachment
+ Daemon and that assigns to each of them the password, Instant
+ Commands, and actions that are allowed, together with the Primary or
+ Secondary status of the Management Daemon. For details, see
+ Appendix E.1. For details of the Primary, see Section 2.7; for
+ details of the Secondary, see Section 2.8. Typically, a high-level
+ user will be able to send command FSD, but a low-level user might
+ only be allowed to access the test panel. The security provisions
+ for administrative users are discussed in Appendix E.
+
+2.2. Attachment Daemon
+
+ The Attachment Daemon retrieves the status from the UPS and sends
+ commands to it often through a Driver specific to the hardware model
+ and the connection medium, e.g., USB, serial. See Section 2.3. It
+ maintains an abstracted view of the hardware through the use of
+ hardware statuses. See Section 2.10. A Management Daemon may
+ consult the abstracted view using the commands described in this
+ document.
+
+ See Section 8.2 for details of the recommended minimum support of
+ variables, which calls for Attachment Daemon support of statuses OB,
+ OL, LB, and FSD.
+
+ The NUT Project has implemented an Attachment Daemon as program upsd
+ and a set of hardware-specific Drivers, all written in K&R C
+ [C2ndEd]. The Attachment Daemon is launched as system user "root"
+ but for better security; then, it drops the privilege to run as a
+ detached software service.
+
+2.3. Driver
+
+ A Driver is that part of an Attachment Daemon that is specific to the
+ UPS hardware, the connection medium, and the connection protocol,
+ e.g., USB, serial. In current practice, the Attachment Daemon has a
+ Driver for each hardware interface type it supports. Although this
+ document considers the Driver to be part of the Attachment Daemon,
+ current practice is to see it as a separate software unit running as
+ a daemon "in front of" the Attachment Daemon. The protocol for data
+ exchange between the Driver and the Attachment Daemon is outside the
+ scope of this document.
+
+2.4. Event
+
+ A UPS event occurs in the Management Daemon when a change in the UPS
+ status is received from the Attachment Daemon. This event is
+ internal to the Management Daemon. See Section 5.2.
+
+2.5. Instant Command
+
+ An Instant Command is a command that, when sent to the Attachment
+ Daemon, is passed to the Driver and sent to the hardware without any
+ configured delay to perform a function. For example, INSTCMD su700
+ test.panel.start. See Section 4.2.6.
+
+2.6. Management Daemon
+
+ The Management Daemon is primarily responsible for managing the
+ hardware and orchestrating system-wide actions after a power event.
+ Using commands sent to the Attachment Daemon, it follows the status
+ of the UPS and determines when UPS events occur. It takes decisions
+ based on the events, such as calling for a system shutdown. See
+ Appendix B. Although the term includes the word "Daemon", nothing
+ requires that it be implemented as a detached software service. The
+ Management Daemon may also provide administrative functions, such as
+ a graphic interface to view the hardware activity.
+
+ There are several examples of a Management Daemon: the NUT Project
+ provides upsmon, which takes the system shutdown decision when the
+ public power supply fails. Further configuration options, such as
+ timers, are provided by the helper program upssched.
+
+ Other programs represent the Management Daemon:
+
+ * upsc reports the values of the variables defined for a given UPS;
+ see Table 6.
+ * upsrw reports on and changes the values of the readable and
+ writable configuration variables defined for a given UPS; see
+ Appendix A.2.
+ * upscmd reports on and executes the instant action commands defined
+ for a given UPS; see Section 4.2.6.
+ * UPSmon.py is an experimental Python3 rewrite of upsmon and
+ upssched that includes support for TLS 1.3 [RFC8446].
+
+2.7. Primary
+
+ When a power device, such as a UPS unit, supplies power to more than
+ one system, the computer running the Driver is known as the Primary.
+ The others are Secondaries. See Figure 4. Common current practice
+ for system administrators is to consider the Management Daemon in the
+ Primary to be the Primary Management Daemon that is in charge of the
+ shutdown of all the systems powered by the UPS. The Primary
+ Management Daemon sets status symbol FSD to order the Secondaries to
+ shut down.
+
+ | Note: Historically, the Primary was known as the "Master".
+
+2.8. Secondary
+
+ When a hardware device, such as a UPS unit, supplies power to more
+ than one system, the system that communicates directly with the UPS
+ unit, e.g., using a USB, RS-232, or a network connection, is known as
+ the Primary. The others are Secondaries. There is no Attachment
+ Daemon in a Secondary. See Figure 4. Common current practice for
+ system administrators is to consider the Management Daemon in a
+ Secondary to be a Secondary Management Daemon that understands status
+ symbol FSD as an order to shut down.
+
+ | Note: Historically, the Secondary was known as the "Slave".
+
+2.9. Session
+
+ The Management Daemon may initiate a TCP session with a specified
+ device, such as a UPS known to the Attachment Daemon. The session
+ structure provides for audit and security, as well as access to
+ mission-critical UPS functions. For example, good practice requires
+ password protection for an Instant Command that turns off a UPS
+ outlet. Other than the commands and responses used, the details of
+ session management are outside the scope of this document.
+
+2.10. UPS Status
+
+ The status of a hardware device, such as a UPS unit, is a symbolic
+ description of the state of the unit. It consists of a space-
+ separated list of symbols from the set {ALARM BOOST BYPASS CAL CHRG
+ COMM DISCHRG FSD LB NOCOMM OB OFF OL OVER RB TEST TRIM}. The symbols
+ TICK and TOCK are experimental additions to the statuses and are not
+ in common current practice. See Section 5.1, which specifies each of
+ these symbols.
+
+ See Section 8.2 for details of the recommended minimum support of
+ status symbols OB, OL, LB, and FSD.
+
+2.11. UPS Variable
+
+ The metrics and identifiers provided by each UPS are represented by
+ variables giving the value representing that metric or identifier.
+ The UPS variable is an abstraction of the UPS hardware configuration
+ and activity maintained by the Attachment Daemon. See Appendix A,
+ which provides examples of variables. For example, the variable
+ battery.charge contains the current charge of the UPS battery as a
+ percentage value.
+
+ Note: Some variables are constants, e.g., battery type and
+ manufacturer.
+
+ See Section 8.2 for details of the recommended minimum support of
+ variables. A full list of possible variables is available in source
+ code file docs/nut-names.txt [gitvars], which serves as the Recording
+ Document.
+
+3. Protocol Overview
+
+ Figure 1 shows a reference configuration in which the command/
+ response protocol applies. The UPS shown is representative of all
+ managed power devices.
+
+ "The client"
+ ,--------------, ,--------------,
+ ,-----, | UPS | <-Commands | UPS |
+ | UPS |---| Attachment |---------------| Management |
+ | |===| Daemon | Responses-> | Daemon |
+ /-----\ '--------------' '--------------'
+ UPS Attachment UPS Management
+ System Network System
+
+ Figure 1: Reference Configuration
+
+ The reference configuration in Figure 1 shows a single UPS unit that
+ has a power supply link (===) and a data link (---) attached to a
+ system running an Attachment Daemon. The UPS provides power supply
+ protection to the system running the Attachment Daemon.
+
+ In practice, there may be more than one UPS unit, and a unit may
+ provide power protection to more than one system. The figure also
+ shows a single Management Daemon. In practice, there may be more
+ than one Management Daemon, and any one Management Daemon may manage
+ more than one UPS Attachment Daemon.
+
+ The protocol applies to connections between the Attachment Daemon and
+ the Management Daemon, which act as the *server* and *client*,
+ respectively. The Management Daemon sends commands over TCP to the
+ Attachment Daemon and receives responses over TCP from that daemon.
+
+ The two daemons may run in the same system or may be connected
+ through a local or wide area network. In simple cases, as shown in
+ Figure 2, the Attachment Daemon and the Management Daemon are in the
+ same system, the one protected by the UPS. The commands and
+ responses are exchanged through an internal loopback interface.
+
+ "The client"
+ ,--------------------,---------------------,
+ ,-----, | UPS <-Commands UPS |
+ | UPS |---| Attachment | Management |
+ | |===| Daemon Responses-> Daemon |
+ /-----\ '--------------------'---------------------'
+ Internal
+ Loopback
+ UPS Attachment and Management System
+
+ Figure 2: Simplified Single-System Configuration
+
+ The reference configuration does not require any specific design.
+ For example, Figure 3 shows an arrangement in which the Attachment
+ Daemon is closely associated with, or even included in, the UPS
+ system setup. This is becoming more prevalent with the availability
+ of low-cost processors able to run the Attachment Daemon, thereby
+ effectively creating a network-attached UPS running a published
+ protocol.
+
+ "The client"
+ ,-----,------------, ,--------------,
+ | | UPS | <-Commands | UPS |
+ | UPS - Attachment |---------------| Management |
+ | | Daemon | Responses-> | Daemon |
+ /-----'------------\ '--------------'
+ UPS Attachment UPS Management
+ System Network System
+
+ Figure 3: UPS and Attachment Daemon Integration
+
+ As the power requirements for processors decrease, it is becoming
+ increasingly common to use a single UPS to protect multiple systems,
+ as shown in Figure 4. However, there is only one data line (---)
+ from the UPS to the Primary system. The others have only power
+ connections (===) to the UPS and are known as Secondaries. A
+ Secondary does not run an Attachment Daemon; it connects over a
+ network to the Attachment Daemon in the Primary. Figure 4 shows the
+ Attachment Daemon and the Primary Management Daemon in the same
+ system. This is common practice, but it is not a technical
+ requirement.
+
+ "The client"
+ ,--------------------,---------------------,
+ ,-----, | UPS <-Commands Primary |
+ | |---| Attachment | Management | Primary
+ | |===| Daemon Responses-> Daemon |
+ | | '--------------------'---------------------'
+ | UPS | ^
+ | | '<-Commands---Responses->,
+ | | v
+ | | ,--------------,-----------------,
+ | |============| | Secondary |
+ /-----\ | | Management | Secondary
+ | | Daemon |
+ '--------------'-----------------'
+
+ Figure 4: UPS Protects Multiple Systems
+
+ | Note: Should the Primary fail or go offline, the fate of the
+ | Secondaries depends on the UPS status when the Primary failed.
+ | If the UPS had status OL, the Secondary continues operation,
+ | but if the UPS had status OB, the Secondary may choose to shut
+ | down as a precaution.
+
+4. Protocol Specification
+
+ This specification includes only the commands and their responses.
+ An implementation of the Attachment Daemon has an internal state
+ machine, and some complex implementations of the Management Daemon
+ include an internal state machine, for example, to assist the system
+ shutdown of a complex installation. The Management Daemon is
+ required to remember the previous ups.status value it received from
+ the Attachment Daemon and compare it with the next. Other than that,
+ the management protocol used between them is effectively stateless.
+
+ For example, see Section 5.2, which shows a map of the new ups.status
+ response and the previous ups.status response to an event, which is
+ taken as the basis for Management Daemon action.
+
+4.1. Notation Used in this Specification
+
+ The character set used for commands and responses is US-ASCII; see
+ [RFC0020].
+
+ Multi-word elements are contained between quotation mark characters
+ for easier parsing, e.g., "UPS on fire". Embedded quotation marks
+ are escaped with reverse slant (\), often known as backslashes.
+ Embedded backslashes are also escaped by representing them as \\.
+
+ Commands and responses have no leading or trailing blank space and
+ are terminated with a single new line character line feed (LF).
+
+ Blank space within commands and responses is reduced to one space
+ (SP).
+
+4.2. Commands
+
+ The commands address the UPS to which they apply by <upsname>, where
+
+ * <upsname> ::= <ups>[@<hostname>[:<port>]]
+ * <ups> is defined by the Attachment Daemon configuration files.
+ * The default <hostname> is localhost.
+ * The <port> is the number of the TCP port on which the Attachment
+ Daemon is listening. The default is 3493. This is supported by
+ all current Management Daemons.
+
+ Examples: myups, UPS-97B@bigserver.example.com
+
+ ABNF: See variable upsname in Figure 5.
+
+ Note: Experimental Management Daemons use an extended form of
+ <upsname> in configuration files and in program parameters, where:
+
+ * <upsname> ::= [<group>:]<ups>[@<hostname>[:<port>]]
+ * <group> is an experimental extension to provide for groups of
+ UPSs. It is not in common current practice.
+ * <ups> is defined by the Attachment Daemon configuration files.
+ * The default <hostname> is localhost.
+
+ Examples: ups-1@example.com:3493, HB:heartbeat1@example.com:3493
+
+ | _Implementation note:_ In the current implementation, the names
+ | of commands and subcommands are not case sensitive. For
+ | example, GET VAR may be written as Get var, but in this
+ | specification, they are always written in uppercase.
+ | Similarly, <upsname> and <varname> are not case sensitive. For
+ | example, UPS341 ups.id may be written as ups341 Ups.Id, but in
+ | this specification, <varname> is always written in lower case.
+
+4.2.1. ATTACH
+
+ In a configuration like the one shown in Figure 4, in which a UPS
+ protects more than one system, the Primary Management Daemon needs to
+ know how many Secondaries are currently _active_, i.e., powered by
+ the UPS, either from the public power supply or from battery power.
+ The Attachment Daemon supports this by keeping a count of all the
+ _active_ systems powered by a UPS. The count is initialized, one
+ Secondary at a time by the ATTACH command, which should be understood
+ as _count this Secondary as active_. ATTACH is one of three commands
+ for Secondary counting. Additionally, command DETACH decrements the
+ count, and a Management Daemon may read the count at any time using
+ the command NUMATTACH.
+
+ The ATTACH command is also sent to the Attachment Daemon for the
+ Primary, so during normal, fully protected operation, the count is 1
+ for the Primary + the number of Secondaries. During a full system
+ shutdown, the count drops as each Secondary Management Daemon
+ executes command DETACH during its own shutdown. When the count
+ drops to 1, only the Primary is _active_, and it knows that all the
+ Secondaries have shut down.
+
+ Command: ATTACH <upsname>
+
+ If the command succeeds, the response is OK; otherwise, see the error
+ responses in Section 4.3.2.
+
+ ABNF: See variable attach in Figure 5.
+
+ | Note: Historically, this command was known as LOGIN. However,
+ | because LOGIN was not the conventional user access to a shell
+ | or program, the name was changed to avoid confusion.
+
+4.2.2. DETACH
+
+ This companion command to ATTACH reduces the count of "active"
+ Secondaries. It should be understood as _this Secondary is no longer
+ active_ and is usually used during system shutdown to decrement a
+ count of how many Secondaries are still _active_.
+
+ Command: DETACH
+
+ If the command succeeds, the response is OK Goodbye; otherwise, see
+ the error responses in Section 4.3.2.
+
+ ABNF: See variable detach in Figure 5.
+
+ | Note: Historically, this command was known as LOGOUT.
+
+4.2.3. FSD
+
+ A Management Daemon that is Primary and has the required authority
+ uses this command to set status symbol FSD, meaning "Forced
+ Shutdown", in the Attachment Daemon. In current practice, the
+ Primary Management Daemon uses the symbol to tell the Secondaries to
+ shut down.
+
+ Command: FSD <upsname>
+
+ If the command succeeds, the response is OK FSD-SET; otherwise, see
+ the error responses in Section 4.3.2.
+
+ ABNF: See variable fsd in Figure 5.
+
+ In current practice, commands such as FSD are made available only to
+ a privileged administrative user authorized to send such a mission-
+ critical command. The security provisions for administrative users
+ are discussed in Appendix E.
+
+ Note: The symbol FSD is also used for an event. See Table 5.
+
+4.2.4. GET
+
+ Retrieve a single response from the Attachment Daemon.
+
+ ABNF: See variable get in Figure 5.
+
+ The possible subcommands are listed in the sections below.
+
+4.2.4.1. GET CMDDESC
+
+ Retrieve a text description of a command.
+
+ Command: GET CMDDESC <upsname> <cmdname>
+
+ Response: CMDDESC <upsname> <cmdname> "<description>"
+
+ For example: command GET CMDDESC su700 load.on and response CMDDESC
+ su700 load.on "Turn on the load immediately"
+
+ This is like GET DESC, but it applies to an Instant Command. See
+ Section 4.2.4.2.
+
+4.2.4.2. GET DESC
+
+ Retrieve a text description of a UPS variable. See Section 2.11.
+
+ Command: GET DESC <upsname> <varname>
+
+ Response: DESC <upsname> <varname> "<description>"
+
+ <description> is a string that gives a brief explanation of the named
+ variable. The Attachment Daemon MAY return "Unavailable" if the file
+ that provides this description is not installed.
+
+ For example: command GET DESC su700 ups.status and response DESC
+ su700 ups.status "UPS status"
+
+4.2.4.3. GET NUMATTACH
+
+ Retrieve the count kept by the Attachment Daemon of all the _active_
+ systems protected by this UPS.
+
+ Command: GET NUMATTACH <upsname>
+
+ Response: NUMATTACH <upsname> <value>
+
+ <value> is a count of the Primary and the number of Secondaries
+ currently powered by this UPS.
+
+ For example: command GET ATTACH su700 and response NUMATTACH su700 1
+
+ This information is needed by the Management Daemon to determine how
+ many Secondaries are still connected during the system shutdown
+ process.
+
+ | Note: Historically, this subcommand was known as NUMLOGINS.
+ | Since LOGIN was not the conventional user access to a shell or
+ | program, the name was changed to avoid confusion.
+
+4.2.4.4. GET TYPE
+
+ Retrieve the type of a UPS variable. See Section 2.11.
+
+ Command: GET TYPE <upsname> <varname>
+
+ Response: TYPE <upsname> <varname> <type>...
+
+ <type>... can be one or more of the following tokens. Multiple types
+ may be returned.
+
+ For example: command GET TYPE su700 input.transfer.low and response
+ TYPE su700 input.transfer.low ENUM
+
+ +==============+==============================================+
+ | Type | Meaning |
+ +==============+==============================================+
+ | RW | This is a read/write variable. It may be |
+ | | read with command GET VAR (see |
+ | | Section 4.2.4.6) and set to a different |
+ | | value with command SET (see Section 4.2.11). |
+ +--------------+----------------------------------------------+
+ | ENUM | This is an enumerated type, which supports |
+ | | specific predetermined values. |
+ +--------------+----------------------------------------------+
+ | STRING:n | This is a string of maximum length n. |
+ +--------------+----------------------------------------------+
+ | RANGE | This is a number, either integer or float, |
+ | | comprised in the range that may be seen with |
+ | | the command LIST RANGE (see |
+ | | Section 4.2.7.4). |
+ +--------------+----------------------------------------------+
+ | NUMBER | This is a single numeric value, either |
+ | | integer or float. |
+ +--------------+----------------------------------------------+
+
+ Table 1: Variable Types
+
+ Notes:
+
+ * ENUM, STRING:n, and RANGE are usually associated with RW but not
+ always. The default <type>, when omitted, is numeric, so either
+ integer or float. Each Driver is then responsible for handling
+ values as either integer or float.
+
+ * Current practice is to represent floating point values using a
+ decimal (base 10) English-based representation. Hexadecimals,
+ exponents, and commas used as separators for thousands are not
+ allowed. For example, "1200.20" is valid, while "1,200.20" and
+ "1200,20" are not valid.
+
+4.2.4.5. GET UPSDESC
+
+ Retrieve a text description of a UPS.
+
+ Command: GET UPSDESC <upsname>
+
+ Response: UPSDESC <upsname> "<description>"
+
+ <description> is defined by the Attachment Daemon configuration. If
+ it is not set, current practice is for the Attachment Daemon to
+ return "Unavailable".
+
+ For example: command GET UPSDESC su700 and response UPSDESC su700
+ "Development box"
+
+ This can be used to provide human-readable descriptions, instead of a
+ cryptic ups@hostname string.
+
+4.2.4.6. GET VAR
+
+ Retrieve the value of a UPS variable. See Section 2.11.
+
+ Command: GET VAR <upsname> <varname>
+
+ Response: VAR <upsname> <varname> "<value>"
+
+ For example: command GET VAR su700 ups.status and response VAR su700
+ ups.status "OB LB"
+
+4.2.5. HELP
+
+ Return a list of the commands supported by the Attachment Daemon.
+ This command is intended for human, as well as program, use.
+
+ Command: HELP
+
+ For example: the following command line sequence executed on an
+ Attachment Daemon
+
+ netcat localhost 3493
+ HELP
+ Commands: HELP VER GET LIST SET INSTCMD ATTACH DETACH
+ USERNAME PASSWORD STARTTLS
+
+ ABNF: See variable help in Figure 5.
+
+ | Note: Historically, this command also returned LOGIN and
+ | LOGOUT. Because LOGIN was not the conventional user access to
+ | a shell or program, the command names were changed to ATTACH
+ | and DETACH to avoid confusion.
+
+4.2.6. INSTCMD
+
+ Send an Instant Command to the UPS.
+
+ Command: INSTCMD <upsname> <cmdname>
+
+ <upsname> is the name of the UPS, and <cmdname> is the Instant
+ Command to be issued to that UPS. See Appendix A.3 for examples of
+ Instant Commands.
+
+ If the command succeeds, the response is OK; otherwise, see the error
+ responses in Section 4.3.2.
+
+ For example: command INSTCMD su700 test.panel.start and response OK
+
+ ABNF: See variable instcmd in Figure 5.
+
+4.2.7. LIST
+
+ All the LIST commands produce a response with a common format. The
+ response begins with BEGIN LIST and then repeats the initial query.
+ A list then follows, with as many lines as are necessary. The
+ response ends with END LIST, followed by the initial query.
+
+ The formatting may seem a bit redundant, but it makes a different
+ form of client possible. A client can send a LIST command and then
+ wait for the response. When it arrives, the Management Daemon
+ doesn't need a complicated state machine to remember which list is
+ which.
+
+ Note: The current NUT Project implementation of the Attachment
+ Daemon, upsd, sends back the response to the LIST command as a
+ sequence of messages. The Management Daemon should continue reading
+ these messages until it receives the line beginning END LIST.
+
+ ABNF: See the variable list in Figure 5.
+
+ The possible subcommands are listed in the sections below.
+
+4.2.7.1. LIST CLIENT
+
+ The command calls for the Attachment Daemon to report all the current
+ Management Daemon clients of a given UPS.
+
+ Command: LIST CLIENT <upsname>
+
+ Response:
+
+ BEGIN LIST CLIENT <upsname>
+ CLIENT <upsname> <client_IP_address>
+ ...
+ END LIST CLIENT <upsname>
+
+ For example: command LIST CLIENT ups1 and response
+
+ BEGIN LIST CLIENT ups1
+ CLIENT ups1 ::1
+ CLIENT ups1 203.0.113.1
+ END LIST CLIENT ups1
+
+4.2.7.2. LIST CMD
+
+ The command calls for the Attachment Daemon to report a list of the
+ Instant Commands that the Management Daemon may send to the
+ Attachment Daemon. This Instant Command list is the abstracted view
+ of the UPS hardware capabilities. An economical UPS will support few
+ or no Instant Commands, but a professional model should support more.
+
+ Command: LIST CMD <upsname>
+
+ Response:
+
+ BEGIN LIST CMD <upsname>
+ CMD <upsname> <cmdname>
+ ...
+ END LIST CMD <upsname>
+
+ <upsname> is the name of the UPS, and <cmdname> is the name of the
+ Instant Command that may be issued to the UPS.
+
+ For example: command LIST CMD su700 and response
+
+ BEGIN LIST CMD su700
+ CMD su700 load.on
+ CMD su700 test.panel.start
+ ...
+ END LIST CMD su700
+
+4.2.7.3. LIST ENUM
+
+ The command calls for the Attachment Daemon to report the set of
+ possible values of a UPS variable that has predetermined values.
+
+ Command: LIST ENUM <upsname> <varname>
+
+ Response:
+
+ BEGIN LIST ENUM <upsname> <varname>
+ ENUM <upsname> <varname> "<value>"
+ ...
+ END LIST ENUM <upsname> <varname>
+
+ <upsname> is the name of the UPS, <varname> is the UPS variable, and
+ <value> is one of the possible values of that UPS variable. Note
+ that, in current practice, the output is an unordered list. Also
+ note that the quotation marks are part of the response.
+
+ For example: command LIST ENUM su700 input.transfer.low and response
+
+ BEGIN LIST ENUM su700 input.transfer.low
+ ENUM su700 input.transfer.low "103"
+ ENUM su700 input.transfer.low "100"
+ ...
+ END LIST ENUM su700 input.transfer.low
+
+4.2.7.4. LIST RANGE
+
+ The command calls for the Attachment Daemon to report the interval in
+ which valid values of UPS variable lie.
+
+ Command: LIST RANGE <upsname> <varname>
+
+ Response:
+
+ BEGIN LIST RANGE <upsname> <varname>
+ RANGE <upsname> <varname> "<min>" "<max>"
+ ...
+ END LIST RANGE <upsname> <varname>
+
+ <upsname> is the name of the UPS, <varname> is the UPS variable, and
+ {<min>,<max>} is the interval of valid values of that UPS variable.
+ Note that the quotation marks are part of the response.
+
+ For example: command LIST RANGE su700 input.transfer.low and response
+
+ BEGIN LIST RANGE su700 input.transfer.low
+ RANGE su700 input.transfer.low "90" "105"
+ END LIST RANGE su700 input.transfer.low
+
+4.2.7.5. LIST RW
+
+ The command calls for the Attachment Daemon to report a list of the
+ UPS variables associated with a given UPS that may be read and
+ written by the Management Daemon. These variables are the abstracted
+ view of the UPS hardware capabilities. An economical UPS may support
+ few variables, but a professional model should support at least the
+ variables that are needed for an automatic shutdown and restart; see
+ Appendix B. Also, see Section 8.2 for details of the recommended
+ minimum support of variables. A full list of variables is available
+ in source code file docs/nut-names.txt [gitvars], which serves as the
+ Recording Document.
+
+ Command: LIST RW <upsname>
+
+ Response:
+
+ BEGIN LIST RW <upsname>
+ RW <upsname> <varname> "<value>"
+ ...
+ END LIST RW <upsname>
+
+ <upsname> is the name of the UPS, <varname> is the UPS variable, and
+ <value> is the value of that UPS variable. Note that the quotation
+ marks are part of the response.
+
+ For example: command LIST RW su700 and response
+
+ BEGIN LIST RW su700
+ RW su700 output.voltage.nominal "115"
+ RW su700 ups.delay.shutdown "020"
+ ...
+ END LIST RW su700
+
+4.2.7.6. LIST UPS
+
+ The command calls for the Attachment Daemon to report a list of the
+ UPS units to which it is attached.
+
+ Command: LIST UPS
+
+ Response:
+
+ BEGIN LIST UPS
+ UPS <upsname> "<description>"
+ ...
+ END LIST UPS
+
+ <upsname> is the name of a UPS, and <description> is the description
+ maintained by the Attachment Daemon, if available. It is set to
+ "Unavailable" otherwise. Note that the quotation marks are part of
+ the response.
+
+ This command can also be used to determine what values of <upsname>
+ are valid before calling other functions on the server. This is also
+ a good way to handle situations where a single Attachment Daemon
+ supports multiple UPSs. It is also useful for clients that perform a
+ UPS discovery process.
+
+ For example: response
+
+ BEGIN LIST UPS
+ UPS su700 "Development box"
+ END LIST UPS
+
+4.2.7.7. LIST VAR
+
+ The command calls for the Attachment Daemon to report a list of all
+ the UPS variables that it maintains for a given UPS and the values of
+ those UPS variables.
+
+ Command: LIST VAR <upsname>
+
+ Response:
+
+ BEGIN LIST VAR <upsname>
+ VAR <upsname> <varname> "<value>"
+ ...
+ END LIST VAR <upsname>
+
+ <upsname> is the name of the UPS, <varname> is the UPS variable, and
+ <value> is the value of that variable. Note that the quotation marks
+ are part of the response.
+
+ The response to this command lists the UPS variables available for
+ this UPS and their current values.
+
+ For example: command LIST VAR su700 and response
+
+ BEGIN LIST VAR su700
+ VAR su700 ups.mfr "Example Mfg"
+ VAR su700 ups.mfr.date "10/17/96"
+ ...
+ END LIST VAR su700
+
+ See Section 8.2 for details of the recommended minimum support of
+ variables. A full list of variables is available in source code file
+ docs/nut-names.txt [gitvars], which serves as the Recording Document.
+
+4.2.8. PASSWORD
+
+ This command is a companion to USERNAME and is used by a Management
+ Daemon to specify the password required to enter a session with the
+ Attachment Daemon; see Section 2.9.
+
+ Command: PASSWORD <password>
+
+ If the command succeeds, the response is OK; otherwise, see the error
+ responses in Section 4.3.2.
+
+ For examples of the use of commands USERNAME and PASSWORD by
+ administrative users, see Appendix E.2.
+
+ ABNF: See variable session-password in Figure 5.
+
+4.2.9. PRIMARY
+
+ In current practice, the Attachment Daemon records in local file
+ upsd.users that an administrative user is a Primary. See
+ Appendix E.1 for an example. When a Management Daemon starts up and
+ opens a session with the Attachment Daemon, it lays claim to being a
+ Primary by sending command PRIMARY to the Attachment Daemon, thus
+ claiming that it has the required authority to perform critical
+ actions, such as setting status symbol FSD.
+
+ Command: PRIMARY <upsname>
+
+ <upsname> is the name of the UPS.
+
+ If the Attachment Daemon has the authority, the response is OK;
+ otherwise, see the error responses in Section 4.3.2.
+
+ | Note: Historically, this command was known as MASTER.
+
+4.2.10. PROTVER
+
+ Return the version of the command/response protocol used by the
+ Attachment Daemon. This command is intended for human, as well as
+ program, use.
+
+ Command: PROTVER
+
+ For example: the following command line sequence in the Attachment
+ Daemon
+
+ netcat localhost 3493
+ PROTVER
+ 1.3
+
+ Notes:
+
+ 1. There are no quotation marks in the response.
+ 2. The version of the protocol returned by PROTVER is different than
+ the implementation version of the Attachment Daemon returned by
+ VER.
+ 3. To ease migration, NUT version 2.8.0 also supports the equivalent
+ NETVER command used in previous releases. See Section 8.2.4.
+
+ ABNF: See variable protver in Figure 5.
+
+4.2.11. SET
+
+ The command calls for the Attachment Daemon to set a UPS variable to
+ a given value. Whether this has an effect on the UPS hardware is
+ specific to the Driver and the UPS model. Some variables are read-
+ only due to the design of the UPS or its Driver.
+
+ Command: SET VAR <upsname> <varname> "<value>"
+
+ <upsname> is the name of the UPS, <varname> is the UPS variable, and
+ <value> is the value to be assigned to that variable. Note that the
+ quotation marks are part of the command.
+
+ If the command succeeds, the response is OK; otherwise, see the error
+ responses in Section 4.3.2.
+
+ For example: command SET VAR su700 ups.id "My UPS" and response OK
+
+ ABNF: See the variable set in Figure 5.
+
+4.2.12. STARTTLS
+
+ The client tells the Attachment Daemon to switch to communication
+ encrypted by TLS [RFC8446]. When the client receives OK, it also
+ switches to TLS encryption.
+
+ Command: STARTTLS
+
+ If the command succeeds, the response is OK STARTTLS; otherwise, see
+ the error responses in Section 4.3.2.
+
+ If the client does not send command STARTTLS to the Attachment
+ Daemon, communication continues unencrypted; however, an Attachment
+ Daemon MAY refuse unencrypted communication.
+
+ NUT 2.8.0 supports the encryption of communications between the
+ Attachment Daemon and the Management Daemon using TLS 1.3 [RFC8446]
+ with X.509 v3 certificates, as defined by [RFC5280] and updates. See
+ Appendix D for details of the encryption of communications in
+ previous release 2.7.4.
+
+ ABNF: See variable starttls in Figure 5.
+
+4.2.12.1. Key Infrastructure and Self-Signed Certificates
+
+ _The very restricted nature of UPS management makes it of interest to
+ consider self-signed certificates._
+
+ In the World Wide Web, there are millions of servers and hundreds of
+ millions of potential clients for each one. The servers do not know
+ who their clients will be, so they entrust the management of a Public
+ Key Infrastructure (PKI) to Certificate Authorities that they trust.
+ The encryption of communications between the client and server
+ requires that the browsers carry a list of Certificate Authorities
+ that the clients have to trust. _This is a many-to-many
+ relationship._
+
+ The management of UPS units is not a many-to-many relationship; it is
+ frequently one to one. In the closely restrained world of UPS
+ management, there are a very limited number of clients for each
+ server, rarely more than three, and unlike the World Wide Web, the
+ server administrators know exactly who they are. These clients visit
+ very few servers, typically one only. This situation is totally
+ different from the World Wide Web. The use of external Certificate
+ Authorities is a potential security weakness that must be accepted
+ for the World Wide Web but which can be avoided for UPS management by
+ either generating the private and public keys locally or, for larger
+ organizations, using a PKI.
+
+ The security policies for UPS management may be subordinate to an
+ organization's own internal IT security plans and procedures,
+ possibly based on [RFC7030] and [RFC8894], but in simple cases, it is
+ possible to obtain better security using self-signed certificates.
+
+4.2.13. USERNAME
+
+ The Attachment Daemon limits access to clients whose credentials
+ match those in the file upsd.users. There is no anonymous access. A
+ Management Daemon program or script uses command USERNAME and its
+ companion command PASSWORD to open a session with the Attachment
+ Daemon for an administrative user. Note that this command is for
+ program or script use and is not the familiar login command typed on
+ a command line to gain access to a shell.
+
+ Command: USERNAME <username>
+
+ If the command succeeds, the response is OK; otherwise, see the error
+ responses in Section 4.3.2.
+
+ For examples of the use of commands USERNAME and PASSWORD by
+ administrative users, see Appendix E.2.
+
+ ABNF: See variable session-username in Figure 5.
+
+4.2.14. VER
+
+ Return the implementation version of the Attachment Daemon. This
+ command is intended for human, as well as program, use.
+
+ Command: VER
+
+ For example: the following command line sequence
+
+ netcat localhost 3493
+ VER
+ Network UPS Tools upsd 2.8.0 - http://www.networkupstools.org/
+
+ Notes:
+
+ 1. There are no quotation marks in the response.
+ 2. The implementation version of the Attachment Daemon returned by
+ VER is different than the protocol version returned by PROTVER.
+
+ ABNF: See variable ver in Figure 5.
+
+4.3. Summary of Responses
+
+4.3.1. Response When Command Succeeds
+
+ If the command succeeds, the response has the following command-
+ dependent form:
+
+ +==========+=====================+================+============+
+ | Command | Response | Reference | Note |
+ +==========+=====================+================+============+
+ | ATTACH | OK | Section 4.2.1 | Was LOGIN |
+ +----------+---------------------+----------------+------------+
+ | DETACH | OK Goodbye | Section 4.2.2 | Was LOGOUT |
+ +----------+---------------------+----------------+------------+
+ | FSD | OK FSD-SET | Section 4.2.3 | |
+ +----------+---------------------+----------------+------------+
+ | GET | Subcommand specific | Section 4.2.4 | |
+ +----------+---------------------+----------------+------------+
+ | HELP | List of commands | Section 4.2.5 | |
+ +----------+---------------------+----------------+------------+
+ | INSTCMD | OK | Section 4.2.6 | |
+ +----------+---------------------+----------------+------------+
+ | LIST | Subcommand specific | Section 4.2.7 | |
+ +----------+---------------------+----------------+------------+
+ | PASSWORD | OK | Section 4.2.8 | |
+ +----------+---------------------+----------------+------------+
+ | PRIMARY | OK | Section 4.2.9 | |
+ +----------+---------------------+----------------+------------+
+ | PROTVER | Protocol version | Section 4.2.10 | Was NETVER |
+ +----------+---------------------+----------------+------------+
+ | SET | OK | Section 4.2.11 | |
+ +----------+---------------------+----------------+------------+
+ | STARTTLS | OK STARTTLS | Section 4.2.12 | |
+ +----------+---------------------+----------------+------------+
+ | USERNAME | OK | Section 4.2.13 | |
+ +----------+---------------------+----------------+------------+
+ | VER | Program version | Section 4.2.14 | |
+ +----------+---------------------+----------------+------------+
+
+ Table 2: Response If Command Succeeds
+
+4.3.2. Error Responses
+
+ Error responses have the following format:
+
+ ERR <error-name> [<extra>]
+
+ <error-name> is a single word token taken from the 27 characters A-Z
+ and hyphen (-). Implementations MAY, if needed, add an additional,
+ optional <extra>. Current practice does not make use of this
+ possibility.
+
+ The <error-name> may have one of the following values:
+
+ +==============================+==================================+
+ | The Error Name Token | Meaning |
+ | <error-name> | |
+ +==============================+==================================+
+ | ACCESS-DENIED | The client's host and/or |
+ | | authentication details supplied |
+ | | by USERNAME and PASSWORD are not |
+ | | sufficient to execute the |
+ | | requested command. |
+ +------------------------------+----------------------------------+
+ | ALREADY-ATTACHED | The client has already sent a |
+ | | successful ATTACH command for a |
+ | | given UPS and can't do it again. |
+ +------------------------------+----------------------------------+
+ | ALREADY-SET-PASSWORD | The client has already supplied |
+ | | a PASSWORD and is attempting to |
+ | | repeat the command in the same |
+ | | session. |
+ +------------------------------+----------------------------------+
+ | ALREADY-SET-USERNAME | The client has already supplied |
+ | | a USERNAME and is attempting to |
+ | | repeat the command within the |
+ | | same session. |
+ +------------------------------+----------------------------------+
+ | CMD-NOT-SUPPORTED | The specified UPS doesn't |
+ | | support the Instant Command. |
+ +------------------------------+----------------------------------+
+ | DATA-STALE | The Attachment Daemon is |
+ | | connected to the Driver for the |
+ | | UPS, but that Driver isn't |
+ | | providing regular updates or has |
+ | | specifically marked the data as |
+ | | stale. Current practice is for |
+ | | the Attachment Daemon to refuse |
+ | | to provide the Management Daemon |
+ | | with variables on stale units to |
+ | | avoid false readings. |
+ | | |
+ | | This generally means that the |
+ | | Driver is running, but it has |
+ | | lost communication with the |
+ | | hardware. Check the physical |
+ | | connection to the equipment. |
+ +------------------------------+----------------------------------+
+ | DRIVER-NOT-CONNECTED | The Attachment Daemon can't |
+ | | perform the requested command, |
+ | | since the Driver for that UPS is |
+ | | not connected. This usually |
+ | | means that the Driver is not |
+ | | running or, if it is, is |
+ | | misconfigured. |
+ +------------------------------+----------------------------------+
+ | FEATURE-NOT-CONFIGURED | This instance of the Attachment |
+ | | Daemon hasn't been configured |
+ | | properly to allow the requested |
+ | | feature to operate. In current |
+ | | practice, this error response is |
+ | | possible only for command |
+ | | STARTTLS. |
+ +------------------------------+----------------------------------+
+ | FEATURE-NOT-SUPPORTED | This instance of Attachment |
+ | | Daemon does not support the |
+ | | requested feature. In current |
+ | | practice, this error response is |
+ | | possible only for command |
+ | | STARTTLS. |
+ +------------------------------+----------------------------------+
+ | INSTCMD-FAILED | The Attachment Daemon failed to |
+ | | deliver the Instant Command |
+ | | request to the Driver. No |
+ | | further information is available |
+ | | to the client. This typically |
+ | | indicates a dead or broken |
+ | | Driver. |
+ +------------------------------+----------------------------------+
+ | INVALID-ARGUMENT | The client sent an argument to a |
+ | | command that is not recognized |
+ | | or is otherwise not valid in |
+ | | this context. This is typically |
+ | | caused by sending a valid |
+ | | command, such as GET, with a |
+ | | subcommand that is not valid. |
+ +------------------------------+----------------------------------+
+ | INVALID-PASSWORD | The client sent a nonvalid |
+ | | PASSWORD. |
+ +------------------------------+----------------------------------+
+ | INVALID-USERNAME | The client sent a nonvalid |
+ | | USERNAME. |
+ +------------------------------+----------------------------------+
+ | INVALID-VALUE | The value specified in the |
+ | | request is not valid. This |
+ | | usually applies to a SET of an |
+ | | ENUM type that is using a value |
+ | | not in the list of allowed |
+ | | values. See Section 4.2.7.3. |
+ +------------------------------+----------------------------------+
+ | PASSWORD-REQUIRED | The command requires a PASSWORD |
+ | | for authentication, but the |
+ | | client hasn't provided one. |
+ +------------------------------+----------------------------------+
+ | READONLY | The requested variable in a SET |
+ | | command is not writable. |
+ +------------------------------+----------------------------------+
+ | SET-FAILED | The Attachment Daemon failed to |
+ | | deliver the SET request to the |
+ | | Driver. This is similar to |
+ | | INSTCMD-FAILED. |
+ +------------------------------+----------------------------------+
+ | TLS-ALREADY-ENABLED | TLS mode is already enabled on |
+ | | this connection, so the |
+ | | Attachment Daemon can't start it |
+ | | again. |
+ | | |
+ | | Note: Historically, this message |
+ | | was ALREADY-SSL-MODE. |
+ +------------------------------+----------------------------------+
+ | TLS-NOT-ENABLED | TLS mode is required but has not |
+ | | yet been enabled on this |
+ | | connection, so the Attachment |
+ | | Daemon can't send commands. |
+ | | |
+ | | Note: This message is |
+ | | experimental and not in current |
+ | | common use. |
+ +------------------------------+----------------------------------+
+ | TOO-LONG | The requested value in a SET |
+ | | command is too long. |
+ +------------------------------+----------------------------------+
+ | UNKNOWN-COMMAND | The Attachment Daemon doesn't |
+ | | recognize the command. |
+ +------------------------------+----------------------------------+
+ | UNKNOWN-UPS | The UPS specified in the request |
+ | | is not known to the Attachment |
+ | | Daemon. This usually means that |
+ | | it didn't match anything in the |
+ | | Attachment Daemon configuration. |
+ +------------------------------+----------------------------------+
+ | USERNAME-REQUIRED | The command requires a USERNAME |
+ | | for authentication, but the |
+ | | client hasn't provided one. |
+ +------------------------------+----------------------------------+
+ | VAR-NOT-SUPPORTED | The specified UPS doesn't |
+ | | support the UPS variable in the |
+ | | command. |
+ +------------------------------+----------------------------------+
+
+ Table 3: Error Responses
+
+ | Note: Historically, this error response was ALREADY-LOGGED-IN.
+
+4.4. An ABNF of the Commands
+
+ This section repeats the syntax of Section 4.2 but in Augmented
+ Backus-Naur Form (ABNF). It does not define any additional features.
+ For further details of each command and the response, see
+ Section 4.2.
+
+ The commands may be presented in ABNF [RFC5234] [RFC7405] and
+ represented using US-ASCII [RFC0020].
+
+ Current practice tolerates mixed-case command names, but it is
+ RECOMMENDED to use uppercase only for commands. See Figure 5.
+
+ ;-------------------------------------------------------------------
+ ; This grammar is case sensitive. Terminal keywords SHOULD be
+ ; written in uppercase, as shown.
+ ; The following basic rules written with uppercase names are
+ ; taken from RFC 5234, Appendix B.1.
+ SP = 1*%x20 ; At least one SPACE
+ LF = %x0A ; Linefeed
+ DIGIT = %x30-39 ; Digit 0 through 9
+ ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
+ DQUOTE = %x22 ; Double quote "
+ VCHAR = %x21-7E ; Visible (printing) characters
+ ; Additional basic rules needed by this grammar
+ LC = %x61-7A ; Letter a through z
+ DOT = 1%x2E ; Exactly one .
+ COLON = 1%x3A ; Exactly one :
+ AT = 1%x40 ; Exactly one @
+ SEP = 1"-" / 1"_" / 1"." ; A single - or _ or .
+ JOIN = COLON / AT ; A single : or @
+ ; Frequently used in this grammar
+ cmdname = 1*LC *62(DOT 1*LC) ; E.g., load.off.delay
+ upschar = DIGIT / ALPHA / SEP
+ ups = 1*ALPHA *62upschar ; E.g., Example-Mfg-999
+ group = ups ; E.g., HB (Not in common use)
+ hostname = ups ; E.g., example.com
+ port = 1*5DIGIT ; E.g., 3493
+ upsname = [group COLON] ups [AT hostname [COLON port]]
+ ; Fully Qualified UPS name
+ ; E.g.,
+ ; HB:heartbeat1@example.com:3493
+ username = ups ; E.g., Power-Dept.6
+ varname = 1*LC *62( DOT 1*(DIGIT / LC) )
+ ; E.g., outlet.1.status
+ ;-------------------------------------------------------------------
+ commandLine = command LF ; LF is a single %x0A
+ command = attach / detach / fsd / get / help / instcmd /
+ list / password / primary / protver / set /
+ starttls / username / ver
+ ;
+ attach = "ATTACH" SP upsname
+ ;
+ detach = "DETACH"
+ ;
+ fsd = "FSD" SP upsname
+ ;
+ get = "GET" SP getsubcommnd
+ getsubcommand = getcmddesc / getdesc / getnumattach /
+ gettype / getupsdesc / getvar
+ ;
+ getcmddesc = "CMDDESC" SP upsname SP cmdname
+ getdesc = "DESC" SP upsname SP varname
+ getnumattach = "NUMATTACH" SP upsname
+ gettype = "TYPE" SP upsname SP varname
+ getupsdesc = "UPSDESC" SP upsname
+ getvar = "VAR" SP upsname SP varname
+ ;
+ help = "HELP"
+ ;
+ instcmd = "INSTCMD" SP upsname SP cmdname
+ ;
+ list = "LIST" listsubcommand
+ listsubcommand = listclient / listcmd / listenum / listrange /
+ listrw / listups / listvar
+ ;
+ listclient = "CLIENT" SP upsname
+ listcmd = "CMD" SP upsname
+ listenum = "ENUM" SP upsname SP varname
+ listrange = "RANGE" SP upsname SP varname
+ listrw = "RW" SP upsname
+ listups = "UPS"
+ listvar = "VAR" SP upsname
+ ;
+ session-password = "PASSWORD" SP *63VCHAR
+ ; A sequence of printable characters defined
+ ; in a server configuration file. Local
+ ; security practices may mandate a minimum
+ ; and maximum number of characters.
+ ;
+ primary = "PRIMARY" SP upsname
+ ;
+ protver = "PROTVER"
+ ;
+ value = *63VCHAR ; Local practices may limit the choice of
+ ; characters and require non-US-ASCII.
+ set = "SET" SP %s"VAR" SP upsname SP varname SP
+ DQUOTE value DQUOTE
+ ;
+ starttls = "STARTTLS"
+ ;
+ session-username = "USERNAME" SP username
+ ;
+ ver = "VER"
+ ;-------------------------------------------------------------------
+
+ Figure 5: ABNF for the Commands
+
+ Notes:
+
+ 1. _Implementation note:_ The ABNF is written using the provisions
+ of [RFC5234] and [RFC7405], which are US-ASCII based [RFC0020].
+
+ 2. The grammar is case sensitive. The terminal key words SHOULD be
+ written in uppercase, as specified.
+
+ 3. The repetition factor in front of an expression has the form
+ <min>*<max>, where <min> is the minimum number of repetitions,
+ and <max> is the maximum number.
+
+ 4. If <min> is omitted, its value is 0. If <max> is omitted, its
+ value is infinity.
+
+ 5. The notation n*n, meaning "exactly n copies", may be written as
+ n.
+
+ 6. Square brackets around an expression mean that the expression is
+ optional. This could be written as 0*1.
+
+4.4.1. Responses to Commands
+
+ The responses to the commands are encoded in US-ASCII [RFC0020] and
+ fall into two groups:
+
+ 1. Short replies to action commands; see Section 4.3.
+
+ 2. Long replies to requests for information. In this case, the
+ reply is sent in a sequence of messages. The last message will
+ contain a line beginning END LIST . For example, see
+ Section 4.2.7.1.
+
+5. Statuses and Events
+
+5.1. Status Symbols
+
+ These symbols resume the abstracted view of the UPS hardware
+ maintained by the Attachment Daemon. The variable ups.status
+ contains one or more space-separated status symbols, which together
+ describe the UPS state at that instant. In current practice, the
+ Management Daemon will poll variable ups.status every 5 seconds with
+ a command, such as GET VAR su700 ups.status, and a response, such as
+ VAR su700 ups.status "OB LB", to discover changes in the UPS status.
+ These changes will indicate UPS events.
+
+ +=========+======================================================+
+ | Status | Meaning |
+ | Symbol | |
+ +=========+======================================================+
+ | ALARM | The UPS reports that it requires intervention. |
+ +---------+------------------------------------------------------+
+ | BOOST | The UPS has determined that the voltage level of the |
+ | | public power supply is too low and is boosting it to |
+ | | the required level. The UPS continues to supply the |
+ | | protected system from the public power supply. |
+ +---------+------------------------------------------------------+
+ | BYPASS | The UPS is feeding current directly from the public |
+ | | power supply to the protected system. The backup |
+ | | facilities are disconnected. This state allows |
+ | | maintenance personnel to change the batteries |
+ | | without interrupting the protected system. |
+ +---------+------------------------------------------------------+
+ | CAL | The UPS is calibrating itself, for example, to |
+ | | determine at what charge the LB status is raised or |
+ | | lowered. |
+ +---------+------------------------------------------------------+
+ | CHRG | The UPS battery is charging. This usually implies |
+ | | that the UPS also has status OL but may not be the |
+ | | case if the UPS also has status OFF. |
+ +---------+------------------------------------------------------+
+ | COMM | The Attachment Daemon has effective contact with the |
+ | | UPS. |
+ +---------+------------------------------------------------------+
+ | DISCHRG | The UPS battery is discharging. This usually |
+ | | implies that the UPS also has status OB but may not |
+ | | be the case if the UPS also has status OFF. |
+ +---------+------------------------------------------------------+
+ | FSD | This "Forced Shutdown" status signals that the final |
+ | | shutdown sequence has begun. |
+ +---------+------------------------------------------------------+
+ | LB | Low Battery. The battery level of the UPS is below |
+ | | a chosen limit. The UPS may be in status OL or OB. |
+ +---------+------------------------------------------------------+
+ | NOCOMM | The Attachment Daemon has no effective contact with |
+ | | the UPS. |
+ +---------+------------------------------------------------------+
+ | OB | On Battery. The UPS is taking energy from its |
+ | | battery. The battery is discharging. A UPS must |
+ | | have status OB or OL; otherwise, it is deemed dead. |
+ +---------+------------------------------------------------------+
+ | OFF | The UPS is in state "Off". It does not react to |
+ | | failure in the public power supply. The exact |
+ | | meaning depends on the model. |
+ +---------+------------------------------------------------------+
+ | OL | Online. The UPS is online, receiving energy from |
+ | | the public power supply. The battery is charging. |
+ | | A UPS must have status OB or OL; otherwise, it is |
+ | | deemed dead. |
+ +---------+------------------------------------------------------+
+ | OVER | Overloaded. The UPS reports that the load on it is |
+ | | beyond its normal operating maximum. |
+ +---------+------------------------------------------------------+
+ | RB | Replace battery. The UPS reports that its battery |
+ | | or batteries should be replaced. |
+ +---------+------------------------------------------------------+
+ | TEST | Under test. The UPS is currently undergoing a test |
+ | | that may have been requested manually or internally. |
+ +---------+------------------------------------------------------+
+ | TICK | Heartbeat. A software UPS in the Attachment Daemon |
+ | | provides a regular signal monitored by the |
+ | | Management Daemon as a way of verifying effective |
+ | | end-to-end management. TICK and TOCK are |
+ | | companions; they are considered experimental. |
+ +---------+------------------------------------------------------+
+ | TOCK | Heartbeat. See TICK |
+ +---------+------------------------------------------------------+
+ | TRIM | The UPS has determined that the voltage level of the |
+ | | public power supply is too high and is reducing it |
+ | | to the required level. The UPS continues to supply |
+ | | the protected system from the public power supply. |
+ +---------+------------------------------------------------------+
+
+ Table 4: UPS Status Symbols
+
+5.2. Events
+
+ A Management Daemon detects the occurrence of a UPS event from a
+ change in the UPS status received from the Attachment Daemon. The
+ following table summarizes the process. A status of "none" means
+ that the status symbol is not present in the variable ups.status.
+
+ The Management Daemon should retrieve the variable ups.status from
+ the Attachment Daemon at regular intervals. If the interval is too
+ short, compute and network resources will be wasted, but if the
+ interval is too large, the Management Daemon risks missing short-
+ lived changes in the UPS status.
+
+ A default value of 5 seconds is RECOMMENDED, but an implementation
+ MAY make this value configurable. By default, the "old" status is
+ therefore the previous value retrieved 5 seconds ago.
+
+ Current practice is for the Management Daemon to assign names to
+ certain events. These are shown in the table in parentheses.
+
+ +=======+=========+===============++=========+========+=============+
+ |Old | New |Event || Old | New |Event |
+ |Status | Status | || Status | Status | |
+ +=======+=========+===============++=========+========+=============+
+ |none | ALARM |Alarm on || ALARM | none |Alarm off |
+ +-------+---------+---------------++---------+--------+-------------+
+ |none | BOOST |Boosting || BOOST | none |Not boosting |
+ | | |voltage || | | |
+ +-------+---------+---------------++---------+--------+-------------+
+ |none | BYPASS |Bypass on || BYPASS | none |Bypass off |
+ +-------+---------+---------------++---------+--------+-------------+
+ |none | CAL |Calibrating || CAL | none |Not |
+ | | | || | |calibrating |
+ +-------+---------+---------------++---------+--------+-------------+
+ |none | CHRG |Charging || CHRG | none |Not charging |
+ +-------+---------+---------------++---------+--------+-------------+
+ |none | COMM |UPS || COMM | none |See note 4 |
+ | | |communicating || | | |
+ | | |(event COMMOK) || | | |
+ +-------+---------+---------------++---------+--------+-------------+
+ |none | DISCHRG |Discharging || DISCHRG | none |Not |
+ | | | || | |discharging |
+ +-------+---------+---------------++---------+--------+-------------+
+ |none | FSD |System shutdown|| FSD | none |Shutdown |
+ | | |(events FSD, || | |abandoned. |
+ | | |SHUTDOWN) || | |See note 1 |
+ +-------+---------+---------------++---------+--------+-------------+
+ |none | LB |Low battery. || LB | none |Battery not |
+ | | |See note 2 || | |low |
+ | | |(event LOWBATT)|| | | |
+ +-------+---------+---------------++---------+--------+-------------+
+ |none | NOCOMM |UPS dead? See || NOCOMM | none |See note 4 |
+ | | |note 4 || | | |
+ | | |(events || | | |
+ | | |COMMBAD, || | | |
+ | | |NOCOMM) || | | |
+ +-------+---------+---------------++---------+--------+-------------+
+ |none | OFF |UPS turned off || OFF | none |UPS not |
+ | | | || | |turned off |
+ +-------+---------+---------------++---------+--------+-------------+
+ |OB | OL |Receiving power|| OL | OB |Power lost |
+ | | |(event ONLINE) || | |(event |
+ | | | || | |ONBATT) |
+ +-------+---------+---------------++---------+--------+-------------+
+ |none | OVER |UPS overloaded || OVER | none |Overload gone|
+ +-------+---------+---------------++---------+--------+-------------+
+ |none | RB |Replace battery|| RB | none |Replacement |
+ | | |(event || | |canceled |
+ | | |REPLBATT) || | | |
+ +-------+---------+---------------++---------+--------+-------------+
+ |none | TEST |Test starts || TEST | none |Test finished|
+ +-------+---------+---------------++---------+--------+-------------+
+ |none | TICK |Heartbeat || TICK | none |No heartbeat.|
+ | | |event. See || | |See note 3 |
+ | | |note 3 || | | |
+ +-------+---------+---------------++---------+--------+-------------+
+ |none | TOCK |Heartbeat || TOCK | none |No heartbeat.|
+ | | |event. See || | |See note 3 |
+ | | |note 3 || | | |
+ +-------+---------+---------------++---------+--------+-------------+
+ |none | TRIM |Trimming || TRIM | none |Not trimming |
+ | | |voltage || | | |
+ +-------+---------+---------------++---------+--------+-------------+
+
+ Table 5: Event Deduction from Status Changes
+
+ Notes:
+ 1. Current practice does not include this event.
+ 2. If the status OB is present, current practice takes Management
+ Daemon reception of LB as an order to perform an emergency
+ system shutdown.
+ 3. The use of a software-defined UPS to provide a heartbeat is
+ experimental and is not part of common current practice.
+ 4. Current practice is the following: if the UPS has not
+ responded for 15 seconds, the Management Daemon assumes that
+ the UPS is _dead_ (event NOCOMM), and if the last known OL/OB
+ status was OB, a system shutdown (command FSD) is requested.
+
+6. Security Considerations
+
+6.1. Current General Security Practice
+
+ Experience over the last 20 years shows that new UPS management
+ software releases are not frequent and, when installed, stay
+ unmodified for some years. This is probably because UPS management
+ is a mature activity, part of site management. A limited number of
+ system administrators have access to the UPS hardware and software
+ and tend to assume a certain "security by obscurity" since many
+ installations have a configuration like the one shown in Figure 6,
+ which uses port 3493/TCP (nut) between the two daemons running in the
+ same system. The traffic is often not encrypted, and when it is
+ encrypted, it uses deprecated early versions of SSL/TLS.
+
+ ,-----, ,--------------------,---------------------,
+ | UPS |---| Attachment <-Commands Management |
+ | |===| Daemon Responses-> Daemon |
+ /-----\ '--------------------'---------------------'
+ Listens on
+ port 3493/TCP
+ for localhost
+
+ Figure 6: Common Single-System Configuration
+
+ This situation is now changing as low-cost processors become
+ available, costing significantly less than a UPS unit. This
+ evolution makes it interesting to shift to a configuration like the
+ one shown in Figure 7, but it also exacerbates the security weakness
+ of Figure 6, since the traffic between the daemons is now over an
+ exposed network.
+
+ ,-----,------------, ,--------------,
+ | UPS - Attachment | <-Commands | Management |
+ | | Daemon | Responses-> | Daemon |
+ /-----'------------\ '--------------'
+ Listens on
+ port 3493/TCP
+
+ Figure 7: Integration of UPS and Attachment Daemon
+
+ These security issues raised by UPS management are those of the power
+ industry in general; they are addressed in detail in IEC Technical
+ Specification 62351 [IEC62351-1]. In addition to equipment security,
+ cyber security is now an essential consideration.
+
+ Quoting from IEC 62351-1[IEC62351-1], Introduction to the standard,
+ clause 5.2.3.5:
+
+ | With the computer systems for power operations presumably kept
+ | isolated from the Internet, many utility personnel do not see any
+ | reason for adding security measures to these systems. However, as
+ | clearly seen from these Subclauses, this may not be true anymore
+ | as networking becomes more prevalent and additional information
+ | access requirements grow.
+
+ In IEC 62351-1[IEC62351-1], clause 5.3.5 lists typical security
+ attacks: Eavesdropping, Masquerade, Man-in-the-Middle, Replay, and
+ Resource Exhaustion. [RFC3552] adds message insertion/deletion/
+ modification and denial of service.
+
+ Let's look more closely at these requirements:
+
+ * Eavesdropping; see Section 6.3.1
+
+ * Man-in-the-Middle; see Section 6.3.2
+
+ * Masquerade; see Section 6.3.3
+
+ * Message insertion, deletion, and modification; see Section 6.3.4
+
+ * Replay; see Section 6.3.5
+
+ * Resource Exhaustion and Denial of Service; see Section 6.3.6
+
+6.2. Communication Security Requirements
+
+ Enforcing secure communication requires tightening up the Attachment
+ Daemon to require the use of command STARTTLS for commands sent over
+ the global Internet. In such a situation, an Attachment Daemon
+ listening for traffic other than from localhost:
+
+ 1. SHOULD require and accept command STARTTLS,
+
+ 2. MUST encrypt all communication with a Management Daemon, and
+
+ 3. SHALL refuse all non-encrypted commands, except an initial
+ STARTTLS.
+
+ Notes:
+
+ * The SHOULD, rather than MUST, in Section 6.2, Paragraph 2, Item 1
+ above allows system administrators to enforce secure communication
+ using other techniques that do not involve the STARTTLS command.
+
+ * If an Attachment Daemon requires that all commands be encrypted as
+ required by the MUST in Section 6.2, Paragraph 2, Item 2 above,
+ then, automatically, each Management Daemon MUST encrypt as well,
+ since it has to do so in order to gain access.
+
+ * The SHALL in Section 6.2, Paragraph 2, Item 3 above applies to
+ traffic from the global Internet. An Attachment Daemon MAY accept
+ unencrypted commands from localhost if the local installation's
+ security practices allow it, for example, in a dedicated
+ appliance.
+
+ Firewalls SHOULD be used to restrict the communication between the
+ Attachment Daemon and the accepted Management Daemons, prohibiting
+ and discarding traffic from any systems that are not part of the
+ envisioned power management setup. Note: See Section 6.2, Paragraph
+ 4, Item 1 above on the use of SHOULD.
+
+6.2.1. Certificate Security
+
+ In long-lived installations, such as those found in UPS management,
+ careful certificate management is essential, whether the certificate
+ is provided by a Certificate Authority or is a self-signed
+ certificate. For example, the expiration times of both the
+ certificate containing the public key and the signing certificate
+ should be specified.
+
+6.3. Attacks and Defenses
+
+6.3.1. Eavesdropping
+
+ The defense against eavesdropping is encryption of the commands and
+ responses passed between the client Management Daemon and server
+ Attachment Daemon. The protocol provides command STARTTLS, see
+ Section 4.2.12, which calls on the Attachment Daemon to support TLS
+ encryption of the communication. If this command is accepted, the
+ Management Daemon also encrypts.
+
+ In current NUT Project practice, the use of TLS is optional; however,
+ a Management Daemon may refuse to accept unencrypted communication.
+ This is done by setting declarations FORCESSL to 1 and CERTVERIFY to
+ 1 in the Management Daemon configuration file.
+
+6.3.1.1. Misplaced Declarations Requiring TLS
+
+ A further weakness is that the FORCESSL and CERTVERIFY declarations,
+ which enforce use of encryption, are in the client Management Daemon
+ configuration file and not in the Attachment Daemon. Secure practice
+ requires enforcement by the server Attachment Daemon, rather than a
+ possibly rogue client Management Daemon out on the Internet.
+
+ This weakness may be mitigated with strict firewall rules that would
+ prevent the rogue client Management Daemon from accessing the
+ Attachment Daemon.
+
+6.3.1.2. Weak Protection in Previous Version 2.7.4
+
+ Although version 2.8.0 of NUT supports TLS 1.3 [RFC8446] with X.509
+ v3 certificates as defined by [RFC5280], previous version 2.7.4 only
+ supported earlier SSL/TLS versions. To overcome this weakness, The
+ following techniques have been used:
+
+ * Shims; see Appendix D.1
+
+ * TLS tunnel; see Appendix D.2
+
+ * Virtual Private Network (VPN); see Appendix D.3
+
+ * Virtual Local Area Network (VLAN); see Appendix D.4
+
+6.3.2. Man-in-the-Middle
+
+ The protocol relies on TLS encryption to prevent man-in-the-middle
+ attacks. See Appendix D for defense methods used for previous NUT
+ version 2.7.4.
+
+6.3.3. Masquerade Attack: Agent Verification
+
+ The protocol allows a malicious client acting as a Management Daemon
+ to send command FSD to an Attachment Daemon to shut down a working
+ system and its power supply, as described in The Shutdown Story
+ section (see Appendix B). Similarly, a malicious client could turn
+ off the UPS power outlets, causing the system to fail.
+
+ The protocol provides commands USERNAME (see Section 4.2.13) and
+ PASSWORD (see Section 4.2.8), which allow an administrative user in a
+ Management Daemon to authenticate itself to the Attachment Daemon, as
+ a defense against masquerade attacks. The administrative username
+ and password need protection against local malicious users. This is
+ done by restricting access to the configuration files.
+
+6.3.4. Message Insertion, Deletion, and Modification
+
+ The protocol relies on TLS encryption to prevent message insertion,
+ deletion, and modification attacks. See Appendix D for defense
+ methods used for previous NUT version 2.7.4.
+
+6.3.5. Replay
+
+ There are two cases:
+
+ 1. The replay is from a system other than an approved Management
+ Daemon, i.e., the protocol relies on a firewall to block the
+ traffic.
+
+ 2. The replay is from an approved Management Daemon. i.e., the
+ protocol relies on the Management Daemon's own security to
+ prevent unauthorized access.
+
+6.3.6. Denial of Service
+
+ The protocol relies on a very tightly specified firewall to prevent
+ denial-of-service attacks. Only designated client Management Daemons
+ should be able to reach the server Attachment Daemon.
+
+7. IANA Considerations
+
+ The protocol specified by this text runs over port 3493/TCP (nut),
+ which is registered by the Network UPS Tools (NUT) Project.
+
+ This document has been added to the registration's Reference field in
+ the "Service Name and Transport Protocol Port Number Registry"
+ [Registry].
+
+8. Implementation Status
+
+ This section presents a very short summary of the status of the
+ Network UPS Tools project.
+
+ * May 1996: The first hack as a cron job.
+ * September 1997: The first server-client code.
+ * March 1998: First public release.
+ * June 1999: Code rewrite with a UPS Driver smartups, an Attachment
+ Daemon upsd, and a simple Management Daemon.
+ * September 1999: The project became "Network UPS Tools". The
+ Management Daemon upsmon supported Primary/Secondary
+ configurations.
+ * June 2001: Common core for multiple Drivers.
+ * May 2002: IANA granted port 3493/TCP (nut). August: release
+ 1.0.0. November: OpenSSL support.
+ * April 2003: The initial set of command and variable names was
+ designed.
+ * February 2005: Arnaud Quette took over the project lead from
+ Russell Kroll.
+ * March 2016: Version 2.7.4 released, supported over 100 device
+ manufacturers and hundreds of UPS models.
+ * November 2020: Evgeny "Jim" Klimov took over project lead from
+ Arnaud Quette.
+ * May 2022: Version 2.8.0 released, supporting protocol version 1.3.
+
+ See [githist] and Appendix J [History] for a detailed history of the
+ NUT Project.
+
+8.1. Inclusion in Software Distributions
+
+ The programs upsd, upsmon, upssched, upsc, upscmd, and upsrw have
+ been included in the package known as "nut" in the package systems of
+ many distributions, i.e., all the major Linux distributions and Unix
+ distributions, such as OpenBSD and OpenSolaris. A Microsoft Windows
+ version has been developed but was not maintained.
+
+8.2. Recommended Minimum Support
+
+ The features provided by current UPS units vary widely. However,
+ experience shows that a minimum feature set is needed for
+ satisfactory use of the NUT Project software. A full list of
+ variables is available in source code file docs/nut-names.txt
+ [gitvars], which serves as the Recording Document.
+
+8.2.1. Desktop PC Variables
+
+ The following variables form a minimum set suitable for a desktop PC.
+ It is expected that, on public power supply failure, the PC will be
+ halted. It will not restart automatically when power returns.
+
+ * battery.charge
+
+ * battery.charge.low
+
+ * device.mfr
+
+ * device.model
+
+ * ups.status with the minimum status symbol set OL OB LB FSD; see
+ Section 5.1
+
+8.2.2. Unattended Servers and Additional Variables
+
+ The following additional variables are needed in a minimum set
+ suitable for an unattended server. It is expected that, on public
+ power supply failure, the server will be halted. It will restart
+ automatically when power returns.
+
+ * battery.date
+
+ * device.serial
+
+ * ups.delay.shutdown
+
+ * ups.delay.start
+
+8.2.3. Commands and Other Technical Terms
+
+ Satisfactory use of the NUT Project software requires support for all
+ the commands specified in protocol version 1.3, software version
+ 2.8.0.
+
+8.2.4. Support for Earlier Versions
+
+ In order to ease migration from software version 2.7.4, which
+ supported protocol version 1.2, software version 2.8.0 also supports
+ the technical terms used in protocol version 1.2. See Appendix C for
+ the differences.
+
+9. References
+
+9.1. Normative References
+
+ [RFC0020] Cerf, V., "ASCII format for network interchange", STD 80,
+ RFC 20, DOI 10.17487/RFC0020, October 1969,
+ <https://www.rfc-editor.org/info/rfc20>.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119,
+ DOI 10.17487/RFC2119, March 1997,
+ <https://www.rfc-editor.org/info/rfc2119>.
+
+ [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax
+ Specifications: ABNF", STD 68, RFC 5234,
+ DOI 10.17487/RFC5234, January 2008,
+ <https://www.rfc-editor.org/info/rfc5234>.
+
+ [RFC7405] Kyzivat, P., "Case-Sensitive String Support in ABNF",
+ RFC 7405, DOI 10.17487/RFC7405, December 2014,
+ <https://www.rfc-editor.org/info/rfc7405>.
+
+ [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
+ 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
+ May 2017, <https://www.rfc-editor.org/info/rfc8174>.
+
+9.2. Informative References
+
+ [C2ndEd] Kernighan, B. and D. Ritchie, "The C Programming
+ Language", 2nd edition, Prentice Hall Software Series,
+ ISBN 0-13-110362-8, 1988.
+
+ [devguide] Kroll, R., Quette, A., Lepple, C., and P. Selinger,
+ "Network UPS Tools Project Developer Guide",
+ <https://networkupstools.org/docs/developer-guide.chunked/
+ ar01s09.html>.
+
+ [Documentation]
+ "Network UPS Tools Documentation",
+ <https://networkupstools.org/documentation.html>.
+
+ [githist] "The Network UPS Tools repository, project history", July
+ 2022,
+ <https://github.com/networkupstools/nut/blob/master/docs/
+ history.txt>.
+
+ [gitvars] "The Network UPS Tools repository, variable names", April
+ 2022,
+ <https://github.com/networkupstools/nut/blob/master/docs/
+ nut-names.txt>.
+
+ [History] Kroll, R., Quette, A., and A. de Korte, "Network UPS Tools
+ User Manual", May 2022,
+ <https://networkupstools.org/docs/user-manual.pdf>.
+
+ [HyTimeA] ISO/IEC, "Information technology -- Hypermedia/Time-based
+ Structuring Language (HyTime)", ISO/IEC 10744:1997, August
+ 1997.
+
+ [IEC62351-1]
+ IEC, "Power systems management and associated information
+ exchange -- Data and communications security. Part 1:
+ Communication network and system security -- Introduction
+ to security issues", 35 pages, TC 57 - Power systems
+ management and associated information exchange, IEC TS
+ 62351-1:2007, May 2007, <https://nanopdf.com/download/
+ technical-iec-specification-ts-62351-1_pdf>.
+
+ [Library] "Devices Dumps Library",
+ <https://networkupstools.org/ddl/>.
+
+ [NUT] "Network UPS Tools, Devices Dumps Library",
+ <https://www.networkupstools.org>.
+
+ [nut-repository]
+ "The Network UPS Tools repository",
+ <https://github.com/networkupstools/nut/>.
+
+ [nut-upsdev]
+ NUT, "Network UPS Tools (NUT) Project Mailing List for
+ Developers", <https://alioth-lists.debian.net/cgi-
+ bin/mailman/listinfo/nut-upsdev>.
+
+ [nut-upsuser]
+ NUT, "Network UPS Tools (NUT) Project Mailing List for
+ Users", <https://alioth-lists.debian.net/cgi-
+ bin/mailman/listinfo/nut-upsuser>.
+
+ [Registry] IANA, "Service Name and Transport Protocol Port Number
+ Registry", <https://www.iana.org/assignments/service-
+ names-port-numbers/service-names-port-numbers.xhtml>.
+
+ [RFC3552] Rescorla, E. and B. Korver, "Guidelines for Writing RFC
+ Text on Security Considerations", BCP 72, RFC 3552,
+ DOI 10.17487/RFC3552, July 2003,
+ <https://www.rfc-editor.org/info/rfc3552>.
+
+ [RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S.,
+ Housley, R., and W. Polk, "Internet X.509 Public Key
+ Infrastructure Certificate and Certificate Revocation List
+ (CRL) Profile", RFC 5280, DOI 10.17487/RFC5280, May 2008,
+ <https://www.rfc-editor.org/info/rfc5280>.
+
+ [RFC7030] Pritikin, M., Ed., Yee, P., Ed., and D. Harkins, Ed.,
+ "Enrollment over Secure Transport", RFC 7030,
+ DOI 10.17487/RFC7030, October 2013,
+ <https://www.rfc-editor.org/info/rfc7030>.
+
+ [RFC7991] Hoffman, P., "The "xml2rfc" Version 3 Vocabulary",
+ RFC 7991, DOI 10.17487/RFC7991, December 2016,
+ <https://www.rfc-editor.org/info/rfc7991>.
+
+ [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol
+ Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018,
+ <https://www.rfc-editor.org/info/rfc8446>.
+
+ [RFC8894] Gutmann, P., "Simple Certificate Enrolment Protocol",
+ RFC 8894, DOI 10.17487/RFC8894, September 2020,
+ <https://www.rfc-editor.org/info/rfc8894>.
+
+ [SGML] Goldfarb, C., "The SGML Handbook", Oxford University
+ Press, ISBN-10 0-19-853737-9, 1990.
+
+ [sgmlnorm] OpenJade Project, "OpenJade Distribution Page",
+ <http://openjade.sourceforge.net/>.
+
+ [stunnel] "Stunnel", <https://www.stunnel.org/>.
+
+Appendix A. Variables
+
+ The UPS variables represent the abstracted state of the UPS unit.
+ Certain variables represent not only the state of some hardware
+ feature but also provide tunable values and Instant Commands; see
+ Section 2.5. The full set of variables is recorded in the reference
+ document for variable names [gitvars].
+
+ The number of variables used in a given deployment depends on the
+ sophistication of the UPS product; this annex shows a typical example
+ of the subset of variables used for a reasonably complete "consumer
+ grade" UPS. The NUT Project maintains a large library of the
+ variable subsets [Library] used by different UPS models.
+
+ Note that successive versions of a given product may add or delete
+ features, causing a change in the subset of variables used. An
+ example is the removal of ups.delay.start from a "consumer grade"
+ UPS. The manufacturer reserves the feature for the "professional"
+ product.
+
+ An implementation of a Management Daemon acting as a utility program
+ may provide a listing of the variables available for a given product,
+ for example, utility program upsc, as included in the NUT package;
+ see Section 2.6, Paragraph 3.
+
+ The following sections illustrate the use of variables by taking the
+ values associated with a typical product. The example is a 1600 Va
+ 1000 W UPS.
+
+A.1. Typical UPS Variables
+
+ +===============================+============+====================+
+ | Variable | Typical | Default |
+ | | Value | Description |
+ +===============================+============+====================+
+ | battery.charge | 100 | "Battery charge |
+ | | | (percent of full)" |
+ +-------------------------------+------------+--------------------+
+ | battery.charge.low | 20 | "Remaining battery |
+ | | | level when UPS |
+ | | | switches to LB |
+ | | | (percent)" |
+ +-------------------------------+------------+--------------------+
+ | battery.runtime | 1481 | "Battery runtime |
+ | | | (seconds)" |
+ +-------------------------------+------------+--------------------+
+ | battery.type | PbAc | "Battery |
+ | | | chemistry" |
+ +-------------------------------+------------+--------------------+
+ | device.mfr | Example | "" |
+ | | Mfg | |
+ +-------------------------------+------------+--------------------+
+ | device.model | Economy | "" |
+ | | 1600 | |
+ +-------------------------------+------------+--------------------+
+ | device.serial | 1234567890 | "" |
+ +-------------------------------+------------+--------------------+
+ | device.type | ups | "" |
+ +-------------------------------+------------+--------------------+
+ | driver.name | usbhid-ups | "Driver name" |
+ +-------------------------------+------------+--------------------+
+ | driver.parameter.lowbatt | 37 | "Driver parameter: |
+ | | | <name>" |
+ +-------------------------------+------------+--------------------+
+ | driver.parameter.offdelay | 30 | "Driver parameter: |
+ | | | <name>" |
+ +-------------------------------+------------+--------------------+
+ | driver.parameter.ondelay | 40 | "Driver parameter: |
+ | | | <name>" |
+ +-------------------------------+------------+--------------------+
+ | driver.parameter.pollfreq | 30 | "Driver parameter: |
+ | | | <name>" |
+ +-------------------------------+------------+--------------------+
+ | driver.parameter.pollinterval | 2 | "Driver parameter: |
+ | | | <name>" |
+ +-------------------------------+------------+--------------------+
+ | driver.parameter.port | auto | "Driver parameter: |
+ | | | <name>" |
+ +-------------------------------+------------+--------------------+
+ | driver.parameter.synchronous | no | "Driver parameter: |
+ | | | <name>" |
+ +-------------------------------+------------+--------------------+
+ | driver.parameter.vendorid | 0999 | "Driver parameter: |
+ | | | <name>" |
+ +-------------------------------+------------+--------------------+
+ | driver.version | 2.8.0 | "Driver version - |
+ | | | NUT release" |
+ +-------------------------------+------------+--------------------+
+ | driver.version.data | HID 1.39 | "" |
+ +-------------------------------+------------+--------------------+
+ | driver.version.internal | 0.41 | "Internal driver |
+ | | | version" |
+ +-------------------------------+------------+--------------------+
+ | input.transfer.high | 264 | "High voltage |
+ | | | transfer point |
+ | | | (V)" |
+ +-------------------------------+------------+--------------------+
+ | input.transfer.low | 184 | "Low voltage |
+ | | | transfer point |
+ | | | (V)" |
+ +-------------------------------+------------+--------------------+
+ | outlet.1.desc | PowerShare | "Outlet |
+ | | Outlet 1 | description" |
+ +-------------------------------+------------+--------------------+
+ | outlet.1.id | 2 | "Outlet system |
+ | | | identifier" |
+ +-------------------------------+------------+--------------------+
+ | outlet.1.status | on | "Outlet switch |
+ | | | status" |
+ +-------------------------------+------------+--------------------+
+ | outlet.1.switchable | no | "Outlet switch |
+ | | | ability" |
+ +-------------------------------+------------+--------------------+
+ | outlet.2.desc | PowerShare | "Outlet |
+ | | Outlet 2 | description" |
+ +-------------------------------+------------+--------------------+
+ | outlet.2.id | 3 | "Outlet system |
+ | | | identifier" |
+ +-------------------------------+------------+--------------------+
+ | outlet.2.status | on | "Outlet switch |
+ | | | status" |
+ +-------------------------------+------------+--------------------+
+ | outlet.2.switchable | no | "Outlet switch |
+ | | | ability" |
+ +-------------------------------+------------+--------------------+
+ | outlet.desc | Main | "Outlet |
+ | | Outlet | description" |
+ +-------------------------------+------------+--------------------+
+ | outlet.id | 1 | "Outlet system |
+ | | | identifier" |
+ +-------------------------------+------------+--------------------+
+ | outlet.power | 25 | "" |
+ +-------------------------------+------------+--------------------+
+ | outlet.switchable | no | "Outlet switch |
+ | | | ability" |
+ +-------------------------------+------------+--------------------+
+ | output.frequency.nominal | 50 | "Nominal output |
+ | | | frequency (Hz)" |
+ +-------------------------------+------------+--------------------+
+ | output.voltage | 230.0 | "Output voltage |
+ | | | (V)" |
+ +-------------------------------+------------+--------------------+
+ | output.voltage.nominal | 230 | "Nominal output |
+ | | | voltage (V)" |
+ +-------------------------------+------------+--------------------+
+ | ups.beeper.status | enabled | "UPS beeper |
+ | | | status" |
+ +-------------------------------+------------+--------------------+
+ | ups.delay.shutdown | 20 | "Interval to wait |
+ | | | after shutdown |
+ | | | with delay command |
+ | | | (seconds)" |
+ +-------------------------------+------------+--------------------+
+ | ups.delay.start | 30 | "Interval to wait |
+ | | | before |
+ | | | (re)starting the |
+ | | | load (seconds)" |
+ +-------------------------------+------------+--------------------+
+ | ups.firmware | 02 | "UPS firmware" |
+ +-------------------------------+------------+--------------------+
+ | ups.load | 20 | "Load on UPS |
+ | | | (percent of full)" |
+ +-------------------------------+------------+--------------------+
+ | ups.mfr | Example | "UPS manufacturer" |
+ | | Mfg | |
+ +-------------------------------+------------+--------------------+
+ | ups.model | Economy | "UPS model" |
+ | | 1600 | |
+ +-------------------------------+------------+--------------------+
+ | ups.power.nominal | 1600 | "UPS power rating |
+ | | | (VA)" |
+ +-------------------------------+------------+--------------------+
+ | ups.productid | ffff | "Product ID for |
+ | | | USB devices" |
+ +-------------------------------+------------+--------------------+
+ | ups.serial | 000000000 | "UPS serial |
+ | | | number" |
+ +-------------------------------+------------+--------------------+
+ | ups.status | OL | "UPS status" |
+ +-------------------------------+------------+--------------------+
+ | ups.temperature | 27 | "UPS temperature |
+ | | | (C)" |
+ +-------------------------------+------------+--------------------+
+ | ups.timer.shutdown | 0 | "Time before the |
+ | | | load will be |
+ | | | shutdown |
+ | | | (seconds)" |
+ +-------------------------------+------------+--------------------+
+ | ups.timer.start | 0 | "Time before the |
+ | | | load will be |
+ | | | started (seconds)" |
+ +-------------------------------+------------+--------------------+
+ | ups.vendorid | 0999 | "Vendor ID for USB |
+ | | | devices" |
+ +-------------------------------+------------+--------------------+
+
+ Table 6: Typical UPS Variables
+
+A.2. Typical UPS Readable and Writable Variables
+
+ Some of the features of a UPS are represented by variables that may
+ be tuned by the user. The following variables are typical of such
+ tunable features. The precise list depends on the model of UPS. An
+ implementation of a Management Daemon acting as a utility program may
+ provide a listing of the variables available, as well as acting on
+ them, for example, utility program upsrw, as included in the NUT
+ package; see Section 2.6, Paragraph 3.
+
+ +========================+============+=========================+
+ | Variable | Typical | Default Description |
+ | | Value | Provided as Response to |
+ | | | the Command GET DESC |
+ +========================+============+=========================+
+ | battery.charge.low | 20 | "Remaining battery |
+ | | | level when UPS switches |
+ | | | to LB (percent)" |
+ +------------------------+------------+-------------------------+
+ | input.transfer.high | 264 | "High voltage transfer |
+ | | | point (V)" |
+ +------------------------+------------+-------------------------+
+ | input.transfer.low | 184 | "Low voltage transfer |
+ | | | point (V)" |
+ +------------------------+------------+-------------------------+
+ | outlet.1.desc | PowerShare | "Outlet description" |
+ | | Outlet 1 | |
+ +------------------------+------------+-------------------------+
+ | outlet.2.desc | PowerShare | "Outlet description" |
+ | | Outlet 2 | |
+ +------------------------+------------+-------------------------+
+ | outlet.2.switchable | no | "Outlet switch ability" |
+ +------------------------+------------+-------------------------+
+ | outlet.desc | Main | "Outlet description" |
+ | | Outlet | |
+ +------------------------+------------+-------------------------+
+ | outlet.power | 25 | "Description |
+ | | | unavailable" |
+ +------------------------+------------+-------------------------+
+ | output.voltage.nominal | 230 | "Nominal output voltage |
+ | | | (V)" |
+ +------------------------+------------+-------------------------+
+ | ups.delay.shutdown | 20 | "Interval to wait after |
+ | | | shutdown with delay |
+ | | | command (seconds)" |
+ +------------------------+------------+-------------------------+
+ | ups.delay.start | 30 | "Interval to wait |
+ | | | before (re)starting the |
+ | | | load (seconds)" |
+ +------------------------+------------+-------------------------+
+
+ Table 7: Typical Readable and Writable UPS Variables
+
+A.3. Typical UPS Instant Commands
+
+ Some of the features of a UPS are actions known as Instant Commands
+ (see Section 2.5), which may be ordered by the user. The following
+ variables represent such Instant Commands. The precise list depends
+ on the model of UPS. An implementation of a Management Daemon acting
+ as a utility program may provide a listing of the variables
+ available, as well as acting on them, for example, utility program
+ upscmd, as included in the NUT package; see Section 2.6, Paragraph 3.
+
+ +==================+==========================================+
+ | Command | Meaning |
+ +==================+==========================================+
+ | beeper.disable | Disable the UPS beeper |
+ +------------------+------------------------------------------+
+ | beeper.enable | Enable the UPS beeper |
+ +------------------+------------------------------------------+
+ | beeper.mute | Temporarily mute the UPS beeper |
+ +------------------+------------------------------------------+
+ | load.off | Turn off the load immediately |
+ +------------------+------------------------------------------+
+ | load.off.delay | Turn off the load with a delay (seconds) |
+ +------------------+------------------------------------------+
+ | load.on | Turn on the load immediately |
+ +------------------+------------------------------------------+
+ | load.on.delay | Turn on the load with a delay (seconds) |
+ +------------------+------------------------------------------+
+ | shutdown.return | Turn off the load and return when power |
+ | | is back |
+ +------------------+------------------------------------------+
+ | shutdown.stayoff | Turn off the load and remain off |
+ +------------------+------------------------------------------+
+ | shutdown.stop | Stop a shutdown in progress |
+ +------------------+------------------------------------------+
+
+ Table 8: Typical Instant Commands
+
+Appendix B. The Shutdown Story for System and UPS
+
+ This appendix provides background material helpful for a general
+ understanding of the relation between system and UPS. It does not
+ define any feature of the command-response protocol.
+
+ We consider the steps involved in the shutdown and restart of a long-
+ running unattended server protected by a single UPS. The Management
+ Daemon runs in the server as shown in Figure 8.
+
+ ,------------------SERVER------------------,
+ | | |
+ ,-----, | UPS <-Commands UPS |
+ | UPS |---| Attachment | Management |
+ | |===| Daemon Responses-> Daemon |
+ /-----\ '--------------------'---------------------'
+ Internal
+ loopback
+
+ Figure 8: Long-Running Unattended Server
+
+ 1. _The public power supply is on._ The system runs normally.
+ Every 5 seconds, variable ups.status reports OL. _Days, weeks,
+ months go by..._
+
+ 2. _Winter storm. Tree falls on power lines. The public power
+ supply fails._ The server remains operational, running on the
+ UPS battery. The Management Daemon polls the Attachment Daemon
+ and detects status change OL->OB.
+
+ 3. The Management Daemon logs warning messages. The server is
+ still operational, running on the UPS battery. _Minutes go
+ by..._
+
+ 4. The battery discharges below the level specified by variable
+ battery.charge.low. The server remains operational, but the UPS
+ battery will not last much longer. The Management Daemon polls
+ the Attachment Daemon and detects status change OB->OB+LB.
+
+ 5. The Management Daemon logs the low battery event.
+
+ 6. The Management Daemon decides to call for a system shutdown. It
+ sets status FSD in the Attachment Daemon to call on any
+ Secondaries to shut down and waits for command GET NUMATTACH to
+ report one single attachment, i.e., the Primary itself. The
+ Management Daemon then issues the system shutdown command for
+ itself.
+
+ 7. The operating system's shutdown process takes over. During the
+ system shutdown, a specific script to the NUT Project or an
+ equivalent system service unit runs the command upsdrvctl
+ shutdown. This tells the UPS that it is to shut down N seconds
+ later where the default is N=20. Note that the "shutdown" of a
+ UPS removes power from the outlet sockets but may not turn the
+ UPS off completely. A delayed shutdown is sometimes audible,
+ and the characteristic beeping of the UPS stops.
+
+ 8. The system shuts down and powers down, hopefully before the N=20
+ seconds have passed.
+
+ 9. _N seconds after item 7_ The UPS shuts down, i.e., it turns off
+ its outlet sockets when N=20 seconds have passed. With some UPS
+ units, there is an audible "clunk".
+
+ What if the public power supply returns before the UPS shuts
+ down? The UPS unit should be able to wait a configurable time
+ with default 30 seconds. These two timers start from the moment
+ the UPS receives the upsdrvctl shutdown command. _Minutes,
+ hours, days go by..._
+
+ 10. _Some time later, maybe much later, the public power supply
+ returns._ The UPS reconnects its outlets to send power to the
+ protected system.
+
+ 11. The system BIOS option "Restore power on AC return" or "Restore
+ to previous state" has hopefully been selected and the system
+ powers up. The bootstrap process of the operating system
+ begins.
+
+ 12. The operating system starts the Attachment Daemon and the
+ Management Daemon. The Attachment Daemon starts the Driver and
+ scans the UPS. The UPS status becomes OL+LB.
+
+ 13. After some time, the battery charges above the
+ battery.charge.low threshold, and the Attachment Daemon declares
+ the status change OL+LB->OL. We are now back in the same
+ situation as item 1 above.
+
+Appendix C. Technical Terms: Historical Differences
+
+ This appendix lists the major differences between the technical terms
+ used in NUT software release 2.8.0 and documented in this text, as
+ well as those used in previous version 2.7.4 of the NUT Project.
+
+ +===================+========================+===========+
+ | Term in Previous | Term in this Document, | Reference |
+ | Release NUT 2.7.4 | Release NUT 2.8.0 | |
+ +===================+========================+===========+
+ | ALREADY-LOGGED-IN | ALREADY-ATTACHED | Table 3 |
+ +-------------------+------------------------+-----------+
+ | ALREADY-SSL-MODE | TLS-ALREADY-ENABLED | Table 3 |
+ +-------------------+------------------------+-----------+
+ | LOGIN | ATTACH | Section |
+ | | | 4.2.1 |
+ +-------------------+------------------------+-----------+
+ | LOGOUT | DETACH | Section |
+ | | | 4.2.2 |
+ +-------------------+------------------------+-----------+
+ | Master | Primary | Section |
+ | | | 2.7 |
+ +-------------------+------------------------+-----------+
+ | NETVER | PROTVER | Section |
+ | | | 4.2.10 |
+ +-------------------+------------------------+-----------+
+ | NUMLOGINS | NUMATTACH | Section |
+ | | | 4.2.4.3 |
+ +-------------------+------------------------+-----------+
+ | Slave | Secondary | Section |
+ | | | 2.8 |
+ +-------------------+------------------------+-----------+
+
+ Table 9: Technical Terms: Historical Differences
+
+Appendix D. Security Defenses in Release 2.7.4
+
+ Previous NUT version 2.7.4 did not provide support for TLS 1.3
+ [RFC8446]. The following subsections describe mitigating techniques.
+
+D.1. Shims
+
+ Previous version 2.7.4 of NUT did not support TLS 1.3 [RFC8446].
+ Where such protection is needed for version 2.7.4, a possible
+ technique introduces shims between the Attachment Daemon and the
+ network and between the network and the Management Daemon, as shown
+ in Figure 9. These shims provide TLS 1.3 support, thus allowing the
+ Attachment Daemon and Management Daemon to continue temporarily
+ without having TLS implementations themselves. The technique has
+ been successfully tested.
+
+ TLS shim listens TLS shim listens
+ on port TBD1/TCP on port 3493/TCP
+ ,-----,------------,----, ,----,--------------,
+ | UPS - Attachment |TLS | <-STARTTLS | TLS| Management |
+ | | Daemon |shim| OK--> |shim| Daemon |
+ /-----'------------'----\ '----'--------------'
+ Listens on
+ port 3493/TCP
+
+ Figure 9: Shims Provide TLS Support During Migration
+
+D.1.1. Attachment Daemon Shim
+
+ The shim in front of the Attachment Daemon listens to incoming
+ traffic on port TBD1/TCP. When it receives the command STARTTLS, it:
+
+ 1. returns OK to the client and sets up TLS encapsulation.
+ 2. does not send STARTTLS to the Attachment Daemon port 3493/TCP.
+
+ All other commands and responses are passed through.
+
+ Note: Port TBD1/TCP is not specified by this text.
+
+D.1.2. Management Daemon Shim
+
+ The shim in front of the Management Daemon listens for incoming
+ traffic on port 3493/TCP. When it receives the command STARTTLS, it:
+
+ 1. returns FEATURE-NOT-CONFIGURED to the client.
+ 2. sends STARTTLS to the Attachment Daemon on port TBD1/TCP.
+
+ All other commands and responses are passed through.
+
+D.2. TLS Tunnels
+
+ Another technique is the use of TLS tunnels [RFC8446], using a
+ software, such as stunnel [stunnel], which adds OpenSSL-based TLS
+ support without modifying the Attachment Daemon or Management Daemon.
+ The NUT Project has no procedure to enforce this on sites.
+
+D.3. VPN
+
+ A further option to secure communications is very similar to TLS
+ tunneling [RFC8446] and consists of routing the NUT traffic through a
+ Virtual Private Network (VPN).
+
+D.4. VLAN
+
+ A fourth option is to isolate the UPS management traffic at the
+ network switching level using a Virtual LAN (VLAN) technique.
+
+ ,-------------, ,-------------,
+ ,-----, | Attachment | | Management |
+ | UPS |---| Daemon | | Daemon |
+ | | |-------------| UPS |-------------|
+ | |===| | Management | UPS |
+ /-----\ | Protected |~~~~~~~~~~~~~~~| Management |
+ | Server | VLAN | Client |
+ | | '-------------'
+ '-------------'
+ Production | VLAN
+ ,---|-------,
+ ,-----------,|
+ ,-----------,|'
+ | Clients |'
+ '-----------'
+
+ Figure 10: UPS Management Protocol Runs over Its Own VLAN
+
+ In Figure 10, there are two VLANS: the main traffic between the
+ protected server and its clients using the production VLAN. The UPS
+ management traffic between the Attachment and Management Daemons uses
+ the UPS management VLAN marked as ~~~~~~~~~~~~~.
+
+Appendix E. Administrative Security
+
+ Administrative commands, such as FSD, INSTCMD, and SET, are powerful
+ and can have a deep effect on system integrity. For example, the
+ command FSD is involved in mission-critical system shutdown
+ decisions. Access to them needs to be managed and restricted. This
+ section presents the current practice.
+
+E.1. Management of Administrative Users
+
+ The Attachment Daemon maintains a file (currently upsd.users) that
+ defines each administrative user. Note that these users are
+ independent of those recorded in file /etc/passwd. Each
+ administrative user gets its own section in file upsd.users. The
+ declarations in that section set the parameters that define that
+ user's privileges. The section begins with the name of the user
+ enclosed in square brackets, opening bracket ([) and closing bracket
+ (]), and continues until the next username in brackets or EOF.
+
+ For example, the following file declares two administrative users,
+ admin and pfy:
+
+ [admin]
+ password = sekret
+ upsmon master
+ actions = SET
+ instcmds = ALL
+ [pfy]
+ password = sekret
+ instcmds = test.panel.start
+ instcmds = test.panel.stop
+
+ Within each section, the administrative user declarations are:
+
+ +=============+==========================================+
+ | Declaration | Meaning |
+ +=============+==========================================+
+ | actions | Allow the user to do certain things in |
+ | | the Attachment Daemon. To specify |
+ | | multiple actions, use multiple instances |
+ | | of the declaration. Valid actions are: |
+ | | |
+ | | * FSD Set the "Forced Shutdown" flag |
+ | | for this UPS. See Section 4.2.3. |
+ | | |
+ | | * SET Change the value of a UPS |
+ | | variable. See Section 4.2.11. |
+ +-------------+------------------------------------------+
+ | instcmds | Let a user initiate specific Instant |
+ | | Commands. See Section 4.2.6. Use value |
+ | | ALL to grant all commands automatically. |
+ | | To specify multiple commands, use |
+ | | multiple instances of the instcmds |
+ | | field. For the full list of what a |
+ | | given UPS supports, use client upscmd -l |
+ | | supplied by the NUT Project. The LIST |
+ | | CMD command is issued within the client |
+ | | upscmd. |
+ +-------------+------------------------------------------+
+ | password | Set the password for this user. _Your |
+ | | password should be more secure than the |
+ | | examples shown._ |
+ +-------------+------------------------------------------+
+ | upsmon | Add the necessary actions for a |
+ | | Management Daemon to process a system |
+ | | shutdown. In current practice, the |
+ | | value is still master or slave. Note |
+ | | that there is no EQUALS =. |
+ +-------------+------------------------------------------+
+
+ Table 10: Administrative User Declarations
+
+E.2. An Administrative User of a Client Management Daemon
+
+ The following examples show the current security practices for
+ administrative users of a client Management Daemon. They also
+ illustrate the command pair USERNAME and PASSWORD. See Sections
+ 4.2.13 and 4.2.8.
+
+E.2.1. An Administrative User Logs into a Short Session
+
+ In this simple example of current practice, the system administrator
+ sets the battery level at which an Attachment Daemon will raise the
+ status LB, represented by variable battery.charge.low, to 35% of full
+ charge. A system administrator types the following command to call
+ the client upsrw supplied by the NUT Project.
+
+ upsrw -s battery.charge.low=35 -u admin -p sekret UPS-1@example.com
+
+ Option -s specifies the variable and the value, option -u specifies
+ the USERNAME, option -p specifies the PASSWORD, and UPS-1@example.com
+ is the UPS. The USERNAME and PASSWORD commands are issued within the
+ client upsrw, and the session is of short duration.
+
+ Note: Your password should be stronger than the example shown.
+
+E.2.2. An Administrative User Logs into a Long Session
+
+ In this second example of current practice, the long-running
+ Management Daemon upsmon, which is responsible for initiating system
+ shutdowns and which is provided by the NUT Project, issues commands
+ USERNAME and PASSWORD when it starts up. The data values needed for
+ the USERNAME and PASSWORD commands are provided by a configuration
+ file upsmon.conf, which contains the line:
+
+ MONITOR UPS-1@example.com 1 admin sekret master
+
+ This says that the UPS to be monitored is UPS-1@example.com. It
+ provides 1 single power supply. The administrative user is admin
+ with password sekret. The Management Daemon acts as a Primary,
+ although current practice still uses the former term master.
+
+ The USERNAME and PASSWORD commands are contained within the client
+ upsmon, and the session is of long duration.
+
+Acknowledgments
+
+ This document is based on the NUT Project documentation [devguide].
+ The editor acknowledges the work of Charles Lepple, Arjen de Korte,
+ Arnaud Quette, Jim Klimov, Russell Kroll, Manuel Wolfshant, Greg
+ Troxel, Mark Hansen, and many others who contribute to the
+ nut-upsuser [nut-upsuser] and nut-upsdev [nut-upsdev] mailing lists.
+
+ Earlier draft versions of this document were prepared using an SGML
+ DTD [SGML] and an XML meta-DTD defined by HyTime Annex A [HyTimeA].
+ Unlike XML, SGML offers markup minimization, and the earlier drafts
+ took advantage of this. The osgmlnorm [sgmlnorm] program generated
+ the XML that was used as input to xml2rfc [RFC7991], which then
+ created the document's current source. The editor acknowledges the
+ help received from Carsten Bormann and Julian Reschke in the xml2rfc
+ mailing list.
+
+ Many helpful comments were received from Eliot Lear, Bart Smit, David
+ Zomaya, Joyce Norris, and Ted Mittelstaedt.
+
+Author's Address
+
+ Roger Price (editor)
+ Network UPS Tools Project
+ France
+ Email: ietf@rogerprice.org