Browse Source

Enhance PEER_DISCOVERY environment variable

It is now tri-state - ON, OFF or SELF.

Fixes #287
patch-1
Neil Booth 8 years ago
parent
commit
81947d796b
  1. 12
      docs/ENVIRONMENT.rst
  2. 14
      server/env.py
  3. 13
      server/peers.py
  4. 12
      tests/server/test_env.py

12
docs/ENVIRONMENT.rst

@ -270,9 +270,15 @@ some of this.
* **PEER_DISCOVERY**
If not defined, or non-empty, ElectrumX will occasionally connect to
and verify its network of peer servers. Set to empty to disable
peer discovery.
This environment variable is case-insensitive and defaults to `on`.
If `on`, ElectrumX will occasionally connect to and verify its
network of peer servers.
If `off`, peer discovery is disabled and a hard-coded default list
of servers will be read in and served. If set to `self` then peer
discovery is disabled and the server will only return itself in the
peers list.
* **PEER_ANNOUNCE**

14
server/env.py

@ -23,6 +23,9 @@ NetIdentity = namedtuple('NetIdentity', 'host tcp_port ssl_port nick_suffix')
class Env(EnvBase):
'''Wraps environment configuration.'''
# Peer discovery
PD_OFF, PD_SELF, PD_ON = range(3)
def __init__(self):
super().__init__()
self.obsolete(['UTXO_MB', 'HIST_MB', 'NETWORK'])
@ -49,7 +52,7 @@ class Env(EnvBase):
self.anon_logs = self.boolean('ANON_LOGS', False)
self.log_sessions = self.integer('LOG_SESSIONS', 3600)
# Peer discovery
self.peer_discovery = self.boolean('PEER_DISCOVERY', True)
self.peer_discovery = self.peer_discovery_enum()
self.peer_announce = self.boolean('PEER_ANNOUNCE', True)
self.force_proxy = self.boolean('FORCE_PROXY', False)
self.tor_proxy_host = self.default('TOR_PROXY_HOST', 'localhost')
@ -143,3 +146,12 @@ class Env(EnvBase):
ssl_port,
'_tor',
)
def peer_discovery_enum(self):
pd = self.default('PEER_DISCOVERY', 'on').strip().lower()
if pd in ('off', ''):
return self.PD_OFF
elif pd == 'self':
return self.PD_SELF
else:
return self.PD_ON

13
server/peers.py

@ -424,12 +424,13 @@ class PeerManager(util.LoggedClass):
def import_peers(self):
'''Import hard-coded peers from a file or the coin defaults.'''
self.add_peers(self.myselves)
coin_peers = self.env.coin.PEERS
# Add the hard-coded ones
peers = [Peer.from_real_name(real_name, 'coins.py')
for real_name in coin_peers]
self.add_peers(peers, limit=None)
# Add the hard-coded ones unless only returning self
if self.env.peer_discovery != self.env.PD_SELF:
coin_peers = self.env.coin.PEERS
peers = [Peer.from_real_name(real_name, 'coins.py')
for real_name in coin_peers]
self.add_peers(peers, limit=None)
def connect_to_irc(self):
'''Connect to IRC if not disabled.'''
@ -459,7 +460,7 @@ class PeerManager(util.LoggedClass):
3) Retrying old peers at regular intervals.
'''
self.connect_to_irc()
if not self.env.peer_discovery:
if self.env.peer_discovery != self.env.PD_ON:
self.logger.info('peer discovery is disabled')
return

12
tests/server/test_env.py

@ -199,7 +199,17 @@ def test_ANON_LOGS():
assert_boolean('ANON_LOGS', 'anon_logs', False)
def test_PEER_DISCOVERY():
assert_boolean('PEER_DISCOVERY', 'peer_discovery', True)
e = Env()
assert e.peer_discovery == Env.PD_ON
os.environ['PEER_DISCOVERY'] = ' '
e = Env()
assert e.peer_discovery == Env.PD_OFF
os.environ['PEER_DISCOVERY'] = 'ON'
e = Env()
assert e.peer_discovery == Env.PD_ON
os.environ['PEER_DISCOVERY'] = 'self'
e = Env()
assert e.peer_discovery == Env.PD_SELF
def test_PEER_ANNOUNCE():
assert_boolean('PEER_ANNOUNCE', 'peer_announce', True)

Loading…
Cancel
Save