diff --git a/bin/monitor.js b/bin/monitor.js index 228d43e5fb11c98229b80320f4f5db86ed5befbd..7ebd99b225581711dc8660e1bfd99b37e7e629d3 100755 --- a/bin/monitor.js +++ b/bin/monitor.js @@ -25,6 +25,9 @@ function readPeersCache() function writePeersCache( peers ) { + // max 100 entries, FIFO + if (peers.length > 100) + peers.splice( 0, peers.length - 100 ); // peers.cache is a list of peers we have connected out to in the past. bfa.fs.writeFileSync( bfa.networkdir + '/peers.cache', @@ -47,12 +50,11 @@ function writeStatus( peers ) function parsenode( node ) { - if ( !n || !n.protocols || typeof n.protocols.eth != 'object' ) + if ( !node || !node.protocols || typeof node.protocols.eth != 'object' ) return; - // default info - likely to get overwritten. - var n; if ( ! node.network ) return { info: "<"+node.id+">" }; + var n = {}; if ( typeof node.network.inbound == 'boolean' ) n.dir = node.network.inbound ? "in" : "out"; if ( typeof node.enode == 'string' ) @@ -74,42 +76,56 @@ function parsenode( node ) function gotAdminPeers( nodelist ) { var nowpeers = []; - var peers = readPeersCache(); + var peerscache = readPeersCache(); var outpeers = []; - var candidatenew = []; + var currentnodes = []; + + // The nodelist also contains peers which are not yet validated + // if they even belong to this network. Parsenode returns an + // object or nothing, based on our criteria nodelist.forEach( function(node) { - var n = parsenode( node ); + var n = parsenode(node); if ( n ) - { - nowpeers.push( "peer " + ( n.dir ? n.dir : '') + ": " + n.info ); - if ( peers.indexOf( n.info ) == -1 ) - { - if ( n.dir == 'out' ) - outpeers.push( n.info ); - candidatenew.push( n.info ); - } - } + currentnodes.push( n ); + } + ); + currentnodes.forEach( + function(n) { + // Add to list of nowpeers (for stats file) + nowpeers.push( "peer " + ( n.dir ? n.dir : '') + ": " + n.info ); + // See if this node reported by geth is already a known peers + // from our peers.cache + if (( peerscache.indexOf( n.info ) == -1 ) && ( n.dir == 'out' )) + outpeers.push( n.info ); } ); writeStatus( nowpeers ); - // write peers.cache (max 100 entries, FIFO) - peers = peers.concat( outpeers ); - if (peers.length > 100) - peers.splice( 0, peers.length - 100 ); - writePeersCache( peers ); + writePeersCache( peerscache.concat(outpeers) ); // Try to connect to a random node if we have very few peers - if ( nowpeers.length < 5 && candidatenew.length > 0 ) + if ( nowpeers.length < 5 ) { - var i = Math.floor( Math.random() * candidatenew.length ); - var enode = candidatenew[i]; - console.log( - "We have " - + nowpeers.length - + " peer" + ( nowpeers.length==1 ? '' : 's' ) + ", so will try to connect to " - + enode + var candidatenew = []; + // find candidate nodes which we can connect to + currentnodes.forEach( + function(n) { + if ( peerscache.indexOf( n.info ) == -1 ) + candidatenew.push( n.info ); + } ); - web3.bfa.admin.addPeer( enode ); + if ( candidatenew.length > 0 ) + { + var i = Math.floor( Math.random() * candidatenew.length ); + var enode = candidatenew[i]; + console.log( + "We have " + + nowpeers.length + + " peer" + ( nowpeers.length==1 ? '' : 's' ) + + ", so will try to connect to " + + enode + ); + web3.bfa.admin.addPeer( enode ); + } } }