From 336eb07cabc540cc102cbc40eeb430904536ccb2 Mon Sep 17 00:00:00 2001 From: Danielv123 Date: Fri, 19 May 2017 11:05:11 +0200 Subject: [PATCH] /api/editSlaveMeta allows you to attach arbitrary metadata to slaves You will need its unique ID and rcon password though. --- master.js | 36 ++++++++++++++++++++++++++++++++---- package.json | 1 + 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/master.js b/master.js index e4e50684..e08f7977 100644 --- a/master.js +++ b/master.js @@ -5,6 +5,7 @@ const masterModFolder = "./database/masterMods/" const mkdirp = require("mkdirp"); mkdirp.sync("./database"); mkdirp.sync(masterModFolder); +const deepmerge = require("deepmerge"); const path = require("path"); const fs = require("fs"); var nedb = require("nedb"); @@ -75,8 +76,35 @@ app.post("/api/getID", function(req,res) { // time us a unix timestamp we can use to check for how long the server has been unresponsive // we should save that somewhere and give appropriate response if(req.body){ - slaves[req.body.unique] = req.body; - console.log("Slave: " + req.body.mac + " : " + req.body.serverPort+" at " + req.body.publicIP); + console.log(req.body) + if(!slaves[req.body.unique]){ + slaves[req.body.unique] = {}; + } + for(k in req.body){ + if(k != "meta" && req.body.hasOwnProperty(k)){ + slaves[req.body.unique][k] = req.body[k]; + } + } + console.log("Slave registered: " + slaves[req.body.unique].mac + " : " + slaves[req.body.unique].serverPort+" at " + slaves[req.body.unique].publicIP + " with name " + slaves[req.body.unique].instanceName); + } +}); +// todo: Write docs for this +app.post("/api/editSlaveMeta", function(req,res) { + // request.body should be an object + // {slaveID, pass, meta:{x,y,z}} + + if(req.body && req.body.slaveID && req.body.password && req.body.meta){ + // check for editing permissions + if(slaves[req.body.slaveID] && slaves[req.body.slaveID].rconPassword == req.body.password){ + if(!slaves[req.body.slaveID].meta){ + slaves[req.body.slaveID].meta = {}; + slaves[req.body.slaveID].meta = deepmerge(slaves[req.body.slaveID].meta, req.body.meta, {clone:true}) + } + console.log("Updating slave: " + req.body.mac + " : " + req.body.serverPort+" at " + req.body.publicIP); + } else { + res.send("ERROR: Invalid slaveID or password") + } + slaves[req.body.slaveID] = req.body; } }); // mod management @@ -117,9 +145,9 @@ app.post("/api/uploadMod", function(req,res) { app.get("/api/slaves", function(req, res) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); - let copyOfSlaves = slaves + let copyOfSlaves = JSON.parse(JSON.stringify(slaves)); // filter out the rcon password because thats kindof not a safe thing to share - for(key in copyOfSlaves) { + for(key in copyOfSlaves){ copyOfSlaves[key].rconPassword = "hidden"; } res.send(copyOfSlaves); diff --git a/package.json b/package.json index 46f5a301..05107905 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "body-parser": "^1.15.2", "canvasjs": "^1.8.1", "child_process": "^1.0.2", + "deepmerge": "^1.3.2", "ejs": "^2.5.6", "express": "^4.14.0", "express-fileupload": "0.0.6",