YueGuobin
cd1d28729a
feat: make AI Copilot an optional dependency
...
This change makes AI Copilot features optional to reduce installation
size and support restricted environments.
Changes:
- Split AI dependencies into ai-requirements.txt
- Add ai-copilot optional dependency in pyproject.toml
- Add import protection in gns3server/agent/__init__.py
- Return 501 for AI endpoints when dependencies not installed
- Add gns3server-uninstall-ai-copilot command for cleanup
- Update README with installation and uninstallation instructions
Installation:
- Basic: pip install gns3-server
- With AI: pip install gns3-server[ai-copilot]
- Development: pip install gns3-server[ai-copilot,dev]
Uninstallation:
- gns3server-uninstall-ai-copilot
2026-03-18 15:21:23 +08:00
YueGuobin
4f8daced17
Merge branch 'fix/telnet-server-connection-race-condition-3.0' into feature/ai-copilot-bridge
2026-03-15 13:38:40 +08:00
YueGuobin
cda5fdd94b
feat(telnet_server): improve error handling and connection management
...
- Catch OSError alongside ConnectionError in connection processing to handle more network errors
- Move client_info retrieval inside try block to prevent AttributeError on failed connections
- Replace bare except with specific exceptions (OSError, ConnectionError, asyncio.TimeoutError)
- Improve error logging to include specific exception details and client information
2026-03-15 00:19:51 +08:00
YueGuobin
e4faf673af
fix(telnet): handle connection race condition during broadcast
...
Fixes two critical issues in telnet server when clients rapidly
connect/disconnect during broadcast operations:
1. **OSError [Errno 107]**: Transport endpoint not connected
- Root cause: getpeername() called outside try block
- Fix: Move getpeername() inside try block and catch OSError
- Expand exception handling to include OSError and TimeoutError
2. **KeyError**: Double deletion from connections dictionary
- Root cause: Connection deleted in broadcast loop, then deleted
again in top-level exception handler
- Fix: Use dict.pop(key, None) instead of del dict[key]
**Changes**:
- Line 216: Add OSError to top-level exception handler
- Line 227-228: Use pop() to avoid KeyError on double deletion
- Line 305-316: Move getpeername() inside try block, expand
exception types, use pop() for safe deletion
**Impact**:
- Prevents unhandled exceptions from propagating to asyncio event loop
- Ensures proper resource cleanup even with race conditions
- No resource leaks or zombie connections
- Long-lived clients unaffected by rapid client disconnects
**Test Script**:
- Added stress test script to reproduce the issue
- Supports IOU-L3, VPCS, and generic device types
- Rapid clients send broadcast-triggering commands (show/run/OSPF)
**Related**: Fixes bug documented in docs/bugs/telnet-server-connection-race-condition.md
2026-03-15 00:19:51 +08:00
YueGuobin
7c2083d227
feat: update .gitignore to track project context and development docs
...
- Add exception for .claude/development.md to allow tracking development documentation
- Comment out PROJECT_CONTEXT.md exclusion to enable version control of project context file
- Create PROJECT_CONTEXT.md with comprehensive project overview for AI assistant support
- Document project structure, AI copilot data flow, SSE event types, and code standards
- Provide flake8 static analysis guidelines and common error fixes
2026-03-09 21:46:58 +08:00
Guobin Yue
87f8f22524
Merge branch '3.0' into feature/ai-copilot-bridge
2026-03-06 01:42:47 +08:00
grossmj
4606613673
Fix image handling
2026-03-05 12:38:28 +08:00
grossmj
8b245c96f8
Qemu VMs: only compute MD5 checksums for existing disks
2026-03-04 18:54:52 +08:00
YueGuobin
bbd34f1f67
feat(api): add LLM model configurations endpoint and schemas
...
- Introduce new API route `/access` for managing LLM model configurations
- Add LLMModelConfig model to database models
- Include comprehensive schemas for LLM model config CRUD operations
- Register new router with tags for LLM Model Configurations
2026-03-03 16:34:48 +08:00
grossmj
28e7c014c8
Enable parallel compression with zstandard. Fixes #2324
2026-02-16 18:28:11 +08:00
grossmj
aabfd08524
Merge remote-tracking branch 'origin/2.2' into 3.0
...
# Conflicts:
# CHANGELOG
# dev-requirements.txt
# gns3server/crash_report.py
# gns3server/version.py
# requirements.txt
2026-02-11 17:52:14 +08:00
grossmj
abaeab6242
Upgrade greenlet and sqlalchemy dependencies
2026-01-26 19:50:42 +08:00
Iskander Nafikov
2414b7a968
Fix telnet keepalive options on macOS
2026-01-26 00:31:03 +08:00
grossmj
69a695c9e6
Merge branch '2.2' into 3.0
...
# Conflicts:
# dev-requirements.txt
# gns3server/appliances/infix.gns3a
# gns3server/crash_report.py
# gns3server/run.py
# gns3server/utils/asyncio/__init__.py
# gns3server/version.py
# requirements.txt
# setup.py
2026-01-24 19:27:39 +08:00
grossmj
4335fd7ce0
Drop Python 3.8 support
2026-01-24 18:51:44 +08:00
grossmj
60c10e7ecc
Merge remote-tracking branch 'origin/2.2' into 3.0
...
# Conflicts:
# .github/workflows/testing.yml
# CHANGELOG
# README.md
# gns3server/appliances/infix.gns3a
# gns3server/compute/docker/__init__.py
# gns3server/compute/docker/docker_vm.py
# gns3server/crash_report.py
# gns3server/version.py
# gns3server/web/web_server.py
# setup.py
# tests/controller/test_project.py
2025-11-29 11:42:02 +10:00
grossmj
942f021b58
Fix test_config.py
2025-11-17 11:26:06 +10:00
grossmj
aa8ccf4f82
Allow an image to be uploaded to the controller again even if it is already in the database
2025-04-17 19:07:22 +07:00
grossmj
4758431c76
Improvements for built-in disks
...
* Checksum is updated in the database for updated disks.
* It is not possible to prune them.
2025-01-02 23:10:51 +07:00
grossmj
5269d4386c
Drop Python 3.8
2024-12-30 15:36:40 +07:00
grossmj
bbff6974e6
Fix undefined name 'default_directory'
2024-12-02 14:36:58 +10:00
grossmj
c05dcef54f
Fix formatting issue
2024-12-02 13:18:12 +10:00
grossmj
b7d43b29cd
Fix tests after merging
2024-12-02 13:02:08 +10:00
grossmj
cbaa563996
Merge branch '2.2' into 3.0
...
# Conflicts:
# CHANGELOG
# gns3server/crash_report.py
# gns3server/static/web-ui/index.html
# gns3server/static/web-ui/main.9297104511b6616fc55c.js
# gns3server/utils/images.py
# gns3server/version.py
# tests/api/routes/compute/test_dynamips_nodes.py
# tests/handlers/api/compute/test_qemu.py
# tests/utils/test_images.py
2024-12-02 12:16:34 +10:00
grossmj
19cabdfde6
Use log.debug for some messages in images.py
2024-11-28 12:42:50 +10:00
grossmj
3d58b437b4
Remove restrictions based on file extension when listing images and fix ELF header checks
2024-11-27 14:51:34 +10:00
grossmj
bd813b0a53
Merge branch '2.2' into 3.0
...
# Conflicts:
# requirements.txt
# setup.py
2024-11-18 11:46:42 +10:00
grossmj
a60e0d424d
Overwrite user resources when the originals have changed.
...
Excepting configs and disks which can be customized.
2024-11-09 12:17:06 +10:00
grossmj
c4fcb43e78
Merge branch '2.2' into 3.0
...
# Conflicts:
# .github/workflows/testing.yml
# CHANGELOG
# README.md
# dev-requirements.txt
# gns3server/compute/docker/docker_vm.py
# gns3server/controller/export_project.py
# gns3server/controller/import_project.py
# gns3server/controller/project.py
# gns3server/crash_report.py
# gns3server/static/web-ui/index.html
# gns3server/static/web-ui/main.df8c319a3da6fb0e3629.js
# gns3server/version.py
# requirements.txt
# setup.py
# tests/compute/docker/test_docker_vm.py
# tests/controller/test_import_project.py
2024-10-31 12:54:35 +10:00
grossmj
24bfc205db
Symbolic links support for project export/import
2024-10-19 15:49:23 +10:00
grossmj
999f41b03e
Convert topologies < 3.0 to have valid node hostnames
2024-07-20 17:22:24 +02:00
grossmj
3a4ffb8786
Merge branch '2.2' into 3.0
...
# Conflicts:
# gns3server/compute/qemu/qemu_vm.py
# gns3server/utils/__init__.py
# requirements.txt
2024-07-03 19:00:44 +02:00
grossmj
39057bd781
Fix check for IPv6 enabled on host
2024-06-17 16:41:40 +02:00
grossmj
d3860ba84b
Merge branch '2.2' into 3.0
...
# Conflicts:
# CHANGELOG
# dev-requirements.txt
# gns3server/compute/qemu/__init__.py
# gns3server/compute/vmware/__init__.py
# gns3server/controller/snapshot.py
# gns3server/crash_report.py
# gns3server/handlers/api/compute/atm_switch_handler.py
# gns3server/run.py
# gns3server/static/web-ui/26.77d4bfd104f37c42e028.js
# gns3server/static/web-ui/index.html
# gns3server/static/web-ui/runtime.415291667f70565cd8ef.js
# gns3server/utils/__init__.py
# gns3server/utils/images.py
# gns3server/utils/interfaces.py
# gns3server/version.py
# gns3server/web/web_server.py
# pytest.ini
# requirements.txt
# scripts/update-bundled-web-ui.sh
# setup.py
# tests/api/routes/compute/test_dynamips_nodes.py
# tests/compute/builtin/nodes/test_cloud.py
# tests/compute/docker/test_docker.py
# tests/compute/docker/test_docker_vm.py
# tests/compute/dynamips/test_dynamips_manager.py
# tests/compute/dynamips/test_dynamips_router.py
# tests/compute/iou/test_iou_vm.py
# tests/compute/qemu/test_qcow2.py
# tests/compute/qemu/test_qemu_manager.py
# tests/compute/qemu/test_qemu_vm.py
# tests/compute/test_base_node.py
# tests/compute/test_manager.py
# tests/compute/test_project.py
# tests/compute/traceng/test_traceng_vm.py
# tests/compute/virtualbox/test_virtualbox_manager.py
# tests/compute/virtualbox/test_virtualbox_vm.py
# tests/compute/vmware/test_vmware_manager.py
# tests/compute/vmware/test_vmware_vm.py
# tests/compute/vpcs/test_vpcs_vm.py
# tests/conftest.py
# tests/controller/gns3vm/test_remote_gns3_vm.py
# tests/controller/gns3vm/test_virtualbox_gns3_vm.py
# tests/controller/gns3vm/test_vmware_gns3_vm.py
# tests/controller/test_export_project.py
# tests/controller/test_gns3vm.py
# tests/controller/test_import_project.py
# tests/test_config.py
# tests/utils/test_asyncio.py
# tests/utils/test_images.py
# tests/web/test_response.py
2024-05-16 17:53:39 +07:00
grossmj
3df7af12e1
Allow listing x86_64 IOU images. Fixes #2376
2024-05-09 15:21:05 +07:00
grossmj
18002a7580
Fix invalid escape sequences
2024-04-23 16:52:28 +07:00
grossmj
800920e3df
Merge branch '2.2' into 3.0
...
# Conflicts:
# .github/workflows/testing.yml
# gns3server/compute/docker/__init__.py
# gns3server/compute/docker/docker_vm.py
# gns3server/run.py
# requirements.txt
# setup.py
# tests/compute/docker/test_docker_vm.py
2024-02-21 12:24:30 +08:00
John Fleming
763ef24108
Address the telnet console bug. Add wait_for for drain() call. If we're stuck on drain then the buffer isn't getting emptied. 5 seconds after drain() blocks, exception will be thrown and client will be removed from connection table and will no longer be a problem.
2024-02-02 22:09:31 -05:00
grossmj
0037f31553
Merge branch '2.2' into 3.0
...
# Conflicts:
# CHANGELOG
# docs/api/notifications/link.updated.json
# docs/api/notifications/log.warning.json
# docs/api/v2/compute/ethernet_switch/projectsprojectidethernetswitchnodes.rst
# docs/api/v2/compute/ethernet_switch/projectsprojectidethernetswitchnodesnodeid.rst
# docs/api/v2/compute/iou/projectsprojectidiounodes.rst
# docs/api/v2/compute/project/projects.rst
# docs/api/v2/compute/qemu/projectsprojectidqemunodes.rst
# docs/api/v2/compute/qemu/projectsprojectidqemunodesnodeid.rst
# docs/api/v2/compute/qemu/projectsprojectidqemunodesnodeidstart.rst
# docs/api/v2/controller/link/projectsprojectidlinks.rst
# docs/api/v2/controller/link/projectsprojectidlinkslinkid.rst
# docs/api/v2/controller/link/projectsprojectidlinkslinkidstartcapture.rst
# docs/api/v2/controller/project/projects.rst
# docs/api/v2/controller/project/projectsprojectidduplicate.rst
# docs/controller_notifications.rst
# docs/curl.rst
# docs/gns3_file.json
# docs/project_notifications.rst
# gns3server/compute/qemu/qemu_vm.py
# gns3server/controller/project.py
# gns3server/crash_report.py
# gns3server/schemas/ethernet_hub.py
# gns3server/schemas/ethernet_switch.py
# gns3server/static/web-ui/3rdpartylicenses.txt
# gns3server/static/web-ui/index.html
# gns3server/utils/asyncio/telnet_server.py
# gns3server/version.py
# gns3server/web/web_server.py
# requirements.txt
# tests/controller/test_project.py
# tests/controller/test_topology.py
# tests/handlers/api/controller/test_project.py
2024-01-28 12:30:43 +11:00
John Fleming
6c5f54fe57
Update telnet_server.py
...
Maybe use the correct object name this time for the socket objects.
2024-01-28 12:14:07 +11:00
John Fleming
082fbee1bd
Update telnet_server.py
...
Set tcp keepalive timers to 60 seconds. Seems to default to 2 hours on ubuntu 22. Most firewalls will age out an idle tcp session at 1 hour.
Will not address telnet console failing after a tcp session has failed (TimeoutError).
2024-01-28 12:14:07 +11:00
John Fleming
54abf85523
Update telnet_server.py
...
Maybe use the correct object name this time for the socket objects.
2024-01-25 01:41:57 -05:00
John Fleming
ac86717bc0
Update telnet_server.py
...
Set tcp keepalive timers to 60 seconds. Seems to default to 2 hours on ubuntu 22. Most firewalls will age out an idle tcp session at 1 hour.
Will not address telnet console failing after a tcp session has failed (TimeoutError).
2024-01-23 13:15:17 -05:00
grossmj
f3b6825e40
Test if busybox is not dynamically linked
2023-08-11 14:10:25 +10:00
grossmj
fe90d2b146
Merge branch '2.2' into 3.0
...
# Conflicts:
# gns3server/controller/__init__.py
# gns3server/controller/appliance_manager.py
# gns3server/crash_report.py
# gns3server/run.py
# gns3server/static/web-ui/index.html
# gns3server/utils/images.py
# gns3server/version.py
# requirements.txt
# scripts/update-bundled-web-ui.sh
2023-08-10 15:00:22 +10:00
grossmj
7f595b089b
Use certifi to get SSL root certificates
2023-08-06 20:37:10 +10:00
grossmj
5da742394e
Use bundled cacert file on Windows and macOS
2023-08-05 22:21:08 +10:00
grossmj
7ef9b7600c
Use DEFAULT_BUFFER_SIZE for md5sum
2023-08-03 12:09:24 +10:00
grossmj
1d59afa9fb
Merge branch '2.2' into 3.0
...
# Conflicts:
# gns3server/controller/__init__.py
# gns3server/crash_report.py
# gns3server/handlers/api/controller/node_handler.py
# gns3server/utils/images.py
2023-08-02 18:26:50 +10:00
grossmj
af83adfdf6
Add debug message when calculating MD5 checksum
2023-08-02 17:41:51 +10:00