mirror of
https://github.com/Dahlgren/arma-server-web-admin.git
synced 2024-08-30 17:22:10 +00:00
Display and download logs on Wine and Windows
This commit is contained in:
parent
14ff82d9fa
commit
b57d30f8a4
1
app.js
1
app.js
@ -16,6 +16,7 @@ app.use(express.static(__dirname + '/public'));
|
||||
|
||||
var servers = require('./routes/servers');
|
||||
|
||||
app.resource('api/logs', require('./routes/logs'));
|
||||
app.resource('api/missions', require('./routes/missions'));
|
||||
app.resource('api/mods', require('./routes/mods'));
|
||||
var serversResource = app.resource('api/servers', servers);
|
||||
|
@ -9,10 +9,11 @@
|
||||
"dependencies": {
|
||||
"async": "^0.9.0",
|
||||
"express": "3.x",
|
||||
"slug": "~0.4.0",
|
||||
"express-resource": "~1.0.0",
|
||||
"when": "~3.1.0",
|
||||
"playwithsix": "0.0.5",
|
||||
"socket.io": "^1.0.4"
|
||||
"slug": "~0.4.0",
|
||||
"socket.io": "^1.0.4",
|
||||
"userhome": "^1.0.0",
|
||||
"when": "~3.1.0"
|
||||
}
|
||||
}
|
||||
|
15
public/js/app/collections/logs.js
Normal file
15
public/js/app/collections/logs.js
Normal file
@ -0,0 +1,15 @@
|
||||
define(function (require) {
|
||||
|
||||
"use strict";
|
||||
|
||||
var $ = require('jquery'),
|
||||
_ = require('underscore'),
|
||||
Backbone = require('backbone'),
|
||||
Log = require('app/models/log');
|
||||
|
||||
return Backbone.Collection.extend({
|
||||
model: Log,
|
||||
url: '/api/logs/'
|
||||
});
|
||||
|
||||
});
|
15
public/js/app/models/log.js
Normal file
15
public/js/app/models/log.js
Normal file
@ -0,0 +1,15 @@
|
||||
define(function (require) {
|
||||
|
||||
"use strict";
|
||||
|
||||
var $ = require('jquery'),
|
||||
_ = require('underscore'),
|
||||
Backbone = require('backbone');
|
||||
|
||||
return Backbone.Model.extend({
|
||||
defaults: {
|
||||
name: ''
|
||||
}
|
||||
});
|
||||
|
||||
});
|
@ -7,9 +7,11 @@ define(function (require) {
|
||||
LayoutView = require('app/views/layout'),
|
||||
NavigationView = require('app/views/navigation'),
|
||||
ServersView = require('app/views/servers/list'),
|
||||
LogsListView = require('app/views/logs/list'),
|
||||
MissionsView = require('app/views/missions/index'),
|
||||
ModsListView = require('app/views/mods/list'),
|
||||
ServerView = require('app/views/servers/view'),
|
||||
Logs = require('app/collections/logs'),
|
||||
Missions = require('app/collections/missions'),
|
||||
Mods = require('app/collections/mods'),
|
||||
Servers = require('app/collections/servers'),
|
||||
@ -27,6 +29,7 @@ define(function (require) {
|
||||
return Backbone.Router.extend({
|
||||
|
||||
routes: {
|
||||
"logs": "logs",
|
||||
"missions": "missions",
|
||||
"mods": "mods",
|
||||
"servers/:id": "server",
|
||||
@ -49,6 +52,12 @@ define(function (require) {
|
||||
serversView.delegateEvents();
|
||||
},
|
||||
|
||||
logs: function () {
|
||||
var logs = new Logs();
|
||||
logs.fetch();
|
||||
layoutView.content.show(new LogsListView({collection: logs}));
|
||||
},
|
||||
|
||||
missions: function () {
|
||||
layoutView.content.show(missionsView);
|
||||
missionsView.delegateEvents();
|
||||
|
19
public/js/app/views/logs/list.js
Normal file
19
public/js/app/views/logs/list.js
Normal file
@ -0,0 +1,19 @@
|
||||
define(function (require) {
|
||||
|
||||
"use strict";
|
||||
|
||||
var $ = require('jquery'),
|
||||
_ = require('underscore'),
|
||||
Backbone = require('backbone'),
|
||||
Marionette = require('marionette'),
|
||||
ListItemView = require('app/views/logs/list_item'),
|
||||
tpl = require('text!tpl/logs/list.html'),
|
||||
|
||||
template = _.template(tpl);
|
||||
|
||||
return Marionette.CompositeView.extend({
|
||||
itemView: ListItemView,
|
||||
itemViewContainer: "tbody",
|
||||
template: template,
|
||||
});
|
||||
});
|
17
public/js/app/views/logs/list_item.js
Normal file
17
public/js/app/views/logs/list_item.js
Normal file
@ -0,0 +1,17 @@
|
||||
define(function (require) {
|
||||
|
||||
"use strict";
|
||||
|
||||
var $ = require('jquery'),
|
||||
_ = require('underscore'),
|
||||
Backbone = require('backbone'),
|
||||
Marionette = require('marionette'),
|
||||
tpl = require('text!tpl/logs/list_item.html'),
|
||||
|
||||
template = _.template(tpl);
|
||||
|
||||
return Marionette.ItemView.extend({
|
||||
tagName: "tr",
|
||||
template: template,
|
||||
});
|
||||
});
|
10
public/js/tpl/logs/list.html
Normal file
10
public/js/tpl/logs/list.html
Normal file
@ -0,0 +1,10 @@
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Log</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<!-- want to insert collection items, here -->
|
||||
<tbody></tbody>
|
||||
</table>
|
3
public/js/tpl/logs/list_item.html
Normal file
3
public/js/tpl/logs/list_item.html
Normal file
@ -0,0 +1,3 @@
|
||||
<td style="width: 100%;">
|
||||
<a href='/api/logs/<%-name%>'><%-name%></a>
|
||||
</td>
|
@ -12,6 +12,7 @@
|
||||
<div class="navbar-collapse collapse">
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li><a href="#" id="dashboard">Dashboard</a></li>
|
||||
<li><a href="#logs" id="logs">Logs</a></li>
|
||||
<li><a href="#missions" id="missions">Missions</a></li>
|
||||
<li><a href="#mods" id="mods">Mods</a></li>
|
||||
<li><a href="#" id="settings">Settings</a></li>
|
||||
|
91
routes/logs.js
Normal file
91
routes/logs.js
Normal file
@ -0,0 +1,91 @@
|
||||
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());
|
||||
});
|
||||
}, 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);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (logfile) {
|
||||
res.download(logfile);
|
||||
} else {
|
||||
res.send(404, new Error("File not found"));
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
Loading…
Reference in New Issue
Block a user