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,