From 1e38b11f3494c68aa9fd80bfcd8b2abbd8f298d4 Mon Sep 17 00:00:00 2001 From: Julien Duponchelle Date: Wed, 13 May 2015 10:16:24 +0200 Subject: [PATCH 1/4] Catch crash error in IOU in case of permission denied Fix #186 --- gns3server/modules/iou/iou_vm.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gns3server/modules/iou/iou_vm.py b/gns3server/modules/iou/iou_vm.py index b7214bd4..d666fc95 100644 --- a/gns3server/modules/iou/iou_vm.py +++ b/gns3server/modules/iou/iou_vm.py @@ -433,7 +433,10 @@ class IOUVM(BaseVM): yield from self._library_check() - self._rename_nvram_file() + try: + self._rename_nvram_file() + except OSError as e: + raise IOUError("Could not rename nvram files: {}".format(e)) iourc_path = self.iourc_path if iourc_path is None: From 3704911c2dd236c40ab05c7a06190ba614fd371b Mon Sep 17 00:00:00 2001 From: Julien Duponchelle Date: Wed, 13 May 2015 10:19:50 +0200 Subject: [PATCH 2/4] Fix tests --- tests/modules/qemu/test_qemu_vm.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/modules/qemu/test_qemu_vm.py b/tests/modules/qemu/test_qemu_vm.py index 5d00e1c5..ac939473 100644 --- a/tests/modules/qemu/test_qemu_vm.py +++ b/tests/modules/qemu/test_qemu_vm.py @@ -272,12 +272,13 @@ def test_build_command(vm, loop, fake_qemu_binary, port_manager): os.path.join(vm.working_dir, "flash.qcow2"), "-serial", "telnet:127.0.0.1:{},server,nowait".format(vm.console), + "-net", + "none", "-device", - "e1000,mac=00:00:ab:0e:0f:00,netdev=gns3-0", - "-netdev", - "user,id=gns3-0" + "e1000,mac=00:00:ab:0e:0f:00" ] + @pytest.mark.skipif(sys.platform.startswith("win"), reason="Not supported on Windows") def test_build_command_without_display(vm, loop, fake_qemu_binary): @@ -313,6 +314,7 @@ def test_hdb_disk_image(vm, tmpdir): vm.hdb_disk_image = "test" assert vm.hdb_disk_image == str(tmpdir / "QEMU" / "test") + def test_hdc_disk_image(vm, tmpdir): with patch("gns3server.config.Config.get_section_config", return_value={"images_path": str(tmpdir)}): @@ -321,6 +323,7 @@ def test_hdc_disk_image(vm, tmpdir): vm.hdc_disk_image = "test" assert vm.hdc_disk_image == str(tmpdir / "QEMU" / "test") + def test_hdd_disk_image(vm, tmpdir): with patch("gns3server.config.Config.get_section_config", return_value={"images_path": str(tmpdir)}): From 157bc18ebd1df53d5d2d44d5e7c9541a231ccf49 Mon Sep 17 00:00:00 2001 From: Julien Duponchelle Date: Wed, 13 May 2015 14:29:03 +0200 Subject: [PATCH 3/4] Use a temporary directory as egg cache We have use with broken permission on their system. We try to workaround the issue. Fix #182 --- gns3server/main.py | 10 ++++++++ gns3server/utils/get_resource.py | 41 ++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 gns3server/utils/get_resource.py diff --git a/gns3server/main.py b/gns3server/main.py index 30360876..e0bf9af2 100644 --- a/gns3server/main.py +++ b/gns3server/main.py @@ -16,6 +16,16 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . + +# WARNING +# Due to buggy user machines we choose to put this as the first loading modules +# otherwise the egg cache is initialized in his standard location and +# if is not writetable the application crash. It's the user fault +# because one day the user as used sudo to run an egg and break his +# filesystem permissions, but it's a common mistake. +import gns3server.utils.get_resource + + import os import datetime import sys diff --git a/gns3server/utils/get_resource.py b/gns3server/utils/get_resource.py new file mode 100644 index 00000000..f28152ab --- /dev/null +++ b/gns3server/utils/get_resource.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2015 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import tempfile +import pkg_resources +import atexit +import logging + +log = logging.getLogger(__name__) + +try: + egg_cache_dir = tempfile.mkdtemp() + pkg_resources.set_extraction_path(dir) +except ValueError: + # If the path is already set the module throw an error + pass + + +@atexit.register +def clean_egg_cache(): + try: + import shutil + log.debug("Clean egg cache %s", egg_cache_dir) + shutil.rmtree(egg_cache_dir) + except Exception: + # We don't care if we can not cleanup + pass From a3c0f0754efb61834edd2b044bc881a2214e8c45 Mon Sep 17 00:00:00 2001 From: Julien Duponchelle Date: Wed, 13 May 2015 23:27:51 +0200 Subject: [PATCH 4/4] Fix crash --- gns3server/utils/get_resource.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gns3server/utils/get_resource.py b/gns3server/utils/get_resource.py index f28152ab..dae285fc 100644 --- a/gns3server/utils/get_resource.py +++ b/gns3server/utils/get_resource.py @@ -24,7 +24,7 @@ log = logging.getLogger(__name__) try: egg_cache_dir = tempfile.mkdtemp() - pkg_resources.set_extraction_path(dir) + pkg_resources.set_extraction_path(egg_cache_dir) except ValueError: # If the path is already set the module throw an error pass