From 0390fef74d5b981b466968c80c07b94ec7be9ddb Mon Sep 17 00:00:00 2001 From: grossmj Date: Fri, 17 Jul 2020 15:09:43 +0930 Subject: [PATCH] Use parent directory as working directory for project duplication and snapshots. Fixes https://github.com/GNS3/gns3-gui/issues/2909 --- gns3server/controller/project.py | 11 ++++++++++- gns3server/controller/snapshot.py | 2 +- gns3server/handlers/api/controller/project_handler.py | 10 +++++++--- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/gns3server/controller/project.py b/gns3server/controller/project.py index 43f9ab0e..5a289e15 100644 --- a/gns3server/controller/project.py +++ b/gns3server/controller/project.py @@ -1020,7 +1020,16 @@ class Project: assert self._status != "closed" try: begin = time.time() - with tempfile.TemporaryDirectory() as tmpdir: + + # use the parent directory of the project we are duplicating as a + # temporary directory to avoid no space left issues when '/tmp' + # is location on another partition. + if location: + working_dir = os.path.abspath(os.path.join(location, os.pardir)) + else: + working_dir = os.path.abspath(os.path.join(self.path, os.pardir)) + + with tempfile.TemporaryDirectory(dir=working_dir) as tmpdir: # Do not compress the exported project when duplicating with aiozipstream.ZipFile(compression=zipfile.ZIP_STORED) as zstream: await export_project(zstream, self, tmpdir, keep_compute_id=True, allow_all_nodes=True, reset_mac_addresses=reset_mac_addresses) diff --git a/gns3server/controller/snapshot.py b/gns3server/controller/snapshot.py index 72be81fd..8bb2b00c 100644 --- a/gns3server/controller/snapshot.py +++ b/gns3server/controller/snapshot.py @@ -95,7 +95,7 @@ class Snapshot: try: begin = time.time() - with tempfile.TemporaryDirectory() as tmpdir: + with tempfile.TemporaryDirectory(dir=snapshot_directory) as tmpdir: # Do not compress the snapshots with aiozipstream.ZipFile(compression=zipfile.ZIP_STORED) as zstream: await export_project(zstream, self._project, tmpdir, keep_compute_id=True, allow_all_nodes=True) diff --git a/gns3server/handlers/api/controller/project_handler.py b/gns3server/handlers/api/controller/project_handler.py index bec9605b..738d833a 100644 --- a/gns3server/handlers/api/controller/project_handler.py +++ b/gns3server/handlers/api/controller/project_handler.py @@ -331,9 +331,11 @@ class ProjectHandler: try: begin = time.time() - with tempfile.TemporaryDirectory() as tmp_dir: + # use the parent directory as a temporary working dir + working_dir = os.path.abspath(os.path.join(project.path, os.pardir)) + with tempfile.TemporaryDirectory(dir=working_dir) as tmpdir: with aiozipstream.ZipFile(compression=compression) as zstream: - await export_project(zstream, project, tmp_dir, include_snapshots=include_snapshots, include_images=include_images, reset_mac_addresses=reset_mac_addresses) + await export_project(zstream, project, tmpdir, include_snapshots=include_snapshots, include_images=include_images, reset_mac_addresses=reset_mac_addresses) # We need to do that now because export could failed and raise an HTTP error # that why response start need to be the later possible @@ -380,7 +382,9 @@ class ProjectHandler: # It could be more optimal to stream this but it is not implemented in Python. try: begin = time.time() - with tempfile.TemporaryDirectory() as tmpdir: + # use the parent directory as a temporary working dir + working_dir = os.path.abspath(os.path.join(path, os.pardir)) + with tempfile.TemporaryDirectory(dir=working_dir) as tmpdir: temp_project_path = os.path.join(tmpdir, "project.zip") async with aiofiles.open(temp_project_path, 'wb') as f: while True: