storjshare-daemon
Version:
daemon + process manager for sharing space on the storj network
204 lines (182 loc) • 5.78 kB
JavaScript
;
const prettyMs = require('pretty-ms');
const config = require('../lib/config/daemon');
const utils = require('../lib/utils');
const Table = require('cli-table');
const colors = require('colors/safe');
const storjshare_status = require('commander');
storjshare_status
.description('prints the status of all managed nodes')
.option('-r, --remote <hostname:port>',
'hostname and optional port of the daemon')
.option('-j, --json',
'JSON formatted status of all managed nodes')
.parse(process.argv);
function getColoredValue(status, value) {
switch (status) {
case 0:
// good to go
return colors.green(value);
case 1:
//mark Tunnel Connections as bad
return colors.red(value);
case 2:
//Not Connected - Private NET
return colors.red(value);
default:
return value;
}
}
function fixContractValue(contractCount) {
contractCount = contractCount || 0;
if (contractCount > 99999999) {
return '>99999999';
}
return contractCount;
}
let port = config.daemonRpcPort;
let address = null;
if (storjshare_status.remote) {
address = storjshare_status.remote.split(':')[0];
if (storjshare_status.remote.split(':').length > 1) {
port = parseInt(storjshare_status.remote.split(':')[1], 10);
}
}
// Prepare json formatted status for each share
function prepareJson(shares) {
/*jshint maxcomplexity:11 */
/*jshint maxstatements:23 */
let json = [];
for (let i = 0; i < shares.length; i++) {
let share = shares[i];
json[i] = {};
json[i].id = share.id;
let status = '?';
switch (share.state) {
case 0:
status = 'stopped';
break;
case 1:
status = 'running';
break;
case 2:
status = 'errored';
break;
default:
status = 'unknown';
}
json[i].status = status;
json[i].configPath = share.config.storagePath;
json[i].uptime = prettyMs(share.meta.uptimeMs);
json[i].restarts = share.meta.numRestarts || 0;
json[i].peers = share.meta.farmerState.totalPeers || 0;
json[i].allocs = fixContractValue(
share.meta.farmerState.contractCount
);
json[i].dataReceivedCount = fixContractValue(
share.meta.farmerState.dataReceivedCount
);
json[i].delta = share.meta.farmerState.ntpStatus.delta;
json[i].port = share.meta.farmerState.portStatus.listenPort;
json[i].shared = share.meta.farmerState.spaceUsed;
json[i].sharedPercent = share.meta.farmerState.percentUsed;
var bridgeCxStat = share.meta.farmerState.bridgesConnectionStatus;
switch (bridgeCxStat) {
case 0:
json[i].bridgeConnectionStatus = 'disconnected';
break;
case 1:
json[i].bridgeConnectionStatus = 'connecting';
break;
case 2:
json[i].bridgeConnectionStatus = 'confirming';
break;
case 3:
json[i].bridgeConnectionStatus = 'connected';
break;
default:
break;
}
}
return JSON.stringify(json);
}
utils.connectToDaemon(port, function(rpc, sock) {
/*jshint maxcomplexity:10 */
rpc.status(function(err, shares) {
if (storjshare_status.json) {
// Print out json formatted share statuses
const json = prepareJson(shares);
console.log(json);
} else {
let table = new Table({
head: ['Node', 'Status', 'Uptime', 'Restarts', 'Peers',
'Allocs', 'Delta', 'Port', 'Shared', 'Bridges'],
style: {
head: ['cyan', 'bold'],
border: []
},
colWidths: [45, 9, 10, 10, 9, 15, 9, 10, 11, 14]
});
shares.forEach((share) => {
let status = '?';
switch (share.state) {
case 0:
status = colors.gray('stopped');
break;
case 1:
status = colors.green('running');
break;
case 2:
status = colors.red('errored');
break;
default:
status = 'unknown';
}
let portStatus = share.meta.farmerState.portStatus;
let port = getColoredValue(portStatus.connectionStatus,
portStatus.listenPort);
let connectionType = getColoredValue(portStatus.connectionStatus,
portStatus.connectionType);
let ntpStatus = getColoredValue(share.meta.farmerState.ntpStatus.status,
share.meta.farmerState.ntpStatus.delta);
let contracts = fixContractValue(share.meta.farmerState.contractCount);
let dataReceived = fixContractValue(
share.meta.farmerState.dataReceivedCount);
var bridgeCxStat = share.meta.farmerState.bridgesConnectionStatus;
var bridgeCxString = '...';
switch (bridgeCxStat) {
case 0:
bridgeCxString = colors.gray('disconnected');
break;
case 1:
bridgeCxString = colors.yellow('connecting');
break;
case 2:
bridgeCxString = colors.orange('confirming');
break;
case 3:
bridgeCxString = colors.green('connected');
break;
default:
break;
}
table.push([
`${share.id}\n → ${share.config.storagePath}`,
status,
prettyMs(share.meta.uptimeMs),
share.meta.numRestarts || 0,
share.meta.farmerState.totalPeers || 0,
contracts + '\n' + `${dataReceived} received`,
ntpStatus,
port + '\n' + connectionType,
share.meta.farmerState.spaceUsed + '\n' +
`(${share.meta.farmerState.percentUsed}%)`,
bridgeCxString
]);
});
console.log('\n' + table.toString());
}
sock.end();
});
}, address);