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** * **PEER_DISCOVERY**
If not defined, or non-empty, ElectrumX will occasionally connect to This environment variable is case-insensitive and defaults to `on`.
and verify its network of peer servers. Set to empty to disable
peer discovery. 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** * **PEER_ANNOUNCE**

14
server/env.py

@ -23,6 +23,9 @@ NetIdentity = namedtuple('NetIdentity', 'host tcp_port ssl_port nick_suffix')
class Env(EnvBase): class Env(EnvBase):
'''Wraps environment configuration.''' '''Wraps environment configuration.'''
# Peer discovery
PD_OFF, PD_SELF, PD_ON = range(3)
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.obsolete(['UTXO_MB', 'HIST_MB', 'NETWORK']) self.obsolete(['UTXO_MB', 'HIST_MB', 'NETWORK'])
@ -49,7 +52,7 @@ class Env(EnvBase):
self.anon_logs = self.boolean('ANON_LOGS', False) self.anon_logs = self.boolean('ANON_LOGS', False)
self.log_sessions = self.integer('LOG_SESSIONS', 3600) self.log_sessions = self.integer('LOG_SESSIONS', 3600)
# Peer discovery # 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.peer_announce = self.boolean('PEER_ANNOUNCE', True)
self.force_proxy = self.boolean('FORCE_PROXY', False) self.force_proxy = self.boolean('FORCE_PROXY', False)
self.tor_proxy_host = self.default('TOR_PROXY_HOST', 'localhost') self.tor_proxy_host = self.default('TOR_PROXY_HOST', 'localhost')
@ -143,3 +146,12 @@ class Env(EnvBase):
ssl_port, ssl_port,
'_tor', '_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): def import_peers(self):
'''Import hard-coded peers from a file or the coin defaults.''' '''Import hard-coded peers from a file or the coin defaults.'''
self.add_peers(self.myselves) self.add_peers(self.myselves)
coin_peers = self.env.coin.PEERS
# Add the hard-coded ones # Add the hard-coded ones unless only returning self
peers = [Peer.from_real_name(real_name, 'coins.py') if self.env.peer_discovery != self.env.PD_SELF:
for real_name in coin_peers] coin_peers = self.env.coin.PEERS
self.add_peers(peers, limit=None) 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): def connect_to_irc(self):
'''Connect to IRC if not disabled.''' '''Connect to IRC if not disabled.'''
@ -459,7 +460,7 @@ class PeerManager(util.LoggedClass):
3) Retrying old peers at regular intervals. 3) Retrying old peers at regular intervals.
''' '''
self.connect_to_irc() 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') self.logger.info('peer discovery is disabled')
return return

12
tests/server/test_env.py

@ -199,7 +199,17 @@ def test_ANON_LOGS():
assert_boolean('ANON_LOGS', 'anon_logs', False) assert_boolean('ANON_LOGS', 'anon_logs', False)
def test_PEER_DISCOVERY(): 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(): def test_PEER_ANNOUNCE():
assert_boolean('PEER_ANNOUNCE', 'peer_announce', True) assert_boolean('PEER_ANNOUNCE', 'peer_announce', True)

Loading…
Cancel
Save