diff --git a/.github/workflows/publish-api-documentation.yml b/.github/workflows/publish-api-documentation.yml
index 30beb62f..68bd91cd 100644
--- a/.github/workflows/publish-api-documentation.yml
+++ b/.github/workflows/publish-api-documentation.yml
@@ -18,7 +18,7 @@ jobs:
ref: "gh-pages"
- uses: actions/setup-python@v3
with:
- python-version: 3.7
+ python-version: 3.8
- name: Merge changes from 3.0 branch
run: |
git config user.name github-actions
diff --git a/CHANGELOG b/CHANGELOG
index bfaecf60..367bcbf1 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,84 @@
# Change Log
+## 3.0.0b2 07/04/2024
+
+* Bundle web-ui v3.0.0b2
+* Fix cannot stop Docker VM while console connection is still active.
+* Support for custom Qemu path in templates and nodes
+* Fix CPU fractional values for Docker VMs.
+* Use bcrypt directly instead of passlib
+* Update CORS policy
+* Do not stop searching for Qemu binaries if one binary cannot be executed. Ref #2306
+* Fix Ethernet switch and Ethernet hub port validations. Fixes #2334
+* Update CORS policy
+
+
+## 2.2.46 26/02/2024
+
+* Bundle web-ui v2.2.46
+* Save empty directories when exporting a project
+* Backport from v3: install Docker resources in a writable location at runtime.
+* Use Docker API v1.24 to get version.
+* Drop support for Python 3.6
+* Address the telnet console bug.
+* Update welcome.py
+* Update remote-install.sh
+* Use Python 3.8 to publish API doc
+* Upgrade sentry-sdk, psutil and distro dependencies
+
+## 2.2.45 12/01/2024
+
+* Bundle web-ui v2.2.45
+* Fix mouse offset issues with VNC in Qemu. Fixes #2335
+* Add project.created, project.opened and project.deleted controller notification stream. Move project.updated and project.closed from project notification to controller notification stream.
+* Do not stop searching for Qemu binaries if one binary cannot be executed. Ref #2306
+* Fix Ethernet switch and Ethernet hub port validations. Fixes #2334
+* Update CORS policy
+* Add custom executable paths on Windows
+* Upgrade sentry-sdk and aiohttp
+
+## 3.0.0b1 27/11/2023
+
+* Bundle web-ui v3.0.0b1
+* Upgrade sentry-sdk to v1.37.1
+* Upgrade aiohttp to v3.9.1
+* Fix bug when listing endpoints for opened project
+* Make images executable after importing a project
+* Disable IOS hostname check for Dynamips ghost instances
+
+## 3.0.0a6 15/11/2023
+
+* Bundle web-ui v3.0.0a6
+* Upgrade to aiohttp v3.9.0rc0
+* Install Docker resources in writable location
+* Default compute username is "gns3"
+* Non-blocking checksums computation when server starts. Fixes #2228
+* Fix timeout issue when creating Qemu disk image. Fixes https://github.com/GNS3/gns3-server/issues/2313
+* Fix broken link to Web UI in 3.0 branch. Fixes #2312
+* Fix sample config: VMware section declared twice. Fixes #2311
+* Fix ws console and packet capture over SSL
+* Support for web socket console over HTTPS
+* Allow disabling hardware virtualization check
+
+## 2.2.44.1 07/11/2023
+
+* Catch exceptions when computing image checksums. Ref https://github.com/GNS3/gns3-server/issues/2228
+* Add freeze_support() for multiprocessing
+
+## 2.2.44 06/11/2023
+
+* Bundle web-ui v2.2.44
+* Non-blocking checksums computation when server starts. Fixes #2228
+* Fix timeout issue when creating Qemu disk image. Fixes https://github.com/GNS3/gns3-server/issues/2313
+* Support for web socket console over HTTPS
+* Add back script create_cert.sh
+* Allow disabling hardware virtualization check
+* Fix L2IOU "failed code signing checks" when IOU base file name is >= 63 characters
+* Change "ip cef" to "no ip cef" in IOU default configs. Fixes #2298
+* Add Qemu IGB network device
+* Add Python 3.12 support.
+* Fix issue with importlib.resources.files() and Python 3.9
+
## 3.0.0a5 27/10/2023
* Bundle web-ui v3.0.0a5
diff --git a/README.md b/README.md
index f4761960..99c168bd 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
[![Snyk scanning](https://snyk.io/test/github/GNS3/gns3-server/badge.svg)](https://snyk.io/test/github/GNS3/gns3-server)
The GNS3 server manages emulators and other virtualization software such as Dynamips, Qemu/KVM, Docker, VPCS, VirtualBox and VMware Workstation.
-Clients like the [GNS3 GUI](https://github.com/GNS3/gns3-gui/) and the [GNS3 Web UI](https://github.com/GNS3/gns3-web-ui>) control the server using a HTTP REST API.
+Clients like the [GNS3 GUI](https://github.com/GNS3/gns3-gui/) and the [GNS3 Web UI](https://github.com/GNS3/gns3-web-ui/) control the server using a HTTP REST API.
## Installation
diff --git a/dev-requirements.txt b/dev-requirements.txt
index b923b844..e7f280d3 100644
--- a/dev-requirements.txt
+++ b/dev-requirements.txt
@@ -1,6 +1,6 @@
-pytest==7.4.2
-flake8==6.1.0
-pytest-timeout==2.2.0
+pytest==8.1.1
+flake8==7.0.0
+pytest-timeout==2.3.1
pytest-asyncio==0.21.1
requests==2.31.0
httpx==0.24.1 # version 0.24.1 is required by httpx_ws
diff --git a/gns3server/api/routes/compute/notifications.py b/gns3server/api/routes/compute/notifications.py
index 47b30f00..f784e3c3 100644
--- a/gns3server/api/routes/compute/notifications.py
+++ b/gns3server/api/routes/compute/notifications.py
@@ -50,11 +50,7 @@ async def project_ws_notifications(websocket: Union[None, WebSocket] = Depends(w
log.info(f"Client {websocket.client.host}:{websocket.client.port} has disconnected from compute WebSocket")
except WebSocketException as e:
log.warning(f"Error while sending to controller event to WebSocket client: {e}")
- finally:
- try:
- await websocket.close()
- except OSError:
- pass # ignore OSError: [Errno 107] Transport endpoint is not connected
+
if __name__ == "__main__":
diff --git a/gns3server/api/routes/controller/acl.py b/gns3server/api/routes/controller/acl.py
index ea33d46e..ae33bd09 100644
--- a/gns3server/api/routes/controller/acl.py
+++ b/gns3server/api/routes/controller/acl.py
@@ -99,8 +99,12 @@ async def endpoints(
for link in links:
node_id_1 = link["nodes"][0]["node_id"]
node_id_2 = link["nodes"][1]["node_id"]
- node_name_1 = project.nodes[node_id_1]["name"]
- node_name_2 = project.nodes[node_id_2]["name"]
+ node_name_1 = node_name_2 = "N/A"
+ for node in nodes:
+ if node["node_id"] == node_id_1:
+ node_name_1 = node["name"]
+ if node["node_id"] == node_id_2:
+ node_name_2 = node["name"]
add_to_endpoints(
f"/projects/{project.id}/links/{link['link_id']}",
f'Link from "{node_name_1}" to "{node_name_2}" in project "{project.name}"',
diff --git a/gns3server/api/routes/controller/controller.py b/gns3server/api/routes/controller/controller.py
index b47dd416..bc0a249f 100644
--- a/gns3server/api/routes/controller/controller.py
+++ b/gns3server/api/routes/controller/controller.py
@@ -221,11 +221,6 @@ async def controller_ws_notifications(
log.info(f"Client {websocket.client.host}:{websocket.client.port} has disconnected from controller WebSocket")
except WebSocketException as e:
log.warning(f"Error while sending to controller event to WebSocket client: {e}")
- finally:
- try:
- await websocket.close()
- except OSError:
- pass # ignore OSError: [Errno 107] Transport endpoint is not connected
# @Route.post(
diff --git a/gns3server/api/routes/controller/links.py b/gns3server/api/routes/controller/links.py
index 618ea198..7264a941 100644
--- a/gns3server/api/routes/controller/links.py
+++ b/gns3server/api/routes/controller/links.py
@@ -267,11 +267,13 @@ async def stream_pcap(request: Request, link: Link = Depends(dep_link)) -> Strea
async def compute_pcap_stream():
try:
+ ssl_context = Controller.instance().ssl_context()
async with HTTPClient.request(
request.method,
pcap_streaming_url,
user=compute.user,
password=compute.password,
+ ssl_context=ssl_context,
timeout=None,
data=body
) as response:
diff --git a/gns3server/api/routes/controller/nodes.py b/gns3server/api/routes/controller/nodes.py
index 13e84450..f9cac15b 100644
--- a/gns3server/api/routes/controller/nodes.py
+++ b/gns3server/api/routes/controller/nodes.py
@@ -541,7 +541,7 @@ async def ws_console(
pass
ws_console_compute_url = (
- f"ws://{compute_host}:{compute.port}/v3/compute/projects/"
+ f"{websocket.url.scheme}://{compute_host}:{compute.port}/v3/compute/projects/"
f"{node.project.id}/{node.node_type}/nodes/{node.id}/console/ws"
)
@@ -575,7 +575,8 @@ async def ws_console(
auth = aiohttp.BasicAuth(user, password.get_secret_value(), "utf-8")
else:
auth = aiohttp.BasicAuth(user, "")
- async with HTTPClient.get_client().ws_connect(ws_console_compute_url, auth=auth) as ws:
+ ssl_context = Controller.instance().ssl_context()
+ async with HTTPClient.get_client().ws_connect(ws_console_compute_url, auth=auth, ssl_context=ssl_context) as ws:
asyncio.ensure_future(ws_receive(ws))
async for msg in ws:
if msg.type == aiohttp.WSMsgType.TEXT:
diff --git a/gns3server/api/routes/controller/projects.py b/gns3server/api/routes/controller/projects.py
index 758ab79f..433832a8 100644
--- a/gns3server/api/routes/controller/projects.py
+++ b/gns3server/api/routes/controller/projects.py
@@ -305,10 +305,6 @@ async def project_ws_notifications(
except WebSocketException as e:
log.warning(f"Error while sending to project event to WebSocket client: {e}")
finally:
- try:
- await websocket.close()
- except OSError:
- pass # ignore OSError: [Errno 107] Transport endpoint is not connected
if project.auto_close:
# To avoid trouble with client connecting disconnecting we sleep few seconds before checking
# if someone else is not connected
diff --git a/gns3server/appliances/asterfusion-vAsterNOS.gns3a b/gns3server/appliances/asterfusion-vAsterNOS.gns3a
new file mode 100644
index 00000000..e6b283f8
--- /dev/null
+++ b/gns3server/appliances/asterfusion-vAsterNOS.gns3a
@@ -0,0 +1,49 @@
+{
+ "appliance_id": "e8001e2b-8ef3-44eb-ace5-79f68f3773e8",
+ "name": "Asterfusion vAsterNOS",
+ "category": "multilayer_switch",
+ "description": "AsterNOS is the core technology of Asterfusion's one-stop turnkey SONiC solution for cloud, enterprise and AI. As an enterprise ready SONiC distribution, AsterNOS features rich functionality enhancement such as MC-LAG, VXLAN, BGP EVPN-Multihoming, RoCEv2(Easy RoCE), and more, making it powerful and easy-to-use in a variety of production scenarios. Currently, AsterNOS is compatible with top commercial switching chips (e.g. Marvell Teralynx, Prestera Falcon/Aldrin/Alleycat, Broadcom Tomahawk/Trident, Intel Tofino and some of NVIDIA's chips.)Through AsterNOS's rich L2/L3 features and enhancements in virtualization and management, cloud architecture built with Asterfusion switching families from 1G-800G (or other standard whitebox switches) can scale to tens of thousands of compute and storage nodes, working smoothly both in underlay nework and overlay cloud fabric with OpenStack integrated, supporting ultra low latency lossless RoCE network in AIGC, distributed storage , or building easily managed access clusters for campus networks.NOTICE: This appliance file is a virtualized version of AsterNOS and is intended to be used only to experience the basic functionality and industry standard CLI (Klish), not for official software testing. For more information about AsterNOS commercial version, please feel free to contact us via Email: bd@cloudswit.ch",
+ "vendor_name": "Asterfusion",
+ "vendor_url": "https://cloudswit.ch/",
+ "vendor_logo_url": "https://raw.githubusercontent.com/GNS3/gns3-registry/master/vendor-logos/asterfusion.png",
+ "documentation_url": "https://help.cloudswit.ch/portal/en/home",
+ "product_name": "vAsterNOS",
+ "product_url": "https://cloudswit.ch/product/sonic-enterprise-distribution",
+ "registry_version": 4,
+ "status": "experimental",
+ "maintainer": "Asterfusion",
+ "maintainer_email": "bd@cloudswit.ch",
+ "usage": "The login is admin, passwd asteros",
+ "symbol": "asterfusion-vAsterNOS.svg",
+ "first_port_name": "eth0",
+ "port_name_format": "Ethernet{0}",
+ "qemu": {
+ "adapter_type": "e1000",
+ "adapters": 10,
+ "ram": 4096,
+ "cpus": 2,
+ "hda_disk_interface": "virtio",
+ "arch": "x86_64",
+ "console_type": "telnet",
+ "boot_priority": "d",
+ "kvm": "require"
+ },
+ "images": [
+ {
+ "filename": "vAsterNOS-V3.1.img",
+ "version": "V3.1",
+ "md5sum": "c323c9c3f60e1a93eca2acdc5034b85c",
+ "filesize": 2724659200,
+ "download_url": "https://cloudswit.ch/product/sonic-enterprise-distribution/#vAsterNOS"
+ }
+ ],
+ "versions": [
+ {
+ "name": "V3.1",
+ "images": {
+ "hda_disk_image": "vAsterNOS-V3.1.img"
+ }
+ }
+ ]
+}
+
diff --git a/gns3server/appliances/bird.gns3a b/gns3server/appliances/bird.gns3a
index ac4dac99..b18e18e8 100644
--- a/gns3server/appliances/bird.gns3a
+++ b/gns3server/appliances/bird.gns3a
@@ -11,7 +11,7 @@
"status": "stable",
"maintainer": "GNS3 Team",
"maintainer_email": "developers@gns3.net",
- "usage": "Configure interfaces in /opt/bootlocal.sh, BIRD configuration is done in /usr/local/etc/bird",
+ "usage": "\n*** BIRD v1 is end-of-life ***\nPlease use the BIRD2 appliance.\n\nConfigure interfaces in /opt/bootlocal.sh, BIRD configuration is done in /usr/local/etc/bird",
"qemu": {
"adapter_type": "e1000",
"adapters": 4,
diff --git a/gns3server/appliances/bird2.gns3a b/gns3server/appliances/bird2.gns3a
index 4a076d78..670d56a8 100644
--- a/gns3server/appliances/bird2.gns3a
+++ b/gns3server/appliances/bird2.gns3a
@@ -23,6 +23,14 @@
"kvm": "allow"
},
"images": [
+ {
+ "filename": "bird2-debian-2.14.qcow2",
+ "version": "2.14",
+ "md5sum": "029cf1756201ee79497c169502b08b88",
+ "filesize": 303717376,
+ "download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/",
+ "direct_download_url": "https://downloads.sourceforge.net/project/gns-3/Qemu%20Appliances/bird2-debian-2.14.qcow2"
+ },
{
"filename": "bird2-debian-2.0.12.qcow2",
"version": "2.0.12",
@@ -33,6 +41,12 @@
}
],
"versions": [
+ {
+ "name": "2.14",
+ "images": {
+ "hda_disk_image": "bird2-debian-2.14.qcow2"
+ }
+ },
{
"name": "2.0.12",
"images": {
diff --git a/gns3server/appliances/cisco-asav.gns3a b/gns3server/appliances/cisco-asav.gns3a
index 0d16abf1..48ee3196 100644
--- a/gns3server/appliances/cisco-asav.gns3a
+++ b/gns3server/appliances/cisco-asav.gns3a
@@ -26,6 +26,13 @@
"kvm": "require"
},
"images": [
+ {
+ "filename": "asav9-18-2.qcow2",
+ "version": "9.18.2 CML",
+ "md5sum": "6f10fe106edfad9163625770a47a6b73",
+ "filesize": 340262912,
+ "download_url": "https://learningnetworkstore.cisco.com/cisco-modeling-labs-personal/cisco-modeling-labs-personal/CML-PERSONAL.html"
+ },
{
"filename": "asav9-16-2.qcow2",
"version": "9.16.2 CML",
@@ -119,6 +126,12 @@
}
],
"versions": [
+ {
+ "name": "9.18.2 CML",
+ "images": {
+ "hda_disk_image": "asav9-18-2.qcow2"
+ }
+ },
{
"name": "9.16.2 CML",
"images": {
diff --git a/gns3server/appliances/cisco-c8000v.gns3a b/gns3server/appliances/cisco-c8000v.gns3a
index dae024ad..c63f09ec 100644
--- a/gns3server/appliances/cisco-c8000v.gns3a
+++ b/gns3server/appliances/cisco-c8000v.gns3a
@@ -24,6 +24,13 @@
"kvm": "require"
},
"images": [
+ {
+ "filename": "c8000v-universalk9_8G_serial.17.09.01a.qcow2",
+ "version": "17.09.01a 8G",
+ "md5sum": "a10ae2c4d71f4eb611bc4d83ad7709f0",
+ "filesize": 1856634880,
+ "download_url": "https://software.cisco.com/download/home/286327102/type/282046477/release/Bengaluru-17.6.5"
+ },
{
"filename": "c8000v-universalk9_8G_serial.17.06.05.qcow2",
"version": "17.06.05 8G",
@@ -54,6 +61,12 @@
}
],
"versions": [
+ {
+ "name": "17.09.01a 8G",
+ "images": {
+ "hda_disk_image": "c8000v-universalk9_8G_serial.17.09.01a.qcow2"
+ }
+ },
{
"name": "17.06.05 8G",
"images": {
diff --git a/gns3server/appliances/cisco-cat9k.gns3a b/gns3server/appliances/cisco-cat9k.gns3a
index 7ebf7c22..52b4b6b5 100644
--- a/gns3server/appliances/cisco-cat9k.gns3a
+++ b/gns3server/appliances/cisco-cat9k.gns3a
@@ -12,20 +12,27 @@
"status": "experimental",
"maintainer": "GNS3 Team",
"maintainer_email": "developers@gns3.net",
- "usage": "There is no default configuration present. Virtual Switch and Interfaces may take several minutes to be usable after appliance boot.",
+ "usage": "There is no default configuration present. Virtual Switch and Interfaces may take several minutes to be usable after appliance boot.\n\nOnly has basic Layer 2 switching features. Will need to enable advance features and reboot to gain access to things like BGP, etc... \n\nconfigure terminal \nlicense boot level network-advantage addon dna-advantage \nend \nwrite memory \nreload",
"first_port_name": "GigabitEthernet0/0",
"port_name_format": "GigabitEthernet1/0/{port1}",
"qemu": {
"adapter_type": "virtio-net-pci",
"adapters": 9,
- "ram": 16384,
- "cpus": 2,
+ "ram": 24576,
+ "cpus": 4,
"hda_disk_interface": "virtio",
"arch": "x86_64",
"console_type": "telnet",
"kvm": "require"
},
"images": [
+ {
+ "filename": "cat9kv-prd-17.12.01prd9.qcow2",
+ "version": "17.12(1)",
+ "md5sum": "e587e92186f42bdf69d7fa27f34425f7",
+ "filesize": 2739404800,
+ "download_url": "https://learningnetworkstore.cisco.com/myaccount"
+ },
{
"filename": "cat9kv-prd-17.10.01prd7.qcow2",
"version": "17.10(1)",
@@ -35,6 +42,12 @@
}
],
"versions": [
+ {
+ "name": "17.12(1)",
+ "images": {
+ "hda_disk_image": "cat9kv-prd-17.12.01prd9.qcow2"
+ }
+ },
{
"name": "17.10(1)",
"images": {
diff --git a/gns3server/appliances/cisco-csr1000v.gns3a b/gns3server/appliances/cisco-csr1000v.gns3a
index 135367c6..d1afb91f 100644
--- a/gns3server/appliances/cisco-csr1000v.gns3a
+++ b/gns3server/appliances/cisco-csr1000v.gns3a
@@ -24,6 +24,13 @@
"kvm": "require"
},
"images": [
+ {
+ "filename": "csr1000v-universalk9.17.03.06-serial.qcow2",
+ "version": "17.03.06",
+ "md5sum": "086ab9bef6e66de847af0da3910c60e8",
+ "filesize": 1422000128,
+ "download_url": "https://software.cisco.com/download/home/284364978/type/282046477/release/Gibraltar-16.12.3"
+ },
{
"filename": "csr1000v-universalk9.16.12.03-serial.qcow2",
"version": "16.12.3",
@@ -159,6 +166,12 @@
}
],
"versions": [
+ {
+ "name": "17.03.06",
+ "images": {
+ "hda_disk_image": "csr1000v-universalk9.17.03.06-serial.qcow2"
+ }
+ },
{
"name": "16.12.3",
"images": {
diff --git a/gns3server/appliances/cisco-iosv.gns3a b/gns3server/appliances/cisco-iosv.gns3a
index 179159aa..001fc488 100644
--- a/gns3server/appliances/cisco-iosv.gns3a
+++ b/gns3server/appliances/cisco-iosv.gns3a
@@ -32,6 +32,13 @@
"download_url": "https://sourceforge.net/projects/gns-3/files",
"direct_download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/IOSv_startup_config.img/download"
},
+ {
+ "filename": "vios-adventerprisek9-m.spa.159-3.m8.qcow2",
+ "version": "15.9(3)M8",
+ "md5sum": "8d93a185c2fa778178a933f20b02150a",
+ "filesize": 57319424,
+ "download_url": "https://learningnetworkstore.cisco.com/myaccount"
+ },
{
"filename": "vios-adventerprisek9-m.spa.159-3.m6.qcow2",
"version": "15.9(3)M6",
@@ -97,6 +104,13 @@
}
],
"versions": [
+ {
+ "name": "15.9(3)M8",
+ "images": {
+ "hda_disk_image": "vios-adventerprisek9-m.spa.159-3.m8.qcow2",
+ "hdb_disk_image": "IOSv_startup_config.img"
+ }
+ },
{
"name": "15.9(3)M6",
"images": {
diff --git a/gns3server/appliances/cisco-iosxrv9k.gns3a b/gns3server/appliances/cisco-iosxrv9k.gns3a
index 18f0551c..9373437e 100644
--- a/gns3server/appliances/cisco-iosxrv9k.gns3a
+++ b/gns3server/appliances/cisco-iosxrv9k.gns3a
@@ -26,6 +26,13 @@
"options": "-smp 4 -cpu host"
},
"images": [
+ {
+ "filename": "xrv9k-fullk9-x-7.7.1.qcow2",
+ "version": "7.7.1",
+ "md5sum": "682fff40d2ff373d8da3342906553b54",
+ "filesize": 1643905024,
+ "download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/7.1.1"
+ },
{
"filename": "xrv9k-fullk9-x-7.1.1.qcow2",
"version": "7.1.1",
@@ -105,6 +112,12 @@
}
],
"versions": [
+ {
+ "name": "7.7.1",
+ "images": {
+ "hda_disk_image": "xrv9k-fullk9-x-7.7.1.qcow2"
+ }
+ },
{
"name": "7.1.1",
"images": {
diff --git a/gns3server/appliances/cisco-iou-l2.gns3a b/gns3server/appliances/cisco-iou-l2.gns3a
index a30ce59d..ba8dfdf8 100644
--- a/gns3server/appliances/cisco-iou-l2.gns3a
+++ b/gns3server/appliances/cisco-iou-l2.gns3a
@@ -18,6 +18,12 @@
"startup_config": "iou_l2_base_startup-config.txt"
},
"images": [
+ {
+ "filename": "x86_64_crb_linux_l2-adventerprisek9-ms",
+ "version": "17.12.1",
+ "md5sum": "2b5055e4cef8fd257416d74a94adb626",
+ "filesize": 240355720
+ },
{
"filename": "i86bi-linux-l2-ipbasek9-15.1g.bin",
"version": "15.1g",
@@ -38,6 +44,12 @@
}
],
"versions": [
+ {
+ "name": "17.12.1",
+ "images": {
+ "image": "x86_64_crb_linux_l2-adventerprisek9-ms"
+ }
+ },
{
"name": "15.1g",
"images": {
diff --git a/gns3server/appliances/cisco-iou-l3.gns3a b/gns3server/appliances/cisco-iou-l3.gns3a
index 385c9c4e..083a6eb9 100644
--- a/gns3server/appliances/cisco-iou-l3.gns3a
+++ b/gns3server/appliances/cisco-iou-l3.gns3a
@@ -18,6 +18,12 @@
"startup_config": "iou_l3_base_startup-config.txt"
},
"images": [
+ {
+ "filename": "x86_64_crb_linux-adventerprisek9-ms",
+ "version": "17.12.1",
+ "md5sum": "4a2fce8de21d1831fbceffd155e41ae7",
+ "filesize": 288947184
+ },
{
"filename": "i86bi_LinuxL3-AdvEnterpriseK9-M2_157_3_May_2018.bin",
"version": "15.7(3)M2",
@@ -38,6 +44,12 @@
}
],
"versions": [
+ {
+ "name": "17.12.1",
+ "images": {
+ "image": "x86_64_crb_linux-adventerprisek9-ms"
+ }
+ },
{
"name": "15.7(3)M2",
"images": {
diff --git a/gns3server/appliances/cisco-nxosv9k.gns3a b/gns3server/appliances/cisco-nxosv9k.gns3a
index b830275b..951697fb 100644
--- a/gns3server/appliances/cisco-nxosv9k.gns3a
+++ b/gns3server/appliances/cisco-nxosv9k.gns3a
@@ -26,6 +26,13 @@
"kvm": "require"
},
"images": [
+ {
+ "filename": "nexus9300v64.10.3.1.F.qcow2",
+ "version": "9300v 10.3.1.F",
+ "md5sum": "a6ffd2501a5791c11cee319943b912da",
+ "filesize": 2097086464,
+ "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.1(1)"
+ },
{
"filename": "nexus9500v64.10.1.1.qcow2",
"version": "9500v 10.1.1",
@@ -40,6 +47,34 @@
"filesize": 1990983680,
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.1(1)"
},
+ {
+ "filename": "nexus9500v.9.3.13.qcow2",
+ "version": "9500v 9.3.13",
+ "md5sum": "bacf0f664ee34625c85a9f278b2466a2",
+ "filesize": 2248409088,
+ "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(13)"
+ },
+ {
+ "filename": "nexus9300v.9.3.13.qcow2",
+ "version": "9300v 9.3.13",
+ "md5sum": "d8ce30cb762df02d77ec27786a2435ad",
+ "filesize": 2248343552,
+ "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(13)"
+ },
+ {
+ "filename": "nexus9500v.9.3.12.qcow2",
+ "version": "9500v 9.3.12",
+ "md5sum": "452e5cb2a7a25feaa3ba0624a82ff9ca",
+ "filesize": 1997996032,
+ "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(12)"
+ },
+ {
+ "filename": "nexus9300v.9.3.12.qcow2",
+ "version": "9300v 9.3.12",
+ "md5sum": "7b6b5dad1001e11d6ebb54662616e9f2",
+ "filesize": 1997930496,
+ "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(12)"
+ },
{
"filename": "nexus9500v.9.3.9.qcow2",
"version": "9500v 9.3.9",
@@ -198,6 +233,13 @@
}
],
"versions": [
+ {
+ "name": "9300v 10.3.1.F",
+ "images": {
+ "bios_image": "OVMF-edk2-stable202305.fd",
+ "hda_disk_image": "nexus9300v64.10.3.1.F.qcow2"
+ }
+ },
{
"name": "9500v 10.1.1",
"images": {
@@ -212,6 +254,34 @@
"hda_disk_image": "nexus9300v.10.1.1.qcow2"
}
},
+ {
+ "name": "9500v 9.3.13",
+ "images": {
+ "bios_image": "OVMF-edk2-stable202305.fd",
+ "hda_disk_image": "nexus9500v.9.3.13.qcow2"
+ }
+ },
+ {
+ "name": "9300v 9.3.13",
+ "images": {
+ "bios_image": "OVMF-edk2-stable202305.fd",
+ "hda_disk_image": "nexus9300v.9.3.13.qcow2"
+ }
+ },
+ {
+ "name": "9500v 9.3.12",
+ "images": {
+ "bios_image": "OVMF-edk2-stable202305.fd",
+ "hda_disk_image": "nexus9500v.9.3.12.qcow2"
+ }
+ },
+ {
+ "name": "9300v 9.3.12",
+ "images": {
+ "bios_image": "OVMF-edk2-stable202305.fd",
+ "hda_disk_image": "nexus9300v.9.3.12.qcow2"
+ }
+ },
{
"name": "9500v 9.3.9",
"images": {
diff --git a/gns3server/appliances/clavister-netsheild.gns3a b/gns3server/appliances/clavister-netsheild.gns3a
index b60b2c7f..b31b67ca 100644
--- a/gns3server/appliances/clavister-netsheild.gns3a
+++ b/gns3server/appliances/clavister-netsheild.gns3a
@@ -5,7 +5,7 @@
"description": "Clavister NetShield (cOS Stream) Virtual Appliance offers the same functionality as the Clavister NetShield physical NGappliances FWs in a virtual environment.",
"vendor_name": "Clavister",
"vendor_url": "https://www.clavister.com/",
- "documentation_url": "https://kb.clavister.com",
+ "documentation_url": "https://docs.clavister.com",
"product_name": "NetShield",
"product_url": "https://www.clavister.com/products/netshield/",
"registry_version": 4,
@@ -13,7 +13,7 @@
"availability": "free-to-try",
"maintainer": "Mattias Nordlund",
"maintainer_email": "mattias.nordlund@clavister.com",
- "usage": "No configuration by default, oen console to set IPs and activate configuration.",
+ "usage": "No configuration by default, use console to set IPs and activate configuration.",
"port_name_format": "if{0}",
"qemu": {
"adapter_type": "virtio-net-pci",
@@ -27,6 +27,13 @@
"options": "-cpu Nehalem"
},
"images": [
+ {
+ "filename": "clavister-cos-stream-4.00.00.34-virtual-x64-generic.qcow2",
+ "version": "cOS Stream 4.00.00",
+ "md5sum": "02b480621d9bf1a9a4e116cd47bef006",
+ "filesize": 132841472,
+ "download_url": "https://my.clavister.com/download/86399b21-44c7-ee11-a434-005056bdfeb0"
+ },
{
"filename": "clavister-cos-stream-3.80.09.01-virtual-x64-generic.qcow2",
"version": "cOS Stream 3.80.09",
@@ -36,6 +43,12 @@
}
],
"versions": [
+ {
+ "name": "cOS Stream 4.00.00",
+ "images": {
+ "hda_disk_image": "clavister-cos-stream-4.00.00.34-virtual-x64-generic.qcow2"
+ }
+ },
{
"name": "cOS Stream 3.80.09",
"images": {
diff --git a/gns3server/appliances/clavister-netwall.gns3a b/gns3server/appliances/clavister-netwall.gns3a
index b7c37ccf..543cc531 100644
--- a/gns3server/appliances/clavister-netwall.gns3a
+++ b/gns3server/appliances/clavister-netwall.gns3a
@@ -5,7 +5,7 @@
"description": "Clavister NetWall (cOS Core) Virtual Appliance offers the same functionality as the Clavister NetWall physical NGFWs in a virtual environment.",
"vendor_name": "Clavister",
"vendor_url": "https://www.clavister.com/",
- "documentation_url": "https://kb.clavister.com",
+ "documentation_url": "https://docs.clavister.com",
"product_name": "NetWall",
"product_url": "https://www.clavister.com/products/ngfw/",
"registry_version": 4,
@@ -13,7 +13,7 @@
"availability": "free-to-try",
"maintainer": "Mattias Nordlund",
"maintainer_email": "mattias.nordlund@clavister.com",
- "usage": "DHCP enabled on all interfaces by default, WebUI/SSH access enabled on the local network connected to If1.",
+ "usage": "DHCP & cloud-init enabled on all interfaces by default, WebUI/SSH access enabled on the local network connected to If1.",
"port_name_format": "If{0}",
"qemu": {
"adapter_type": "e1000",
@@ -26,6 +26,13 @@
"kvm": "allow"
},
"images": [
+ {
+ "filename": "clavister-cos-core-14.00.13.08-kvm-en.img",
+ "version": "cOS Core 14.00.13 (x86)",
+ "md5sum": "d36797077378accb2b8fc72d09d07ee1",
+ "filesize": 536870912,
+ "download_url": "https://my.clavister.com/download/f3f494a3-9ee7-ee11-a434-005056bdfeb0"
+ },
{
"filename": "clavister-cos-core-14.00.01.13-kvm-en.img",
"version": "cOS Core 14.00.01 (x86)",
@@ -42,6 +49,12 @@
}
],
"versions": [
+ {
+ "name": "cOS Core 14.00.13 (x86)",
+ "images": {
+ "hda_disk_image": "clavister-cos-core-14.00.13.08-kvm-en.img"
+ }
+ },
{
"name": "cOS Core 14.00.01 (x86)",
"images": {
diff --git a/gns3server/appliances/debian.gns3a b/gns3server/appliances/debian.gns3a
index 91525a42..0d1defd8 100644
--- a/gns3server/appliances/debian.gns3a
+++ b/gns3server/appliances/debian.gns3a
@@ -24,12 +24,12 @@
},
"images": [
{
- "filename": "debian-12.2.qcow2",
- "version": "12.2",
- "md5sum": "adf7716ec4a4e4e9e5ccfc7a1d7bd103",
- "filesize": 286654464,
+ "filename": "debian-12.4.qcow2",
+ "version": "12.4",
+ "md5sum": "adcf7fdc25e10b3d2d9e2ef91168bffd",
+ "filesize": 286179840,
"download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/",
- "direct_download_url": "https://downloads.sourceforge.net/project/gns-3/Qemu%20Appliances/debian-12.2.qcow2"
+ "direct_download_url": "https://downloads.sourceforge.net/project/gns-3/Qemu%20Appliances/debian-12.4.qcow2"
},
{
"filename": "debian-11.8.qcow2",
@@ -42,9 +42,9 @@
],
"versions": [
{
- "name": "12.2",
+ "name": "12.4",
"images": {
- "hda_disk_image": "debian-12.2.qcow2"
+ "hda_disk_image": "debian-12.4.qcow2"
}
},
{
diff --git a/gns3server/appliances/dell-ftos.gns3a b/gns3server/appliances/dell-ftos.gns3a
index 763d0e81..9bcbd6ac 100644
--- a/gns3server/appliances/dell-ftos.gns3a
+++ b/gns3server/appliances/dell-ftos.gns3a
@@ -11,26 +11,36 @@
"status": "experimental",
"maintainer": "GNS3 Team",
"maintainer_email": "developers@gns3.net",
- "usage": "Make sure the Boot priority of the configuration template is HDD or CD.\n\nAbort the BCM process and format the flash after first boot by entering these commands:\nen\nformat flash:\n\nSometimes the flash device is not available after boot.",
+ "usage": "Make sure the Boot priority of the configuration template is HDD or CD.\n\nFor FTOS 9.8, switch to vnc console, start the device, abort the BMP process and format the flash after first boot by entering these commands:\nen\nformat flash:\n\nSometimes the flash device is not available after boot.",
"first_port_name": "Management0/0",
"port_name_format": "fortyGigE0/{0}",
"qemu": {
"adapter_type": "e1000",
"adapters": 6,
- "ram": 512,
+ "ram": 1024,
"hda_disk_interface": "ide",
"arch": "i386",
- "console_type": "vnc",
+ "console_type": "telnet",
"boot_priority": "cd",
"kvm": "require"
},
"images": [
+ {
+ "filename": "FTOS-SI-9.13.0.0.iso",
+ "version": "9.13.0",
+ "md5sum": "8418049e451c76e7b85e36eca0a0a730",
+ "filesize": 131278848,
+ "download_url": "https://www.dell.com/support/kbdoc/en-us/000184062/ftos-for-s-series-os-emulator-current-release-evaluation-version",
+ "direct_download_url": "https://downloads.dell.com/translatedpdf/force10/os9/FTOS-SI-9.13.0.0.zip",
+ "compression": "zip"
+ },
{
"filename": "FTOS-SI-9.8.0.0.iso",
"version": "9.8.0",
"md5sum": "b9b50eda0a73407dc381792ff7975e24",
"filesize": 108115968,
- "download_url": "https://www.force10networks.com/CSPortal20/Software/SSeriesDownloads.aspx",
+ "download_url": "https://www.dell.com/support/kbdoc/en-us/000184062/ftos-for-s-series-os-emulator-current-release-evaluation-version",
+ "direct_download_url": "https://downloads.dell.com/translatedpdf/force10/os9/FTOS-SI-9.8.0.0.zip",
"compression": "zip"
},
{
@@ -43,6 +53,13 @@
}
],
"versions": [
+ {
+ "name": "9.13.0",
+ "images": {
+ "hda_disk_image": "empty30G.qcow2",
+ "cdrom_image": "FTOS-SI-9.13.0.0.iso"
+ }
+ },
{
"name": "9.8.0",
"images": {
diff --git a/gns3server/appliances/exos.gns3a b/gns3server/appliances/exos.gns3a
index 8132452e..3d2f4366 100644
--- a/gns3server/appliances/exos.gns3a
+++ b/gns3server/appliances/exos.gns3a
@@ -26,163 +26,25 @@
"kvm": "allow",
"options": "-cpu core2duo"
},
+
"images": [
- {
- "filename": "EXOS-VM_v32.1.1.6.qcow2",
- "version": "32.1.1.6",
- "md5sum": "48868bbcb4255d6365049b5941dd2af7",
- "filesize": 231211008,
- "direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v32.1.1.6.qcow2"
- },
- {
- "filename": "EXOS-VM_v31.7.1.4.qcow2",
- "version": "31.7.1.4",
- "md5sum": "a70e4fa3bc361434237ad12937aaf0fb",
- "filesize": 458227712,
- "direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v31.7.1.4.qcow2"
- },
- {
- "filename": "EXOS-VM_v31.1.1.3.qcow2",
- "version": "31.1.1.3",
- "md5sum": "e4936ad94a5304bfeeca8dfc6f285cc0",
- "filesize": 561512448,
- "direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v31.1.1.3.qcow2"
- },
- {
- "filename": "EXOS-VM_v30.7.1.1.qcow2",
- "version": "30.7.1.1",
- "md5sum": "c6b67023945102f984b47aa67c67fe33",
- "filesize": 485687296,
- "direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v30.7.1.1.qcow2"
- },
- {
- "filename": "EXOS-VM_v30.6.1.11.qcow2",
- "version": "30.6.1.11",
- "md5sum": "bf3e13570417d7e3464165b344c196eb",
- "filesize": 475332608,
- "direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v30.6.1.11.qcow2"
- },
- {
- "filename": "EXOS-VM_v30.5.1.15.qcow2",
- "version": "30.5.1.15",
- "md5sum": "380d0c7bb8f0aa272ceb84b85f367a63",
- "filesize": 498663424,
- "direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v30.5.1.15.qcow2"
- },
- {
- "filename": "EXOS-VM_v30.4.1.2.qcow2",
- "version": "30.4.1.2",
- "md5sum": "133fa38bf80daec9e389729c96e692c0",
- "filesize": 454557696,
- "direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v30.4.1.2.qcow2"
- },
- {
- "filename": "EXOS-VM_v30.3.1.6.qcow2",
- "version": "30.3.1.6",
- "md5sum": "edb86b406efe99434c6d5366d9bfa97f",
- "filesize": 448266240,
- "direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v30.3.1.6.qcow2"
- },
- {
- "filename": "EXOS-VM_v30.2.1.8.qcow2",
- "version": "30.2.1.8",
- "md5sum": "4bdbf3ddff7a030e19c6bb71270b56d2",
- "filesize": 355205120,
- "direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v30.2.1.8.qcow2"
- },
- {
- "filename": "EXOS-VM_v30.1.1.4.qcow2",
- "version": "30.1.1.4",
- "md5sum": "92d3f9b13d750f7bfa804823fa545772",
- "filesize": 383385600,
- "direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v30.1.1.4.qcow2"
- },
- {
- "filename": "EXOS-VM_v22.7.1.2.qcow2",
- "version": "22.7.1.2",
- "md5sum": "a13e839b3fa05e8a5b0fb31f7e3dda86",
- "filesize": 180420608,
- "direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v22.7.1.2.qcow2"
- },
- {
- "filename": "EXOS-VM_v21.1.1.4-disk1.qcow2",
- "version": "21.1.1.4",
- "md5sum": "654606809b6fd3bca400377483eb4a79",
- "filesize": 117560832,
- "direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v21.1.1.4-disk1.qcow2"
+
+ {
+ "filename": "EXOS-VM_v32.6.3.126.qcow2",
+ "version": "32.6.3.126",
+ "md5sum": "5856b6c427bd605fe1c7adb6ee6b2659",
+ "filesize": 236716032,
+ "direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v32.6.3.126.qcow2"
}
+
],
+
"versions": [
+
{
- "name": "32.1.1.6",
+ "name": "32.6.3.126",
"images": {
- "hda_disk_image": "EXOS-VM_v32.1.1.6.qcow2"
- }
- },
- {
- "name": "31.7.1.4",
- "images": {
- "hda_disk_image": "EXOS-VM_v31.7.1.4.qcow2"
- }
- },
- {
- "name": "31.1.1.3",
- "images": {
- "hda_disk_image": "EXOS-VM_v31.1.1.3.qcow2"
- }
- },
- {
- "name": "30.7.1.1",
- "images": {
- "hda_disk_image": "EXOS-VM_v30.7.1.1.qcow2"
- }
- },
- {
- "name": "30.6.1.11",
- "images": {
- "hda_disk_image": "EXOS-VM_v30.6.1.11.qcow2"
- }
- },
- {
- "name": "30.5.1.15",
- "images": {
- "hda_disk_image": "EXOS-VM_v30.5.1.15.qcow2"
- }
- },
- {
- "name": "30.4.1.2",
- "images": {
- "hda_disk_image": "EXOS-VM_v30.4.1.2.qcow2"
- }
- },
- {
- "name": "30.3.1.6",
- "images": {
- "hda_disk_image": "EXOS-VM_v30.3.1.6.qcow2"
- }
- },
- {
- "name": "30.2.1.8",
- "images": {
- "hda_disk_image": "EXOS-VM_v30.2.1.8.qcow2"
- }
- },
- {
- "name": "30.1.1.4",
- "images": {
- "hda_disk_image": "EXOS-VM_v30.1.1.4.qcow2"
- }
- },
- {
- "name": "22.7.1.2",
- "images": {
- "hda_disk_image": "EXOS-VM_v22.7.1.2.qcow2"
- }
- },
- {
- "name": "21.1.1.4",
- "images": {
- "hda_disk_image": "EXOS-VM_v21.1.1.4-disk1.qcow2"
+ "hda_disk_image": "EXOS-VM_v32.6.3.126.qcow2"
}
}
]
diff --git a/gns3server/appliances/fedora-cloud.gns3a b/gns3server/appliances/fedora-cloud.gns3a
index 1a1c27e6..5024c31b 100644
--- a/gns3server/appliances/fedora-cloud.gns3a
+++ b/gns3server/appliances/fedora-cloud.gns3a
@@ -26,6 +26,14 @@
"options": "-nographic"
},
"images": [
+ {
+ "filename": "Fedora-Cloud-Base-39-1.5.x86_64.qcow2",
+ "version": "39-1.5",
+ "md5sum": "800a10df2d369891ed65900bcacacd47",
+ "filesize": 544604160,
+ "download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/39/Cloud/x86_64/images",
+ "direct_download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/39/Cloud/x86_64/images/Fedora-Cloud-Base-39-1.5.x86_64.qcow2"
+ },
{
"filename": "Fedora-Cloud-Base-38-1.6.x86_64.qcow2",
"version": "38-1.6",
@@ -34,30 +42,6 @@
"download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/38/Cloud/x86_64/images",
"direct_download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/38/Cloud/x86_64/images/Fedora-Cloud-Base-38-1.6.x86_64.qcow2"
},
- {
- "filename": "Fedora-Cloud-Base-37-1.7.x86_64.qcow2",
- "version": "37-1.7",
- "md5sum": "36f7b464b6ab46ad97c001b539495e90",
- "filesize": 492830720,
- "download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/37/Cloud/x86_64/images",
- "direct_download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/37/Cloud/x86_64/images/Fedora-Cloud-Base-37-1.7.x86_64.qcow2"
- },
- {
- "filename": "Fedora-Cloud-Base-36-1.5.x86_64.qcow2",
- "version": "36-1.5",
- "md5sum": "7f7cdad25b77f232078bf454c39529d3",
- "filesize": 448266240,
- "download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/36/Cloud/x86_64/images",
- "direct_download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/36/Cloud/x86_64/images/Fedora-Cloud-Base-36-1.5.x86_64.qcow2"
- },
- {
- "filename": "Fedora-Cloud-Base-35-1.2.x86_64.qcow2",
- "version": "35-1.2",
- "md5sum": "cfa9cdcfb946e5f4cf9dd4d7906008d0",
- "filesize": 376897536,
- "download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/35/Cloud/x86_64/images",
- "direct_download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/35/Cloud/x86_64/images/Fedora-Cloud-Base-35-1.2.x86_64.qcow2"
- },
{
"filename": "fedora-cloud-init-data.iso",
"version": "1.0",
@@ -68,33 +52,19 @@
}
],
"versions": [
+ {
+ "name": "39-1.5",
+ "images": {
+ "hda_disk_image": "Fedora-Cloud-Base-39-1.5.x86_64.qcow2",
+ "cdrom_image": "fedora-cloud-init-data.iso"
+ }
+ },
{
"name": "38-1.6",
"images": {
"hda_disk_image": "Fedora-Cloud-Base-38-1.6.x86_64.qcow2",
"cdrom_image": "fedora-cloud-init-data.iso"
}
- },
- {
- "name": "37-1.7",
- "images": {
- "hda_disk_image": "Fedora-Cloud-Base-37-1.7.x86_64.qcow2",
- "cdrom_image": "fedora-cloud-init-data.iso"
- }
- },
- {
- "name": "36-1.5",
- "images": {
- "hda_disk_image": "Fedora-Cloud-Base-36-1.5.x86_64.qcow2",
- "cdrom_image": "fedora-cloud-init-data.iso"
- }
- },
- {
- "name": "35-1.2",
- "images": {
- "hda_disk_image": "Fedora-Cloud-Base-35-1.2.x86_64.qcow2",
- "cdrom_image": "fedora-cloud-init-data.iso"
- }
}
]
}
diff --git a/gns3server/appliances/fortianalyzer.gns3a b/gns3server/appliances/fortianalyzer.gns3a
index fb0aed44..db14866d 100644
--- a/gns3server/appliances/fortianalyzer.gns3a
+++ b/gns3server/appliances/fortianalyzer.gns3a
@@ -29,6 +29,13 @@
"kvm": "allow"
},
"images": [
+ {
+ "filename": "FAZ_VM64_KVM-v7.4.2-build2397-FORTINET.out.kvm.qcow2",
+ "version": "7.4.2",
+ "md5sum": "33b2938e19a6cb61d4d64e6998a54d23",
+ "filesize": 480096256,
+ "download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
+ },
{
"filename": "FAZ_VM64_KVM-v7.4.1-build2308-FORTINET.out.kvm.qcow2",
"version": "7.4.1",
@@ -57,6 +64,13 @@
"filesize": 340631552,
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
},
+ {
+ "filename": "FAZ_VM64_KVM-v7.0.11-build0595-FORTINET.out.kvm.qcow2",
+ "version": "7.0.11",
+ "md5sum": "ae7ff37d00d0b518e9982a0785665fc2",
+ "filesize": 349257728,
+ "download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
+ },
{
"filename": "FAZ_VM64_KVM-v7.0.9-build0489-FORTINET.out.kvm.qcow2",
"version": "7.0.9",
@@ -78,6 +92,13 @@
"filesize": 334184448,
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
},
+ {
+ "filename": "FAZ_VM64_KVM-v6.4.14-build2660-FORTINET.out.kvm.qcow2",
+ "version": "6.4.14",
+ "md5sum": "1629d76776c9d625faee0304b5840c02",
+ "filesize": 300683264,
+ "download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
+ },
{
"filename": "FAZ_VM64_KVM-v6.4.12-build2610-FORTINET.out.kvm.qcow2",
"version": "6.4.12",
@@ -235,6 +256,13 @@
}
],
"versions": [
+ {
+ "name": "7.4.2",
+ "images": {
+ "hda_disk_image": "FAZ_VM64_KVM-v7.4.2-build2397-FORTINET.out.kvm.qcow2",
+ "hdb_disk_image": "empty30G.qcow2"
+ }
+ },
{
"name": "7.4.1",
"images": {
@@ -263,6 +291,13 @@
"hdb_disk_image": "empty30G.qcow2"
}
},
+ {
+ "name": "7.0.11",
+ "images": {
+ "hda_disk_image": "FAZ_VM64_KVM-v7.0.11-build0595-FORTINET.out.kvm.qcow2",
+ "hdb_disk_image": "empty30G.qcow2"
+ }
+ },
{
"name": "7.0.9",
"images": {
@@ -284,6 +319,13 @@
"hdb_disk_image": "empty30G.qcow2"
}
},
+ {
+ "name": "6.4.14",
+ "images": {
+ "hda_disk_image": "FAZ_VM64_KVM-v6.4.14-build2660-FORTINET.out.kvm.qcow2",
+ "hdb_disk_image": "empty30G.qcow2"
+ }
+ },
{
"name": "6.4.12",
"images": {
diff --git a/gns3server/appliances/fortigate.gns3a b/gns3server/appliances/fortigate.gns3a
index f3efb72c..77f2c7d7 100644
--- a/gns3server/appliances/fortigate.gns3a
+++ b/gns3server/appliances/fortigate.gns3a
@@ -28,6 +28,13 @@
"kvm": "allow"
},
"images": [
+ {
+ "filename": "FGT_VM64_KVM-v7.4.3.F-build2573-FORTINET.out.kvm.qcow2",
+ "version": "7.4.3",
+ "md5sum": "e7517095c91dce1a76a9bcf114b5fa15",
+ "filesize": 100728832,
+ "download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
+ },
{
"filename": "FGT_VM64_KVM-v7.4.1.F-build2463-FORTINET.out.kvm.qcow2",
"version": "7.4.1",
@@ -35,6 +42,13 @@
"filesize": 116064256,
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
},
+ {
+ "filename": "FGT_VM64_KVM-v7.2.7.M-build1577-FORTINET.out.kvm.qcow2",
+ "version": "7.2.7",
+ "md5sum": "752b56844e464b0b135e57f72681c288",
+ "filesize": 102760448,
+ "download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
+ },
{
"filename": "FGT_VM64_KVM-v7.2.6.F-build1575-FORTINET.out.kvm.qcow2",
"version": "7.2.6",
@@ -63,6 +77,20 @@
"filesize": 86704128,
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
},
+ {
+ "filename": "FGT_VM64_KVM-v7.0.14.M-build0601-FORTINET.out.kvm.qcow2",
+ "version": "7.0.14",
+ "md5sum": "20c855889e1117902bcf448b30746d30",
+ "filesize": 77398016,
+ "download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
+ },
+ {
+ "filename": "FGT_VM64_KVM-v7.0.13.M-build0566-FORTINET.out.kvm.qcow2",
+ "version": "7.0.13",
+ "md5sum": "47a4bab29407153a635c54b64d6a226e",
+ "filesize": 89325568,
+ "download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
+ },
{
"filename": "FGT_VM64_KVM-v7.0.12.M-build0523-FORTINET.out.kvm.qcow2",
"version": "7.0.12",
@@ -84,6 +112,13 @@
"filesize": 77135872,
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
},
+ {
+ "filename": "FGT_VM64_KVM-v6.4.15.M-build2095-FORTINET.out.kvm.qcow2",
+ "version": "6.4.15",
+ "md5sum": "a0306a3905877de654dab7e1bb67089e",
+ "filesize": 81592320,
+ "download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
+ },
{
"filename": "FGT_VM64_KVM-v6.4.14.M-build2093-FORTINET.out.kvm.qcow2",
"version": "6.4.14",
@@ -332,6 +367,13 @@
}
],
"versions": [
+ {
+ "name": "7.4.3",
+ "images": {
+ "hda_disk_image": "FGT_VM64_KVM-v7.4.3.F-build2573-FORTINET.out.kvm.qcow2",
+ "hdb_disk_image": "empty30G.qcow2"
+ }
+ },
{
"name": "7.4.1",
"images": {
@@ -339,6 +381,13 @@
"hdb_disk_image": "empty30G.qcow2"
}
},
+ {
+ "name": "7.2.7",
+ "images": {
+ "hda_disk_image": "FGT_VM64_KVM-v7.2.7.M-build1577-FORTINET.out.kvm.qcow2",
+ "hdb_disk_image": "empty30G.qcow2"
+ }
+ },
{
"name": "7.2.6",
"images": {
@@ -367,6 +416,20 @@
"hdb_disk_image": "empty30G.qcow2"
}
},
+ {
+ "name": "7.0.14",
+ "images": {
+ "hda_disk_image": "FGT_VM64_KVM-v7.0.14.M-build0601-FORTINET.out.kvm.qcow2",
+ "hdb_disk_image": "empty30G.qcow2"
+ }
+ },
+ {
+ "name": "7.0.13",
+ "images": {
+ "hda_disk_image": "FGT_VM64_KVM-v7.0.13.M-build0566-FORTINET.out.kvm.qcow2",
+ "hdb_disk_image": "empty30G.qcow2"
+ }
+ },
{
"name": "7.0.12",
"images": {
@@ -388,6 +451,13 @@
"hdb_disk_image": "empty30G.qcow2"
}
},
+ {
+ "name": "6.4.15",
+ "images": {
+ "hda_disk_image": "FGT_VM64_KVM-v6.4.15.M-build2095-FORTINET.out.kvm.qcow2",
+ "hdb_disk_image": "empty30G.qcow2"
+ }
+ },
{
"name": "6.4.14",
"images": {
diff --git a/gns3server/appliances/fortimanager.gns3a b/gns3server/appliances/fortimanager.gns3a
index cc35e900..28c53e0b 100644
--- a/gns3server/appliances/fortimanager.gns3a
+++ b/gns3server/appliances/fortimanager.gns3a
@@ -13,7 +13,7 @@
"status": "stable",
"maintainer": "Ean Towne",
"maintainer_email": "ean.fortinet@gmail.com",
- "usage": "Default username is admin, no password is set.\n\n- Versions lower than 7.0.x require less CPU/RAM",
+ "usage": "Default username is admin, no password is set.\n\n- Versions lower than 7.0.x require less CPU/RAM\n7.4.x may require 16GB RAM.",
"symbol": "fortinet.svg",
"port_name_format": "Port{port1}",
"qemu": {
@@ -29,6 +29,13 @@
"kvm": "allow"
},
"images": [
+ {
+ "filename": "FMG_VM64_KVM-v7.4.2-build2397-FORTINET.out.kvm.qcow2",
+ "version": "7.4.2",
+ "md5sum": "36371fbf06210ded57c00b2ff290f2c5",
+ "filesize": 322514944,
+ "download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
+ },
{
"filename": "FMG_VM64_KVM-v7.4.1-build2308-FORTINET.out.kvm.qcow2",
"version": "7.4.1",
@@ -57,6 +64,13 @@
"filesize": 242814976,
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
},
+ {
+ "filename": "FMG_VM64_KVM-v7.0.11-build0595-FORTINET.out.kvm.qcow2",
+ "version": "7.0.11",
+ "md5sum": "7b166222136e26190159f37cccbaab6e",
+ "filesize": 249360384,
+ "download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
+ },
{
"filename": "FMG_VM64_KVM-v7.0.9-build0489-FORTINET.out.kvm.qcow2",
"version": "7.0.9",
@@ -78,6 +92,13 @@
"filesize": 237535232,
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
},
+ {
+ "filename": "FMG_VM64_KVM-v6.4.14-build2660-FORTINET.out.kvm.qcow2",
+ "version": "6.4.14",
+ "md5sum": "0fe56e363b166c07b710bde795e36049",
+ "filesize": 219430912,
+ "download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
+ },
{
"filename": "FMG_VM64_KVM-v6.4.12-build2610-FORTINET.out.kvm.qcow2",
"version": "6.4.12",
@@ -235,6 +256,13 @@
}
],
"versions": [
+ {
+ "name": "7.4.2",
+ "images": {
+ "hda_disk_image": "FMG_VM64_KVM-v7.4.2-build2397-FORTINET.out.kvm.qcow2",
+ "hdb_disk_image": "empty30G.qcow2"
+ }
+ },
{
"name": "7.4.1",
"images": {
@@ -263,6 +291,13 @@
"hdb_disk_image": "empty30G.qcow2"
}
},
+ {
+ "name": "7.0.11",
+ "images": {
+ "hda_disk_image": "FMG_VM64_KVM-v7.0.11-build0595-FORTINET.out.kvm.qcow2",
+ "hdb_disk_image": "empty30G.qcow2"
+ }
+ },
{
"name": "7.0.9",
"images": {
@@ -284,6 +319,13 @@
"hdb_disk_image": "empty30G.qcow2"
}
},
+ {
+ "name": "6.4.14",
+ "images": {
+ "hda_disk_image": "FMG_VM64_KVM-v6.4.14-build2660-FORTINET.out.kvm.qcow2",
+ "hdb_disk_image": "empty30G.qcow2"
+ }
+ },
{
"name": "6.4.12",
"images": {
diff --git a/gns3server/appliances/freebsd.gns3a b/gns3server/appliances/freebsd.gns3a
index c85f8f95..2f937568 100644
--- a/gns3server/appliances/freebsd.gns3a
+++ b/gns3server/appliances/freebsd.gns3a
@@ -24,13 +24,22 @@
"kvm": "require"
},
"images": [
+ {
+ "filename": "FreeBSD-14.0-RELEASE-amd64.qcow2",
+ "version": "14.0",
+ "md5sum": "87b988eaa4a8aaabea1c10649c98b3f0",
+ "filesize": 3506569216,
+ "download_url": "https://www.freebsd.org/where.html",
+ "direct_download_url": "https://download.freebsd.org/releases/VM-IMAGES/14.0-RELEASE/amd64/Latest/FreeBSD-14.0-RELEASE-amd64.qcow2.xz",
+ "compression": "xz"
+ },
{
"filename": "FreeBSD-13.0-RELEASE-amd64.qcow2",
"version": "13.0",
"md5sum": "e8e598959da456c03260421b5f9890de",
"filesize": 3466854400,
"download_url": "https://www.freebsd.org/where.html",
- "direct_download_url": "https://download.freebsd.org/ftp/releases/VM-IMAGES/13.0-RELEASE/amd64/Latest/FreeBSD-13.0-RELEASE-amd64.qcow2.xz",
+ "direct_download_url": "http://ftp-archive.freebsd.org/pub/FreeBSD-Archive/old-releases/VM-IMAGES/13.0-RELEASE/amd64/Latest/FreeBSD-13.0-RELEASE-amd64.qcow2.xz",
"compression": "xz"
},
{
@@ -39,11 +48,17 @@
"md5sum": "3d7d5396f3d89ed30c2bfa2ee2e6b013",
"filesize": 3412000768,
"download_url": "https://www.freebsd.org/where.html",
- "direct_download_url": "https://download.freebsd.org/ftp/releases/VM-IMAGES/12.3-RELEASE/amd64/Latest/FreeBSD-12.3-RELEASE-amd64.qcow2.xz",
+ "direct_download_url": "http://ftp-archive.freebsd.org/pub/FreeBSD-Archive/old-releases/VM-IMAGES/12.3-RELEASE/amd64/Latest/FreeBSD-12.3-RELEASE-amd64.qcow2.xz",
"compression": "xz"
}
],
"versions": [
+ {
+ "name": "14.0",
+ "images": {
+ "hda_disk_image": "FreeBSD-14.0-RELEASE-amd64.qcow2"
+ }
+ },
{
"name": "13.0",
"images": {
diff --git a/gns3server/appliances/huawei-ne40e.gns3a b/gns3server/appliances/huawei-ne40e.gns3a
index 1e7f89d6..878cd2b0 100644
--- a/gns3server/appliances/huawei-ne40e.gns3a
+++ b/gns3server/appliances/huawei-ne40e.gns3a
@@ -7,16 +7,65 @@
"vendor_url": "https://www.huawei.com",
"product_name": "HuaWei NE40E",
"product_url": "https://e.huawei.com/en/products/enterprise-networking/routers/ne/ne40e",
- "registry_version": 4,
+ "registry_version": 6,
"status": "experimental",
"availability": "service-contract",
"maintainer": "none",
"maintainer_email": "",
- "first_port_name": "eth0",
"port_name_format": "Ethernet1/0/{0}",
"qemu": {
"adapter_type": "e1000",
"adapters": 12,
+ "custom_adapters": [
+ {
+ "adapter_number": 0,
+ "port_name": "Gi0/0/0"
+ },
+ {
+ "adapter_number": 1,
+ "port_name": "Mgmt0/0"
+ },
+ {
+ "adapter_number": 2,
+ "port_name": "Ethernet1/0/0"
+ },
+ {
+ "adapter_number": 3,
+ "port_name": "Ethernet1/0/1"
+ },
+ {
+ "adapter_number": 4,
+ "port_name": "Ethernet1/0/2"
+ },
+ {
+ "adapter_number": 5,
+ "port_name": "Ethernet1/0/3"
+ },
+ {
+ "adapter_number": 6,
+ "port_name": "Ethernet1/0/4"
+ },
+ {
+ "adapter_number": 7,
+ "port_name": "Ethernet1/0/5"
+ },
+ {
+ "adapter_number": 8,
+ "port_name": "Ethernet1/0/6"
+ },
+ {
+ "adapter_number": 9,
+ "port_name": "Ethernet1/0/7"
+ },
+ {
+ "adapter_number": 10,
+ "port_name": "Ethernet1/0/8"
+ },
+ {
+ "adapter_number": 11,
+ "port_name": "Ethernet1/0/9"
+ }
+ ],
"ram": 2048,
"cpus": 2,
"hda_disk_interface": "ide",
diff --git a/gns3server/appliances/mikrotik-chr.gns3a b/gns3server/appliances/mikrotik-chr.gns3a
index 54806d22..f06c56ad 100644
--- a/gns3server/appliances/mikrotik-chr.gns3a
+++ b/gns3server/appliances/mikrotik-chr.gns3a
@@ -27,6 +27,15 @@
"options": "-nographic"
},
"images": [
+ {
+ "filename": "chr-7.14.2.img",
+ "version": "7.14.2",
+ "md5sum": "531901dac85b67b23011e946a62abc7b",
+ "filesize": 134217728,
+ "download_url": "http://www.mikrotik.com/download",
+ "direct_download_url": "https://download.mikrotik.com/routeros/7.14.2/chr-7.14.2.img.zip",
+ "compression": "zip"
+ },
{
"filename": "chr-7.11.2.img",
"version": "7.11.2",
diff --git a/gns3server/appliances/mikrotik-rb1100ahx4-dude-edition.gns3a b/gns3server/appliances/mikrotik-rb1100ahx4-dude-edition.gns3a
index 247943fb..9dd6a665 100644
--- a/gns3server/appliances/mikrotik-rb1100ahx4-dude-edition.gns3a
+++ b/gns3server/appliances/mikrotik-rb1100ahx4-dude-edition.gns3a
@@ -8,7 +8,7 @@
"documentation_url": "http://wiki.mikrotik.com/wiki/Manual:CHR",
"product_name": "MikroTik RouterBOARD 1100AHx4 Dude Edition",
"product_url": "http://www.mikrotik.com/download",
- "registry_version": 5,
+ "registry_version": 4,
"status": "stable",
"maintainer": "Azorian Solutions",
"maintainer_email": "help@azorian.solutions",
diff --git a/gns3server/appliances/mikrotik-rb450g.gns3a b/gns3server/appliances/mikrotik-rb450g.gns3a
index b547386b..4573efb7 100644
--- a/gns3server/appliances/mikrotik-rb450g.gns3a
+++ b/gns3server/appliances/mikrotik-rb450g.gns3a
@@ -8,7 +8,7 @@
"documentation_url": "http://wiki.mikrotik.com/wiki/Manual:CHR",
"product_name": "MikroTik RouterBOARD 450G",
"product_url": "http://www.mikrotik.com/download",
- "registry_version": 5,
+ "registry_version": 4,
"status": "stable",
"maintainer": "Azorian Solutions",
"maintainer_email": "help@azorian.solutions",
diff --git a/gns3server/appliances/mikrotik-rb450gx4.gns3a b/gns3server/appliances/mikrotik-rb450gx4.gns3a
index 385d412e..0cafd227 100644
--- a/gns3server/appliances/mikrotik-rb450gx4.gns3a
+++ b/gns3server/appliances/mikrotik-rb450gx4.gns3a
@@ -8,7 +8,7 @@
"documentation_url": "http://wiki.mikrotik.com/wiki/Manual:CHR",
"product_name": "MikroTik RouterBOARD 450Gx4",
"product_url": "http://www.mikrotik.com/download",
- "registry_version": 5,
+ "registry_version": 4,
"status": "stable",
"maintainer": "Azorian Solutions",
"maintainer_email": "help@azorian.solutions",
diff --git a/gns3server/appliances/open-media-vault.gns3a b/gns3server/appliances/open-media-vault.gns3a
index 9b634b93..aee7005e 100644
--- a/gns3server/appliances/open-media-vault.gns3a
+++ b/gns3server/appliances/open-media-vault.gns3a
@@ -26,6 +26,14 @@
"kvm": "require"
},
"images": [
+ {
+ "filename": "openmediavault_7.0.32-amd64.iso",
+ "version": "7.0.32",
+ "md5sum": "36d1fda7de0c8dd6806a65145845d362",
+ "filesize": 981467136,
+ "download_url": "https://www.openmediavault.org/download.html",
+ "direct_download_url": "https://sourceforge.net/projects/openmediavault/files/iso/7.0-32/openmediavault_7.0-32-amd64.iso"
+ },
{
"filename": "openmediavault_6.5.0-amd64.iso",
"version": "6.5.0",
@@ -68,6 +76,14 @@
}
],
"versions": [
+ {
+ "name": "7.0.32",
+ "images": {
+ "hda_disk_image": "empty30G.qcow2",
+ "hdb_disk_image": "empty30G.qcow2",
+ "cdrom_image": "openmediavault_7.0.32-amd64.iso"
+ }
+ },
{
"name": "6.5.0",
"images": {
diff --git a/gns3server/appliances/opnsense.gns3a b/gns3server/appliances/opnsense.gns3a
index c6fb2de1..3da2e50b 100644
--- a/gns3server/appliances/opnsense.gns3a
+++ b/gns3server/appliances/opnsense.gns3a
@@ -25,6 +25,13 @@
"kvm": "require"
},
"images": [
+ {
+ "filename": "OPNsense-24.1-OpenSSL-nano-amd64.img",
+ "version": "24.1",
+ "md5sum": "ea8472df2c272419b7834cddaf68048d",
+ "filesize": 3221225472,
+ "download_url": "https://opnsense.c0urier.net/releases/24.1/"
+ },
{
"filename": "OPNsense-23.1-OpenSSL-nano-amd64.img",
"version": "23.1",
@@ -62,6 +69,12 @@
}
],
"versions": [
+ {
+ "name": "24.1",
+ "images": {
+ "hda_disk_image": "OPNsense-24.1-OpenSSL-nano-amd64.img"
+ }
+ },
{
"name": "23.1",
"images": {
diff --git a/gns3server/appliances/ostinato.gns3a b/gns3server/appliances/ostinato.gns3a
index ec9a991b..190c6861 100644
--- a/gns3server/appliances/ostinato.gns3a
+++ b/gns3server/appliances/ostinato.gns3a
@@ -30,6 +30,13 @@
"options": "-vga std -usbdevice tablet"
},
"images": [
+ {
+ "version": "1.3.0",
+ "filename": "ostinatostd-1.3.0-1.qcow2",
+ "filesize": 173735936,
+ "md5sum": "ff25fed989c43aeac84bf0d542ad43ba",
+ "download_url": "https://ostinato.org/pricing/gns3"
+ },
{
"filename": "ostinatostd-1.2.0-1.qcow2",
"version": "1.2.0",
@@ -46,6 +53,12 @@
}
],
"versions": [
+ {
+ "name": "1.3.0",
+ "images": {
+ "hda_disk_image": "ostinatostd-1.3.0-1.qcow2"
+ }
+ },
{
"name": "1.2.0",
"images": {
diff --git a/gns3server/appliances/rhel.gns3a b/gns3server/appliances/rhel.gns3a
index 291802b5..79dbb768 100644
--- a/gns3server/appliances/rhel.gns3a
+++ b/gns3server/appliances/rhel.gns3a
@@ -11,9 +11,9 @@
"registry_version": 4,
"status": "stable",
"availability": "service-contract",
- "maintainer": "Neyder Achahuanco",
- "maintainer_email": "neyder@neyder.net",
- "usage": "You should download Red Hat Enterprise Linux KVM Guest Image from https://access.redhat.com/downloads/content/479/ver=/rhel---9/9.2/x86_64/product-software attach/customize cloud-init.iso and start.\nusername: cloud-user\npassword: redhat",
+ "maintainer": "Da-Geek",
+ "maintainer_email": "dageek@dageeks-geeks.gg",
+ "usage": "You should download Red Hat Enterprise Linux KVM Guest Image from https://access.redhat.com/downloads/content/479/ver=/rhel---9/9.3/x86_64/product-software attach/customize rhel-cloud-init.iso and start.\nusername: cloud-user\npassword: redhat",
"qemu": {
"adapter_type": "virtio-net-pci",
"adapters": 1,
@@ -26,6 +26,13 @@
"options": "-cpu host -nographic"
},
"images": [
+ {
+ "filename": "rhel-9.3-x86_64-kvm.qcow2",
+ "version": "9.3",
+ "md5sum": "409d8d15f5177db2617b0e3e02139b5c",
+ "filesize": 858193920,
+ "download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---9/9.3/x86_64/product-software"
+ },
{
"filename": "rhel-9.2-x86_64-kvm.qcow2",
"version": "9.2",
@@ -112,6 +119,13 @@
}
],
"versions": [
+ {
+ "name": "9.3",
+ "images": {
+ "hda_disk_image": "rhel-9.3-x86_64-kvm.qcow2",
+ "cdrom_image": "rhel-cloud-init.iso"
+ }
+ },
{
"name": "9.2",
"images": {
diff --git a/gns3server/appliances/rockylinux.gns3a b/gns3server/appliances/rockylinux.gns3a
index fcbfad71..65817a76 100644
--- a/gns3server/appliances/rockylinux.gns3a
+++ b/gns3server/appliances/rockylinux.gns3a
@@ -26,6 +26,14 @@
"options": "-nographic -cpu host"
},
"images": [
+ {
+ "filename": "Rocky-9-GenericCloud-Base-9.3-20231113.0.x86_64.qcow2",
+ "version": "9.3",
+ "md5sum": "48cdeb033364af5909e15ee48d0e144d",
+ "filesize": 1083965440,
+ "download_url": "https://download.rockylinux.org/pub/rocky/9/images/x86_64/",
+ "direct_download_url": "https://download.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-GenericCloud-Base-9.3-20231113.0.x86_64.qcow2"
+ },
{
"filename": "Rocky-9-GenericCloud-Base-9.2-20230513.0.x86_64.qcow2",
"version": "9.2",
@@ -34,6 +42,14 @@
"download_url": "https://download.rockylinux.org/pub/rocky/9/images/x86_64/",
"direct_download_url": "https://download.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-GenericCloud-Base-9.2-20230513.0.x86_64.qcow2"
},
+ {
+ "filename": "Rocky-8-GenericCloud-Base-8.9-20231119.0.x86_64.qcow2",
+ "version": "8.9",
+ "md5sum": "50c44d8d9c4df43694372c13768f114c",
+ "filesize": 1971978240,
+ "download_url": "https://download.rockylinux.org/pub/rocky/8/images/x86_64/",
+ "direct_download_url": "https://download.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-GenericCloud-Base-8.9-20231119.0.x86_64.qcow2"
+ },
{
"filename": "Rocky-8-GenericCloud-Base-8.8-20230518.0.x86_64.qcow2",
"version": "8.8",
@@ -52,6 +68,13 @@
}
],
"versions": [
+ {
+ "name": "9.3",
+ "images": {
+ "hda_disk_image": "Rocky-9-GenericCloud-Base-9.3-20231113.0.x86_64.qcow2",
+ "cdrom_image": "rocky-cloud-init-data.iso"
+ }
+ },
{
"name": "9.2",
"images": {
@@ -59,6 +82,13 @@
"cdrom_image": "rocky-cloud-init-data.iso"
}
},
+ {
+ "name": "8.9",
+ "images": {
+ "hda_disk_image": "Rocky-8-GenericCloud-Base-8.9-20231119.0.x86_64.qcow2",
+ "cdrom_image": "rocky-cloud-init-data.iso"
+ }
+ },
{
"name": "8.8",
"images": {
diff --git a/gns3server/appliances/ubuntu-cloud.gns3a b/gns3server/appliances/ubuntu-cloud.gns3a
index a9496741..cd2eb457 100644
--- a/gns3server/appliances/ubuntu-cloud.gns3a
+++ b/gns3server/appliances/ubuntu-cloud.gns3a
@@ -28,12 +28,12 @@
},
"images": [
{
- "filename": "ubuntu-23.04-server-cloudimg-arm64.img",
+ "filename": "ubuntu-23.04-server-cloudimg-amd64.img",
"version": "Ubuntu 23.04 (Lunar Lobster)",
- "md5sum": "35fa3b31b65717af6f0520a769aac8c0",
- "filesize": 786432000,
+ "md5sum": "369e3b1f68416c39245a8014172406dd",
+ "filesize": 756678656,
"download_url": "https://cloud-images.ubuntu.com/releases/23.04/release/",
- "direct_download_url": "https://cloud-images.ubuntu.com/releases/23.04/release/ubuntu-23.04-server-cloudimg-arm64.img"
+ "direct_download_url": "https://cloud-images.ubuntu.com/releases/23.04/release/ubuntu-23.04-server-cloudimg-amd64.img"
},
{
"filename": "ubuntu-22.04-server-cloudimg-amd64.img",
@@ -72,7 +72,7 @@
{
"name": "Ubuntu 23.04 (Lunar Lobster)",
"images": {
- "hda_disk_image": "ubuntu-23.04-server-cloudimg-arm64.img",
+ "hda_disk_image": "ubuntu-23.04-server-cloudimg-amd64.img",
"cdrom_image": "ubuntu-cloud-init-data.iso"
}
},
diff --git a/gns3server/compute/docker/__init__.py b/gns3server/compute/docker/__init__.py
index 9e9e72b1..5284a246 100644
--- a/gns3server/compute/docker/__init__.py
+++ b/gns3server/compute/docker/__init__.py
@@ -25,7 +25,7 @@ import asyncio
import logging
import aiohttp
import shutil
-import subprocess
+import platformdirs
from gns3server.utils import parse_version
from gns3server.utils.asyncio import locking
@@ -59,11 +59,9 @@ class Docker(BaseManager):
self._api_version = DOCKER_MINIMUM_API_VERSION
@staticmethod
- async def install_busybox():
+ async def install_busybox(dst_dir):
- if not sys.platform.startswith("linux"):
- return
- dst_busybox = os.path.join(os.path.dirname(os.path.abspath(__file__)), "resources", "bin", "busybox")
+ dst_busybox = os.path.join(dst_dir, "bin", "busybox")
if os.path.isfile(dst_busybox):
return
for busybox_exec in ("busybox-static", "busybox.static", "busybox"):
@@ -91,6 +89,31 @@ class Docker(BaseManager):
raise DockerError(f"Could not install busybox: {e}")
raise DockerError("No busybox executable could be found")
+ @staticmethod
+ def resources_path():
+ """
+ Get the Docker resources storage directory
+ """
+
+ appname = vendor = "GNS3"
+ docker_resources_dir = os.path.join(platformdirs.user_data_dir(appname, vendor, roaming=True), "docker", "resources")
+ os.makedirs(docker_resources_dir, exist_ok=True)
+ return docker_resources_dir
+
+ async def install_resources(self):
+ """
+ Copy the necessary resources to a writable location and install busybox
+ """
+
+ try:
+ dst_path = self.resources_path()
+ log.info(f"Installing Docker resources in '{dst_path}'")
+ from gns3server.controller import Controller
+ Controller.instance().install_resource_files(dst_path, "compute/docker/resources")
+ await self.install_busybox(dst_path)
+ except OSError as e:
+ raise DockerError(f"Could not install Docker resources to {dst_path}: {e}")
+
async def _check_connection(self):
if not self._connected:
@@ -170,8 +193,8 @@ class Docker(BaseManager):
if timeout is None:
timeout = 60 * 60 * 24 * 31 # One month timeout
- if path == "version":
- url = "http://docker/v1.12/" + path # API of docker v1.0
+ if path == 'version':
+ url = "http://docker/v1.24/" + path
else:
url = "http://docker/v" + DOCKER_MINIMUM_API_VERSION + "/" + path
try:
diff --git a/gns3server/compute/docker/docker_vm.py b/gns3server/compute/docker/docker_vm.py
index 62560deb..8d0e0f50 100644
--- a/gns3server/compute/docker/docker_vm.py
+++ b/gns3server/compute/docker/docker_vm.py
@@ -299,12 +299,15 @@ class DockerVM(BaseNode):
:returns: Return the path that we need to map to local folders
"""
- resources = get_resource("compute/docker/resources")
- if not os.path.exists(resources):
- raise DockerError(f"{resources} is missing, can't start Docker container")
+ try:
+ resources_path = self.manager.resources_path()
+ except OSError as e:
+ raise DockerError(f"Cannot access resources: {e}")
+
+ log.info(f'Mount resources from "{resources_path}"')
binds = [{
"Type": "bind",
- "Source": resources,
+ "Source": resources_path,
"Target": "/gns3",
"ReadOnly": True
}]
@@ -394,6 +397,8 @@ class DockerVM(BaseNode):
if ":" in os.path.splitdrive(self.working_dir)[1]:
raise DockerError("Cannot create a Docker container with a project directory containing a colon character (':')")
+ #await self.manager.install_resources()
+
try:
image_infos = await self._get_image_information()
except DockerHttp404Error:
@@ -501,6 +506,10 @@ class DockerVM(BaseNode):
result = await self.manager.query("POST", "containers/create", data=params)
self._cid = result["Id"]
log.info(f"Docker container '{self._name}' [{self._id}] created")
+ if self._cpus > 0:
+ log.info(f"CPU limit set to {self._cpus} CPUs")
+ if self._memory > 0:
+ log.info(f"Memory limit set to {self._memory} MB")
return True
def _format_env(self, variables, env):
@@ -545,8 +554,7 @@ class DockerVM(BaseNode):
Starts this Docker container.
"""
- # make sure busybox is installed
- await self.manager.install_busybox()
+ await self.manager.install_resources()
try:
state = await self._get_container_state()
@@ -567,6 +575,9 @@ class DockerVM(BaseNode):
await self._start_vnc_process(restart=True)
monitor_process(self._vnc_process, self._vnc_callback)
+ if self._console_websocket:
+ await self._console_websocket.close()
+ self._console_websocket = None
await self._clean_servers()
await self.manager.query("POST", f"containers/{self._cid}/start")
@@ -829,9 +840,7 @@ class DockerVM(BaseNode):
f"containers/{self._cid}/attach/ws?stream=1&stdin=1&stdout=1&stderr=1"
)
input_stream.ws = self._console_websocket
-
output_stream.feed_data(self.name.encode() + b" console is now available... Press RETURN to get started.\r\n")
-
asyncio.ensure_future(self._read_console_output(self._console_websocket, output_stream))
async def _read_console_output(self, ws, out):
@@ -854,13 +863,14 @@ class DockerVM(BaseNode):
out.feed_eof()
await ws.close()
break
- await self.stop()
async def reset_console(self):
"""
Reset the console.
"""
+ if self._console_websocket:
+ await self._console_websocket.close()
await self._clean_servers()
await self._start_console()
@@ -904,6 +914,9 @@ class DockerVM(BaseNode):
"""
try:
+ if self._console_websocket:
+ await self._console_websocket.close()
+ self._console_websocket = None
await self._clean_servers()
await self._stop_ubridge()
diff --git a/gns3server/compute/dynamips/__init__.py b/gns3server/compute/dynamips/__init__.py
index b1211a47..eae8ab61 100644
--- a/gns3server/compute/dynamips/__init__.py
+++ b/gns3server/compute/dynamips/__init__.py
@@ -252,6 +252,9 @@ class Dynamips(BaseManager):
# look for Dynamips
dynamips_path = self.config.settings.Dynamips.dynamips_path
if not os.path.isabs(dynamips_path):
+ if sys.platform.startswith("win") and hasattr(sys, "frozen"):
+ dynamips_dir = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(sys.executable)), "dynamips"))
+ os.environ["PATH"] = os.pathsep.join(dynamips_dir) + os.pathsep + os.environ.get("PATH", "")
dynamips_path = shutil.which(dynamips_path)
if not dynamips_path:
diff --git a/gns3server/compute/dynamips/nodes/router.py b/gns3server/compute/dynamips/nodes/router.py
index de353eb1..97bcbbd0 100644
--- a/gns3server/compute/dynamips/nodes/router.py
+++ b/gns3server/compute/dynamips/nodes/router.py
@@ -76,7 +76,7 @@ class Router(BaseNode):
ghost_flag=False,
):
- if not is_ios_hostname_valid(name):
+ if not ghost_flag and not is_ios_hostname_valid(name):
raise DynamipsError(f"{name} is an invalid name to create a Dynamips node")
super().__init__(
diff --git a/gns3server/compute/qemu/__init__.py b/gns3server/compute/qemu/__init__.py
index a9fe0553..1bb0f06e 100644
--- a/gns3server/compute/qemu/__init__.py
+++ b/gns3server/compute/qemu/__init__.py
@@ -149,13 +149,20 @@ class Qemu(BaseManager):
for arch in archs:
if f.endswith(arch) or f.endswith(f"{arch}.exe") or f.endswith(f"{arch}w.exe"):
qemu_path = os.path.join(path, f)
- version = await Qemu.get_qemu_version(qemu_path)
+ try:
+ version = await Qemu.get_qemu_version(qemu_path)
+ except QemuError as e:
+ log.warning(str(e))
+ continue
qemus.append({"path": qemu_path, "version": version})
else:
qemu_path = os.path.join(path, f)
- version = await Qemu.get_qemu_version(qemu_path)
+ try:
+ version = await Qemu.get_qemu_version(qemu_path)
+ except QemuError as e:
+ log.warning(str(e))
+ continue
qemus.append({"path": qemu_path, "version": version})
-
except OSError:
continue
diff --git a/gns3server/compute/qemu/qemu_vm.py b/gns3server/compute/qemu/qemu_vm.py
index fa08fe2f..24f1d8a8 100644
--- a/gns3server/compute/qemu/qemu_vm.py
+++ b/gns3server/compute/qemu/qemu_vm.py
@@ -124,6 +124,8 @@ class QemuVM(BaseNode):
except QemuError:
# If the binary is not found for topologies 1.4 and later
# search via the platform otherwise use the binary name
+ log.warning(f"Could not find the QEMU binary {qemu_path} on this system, "
+ f"trying to find one using platform {platform}")
if platform:
self.platform = platform
else:
@@ -242,7 +244,7 @@ class QemuVM(BaseNode):
if qemu_path and os.pathsep not in qemu_path:
new_qemu_path = shutil.which(qemu_path, path=os.pathsep.join(self._manager.paths_list()))
if new_qemu_path is None:
- raise QemuError(f"QEMU binary path {qemu_path} is not found in the path")
+ raise QemuError(f"QEMU binary '{qemu_path}' cannot be found on the system")
qemu_path = new_qemu_path
self._check_qemu_path(qemu_path)
@@ -289,6 +291,7 @@ class QemuVM(BaseNode):
def platform(self, platform):
self._platform = platform
+ log.info(f"QEMU VM '{self._name}' [{self._id}] has set the platform {platform}")
self.qemu_path = f"qemu-system-{platform}"
def _disk_setter(self, variable, value):
@@ -2640,6 +2643,9 @@ class QemuVM(BaseNode):
command.extend(shlex.split(additional_options))
except ValueError as e:
raise QemuError(f"Invalid additional options: {additional_options} error {e}")
+ # avoiding mouse offset (see https://github.com/GNS3/gns3-server/issues/2335)
+ if self._console_type == "vnc":
+ command.extend(['-machine', 'usb=on', '-device', 'usb-tablet'])
return command
def asdict(self):
diff --git a/gns3server/compute/vpcs/vpcs_vm.py b/gns3server/compute/vpcs/vpcs_vm.py
index 47e66473..b42c4095 100644
--- a/gns3server/compute/vpcs/vpcs_vm.py
+++ b/gns3server/compute/vpcs/vpcs_vm.py
@@ -142,6 +142,9 @@ class VPCSVM(BaseNode):
vpcs_path = self._manager.config.settings.VPCS.vpcs_path
if not os.path.isabs(vpcs_path):
+ if sys.platform.startswith("win") and hasattr(sys, "frozen"):
+ vpcs_dir = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(sys.executable)), "vpcs"))
+ os.environ["PATH"] = os.pathsep.join(vpcs_dir) + os.pathsep + os.environ.get("PATH", "")
vpcs_path = shutil.which(vpcs_path)
return vpcs_path
diff --git a/gns3server/config_samples/gns3_server.conf b/gns3server/config_samples/gns3_server.conf
index fe15c335..c69a8200 100644
--- a/gns3server/config_samples/gns3_server.conf
+++ b/gns3server/config_samples/gns3_server.conf
@@ -86,9 +86,9 @@ udp_end_port_range = 30000
; uBridge executable location, default: search in PATH
;ubridge_path = ubridge
-; Username for compute HTTP authentication.
+; Username for compute HTTP authentication, "gns3" is the default if not specified
compute_username = gns3
-; Password for compute HTTP authentication.
+; Password for compute HTTP authentication, a randomly generated password is used if not specified
compute_password = gns3
; Only allow these interfaces to be used by GNS3, for the Cloud node for example (Linux/OSX only)
@@ -102,6 +102,9 @@ default_nat_interface = vmnet10
; Enable the built-in templates
enable_builtin_templates = True
+; check if hardware virtualization is used by other emulators (KVM, VMware or VirtualBox)
+hardware_virtualization_check = True
+
[VPCS]
; VPCS executable location, default: search in PATH
;vpcs_path = vpcs
@@ -126,10 +129,13 @@ license_check = True
vboxmanage_path = vboxmanage
[VMware]
-; Path to the vmrun binary used to manage VMware
+; Path to vmrun binary used to manage VMware
vmrun_path = vmrun
+; First vmnet interface of the range that can be managed by the GNS3 server
vmnet_start_range = 2
+; Last vmnet interface of the range that can be managed by the GNS3 server. It must be maximum 19 on Windows.
vmnet_end_range = 255
+; block network traffic originating from the host OS
block_host_traffic = False
[Qemu]
@@ -142,9 +148,3 @@ monitor_host = 127.0.0.1
enable_hardware_acceleration = True
; Require hardware acceleration in order to start VMs
require_hardware_acceleration = False
-
-[VMware]
-; First vmnet interface of the range that can be managed by the GNS3 server
-vmnet_start_range = 2
-; Last vmnet interface of the range that can be managed by the GNS3 server. It must be maximum 19 on Windows.
-vmnet_end_range = 255
diff --git a/gns3server/controller/__init__.py b/gns3server/controller/__init__.py
index ab3bb0b0..ca2622c9 100644
--- a/gns3server/controller/__init__.py
+++ b/gns3server/controller/__init__.py
@@ -320,6 +320,9 @@ class Controller:
if entry.is_file() and not os.path.exists(full_path):
log.debug(f'Installing {resource_name} resource file "{entry.name}" to "{full_path}"')
shutil.copy(str(entry), os.path.join(dst_path, entry.name))
+ elif entry.is_dir():
+ os.makedirs(full_path, exist_ok=True)
+ Controller.install_resource_files(full_path, os.path.join(resource_name, entry.name))
def _install_base_configs(self):
"""
diff --git a/gns3server/controller/export_project.py b/gns3server/controller/export_project.py
index 4ae976d2..9e14525c 100644
--- a/gns3server/controller/export_project.py
+++ b/gns3server/controller/export_project.py
@@ -102,6 +102,11 @@ async def export_project(
continue
_patch_mtime(path)
zstream.write(path, os.path.relpath(path, project._path))
+ # save empty directories
+ for directory in dirs:
+ path = os.path.join(root, directory)
+ if not os.listdir(path):
+ zstream.write(path, os.path.relpath(path, project._path))
except FileNotFoundError as e:
log.warning(f"Cannot export local file: {e}")
continue
diff --git a/gns3server/controller/import_project.py b/gns3server/controller/import_project.py
index 545c4ac1..50b43ec9 100644
--- a/gns3server/controller/import_project.py
+++ b/gns3server/controller/import_project.py
@@ -23,6 +23,7 @@ import shutil
import aiofiles
import itertools
import tempfile
+import stat
import gns3server.utils.zipfile_zstd as zipfile_zstd
from .controller_error import ControllerError
@@ -235,7 +236,7 @@ async def _upload_file(compute, project_id, file_path, path):
async def _import_images(controller, images_path):
"""
- Copy images to the images directory or delete them if they already exists.
+ Copy images to the images directory or delete them if they already exist.
"""
image_dir = controller.images_path()
@@ -247,7 +248,9 @@ async def _import_images(controller, images_path):
continue
dst = os.path.join(image_dir, os.path.relpath(path, root))
os.makedirs(os.path.dirname(dst), exist_ok=True)
- await wait_run_in_executor(shutil.move, path, dst)
+ if not os.path.exists(dst):
+ await wait_run_in_executor(shutil.move, path, dst)
+ os.chmod(dst, stat.S_IWRITE | stat.S_IREAD | stat.S_IEXEC)
async def _import_snapshots(snapshots_path, project_name, project_id):
diff --git a/gns3server/controller/project.py b/gns3server/controller/project.py
index ec5c7184..ee351dc1 100644
--- a/gns3server/controller/project.py
+++ b/gns3server/controller/project.py
@@ -152,16 +152,27 @@ class Project:
self._iou_id_lock = asyncio.Lock()
log.debug(f'Project "{self.name}" [{self._id}] loaded')
+ self.emit_controller_notification("project.created", self.asdict())
def emit_notification(self, action, event):
"""
- Emit a notification to all clients using this project.
+ Emit a project notification to all clients using this project.
:param action: Action name
:param event: Event to send
"""
- self.controller.notification.project_emit(action, event, project_id=self.id)
+ self._controller.notification.project_emit(action, event, project_id=self.id)
+
+ def emit_controller_notification(self, action, event):
+ """
+ Emit a controller notification, all clients will see it.
+
+ :param action: Action name
+ :param event: Event to send
+ """
+
+ self._controller.notification.controller_emit(action, event)
async def update(self, **kwargs):
"""
@@ -176,7 +187,7 @@ class Project:
# We send notif only if object has changed
if old_json != self.asdict():
- self.emit_notification("project.updated", self.asdict())
+ self.emit_controller_notification("project.updated", self.asdict())
self.dump()
# update on computes
@@ -812,7 +823,8 @@ class Project:
self._clean_pictures()
self._status = "closed"
if not ignore_notification:
- self.emit_notification("project.closed", self.asdict())
+ self.emit_controller_notification("project.closed", self.asdict())
+
self.reset()
self._closing = False
@@ -868,6 +880,7 @@ class Project:
shutil.rmtree(self.path)
except OSError as e:
raise ControllerError(f"Cannot delete project directory {self.path}: {str(e)}")
+ self.emit_controller_notification("project.deleted", self.asdict())
async def delete_on_computes(self):
"""
@@ -1001,7 +1014,7 @@ class Project:
await self.add_drawing(dump=False, **drawing_data)
self.dump()
- # We catch all error to be able to rollback the .gns3 to the previous state
+ # We catch all error to be able to roll back the .gns3 to the previous state
except Exception as e:
for compute in list(self._project_created_on_compute):
try:
@@ -1026,6 +1039,7 @@ class Project:
pass
self._loading = False
+ self.emit_controller_notification("project.opened", self.asdict())
# Should we start the nodes when project is open
if self._auto_start:
# Start all in the background without waiting for completion
diff --git a/gns3server/controller/symbols.py b/gns3server/controller/symbols.py
index b725c7c0..69ec399c 100644
--- a/gns3server/controller/symbols.py
+++ b/gns3server/controller/symbols.py
@@ -72,7 +72,7 @@ class Symbols:
return None
symbol_path = theme.get(symbol)
if symbol_path not in self._symbols_path:
- log.warning(f"Default symbol {symbol} was not found")
+ log.debug(f"Default symbol {symbol} was not found")
return None
return symbol_path
@@ -153,6 +153,9 @@ class Symbols:
else:
# return the default computer symbol
log.warning(f"Could not retrieve symbol '{symbol_id}', returning default symbol...")
+ symbol = self.get_default_symbol("computer", self._current_theme)
+ if symbol and symbol in self._symbols_path:
+ return self._symbols_path[symbol]
return self._symbols_path[":/symbols/classic/computer.svg"]
def get_size(self, symbol_id):
diff --git a/gns3server/crash_report.py b/gns3server/crash_report.py
index 7b2c7c15..2e97e846 100644
--- a/gns3server/crash_report.py
+++ b/gns3server/crash_report.py
@@ -58,7 +58,7 @@ class CrashReport:
Report crash to a third party service
"""
- DSN = "https://803d7abaf0e865096421affb70ee9368@o19455.ingest.sentry.io/38482"
+ DSN = "https://395af26fb5b2245d4c9810095aa11da9@o19455.ingest.us.sentry.io/38482"
_instance = None
def __init__(self):
diff --git a/gns3server/db/models/templates.py b/gns3server/db/models/templates.py
index a35ed076..a24c59df 100644
--- a/gns3server/db/models/templates.py
+++ b/gns3server/db/models/templates.py
@@ -16,7 +16,7 @@
# along with this program. If not, see .
-from sqlalchemy import Boolean, Column, String, Integer, ForeignKey, PickleType
+from sqlalchemy import Boolean, Column, String, Integer, Float, ForeignKey, PickleType
from sqlalchemy.orm import relationship
from .base import BaseTable, generate_uuid, GUID
@@ -77,7 +77,7 @@ class DockerTemplate(Template):
extra_hosts = Column(String)
extra_volumes = Column(PickleType)
memory = Column(Integer)
- cpus = Column(Integer)
+ cpus = Column(Float)
custom_adapters = Column(PickleType)
__mapper_args__ = {"polymorphic_identity": "docker", "polymorphic_load": "selectin"}
diff --git a/gns3server/db_migrations/README b/gns3server/db_migrations/README
index a2087ba3..0f539904 100644
--- a/gns3server/db_migrations/README
+++ b/gns3server/db_migrations/README
@@ -1,4 +1,5 @@
Generic single-database configuration with an async dbapi.
# Command to generate a revision
+alembic upgrade head
alembic revision --autogenerate -m "add fields in table"
diff --git a/gns3server/main.py b/gns3server/main.py
index 624612f3..ebd8b112 100644
--- a/gns3server/main.py
+++ b/gns3server/main.py
@@ -29,6 +29,7 @@ import gns3server.utils.get_resource
import os
import sys
+import asyncio
def daemonize():
@@ -70,7 +71,10 @@ def main():
daemonize()
from gns3server.server import Server
- Server().run()
+ try:
+ asyncio.run(Server().run())
+ except KeyboardInterrupt:
+ pass
if __name__ == "__main__":
diff --git a/gns3server/schemas/compute/docker_nodes.py b/gns3server/schemas/compute/docker_nodes.py
index 964b88e7..63bc60af 100644
--- a/gns3server/schemas/compute/docker_nodes.py
+++ b/gns3server/schemas/compute/docker_nodes.py
@@ -43,7 +43,7 @@ class DockerBase(BaseModel):
extra_hosts: Optional[str] = Field(None, description="Docker extra hosts (added to /etc/hosts)")
extra_volumes: Optional[List[str]] = Field(None, description="Additional directories to make persistent")
memory: Optional[int] = Field(None, description="Maximum amount of memory the container can use in MB")
- cpus: Optional[int] = Field(None, description="Maximum amount of CPU resources the container can use")
+ cpus: Optional[float] = Field(None, description="Maximum amount of CPU resources the container can use")
custom_adapters: Optional[List[CustomAdapter]] = Field(None, description="Custom adapters")
diff --git a/gns3server/schemas/config.py b/gns3server/schemas/config.py
index f5155ec3..6e57aef8 100644
--- a/gns3server/schemas/config.py
+++ b/gns3server/schemas/config.py
@@ -138,7 +138,7 @@ class ServerSettings(BaseModel):
udp_start_port_range: int = Field(10000, gt=0, le=65535)
udp_end_port_range: int = Field(30000, gt=0, le=65535)
ubridge_path: str = "ubridge"
- compute_username: str = "admin"
+ compute_username: str = "gns3"
compute_password: SecretStr = SecretStr("")
allowed_interfaces: List[str] = Field(default_factory=list)
default_nat_interface: str = None
diff --git a/gns3server/schemas/controller/templates/docker_templates.py b/gns3server/schemas/controller/templates/docker_templates.py
index 2225f39a..1a799236 100644
--- a/gns3server/schemas/controller/templates/docker_templates.py
+++ b/gns3server/schemas/controller/templates/docker_templates.py
@@ -49,7 +49,7 @@ class DockerTemplate(TemplateBase):
extra_hosts: Optional[str] = Field("", description="Docker extra hosts (added to /etc/hosts)")
extra_volumes: Optional[List] = Field([], description="Additional directories to make persistent")
memory: Optional[int] = Field(0, description="Maximum amount of memory the container can use in MB")
- cpus: Optional[int] = Field(0, description="Maximum amount of CPU resources the container can use")
+ cpus: Optional[float] = Field(0, description="Maximum amount of CPU resources the container can use")
custom_adapters: Optional[List[CustomAdapter]] = Field(default_factory=list, description="Custom adapters")
diff --git a/gns3server/server.py b/gns3server/server.py
index f7f1d89e..a2bff6d4 100644
--- a/gns3server/server.py
+++ b/gns3server/server.py
@@ -182,7 +182,7 @@ class Server:
asyncio.ensure_future(Controller.instance().reload())
else:
log.info(f"Server has got signal {signame}, exiting...")
- # send SIGTERM to the server PID so uvicorn can shutdown the process
+ # send SIGTERM to the server PID so uvicorn can shut down the process
os.kill(os.getpid(), signal.SIGTERM)
except asyncio.CancelledError:
pass
@@ -239,7 +239,7 @@ class Server:
log.critical("Can't write pid file %s: %s", path, str(e))
sys.exit(1)
- def run(self):
+ async def run(self):
args = self._parse_arguments(sys.argv[1:])
@@ -333,8 +333,7 @@ class Server:
uvicorn_logger.propagate = False
server = uvicorn.Server(config)
- loop = asyncio.get_event_loop()
- loop.run_until_complete(server.serve())
+ await server.serve()
except Exception as e:
log.critical(f"Critical error while running the server: {e}", exc_info=1)
diff --git a/gns3server/services/authentication.py b/gns3server/services/authentication.py
index 5fc3796a..5613d0df 100644
--- a/gns3server/services/authentication.py
+++ b/gns3server/services/authentication.py
@@ -17,7 +17,7 @@
from jose import JWTError, jwt
from datetime import datetime, timedelta
-from passlib.context import CryptContext
+import bcrypt
from typing import Optional
from fastapi import HTTPException, status
@@ -29,8 +29,6 @@ import logging
log = logging.getLogger(__name__)
-pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
-
DEFAULT_JWT_SECRET_KEY = "efd08eccec3bd0a1be2e086670e5efa90969c68d07e072d7354a76cea5e33d4e"
@@ -38,11 +36,13 @@ class AuthService:
def hash_password(self, password: str) -> str:
- return pwd_context.hash(password)
+ salt = bcrypt.gensalt()
+ hashed_password = bcrypt.hashpw(password=password.encode('utf-8'), salt=salt)
+ return hashed_password.decode('utf-8')
def verify_password(self, password, hashed_password) -> bool:
- return pwd_context.verify(password, hashed_password)
+ return bcrypt.checkpw(password=password.encode('utf-8'), hashed_password=hashed_password.encode('utf-8'))
def create_access_token(self, username, secret_key: str = None, expires_in: int = 0) -> str:
diff --git a/gns3server/static/web-ui/3rdpartylicenses.txt b/gns3server/static/web-ui/3rdpartylicenses.txt
index 1382a9f7..bafec8ce 100644
--- a/gns3server/static/web-ui/3rdpartylicenses.txt
+++ b/gns3server/static/web-ui/3rdpartylicenses.txt
@@ -1493,6 +1493,29 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ipaddr.js
+MIT
+Copyright (C) 2011-2017 whitequark
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+
marked
MIT
# License information
diff --git a/gns3server/static/web-ui/index.html b/gns3server/static/web-ui/index.html
index eb373481..21e0f4e9 100644
--- a/gns3server/static/web-ui/index.html
+++ b/gns3server/static/web-ui/index.html
@@ -31,7 +31,7 @@
}
})();
-
+
@@ -46,6 +46,6 @@
gtag('config', 'G-5D6FZL9923');
-
+