def download_file(asset_info, interactive=False, force=False): """ Verifies if file that can be find on url is on destination with right hash. This function will verify the SHA1 hash of the file. If the file appears to be missing or corrupted, let the user know. :param asset_info: Dictionary returned by get_asset_info """ file_ok = False problems_ignored = False had_to_download = False sha1 = None url = asset_info['url'] sha1_url = asset_info['sha1_url'] destination = asset_info['destination'] title = asset_info['title'] if sha1_url is not None: try: logging.info("Verifying expected SHA1 sum from %s", sha1_url) sha1_file = urllib.request.urlopen(sha1_url) sha1_contents = decode_to_text(sha1_file.read()) sha1 = sha1_contents.split(" ")[0] logging.info("Expected SHA1 sum: %s", sha1) except Exception as e: logging.error("Failed to get SHA1 from file: %s", e) else: sha1 = None destination_dir = os.path.dirname(destination) if not os.path.isdir(destination_dir): os.makedirs(destination_dir) if not os.path.isfile(destination): logging.warning("File %s not found", destination) if interactive: answer = genio.ask("Would you like to download it from %s?" % url) else: answer = 'y' if answer == 'y': try: download.url_download_interactive(url, destination, "Downloading %s" % title) had_to_download = True except Exception as download_failure: logging.error("Check your internet connection: %s", download_failure) else: logging.warning("Missing file %s", destination) else: logging.info("Found %s", destination) if sha1 is None: answer = 'n' else: answer = 'y' if answer == 'y': actual_sha1 = crypto.hash_file(destination, algorithm='sha1') if actual_sha1 != sha1: logging.info("Actual SHA1 sum: %s", actual_sha1) if interactive: answer = genio.ask("The file seems corrupted or outdated. " "Would you like to download it?") else: logging.info("The file seems corrupted or outdated") answer = 'y' if answer == 'y': logging.info("Updating image to the latest available...") while not file_ok: try: download.url_download_interactive( url, destination, title) except Exception as download_failure: logging.error("Check your internet connection: %s", download_failure) sha1_post_download = crypto.hash_file(destination, algorithm='sha1') had_to_download = True if sha1_post_download != sha1: logging.error("Actual SHA1 sum: %s", actual_sha1) if interactive: answer = genio.ask("The file downloaded %s is " "corrupted. Would you like " "to try again?" % destination) else: answer = 'n' if answer == 'n': problems_ignored = True logging.error("File %s is corrupted" % destination) file_ok = True else: file_ok = False else: file_ok = True else: file_ok = True logging.info("SHA1 sum check OK") else: problems_ignored = True logging.info("File %s present, but did not verify integrity", destination) if file_ok: if not problems_ignored: logging.info("%s present, with proper checksum", destination) uncompress_asset(asset_info=asset_info, force=force or had_to_download)
logging.error("Failed to get SHA1 from file: %s", e) else: sha1 = None destination_dir = os.path.dirname(destination) if not os.path.isdir(destination_dir): os.makedirs(destination_dir) if not os.path.isfile(destination): logging.warning("File %s not found", destination) if interactive: answer = genio.ask("Would you like to download it from %s?" % url) else: answer = 'y' if answer == 'y': download.url_download_interactive(url, destination, "Downloading %s" % title) had_to_download = True else: logging.warning("Missing file %s", destination) else: logging.info("Found %s", destination) if sha1 is None: answer = 'n' else: answer = 'y' if answer == 'y': actual_sha1 = crypto.hash_file(destination, algorithm='sha1') if actual_sha1 != sha1: logging.info("Actual SHA1 sum: %s", actual_sha1) if interactive:
def download_file(asset_info, interactive=False, force=False): """ Verifies if file that can be find on url is on destination with right hash. This function will verify the SHA1 hash of the file. If the file appears to be missing or corrupted, let the user know. :param asset_info: Dictionary returned by get_asset_info """ file_ok = False problems_ignored = False had_to_download = False sha1 = None url = asset_info['url'] sha1_url = asset_info['sha1_url'] destination = asset_info['destination'] title = asset_info['title'] if sha1_url is not None: try: logging.info("Verifying expected SHA1 sum from %s", sha1_url) sha1_file = urllib.request.urlopen(sha1_url) sha1_contents = decode_to_text(sha1_file.read()) sha1 = sha1_contents.split(" ")[0] logging.info("Expected SHA1 sum: %s", sha1) except Exception as e: logging.error("Failed to get SHA1 from file: %s", e) else: sha1 = None destination_dir = os.path.dirname(destination) if not os.path.isdir(destination_dir): os.makedirs(destination_dir) if not os.path.isfile(destination): logging.warning("File %s not found", destination) if interactive: answer = genio.ask("Would you like to download it from %s?" % url) else: answer = 'y' if answer == 'y': try: download.url_download_interactive(url, destination, "Downloading %s" % title) had_to_download = True except Exception as download_failure: logging.error("Check your internet connection: %s", download_failure) else: logging.warning("Missing file %s", destination) else: logging.info("Found %s", destination) if sha1 is None: answer = 'n' else: answer = 'y' if answer == 'y': actual_sha1 = crypto.hash_file(destination, algorithm='sha1') if actual_sha1 != sha1: logging.info("Actual SHA1 sum: %s", actual_sha1) if interactive: answer = genio.ask("The file seems corrupted or outdated. " "Would you like to download it?") else: logging.info("The file seems corrupted or outdated") answer = 'y' if answer == 'y': logging.info("Updating image to the latest available...") while not file_ok: try: download.url_download_interactive(url, destination, title) except Exception as download_failure: logging.error("Check your internet connection: %s", download_failure) sha1_post_download = crypto.hash_file(destination, algorithm='sha1') had_to_download = True if sha1_post_download != sha1: logging.error("Actual SHA1 sum: %s", actual_sha1) if interactive: answer = genio.ask("The file downloaded %s is " "corrupted. Would you like " "to try again?" % destination) else: answer = 'n' if answer == 'n': problems_ignored = True logging.error("File %s is corrupted" % destination) file_ok = True else: file_ok = False else: file_ok = True else: file_ok = True logging.info("SHA1 sum check OK") else: problems_ignored = True logging.info("File %s present, but did not verify integrity", destination) if file_ok: if not problems_ignored: logging.info("%s present, with proper checksum", destination) uncompress_asset(asset_info=asset_info, force=force or had_to_download)