init
This commit is contained in:
commit
f3e42189f2
16
README.md
Normal file
16
README.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# CyberPower Exporter
|
||||||
|
|
||||||
|
Export UPS data via HTTP for prometheus service
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
|
||||||
|
- [Bun](https://bun.sh)
|
||||||
|
|
||||||
|
### Instructions
|
||||||
|
|
||||||
|
1. Download the [PowerPanel](https://cyberpower.com/global/en/product/sku/powerpanel_for_linux#downloads)
|
||||||
|
2. Install the package: `sudo dpkg -i powerpanel.deb`
|
||||||
|
3. Install the service:
|
||||||
|
4. Start service automatically: `sudo systemctl enable power-exporter && sudo systemctl start power-exporter`
|
29
install.sh
Executable file
29
install.sh
Executable file
@ -0,0 +1,29 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$UID" != "0" ]; then
|
||||||
|
echo "Please run as root"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install UPS driver
|
||||||
|
if [ -z "$(which pwrstat)" ]; then
|
||||||
|
echo "Installing Power Panel..."
|
||||||
|
dpkg -i powerpanel.deb
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Setup exporter
|
||||||
|
echo "Installing Exporter..."
|
||||||
|
cp power-exporter.js /usr/local/bin/power-exporter.js
|
||||||
|
chmod +x /usr/local/bin/power-exporter.js
|
||||||
|
|
||||||
|
# Setup service
|
||||||
|
echo "Stting Up Service..."
|
||||||
|
cp power-exporter.service /etc/systemd/system/power-exporter.service
|
||||||
|
chmod +x /etc/systemd/system/power-exporter.service
|
||||||
|
systemctl enable power-exporter
|
||||||
|
systemctl restart power-exporter
|
||||||
|
|
||||||
|
echo "Done!"
|
||||||
|
sleep 1
|
||||||
|
echo ""
|
||||||
|
journalctl -u power-exporter -n 1
|
39
power-exporter.js
Executable file
39
power-exporter.js
Executable file
@ -0,0 +1,39 @@
|
|||||||
|
import { $ } from 'bun';
|
||||||
|
import http from 'http';
|
||||||
|
|
||||||
|
const port = 3000;
|
||||||
|
|
||||||
|
async function scrape() {
|
||||||
|
const data = await $`pwrstat -status`.text();
|
||||||
|
const r = /^\s*(.+?)\.{3,} (.+)$/gm;
|
||||||
|
|
||||||
|
let found, map = {};
|
||||||
|
while(!!(found = r.exec(data)))
|
||||||
|
map[found[1]] = found[2];
|
||||||
|
|
||||||
|
return {
|
||||||
|
model: map["Model Name"],
|
||||||
|
vendor: map["Power Supply by"],
|
||||||
|
state: map["State"],
|
||||||
|
charge: Number(/\d+/g.exec(map["Battery Capacity"])[0]) / 100,
|
||||||
|
remaining: map["Remaining Runtime"],
|
||||||
|
rated_voltage: Number(/\d+/g.exec(map["Rating Voltage"])[0]),
|
||||||
|
rated_wattage: Number(/\d+/g.exec(map["Rating Power"])[0]),
|
||||||
|
input_voltage: Number(/\d+/g.exec(map["Utility Voltage"])[0]),
|
||||||
|
output_voltage: Number(/\d+/g.exec(map["Output Voltage"])[0]),
|
||||||
|
load_wattage: Number(/\d+/g.exec(map["Load"])[0]),
|
||||||
|
load_percentage: Number(/(\d+) %/g.exec(map["Load"])[1]) / 100,
|
||||||
|
last_test: map["Test Result"],
|
||||||
|
last_outage: map["Last Power Event"],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function format(a) {
|
||||||
|
return Object.entries(a).map(([key, value]) => `${key} ${typeof value == 'string' ? `"${value}"` : value}`).join('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
http.createServer(async (req, res) => {
|
||||||
|
res.end(format(await scrape()));
|
||||||
|
}).listen(port, () => {
|
||||||
|
console.log(`Exporter running on http://localhost:${port}`)
|
||||||
|
});
|
10
power-exporter.service
Normal file
10
power-exporter.service
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Export UPS metrics to webpage for scraping
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
ExecStart=/root/.bun/bin/bun /usr/local/bin/power-exporter.js
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
BIN
powerpanel.deb
Normal file
BIN
powerpanel.deb
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user