summaryrefslogtreecommitdiff
path: root/cloudinit/util.py
diff options
context:
space:
mode:
Diffstat (limited to 'cloudinit/util.py')
-rw-r--r--cloudinit/util.py20
1 files changed, 13 insertions, 7 deletions
diff --git a/cloudinit/util.py b/cloudinit/util.py
index aca82878..fc777b82 100644
--- a/cloudinit/util.py
+++ b/cloudinit/util.py
@@ -34,6 +34,7 @@ import sys
import time
from base64 import b64decode, b64encode
from collections import deque, namedtuple
+from contextlib import suppress
from errno import EACCES, ENOENT
from functools import lru_cache, total_ordering
from pathlib import Path
@@ -44,6 +45,7 @@ from cloudinit import features, importer
from cloudinit import log as logging
from cloudinit import (
mergers,
+ net,
safeyaml,
subp,
temp_utils,
@@ -1233,8 +1235,8 @@ def get_fqdn_from_hosts(hostname, filename="/etc/hosts"):
return fqdn
-def is_resolvable(name):
- """determine if a url is resolvable, return a boolean
+def is_resolvable(url) -> bool:
+ """determine if a url's network address is resolvable, return a boolean
This also attempts to be resilent against dns redirection.
Note, that normal nsswitch resolution is used here. So in order
@@ -1246,6 +1248,8 @@ def is_resolvable(name):
be resolved inside the search list.
"""
global _DNS_REDIRECT_IP
+ parsed_url = parse.urlparse(url)
+ name = parsed_url.hostname
if _DNS_REDIRECT_IP is None:
badips = set()
badnames = (
@@ -1253,7 +1257,7 @@ def is_resolvable(name):
"example.invalid.",
"__cloud_init_expected_not_found__",
)
- badresults = {}
+ badresults: dict = {}
for iname in badnames:
try:
result = socket.getaddrinfo(
@@ -1270,12 +1274,14 @@ def is_resolvable(name):
LOG.debug("detected dns redirection: %s", badresults)
try:
+ # ip addresses need no resolution
+ with suppress(ValueError):
+ if net.is_ip_address(parsed_url.netloc.strip("[]")):
+ return True
result = socket.getaddrinfo(name, None)
# check first result's sockaddr field
addr = result[0][4][0]
- if addr in _DNS_REDIRECT_IP:
- return False
- return True
+ return addr not in _DNS_REDIRECT_IP
except (socket.gaierror, socket.error):
return False
@@ -1298,7 +1304,7 @@ def is_resolvable_url(url):
logfunc=LOG.debug,
msg="Resolving URL: " + url,
func=is_resolvable,
- args=(parse.urlparse(url).hostname,),
+ args=(url,),
)