> ## Content Index
> Fetch the complete content index at: https://thesoloadmin.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# Monitoring a UPS With nut and lighttpd on Linux - Part 1
- URL: https://thesoloadmin.com/monitoring-your-ups-with-nut/
- Published: 2021-11-04T21:25:47.000Z
- Updated: 2022-06-13T19:59:33.000Z
- Description: We all know the importance of having a battery backup solution for your servers and network equipment; in a small company environment where cost is a factor, the purpose of the battery backup is somewhat different...
- Author: Matt Pogue
- Tags: Linux, Disaster Recovery, Datacenter, UPS, Proxmox, Virtualization, Debian

[CodeProject](https://www.codeproject.com/?ref=thesoloadmin.com)

UPDATE: An astute reader posted the following comment for anyone who may be attempting to implement this solution on a Raspberry Pi running with the pi-hole setup (see [](https://pi-hole.net/?ref=thesoloadmin.com)[https://pi-hole.net/](https://pi-hole.net/?ref=thesoloadmin.com)). The full comment:

> I needed to use the info here: [https://www.reddit.com/r/pihole/comments/hauphd/adding\_apcupsd\_ups\_status\_util\_to\_rpi\_with/](https://www.reddit.com/r/pihole/comments/hauphd/adding%5Fapcupsd%5Fups%5Fstatus%5Futil%5Fto%5Frpi%5Fwith/?ref=thesoloadmin.com) in order to get it fully working. For some reason it wasn't able to launch the .cgi file until I aliased the nut directory. My lighttpd.conf has these differences:

```
server.modules = ( "modaccess", "modaccesslog", "modauth", "modalias", "modexpire", "modredirect", "modrewrite", "modfastcgi", "modsetenv", "modstatus" )

alias.url = ( "/nut" => "/usr/share/nut/www/")

```

> and now nut works with lighttpd + pihole

Thanks Rob!

We all know the importance of having a battery backup solution for your servers and network equipment; in a small company environment where cost is a factor, the purpose of the battery backup is somewhat different. Typically, the goal isn't all day (or even multi-hour) run time, but rather 20 - 30 minutes - long enough to cover short outages and notify and gracefully shut down the equipment in a longer outage. Again, YMMV of course depending on the needs of your organization. The purpose of these articles is to walk through configuring the `nut-server` service on a Proxmox host server and the `nut-client` service on a Linux guest, including email notification and graceful server shutdown for all VM's. 

Recently, I had to replace an aging UPS with a new unit and based on cost, user reviews, and technical capability, I selected the [Tripp Lite SMART1500RM2U](https://www.tripplite.com/smartpro-120v-1.5kva-1.35kw-line-interactive-sine-wave-ups-2u-rack-tower-snmp-card-option-lcd-usb-db9-8-outlets~SMART1500RM2U?ref=thesoloadmin.com). For our purposes we'll assume that our UPS unit is connected via USB to our Proxmox host server named `VMSERVER`. 

1. Before plugging it in, let's start a persistent tail of `/var/log/messages` to ensure that the UPS gets picked up by the operating system. Open a new SSH session to the host and we'll tail the log file, watching for the USB entries. We should see output similar to the following:

```
root@vmserver [~]# tail -f /var/log/messages
Oct 26 09:32:03 vmserver kernel: [149701.226307] usb 1-11: SerialNumber: 3122CVYSM88EC01815
Oct 26 09:32:03 vmserver kernel: [149701.275704] hid-generic 0003:09AE:3015.270B: hiddev0,hidraw0: USB HID v1.10 Device [Tripp Lite  TRIPP LITE SMART1500RM2U ] on usb-0000:00:14.0-11/input0
Oct 26 09:32:17 vmserver kernel: [149715.705236] usb 1-11: USB disconnect, device number 36
Oct 26 09:32:18 vmserver kernel: [149716.051727] usb 1-11: new low-speed USB device number 37 using xhci_hcd
Oct 26 09:32:18 vmserver kernel: [149716.209951] usb 1-11: New USB device found, idVendor=09ae, idProduct=3015, bcdDevice= 2.0a
Oct 26 09:32:18 vmserver kernel: [149716.209960] usb 1-11: New USB device strings: Mfr=2, Product=3, SerialNumber=4
Oct 26 09:32:18 vmserver kernel: [149716.209965] usb 1-11: Product: TRIPP LITE SMART1500RM2U
Oct 26 09:32:18 vmserver kernel: [149716.209969] usb 1-11: Manufacturer: Tripp Lite
Oct 26 09:32:18 vmserver kernel: [149716.209972] usb 1-11: SerialNumber: 3122CVYSM88EC01815
Oct 26 09:32:18 vmserver kernel: [149716.259635] hid-generic 0003:09AE:3015.270C: hiddev0,hidraw0: USB HID v1.10 Device [Tripp Lite  TRIPP LITE SMART1500RM2U ] on usb-0000:00:14.0-11/input0

```

From our log entries above, we can see that the UPS has been recognized by the operating system so we can now install and configure `nut-server` and `nut-client`.

2\. Install `nut`, `nut-client`, `nut-server`, `nut-cgi`, and `lighttpd` using apt-get:

```
root@vmserver [~]# apt-get install nut nut-client nut-server nut-cgi lighttpd
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  libltdl7 libnutscan1 libupsclient4 libusb-0.1-4 lighttpd-mod-deflate lighttpd-mod-openssl spawn-fcgi
Suggested packages:
  rrdtool php-cgi php-fpm apache2-utils lighttpd-doc lighttpd-mod-authn-gssapi lighttpd-mod-authn-pam lighttpd-mod-authn-sasl lighttpd-mod-geoip lighttpd-mod-maxminddb lighttpd-mod-trigger-b4-dl lighttpd-mod-vhostdb-pgsql
  lighttpd-mod-webdav lighttpd-modules-dbi lighttpd-modules-ldap lighttpd-modules-lua lighttpd-modules-mysql nut-monitor nut-ipmi nut-snmp nut-xml
The following NEW packages will be installed:
  libltdl7 libnutscan1 libupsclient4 libusb-0.1-4 lighttpd lighttpd-mod-deflate lighttpd-mod-openssl nut nut-cgi nut-client nut-server spawn-fcgi
0 upgraded, 12 newly installed, 0 to remove and 65 not upgraded.
Need to get 2,360 kB/2,786 kB of archives.
After this operation, 9,075 kB of additional disk space will be used.
Do you want to continue? [Y/n]

```

3\. I configured `nut` using the steps in this article: [](https://techno-tim.github.io/posts/NUT-server-guide/?ref=thesoloadmin.com)[https://techno-tim.github.io/posts/NUT-server-guide/](https://techno-tim.github.io/posts/NUT-server-guide/?ref=thesoloadmin.com). NOTE: If you're not rebooting the server, you'll need to restart `udev` like so: `systemctl restart udev` (it's not mentioned in the article).

4\. Load the CGI module in the lighttpd configuration and restart lighttpd:

```
root@vmserver [/etc/nut]# lighttpd-enable-mod cgi
Enabling cgi: ok
Run "service lighttpd force-reload" to enable changes

root@vmserver [/etc/nut]# service lighttpd force-reload

```

5\. Check the UPS status by visiting http://<server name/IP>/cgi-bin/upsstats.cgi in your browser. You should see a page similar to the following:

![](https://thesoloadmin.com/content/images/2021/10/ups_status_page-1.png)

UPS Status - HTML Page

6\. Now that the nut server is functional, you can install the nut client on the Proxmox guest systems. On Linux, you can install the client with apt-get:

```
root@linuxappserver [~]# apt-get install nut-client
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  bash-completion libupsclient4
Suggested packages:
  nut-monitor
The following NEW packages will be installed:
  bash-completion libupsclient4 nut-client
0 upgraded, 3 newly installed, 0 to remove and 28 not upgraded.
Need to get 673 kB of archives.
After this operation, 2,348 kB of additional disk space will be used.
Do you want to continue? [Y/n]

```

7\. Check the nut server with the `upsc` command:

`upsc tripplite@vmserver ups.status`

You should get output similar to the following:

```
root@linuxappserver [/var/log]# upsc tripplite@vmserver ups.status
Init SSL without certificate database
OL

```

8\. Modify the nut configuration files:

nut.conf:

`MODE=netclient`

upsmon.conf:

```
RUN_AS_USER root

MONITOR tripplite@vmserver.wwf-mgt.com 1 admin secret slave

MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h now"
NOTIFYCMD /usr/sbin/upssched
POLLFREQ 2
POLLFREQALERT 1
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower

NOTIFYMSG ONLINE    "UPS %s on line power"
NOTIFYMSG ONBATT    "UPS %s on battery"
NOTIFYMSG LOWBATT   "UPS %s battery is low"
NOTIFYMSG FSD       "UPS %s: forced shutdown in progress"
NOTIFYMSG COMMOK    "Communications with UPS %s established"
NOTIFYMSG COMMBAD   "Communications with UPS %s lost"
NOTIFYMSG SHUTDOWN  "Auto logout and shutdown proceeding"
NOTIFYMSG REPLBATT  "UPS %s battery needs to be replaced"
NOTIFYMSG NOCOMM    "UPS %s is unavailable"
NOTIFYMSG NOPARENT  "upsmon parent process died - shutdown impossible"

NOTIFYFLAG ONLINE   SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT   SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT  SYSLOG+WALL
NOTIFYFLAG FSD      SYSLOG+WALL+EXEC
NOTIFYFLAG COMMOK   SYSLOG+WALL+EXEC
NOTIFYFLAG COMMBAD  SYSLOG+WALL+EXEC
NOTIFYFLAG SHUTDOWN SYSLOG+WALL+EXEC
NOTIFYFLAG REPLBATT SYSLOG+WALL
NOTIFYFLAG NOCOMM   SYSLOG+WALL+EXEC
NOTIFYFLAG NOPARENT SYSLOG+WALL

RBWARNTIME 43200

NOCOMMWARNTIME 600

FINALDELAY 5

```

That covers the basic setup of server and client for Linux. I will finish addressing the Promox-specific pieces - including email notification and guest shutdown - in part 2 of this article. 

If you have questions about the article or if you're trying to follow along and having problems, I'd be happy to help as best I can. Email me - matt@thesoloadmin.com.