parent
ea0310548a
commit
639c608744
@ -0,0 +1,31 @@
|
|||||||
|
import classNames from "classnames";
|
||||||
|
import prettyBytes from "pretty-bytes";
|
||||||
|
|
||||||
|
export default function Pool({ name, free, allocated, healthy }) {
|
||||||
|
const total = free + allocated;
|
||||||
|
const usedPercent = Math.round((allocated / total) * 100);
|
||||||
|
const statusColor = healthy ? "bg-green-500" : "bg-yellow-500";
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="flex flex-row text-theme-700 dark:text-theme-200 items-center text-xs relative h-5 w-full rounded-md bg-theme-200/50 dark:bg-theme-900/20 mt-1">
|
||||||
|
<div
|
||||||
|
className="absolute h-5 rounded-md bg-theme-200 dark:bg-theme-900/40 z-0"
|
||||||
|
style={{
|
||||||
|
width: `${usedPercent}%`,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<span className="ml-2 h-2 w-2 z-10">
|
||||||
|
<span className={classNames("block w-2 h-2 rounded", statusColor)} />
|
||||||
|
</span>
|
||||||
|
<div className="text-xs z-10 self-center ml-2 relative h-4 grow mr-2">
|
||||||
|
<div className="absolute w-full whitespace-nowrap text-ellipsis overflow-hidden text-left">{name}</div>
|
||||||
|
</div>
|
||||||
|
<div className="self-center text-xs flex justify-end mr-1.5 pl-1 z-10 text-ellipsis overflow-hidden whitespace-nowrap">
|
||||||
|
<span>
|
||||||
|
{prettyBytes(allocated)} / {prettyBytes(total)}
|
||||||
|
</span>
|
||||||
|
<span className="pl-2 w-12 text-center">({usedPercent}%)</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
import getServiceWidget from "utils/config/service-helpers";
|
||||||
|
import createLogger from "utils/logger";
|
||||||
|
import genericProxyHandler from "utils/proxy/handlers/generic";
|
||||||
|
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
||||||
|
|
||||||
|
const logger = createLogger("truenasProxyHandler");
|
||||||
|
|
||||||
|
export default async function truenasProxyHandler(req, res, map) {
|
||||||
|
const { group, service } = req.query;
|
||||||
|
|
||||||
|
if (group && service) {
|
||||||
|
const widgetOpts = await getServiceWidget(group, service);
|
||||||
|
let handler;
|
||||||
|
if (widgetOpts.username && widgetOpts.password) {
|
||||||
|
handler = genericProxyHandler;
|
||||||
|
} else if (widgetOpts.key) {
|
||||||
|
handler = credentialedProxyHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (handler) {
|
||||||
|
return handler(req, res, map);
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.error("Error getting data from Truenas: Username / password or API key required");
|
||||||
|
return res.status(500).json({ error: "Username / password or API key required" });
|
||||||
|
}
|
||||||
|
|
||||||
|
return res.status(500).json({ error: "Error parsing widget request" });
|
||||||
|
}
|
Loading…
Reference in new issue