85 lines
3.3 KiB
Python
85 lines
3.3 KiB
Python
import socket
|
|
|
|
import knownnodes
|
|
import socks
|
|
import state
|
|
from bmconfigparser import BMConfigParser
|
|
from debug import logger
|
|
|
|
|
|
def dns():
|
|
"""
|
|
DNS bootstrap. This could be programmed to use the SOCKS proxy to do the
|
|
DNS lookup some day but for now we will just rely on the entries in
|
|
defaultKnownNodes.py. Hopefully either they are up to date or the user
|
|
has run Bitmessage recently without SOCKS turned on and received good
|
|
bootstrap nodes using that method.
|
|
"""
|
|
|
|
def try_add_known_node(stream, addr, port, method=''):
|
|
try:
|
|
socket.inet_aton(addr)
|
|
except (TypeError, socket.error):
|
|
return
|
|
logger.info(
|
|
'Adding %s to knownNodes based on %s DNS bootstrap method',
|
|
addr, method)
|
|
knownnodes.addKnownNode(stream, state.Peer(addr, port))
|
|
|
|
proxy_type = BMConfigParser().get('bitmessagesettings', 'socksproxytype')
|
|
|
|
if proxy_type == 'none':
|
|
for port in [8080, 8444]:
|
|
try:
|
|
for item in socket.getaddrinfo(
|
|
'bootstrap%s.bitmessage.org' % port, 80):
|
|
try_add_known_node(1, item[4][0], port)
|
|
except:
|
|
logger.error(
|
|
'bootstrap%s.bitmessage.org DNS bootstrapping failed.',
|
|
port, exc_info=True
|
|
)
|
|
elif proxy_type == 'SOCKS5':
|
|
knownnodes.createDefaultKnownNodes(onion=True)
|
|
logger.debug('Adding default onion knownNodes.')
|
|
for port in [8080, 8444]:
|
|
logger.debug("Resolving %i through SOCKS...", port)
|
|
address_family = socket.AF_INET
|
|
sock = socks.socksocket(address_family, socket.SOCK_STREAM)
|
|
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
sock.settimeout(20)
|
|
proxytype = socks.PROXY_TYPE_SOCKS5
|
|
sockshostname = BMConfigParser().get(
|
|
'bitmessagesettings', 'sockshostname')
|
|
socksport = BMConfigParser().getint(
|
|
'bitmessagesettings', 'socksport')
|
|
# Do domain name lookups through the proxy;
|
|
# though this setting doesn't really matter since we won't
|
|
# be doing any domain name lookups anyway.
|
|
rdns = True
|
|
if BMConfigParser().getboolean(
|
|
'bitmessagesettings', 'socksauthentication'):
|
|
socksusername = BMConfigParser().get(
|
|
'bitmessagesettings', 'socksusername')
|
|
sockspassword = BMConfigParser().get(
|
|
'bitmessagesettings', 'sockspassword')
|
|
sock.setproxy(
|
|
proxytype, sockshostname, socksport, rdns,
|
|
socksusername, sockspassword)
|
|
else:
|
|
sock.setproxy(
|
|
proxytype, sockshostname, socksport, rdns)
|
|
try:
|
|
ip = sock.resolve("bootstrap" + str(port) + ".bitmessage.org")
|
|
sock.shutdown(socket.SHUT_RDWR)
|
|
sock.close()
|
|
except:
|
|
logger.error("SOCKS DNS resolving failed", exc_info=True)
|
|
else:
|
|
try_add_known_node(1, ip, port, 'SOCKS')
|
|
else:
|
|
logger.info(
|
|
'DNS bootstrap skipped because the proxy type does not support'
|
|
' DNS resolution.'
|
|
)
|