s-nomp/init.js

234 lines
7.0 KiB
JavaScript
Raw Normal View History

2014-02-20 15:13:50 -08:00
var fs = require('fs');
var os = require('os');
var cluster = require('cluster');
<<<<<<< HEAD
2014-03-14 12:02:55 -07:00
var posix = require('posix');
var PoolLogger = require('./libs/logutils.js');
var BlocknotifyListener = require('./libs/blocknotifyListener.js');
var RedisBlocknotifyListener = require('./libs/redisblocknotifyListener.js');
var WorkerListener = require('./libs/workerListener.js');
var PoolWorker = require('./libs/poolWorker.js');
var PaymentProcessor = require('./libs/paymentProcessor.js');
JSON.minify = JSON.minify || require("node-json-minify");
2014-03-14 12:02:55 -07:00
=======
2014-02-20 15:13:50 -08:00
var posix = require('posix');
2014-03-13 14:03:28 -07:00
var PoolLogger = require('./libs/logUtil.js');
var BlocknotifyListener = require('./libs/blocknotifyListener.js');
var WorkerListener = require('./libs/workerListener.js');
var PoolWorker = require('./libs/poolWorker.js');
2014-03-09 19:31:58 -07:00
var PaymentProcessor = require('./libs/paymentProcessor.js');
2014-03-12 23:37:27 -07:00
var Website = require('./libs/website.js');
JSON.minify = JSON.minify || require("node-json-minify");
2014-02-20 15:13:50 -08:00
2014-03-13 14:03:28 -07:00
var portalConfig = JSON.parse(JSON.minify(fs.readFileSync("config.json", {encoding: 'utf8'})));
>>>>>>> 0db53a296f9b77ad6ff76b5f06c7156d5366a777
var loggerInstance = new PoolLogger({
2014-03-13 14:03:28 -07:00
logLevel: portalConfig.logLevel
});
2014-01-13 17:32:54 -08:00
var logDebug = loggerInstance.logDebug;
var logWarning = loggerInstance.logWarning;
var logError = loggerInstance.logError;
2014-01-13 17:32:54 -08:00
2014-03-09 19:31:58 -07:00
//Try to give process ability to handle 100k concurrent connections
try{
posix.setrlimit('nofile', { soft: 100000, hard: 100000 });
}
catch(e){
logWarning('posix', 'system', '(Safe to ignore) Must be ran as root to increase resource limits');
}
if (cluster.isWorker){
2014-03-14 12:02:55 -07:00
2014-03-09 19:31:58 -07:00
switch(process.env.workerType){
case 'pool':
new PoolWorker(loggerInstance);
break;
case 'paymentProcessor':
new PaymentProcessor(loggerInstance);
break;
2014-03-12 23:37:27 -07:00
case 'website':
new Website(loggerInstance);
break;
2014-03-09 19:31:58 -07:00
}
2014-01-13 17:32:54 -08:00
2014-03-09 19:31:58 -07:00
return;
2014-03-14 12:02:55 -07:00
} else {
var coinNames = ['alphacoin','frankocoin','emerald','kittehcoin'];
var curIndex = 0;
setInterval(function () {
var newCoinName = coinNames[++curIndex % coinNames.length];
console.log("SWITCHING to "+newCoinName);
var ipcMessage = {type:'switch', coin: newCoinName};
Object.keys(cluster.workers).forEach(function(id) {
cluster.workers[id].send(ipcMessage);
});
}, 120000);
2014-03-09 19:31:58 -07:00
}
2014-01-13 17:32:54 -08:00
2014-02-27 15:59:49 -08:00
2014-03-09 19:31:58 -07:00
//Read all pool configs from pool_configs and join them with their coin profile
var buildPoolConfigs = function(){
var configs = {};
fs.readdirSync('pool_configs').forEach(function(file){
var poolOptions = JSON.parse(JSON.minify(fs.readFileSync('pool_configs/' + file, {encoding: 'utf8'})));
if (poolOptions.disabled) return;
var coinFilePath = 'coins/' + poolOptions.coin;
if (!fs.existsSync(coinFilePath)){
logError(poolOptions.coin, 'system', 'could not find file: ' + coinFilePath);
return;
}
2014-03-09 19:31:58 -07:00
var coinProfile = JSON.parse(JSON.minify(fs.readFileSync(coinFilePath, {encoding: 'utf8'})));
poolOptions.coin = coinProfile;
configs[poolOptions.coin.name] = poolOptions;
});
return configs;
};
2014-02-27 15:59:49 -08:00
2014-01-13 17:32:54 -08:00
2014-03-09 19:31:58 -07:00
var spawnPoolWorkers = function(portalConfig, poolConfigs){
var serializedConfigs = JSON.stringify(poolConfigs);
2014-02-27 15:59:49 -08:00
var numForks = (function(){
2014-03-09 19:31:58 -07:00
if (!portalConfig.clustering || !portalConfig.clustering.enabled)
return 1;
2014-03-09 19:31:58 -07:00
if (portalConfig.clustering.forks === 'auto')
return os.cpus().length;
2014-03-09 19:31:58 -07:00
if (!portalConfig.clustering.forks || isNaN(portalConfig.clustering.forks))
return 1;
2014-03-09 19:31:58 -07:00
return portalConfig.clustering.forks;
})();
2014-01-13 17:32:54 -08:00
2014-03-09 19:31:58 -07:00
var createPoolWorker = function(forkId){
var worker = cluster.fork({
2014-03-14 12:02:55 -07:00
workerType : 'pool',
forkId : forkId,
pools : serializedConfigs,
portalConfig : JSON.stringify(portalConfig),
});
2014-03-09 19:31:58 -07:00
worker.on('exit', function(code, signal){
logError('poolWorker', 'system', 'Fork ' + forkId + ' died, spawning replacement worker...');
setTimeout(function(){
createPoolWorker(forkId);
}, 2000);
2014-03-09 19:31:58 -07:00
});
};
for (var i = 0; i < numForks; i++) {
createPoolWorker(i);
}
2014-01-13 17:32:54 -08:00
2014-03-09 19:31:58 -07:00
};
2014-02-27 15:59:49 -08:00
2014-03-09 19:31:58 -07:00
var startWorkerListener = function(poolConfigs){
var workerListener = new WorkerListener(loggerInstance, poolConfigs);
workerListener.init();
2014-03-09 19:31:58 -07:00
};
2014-03-09 19:31:58 -07:00
var startBlockListener = function(portalConfig){
//block notify options
//setup block notify here and use IPC to tell appropriate pools
2014-03-09 19:31:58 -07:00
var listener = new BlocknotifyListener(portalConfig.blockNotifyListener);
listener.on('log', function(text){
logDebug('blocknotify', 'system', text);
});
listener.on('hash', function(message){
2014-03-04 12:24:02 -08:00
var ipcMessage = {type:'blocknotify', coin: message.coin, hash: message.hash};
Object.keys(cluster.workers).forEach(function(id) {
2014-03-04 12:24:02 -08:00
cluster.workers[id].send(ipcMessage);
});
});
listener.start();
2014-03-09 19:31:58 -07:00
};
2014-03-14 12:02:55 -07:00
var startRedisBlockListener = function(portalConfig){
//block notify options
//setup block notify here and use IPC to tell appropriate pools
var listener = new RedisBlocknotifyListener(portalConfig.redisBlockNotifyListener);
listener.on('log', function(text){
logDebug('blocknotify', 'system', text);
}).on('hash', function (message) {
var ipcMessage = {type:'blocknotify', coin: message.coin, hash: message.hash};
Object.keys(cluster.workers).forEach(function(id) {
cluster.workers[id].send(ipcMessage);
});
});
listener.start();
};
2014-03-07 15:29:16 -08:00
2014-03-09 19:31:58 -07:00
var startPaymentProcessor = function(poolConfigs){
var worker = cluster.fork({
workerType: 'paymentProcessor',
pools: JSON.stringify(poolConfigs)
});
worker.on('exit', function(code, signal){
logError('paymentProcessor', 'system', 'Payment processor died, spawning replacement...');
setTimeout(function(){
2014-03-12 23:37:27 -07:00
startPaymentProcessor.apply(null, arguments);
}, 2000);
});
};
var startWebsite = function(portalConfig, poolConfigs){
if (!portalConfig.website.enabled) return;
var worker = cluster.fork({
workerType: 'website',
pools: JSON.stringify(poolConfigs),
portalConfig: JSON.stringify(portalConfig)
});
worker.on('exit', function(code, signal){
logError('website', 'system', 'Website process died, spawning replacement...');
setTimeout(function(){
startWebsite.apply(null, arguments);
}, 2000);
2014-03-09 19:31:58 -07:00
});
};
2014-03-09 19:31:58 -07:00
(function init(){
var poolConfigs = buildPoolConfigs();
spawnPoolWorkers(portalConfig, poolConfigs);
startPaymentProcessor(poolConfigs);
startBlockListener(portalConfig);
2014-03-14 12:02:55 -07:00
startRedisBlockListener(portalConfig);
2014-03-09 19:31:58 -07:00
startWorkerListener(poolConfigs);
<<<<<<< HEAD
})();
=======
2014-03-12 23:37:27 -07:00
startWebsite(portalConfig, poolConfigs);
2014-03-14 12:02:55 -07:00
})();
>>>>>>> 0db53a296f9b77ad6ff76b5f06c7156d5366a777