Universal bootstrap procedure for any connection type
This commit is contained in:
parent
0a06567071
commit
4825c5a136
|
@ -18,7 +18,8 @@ from debug import logger
|
||||||
from proxy import Proxy
|
from proxy import Proxy
|
||||||
from singleton import Singleton
|
from singleton import Singleton
|
||||||
from tcp import (
|
from tcp import (
|
||||||
TCPServer, Socks5BMConnection, Socks4aBMConnection, TCPConnection)
|
bootstrap, Socks4aBMConnection, Socks5BMConnection,
|
||||||
|
TCPConnection, TCPServer)
|
||||||
from udp import UDPSocket
|
from udp import UDPSocket
|
||||||
|
|
||||||
|
|
||||||
|
@ -159,7 +160,28 @@ class BMConnectionPool(object):
|
||||||
udpSocket = UDPSocket(host=bind, announcing=True)
|
udpSocket = UDPSocket(host=bind, announcing=True)
|
||||||
self.udpSockets[udpSocket.listening.host] = udpSocket
|
self.udpSockets[udpSocket.listening.host] = udpSocket
|
||||||
|
|
||||||
def loop(self): # pylint: disable=too-many-branches, too-many-statements
|
def startBootstrappers(self):
|
||||||
|
"""Run the process of resolving bootstrap hostnames"""
|
||||||
|
proxy_type = BMConfigParser().safeGet(
|
||||||
|
'bitmessagesettings', 'socksproxytype')
|
||||||
|
# A plugins may be added here
|
||||||
|
if not proxy_type or proxy_type == 'none':
|
||||||
|
connection_base = TCPConnection
|
||||||
|
elif proxy_type == 'SOCKS5':
|
||||||
|
connection_base = Socks5BMConnection
|
||||||
|
elif proxy_type == 'SOCKS4a':
|
||||||
|
connection_base = Socks4aBMConnection # FIXME: I cannot test
|
||||||
|
else:
|
||||||
|
# This should never happen because socksproxytype setting
|
||||||
|
# is handled in bitmessagemain before starting the connectionpool
|
||||||
|
return
|
||||||
|
|
||||||
|
bootstrapper = bootstrap(connection_base)
|
||||||
|
port = helper_random.randomchoice([8080, 8444])
|
||||||
|
hostname = 'bootstrap%s.bitmessage.org' % port
|
||||||
|
self.addConnection(bootstrapper(hostname, port))
|
||||||
|
|
||||||
|
def loop(self): # pylint: disable=too-many-branches,too-many-statements
|
||||||
"""Main Connectionpool's loop"""
|
"""Main Connectionpool's loop"""
|
||||||
# defaults to empty loop if outbound connections are maxed
|
# defaults to empty loop if outbound connections are maxed
|
||||||
spawnConnections = False
|
spawnConnections = False
|
||||||
|
@ -184,7 +206,8 @@ class BMConnectionPool(object):
|
||||||
# pylint: disable=too-many-nested-blocks
|
# pylint: disable=too-many-nested-blocks
|
||||||
if spawnConnections:
|
if spawnConnections:
|
||||||
if not knownnodes.knownNodesActual:
|
if not knownnodes.knownNodesActual:
|
||||||
knownnodes.dns()
|
self.startBootstrappers()
|
||||||
|
knownnodes.knownNodesActual = True
|
||||||
if not self.bootstrapped:
|
if not self.bootstrapped:
|
||||||
self.bootstrapped = True
|
self.bootstrapped = True
|
||||||
Proxy.proxy = (
|
Proxy.proxy = (
|
||||||
|
|
|
@ -325,6 +325,39 @@ class Socks4aBMConnection(Socks4aConnection, TCPConnection):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def bootstrap(connection_class):
|
||||||
|
"""Make bootstrapper class for connection type (connection_class)"""
|
||||||
|
class Bootstrapper(connection_class):
|
||||||
|
"""Base class for bootstrappers"""
|
||||||
|
_connection_base = connection_class
|
||||||
|
|
||||||
|
def __init__(self, host, port):
|
||||||
|
self._connection_base.__init__(self, state.Peer(host, port))
|
||||||
|
self.close_reason = self._succeed = False
|
||||||
|
|
||||||
|
def bm_command_addr(self):
|
||||||
|
"""
|
||||||
|
Got addr message - the bootstrap succeed.
|
||||||
|
Let BMProto process the addr message and switch state to 'close'
|
||||||
|
"""
|
||||||
|
BMProto.bm_command_addr(self)
|
||||||
|
self._succeed = True
|
||||||
|
# pylint: disable=attribute-defined-outside-init
|
||||||
|
self.close_reason = "Thanks for bootstrapping!"
|
||||||
|
self.set_state("close")
|
||||||
|
|
||||||
|
def handle_close(self):
|
||||||
|
"""
|
||||||
|
After closing the connection switch knownnodes.knownNodesActual
|
||||||
|
back to False if the bootstrapper failed.
|
||||||
|
"""
|
||||||
|
self._connection_base.handle_close(self)
|
||||||
|
if not self._succeed:
|
||||||
|
knownnodes.knownNodesActual = False
|
||||||
|
|
||||||
|
return Bootstrapper
|
||||||
|
|
||||||
|
|
||||||
class TCPServer(AdvancedDispatcher):
|
class TCPServer(AdvancedDispatcher):
|
||||||
"""TCP connection server for Bitmessage protocol"""
|
"""TCP connection server for Bitmessage protocol"""
|
||||||
|
|
||||||
|
|
Reference in New Issue
Block a user