mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-11 23:04:52 +09:00
Remove lib/manager/configManager.js and the config management command line interface as well as the serverManager's web interface for config management. The configuration rewrite will work differently and is not compatible with configManager.js.
156 lines
4.4 KiB
JavaScript
156 lines
4.4 KiB
JavaScript
const fs = require("fs-extra");
|
|
const path = require("path");
|
|
const Express = require("express");
|
|
const ejs = require("ejs");
|
|
const bcrypt = require("bcrypt-promise");
|
|
const crypto = require('crypto');
|
|
const base64url = require('base64url');
|
|
const sanitizer = require('sanitizer');
|
|
|
|
|
|
class masterPlugin {
|
|
constructor({config, pluginConfig, pluginPath, socketio, express}){
|
|
this.config = config;
|
|
this.pluginConfig = pluginConfig;
|
|
this.pluginPath = pluginPath;
|
|
this.io = socketio;
|
|
this.app = express;
|
|
|
|
// load databases
|
|
// const database = getDatabaseSync("database/playerManager.json");
|
|
// this.whitelist = getDatabaseSync("database/whitelist.json").whitelist || [];
|
|
// this.banlist = getDatabaseSync("database/banlist.json").banlist || [];
|
|
|
|
// initialize web API
|
|
require("./js/api-endpoints.js")(this);
|
|
|
|
// expose UI elements embedded in the master
|
|
this.ui = require("./js/ui.js").injectThis(this).ui;
|
|
|
|
this.serverSockets = {};
|
|
|
|
this.io.on("connection", socket => {
|
|
let instanceID = "unknown";
|
|
let isServerManager = false;
|
|
socket.on("registerSlave", data => {
|
|
if(data.instanceID && !isNaN(Number(data.instanceID))){
|
|
instanceID = data.instanceID;
|
|
if(isServerManager){
|
|
this.serverSockets[instanceID] = {socket};
|
|
validServerManager({server: this.serverSockets[instanceID]});
|
|
}
|
|
}
|
|
});
|
|
socket.on("registerServerManager", () => {
|
|
isServerManager = true;
|
|
if(instanceID !== "unknown"){
|
|
this.serverSockets[instanceID] = {socket};
|
|
validServerManager({server: this.serverSockets[instanceID]});
|
|
}
|
|
console.log("Registered serverManager socket")
|
|
|
|
socket.on("disconnect", () => {
|
|
if(this.serverSockets[instanceID]) delete this.serverSockets[instanceID];
|
|
console.log(`serverManager ${instanceID} disconnected, ${(Object.keys(this.serverSockets).length)} left`);
|
|
});
|
|
});
|
|
socket.on("gameChat", async data => {
|
|
// let chatLine = data.data.replace(/(\r\n\t|\n|\r\t)/gm, "").replace("\r", "");
|
|
// if(typeof chatLine == "string") this.handleChatLine(chatLine, instanceID);
|
|
});
|
|
});
|
|
let validServerManager = ({server}) => {
|
|
server.socket.emit("serverManagerGetPlugins", {}, data => {
|
|
server.plugins = data;
|
|
});
|
|
}
|
|
|
|
// I can't seem to get express static pages + ejs rendering to work properly, so I write my own thing.
|
|
let pages = [
|
|
{
|
|
addr: "/serverManager",
|
|
path: path.join(__dirname,"static/index.html"),
|
|
render: ejs
|
|
},
|
|
]
|
|
pages.forEach(page => {
|
|
this.app.get(page.addr, async (req,res) => {
|
|
if(page.render){
|
|
if((req.query.token || req.cookies.token) && this.playerManager){
|
|
var permissions = await this.playerManager.main.getPermissions((req.query.token || req.cookies.token));
|
|
} else {
|
|
var permissions = {};
|
|
}
|
|
page.render.renderFile(page.path, {
|
|
permissions,
|
|
serverManager: this,
|
|
req: req,
|
|
}, async (err, prom) => {
|
|
if(err) console.log(err);
|
|
let str = await prom;
|
|
res.send(str);
|
|
});
|
|
} else {
|
|
res.send(await fs.readFile(page.path));
|
|
}
|
|
});
|
|
});
|
|
this.app.use('/serverManager', Express.static(path.join(__dirname, 'static')));
|
|
}
|
|
findInArray(key, value, array){
|
|
let indexes = [];
|
|
for(let i in array){
|
|
if(array[i][key] && array[i][key] === value) indexes.push(i);
|
|
}
|
|
return indexes;
|
|
}
|
|
async onExit(){
|
|
// await saveDatabase("database/banlist.json", {banlist: this.banlist});
|
|
return;
|
|
}
|
|
async onLoadFinish({plugins}){
|
|
this.masterPlugins = plugins;
|
|
plugins.forEach(plugin => {
|
|
if(plugin.pluginConfig.name == "playerManager"){
|
|
this.playerManager = plugin;
|
|
}
|
|
});
|
|
}
|
|
async onPlayerManagerGetPermissions({permissions, user}){
|
|
if(user
|
|
&& user.admin){
|
|
permissions.cluster.push("addPlugin");
|
|
permissions.cluster.push("removePlugin");
|
|
permissions.cluster.push("enablePlugin");
|
|
permissions.cluster.push("disablePlugin");
|
|
permissions.cluster.push("readConfig");
|
|
permissions.cluster.push("writeConfig");
|
|
}
|
|
return permissions;
|
|
}
|
|
}
|
|
module.exports = masterPlugin;
|
|
|
|
function getDatabaseSync(path){
|
|
let db;
|
|
try {
|
|
db = JSON.parse(fs.readFileSync(path, "utf8"));
|
|
} catch(e){
|
|
db = {};
|
|
}
|
|
return db;
|
|
}
|
|
async function saveDatabase(path, database){
|
|
if(!path){
|
|
throw new Error("No path provided!");
|
|
} else if(!database){
|
|
throw new Error("No database provided!");
|
|
} else {
|
|
try {
|
|
await fs.writeFile(path, JSON.stringify(database, null, 4));
|
|
} catch(e){
|
|
throw new Error("Unable to write to database! "+path);
|
|
}
|
|
}
|
|
}
|