From 03f74d77e424abaa7100c597bc9cb81ef29ea1c8 Mon Sep 17 00:00:00 2001 From: grossmj Date: Sun, 12 Apr 2026 21:17:21 +0800 Subject: [PATCH 1/7] Development on 2.2.59.dev2 --- gns3/version.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gns3/version.py b/gns3/version.py index 9ee6a155..b8b8cb43 100644 --- a/gns3/version.py +++ b/gns3/version.py @@ -23,8 +23,8 @@ # or negative for a release candidate or beta (after the base version # number has been incremented) -__version__ = "2.2.58.1" -__version_info__ = (2, 2, 58, -99) +__version__ = "2.2.59.dev2" +__version_info__ = (2, 2, 59, 99) if "dev" in __version__: try: From 6cc024ed91133329aee6fdc39918f06ab56d9c7b Mon Sep 17 00:00:00 2001 From: grossmj Date: Mon, 13 Apr 2026 12:03:49 +0800 Subject: [PATCH 2/7] Fix deleting drawings. Ref #3810 --- gns3/items/drawing_item.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gns3/items/drawing_item.py b/gns3/items/drawing_item.py index 88acbb0b..7714c36e 100644 --- a/gns3/items/drawing_item.py +++ b/gns3/items/drawing_item.py @@ -214,7 +214,7 @@ class DrawingItem: """ Deletes this drawing. - :param skip_controller: Do not replicate change on the controller (usefull when it's already deleted on controller) + :param skip_controller: Do not replicate change on the controller (useful when it's already deleted on controller) """ self.setDeleting() @@ -222,7 +222,7 @@ class DrawingItem: from ..topology import Topology Topology.instance().removeDrawing(self) if self._id and not skip_controller: - self._project.delete("/drawings/" + self._id, None, body=self.__json__()) + self._project.delete("/drawings/" + self._id, None) def itemChange(self, change, value): From 2c64f83d05eeac3925e693c41df9069792e1f364 Mon Sep 17 00:00:00 2001 From: grossmj Date: Fri, 8 May 2026 12:54:06 +0800 Subject: [PATCH 3/7] Add --title to remote-viewer console commands. Fixes #3783 --- gns3/settings.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gns3/settings.py b/gns3/settings.py index 3bbb66be..941a1179 100644 --- a/gns3/settings.py +++ b/gns3/settings.py @@ -208,7 +208,7 @@ else: 'TightVNC': 'vncviewer {host}:{port}', 'Vinagre': 'vinagre {host}::{port}', 'gvncviewer': 'gvncviewer {host}:{display}', - 'Remote Viewer': 'remote-viewer vnc://{host}:{port}', + 'Remote Viewer': 'remote-viewer --title "({name})" vnc://{host}:{port}', 'KRDC': 'krdc vnc://{host}:{port}' } @@ -219,7 +219,7 @@ else: if sys.platform.startswith("win"): # Windows PRECONFIGURED_SPICE_CONSOLE_COMMANDS = { - 'Remote Viewer': r'"{}\VirtViewer v11.0-256\bin\remote-viewer.exe" spice://{{host}}:{{port}}'.format(program_files), + 'Remote Viewer': r'"{}\VirtViewer v11.0-256\bin\remote-viewer.exe" --title "({{name}})" spice://{{host}}:{{port}}'.format(program_files), } # default Windows SPICE console command @@ -228,7 +228,7 @@ if sys.platform.startswith("win"): elif sys.platform.startswith("darwin"): # Mac OS X PRECONFIGURED_SPICE_CONSOLE_COMMANDS = { - 'Remote Viewer': '/Applications/RemoteViewer.app/Contents/MacOS/RemoteViewer spice://{host}:{port}', + 'Remote Viewer': '/Applications/RemoteViewer.app/Contents/MacOS/RemoteViewer --title "({name})" spice://{host}:{port}', } # default Mac OS X SPICE console command @@ -236,7 +236,7 @@ elif sys.platform.startswith("darwin"): else: PRECONFIGURED_SPICE_CONSOLE_COMMANDS = { - 'Remote Viewer': 'remote-viewer spice://{host}:{port}', + 'Remote Viewer': 'remote-viewer --title "({name})" spice://{host}:{port}', } # default SPICE console command on other systems From 86be15d474f3cba4c36927afcaa1e0c3c6e74894 Mon Sep 17 00:00:00 2001 From: grossmj Date: Fri, 8 May 2026 13:00:37 +0800 Subject: [PATCH 4/7] Fix remaining PyQt6 compatibility issues. Fixes #3822 --- gns3/items/drawing_item.py | 5 +++++ gns3/items/text_item.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/gns3/items/drawing_item.py b/gns3/items/drawing_item.py index 7714c36e..afd413cb 100644 --- a/gns3/items/drawing_item.py +++ b/gns3/items/drawing_item.py @@ -106,6 +106,11 @@ class DrawingItem: """ if error: + if "doesn't exist" in result.get("message", ""): + log.warning("Drawing not found on server, recreating: {}".format(self._id)) + self._id = None + self.create() + return True log.error("Error while updating drawing: {}".format(result["message"])) return False self.setPos(QtCore.QPointF(result["x"], result["y"])) diff --git a/gns3/items/text_item.py b/gns3/items/text_item.py index 715646b7..a0d3e9f2 100644 --- a/gns3/items/text_item.py +++ b/gns3/items/text_item.py @@ -132,7 +132,7 @@ class TextItem(QtWidgets.QGraphicsTextItem, DrawingItem): text.set("text-decoration", "underline") text.set("fill", "#" + hex(self.defaultTextColor().rgba())[4:]) text.set("fill-opacity", str(self.defaultTextColor().alphaF())) - text.text = self.toPlainText() + text.text = self.toPlainText() or " " svg = ET.tostring(svg, encoding="utf-8").decode("utf-8") return svg From 7c06038072ee86e61e8f8b3380a06a82dda7a435 Mon Sep 17 00:00:00 2001 From: grossmj Date: Fri, 8 May 2026 16:41:46 +0800 Subject: [PATCH 5/7] Remove psutil version check --- gns3/main.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/gns3/main.py b/gns3/main.py index db82469a..a59467b0 100644 --- a/gns3/main.py +++ b/gns3/main.py @@ -36,7 +36,6 @@ import time import locale import argparse import signal -import psutil try: from gns3.qt import QtCore, QtWidgets @@ -191,9 +190,6 @@ def main(): if parse_version(QtCore.QT_VERSION_STR) < parse_version("6.3.1"): raise SystemExit("Requirement is PyQt6 version 6.3.1 or higher, got version {}".format(QtCore.QT_VERSION_STR)) - if parse_version(psutil.__version__) < parse_version("2.2.1"): - raise SystemExit("Requirement is psutil version 2.2.1 or higher, got version {}".format(psutil.__version__)) - # check for the correct locale # (UNIX/Linux only) locale_check() From 69818705544a207c185d3a4461841a5b6a1a562a Mon Sep 17 00:00:00 2001 From: grossmj Date: Fri, 8 May 2026 17:01:14 +0800 Subject: [PATCH 6/7] Update requirements.txt & python_requires --- requirements.txt | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index e2db0da3..bb928bad 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ jsonschema==4.25.1; python_version == '3.9' # version 4.25.1 is the last to support Python 3.9 jsonschema>=4.26.0,<4.27; python_version >= '3.10' -sentry-sdk>=2.52.0,<3 # optional dependency +sentry-sdk>=2.59.0,<3 # optional dependency psutil>=7.2.2 distro>=1.9.0 truststore>=0.10.4; python_version >= '3.10' diff --git a/setup.py b/setup.py index 0f75f49d..cf75ca16 100644 --- a/setup.py +++ b/setup.py @@ -79,7 +79,7 @@ setup( include_package_data=True, package_data={"gns3": ["configs/*.txt", "schemas/*.json"]}, platforms="any", - python_requires=">=3.8", + python_requires=">=3.9", setup_requires=["setuptools>=45.2"], classifiers=[ "Development Status :: 5 - Production/Stable", From 84967d4c87c97ef39d820c2d98c597f579807a81 Mon Sep 17 00:00:00 2001 From: grossmj Date: Fri, 8 May 2026 19:06:04 +0800 Subject: [PATCH 7/7] Release v2.2.59 --- CHANGELOG | 7 +++++++ gns3/crash_report.py | 2 +- gns3/version.py | 4 ++-- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 43304c4c..da32d542 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,12 @@ # Change Log +## 2.2.59 08/05/2026 + +* Remove psutil version check +* Fix remaining PyQt6 compatibility issues. Fixes #3822 +* Add --title to remote-viewer console commands. Fixes #3783 +* Fix deleting drawings. Ref #3810 + ## 2.2.58.1 12/04/2026 * Fix callback issues in found in v2.2.58 diff --git a/gns3/crash_report.py b/gns3/crash_report.py index ec27a468..cd74696b 100644 --- a/gns3/crash_report.py +++ b/gns3/crash_report.py @@ -50,7 +50,7 @@ class CrashReport: Report crash to a third party service """ - DSN = "https://af760e2022b321441622330f11dcb650@o19455.ingest.us.sentry.io/38506" + DSN = "https://dd662ce99d7e4a04714a89939ec523c9@o19455.ingest.us.sentry.io/38506" _instance = None def __init__(self): diff --git a/gns3/version.py b/gns3/version.py index b8b8cb43..cfbcd811 100644 --- a/gns3/version.py +++ b/gns3/version.py @@ -23,8 +23,8 @@ # or negative for a release candidate or beta (after the base version # number has been incremented) -__version__ = "2.2.59.dev2" -__version_info__ = (2, 2, 59, 99) +__version__ = "2.2.59" +__version_info__ = (2, 2, 59, 0) if "dev" in __version__: try: