From 729eb43115df29279abf3847b9f401a160b8304b Mon Sep 17 00:00:00 2001 From: Mark Paronyan Date: Sat, 28 Feb 2026 21:45:00 +0300 Subject: [PATCH 1/4] fix(controller,port): handle None port name to prevent TypeError in short_name method --- gns3server/controller/ports/port.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gns3server/controller/ports/port.py b/gns3server/controller/ports/port.py index 601e8024f..5abdb3034 100644 --- a/gns3server/controller/ports/port.py +++ b/gns3server/controller/ports/port.py @@ -84,9 +84,9 @@ class Port: # If port name format has changed we use the port name as the short name (1.X behavior) if self._short_name: return self._short_name - elif '/' in self._name: + elif self._name and '/' in self._name: return self._name.replace(self.long_name_type(), self.short_name_type()) - elif self._name.startswith("{}{}".format(self.long_name_type(), self._interface_number)): + elif self._name and self._name.startswith("{}{}".format(self.long_name_type(), self._interface_number)): return self.short_name_type() + "{}".format(self._interface_number) return self._name From 0da1a6639af08aafc4b18c2089f6e0bcb88051a9 Mon Sep 17 00:00:00 2001 From: Mark Paronyan Date: Sat, 28 Feb 2026 21:45:08 +0300 Subject: [PATCH 2/4] tests(controller,port): short_name finishes successfully when port name is None --- tests/controller/test_node_port_name.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/controller/test_node_port_name.py b/tests/controller/test_node_port_name.py index 03b4c4d87..974e40565 100644 --- a/tests/controller/test_node_port_name.py +++ b/tests/controller/test_node_port_name.py @@ -132,6 +132,13 @@ def test_list_ports_port_name_format(node): assert node.__json__()["ports"][1]["name"] == "eth0/0" +def test_short_name_none(): + """ + Test short_name does not raise exception when name is None + """ + assert EthernetPort(None, 0, 0, 0).short_name is None + + def test_list_ports_adapters(node): """ List port using adapters properties From 590eedeb464b6a1b37ec249394522af83e725b91 Mon Sep 17 00:00:00 2001 From: Raizo62 Date: Wed, 4 Mar 2026 14:26:52 +0100 Subject: [PATCH 3/4] Fix QEMU serial console artifacts by filtering ANSI CPR responses in telnet proxy - filter incoming cursor position report sequences (`ESC[;R`) in `AsyncioTelnetServer` - prevent stray `;1R;80R` characters on late telnet console attach after VM boot - keep QEMU serial transport unchanged (`-serial telnet`) for BIOS compatibility --- gns3server/utils/asyncio/telnet_server.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/gns3server/utils/asyncio/telnet_server.py b/gns3server/utils/asyncio/telnet_server.py index b13c405cd..092b8605a 100644 --- a/gns3server/utils/asyncio/telnet_server.py +++ b/gns3server/utils/asyncio/telnet_server.py @@ -20,6 +20,7 @@ import socket import asyncio import asyncio.subprocess import struct +import re import logging log = logging.getLogger(__name__) @@ -57,6 +58,7 @@ NAWS = 31 # Negotiate About Window Size LINEMO = 34 # Line Mode READ_SIZE = 1024 +CPR_RESPONSE = re.compile(br"\x1b\[[0-9]{1,4}(;[0-9]{1,4})?R") class TelnetConnection(object): @@ -286,6 +288,11 @@ class AsyncioTelnetServer: if IAC in data: data = await self._IAC_parser(data, network_reader, network_writer, connection) + # Some terminal clients may send ANSI cursor position reports + # (e.g. ESC[1;80R) when attaching to a serial console. Those + # responses can show up as spurious characters at the shell prompt. + data = CPR_RESPONSE.sub(b"", data) + if len(data) == 0: continue From 14ffa2c2d61a224db925e4c31287f034934b7286 Mon Sep 17 00:00:00 2001 From: Jeremy Grossmann Date: Sat, 7 Mar 2026 22:22:16 +0800 Subject: [PATCH 4/4] =?UTF-8?q?Revert=20"Fix=20QEMU=20serial=20console=20a?= =?UTF-8?q?rtifacts=20by=20filtering=20ANSI=20CPR=20responses=20in=20?= =?UTF-8?q?=E2=80=A6"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gns3server/utils/asyncio/telnet_server.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/gns3server/utils/asyncio/telnet_server.py b/gns3server/utils/asyncio/telnet_server.py index 092b8605a..b13c405cd 100644 --- a/gns3server/utils/asyncio/telnet_server.py +++ b/gns3server/utils/asyncio/telnet_server.py @@ -20,7 +20,6 @@ import socket import asyncio import asyncio.subprocess import struct -import re import logging log = logging.getLogger(__name__) @@ -58,7 +57,6 @@ NAWS = 31 # Negotiate About Window Size LINEMO = 34 # Line Mode READ_SIZE = 1024 -CPR_RESPONSE = re.compile(br"\x1b\[[0-9]{1,4}(;[0-9]{1,4})?R") class TelnetConnection(object): @@ -288,11 +286,6 @@ class AsyncioTelnetServer: if IAC in data: data = await self._IAC_parser(data, network_reader, network_writer, connection) - # Some terminal clients may send ANSI cursor position reports - # (e.g. ESC[1;80R) when attaching to a serial console. Those - # responses can show up as spurious characters at the shell prompt. - data = CPR_RESPONSE.sub(b"", data) - if len(data) == 0: continue