diff --git a/gns3server/controller/__init__.py b/gns3server/controller/__init__.py
index a1640fa1..36f6422b 100644
--- a/gns3server/controller/__init__.py
+++ b/gns3server/controller/__init__.py
@@ -205,7 +205,12 @@ class Controller:
# load GNS3 VM settings
if "gns3vm" in controller_settings:
- self.gns3vm.settings = controller_settings["gns3vm"]
+ gns3_vm_settings = controller_settings["gns3vm"]
+ if "port" not in gns3_vm_settings:
+ # port setting was added in version 2.2.8
+ # the default port was 3080 before this
+ gns3_vm_settings["port"] = 3080
+ self.gns3vm.settings = gns3_vm_settings
# load the IOU license settings
if "iou_license" in controller_settings:
diff --git a/gns3server/controller/gns3vm/__init__.py b/gns3server/controller/gns3vm/__init__.py
index 885916e1..795e15a8 100644
--- a/gns3server/controller/gns3vm/__init__.py
+++ b/gns3server/controller/gns3vm/__init__.py
@@ -39,7 +39,7 @@ class GNS3VM:
Proxy between the controller and the GNS3 VM engine
"""
- def __init__(self, controller, settings={}):
+ def __init__(self, controller):
self._controller = controller
# Keep instance of the loaded engines
self._engines = {}
@@ -50,9 +50,9 @@ class GNS3VM:
"enable": False,
"engine": "vmware",
"ram": 2048,
- "vcpus": 1
+ "vcpus": 1,
+ "port": 80,
}
- self.settings = settings
def engine_list(self):
"""
@@ -72,10 +72,11 @@ class GNS3VM:
else:
vmware_info["name"] = "VMware Workstation / Player (recommended)"
+ download_url = "https://github.com/GNS3/gns3-gui/releases/download/v{version}/GNS3.VM.Hyper-V.{version}.zip".format(version=__version__)
hyperv_info = {
"engine_id": "hyper-v",
"name": "Hyper-V",
- "description": 'Hyper-V support (Windows 10/Server 2016 and above). Nested virtualization must be supported and enabled (Intel processor only)',
+ "description": 'Hyper-V support (Windows 10/Server 2016 and above). Nested virtualization must be supported and enabled (Intel processor only)
The GNS3 VM can be downloaded here'.format(download_url),
"support_when_exit": True,
"support_headless": False,
"support_ram": True
@@ -85,7 +86,7 @@ class GNS3VM:
virtualbox_info = {
"engine_id": "virtualbox",
"name": "VirtualBox",
- "description": 'VirtualBox doesn\'t support nested virtualization, this means Qemu based VMs will run extremely slowly.
The GNS3 VM can be downloaded here'.format(download_url),
+ "description": 'VirtualBox support. Nested virtualization for both Intel and AMD processors is supported since version 6.1
The GNS3 VM can be downloaded here'.format(download_url),
"support_when_exit": True,
"support_headless": True,
"support_ram": True
@@ -278,9 +279,9 @@ class GNS3VM:
# User will receive the error later when they will try to use the node
try:
compute = await self._controller.add_compute(compute_id="vm",
- name="GNS3 VM ({})".format(self.current_engine().vmname),
- host=None,
- force=True)
+ name="GNS3 VM ({})".format(self.current_engine().vmname),
+ host=None,
+ force=True)
compute.set_last_error(str(e))
except aiohttp.web.HTTPConflict:
@@ -313,6 +314,7 @@ class GNS3VM:
engine.ram = self._settings["ram"]
engine.vcpus = self._settings["vcpus"]
engine.headless = self._settings["headless"]
+ engine.port = self._settings["port"]
compute = await self._controller.add_compute(compute_id="vm",
name="GNS3 VM is starting ({})".format(engine.vmname),
host=None,
@@ -329,11 +331,11 @@ class GNS3VM:
raise e
await compute.connect() # we can connect now that the VM has started
await compute.update(name="GNS3 VM ({})".format(engine.vmname),
- protocol=self.protocol,
- host=self.ip_address,
- port=self.port,
- user=self.user,
- password=self.password)
+ protocol=self.protocol,
+ host=self.ip_address,
+ port=self.port,
+ user=self.user,
+ password=self.password)
# check if the VM is in the same subnet as the local server, start 10 seconds later to give
# some time for the compute in the VM to be ready for requests
diff --git a/gns3server/controller/gns3vm/base_gns3_vm.py b/gns3server/controller/gns3vm/base_gns3_vm.py
index 64305573..c111989a 100644
--- a/gns3server/controller/gns3vm/base_gns3_vm.py
+++ b/gns3server/controller/gns3vm/base_gns3_vm.py
@@ -15,7 +15,6 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import asyncio
import psutil
import logging
@@ -29,7 +28,7 @@ class BaseGNS3VM:
self._controller = controller
self._vmname = None
self._ip_address = None
- self._port = 3080
+ self._port = 80 # value not used, will be overwritten
self._headless = False
self._vcpus = 1
self._ram = 1024
diff --git a/gns3server/controller/gns3vm/virtualbox_gns3_vm.py b/gns3server/controller/gns3vm/virtualbox_gns3_vm.py
index 8561fe5d..9a656955 100644
--- a/gns3server/controller/gns3vm/virtualbox_gns3_vm.py
+++ b/gns3server/controller/gns3vm/virtualbox_gns3_vm.py
@@ -285,13 +285,12 @@ class VirtualBoxGNS3VM(BaseGNS3VM):
log.info("Removing GNS3VM NAT port forwarding rule from interface {}".format(nat_interface_number))
await self._execute("controlvm", [self._vmname, "natpf{}".format(nat_interface_number), "delete", "GNS3VM"])
- # add a GNS3VM NAT port forwarding rule to redirect 127.0.0.1 with random port to port 3080 in the VM
+ # add a GNS3VM NAT port forwarding rule to redirect 127.0.0.1 with random port to the port in the VM
log.info("Adding GNS3VM NAT port forwarding rule with port {} to interface {}".format(api_port, nat_interface_number))
await self._execute("controlvm", [self._vmname, "natpf{}".format(nat_interface_number),
- "GNS3VM,tcp,{},{},,3080".format(ip_address, api_port)])
+ "GNS3VM,tcp,{},{},,{}".format(ip_address, api_port, self.port)])
self.ip_address = await self._get_ip(hostonly_interface_number, api_port)
- self.port = 3080
log.info("GNS3 VM has been started with IP {}".format(self.ip_address))
self.running = True
diff --git a/gns3server/schemas/gns3vm.py b/gns3server/schemas/gns3vm.py
index 98c73273..c713c8d2 100644
--- a/gns3server/schemas/gns3vm.py
+++ b/gns3server/schemas/gns3vm.py
@@ -48,6 +48,12 @@ GNS3VM_SETTINGS_SCHEMA = {
"ram": {
"description": "Amount of ram affected to the VM",
"type": "integer"
+ },
+ "port": {
+ "description": "Server port",
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 65535
}
},
"additionalProperties": False