mirror of
				https://github.com/karl0ss/homepage.git
				synced 2025-11-04 08:20:58 +00:00 
			
		
		
		
	Merge pull request #335 from JazzFisch/add-proxmox-widget
Add Proxmox widget
This commit is contained in:
		
						commit
						65c5828456
					
				@ -185,5 +185,11 @@
 | 
			
		||||
        "users": "Users",
 | 
			
		||||
        "loginsLast24H": "Logins (24h)",
 | 
			
		||||
        "failedLoginsLast24H": "Failed Logins (24h)"
 | 
			
		||||
    },
 | 
			
		||||
    "proxmox": {
 | 
			
		||||
        "mem": "MEM",
 | 
			
		||||
        "cpu": "CPU",
 | 
			
		||||
        "lxc": "LXC",
 | 
			
		||||
        "vms": "VMs"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -29,6 +29,8 @@ export default async function credentialedProxyHandler(req, res) {
 | 
			
		||||
        headers["X-gotify-Key"] = `${widget.key}`;
 | 
			
		||||
      } else if (widget.type === "authentik") {
 | 
			
		||||
        headers.Authorization = `Bearer ${widget.key}`;
 | 
			
		||||
      } else if (widget.type === "proxmox") {
 | 
			
		||||
        headers.Authorization = `PVEAPIToken=${widget.username}=${widget.password}`;
 | 
			
		||||
      } else {
 | 
			
		||||
        headers["X-API-Key"] = `${widget.key}`;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
@ -20,6 +20,7 @@ const components = {
 | 
			
		||||
  pihole: dynamic(() => import("./pihole/component")),
 | 
			
		||||
  portainer: dynamic(() => import("./portainer/component")),
 | 
			
		||||
  prowlarr: dynamic(() => import("./prowlarr/component")),
 | 
			
		||||
  proxmox: dynamic(() => import("./proxmox/component")),
 | 
			
		||||
  qbittorrent: dynamic(() => import("./qbittorrent/component")),
 | 
			
		||||
  radarr: dynamic(() => import("./radarr/component")),
 | 
			
		||||
  readarr: dynamic(() => import("./readarr/component")),
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										53
									
								
								src/widgets/proxmox/component.jsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								src/widgets/proxmox/component.jsx
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,53 @@
 | 
			
		||||
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";
 | 
			
		||||
 | 
			
		||||
function calcRunning(total, current) {
 | 
			
		||||
  return current.status === "running" ? total + 1 : total;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default function Component({ service }) {
 | 
			
		||||
  const { t } = useTranslation();
 | 
			
		||||
 | 
			
		||||
  const { widget } = service;
 | 
			
		||||
 | 
			
		||||
  const { data: clusterData, error: clusterError } = useWidgetAPI(widget, "cluster/resources");
 | 
			
		||||
 | 
			
		||||
  if (clusterError) {
 | 
			
		||||
    return <Container error={t("widget.api_error")} />;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (!clusterData || !clusterData.data) {
 | 
			
		||||
    return (
 | 
			
		||||
      <Container service={service}>
 | 
			
		||||
        <Block label="proxmox.vms" />
 | 
			
		||||
        <Block label="proxmox.lxc" />
 | 
			
		||||
        <Block label="proxmox.cpu" />
 | 
			
		||||
        <Block label="proxmox.ram" />
 | 
			
		||||
      </Container>
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const { data } = clusterData ;
 | 
			
		||||
  const vms = data.filter(item => item.type === "qemu") || [];
 | 
			
		||||
  const lxc = data.filter(item => item.type === "lxc") || [];
 | 
			
		||||
  const nodes = data.filter(item => item.type === "node") || [];
 | 
			
		||||
 | 
			
		||||
  const runningVMs = vms.reduce(calcRunning, 0);
 | 
			
		||||
  const runningLXC = lxc.reduce(calcRunning, 0);
 | 
			
		||||
 | 
			
		||||
  // TODO: support more than one node
 | 
			
		||||
  // TODO: better handling of cluster with zero nodes
 | 
			
		||||
  const node = nodes.length > 0 ? nodes[0] : { cpu: 0.0, mem: 0, maxmem: 0 };
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <Container service={service}>
 | 
			
		||||
      <Block label="proxmox.vms" value={`${runningVMs} / ${vms.length}`} />
 | 
			
		||||
      <Block label="proxmox.lxc" value={`${runningLXC} / ${lxc.length}`} />
 | 
			
		||||
      <Block label="proxmox.cpu" value={t("common.percent", { value: (node.cpu * 100) })} />
 | 
			
		||||
      <Block label="proxmox.mem" value={t("common.percent", { value: ((node.mem / node.maxmem) * 100) })} />
 | 
			
		||||
    </Container>
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										14
									
								
								src/widgets/proxmox/widget.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/widgets/proxmox/widget.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,14 @@
 | 
			
		||||
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
 | 
			
		||||
 | 
			
		||||
const widget = {
 | 
			
		||||
  api: "{url}/api2/json/{endpoint}",
 | 
			
		||||
  proxyHandler: credentialedProxyHandler,
 | 
			
		||||
 | 
			
		||||
  mappings: {
 | 
			
		||||
    "cluster/resources": {
 | 
			
		||||
      endpoint: "cluster/resources",
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export default widget;
 | 
			
		||||
@ -15,6 +15,7 @@ import overseerr from "./overseerr/widget";
 | 
			
		||||
import pihole from "./pihole/widget";
 | 
			
		||||
import portainer from "./portainer/widget";
 | 
			
		||||
import prowlarr from "./prowlarr/widget";
 | 
			
		||||
import proxmox from "./proxmox/widget";
 | 
			
		||||
import qbittorrent from "./qbittorrent/widget";
 | 
			
		||||
import radarr from "./radarr/widget";
 | 
			
		||||
import readarr from "./readarr/widget";
 | 
			
		||||
@ -46,6 +47,7 @@ const widgets = {
 | 
			
		||||
  pihole,
 | 
			
		||||
  portainer,
 | 
			
		||||
  prowlarr,
 | 
			
		||||
  proxmox,
 | 
			
		||||
  qbittorrent,
 | 
			
		||||
  radarr,
 | 
			
		||||
  readarr,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user