From 582412bac38fd9982260d65e4e454c0c807e954b Mon Sep 17 00:00:00 2001 From: grossmj Date: Wed, 19 Aug 2026 18:06:12 +0200 Subject: [PATCH] Release v3.1.0a5 --- CHANGELOG | 168 +++++++++++++++++++++++++++++++++++++ gns3server/crash_report.py | 2 +- gns3server/version.py | 4 +- 3 files changed, 171 insertions(+), 3 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 0f152d278..113e141a2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,173 @@ # Change Log +## 3.1.0a5 19/08/2026 + +* Bundle web-ui v3.1.0a5 +* Sync appliances +* copilot: sync CONSOLE_TYPES with the server ConsoleType enum +* feat: Enhance information displayed on the system status dashboard +* docker: cap GNS3_STOP_TIMEOUT at 210 s (controller stop budget) +* docker: harden the shm/devices/extra_configs/masking work (code review) +* docker: make the vendor graceful-stop grace period configurable (GNS3_STOP_TIMEOUT) +* docker: graceful stop for vendor NOS containers (SIGTERM + 60s grace) +* fix: UDP port allocation race causing link self-loop (one-way links) +* add support basic support for OpenBSD. +* docker: use the container's chown (not busybox) in vendor volume/perms path +* docker: mask systemd-udevd in privileged containers (GNS3_MASK_UDEV) +* docker: persist extra_configs in the template DB table +* docker: inject config files into containers via extra_configs +* docker: warn about low inotify/file-max and missing FUSE at connect +* docker: inject /dev/shm size and host devices via HostConfig from env +* appliance: expose custom_adapters on the v1-6 appliance model +* appliance: accept docker_exec console type in Docker appliances +* fix: recreate docker_exec console on reconnect after CLI exit +* vendor: drop the hardcoded /etc/network mount for SKIP_INIT containers +* vendor: skip /etc/network in volume bridge and permission passes +* fix: run _fix_permissions container-side on /gns3volumes mount targets +* fix: host-side permission fix + SKIP_INIT volume persistence docs +* refactor: move vendor NOS Docker support into VendorDockerVM subclass +* docker_exec console: wrap exec command in while-true loop so sr_cli restarts on quit +* Prototype: vendor NOS Docker node support (SR Linux etc.) — docker_exec console via Docker exec API (pty + hijacked HTTP + NAWS resize) +* fix: update CI configuration to use a single OS and remove Windows-specific dependencies +* fix: breaking change with dependency FastAPI v0.137.0 https://fastapi.tiangolo.com/release-notes/#specific-breaking-changes +* fix: suppress redundant console port setter log during Docker node create +* revert: restore force_close=True in compute._session() +* perf: parallelize batch NIO creation across nodes +* fix: scope marker reconcile to the current bridge/NIO +* cleanup: remove stray debug print in Dynamips node creation +* fix: reconcile marker filters in _ubridge_apply_markers (delete/update) +* log: suppress marker sink stats when no matches received +* log: add periodic marker.match throughput statistics +* marker: route marker.match to a dedicated project WS channel +* perf: raise marker UDP receive buffer from ~208KB to 8MB +* perf: move project-open marker inheritance to prepare phase +* perf: parallelise compute-side batch NIO update per node +* perf: batch update/delete marker-def fan-out too (full project-level) +* perf: batch marker-def fan-out to one PUT /nios/batch per compute +* log: add marker fan-out timing for project-open and interactive def-change +* tune: raise start_all concurrency from 3 to 10 +* revert: drop _connect_nio thread-pool executor, restore async _ubridge_send +* fix: use socket.fromfd in send_batch_sync for Python 3.13 compat +* log: demote all per-node lifecycle INFO logs to DEBUG +* fix: await Dynamips.create_nio (it is async, unlike sync base) +* fix: use bound-method param count for Dynamips create_nio detection +* fix: Dynamips create_nio(node, nio_settings) takes extra arg + add tests +* log: add start/stop/close progress lines; revert start concurrency to 3 +* log: lower per-node lifecycle logs in base_node to DEBUG +* perf: raise start/stop/suspend/reset-console concurrency from 3 +* fix: race in concurrent node creation sending duplicate POST /projects +* log: lower per-node docker lifecycle logs to DEBUG +* log: emit progress lines for node and link loading on project open +* cleanup: remove project-open stage timing logs, lower NIO-added log to debug +* perf: skip per-link topology dump during project-open prepare +* perf: batch NIO dispatch on project open (one HTTP per compute) +* perf: cache compute.host_ip + add UDPLink.create timing log +* perf: dedicated 500-worker thread pool for ubridge batch I/O +* perf: offload per-NIO ubridge commands to thread-pool executor +* perf: enable TCP keep-alive for local compute HTTP requests +* debug: add per-command timing to _connect_nio ubridge calls +* perf: parallelize UDP port allocation and NIO creation in UDPLink.create +* fix: SIGKILL docker container on stop instead of 5s grace period +* fix: add event handling for deleted projects +* fix: tests after merging +* server: raise the open-files (RLIMIT_NOFILE) limit at startup +* marker: batch topology dumps in bulk fan-out (per-def on 500+ links was ~1 minute) +* marker: concurrent (bounded) definition fan-out +* marker: forward data_link_type on per-link marker create +* iou: skip already-installed markers in _ubridge_apply_markers (NIO update idempotency) +* marker: serial-link (WAN) support via data_link_type -> uBridge linktype +* iou: forward data_link_type on capture start so serial pcaps use the correct linktype +* ubridge: default the control transport to unix +* ubridge: require version >= 1.2.0 +* fix: add missing HTTPException import +* mcp: drop direction from marker_definition tool +* marker: tighten marker name max length from 128 to 32 +* marker: drop deleted marker from port NIO cache to stop empty pcap on restart +* marker: validate def BPF once, skip re-validation on inherited fan-out +* marker: point directional defs at BPF, refresh implementation doc +* marker: incremental apply, clear bridge map on uBridge stop +* marker: fine-grained filter ops, clean pcap on remove +* marker: restore direction on project load, reject tx/rx on definitions +* schema: accept direction='both' in marker schemas, normalize to None +* qemu: demote QEMU monitor connect and set_link logs to DEBUG +* marker: key _marker_filter_bridges by (name, link_id) so multi-link nodes toggle every copy +* marker: make per-filter toggle fall back to NIO rebuild when the marker isn't installed +* marker: make per-filter toggle a no-op when the marker isn't installed +* marker: rework pause/resume from project-wide to per-definition +* marker: fix PUT marker with an enabled-only body (bpf no longer required) +* marker: persist project-wide markers_paused to the .gns3 file +* marker: document pause/resume and instant enabled toggle +* marker: test enabled/pause/resume and instant toggle +* marker: drive uBridge enabled/pause/resume in real time +* marker: add direction-clear, routing, and ubridge transport tests +* marker: support clearing direction via explicit null / "both" +* marker: let callers pin the capture node via capture_node_id +* Name AF_UNIX sockets by node id for self-describing debuggability +* Detect unsupported -U flag and fail fast with a clear error +* Add configurable uBridge control channel transport (tcp/unix) +* fix(import): unvalidated symlink creation in import_project +* fix(qemu): move the bios options after the network ones +* fix(qemu): fix addition of QEMU RNG device causes interface names to change +* bugfix: docker workflow needs lowercase name +* fix(qemu): remove trailing space from RNG object argument +* Add MCP tools for traffic-insight marker feature +* Improve MCP tool descriptions for link_update, device_show_run, and link_reset +* Do not start nodes when deleting a project +* fix: correct always-true state check in DockerVM.stop() +* add bug report issue template +* Adds controller and compute API support for explicitly pulling or updating Docker images. +* feat(tests): increase maximum open file descriptors for test runs on Unix +* (feat): Implement functional Layer 1 keepalive support for IOU/IOL nodes +* Fix typo with ovmf_firmware_dir +* Fix issues after merging +* fix(builtin): hide GNS3 internal bridge interfaces from Cloud node +* feat(builtin): NAT node returns its interface IP info in asdict() +* fix(controller): refresh cloud/nat node interfaces from compute on GET +* refactor(builtin): use deterministic bridge name from switch UUID +* fix(builtin): bring kernel bridge UP after creation +* feat: migrate builtin EthernetSwitch from Dynamips ethsw to ubridge brctl +* fix(mcp): remove unreliable node_reload / node_reload_all tools +* fix(rbac): guard None current_user on websocket auth failure +* fix(mcp): thread token_version into console/download token minting +* fix(mcp): pass user.token_version when generating temp JWT from API key +* fix(marker): avoid reentrant-lock deadlock when uBridge starts lazily +* fix(marker): per-link attribution via link field in MARK signals +* fix(marker): set nio.markers on iou/dynamips/cloud nio update +* fix(marker): reject reserved global-prefix names only on create +* fix(marker): clean inherited markers on def delete +* feat(marker): add highlight_duration render hint +* fix(marker): fix inheritance hook, topology load, update sync, and asdict +* fix(marker): export MarkerDefinitionCreate from schemas package +* fix(marker): replace pydantic lookahead pattern with field_validator +* feat(marker): add project-level marker definition inheritance +* fix(marker): reserve "global" name prefix for future marker inheritance +* fix(marker): extend marker support to dynamips and cloud nodes +* fix(marker): enable marker support for docker nodes +* fix(marker): tolerate port conflict on marker listener startup +* fix(marker): validate marker name and expose enabled via REST +* fix(marker): uniquify auto-generated marker names per link +* feat(marker): add project-level marker aggregation endpoint +* feat(marker): add IOU node marker support via iol_bridge +* refactor(marker): converge to filter single-path model, remove dual-apply endpoints +* fix(marker): restore markers from topology on project load +* feat(marker): add optional color field to marker data model +* fix(marker): use allowlist in _choose_marker_side, align with _get_filter_node +* fix(marker): stop auto-deleting markers on node stop in node_updated +* fix(marker): ride markers on NIO so they survive node restart and project reload +* config: set marker_listen_port default to 3070 and document in config templates +* fix(marker): add _choose_marker_side to exclude non-uBridge node types +* Only set IOU images to be executable when importing images +* fix(import): project import does not move images symlinks into place +* Search for system UEFI that is compatible with Python < 3.12 +* UEFI improvements for Qemu VMs * Add OVMF firmware directory configuration * Automatically add a Random Number Generator (RNG) device when using uefi option is enabled +* fix(docker): handle container name conflict automatically +* fix: gns3-server crashes on startup if "Open this project in the background" is active but there is a problem with that project +* Handle HTTPNotFound exception when retrieving compute status +* Replace ControllerForbiddenError with aiohttp.web.HTTPForbidden for project deletion error handling +* Fix: Check compute connectivity before open() during project deletion +* Use typed InterfaceStatus enum and simplify stats fallback in interfaces() +* Expose full interface address list and link state in cloud node API + ## 2.2.61 30/07/2026 * Sync appliances diff --git a/gns3server/crash_report.py b/gns3server/crash_report.py index 77bb23363..66ceea1f8 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://7b5d8f1189b61e674dc6ee41b0ec9da8@o19455.ingest.us.sentry.io/38482" + DSN = "https://b8b31d4b05b8a353824c5e45f7792885@o19455.ingest.us.sentry.io/38482" _instance = None def __init__(self): diff --git a/gns3server/version.py b/gns3server/version.py index 14f5e8aa3..47a244584 100644 --- a/gns3server/version.py +++ b/gns3server/version.py @@ -22,8 +22,8 @@ # or negative for a release candidate or beta (after the base version # number has been incremented) -__version__ = "3.1.0.dev5" -__version_info__ = (3, 1, 0, 99) +__version__ = "3.1.0a5" +__version_info__ = (3, 1, 0, -99) if "dev" in __version__: try: