diff --git a/app/MinecraftServer.js b/app/MinecraftServer.js index e4cdefd..40e0a56 100644 --- a/app/MinecraftServer.js +++ b/app/MinecraftServer.js @@ -8,7 +8,9 @@ class Server { // read version file var versionFilePath = this.rootDir + '/current_version.txt'; - this.version = fs.readFileSync(versionFilePath, {encoding:'utf8', flag:'r'}); + if (fs.existsSync(versionFilePath)) { + this.version = fs.readFileSync(versionFilePath, {encoding:'utf8', flag:'r'}); + } // set server state if (fs.existsSync(this.pidFilePath)) { diff --git a/config/default.json b/config/default.json new file mode 100644 index 0000000..af6e59f --- /dev/null +++ b/config/default.json @@ -0,0 +1,3 @@ +{ + "server_directory": "/opt/minecraft" +} diff --git a/index.js b/index.js index 331d809..474a81b 100644 --- a/index.js +++ b/index.js @@ -5,11 +5,19 @@ const port = 3000; // set template engine to Pug app.set('view engine', 'pug'); +// Using express.urlencoded middleware +app.use(express.urlencoded({ + extended: true +})); + // import route handlers var homeRoutes = require('./routes/home'); +var serverRoutes = require('./routes/server'); // define routes app.get('/', homeRoutes.getIndex); +app.get('/server/create', serverRoutes.getCreate); +app.post('/server/create', serverRoutes.postCreate); // set Express to serve static files (ideally this is only used in development) app.use(express.static('./static/')); diff --git a/routes/home.js b/routes/home.js index 49aab48..52961af 100644 --- a/routes/home.js +++ b/routes/home.js @@ -1,8 +1,19 @@ +const config = require('config'); +const fs = require('fs'); +const path = require('path'); const minecraft = require('../app/MinecraftServer'); exports.getIndex = function(req, res) { - var server = new minecraft.Server('/opt/minecraft/bg_w3'); + // search for minecraft server directories + let rootDir = config.get('server_directory'); + let serverDirs = fs.readdirSync(rootDir); + let servers = []; + for (let i = 0; i < serverDirs.length; i++) { + servers.push(new minecraft.Server(path.join(rootDir, serverDirs[i]))); + } + + // render view res.render('index', { - servers: [server], + servers: servers, }); }; diff --git a/routes/server.js b/routes/server.js new file mode 100644 index 0000000..7eae740 --- /dev/null +++ b/routes/server.js @@ -0,0 +1,45 @@ +const config = require('config'); +const fs = require('fs'); +const https = require('https'); +const path = require('path'); + +exports.getCreate = function(req, res) { + // render view + res.render('create'); +}; + +exports.postCreate = function(req, res) { + mcDir = config.get('server_directory'); + serverDir = path.join(mcDir, req.body.serverName); + + // make server directory + fs.mkdirSync(serverDir); + + // grab the server JAR file + serverJarUrl = 'https://piston-data.mojang.com/v1/objects/f69c284232d7c7580bd89a5a4931c3581eae1378/server.jar'; + serverJarName = "server_" + req.body.serverVersion + ".jar"; + serverJarPath = path.join(serverDir, serverJarName); + https.get(serverJarUrl, (res) => { + const filePath = fs.createWriteStream(serverJarPath); + res.pipe(filePath); + filePath.on('finish', () => { + filePath.close(); + console.log('Download Completed'); + }); + }); + + // create the start.sh shell script + scriptFilePath = path.join(serverDir, 'start.sh'); + scriptContent = "#!/bin/sh\n\ncd " + serverDir + "\njava -Xmx2048M -Xms2048M -jar server_" + req.body.serverVersion + ".jar nogui"; + fs.writeFileSync(scriptFilePath, scriptContent); + fs.chmodSync(scriptFilePath, 0o755); + + // save the current version to a text file - this will hopefully be temporary solution + versionFilePath = path.join(serverDir, 'current_version.txt'); + versionContent = req.body.serverVersion; + fs.writeFileSync(versionFilePath, versionContent); + fs.chmodSync(versionFilePath, 0o644); + + // redirect the user back to the home page + res.redirect('/'); +}; diff --git a/views/create.pug b/views/create.pug new file mode 100644 index 0000000..6a55235 --- /dev/null +++ b/views/create.pug @@ -0,0 +1,24 @@ +extends layout.pug + +block content + header.row + div.columns.twelve + h1 Create new server + + section.row + div.columns.twelve + form(action='/server/create', method='POST') + div.row + div.columns.six + label(for='serverName') Server name: + input#serverName.u-full-width(name='serverName', type='text', placeholder='MyServer') + div.columns.six + label(for='serverVersion') Minecraft version: + input#serverVersion.u-full-width(name='serverVersion', type='text', placeholder='1.19.2') + + input(type='submit', value='Submit') + + div.row + div.columns.twelve + p + a(href='/') Back diff --git a/views/layout.pug b/views/layout.pug index 4fa9649..44990e0 100644 --- a/views/layout.pug +++ b/views/layout.pug @@ -13,7 +13,7 @@ html(lang="en") ul li.menu-text MCST li: a(href='/') Home - li: a(href='/create') Create + li: a(href='/server/create') Create li: a(href='/status') Status // main content