mirror of
https://github.com/Dahlgren/arma-server-web-admin.git
synced 2024-08-30 17:22:10 +00:00
parent
2509417c08
commit
53c49b8055
9
app.js
9
app.js
@ -4,6 +4,7 @@ var Resource = require('express-resource');
|
||||
var config = require('./config');
|
||||
var Manager = require('./lib/manager');
|
||||
var Mods = require('./lib/mods');
|
||||
var Logs = require('./lib/logs');
|
||||
|
||||
var app = express();
|
||||
var server = require('http').Server(app);
|
||||
@ -19,15 +20,19 @@ app.use(express.bodyParser());
|
||||
app.use(express.methodOverride());
|
||||
app.use(express.static(__dirname + '/public'));
|
||||
|
||||
var manager = new Manager(config);
|
||||
var logs = new Logs(config);
|
||||
|
||||
var manager = new Manager(config, logs);
|
||||
manager.load();
|
||||
|
||||
var mods = new Mods(config);
|
||||
mods.updateMods();
|
||||
|
||||
var logsRoutes = require('./routes/logs')(logs);
|
||||
var serversRoutes = require('./routes/servers')(manager, mods);
|
||||
var modsRoutes = require('./routes/mods')(mods);
|
||||
|
||||
app.resource('api/logs', require('./routes/logs'));
|
||||
app.resource('api/logs', logsRoutes);
|
||||
app.resource('api/missions', require('./routes/missions'));
|
||||
app.resource('api/mods', modsRoutes);
|
||||
var serversResource = app.resource('api/servers', serversRoutes);
|
||||
|
96
lib/logs.js
Normal file
96
lib/logs.js
Normal file
@ -0,0 +1,96 @@
|
||||
var async = require('async');
|
||||
var fs = require('fs.extra');
|
||||
var path = require('path');
|
||||
var userhome = require('userhome');
|
||||
|
||||
var Logs = function (config) {
|
||||
this.config = config;
|
||||
|
||||
if (this.config.type === 'linux') {
|
||||
fs.mkdirp(this.logsPath());
|
||||
}
|
||||
};
|
||||
|
||||
Logs.generateLogFileName = function () {
|
||||
var dateStr = new Date().toISOString().
|
||||
replace(/:/g, '-'). // Replace time dividers with dash
|
||||
replace(/T/, '_'). // Remove date and time divider
|
||||
replace(/\..+/, ''); // Remove milliseconds
|
||||
return 'arma3server_' + dateStr + '.log';
|
||||
};
|
||||
|
||||
Logs.prototype.generateLogFilePath = function () {
|
||||
return path.join(this.logsPath(), Logs.generateLogFileName());
|
||||
};
|
||||
|
||||
Logs.prototype.logsPath = function () {
|
||||
if (this.config.type === 'linux') {
|
||||
return path.join(this.config.path, 'logs');
|
||||
}
|
||||
|
||||
if (this.config.type === 'windows') {
|
||||
return userhome('AppData', 'Local', 'Arma 3');
|
||||
}
|
||||
|
||||
if (this.config.type === 'wine') {
|
||||
var username = process.env.USER;
|
||||
return userhome('.wine', 'drive_c', 'users', username, 'Local Settings', 'Application Data', 'Arma 3');
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
Logs.prototype.logFiles = function (callback) {
|
||||
var directory = this.logsPath();
|
||||
|
||||
if (directory === null) {
|
||||
callback(null, []);
|
||||
}
|
||||
|
||||
fs.readdir(directory, function (err, files) {
|
||||
if (err) {
|
||||
callback (err);
|
||||
return;
|
||||
}
|
||||
|
||||
files = files.map(function (file) {
|
||||
return {
|
||||
name: file,
|
||||
path: path.join(directory, file),
|
||||
};
|
||||
});
|
||||
|
||||
async.filter(files, function(file, cb) {
|
||||
fs.stat(file.path, function (err, stat) {
|
||||
file.size = stat.size;
|
||||
cb(!err && stat.isFile());
|
||||
});
|
||||
}, function (files) {
|
||||
files.sort(function (a, b) {
|
||||
return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
|
||||
});
|
||||
|
||||
callback(null, files);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
Logs.prototype.getLogFile = function (filename, callback) {
|
||||
logsManager.logFiles(function (err, files) {
|
||||
if (err) {
|
||||
callback(err);
|
||||
} else {
|
||||
var validLogs = files.filter(function (file) {
|
||||
return file.name === requestedFilename;
|
||||
});
|
||||
|
||||
if (validLogs.length > 0) {
|
||||
callback(null, logfile[0]);
|
||||
} else {
|
||||
callback(null, null);
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = Logs;
|
@ -5,8 +5,9 @@ var Server = require('./server');
|
||||
|
||||
var filePath = "servers.json";
|
||||
|
||||
var Manager = function (config) {
|
||||
var Manager = function (config, logs) {
|
||||
this.config = config;
|
||||
this.logs = logs;
|
||||
this.serversArr = [];
|
||||
this.serversHash = {};
|
||||
};
|
||||
@ -40,7 +41,7 @@ Manager.prototype.removeServer = (function (id) {
|
||||
});
|
||||
|
||||
Manager.prototype._addServer = (function (data) {
|
||||
var server = new Server(this.config.path, this.config.type, data);
|
||||
var server = new Server(this.config, this.logs, data);
|
||||
this.serversArr.push(server);
|
||||
this.serversArr.sort(function(a, b) {
|
||||
return a.title.localeCompare(b.title);
|
||||
|
@ -1,4 +1,5 @@
|
||||
var events = require('events');
|
||||
var fs = require('fs');
|
||||
var gamedig = require('gamedig');
|
||||
var slug = require('slug');
|
||||
var spawn = require('child_process').spawn;
|
||||
@ -30,9 +31,9 @@ var createServerTitle = function(title) {
|
||||
return title;
|
||||
};
|
||||
|
||||
var Server = function (path, type, options) {
|
||||
this.path = path;
|
||||
this.type = type;
|
||||
var Server = function (config, logs, options) {
|
||||
this.config = config;
|
||||
this.logs = logs;
|
||||
this.update(options);
|
||||
};
|
||||
|
||||
@ -96,9 +97,9 @@ Server.prototype.start = function() {
|
||||
mods: this.mods,
|
||||
password: this.password,
|
||||
passwordAdmin: this.admin_password,
|
||||
path: this.path,
|
||||
path: this.config.path,
|
||||
persistent: this.persistent ? 1 : 0,
|
||||
platform: this.type,
|
||||
platform: this.config.type,
|
||||
players: this.max_players,
|
||||
port: this.port,
|
||||
});
|
||||
@ -106,16 +107,28 @@ Server.prototype.start = function() {
|
||||
var instance = server.start();
|
||||
var self = this;
|
||||
|
||||
var logStream = null;
|
||||
if (this.config.type === 'linux') {
|
||||
logStream = fs.createWriteStream(this.logs.generateLogFilePath(), {
|
||||
'flags': 'a'
|
||||
});
|
||||
}
|
||||
|
||||
instance.stdout.on('data', function (data) {
|
||||
console.log(self.id + ': ' + data);
|
||||
if (logStream) {
|
||||
logStream.write(data);
|
||||
}
|
||||
});
|
||||
|
||||
instance.stderr.on('data', function (data) {
|
||||
console.log(self.id + ' err: ' + data);
|
||||
if (logStream) {
|
||||
logStream.write(data);
|
||||
}
|
||||
});
|
||||
|
||||
instance.on('close', function (code) {
|
||||
console.log(self.id + ' exited with code ' + code);
|
||||
logStream.end();
|
||||
|
||||
clearInterval(self.queryStatusInterval);
|
||||
self.state = null;
|
||||
self.pid = null;
|
||||
@ -136,8 +149,8 @@ Server.prototype.start = function() {
|
||||
host: "127.0.0.1",
|
||||
mods: this.mods,
|
||||
password: this.password,
|
||||
path: this.path,
|
||||
platform: this.type,
|
||||
path: this.config.path,
|
||||
platform: this.config.type,
|
||||
port: this.port,
|
||||
});
|
||||
var headlessInstance = headless.start();
|
||||
|
@ -25,6 +25,7 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"mocha": "~2.1.0",
|
||||
"should": "~5.0.0"
|
||||
"should": "~5.0.0",
|
||||
"timekeeper": "0.0.5"
|
||||
}
|
||||
}
|
||||
|
112
routes/logs.js
112
routes/logs.js
@ -1,91 +1,31 @@
|
||||
var async = require('async');
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var userhome = require('userhome');
|
||||
|
||||
var config = require('./../config');
|
||||
|
||||
function logsPath() {
|
||||
if (config.type === "windows") {
|
||||
return userhome('AppData', 'Local', 'Arma 3');
|
||||
}
|
||||
|
||||
if (config.type === "wine") {
|
||||
var username = process.env.USER;
|
||||
return userhome('.wine', 'drive_c', 'users', username, 'Local Settings', 'Application Data', 'Arma 3');
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function logFiles(directory, callback) {
|
||||
fs.readdir(directory, function (err, files) {
|
||||
if (err) {
|
||||
callback (err);
|
||||
return;
|
||||
}
|
||||
|
||||
files = files.map(function (file) {
|
||||
return path.join(directory, file);
|
||||
});
|
||||
|
||||
async.filter(files, function(file, cb) {
|
||||
fs.stat(file, function (err, file) {
|
||||
cb(!err && file.isFile());
|
||||
module.exports = function (logsManager) {
|
||||
return {
|
||||
index: function(req, res){
|
||||
logsManager.logFiles(function (err, files) {
|
||||
if (err) {
|
||||
res.send(err);
|
||||
} else {
|
||||
res.send(files);
|
||||
}
|
||||
});
|
||||
}, function (files) {
|
||||
callback(null, files.map(path.basename).sort());
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
exports.index = function(req, res){
|
||||
var pathToLogs = logsPath();
|
||||
|
||||
if (pathToLogs === null) {
|
||||
res.send([]);
|
||||
} else {
|
||||
logFiles(pathToLogs, function (err, files) {
|
||||
if (err) {
|
||||
res.send(err);
|
||||
} else {
|
||||
var logs = files.map(function (filename) {
|
||||
return { name: filename };
|
||||
});
|
||||
res.send(logs);
|
||||
},
|
||||
show: function(req, res){
|
||||
var requestedFilename = req.params.log;
|
||||
if (req.format) {
|
||||
requestedFilename += "." + req.format;
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
exports.show = function(req, res){
|
||||
var pathToLogs = logsPath();
|
||||
|
||||
var requestedFilename = req.params.log;
|
||||
if (req.format) {
|
||||
requestedFilename += "." + req.format;
|
||||
}
|
||||
|
||||
if (pathToLogs === null) {
|
||||
res.send(404, new Error("File not found"));
|
||||
} else {
|
||||
logFiles(pathToLogs, function (err, files) {
|
||||
var logfile = null;
|
||||
if (err) {
|
||||
res.send(err);
|
||||
} else {
|
||||
var logs = files.map(function (filename) {
|
||||
if (filename === requestedFilename) {
|
||||
logfile = path.join(pathToLogs, filename);
|
||||
logs.getLogFile(requestedFilename, function (err, file) {
|
||||
if (err) {
|
||||
res.send(err);
|
||||
} else {
|
||||
if (file) {
|
||||
res.download(file.path);
|
||||
} else {
|
||||
res.send(404, new Error("File not found"));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (logfile) {
|
||||
res.download(logfile);
|
||||
} else {
|
||||
res.send(404, new Error("File not found"));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
};
|
||||
};
|
||||
|
30
test/lib/logs.js
Normal file
30
test/lib/logs.js
Normal file
@ -0,0 +1,30 @@
|
||||
var should = require('should');
|
||||
var tk = require('timekeeper');
|
||||
|
||||
var Logs = require('../../lib/logs.js');
|
||||
var logs = new Logs({
|
||||
path: '/tmp/',
|
||||
type: 'linux'
|
||||
});
|
||||
|
||||
describe('Logs', function() {
|
||||
beforeEach(function() {
|
||||
tk.freeze(1445455712000); // 2015-10-21 19:28:32
|
||||
});
|
||||
|
||||
afterEach(function() {
|
||||
tk.reset();
|
||||
});
|
||||
|
||||
describe('generateLogFileName()', function() {
|
||||
it('should generate valid file name', function() {
|
||||
Logs.generateLogFileName().should.eql('arma3server_2015-10-21_19-28-32.log');
|
||||
});
|
||||
});
|
||||
|
||||
describe('generateLogFilePath()', function() {
|
||||
it('should generate valid file path', function() {
|
||||
logs.generateLogFilePath().should.eql('/tmp/logs/arma3server_2015-10-21_19-28-32.log');
|
||||
});
|
||||
});
|
||||
});
|
Loading…
x
Reference in New Issue
Block a user