diff --git a/public/locales/en/common.json b/public/locales/en/common.json index 63d4dd3b..aa2497c6 100755 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -513,6 +513,16 @@ "origin_ip": "Origin IP", "status": "Status" }, + "pfsenseapi": { + "load": "LOAD AVG", + "memory": "MEM USAGE", + "wanStatus": "WAN Status", + "up": "Up", + "down": "Down", + "temp": "Temp", + "disk": "Disk Usage", + "wanIP": "WAN IP" + }, "proxmoxbackupserver": { "datastore_usage": "Datastore", "failed_tasks_24h": "Failed Tasks 24h", diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js index c38fe47c..80c13544 100644 --- a/src/utils/config/service-helpers.js +++ b/src/utils/config/service-helpers.js @@ -267,7 +267,7 @@ export function cleanServiceGroups(groups) { namespace, // kubernetes widget app, podSelector, - wan, // opnsense widget, + wan, // opnsense widget, pfsenseapi widget enableBlocks, // emby/jellyfin enableNowPlaying, volume, // diskstation widget @@ -299,7 +299,7 @@ export function cleanServiceGroups(groups) { if (app) cleanedService.widget.app = app; if (podSelector) cleanedService.widget.podSelector = podSelector; } - if (type === "opnsense") { + if (type === "opnsense" || type === "pfsenseapi") { if (wan) cleanedService.widget.wan = wan; } if (type === "emby" || type === "jellyfin") { diff --git a/src/widgets/components.js b/src/widgets/components.js index 7aeb8b45..48e09284 100644 --- a/src/widgets/components.js +++ b/src/widgets/components.js @@ -52,6 +52,7 @@ const components = { opnsense: dynamic(() => import("./opnsense/component")), overseerr: dynamic(() => import("./overseerr/component")), paperlessngx: dynamic(() => import("./paperlessngx/component")), + pfsenseapi: dynamic(() => import("./pfsenseapi/component")), photoprism: dynamic(() => import("./photoprism/component")), proxmoxbackupserver: dynamic(() => import("./proxmoxbackupserver/component")), pihole: dynamic(() => import("./pihole/component")), diff --git a/src/widgets/pfsenseapi/component.jsx b/src/widgets/pfsenseapi/component.jsx new file mode 100644 index 00000000..00e0719e --- /dev/null +++ b/src/widgets/pfsenseapi/component.jsx @@ -0,0 +1,71 @@ +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"; +import { sys } from "typescript"; + +export default function Component({ service }) { + const { t } = useTranslation(); + + const { widget } = service; + + const { data: systemData, error: systemError } = useWidgetAPI(widget, "system"); + const { data: interfaceData, error: interfaceError } = useWidgetAPI(widget, "interface"); + + const showDiskUsage = widget.fields?.includes('disk'); + const showWanIP = widget.fields?.includes('wanIP'); + + if (systemError || interfaceError) { + const finalError = systemError ?? interfaceError; + return ; + } + + if (!systemData || !interfaceData) { + return ( + + + + {showDiskUsage && } + + + {showWanIP && } + + ); + } + + + const loadAvg = systemData.data.load_avg[0]; + const memory = systemData.data.mem_usage; + const tempC = systemData.data.temp_c + const disk = systemData.data.disk_usage + + const wanState = interfaceData.data.filter(l => l.hwif === widget.wan)[0].status + const wanStatus = (wanState == "up") ? + {t("pfsenseapi.up")}: + {t("pfsenseapi.down")}; + const wanIP = interfaceData.data.filter(l => l.hwif === widget.wan)[0].ipaddr + + return ( + + + + {showDiskUsage && } + + + {showWanIP && } + + ); +} diff --git a/src/widgets/pfsenseapi/widget.js b/src/widgets/pfsenseapi/widget.js new file mode 100644 index 00000000..88aa44fd --- /dev/null +++ b/src/widgets/pfsenseapi/widget.js @@ -0,0 +1,24 @@ + +import genericProxyHandler from "utils/proxy/handlers/generic"; + +const widget = { + api: "{url}/api/v1/{endpoint}", + proxyHandler: genericProxyHandler, + + mappings: { + system: { + endpoint: "status/system", + validate: [ + "data" + ] + }, + interface: { + endpoint: "status/interface", + validate: [ + "data" + ] + } + }, +}; + +export default widget; diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js index 85fb62f8..9cafc8c5 100644 --- a/src/widgets/widgets.js +++ b/src/widgets/widgets.js @@ -46,6 +46,7 @@ import ombi from "./ombi/widget"; import opnsense from "./opnsense/widget"; import overseerr from "./overseerr/widget"; import paperlessngx from "./paperlessngx/widget"; +import pfsenseapi from "./pfsenseapi/widget"; import photoprism from "./photoprism/widget"; import proxmoxbackupserver from "./proxmoxbackupserver/widget"; import pihole from "./pihole/widget"; @@ -130,6 +131,7 @@ const widgets = { opnsense, overseerr, paperlessngx, + pfsenseapi, photoprism, proxmoxbackupserver, pihole,