From 060d5afcaa1f65b0a7687e2909175c70cda10c18 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 22 Feb 2023 12:43:37 -0800 Subject: [PATCH] Simplify pterodactyl to only show server / node counts --- src/utils/proxy/handlers/credentialed.js | 2 + src/widgets/pterodactyl/component.jsx | 16 ++-- src/widgets/pterodactyl/proxy.js | 97 ------------------------ src/widgets/pterodactyl/widget.js | 15 +++- 4 files changed, 24 insertions(+), 106 deletions(-) delete mode 100644 src/widgets/pterodactyl/proxy.js diff --git a/src/utils/proxy/handlers/credentialed.js b/src/utils/proxy/handlers/credentialed.js index 4d5b4a25d..a84897f07 100644 --- a/src/utils/proxy/handlers/credentialed.js +++ b/src/utils/proxy/handlers/credentialed.js @@ -46,6 +46,8 @@ export default async function credentialedProxyHandler(req, res, map) { } else if (widget.type === "cloudflared") { headers["X-Auth-Email"] = `${widget.email}`; headers["X-Auth-Key"] = `${widget.key}`; + } else if (widget.type === "pterodactyl") { + headers.Authorization = `Bearer ${widget.key}`; } else { headers["X-API-Key"] = `${widget.key}`; } diff --git a/src/widgets/pterodactyl/component.jsx b/src/widgets/pterodactyl/component.jsx index faa236baf..346ce2349 100644 --- a/src/widgets/pterodactyl/component.jsx +++ b/src/widgets/pterodactyl/component.jsx @@ -7,13 +7,13 @@ export default function Component({ service }) { const {widget} = service; - const {data: datasData, error: datasError} = useWidgetAPI(widget); + const {data: nodesData, error: nodesError} = useWidgetAPI(widget, "nodes"); - if (datasError) { - return ; + if (nodesError) { + return ; } - if (!datasData) { + if (!nodesData) { return ( @@ -21,10 +21,14 @@ export default function Component({ service }) { ); } + + const totalServers = nodesData.data.reduce((total, node) => + node.attributes?.relationships?.servers?.data?.length ?? 0 + total, 0); + return ( - - + + ); } diff --git a/src/widgets/pterodactyl/proxy.js b/src/widgets/pterodactyl/proxy.js deleted file mode 100644 index 0c36da4ad..000000000 --- a/src/widgets/pterodactyl/proxy.js +++ /dev/null @@ -1,97 +0,0 @@ - -import { httpProxy } from "utils/proxy/http"; -import getServiceWidget from "utils/config/service-helpers"; -import createLogger from "utils/logger"; - -const proxyName = "pterodactylProxyHandler"; - -const logger = createLogger(proxyName); - -export default async function pterodactylProxyHandler(req, res) { - const { group, service } = req.query; - - if (group && service) { - const widget = await getServiceWidget(group, service); - - if (widget) { - - const { url } = widget; - - const nodesURL = `${url}/api/application/nodes?include=servers`; - - let [status, contentType, data] = await httpProxy(nodesURL, { - headers: { - "Content-Type": "application/json", - "Accept": "application/json", - "Authorization": `Bearer ${widget.key}` - }, - }); - - if (status !== 200) { - logger.error("Unable to retrieve Pterodactyl nodes' list"); - return res.status(status).json({error: {message: `HTTP Error ${status}`, url: nodesURL, data}}); - } - - const nodesData = JSON.parse(data); - const nodesTotal = nodesData.data.length; - let nodesOnline = 0; - let total = 0; - - const serversRequests = []; - const nodesRequests = []; - - for (let nodeid = 0; nodeid < nodesData.data.length; nodeid += 1) { - // check if node is online - const nodeURL = `${nodesData.data[nodeid].attributes.scheme}://${nodesData.data[nodeid].attributes.fqdn}:${nodesData.data[nodeid].attributes.daemon_listen}/api/system`; - - nodesRequests.push(httpProxy(nodeURL)); - - for (let serverid = 0; serverid < nodesData.data[nodeid].attributes.relationships.servers.data.length; serverid += 1) { - total += 1; - const serverURL = `${url}/api/client/servers/${nodesData.data[nodeid].attributes.relationships.servers.data[serverid].attributes.identifier}/resources`; - serversRequests.push(httpProxy(serverURL, { - headers: { - "Content-Type": "application/json", - "Accept": "application/json", - "Authorization": `Bearer ${widget.key}` - }, - })); - } - } - - const nodesList = await Promise.all(nodesRequests); - - for (let nodeid = 0; nodeid < nodesList.length; nodeid += 1) { - // eslint-disable-next-line no-unused-vars - [status, contentType, data] = nodesList[nodeid]; - if (status === 401) { - nodesOnline += 1; - } - } - - let online = 0; - - const serversList = await Promise.all(serversRequests); - for (let serverid = 0; serverid < serversList.length; serverid += 1) { - // eslint-disable-next-line no-unused-vars - [status, contentType, data] = serversList[serverid]; - if (status === 200) { - const serverData = JSON.parse(data); - if (serverData.attributes.current_state === "running") { - online += 1; - } - } - } - - const servers = `${online}/${total}`; - const nodes = `${nodesOnline}/${nodesTotal}`; - - return res.send(JSON.stringify({ - nodes, - servers - })); - } - } - - return res.status(400).json({ error: "Invalid proxy service type" }); -} diff --git a/src/widgets/pterodactyl/widget.js b/src/widgets/pterodactyl/widget.js index 63e1e4999..39d0eef2f 100644 --- a/src/widgets/pterodactyl/widget.js +++ b/src/widgets/pterodactyl/widget.js @@ -1,8 +1,17 @@ - -import pterodactylProxyHandler from "./proxy"; +import credentialedProxyHandler from "utils/proxy/handlers/credentialed"; const widget = { - proxyHandler: pterodactylProxyHandler, + api: "{url}/api/application/{endpoint}", + proxyHandler: credentialedProxyHandler, + + mappings: { + nodes: { + endpoint: "nodes?include=servers", + validate: [ + "data" + ] + }, + }, }; export default widget;