|
|
|
|
@ -443,34 +443,42 @@ def main():
|
|
|
|
|
if checksum:
|
|
|
|
|
try:
|
|
|
|
|
algorithm, checksum = checksum.split(':', 1)
|
|
|
|
|
if checksum.startswith('http://') or checksum.startswith('https://') or checksum.startswith('ftp://'):
|
|
|
|
|
checksum_url = checksum
|
|
|
|
|
# download checksum file to checksum_tmpsrc
|
|
|
|
|
checksum_tmpsrc, checksum_info = url_get(module, checksum_url, dest, use_proxy, last_mod_time, force, timeout, headers, tmp_dest)
|
|
|
|
|
with open(checksum_tmpsrc) as f:
|
|
|
|
|
lines = [line.rstrip('\n') for line in f]
|
|
|
|
|
os.remove(checksum_tmpsrc)
|
|
|
|
|
lines = dict(s.split(None, 1) for s in lines)
|
|
|
|
|
filename = url_filename(url)
|
|
|
|
|
|
|
|
|
|
# Look through each line in the checksum file for a hash corresponding to
|
|
|
|
|
# the filename in the url, returning the first hash that is found.
|
|
|
|
|
for cksum in (s for (s, f) in lines.items() if f.strip('./') == filename):
|
|
|
|
|
checksum = cksum
|
|
|
|
|
break
|
|
|
|
|
else:
|
|
|
|
|
checksum = None
|
|
|
|
|
|
|
|
|
|
if checksum is None:
|
|
|
|
|
module.fail_json("Unable to find a checksum for file '%s' in '%s'" % (filename, checksum_url))
|
|
|
|
|
# Remove any non-alphanumeric characters, including the infamous
|
|
|
|
|
# Unicode zero-width space
|
|
|
|
|
checksum = re.sub(r'\W+', '', checksum).lower()
|
|
|
|
|
# Ensure the checksum portion is a hexdigest
|
|
|
|
|
int(checksum, 16)
|
|
|
|
|
except ValueError:
|
|
|
|
|
module.fail_json(msg="The checksum parameter has to be in format <algorithm>:<checksum>")
|
|
|
|
|
|
|
|
|
|
if checksum.startswith('http://') or checksum.startswith('https://') or checksum.startswith('ftp://'):
|
|
|
|
|
checksum_url = checksum
|
|
|
|
|
# download checksum file to checksum_tmpsrc
|
|
|
|
|
checksum_tmpsrc, checksum_info = url_get(module, checksum_url, dest, use_proxy, last_mod_time, force, timeout, headers, tmp_dest)
|
|
|
|
|
with open(checksum_tmpsrc) as f:
|
|
|
|
|
lines = [line.rstrip('\n') for line in f]
|
|
|
|
|
os.remove(checksum_tmpsrc)
|
|
|
|
|
checksum_map = {}
|
|
|
|
|
for line in lines:
|
|
|
|
|
parts = line.split(None, 1)
|
|
|
|
|
if len(parts) == 2:
|
|
|
|
|
checksum_map[parts[0]] = parts[1]
|
|
|
|
|
filename = url_filename(url)
|
|
|
|
|
|
|
|
|
|
# Look through each line in the checksum file for a hash corresponding to
|
|
|
|
|
# the filename in the url, returning the first hash that is found.
|
|
|
|
|
for cksum in (s for (s, f) in checksum_map.items() if f.strip('./') == filename):
|
|
|
|
|
checksum = cksum
|
|
|
|
|
break
|
|
|
|
|
else:
|
|
|
|
|
checksum = None
|
|
|
|
|
|
|
|
|
|
if checksum is None:
|
|
|
|
|
module.fail_json(msg="Unable to find a checksum for file '%s' in '%s'" % (filename, checksum_url))
|
|
|
|
|
# Remove any non-alphanumeric characters, including the infamous
|
|
|
|
|
# Unicode zero-width space
|
|
|
|
|
checksum = re.sub(r'\W+', '', checksum).lower()
|
|
|
|
|
# Ensure the checksum portion is a hexdigest
|
|
|
|
|
try:
|
|
|
|
|
int(checksum, 16)
|
|
|
|
|
except ValueError:
|
|
|
|
|
module.fail_json(msg='The checksum format is invalid')
|
|
|
|
|
|
|
|
|
|
if not dest_is_dir and os.path.exists(dest):
|
|
|
|
|
checksum_mismatch = False
|
|
|
|
|
|
|
|
|
|
|