From 17d657c919d76ef93311ebb5d784bd8be19c9491 Mon Sep 17 00:00:00 2001 From: grossmj Date: Tue, 11 Sep 2018 15:06:01 +0200 Subject: [PATCH] Fix small errors like unhandled exceptions etc. --- gns3server/compute/builtin/nodes/cloud.py | 2 +- gns3server/compute/docker/docker_vm.py | 4 ++-- gns3server/compute/iou/iou_vm.py | 4 ++-- gns3server/compute/qemu/__init__.py | 4 ++-- .../compute/virtualbox/virtualbox_vm.py | 3 +++ gns3server/controller/__init__.py | 6 ++---- gns3server/controller/node.py | 2 +- gns3server/controller/project.py | 2 +- gns3server/controller/symbols.py | 19 ++++++++++++++----- gns3server/controller/topology.py | 8 ++++---- .../handlers/api/controller/symbol_handler.py | 7 ++++--- gns3server/ubridge/hypervisor.py | 2 +- 12 files changed, 37 insertions(+), 26 deletions(-) diff --git a/gns3server/compute/builtin/nodes/cloud.py b/gns3server/compute/builtin/nodes/cloud.py index 31796964..53254ca6 100644 --- a/gns3server/compute/builtin/nodes/cloud.py +++ b/gns3server/compute/builtin/nodes/cloud.py @@ -163,7 +163,7 @@ class Cloud(BaseNode): try: output = yield from gns3server.utils.asyncio.subprocess_check_output("networksetup", "-listallhardwareports") - except (FileNotFoundError, subprocess.SubprocessError) as e: + except (OSError, subprocess.SubprocessError) as e: log.warn("Could not execute networksetup: {}".format(e)) return False diff --git a/gns3server/compute/docker/docker_vm.py b/gns3server/compute/docker/docker_vm.py index 7c07bcaa..ad24a987 100644 --- a/gns3server/compute/docker/docker_vm.py +++ b/gns3server/compute/docker/docker_vm.py @@ -526,8 +526,8 @@ class DockerVM(BaseNode): x11_socket = os.path.join("/tmp/.X11-unix/", "X{}".format(self._display)) yield from wait_for_file_creation(x11_socket) - monitor_process(self._xvfb_process, self._xvfb_callback) - monitor_process(self._x11vnc_process, self._x11vnc_callback) + #monitor_process(self._xvfb_process, self._xvfb_callback) + #monitor_process(self._x11vnc_process, self._x11vnc_callback) def _xvfb_callback(self, returncode): """ diff --git a/gns3server/compute/iou/iou_vm.py b/gns3server/compute/iou/iou_vm.py index 852a05f3..3d5de28b 100644 --- a/gns3server/compute/iou/iou_vm.py +++ b/gns3server/compute/iou/iou_vm.py @@ -368,7 +368,7 @@ class IOUVM(BaseNode): try: output = yield from gns3server.utils.asyncio.subprocess_check_output("ldd", self._path) - except (FileNotFoundError, subprocess.SubprocessError) as e: + except (OSError, subprocess.SubprocessError) as e: log.warn("Could not determine the shared library dependencies for {}: {}".format(self._path, e)) return @@ -421,7 +421,7 @@ class IOUVM(BaseNode): hostid = (yield from gns3server.utils.asyncio.subprocess_check_output("hostid")).strip() except FileNotFoundError as e: raise IOUError("Could not find hostid: {}".format(e)) - except subprocess.SubprocessError as e: + except (OSError, subprocess.SubprocessError) as e: raise IOUError("Could not execute hostid: {}".format(e)) try: diff --git a/gns3server/compute/qemu/__init__.py b/gns3server/compute/qemu/__init__.py index fd06605c..4608fdd4 100644 --- a/gns3server/compute/qemu/__init__.py +++ b/gns3server/compute/qemu/__init__.py @@ -193,7 +193,7 @@ class Qemu(BaseManager): return version else: raise QemuError("Could not determine the Qemu version for {}".format(qemu_path)) - except subprocess.SubprocessError as e: + except (OSError, subprocess.SubprocessError) as e: raise QemuError("Error while looking for the Qemu version: {}".format(e)) @staticmethod @@ -213,7 +213,7 @@ class Qemu(BaseManager): return version else: raise QemuError("Could not determine the Qemu-img version for {}".format(qemu_img_path)) - except subprocess.SubprocessError as e: + except (OSError, subprocess.SubprocessError) as e: raise QemuError("Error while looking for the Qemu-img version: {}".format(e)) @staticmethod diff --git a/gns3server/compute/virtualbox/virtualbox_vm.py b/gns3server/compute/virtualbox/virtualbox_vm.py index a3611458..af243f01 100644 --- a/gns3server/compute/virtualbox/virtualbox_vm.py +++ b/gns3server/compute/virtualbox/virtualbox_vm.py @@ -217,6 +217,8 @@ class VirtualBoxVM(BaseNode): except ET.ParseError: raise VirtualBoxError("Cannot modify VirtualBox linked nodes file. " "File {} is corrupted.".format(self._linked_vbox_file())) + except OSError as e: + raise VirtualBoxError("Cannot modify VirtualBox linked nodes file '{}': {}".format(self._linked_vbox_file(), e)) machine = tree.getroot().find("{http://www.virtualbox.org/}Machine") if machine is not None and machine.get("uuid") != "{" + self.id + "}": @@ -245,6 +247,7 @@ class VirtualBoxVM(BaseNode): return True return False + @locking @asyncio.coroutine def start(self): """ diff --git a/gns3server/controller/__init__.py b/gns3server/controller/__init__.py index e2e75370..958cdef7 100644 --- a/gns3server/controller/__init__.py +++ b/gns3server/controller/__init__.py @@ -66,9 +66,7 @@ class Controller: def load_appliances(self): self._appliance_templates = {} - for directory, builtin in ( - (get_resource('appliances'), True,), (self.appliances_path(), False,) - ): + for directory, builtin in ((get_resource('appliances'), True,), (self.appliances_path(), False,)): if directory and os.path.isdir(directory): for file in os.listdir(directory): if not file.endswith('.gns3a') and not file.endswith('.gns3appliance'): @@ -200,7 +198,7 @@ class Controller: for c in computes: try: yield from self.add_compute(**c) - except (aiohttp.web.HTTPConflict, KeyError): + except (aiohttp.web.HTTPError, KeyError): pass # Skip not available servers at loading yield from self.load_projects() try: diff --git a/gns3server/controller/node.py b/gns3server/controller/node.py index 2226484a..38bf753d 100644 --- a/gns3server/controller/node.py +++ b/gns3server/controller/node.py @@ -175,7 +175,7 @@ class Node: if not os.path.isabs(path): path = os.path.join(self.project.controller.configs_path(), path) try: - with open(path) as f: + with open(path, encoding="utf-8") as f: return f.read() except OSError: return None diff --git a/gns3server/controller/project.py b/gns3server/controller/project.py index 6a6446ba..a8632a46 100644 --- a/gns3server/controller/project.py +++ b/gns3server/controller/project.py @@ -843,7 +843,7 @@ class Project: link = yield from self.add_link(link_id=link_data["link_id"]) if "filters" in link_data: yield from link.update_filters(link_data["filters"]) - for node_link in link_data["nodes"]: + for node_link in link_data.get("nodes", []): node = self.get_node(node_link["node_id"]) port = node.get_port(node_link["adapter_number"], node_link["port_number"]) if port is None: diff --git a/gns3server/controller/symbols.py b/gns3server/controller/symbols.py index 63da9225..ce7e0268 100644 --- a/gns3server/controller/symbols.py +++ b/gns3server/controller/symbols.py @@ -22,6 +22,9 @@ from ..utils.get_resource import get_resource from ..utils.picture import get_size from ..config import Config +import logging +log = logging.getLogger(__name__) + class Symbols: """ @@ -72,19 +75,25 @@ class Symbols: def symbols_path(self): directory = os.path.expanduser(Config.instance().get_section_config("Server").get("symbols_path", "~/GNS3/symbols")) if directory: - os.makedirs(directory, exist_ok=True) + try: + os.makedirs(directory, exist_ok=True) + except OSError as e: + log.error("Could not create symbol directory '{}': {}".format(directory, e)) + return None return directory def get_path(self, symbol_id): try: return self._symbols_path[symbol_id] - # Symbol not found refresh cache + # Symbol not found, let's refresh the cache except KeyError: - self.list() try: + self.list() return self._symbols_path[symbol_id] - except KeyError: - return self._symbols_path[":/symbols/computer.svg"] + except (OSError, KeyError): + log.warning("Could not retrieve symbol '{}'".format(symbol_id)) + symbols_path = self._symbols_path + return symbols_path[":/symbols/computer.svg"] def get_size(self, symbol_id): try: diff --git a/gns3server/controller/topology.py b/gns3server/controller/topology.py index 475c8c41..9d32112f 100644 --- a/gns3server/controller/topology.py +++ b/gns3server/controller/topology.py @@ -409,7 +409,7 @@ def _convert_1_3_later(topo, topo_path): symbol = old_node.get("symbol", ":/symbols/computer.svg") old_node["ports"] = _create_cloud(node, old_node, symbol) else: - raise NotImplementedError("Conversion of {} is not supported".format(old_node["type"])) + raise aiohttp.web.HTTPConflict(text="Conversion of {} is not supported".format(old_node["type"])) for prop in old_node.get("properties", {}): if prop not in ["console", "name", "console_type", "console_host", "use_ubridge"]: @@ -608,13 +608,13 @@ def _create_cloud(node, old_node, icon): elif old_port["name"].startswith("nio_nat"): continue else: - raise NotImplementedError("The conversion of cloud with {} is not supported".format(old_port["name"])) + raise aiohttp.web.HTTPConflict(text="The conversion of cloud with {} is not supported".format(old_port["name"])) if port_type == "udp": try: _, lport, rhost, rport = old_port["name"].split(":") except ValueError: - raise NotImplementedError("UDP tunnel using IPV6 is not supported in cloud") + raise aiohttp.web.HTTPConflict(text="UDP tunnel using IPV6 is not supported in cloud") port = { "name": "UDP tunnel {}".format(len(ports) + 1), "port_number": len(ports) + 1, @@ -645,7 +645,7 @@ def _convert_snapshots(topo_dir): old_snapshots_dir = os.path.join(topo_dir, "project-files", "snapshots") if os.path.exists(old_snapshots_dir): new_snapshots_dir = os.path.join(topo_dir, "snapshots") - os.makedirs(new_snapshots_dir) + os.makedirs(new_snapshots_dir, exist_ok=True) for snapshot in os.listdir(old_snapshots_dir): snapshot_dir = os.path.join(old_snapshots_dir, snapshot) diff --git a/gns3server/handlers/api/controller/symbol_handler.py b/gns3server/handlers/api/controller/symbol_handler.py index b9796d94..3d378766 100644 --- a/gns3server/handlers/api/controller/symbol_handler.py +++ b/gns3server/handlers/api/controller/symbol_handler.py @@ -52,7 +52,8 @@ class SymbolHandler: controller = Controller.instance() try: yield from response.file(controller.symbols.get_path(request.match_info["symbol_id"])) - except (KeyError, FileNotFoundError, PermissionError): + except (KeyError, OSError) as e: + log.warning("Could not get symbol file: {}".format(e)) response.set_status(404) @Route.post( @@ -66,7 +67,7 @@ class SymbolHandler: controller = Controller.instance() path = os.path.join(controller.symbols.symbols_path(), os.path.basename(request.match_info["symbol_id"])) try: - with open(path, 'wb') as f: + with open(path, "wb") as f: while True: try: chunk = yield from request.content.read(1024) @@ -75,7 +76,7 @@ class SymbolHandler: if not chunk: break f.write(chunk) - except OSError as e: + except (UnicodeEncodeError, OSError) as e: raise aiohttp.web.HTTPConflict(text="Could not write symbol file '{}': {}".format(path, e)) # Reset the symbol list controller.symbols.list() diff --git a/gns3server/ubridge/hypervisor.py b/gns3server/ubridge/hypervisor.py index ed618b06..91ed58c4 100644 --- a/gns3server/ubridge/hypervisor.py +++ b/gns3server/ubridge/hypervisor.py @@ -178,7 +178,7 @@ class Hypervisor(UBridgeHypervisor): env=env) log.info("ubridge started PID={}".format(self._process.pid)) - except (OSError, PermissionError, subprocess.SubprocessError) as e: + except (OSError, subprocess.SubprocessError) as e: ubridge_stdout = self.read_stdout() log.error("Could not start ubridge: {}\n{}".format(e, ubridge_stdout)) raise UbridgeError("Could not start ubridge: {}\n{}".format(e, ubridge_stdout))