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: [email protected]?subject:unsubscribe
http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev