2014-03-12 23:37:27 -07:00
|
|
|
|
2014-03-14 00:18:51 -07:00
|
|
|
var fs = require('fs');
|
|
|
|
var path = require('path');
|
2014-03-12 23:37:27 -07:00
|
|
|
|
2014-03-14 00:18:51 -07:00
|
|
|
var async = require('async');
|
2014-03-12 23:37:27 -07:00
|
|
|
var dot = require('dot');
|
|
|
|
var express = require('express');
|
2014-04-10 18:33:41 -07:00
|
|
|
var bodyParser = require('body-parser');
|
|
|
|
var compress = require('compression');
|
2014-03-12 23:37:27 -07:00
|
|
|
|
2014-03-26 19:12:52 -07:00
|
|
|
var watch = require('node-watch');
|
|
|
|
|
2014-03-25 15:21:17 -07:00
|
|
|
var api = require('./api.js');
|
2014-03-12 23:37:27 -07:00
|
|
|
|
2014-03-13 14:03:28 -07:00
|
|
|
|
2014-03-12 23:37:27 -07:00
|
|
|
module.exports = function(logger){
|
|
|
|
|
|
|
|
var portalConfig = JSON.parse(process.env.portalConfig);
|
|
|
|
var poolConfigs = JSON.parse(process.env.pools);
|
|
|
|
|
2014-03-18 23:54:18 -07:00
|
|
|
var websiteConfig = portalConfig.website;
|
2014-03-14 00:18:51 -07:00
|
|
|
|
2014-03-25 15:21:17 -07:00
|
|
|
var portalApi = new api(logger, portalConfig, poolConfigs);
|
|
|
|
var portalStats = portalApi.stats;
|
2014-03-14 00:18:51 -07:00
|
|
|
|
2014-03-22 23:16:06 -07:00
|
|
|
var logSystem = 'Website';
|
2014-03-12 23:37:27 -07:00
|
|
|
|
2014-03-18 23:54:18 -07:00
|
|
|
|
|
|
|
var pageFiles = {
|
|
|
|
'index.html': 'index',
|
|
|
|
'home.html': '',
|
|
|
|
'getting_started.html': 'getting_started',
|
|
|
|
'stats.html': 'stats',
|
2014-04-10 18:33:41 -07:00
|
|
|
'api.html': 'api',
|
|
|
|
'admin.html': 'admin'
|
2014-03-14 00:18:51 -07:00
|
|
|
};
|
|
|
|
|
2014-03-18 23:54:18 -07:00
|
|
|
var pageTemplates = {};
|
|
|
|
|
|
|
|
var pageProcessed = {};
|
2014-03-20 15:25:59 -07:00
|
|
|
var indexesProcessed = {};
|
2014-03-14 00:18:51 -07:00
|
|
|
|
|
|
|
|
2014-03-18 23:54:18 -07:00
|
|
|
var processTemplates = function(){
|
2014-03-20 15:25:59 -07:00
|
|
|
|
2014-03-18 23:54:18 -07:00
|
|
|
for (var pageName in pageTemplates){
|
2014-03-20 15:25:59 -07:00
|
|
|
if (pageName === 'index') continue;
|
2014-03-18 23:54:18 -07:00
|
|
|
pageProcessed[pageName] = pageTemplates[pageName]({
|
|
|
|
poolsConfigs: poolConfigs,
|
2014-03-19 13:24:29 -07:00
|
|
|
stats: portalStats.stats,
|
2014-03-19 00:26:20 -07:00
|
|
|
portalConfig: portalConfig
|
2014-03-18 23:54:18 -07:00
|
|
|
});
|
2014-03-20 15:25:59 -07:00
|
|
|
indexesProcessed[pageName] = pageTemplates.index({
|
|
|
|
page: pageProcessed[pageName],
|
|
|
|
selected: pageName,
|
|
|
|
stats: portalStats.stats,
|
|
|
|
poolConfigs: poolConfigs,
|
|
|
|
portalConfig: portalConfig
|
|
|
|
});
|
2014-03-18 23:54:18 -07:00
|
|
|
}
|
2014-03-26 19:53:30 -07:00
|
|
|
|
|
|
|
//logger.debug(logSystem, 'Stats', 'Website updated to latest stats');
|
2014-03-18 23:54:18 -07:00
|
|
|
};
|
2014-03-14 00:18:51 -07:00
|
|
|
|
|
|
|
|
2014-04-10 18:33:41 -07:00
|
|
|
|
|
|
|
var readPageFiles = function(files){
|
|
|
|
async.each(files, function(fileName, callback){
|
2014-03-19 13:36:44 -07:00
|
|
|
var filePath = 'website/' + (fileName === 'index.html' ? '' : 'pages/') + fileName;
|
|
|
|
fs.readFile(filePath, 'utf8', function(err, data){
|
2014-03-18 23:54:18 -07:00
|
|
|
var pTemp = dot.template(data);
|
|
|
|
pageTemplates[pageFiles[fileName]] = pTemp
|
|
|
|
callback();
|
|
|
|
});
|
|
|
|
}, function(err){
|
|
|
|
if (err){
|
|
|
|
console.log('error reading files for creating dot templates: '+ JSON.stringify(err));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
processTemplates();
|
2014-03-14 00:18:51 -07:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2014-04-10 18:33:41 -07:00
|
|
|
//If an html file was changed reload it
|
2014-03-26 19:12:52 -07:00
|
|
|
watch('website', function(filename){
|
2014-04-10 18:33:41 -07:00
|
|
|
var basename = path.basename(filename);
|
|
|
|
if (basename in pageFiles){
|
|
|
|
console.log(filename);
|
|
|
|
readPageFiles([basename]);
|
|
|
|
logger.debug(logSystem, 'Server', 'Reloaded file ' + basename);
|
|
|
|
}
|
2014-03-18 23:54:18 -07:00
|
|
|
});
|
|
|
|
|
2014-03-25 15:21:17 -07:00
|
|
|
portalStats.getGlobalStats(function(){
|
2014-03-18 23:54:18 -07:00
|
|
|
readPageFiles(Object.keys(pageFiles));
|
2014-03-14 00:18:51 -07:00
|
|
|
});
|
|
|
|
|
2014-03-18 23:54:18 -07:00
|
|
|
var buildUpdatedWebsite = function(){
|
2014-03-25 15:21:17 -07:00
|
|
|
portalStats.getGlobalStats(function(){
|
2014-03-18 23:54:18 -07:00
|
|
|
processTemplates();
|
2014-03-19 13:24:29 -07:00
|
|
|
|
|
|
|
var statData = 'data: ' + JSON.stringify(portalStats.stats) + '\n\n';
|
2014-03-25 15:21:17 -07:00
|
|
|
for (var uid in portalApi.liveStatConnections){
|
|
|
|
var res = portalApi.liveStatConnections[uid];
|
2014-03-19 13:24:29 -07:00
|
|
|
res.write(statData);
|
|
|
|
}
|
|
|
|
|
2014-03-18 23:54:18 -07:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2014-04-10 18:33:41 -07:00
|
|
|
setInterval(buildUpdatedWebsite, websiteConfig.stats.updateInterval * 1000);
|
2014-03-18 23:54:18 -07:00
|
|
|
|
2014-03-14 00:18:51 -07:00
|
|
|
|
2014-03-12 23:37:27 -07:00
|
|
|
|
2014-03-18 23:54:18 -07:00
|
|
|
var getPage = function(pageId){
|
|
|
|
if (pageId in pageProcessed){
|
|
|
|
var requestedPage = pageProcessed[pageId];
|
|
|
|
return requestedPage;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
var route = function(req, res, next){
|
|
|
|
var pageId = req.params.page || '';
|
2014-03-20 15:25:59 -07:00
|
|
|
if (pageId in indexesProcessed){
|
|
|
|
res.end(indexesProcessed[pageId]);
|
2014-03-18 23:54:18 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
next();
|
2014-03-14 00:18:51 -07:00
|
|
|
|
2014-03-18 23:54:18 -07:00
|
|
|
};
|
2014-03-14 00:18:51 -07:00
|
|
|
|
2014-03-19 13:24:29 -07:00
|
|
|
|
|
|
|
|
2014-04-10 18:33:41 -07:00
|
|
|
var app = express();
|
|
|
|
|
|
|
|
|
|
|
|
app.use(bodyParser.json());
|
|
|
|
|
2014-03-25 15:21:17 -07:00
|
|
|
app.get('/get_page', function(req, res, next){
|
|
|
|
var requestedPage = getPage(req.query.id);
|
|
|
|
if (requestedPage){
|
|
|
|
res.end(requestedPage);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
next();
|
|
|
|
});
|
2014-03-19 13:24:29 -07:00
|
|
|
|
2014-03-18 23:54:18 -07:00
|
|
|
app.get('/:page', route);
|
|
|
|
app.get('/', route);
|
2014-03-14 00:18:51 -07:00
|
|
|
|
2014-03-18 23:54:18 -07:00
|
|
|
app.get('/api/:method', function(req, res, next){
|
2014-03-25 15:21:17 -07:00
|
|
|
portalApi.handleApiRequest(req, res, next);
|
2014-03-12 23:37:27 -07:00
|
|
|
});
|
|
|
|
|
2014-04-10 18:33:41 -07:00
|
|
|
app.post('/api/admin/:method', function(req, res, next){
|
|
|
|
if (portalConfig.website
|
|
|
|
&& portalConfig.website.adminCenter
|
|
|
|
&& portalConfig.website.adminCenter.enabled){
|
|
|
|
if (portalConfig.website.adminCenter.password === req.body.password)
|
|
|
|
portalApi.handleAdminApiRequest(req, res, next);
|
|
|
|
else
|
|
|
|
res.send(401, JSON.stringify({error: 'Incorrect Password'}));
|
|
|
|
|
|
|
|
}
|
|
|
|
else
|
|
|
|
next();
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
app.use(compress());
|
2014-03-19 13:36:44 -07:00
|
|
|
app.use('/static', express.static('website/static'));
|
2014-03-18 23:54:18 -07:00
|
|
|
|
2014-03-12 23:37:27 -07:00
|
|
|
app.use(function(err, req, res, next){
|
|
|
|
console.error(err.stack);
|
2014-04-10 18:33:41 -07:00
|
|
|
res.send(500, 'Something broke!');
|
2014-03-12 23:37:27 -07:00
|
|
|
});
|
|
|
|
|
|
|
|
app.listen(portalConfig.website.port, function(){
|
2014-03-22 23:16:06 -07:00
|
|
|
logger.debug(logSystem, 'Server', 'Website started on port ' + portalConfig.website.port);
|
2014-03-12 23:37:27 -07:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
};
|