fivem-docker-cli
Version:
Command-line tool to create and administer FiveM Servers running in Docker.
123 lines (114 loc) • 4.08 kB
JavaScript
const {Command, flags} = require('@oclif/command');
const inquirer = require('inquirer');
const Docker = require('dockerode');
const docker = new Docker({socketPath: '/var/run/docker.sock'});
class InitCommand extends Command {
async run() {
const {flags} = this.parse(InitCommand);
let usedPorts = [];
let startingPort = 30120;
let endingPort = 30139;
let availablePorts = [];
let availablePort;
let servername = flags.servername;
let licensekey = flags.licensekey;
let rconpass = flags.rconpass;
if (!flags.servername) {
let responses = await inquirer.prompt([{
name: 'servername',
message: 'Enter a name for your server. \n>',
type: 'input'
}]);
servername = responses.servername
}
if (!flags.licensekey) {
let responses = await inquirer.prompt([{
name: 'licensekey',
message: 'Enter your server license key. This can be obtained from https://keymaster.fivem.net. \n>',
type: 'input'
}]);
licensekey = responses.licensekey;
}
if (!flags.rconpass) {
let responses = await inquirer.prompt([{
name: 'rconpass',
message: 'Enter the password you would like to use for RCON access. \n>',
type: 'input'
}]);
rconpass = responses.rconpass;
}
docker.listContainers({
all: true,
}).then(containers => {
containers.forEach(container => {
console.log(container.Names + ":");
docker.getContainer(container.Id).inspect(data => {
console.table(data);
});
container.Ports.forEach(port => {
console.log('Public Port: ' + port.PublicPort + '/' + port.Type);
// port = parseInt(port, 10);
// port.PublicPort(value => {
// value = parseInt(value, 10);
// if (value !== port) {
// usedPorts.push(value);
// }
// });
});
});
}).catch(err => {
console.error(err);
});
// TODO: Get this fixed.
// function getAvailablePort () {
// for (let i = startingPort; i <= endingPort; i++) {
// console.log('Checking port: ' + i);
// console.table(usedPorts);
// usedPorts.forEach(port => {
// console.log('Used Port: ' + port);
// if (port !== i) {
// console.log('Available Port: ' + i);
// availablePorts.push(i);
// console.table(availablePorts);
// }
// });
// }
// availablePort = availablePorts[0];
// }
// docker.createContainer({
// name: "fivem-" + servername, //TODO: Assign the specified name to the container. Must match /?[a-zA-Z0-9_-]+
// Image: 'spritsail/fivem',
// RestartPolicy: {
// name: 'unless-stopped'
// },
// Binds: [
// "/volumes/fivem/" + servername + ":/config"
// ],
// Env: ["LICENCE_KEY=" + licensekey, "RCON_PASSWORD=" + rconpass],
// PortBindings: {
// "30120/tcp": [{ "HostIp": "", "HostPort": availablePort }],
// "30120/udp": [{ "HostIp": "", "HostPort": availablePort }]
// }
// }).then(container => {
// console.log('FiveM Container Started:');
// console.log('ID: ' + container.id);
// console.log('Name: ' + container.name);
// console.log('Ports: ' + container.PortBindings.);
// console.log('Directory: ' + )
// return container.start();
// }).catch(error => {
// console.error(error.id + ": " + error.message);
// });
// end
}
}
InitCommand.description = `Creates a new FiveM server running in Docker
...
Extra documentation goes here
`;
InitCommand.flags = {
servername: flags.string({char: 's', description: 'Server name to identify the server internally'}),
licensekey: flags.string({char: 'k', description: 'Server license key - This can be obtained from https://keymaster.fivem.net'}),
rconpass: flags.string({description: 'Password for RCON access'})
};
module.exports = InitCommand;