Add Proxmox Backup Server Widget

This commit is contained in:
Eizock 2023-01-25 14:50:34 +00:00
parent 555f9f7b14
commit a8ee4bccba
6 changed files with 84 additions and 1 deletions

View File

@ -433,5 +433,11 @@
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"pbs": {
"datastore_usage": "Datastore",
"failed_tasks": "Failed Tasks",
"cpu_usage": "CPU",
"memory_usage": "Memory"
}
}

View File

@ -20,7 +20,7 @@ export default async function credentialedProxyHandler(req, res, map) {
if (widget) {
const url = new URL(formatApiCall(widgets[widget.type].api, { endpoint, ...widget }));
const headers = {
let headers = {
"Content-Type": "application/json",
};
@ -34,6 +34,9 @@ export default async function credentialedProxyHandler(req, res, map) {
headers.Authorization = `Bearer ${widget.key}`;
} else if (widget.type === "proxmox") {
headers.Authorization = `PVEAPIToken=${widget.username}=${widget.password}`;
} else if (widget.type === "pbs") {
headers = {};
headers.Authorization = `PBSAPIToken=${widget.username}:${widget.password}`;
} else if (widget.type === "autobrr") {
headers["X-API-Token"] = `${widget.key}`;
} else if (widget.type === "tubearchivist") {

View File

@ -37,6 +37,7 @@ const components = {
opnsense: dynamic(() => import("./opnsense/component")),
overseerr: dynamic(() => import("./overseerr/component")),
paperlessngx: dynamic(() => import("./paperlessngx/component")),
pbs: dynamic(() => import("./pbs/component")),
pihole: dynamic(() => import("./pihole/component")),
plex: dynamic(() => import("./plex/component")),
portainer: dynamic(() => import("./portainer/component")),

View File

@ -0,0 +1,49 @@
import { useTranslation } from "next-i18next";
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
const { data: datastoreData, error: datastoreError } = useWidgetAPI(widget, "status/datastore-usage");
const { data: tasksData, error: tasksError } = useWidgetAPI(widget, "nodes/localhost/tasks");
const { data: hostData, error: hostError } = useWidgetAPI(widget, "nodes/localhost/status");
if (datastoreError || tasksError || hostError) {
const finalError = tasksError ?? datastoreError ?? hostError;
return <Container error={finalError} />;
}
if (!datastoreData || !tasksData || !hostData) {
return (
<Container service={service}>
<Block label="pbs.datastore_usage" />
<Block label="pbs.failed_tasks" />
<Block label="pbs.cpu_usage" />
<Block label="pbs.memory_usage" />
</Container>
);
}
const datastoreUsage = datastoreData.data[0].used / datastoreData.data[0].total * 100;
const cpuUsage = hostData.data.cpu * 100;
const memoryUsage = hostData.data.memory.used / hostData.data.memory.total * 100;
let failedTasks = tasksData.total;
if (failedTasks >= 100) {
failedTasks = "99+";
}
return (
<Container service={service}>
<Block label="pbs.datastore_usage" value={t("common.percent", { value: (datastoreUsage)})} />
<Block label="pbs.failed_tasks" value={failedTasks} />
<Block label="pbs.cpu_usage" value={t("common.percent", { value: (cpuUsage)})} />
<Block label="pbs.memory_usage" value={t("common.percent", { value: memoryUsage})} />
</Container>
);
}

22
src/widgets/pbs/widget.js Normal file
View File

@ -0,0 +1,22 @@
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
const since = Date.now() - (24 * 60 * 60 * 1000);
const widget = {
api: "{url}/api2/json/{endpoint}",
proxyHandler: credentialedProxyHandler,
mappings: {
"status/datastore-usage": {
endpoint: "status/datastore-usage",
},
"nodes/localhost/tasks": {
endpoint: `nodes/localhost/tasks?errors=true&limit=100&since=${since}`,
},
"nodes/localhost/status": {
endpoint: "nodes/localhost/status",
},
},
};
export default widget;

View File

@ -31,6 +31,7 @@ import ombi from "./ombi/widget";
import opnsense from "./opnsense/widget";
import overseerr from "./overseerr/widget";
import paperlessngx from "./paperlessngx/widget";
import pbs from "./pbs/widget";
import pihole from "./pihole/widget";
import plex from "./plex/widget";
import portainer from "./portainer/widget";
@ -92,6 +93,7 @@ const widgets = {
opnsense,
overseerr,
paperlessngx,
pbs,
pihole,
plex,
portainer,