Hi! For when 127.0.0.1 is not there, soon to be. Roots out one last piece of IPv4 only in openstack.
Please find patch attached. Thoughts please about approach. Github repo is here: https://github.com/grantma/deb-python-eventlet/tree/full-ipv6-defaults Thank you! Best Regards, Matt Grant
diff --git a/eventlet/support/afinet.py b/eventlet/support/afinet.py new file mode 100644 index 0000000..5c48b0f --- /dev/null +++ b/eventlet/support/afinet.py @@ -0,0 +1,46 @@ +""" +Test availabilty of AF_INET6 on a machine + +Uses socket API to determine configuration +""" + +from socket import * + +def check_ipv6_lo_addr(): + try: + sock = socket(AF_INET6, SOCK_STREAM) + sock.bind(('::1', 0)) + return True + except: + return False + +def check_ipv6_hosts_file(): + if not check_ipv6_lo_addr(): + return False + addrinfo = getaddrinfo(gethostname(), 0) + if (addrinfo[0][0] == AF_INET6): + return True + return False + +core_use_ipv6_lo_addr = check_ipv6_lo_addr() +use_ipv6_by_default = check_ipv6_hosts_file() + +ip_defaults = {} + +if core_use_ipv6_lo_addr: + ip_defaults['core_lo_addr'] = '::1' + ip_defaults['core_af_inet'] = AF_INET6 +else: + ip_defaults['core_lo_addr'] = '127.0.0.1' + ip_defaults['core_af_inet'] = AF_INET + +if use_ipv6_by_default: + ip_defaults['af_inet'] = AF_INET6 + ip_defaults['null_addr'] = '::' + ip_defaults['null_cidr'] = '::/0' + ip_defaults['lo_addr'] = '::1' +else: + ip_defaults['af_inet'] = AF_INET + ip_defaults['null_addr'] = '0.0.0.0' + ip_defaults['null_cidr'] = '0.0.0.0/0' + ip_defaults['lo_addr'] = '127.0.0.1' diff --git a/eventlet/backdoor.py b/eventlet/backdoor.py index 9a6797a..a282e2a 100644 --- a/eventlet/backdoor.py +++ b/eventlet/backdoor.py @@ -10,6 +10,7 @@ import traceback import eventlet from eventlet import hubs from eventlet.support import greenlets, get_errno +from eventlet.support.afinet import ip_defaults try: sys.ps1 @@ -133,4 +134,4 @@ def backdoor(conn_info, locals=None): if __name__ == '__main__': - backdoor_server(eventlet.listen(('127.0.0.1', 9000)), {}) + backdoor_server(eventlet.listen((ip_defaults['core_lo_addr'], 9000)), {}) diff --git a/eventlet/convenience.py b/eventlet/convenience.py index 88343a9..8c26c27 100644 --- a/eventlet/convenience.py +++ b/eventlet/convenience.py @@ -5,9 +5,10 @@ from eventlet import greenpool from eventlet import greenthread from eventlet.green import socket from eventlet.support import greenlets as greenlet +from eventlet.support.afinet import ip_defaults -def connect(addr, family=socket.AF_INET, bind=None): +def connect(addr, family=ip_defaults['af_inet'], bind=None): """Convenience function for opening client sockets. :param addr: Address of the server to connect to. For TCP sockets, this is a (host, port) tuple. @@ -22,7 +23,7 @@ def connect(addr, family=socket.AF_INET, bind=None): return sock -def listen(addr, family=socket.AF_INET, backlog=50): +def listen(addr, family=ip_defaults['af_inet'], backlog=50): """Convenience function for opening server sockets. This socket can be used in :func:`~eventlet.serve` or a custom ``accept()`` loop. diff --git a/eventlet/greenio/base.py b/eventlet/greenio/base.py index 042f7d8..ee2950f 100644 --- a/eventlet/greenio/base.py +++ b/eventlet/greenio/base.py @@ -8,6 +8,7 @@ import warnings import eventlet from eventlet.hubs import trampoline, notify_opened, IOClosed from eventlet.support import get_errno, six +from eventlet.support.afinet import ip_defaults __all__ = [ 'GreenSocket', '_GLOBAL_DEFAULT_TIMEOUT', 'set_nonblocking', @@ -129,7 +130,7 @@ class GreenSocket(object): # This placeholder is to prevent __getattr__ from creating an infinite call loop fd = None - def __init__(self, family=socket.AF_INET, *args, **kwargs): + def __init__(self, family=ip_defaults['af_inet'], *args, **kwargs): should_set_nonblocking = kwargs.pop('set_nonblocking', True) if isinstance(family, six.integer_types): fd = _original_socket(family, *args, **kwargs) diff --git a/eventlet/support/greendns.py b/eventlet/support/greendns.py index 8d5c7d6..eb9075c 100644 --- a/eventlet/support/greendns.py +++ b/eventlet/support/greendns.py @@ -41,6 +41,8 @@ from eventlet.green import os from eventlet.green import time from eventlet.green import select from eventlet.support import six +from eventlet.support.afinet import ip_defaults +from eventlet.support.afinet import use_ipv6_by_default def import_patched(module_name): @@ -72,6 +74,11 @@ for pkg in dns.rdtypes.ANY.__all__: del import_patched sys.path.pop(0) +# Done here to prevent import nesting errors +if use_ipv6_by_default: + def_rdtype = dns.rdatatype.AAAA +else: + def_rdtype = dns.rdatatype.A socket = _socket_nodns @@ -302,7 +309,7 @@ class ResolverProxy(object): self._resolver = dns.resolver.Resolver(filename=self._filename) self._resolver.cache = dns.resolver.LRUCache() - def query(self, qname, rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN, + def query(self, qname, rdtype=def_rdtype, rdclass=dns.rdataclass.IN, tcp=False, source=None, raise_on_no_answer=True, _hosts_rdtypes=(dns.rdatatype.A, dns.rdatatype.AAAA)): """Query the resolver, using /etc/hosts if enabled. @@ -310,7 +317,7 @@ class ResolverProxy(object): result = [None, None, 0] if qname is None: - qname = '0.0.0.0' + qname = ip_defaults['null_addr'] if isinstance(qname, six.string_types): qname = dns.name.from_text(qname, None) @@ -376,7 +383,7 @@ class ResolverProxy(object): resolver = ResolverProxy(hosts_resolver=HostsResolver()) -def resolve(name, family=socket.AF_INET, raises=True): +def resolve(name, family=ip_defaults['af_inet'], raises=True): """Resolve a name for a given family using the global resolver proxy This method is called by the global getaddrinfo() function. diff --git a/eventlet/tpool.py b/eventlet/tpool.py index 1c2dea0..cbb9b91 100644 --- a/eventlet/tpool.py +++ b/eventlet/tpool.py @@ -22,6 +22,7 @@ import traceback import eventlet from eventlet import event, greenio, greenthread, patcher, timeout from eventlet.support import six +from eventlet.support.afinet import ip_defaults __all__ = ['execute', 'Proxy', 'killall', 'set_num_threads'] @@ -269,10 +270,10 @@ def setup(): _rspq = Queue(maxsize=-1) # connected socket pair - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.bind(('127.0.0.1', 0)) + sock = socket.socket(ip_defaults['core_af_inet'], socket.SOCK_STREAM) + sock.bind((ip_defaults['core_lo_addr'], 0)) sock.listen(1) - csock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + csock = socket.socket(ip_defaults['core_af_inet'], socket.SOCK_STREAM) csock.connect(sock.getsockname()) csock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, True) _wsock, _addr = sock.accept()
__________________________________________________________________________ OpenStack Development Mailing List (not for usage questions) Unsubscribe: openstack-dev-requ...@lists.openstack.org?subject:unsubscribe http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev