51 Commits

Author SHA1 Message Date
YueGuobin
d2e9823e6c
feat: implement traffic insight marker backend (ubridge mark filter)
Add compute-side marker subsystem that receives ubridge UDP MARK signals
and forwards them as project-scoped notifications to the web UI for
real-time traffic coloring. Matched packets are always saved to per-link
pcaps for future replay.

Key components:
- gns3server/compute/marker/: MarkerManager (singleton, UDP listener +
  O(1) registry keyed by (node_id, filter_name)) + MarkerListener
  (DatagramProtocol parsing MARK lines per ubridge integration contract)
- gns3server/compute/base_node.py: marker sink/node config at ubridge
  startup; shared _ubridge_add_marker_filter / _ubridge_delete_marker_filter
- Per-node start_marker/stop_marker: VPCS (VPCS-{id}), QEMU
  (QEMU-{id}-{adapter}), Docker (bridge{adapter})
- Compute REST /markers/start + /markers/stop (vpcs/qemu/docker route files)
- Controller Link._markers state + UDPLink.start_marker/stop_marker/
  update_marker (mirror capture pattern: BPF validation, _choose_capture_side,
  node.post forwarding, topology persistence)
- Controller REST GET/POST/DELETE/PUT /v3/projects/{p}/links/{l}/markers
- Config: marker_listen_host / marker_listen_port in ServerSettings
- Signal routing: creation-time registry O(1) lookup, no node-table scan;
  project-scoped WS stream (not global); event payload always carries
  project_id for frontend scoping

Tests: 14 unit tests (registry, listener parsing, UDP round-trip);
562 existing tests pass with zero regressions.
2026-07-16 00:39:51 +08:00
YueGuobin
eb15c7138b
Fix list_node_files PermissionError on os.scandir
Wrap os.scandir() in try-except to return empty list instead of
crashing when a node directory is not readable.
2026-06-10 00:15:26 +08:00
YueGuobin
cbb21e8e40
feat: Node file streaming, recursive listing, file type detection, and file delete
- Stream file GET/POST through controller without buffering in memory
- Add recursive and subdirectory filtering to node file listing
- Replace file extension with magic-based file type detection
- Add DELETE endpoint for node and project files
- Include directories in listing response
- Add params and stream support to http_query
- Fix lambda closures, streamer exception scope, and delete error codes
2026-06-09 22:52:50 +08:00
YueGuobin
598029face
Optimize project variable updates to use parallel node processing
Performance improvement for project variable updates when multiple containers
are present. Previously, nodes were updated serially in a for loop, causing:
- 5 containers: ~35 seconds (7s per container)
- 10 containers: ~70 seconds
- 20 containers: ~140 seconds (2min 20sec)

Changed to parallel processing using asyncio.gather(), reducing total time
to the duration of the slowest single node update (~7 seconds regardless
of container count).

The change maintains error handling with return_exceptions=True to ensure
one node's update failure doesn't prevent others from completing.

This is particularly important for users with large topologies containing
many Docker containers that need to be recreated when project variables change.

Related to issue #2755 ghost node timeout fix.
2026-05-30 22:24:34 +08:00
YueGuobin
b4220d55c6
fix: Import status module in project.py
Fix F821 undefined name 'status' error by importing the status
module from fastapi. This resolves build errors when using
status.HTTP_403_FORBIDDEN and status.HTTP_404_NOT_FOUND.
2026-05-08 23:58:43 +08:00
YueGuobin
e6df144ae8
refactor: Remove MD5 calculation from node files listing
Remove MD5 checksum calculation from the node files API since
disk image files are dynamic and change frequently. MD5 calculation
was also causing significant performance overhead.

Changes:
- Remove md5sum field from NodeFile schema
- Remove MD5 calculation from list_node_files method
- Improve error handling for timestamp conversion
- Simplify code by removing lambda functions

Performance improvement:
- Response time reduced from ~0.5-1s to ~0.017s (30-60x faster)
- Especially beneficial for large files and multiple files

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 23:05:40 +08:00
YueGuobin
51a4c73e21
feat: Add detailed metadata to node files listing
Enhance the node files API to include comprehensive file metadata:
- File size in bytes
- File creation time (ISO 8601 format)
- File modification time (ISO 8601 format)
- File extension

Create new NodeFile schema to support these additional fields
while keeping the existing ProjectFile schema for backward compatibility.

This provides users with better information to manage and identify
files in the Web UI.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 22:57:19 +08:00
YueGuobin
5b75d633aa
feat: Add API endpoint to list node files
Implement issue #2719 - Add API endpoint to list project files

- Add GET /v3/projects/{project_id}/nodes/{node_id}/files endpoint
- Add list_node_files() method to Project class
- Add security checks to prevent path traversal
- Filter out .ghost temporary files
- Return file paths with MD5 checksums
- Require Node.Audit privilege

This allows users to discover dynamically created files
such as QEMU disk images created via the disk image API.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 22:52:17 +08:00
grossmj
900d4f79ee "Local" command line parameter is only for stopping
a server that has been started by the desktop GUI
2022-03-30 18:38:34 +08:00
grossmj
cefab8d362 Rename __json__() to asdict() 2021-04-17 23:34:28 +09:30
grossmj
44074ff7c9 Some cleaning. 2021-04-17 18:36:32 +09:30
grossmj
c021e21309 Use black with -l 120 param. 2021-04-13 18:46:50 +09:30
grossmj
f928738bd5 Use pyupgrade with --py36-plus param. 2021-04-13 18:37:58 +09:30
grossmj
30ebae207f Use Pydantic to validate the server config file. 2021-04-12 17:02:23 +09:30
grossmj
eb3cb8a41f Migration to FastAPI 2020-10-02 16:07:50 +09:30
grossmj
3daa3f450b Fix IOU symlink issue on remote servers. 2019-03-18 18:05:40 +07:00
grossmj
2764828f38 Refactor how clients access PCAP capture files. Fixes https://github.com/GNS3/gns3-gui/issues/2438.
* The PCAP file is directly accessed if controller and client are on the same host.
* The PCAP file is streamed from the compute server to the client with the controller as a proxy when the controller is remote for the client.
2018-10-27 14:47:17 +07:00
grossmj
76af98404a Drop Python 3.4 and switch to async / await syntax for asyncio. Fixes #1425 2018-10-15 17:05:49 +07:00
grossmj
d1ccf3bc84 Merge branch '2.1' into 2.2
# Conflicts:
#	gns3server/version.py
#	requirements.txt
2018-06-04 22:46:52 +07:00
ziajka
7b3d5ae5e3 Create/update project on compute when variables changes 2018-05-09 15:29:35 +02:00
ziajka
e267f8a8b8 Project global variables 2018-05-04 14:34:44 +02:00
grossmj
90ce6093d8 Some spring cleaning. 2018-03-15 14:17:39 +07:00
ziajka
eeae07e783 Conservative approach to supported versions of Python 3.4 and asyncio.ensure_future, Ref. #1269 2018-01-29 12:13:20 +01:00
ziajka
d9a0ec9ff3 Replace asyncio.async with ensure_future because of deprecation, Fixes: #1269 2018-01-24 11:11:53 +01:00
ziajka
3d85bba9d4 Don't create directory structure during json dump. Fixes #2270 2017-10-02 10:41:57 +02:00
Julien Duponchelle
9ef334331e
Fix crash when handling an error in project creation
Fix #928
2017-03-13 16:55:35 +01:00
Julien Duponchelle
c9f3ea4489
Fix some race condition in project deletion
Fix #866
2017-01-17 19:37:38 +01:00
Julien Duponchelle
553e137a13
Support for serial console for Virtual BOX and VMware using asyncio
Ref #747
2016-11-07 23:43:20 +01:00
Julien Duponchelle
796ebf7210
Optimize project closing by avoiding closing unused modules
Fix #627
2016-08-16 19:41:59 +02:00
Julien Duponchelle
88ffd43c97
Strip the old / import export project code controller will do everything 2016-07-21 18:23:31 +02:00
Julien Duponchelle
08c35f5558
Export non remote server work 2016-07-20 14:50:15 +02:00
Julien Duponchelle
73d5066392
Merge branch 'master' into 2.0 2016-07-19 16:41:12 +02:00
Julien Duponchelle
c0b09ae76a
Merge branch '1.5' into 2.0 2016-06-27 14:24:48 +02:00
grossmj
00da15e4af Use uBridge for VPCS connections. Ref #267. 2016-06-22 19:40:46 -06:00
Julien Duponchelle
3255be0ae2
Drop the commit system
Ref https://github.com/GNS3/gns3-gui/issues/1243
2016-06-14 10:16:33 +02:00
grossmj
cd07a99118 Some cleaning + move "/version" endpoint to "/server/version". 2016-06-01 17:50:31 -06:00
grossmj
c1aad550fa Merge branch '1.5' into 2.0
Conflicts:
	gns3server/version.py
2016-05-29 19:52:15 -06:00
Julien Duponchelle
a797038aeb
Drop code for temporary projects
Fix https://github.com/GNS3/gns3-gui/issues/982
2016-05-24 17:57:04 +02:00
Julien Duponchelle
d5895c3a47
Merge branch '1.5' into 2.0 2016-05-18 11:25:41 +02:00
grossmj
6cea6c9162 Some more (spring) cleaning. 2016-05-13 18:48:10 -06:00
Julien Duponchelle
5280644327
Return command_line and node_directory via the controller 2016-05-12 10:39:50 +02:00
grossmj
483431438a Merge remote-tracking branch 'origin/2.0' into 2.0
Conflicts:
	gns3server/controller/project.py
	tests/compute/test_project.py
	tests/controller/test_project.py
2016-05-11 11:41:45 -06:00
grossmj
5a76f81271 Refactoring to use a common node class for all VMs and other (future) objects. 2016-05-11 11:35:36 -06:00
Julien Duponchelle
9ccb55206d
Cleanup code for getting the default project directory 2016-05-11 18:42:55 +02:00
Julien Duponchelle
c2da568543
Protect controller and compute about path outside project directory
Fix #503
2016-05-11 15:59:32 +02:00
Julien Duponchelle
9dca7dfe4a
Merge branch '1.5' into 2.0 2016-05-10 17:51:40 +02:00
Julien Duponchelle
9a1eeb57e9
Controll of the project directory in the controller 2016-04-26 14:34:49 +02:00
Julien Duponchelle
1ce576c020
Stream pcap from compute to controller to client 2016-04-22 16:22:03 +02:00
Julien Duponchelle
48e71617d6
Store capture in a temporary directory on compute node 2016-04-21 17:27:49 +02:00
Julien Duponchelle
30f05c6190
Merge branch '1.5' into 2.0 2016-04-21 17:02:28 +02:00