commit
7243f8fe90
7
NEWS
7
NEWS
|
@ -12,6 +12,13 @@ Issues noted as "Fabric #NN" can be found at https://github.com/fabric/fabric/.
|
|||
Releases
|
||||
========
|
||||
|
||||
v1.10.4 (27th Sep 2013)
|
||||
-----------------------
|
||||
|
||||
* #179: Fix a missing variable causing errors when an ssh_config file has a
|
||||
non-default AddressFamily set. Thanks to Ed Marshall & Tomaz Muraus for catch
|
||||
& patch.
|
||||
|
||||
v1.11.1 (20th Sep 2013)
|
||||
-----------------------
|
||||
|
||||
|
|
|
@ -35,9 +35,10 @@ class LazyFqdn(object):
|
|||
Returns the host's fqdn on request as string.
|
||||
"""
|
||||
|
||||
def __init__(self, config):
|
||||
def __init__(self, config, host=None):
|
||||
self.fqdn = None
|
||||
self.config = config
|
||||
self.host = host
|
||||
|
||||
def __str__(self):
|
||||
if self.fqdn is None:
|
||||
|
@ -54,19 +55,27 @@ class LazyFqdn(object):
|
|||
fqdn = None
|
||||
address_family = self.config.get('addressfamily', 'any').lower()
|
||||
if address_family != 'any':
|
||||
family = socket.AF_INET if address_family == 'inet' \
|
||||
else socket.AF_INET6
|
||||
results = socket.getaddrinfo(host,
|
||||
None,
|
||||
family,
|
||||
socket.SOCK_DGRAM,
|
||||
socket.IPPROTO_IP,
|
||||
socket.AI_CANONNAME)
|
||||
for res in results:
|
||||
af, socktype, proto, canonname, sa = res
|
||||
if canonname and '.' in canonname:
|
||||
fqdn = canonname
|
||||
break
|
||||
try:
|
||||
family = socket.AF_INET if address_family == 'inet' \
|
||||
else socket.AF_INET6
|
||||
results = socket.getaddrinfo(
|
||||
self.host,
|
||||
None,
|
||||
family,
|
||||
socket.SOCK_DGRAM,
|
||||
socket.IPPROTO_IP,
|
||||
socket.AI_CANONNAME
|
||||
)
|
||||
for res in results:
|
||||
af, socktype, proto, canonname, sa = res
|
||||
if canonname and '.' in canonname:
|
||||
fqdn = canonname
|
||||
break
|
||||
# giaerror -> socket.getaddrinfo() can't resolve self.host
|
||||
# (which is from socket.gethostname()). Fall back to the
|
||||
# getfqdn() call below.
|
||||
except socket.gaierror:
|
||||
pass
|
||||
# Handle 'any' / unspecified
|
||||
if fqdn is None:
|
||||
fqdn = socket.getfqdn()
|
||||
|
@ -216,7 +225,7 @@ class SSHConfig (object):
|
|||
remoteuser = user
|
||||
|
||||
host = socket.gethostname().split('.')[0]
|
||||
fqdn = LazyFqdn(config)
|
||||
fqdn = LazyFqdn(config, host)
|
||||
homedir = os.path.expanduser('~')
|
||||
replacements = {'controlpath':
|
||||
[
|
||||
|
|
|
@ -329,3 +329,14 @@ IdentityFile id_dsa22
|
|||
paramiko.util.lookup_ssh_host_config(host, config),
|
||||
values
|
||||
)
|
||||
|
||||
def test_12_config_addressfamily_and_lazy_fqdn(self):
|
||||
"""
|
||||
Ensure the code path honoring non-'all' AddressFamily doesn't asplode
|
||||
"""
|
||||
test_config = """
|
||||
AddressFamily inet
|
||||
IdentityFile something_%l_using_fqdn
|
||||
"""
|
||||
config = paramiko.util.parse_ssh_config(cStringIO.StringIO(test_config))
|
||||
assert config.lookup('meh') # will die during lookup() if bug regresses
|
||||
|
|
Loading…
Reference in New Issue