From 38d81b654e7e238c4d2a7f5335328c0eed8a95d9 Mon Sep 17 00:00:00 2001 From: Benoit SERRA Date: Fri, 23 Dec 2022 18:12:06 +0100 Subject: [PATCH] Mikrotik widget (#720) --- .gitignore | 5 ++++ public/locales/en/common.json | 8 +++++- src/widgets/components.js | 1 + src/widgets/mikrotik/component.jsx | 43 ++++++++++++++++++++++++++++++ src/widgets/mikrotik/widget.js | 24 +++++++++++++++++ src/widgets/widgets.js | 2 ++ 6 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 src/widgets/mikrotik/component.jsx create mode 100644 src/widgets/mikrotik/widget.js diff --git a/.gitignore b/.gitignore index 7ab221f97..5649354a5 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,8 @@ next-env.d.ts # homepage /config + +# IDEs +/.idea/ + + diff --git a/public/locales/en/common.json b/public/locales/en/common.json index d8a4d3831..a1f9df9c0 100644 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -206,7 +206,7 @@ "processed": "Processed", "errored": "Errored", "saved": "Saved" - }, + }, "traefik": { "routers": "Routers", "services": "Services", @@ -395,5 +395,11 @@ "nextdns": { "wait": "Please Wait", "no_devices": "No Device Data Received" + }, + "mikrotik": { + "cpuLoad": "CPU Load", + "memoryUsed": "Memory Used", + "uptime": "Uptime", + "numberOfLeases": "Leases" } } diff --git a/src/widgets/components.js b/src/widgets/components.js index 6468e8412..a2a263325 100644 --- a/src/widgets/components.js +++ b/src/widgets/components.js @@ -22,6 +22,7 @@ const components = { lidarr: dynamic(() => import("./lidarr/component")), mastodon: dynamic(() => import("./mastodon/component")), miniflux: dynamic(() => import("./miniflux/component")), + mikrotik: dynamic(() => import("./mikrotik/component")), navidrome: dynamic(() => import("./navidrome/component")), nextdns: dynamic(() => import("./nextdns/component")), npm: dynamic(() => import("./npm/component")), diff --git a/src/widgets/mikrotik/component.jsx b/src/widgets/mikrotik/component.jsx new file mode 100644 index 000000000..37a8f7064 --- /dev/null +++ b/src/widgets/mikrotik/component.jsx @@ -0,0 +1,43 @@ +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"; + +export default function Component({ service }) { + const { t } = useTranslation(); + + const { widget } = service; + + const { data: statsData, error: statsError } = useWidgetAPI(widget, "system"); + const { data: leasesData, error: leasesError } = useWidgetAPI(widget, "leases"); + + if (statsError || leasesError) { + const finalError = statsError ?? leasesError; + return ; + } + + if (!statsData || !leasesData) { + return ( + + + + + + + ); + } + + const memoryUsed = 100 - (statsData['free-memory'] / statsData['total-memory'])*100 + + const numberOfLeases = leasesData.length + + return ( + + + + + + + ); +} diff --git a/src/widgets/mikrotik/widget.js b/src/widgets/mikrotik/widget.js new file mode 100644 index 000000000..dfb5f626c --- /dev/null +++ b/src/widgets/mikrotik/widget.js @@ -0,0 +1,24 @@ + +import genericProxyHandler from "utils/proxy/handlers/generic"; + +const widget = { + api: "{url}/rest/{endpoint}", + proxyHandler: genericProxyHandler, + + mappings: { + system: { + endpoint: "system/resource", + validate: [ + "cpu-load", + "free-memory", + "total-memory", + "uptime" + ] + }, + leases: { + endpoint: "ip/dhcp-server/lease", + } + }, +}; + +export default widget; diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js index ab5f8bba5..523ba9c28 100644 --- a/src/widgets/widgets.js +++ b/src/widgets/widgets.js @@ -17,6 +17,7 @@ import jellyseerr from "./jellyseerr/widget"; import lidarr from "./lidarr/widget"; import mastodon from "./mastodon/widget"; import miniflux from "./miniflux/widget"; +import mikrotik from "./mikrotik/widget"; import navidrome from "./navidrome/widget"; import nextdns from "./nextdns/widget"; import npm from "./npm/widget"; @@ -71,6 +72,7 @@ const widgets = { lidarr, mastodon, miniflux, + mikrotik, navidrome, nextdns, npm,