mirror of
https://github.com/jlu5/PyLink.git
synced 2025-02-17 05:51:00 +01:00
Default to system IPv4/IPv6 preference when resolving hostnames
Fixes #667. This implementation is similar but also preserves compatibility with the "ipv6" option, which allows setting the preferred address type without hardcoding a bind IP.
This commit is contained in:
parent
f55057092a
commit
ac7339e460
32
classes.py
32
classes.py
@ -1857,30 +1857,34 @@ class IRCNetwork(PyLinkNetworkCoreWithUtils):
|
|||||||
"""
|
"""
|
||||||
self._pre_connect()
|
self._pre_connect()
|
||||||
|
|
||||||
ip = self.serverdata["ip"]
|
remote = self.serverdata["ip"]
|
||||||
port = self.serverdata["port"]
|
port = self.serverdata["port"]
|
||||||
try:
|
try:
|
||||||
# Set the socket type (IPv6 or IPv4), auto detecting it if not specified.
|
if 'bindhost' in self.serverdata:
|
||||||
isipv6 = self.serverdata.get("ipv6", utils.get_hostname_type(ip) == 2)
|
# Try detecting the socket type from the bindhost if specified.
|
||||||
|
force_ipv6 = utils.get_hostname_type(self.serverdata['bindhost']) == 2
|
||||||
|
else:
|
||||||
|
force_ipv6 = self.serverdata.get("ipv6") # ternary value (None = use system default)
|
||||||
|
|
||||||
if (not isipv6) and 'bindhost' in self.serverdata:
|
if force_ipv6 is True:
|
||||||
# Also try detecting the socket type from the bindhost if specified.
|
dns_stype = socket.AF_INET6
|
||||||
isipv6 = utils.get_hostname_type(self.serverdata['bindhost']) == 2
|
elif force_ipv6 is False:
|
||||||
|
dns_stype = socket.AF_INET
|
||||||
|
else:
|
||||||
|
dns_stype = socket.AF_UNSPEC
|
||||||
|
|
||||||
stype = socket.AF_INET6 if isipv6 else socket.AF_INET
|
dns_result = socket.getaddrinfo(remote, port, family=dns_stype)[0]
|
||||||
|
ip = dns_result[-1][0]
|
||||||
|
|
||||||
# Creat the socket.
|
log.debug('(%s) Resolving address %s to %s (force_ipv6=%s)', self.name, remote, ip, force_ipv6)
|
||||||
self._socket = socket.socket(stype)
|
|
||||||
|
# Create the actual socket.
|
||||||
|
self._socket = socket.socket(dns_result[0])
|
||||||
|
|
||||||
# Set the socket bind if applicable.
|
# Set the socket bind if applicable.
|
||||||
if 'bindhost' in self.serverdata:
|
if 'bindhost' in self.serverdata:
|
||||||
self._socket.bind((self.serverdata['bindhost'], 0))
|
self._socket.bind((self.serverdata['bindhost'], 0))
|
||||||
|
|
||||||
# Resolve hostnames if it's not an IP address already.
|
|
||||||
old_ip = ip
|
|
||||||
ip = socket.getaddrinfo(ip, port, stype)[0][-1][0]
|
|
||||||
log.debug('(%s) Resolving address %s to %s', self.name, old_ip, ip)
|
|
||||||
|
|
||||||
# Enable SSL if set to do so.
|
# Enable SSL if set to do so.
|
||||||
self.ssl = self.serverdata.get('ssl')
|
self.ssl = self.serverdata.get('ssl')
|
||||||
if self.ssl:
|
if self.ssl:
|
||||||
|
@ -305,13 +305,6 @@ servers:
|
|||||||
ip: ::1
|
ip: ::1
|
||||||
port: 8067
|
port: 8067
|
||||||
|
|
||||||
# Determines whether IPv6 should be used for this connection. Should the ip:
|
|
||||||
# above be a hostname instead of an IP, this will also affect whether A records
|
|
||||||
# (IPv4) or AAAA records (IPv6) will be used in resolving it.
|
|
||||||
# As of PyLink 2.0-beta1, you can leave this unset for direct connections to IP addresses;
|
|
||||||
# the address type will be automatically detected.
|
|
||||||
#ipv6: yes
|
|
||||||
|
|
||||||
# Received and sent passwords. For passwordless links using SSL fingerprints, simply set
|
# Received and sent passwords. For passwordless links using SSL fingerprints, simply set
|
||||||
# these two fields to "*" and enable SSL with a cert and key file.
|
# these two fields to "*" and enable SSL with a cert and key file.
|
||||||
recvpass: "coffee"
|
recvpass: "coffee"
|
||||||
@ -345,9 +338,13 @@ servers:
|
|||||||
port: 45454
|
port: 45454
|
||||||
|
|
||||||
# When the IP field is set to a hostname, the "ipv6" option determines whether IPv4 or IPv6
|
# When the IP field is set to a hostname, the "ipv6" option determines whether IPv4 or IPv6
|
||||||
# addresses should be used when resolving it. You can leave this field blank and use an
|
# addresses should be used when resolving it.
|
||||||
# explicit bindhost instead, which will let the the address type be automatically detected.
|
# As of PyLink 3.1, this defaults to null, falling back to the system's default preferences
|
||||||
#ipv6: false
|
# if not set (e.g. /etc/gai.conf on Linux). Previous versions default to making IPv4 connections only.
|
||||||
|
# This option is overridden by "bindhost" if it is also provided.
|
||||||
|
#ipv6: null
|
||||||
|
|
||||||
|
# Specifies the IP to make outgoing connections from, for multi-homed hosts.
|
||||||
#bindhost: 1111:2222:3333:4444
|
#bindhost: 1111:2222:3333:4444
|
||||||
|
|
||||||
# Note: if you are actually using dynamic DNS for an IRC link, consider enabling
|
# Note: if you are actually using dynamic DNS for an IRC link, consider enabling
|
||||||
|
Loading…
x
Reference in New Issue
Block a user