diff --git a/CHANGELOG b/CHANGELOG
index aba428f4c..89562ef4b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,33 @@
# Change Log
+## 3.0.4 25/02/2025
+
+* Require minimum 8 characters for passwords
+* Bundle web-ui v3.0.4
+* Upgrade dependencies
+* Fix auto idle-pc for IOS templates
+* Update schemas to add constraints for values like ram, nvram etc.
+* Install custom symbols. Fixes #2492
+* Fix VMware add ubridge connection. Fixes #2490
+
+## 3.0.3 22/01/2025
+
+* Bundle web-ui v3.0.3
+* Refactor command line arguments parsing
+* Fix capture on IOU/IOL links. Fixes #2477
+* Use Python 3.9 to publish API documentation
+* Upgrade dependencies
+
+## 2.2.53 21/01/2025
+
+* Bundle web-ui v2.2.53
+* Add more information when patching .vbox file. Ref https://github.com/GNS3/gns3-gui/issues/3542
+* Increase timeout to run compute HTTP queries. Fixes #2461
+* Use 'allow_methods="*"' in aiohttp_cors.ResourceOptions(). Fixes #2459
+* Upgrade dependencies
+* Update remote-install.sh to support a custom repository and the deb822 source format
+* Fix: do not use the iourc file if IOU licence check is not enabled
+
## 3.0.2 03/01/2025
* Bundle web-ui v3.0.2
@@ -31,7 +59,6 @@
## 2.2.52 02/12/2024
* Bundle web-ui v2.2.52
-* Sync appliances
* Remove restrictions based on file extension when listing images and fix ELF header checks
* Fix use project name instead of ID for fast duplication when running local server. Fixes #2446
* Overwrite user resources when the originals have changed.
diff --git a/dev-requirements.txt b/dev-requirements.txt
index 3aa82cddb..04ca562bd 100644
--- a/dev-requirements.txt
+++ b/dev-requirements.txt
@@ -1,7 +1,7 @@
-pytest==8.3.3
+pytest==8.3.4
flake8==7.1.1
pytest-timeout==2.3.1
-pytest-asyncio==0.21.2
+pytest-asyncio==0.25.2
requests==2.32.3
-httpx==0.27.2 # version 0.24.1 is required by httpx_ws
-httpx_ws==0.6.2
+httpx==0.28.1
+httpx_ws==0.7.1
diff --git a/gns3server/api/routes/compute/iou_nodes.py b/gns3server/api/routes/compute/iou_nodes.py
index 1b456a973..f3b5b8fe8 100644
--- a/gns3server/api/routes/compute/iou_nodes.py
+++ b/gns3server/api/routes/compute/iou_nodes.py
@@ -284,7 +284,7 @@ async def start_iou_node_capture(
"""
pcap_file_path = os.path.join(node.project.capture_working_directory(), node_capture_data.capture_file_name)
- await node.start_capture(adapter_number, pcap_file_path)
+ await node.start_capture(adapter_number, port_number, pcap_file_path)
return {"pcap_file_path": str(pcap_file_path)}
diff --git a/gns3server/api/routes/controller/computes.py b/gns3server/api/routes/controller/computes.py
index ca86e912f..7385026bf 100644
--- a/gns3server/api/routes/controller/computes.py
+++ b/gns3server/api/routes/controller/computes.py
@@ -188,7 +188,7 @@ async def vmware_vms(compute_id: Union[str, UUID]) -> List[schemas.ComputeVMware
@router.post("/{compute_id}/dynamips/auto_idlepc")
-async def dynamips_autoidlepc(compute_id: Union[str, UUID], auto_idle_pc: schemas.AutoIdlePC) -> str:
+async def dynamips_autoidlepc(compute_id: Union[str, UUID], auto_idle_pc: schemas.AutoIdlePC):
"""
Find a suitable Idle-PC value for a given IOS image. This may take a few minutes.
"""
diff --git a/gns3server/appliances/alpine-cloud.gns3a b/gns3server/appliances/alpine-cloud.gns3a
new file mode 100644
index 000000000..001570938
--- /dev/null
+++ b/gns3server/appliances/alpine-cloud.gns3a
@@ -0,0 +1,56 @@
+{
+ "appliance_id": "edbaa01e-2032-4ee2-bb9f-dd5c4d84c270",
+ "name": "Alpine Cloud Guest",
+ "category": "guest",
+ "description": "Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox.",
+ "vendor_name": "Alpine Linux Development Team",
+ "vendor_url": "http://alpinelinux.org",
+ "vendor_logo_url": "https://raw.githubusercontent.com/GNS3/gns3-registry/master/vendor-logos/Alpine Linux.png",
+ "documentation_url": "http://wiki.alpinelinux.org",
+ "product_name": "Alpine Linux",
+ "product_url": "https://www.alpinelinux.org/cloud/",
+ "registry_version": 4,
+ "status": "stable",
+ "maintainer": "GNS3 Team",
+ "maintainer_email": "developers@gns3.net",
+ "usage": "\nUsername: alpine\nPassword: alpine",
+ "port_name_format": "Ethernet{0}",
+ "qemu": {
+ "adapter_type": "virtio-net-pci",
+ "adapters": 1,
+ "ram": 1024,
+ "hda_disk_interface": "virtio",
+ "arch": "x86_64",
+ "console_type": "telnet",
+ "boot_priority": "c",
+ "kvm": "require",
+ "options": "-nographic"
+ },
+ "images": [
+ {
+ "filename": "generic_alpine-3.21.2-x86_64-bios-cloudinit-r0.qcow2",
+ "version": "3.21.2",
+ "md5sum": "b40825dff2867e0ffaffbc4c87674462",
+ "filesize": 189726720,
+ "download_url": "https://www.alpinelinux.org/cloud/",
+ "direct_download_url": "https://dl-cdn.alpinelinux.org/alpine/v3.21/releases/cloud/generic_alpine-3.21.2-x86_64-bios-cloudinit-r0.qcow2"
+ },
+ {
+ "filename": "alpine-cloud-init-data.iso",
+ "version": "1.0",
+ "md5sum": "b1b4b16cc3bf0250c0fa377c19c97683",
+ "filesize": 374784,
+ "download_url": "https://github.com/GNS3/gns3-registry/tree/master/cloud-init/alpine-cloud",
+ "direct_download_url": "https://github.com/GNS3/gns3-registry/raw/master/cloud-init/alpine-cloud/alpine-cloud-init-data.iso"
+ }
+ ],
+ "versions": [
+ {
+ "name": "3.21.2",
+ "images": {
+ "hda_disk_image": "generic_alpine-3.21.2-x86_64-bios-cloudinit-r0.qcow2",
+ "cdrom_image": "alpine-cloud-init-data.iso"
+ }
+ }
+ ]
+}
diff --git a/gns3server/appliances/cisco-asav.gns3a b/gns3server/appliances/cisco-asav.gns3a
index eacc48d84..35e71c462 100644
--- a/gns3server/appliances/cisco-asav.gns3a
+++ b/gns3server/appliances/cisco-asav.gns3a
@@ -5,9 +5,9 @@
"description": "The Adaptive Security Virtual Appliance is a virtualized network security solution based on the market-leading Cisco ASA 5500-X Series firewalls. It supports both traditional and next-generation software-defined network (SDN) and Cisco Application Centric Infrastructure (ACI) environments to provide policy enforcement and threat inspection across heterogeneous multisite environments.",
"vendor_name": "Cisco",
"vendor_url": "http://www.cisco.com/",
- "documentation_url": "http://www.cisco.com/c/en/us/support/security/virtual-adaptive-security-appliance-firewall/products-installation-guides-list.html",
+ "documentation_url": "https://developer.cisco.com/docs/modeling-labs/asav/",
"product_name": "ASAv",
- "product_url": "http://www.cisco.com/c/en/us/products/security/virtual-adaptive-security-appliance-firewall/index.html",
+ "product_url": "https://developer.cisco.com/modeling-labs/",
"registry_version": 4,
"status": "stable",
"maintainer": "GNS3 Team",
diff --git a/gns3server/appliances/cisco-c8000v.gns3a b/gns3server/appliances/cisco-c8000v.gns3a
index 618109695..03a89128e 100644
--- a/gns3server/appliances/cisco-c8000v.gns3a
+++ b/gns3server/appliances/cisco-c8000v.gns3a
@@ -5,9 +5,9 @@
"description": "The Cisco Catalyst 8000V Edge Software is a virtual, form-factor router deployed on a virtual machine (VM) running on an x86 server hardware.",
"vendor_name": "Cisco",
"vendor_url": "http://www.cisco.com/",
- "documentation_url": "https://www.cisco.com/c/en/us/td/docs/routers/C8000V/Configuration/c8000v-installation-configuration-guide.html",
+ "documentation_url": "https://developer.cisco.com/docs/modeling-labs/cat-8000v/",
"product_name": "c8000v",
- "product_url": "https://www.cisco.com/c/en/us/support/routers/catalyst-8000v-edge-software/series.html",
+ "product_url": "https://developer.cisco.com/modeling-labs/",
"registry_version": 4,
"status": "stable",
"maintainer": "GNS3 Team",
@@ -24,6 +24,13 @@
"kvm": "require"
},
"images": [
+ {
+ "filename": "c8000v-universalk9_8G_serial.17.15.01a.qcow2",
+ "version": "17.15.01a 8G",
+ "md5sum": "41efa0aedd67f1f57cde1263c79d9ff6",
+ "filesize": 1846280192,
+ "download_url": "https://software.cisco.com/download/home/286327102/type/282046477/release/IOSXE-17.15.1a"
+ },
{
"filename": "c8000v-universalk9_8G_serial.17.09.04a.qcow2",
"version": "17.09.04a 8G",
@@ -68,6 +75,12 @@
}
],
"versions": [
+ {
+ "name": "17.15.01a 8G",
+ "images": {
+ "hda_disk_image": "c8000v-universalk9_8G_serial.17.15.01a.qcow2"
+ }
+ },
{
"name": "17.09.04a 8G",
"images": {
diff --git a/gns3server/appliances/cisco-cat9k.gns3a b/gns3server/appliances/cisco-cat9k.gns3a
index 52b4b6b51..cd3538128 100644
--- a/gns3server/appliances/cisco-cat9k.gns3a
+++ b/gns3server/appliances/cisco-cat9k.gns3a
@@ -5,9 +5,9 @@
"description": "Cisco IOS-XE 9000v. This appliance requires 16GB of memory to run! Recommend 2 or more vCPUs for faster boot performance",
"vendor_name": "Cisco",
"vendor_url": "http://www.cisco.com/",
- "documentation_url": "https://developer.cisco.com/docs/modeling-labs/2-5/#!cml-release-notes",
+ "documentation_url": "https://developer.cisco.com/docs/modeling-labs/cat-9000v/",
"product_name": "Cisco CAT IOS-XE 9000v",
- "product_url": "http://virl.cisco.com/",
+ "product_url": "https://developer.cisco.com/modeling-labs/",
"registry_version": 4,
"status": "experimental",
"maintainer": "GNS3 Team",
diff --git a/gns3server/appliances/cisco-csr1000v.gns3a b/gns3server/appliances/cisco-csr1000v.gns3a
index 90be6447d..286431216 100644
--- a/gns3server/appliances/cisco-csr1000v.gns3a
+++ b/gns3server/appliances/cisco-csr1000v.gns3a
@@ -5,9 +5,9 @@
"description": "The Cisco Cloud Services Router 1000V (CSR 1000V) is a router and network services platform in virtual form factor that is intended for deployment in cloud and virtual data centers. It is optimized to serve as a single-tenant or multitenant WAN gateway. Using proven, industry-leading Cisco IOS\u00ae XE Software networking and security features, the CSR 1000V enables enterprises to transparently extend their WANs into external provider-hosted clouds and cloud providers to offer their tenants enterprise-class networking services.",
"vendor_name": "Cisco",
"vendor_url": "http://www.cisco.com/",
- "documentation_url": "http://www.cisco.com/c/en/us/support/routers/cloud-services-router-1000v-series/products-installation-and-configuration-guides-list.html",
+ "documentation_url": "https://developer.cisco.com/docs/modeling-labs/csr-1000v/",
"product_name": "CSR1000v",
- "product_url": "http://www.cisco.com/c/en/us/support/routers/cloud-services-router-1000v-series/tsd-products-support-series-home.html",
+ "product_url": "https://developer.cisco.com/modeling-labs/",
"registry_version": 4,
"status": "stable",
"maintainer": "GNS3 Team",
@@ -169,7 +169,7 @@
"version": "16.4.1",
"md5sum": "3428e0dcf5132a1b11ab7696d8c61b2e",
"filesize": 1261961216,
- "download_url": "https://virl.mediuscorp.com/my-account/"
+ "download_url": "https://learningnetworkstore.cisco.com/myaccount"
},
{
"filename": "csr1000v-universalk9.16.6.1.qcow2",
diff --git a/gns3server/appliances/cisco-iosv.gns3a b/gns3server/appliances/cisco-iosv.gns3a
index 001fc488d..24b173c48 100644
--- a/gns3server/appliances/cisco-iosv.gns3a
+++ b/gns3server/appliances/cisco-iosv.gns3a
@@ -5,8 +5,9 @@
"description": "Cisco Virtual IOS allows user to run IOS on a standard computer.",
"vendor_name": "Cisco",
"vendor_url": "http://www.cisco.com/",
+ "documentation_url": "https://developer.cisco.com/docs/modeling-labs/iol/",
"product_name": "IOSv",
- "product_url": "http://virl.cisco.com/",
+ "product_url": "https://developer.cisco.com/modeling-labs/",
"registry_version": 4,
"status": "stable",
"maintainer": "GNS3 Team",
@@ -25,12 +26,11 @@
},
"images": [
{
- "filename": "IOSv_startup_config.img",
- "version": "1",
- "md5sum": "bc605651c4688276f81fd59dcf5cc786",
- "filesize": 1048576,
- "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.m9.qcow2",
+ "version": "15.9(3)M9",
+ "md5sum": "01b707a2e33185d6d33e0255ced45d23",
+ "filesize": 57323008,
+ "download_url": "https://learningnetworkstore.cisco.com/myaccount"
},
{
"filename": "vios-adventerprisek9-m.spa.159-3.m8.qcow2",
@@ -101,9 +101,24 @@
"md5sum": "79f613ac3b179d5a64520730925130b2",
"filesize": 127926272,
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
+ },
+ {
+ "filename": "IOSv_startup_config.img",
+ "version": "1",
+ "md5sum": "bc605651c4688276f81fd59dcf5cc786",
+ "filesize": 1048576,
+ "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"
}
],
"versions": [
+ {
+ "name": "15.9(3)M9",
+ "images": {
+ "hda_disk_image": "vios-adventerprisek9-m.spa.159-3.m9.qcow2",
+ "hdb_disk_image": "IOSv_startup_config.img"
+ }
+ },
{
"name": "15.9(3)M8",
"images": {
diff --git a/gns3server/appliances/cisco-iosvl2.gns3a b/gns3server/appliances/cisco-iosvl2.gns3a
index 0a9e5e6f0..e9b869555 100644
--- a/gns3server/appliances/cisco-iosvl2.gns3a
+++ b/gns3server/appliances/cisco-iosvl2.gns3a
@@ -5,8 +5,9 @@
"description": "Cisco Virtual IOS L2 allows user to run a IOS switching image on a standard computer.",
"vendor_name": "Cisco",
"vendor_url": "http://www.cisco.com/",
+ "documentation_url": "https://developer.cisco.com/docs/modeling-labs/iosvl2/",
"product_name": "IOSvL2",
- "product_url": "http://virl.cisco.com/",
+ "product_url": "https://developer.cisco.com/modeling-labs/",
"registry_version": 4,
"status": "stable",
"maintainer": "GNS3 Team",
diff --git a/gns3server/appliances/cisco-iosxrv.gns3a b/gns3server/appliances/cisco-iosxrv.gns3a
index c60455025..e35a5541a 100644
--- a/gns3server/appliances/cisco-iosxrv.gns3a
+++ b/gns3server/appliances/cisco-iosxrv.gns3a
@@ -5,9 +5,9 @@
"description": "IOS XRv supports the control plane features introduced in Cisco IOS XR.",
"vendor_name": "Cisco",
"vendor_url": "http://www.cisco.com/",
- "documentation_url": "http://www.cisco.com/c/en/us/td/docs/ios_xr_sw/ios_xrv/release/notes/xrv-rn.html",
+ "documentation_url": "https://developer.cisco.com/docs/modeling-labs/ios-xrv/",
"product_name": "IOS XRv",
- "product_url": "http://virl.cisco.com/",
+ "product_url": "https://developer.cisco.com/modeling-labs/",
"registry_version": 4,
"status": "stable",
"maintainer": "GNS3 Team",
diff --git a/gns3server/appliances/cisco-iosxrv9k.gns3a b/gns3server/appliances/cisco-iosxrv9k.gns3a
index 9373437e3..c856f37f5 100644
--- a/gns3server/appliances/cisco-iosxrv9k.gns3a
+++ b/gns3server/appliances/cisco-iosxrv9k.gns3a
@@ -5,9 +5,9 @@
"description": "IOS XRv 9000 (aka Sunstone) is the 1st VM released running the 64-bit IOS XR operating system as used on the NCS-6xxx platform. This appliance requires 4 vCPUs and 16GB of memory to run!",
"vendor_name": "Cisco",
"vendor_url": "http://www.cisco.com/",
- "documentation_url": "http://www.cisco.com/c/en/us/td/docs/ios_xr_sw/ios_xrv/release/notes/xrv-rn.html",
+ "documentation_url": "https://developer.cisco.com/docs/modeling-labs/ios-xrv-9000/",
"product_name": "IOS XRv 9000",
- "product_url": "http://virl.cisco.com/",
+ "product_url": "https://developer.cisco.com/modeling-labs/",
"registry_version": 4,
"status": "experimental",
"maintainer": "GNS3 Team",
@@ -26,92 +26,35 @@
"options": "-smp 4 -cpu host"
},
"images": [
+ {
+ "filename": "xrv9k-fullk9-x-24.3.1.qcow2",
+ "version": "24.3.1",
+ "md5sum": "bd047c457e29952f265583f299bab845",
+ "filesize": 1704658432,
+ "download_url": "https://learningnetworkstore.cisco.com/myaccount"
+ },
{
"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"
+ "download_url": "https://learningnetworkstore.cisco.com/myaccount"
},
{
"filename": "xrv9k-fullk9-x-7.1.1.qcow2",
"version": "7.1.1",
"md5sum": "dcf241e3f8df0151fec2c7bfac9d96ac",
"filesize": 1443758080,
- "download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/7.1.1"
- },
- {
- "filename": "xrv9k-fullk9-x-7.0.1.qcow2",
- "version": "7.0.1",
- "md5sum": "ca2817767fa546e303c3c536e211d33e",
- "filesize": 1446445056,
- "download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/7.0.1"
- },
- {
- "filename": "xrv9k-fullk9-x-6.6.2.qcow2",
- "version": "6.6.2",
- "md5sum": "fd630be3c449e625073286a3a66021ae",
- "filesize": 1452998656,
- "download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/6.6.2"
- },
- {
- "filename": "xrv9k-fullk9-x-6.5.3.qcow2",
- "version": "6.5.3",
- "md5sum": "71f018e3ea895b663129090fb4f0ff40",
- "filesize": 1205075968,
- "download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/6.5.3"
- },
- {
- "filename": "xrv9k-fullk9-x-6.5.2.qcow2",
- "version": "6.5.2",
- "md5sum": "506d9e23dda7365c99dd82b613859697",
- "filesize": 1205010432,
- "download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/6.5.1"
- },
- {
- "filename": "xrv9k-fullk9-x-6.5.1.qcow2",
- "version": "6.5.1",
- "md5sum": "730868e7cd46de9aa2e950899c7f9498",
- "filesize": 1208811520,
- "download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/6.5.1"
- },
- {
- "filename": "xrv9k-fullk9-x-6.4.2.qcow2",
- "version": "6.4.2",
- "md5sum": "6958763192c7bb59a1b8049d377de1b4",
- "filesize": 1311703040,
- "download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/6.4.2"
- },
- {
- "filename": "xrv9k-fullk9-x-6.4.1.qcow2",
- "version": "6.4.1",
- "md5sum": "9c56b684e307706005a503e289cb9317",
- "filesize": 1304887296,
- "download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/6.4.1"
- },
- {
- "filename": "xrv9k-fullk9-x-6.2.25.qcow2",
- "version": "6.2.25",
- "md5sum": "3f54e62b6f7cedfb2607233e5e465766",
- "filesize": 1190723584,
- "download_url": "https://learningnetworkstore.cisco.com/myaccount"
- },
- {
- "filename": "xrv9k-fullk9-x.qcow2-6.0.1",
- "version": "6.0.1",
- "md5sum": "e20d046807075046c35b6ce7d6766a7f",
- "filesize": 2109210624,
- "download_url": "https://learningnetworkstore.cisco.com/myaccount"
- },
- {
- "filename": "xrv9k-fullk9-x.qcow2-6.0.0",
- "version": "6.0.0",
- "md5sum": "64c538c34252aaeb4ed1ddb93d6803fd",
- "filesize": 2572943360,
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
}
],
"versions": [
+ {
+ "name": "24.3.1",
+ "images": {
+ "hda_disk_image": "xrv9k-fullk9-x-24.3.1.qcow2"
+ }
+ },
{
"name": "7.7.1",
"images": {
@@ -123,66 +66,6 @@
"images": {
"hda_disk_image": "xrv9k-fullk9-x-7.1.1.qcow2"
}
- },
- {
- "name": "7.0.1",
- "images": {
- "hda_disk_image": "xrv9k-fullk9-x-7.0.1.qcow2"
- }
- },
- {
- "name": "6.6.2",
- "images": {
- "hda_disk_image": "xrv9k-fullk9-x-6.6.2.qcow2"
- }
- },
- {
- "name": "6.5.3",
- "images": {
- "hda_disk_image": "xrv9k-fullk9-x-6.5.3.qcow2"
- }
- },
- {
- "name": "6.5.2",
- "images": {
- "hda_disk_image": "xrv9k-fullk9-x-6.5.2.qcow2"
- }
- },
- {
- "name": "6.5.1",
- "images": {
- "hda_disk_image": "xrv9k-fullk9-x-6.5.1.qcow2"
- }
- },
- {
- "name": "6.4.2",
- "images": {
- "hda_disk_image": "xrv9k-fullk9-x-6.4.2.qcow2"
- }
- },
- {
- "name": "6.4.1",
- "images": {
- "hda_disk_image": "xrv9k-fullk9-x-6.4.1.qcow2"
- }
- },
- {
- "name": "6.2.25",
- "images": {
- "hda_disk_image": "xrv9k-fullk9-x-6.2.25.qcow2"
- }
- },
- {
- "name": "6.0.1",
- "images": {
- "hda_disk_image": "xrv9k-fullk9-x.qcow2-6.0.1"
- }
- },
- {
- "name": "6.0.0",
- "images": {
- "hda_disk_image": "xrv9k-fullk9-x.qcow2-6.0.0"
- }
}
]
}
diff --git a/gns3server/appliances/cisco-iou-l2.gns3a b/gns3server/appliances/cisco-iou-l2.gns3a
index 4978d275b..0f6613ac3 100644
--- a/gns3server/appliances/cisco-iou-l2.gns3a
+++ b/gns3server/appliances/cisco-iou-l2.gns3a
@@ -5,7 +5,9 @@
"description": "Cisco IOS on UNIX Layer 2 image.",
"vendor_name": "Cisco",
"vendor_url": "http://www.cisco.com",
+ "documentation_url": "https://developer.cisco.com/docs/modeling-labs/iol-l2/",
"product_name": "Cisco IOU L2",
+ "product_url": "https://developer.cisco.com/modeling-labs/",
"registry_version": 4,
"status": "experimental",
"maintainer": "GNS3 Team",
diff --git a/gns3server/appliances/cisco-iou-l3.gns3a b/gns3server/appliances/cisco-iou-l3.gns3a
index fe686a9c5..262019098 100644
--- a/gns3server/appliances/cisco-iou-l3.gns3a
+++ b/gns3server/appliances/cisco-iou-l3.gns3a
@@ -5,7 +5,9 @@
"description": "Cisco IOS on UNIX Layer 3 image.",
"vendor_name": "Cisco",
"vendor_url": "http://www.cisco.com",
+ "documentation_url": "https://developer.cisco.com/docs/modeling-labs/iol/",
"product_name": "Cisco IOU L3",
+ "product_url": "https://developer.cisco.com/modeling-labs/",
"registry_version": 4,
"status": "experimental",
"maintainer": "GNS3 Team",
diff --git a/gns3server/appliances/cisco-nxosv.gns3a b/gns3server/appliances/cisco-nxosv.gns3a
index c43f2a354..a71b0ad38 100644
--- a/gns3server/appliances/cisco-nxosv.gns3a
+++ b/gns3server/appliances/cisco-nxosv.gns3a
@@ -5,8 +5,9 @@
"description": "NXOSv is a reference platform for an implementation of the Cisco Nexus operating system, based on the Nexus 7000-series platforms, running as a full virtual machine on a hypervisor. This includes NXAPI and MPLS LDP support.",
"vendor_name": "Cisco",
"vendor_url": "http://www.cisco.com/",
+ "documentation_url": "https://developer.cisco.com/docs/modeling-labs/nx-os/",
"product_name": "NX-OSv",
- "product_url": "http://virl.cisco.com/",
+ "product_url": "https://developer.cisco.com/modeling-labs/",
"registry_version": 4,
"status": "stable",
"maintainer": "GNS3 Team",
diff --git a/gns3server/appliances/cisco-nxosv9k.gns3a b/gns3server/appliances/cisco-nxosv9k.gns3a
index 951697fb6..7798233ed 100644
--- a/gns3server/appliances/cisco-nxosv9k.gns3a
+++ b/gns3server/appliances/cisco-nxosv9k.gns3a
@@ -5,8 +5,9 @@
"description": "The NX-OSv 9000 is a virtual platform that is designed to simulate the control plane aspects of a network element running Cisco Nexus 9000 software. The NX-OSv 9000 shares the same software image running on Cisco Nexus 9000 hardware platform although no specific hardware emulation is implemented. When the software runs as a virtual machine, line card (LC) ASIC provisioning or any interaction from the control plane to hardware ASIC is handled by the NX-OSv 9000 software data plane.\nThe NX-OSv 9000 for the Cisco Nexus 9000 Series provides a useful tool to enable the devops model and rapidly test changes to the infrastructure or to infrastructure automation tools. This enables network simulations in large scale for customers to validate configuration changes on a simulated network prior to applying them on a production network. Some users have also expressed interest in using the simulation system for feature test ,verification, and automation tooling development and test simualtion prior to deployment. NX-OSv 9000 can be used as a programmability vehicle to validate software defined networks (SDNs) and Network Function Virtualization (NFV) based solutions.",
"vendor_name": "Cisco",
"vendor_url": "http://www.cisco.com/",
- "documentation_url": "http://www.cisco.com/c/en/us/td/docs/switches/datacenter/nexus9000/sw/7-x/nx-osv/configuration/guide/b_NX-OSv_9000/b_NX-OSv_chapter_01.html",
+ "documentation_url": "https://developer.cisco.com/docs/modeling-labs/nx-os-9000/",
"product_name": "NX-OSv 9000",
+ "product_url": "https://developer.cisco.com/modeling-labs/",
"registry_version": 4,
"status": "stable",
"availability": "service-contract",
@@ -26,12 +27,33 @@
"kvm": "require"
},
"images": [
+ {
+ "filename": "nexus9500v64.10.5.1.F.qcow2",
+ "version": "9500v 10.5.1.F",
+ "md5sum": "2fa6fb4dd4c5e49d53896d60fa746e59",
+ "filesize": 2388459520,
+ "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.5(1)"
+ },
+ {
+ "filename": "nexus9300v64.10.5.1.F.qcow2",
+ "version": "9300v 10.5.1.F",
+ "md5sum": "2bbc767debbc7c1144eabe176ae67503",
+ "filesize": 2388393984,
+ "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.5(1)"
+ },
+ {
+ "filename": "nexus9500v64.10.3.1.F.qcow2",
+ "version": "9500v 10.3.1.F",
+ "md5sum": "41e3c1c0c003b13f1bf774f0d1873e87",
+ "filesize": 2097510400,
+ "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.3(1)"
+ },
{
"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)"
+ "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.3(1)"
},
{
"filename": "nexus9500v64.10.1.1.qcow2",
@@ -47,181 +69,6 @@
"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",
- "md5sum": "30c25039927f89aebe73ea20d15abd6d",
- "filesize": 1980760064,
- "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(9)"
- },
- {
- "filename": "nexus9300v.9.3.9.qcow2",
- "version": "9300v 9.3.9",
- "md5sum": "e807005cb7d2d2957b4af0e59f368b36",
- "filesize": 1980563456,
- "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(9)"
- },
- {
- "filename": "nexus9300v.9.3.8.qcow2",
- "version": "9300v 9.3.8",
- "md5sum": "f8bd834f8395c134dc98d895c98441af",
- "filesize": 1976434688,
- "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(8)"
- },
- {
- "filename": "nexus9500v.9.3.7.qcow2",
- "version": "9500v 9.3.7",
- "md5sum": "65f669e0dd379a05a8cdbb9d7592a064",
- "filesize": 1986068480,
- "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(7)"
- },
- {
- "filename": "nexus9500v.9.3.3.qcow2",
- "version": "9500v 9.3.3",
- "md5sum": "7230c944041fdaa0e1b18cecccbc9a32",
- "filesize": 1714159616,
- "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(3)"
- },
- {
- "filename": "nexus9300v.9.3.3.qcow2",
- "version": "9300v 9.3.3",
- "md5sum": "8e9a7c4815907ef47d850623f77042e2",
- "filesize": 1714225152,
- "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(3)"
- },
- {
- "filename": "nxosv.9.3.1.qcow2",
- "version": "9.3.1",
- "md5sum": "148fd38cb1ff78df2883f844e172fad9",
- "filesize": 1435041792,
- "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(1)?i=!pp"
- },
- {
- "filename": "nxosv-final.9.2.3.qcow2",
- "version": "9.2.3",
- "md5sum": "74bd9a5b4970e868685f753e48979194",
- "filesize": 1357643776,
- "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.2%25283%2529"
- },
- {
- "filename": "nxosv-final.9.2.2.qcow2",
- "version": "9.2.2",
- "md5sum": "2119702c488552fc4d1b4210a04d4f64",
- "filesize": 1344077824,
- "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.2%25281%2529"
- },
- {
- "filename": "nxosv-final.9.2.1.qcow2",
- "version": "9.2.1",
- "md5sum": "1d7fa4654602d7ffbf62544edfe71986",
- "filesize": 1330315264,
- "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.2%25281%2529"
- },
- {
- "filename": "nxosv-final.7.0.3.I7.9.qcow2",
- "version": "7.0.3.I7.9",
- "md5sum": "50678c719f6b822c43dd096dbdf359e8",
- "filesize": 1003618304,
- "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/7.0(3)I7(9)?i=!pp"
- },
- {
- "filename": "nxosv-final.7.0.3.I7.7.qcow2",
- "version": "7.0.3.I7.7",
- "md5sum": "5daab34b672f9534c9aee59a6c8903b3",
- "filesize": 996212736,
- "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/7.0%25283%2529I7%25287%2529"
- },
- {
- "filename": "nxosv-final.7.0.3.I7.6.qcow2",
- "version": "7.0.3.I7.6",
- "md5sum": "a122ee954b4c11761abd99291b70544e",
- "filesize": 1031995392,
- "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/7.0%25283%2529I7%25286%2529"
- },
- {
- "filename": "nxosv-final.7.0.3.I7.5.qcow2",
- "version": "7.0.3.I7.5",
- "md5sum": "68a4008e189c8a35ccb8ee58db9608bb",
- "filesize": 1027670016,
- "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/7.0%25283%2529I7%25285%2529"
- },
- {
- "filename": "nxosv-final.7.0.3.I7.4.qcow2",
- "version": "7.0.3.I7.4",
- "md5sum": "1e980c95ca47045ae45ded6e07fabfb8",
- "filesize": 985792512,
- "download_url": "https://software.cisco.com/download/"
- },
- {
- "filename": "nxosv-final.7.0.3.I7.3.qcow2",
- "version": "7.0.3.I7.3",
- "md5sum": "9d7a20367bf681a239f14097bbce470a",
- "filesize": 983629824,
- "download_url": "https://software.cisco.com/download/"
- },
- {
- "filename": "nxosv-final.7.0.3.I7.2.qcow2",
- "version": "7.0.3.I7.2",
- "md5sum": "17295efb13e83b24a439148449bfd5ab",
- "filesize": 906231808,
- "download_url": "https://software.cisco.com/download/"
- },
- {
- "filename": "nxosv-final.7.0.3.I7.1.qcow2",
- "version": "7.0.3.I7.1",
- "md5sum": "3c122f27d0c3684c63657207eadf4d06",
- "filesize": 903151616,
- "download_url": "https://software.cisco.com/download/"
- },
- {
- "filename": "nxosv-final.7.0.3.I6.1.qcow2",
- "version": "7.0.3.I6.1",
- "md5sum": "18bb991b814a508d1190575f99deed99",
- "filesize": 780402688,
- "download_url": "https://software.cisco.com/download/"
- },
- {
- "filename": "nxosv-final.7.0.3.I5.2.qcow2",
- "version": "7.0.3.I5.2",
- "md5sum": "c06aaa02f758a64fd8fee9406756f1da",
- "filesize": 777715712,
- "download_url": "https://software.cisco.com/download/"
- },
- {
- "filename": "nxosv-final.7.0.3.I5.1.qcow2",
- "version": "7.0.3.I5.1",
- "md5sum": "201ea658fa4c57452ee4b2aa4f5262a7",
- "filesize": 784990208,
- "download_url": "https://software.cisco.com/download/"
- },
{
"filename": "OVMF-edk2-stable202305.fd",
"version": "stable202305",
@@ -233,6 +80,27 @@
}
],
"versions": [
+ {
+ "name": "9500v 10.5.1.F",
+ "images": {
+ "bios_image": "OVMF-edk2-stable202305.fd",
+ "hda_disk_image": "nexus9500v64.10.5.1.F.qcow2"
+ }
+ },
+ {
+ "name": "9300v 10.5.1.F",
+ "images": {
+ "bios_image": "OVMF-edk2-stable202305.fd",
+ "hda_disk_image": "nexus9300v64.10.5.1.F.qcow2"
+ }
+ },
+ {
+ "name": "9500v 10.3.1.F",
+ "images": {
+ "bios_image": "OVMF-edk2-stable202305.fd",
+ "hda_disk_image": "nexus9500v64.10.3.1.F.qcow2"
+ }
+ },
{
"name": "9300v 10.3.1.F",
"images": {
@@ -253,181 +121,6 @@
"bios_image": "OVMF-edk2-stable202305.fd",
"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": {
- "bios_image": "OVMF-edk2-stable202305.fd",
- "hda_disk_image": "nexus9500v.9.3.9.qcow2"
- }
- },
- {
- "name": "9300v 9.3.9",
- "images": {
- "bios_image": "OVMF-edk2-stable202305.fd",
- "hda_disk_image": "nexus9300v.9.3.9.qcow2"
- }
- },
- {
- "name": "9300v 9.3.8",
- "images": {
- "bios_image": "OVMF-edk2-stable202305.fd",
- "hda_disk_image": "nexus9300v.9.3.8.qcow2"
- }
- },
- {
- "name": "9500v 9.3.7",
- "images": {
- "bios_image": "OVMF-edk2-stable202305.fd",
- "hda_disk_image": "nexus9500v.9.3.7.qcow2"
- }
- },
- {
- "name": "9500v 9.3.3",
- "images": {
- "bios_image": "OVMF-edk2-stable202305.fd",
- "hda_disk_image": "nexus9500v.9.3.3.qcow2"
- }
- },
- {
- "name": "9300v 9.3.3",
- "images": {
- "bios_image": "OVMF-edk2-stable202305.fd",
- "hda_disk_image": "nexus9300v.9.3.3.qcow2"
- }
- },
- {
- "name": "9.3.1",
- "images": {
- "bios_image": "OVMF-edk2-stable202305.fd",
- "hda_disk_image": "nxosv.9.3.1.qcow2"
- }
- },
- {
- "name": "9.2.3",
- "images": {
- "bios_image": "OVMF-edk2-stable202305.fd",
- "hda_disk_image": "nxosv-final.9.2.3.qcow2"
- }
- },
- {
- "name": "9.2.2",
- "images": {
- "bios_image": "OVMF-edk2-stable202305.fd",
- "hda_disk_image": "nxosv-final.9.2.2.qcow2"
- }
- },
- {
- "name": "9.2.1",
- "images": {
- "bios_image": "OVMF-edk2-stable202305.fd",
- "hda_disk_image": "nxosv-final.9.2.1.qcow2"
- }
- },
- {
- "name": "7.0.3.I7.9",
- "images": {
- "bios_image": "OVMF-edk2-stable202305.fd",
- "hda_disk_image": "nxosv-final.7.0.3.I7.9.qcow2"
- }
- },
- {
- "name": "7.0.3.I7.7",
- "images": {
- "bios_image": "OVMF-edk2-stable202305.fd",
- "hda_disk_image": "nxosv-final.7.0.3.I7.7.qcow2"
- }
- },
- {
- "name": "7.0.3.I7.6",
- "images": {
- "bios_image": "OVMF-edk2-stable202305.fd",
- "hda_disk_image": "nxosv-final.7.0.3.I7.6.qcow2"
- }
- },
- {
- "name": "7.0.3.I7.5",
- "images": {
- "bios_image": "OVMF-edk2-stable202305.fd",
- "hda_disk_image": "nxosv-final.7.0.3.I7.5.qcow2"
- }
- },
- {
- "name": "7.0.3.I7.4",
- "images": {
- "bios_image": "OVMF-edk2-stable202305.fd",
- "hda_disk_image": "nxosv-final.7.0.3.I7.4.qcow2"
- }
- },
- {
- "name": "7.0.3.I7.3",
- "images": {
- "bios_image": "OVMF-edk2-stable202305.fd",
- "hda_disk_image": "nxosv-final.7.0.3.I7.3.qcow2"
- }
- },
- {
- "name": "7.0.3.I7.2",
- "images": {
- "bios_image": "OVMF-edk2-stable202305.fd",
- "hda_disk_image": "nxosv-final.7.0.3.I7.2.qcow2"
- }
- },
- {
- "name": "7.0.3.I7.1",
- "images": {
- "bios_image": "OVMF-edk2-stable202305.fd",
- "hda_disk_image": "nxosv-final.7.0.3.I7.1.qcow2"
- }
- },
- {
- "name": "7.0.3.I6.1",
- "images": {
- "bios_image": "OVMF-edk2-stable202305.fd",
- "hda_disk_image": "nxosv-final.7.0.3.I6.1.qcow2"
- }
- },
- {
- "name": "7.0.3.I5.2",
- "images": {
- "bios_image": "OVMF-edk2-stable202305.fd",
- "hda_disk_image": "nxosv-final.7.0.3.I5.2.qcow2"
- }
- },
- {
- "name": "7.0.3.I5.1",
- "images": {
- "bios_image": "OVMF-edk2-stable202305.fd",
- "hda_disk_image": "nxosv-final.7.0.3.I5.1.qcow2"
- }
}
]
}
diff --git a/gns3server/appliances/fortianalyzer.gns3a b/gns3server/appliances/fortianalyzer.gns3a
index 9bbed071c..7ca84c9f1 100644
--- a/gns3server/appliances/fortianalyzer.gns3a
+++ b/gns3server/appliances/fortianalyzer.gns3a
@@ -29,6 +29,27 @@
"kvm": "allow"
},
"images": [
+ {
+ "filename": "FAZ_VM64_KVM-v7.4.6.M-build2588-FORTINET.out.kvm.qcow2",
+ "version": "7.4.6",
+ "md5sum": "fba982436ff430465df6f6f283a2bd71",
+ "filesize": 511053824,
+ "download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
+ },
+ {
+ "filename": "FAZ_VM64_KVM-v7.4.5.M-build2553-FORTINET.out.kvm.qcow2",
+ "version": "7.4.5",
+ "md5sum": "78464ee460fce69c360901ca9ccfe4a0",
+ "filesize": 510988288,
+ "download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
+ },
+ {
+ "filename": "FAZ_VM64_KVM-v7.4.4.F-build2550-FORTINET.out.kvm.qcow2",
+ "version": "7.4.4",
+ "md5sum": "7bec1725b1e39dd66f4daae07492f1b4",
+ "filesize": 511217664,
+ "download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
+ },
{
"filename": "FAZ_VM64_KVM-v7.4.3-build2487-FORTINET.out.kvm.qcow2",
"version": "7.4.3",
@@ -277,6 +298,27 @@
}
],
"versions": [
+ {
+ "name": "7.4.6",
+ "images": {
+ "hda_disk_image": "FAZ_VM64_KVM-v7.4.6.M-build2588-FORTINET.out.kvm.qcow2",
+ "hdb_disk_image": "empty30G.qcow2"
+ }
+ },
+ {
+ "name": "7.4.5",
+ "images": {
+ "hda_disk_image": "FAZ_VM64_KVM-v7.4.5.M-build2553-FORTINET.out.kvm.qcow2",
+ "hdb_disk_image": "empty30G.qcow2"
+ }
+ },
+ {
+ "name": "7.4.4",
+ "images": {
+ "hda_disk_image": "FAZ_VM64_KVM-v7.4.4.F-build2550-FORTINET.out.kvm.qcow2",
+ "hdb_disk_image": "empty30G.qcow2"
+ }
+ },
{
"name": "7.4.3",
"images": {
diff --git a/gns3server/appliances/fortigate.gns3a b/gns3server/appliances/fortigate.gns3a
index 102bf096b..e3874bbdd 100644
--- a/gns3server/appliances/fortigate.gns3a
+++ b/gns3server/appliances/fortigate.gns3a
@@ -28,6 +28,27 @@
"kvm": "allow"
},
"images": [
+ {
+ "filename": "FGT_VM64_KVM-v7.4.7.M-build2731-FORTINET.out.kvm.qcow2",
+ "version": "7.4.7",
+ "md5sum": "2ce4039789e84b3fe85565e0c4110718",
+ "filesize": 103677952,
+ "download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
+ },
+ {
+ "filename": "FGT_VM64_KVM-v7.4.6.M-build2726-FORTINET.out.kvm.qcow2",
+ "version": "7.4.6",
+ "md5sum": "b787c1c5ab365f267d7e4e88b1cdc10b",
+ "filesize": 103677952,
+ "download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
+ },
+ {
+ "filename": "FGT_VM64_KVM-v7.4.5.M-build2702-FORTINET.out.kvm.qcow2",
+ "version": "7.4.5",
+ "md5sum": "8465e74c4ef1751619ebb989838d457c",
+ "filesize": 102367232,
+ "download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
+ },
{
"filename": "FGT_VM64_KVM-v7.4.4.F-build2662-FORTINET.out.kvm.qcow2",
"version": "7.4.4",
@@ -388,6 +409,27 @@
}
],
"versions": [
+ {
+ "name": "7.4.7",
+ "images": {
+ "hda_disk_image": "FGT_VM64_KVM-v7.4.7.M-build2731-FORTINET.out.kvm.qcow2",
+ "hdb_disk_image": "empty30G.qcow2"
+ }
+ },
+ {
+ "name": "7.4.6",
+ "images": {
+ "hda_disk_image": "FGT_VM64_KVM-v7.4.6.M-build2726-FORTINET.out.kvm.qcow2",
+ "hdb_disk_image": "empty30G.qcow2"
+ }
+ },
+ {
+ "name": "7.4.5",
+ "images": {
+ "hda_disk_image": "FGT_VM64_KVM-v7.4.5.M-build2702-FORTINET.out.kvm.qcow2",
+ "hdb_disk_image": "empty30G.qcow2"
+ }
+ },
{
"name": "7.4.4",
"images": {
diff --git a/gns3server/appliances/fortimanager.gns3a b/gns3server/appliances/fortimanager.gns3a
index 15b13a20b..b5de0248e 100644
--- a/gns3server/appliances/fortimanager.gns3a
+++ b/gns3server/appliances/fortimanager.gns3a
@@ -29,9 +29,30 @@
"kvm": "allow"
},
"images": [
+ {
+ "filename": "FMG_VM64_KVM-v7.4.6.M-build2588-FORTINET.out.kvm.qcow2",
+ "version": "7.4.6",
+ "md5sum": "7cb219e1070d393f61cf750d818b23b1",
+ "filesize": 349122560,
+ "download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
+ },
+ {
+ "filename": "FMG_VM64_KVM-v7.4.5.M-build2553-FORTINET.out.kvm.qcow2",
+ "version": "7.4.5",
+ "md5sum": "fa59ddce0cb933741f16866472026723",
+ "filesize": 349769728,
+ "download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
+ },
+ {
+ "filename": "FMG_VM64_KVM-v7.4.4.F-build2550-FORTINET.out.kvm.qcow2",
+ "version": "7.4.4",
+ "md5sum": "770727bb30555e6938308bbf95f19555",
+ "filesize": 349847552,
+ "download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
+ },
{
"filename": "FMG_VM64_KVM-v7.4.3-build2487-FORTINET.out.kvm.qcow2",
- "version": "7.4.23",
+ "version": "7.4.3",
"md5sum": "b01d9f86aa27c538407d518df1326863",
"filesize": 346107904,
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
@@ -277,6 +298,27 @@
}
],
"versions": [
+ {
+ "name": "7.4.6",
+ "images": {
+ "hda_disk_image": "FMG_VM64_KVM-v7.4.6.M-build2588-FORTINET.out.kvm.qcow2",
+ "hdb_disk_image": "empty30G.qcow2"
+ }
+ },
+ {
+ "name": "7.4.5",
+ "images": {
+ "hda_disk_image": "FMG_VM64_KVM-v7.4.5.M-build2553-FORTINET.out.kvm.qcow2",
+ "hdb_disk_image": "empty30G.qcow2"
+ }
+ },
+ {
+ "name": "7.4.4",
+ "images": {
+ "hda_disk_image": "FMG_VM64_KVM-v7.4.4.F-build2550-FORTINET.out.kvm.qcow2",
+ "hdb_disk_image": "empty30G.qcow2"
+ }
+ },
{
"name": "7.4.3",
"images": {
diff --git a/gns3server/appliances/infix.gns3a b/gns3server/appliances/infix.gns3a
new file mode 100644
index 000000000..1fb796d5b
--- /dev/null
+++ b/gns3server/appliances/infix.gns3a
@@ -0,0 +1,75 @@
+{
+ "appliance_id": "4d351078-c6f5-444c-ab30-0ef20e3d8c53",
+ "name": "Infix",
+ "category": "router",
+ "description": "Infix is a Network Operating System based on Linux. It can be set up both as a switch, with offloading using switchdev, and a router with firewalling.",
+ "vendor_name": "KernelKit",
+ "vendor_url": "https://github.com/kernelkit",
+ "vendor_logo_url": "https://kernelkit.org/assets/img/jack.png",
+ "product_name": "Infix",
+ "registry_version": 4,
+ "documentation_url": "https://github.com/kernelkit/infix/tree/main/doc",
+ "status": "stable",
+ "availability": "free",
+ "maintainer": "KernelKit",
+ "maintainer_email": "kernelkit@googlegroups.com",
+ "usage": "Default login, user/pass: admin/admin\n\nType 'cli' (and Enter) followed by 'help' for an overview of commands and relevant configuration files.",
+ "port_name_format": "eth{0}",
+ "linked_clone": true,
+ "symbol": "router_red.svg",
+ "qemu": {
+ "adapter_type": "virtio-net-pci",
+ "adapters": 10,
+ "ram": 512,
+ "cpus": 1,
+ "hda_disk_interface": "virtio",
+ "arch": "x86_64",
+ "console_type": "telnet",
+ "process_priority": "normal",
+ "kvm": "allow"
+ },
+ "images": [
+ {
+ "filename": "OVMF-edk2-stable202305.fd",
+ "version": "stable202305",
+ "md5sum": "6c4cf1519fec4a4b95525d9ae562963a",
+ "filesize": 4194304,
+ "download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/",
+ "direct_download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/OVMF-edk2-stable202305.fd.zip/download",
+ "compression": "zip"
+ },
+ {
+ "filename": "infix-x86_64-disk-24.11.1.img",
+ "filesize": 536870912,
+ "md5sum": "673a123fe122d1c2f5724baf9965a19d",
+ "version": "24.11.1",
+ "download_url": "https://github.com/kernelkit/infix/releases/download/v24.11.1/infix-x86_64-24.11.1.tar.gz",
+ "compression": "gzip"
+ },
+ {
+ "filename": "infix-x86_64-disk-25.01.0.img",
+ "filesize": 536870912,
+ "md5sum": "a814d93b385116b4a35712c445b5f830",
+ "version": "25.01.0",
+ "download_url": "https://github.com/kernelkit/infix/releases/download/v25.01.0/infix-x86_64-25.01.0.tar.gz",
+ "compression": "gzip"
+ }
+
+ ],
+ "versions": [
+ {
+ "name": "25.01.0",
+ "images": {
+ "bios_image": "OVMF-edk2-stable202305.fd",
+ "hda_disk_image": "infix-x86_64-disk-25.01.0.img"
+ }
+ },
+ {
+ "name": "24.11.1",
+ "images": {
+ "bios_image": "OVMF-edk2-stable202305.fd",
+ "hda_disk_image": "infix-x86_64-disk-24.11.1.img"
+ }
+ }
+ ]
+}
diff --git a/gns3server/appliances/stormshield-eva.gns3a b/gns3server/appliances/stormshield-eva.gns3a
new file mode 100644
index 000000000..20f71cf1f
--- /dev/null
+++ b/gns3server/appliances/stormshield-eva.gns3a
@@ -0,0 +1,50 @@
+{
+ "appliance_id": "60801097-332e-4f40-a63e-8ad62047c01f",
+ "name": "Stormshield EVA",
+ "category": "firewall",
+ "description": "Stormshield EVA (Elastic Virtual Appliance) is a french virtual firewall designed to protect network infrastructures. It offers advanced features such as filtering, intrusion prevention (IPS), VPN management (IPSec/SSL), and access control.",
+ "vendor_name": "Stormshield",
+ "vendor_url": "https://www.stormshield.com/",
+ "vendor_logo_url": "https://www.stormshield.com/wp-content/uploads/stormshield-logo.png",
+ "documentation_url": "https://www.stormshield.com/fr/ressourcescenter/network-security-elastic-virtual-appliances/",
+ "product_name": "Stormshield EVA",
+ "product_url": "https://www.stormshield.com/fr/produits-et-services/produits/protection-des-reseaux/nos-produits/appliances-virtuelles/",
+ "registry_version": 4,
+ "status": "stable",
+ "availability": "service-contract",
+ "maintainer": "Samy SCANNA",
+ "maintainer_email": "samy.scanna@outlook.com",
+ "usage": "After the first boot, the appliance automatically runs the configuration script to set up the password, and network interfaces.",
+ "symbol": "stormshield.png",
+ "port_name_format": "port{port1}",
+ "qemu": {
+ "adapter_type": "vmxnet3",
+ "adapters": 8,
+ "ram": 2048,
+ "cpus": 1,
+ "hda_disk_interface": "scsi",
+ "arch": "x86_64",
+ "console_type": "telnet",
+ "kvm": "allow",
+ "options": "-serial stdio",
+ "on_close": "shutdown_signal",
+ "process_priority": "normal"
+ },
+ "images": [
+ {
+ "filename": "utm-SNS-EVA-4.3.33-kvm.qcow2",
+ "version": "4.3.33",
+ "md5sum": "21d94d0e20f2e270f06c5853fd750d5b",
+ "filesize": 284360704,
+ "download_url": "https://mystormshield.eu/product/download/"
+ }
+ ],
+ "versions": [
+ {
+ "images": {
+ "hda_disk_image": "utm-SNS-EVA-4.3.33-kvm.qcow2"
+ },
+ "name": "4.3.33"
+ }
+ ]
+}
diff --git a/gns3server/appliances/vyos.gns3a b/gns3server/appliances/vyos.gns3a
index aade8d863..cace44ed3 100644
--- a/gns3server/appliances/vyos.gns3a
+++ b/gns3server/appliances/vyos.gns3a
@@ -30,6 +30,13 @@
"on_close": "shutdown_signal"
},
"images": [
+ {
+ "filename": "vyos-1.4.1-kvm-amd64.qcow2",
+ "version": "1.4.1",
+ "md5sum": "5b8ebcd9905719d24405ed093afdd8ba",
+ "filesize": 513736704,
+ "download_url": "https://support.vyos.io/"
+ },
{
"filename": "vyos-1.4.0-kvm-amd64.qcow2",
"version": "1.4.0",
@@ -109,6 +116,12 @@
}
],
"versions": [
+ {
+ "name": "1.4.1",
+ "images": {
+ "hda_disk_image": "vyos-1.4.1-kvm-amd64.qcow2"
+ }
+ },
{
"name": "1.4.0",
"images": {
diff --git a/gns3server/compute/virtualbox/virtualbox_vm.py b/gns3server/compute/virtualbox/virtualbox_vm.py
index a9e156b6f..5f4cd2923 100644
--- a/gns3server/compute/virtualbox/virtualbox_vm.py
+++ b/gns3server/compute/virtualbox/virtualbox_vm.py
@@ -233,32 +233,36 @@ class VirtualBoxVM(BaseNode):
"""
Fix the VM uuid in the case of linked clone
"""
- if os.path.exists(self._linked_vbox_file()):
- try:
- tree = ET.parse(self._linked_vbox_file())
- except ET.ParseError:
- raise VirtualBoxError(
- "Cannot modify VirtualBox linked nodes file. "
- "File {} is corrupted.".format(self._linked_vbox_file())
+
+ linked_vbox_file = self._linked_vbox_file()
+ if not os.path.exists(linked_vbox_file):
+ raise VirtualBoxError("Cannot find VirtualBox linked node file: {}".format(linked_vbox_file))
+
+ try:
+ tree = ET.parse(linked_vbox_file)
+ except ET.ParseError:
+ raise VirtualBoxError(f"Cannot modify VirtualBox linked node file. "
+ "File {linked_vbox_file} is corrupted.")
+ except OSError as e:
+ raise VirtualBoxError(f"Cannot modify VirtualBox linked nodes file '{self._linked_vbox_file()}': {e}")
+
+ machine = tree.getroot().find("{http://www.virtualbox.org/}Machine")
+ if machine is not None and machine.get("uuid") != "{" + self.id + "}":
+
+ for image in tree.getroot().findall("{http://www.virtualbox.org/}Image"):
+ currentSnapshot = machine.get("currentSnapshot")
+ if currentSnapshot:
+ newSnapshot = re.sub(r"\{.*\}", "{" + str(uuid.uuid4()) + "}", currentSnapshot)
+ shutil.move(
+ os.path.join(self.working_dir, self._vmname, "Snapshots", currentSnapshot) + ".vdi",
+ os.path.join(self.working_dir, self._vmname, "Snapshots", newSnapshot) + ".vdi"
)
- except OSError as e:
- raise VirtualBoxError(f"Cannot modify VirtualBox linked nodes file '{self._linked_vbox_file()}': {e}")
+ log.info(f"VirtualBox VM '{self.name}' [{self.id}] snapshot file moved from '{currentSnapshot}' to '{newSnapshot}'")
+ image.set("uuid", newSnapshot)
- machine = tree.getroot().find("{http://www.virtualbox.org/}Machine")
- if machine is not None and machine.get("uuid") != "{" + self.id + "}":
-
- for image in tree.getroot().findall("{http://www.virtualbox.org/}Image"):
- currentSnapshot = machine.get("currentSnapshot")
- if currentSnapshot:
- newSnapshot = re.sub(r"\{.*\}", "{" + str(uuid.uuid4()) + "}", currentSnapshot)
- shutil.move(
- os.path.join(self.working_dir, self._vmname, "Snapshots", currentSnapshot) + ".vdi",
- os.path.join(self.working_dir, self._vmname, "Snapshots", newSnapshot) + ".vdi",
- )
- image.set("uuid", newSnapshot)
-
- machine.set("uuid", "{" + self.id + "}")
- tree.write(self._linked_vbox_file())
+ log.info(f"VirtualBox VM '{self.name}' [{self.id}] '{linked_vbox_file}' has been patched")
+ machine.set("uuid", "{" + self.id + "}")
+ tree.write(linked_vbox_file)
async def check_hw_virtualization(self):
"""
@@ -488,7 +492,7 @@ class VirtualBoxVM(BaseNode):
async def save_linked_hdds_info(self):
"""
- Save linked cloned hard disks information.
+ Save linked cloned hard disk information.
:returns: disk table information
"""
diff --git a/gns3server/compute/vmware/vmware_vm.py b/gns3server/compute/vmware/vmware_vm.py
index 62a03aa9f..22e766b63 100644
--- a/gns3server/compute/vmware/vmware_vm.py
+++ b/gns3server/compute/vmware/vmware_vm.py
@@ -352,6 +352,7 @@ class VMwareVM(BaseNode):
vnet = self._get_vnet(adapter_number)
await self._ubridge_send(f"bridge create {vnet}")
vmnet_interface = os.path.basename(self._vmx_pairs[vnet])
+ block_host_traffic = self.manager.config.settings.VMware.block_host_traffic
if sys.platform.startswith("darwin"):
if parse_version(platform.mac_ver()[0]) >= parse_version("11.0.0"):
@@ -360,13 +361,11 @@ class VMwareVM(BaseNode):
vmnet_interface = self.manager.find_bridge_interface(vmnet_interface)
if not vmnet_interface:
raise VMwareError(f"Could not find bridge interface linked with {vmnet_interface}")
- block_host_traffic = self.manager.config.get_section_config("VMware").getboolean("block_host_traffic", False)
await self._add_ubridge_ethernet_connection(vnet, vmnet_interface, block_host_traffic)
else:
# special case on macOS, we cannot bind VMnet interfaces using the libpcap
await self._ubridge_send('bridge add_nio_fusion_vmnet {name} "{interface}"'.format(name=vnet, interface=vmnet_interface))
else:
- block_host_traffic = self.manager.config.VMware.block_host_traffic
await self._add_ubridge_ethernet_connection(vnet, vmnet_interface, block_host_traffic)
if isinstance(nio, NIOUDP):
diff --git a/gns3server/controller/__init__.py b/gns3server/controller/__init__.py
index f14c403ac..539121a42 100644
--- a/gns3server/controller/__init__.py
+++ b/gns3server/controller/__init__.py
@@ -74,6 +74,7 @@ class Controller:
log.info("Controller is starting")
await self._install_base_configs()
+ await self._install_custom_symbols()
installed_disks = await self._install_builtin_disks()
if installed_disks:
await update_disk_checksums(installed_disks)
@@ -371,6 +372,19 @@ class Controller:
except OSError as e:
log.error(f"Could not install disk files to {dst_path}: {e}")
+ async def _install_custom_symbols(self):
+ """
+ At startup we copy custom symbols to the user location to allow
+ them to use with appliances
+ """
+
+ dst_path = self.symbols.symbols_path()
+ log.info(f"Installing custom symbols in '{dst_path}'")
+ try:
+ return await Controller.install_resource_files(dst_path, "custom_symbols", upgrade_resources=False)
+ except OSError as e:
+ log.error(f"Could not install custom symbols to {dst_path}: {e}")
+
def images_path(self):
"""
Get the image storage directory
diff --git a/gns3server/crash_report.py b/gns3server/crash_report.py
index 403740f4c..cdb02766d 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://9cf53e6b9adfe49b867f1847b7cc4d72@o19455.ingest.us.sentry.io/38482"
+ DSN = "https://0d64280ffb5ae409d448f255b9956a88@o19455.ingest.us.sentry.io/38482"
_instance = None
def __init__(self):
diff --git a/gns3server/custom_symbols/6wind.svg b/gns3server/custom_symbols/6wind.svg
new file mode 100644
index 000000000..8fed8f44a
--- /dev/null
+++ b/gns3server/custom_symbols/6wind.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gns3server/custom_symbols/alpine-virt-qemu.svg b/gns3server/custom_symbols/alpine-virt-qemu.svg
new file mode 100644
index 000000000..5ca18f23b
--- /dev/null
+++ b/gns3server/custom_symbols/alpine-virt-qemu.svg
@@ -0,0 +1,46 @@
+
+
\ No newline at end of file
diff --git a/gns3server/custom_symbols/arista_bybaro.svg b/gns3server/custom_symbols/arista_bybaro.svg
new file mode 100644
index 000000000..681ef610e
--- /dev/null
+++ b/gns3server/custom_symbols/arista_bybaro.svg
@@ -0,0 +1,24 @@
+
+
\ No newline at end of file
diff --git a/gns3server/custom_symbols/asterfusion-vAsterNOS.svg b/gns3server/custom_symbols/asterfusion-vAsterNOS.svg
new file mode 100644
index 000000000..ffde2a3f4
--- /dev/null
+++ b/gns3server/custom_symbols/asterfusion-vAsterNOS.svg
@@ -0,0 +1,48 @@
+
+
\ No newline at end of file
diff --git a/gns3server/custom_symbols/cisco-fmcv.svg b/gns3server/custom_symbols/cisco-fmcv.svg
new file mode 100644
index 000000000..7351a5df6
--- /dev/null
+++ b/gns3server/custom_symbols/cisco-fmcv.svg
@@ -0,0 +1,498 @@
+
+
+
+
diff --git a/gns3server/custom_symbols/cisco-ise.svg b/gns3server/custom_symbols/cisco-ise.svg
new file mode 100644
index 000000000..9519b29bc
--- /dev/null
+++ b/gns3server/custom_symbols/cisco-ise.svg
@@ -0,0 +1,244 @@
+
+
+
+
diff --git a/gns3server/custom_symbols/csr1000v_bybaro.svg b/gns3server/custom_symbols/csr1000v_bybaro.svg
new file mode 100644
index 000000000..2b8359e98
--- /dev/null
+++ b/gns3server/custom_symbols/csr1000v_bybaro.svg
@@ -0,0 +1,38 @@
+
+
\ No newline at end of file
diff --git a/gns3server/custom_symbols/cumulus_bybaro.svg b/gns3server/custom_symbols/cumulus_bybaro.svg
new file mode 100644
index 000000000..0647b3937
--- /dev/null
+++ b/gns3server/custom_symbols/cumulus_bybaro.svg
@@ -0,0 +1,27 @@
+
+
\ No newline at end of file
diff --git a/gns3server/custom_symbols/firefox.svg b/gns3server/custom_symbols/firefox.svg
new file mode 100644
index 000000000..963971d12
--- /dev/null
+++ b/gns3server/custom_symbols/firefox.svg
@@ -0,0 +1 @@
+
diff --git a/gns3server/custom_symbols/fortigate_bybaro.svg b/gns3server/custom_symbols/fortigate_bybaro.svg
new file mode 100644
index 000000000..f6c884e67
--- /dev/null
+++ b/gns3server/custom_symbols/fortigate_bybaro.svg
@@ -0,0 +1,42 @@
+
+
\ No newline at end of file
diff --git a/gns3server/custom_symbols/fortinet.svg b/gns3server/custom_symbols/fortinet.svg
new file mode 100644
index 000000000..63b4292c1
--- /dev/null
+++ b/gns3server/custom_symbols/fortinet.svg
@@ -0,0 +1,72 @@
+
+
+
+
+
+
diff --git a/gns3server/custom_symbols/innovaphone-ap-icon.jpg b/gns3server/custom_symbols/innovaphone-ap-icon.jpg
new file mode 100644
index 000000000..91559e2e5
Binary files /dev/null and b/gns3server/custom_symbols/innovaphone-ap-icon.jpg differ
diff --git a/gns3server/custom_symbols/innovaphone-pbx-green.png b/gns3server/custom_symbols/innovaphone-pbx-green.png
new file mode 100644
index 000000000..39be96cda
Binary files /dev/null and b/gns3server/custom_symbols/innovaphone-pbx-green.png differ
diff --git a/gns3server/custom_symbols/juniper-vmx.svg b/gns3server/custom_symbols/juniper-vmx.svg
new file mode 100644
index 000000000..a860333ca
--- /dev/null
+++ b/gns3server/custom_symbols/juniper-vmx.svg
@@ -0,0 +1,284 @@
+
+
+
+
diff --git a/gns3server/custom_symbols/juniper-vqfx.svg b/gns3server/custom_symbols/juniper-vqfx.svg
new file mode 100644
index 000000000..1c37224e4
--- /dev/null
+++ b/gns3server/custom_symbols/juniper-vqfx.svg
@@ -0,0 +1,324 @@
+
+
+
+
diff --git a/gns3server/custom_symbols/junos_olive_bybaro.svg b/gns3server/custom_symbols/junos_olive_bybaro.svg
new file mode 100644
index 000000000..ae288e7fd
--- /dev/null
+++ b/gns3server/custom_symbols/junos_olive_bybaro.svg
@@ -0,0 +1,18 @@
+
+
+
diff --git a/gns3server/custom_symbols/linux_guest.svg b/gns3server/custom_symbols/linux_guest.svg
new file mode 100755
index 000000000..c18dbb73c
--- /dev/null
+++ b/gns3server/custom_symbols/linux_guest.svg
@@ -0,0 +1,1917 @@
+
+
+
+
diff --git a/gns3server/custom_symbols/loadbalancer.svg b/gns3server/custom_symbols/loadbalancer.svg
new file mode 100644
index 000000000..bc4462653
--- /dev/null
+++ b/gns3server/custom_symbols/loadbalancer.svg
@@ -0,0 +1,380 @@
+
+
+
+
diff --git a/gns3server/custom_symbols/loadbalancer_docker.svg b/gns3server/custom_symbols/loadbalancer_docker.svg
new file mode 100644
index 000000000..9eb0accbc
--- /dev/null
+++ b/gns3server/custom_symbols/loadbalancer_docker.svg
@@ -0,0 +1,387 @@
+
+
+
+
diff --git a/gns3server/custom_symbols/mgmt_station.svg b/gns3server/custom_symbols/mgmt_station.svg
new file mode 100644
index 000000000..b307ee145
--- /dev/null
+++ b/gns3server/custom_symbols/mgmt_station.svg
@@ -0,0 +1,1967 @@
+
+
+
+
diff --git a/gns3server/custom_symbols/mgmt_station_docker.svg b/gns3server/custom_symbols/mgmt_station_docker.svg
new file mode 100644
index 000000000..6904a2bbe
--- /dev/null
+++ b/gns3server/custom_symbols/mgmt_station_docker.svg
@@ -0,0 +1,1996 @@
+
+
+
+
diff --git a/gns3server/custom_symbols/microsoft.svg b/gns3server/custom_symbols/microsoft.svg
new file mode 100644
index 000000000..31d166e2a
--- /dev/null
+++ b/gns3server/custom_symbols/microsoft.svg
@@ -0,0 +1,85 @@
+
+
diff --git a/gns3server/custom_symbols/multilayer_switch_docker.svg b/gns3server/custom_symbols/multilayer_switch_docker.svg
new file mode 100644
index 000000000..39a7bb7dd
--- /dev/null
+++ b/gns3server/custom_symbols/multilayer_switch_docker.svg
@@ -0,0 +1,332 @@
+
+
+
+
diff --git a/gns3server/custom_symbols/multilayer_switch_green_docker.svg b/gns3server/custom_symbols/multilayer_switch_green_docker.svg
new file mode 100644
index 000000000..c05ed9d0f
--- /dev/null
+++ b/gns3server/custom_symbols/multilayer_switch_green_docker.svg
@@ -0,0 +1,344 @@
+
+
+
+
diff --git a/gns3server/custom_symbols/multilayer_switch_red_docker.svg b/gns3server/custom_symbols/multilayer_switch_red_docker.svg
new file mode 100644
index 000000000..cd90c87f0
--- /dev/null
+++ b/gns3server/custom_symbols/multilayer_switch_red_docker.svg
@@ -0,0 +1,344 @@
+
+
+
+
diff --git a/gns3server/custom_symbols/opennac.png b/gns3server/custom_symbols/opennac.png
new file mode 100644
index 000000000..16a0402b6
Binary files /dev/null and b/gns3server/custom_symbols/opennac.png differ
diff --git a/gns3server/custom_symbols/opensuse.svg b/gns3server/custom_symbols/opensuse.svg
new file mode 100644
index 000000000..0126e2aff
--- /dev/null
+++ b/gns3server/custom_symbols/opensuse.svg
@@ -0,0 +1,126 @@
+
+
diff --git a/gns3server/custom_symbols/openvswitch_bybaro.svg b/gns3server/custom_symbols/openvswitch_bybaro.svg
new file mode 100644
index 000000000..e75e27af6
--- /dev/null
+++ b/gns3server/custom_symbols/openvswitch_bybaro.svg
@@ -0,0 +1,26 @@
+
+
\ No newline at end of file
diff --git a/gns3server/custom_symbols/ostinato-3d-icon.svg b/gns3server/custom_symbols/ostinato-3d-icon.svg
new file mode 100644
index 000000000..6f36ce436
--- /dev/null
+++ b/gns3server/custom_symbols/ostinato-3d-icon.svg
@@ -0,0 +1,95 @@
+
+
+
+
\ No newline at end of file
diff --git a/gns3server/custom_symbols/packetfence2.png b/gns3server/custom_symbols/packetfence2.png
new file mode 100644
index 000000000..9a1642154
Binary files /dev/null and b/gns3server/custom_symbols/packetfence2.png differ
diff --git a/gns3server/custom_symbols/pan-vm-fw.svg b/gns3server/custom_symbols/pan-vm-fw.svg
new file mode 100644
index 000000000..d7a7c3d25
--- /dev/null
+++ b/gns3server/custom_symbols/pan-vm-fw.svg
@@ -0,0 +1,364 @@
+
+
+
+
diff --git a/gns3server/custom_symbols/parrotlogo.png b/gns3server/custom_symbols/parrotlogo.png
new file mode 100644
index 000000000..d5ebf082c
Binary files /dev/null and b/gns3server/custom_symbols/parrotlogo.png differ
diff --git a/gns3server/custom_symbols/qemu_guest_win10_bybaro.svg b/gns3server/custom_symbols/qemu_guest_win10_bybaro.svg
new file mode 100644
index 000000000..4bf151c67
--- /dev/null
+++ b/gns3server/custom_symbols/qemu_guest_win10_bybaro.svg
@@ -0,0 +1,56 @@
+
+
\ No newline at end of file
diff --git a/gns3server/custom_symbols/qemu_guest_win7_bybaro.svg b/gns3server/custom_symbols/qemu_guest_win7_bybaro.svg
new file mode 100644
index 000000000..e365abbdd
--- /dev/null
+++ b/gns3server/custom_symbols/qemu_guest_win7_bybaro.svg
@@ -0,0 +1,59 @@
+
+
\ No newline at end of file
diff --git a/gns3server/custom_symbols/qemu_guest_win8_bybaro.svg b/gns3server/custom_symbols/qemu_guest_win8_bybaro.svg
new file mode 100644
index 000000000..df2aac00c
--- /dev/null
+++ b/gns3server/custom_symbols/qemu_guest_win8_bybaro.svg
@@ -0,0 +1,56 @@
+
+
\ No newline at end of file
diff --git a/gns3server/custom_symbols/router_docker.svg b/gns3server/custom_symbols/router_docker.svg
new file mode 100644
index 000000000..fce3f9fa4
--- /dev/null
+++ b/gns3server/custom_symbols/router_docker.svg
@@ -0,0 +1,213 @@
+
+
+
+
diff --git a/gns3server/custom_symbols/router_green.svg b/gns3server/custom_symbols/router_green.svg
new file mode 100644
index 000000000..3f8ce6feb
--- /dev/null
+++ b/gns3server/custom_symbols/router_green.svg
@@ -0,0 +1,206 @@
+
+
+
+
diff --git a/gns3server/custom_symbols/router_green_docker.svg b/gns3server/custom_symbols/router_green_docker.svg
new file mode 100644
index 000000000..3a4cb0f0e
--- /dev/null
+++ b/gns3server/custom_symbols/router_green_docker.svg
@@ -0,0 +1,665 @@
+
+
+
+
diff --git a/gns3server/custom_symbols/router_red.svg b/gns3server/custom_symbols/router_red.svg
new file mode 100644
index 000000000..fae98c629
--- /dev/null
+++ b/gns3server/custom_symbols/router_red.svg
@@ -0,0 +1,206 @@
+
+
+
+
diff --git a/gns3server/custom_symbols/router_red_docker.svg b/gns3server/custom_symbols/router_red_docker.svg
new file mode 100644
index 000000000..aa7e7f6ea
--- /dev/null
+++ b/gns3server/custom_symbols/router_red_docker.svg
@@ -0,0 +1,213 @@
+
+
+
+
diff --git a/gns3server/custom_symbols/rpi.png b/gns3server/custom_symbols/rpi.png
new file mode 100644
index 000000000..4755aa46c
Binary files /dev/null and b/gns3server/custom_symbols/rpi.png differ
diff --git a/gns3server/custom_symbols/securityonion-logo.png b/gns3server/custom_symbols/securityonion-logo.png
new file mode 100644
index 000000000..d5ecfc92f
Binary files /dev/null and b/gns3server/custom_symbols/securityonion-logo.png differ
diff --git a/gns3server/custom_symbols/shieldedtux.png b/gns3server/custom_symbols/shieldedtux.png
new file mode 100644
index 000000000..1f4746e45
Binary files /dev/null and b/gns3server/custom_symbols/shieldedtux.png differ
diff --git a/gns3server/custom_symbols/steelhead-vcx.png b/gns3server/custom_symbols/steelhead-vcx.png
new file mode 100644
index 000000000..c1ee20079
Binary files /dev/null and b/gns3server/custom_symbols/steelhead-vcx.png differ
diff --git a/gns3server/custom_symbols/stormshield.png b/gns3server/custom_symbols/stormshield.png
new file mode 100644
index 000000000..d58b47067
Binary files /dev/null and b/gns3server/custom_symbols/stormshield.png differ
diff --git a/gns3server/custom_symbols/ubuntu.svg b/gns3server/custom_symbols/ubuntu.svg
new file mode 100644
index 000000000..9a94055d2
--- /dev/null
+++ b/gns3server/custom_symbols/ubuntu.svg
@@ -0,0 +1,1750 @@
+
+
+
+
diff --git a/gns3server/custom_symbols/vRIN.svg b/gns3server/custom_symbols/vRIN.svg
new file mode 100644
index 000000000..8d94c16f1
--- /dev/null
+++ b/gns3server/custom_symbols/vRIN.svg
@@ -0,0 +1,316 @@
+
+
+
+
diff --git a/gns3server/custom_symbols/vsrx_bybaro.svg b/gns3server/custom_symbols/vsrx_bybaro.svg
new file mode 100644
index 000000000..f81392f2d
--- /dev/null
+++ b/gns3server/custom_symbols/vsrx_bybaro.svg
@@ -0,0 +1,44 @@
+
+
\ No newline at end of file
diff --git a/gns3server/custom_symbols/vyos.svg b/gns3server/custom_symbols/vyos.svg
new file mode 100644
index 000000000..80ed3bfb5
--- /dev/null
+++ b/gns3server/custom_symbols/vyos.svg
@@ -0,0 +1,35 @@
+
diff --git a/gns3server/main.py b/gns3server/main.py
index ebd8b1120..bb30a2d81 100644
--- a/gns3server/main.py
+++ b/gns3server/main.py
@@ -30,6 +30,7 @@ import gns3server.utils.get_resource
import os
import sys
import asyncio
+import argparse
def daemonize():
@@ -59,6 +60,42 @@ def daemonize():
print("Second fork failed: %d (%s)\n" % (e.errno, e.strerror), file=sys.stderr)
sys.exit(1)
+def parse_arguments(argv):
+ """
+ Parse command line arguments
+
+ :param argv: Array of command line arguments
+ """
+ from gns3server.version import __version__
+ parser = argparse.ArgumentParser(description=f"GNS3 server version {__version__}")
+ parser.add_argument("-v", "--version", help="show the version", action="version", version=__version__)
+ parser.add_argument("--host", help="run on the given host/IP address")
+ parser.add_argument("--port", help="run on the given port", type=int)
+ parser.add_argument("--ssl", action="store_true", help="run in SSL mode")
+ parser.add_argument("--config", help="Configuration file")
+ parser.add_argument("--certfile", help="SSL cert file")
+ parser.add_argument("--certkey", help="SSL key file")
+ parser.add_argument("-L", "--local", action="store_true", help="local mode (allows some insecure operations)")
+ parser.add_argument(
+ "-A", "--allow", action="store_true", help="allow remote connections to local console ports"
+ )
+ parser.add_argument("-q", "--quiet", default=False, action="store_true", help="do not show logs on stdout")
+ parser.add_argument("-d", "--debug", default=False, action="store_true", help="show debug logs")
+ parser.add_argument("--logfile", "--log", help="send output to logfile instead of console")
+ parser.add_argument("--logmaxsize", default=10000000, help="maximum logfile size in bytes (default is 10MB)")
+ parser.add_argument(
+ "--logbackupcount", default=10, help="number of historical log files to keep (default is 10)"
+ )
+ parser.add_argument(
+ "--logcompression", default=False, action="store_true", help="compress inactive (historical) logs"
+ )
+ parser.add_argument("--daemon", action="store_true", help="start as a daemon")
+ parser.add_argument("--pid", help="store process pid")
+ parser.add_argument("--profile", help="Settings profile (blank will use default settings files)")
+
+ args = parser.parse_args(argv)
+ return parser, args
+
def main():
"""
@@ -69,10 +106,11 @@ def main():
raise SystemExit("Windows is not a supported platform to run the GNS3 server")
if "--daemon" in sys.argv:
daemonize()
- from gns3server.server import Server
try:
- asyncio.run(Server().run())
+ parser, args = parse_arguments(sys.argv[1:])
+ from gns3server.server import Server
+ asyncio.run(Server().run(parser, args))
except KeyboardInterrupt:
pass
diff --git a/gns3server/schemas/compute/docker_nodes.py b/gns3server/schemas/compute/docker_nodes.py
index 2d6d7d47a..2328baabc 100644
--- a/gns3server/schemas/compute/docker_nodes.py
+++ b/gns3server/schemas/compute/docker_nodes.py
@@ -43,8 +43,8 @@ class DockerBase(BaseModel):
environment: Optional[str] = Field(None, description="Docker environment variables")
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[float] = Field(None, description="Maximum amount of CPU resources the container can use")
+ memory: Optional[int] = Field(None, ge=0, description="Maximum amount of memory the container can use in MB")
+ cpus: Optional[float] = Field(None, ge=0, 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/compute/dynamips_nodes.py b/gns3server/schemas/compute/dynamips_nodes.py
index f59790c5b..3f636461f 100644
--- a/gns3server/schemas/compute/dynamips_nodes.py
+++ b/gns3server/schemas/compute/dynamips_nodes.py
@@ -124,8 +124,8 @@ class DynamipsBase(BaseModel):
name: Optional[str] = None
dynamips_id: Optional[int] = Field(None, description="Dynamips internal ID")
platform: Optional[DynamipsPlatform] = Field(None, description="Cisco router platform")
- ram: Optional[int] = Field(None, description="Amount of RAM in MB")
- nvram: Optional[int] = Field(None, description="Amount of NVRAM in KB")
+ ram: Optional[int] = Field(None, gt=0, description="Amount of RAM in MB")
+ nvram: Optional[int] = Field(None, gt=0, description="Amount of NVRAM in KB")
image: Optional[str] = Field(None, description="Path to the IOS image")
image_md5sum: Optional[str] = Field(None, description="Checksum of the IOS image")
usage: Optional[str] = Field(None, description="How to use the Dynamips VM")
@@ -139,8 +139,8 @@ class DynamipsBase(BaseModel):
idlemax: Optional[int] = Field(None, description="Idlemax value")
idlesleep: Optional[int] = Field(None, description="Idlesleep value")
exec_area: Optional[int] = Field(None, description="Exec area value")
- disk0: Optional[int] = Field(None, description="Disk0 size in MB")
- disk1: Optional[int] = Field(None, description="Disk1 size in MB")
+ disk0: Optional[int] = Field(None, ge=0, description="Disk0 size in MB")
+ disk1: Optional[int] = Field(None, ge=0, description="Disk1 size in MB")
auto_delete_disks: Optional[bool] = Field(None, description="Automatically delete nvram and disk files")
console: Optional[int] = Field(None, gt=0, le=65535, description="Console TCP port")
console_type: Optional[DynamipsConsoleType] = Field(None, description="Console type")
@@ -176,7 +176,7 @@ class DynamipsCreate(DynamipsBase):
name: str
platform: str = Field(..., description="Cisco router platform", pattern="^c[0-9]{4}$")
image: str = Field(..., description="Path to the IOS image")
- ram: int = Field(..., description="Amount of RAM in MB")
+ ram: int = Field(..., gt=0, description="Amount of RAM in MB")
class DynamipsUpdate(DynamipsBase):
diff --git a/gns3server/schemas/compute/iou_nodes.py b/gns3server/schemas/compute/iou_nodes.py
index 61dcae9ce..7e3d3a91b 100644
--- a/gns3server/schemas/compute/iou_nodes.py
+++ b/gns3server/schemas/compute/iou_nodes.py
@@ -36,8 +36,8 @@ class IOUBase(BaseModel):
md5sum: Optional[str] = Field(None, description="IOU executable checksum")
serial_adapters: Optional[int] = Field(None, description="How many serial adapters are connected to IOU")
ethernet_adapters: Optional[int] = Field(None, description="How many Ethernet adapters are connected to IOU")
- ram: Optional[int] = Field(None, description="Amount of RAM in MB")
- nvram: Optional[int] = Field(None, description="Amount of NVRAM in KB")
+ ram: Optional[int] = Field(None, gt=0, description="Amount of RAM in MB")
+ nvram: Optional[int] = Field(None, gt=0, description="Amount of NVRAM in KB")
l1_keepalives: Optional[bool] = Field(None, description="Use default IOU values")
use_default_iou_values: Optional[bool] = Field(None, description="Always up Ethernet interfaces")
startup_config_content: Optional[str] = Field(None, description="Content of IOU startup configuration file")
diff --git a/gns3server/schemas/controller/templates/docker_templates.py b/gns3server/schemas/controller/templates/docker_templates.py
index 329de37ab..5eb10d7f5 100644
--- a/gns3server/schemas/controller/templates/docker_templates.py
+++ b/gns3server/schemas/controller/templates/docker_templates.py
@@ -49,8 +49,8 @@ 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[float] = Field(0, description="Maximum amount of CPU resources the container can use")
+ memory: Optional[int] = Field(0, ge=0, description="Maximum amount of memory the container can use in MB")
+ cpus: Optional[float] = Field(0, ge=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/schemas/controller/templates/dynamips_templates.py b/gns3server/schemas/controller/templates/dynamips_templates.py
index 4fb5235af..86a359cde 100644
--- a/gns3server/schemas/controller/templates/dynamips_templates.py
+++ b/gns3server/schemas/controller/templates/dynamips_templates.py
@@ -37,7 +37,7 @@ class DynamipsTemplate(TemplateBase):
symbol: Optional[str] = "router"
platform: DynamipsPlatform = Field(..., description="Cisco router platform")
image: str = Field(..., description="Path to the IOS image")
- exec_area: Optional[int] = Field(64, description="Exec area value")
+ exec_area: Optional[int] = Field(64, ge=0, description="Exec area value")
mmap: Optional[bool] = Field(True, description="MMAP feature")
mac_addr: Optional[str] = Field(
"", description="Base MAC address", pattern="^([0-9a-fA-F]{4}\\.){2}[0-9a-fA-F]{4}$|^$"
@@ -46,10 +46,10 @@ class DynamipsTemplate(TemplateBase):
startup_config: Optional[str] = Field("ios_base_startup-config.txt", description="IOS startup configuration file")
private_config: Optional[str] = Field("", description="IOS private configuration file")
idlepc: Optional[str] = Field("", description="Idle-PC value", pattern="^(0x[0-9a-fA-F]+)?$|^$")
- idlemax: Optional[int] = Field(500, description="Idlemax value")
- idlesleep: Optional[int] = Field(30, description="Idlesleep value")
- disk0: Optional[int] = Field(0, description="Disk0 size in MB")
- disk1: Optional[int] = Field(0, description="Disk1 size in MB")
+ idlemax: Optional[int] = Field(500, ge=0, description="Idlemax value")
+ idlesleep: Optional[int] = Field(30, ge=0, description="Idlesleep value")
+ disk0: Optional[int] = Field(0, ge=0, description="Disk0 size in MB")
+ disk1: Optional[int] = Field(0, ge=0, description="Disk1 size in MB")
auto_delete_disks: Optional[bool] = Field(False, description="Automatically delete nvram and disk files")
console_type: Optional[DynamipsConsoleType] = Field(DynamipsConsoleType.telnet, description="Console type")
console_auto_start: Optional[bool] = Field(
@@ -70,8 +70,8 @@ class DynamipsTemplate(TemplateBase):
class C7200DynamipsTemplate(DynamipsTemplate):
- ram: Optional[int] = Field(512, description="Amount of RAM in MB")
- nvram: Optional[int] = Field(512, description="Amount of NVRAM in KB")
+ ram: Optional[int] = Field(512, gt=0, description="Amount of RAM in MB")
+ nvram: Optional[int] = Field(512, gt=0, description="Amount of NVRAM in KB")
npe: Optional[DynamipsNPE] = Field(DynamipsNPE.npe_400, description="NPE model")
midplane: Optional[DynamipsMidplane] = Field(DynamipsMidplane.vxr, description="Midplane model")
sparsemem: Optional[bool] = Field(True, description="Sparse memory feature")
@@ -85,8 +85,8 @@ class C7200DynamipsTemplateUpdate(C7200DynamipsTemplate):
class C3725DynamipsTemplate(DynamipsTemplate):
- ram: Optional[int] = Field(128, description="Amount of RAM in MB")
- nvram: Optional[int] = Field(256, description="Amount of NVRAM in KB")
+ ram: Optional[int] = Field(128, gt=0, description="Amount of RAM in MB")
+ nvram: Optional[int] = Field(256, gt=0, description="Amount of NVRAM in KB")
iomem: Optional[int] = Field(5, ge=0, le=100, description="I/O memory percentage")
sparsemem: Optional[bool] = Field(True, description="Sparse memory feature")
@@ -99,8 +99,8 @@ class C3725DynamipsTemplateUpdate(C3725DynamipsTemplate):
class C3745DynamipsTemplate(DynamipsTemplate):
- ram: Optional[int] = Field(256, description="Amount of RAM in MB")
- nvram: Optional[int] = Field(256, description="Amount of NVRAM in KB")
+ ram: Optional[int] = Field(256, gt=0, description="Amount of RAM in MB")
+ nvram: Optional[int] = Field(256, gt=0, description="Amount of NVRAM in KB")
iomem: Optional[int] = Field(5, ge=0, le=100, description="I/O memory percentage")
sparsemem: Optional[bool] = Field(True, description="Sparse memory feature")
@@ -121,8 +121,8 @@ class C3600ChassisType(str, Enum):
class C3600DynamipsTemplate(DynamipsTemplate):
chassis: Optional[C3600ChassisType] = Field("c3660", description="Chassis type")
- ram: Optional[int] = Field(192, description="Amount of RAM in MB")
- nvram: Optional[int] = Field(128, description="Amount of NVRAM in KB")
+ ram: Optional[int] = Field(192, gt=0, description="Amount of RAM in MB")
+ nvram: Optional[int] = Field(128, gt=0, description="Amount of NVRAM in KB")
iomem: Optional[int] = Field(5, ge=0, le=100, description="I/O memory percentage")
sparsemem: Optional[bool] = Field(True, description="Sparse memory feature")
@@ -135,8 +135,8 @@ class C3600DynamipsTemplateUpdate(C3600DynamipsTemplate):
class C2691DynamipsTemplate(DynamipsTemplate):
- ram: Optional[int] = Field(192, description="Amount of RAM in MB")
- nvram: Optional[int] = Field(256, description="Amount of NVRAM in KB")
+ ram: Optional[int] = Field(192, gt=0, description="Amount of RAM in MB")
+ nvram: Optional[int] = Field(256, gt=0, description="Amount of NVRAM in KB")
iomem: Optional[int] = Field(5, ge=0, le=100, description="I/O memory percentage")
sparsemem: Optional[bool] = Field(True, description="Sparse memory feature")
@@ -163,8 +163,8 @@ class C2600ChassisType(str, Enum):
class C2600DynamipsTemplate(DynamipsTemplate):
chassis: Optional[C2600ChassisType] = Field("2651XM", description="Chassis type")
- ram: Optional[int] = Field(160, description="Amount of RAM in MB")
- nvram: Optional[int] = Field(128, description="Amount of NVRAM in KB")
+ ram: Optional[int] = Field(160, gt=0, description="Amount of RAM in MB")
+ nvram: Optional[int] = Field(128, gt=0, description="Amount of NVRAM in KB")
iomem: Optional[int] = Field(15, ge=0, le=100, description="I/O memory percentage")
sparsemem: Optional[bool] = Field(True, description="Sparse memory feature")
@@ -187,8 +187,8 @@ class C1700ChassisType(str, Enum):
class C1700DynamipsTemplate(DynamipsTemplate):
chassis: Optional[C1700ChassisType] = Field("1760", description="Chassis type")
- ram: Optional[int] = Field(160, description="Amount of RAM in MB")
- nvram: Optional[int] = Field(128, description="Amount of NVRAM in KB")
+ ram: Optional[int] = Field(160, gt=0, description="Amount of RAM in MB")
+ nvram: Optional[int] = Field(128, gt=0, description="Amount of NVRAM in KB")
iomem: Optional[int] = Field(15, ge=0, le=100, description="I/O memory percentage")
sparsemem: Optional[bool] = Field(False, description="Sparse memory feature")
diff --git a/gns3server/schemas/controller/templates/iou_templates.py b/gns3server/schemas/controller/templates/iou_templates.py
index cf581c8c5..e906f74f6 100644
--- a/gns3server/schemas/controller/templates/iou_templates.py
+++ b/gns3server/schemas/controller/templates/iou_templates.py
@@ -28,10 +28,10 @@ class IOUTemplate(TemplateBase):
default_name_format: Optional[str] = "IOU{0}"
symbol: Optional[str] = "multilayer_switch"
path: str = Field(..., description="Path of IOU executable")
- ethernet_adapters: Optional[int] = Field(2, description="Number of ethernet adapters")
- serial_adapters: Optional[int] = Field(2, description="Number of serial adapters")
- ram: Optional[int] = Field(256, description="Amount of RAM in MB")
- nvram: Optional[int] = Field(128, description="Amount of NVRAM in KB")
+ ethernet_adapters: Optional[int] = Field(2, ge=0, description="Number of ethernet adapters")
+ serial_adapters: Optional[int] = Field(2, ge=0, description="Number of serial adapters")
+ ram: Optional[int] = Field(256, gt=0, description="Amount of RAM in MB")
+ nvram: Optional[int] = Field(128, gt=0, description="Amount of NVRAM in KB")
use_default_iou_values: Optional[bool] = Field(True, description="Use default IOU values")
startup_config: Optional[str] = Field("iou_l3_base_startup-config.txt", description="Startup-config of IOU")
private_config: Optional[str] = Field("", description="Private-config of IOU")
diff --git a/gns3server/schemas/controller/templates/qemu_templates.py b/gns3server/schemas/controller/templates/qemu_templates.py
index f5353d7b8..13abaf40d 100644
--- a/gns3server/schemas/controller/templates/qemu_templates.py
+++ b/gns3server/schemas/controller/templates/qemu_templates.py
@@ -39,7 +39,7 @@ class QemuTemplate(TemplateBase):
qemu_path: Optional[str] = Field("", description="Qemu executable path")
platform: Optional[QemuPlatform] = Field(QemuPlatform.x86_64, description="Platform to emulate")
linked_clone: Optional[bool] = Field(True, description="Whether the VM is a linked clone or not")
- ram: Optional[int] = Field(256, description="Amount of RAM in MB")
+ ram: Optional[int] = Field(256, gt=0, description="Amount of RAM in MB")
cpus: Optional[int] = Field(1, ge=1, le=255, description="Number of vCPUs")
maxcpus: Optional[int] = Field(1, ge=1, le=255, description="Maximum number of hotpluggable vCPUs")
adapters: Optional[int] = Field(1, ge=0, le=275, description="Number of adapters")
diff --git a/gns3server/schemas/controller/users.py b/gns3server/schemas/controller/users.py
index 673b28dd7..aa4af2e38 100644
--- a/gns3server/schemas/controller/users.py
+++ b/gns3server/schemas/controller/users.py
@@ -39,7 +39,7 @@ class UserCreate(UserBase):
"""
username: str = Field(..., min_length=3, pattern="[a-zA-Z0-9_-]+$")
- password: SecretStr = Field(..., min_length=6, max_length=100)
+ password: SecretStr = Field(..., min_length=8, max_length=100)
class UserUpdate(UserBase):
@@ -47,7 +47,7 @@ class UserUpdate(UserBase):
Properties to update a user.
"""
- password: Optional[SecretStr] = Field(None, min_length=6, max_length=100)
+ password: Optional[SecretStr] = Field(None, min_length=8, max_length=100)
class LoggedInUserUpdate(BaseModel):
@@ -55,7 +55,7 @@ class LoggedInUserUpdate(BaseModel):
Properties to update a logged-in user.
"""
- password: Optional[SecretStr] = Field(None, min_length=6, max_length=100)
+ password: Optional[SecretStr] = Field(None, min_length=8, max_length=100)
email: Optional[EmailStr] = None
full_name: Optional[str] = None
diff --git a/gns3server/server.py b/gns3server/server.py
index 29f1a8707..6ae18fdfb 100644
--- a/gns3server/server.py
+++ b/gns3server/server.py
@@ -23,7 +23,6 @@ Start the program. Use main.py to load it.
import os
import datetime
import locale
-import argparse
import psutil
import sys
import asyncio
@@ -33,13 +32,10 @@ import uvicorn
import secrets
import string
-from gns3server.controller import Controller
-from gns3server.compute.port_manager import PortManager
from gns3server.logger import init_logger
from gns3server.version import __version__
from gns3server.config import Config
from gns3server.crash_report import CrashReport
-from gns3server.api.server import app
from pydantic import ValidationError, SecretStr
import logging
@@ -90,40 +86,13 @@ class Server:
else:
log.info(f"Current locale is {language}.{encoding}")
- def _parse_arguments(self, argv):
+ def _setup_logging(self, args):
"""
- Parse command line arguments and override local configuration
+ Setup logging.
- :params args: Array of command line arguments
+ :param args: command line arguments
"""
- parser = argparse.ArgumentParser(description=f"GNS3 server version {__version__}")
- parser.add_argument("-v", "--version", help="show the version", action="version", version=__version__)
- parser.add_argument("--host", help="run on the given host/IP address")
- parser.add_argument("--port", help="run on the given port", type=int)
- parser.add_argument("--ssl", action="store_true", help="run in SSL mode")
- parser.add_argument("--config", help="Configuration file")
- parser.add_argument("--certfile", help="SSL cert file")
- parser.add_argument("--certkey", help="SSL key file")
- parser.add_argument("-L", "--local", action="store_true", help="local mode (allows some insecure operations)")
- parser.add_argument(
- "-A", "--allow", action="store_true", help="allow remote connections to local console ports"
- )
- parser.add_argument("-q", "--quiet", default=False, action="store_true", help="do not show logs on stdout")
- parser.add_argument("-d", "--debug", default=False, action="store_true", help="show debug logs")
- parser.add_argument("--logfile", "--log", help="send output to logfile instead of console")
- parser.add_argument("--logmaxsize", default=10000000, help="maximum logfile size in bytes (default is 10MB)")
- parser.add_argument(
- "--logbackupcount", default=10, help="number of historical log files to keep (default is 10)"
- )
- parser.add_argument(
- "--logcompression", default=False, action="store_true", help="compress inactive (historical) logs"
- )
- parser.add_argument("--daemon", action="store_true", help="start as a daemon")
- parser.add_argument("--pid", help="store process pid")
- parser.add_argument("--profile", help="Settings profile (blank will use default settings files)")
-
- args = parser.parse_args(argv)
level = logging.INFO
if args.debug:
level = logging.DEBUG
@@ -137,6 +106,15 @@ class Server:
quiet=args.quiet,
)
+ @staticmethod
+ def _load_config_and_set_defaults(parser, args, argv=None):
+ """
+ Parse command line arguments and override local configuration
+
+ :param parser: ArgumentParser instance
+ :param args: command line arguments
+ """
+
try:
if args.config:
Config.instance(files=[args.config], profile=args.profile)
@@ -157,7 +135,10 @@ class Server:
}
parser.set_defaults(**defaults)
- return parser.parse_args(argv)
+ if argv is None:
+ argv = sys.argv[1:]
+ args = parser.parse_args(argv)
+ return args
@staticmethod
def _set_config_defaults_from_command_line(args):
@@ -174,6 +155,8 @@ class Server:
config.Server.enable_ssl = args.ssl
def _signal_handling(self):
+
+ from gns3server.controller import Controller
def signal_handler(signame, *args):
try:
@@ -239,9 +222,10 @@ class Server:
log.critical("Can't write pid file %s: %s", path, str(e))
sys.exit(1)
- async def run(self):
+ async def run(self, parser, args):
- args = self._parse_arguments(sys.argv[1:])
+ self._setup_logging(args)
+ args = self._load_config_and_set_defaults(parser, args)
if args.pid:
self._pid_lock(args.pid)
@@ -256,7 +240,6 @@ class Server:
self._set_config_defaults_from_command_line(args)
config = Config.instance().settings
-
if not config.Server.compute_password.get_secret_value():
alphabet = string.ascii_letters + string.digits + string.punctuation
generated_password = ''.join(secrets.choice(alphabet) for _ in range(16))
@@ -297,11 +280,13 @@ class Server:
host = config.Server.host
port = config.Server.port
+ from gns3server.compute.port_manager import PortManager
PortManager.instance().console_host = host
self._signal_handling()
try:
log.info(f"Starting server on {host}:{port}")
+ from gns3server.api.server import app
# only show uvicorn access logs in debug mode
access_log = False
diff --git a/gns3server/static/web-ui/index.html b/gns3server/static/web-ui/index.html
index 3e5caf26a..1aecd766c 100644
--- a/gns3server/static/web-ui/index.html
+++ b/gns3server/static/web-ui/index.html
@@ -46,6 +46,6 @@
gtag('config', 'G-0BT7QQV1W1');
-
+