diff --git a/gns3server/controller/export_project.py b/gns3server/controller/export_project.py index 44936ee9..fc7226fe 100644 --- a/gns3server/controller/export_project.py +++ b/gns3server/controller/export_project.py @@ -66,22 +66,26 @@ async def export_project(zstream, project, temporary_dir, include_images=False, # Export the local files for root, dirs, files in os.walk(project._path, topdown=True, followlinks=False): - files = [f for f in files if _is_exportable(os.path.join(root, f), include_snapshots)] - for file in files: - path = os.path.join(root, file) - # check if we can export the file - try: - open(path).close() - except OSError as e: - msg = "Could not export file {}: {}".format(path, e) - log.warning(msg) - project.emit_notification("log.warning", {"message": msg}) - continue - # ignore the .gns3 file - if file.endswith(".gns3"): - continue - _patch_mtime(path) - zstream.write(path, os.path.relpath(path, project._path)) + try: + files = [f for f in files if _is_exportable(os.path.join(root, f), include_snapshots)] + for file in files: + path = os.path.join(root, file) + # check if we can export the file + try: + open(path).close() + except OSError as e: + msg = "Could not export file {}: {}".format(path, e) + log.warning(msg) + project.emit_notification("log.warning", {"message": msg}) + continue + # ignore the .gns3 file + if file.endswith(".gns3"): + continue + _patch_mtime(path) + zstream.write(path, os.path.relpath(path, project._path)) + except FileNotFoundError as e: + log.warning("Cannot export local file: {}".format(e)) + continue # Export files from remote computes for compute in project.computes: @@ -91,8 +95,9 @@ async def export_project(zstream, project, temporary_dir, include_images=False, if _is_exportable(compute_file["path"], include_snapshots): log.debug("Downloading file '{}' from compute '{}'".format(compute_file["path"], compute.id)) response = await compute.download_file(project, compute_file["path"]) - #if response.status != 200: - # raise aiohttp.web.HTTPConflict(text="Cannot export file from compute '{}'. Compute returned status code {}.".format(compute.id, response.status)) + if response.status != 200: + log.warning("Cannot export file from compute '{}'. Compute returned status code {}.".format(compute.id, response.status)) + continue (fd, temp_path) = tempfile.mkstemp(dir=temporary_dir) async with aiofiles.open(fd, 'wb') as f: while True: @@ -130,10 +135,6 @@ def _is_exportable(path, include_snapshots=False): :returns: True if file should not be included in the final archive """ - # do not export file that does not exist anymore - if not os.path.exists(path): - return False - # do not export snapshots by default if include_snapshots is False and path.endswith("snapshots"): return False