798dda8f12
This changes the handshake sequence to use “bootTime” (a unique key based off the time) to make sure the frontend configuration matches the current one. If not, the client pulls the update and validates before requesting the listing.
104 lines
2.4 KiB
JavaScript
104 lines
2.4 KiB
JavaScript
var http = require('http');
|
|
var fs = require('fs');
|
|
var url = require('url');
|
|
var mime = require('mime');
|
|
var io = require('socket.io');
|
|
|
|
var util = require('./util');
|
|
var logger = require('./logger');
|
|
|
|
var config = require('../config.json');
|
|
var servers = require('../servers.json');
|
|
|
|
var urlMapping = [];
|
|
|
|
function setupRoutes() {
|
|
var routeKeys = Object.keys(config.routes);
|
|
|
|
// Map the (static) routes from our config.
|
|
for (var i = 0; i < routeKeys.length; i++) {
|
|
urlMapping[routeKeys[i]] = config.routes[routeKeys[i]];
|
|
}
|
|
|
|
logger.log('info', 'Routes: %s', routeKeys);
|
|
}
|
|
|
|
function handleRequest(req, res) {
|
|
var requestUrl = url.parse(req.url).pathname;
|
|
|
|
logger.log('info', '%s requested: %s', req.connection.remoteAddress, requestUrl);
|
|
|
|
if (requestUrl === '/status.json') {
|
|
res.setHeader('Content-Type', 'text/plain');
|
|
|
|
res.write(JSON.stringify({
|
|
error: true,
|
|
message: 'API deprecated.'
|
|
}));
|
|
|
|
res.end();
|
|
} else if (requestUrl === '/publicConfig.json') {
|
|
res.setHeader('Content-Type', 'application/javascript');
|
|
|
|
var categories = config.serverCategories;
|
|
|
|
// Legacy support for people without categories configured.
|
|
if (!categories) {
|
|
categories = {
|
|
'default': 'All Networks'
|
|
};
|
|
}
|
|
|
|
for (var i = 0; i < servers.length; i++) {
|
|
var entry = servers[i];
|
|
|
|
if (!entry.category) {
|
|
entry.category = 'default';
|
|
|
|
logger.warn('%s has no category, defaulting!', entry.name);
|
|
} else if (!categories[entry.category]) {
|
|
logger.warn('%s has an unknown category (%s), defaulting!', entry.name, entry.category);
|
|
|
|
entry.category = 'default';
|
|
}
|
|
}
|
|
|
|
var publicConfig = {
|
|
categories: categories,
|
|
graphDuration: config.graphDuration,
|
|
servers: servers,
|
|
bootTime: util.getBootTime()
|
|
};
|
|
|
|
res.write('setPublicConfig(' + JSON.stringify(publicConfig) + ');');
|
|
|
|
res.end();
|
|
} else if (requestUrl in urlMapping) {
|
|
var file = urlMapping[requestUrl];
|
|
|
|
res.setHeader('Content-Type', mime.lookup(file));
|
|
|
|
fs.createReadStream(file).pipe(res);
|
|
} else {
|
|
res.statusCode = 404;
|
|
|
|
res.write('404');
|
|
|
|
res.end();
|
|
}
|
|
}
|
|
|
|
exports.start = function() {
|
|
setupRoutes();
|
|
|
|
// Create our tiny little HTTP server.
|
|
var server = http.createServer(handleRequest);
|
|
|
|
server.listen(config.site.port, config.site.ip);
|
|
|
|
// I don't like this. But it works, I think.
|
|
exports.io = io.listen(server);
|
|
|
|
// Since everything is loaded, let's celebrate!
|
|
logger.log('info', 'Started on %s:%d', config.site.ip, config.site.port);
|
|
}; |