diff --git a/CHANGELOG b/CHANGELOG
index aba428f4..89562ef4 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 3aa82cdd..04ca562b 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 1b456a97..f3b5b8fe 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 ca86e912..7385026b 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 00000000..00157093
--- /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 eacc48d8..35e71c46 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 61810969..03a89128 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 52b4b6b5..cd353812 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 90be6447..28643121 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 001fc488..24b173c4 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 0a9e5e6f..e9b86955 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 c6045502..e35a5541 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 9373437e..c856f37f 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 4978d275..0f6613ac 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 fe686a9c..26201909 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 c43f2a35..a71b0ad3 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 951697fb..7798233e 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 9bbed071..7ca84c9f 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 102bf096..e3874bbd 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 15b13a20..b5de0248 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 00000000..1fb796d5
--- /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 00000000..20f71cf1
--- /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 aade8d86..cace44ed 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 a9e156b6..5f4cd292 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 62a03aa9..22e766b6 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 f14c403a..539121a4 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 403740f4..cdb02766 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 00000000..8fed8f44
--- /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 00000000..5ca18f23
--- /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 00000000..681ef610
--- /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 00000000..ffde2a3f
--- /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 00000000..7351a5df
--- /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 00000000..9519b29b
--- /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 00000000..2b8359e9
--- /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 00000000..0647b393
--- /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 00000000..963971d1
--- /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 00000000..f6c884e6
--- /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 00000000..63b4292c
--- /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 00000000..91559e2e
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 00000000..39be96cd
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 00000000..a860333c
--- /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 00000000..1c37224e
--- /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 00000000..ae288e7f
--- /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 00000000..c18dbb73
--- /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 00000000..bc446265
--- /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 00000000..9eb0accb
--- /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 00000000..b307ee14
--- /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 00000000..6904a2bb
--- /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 00000000..31d166e2
--- /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 00000000..39a7bb7d
--- /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 00000000..c05ed9d0
--- /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 00000000..cd90c87f
--- /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 00000000..16a0402b
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 00000000..0126e2af
--- /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 00000000..e75e27af
--- /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 00000000..6f36ce43
--- /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 00000000..9a164215
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 00000000..d7a7c3d2
--- /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 00000000..d5ebf082
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 00000000..4bf151c6
--- /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 00000000..e365abbd
--- /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 00000000..df2aac00
--- /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 00000000..fce3f9fa
--- /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 00000000..3f8ce6fe
--- /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 00000000..3a4cb0f0
--- /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 00000000..fae98c62
--- /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 00000000..aa7e7f6e
--- /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 00000000..4755aa46
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 00000000..d5ecfc92
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 00000000..1f4746e4
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 00000000..c1ee2007
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 00000000..d58b4706
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 00000000..9a94055d
--- /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 00000000..8d94c16f
--- /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 00000000..f81392f2
--- /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 00000000..80ed3bfb
--- /dev/null
+++ b/gns3server/custom_symbols/vyos.svg
@@ -0,0 +1,35 @@
+
diff --git a/gns3server/main.py b/gns3server/main.py
index ebd8b112..bb30a2d8 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 2d6d7d47..2328baab 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 f59790c5..3f636461 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 61dcae9c..7e3d3a91 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 329de37a..5eb10d7f 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 4fb5235a..86a359cd 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 cf581c8c..e906f74f 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 f5353d7b..13abaf40 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 673b28dd..aa4af2e3 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 29f1a870..6ae18fdf 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 3e5caf26..1aecd766 100644
--- a/gns3server/static/web-ui/index.html
+++ b/gns3server/static/web-ui/index.html
@@ -46,6 +46,6 @@
gtag('config', 'G-0BT7QQV1W1');
-
+