(feature) Update UI & Resource Availability

This commit is contained in:
Elijah Dunemask 2023-03-15 15:20:08 +00:00
parent 11d8229eb5
commit 929193d272
44 changed files with 4747 additions and 27 deletions

31
lib/server/rcon.js Normal file
View file

@ -0,0 +1,31 @@
import k8s from "@kubernetes/client-node";
import { Rcon as RconClient } from "rcon-client";
import { ERR } from "../util/logging.js";
const kc = new k8s.KubeConfig();
kc.loadFromDefault();
const k8sCore = kc.makeApiClient(k8s.CoreV1Api);
const namespace = process.env.MCL_SERVER_NAMESPACE;
export default async function rconInterface(socket) {
if (socket.rconClient)
return VERB("RCON", "Socket already connected to RCON");
const rconSecret = `mcl-${socket.mcs.serverName}-rcon-secret`;
const rconRes = await k8sCore.readNamespacedSecret(rconSecret, namespace);
const rconPassword = Buffer.from(
rconRes.body.data["rcon-password"],
"base64"
).toString("utf8");
const rconHost = `mcl-${socket.mcs.serverName}-rcon`;
const rcon = new RconClient({
host: rconHost,
port: 25575,
password: rconPassword,
});
rcon.on("error", (error) => socket.emit("push", error));
try {
await rcon.connect();
} catch (error) {
ERR("RCON", `Could not connect to 'mcl-${socket.mcs.serverName}-rcon'`);
}
socket.rconClient = rcon;
}

23
lib/server/router.js Normal file
View file

@ -0,0 +1,23 @@
// Imports
import express from "express";
// Routes
import vitals from "../routes/vitals-route.js";
import systemRoute from "../routes/system-route.js";
import serverRoute from "../routes/server-route.js";
export default function buildRoutes(pg, skio) {
const router = express.Router();
// Special Routes
router.use(vitals);
router.all("/", (req, res) => res.redirect("/mcl"));
// Middlewares
// Routes
router.use("/api/system", systemRoute);
router.use("/api/server", serverRoute);
// router.use("/mcl", react); // Static Build Route
return router;
}

46
lib/server/sockets.js Normal file
View file

@ -0,0 +1,46 @@
import { Server as Skio } from "socket.io";
import { VERB, WARN, ERR } from "../util/logging.js";
import liveLogging from "../k8s/live-logging.js";
import rconInterface from "./rcon.js";
const namespace = process.env.MCL_SERVER_NAMESPACE;
async function rconSend(socket, m) {
if (!socket.rconClient)
return WARN("RCON", "Message sent before RCON connected!");
try {
const r = await socket.rconClient.send(m);
socket.emit("push", `[RCON]: ${r}`);
} catch (error) {
WARN("RCON", error);
}
}
const socketConnect = async (io, socket) => {
VERB("WS", "Websocket connecting");
socket.mcs = { serverName: socket.handshake.query.serverName };
try {
await liveLogging(socket, namespace);
await rconInterface(socket);
socket.on("msg", (m) => rconSend(socket, m));
} catch (err) {
ERR("SOCKETS", err);
socket.send("push", err);
socket.disconnect();
}
};
const socketAuth = (socket, next) => {
const { token } = socket.handshake.auth;
// next(new Error("Bad Token"));
next();
};
const applySockets = (server) => {
const io = new Skio(server);
io.on("connection", (socket) => socketConnect(io, socket));
VERB("WS", "Configured Websockets");
return io;
};
export default applySockets;