Modifications #241

Merged
Sirherobrine23 merged 7 commits from Modifications into main 2021-11-17 20:02:15 +00:00
32 changed files with 1229 additions and 973 deletions
Showing only changes of commit 2dd88ad711 - Show all commits

View File

@ -1,5 +1,8 @@
name: Docker And Node Test
on:
push:
branches:
- main
pull_request:
branches:
- main

View File

@ -39,7 +39,7 @@ fs.readdirSync(path.join(__dirname, "plugins")).map(file => path.resolve(__dirna
});
MoreHelp.push(cli_color.redBright(`Plugin: ${path.basename(Plugin).replace(/\.js$/gi, "")} - ${__module.description}`), "", ...(__module.help || []), "");
} catch (err) {
console.log(cli_color.redBright(`Error loading plugin: ${Plugin}`));
console.log(cli_color.redBright(`Error loading plugin: ${path.basename(Plugin).replace(/\.js$/gi, "")}`));
console.log(cli_color.redBright(err));
}
});
@ -50,7 +50,7 @@ async function DownloadServer() {
const waitUserSelectVersion = (await inquirer.prompt({
type: "list",
name: "version",
message: `Select the version to download ${GetPlatform()}`,
message: `Select the version to download ${BdsCore.BdsSettings.GetPlatform()}`,
choices: Object.keys(PlatformVersion.versions).map(version => ({name: `v${version}`, value: version}))
})).version;
const RunSpinner = ora("Downloading...").start();
@ -157,6 +157,8 @@ async function Runner() {
// Download
if (ProcessArgs.download || ProcessArgs.d) await DownloadServer();
// Kill
if (ProcessArgs.kill || ProcessArgs.k) BdsCore.BdsCkeckKill.Kill();
// Load Plugins
for (let Plugin of BeforeRun) {
@ -166,11 +168,18 @@ async function Runner() {
// Start Server
if (!(ProcessArgs.start || ProcessArgs.s)) return;
const BdsManegerServer = BdsCore.BdsManegerServer.StartServer();
BdsManegerServer.log(data => process.stdout.write(cli_color.blueBright(data)));
if (!(ProcessArgs["no-api"])) BdsCore.BdsManegerAPI.api();
const __readline = readline.createInterface({input: process.stdin, output: process.stdout});
__readline.on("line", data => BdsManegerServer.command(data));
__readline.on("close", () => BdsManegerServer.stop());
// Get Temporary External Domain
if (ProcessArgs.get_domain) {
try {
const HostInfo = await BdsCore.BdsNetwork.GetHost();
console.log("Domain:", HostInfo.host);
BdsManegerServer.exit(async () => await HostInfo.delete_host());
process.on("exit", async () => {
await HostInfo.delete_host();
console.log("Sucess remove host");
@ -179,15 +188,9 @@ async function Runner() {
console.log("Cannot get domain");
}
}
const BdsManegerServer = BdsCore.BdsManegerServer.StartServer();
BdsManegerServer.log(data => console.log(cli_color.blueBright(data.replace(/\n$/gi, ""))));
BdsManegerServer.exit(code => {
console.log(cli_color.redBright(`Bds Core Exit with code ${code}, Uptimed: ${BdsManegerServer.uptime}`));
process.exit(code);
console.log(cli_color.redBright(`Bds Core Exit with code ${code}, Uptimed: ${BdsManegerServer.uptime}`));
process.exit(code);
});
if (!(ProcessArgs["no-api"])) BdsCore.api();
const __readline = readline.createInterface({input: process.stdin, output: process.stdout});
__readline.on("line", data => BdsManegerServer.command(data));
}
Runner();

View File

@ -25,7 +25,9 @@ const HelpAndStart = [
];
// Set Telegram Bot
const bot = new Telegraf(GetTelegramToken());
const TelegramToken = GetTelegramToken();
if (!TelegramToken) throw new Error("Add Telegram Token");
const bot = new Telegraf(TelegramToken);
// Start and Help Command
bot.start((ctx)=>ctx.reply(HelpAndStart.join("\n")));

11
package-lock.json generated
View File

@ -26,7 +26,6 @@
"express": "^4.17.1",
"express-fileupload": "^1.2.1",
"express-prettify": "^0.1.1",
"express-rate-limit": "^5.2.3",
"googleapis": "^91.0.0",
"inquirer": "^8.1.5",
"js-yaml": "^4.1.0",
@ -1875,11 +1874,6 @@
"resolved": "https://registry.npmjs.org/express-prettify/-/express-prettify-0.1.1.tgz",
"integrity": "sha512-AtLYJhseS9bIwkG+tqSn4OKr7RJ8fxJ+/P8SDZ9XdcMiGPvi633c2YC8QaHJKokyffd6sHxSuyZ/eWwDX6kOpw=="
},
"node_modules/express-rate-limit": {
"version": "5.5.1",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.5.1.tgz",
"integrity": "sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg=="
},
"node_modules/ext": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz",
@ -7521,11 +7515,6 @@
"resolved": "https://registry.npmjs.org/express-prettify/-/express-prettify-0.1.1.tgz",
"integrity": "sha512-AtLYJhseS9bIwkG+tqSn4OKr7RJ8fxJ+/P8SDZ9XdcMiGPvi633c2YC8QaHJKokyffd6sHxSuyZ/eWwDX6kOpw=="
},
"express-rate-limit": {
"version": "5.5.1",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.5.1.tgz",
"integrity": "sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg=="
},
"ext": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz",

View File

@ -63,7 +63,6 @@
"express": "^4.17.1",
"express-fileupload": "^1.2.1",
"express-prettify": "^0.1.1",
"express-rate-limit": "^5.2.3",
"googleapis": "^91.0.0",
"inquirer": "^8.1.5",
"js-yaml": "^4.1.0",

View File

@ -11,10 +11,10 @@ module.exports.GetSessions = () => ServerSessions;
module.exports.StartServer = function start() {
const commandExists = require("../src/lib/commandExist");
const BdsDetect = require("./CheckKill").Detect;
if (BdsDetect()) throw new Error("You already have a server running");
const io = require("./api").SocketIO;
const CurrentBdsPlatform = BdsSettings.GetPlatform();
const SetupCommands = {
RunInCroot: false,
command: String,
args: [],
cwd: String,
@ -99,10 +99,13 @@ module.exports.StartServer = function start() {
else throw Error("Bds Config Error")
// Setup commands
const ServerExec = child_process.execFile(SetupCommands.command, SetupCommands.args, {
cwd: SetupCommands.cwd,
let __ServerExec = child_process.exec("exit 0");
if (SetupCommands.RunInCroot) throw new Error("RunInCroot is not supported yet");
else __ServerExec = child_process.execFile(SetupCommands.command, SetupCommands.args, {
cwd: SetupCommands.cwd,
env: SetupCommands.env
});
const ServerExec = __ServerExec;
// Log file
const LogFile = path.join(BdsSettings.GetPaths("log"), `${BdsSettings.GetPlatform()}_${new Date().toString().replace(/:|\(|\)/g, "_")}_Bds_log.log`);
@ -286,6 +289,37 @@ module.exports.StartServer = function start() {
clearInterval(OnStop);
});
// Socket.io
io.on("connection", (socket) => {
socket.on("ServerCommand", (data = "") => {
if (typeof data === "string") return returnFuntion.command(data);
else if (typeof data === "object") {
if (typeof data.uuid === "string") {
if (data.uuid === returnFuntion.uuid) return returnFuntion.command(data.command);
}
}
return;
});
ServerExec.on("exit", code => socket.emit("ServerExit", {
UUID: returnFuntion.uuid,
exitCode: code
}));
ServerExec.stdout.on("data", (data = "") => {
socket.emit("ServerLog", {
UUID: returnFuntion.uuid,
data: data,
IsStderr: false
});
});
ServerExec.stderr.on("data", (data = "") => {
socket.emit("ServerLog", {
UUID: returnFuntion.uuid,
data: data,
IsStderr: true
});
});
});
// Return
ServerSessions[returnFuntion.uuid] = returnFuntion;
module.exports.BdsRun = returnFuntion;

View File

@ -14,7 +14,6 @@ const express = require("express");
const app = express();
// Express Middleware
const rateLimit = require("express-rate-limit");
const bodyParser = require("body-parser");
const fileUpload = require("express-fileupload");
const pretty = require("express-prettify");
@ -22,13 +21,26 @@ const cors = require("cors");
app.use(cors());
app.use(bodyParser.json()); /* https://github.com/github/fetch/issues/323#issuecomment-331477498 */
app.use(bodyParser.urlencoded({ extended: true }));
app.use(rateLimit({windowMs: 15 * 60 * 1000, /* 15 minutes */ max: 100 /* limit each IP to 100 requests per windowMs*/ }));
app.use(pretty({always: true, spaces: 2}));
app.use(fileUpload({limits: { fileSize: 512 * 1024 }}));
app.use(require("request-ip").mw());
// Routes
// Init Socket.io
const Server = require("http").createServer(app);
const SocketIo = require("socket.io");
const io = new SocketIo.Server(Server);
io.use(function (socket, next) {
if (socket.handshake.query.token) {
if (BdsChecks.token_verify(socket.handshake.query.token)) {
socket.token = socket.handshake.query.token;
next();
}
}
return next(new Error("Token is not valid"));
});
module.exports.SocketIO = io;
// Routes
app.all(["/v2", "/v2/*"], ({res}) => res.status(401).json({
Error: "v2 route moved to root routes"
}));
@ -36,14 +48,14 @@ app.all(["/v2", "/v2/*"], ({res}) => res.status(401).json({
// ? /bds/
app.get(["/bds/info", "/bds", "/"], ({res}) => {
try {
const BdsConfig = BdsManegerCore.getBdsConfig();
const Players = JSON.parse(fs.readFileSync(BdsManegerCore.BdsSettigs.GetPaths("player"), "utf8"))[BdsSettings.GetPlatform()];
const BdsConfig = BdsManegerCore.BdsSettings.GetJsonConfig();
const Players = JSON.parse(fs.readFileSync(BdsManegerCore.BdsSettings.GetPaths("player"), "utf8"))[BdsSettings.GetPlatform()];
const Offline = Players.filter(player => player.Action === "disconnect").filter((thing, index, self) => index === self.findIndex((t) => (t.place === thing.place && t.Player === thing.Player)));
const Online = Players.filter(player => player.Action === "connect").filter((thing, index, self) => index === self.findIndex((t) => (t.place === thing.place && t.Player === thing.Player && Offline.findIndex((t) => (t.place === thing.place && t.Player === thing.Player)) === -1)))
const Info = {
core: {
version: BdsManegerCore.package_json.version,
Total_dependencies: Object.keys(BdsManegerCore.package_json.dependencies).length + Object.keys(BdsManegerCore.package_json.devDependencies).length,
version: BdsManegerCore.version,
Total_dependencies: Object.keys(BdsManegerCore.ExtraJSON.Package.dependencies).length + Object.keys(BdsManegerCore.ExtraJSON.Package.devDependencies).length,
},
server: {
version: BdsConfig.server.versions[BdsSettings.GetPlatform()],
@ -58,14 +70,17 @@ app.get(["/bds/info", "/bds", "/"], ({res}) => {
Arch: BdsManegerCore.arch,
Kernel: BdsSystemInfo.GetKernel(),
Cpu_Model: (os.cpus()[0] || {}).model || null,
IsDocker: false,
IsNpx: false,
IsCLI: false,
Cores: os.cpus().length
},
Backend: {
npx: false,
Docker: false,
CLI: false,
}
}
if (process.env.BDS_DOCKER_IMAGE) Info.host.IsDocker = true;
if (process.env.npm_lifecycle_event === "npx") Info.host.IsNpx = true;
if (process.env.IS_BDS_CLI) Info.host.IsCLI = true;
if (process.env.BDS_DOCKER_IMAGE) Info.Backend.Docker = true;
if (process.env.npm_lifecycle_event === "npx") Info.Backend.npx = true;
if (process.env.IS_BDS_CLI) Info.Backend.CLI = true;
res.json(Info);
} catch (error) {
res.status(500).json({
@ -80,8 +95,8 @@ app.get("/bds/info/server", ({res}) => {
let ServerRunner = require("./BdsManegerServer").BdsRun;
if (!ServerRunner)ServerRunner = {};
try {
const BdsConfig = BdsManegerCore.getBdsConfig();
const Players = JSON.parse(fs.readFileSync(BdsManegerCore.BdsSettigs.GetPaths("player"), "utf8"))[BdsSettings.GetPlatform()];
const BdsConfig = BdsManegerCore.BdsSettings.GetJsonConfig();
const Players = JSON.parse(fs.readFileSync(BdsManegerCore.BdsSettings.GetPaths("player"), "utf8"))[BdsSettings.GetPlatform()];
const Offline = Players.filter(player => player.Action === "disconnect").filter((thing, index, self) => index === self.findIndex((t) => (t.place === thing.place && t.Player === thing.Player)));
const Online = Players.filter(player => player.Action === "connect").filter((thing, index, self) => index === self.findIndex((t) => (t.place === thing.place && t.Player === thing.Player && Offline.findIndex((t) => (t.place === thing.place && t.Player === thing.Player)) === -1)))
const Info = {
@ -91,7 +106,7 @@ app.get("/bds/info/server", ({res}) => {
online: Online.length,
offline: Offline.length,
},
Config: BdsManegerCore.get_config(),
Config: BdsManegerCore.BdsSettings.GetJsonConfig(),
Process: {
PID: ServerRunner.pid || 0,
Uptime: ServerRunner.uptime || 0,
@ -107,9 +122,62 @@ app.get("/bds/info/server", ({res}) => {
}
});
// Check Token
// app.all("*", (req, res, next) => {
// if (req.method === "GET") {
// if (req.query.token) {
// if (BdsChecks.token_verify(req.query.token)) {
// req.token = req.query.token;
// return next();
// }
// } else if (req.headers.token) {
// if (BdsChecks.token_verify(req.headers.token)) {
// req.token = req.headers.token;
// return next();
// }
// } else if (req.query.Token) {
// if (BdsChecks.token_verify(req.query.Token)) {
// req.token = req.query.Token;
// return next();
// }
// } else if (req.headers.Token) {
// if (BdsChecks.token_verify(req.headers.Token)) {
// req.token = req.headers.token;
// return next();
// }
// }
// } else {
// if (req.body.token) {
// if (BdsChecks.token_verify(req.body.token)) {
// req.token = req.body.token;
// return next();
// }
// } else if (req.headers.token) {
// if (BdsChecks.token_verify(req.headers.token)) {
// req.token = req.headers.token;
// return next();
// }
// } else if (req.body.Token) {
// if (BdsChecks.token_verify(req.body.Token)) {
// req.token = req.body.Token;
// return next();
// }
// } else if (req.headers.Token) {
// if (BdsChecks.token_verify(req.headers.Token)) {
// req.token = req.headers.Token;
// return next();
// }
// }
// }
// return res.status(401).json({
// error: "Unauthorized",
// message: "Token is not valid"
// });
// });
// Whitelist
app.get("/bds/info/server/whitelist", (req, res) => {
const ServerConfig = BdsManegerCore.get_config();
const ServerConfig = BdsManegerCore.BdsSettings.GetJsonConfig();
if (ServerConfig.whitelist) {
const { Token = null , Action = null } = req.query;
const WgiteList = BdsSettings.get_whitelist();
@ -120,7 +188,7 @@ app.get("/bds/info/server/whitelist", (req, res) => {
Token: Token,
Time: Date.now()
});
fs.writeFileSync(BdsManegerCore.BdsSettigs.GetPaths("whitelist"), JSON.stringify(WgiteList));
fs.writeFileSync(BdsManegerCore.BdsSettings.GetPaths("whitelist"), JSON.stringify(WgiteList));
res.json({
success: true,
message: "Whitelist Added"
@ -134,7 +202,7 @@ app.get("/bds/info/server/whitelist", (req, res) => {
} else if (Action === "remove") {
if (WgiteList.findIndex(WL => WL.Token === Token) !== -1) {
WgiteList.splice(WgiteList.findIndex(WL => WL.Token === Token), 1);
fs.writeFileSync(BdsManegerCore.BdsSettigs.GetPaths("whitelist"), JSON.stringify(WgiteList));
fs.writeFileSync(BdsManegerCore.BdsSettings.GetPaths("whitelist"), JSON.stringify(WgiteList));
res.json({
success: true,
message: "Whitelist Removed"
@ -260,7 +328,7 @@ app.post("/bds/save_settings", (req, res) => {
// Bds Maneger Bridge Communication
app.get("/bds/bridge", (req, res) => {
const ServerHost = require("./BdsNetwork").host || req.headers.host.replace(/^(.*?):\d+$/, (match, p1) => p1) || require("./BdsNetwork").externalIP.ipv4;
const ServerConfig = BdsManegerCore.get_config();
const ServerConfig = BdsManegerCore.BdsSettings.GetJsonConfig();
res.json({
host: ServerHost,
port: ServerConfig.portv4,
@ -268,7 +336,7 @@ app.get("/bds/bridge", (req, res) => {
});
// ? /player
const GetPlayerJson = (Platform = BdsManegerCore.getBdsConfig().server.platform) => ([...{...JSON.parse(fs.readFileSync(BdsManegerCore.BdsSettigs.GetPaths("player"), "utf8"))}[Platform]]);
const GetPlayerJson = (Platform = BdsManegerCore.BdsSettings.GetJsonConfig().server.platform) => ([...{...JSON.parse(fs.readFileSync(BdsManegerCore.BdsSettings.GetPaths("player"), "utf8"))}[Platform]]);
app.get("/players", (req, res) => {
const { Platform = BdsSettings.GetPlatform(), Player = null, Action = null } = req.query;
let PlayerList = GetPlayerJson(Platform);
@ -417,19 +485,12 @@ function API(port_api = 1932, callback = port => {console.log("Bds Maneger Core
});
});
const port = (port_api || 1932);
app.listen(port, () => {
Server.listen(port, () => {
if (typeof callback === "function") callback(port);
});
return port;
}
function MainAPI(apiConfig = {api_port: 1932}, callback = function (port){console.log("Bds Maneger Core REST API, http port", port)}){
var port_rest = 1932;
if (typeof apiConfig === "object" && apiConfig.api_port !== undefined) port_rest = apiConfig.api_port;
else if (typeof apiConfig === "number") port_rest = apiConfig;
return API(port_rest, callback);
}
// Bds Maneger Core API token Register
const path_tokens = path.join(BdsSettings.bds_dir, "bds_tokens.json");
function token_register(Admin_Scoper = ["web_admin", "admin"]) {
@ -464,9 +525,11 @@ function delete_token(Token = "") {
// Check Exists Tokens Files
if (!(fs.existsSync(path_tokens))) token_register();
module.exports = MainAPI;
module.exports.api = API;
module.exports.BdsRoutes = app;
module.exports.token_register = token_register;
module.exports.delete_token = delete_token;
module.exports.TokensFilePath = path_tokens;
module.exports.TokensFilePath = path_tokens;
module.exports.BdsRoutes = {
App: app,
Server: Server
};