mirror of
https://github.com/freedombox/FreedomBox.git
synced 2026-09-19 04:59:01 +00:00
diagnostics: Implement scoping for IPv6 addresses
This commit is contained in:
parent
288a9e7bf9
commit
97b77e3719
@ -322,16 +322,13 @@ def diagnose_url(url, kind=None, env=None, extra_options=None, wrapper=None,
|
|||||||
return [_('Access URL {url}').format(url=url), result]
|
return [_('Access URL {url}').format(url=url), result]
|
||||||
|
|
||||||
|
|
||||||
def diagnose_url_on_all(url, extra_options=None):
|
def diagnose_url_on_all(url, **kwargs):
|
||||||
"""Run a diagnostic on whether a URL is accessible."""
|
"""Run a diagnostic on whether a URL is accessible."""
|
||||||
results = []
|
results = []
|
||||||
for address in get_addresses():
|
for address in get_addresses():
|
||||||
if address['kind'] == '6' and ':' in address['address']:
|
current_url = url.format(host=address['url_address'])
|
||||||
address['address'] = '[{0}]'.format(address['address'])
|
|
||||||
|
|
||||||
current_url = url.format(host=address['address'])
|
|
||||||
results.append(diagnose_url(current_url, kind=address['kind'],
|
results.append(diagnose_url(current_url, kind=address['kind'],
|
||||||
extra_options=extra_options))
|
**kwargs))
|
||||||
|
|
||||||
return results
|
return results
|
||||||
|
|
||||||
@ -363,10 +360,19 @@ def get_addresses():
|
|||||||
addresses = get_ip_addresses()
|
addresses = get_ip_addresses()
|
||||||
|
|
||||||
hostname = get_hostname()
|
hostname = get_hostname()
|
||||||
addresses.append({'kind': '4', 'address': 'localhost'})
|
addresses.append({'kind': '4', 'address': 'localhost', 'numeric': False,
|
||||||
addresses.append({'kind': '6', 'address': 'localhost'})
|
'url_address': 'localhost'})
|
||||||
addresses.append({'kind': '4', 'address': hostname})
|
addresses.append({'kind': '6', 'address': 'localhost', 'numeric': False,
|
||||||
addresses.append({'kind': '6', 'address': hostname})
|
'url_address': 'localhost'})
|
||||||
|
addresses.append({'kind': '4', 'address': hostname, 'numeric': False,
|
||||||
|
'url_address': hostname})
|
||||||
|
|
||||||
|
# XXX: When a hostname is resolved to IPv6 address, it may likely
|
||||||
|
# be link-local address. Link local IPv6 addresses are valid only
|
||||||
|
# for a given link and need to be scoped with interface name such
|
||||||
|
# as '%eth0' to work. Tools such as curl don't seem to handle
|
||||||
|
# this correctly.
|
||||||
|
# addresses.append({'kind': '6', 'address': hostname, 'numeric': False})
|
||||||
|
|
||||||
return addresses
|
return addresses
|
||||||
|
|
||||||
@ -378,8 +384,21 @@ def get_ip_addresses():
|
|||||||
output = subprocess.check_output(['ip', '-o', 'addr'])
|
output = subprocess.check_output(['ip', '-o', 'addr'])
|
||||||
for line in output.decode().splitlines():
|
for line in output.decode().splitlines():
|
||||||
parts = line.split()
|
parts = line.split()
|
||||||
addresses.append({'kind': '4' if parts[2] == 'inet' else '6',
|
address = {'kind': '4' if parts[2] == 'inet' else '6',
|
||||||
'address': parts[3].split('/')[0]})
|
'address': parts[3].split('/')[0],
|
||||||
|
'url_address': parts[3].split('/')[0],
|
||||||
|
'numeric': True,
|
||||||
|
'scope': parts[5],
|
||||||
|
'interface': parts[1]}
|
||||||
|
|
||||||
|
if address['kind'] == '6' and address['numeric']:
|
||||||
|
if address['scope'] != 'link':
|
||||||
|
address['url_address'] = '[{0}]'.format(address['address'])
|
||||||
|
else:
|
||||||
|
address['url_address'] = '[{0}%{1}]'.format(
|
||||||
|
address['url_address'], address['interface'])
|
||||||
|
|
||||||
|
addresses.append(address)
|
||||||
|
|
||||||
return addresses
|
return addresses
|
||||||
|
|
||||||
|
|||||||
@ -94,14 +94,11 @@ def diagnose():
|
|||||||
|
|
||||||
def diagnose_url_with_proxy():
|
def diagnose_url_with_proxy():
|
||||||
"""Run a diagnostic on a URL with a proxy."""
|
"""Run a diagnostic on a URL with a proxy."""
|
||||||
url = 'https://debian.org/'
|
url = 'https://debian.org/' # Gives a simple redirect to www.
|
||||||
|
|
||||||
results = []
|
results = []
|
||||||
for address in action_utils.get_addresses():
|
for address in action_utils.get_addresses():
|
||||||
if address['kind'] == '6':
|
proxy = 'http://{host}:8118/'.format(host=address['url_address'])
|
||||||
address['address'] = '[{0}]'.format(address['address'])
|
|
||||||
|
|
||||||
proxy = 'http://{host}:8118/'.format(host=address['address'])
|
|
||||||
env = {'https_proxy': proxy}
|
env = {'https_proxy': proxy}
|
||||||
|
|
||||||
result = action_utils.diagnose_url(url, kind=address['kind'], env=env)
|
result = action_utils.diagnose_url(url, kind=address['kind'], env=env)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user