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
|
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)
|
v1.11.1 (20th Sep 2013)
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
|
|
|
@ -35,9 +35,10 @@ class LazyFqdn(object):
|
||||||
Returns the host's fqdn on request as string.
|
Returns the host's fqdn on request as string.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, config):
|
def __init__(self, config, host=None):
|
||||||
self.fqdn = None
|
self.fqdn = None
|
||||||
self.config = config
|
self.config = config
|
||||||
|
self.host = host
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
if self.fqdn is None:
|
if self.fqdn is None:
|
||||||
|
@ -54,19 +55,27 @@ class LazyFqdn(object):
|
||||||
fqdn = None
|
fqdn = None
|
||||||
address_family = self.config.get('addressfamily', 'any').lower()
|
address_family = self.config.get('addressfamily', 'any').lower()
|
||||||
if address_family != 'any':
|
if address_family != 'any':
|
||||||
family = socket.AF_INET if address_family == 'inet' \
|
try:
|
||||||
else socket.AF_INET6
|
family = socket.AF_INET if address_family == 'inet' \
|
||||||
results = socket.getaddrinfo(host,
|
else socket.AF_INET6
|
||||||
None,
|
results = socket.getaddrinfo(
|
||||||
family,
|
self.host,
|
||||||
socket.SOCK_DGRAM,
|
None,
|
||||||
socket.IPPROTO_IP,
|
family,
|
||||||
socket.AI_CANONNAME)
|
socket.SOCK_DGRAM,
|
||||||
for res in results:
|
socket.IPPROTO_IP,
|
||||||
af, socktype, proto, canonname, sa = res
|
socket.AI_CANONNAME
|
||||||
if canonname and '.' in canonname:
|
)
|
||||||
fqdn = canonname
|
for res in results:
|
||||||
break
|
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
|
# Handle 'any' / unspecified
|
||||||
if fqdn is None:
|
if fqdn is None:
|
||||||
fqdn = socket.getfqdn()
|
fqdn = socket.getfqdn()
|
||||||
|
@ -216,7 +225,7 @@ class SSHConfig (object):
|
||||||
remoteuser = user
|
remoteuser = user
|
||||||
|
|
||||||
host = socket.gethostname().split('.')[0]
|
host = socket.gethostname().split('.')[0]
|
||||||
fqdn = LazyFqdn(config)
|
fqdn = LazyFqdn(config, host)
|
||||||
homedir = os.path.expanduser('~')
|
homedir = os.path.expanduser('~')
|
||||||
replacements = {'controlpath':
|
replacements = {'controlpath':
|
||||||
[
|
[
|
||||||
|
|
|
@ -329,3 +329,14 @@ IdentityFile id_dsa22
|
||||||
paramiko.util.lookup_ssh_host_config(host, config),
|
paramiko.util.lookup_ssh_host_config(host, config),
|
||||||
values
|
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