diff --git a/gns3server/compute/project_manager.py b/gns3server/compute/project_manager.py index cce5af26..28c517d1 100644 --- a/gns3server/compute/project_manager.py +++ b/gns3server/compute/project_manager.py @@ -16,9 +16,14 @@ # along with this program. If not, see . import aiohttp +import psutil +import platform from .project import Project from uuid import UUID +import logging +log = logging.getLogger(__name__) + class ProjectManager: @@ -70,6 +75,26 @@ class ProjectManager: raise aiohttp.web.HTTPNotFound(text="Project ID {} doesn't exist".format(project_id)) return self._projects[project_id] + def _check_available_disk_space(self, project): + """ + Sends a warning notification if disk space is getting low. + + :param project: project instance + """ + + try: + used_disk_space = psutil.disk_usage(project.path).percent + except FileNotFoundError: + log.warning('Could not find "{}" when checking for used disk space'.format(project.path)) + return + # send a warning if used disk space is >= 90% + if used_disk_space >= 90: + message = 'Only {}% or less of disk space detected in "{}" on "{}"'.format(used_disk_space, + project.path, + platform.node()) + log.warning(message) + project.emit("log.warning", {"message": message}) + def create_project(self, name=None, project_id=None, path=None): """ Create a project and keep a references to it in project manager. @@ -80,6 +105,7 @@ class ProjectManager: if project_id is not None and project_id in self._projects: return self._projects[project_id] project = Project(name=name, project_id=project_id, path=path) + self._check_available_disk_space(project) self._projects[project.id] = project return project diff --git a/gns3server/compute/virtualbox/virtualbox_vm.py b/gns3server/compute/virtualbox/virtualbox_vm.py index 16b1bf23..1e20ebaf 100644 --- a/gns3server/compute/virtualbox/virtualbox_vm.py +++ b/gns3server/compute/virtualbox/virtualbox_vm.py @@ -846,10 +846,8 @@ class VirtualBoxVM(BaseNode): nio = self._local_udp_tunnels[adapter_number][0] if nio: - if not self._use_any_adapter and attachment not in ("none", "null", "generic"): - raise VirtualBoxError("Attachment ({}) already configured on adapter {}. " - "Please set it to 'Not attached' to allow GNS3 to use it.".format(attachment, - adapter_number + 1)) + if not self._use_any_adapter and attachment in ("nat", "bridged", "intnet", "hostonly", "natnetwork"): + continue yield from self._modify_vm("--nictrace{} off".format(adapter_number + 1)) vbox_adapter_type = "82540EM" @@ -972,23 +970,40 @@ class VirtualBoxVM(BaseNode): raise VirtualBoxError("Adapter {adapter_number} doesn't exist on VirtualBox VM '{name}'".format(name=self.name, adapter_number=adapter_number)) + # check if trying to connect to a nat, bridged, host-only or any other special adapter + nic_attachments = yield from self._get_nic_attachements(self._maximum_adapters) + attachment = nic_attachments[adapter_number] + if attachment in ("nat", "bridged", "intnet", "hostonly", "natnetwork"): + if not self._use_any_adapter: + raise VirtualBoxError("Attachment '{attachment}' is already configured on adapter {adapter_number}. " + "Please remove it or allow VirtualBox VM '{name}' to use any adapter.".format(attachment=attachment, + adapter_number=adapter_number, + name=self.name)) + elif self.is_running(): + # dynamically configure an UDP tunnel attachment if the VM is already running + local_nio = self._local_udp_tunnels[adapter_number][0] + if local_nio and isinstance(local_nio, NIOUDP): + yield from self._control_vm("nic{} generic UDPTunnel".format(adapter_number + 1)) + yield from self._control_vm("nicproperty{} sport={}".format(adapter_number + 1, local_nio.lport)) + yield from self._control_vm("nicproperty{} dest={}".format(adapter_number + 1, local_nio.rhost)) + yield from self._control_vm("nicproperty{} dport={}".format(adapter_number + 1, local_nio.rport)) + yield from self._control_vm("setlinkstate{} on".format(adapter_number + 1)) + if self.is_running(): try: yield from self.add_ubridge_udp_connection("VBOX-{}-{}".format(self._id, adapter_number), self._local_udp_tunnels[adapter_number][1], nio) except KeyError: - raise VirtualBoxError("Adapter {adapter_number} doesn't exist on VirtualBox VM '{name}'".format( - name=self.name, - adapter_number=adapter_number)) + raise VirtualBoxError("Adapter {adapter_number} doesn't exist on VirtualBox VM '{name}'".format(name=self.name, + adapter_number=adapter_number)) yield from self._control_vm("setlinkstate{} on".format(adapter_number + 1)) adapter.add_nio(0, nio) - log.info("VirtualBox VM '{name}' [{id}]: {nio} added to adapter {adapter_number}".format( - name=self.name, - id=self.id, - nio=nio, - adapter_number=adapter_number)) + log.info("VirtualBox VM '{name}' [{id}]: {nio} added to adapter {adapter_number}".format(name=self.name, + id=self.id, + nio=nio, + adapter_number=adapter_number)) @asyncio.coroutine def adapter_update_nio_binding(self, adapter_number, nio): diff --git a/gns3server/compute/vmware/vmware_vm.py b/gns3server/compute/vmware/vmware_vm.py index bf5359e6..37311f5e 100644 --- a/gns3server/compute/vmware/vmware_vm.py +++ b/gns3server/compute/vmware/vmware_vm.py @@ -736,13 +736,20 @@ class VMwareVM(BaseNode): self._read_vmx_file() # check if trying to connect to a nat, bridged or host-only adapter - if not self._use_any_adapter and self._get_vmx_setting("ethernet{}.present".format(adapter_number), "TRUE"): + if self._get_vmx_setting("ethernet{}.present".format(adapter_number), "TRUE"): # check for the connection type connection_type = "ethernet{}.connectiontype".format(adapter_number) if connection_type in self._vmx_pairs and self._vmx_pairs[connection_type] in ("nat", "bridged", "hostonly"): - raise VMwareError("Attachment ({}) already configured on network adapter {}. " - "Please remove it or allow GNS3 to use any adapter.".format(self._vmx_pairs[connection_type], - adapter_number)) + if not self._use_any_adapter: + raise VMwareError("Attachment '{attachment}' is already configured on network adapter {adapter_number}. " + "Please remove it or allow VMware VM '{name}' to use any adapter.".format(attachment=self._vmx_pairs[connection_type], + adapter_number=adapter_number, + name=self.name)) + elif self.is_running(): + raise VMwareError("Attachment '{attachment}' is configured on network adapter {adapter_number}. " + "Please stop VMware VM '{name}' to link to this adapter and allow GNS3 to change the attachment type.".format(attachment=self._vmx_pairs[connection_type], + adapter_number=adapter_number, + name=self.name)) adapter.add_nio(0, nio) if self._started and self._ubridge_hypervisor: