diff --git a/CHANGELOG b/CHANGELOG
index 4169cafd..269b28c9 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,16 @@
# Change Log
+## 2.2.45 12/01/2024
+
+* Bundle web-ui v2.2.45
+* Fix mouse offset issues with VNC in Qemu. Fixes #2335
+* Add project.created, project.opened and project.deleted controller notification stream. Move project.updated and project.closed from project notification to controller notification stream.
+* Do not stop searching for Qemu binaries if one binary cannot be executed. Ref #2306
+* Fix Ethernet switch and Ethernet hub port validations. Fixes #2334
+* Update CORS policy
+* Add custom executable paths on Windows
+* Upgrade sentry-sdk and aiohttp
+
## 2.2.44.1 07/11/2023
* Catch exceptions when computing image checksums. Ref https://github.com/GNS3/gns3-server/issues/2228
diff --git a/docs/api/notifications/link.updated.json b/docs/api/notifications/link.updated.json
index 02d45efa..6fb0157e 100644
--- a/docs/api/notifications/link.updated.json
+++ b/docs/api/notifications/link.updated.json
@@ -11,7 +11,8 @@
10
]
},
- "link_id": "b76bd8b1-2171-4361-9228-801713d23079",
+ "link_id": "c3f1b38a-160d-4a67-baa0-34fc3d9759ed",
+ "link_style": {},
"link_type": "ethernet",
"nodes": [
{
@@ -21,7 +22,7 @@
"x": 64,
"y": 0
},
- "node_id": "8b77b480-361e-488b-96b1-a769890e11ec",
+ "node_id": "481e5898-cd97-4351-8b1e-0c9e77fc7c58",
"port_number": 3
},
{
@@ -30,10 +31,10 @@
"style": "font-family: TypeWriter;font-size: 10.0;font-weight: bold;fill: #000000;fill-opacity: 1.0;",
"text": "2/4"
},
- "node_id": "b4688a3d-0af8-4ddc-b85f-e26dc1031c4c",
+ "node_id": "63f7b8ab-146d-4142-b8c5-cf387ac1d963",
"port_number": 4
}
],
- "project_id": "85333131-b83a-4112-9a51-184ba0c536a8",
+ "project_id": "292936d2-9f54-4e29-959f-b59ed9ac5e6f",
"suspend": false
}
\ No newline at end of file
diff --git a/docs/api/notifications/log.warning.json b/docs/api/notifications/log.warning.json
index 5d630354..dd724322 100644
--- a/docs/api/notifications/log.warning.json
+++ b/docs/api/notifications/log.warning.json
@@ -1,3 +1,3 @@
{
- "message": "Warning ASA 8 is not officialy supported by GNS3"
+ "message": "Warning ASA 8 is not officially supported by GNS3"
}
\ No newline at end of file
diff --git a/docs/api/notifications/node.deleted.json b/docs/api/notifications/node.deleted.json
new file mode 100644
index 00000000..e24038fa
--- /dev/null
+++ b/docs/api/notifications/node.deleted.json
@@ -0,0 +1,3 @@
+{
+ "a": "b"
+}
\ No newline at end of file
diff --git a/docs/api/notifications/node.updated.json b/docs/api/notifications/node.updated.json
new file mode 100644
index 00000000..e24038fa
--- /dev/null
+++ b/docs/api/notifications/node.updated.json
@@ -0,0 +1,3 @@
+{
+ "a": "b"
+}
\ No newline at end of file
diff --git a/docs/api/notifications/project.created.json b/docs/api/notifications/project.created.json
new file mode 100644
index 00000000..54428224
--- /dev/null
+++ b/docs/api/notifications/project.created.json
@@ -0,0 +1,21 @@
+{
+ "auto_close": true,
+ "auto_open": false,
+ "auto_start": false,
+ "drawing_grid_size": 25,
+ "filename": "Test.gns3",
+ "grid_size": 75,
+ "name": "Test",
+ "path": "/tmp/tmprusds8mt/projects/87d4b692-52b4-4b4c-8828-13666306a68a",
+ "project_id": "87d4b692-52b4-4b4c-8828-13666306a68a",
+ "scene_height": 1000,
+ "scene_width": 2000,
+ "show_grid": false,
+ "show_interface_labels": false,
+ "show_layers": false,
+ "snap_to_grid": false,
+ "status": "opened",
+ "supplier": null,
+ "variables": null,
+ "zoom": 100
+}
\ No newline at end of file
diff --git a/docs/api/notifications/project.deleted.json b/docs/api/notifications/project.deleted.json
new file mode 100644
index 00000000..0c93406f
--- /dev/null
+++ b/docs/api/notifications/project.deleted.json
@@ -0,0 +1,21 @@
+{
+ "auto_close": true,
+ "auto_open": false,
+ "auto_start": false,
+ "drawing_grid_size": 25,
+ "filename": "Test.gns3",
+ "grid_size": 75,
+ "name": "Test",
+ "path": "/tmp/tmpvqf8d5mx/projects/6f01ee8c-5fe7-47a2-95ab-a0f4c0a355f9",
+ "project_id": "6f01ee8c-5fe7-47a2-95ab-a0f4c0a355f9",
+ "scene_height": 1000,
+ "scene_width": 2000,
+ "show_grid": false,
+ "show_interface_labels": false,
+ "show_layers": false,
+ "snap_to_grid": false,
+ "status": "closed",
+ "supplier": null,
+ "variables": null,
+ "zoom": 100
+}
\ No newline at end of file
diff --git a/docs/api/notifications/project.opened.json b/docs/api/notifications/project.opened.json
new file mode 100644
index 00000000..e7c9cc8e
--- /dev/null
+++ b/docs/api/notifications/project.opened.json
@@ -0,0 +1,21 @@
+{
+ "auto_close": true,
+ "auto_open": false,
+ "auto_start": false,
+ "drawing_grid_size": 25,
+ "filename": "test.gns3",
+ "grid_size": 75,
+ "name": "test",
+ "path": "/tmp/tmp7swwxptj/projects/e5b0b37a-a74e-40a2-9adb-42908f146fba",
+ "project_id": "e5b0b37a-a74e-40a2-9adb-42908f146fba",
+ "scene_height": 1000,
+ "scene_width": 2000,
+ "show_grid": false,
+ "show_interface_labels": false,
+ "show_layers": false,
+ "snap_to_grid": false,
+ "status": "opened",
+ "supplier": null,
+ "variables": null,
+ "zoom": 100
+}
\ No newline at end of file
diff --git a/docs/api/v2/compute/ethernet_switch/projectsprojectidethernetswitchnodes.rst b/docs/api/v2/compute/ethernet_switch/projectsprojectidethernetswitchnodes.rst
index dcbfcb5d..e855f049 100644
--- a/docs/api/v2/compute/ethernet_switch/projectsprojectidethernetswitchnodes.rst
+++ b/docs/api/v2/compute/ethernet_switch/projectsprojectidethernetswitchnodes.rst
@@ -23,7 +23,7 @@ Types
+++++++++
EthernetSwitchPort
^^^^^^^^^^^^^^^^^^^^^^
-Ethernet port
+Ethernet switch port
.. raw:: html
diff --git a/docs/api/v2/compute/ethernet_switch/projectsprojectidethernetswitchnodesnodeid.rst b/docs/api/v2/compute/ethernet_switch/projectsprojectidethernetswitchnodesnodeid.rst
index 8a56fe64..efa5d250 100644
--- a/docs/api/v2/compute/ethernet_switch/projectsprojectidethernetswitchnodesnodeid.rst
+++ b/docs/api/v2/compute/ethernet_switch/projectsprojectidethernetswitchnodesnodeid.rst
@@ -56,7 +56,7 @@ Types
+++++++++
EthernetSwitchPort
^^^^^^^^^^^^^^^^^^^^^^
-Ethernet port
+Ethernet switch port
.. raw:: html
diff --git a/docs/api/v2/compute/iou/projectsprojectidiounodes.rst b/docs/api/v2/compute/iou/projectsprojectidiounodes.rst
index 4eee67da..5ef4495c 100644
--- a/docs/api/v2/compute/iou/projectsprojectidiounodes.rst
+++ b/docs/api/v2/compute/iou/projectsprojectidiounodes.rst
@@ -23,7 +23,7 @@ Input
Name | Mandatory | Type | Description |
- application_id | | ['integer', 'null'] | Application ID for running IOU image |
+ application_id | ✔ | ['integer', 'null'] | Application ID for running IOU image |
console | | ['integer', 'null'] | Console TCP port |
console_type | | enum | Possible values: telnet, none |
ethernet_adapters | | integer | How many ethernet adapters are connected to the IOU |
diff --git a/docs/api/v2/compute/project/projects.rst b/docs/api/v2/compute/project/projects.rst
index ed7b6a5e..3d1abea5 100644
--- a/docs/api/v2/compute/project/projects.rst
+++ b/docs/api/v2/compute/project/projects.rst
@@ -35,6 +35,8 @@ Input
Name | Mandatory | Type | Description |
auto_close | | boolean | Project auto close |
+ auto_open | | boolean | Project open when GNS3 start |
+ auto_start | | boolean | Project start when opened |
drawing_grid_size | | integer | Grid size for the drawing area for drawings |
grid_size | | integer | Grid size for the drawing area for nodes |
name | ✔ | ['string', 'null'] | Project name |
diff --git a/docs/api/v2/compute/qemu/projectsprojectidqemunodes.rst b/docs/api/v2/compute/qemu/projectsprojectidqemunodes.rst
index d39588a5..7ef0486d 100644
--- a/docs/api/v2/compute/qemu/projectsprojectidqemunodes.rst
+++ b/docs/api/v2/compute/qemu/projectsprojectidqemunodes.rst
@@ -34,6 +34,7 @@ Input
console_type | | enum | Possible values: telnet, vnc, spice, spice+agent, none |
cpu_throttling | | ['integer', 'null'] | Percentage of CPU allowed for QEMU |
cpus | | ['integer', 'null'] | Number of vCPUs |
+ create_config_disk | | ['boolean', 'null'] | Automatically create a config disk on HDD disk interface (secondary slave) |
custom_adapters | | array | |
hda_disk_image | | string | QEMU hda disk image path |
hda_disk_image_md5sum | | ['string', 'null'] | QEMU hda disk image checksum |
@@ -63,6 +64,9 @@ Input
process_priority | | enum | Possible values: realtime, very high, high, normal, low, very low, null |
qemu_path | | ['string', 'null'] | Path to QEMU |
ram | | ['integer', 'null'] | Amount of RAM in MB |
+ replicate_network_connection_state | | ['boolean', 'null'] | Replicate the network connection state for links in Qemu |
+ tpm | | ['boolean', 'null'] | Enable the Trusted Platform Module (TPM) in Qemu |
+ uefi | | ['boolean', 'null'] | Enable the UEFI boot mode in Qemu |
usage | | string | How to use the Qemu VM |
@@ -84,6 +88,7 @@ Output
console_type | ✔ | enum | Possible values: telnet, vnc, spice, spice+agent, none |
cpu_throttling | ✔ | integer | Percentage of CPU allowed for QEMU |
cpus | ✔ | ['integer', 'null'] | Number of vCPUs |
+ create_config_disk | ✔ | ['boolean', 'null'] | Automatically create a config disk on HDD disk interface (secondary slave) |
hda_disk_image | ✔ | string | QEMU hda disk image path |
hda_disk_image_md5sum | ✔ | ['string', 'null'] | QEMU hda disk image checksum |
hda_disk_interface | ✔ | string | QEMU hda interface |
@@ -113,8 +118,11 @@ Output
project_id | ✔ | string | Project UUID |
qemu_path | ✔ | string | Path to QEMU |
ram | ✔ | integer | Amount of RAM in MB |
+ replicate_network_connection_state | ✔ | boolean | Replicate the network connection state for links in Qemu |
save_vm_state | | ['boolean', 'null'] | Save VM state support |
status | ✔ | enum | Possible values: started, stopped, suspended |
+ tpm | ✔ | boolean | Enable the Trusted Platform Module (TPM) in Qemu |
+ uefi | ✔ | boolean | Enable the UEFI boot mode in Qemu |
usage | ✔ | string | How to use the QEMU VM |
diff --git a/docs/api/v2/compute/qemu/projectsprojectidqemunodesnodeid.rst b/docs/api/v2/compute/qemu/projectsprojectidqemunodesnodeid.rst
index fa458038..3a4073f2 100644
--- a/docs/api/v2/compute/qemu/projectsprojectidqemunodesnodeid.rst
+++ b/docs/api/v2/compute/qemu/projectsprojectidqemunodesnodeid.rst
@@ -36,6 +36,7 @@ Output
console_type | ✔ | enum | Possible values: telnet, vnc, spice, spice+agent, none |
cpu_throttling | ✔ | integer | Percentage of CPU allowed for QEMU |
cpus | ✔ | ['integer', 'null'] | Number of vCPUs |
+ create_config_disk | ✔ | ['boolean', 'null'] | Automatically create a config disk on HDD disk interface (secondary slave) |
hda_disk_image | ✔ | string | QEMU hda disk image path |
hda_disk_image_md5sum | ✔ | ['string', 'null'] | QEMU hda disk image checksum |
hda_disk_interface | ✔ | string | QEMU hda interface |
@@ -65,8 +66,11 @@ Output
project_id | ✔ | string | Project UUID |
qemu_path | ✔ | string | Path to QEMU |
ram | ✔ | integer | Amount of RAM in MB |
+ replicate_network_connection_state | ✔ | boolean | Replicate the network connection state for links in Qemu |
save_vm_state | | ['boolean', 'null'] | Save VM state support |
status | ✔ | enum | Possible values: started, stopped, suspended |
+ tpm | ✔ | boolean | Enable the Trusted Platform Module (TPM) in Qemu |
+ uefi | ✔ | boolean | Enable the UEFI boot mode in Qemu |
usage | ✔ | string | How to use the QEMU VM |
@@ -110,6 +114,7 @@ Input
console_type | | enum | Possible values: telnet, vnc, spice, spice+agent, none |
cpu_throttling | | ['integer', 'null'] | Percentage of CPU allowed for QEMU |
cpus | | ['integer', 'null'] | Number of vCPUs |
+ create_config_disk | | ['boolean', 'null'] | Automatically create a config disk on HDD disk interface (secondary slave) |
custom_adapters | | array | |
hda_disk_image | | string | QEMU hda disk image path |
hda_disk_image_md5sum | | ['string', 'null'] | QEMU hda disk image checksum |
@@ -138,6 +143,9 @@ Input
process_priority | | enum | Possible values: realtime, very high, high, normal, low, very low, null |
qemu_path | | ['string', 'null'] | Path to QEMU |
ram | | ['integer', 'null'] | Amount of RAM in MB |
+ replicate_network_connection_state | | ['boolean', 'null'] | Replicate the network connection state for links in Qemu |
+ tpm | | ['boolean', 'null'] | Enable the Trusted Platform Module (TPM) in Qemu |
+ uefi | | ['boolean', 'null'] | Enable the UEFI boot mode in Qemu |
usage | | string | How to use the QEMU VM |
@@ -159,6 +167,7 @@ Output
console_type | ✔ | enum | Possible values: telnet, vnc, spice, spice+agent, none |
cpu_throttling | ✔ | integer | Percentage of CPU allowed for QEMU |
cpus | ✔ | ['integer', 'null'] | Number of vCPUs |
+ create_config_disk | ✔ | ['boolean', 'null'] | Automatically create a config disk on HDD disk interface (secondary slave) |
hda_disk_image | ✔ | string | QEMU hda disk image path |
hda_disk_image_md5sum | ✔ | ['string', 'null'] | QEMU hda disk image checksum |
hda_disk_interface | ✔ | string | QEMU hda interface |
@@ -188,8 +197,11 @@ Output
project_id | ✔ | string | Project UUID |
qemu_path | ✔ | string | Path to QEMU |
ram | ✔ | integer | Amount of RAM in MB |
+ replicate_network_connection_state | ✔ | boolean | Replicate the network connection state for links in Qemu |
save_vm_state | | ['boolean', 'null'] | Save VM state support |
status | ✔ | enum | Possible values: started, stopped, suspended |
+ tpm | ✔ | boolean | Enable the Trusted Platform Module (TPM) in Qemu |
+ uefi | ✔ | boolean | Enable the UEFI boot mode in Qemu |
usage | ✔ | string | How to use the QEMU VM |
diff --git a/docs/api/v2/compute/qemu/projectsprojectidqemunodesnodeidstart.rst b/docs/api/v2/compute/qemu/projectsprojectidqemunodesnodeidstart.rst
index 5df86864..1f9b05a4 100644
--- a/docs/api/v2/compute/qemu/projectsprojectidqemunodesnodeidstart.rst
+++ b/docs/api/v2/compute/qemu/projectsprojectidqemunodesnodeidstart.rst
@@ -36,6 +36,7 @@ Output
console_type | ✔ | enum | Possible values: telnet, vnc, spice, spice+agent, none |
cpu_throttling | ✔ | integer | Percentage of CPU allowed for QEMU |
cpus | ✔ | ['integer', 'null'] | Number of vCPUs |
+ create_config_disk | ✔ | ['boolean', 'null'] | Automatically create a config disk on HDD disk interface (secondary slave) |
hda_disk_image | ✔ | string | QEMU hda disk image path |
hda_disk_image_md5sum | ✔ | ['string', 'null'] | QEMU hda disk image checksum |
hda_disk_interface | ✔ | string | QEMU hda interface |
@@ -65,8 +66,11 @@ Output
project_id | ✔ | string | Project UUID |
qemu_path | ✔ | string | Path to QEMU |
ram | ✔ | integer | Amount of RAM in MB |
+ replicate_network_connection_state | ✔ | boolean | Replicate the network connection state for links in Qemu |
save_vm_state | | ['boolean', 'null'] | Save VM state support |
status | ✔ | enum | Possible values: started, stopped, suspended |
+ tpm | ✔ | boolean | Enable the Trusted Platform Module (TPM) in Qemu |
+ uefi | ✔ | boolean | Enable the UEFI boot mode in Qemu |
usage | ✔ | string | How to use the QEMU VM |
diff --git a/docs/api/v2/controller/link/projectsprojectidlinks.rst b/docs/api/v2/controller/link/projectsprojectidlinks.rst
index 8022478f..f5e5ff7d 100644
--- a/docs/api/v2/controller/link/projectsprojectidlinks.rst
+++ b/docs/api/v2/controller/link/projectsprojectidlinks.rst
@@ -47,6 +47,7 @@ Input
capturing | | boolean | Read only property. True if a capture running on the link |
filters | | object | Packet filter. This allow to simulate latency and errors |
link_id | | string | Link UUID |
+ link_style | | object | Link line style |
link_type | | enum | Possible values: ethernet, serial |
nodes | | array | List of the VMS |
project_id | | string | Project UUID |
@@ -65,6 +66,7 @@ Output
capturing | | boolean | Read only property. True if a capture running on the link |
filters | | object | Packet filter. This allow to simulate latency and errors |
link_id | | string | Link UUID |
+ link_style | | object | Link line style |
link_type | | enum | Possible values: ethernet, serial |
nodes | | array | List of the VMS |
project_id | | string | Project UUID |
diff --git a/docs/api/v2/controller/link/projectsprojectidlinkslinkid.rst b/docs/api/v2/controller/link/projectsprojectidlinkslinkid.rst
index 14e82bd2..3da82ff1 100644
--- a/docs/api/v2/controller/link/projectsprojectidlinkslinkid.rst
+++ b/docs/api/v2/controller/link/projectsprojectidlinkslinkid.rst
@@ -30,6 +30,7 @@ Output
capturing | | boolean | Read only property. True if a capture running on the link |
filters | | object | Packet filter. This allow to simulate latency and errors |
link_id | | string | Link UUID |
+ link_style | | object | Link line style |
link_type | | enum | Possible values: ethernet, serial |
nodes | | array | List of the VMS |
project_id | | string | Project UUID |
@@ -69,6 +70,7 @@ Input
capturing | | boolean | Read only property. True if a capture running on the link |
filters | | object | Packet filter. This allow to simulate latency and errors |
link_id | | string | Link UUID |
+ link_style | | object | Link line style |
link_type | | enum | Possible values: ethernet, serial |
nodes | | array | List of the VMS |
project_id | | string | Project UUID |
@@ -87,6 +89,7 @@ Output
capturing | | boolean | Read only property. True if a capture running on the link |
filters | | object | Packet filter. This allow to simulate latency and errors |
link_id | | string | Link UUID |
+ link_style | | object | Link line style |
link_type | | enum | Possible values: ethernet, serial |
nodes | | array | List of the VMS |
project_id | | string | Project UUID |
diff --git a/docs/api/v2/controller/link/projectsprojectidlinkslinkidstartcapture.rst b/docs/api/v2/controller/link/projectsprojectidlinkslinkidstartcapture.rst
index 7db0a05a..bc8f6c42 100644
--- a/docs/api/v2/controller/link/projectsprojectidlinkslinkidstartcapture.rst
+++ b/docs/api/v2/controller/link/projectsprojectidlinkslinkidstartcapture.rst
@@ -39,6 +39,7 @@ Output
capturing | | boolean | Read only property. True if a capture running on the link |
filters | | object | Packet filter. This allow to simulate latency and errors |
link_id | | string | Link UUID |
+ link_style | | object | Link line style |
link_type | | enum | Possible values: ethernet, serial |
nodes | | array | List of the VMS |
project_id | | string | Project UUID |
diff --git a/docs/api/v2/controller/project/projects.rst b/docs/api/v2/controller/project/projects.rst
index fc6c8bd2..9b954366 100644
--- a/docs/api/v2/controller/project/projects.rst
+++ b/docs/api/v2/controller/project/projects.rst
@@ -19,6 +19,8 @@ Input
Name | Mandatory | Type | Description |
auto_close | | boolean | Project auto close |
+ auto_open | | boolean | Project open when GNS3 start |
+ auto_start | | boolean | Project start when opened |
drawing_grid_size | | integer | Grid size for the drawing area for drawings |
grid_size | | integer | Grid size for the drawing area for nodes |
name | ✔ | ['string', 'null'] | Project name |
diff --git a/docs/api/v2/controller/project/projectsprojectidduplicate.rst b/docs/api/v2/controller/project/projectsprojectidduplicate.rst
index 13e63c0f..ddfca566 100644
--- a/docs/api/v2/controller/project/projectsprojectidduplicate.rst
+++ b/docs/api/v2/controller/project/projectsprojectidduplicate.rst
@@ -24,11 +24,14 @@ Input
Name | Mandatory | Type | Description |
auto_close | | boolean | Project auto close |
+ auto_open | | boolean | Project open when GNS3 start |
+ auto_start | | boolean | Project start when opened |
drawing_grid_size | | integer | Grid size for the drawing area for drawings |
grid_size | | integer | Grid size for the drawing area for nodes |
name | ✔ | ['string', 'null'] | Project name |
path | | ['string', 'null'] | Project directory |
project_id | | ['string', 'null'] | Project UUID |
+ reset_mac_addresses | | boolean | Reset MAC addresses for this project |
scene_height | | integer | Height of the drawing area |
scene_width | | integer | Width of the drawing area |
show_grid | | boolean | Show the grid on the drawing area |
diff --git a/docs/controller_notifications.rst b/docs/controller_notifications.rst
index e21caa54..5d7765e0 100644
--- a/docs/controller_notifications.rst
+++ b/docs/controller_notifications.rst
@@ -50,6 +50,38 @@ A compute has been deleted.
.. literalinclude:: api/notifications/compute.deleted.json
+project.created
+---------------
+
+A project has been created.
+
+.. literalinclude:: api/notifications/project.created.json
+
+
+project.updated
+---------------
+
+A project has been updated.
+
+.. literalinclude:: api/notifications/project.updated.json
+
+
+project.closed
+---------------
+
+A project has been closed.
+
+.. literalinclude:: api/notifications/project.closed.json
+
+
+project.deleted
+---------------
+
+A project has been deleted.
+
+.. literalinclude:: api/notifications/project.deleted.json
+
+
template.created
-----------------
diff --git a/docs/curl.rst b/docs/curl.rst
index 20a4c85a..3188ce86 100644
--- a/docs/curl.rst
+++ b/docs/curl.rst
@@ -576,7 +576,7 @@ Read :doc:`project_notifications` for more information.
Where to find the endpoints?
-###########################
+############################
A list of all endpoints is available: :doc:`endpoints`
diff --git a/docs/gns3_file.json b/docs/gns3_file.json
index 825a9e87..a90d89b8 100644
--- a/docs/gns3_file.json
+++ b/docs/gns3_file.json
@@ -103,7 +103,8 @@
"properties": {
"name": {
"type": "string",
- "description": "Variable name"
+ "description": "Variable name",
+ "minLength": 1
},
"value": {
"type": "string",
@@ -387,6 +388,27 @@
"type": "boolean",
"description": "Suspend the link"
},
+ "link_style": {
+ "type": "object",
+ "description": "Link line style",
+ "items": {
+ "type": "object",
+ "properties": {
+ "color": {
+ "description": "Link line color",
+ "type": "string"
+ },
+ "width": {
+ "description": "Link line width",
+ "type": "integer"
+ },
+ "type": {
+ "description": "Link line type",
+ "type": "integer"
+ }
+ }
+ }
+ },
"filters": {
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "Packet filter. This allow to simulate latency and errors",
diff --git a/docs/project_notifications.rst b/docs/project_notifications.rst
index f37dd07e..3eba55a8 100644
--- a/docs/project_notifications.rst
+++ b/docs/project_notifications.rst
@@ -100,28 +100,12 @@ A drawing has been deleted.
.. literalinclude:: api/notifications/drawing.deleted.json
-project.updated
----------------
-
-A project has been updated.
-
-.. literalinclude:: api/notifications/project.updated.json
-
-
-project.closed
----------------
-
-A project has been closed.
-
-.. literalinclude:: api/notifications/project.closed.json
-
-
snapshot.restored
--------------------------
A snapshot has been restored
-.. literalinclude:: api/notifications/project.snapshot_restored.json
+.. literalinclude:: api/notifications/snapshot.restored.json
log.error
---------
diff --git a/gns3server/appliances/bird.gns3a b/gns3server/appliances/bird.gns3a
index ac4dac99..b18e18e8 100644
--- a/gns3server/appliances/bird.gns3a
+++ b/gns3server/appliances/bird.gns3a
@@ -11,7 +11,7 @@
"status": "stable",
"maintainer": "GNS3 Team",
"maintainer_email": "developers@gns3.net",
- "usage": "Configure interfaces in /opt/bootlocal.sh, BIRD configuration is done in /usr/local/etc/bird",
+ "usage": "\n*** BIRD v1 is end-of-life ***\nPlease use the BIRD2 appliance.\n\nConfigure interfaces in /opt/bootlocal.sh, BIRD configuration is done in /usr/local/etc/bird",
"qemu": {
"adapter_type": "e1000",
"adapters": 4,
diff --git a/gns3server/appliances/cisco-asav.gns3a b/gns3server/appliances/cisco-asav.gns3a
index 0d16abf1..48ee3196 100644
--- a/gns3server/appliances/cisco-asav.gns3a
+++ b/gns3server/appliances/cisco-asav.gns3a
@@ -26,6 +26,13 @@
"kvm": "require"
},
"images": [
+ {
+ "filename": "asav9-18-2.qcow2",
+ "version": "9.18.2 CML",
+ "md5sum": "6f10fe106edfad9163625770a47a6b73",
+ "filesize": 340262912,
+ "download_url": "https://learningnetworkstore.cisco.com/cisco-modeling-labs-personal/cisco-modeling-labs-personal/CML-PERSONAL.html"
+ },
{
"filename": "asav9-16-2.qcow2",
"version": "9.16.2 CML",
@@ -119,6 +126,12 @@
}
],
"versions": [
+ {
+ "name": "9.18.2 CML",
+ "images": {
+ "hda_disk_image": "asav9-18-2.qcow2"
+ }
+ },
{
"name": "9.16.2 CML",
"images": {
diff --git a/gns3server/appliances/cisco-c8000v.gns3a b/gns3server/appliances/cisco-c8000v.gns3a
index dae024ad..c63f09ec 100644
--- a/gns3server/appliances/cisco-c8000v.gns3a
+++ b/gns3server/appliances/cisco-c8000v.gns3a
@@ -24,6 +24,13 @@
"kvm": "require"
},
"images": [
+ {
+ "filename": "c8000v-universalk9_8G_serial.17.09.01a.qcow2",
+ "version": "17.09.01a 8G",
+ "md5sum": "a10ae2c4d71f4eb611bc4d83ad7709f0",
+ "filesize": 1856634880,
+ "download_url": "https://software.cisco.com/download/home/286327102/type/282046477/release/Bengaluru-17.6.5"
+ },
{
"filename": "c8000v-universalk9_8G_serial.17.06.05.qcow2",
"version": "17.06.05 8G",
@@ -54,6 +61,12 @@
}
],
"versions": [
+ {
+ "name": "17.09.01a 8G",
+ "images": {
+ "hda_disk_image": "c8000v-universalk9_8G_serial.17.09.01a.qcow2"
+ }
+ },
{
"name": "17.06.05 8G",
"images": {
diff --git a/gns3server/appliances/cisco-csr1000v.gns3a b/gns3server/appliances/cisco-csr1000v.gns3a
index 135367c6..d1afb91f 100644
--- a/gns3server/appliances/cisco-csr1000v.gns3a
+++ b/gns3server/appliances/cisco-csr1000v.gns3a
@@ -24,6 +24,13 @@
"kvm": "require"
},
"images": [
+ {
+ "filename": "csr1000v-universalk9.17.03.06-serial.qcow2",
+ "version": "17.03.06",
+ "md5sum": "086ab9bef6e66de847af0da3910c60e8",
+ "filesize": 1422000128,
+ "download_url": "https://software.cisco.com/download/home/284364978/type/282046477/release/Gibraltar-16.12.3"
+ },
{
"filename": "csr1000v-universalk9.16.12.03-serial.qcow2",
"version": "16.12.3",
@@ -159,6 +166,12 @@
}
],
"versions": [
+ {
+ "name": "17.03.06",
+ "images": {
+ "hda_disk_image": "csr1000v-universalk9.17.03.06-serial.qcow2"
+ }
+ },
{
"name": "16.12.3",
"images": {
diff --git a/gns3server/appliances/cisco-iosxrv9k.gns3a b/gns3server/appliances/cisco-iosxrv9k.gns3a
index 18f0551c..9373437e 100644
--- a/gns3server/appliances/cisco-iosxrv9k.gns3a
+++ b/gns3server/appliances/cisco-iosxrv9k.gns3a
@@ -26,6 +26,13 @@
"options": "-smp 4 -cpu host"
},
"images": [
+ {
+ "filename": "xrv9k-fullk9-x-7.7.1.qcow2",
+ "version": "7.7.1",
+ "md5sum": "682fff40d2ff373d8da3342906553b54",
+ "filesize": 1643905024,
+ "download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/7.1.1"
+ },
{
"filename": "xrv9k-fullk9-x-7.1.1.qcow2",
"version": "7.1.1",
@@ -105,6 +112,12 @@
}
],
"versions": [
+ {
+ "name": "7.7.1",
+ "images": {
+ "hda_disk_image": "xrv9k-fullk9-x-7.7.1.qcow2"
+ }
+ },
{
"name": "7.1.1",
"images": {
diff --git a/gns3server/appliances/cisco-nxosv9k.gns3a b/gns3server/appliances/cisco-nxosv9k.gns3a
index b830275b..00120391 100644
--- a/gns3server/appliances/cisco-nxosv9k.gns3a
+++ b/gns3server/appliances/cisco-nxosv9k.gns3a
@@ -26,6 +26,13 @@
"kvm": "require"
},
"images": [
+ {
+ "filename": "nexus9300v64.10.3.1.F.qcow2",
+ "version": "9300v 10.3.1.F",
+ "md5sum": "a6ffd2501a5791c11cee319943b912da",
+ "filesize": 2097086464,
+ "download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.1(1)"
+ },
{
"filename": "nexus9500v64.10.1.1.qcow2",
"version": "9500v 10.1.1",
@@ -198,6 +205,13 @@
}
],
"versions": [
+ {
+ "name": "9300v 10.3.1.F",
+ "images": {
+ "bios_image": "OVMF-edk2-stable202305.fd",
+ "hda_disk_image": "nexus9300v64.10.3.1.F.qcow2"
+ }
+ },
{
"name": "9500v 10.1.1",
"images": {
diff --git a/gns3server/appliances/debian.gns3a b/gns3server/appliances/debian.gns3a
index 91525a42..0d1defd8 100644
--- a/gns3server/appliances/debian.gns3a
+++ b/gns3server/appliances/debian.gns3a
@@ -24,12 +24,12 @@
},
"images": [
{
- "filename": "debian-12.2.qcow2",
- "version": "12.2",
- "md5sum": "adf7716ec4a4e4e9e5ccfc7a1d7bd103",
- "filesize": 286654464,
+ "filename": "debian-12.4.qcow2",
+ "version": "12.4",
+ "md5sum": "adcf7fdc25e10b3d2d9e2ef91168bffd",
+ "filesize": 286179840,
"download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/",
- "direct_download_url": "https://downloads.sourceforge.net/project/gns-3/Qemu%20Appliances/debian-12.2.qcow2"
+ "direct_download_url": "https://downloads.sourceforge.net/project/gns-3/Qemu%20Appliances/debian-12.4.qcow2"
},
{
"filename": "debian-11.8.qcow2",
@@ -42,9 +42,9 @@
],
"versions": [
{
- "name": "12.2",
+ "name": "12.4",
"images": {
- "hda_disk_image": "debian-12.2.qcow2"
+ "hda_disk_image": "debian-12.4.qcow2"
}
},
{
diff --git a/gns3server/appliances/dell-ftos.gns3a b/gns3server/appliances/dell-ftos.gns3a
index 763d0e81..9bcbd6ac 100644
--- a/gns3server/appliances/dell-ftos.gns3a
+++ b/gns3server/appliances/dell-ftos.gns3a
@@ -11,26 +11,36 @@
"status": "experimental",
"maintainer": "GNS3 Team",
"maintainer_email": "developers@gns3.net",
- "usage": "Make sure the Boot priority of the configuration template is HDD or CD.\n\nAbort the BCM process and format the flash after first boot by entering these commands:\nen\nformat flash:\n\nSometimes the flash device is not available after boot.",
+ "usage": "Make sure the Boot priority of the configuration template is HDD or CD.\n\nFor FTOS 9.8, switch to vnc console, start the device, abort the BMP process and format the flash after first boot by entering these commands:\nen\nformat flash:\n\nSometimes the flash device is not available after boot.",
"first_port_name": "Management0/0",
"port_name_format": "fortyGigE0/{0}",
"qemu": {
"adapter_type": "e1000",
"adapters": 6,
- "ram": 512,
+ "ram": 1024,
"hda_disk_interface": "ide",
"arch": "i386",
- "console_type": "vnc",
+ "console_type": "telnet",
"boot_priority": "cd",
"kvm": "require"
},
"images": [
+ {
+ "filename": "FTOS-SI-9.13.0.0.iso",
+ "version": "9.13.0",
+ "md5sum": "8418049e451c76e7b85e36eca0a0a730",
+ "filesize": 131278848,
+ "download_url": "https://www.dell.com/support/kbdoc/en-us/000184062/ftos-for-s-series-os-emulator-current-release-evaluation-version",
+ "direct_download_url": "https://downloads.dell.com/translatedpdf/force10/os9/FTOS-SI-9.13.0.0.zip",
+ "compression": "zip"
+ },
{
"filename": "FTOS-SI-9.8.0.0.iso",
"version": "9.8.0",
"md5sum": "b9b50eda0a73407dc381792ff7975e24",
"filesize": 108115968,
- "download_url": "https://www.force10networks.com/CSPortal20/Software/SSeriesDownloads.aspx",
+ "download_url": "https://www.dell.com/support/kbdoc/en-us/000184062/ftos-for-s-series-os-emulator-current-release-evaluation-version",
+ "direct_download_url": "https://downloads.dell.com/translatedpdf/force10/os9/FTOS-SI-9.8.0.0.zip",
"compression": "zip"
},
{
@@ -43,6 +53,13 @@
}
],
"versions": [
+ {
+ "name": "9.13.0",
+ "images": {
+ "hda_disk_image": "empty30G.qcow2",
+ "cdrom_image": "FTOS-SI-9.13.0.0.iso"
+ }
+ },
{
"name": "9.8.0",
"images": {
diff --git a/gns3server/appliances/fedora-cloud.gns3a b/gns3server/appliances/fedora-cloud.gns3a
index 1a1c27e6..5024c31b 100644
--- a/gns3server/appliances/fedora-cloud.gns3a
+++ b/gns3server/appliances/fedora-cloud.gns3a
@@ -26,6 +26,14 @@
"options": "-nographic"
},
"images": [
+ {
+ "filename": "Fedora-Cloud-Base-39-1.5.x86_64.qcow2",
+ "version": "39-1.5",
+ "md5sum": "800a10df2d369891ed65900bcacacd47",
+ "filesize": 544604160,
+ "download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/39/Cloud/x86_64/images",
+ "direct_download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/39/Cloud/x86_64/images/Fedora-Cloud-Base-39-1.5.x86_64.qcow2"
+ },
{
"filename": "Fedora-Cloud-Base-38-1.6.x86_64.qcow2",
"version": "38-1.6",
@@ -34,30 +42,6 @@
"download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/38/Cloud/x86_64/images",
"direct_download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/38/Cloud/x86_64/images/Fedora-Cloud-Base-38-1.6.x86_64.qcow2"
},
- {
- "filename": "Fedora-Cloud-Base-37-1.7.x86_64.qcow2",
- "version": "37-1.7",
- "md5sum": "36f7b464b6ab46ad97c001b539495e90",
- "filesize": 492830720,
- "download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/37/Cloud/x86_64/images",
- "direct_download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/37/Cloud/x86_64/images/Fedora-Cloud-Base-37-1.7.x86_64.qcow2"
- },
- {
- "filename": "Fedora-Cloud-Base-36-1.5.x86_64.qcow2",
- "version": "36-1.5",
- "md5sum": "7f7cdad25b77f232078bf454c39529d3",
- "filesize": 448266240,
- "download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/36/Cloud/x86_64/images",
- "direct_download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/36/Cloud/x86_64/images/Fedora-Cloud-Base-36-1.5.x86_64.qcow2"
- },
- {
- "filename": "Fedora-Cloud-Base-35-1.2.x86_64.qcow2",
- "version": "35-1.2",
- "md5sum": "cfa9cdcfb946e5f4cf9dd4d7906008d0",
- "filesize": 376897536,
- "download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/35/Cloud/x86_64/images",
- "direct_download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/35/Cloud/x86_64/images/Fedora-Cloud-Base-35-1.2.x86_64.qcow2"
- },
{
"filename": "fedora-cloud-init-data.iso",
"version": "1.0",
@@ -68,33 +52,19 @@
}
],
"versions": [
+ {
+ "name": "39-1.5",
+ "images": {
+ "hda_disk_image": "Fedora-Cloud-Base-39-1.5.x86_64.qcow2",
+ "cdrom_image": "fedora-cloud-init-data.iso"
+ }
+ },
{
"name": "38-1.6",
"images": {
"hda_disk_image": "Fedora-Cloud-Base-38-1.6.x86_64.qcow2",
"cdrom_image": "fedora-cloud-init-data.iso"
}
- },
- {
- "name": "37-1.7",
- "images": {
- "hda_disk_image": "Fedora-Cloud-Base-37-1.7.x86_64.qcow2",
- "cdrom_image": "fedora-cloud-init-data.iso"
- }
- },
- {
- "name": "36-1.5",
- "images": {
- "hda_disk_image": "Fedora-Cloud-Base-36-1.5.x86_64.qcow2",
- "cdrom_image": "fedora-cloud-init-data.iso"
- }
- },
- {
- "name": "35-1.2",
- "images": {
- "hda_disk_image": "Fedora-Cloud-Base-35-1.2.x86_64.qcow2",
- "cdrom_image": "fedora-cloud-init-data.iso"
- }
}
]
}
diff --git a/gns3server/appliances/huawei-ne40e.gns3a b/gns3server/appliances/huawei-ne40e.gns3a
index 1e7f89d6..878cd2b0 100644
--- a/gns3server/appliances/huawei-ne40e.gns3a
+++ b/gns3server/appliances/huawei-ne40e.gns3a
@@ -7,16 +7,65 @@
"vendor_url": "https://www.huawei.com",
"product_name": "HuaWei NE40E",
"product_url": "https://e.huawei.com/en/products/enterprise-networking/routers/ne/ne40e",
- "registry_version": 4,
+ "registry_version": 6,
"status": "experimental",
"availability": "service-contract",
"maintainer": "none",
"maintainer_email": "",
- "first_port_name": "eth0",
"port_name_format": "Ethernet1/0/{0}",
"qemu": {
"adapter_type": "e1000",
"adapters": 12,
+ "custom_adapters": [
+ {
+ "adapter_number": 0,
+ "port_name": "Gi0/0/0"
+ },
+ {
+ "adapter_number": 1,
+ "port_name": "Mgmt0/0"
+ },
+ {
+ "adapter_number": 2,
+ "port_name": "Ethernet1/0/0"
+ },
+ {
+ "adapter_number": 3,
+ "port_name": "Ethernet1/0/1"
+ },
+ {
+ "adapter_number": 4,
+ "port_name": "Ethernet1/0/2"
+ },
+ {
+ "adapter_number": 5,
+ "port_name": "Ethernet1/0/3"
+ },
+ {
+ "adapter_number": 6,
+ "port_name": "Ethernet1/0/4"
+ },
+ {
+ "adapter_number": 7,
+ "port_name": "Ethernet1/0/5"
+ },
+ {
+ "adapter_number": 8,
+ "port_name": "Ethernet1/0/6"
+ },
+ {
+ "adapter_number": 9,
+ "port_name": "Ethernet1/0/7"
+ },
+ {
+ "adapter_number": 10,
+ "port_name": "Ethernet1/0/8"
+ },
+ {
+ "adapter_number": 11,
+ "port_name": "Ethernet1/0/9"
+ }
+ ],
"ram": 2048,
"cpus": 2,
"hda_disk_interface": "ide",
diff --git a/gns3server/appliances/ostinato.gns3a b/gns3server/appliances/ostinato.gns3a
index ec9a991b..190c6861 100644
--- a/gns3server/appliances/ostinato.gns3a
+++ b/gns3server/appliances/ostinato.gns3a
@@ -30,6 +30,13 @@
"options": "-vga std -usbdevice tablet"
},
"images": [
+ {
+ "version": "1.3.0",
+ "filename": "ostinatostd-1.3.0-1.qcow2",
+ "filesize": 173735936,
+ "md5sum": "ff25fed989c43aeac84bf0d542ad43ba",
+ "download_url": "https://ostinato.org/pricing/gns3"
+ },
{
"filename": "ostinatostd-1.2.0-1.qcow2",
"version": "1.2.0",
@@ -46,6 +53,12 @@
}
],
"versions": [
+ {
+ "name": "1.3.0",
+ "images": {
+ "hda_disk_image": "ostinatostd-1.3.0-1.qcow2"
+ }
+ },
{
"name": "1.2.0",
"images": {
diff --git a/gns3server/appliances/rhel.gns3a b/gns3server/appliances/rhel.gns3a
index 291802b5..79dbb768 100644
--- a/gns3server/appliances/rhel.gns3a
+++ b/gns3server/appliances/rhel.gns3a
@@ -11,9 +11,9 @@
"registry_version": 4,
"status": "stable",
"availability": "service-contract",
- "maintainer": "Neyder Achahuanco",
- "maintainer_email": "neyder@neyder.net",
- "usage": "You should download Red Hat Enterprise Linux KVM Guest Image from https://access.redhat.com/downloads/content/479/ver=/rhel---9/9.2/x86_64/product-software attach/customize cloud-init.iso and start.\nusername: cloud-user\npassword: redhat",
+ "maintainer": "Da-Geek",
+ "maintainer_email": "dageek@dageeks-geeks.gg",
+ "usage": "You should download Red Hat Enterprise Linux KVM Guest Image from https://access.redhat.com/downloads/content/479/ver=/rhel---9/9.3/x86_64/product-software attach/customize rhel-cloud-init.iso and start.\nusername: cloud-user\npassword: redhat",
"qemu": {
"adapter_type": "virtio-net-pci",
"adapters": 1,
@@ -26,6 +26,13 @@
"options": "-cpu host -nographic"
},
"images": [
+ {
+ "filename": "rhel-9.3-x86_64-kvm.qcow2",
+ "version": "9.3",
+ "md5sum": "409d8d15f5177db2617b0e3e02139b5c",
+ "filesize": 858193920,
+ "download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---9/9.3/x86_64/product-software"
+ },
{
"filename": "rhel-9.2-x86_64-kvm.qcow2",
"version": "9.2",
@@ -112,6 +119,13 @@
}
],
"versions": [
+ {
+ "name": "9.3",
+ "images": {
+ "hda_disk_image": "rhel-9.3-x86_64-kvm.qcow2",
+ "cdrom_image": "rhel-cloud-init.iso"
+ }
+ },
{
"name": "9.2",
"images": {
diff --git a/gns3server/appliances/rockylinux.gns3a b/gns3server/appliances/rockylinux.gns3a
index fcbfad71..65817a76 100644
--- a/gns3server/appliances/rockylinux.gns3a
+++ b/gns3server/appliances/rockylinux.gns3a
@@ -26,6 +26,14 @@
"options": "-nographic -cpu host"
},
"images": [
+ {
+ "filename": "Rocky-9-GenericCloud-Base-9.3-20231113.0.x86_64.qcow2",
+ "version": "9.3",
+ "md5sum": "48cdeb033364af5909e15ee48d0e144d",
+ "filesize": 1083965440,
+ "download_url": "https://download.rockylinux.org/pub/rocky/9/images/x86_64/",
+ "direct_download_url": "https://download.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-GenericCloud-Base-9.3-20231113.0.x86_64.qcow2"
+ },
{
"filename": "Rocky-9-GenericCloud-Base-9.2-20230513.0.x86_64.qcow2",
"version": "9.2",
@@ -34,6 +42,14 @@
"download_url": "https://download.rockylinux.org/pub/rocky/9/images/x86_64/",
"direct_download_url": "https://download.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-GenericCloud-Base-9.2-20230513.0.x86_64.qcow2"
},
+ {
+ "filename": "Rocky-8-GenericCloud-Base-8.9-20231119.0.x86_64.qcow2",
+ "version": "8.9",
+ "md5sum": "50c44d8d9c4df43694372c13768f114c",
+ "filesize": 1971978240,
+ "download_url": "https://download.rockylinux.org/pub/rocky/8/images/x86_64/",
+ "direct_download_url": "https://download.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-GenericCloud-Base-8.9-20231119.0.x86_64.qcow2"
+ },
{
"filename": "Rocky-8-GenericCloud-Base-8.8-20230518.0.x86_64.qcow2",
"version": "8.8",
@@ -52,6 +68,13 @@
}
],
"versions": [
+ {
+ "name": "9.3",
+ "images": {
+ "hda_disk_image": "Rocky-9-GenericCloud-Base-9.3-20231113.0.x86_64.qcow2",
+ "cdrom_image": "rocky-cloud-init-data.iso"
+ }
+ },
{
"name": "9.2",
"images": {
@@ -59,6 +82,13 @@
"cdrom_image": "rocky-cloud-init-data.iso"
}
},
+ {
+ "name": "8.9",
+ "images": {
+ "hda_disk_image": "Rocky-8-GenericCloud-Base-8.9-20231119.0.x86_64.qcow2",
+ "cdrom_image": "rocky-cloud-init-data.iso"
+ }
+ },
{
"name": "8.8",
"images": {
diff --git a/gns3server/appliances/ubuntu-cloud.gns3a b/gns3server/appliances/ubuntu-cloud.gns3a
index a9496741..cd2eb457 100644
--- a/gns3server/appliances/ubuntu-cloud.gns3a
+++ b/gns3server/appliances/ubuntu-cloud.gns3a
@@ -28,12 +28,12 @@
},
"images": [
{
- "filename": "ubuntu-23.04-server-cloudimg-arm64.img",
+ "filename": "ubuntu-23.04-server-cloudimg-amd64.img",
"version": "Ubuntu 23.04 (Lunar Lobster)",
- "md5sum": "35fa3b31b65717af6f0520a769aac8c0",
- "filesize": 786432000,
+ "md5sum": "369e3b1f68416c39245a8014172406dd",
+ "filesize": 756678656,
"download_url": "https://cloud-images.ubuntu.com/releases/23.04/release/",
- "direct_download_url": "https://cloud-images.ubuntu.com/releases/23.04/release/ubuntu-23.04-server-cloudimg-arm64.img"
+ "direct_download_url": "https://cloud-images.ubuntu.com/releases/23.04/release/ubuntu-23.04-server-cloudimg-amd64.img"
},
{
"filename": "ubuntu-22.04-server-cloudimg-amd64.img",
@@ -72,7 +72,7 @@
{
"name": "Ubuntu 23.04 (Lunar Lobster)",
"images": {
- "hda_disk_image": "ubuntu-23.04-server-cloudimg-arm64.img",
+ "hda_disk_image": "ubuntu-23.04-server-cloudimg-amd64.img",
"cdrom_image": "ubuntu-cloud-init-data.iso"
}
},
diff --git a/gns3server/compute/base_node.py b/gns3server/compute/base_node.py
index a41a417a..639a5d41 100644
--- a/gns3server/compute/base_node.py
+++ b/gns3server/compute/base_node.py
@@ -656,6 +656,9 @@ class BaseNode:
"""
path = self._manager.config.get_section_config("Server").get("ubridge_path", "ubridge")
+ if sys.platform.startswith("win") and hasattr(sys, "frozen"):
+ ubridge_dir = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(sys.executable)), "ubridge"))
+ os.environ["PATH"] = os.pathsep.join(ubridge_dir) + os.pathsep + os.environ.get("PATH", "")
path = shutil.which(path)
return path
diff --git a/gns3server/compute/dynamips/__init__.py b/gns3server/compute/dynamips/__init__.py
index c7287638..ce1d8722 100644
--- a/gns3server/compute/dynamips/__init__.py
+++ b/gns3server/compute/dynamips/__init__.py
@@ -252,6 +252,9 @@ class Dynamips(BaseManager):
# look for Dynamips
dynamips_path = self.config.get_section_config("Dynamips").get("dynamips_path", "dynamips")
if not os.path.isabs(dynamips_path):
+ if sys.platform.startswith("win") and hasattr(sys, "frozen"):
+ dynamips_dir = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(sys.executable)), "dynamips"))
+ os.environ["PATH"] = os.pathsep.join(dynamips_dir) + os.pathsep + os.environ.get("PATH", "")
dynamips_path = shutil.which(dynamips_path)
if not dynamips_path:
diff --git a/gns3server/compute/qemu/__init__.py b/gns3server/compute/qemu/__init__.py
index 542611d5..9e915fb8 100644
--- a/gns3server/compute/qemu/__init__.py
+++ b/gns3server/compute/qemu/__init__.py
@@ -160,13 +160,20 @@ class Qemu(BaseManager):
for arch in archs:
if f.endswith(arch) or f.endswith("{}.exe".format(arch)) or f.endswith("{}w.exe".format(arch)):
qemu_path = os.path.join(path, f)
- version = await Qemu.get_qemu_version(qemu_path)
+ try:
+ version = await Qemu.get_qemu_version(qemu_path)
+ except QemuError as e:
+ log.warning(str(e))
+ continue
qemus.append({"path": qemu_path, "version": version})
else:
qemu_path = os.path.join(path, f)
- version = await Qemu.get_qemu_version(qemu_path)
+ try:
+ version = await Qemu.get_qemu_version(qemu_path)
+ except QemuError as e:
+ log.warning(str(e))
+ continue
qemus.append({"path": qemu_path, "version": version})
-
except OSError:
continue
diff --git a/gns3server/compute/qemu/qemu_vm.py b/gns3server/compute/qemu/qemu_vm.py
index 94b50114..63eac753 100644
--- a/gns3server/compute/qemu/qemu_vm.py
+++ b/gns3server/compute/qemu/qemu_vm.py
@@ -2426,6 +2426,9 @@ class QemuVM(BaseNode):
command.extend(shlex.split(additional_options))
except ValueError as e:
raise QemuError("Invalid additional options: {} error {}".format(additional_options, e))
+ # avoiding mouse offset (see https://github.com/GNS3/gns3-server/issues/2335)
+ if self._console_type == "vnc":
+ command.extend(['-machine', 'usb=on', '-device', 'usb-tablet'])
return command
def __json__(self):
diff --git a/gns3server/compute/vpcs/vpcs_vm.py b/gns3server/compute/vpcs/vpcs_vm.py
index 6fa29bf2..e5164df6 100644
--- a/gns3server/compute/vpcs/vpcs_vm.py
+++ b/gns3server/compute/vpcs/vpcs_vm.py
@@ -140,6 +140,9 @@ class VPCSVM(BaseNode):
vpcs_path = self._manager.config.get_section_config("VPCS").get("vpcs_path", "vpcs")
if not os.path.isabs(vpcs_path):
+ if sys.platform.startswith("win") and hasattr(sys, "frozen"):
+ vpcs_dir = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(sys.executable)), "vpcs"))
+ os.environ["PATH"] = os.pathsep.join(vpcs_dir) + os.pathsep + os.environ.get("PATH", "")
vpcs_path = shutil.which(vpcs_path)
return vpcs_path
diff --git a/gns3server/controller/project.py b/gns3server/controller/project.py
index c4dc3b95..eed15198 100644
--- a/gns3server/controller/project.py
+++ b/gns3server/controller/project.py
@@ -130,16 +130,27 @@ class Project:
self._iou_id_lock = asyncio.Lock()
log.debug('Project "{name}" [{id}] loaded'.format(name=self.name, id=self._id))
+ self.emit_controller_notification("project.created", self.__json__())
def emit_notification(self, action, event):
"""
- Emit a notification to all clients using this project.
+ Emit a project notification to all clients using this project.
:param action: Action name
:param event: Event to send
"""
- self.controller.notification.project_emit(action, event, project_id=self.id)
+ self._controller.notification.project_emit(action, event, project_id=self.id)
+
+ def emit_controller_notification(self, action, event):
+ """
+ Emit a controller notification, all clients will see it.
+
+ :param action: Action name
+ :param event: Event to send
+ """
+
+ self._controller.notification.controller_emit(action, event)
async def update(self, **kwargs):
"""
@@ -154,7 +165,7 @@ class Project:
# We send notif only if object has changed
if old_json != self.__json__():
- self.emit_notification("project.updated", self.__json__())
+ self.emit_controller_notification("project.updated", self.__json__())
self.dump()
# update on computes
@@ -803,7 +814,8 @@ class Project:
self._clean_pictures()
self._status = "closed"
if not ignore_notification:
- self.emit_notification("project.closed", self.__json__())
+ self.emit_controller_notification("project.closed", self.__json__())
+
self.reset()
self._closing = False
@@ -857,6 +869,7 @@ class Project:
shutil.rmtree(self.path)
except OSError as e:
raise aiohttp.web.HTTPConflict(text="Cannot delete project directory {}: {}".format(self.path, str(e)))
+ self.emit_controller_notification("project.deleted", self.__json__())
async def delete_on_computes(self):
"""
@@ -976,7 +989,7 @@ class Project:
await self.add_drawing(dump=False, **drawing_data)
self.dump()
- # We catch all error to be able to rollback the .gns3 to the previous state
+ # We catch all error to be able to roll back the .gns3 to the previous state
except Exception as e:
for compute in list(self._project_created_on_compute):
try:
@@ -1001,6 +1014,7 @@ class Project:
pass
self._loading = False
+ self.emit_controller_notification("project.opened", self.__json__())
# Should we start the nodes when project is open
if self._auto_start:
# Start all in the background without waiting for completion
diff --git a/gns3server/crash_report.py b/gns3server/crash_report.py
index f3ab0858..1c39f29a 100644
--- a/gns3server/crash_report.py
+++ b/gns3server/crash_report.py
@@ -57,7 +57,7 @@ class CrashReport:
Report crash to a third party service
"""
- DSN = "https://eb1150edfa1530053154ff1fcb67afd1@o19455.ingest.sentry.io/38482"
+ DSN = "https://ffea69bec1b4f934d815234ea0046382@o19455.ingest.sentry.io/38482"
_instance = None
def __init__(self):
diff --git a/gns3server/schemas/ethernet_hub.py b/gns3server/schemas/ethernet_hub.py
index 363ad470..71873bc4 100644
--- a/gns3server/schemas/ethernet_hub.py
+++ b/gns3server/schemas/ethernet_hub.py
@@ -17,28 +17,30 @@
import copy
+ETHERNET_HUB_PORT_SCHEMA = {
+ "description": "Ethernet port",
+ "properties": {
+ "name": {
+ "description": "Port name",
+ "type": "string",
+ "minLength": 1,
+ },
+ "port_number": {
+ "description": "Port number",
+ "type": "integer",
+ "minimum": 0
+ },
+ },
+ "required": ["name", "port_number"],
+ "additionalProperties": False
+}
+
ETHERNET_HUB_CREATE_SCHEMA = {
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "Request validation to create a new Ethernet hub instance",
"type": "object",
"definitions": {
- "EthernetHubPort": {
- "description": "Ethernet port",
- "properties": {
- "name": {
- "description": "Port name",
- "type": "string",
- "minLength": 1,
- },
- "port_number": {
- "description": "Port number",
- "type": "integer",
- "minimum": 0
- },
- },
- "required": ["name", "port_number"],
- "additionalProperties": False
- },
+ "EthernetHubPort": ETHERNET_HUB_PORT_SCHEMA
},
"properties": {
"name": {
@@ -57,12 +59,9 @@ ETHERNET_HUB_CREATE_SCHEMA = {
},
"ports_mapping": {
"type": "array",
- "items": [
- {"type": "object",
- "oneOf": [
- {"$ref": "#/definitions/EthernetHubPort"}
- ]},
- ]
+ "items": {
+ "$ref": "#/definitions/EthernetHubPort"
+ }
},
},
"additionalProperties": False,
@@ -74,23 +73,7 @@ ETHERNET_HUB_OBJECT_SCHEMA = {
"description": "Ethernet hub instance",
"type": "object",
"definitions": {
- "EthernetHubPort": {
- "description": "Ethernet port",
- "properties": {
- "name": {
- "description": "Port name",
- "type": "string",
- "minLength": 1,
- },
- "port_number": {
- "description": "Port number",
- "type": "integer",
- "minimum": 0
- },
- },
- "required": ["name", "port_number"],
- "additionalProperties": False
- },
+ "EthernetHubPort": ETHERNET_HUB_PORT_SCHEMA
},
"properties": {
"name": {
@@ -114,12 +97,9 @@ ETHERNET_HUB_OBJECT_SCHEMA = {
},
"ports_mapping": {
"type": "array",
- "items": [
- {"type": "object",
- "oneOf": [
- {"$ref": "#/definitions/EthernetHubPort"}
- ]},
- ]
+ "items": {
+ "$ref": "#/definitions/EthernetHubPort"
+ }
},
"status": {
"description": "Node status",
diff --git a/gns3server/schemas/ethernet_switch.py b/gns3server/schemas/ethernet_switch.py
index 52951d3b..e8738b83 100644
--- a/gns3server/schemas/ethernet_switch.py
+++ b/gns3server/schemas/ethernet_switch.py
@@ -17,40 +17,42 @@
import copy
+ETHERNET_SWITCH_PORT_SCHEMA = {
+ "description": "Ethernet switch port",
+ "properties": {
+ "name": {
+ "description": "Port name",
+ "type": "string",
+ "minLength": 1,
+ },
+ "port_number": {
+ "description": "Port number",
+ "type": "integer",
+ "minimum": 0
+ },
+ "type": {
+ "description": "Port type",
+ "enum": ["access", "dot1q", "qinq"],
+ },
+ "vlan": {"description": "VLAN number",
+ "type": "integer",
+ "minimum": 1
+ },
+ "ethertype": {
+ "description": "QinQ Ethertype",
+ "enum": ["", "0x8100", "0x88A8", "0x9100", "0x9200"],
+ },
+ },
+ "required": ["name", "port_number", "type"],
+ "additionalProperties": False
+}
+
ETHERNET_SWITCH_CREATE_SCHEMA = {
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "Request validation to create a new Ethernet switch instance",
"type": "object",
"definitions": {
- "EthernetSwitchPort": {
- "description": "Ethernet port",
- "properties": {
- "name": {
- "description": "Port name",
- "type": "string",
- "minLength": 1,
- },
- "port_number": {
- "description": "Port number",
- "type": "integer",
- "minimum": 0
- },
- "type": {
- "description": "Port type",
- "enum": ["access", "dot1q", "qinq"],
- },
- "vlan": {"description": "VLAN number",
- "type": "integer",
- "minimum": 1
- },
- "ethertype": {
- "description": "QinQ Ethertype",
- "enum": ["", "0x8100", "0x88A8", "0x9100", "0x9200"],
- },
- },
- "required": ["name", "port_number", "type"],
- "additionalProperties": False
- },
+ "EthernetSwitchPort": ETHERNET_SWITCH_PORT_SCHEMA
},
"properties": {
"name": {
@@ -79,12 +81,9 @@ ETHERNET_SWITCH_CREATE_SCHEMA = {
},
"ports_mapping": {
"type": "array",
- "items": [
- {"type": "object",
- "oneOf": [
- {"$ref": "#/definitions/EthernetSwitchPort"}
- ]},
- ]
+ "items": {
+ "$ref": "#/definitions/EthernetSwitchPort"
+ }
},
},
"additionalProperties": False,
@@ -96,35 +95,7 @@ ETHERNET_SWITCH_OBJECT_SCHEMA = {
"description": "Ethernet switch instance",
"type": "object",
"definitions": {
- "EthernetSwitchPort": {
- "description": "Ethernet port",
- "properties": {
- "name": {
- "description": "Port name",
- "type": "string",
- "minLength": 1,
- },
- "port_number": {
- "description": "Port number",
- "type": "integer",
- "minimum": 0
- },
- "type": {
- "description": "Port type",
- "enum": ["access", "dot1q", "qinq"],
- },
- "vlan": {"description": "VLAN number",
- "type": "integer",
- "minimum": 1
- },
- "ethertype": {
- "description": "QinQ Ethertype",
- "enum": ["", "0x8100", "0x88A8", "0x9100", "0x9200"],
- },
- },
- "required": ["name", "port_number", "type"],
- "additionalProperties": False
- },
+ "EthernetSwitchPort": ETHERNET_SWITCH_PORT_SCHEMA
},
"properties": {
"name": {
@@ -148,12 +119,9 @@ ETHERNET_SWITCH_OBJECT_SCHEMA = {
},
"ports_mapping": {
"type": "array",
- "items": [
- {"type": "object",
- "oneOf": [
- {"$ref": "#/definitions/EthernetSwitchPort"}
- ]},
- ]
+ "items": {
+ "$ref": "#/definitions/EthernetSwitchPort"
+ }
},
"status": {
"description": "Node status",
diff --git a/gns3server/static/web-ui/3rdpartylicenses.txt b/gns3server/static/web-ui/3rdpartylicenses.txt
index f5f85898..d0b3e16d 100644
--- a/gns3server/static/web-ui/3rdpartylicenses.txt
+++ b/gns3server/static/web-ui/3rdpartylicenses.txt
@@ -1542,6 +1542,29 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ipaddr.js
+MIT
+Copyright (C) 2011-2017 whitequark
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+
mdn-data
CC0-1.0
CC0 1.0 Universal
diff --git a/gns3server/static/web-ui/index.html b/gns3server/static/web-ui/index.html
index 1fd79574..2990d54f 100644
--- a/gns3server/static/web-ui/index.html
+++ b/gns3server/static/web-ui/index.html
@@ -46,6 +46,6 @@
gtag('config', 'G-5D6FZL9923');
-
+