smac
Version:
Scriptcraft SMA Server controller
139 lines (138 loc) • 6.57 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const chalk_1 = __importDefault(require("chalk"));
const ghetto_monad_1 = require("ghetto-monad");
const docker = __importStar(require("../lib/docker"));
const eula_1 = require("../lib/eula");
const paths_1 = require("../lib/paths");
const server_1 = require("../lib/server");
const exit_1 = require("../lib/util/exit");
const name_1 = require("../lib/util/name");
const logs_1 = require("./logs");
const status_1 = require("./status");
const stop_1 = require("./stop");
function startServer(options) {
return __awaiter(this, void 0, void 0, function* () {
let target;
if (options.profile) {
target = options.profile;
}
else {
console.log(options);
const filename = options.file;
server_1.server.filename = filename;
const name = yield name_1.getTargetForCommand({
includeRunningContainer: false,
options,
});
if (name.isNothing) {
console.log('No name provided, and no package.json with a server name found.');
return exit_1.exit();
}
target = name.value;
}
// @TODO
// installJSPluginsIfNeeded()
// installJavaPluginsIfNeeded()
const data = yield status_1.getContainerStatus(target);
if (!data.isError) {
if (data.value.State.Status === 'running') {
console.log(`${target} is already running.`);
return exit_1.exit();
}
if (data.value.State.Status === 'created') {
console.log(`${target} has been created, but is not running. Trying waiting, or stopping it.`);
console.log(`If that doesn't work - check if this issue has been reported at https://github.com/Magikcraft/scriptcraft-sma/issues`);
return exit_1.exit();
}
if (data.value.State.Status === 'exited') {
return stop_1.removeStoppedInstance(target);
}
if (data.value.State.Status === 'paused') {
yield restartPausedContainer(target);
yield status_1.getStatus();
exit_1.exit();
}
}
console.log(`Starting ${target}`);
const result = yield startNewInstance(target, options);
if (!result.isError) {
logs_1.viewLogs({ serverTarget: target, started: true, options });
}
});
}
exports.startServer = startServer;
function restartPausedContainer(name) {
console.log(`Unpausing ${name}`);
return docker.command(`unpause ${name}`);
}
function startNewInstance(name, options) {
return __awaiter(this, void 0, void 0, function* () {
const eulaAccepted = yield eula_1.checkEula();
if (!eulaAccepted) {
console.log('Cannot continue without accepting the Minecraft EULA.');
exit_1.exit();
return new ghetto_monad_1.ErrorResult(new Error('Did not accept Minecraft EULA'));
}
console.log('Minecraft EULA accepted');
const serverType = yield server_1.server.getServerType();
const tag = yield server_1.server.getDockerTag();
const port = yield server_1.server.getExposedPort();
let containerPort = yield server_1.server.getContainerPort();
const bind = yield server_1.server.getBindings(name);
const env = yield server_1.server.getEnvironment();
const rest = yield server_1.server.getRestConfig();
const cache = `--mount source=sma-server-cache,target=${paths_1.dockerServerRoot}/cache`;
const eula = `-e MINECRAFT_EULA_ACCEPTED=${eulaAccepted}`;
const testMode = options.test || (yield server_1.server.getTestMode()) ? `-e TEST_MODE=true` : '';
const dockerImage = yield server_1.server.getDockerImage();
const requireDebug = options.verbose ? '-e DEBUG_REQUIRE=true' : '';
console.log(`Starting ${serverType} server on port ${port}...`);
if (serverType === 'nukkit') {
containerPort += '/udp';
}
const logging = '--log-opt max-size=2m --log-opt max-file=10';
try {
const dc = `run -d -t -p ${port}:${containerPort} -p ${rest.port}:${rest.port} --name ${name} ${logging} ${env} ${eula} ${bind} ${cache} ${testMode} ${requireDebug} --restart always ${dockerImage}:${tag}`;
yield docker.command(dc);
console.log(chalk_1.default.yellow(`Server ${name} started on localhost:${port}\n`));
logOutCommand(dc);
return new ghetto_monad_1.Result(true);
}
catch (e) {
console.log('There was an error starting the server!');
console.log(e
.toString()
.split('--')
.join('\n\t--'));
console.log(`\nTry stopping the server, then starting it again.\n\nIf that doesn't work - check if this issue has been reported at https://github.com/Magikcraft/scriptcraft-sma/issues`);
return new ghetto_monad_1.ErrorResult(new Error());
}
});
}
function logOutCommand(dc) {
console.log('Start command:');
const startCommand = dc.split('--');
const final = startCommand.pop() || '';
const initialLines = startCommand.map(s => `${s} \\`).join('\n\t--');
const finalLine = final ? `\n\t --${final}` : '';
console.log(chalk_1.default.gray(`${initialLines}${finalLine}`));
}