Display and download logs on Wine and Windows

This commit is contained in:
Björn Dahlgren 2014-09-28 16:50:03 +08:00
parent 14ff82d9fa
commit b57d30f8a4
11 changed files with 185 additions and 3 deletions

1
app.js
View File

@ -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);

View File

@ -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"
}
}

View 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/'
});
});

View File

@ -0,0 +1,15 @@
define(function (require) {
"use strict";
var $ = require('jquery'),
_ = require('underscore'),
Backbone = require('backbone');
return Backbone.Model.extend({
defaults: {
name: ''
}
});
});

View File

@ -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();

View 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,
});
});

View 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,
});
});

View 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>

View File

@ -0,0 +1,3 @@
<td style="width: 100%;">
<a href='/api/logs/<%-name%>'><%-name%></a>
</td>

View File

@ -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
View 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"));
}
});
}
};