diff --git a/bin/libbfa.js b/bin/libbfa.js index 3b09cdacaebd99984a84bcbc419ec89ac40863dc..fd18464ebf1ee856dd57b89675a09c37b73f2708 100644 --- a/bin/libbfa.js +++ b/bin/libbfa.js @@ -107,6 +107,13 @@ module.exports = class Libbfa params: 0 }] }); + w3.eth.extend({ + methods: [{ + name: 'bfaAdminaddPeer', + call: 'admin_addPeer', + params: 1 + }] + }); w3.eth.personal.extend({ methods: [{ name: 'bfalistWallets', diff --git a/bin/monitor.js b/bin/monitor.js index 576d79509453dbb5fb8233387ca965b8f20b9a49..ca4a629f89b8da255659461405f923fe2a7d384f 100755 --- a/bin/monitor.js +++ b/bin/monitor.js @@ -7,29 +7,101 @@ const Libbfa = require( process.env.BFAHOME + '/bin/libbfa.js'); var bfa = new Libbfa(); var web3 = bfa.newweb3(); -var now; -function monitor() +function pluralEnglish( num, single, plural ) +{ + if ( num == 1 ) + return single; + return plural; +} + +function peerlist() { web3.eth.bfaAdminpeers().then( function gotAdminPeers( nodelist ) { - var peers = []; + var now = new Date(); + var nowpeers = []; + var peers = []; + var newpeers = []; + if ( bfa.fs.existsSync( bfa.networkdir + '/peers.cache' ) ) + { + var data = bfa.fs.readFileSync( bfa.networkdir + '/peers.cache' ).toString(); + if ( data.length > 0 ) + peers = data.split(/\r?\n/); + var i = peers.length; + // for some odd reason, I keep seeing empty entries + while ( i-- > 0 ) + if ( peers[i] == '' ) + peers.splice(i,1); + } nodelist.forEach( function(node) { - if ( typeof(node.protocols.eth) == 'object' ) - { - var dir = "out"; - if ( node.network.inbound ) - dir = "in"; - peers.push( "peer "+dir+": "+node.enode ); + if ( 'object' == typeof(node.protocols.eth) ) + { + // default info - likely to get overwritten. + var info = "<" + node.id + ">"; + var dir = ""; + if ( undefined != node.network ) + { + if ( 'boolean' == typeof(node.network.inbound) ) + { + if ( node.network.inbound ) + dir = "in"; + else + dir = "out"; + } + if ( 'string' == typeof(node.enode) ) + { + info = node.enode; + if (peers.indexOf( node.enode ) == -1 ) + newpeers.push( node.enode ); + } + else + { + info = ""; + if ( undefined != node.id ) + info += "<" + node.id + ">"; + if ( undefined != node.network.remoteAddress ) + { + if ( info != "" ) + info+= "@"; + info += node.network.remoteAddress; + } + } + } + nowpeers.push( "peer " + dir + ": " + info ); } } ); + // write network/status bfa.fs.writeFileSync( bfa.networkdir + '/status', "UTC: " + now.toUTCString() + "\n" - + "BFA peers: " + peers.length + "\n" - + peers.sort().join("\n") + "\n", + + "BFA peers: " + nowpeers.length + "\n" + + nowpeers.sort().join("\n") + "\n", + { mode: 0o644 } + ); + // Try to connect to a random node if we have very few peers + if ( nowpeers.length < 5 && peers.length > 0 ) + { + var i = Math.floor( Math.random() * peers.length ); + var enode = peers[i]; + console.log( + "We have " + + nowpeers.length + + " peer" + pluralEnglish(nowpeers.length,'','s') + ", so will try to connect to " + + enode + ); + web3.eth.bfaAdminaddPeer( enode ); + } + // write network/peers.cache + // peers.cache is a list of peers we have connected out to in the past. + peers.concat( newpeers ); + if (peers.length > 100) + peers.splice( 0, peers.length - 100 ); + bfa.fs.writeFileSync( + bfa.networkdir + '/peers.cache', + peers.join("\n") + "\n", { mode: 0o644 } ); }, @@ -97,9 +169,9 @@ function mayseal() function timer() { - now = new Date(); - monitor(); + peerlist(); mayseal(); } +peerlist(); setInterval( timer, 60 * 1000 ); diff --git a/bin/start.sh b/bin/start.sh index 0fc1bcf1213147d846116af0e383523ce866e5da..38d4f4b9f028e0c936ed93cf3f102e00b17cf4ea 100755 --- a/bin/start.sh +++ b/bin/start.sh @@ -68,9 +68,11 @@ function startmonitor echo "A monitor is already running." false ) || exit - monitor.js & - echo $! > $pidfile - wait + ( + monitor.js & + echo $! > $pidfile + wait + ) 2>&1 | ${BFAHOME}/bin/log.sh ${BFANODEDIR}/log & ) 9>> $pidfile }