diff --git a/src/widgets/portainer/component.jsx b/src/widgets/portainer/component.jsx
index 01274719..53e2baba 100644
--- a/src/widgets/portainer/component.jsx
+++ b/src/widgets/portainer/component.jsx
@@ -28,7 +28,7 @@ export default function Component({ service }) {
// containersData can be itself an error object e.g. if environment fails
return ;
}
-
+
return (
@@ -36,4 +36,4 @@ export default function Component({ service }) {
);
-}
\ No newline at end of file
+}
diff --git a/src/widgets/portainer/proxy.js b/src/widgets/portainer/proxy.js
index c4db529a..b1d368b8 100644
--- a/src/widgets/portainer/proxy.js
+++ b/src/widgets/portainer/proxy.js
@@ -1,8 +1,8 @@
/* eslint-disable no-underscore-dangle */
-import { formatApiCall } from "utils/proxy/api-helpers";
-import { httpProxy } from "utils/proxy/http";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets";
const proxyName = "portainerProxyHandler";
@@ -10,110 +10,106 @@ const proxyName = "portainerProxyHandler";
const logger = createLogger(proxyName);
async function getWidget(req) {
- const { group, service } = req.query;
- if (!group || !service) {
- logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
- return null;
- }
- const widget = await getServiceWidget(group, service);
- if (!widget) {
- logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
- return null;
- }
- return widget;
+ const { group, service } = req.query;
+ if (!group || !service) {
+ logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
+ return null;
+ }
+ const widget = await getServiceWidget(group, service);
+ if (!widget) {
+ logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
+ return null;
+ }
+ return widget;
}
-
async function getAllEnvIds(widget) {
- const api = widgets?.[widget.type]?.api;
- if (!api) {
- return [403, null];
- }
- const endpoint = 'endpoints'
+ const api = widgets?.[widget.type]?.api;
+ if (!api) {
+ return [403, null];
+ }
+ const endpoint = "endpoints";
+ let url = new URL(formatApiCall(api, { endpoint, ...widget }));
+ let [status, contentType, data] = await httpProxy(url, {
+ method: "GET",
+ headers: {
+ "Content-Type": "application/json",
+ "x-api-key": widget.key,
+ },
+ });
+
+ if (status !== 200) {
+ logger.error("HTTP %d communicating with NextPVR. Data: %s", status, data.toString());
+ return [status, data];
+ }
+ let dataAsJson;
+ try {
+ const dataDecoded = data.toString();
+ dataAsJson = JSON.parse(dataDecoded);
+ } catch (e) {
+ logger.error("Error decoding NextPVR API data. Data: %s", data.toString());
+ return [status, null];
+ }
+ const ids = await dataAsJson.map((item) => item.Id);
+
+ return ids;
+}
+
+async function getAllContainers(ids, widget) {
+ let items = [];
+ const api = widgets?.[widget.type]?.api;
+ if (!api) {
+ return [403, null];
+ }
+ for (let i = 0; i < ids.length; i++) {
+ const endpoint = "endpoints/" + ids[i] + "/docker/containers/json?all=1";
let url = new URL(formatApiCall(api, { endpoint, ...widget }));
let [status, contentType, data] = await httpProxy(url, {
- method: "GET",
- headers: {
- "Content-Type": "application/json",
- 'x-api-key': widget.key,
- }
+ method: "GET",
+ headers: {
+ "Content-Type": "application/json",
+ "x-api-key": widget.key,
+ },
});
if (status !== 200) {
- logger.error("HTTP %d communicating with NextPVR. Data: %s", status, data.toString());
- return [status, data];
+ logger.error("HTTP %d communicating with NextPVR. Data: %s", status, data.toString());
+ return [status, data];
}
let dataAsJson;
try {
- const dataDecoded = data.toString();
- dataAsJson = JSON.parse(dataDecoded);
+ const dataDecoded = data.toString();
+ dataAsJson = JSON.parse(dataDecoded);
+ items.push(dataAsJson);
} catch (e) {
- logger.error("Error decoding NextPVR API data. Data: %s", data.toString());
- return [status, null];
+ logger.error("Error decoding NextPVR API data. Data: %s", data.toString());
+ return [status, null];
}
- const ids = await dataAsJson.map(item => item.Id);
-
- return ids;
-}
-
-
-async function getAllContainers(ids, widget) {
- let items = []
- const api = widgets?.[widget.type]?.api;
- if (!api) {
- return [403, null];
- }
- for (let i = 0; i < ids.length; i++) {
- const endpoint = "endpoints/" + ids[i] + "/docker/containers/json?all=1"
- let url = new URL(formatApiCall(api, { endpoint, ...widget }));
- let [status, contentType, data] = await httpProxy(url, {
- method: "GET",
- headers: {
- "Content-Type": "application/json",
- 'x-api-key': widget.key,
- }
- });
-
- if (status !== 200) {
- logger.error("HTTP %d communicating with NextPVR. Data: %s", status, data.toString());
- return [status, data];
- }
- let dataAsJson;
- try {
- const dataDecoded = data.toString();
- dataAsJson = JSON.parse(dataDecoded);
- items.push(dataAsJson)
- } catch (e) {
- logger.error("Error decoding NextPVR API data. Data: %s", data.toString());
- return [status, null];
- }
- }
- return items.flat();
+ }
+ return items.flat();
}
export default async function portainerProxyHandler(req, res) {
- try {
- const widget = await getWidget(req);
- let ids
+ try {
+ const widget = await getWidget(req);
+ let ids;
- if (('env' in widget)) {
- ids = [widget.env];
- } else {
- ids = await getAllEnvIds(widget);
- }
- const data = await getAllContainers(ids, widget);
-
- const containerList = Object.values(data);
-
- const running = containerList.filter((c) => c.State === "running").length;
- const stopped = containerList.filter((c) => c.State === "exited").length;
- const total = containerList.length;
-
- return res.status(200).send({ running, stopped, total });
-
- } catch (error) {
- console.error("portainerProxyHandler error:", error);
- return res.status(500).send({ error: "Internal Server Error" });
+ if ("env" in widget) {
+ ids = [widget.env];
+ } else {
+ ids = await getAllEnvIds(widget);
}
-}
+ const data = await getAllContainers(ids, widget);
+ const containerList = Object.values(data);
+
+ const running = containerList.filter((c) => c.State === "running").length;
+ const stopped = containerList.filter((c) => c.State === "exited").length;
+ const total = containerList.length;
+
+ return res.status(200).send({ running, stopped, total });
+ } catch (error) {
+ console.error("portainerProxyHandler error:", error);
+ return res.status(500).send({ error: "Internal Server Error" });
+ }
+}
diff --git a/src/widgets/portainer/widget.js b/src/widgets/portainer/widget.js
index 6b55c896..51015132 100644
--- a/src/widgets/portainer/widget.js
+++ b/src/widgets/portainer/widget.js
@@ -6,9 +6,9 @@ const widget = {
mappings: {
"docker/containers/json": {
- endpoint: "endpoints/{env}/docker/containers/json"
- }
+ endpoint: "endpoints/{env}/docker/containers/json",
+ },
},
};
-export default widget;
\ No newline at end of file
+export default widget;