Переглянути джерело

Merge pull request #451 from chazzbg/truenas-widget

Feature: Add widget for Truenas
shamoon 2 роки тому
батько
коміт
be5a8c0060

+ 6 - 0
public/locales/en/common.json

@@ -309,5 +309,11 @@
         "videos": "Videos",
         "channels": "Channels",
         "playlists": "Playlists"
+    },
+    "truenas": {
+        "load": "System Load",
+        "uptime": "Uptime",
+        "alerts": "Alerts",
+        "time": "{{value, number(style: unit; unitDisplay: long;)}}"
     }
 }

+ 1 - 0
src/widgets/components.js

@@ -37,6 +37,7 @@ const components = {
   traefik: dynamic(() => import("./traefik/component")),
   transmission: dynamic(() => import("./transmission/component")),
   tubearchivist: dynamic(() => import("./tubearchivist/component")),
+  truenas: dynamic(() => import("./truenas/component")),
   unifi: dynamic(() => import("./unifi/component")),
   watchtower: dynamic(() => import("./watchtower/component")),
 };

+ 65 - 0
src/widgets/truenas/component.jsx

@@ -0,0 +1,65 @@
+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";
+
+const processUptime = uptime => {
+
+  let seconds = uptime.toFixed(0);
+
+  var levels = [
+    [Math.floor(seconds / 31536000), 'year'],
+    [Math.floor((seconds % 31536000) / 2592000), 'month'],
+    [Math.floor(((seconds % 31536000) % 2592000) / 86400), 'day'],
+    [Math.floor(((seconds % 31536000) % 86400) / 3600), 'hour'],
+    [Math.floor((((seconds % 31536000) % 86400) % 3600) / 60), 'minute'],
+    [(((seconds % 31536000) % 86400) % 3600) % 60, 'second'],
+  ];
+  
+  for(let i = 0; i< levels.length; i++){
+    let level = levels[i];
+    if(level[0] > 0){
+      return {
+          value: level[0],
+          unit: level[1]
+        }
+      } 
+  }
+
+  return {
+    value: 0,
+    unit: 'second'
+  };
+}
+
+export default function Component({ service }) {
+  const { t } = useTranslation();
+
+  const { widget } = service;
+
+  const { data: alertData, error: alertError } = useWidgetAPI(widget, "alerts");
+  const { data: statusData, error: statusError } = useWidgetAPI(widget, "status");
+
+  if (alertError || statusError) {
+    return <Container error={t("widget.api_error")} />;
+  }
+
+  if (!alertData || !statusData) {
+    return (
+      <Container service={service}>
+        <Block label="truenas.load" />
+        <Block label="truenas.uptime" />
+        <Block label="truenas.alerts" />
+      </Container>
+    );
+  }
+  
+  return (
+    <Container service={service}>
+      <Block label="truenas.load" value={t("common.number", { value: statusData.loadavg[0] })} />
+      <Block label="truenas.uptime" value={t('truenas.time', processUptime(statusData.uptime_seconds))} />
+      <Block label="truenas.alerts" value={t("common.number", { value: alertData.pending })} />
+    </Container>
+  );
+}

+ 21 - 0
src/widgets/truenas/widget.js

@@ -0,0 +1,21 @@
+import { jsonArrayFilter } from "utils/proxy/api-helpers";
+import genericProxyHandler from "utils/proxy/handlers/generic";
+
+const widget = {
+  api: "{url}/api/v2.0/{endpoint}",
+  proxyHandler: genericProxyHandler,
+
+  mappings: {
+    alerts: {
+      endpoint: "alert/list",
+      map: (data) => ({
+        pending: jsonArrayFilter(data, (item) => item?.dismissed === false).length,
+      }),
+    },
+    status: {
+      endpoint: "system/info",
+    },
+  },
+};
+
+export default widget;

+ 2 - 0
src/widgets/widgets.js

@@ -32,6 +32,7 @@ import tautulli from "./tautulli/widget";
 import traefik from "./traefik/widget";
 import transmission from "./transmission/widget";
 import tubearchivist from "./tubearchivist/widget";
+import truenas from "./truenas/widget";
 import unifi from "./unifi/widget";
 import watchtower from './watchtower/widget'
 
@@ -71,6 +72,7 @@ const widgets = {
   traefik,
   transmission,
   tubearchivist,
+  truenas,
   unifi,
   unifi_console: unifi,
   watchtower,