Additional changes for #37
- Updating side bar - Updating nav bar - Adding node details page - Adding controller page - Updating routes
This commit is contained in:
@@ -2,15 +2,61 @@
|
||||
const { DebugBuilder } = require("../utilities/debugBuilder.js");
|
||||
const log = new DebugBuilder("server", "nodesController");
|
||||
// Utilities
|
||||
const {getAllNodes, addNewNode, updateNodeInfo, getNodeInfoFromId, getOnlineNodes } = require("../utilities/mysqlHandler");
|
||||
const { getAllNodes, addNewNode, updateNodeInfo, getNodeInfoFromId, getOnlineNodes } = require("../utilities/mysqlHandler");
|
||||
const utils = require("../utilities/utils");
|
||||
const { sendHttpRequest, requestOptions } = require("../utilities/httpRequests.js");
|
||||
const { nodeObject } = require("../utilities/recordHelper.js");
|
||||
const { joinServerWrapper } = require("../commands/join");
|
||||
const { leaveServerWrapper } = require("../commands/leave");
|
||||
|
||||
const refreshInterval = process.env.NODE_MONITOR_REFRESH_INTERVAL ?? 1200000;
|
||||
|
||||
/**
|
||||
* Check in with a singular node, mark it offline if it's offline and
|
||||
*
|
||||
* @param {*} node The node Object to check in with
|
||||
*/
|
||||
async function checkInWithNode(node) {
|
||||
const reqOptions = new requestOptions("/client/requestCheckIn", "GET", node.ip, node.port)
|
||||
sendHttpRequest(reqOptions, "", (responseObj) => {
|
||||
if (responseObj) {
|
||||
log.DEBUG("Response from: ", node.name, responseObj);
|
||||
const onlineNode = new nodeObject({ _online: false, _id: node.id });
|
||||
log.DEBUG("Node update object: ", onlineNode);
|
||||
updateNodeInfo(onlineNode, (sqlResponse) => {
|
||||
if (!sqlResponse) this.log.ERROR("No response from SQL object");
|
||||
|
||||
log.DEBUG("Updated node: ", sqlResponse);
|
||||
return true
|
||||
})
|
||||
}
|
||||
else {
|
||||
log.DEBUG("No response from node, assuming it's offline");
|
||||
const offlineNode = new nodeObject({ _online: false, _id: node.id });
|
||||
log.DEBUG("Offline node update object: ", offlineNode);
|
||||
updateNodeInfo(offlineNode, (sqlResponse) => {
|
||||
if (!sqlResponse) this.log.ERROR("No response from SQL object");
|
||||
|
||||
log.DEBUG("Updated offline node: ", sqlResponse);
|
||||
return false
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
exports.checkInWithNode = checkInWithNode;
|
||||
|
||||
/**
|
||||
* Check in with all online nodes and mark any nodes that are actually offline
|
||||
*/
|
||||
async function checkInWithOnlineNodes() {
|
||||
getOnlineNodes((nodes) => {
|
||||
log.DEBUG("Online Nodes: ", nodes);
|
||||
for (const node of nodes) {
|
||||
checkInWithNode(node);
|
||||
}
|
||||
return;
|
||||
});
|
||||
}
|
||||
exports.checkInWithOnlineNodes = checkInWithOnlineNodes;
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {*} req Default express req from router
|
||||
@@ -28,7 +74,7 @@ exports.listAllNodes = async (req, res) => {
|
||||
* Add a new node to the storage
|
||||
* @param {*} req Default express req from router
|
||||
* @param {*} res Defualt express res from router
|
||||
*/
|
||||
*/
|
||||
exports.newNode = async (req, res) => {
|
||||
if (!req.body.name) return res.status(400).json("No name specified for new node");
|
||||
|
||||
@@ -45,7 +91,7 @@ exports.newNode = async (req, res) => {
|
||||
|
||||
addNewNode(newNode, (newNodeObject) => {
|
||||
// Send back a success if the user has been added and the ID for the client to keep track of
|
||||
res.status(202).json({"nodeId": newNodeObject.id});
|
||||
res.status(202).json({ "nodeId": newNodeObject.id });
|
||||
})
|
||||
}
|
||||
catch (err) {
|
||||
@@ -62,7 +108,7 @@ exports.newNode = async (req, res) => {
|
||||
*
|
||||
* @param {*} req Default express req from router
|
||||
* @param {*} res Defualt express res from router
|
||||
*/
|
||||
*/
|
||||
exports.getNodeInfo = async (req, res) => {
|
||||
if (!req.query.id) return res.status(400).json("No id specified");
|
||||
getNodeInfoFromId(req.query.id, (nodeInfo) => {
|
||||
@@ -75,7 +121,7 @@ exports.getNodeInfo = async (req, res) => {
|
||||
* @param {*} req Default express req from router
|
||||
* @param {*} res Defualt express res from router
|
||||
*/
|
||||
exports.nodeCheckIn = async (req, res) => {
|
||||
exports.nodeCheckIn = async (req, res) => {
|
||||
if (!req.body.id) return res.status(400).json("No id specified");
|
||||
getNodeInfoFromId(req.body.id, (nodeInfo) => {
|
||||
let checkInObject = {};
|
||||
@@ -87,7 +133,7 @@ exports.nodeCheckIn = async (req, res) => {
|
||||
if (req.body.name && req.body.name != nodeInfo.name) {
|
||||
checkInObject._name = req.body.name;
|
||||
isObjectUpdated = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (req.body.ip && req.body.ip != nodeInfo.ip) {
|
||||
checkInObject._ip = req.body.ip;
|
||||
@@ -115,9 +161,9 @@ exports.nodeCheckIn = async (req, res) => {
|
||||
}
|
||||
|
||||
// If no changes are made tell the client
|
||||
if (!isObjectUpdated) return res.status(200).json("No keys updated");
|
||||
if (!isObjectUpdated) return res.status(200).json("No keys updated");
|
||||
|
||||
log.INFO("Updating the following keys for ID: ", req.body.id, checkInObject);
|
||||
log.INFO("Updating the following keys for ID: ", req.body.id, checkInObject);
|
||||
|
||||
checkInObject._id = req.body.id;
|
||||
checkInObject = new nodeObject(checkInObject);
|
||||
@@ -125,40 +171,28 @@ exports.nodeCheckIn = async (req, res) => {
|
||||
if (!nodeInfo) {
|
||||
log.WARN("No existing node found with this ID, adding node: ", checkInObject);
|
||||
addNewNode(checkInObject, (newNode) => {
|
||||
return res.status(201).json({"updatedKeys": newNode});
|
||||
return res.status(201).json({ "updatedKeys": newNode });
|
||||
});
|
||||
}
|
||||
else {
|
||||
else {
|
||||
updateNodeInfo(checkInObject, () => {
|
||||
return res.status(202).json({"updatedKeys": checkInObject});
|
||||
return res.status(202).json({ "updatedKeys": checkInObject });
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Request the node to join the specified server/channel and listen to the specified resource
|
||||
* Requests a specific node to check in with the server, if it's online
|
||||
*
|
||||
* @param {*} req Default express req from router
|
||||
* @param {*} res Defualt express res from router
|
||||
* @param req.body.clientId The client ID to join discord with (NOT dev portal ID, right click user -> Copy ID)
|
||||
* @param req.body.channelId The Channel ID to join in Discord
|
||||
* @param req.body.presetName The preset name to listen to in Discord
|
||||
*/
|
||||
exports.requestNodeJoinServer = async (req, res) => {
|
||||
if (!req.body.clientId || !req.body.channelId || !req.body.presetName) return res.status(400).json("Missing information in request, requires clientId, channelId, presetName");
|
||||
await joinServerWrapper(req.body.presetName, req.body.channelId, req.body.clientId);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {*} req Default express req from router
|
||||
* @param {*} res Defualt express res from router
|
||||
* @param {*} req.body.clientId The client ID to request to leave the server
|
||||
*/
|
||||
exports.requestNodeLeaveServer = async (req, res) => {
|
||||
if (!req.body.ClientId) return res.status(400).json("Missing client ID in request");
|
||||
await leaveServerWrapper({clientId: req.body.ClientId});
|
||||
exports.requestNodeCheckIn = async (req, res) => {
|
||||
if (!req.params.nodeId) return res.status(400).json("No Node ID supplied in request");
|
||||
const node = await getNodeInfoFromId(req.params.nodeId);
|
||||
if (!node) return res.status(400).json("No Node with the ID given");
|
||||
checkInWithNode(node);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -172,49 +206,21 @@ exports.nodeMonitorService = class nodeMonitorService {
|
||||
/**
|
||||
* Start the node monitor service in the background
|
||||
*/
|
||||
async start(){
|
||||
// Wait for the a portion of the refresh period before checking in with the nodes, so the rest of the bot can start
|
||||
await new Promise(resolve => setTimeout(resolve, refreshInterval/10));
|
||||
async start() {
|
||||
// Wait for the a portion of the refresh period before checking in with the nodes, so the rest of the bot can start
|
||||
await new Promise(resolve => setTimeout(resolve, refreshInterval / 10));
|
||||
|
||||
log.INFO("Starting Node Monitor Service");
|
||||
// Check in before starting the infinite loop
|
||||
await this.checkInWithOnlineNodes();
|
||||
|
||||
|
||||
while(true){
|
||||
await checkInWithOnlineNodes();
|
||||
|
||||
|
||||
while (true) {
|
||||
// Wait for the refresh interval, then wait for the posts to return, then wait a quarter of the refresh interval to make sure everything is cleared up
|
||||
await new Promise(resolve => setTimeout(resolve, refreshInterval));
|
||||
await this.checkInWithOnlineNodes();
|
||||
await checkInWithOnlineNodes();
|
||||
await new Promise(resolve => setTimeout(resolve, refreshInterval / 4));
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check in with all online nodes and mark any nodes that are actually offline
|
||||
*/
|
||||
async checkInWithOnlineNodes(){
|
||||
getOnlineNodes((nodes) => {
|
||||
this.log.DEBUG("Online Nodes: ", nodes);
|
||||
for (const node of nodes) {
|
||||
const reqOptions = new requestOptions("/client/requestCheckIn", "GET", node.ip, node.port)
|
||||
sendHttpRequest(reqOptions, "", (responseObj) => {
|
||||
if (responseObj) {
|
||||
this.log.DEBUG("Response from: ", node.name, responseObj);
|
||||
}
|
||||
else {
|
||||
this.log.DEBUG("No response from node, assuming it's offline");
|
||||
const offlineNode = new nodeObject({ _online: 0, _id: node.id });
|
||||
this.log.DEBUG("Offline node update object: ", offlineNode);
|
||||
updateNodeInfo(offlineNode, (sqlResponse) => {
|
||||
if (!sqlResponse) this.log.ERROR("No response from SQL object");
|
||||
|
||||
this.log.DEBUG("Updated offline node: ", sqlResponse);
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
return;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user