mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-08-29 05:20:14 +03:00
Compare commits
41 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a3e85b7041 | ||
|
|
80da7da515 | ||
|
|
d2f73cae28 | ||
|
|
da2942c139 | ||
|
|
5485eef3ad | ||
|
|
ccf4b3f9db | ||
|
|
b797981a65 | ||
|
|
a225622a6e | ||
|
|
3f19ede8d2 | ||
|
|
668169d1cc | ||
|
|
66b39f0616 | ||
|
|
7efef28d4f | ||
|
|
d9140d2f8c | ||
|
|
e2657febf0 | ||
|
|
d161f1997d | ||
|
|
37490f2c74 | ||
|
|
9b1d7d44bf | ||
|
|
9562c9d828 | ||
|
|
6c2a980afc | ||
|
|
00ac2c19bd | ||
|
|
6742d09a70 | ||
|
|
41e8777609 | ||
|
|
20868aa233 | ||
|
|
27c6535ad0 | ||
|
|
c75e1ba0be | ||
|
|
c1e845cb22 | ||
|
|
803cc17410 | ||
|
|
f088c55cfe | ||
|
|
8a8864c90b | ||
|
|
1986bce538 | ||
|
|
c528d2cd95 | ||
|
|
7529ee4168 | ||
|
|
61c7f4469d | ||
|
|
896b4fc56a | ||
|
|
a58fa8602b | ||
|
|
d8f8b6ec70 | ||
|
|
b256d5a5f6 | ||
|
|
ea09cc2724 | ||
|
|
e3e0a511b6 | ||
|
|
0ecaab4da0 | ||
|
|
40644f33e6 |
@ -1,36 +0,0 @@
|
||||
# GNS3 Server Project Memory
|
||||
|
||||
> **Note**: This directory stores important project-related memories and case studies, managed with the code repository.
|
||||
>
|
||||
> **How to record**: Use the `/memory` skill to record important information to the project memory directory.
|
||||
|
||||
## Quick Reference
|
||||
- **Memory directory**: `.claude/memory/`
|
||||
- **Skill file**: `.claude/skills/memory/SKILL.md`
|
||||
- **Main index**: `MEMORY.md` (this file)
|
||||
|
||||
## Topics
|
||||
|
||||
### Web Wireshark Integration
|
||||
- **[JWT Token Flow](./web-wireshark-jwt-token-flow.md)** - JWT token transmission path in Web Wireshark
|
||||
- Key point: UDPLink only passes through jwt_token, ultimately used by curl command inside Web Wireshark container to authenticate with GNS3 capture stream API
|
||||
- **[Xpra HTML5 Client](./xpra-html5-client.md)** - Xpra HTML5 client menu control parameters for customizing the web interface
|
||||
|
||||
### RBAC & User Isolation
|
||||
- **[RBAC User Isolation Design](./rbac-user-isolation-design.md)** — Three-step permission check design: ACE batch check → created_by filtering → resource pools
|
||||
|
||||
### Appliance Management
|
||||
- **[GNS3 Appliance Loading](./gns3-appliance-loading.md)** - How GNS3 loads appliance files from builtin and custom directories with priority rules
|
||||
|
||||
### uBridge Permission
|
||||
- **[uBridge Permission Issue](./gns3-ubridge-permission.md)** - Docker containers fail to start due to missing CAP_NET_ADMIN/CAP_NET_RAW capabilities on uBridge
|
||||
|
||||
### Docker Container Stop Delay
|
||||
- **[Docker Container Stop Delay](./docker-container-stop-delay.md)** - Some containers take ~5s to stop because they don't handle SIGTERM (AlpiNet, OstinatoWireshark)
|
||||
|
||||
### MCP Service
|
||||
- **[MCP Service Design](./mcp-service-design.md)** - MCP (Model Context Protocol) service architecture using FastMCP with SSE transport, JWT auth, 29 tools across 5 domains
|
||||
- **[MCP Tool Description Location](./mcp-tool-description-guide.md)** - Where to define MCP tool descriptions: in `@mcp.tool()` functions in `__init__.py`, not in `*_TOOLS` arrays
|
||||
|
||||
### Python Code Verification
|
||||
- **[Import Validation](./python-import-validation.md)** - Use actual module imports (`python -c "from ... import ..."`) instead of `py_compile` to catch missing imports
|
||||
@ -1,41 +0,0 @@
|
||||
---
|
||||
name: docker-container-stop-delay
|
||||
description: Docker containers not responding to SIGTERM cause ~5s stop delays when closing a project
|
||||
metadata:
|
||||
type: reference
|
||||
---
|
||||
|
||||
# Docker Container Stop Delay Analysis
|
||||
|
||||
## Background
|
||||
When stopping a GNS3 project, some Docker containers take ~5s to exit while others stop instantly.
|
||||
|
||||
## Root Cause
|
||||
Docker's `stop` command sends SIGTERM and waits `t` seconds (GNS3 sets `t=5`) before sending SIGKILL. Containers that don't handle SIGTERM are stuck waiting for the full timeout.
|
||||
|
||||
## Affected Containers
|
||||
|
||||
| Container | PID 1 | Why it's slow |
|
||||
|-----------|-------|---------------|
|
||||
| **AlpiNet** (alpine) | `dumb-init` → `bash -i` | Interactive bash ignores SIGTERM by design |
|
||||
| **OstinatoWireshark** | `bash` (PID 1) | Linux kernel won't apply default signal actions to PID 1 without an explicit handler; interactive bash doesn't install one |
|
||||
|
||||
## Normal Containers (for comparison)
|
||||
|
||||
| Container | PID 1 | Why fast |
|
||||
|-----------|-------|----------|
|
||||
| Chromium | `/usr/bin/chromium` | Chromium handles SIGTERM natively |
|
||||
| webterm | `dumb-init` → firefox | Firefox responds to SIGTERM immediately |
|
||||
|
||||
## Related Files
|
||||
- `gns3-registry/docker/alpinet/Dockerfile`
|
||||
- `gns3-registry/docker/ostinato-wireshark/Dockerfile`
|
||||
- `gns3-registry/docker/ostinato-wireshark/entry.sh`
|
||||
- `gns3-registry/docker/chromium/Dockerfile`
|
||||
- `gns3-registry/docker/ipterm/web/Dockerfile`
|
||||
- `gns3-server/gns3server/compute/docker/docker_vm.py:1040` — stop timeout parameter `t=5`
|
||||
|
||||
## Note
|
||||
This is not a GNS3 server bug (except a minor `or` vs `and` logic issue at `docker_vm.py:1037` which doesn't affect behavior). The root cause is in the Docker images themselves.
|
||||
|
||||
See also: [[docker-container-stop-delay]]
|
||||
@ -1,20 +0,0 @@
|
||||
---
|
||||
name: gns3-appliance-loading
|
||||
description: GNS3 appliance file loading mechanism and storage locations
|
||||
metadata:
|
||||
type: reference
|
||||
---
|
||||
|
||||
GNS3 loads appliance (.gns3a) files from two locations with specific priority order:
|
||||
|
||||
1. **Builtin appliances directory**: `~/.local/share/GNS3/appliances/`
|
||||
- Stores automatically downloaded devices from GNS3 registry
|
||||
- Maintained and updated by the system automatically
|
||||
|
||||
2. **Custom appliances directory**: `~/GNS3/appliances/`
|
||||
- Stores user-customized or modified appliance files
|
||||
- Manually managed by users
|
||||
|
||||
**Loading priority**: System loads builtin appliances first, then custom appliances. If both directories contain devices with the same `device_id`, the custom appliance overwrites the builtin one. This design allows users to customize devices without having their modifications overwritten by automatic registry updates.
|
||||
|
||||
**Implementation**: See `gns3server/controller/appliance_manager.py` in the `load_appliances()` method (lines 314-351).
|
||||
@ -1,25 +0,0 @@
|
||||
# GNS3 uBridge Permission Issue
|
||||
|
||||
## Problem
|
||||
Docker container node fails to start with error: `uBridge requires root access or the capability to interact with network adapters`
|
||||
|
||||
## Root Cause
|
||||
- uBridge needs to create TAP network interfaces to connect Docker containers to GNS3 virtual network
|
||||
- This requires `CAP_NET_ADMIN` and `CAP_NET_RAW` capabilities
|
||||
- Other node types (like QEMU) may have their own network implementation and don't need uBridge
|
||||
|
||||
## Solution
|
||||
```bash
|
||||
sudo setcap cap_net_admin,cap_net_raw=eip /usr/bin/ubridge
|
||||
```
|
||||
|
||||
## Code Locations
|
||||
- uBridge path check: `gns3server/compute/base_manager.py:298` (`has_privileged_access`)
|
||||
- Permission check call: `gns3server/compute/base_node.py:851`
|
||||
- Error message definition: `gns3server/compute/base_node.py:852`
|
||||
|
||||
## Error Propagation Flow
|
||||
Error is propagated via `NodeError` exception:
|
||||
1. `NodeError` is caught at `gns3server/api/routes/compute/__init__.py:131-137`
|
||||
2. Returns HTTP 409 with JSON: `{"message": "...", "exception": "NodeError"}`
|
||||
3. Frontend should read error info from `message` field
|
||||
@ -1,91 +0,0 @@
|
||||
---
|
||||
name: mcp-service-design
|
||||
description: MCP (Model Context Protocol) service architecture and tool design for GNS3 server
|
||||
metadata:
|
||||
type: project
|
||||
---
|
||||
|
||||
# MCP (Model Context Protocol) Service Design
|
||||
|
||||
## Background
|
||||
|
||||
Provide a standard MCP interface for GNS3 Server, allowing AI assistants (Claude Code, Claude Desktop) to interact with GNS3 network simulations through the Model Context Protocol.
|
||||
|
||||
## Decision/Implementation
|
||||
|
||||
### Transport
|
||||
- **SSE (Server-Sent Events)** with JWT token authentication
|
||||
- Endpoint: `/v3/mcp/transport/sse`
|
||||
- Message endpoint: `/v3/mcp/transport/messages/`
|
||||
|
||||
### Authentication
|
||||
- JWT token obtained via `/v3/access/users/authenticate`
|
||||
- Two ways to pass token:
|
||||
- `Authorization: Bearer <jwt>` header (Claude Code via `-H`)
|
||||
- `?token=<jwt>` query param (Claude Desktop, EventSource limitation)
|
||||
- Token validated using GNS3's existing `auth_service`
|
||||
- Token stored in `contextvars.ContextVar` for per-session isolation
|
||||
- Python ≥ 3.9 `asyncio.to_thread` propagates contextvars to threads
|
||||
|
||||
### Architecture
|
||||
```
|
||||
Claude Code / Desktop → SSE → Auth Wrapper → FastMCP Server → Tool Handler → Gns3Connector → GNS3 REST API
|
||||
```
|
||||
|
||||
### Tool Organization
|
||||
Tools are separated by domain into individual files under `gns3server/api/routes/mcp/`:
|
||||
|
||||
| File | Domain | Tool Count |
|
||||
|------|--------|:----------:|
|
||||
| `projects.py` | Project CRUD, open/close/stats | 7 |
|
||||
| `nodes.py` | Node CRUD, start/stop/reload/suspend, console WS | 10 |
|
||||
| `links.py` | Link CRUD | 5 |
|
||||
| `templates.py` | Template CRUD | 5 |
|
||||
| `computes.py` | Compute list/get/images | 3 |
|
||||
|
||||
**Total: 30 tools**
|
||||
|
||||
### Handler Pattern
|
||||
- Synchronous functions receiving `(params: dict, gns3_ctx: dict)`
|
||||
- Run via `asyncio.to_thread()` to avoid blocking the event loop
|
||||
- `gns3_ctx` contains `server_url` and `jwt_token`
|
||||
- `Gns3Connector` is created per-handler from `custom_gns3fy`
|
||||
|
||||
### Token Lifetime
|
||||
- Default: 1440 minutes (24 hours)
|
||||
- Configurable via `jwt_access_token_expire_minutes` in `gns3_server.conf`
|
||||
|
||||
## Rationale
|
||||
- **Why not Direct Controller calls**: MCP layer calls GNS3's own REST API through Gns3Connector, keeping full decoupling and supporting future multi-user/multi-instance scenarios
|
||||
- **Why not Streamable HTTP**: Claude Code supports SSE natively via `--transport sse` with custom headers; Streamable HTTP session manager lifecycle conflicts with FastAPI mount
|
||||
- **Why not stdio**: stdio is local-only; SSE supports both local and remote deployments
|
||||
|
||||
## Related Files
|
||||
- `gns3server/api/routes/mcp/__init__.py` — FastMCP server, tool decorators, auth wrapper
|
||||
- `gns3server/api/routes/mcp/projects.py` — Project tool handlers
|
||||
- `gns3server/api/routes/mcp/nodes.py` — Node tool handlers
|
||||
- `gns3server/api/routes/mcp/links.py` — Link tool handlers
|
||||
- `gns3server/api/routes/mcp/templates.py` — Template tool handlers
|
||||
- `gns3server/api/routes/mcp/computes.py` — Compute tool handlers
|
||||
- `gns3server/agent/gns3_copilot/gns3_client/custom_gns3fy.py` — Gns3Connector client
|
||||
- `gns3server/api/server.py:87` — MCP route registration
|
||||
|
||||
## Configuration
|
||||
|
||||
### Claude Code
|
||||
```bash
|
||||
claude mcp add --transport sse My_GNS3_Server \
|
||||
http://host:3080/v3/mcp/transport/sse \
|
||||
-H "Authorization: Bearer <jwt>"
|
||||
```
|
||||
|
||||
### Claude Desktop
|
||||
```json
|
||||
{
|
||||
"mcpServers": {
|
||||
"My_GNS3_Server": {
|
||||
"url": "http://host:3080/v3/mcp/transport/sse?token=<jwt>"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
@ -1,43 +0,0 @@
|
||||
---
|
||||
name: mcp-tool-description-location
|
||||
description: Where to define MCP tool descriptions so AI can see them
|
||||
metadata:
|
||||
type: reference
|
||||
---
|
||||
|
||||
# MCP Tool Description Location
|
||||
|
||||
## Key Point
|
||||
MCP tool descriptions are defined in `@mcp.tool()` decorator functions in `__init__.py`, NOT in the `*_TOOLS` arrays in individual module files.
|
||||
|
||||
## Correct Location
|
||||
**File**: `gns3server/api/routes/mcp/__init__.py`
|
||||
|
||||
**Example**:
|
||||
```python
|
||||
@mcp.tool()
|
||||
async def update_link(
|
||||
project_id: Annotated[str, Field(description="UUID of the project")],
|
||||
link_id: Annotated[str, Field(description="UUID of the link to update")],
|
||||
**kwargs: Any,
|
||||
) -> list[dict[str, Any]]:
|
||||
"""Update a link's properties.
|
||||
|
||||
Put detailed descriptions here, especially for complex parameters.
|
||||
Include format requirements, ranges, and examples.
|
||||
"""
|
||||
# implementation
|
||||
```
|
||||
|
||||
## Wrong Location
|
||||
- ❌ `LINK_TOOLS` in `gns3server/api/routes/mcp/links.py`
|
||||
- ❌ `TEMPLATE_TOOLS` in `gns3server/api/routes/mcp/templates.py`
|
||||
|
||||
## Activation
|
||||
**Must restart GNS3 server** for description updates to take effect.
|
||||
|
||||
## Description Requirements
|
||||
- Be explicit about data formats (arrays vs single values)
|
||||
- Include parameter ranges and constraints
|
||||
- Provide usage examples
|
||||
- Prevent common errors in the description itself
|
||||
@ -1,30 +0,0 @@
|
||||
# Python Import Validation
|
||||
|
||||
## Background
|
||||
|
||||
When checking if modified Python code is correct, `py_compile` only validates syntax (e.g., balanced parentheses, valid keywords). It does **not** catch missing imports or other runtime errors (e.g., using `UUID()` without importing `UUID`).
|
||||
|
||||
## Decision/Implementation
|
||||
|
||||
Use actual module imports to verify code correctness:
|
||||
|
||||
```bash
|
||||
# ✅ This catches missing imports and runtime errors
|
||||
venv/bin/python -c "
|
||||
from gns3server.api.routes.controller.dependencies.authentication import get_user_from_token
|
||||
from gns3server.api.routes.mcp.__init__ import _resolve_token
|
||||
print('All imports OK')
|
||||
"
|
||||
|
||||
# ❌ This only checks syntax, not references
|
||||
venv/bin/python -c "import py_compile; py_compile.compile('file.py', doraise=True)"
|
||||
```
|
||||
|
||||
## Related Files
|
||||
|
||||
`gns3server/api/routes/controller/dependencies/authentication.py` — missed `from uuid import UUID`
|
||||
`gns3server/api/routes/mcp/__init__.py` — missed `from uuid import UUID`
|
||||
|
||||
## Why
|
||||
|
||||
A `NameError` at runtime is far more expensive than a failed import check. Real import testing catches the full dependency chain.
|
||||
@ -1,231 +0,0 @@
|
||||
---
|
||||
name: rbac-user-isolation-design
|
||||
description: GNS3 RBAC user isolation design and implementation thought process
|
||||
metadata:
|
||||
type: project
|
||||
---
|
||||
|
||||
## RBAC User Isolation Design Summary
|
||||
|
||||
### Core Problem
|
||||
GNS3 3.0 has a complete RBAC framework (ACE + Role + Privilege), but lacks user isolation implementation, causing users to see resources they shouldn't have access to.
|
||||
|
||||
### Design Conflict
|
||||
Traditional RBAC's **path permission model** fundamentally conflicts with **user data isolation**:
|
||||
- **Path permission model**: Controls which paths users can access (e.g., `/projects`)
|
||||
- **User data isolation**: Controls which specific resources users can access (e.g., alice's project vs bob's project)
|
||||
|
||||
### Final Implementation Approach
|
||||
|
||||
#### Three-Step Permission Check Logic
|
||||
|
||||
```python
|
||||
# Step 1: Batch ACE + resource pool check (3 DB queries regardless of project count)
|
||||
direct_ace_ids, pool_accessible_ids = await rbac_repo.get_accessible_project_ids(
|
||||
current_user.user_id, "Project.Audit", all_project_ids
|
||||
)
|
||||
|
||||
# Step 2: Filter direct ACE projects by created_by (user's own projects)
|
||||
# Direct project sharing is only available through resource pools
|
||||
for p in controller.projects.values():
|
||||
if p.id in direct_ace_ids and p.created_by == current_user.username:
|
||||
projects.append(p.asdict())
|
||||
|
||||
# Step 3: Resource pool projects (no created_by filter)
|
||||
for p in controller.projects.values():
|
||||
if p.id in pool_accessible_ids:
|
||||
projects.append(p.asdict())
|
||||
```
|
||||
|
||||
##### Super Admin Bypass
|
||||
```python
|
||||
if current_user.is_superadmin:
|
||||
return [p.asdict() for p in controller.projects.values()]
|
||||
```
|
||||
Super admins skip all three steps and see every project.
|
||||
|
||||
##### seen_project_ids Deduplication
|
||||
A simple `seen_project_ids` set prevents the same project from appearing twice when it exists in both direct ACE and pool results. This is a lightweight dedup, not the complex blocking mechanism from earlier rejected designs.
|
||||
|
||||
### Key Design Decisions
|
||||
|
||||
#### 1. ACE vs created_by Relationship
|
||||
- **ACE for basic access control**: Whether user can access the system
|
||||
- **created_by for user isolation**: Which specific resources user can access
|
||||
- **Step 2 filtering is critical**: Even with broad ACE, created_by filtering ensures user isolation
|
||||
|
||||
#### 2. Project Sharing Mechanism
|
||||
- **Project sharing only through resource pools**: Cannot configure ACE directly for specific projects
|
||||
- **Avoids complexity of direct ACE sharing**: Prevents permission configuration chaos
|
||||
|
||||
#### 3. Broad ACE Fault Tolerance
|
||||
```
|
||||
Even with configuration: ACE: Users group + User role + "/" + propagate: True
|
||||
Result: Users still only see projects they created
|
||||
Reason: Step 2 created_by filtering removes other users' projects
|
||||
```
|
||||
|
||||
### RbacRepository.get_accessible_project_ids()
|
||||
|
||||
The core batch-check method in `gns3server/db/repositories/rbac.py` uses 3 DB queries:
|
||||
|
||||
1. **User ACEs**: Direct ACE entries matching user + privilege
|
||||
2. **Group ACEs**: Group-level ACE entries via `UserGroup` membership
|
||||
3. **All resources with pool memberships**: Preloads all resources and their pool relationships
|
||||
|
||||
Then it computes two sets:
|
||||
- **`direct_ace_ids`**: Project paths matching user or group ACEs (path-based check)
|
||||
- **`pool_accessible_ids`**: Projects in pools the user/group can access (pool-based check)
|
||||
|
||||
Pool IDs are precomputed into a `pool_id -> set(project_ids)` map for O(1) lookup.
|
||||
|
||||
### Problems Solved
|
||||
|
||||
#### Problem 1: Missing User Isolation
|
||||
- **Issue**: All users can see all projects
|
||||
- **Solution**: Filter by created_by to implement user isolation
|
||||
|
||||
#### Problem 2: Broad ACE Breaking Isolation
|
||||
- **Issue**: `path: "/" + propagate: true` breaks user isolation
|
||||
- **Solution**: Step 2 created_by filtering ensures user isolation even with broad ACE
|
||||
|
||||
#### Problem 3: Permission Check Order Conflicts
|
||||
- **Issue**: seen mechanism blocks subsequent checks (from earlier design phases)
|
||||
- **Solution**: Simple pipeline-style filtering with lightweight dedup set
|
||||
|
||||
### Technical Details
|
||||
|
||||
#### API Layer Permission Check
|
||||
```python
|
||||
@router.get("/projects") # Note: no has_privilege decorator
|
||||
async def get_projects(current_user=..., rbac_repo=...):
|
||||
# Permission checks in business logic
|
||||
```
|
||||
|
||||
#### Duplicate Prevention
|
||||
- Simple `seen_project_ids` set for deduplication between direct ACE and pool results
|
||||
- Not the complex blocking mechanism from earlier phases
|
||||
|
||||
#### Performance Considerations
|
||||
- Super admin path: O(1) — returns all projects directly
|
||||
- Regular user path: 3 fixed DB queries regardless of project count
|
||||
- Path-based ACE check: O(n * m) in worst case, where n = projects, m = ACE entries
|
||||
- Pool lookup: O(1) via precomputed pool->project map
|
||||
|
||||
### Use Cases
|
||||
|
||||
#### Scenario 1: Personal Use
|
||||
```
|
||||
alice creates project → alice only sees alice's projects ✅
|
||||
bob creates project → bob only sees bob's projects ✅
|
||||
No extra configuration needed, automatic user isolation
|
||||
```
|
||||
|
||||
#### Scenario 2: Team Collaboration
|
||||
```
|
||||
Admin creates resource pool → adds projects → team members can access
|
||||
alice creates project → alice still sees her own projects ✅
|
||||
Team sharing + user isolation coexist
|
||||
```
|
||||
|
||||
#### Scenario 3: Broad ACE Configuration
|
||||
```
|
||||
ACE: Users group + "/" + propagate: True
|
||||
alice still only sees alice's projects ✅
|
||||
User isolation unaffected by ACE configuration
|
||||
```
|
||||
|
||||
### Design Principles
|
||||
|
||||
#### 1. Separation of Concerns
|
||||
- **Basic access permission**: Controlled by ACE
|
||||
- **Data ownership**: Controlled by created_by
|
||||
- **Team sharing**: Controlled by resource pools
|
||||
|
||||
#### 2. Defensive Design
|
||||
- User isolation remains effective even with improper ACE configuration
|
||||
- Secure by default: users only see their own resources
|
||||
|
||||
#### 3. Simplicity
|
||||
- Avoid complex seen mechanisms and mutual exclusion logic
|
||||
- Clear pipeline-style check order
|
||||
|
||||
### Relationship with Original ACE System
|
||||
|
||||
#### Preserved Components
|
||||
- ✅ ACE framework (permission check mechanism)
|
||||
- ✅ Role and privilege definitions
|
||||
- ✅ Resource pool functionality
|
||||
|
||||
#### Improved Components
|
||||
- ✅ Added user isolation (created_by filtering)
|
||||
- ✅ Clarified project sharing mechanism (only through resource pools)
|
||||
- ✅ Simplified permission check logic
|
||||
|
||||
#### Removed Components
|
||||
- ❌ Removed `/projects` path privilege check on `get_projects` route
|
||||
- ❌ Removed the old complex `seen_project_ids` blocking mechanism
|
||||
- ❌ Avoided "can see all non-pool projects" privilege leak
|
||||
|
||||
### Implementation Details
|
||||
- **Main modification**: `gns3server/api/routes/controller/projects.py`
|
||||
- **Function**: `get_projects()`
|
||||
- **Batch check method**: `gns3server/db/repositories/rbac.py::RbacRepository.get_accessible_project_ids()`
|
||||
- **Privilege dependency**: `gns3server/api/routes/controller/dependencies/rbac.py::has_privilege()`
|
||||
- **Branch**: `feature/simple-user-isolation`
|
||||
- **Base branch**: `master`
|
||||
|
||||
### Key Commits
|
||||
1. Implemented basic created_by filtering
|
||||
2. Implemented three-layer permission check (with logic issues)
|
||||
3. Fixed to correct three-step check logic
|
||||
|
||||
### Design Evolution Process
|
||||
|
||||
#### Phase 1: Simple created_by Filtering
|
||||
```python
|
||||
user_projects = [p for p in all_projects() if p.created_by == user.username]
|
||||
```
|
||||
**Issue**: Didn't integrate with ACE system
|
||||
|
||||
#### Phase 2: Three-Layer Check (Wrong Version)
|
||||
```python
|
||||
# Used complex seen_project_ids blocking mechanism
|
||||
# Issue: Broad ACE breaks user isolation
|
||||
```
|
||||
|
||||
#### Phase 3: Three-Step Check (Correct Version)
|
||||
```python
|
||||
# Step 1: Batch ACE check via get_accessible_project_ids()
|
||||
# Step 2: Filter direct_ace_ids by created_by
|
||||
# Step 3: Resource pool projects (no created_by filter)
|
||||
```
|
||||
**Solution**: User isolation works even with broad ACE
|
||||
|
||||
### Relationship with RBAC Roadmap
|
||||
This implementation addresses items mentioned in the roadmap:
|
||||
- **Phase 1 (MVP)**: Basic project isolation implementation
|
||||
- **Auto-ACE on create**: Still needs to be implemented separately
|
||||
- **Template isolation**: Can use same design pattern
|
||||
|
||||
### Unsolved Issues
|
||||
|
||||
1. **Auto-ACE on project creation**: Part of roadmap Phase 1 — `create_project()` sets `created_by` but doesn't create ACE entries
|
||||
2. **Template and image isolation**: Can apply same design pattern
|
||||
3. **Default ACE configuration**: Need reasonable default permissions for Users group
|
||||
|
||||
### Design Limitations
|
||||
|
||||
1. **Project sharing only through resource pools**: No direct ACE configuration for sharing
|
||||
2. **ACE configuration required**: Users need basic ACE to access system
|
||||
3. **Performance considerations**: ACE check queries database for each project path
|
||||
|
||||
### Future Improvement Directions
|
||||
|
||||
1. **Auto-create ACE**: Automatically add ACE for creator when creating projects
|
||||
2. **Default ACE strategy**: Configure reasonable default permissions for Users group
|
||||
3. **Performance optimization**: Cache ACE check results to reduce database queries
|
||||
|
||||
This design achieves effective user isolation while maintaining RBAC system integrity, and solves the problem of broad ACE configurations breaking isolation.
|
||||
|
||||
**Key insight**: The Step 2 created_by filtering is the critical innovation that allows ACE and user isolation to coexist properly.
|
||||
@ -1,53 +0,0 @@
|
||||
# Web Wireshark JWT Token Flow
|
||||
|
||||
## Background
|
||||
|
||||
Question: What is the purpose of `jwt_token` parameter in UDPLink and how is it transmitted?
|
||||
|
||||
## JWT Token Complete Flow
|
||||
|
||||
1. **User initiates request** → HTTP request with `Authorization: Bearer <jwt_token>`
|
||||
|
||||
2. **API layer extracts token** → `gns3server/api/routes/controller/links.py`:
|
||||
```python
|
||||
auth_header = http_request.headers.get("Authorization", "")
|
||||
jwt_token = auth_header.replace("Bearer ", "") if auth_header else None
|
||||
```
|
||||
|
||||
3. **Pass to Link layer** → `Link.start_capture(wireshark=True, jwt_token=xxx)`
|
||||
|
||||
4. **UDPLink forwards** → `UDPLink.start_capture()` calls `super().start_capture(jwt_token=jwt_token)`
|
||||
|
||||
5. **Start Web Wireshark container** → `Link._start_web_wireshark(jwt_token)` calls management script
|
||||
|
||||
6. **Container uses token** → `manage_wireshark.py` executes inside container:
|
||||
```bash
|
||||
curl -N -H 'Authorization: Bearer {jwt_token}' \
|
||||
'http://controller:3080/v3/projects/{project_id}/links/{link_id}/capture/stream' | \
|
||||
wireshark -i - -k -display :{display}
|
||||
```
|
||||
|
||||
## Why More Verbose Than gns3-copilot?
|
||||
|
||||
**gns3-copilot approach**:
|
||||
- All code within the same process
|
||||
- Uses `contextvars` to store and retrieve token
|
||||
- Downstream code directly calls `get_current_jwt_token()`, no need to pass through layers
|
||||
|
||||
**Web Wireshark approach**:
|
||||
- Token needs to be passed across processes (management script is separate process)
|
||||
- Token needs to be passed across containers (Docker container isolation)
|
||||
- Cannot use `contextvars`, must pass through command line arguments
|
||||
|
||||
## Conclusion
|
||||
|
||||
UDPLink does not use this token, it only forwards it to the parent class. Ultimately used by the curl command inside the Web Wireshark container to authenticate with the GNS3 controller's capture stream API.
|
||||
|
||||
Token flow: **Client → GNS3 API → Link → UDPLink → Web Wireshark container → GNS3 capture stream API**
|
||||
|
||||
## Related Files
|
||||
|
||||
- `gns3server/api/routes/controller/links.py:114-115` - JWT token extraction
|
||||
- `gns3server/controller/link.py:321-360` - Web Wireshark startup logic
|
||||
- `gns3server/controller/udp_link.py:178` - UDPLink start_capture signature
|
||||
- `gns3server/agent/web_wireshark/manage_wireshark.py:527-529` - Container curl command with JWT
|
||||
@ -1,148 +0,0 @@
|
||||
# Xpra HTML5 Client Configuration
|
||||
|
||||
## Overview
|
||||
|
||||
Web Wireshark integration uses xpra's built-in HTML5 client to provide browser-based packet capture viewing. The xpra HTML5 client is located at `/usr/share/xpra/www` in the container.
|
||||
|
||||
## Configuration Methods
|
||||
|
||||
### 1. URL Parameters (Per-Session)
|
||||
|
||||
Control toolbar menu items via URL query parameters (default: true):
|
||||
|
||||
| Parameter | Menu Item | Description |
|
||||
|-----------|-----------|-------------|
|
||||
| xpramenu | Xpra Menu | Main menu (Server, Information submenus) |
|
||||
| open_windows | Open Windows | List of open windows |
|
||||
| fullscreen_button | Fullscreen | Fullscreen toggle button |
|
||||
| keyboard_button | Keyboard | Keyboard layout/shortcuts |
|
||||
| clipboard_button | Clipboard Copy | Clipboard copy functionality |
|
||||
| sound_button | Audio | Audio toggle |
|
||||
| cursor_lock_button | Lock Cursor | Game cursor lock mode |
|
||||
|
||||
```bash
|
||||
# Examples
|
||||
?fullscreen_button=false&sound_button=false
|
||||
?xpramenu=false&keyboard_button=false&clipboard_button=false&sound_button=false&cursor_lock_button=false
|
||||
```
|
||||
|
||||
### 2. default-settings.txt (Recommended - Global/Persistent)
|
||||
|
||||
Modify `html5/default-settings.txt` (INI format) for all users.
|
||||
|
||||
**Features:**
|
||||
|
||||
| Parameter | Default | Description |
|
||||
|-----------|---------|-------------|
|
||||
| keyboard | auto-detect | Enable keyboard input |
|
||||
| keyboard_layout | us | Keyboard layout |
|
||||
| clipboard | yes | Clipboard sharing |
|
||||
| printing | yes | Printer forwarding |
|
||||
| file_transfer | yes | File transfer |
|
||||
| swap_keys | MacOS yes | Swap Command/Control keys |
|
||||
| scroll_reverse_x | no | Reverse mouse X-axis |
|
||||
| floating_menu | yes | Show floating menu |
|
||||
| toolbar_position | top-left | Toolbar position |
|
||||
| autohide | no | Auto-hide toolbar |
|
||||
| sound | yes | Audio forwarding |
|
||||
| video | 64-bit yes | Video decoding |
|
||||
|
||||
**Connection Options:**
|
||||
|
||||
| Parameter | Description |
|
||||
|-----------|-------------|
|
||||
| server | Server address |
|
||||
| port | Port number |
|
||||
| username | Username |
|
||||
| password | Password |
|
||||
| ssl | Enable SSL |
|
||||
| encryption | Encryption type (AES-CBC/CTR/CFB) |
|
||||
| key | AES encryption key |
|
||||
| sharing | Allow session sharing |
|
||||
| steal | Steal session |
|
||||
| reconnect | Auto-reconnect |
|
||||
| bandwidth_limit | Bandwidth limit (bits/s) |
|
||||
| override_width | Client desktop width |
|
||||
|
||||
**Advanced Options:**
|
||||
|
||||
| Parameter | Default | Description |
|
||||
|-----------|---------|-------------|
|
||||
| audio_codec | auto-detect | Audio codec |
|
||||
| encoding | auto | Image encoding (png/jpeg/webp/etc) |
|
||||
| remote_logging | yes | Send logs to server |
|
||||
| action | connect | Connection mode (start/shadow) |
|
||||
| submit | yes | Show diagnostics on disconnect |
|
||||
|
||||
### 3. default_settings in Code
|
||||
|
||||
Set directly in `<script>` tag in index.html:
|
||||
```javascript
|
||||
const default_settings = {};
|
||||
default_settings["xpramenu"] = false;
|
||||
```
|
||||
|
||||
### Priority Order
|
||||
|
||||
URL parameter > default_settings object > default-settings.txt > code default value
|
||||
|
||||
## Server-Controlled Submenu Items
|
||||
|
||||
The **Server submenu** items are controlled by server hello message:
|
||||
|
||||
| Menu Item ID | Content | Control Source |
|
||||
|--------------|---------|----------------|
|
||||
| clock_menu_entry | Clock | server-time in hello |
|
||||
| upload_menu_entry | Upload file | file-transfer or file.enabled |
|
||||
| download_menu_entry | Download file | file-transfer or file.enabled |
|
||||
| shutdown_menu_entry | Shutdown Server | client-shutdown in hello |
|
||||
|
||||
**Information submenu** (About Xpra, Session Info, Bug Report) and fixed items (Reload, Disconnect) are always displayed.
|
||||
|
||||
To hide "Shutdown Server", set environment variable before starting xpra:
|
||||
```bash
|
||||
export XPRA_CLIENT_CAN_SHUTDOWN=false
|
||||
xpra start :{display} ...
|
||||
```
|
||||
Code: `xpra/server/base.py:40` - `CLIENT_CAN_SHUTDOWN = envbool("XPRA_CLIENT_CAN_SHUTDOWN", True)`
|
||||
|
||||
## Customizing Background Image
|
||||
|
||||
Background image is defined in `html5/css/client.css`:
|
||||
```css
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
background-color: #021d3a;
|
||||
background-image: url(../background.jpg);
|
||||
background-position: center center;
|
||||
background-repeat: no-repeat;
|
||||
background-size: cover;
|
||||
}
|
||||
```
|
||||
|
||||
### Methods
|
||||
|
||||
1. **Replace image file**: Create/replace `html5/background.jpg`
|
||||
2. **Modify CSS**: Change `html5/css/client.css` line 9:
|
||||
```css
|
||||
background-image: url(../your-image.jpg);
|
||||
```
|
||||
|
||||
### Notes
|
||||
- Supported formats: jpg, png, svg, etc.
|
||||
- Recommended resolution: 1920x1080 or higher
|
||||
- `background-size: cover` auto-stretches to fill
|
||||
|
||||
### Temporary Modification (via URL)
|
||||
|
||||
Cannot modify background via URL directly, but can use browser DevTools:
|
||||
```css
|
||||
body { background-image: url(your-image-url); }
|
||||
```
|
||||
|
||||
## Related Files
|
||||
|
||||
- Container Dockerfile: `gns3server/agent/web_wireshark/docker/Dockerfile`
|
||||
- Container HTML5 client path: `/usr/share/xpra/www`
|
||||
@ -1,54 +0,0 @@
|
||||
---
|
||||
name: documentation
|
||||
description: Use this skill when creating or updating technical documentation under docs/ directory for GNS3 server
|
||||
version: 3.0.0
|
||||
---
|
||||
|
||||
# GNS3 Server Technical Documentation Standard
|
||||
|
||||
## Core Principle
|
||||
|
||||
Documentation answers: **What is this, how does it work at a high level.**
|
||||
|
||||
Code details are left to the codebase — readers can use AI to find implementation specifics.
|
||||
|
||||
---
|
||||
|
||||
## Document Structure
|
||||
|
||||
```markdown
|
||||
# Feature Name
|
||||
|
||||
## Overview
|
||||
[What it does, in 2-3 sentences]
|
||||
|
||||
## Architecture
|
||||
[Mermaid diagram: components and their relationships]
|
||||
|
||||
## Business Process
|
||||
[Mermaid sequence/flowchart: key flows]
|
||||
|
||||
## API Endpoints
|
||||
[Table: Method | Path | Description | Privilege]
|
||||
|
||||
## Notes
|
||||
[Known limitations, performance data, security — only when relevant]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## What to Include
|
||||
|
||||
- Mermaid diagrams for architecture and flow (GitHub renders natively)
|
||||
- `graph` for component relationships
|
||||
- `sequenceDiagram` for request/response flows
|
||||
- `flowchart` for data processing steps
|
||||
- API endpoint tables
|
||||
- Request/response JSON examples (for interfaces)
|
||||
- Performance data (only measured numbers, no estimates)
|
||||
|
||||
## What to Skip
|
||||
|
||||
- Code snippets — let readers search the codebase
|
||||
- Verbose prose — use diagrams and tables
|
||||
- Implementation details — link file paths instead of pasting code
|
||||
@ -1,98 +0,0 @@
|
||||
---
|
||||
name: memory
|
||||
description: This skill should be used when the user asks to "record memory", "save to memory", "remember this", "create a memory", "add to memory", or discusses documenting technical decisions, architectural choices, or important case studies for the project. Use this skill to record project knowledge to the .claude/memory/ directory.
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# Memory Skill
|
||||
|
||||
## Overview
|
||||
|
||||
Record project-related technical decisions, important case studies, and lessons learned to the project memory directory, ensuring critical knowledge is managed with the code repository.
|
||||
|
||||
## When This Skill Activates
|
||||
|
||||
Activate this skill when user requests involve:
|
||||
- "Record to memory", "save to memory", "add to memory"
|
||||
- "Remember this", "create a memory"
|
||||
- Documenting technical decisions, architectural choices
|
||||
- Recording problem solutions and lessons learned
|
||||
- Discussing API design, performance optimization, security implementations
|
||||
|
||||
## Memory Location
|
||||
|
||||
Project memory is stored in: `.claude/memory/`
|
||||
|
||||
## Memory Structure
|
||||
|
||||
```
|
||||
.claude/
|
||||
├── memory/
|
||||
│ ├── MEMORY.md # Main index file
|
||||
│ └── <topic>.md # Detailed records for specific topics
|
||||
└── skills/
|
||||
└── memory/
|
||||
└── SKILL.md # This file
|
||||
```
|
||||
|
||||
## What to Record
|
||||
|
||||
### ✅ Should Record
|
||||
|
||||
- Important architectural decisions and rationale
|
||||
- Solutions to complex problems
|
||||
- Key considerations for API design
|
||||
- Performance optimization experiences
|
||||
- Security-related implementation details
|
||||
- Integration approaches with other systems
|
||||
- Common errors and solutions
|
||||
- Design changes based on user feedback
|
||||
|
||||
### ❌ Should Not Record
|
||||
|
||||
- Temporary debugging information
|
||||
- Session-specific state
|
||||
- Obvious code implementation details (code is documentation)
|
||||
- Content already documented elsewhere
|
||||
|
||||
## Memory Template
|
||||
|
||||
```markdown
|
||||
# <Topic Title>
|
||||
|
||||
## Background
|
||||
<Why this record exists>
|
||||
|
||||
## Decision/Implementation
|
||||
<What was done or how it was implemented>
|
||||
|
||||
## Rationale
|
||||
<Why this approach was chosen, what alternatives were considered>
|
||||
|
||||
## Related Files
|
||||
<Code files involved, use file_path:line_number format>
|
||||
|
||||
## Examples
|
||||
<If there are code examples or other examples>
|
||||
```
|
||||
|
||||
## Recording Process
|
||||
|
||||
1. **Identify content to record**
|
||||
2. **Determine topic title** (concise, descriptive)
|
||||
3. **Create record using template**
|
||||
4. **Update MEMORY.md index**
|
||||
5. **Save to .claude/memory/<topic>.md**
|
||||
|
||||
## Examples
|
||||
|
||||
- `web-wireshark-jwt-token-flow.md` - JWT token flow in Web Wireshark integration
|
||||
- `docker-api-version-detection.md` - Docker API version dynamic detection implementation
|
||||
|
||||
## Best Practices
|
||||
|
||||
- Use clear, descriptive filenames
|
||||
- Include references to related code files (with line numbers)
|
||||
- Document "why" not just "what"
|
||||
- Keep records updated, remove outdated ones
|
||||
- Link to related memory files
|
||||
40
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
40
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
@ -0,0 +1,40 @@
|
||||
name: Bug report
|
||||
description: Report a bug so we can fix it.
|
||||
title: "[Bug]: "
|
||||
labels: ["bug"]
|
||||
body:
|
||||
- type: textarea
|
||||
id: what-happened
|
||||
attributes:
|
||||
label: What happened?
|
||||
description: A clear description of the bug.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: reproduce
|
||||
attributes:
|
||||
label: Steps to reproduce
|
||||
description: How can we reproduce this? Numbered steps if possible.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: expected
|
||||
attributes:
|
||||
label: Expected behavior
|
||||
description: What did you expect to happen instead?
|
||||
- type: input
|
||||
id: version
|
||||
attributes:
|
||||
label: Version / commit
|
||||
description: Which version or commit hash are you on?
|
||||
- type: textarea
|
||||
id: environment
|
||||
attributes:
|
||||
label: Environment
|
||||
description: OS, runtime version, anything else that might be relevant.
|
||||
- type: textarea
|
||||
id: logs
|
||||
attributes:
|
||||
label: Relevant logs
|
||||
description: Paste any relevant log output. This is automatically rendered as code.
|
||||
render: shell
|
||||
11
.github/workflows/docker-build.yml
vendored
11
.github/workflows/docker-build.yml
vendored
@ -28,6 +28,13 @@ jobs:
|
||||
echo "stable=false" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Set lowercase image name vars
|
||||
if: steps.ver.outputs.stable == 'true'
|
||||
id: names
|
||||
run: |
|
||||
echo "owner=$(echo '${{ github.repository_owner }}' | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_OUTPUT"
|
||||
echo "repo=$(echo '${{ github.event.repository.name }}' | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
if: steps.ver.outputs.stable == 'true'
|
||||
uses: docker/setup-buildx-action@v3
|
||||
@ -57,5 +64,5 @@ jobs:
|
||||
tags: |
|
||||
${{ env.DOCKERHUB_ORG }}/${{ github.event.repository.name }}:${{ steps.ver.outputs.tag }}
|
||||
${{ env.DOCKERHUB_ORG }}/${{ github.event.repository.name }}:latest
|
||||
ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ steps.ver.outputs.tag }}
|
||||
ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:latest
|
||||
ghcr.io/${{ steps.names.outputs.owner }}/${{ steps.names.outputs.repo }}:${{ steps.ver.outputs.tag }}
|
||||
ghcr.io/${{ steps.names.outputs.owner }}/${{ steps.names.outputs.repo }}:latest
|
||||
|
||||
@ -18,7 +18,7 @@ jobs:
|
||||
ref: "gh-pages"
|
||||
- uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: 3.12
|
||||
python-version: 3.8
|
||||
- name: Merge changes from 3.0 branch
|
||||
run: |
|
||||
git config user.name github-actions
|
||||
|
||||
12
.github/workflows/testing.yml
vendored
12
.github/workflows/testing.yml
vendored
@ -4,11 +4,11 @@ on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- 3.1
|
||||
- 2.2
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- 3.1
|
||||
- 2.2
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@ -18,7 +18,7 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
os: ["ubuntu-latest"]
|
||||
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
|
||||
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
@ -26,12 +26,10 @@ jobs:
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
- name: Display Python version
|
||||
run: python -c "import sys; print(sys.version)"
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install .[ai-features,dev]
|
||||
python -m pip install -r dev-requirements.txt
|
||||
|
||||
- name: Install Windows specific dependencies
|
||||
if: runner.os == 'Windows'
|
||||
@ -48,4 +46,4 @@ jobs:
|
||||
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
|
||||
- name: Test with pytest
|
||||
run: |
|
||||
python -m pytest -vv
|
||||
pytest -vv
|
||||
|
||||
25
.gitignore
vendored
25
.gitignore
vendored
@ -5,12 +5,6 @@ __pycache__
|
||||
#py.test
|
||||
.cache
|
||||
|
||||
# environment file
|
||||
.env
|
||||
|
||||
# hypothesis files
|
||||
.hypothesis
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
@ -65,23 +59,4 @@ startup.vpcs
|
||||
# Virtualenv
|
||||
env
|
||||
venv
|
||||
*venv
|
||||
.ropeproject
|
||||
|
||||
# Claude Code settings (may contain API keys)
|
||||
.claude/settings*.json
|
||||
.claude/minmax-settings.json
|
||||
.claude/zhipu-settings.json
|
||||
.claude/settings.local.json
|
||||
.claude/deepseek-settings.json
|
||||
.claude/claude-settings.json
|
||||
.claude/gemini-settings.json
|
||||
.claude/grok-settings.json
|
||||
!.claude/development.md # Exception: allow development docs
|
||||
!.claude/skills/ # Exception: allow project skills
|
||||
!.claude/memory/ # Exception: allow project memory
|
||||
# PROJECT_CONTEXT.md # Commented out: allow tracking project context
|
||||
|
||||
# Tiktoken cache files
|
||||
gns3server/agent/gns3_copilot/cache/tiktoken/
|
||||
|
||||
|
||||
41
.whitesource
41
.whitesource
@ -2,44 +2,13 @@
|
||||
"scanSettings": {
|
||||
"configMode": "AUTO",
|
||||
"configExternalURL": "",
|
||||
"projectToken": "",
|
||||
"baseBranches": []
|
||||
},
|
||||
"scanSettingsSAST": {
|
||||
"enableScan": false,
|
||||
"scanPullRequests": false,
|
||||
"incrementalScan": true,
|
||||
"baseBranches": [],
|
||||
"snippetSize": 10
|
||||
"projectToken" : "",
|
||||
"baseBranches": ["master", "2.2", "3.0"]
|
||||
},
|
||||
"checkRunSettings": {
|
||||
"vulnerableCheckRunConclusionLevel": "failure",
|
||||
"displayMode": "diff",
|
||||
"useMendCheckNames": true
|
||||
},
|
||||
"checkRunSettingsSAST": {
|
||||
"checkRunConclusionLevel": "failure",
|
||||
"severityThreshold": "high"
|
||||
"vulnerableCheckRunConclusionLevel": "failure"
|
||||
},
|
||||
"issueSettings": {
|
||||
"minSeverityLevel": "LOW",
|
||||
"issueType": "DEPENDENCY"
|
||||
},
|
||||
"issueSettingsSAST": {
|
||||
"minSeverityLevel": "high",
|
||||
"issueType": "repo"
|
||||
},
|
||||
"remediateSettings": {
|
||||
"workflowRules": {
|
||||
"enabled": true
|
||||
}
|
||||
},
|
||||
"imageSettings":{
|
||||
"imageTracing":{
|
||||
"enableImageTracingPR": false,
|
||||
"addRepositoryCoordinate": false,
|
||||
"addDockerfilePath": false,
|
||||
"addMendIdentifier": false
|
||||
}
|
||||
}
|
||||
"minSeverityLevel": "LOW"
|
||||
}
|
||||
}
|
||||
789
CHANGELOG
789
CHANGELOG
@ -1,301 +1,27 @@
|
||||
# Change Log
|
||||
|
||||
## 3.1.0a4 09/07/2026
|
||||
## 2.2.61 30/07/2026
|
||||
|
||||
* Bundle web-ui v3.1.0a4
|
||||
* Add jwt_refresh_token_expire_minutes to sample configuration
|
||||
* Remove deleted web-ui files from git
|
||||
* .dockerignore ignore .dockerignore
|
||||
* typo made me reconsider and move out to env
|
||||
* defaulted DOCKERHUB_ORG repository variable
|
||||
* Remove API docs from 2.2 after merging
|
||||
* Update GitHub Actions workflows
|
||||
* Fix web-wireshark docker build broken by xpra 6.5 release
|
||||
* Update CI to install [ai-features,dev] instead of [ai-copilot,dev]
|
||||
* Make AI features (AI Copilot + MCP) optional via [ai-features] extra
|
||||
* Add refresh token mechanism documentation under docs/features/
|
||||
* Add /refresh to allowed public endpoints list in route auth test
|
||||
* Add stateless JWT refresh token mechanism
|
||||
* Add project/node/link handler tests: 39 total, covering list/get/create/delete/start/stop/suspend/reload/console/update/fields
|
||||
* Add MCP tool parameter consistency tests
|
||||
* Fix appliance_install: add version parameter
|
||||
* Add coordinate system note to docs
|
||||
* Document canvas coordinate system in node_create x/y params
|
||||
* Update docstring: batch concurrency from 10 to 100
|
||||
* Remove unused import time
|
||||
* Add list type check before nodes[0] access in _normalize_link_nodes
|
||||
* Add fields type validation in create handlers
|
||||
* Use pop() instead of pop(0) for O(1) port removal
|
||||
* Fix review issues: key_prefix length, count validation, WAL log, timeout comment, pointless temp var
|
||||
* Fix: pass name from TemplateUsage to add_node_from_template
|
||||
* Remove unused imports (logging, log, select)
|
||||
* Add warning for unconsumed pre-allocated UDP ports after link creation
|
||||
* Remove FIXME comment about middleware in server.py
|
||||
* Rename device_command_run_handler → device_show_run_handler to match tool name
|
||||
* Rename device_command_run → device_show_run for clarity
|
||||
* Fix device_command_run KeyError('commands'): tool desc said show_commands but backend expects commands
|
||||
* Fix template_list return type annotation to match _run_handler_sync envelope
|
||||
* Add performance optimization documentation
|
||||
* Update MCP service docs: API key format, auth flow, tool parameters, concurrency
|
||||
* Increase HTTP connection pool to 500/1000
|
||||
* Increase BATCH_MAX_WORKERS and Pool concurrency from 20 to 100
|
||||
* Remove final timing artifact in projects.py
|
||||
* Remove remaining dead timing variables and imports
|
||||
* Remove database warmup (proven ineffective - real bottleneck was bcrypt blocking event loop)
|
||||
* Clean up all timing/debug logs
|
||||
* Add memory: import validation best practice
|
||||
* Fix: add missing UUID imports
|
||||
* Generate fresh JWT on API key auth instead of returning raw key
|
||||
* Optimize API key auth: O(1) lookup via UUID-embedded key format
|
||||
* Fix: offload bcrypt.checkpw to thread pool to prevent blocking event loop
|
||||
* Add timing to API key auth path and log api_keys count
|
||||
* Replace SELECT 1 warmup with full database file read to warm OS page cache
|
||||
* Add timing logs to auth dependency chain to identify 6s pre-handler delay
|
||||
* Add granular timing to get_template: separate execute vs fetch time
|
||||
* Warm up database connection pool on startup to avoid 8s cold-start penalty on first API request
|
||||
* Fix: register WAL PRAGMA on sync_engine instead of Engine class for async compat
|
||||
* Add timing logs to get_template to identify DB query bottleneck
|
||||
* Add timing middleware to log slow requests (>1s) with [CTRL-TIMING] prefix
|
||||
* Fix: _time → time in compute.py timing log
|
||||
* Add [CTRL-TIMING] logs to controller create_node flow
|
||||
* Fix: pass template_id to batch mode handler so top-level template_id works as default
|
||||
* Add detailed timing logs to MCP node creation and HTTP client
|
||||
* Add fields filter to template_list tool with description for AI
|
||||
* Fix: add missing _filter_link_response function
|
||||
* Pass name parameter through to controller API when creating node from template
|
||||
* Add validation to compact link format with clear error messages
|
||||
* Add compact array format for link node entries to reduce token usage
|
||||
* Add fields filter to link_create tool
|
||||
* Reduce md5sum cache write failure log level from error to warning
|
||||
* Add fields filter to node_create tool description for AI
|
||||
* Optimize MCP create_node: support inherited template_id and default fields filter
|
||||
* Increase MCP HTTP client timeout from 10s to 30s
|
||||
* Enable SQLite WAL mode to fix 'database is locked' errors under concurrent API requests
|
||||
* Cache IOU image default values per image path to avoid redundant subprocess calls
|
||||
* Increase node and link creation concurrency from 5 to 20
|
||||
* Fix: revert IOU lock optimization, serialize IOU node creation for correct application_id assignment
|
||||
* Performance: accelerate project opening with parallel link creation and batch UDP port allocation
|
||||
* feat: Add batch link_ids to link_delete/link_reset, fields filter to link_list
|
||||
* feat: Add fields filter to link_list
|
||||
* feat: Add batch node_ids to node_delete
|
||||
* fix: Convert http to ws scheme in node_console WebSocket URL
|
||||
* feat: Add batch link_ids to link_capture_download
|
||||
* feat: Add batch link_ids to link_capture_start/stop
|
||||
* fix: Store username in gns3_ctx during auth, use for short-lived download JWTs
|
||||
* fix: Generate independent short-lived JWT for pcap download
|
||||
* revert: Remove _configs_map changes in tools_v2 (handled by template renderer now)
|
||||
* fix: Merge commands for duplicate device_names in _configs_map
|
||||
* fix: Actually pass template param to device_config/command handlers
|
||||
* fix: Correct Jinja2 template commands_field per tool type
|
||||
* feat: Jinja2 template support in device_command_run
|
||||
* feat: Jinja2 template support in device_config_send
|
||||
* feat: Add batch node_ids support to node_start/stop/reload/suspend
|
||||
* feat: Add fields filter to appliance_list
|
||||
* feat: Add fields filter to node_list
|
||||
* feat: node_get fields filter — match controller Node schema fields
|
||||
* fix: Set auto_close=False on project_create so projects stay open when clients disconnect
|
||||
* feat: Add batch mode to node_create and link_create (parallel, max 10 workers)
|
||||
* fix: Pass API key directly instead of generating short-lived JWT
|
||||
* feat: API key lifecycle — revoke/restore/delete
|
||||
* fix: Rename revoke_api_key → delete_api_key
|
||||
* fix: Hard-delete API keys instead of soft delete (revoked flag)
|
||||
* feat: Support API keys in REST API authentication (reuse gns3_ prefix keys)
|
||||
* fix: Lazily access db engine for API key validation
|
||||
* fix: Add missing updated_at column to api_keys table
|
||||
* fix: Export ApiKeyCreate from schemas package
|
||||
* feat: Add API Key support for MCP authentication
|
||||
* fix: Validate JWT token exp claim — was silently ignored after migration to joserfc
|
||||
* fix: Add image field to template_create, document type-specific params in description
|
||||
* fix: Remove .json() calls on 204 responses for prune/install images
|
||||
* fix: Skip always-running nodes in start_all/stop_all
|
||||
* fix: Add missing rotation parameter to drawing_update MCP tool
|
||||
* fix: Map MCP device_command_run parameter to tool's expected field name
|
||||
* fix: Update link_reset description to match actual behavior (delete + recreate)
|
||||
* fix: Remove unsupported description param from project_create
|
||||
* fix: Fix symbol_get/upload/delete handlers for correct API paths
|
||||
* feat: Log registered MCP tools at startup
|
||||
* fix: Type compute_id as uuid.UUID to reject non-UUID values at MCP input layer
|
||||
* fix: Require UUID for compute_get/images, remove 'local' string default
|
||||
* feat: Add device configuration MCP tools (config_send, command_run, vpcs_config_set)
|
||||
* refactor: unify MCP tool naming to <module>_<action> convention
|
||||
* feat: Add symbol upload/delete, project load, and locked check MCP tools
|
||||
* feat: Add image management MCP tools
|
||||
* feat: Add symbol and appliance MCP tools
|
||||
* feat: Add node bulk ops, project lock, and server info MCP tools
|
||||
* feat: Add snapshot and drawing MCP tools
|
||||
* refactor: unify MCP handlers to use http_call directly, relocate node file ops to Node class
|
||||
* feat: Add node file operations as MCP tools (list, get, write, delete)
|
||||
* Add comment about rootful Docker permissions at container start
|
||||
* Fix _fix_permissions test: set process.returncode=0 and update assertion
|
||||
* Fix list_node_files PermissionError on os.scandir
|
||||
* Fix _fix_permissions error handling and list_node_files PermissionError
|
||||
* Add async_iterable_to_stream utility to avoid aiohttp compatibility issues
|
||||
* Add descriptive detail to 403 errors in compute file endpoints
|
||||
* Fix silent file write failure in write_compute_project_file
|
||||
* feat: Node file streaming, recursive listing, file type detection, and file delete
|
||||
* Update README tool descriptions: .txt → .md
|
||||
* Update README tool descriptions to mention Markdown format
|
||||
* Add MCP project tools: update, duplicate, and README operations
|
||||
* Sync appliances
|
||||
* fix(import): unvalidated symlink creation in import_project
|
||||
* fix(qemu): fix addition of QEMU RNG device causes interface names to change
|
||||
* fix(qemu): remove trailing space from RNG object argument
|
||||
* fix: do not start nodes when deleting a project
|
||||
* fix: correct always-true state check in DockerVM.stop()
|
||||
|
||||
## 3.1.0a3 06/06/2026
|
||||
## 2.2.60 15/07/2026
|
||||
|
||||
* Bundle web-ui v3.1.0a3
|
||||
* fix: update MCP link tools descriptions with detailed filter info
|
||||
* fix: correct MCP nodes and links tool parameter handling for nested kwargs
|
||||
* fix: correct MCP template tool parameter handling for nested kwargs
|
||||
* feat: add client information logging to MCP connection rejection
|
||||
* refactor: replace MCP ready state polling with asyncio.Event
|
||||
* fix: revert duplicate image check to fix failing tests
|
||||
* fix (templates): Add ordering to handle the duplicate cases gracefully
|
||||
* fix(templates): Database error detected when saving a template with a disk image change
|
||||
* fix: return 503 error on MCP server ready timeout
|
||||
* fix: add MCP server ready check to prevent initialization errors
|
||||
* fix: resolve MCP server URL host via default route IP when bound to 0.0.0.0
|
||||
* fix: correct MCP transport security config to actually allow all hosts by default
|
||||
* feat: add configurable MCP transport security settings via gns3_server.conf
|
||||
* fix: add load_feature_skills() to properly load network planning features
|
||||
* refactor: convert all MCP tool parameter descriptions to Annotated+Field
|
||||
* fix: remove platformdirs upper bound to resolve fastmcp-slim dependency conflict
|
||||
* fix: add missing fastmcp dependency to resolve CI test failures
|
||||
* refactor: move all imports to top of __init__.py
|
||||
* test: add /v3/mcp/ to allowed public endpoints
|
||||
* fix: remove console_host/port from get_node_console_info
|
||||
* feat: add get_node_console_info tool
|
||||
* feat: add 3 Compute MCP tools - Add list_computes, get_compute, get_compute_images - Total MCP tools: 29
|
||||
* feat: add 5 Template MCP tools
|
||||
* feat: add Node and Link MCP tools, update copyright - Add 9 node tools and 5 link tools - Update copyright year to 2026, add author
|
||||
* feat: complete MCP SSE transport with JWT auth
|
||||
* feat: support Authorization header and query param for MCP token
|
||||
* feat: implement standard MCP protocol with SSE transport
|
||||
* feat: add MCP (Model Context Protocol) service with project tools
|
||||
* Add project memory: Docker container stop delay analysis
|
||||
* Remove extra blank line from merge
|
||||
* Revert container state detection in create()
|
||||
* Fix Docker VM tests for container status detection on node creation
|
||||
* Add running project check for fast duplication
|
||||
* Move running project check before fast duplication
|
||||
* Add running project check for fast duplication
|
||||
* Fix Docker container status detection on node creation
|
||||
* Fix web-ui update script to handle custom GitHub URL changes
|
||||
* Fix unnecessary Docker container recreation when renaming a project
|
||||
* Fix project rename and duplicate issues
|
||||
* Fix double deletion issue in remove_resource_from_pool
|
||||
* Complete fix: delete resource records when deleting resource pool
|
||||
* Apply fix from PR #2315: delete resource from resource table when removing from pool
|
||||
* Remove deprecated 'PermissionsStartOnly' setting for Systemd service. Ref #1830
|
||||
* Optimize project loading by implementing parallel node creation
|
||||
* Fix delay filter validation: ensure delay: [0, X] returns proper error message
|
||||
* Fix packet filter validation tests: use correct ubridge filter type names
|
||||
* Update tests to match show_interface_labels default change
|
||||
* Set default value of show_interface_labels to True
|
||||
* Optimize project variable updates to use parallel node processing
|
||||
* Fix ghost Docker nodes causing 60-second VNC timeout on variable updates
|
||||
* Fix Docker container variable compatibility with Pydantic models
|
||||
* Fix delay latency minimum: ubridge rejects latency <= 0
|
||||
* Improve packet filter validation: use tcpdump, handle multi-line BPF, safe project load
|
||||
* Add packet filter parameter validation to prevent ubridge errors
|
||||
* chore: update GNS3 skills repository to official organization
|
||||
* docs: update RBAC user isolation design doc to match actual implementation
|
||||
* docs: update skills repo URL in command-security.md
|
||||
* docs: remove Chinese overview docs, keep only English versions
|
||||
* docs: add overview docs for packet analysis, fault injection, and AI assistant
|
||||
* feat: add mermaid-to-SVG conversion script with environment setup
|
||||
* test: fix privilege count assertions after adding LLMConfig privileges
|
||||
* docs: add user node limit roadmap
|
||||
* test: fix RBAC test to match implementation logic
|
||||
* test: add --prefix and --cleanup-only parameters to benchmark script
|
||||
* perf: batch RBAC permission checking for GET /projects
|
||||
* test: add benchmark script for GET /projects performance testing
|
||||
* fix: prevent duplicate projects when user projects are in resource pools
|
||||
* fix: check both regular ACEs and resource pool ACEs for proper access control
|
||||
* test: update RBAC test to use test_user.username for user isolation
|
||||
* docs: add Phase 9 and 10 user self-registration and email service
|
||||
* docs: add Phase 8 per-user project namespace to roadmap
|
||||
* docs: add Phase 7 resource pool renaming to roadmap
|
||||
* feat: add alembic migration for LLMConfig privileges
|
||||
* feat: add independent LLMConfig permissions for AI profile management
|
||||
* docs: add Phase 6 frontend permission query API to roadmap
|
||||
* docs: add Phase 5 ACE architecture refactoring plan to roadmap
|
||||
* feat: remove resource pools from 'all endpoints' list
|
||||
* refactor: add efficient get_aces_for_path method for resource pool checks
|
||||
* feat: prevent deletion of resource pools used by ACE configurations
|
||||
* docs: update RBAC user isolation roadmap and add design memory
|
||||
* feat: fix permission check logic to properly handle ACE and user isolation
|
||||
* feat: implement layered permission checks for proper user isolation and sharing
|
||||
* feat: implement simple user isolation based on project ownership
|
||||
* fix: clean BPF syntax error message and specify loopback interface
|
||||
* feat: add BPF syntax validation using tshark
|
||||
* feat: add show_filters_icon parameter to packet filter tool
|
||||
* docs: add GNS3 appliance loading mechanism to memory
|
||||
* feat: add packet filter management tool for GNS3-Copilot fault injection
|
||||
* fix: update test_json expected output to include show_filters_icon field
|
||||
* fix: add getattr fallback to show_filters_icon property for backward compatibility
|
||||
* feat: add show_filters_icon property to Link for controlling Web UI filter icon display
|
||||
* fix: ensure show_filters_icon is always returned in API responses
|
||||
* feat: add show_filters_icon property to Link for controlling Web UI filter icon display
|
||||
* fix: remove explicit paramiko pin to resolve dependency conflict with netmiko
|
||||
* fix: update netmiko to 4.7.0 and pin paramiko>=5.0.0 to fix CVE-2026-44405
|
||||
* fix: close DockerHTTPClient session to prevent UnixConnector leak in Web Wireshark
|
||||
|
||||
|
||||
## 3.1.0a2 12/05/2026
|
||||
|
||||
* Bundle web-ui v3.1.0a2
|
||||
* fix: surface tshark stderr errors to LLM, not just log them
|
||||
* fix: hint LLM about -c behavior when tshark returns empty with -c
|
||||
* fix: update search_fields examples to use existing field names
|
||||
* fix: reject multi-keyword search_fields, single keyword only
|
||||
* fix: document action/query params in PacketAnalysisTool description
|
||||
* feat: add search_fields action to PacketAnalysisTool for real-time field lookup
|
||||
* feat: validate tshark -e field names before running analysis
|
||||
* fix: document -c behavior caveat in PacketAnalysisTool description
|
||||
* fix: demote loader-level load logs to DEBUG, info already reported by manager
|
||||
* fix: promote skills/prompts load logs to INFO level
|
||||
* fix: load packet analysis protocols during skills initialization
|
||||
* feat: add PacketAnalysisSkillsTool
|
||||
* fix: remove remaining quoted example from tool input docstring
|
||||
* fix: use shlex.split for tshark_args parsing
|
||||
* feat: add packet analysis workflow to tool description
|
||||
* refactor: remove old PacketCaptureTool, replaced by PacketAnalysisTool
|
||||
* feat: add protocol-oriented packet analysis tool
|
||||
* docs: add roadmap docs for planned features
|
||||
* feat: require superadmin for /reload/skills endpoint
|
||||
* fix: remove background init timeout and allow skills reload retry
|
||||
* deps: add PyYAML and GitPython to ai-requirements.txt
|
||||
* feat: add fault injection system and external skills repository
|
||||
* fix: Disable DeepSeek thinking mode to avoid reasoning_content errors
|
||||
* fix: Skip offline compute nodes during project import
|
||||
* fix: Import status module in project.py
|
||||
* fix: Handle connection errors when stopping node console
|
||||
* refactor: Remove MD5 calculation from node files listing
|
||||
* fix: Export NodeFile schema to schemas module
|
||||
* feat: Add detailed metadata to node files listing
|
||||
* feat: Add API endpoint to list node files
|
||||
* Fix snapshot restore does not work after export/import of project
|
||||
* Warn to use 64-bit IOU images. Fixes #2716 32-bit IOU image support has been removed from the GNS3 VM.
|
||||
* Fix: Improve Docker container deletion error logging
|
||||
* Fix: Add exponential backoff to compute reconnection attempts
|
||||
* Fix: Check compute connectivity before node creation in open()
|
||||
* Sync appliances
|
||||
* 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
|
||||
* 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
|
||||
* Fix: Check compute connectivity before open() during project deletion
|
||||
* Fix: Add error logging when closing/deleting projects on computes
|
||||
* Fix: Skip add_compute for existing computes when opening projects
|
||||
* feat: add AI provider config files to .gitignore
|
||||
* Fix: Use _computes instead of _project_created_on_compute for deletion check
|
||||
* Fix: Check compute connection status before project deletion
|
||||
* fix: extend remote compute image path conversion to all node types
|
||||
* fix: send relative image path to remote compute nodes
|
||||
* fix: handle directory access for static web-ui routes
|
||||
* fix: add duplicate name validation when updating templates
|
||||
* fix: avoid AttributeError when password is not provided in compute update
|
||||
* fix: improve hostname validation error messages with allowed characters
|
||||
* feat(compute): Fix Dynamips to listen on the internal port when ssh is used for auxiliary console
|
||||
* feat(compute): Fix ambiguous log message related to the active console transport.
|
||||
* feat(compute): Updated server host key to use the secure ssh-ed25519 instead of old ssh-rsa algorithm
|
||||
* feat(compute): Fix missing SSH wrapping for auxiliary console
|
||||
* feat(compute): Added AsyncioSSHServer dedicated tests
|
||||
* feat(compute): add SSH console type support
|
||||
* fix: include error details in LLM model config failure response
|
||||
* Fix telnet console silent-proxy hang on non-ConnectionError exit (#2344)
|
||||
* API endpoints to manage base configuration files for templates
|
||||
|
||||
## 2.2.59 08/05/2026
|
||||
|
||||
@ -304,94 +30,6 @@
|
||||
* Warn to use 64-bit IOU images. Fixes #2716 32-bit IOU image support has been removed from the GNS3 VM.
|
||||
* Fix telnet console silent-proxy hang on non-ConnectionError exit (#2344)
|
||||
|
||||
## 3.1.0a1 25/04/2026
|
||||
|
||||
* New completely revamped Web interface.
|
||||
* Add GNS3 Copilot AI agent back-end
|
||||
* Web-wireshark: packet capture and live traffic analysis in the browser
|
||||
* Fix using SSL with remote computes. Fixes https://github.com/GNS3/gns3-gui/issues/3733
|
||||
* Add --url and --branch parameters to update-bundled-web-ui.sh
|
||||
* Fix bug when custom_adapters is None in port_factory.py
|
||||
* Have optional body in start node API endpoint
|
||||
* Fix snapshots after merging
|
||||
* Potential fix for pull request finding 'CodeQL / Information exposure through an exception'
|
||||
* Refactored the way snapshots are handled in the server
|
||||
* fix(symbols): add authentication to symbol raw endpoint
|
||||
* fix(symbols): add CORS headers to symbol file responses
|
||||
* Allow to find new project in sub dirs
|
||||
* Enhancement: Refresh projects list without restarting the GNS3 server
|
||||
* Fix accessing username in authentication.py
|
||||
* Improved exception handling and telnet client disconnect
|
||||
* Use get method for registry_version to avoid KeyError
|
||||
* Add support for appliance format version 8
|
||||
* Convert database template fields from PickleType to JSON
|
||||
* feat(statistics): distinguish open vs closed project nodes
|
||||
* fix(statistics): handle closed projects where nodes/links are dicts
|
||||
* feat(controller): extend /statistics API with project, node and link stats
|
||||
* Use FastAPI Lifespan Events
|
||||
* feat(link): add control_offset field to LinkStyle
|
||||
* feat(symbols): add DELETE API for removing custom symbol files
|
||||
* Enhancement: Re-write current Telnet server implementation using telnetlib3 library
|
||||
* feat: improve error handling for API configuration errors
|
||||
* Enhancement Added link type support on the server side
|
||||
* Ignore HTTPException received when closing a project
|
||||
* Prevent router to be duplicated when running and add tests
|
||||
* Fixed issue #1605 regarding Cisco slots causing configs to break
|
||||
* feat: add VNC WebSocket console support for Docker and QEMU nodes
|
||||
* Return 405 error for unsupported actions for other node types
|
||||
* feat(telnet_server): improve error handling and connection management
|
||||
* fix(telnet): handle connection race condition during broadcast
|
||||
* Change first() to one_or_none() for image query
|
||||
* Fix for duplicating Qemu nodes
|
||||
* Minor optimizations to logic
|
||||
* Fixed an issue with the server causing errors when uploading large images + Preparation for a smarter check when uploading images
|
||||
* Implemented a smarter node_type system
|
||||
* docs: restructure copilot docs and update node tools
|
||||
* fix(acl): correct endpoint paths for users, groups, and roles
|
||||
* fix(iou): return 405 error for unsupported suspend operation
|
||||
* feat(api): enhance max_tokens field with robust null handling
|
||||
* feat(docs): add AI prompting guide for configuration templates
|
||||
* Deactivate 'use default IOU values' by default and update RAM/NVRAM values
|
||||
* Make sure the node shows as stopped when the wrap console cannot be stopped. Ref https://github.com/GNS3/gns3-registry/pull/1010
|
||||
* chore: update author name and copyright headers
|
||||
* feat(docs): enhance AI chat API documentation with examples and details
|
||||
* feat: add .claude directory to gitignore for API key security
|
||||
* Revert "Fix QEMU serial console artifacts by filtering ANSI CPR responses in …"
|
||||
* docs: add troubleshooting guide for datetime timezone issue
|
||||
* Drop support for Python 3.9
|
||||
* feat: add multi-user concurrency control design document
|
||||
* docs: add troubleshooting guide for force kill residual processes
|
||||
* Fixed the path traversal check
|
||||
* Fix image handling
|
||||
* Qemu VMs: only compute MD5 checksums for existing disks
|
||||
* Copy config files and database from a previous version if it exists
|
||||
* Add enable_http_auth in gns3_server.conf sample
|
||||
* feat(compute): option to disable compute authentication
|
||||
* tests(controller,port): short_name finishes successfully when port name is None
|
||||
* fix(controller,port): handle None port name to prevent TypeError in short_name method
|
||||
* fix(docker): handle container name conflict automatically
|
||||
* feat(virtualbox): add fallback for VBoxManage executable detection
|
||||
* feat: simplify port name assignment logic
|
||||
* feat(ports): add null checks for port name in short name generation
|
||||
* Remove unneeded rbac_repo in get_templates
|
||||
* Use lists for tags instead of dicts
|
||||
* Fix for resizing Qemu VM disks
|
||||
* feat(templates): safely access settings dict keys
|
||||
* feat(api): fix ETag handling and JSON serialization in template endpoint
|
||||
* feat(api): add tag filtering to nodes and templates endpoints
|
||||
* Update project schema and fix tests
|
||||
* Add 'created_by' field to track project creator
|
||||
* Fix updating packet filters
|
||||
* Add vendor, model and netmiko_device_type fields to templates
|
||||
* fix: handle RuntimeError in notification_manager emit()
|
||||
* fix: busybox static link detection on Alpine/musl
|
||||
* Fix bug when updating compute password to be empty
|
||||
* Cancel tasks if controller cannot be started
|
||||
* Enable parallel compression with zstandard. Fixes #2324
|
||||
* Add Dynamips to Dockerfile dependencies
|
||||
* Take populated disks into consideration when calculating PCI device ID
|
||||
* Fix telnet keepalive options on macOS
|
||||
|
||||
## 2.2.58.1 12/04/2026
|
||||
|
||||
* Sync appliances
|
||||
@ -418,17 +56,6 @@
|
||||
* Upgrade dependencies
|
||||
* Drop Python 3.8 support
|
||||
|
||||
## 3.0.6 28/01/2026
|
||||
|
||||
* Sync appliances
|
||||
* Fix creating Qemu disk image. Fixes #2542
|
||||
* Disable checking for available disk space. Ref #2548
|
||||
* Set default location of udhcpc in "/etc/network/udhcpc". Fixes #2582
|
||||
* Support for Python 3.14
|
||||
* Fix non-ASCII characters in project names
|
||||
* Increase DB engine pool size and max overflow
|
||||
* Enable ip cef in IOU L2 and IOU L3 base configs
|
||||
|
||||
## 2.2.56 21/01/2026
|
||||
|
||||
* Set default location of udhcpc in "/etc/network/udhcpc". Fixes #2582
|
||||
@ -447,31 +74,6 @@
|
||||
* Add missing 'nat' template type in schema. Fixes #2529
|
||||
* Resolve deprecation warnings of regex library
|
||||
|
||||
## 3.0.5 14/05/2025
|
||||
|
||||
* Bundle web-ui v3.0.5
|
||||
* Sync appliances
|
||||
* Use Ubuntu 24.04 LTS in Dockerfile. Ref #2523
|
||||
* Fix tests and require Qemu version >= 2.4
|
||||
* Fix adding pci_bridges to qemu vms
|
||||
* Resolve deprecation warnings of regex library
|
||||
* Remove OVMF_CODE_4M.secboot.fd and associated code
|
||||
* Add edk2-stable202502 UEFI firmwares and try to first use firmwares from the ovmf package if installed. Fixes #2494
|
||||
* Prettify TPM error message
|
||||
* Fix bug in qemu_stdout message
|
||||
* Try to detect swtpm and AppArmor issue. Ref https://github.com/GNS3/gns3-gui/issues/3725
|
||||
* Fix Docker logs decoding. Ref #2522
|
||||
* Add delay after starting a Docker container and adding connections in uBridge. Ref #2522
|
||||
* Fix TypeError when reading Docker container logs. Ref #2522
|
||||
* Allow an image to be uploaded to the controller again even if it is already in the database
|
||||
* Fix controller not reporting an error if invalid options are passed to Qemu command line. Fixes #2517
|
||||
* Replace "Docker hub" by "Docker repository" because it is possible to use different repositories
|
||||
* Fix unable to add NAT cloud after configuring “allowed_interfaces” in configuration file. Fixes #2508
|
||||
* Fix interface information API endpoint for Cloud/NAT devices
|
||||
* Upgrade Jinja2 to v3.1.6. Fixes #2515
|
||||
* Fix packet capture for links connected to a cloud node. Fixes #2513
|
||||
* fix: check if remote-install.sh is being run as root
|
||||
|
||||
## 2.2.54 21/04/2025
|
||||
|
||||
* Bundle web-ui v2.2.54
|
||||
@ -486,24 +88,6 @@
|
||||
* Improvements for remote-install.sh
|
||||
|
||||
|
||||
## 3.0.4 25/02/2025
|
||||
|
||||
* Require minimum 8 characters for passwords
|
||||
* Bundle web-ui v3.0.4
|
||||
* Upgrade dependencies
|
||||
* Fix auto idle-pc for IOS templates
|
||||
* Update schemas to add constraints for values like ram, nvram etc.
|
||||
* Install custom symbols. Fixes #2492
|
||||
* Fix VMware add ubridge connection. Fixes #2490
|
||||
|
||||
## 3.0.3 22/01/2025
|
||||
|
||||
* Bundle web-ui v3.0.3
|
||||
* Refactor command line arguments parsing
|
||||
* Fix capture on IOU/IOL links. Fixes #2477
|
||||
* Use Python 3.9 to publish API documentation
|
||||
* Upgrade dependencies
|
||||
|
||||
## 2.2.53 21/01/2025
|
||||
|
||||
* Bundle web-ui v2.2.53
|
||||
@ -514,33 +98,6 @@
|
||||
* Update remote-install.sh to support a custom repository and the deb822 source format
|
||||
* Fix: do not use the iourc file if IOU licence check is not enabled
|
||||
|
||||
## 3.0.2 03/01/2025
|
||||
|
||||
* Bundle web-ui v3.0.2
|
||||
* Support to create templates based on image checksums.
|
||||
* Improvements for installing built-in disks.
|
||||
* Use watchdog instead of watchfiles to monitor for new images on the file system
|
||||
* Drop Python 3.8
|
||||
* Replace python-jose library by joserfc
|
||||
* Upgrade dependencies
|
||||
* Remove blocking IOU phone home call.
|
||||
|
||||
## 3.0.1 27/12/2024
|
||||
|
||||
* Bundle web-ui v3.0.1
|
||||
* Allow for upgrading built-in disks
|
||||
* Fix config parsing when configuring server protocol. Fixes https://github.com/GNS3/gns3-gui/issues/3681
|
||||
* Update empty Qemu disks with correct MD5 checksums
|
||||
* Increase timeout to run compute HTTP queries. Fixes #3453
|
||||
|
||||
## 3.0.0 20/12/2024
|
||||
|
||||
* Bundle web-ui v3.0.0
|
||||
* Use static favicon for API docs. Ref #3674
|
||||
* Configure self-hosting JavaScript and CSS for docs
|
||||
* Fix project auto open feature. Fixes #2455
|
||||
* Store IOU licence in the secrets directory and disable the check by default
|
||||
* Require "Project.Audit" permission to duplicate a project and check if "Project.Allocate" permission for the destination.
|
||||
|
||||
## 2.2.52 02/12/2024
|
||||
|
||||
@ -550,21 +107,6 @@
|
||||
* Overwrite user resources when the originals have changed.
|
||||
* Relax setuptools requirement to allow for easier Debian packaging on Ubuntu Focal & Jammy
|
||||
|
||||
## 3.0.0rc2 20/11/2024
|
||||
|
||||
* Bundle web-ui v3.0.0rc2
|
||||
* Fix error 500 on PUT for cloud, nat, vmware and vpcs nodes. Fixes #2426
|
||||
* Add a duplicated project in the same resource pools as the original project if it is in any
|
||||
* Upgrade FastAPI to v0.115.5
|
||||
* Overwrite user resources when the originals have changed.
|
||||
* Relax setuptools requirement to allow for easier Debian packaging on Ubuntu Focal & Jammy
|
||||
* Increase SQLite timeout. Ref #2422
|
||||
* Fix test user with wrong creds
|
||||
* Upgrade dependencies and fix Pydantic warnings
|
||||
* Upgrade aiohttp to v3.10.10. Fixes #2411
|
||||
* Replace aiohttp.web.HTTPConflict()
|
||||
* Python 3.13 support
|
||||
|
||||
## 2.2.51 07/11/2024
|
||||
|
||||
* Catch error when cannot resize Docker container TTY.
|
||||
@ -589,12 +131,6 @@
|
||||
* Support for configuring MAC address in Docker containers
|
||||
* Upgrade aiohttp to v3.10.3
|
||||
|
||||
## 3.0.0rc1 11/08/2024
|
||||
|
||||
* Bundle web-ui v3.0.0rc1
|
||||
* Convert topologies < 3.0 to have valid node hostnames
|
||||
* Fix to access resources_path and install_builtin_appliances settings
|
||||
|
||||
## 2.2.49 06/08/2024
|
||||
|
||||
* Bundle web-ui v2.2.49
|
||||
@ -616,17 +152,6 @@
|
||||
* Upgrade sentry-sdk, psutil and aiofiles packages
|
||||
* Fix check for IPv6 enabled on host
|
||||
|
||||
## 3.0.0b3 19/05/2024
|
||||
|
||||
* Bundle web-ui v3.0.0b3
|
||||
* Fix to allow duplicating IOS routers
|
||||
* Fix to allow changing the auxiliary console for IOS router nodes.
|
||||
* Replace deprecated method datetime.utcnow()
|
||||
* Upgrade FastAPI to v0.111.0
|
||||
* Fix reset console for non running IOU devices
|
||||
* Do not allow to create a builtin template using the API.
|
||||
* Use cryptography backend for python-jose. Ref #2372
|
||||
|
||||
## 2.2.47 15/05/2024
|
||||
|
||||
* Fix update-bundled-web-ui.sh script
|
||||
@ -649,19 +174,6 @@
|
||||
* Fix cannot stop Docker VM while console connection is still active.
|
||||
* Upgrade sentry-sdk to version 1.40.6
|
||||
|
||||
## 3.0.0b2 07/04/2024
|
||||
|
||||
* Bundle web-ui v3.0.0b2
|
||||
* Fix cannot stop Docker VM while console connection is still active.
|
||||
* Support for custom Qemu path in templates and nodes
|
||||
* Fix CPU fractional values for Docker VMs.
|
||||
* Use bcrypt directly instead of passlib
|
||||
* Update CORS policy
|
||||
* Do not stop searching for Qemu binaries if one binary cannot be executed. Ref #2306
|
||||
* Fix Ethernet switch and Ethernet hub port validations. Fixes #2334
|
||||
* Update CORS policy
|
||||
|
||||
|
||||
## 2.2.46 26/02/2024
|
||||
|
||||
* Bundle web-ui v2.2.46
|
||||
@ -686,29 +198,6 @@
|
||||
* Add custom executable paths on Windows
|
||||
* Upgrade sentry-sdk and aiohttp
|
||||
|
||||
## 3.0.0b1 27/11/2023
|
||||
|
||||
* Bundle web-ui v3.0.0b1
|
||||
* Upgrade sentry-sdk to v1.37.1
|
||||
* Upgrade aiohttp to v3.9.1
|
||||
* Fix bug when listing endpoints for opened project
|
||||
* Make images executable after importing a project
|
||||
* Disable IOS hostname check for Dynamips ghost instances
|
||||
|
||||
## 3.0.0a6 15/11/2023
|
||||
|
||||
* Bundle web-ui v3.0.0a6
|
||||
* Upgrade to aiohttp v3.9.0rc0
|
||||
* Install Docker resources in writable location
|
||||
* Default compute username is "gns3"
|
||||
* Non-blocking checksums computation when server starts. Fixes #2228
|
||||
* Fix timeout issue when creating Qemu disk image. Fixes https://github.com/GNS3/gns3-server/issues/2313
|
||||
* Fix broken link to Web UI in 3.0 branch. Fixes #2312
|
||||
* Fix sample config: VMware section declared twice. Fixes #2311
|
||||
* Fix ws console and packet capture over SSL
|
||||
* Support for web socket console over HTTPS
|
||||
* Allow disabling hardware virtualization check
|
||||
|
||||
## 2.2.44.1 07/11/2023
|
||||
|
||||
* Catch exceptions when computing image checksums. Ref https://github.com/GNS3/gns3-server/issues/2228
|
||||
@ -728,78 +217,6 @@
|
||||
* Add Python 3.12 support.
|
||||
* Fix issue with importlib.resources.files() and Python 3.9
|
||||
|
||||
## 3.0.0a5 27/10/2023
|
||||
|
||||
* Bundle web-ui v3.0.0a5
|
||||
* Fix L2IOU "failed code signing checks" when IOU base file name is >= 63 characters
|
||||
* Python 3.12 support
|
||||
* Add igb Qemu adapter
|
||||
* Change "ip cef" to "no ip cef" in IOU default configs. Fixes #2298
|
||||
* Drop support for Python 3.7 and upgrade dependencies
|
||||
* Fix compute authentication for websocket endpoints
|
||||
* Add Qemu IGB network device
|
||||
|
||||
## 3.0.0a4 18/10/2023
|
||||
|
||||
* Bundle web-ui v3.0.0a4
|
||||
* Do not enforce Compute.Audit and Template.Audit privileges due to current web-ui limitations
|
||||
* Support to create empty disk images on the controller
|
||||
* Fix issue with importlib.resources.files() and Python 3.9
|
||||
* New RBAC system with resource pools support.
|
||||
* Use controller vars file to store version and appliance etag
|
||||
* Pydantic v2 migration
|
||||
* Allow connection to ws console over IPv6
|
||||
* Allow computes to be dynamically or manually allocated
|
||||
* Add UEFI boot mode option for Qemu VMs
|
||||
* Mark VMware and VirtualBox support as deprecated
|
||||
* Make port name for custom adapters optional. Fixes https://github.com/GNS3/gns3-web-ui/issues/1430
|
||||
* Support for database schema migrations using alembic
|
||||
* Add config option to change the server name. Ref #2149
|
||||
* Option to disable image discovery and do not scan parent directory
|
||||
* Allow raw images by default. Fixes https://github.com/GNS3/gns3-server/issues/2097
|
||||
* Fix bug when creating Dynamips router with chassis setting
|
||||
* Stricter checks to create/update an Ethernet switch and add tests
|
||||
* Fix schema for removing WICs from Cisco routers. Fixes #3392
|
||||
* Fix some issues with HTTP notification streams
|
||||
* API endpoint to get the locked status of a project
|
||||
* Global project lock and unlock
|
||||
* Require name for custom adapters. Fixes #2098
|
||||
* Allow empty adapter slots for Dynamips templates. Ref https://github.com/GNS3/gns3-gui/issues/3373
|
||||
* Custom adapters should not be in node (compute) properties returned to clients. Fixes https://github.com/GNS3/gns3-gui/issues/3366
|
||||
* Optionally allow Qemu raw images
|
||||
* Ignore image detection for IOU user libraries in image directory
|
||||
* Checks for valid hostname on server side for Dynamips, IOU, Qemu and Docker nodes
|
||||
* Only check files (not directories) when looking for new images on file system.
|
||||
* Support user defined loader/libraries to run IOU
|
||||
* Remove explicit Response for VPCS endpoints returning HTTP 204 status code
|
||||
* Remove explicit Response for endpoints returning HTTP 204 status code
|
||||
* Make 'vendor_url' and 'maintainer_email' optional for template validation.
|
||||
* Allow auth token to be passed as a URL param
|
||||
* Add controller endpoints to get VirtualBox VMs, VMware VMs and Docker images
|
||||
* Detect new images added to the default image directory. * Images can be present before the server starts or while it is running * Images are recorded in the database
|
||||
* Support delete Qemu disk image from API Return the real disk image name in the 'hdx_disk_image_backed' property for Qemu VMs
|
||||
* Fix ComputeConflictError import
|
||||
* Handle creating Qemu disk images and resizing
|
||||
* Finish to clean up local setting usage. Ref #1460
|
||||
* "Local" command line parameter is only for stopping a server that has been started by the desktop GUI
|
||||
* Fix AsyncSession handling after breaking changes in FastAPI 0.74.0 See https://github.com/tiangolo/fastapi/releases/tag/0.74.0 for details.
|
||||
* Detect image type instead of requesting it from user
|
||||
* Add connect endpoint for computes Param to connect to compute after creation Report compute unauthorized HTTP errors to client
|
||||
* Replace CORS origins by origin regex
|
||||
* Allow empty compute_id. Ref #1657
|
||||
* Secure controller to compute communication using HTTP basic authentication
|
||||
* Secure websocket endpoints
|
||||
* Allocate compute when compute_id is unset
|
||||
* Return the current controller hostname/IP from any compute
|
||||
* Remove Qemu legacy networking support
|
||||
* Appliance management refactoring: * Install an appliance based on selected version * Each template have unique name and version * Allow to download an appliance file
|
||||
* Add isolate and unisolate endpoints. Ref https://github.com/GNS3/gns3-gui/issues/3190
|
||||
* Allow images to be stored in subdirs and used by templates.
|
||||
* Use uuid5 to create new compute_id. Fixes #1641 #1887
|
||||
* Migrate PCAP streaming code to work with FastAPI.
|
||||
* Refactor WebSocket console code to work with FastAPI. Fix endpoint routes.
|
||||
|
||||
|
||||
## 2.2.43 19/09/2023
|
||||
|
||||
* Force English output for VBoxManage. Fixes #2266
|
||||
@ -882,28 +299,6 @@
|
||||
* Only use importlib_resources for Python <= 3.9. Fixes #2147
|
||||
* Support when the user field defined in Docker container is an ID. Fixes #2134
|
||||
|
||||
## 3.0.0a3 27/12/2022
|
||||
|
||||
* Add web-ui v3.0.0a3
|
||||
* Add config option to change the server name. Ref #2149
|
||||
* Option to disable image discovery and do not scan parent directory
|
||||
* Allow raw images by default. Fixes https://github.com/GNS3/gns3-server/issues/2097
|
||||
* Fix bug when creating Dynamips router with chassis setting
|
||||
* Stricter checks to create/update an Ethernet switch and add tests
|
||||
* Fix schema for removing WICs from Cisco routers. Fixes #3392
|
||||
* Fix issues with VMnet interface on macOS >= 11.0. Ref #3381
|
||||
* Use importlib_resources instead of pkg_resources and install built-in appliances in config dir.
|
||||
* Fix console vnc don't use configured ports in some case. Fixes #2111
|
||||
* Add missing VMware settings in gns3_server.conf
|
||||
* Make version PEP 440 compliant
|
||||
* Support for Python 3.11
|
||||
* Allow for more dependency versions at patch level
|
||||
* Replace deprecated distro.linux_distribution() call
|
||||
* Update gns3.service.systemd
|
||||
* Fix some issues with HTTP notification streams
|
||||
* gns3.service.openrc: make openrc script posix compliant
|
||||
* fix: use exact match to find interface in windows to avoid get wrong interface
|
||||
|
||||
## 2.2.35.1 10/11/2022
|
||||
|
||||
* Re-release Web-Ui v2.2.35
|
||||
@ -923,154 +318,6 @@
|
||||
* gns3.service.openrc: make openrc script posix compliant
|
||||
* fix: use exact match to find interface in windows to avoid get wrong interface
|
||||
|
||||
## 3.0.0a2 06/09/2022
|
||||
|
||||
* Add web-ui v3.0.0a2
|
||||
* Upgrade FastAPI to v0.82.0
|
||||
* API endpoint to get the locked status of a project
|
||||
* Global project lock and unlock
|
||||
* Update appliance files
|
||||
* Require name for custom adapters. Fixes #2098
|
||||
* Allow empty adapter slots for Dynamips templates. Ref https://github.com/GNS3/gns3-gui/issues/3373
|
||||
* Use original $PATH in init.sh for Docker containers. Ref #2069
|
||||
|
||||
## 3.0.0a1 04/08/2022
|
||||
|
||||
* Bundle gns3-web-ui v3.0.0a1
|
||||
* Use default symbol theme if none is provided when loading appliances
|
||||
* Allow default symbol theme to be configured in config file
|
||||
* Optionally allow Qemu raw images
|
||||
* Ignore image detection for IOU user libraries in image directory
|
||||
* Don't show optional token param in API docs
|
||||
* Fix check for 32-bit in ELF header
|
||||
* Checks for valid hostname on server side for Dynamips, IOU, Qemu and Docker nodes
|
||||
* Only check files (not directories) when looking for new images on file system.
|
||||
* Support user defined loader/libraries to run IOU
|
||||
* Make 'vendor_url' and 'maintainer_email' optional for template validation.
|
||||
* Allow auth token to be passed as a URL param
|
||||
* HTTP middleware create issues when streaming project archive
|
||||
* Add zstandard compression support for project export
|
||||
* Make sure that the temporary image file is removed after uploading an image
|
||||
* Do not cache to md5sum file in some situations
|
||||
* Detect new images added to the default image directory. * Images can be present before the server starts or while it is running * Images are recorded in the database
|
||||
* Support delete Qemu disk image from API Return the real disk image name in the 'hdx_disk_image_backed' property for Qemu VMs
|
||||
* Handle creating Qemu disk images and resizing
|
||||
* Finish to clean up local setting usage. Ref #1460
|
||||
* "Local" command line parameter is only for stopping a server that has been started by the desktop GUI
|
||||
* Fix AsyncSession handling after breaking changes in FastAPI 0.74.0 See https://github.com/tiangolo/fastapi/releases/tag/0.74.0 for details.
|
||||
* Detect image type instead of requesting it from user
|
||||
* Drop Python 3.6 support and require Python >= 3.7
|
||||
* Drop Windows support
|
||||
* Add connect endpoint for computes Param to connect to compute after creation Report compute unauthorized HTTP errors to client
|
||||
* Replace CORS origins by origin regex
|
||||
* Change default config settings
|
||||
* Update Docker image for tests
|
||||
* Fix calls to static methods in server.py
|
||||
* Do not require the local server param to open a .gns3 file. Fixes https://github.com/GNS3/gns3-gui/issues/2421 Ref #1460
|
||||
* Do not automatically install appliance after uploading image
|
||||
* Ignore OSError when closing websocket
|
||||
* Allow empty compute_id. Ref #1657
|
||||
* Secure controller to compute communication using HTTP basic authentication
|
||||
* Secure websocket endpoints
|
||||
* Fix issue when updating a template
|
||||
* Allocate compute when compute_id is unset
|
||||
* Return the current controller hostname/IP from any compute
|
||||
* Remove Qemu legacy networking support
|
||||
* Add a custom version to an appliance
|
||||
* Appliance management refactoring: * Install an appliance based on selected version * Each template have unique name and version * Allow to download an appliance file
|
||||
* Finalize image management refactoring and auto install appliance if possible
|
||||
* Sqlite doesn't allow BigInteger to be used as an primary key with autoincrement
|
||||
* Add isolate and unisolate endpoints. Ref https://github.com/GNS3/gns3-gui/issues/3190
|
||||
* Small db tables adjustments
|
||||
* Add index for "name" field in role table
|
||||
* Allow images to be stored in subdirs and used by templates.
|
||||
* Option to prune images when deleting template.
|
||||
* Associate images when creating or updating a template.
|
||||
* Add prune images endpoint. Use many-to-many relationship between images and templates.
|
||||
* Check if user has the right to add a permission
|
||||
* Only use the necessary HTTP methods for default permissions
|
||||
* Add /permissions/prune to delete orphaned permissions
|
||||
* Check a permission matches an existing route before it is allowed to be created.
|
||||
* Remove busybox and copy system busybox in setup.py
|
||||
* Save image size + start to automatic template creation based on image checksum.
|
||||
* Upgrade dependencies
|
||||
* Fix "-machine accel=tcg" check
|
||||
* Allow logged in user to change some of its data. Administrators can lock users using the `is_active` field.
|
||||
* Symbols endpoints (except upload) don't require authentication.
|
||||
* Update to the udhcpc wrapper script. Ref #1890
|
||||
* Fix link style merge
|
||||
* Start refactoring for images management
|
||||
* Allow controller to be reloaded using the API. Fixes #1743
|
||||
* Use a stock BusyBox for the Docker Integration
|
||||
* Move "/{project_id}/templates/{template_id}" endpoint.
|
||||
* Add last login info for users.
|
||||
* Change RBAC field names from builtin to is_builtin
|
||||
* Add user permissions + RBAC tests.
|
||||
* Add description for user permission.
|
||||
* Save/restore appliances Etag.
|
||||
* Allow to set the initial super admin username / password in server config file. Ref #1857
|
||||
* Require authentication for get_user_memberships endpoint.
|
||||
* Change method to prevent forbidden directory traversal. Ref #1894
|
||||
* Add user groups support.
|
||||
* Add delete cascade on foreign keys for appliance table
|
||||
* Enable SQL foreign key support for SQLite
|
||||
* Add missing CORS origins.
|
||||
* Show topology path when check topology schema fails.
|
||||
* Protect controller notification endpoints. Ref #1888 (WebSocket endpoint is not secured, it takes an optional token).
|
||||
* Use uuid5 to create new compute_id. Fixes #1641 #1887
|
||||
* Protect the API and add alternative authentication endpoint.
|
||||
* Secure users API and handle manual password recovery.
|
||||
* Add default super admin account in controller db.
|
||||
* Complete type annotations for API endpoints.
|
||||
* Detect the app is exiting and avoid reconnecting to computes.
|
||||
* Move schemas between compute and controller subpackages
|
||||
* Remove traceng code.
|
||||
* Move error responses to API routers.
|
||||
* Wait for local compute to be started. Don't reconnect to local compute when server is being stopped.
|
||||
* Rename ssl and auth configuration file settings. Add enable SSL config validator. Strict configuration file validation: any error will prevent the server to start. Core server logic moved to a Server class.
|
||||
* Generate new config for each test. Fixes tests.
|
||||
* Use Pydantic to validate the server config file.
|
||||
* Add symbol dimensions endpoint and SSL support for packet capture with remote HTTPS server.
|
||||
* Save computes to database
|
||||
* Generate a new list in template schema defaults.
|
||||
* Generate JWT secret key if none is configured in the config file. Change location of the database.
|
||||
* User authentication with tests.
|
||||
* Refactor tests and start work on database integration.
|
||||
* Move endpoints to routes & preparations to use a database.
|
||||
* Providing the path to create a project is now deprecated.
|
||||
* Add back script to create a self-signed SSL certificate.
|
||||
* Make sure all HTTP exceptions return JSON with a "message" field instead of "detail"
|
||||
* Make Swagger Ui the default for API documentation
|
||||
* Move to version 3 of the REST API. Rename packet capture endpoints.
|
||||
* Use pydantic for data validation (instead of jsonschema) Fix/improve various pydantic schema models.
|
||||
* Automate API documentation publishing.
|
||||
* Publish API documentation generated by FastAPI.
|
||||
* Overwrite uvicorn loggers.
|
||||
* Do not automatically connect to local compute.
|
||||
* Add HTTP client to reuse the aiohttp session where needed. Remove unnecessary aiohttp exceptions.
|
||||
* Warn not to use the private compute API. Fixes #1593.
|
||||
* Migrate PCAP streaming code to work with FastAPI.
|
||||
* Refactor WebSocket console code to work with FastAPI. Fix endpoint routes.
|
||||
* Use dependencies and group common HTTP responses in endpoints.
|
||||
* Migration to FastAPI
|
||||
* Prioritize the config disk over HD-D for Qemu VMs. Fixes https://github.com/GNS3/gns3-gui/issues/3036
|
||||
* Create config disk property false by default for Qemu templates
|
||||
* Set default disk interface type to "none". Fail-safe: use "ide" if an image is set but no interface type is configured. Use the HDA disk interface type if none has been configured for HDD.
|
||||
* Add explicit option to automatically create or not the config disk. Off by default.
|
||||
* Auxiliary console support for Qemu. Ref #2873 Improvements for auxiliary console support for Docker and Dynamips.
|
||||
* Fix AUX console not allocated for Dynamips IOS routers.
|
||||
* Disallow to rename a running node. Fixes https://github.com/GNS3/gns3-gui/issues/2499
|
||||
* Support to reset all console connections. Ref https://github.com/GNS3/gns3-server/issues/1619
|
||||
* Support to reset links. Fixes https://github.com/GNS3/gns3-server/issues/1620
|
||||
* Add maxcpus property for Qemu VMs. Ref #1674
|
||||
* QEMU config disk support
|
||||
* Read folder structure correctly for custom symbols. Fixes https://github.com/GNS3/gns3-gui/issues/2856
|
||||
* Add total RAM, CPUs and disk size to servers summary as well as disk usage in percent. Fixes https://github.com/GNS3/gns3-server/issues/1532
|
||||
* Resource constraints for Docker VMs.
|
||||
* Update IOUtools. Ref #1627
|
||||
* Use parent directory as working directory for project duplication and snapshots. Fixes https://github.com/GNS3/gns3-gui/issues/2909
|
||||
* Support for "usage" for "Cloud" nodes. Fixes https://github.com/GNS3/gns3-gui/issues/2887 Allow "usage" for all builtin nodes (not exposed in Ui).
|
||||
|
||||
## 2.2.34 28/08/2022
|
||||
|
||||
* Use original $PATH in init.sh for Docker containers. Ref #2069
|
||||
|
||||
55
Dockerfile
55
Dockerfile
@ -1,37 +1,38 @@
|
||||
FROM ubuntu:noble
|
||||
# Dockerfile for GNS3 server development
|
||||
|
||||
WORKDIR /gns3server
|
||||
FROM ubuntu:24.04
|
||||
|
||||
RUN apt update && DEBIAN_FRONTEND=noninteractive apt install -y \
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
# Set the locale
|
||||
ENV LANG=en_US.UTF-8
|
||||
ENV LANGUAGE=en_US:en
|
||||
ENV LC_ALL=en_US.UTF-8
|
||||
|
||||
# this environment is externally managed
|
||||
ENV PIP_BREAK_SYSTEM_PACKAGES=1
|
||||
|
||||
RUN apt-get update && apt-get install -y software-properties-common
|
||||
RUN add-apt-repository ppa:gns3/ppa
|
||||
RUN apt-get update && apt-get install -y \
|
||||
locales \
|
||||
locales-all
|
||||
|
||||
ENV LANG en_US.UTF-8
|
||||
ENV LANGUAGE en_US:en
|
||||
ENV LC_ALL en_US.UTF-8
|
||||
|
||||
COPY ./requirements.txt /gns3server/requirements.txt
|
||||
|
||||
RUN DEBIAN_FRONTEND=noninteractive apt install -y \
|
||||
locales \
|
||||
software-properties-common \
|
||||
python3-pip \
|
||||
python3-all \
|
||||
python3-setuptools \
|
||||
python3-dev \
|
||||
busybox-static \
|
||||
gcc \
|
||||
qemu-system-x86 \
|
||||
qemu-kvm \
|
||||
libvirt-daemon-system
|
||||
libvirt-daemon-system libvirt-clients \
|
||||
x11vnc
|
||||
|
||||
RUN add-apt-repository ppa:gns3/ppa && apt update && DEBIAN_FRONTEND=noninteractive apt install -y \
|
||||
vpcs \
|
||||
ubridge \
|
||||
dynamips
|
||||
RUN locale-gen en_US.UTF-8
|
||||
|
||||
COPY . /gns3server
|
||||
# Install uninstall to install dependencies
|
||||
RUN apt-get install -y vpcs ubridge dynamips
|
||||
|
||||
RUN mkdir -p ~/.config/GNS3/3.1/
|
||||
RUN cp scripts/gns3_server.conf ~/.config/GNS3/3.1/
|
||||
ADD . /server
|
||||
WORKDIR /server
|
||||
|
||||
RUN python3 -m pip install --break-system-packages --ignore-installed .
|
||||
RUN pip3 install --no-cache-dir -r /server/requirements.txt
|
||||
|
||||
EXPOSE 3080
|
||||
|
||||
CMD [ "python3", "-m", "gns3server", "--port", "3080" ]
|
||||
|
||||
@ -1,7 +1,11 @@
|
||||
include README.md
|
||||
include AUTHORS
|
||||
include LICENSE
|
||||
include CHANGELOG
|
||||
recursive-include gns3server *
|
||||
include MANIFEST.in
|
||||
include requirements.txt
|
||||
include conf/*.conf
|
||||
recursive-include tests *
|
||||
recursive-exclude docs *
|
||||
recursive-include gns3server *
|
||||
recursive-exclude * __pycache__
|
||||
recursive-exclude * *.py[co]
|
||||
|
||||
@ -1,370 +0,0 @@
|
||||
# GNS3 Server - Project Context for Claude Code
|
||||
|
||||
> This document provides project context information for the Claude Code AI assistant to work more efficiently.
|
||||
|
||||
---
|
||||
|
||||
## Project Overview
|
||||
|
||||
**Project Name**: GNS3 Server
|
||||
**Description**: Network simulation server supporting the GNS3 network virtualization platform
|
||||
**Primary Language**: Python
|
||||
**Current Branch**: `feature/ai-copilot-bridge`
|
||||
**Main Branch**: `master`
|
||||
|
||||
---
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
gns3server/
|
||||
├── agent/ # AI Copilot related modules
|
||||
│ └── gns3_copilot/ # GNS3-Copilot AI Assistant
|
||||
│ ├── agent/ # LangGraph Agent implementation
|
||||
│ ├── tools_v2/ # Tool collection (device config, display commands, etc.)
|
||||
│ ├── utils/ # Utility functions and helper modules
|
||||
│ ├── gns3_client/ # GNS3 API client
|
||||
│ ├── prompts/ # AI prompt templates
|
||||
│ ├── agent_service.py # Agent service layer
|
||||
│ └── project_agent_manager.py # Project Agent manager
|
||||
│
|
||||
├── api/ # API routes
|
||||
│ └── routes/controller/ # Controller API
|
||||
│ └── chat.py # AI Chat API endpoint
|
||||
│
|
||||
├── controller/ # Core controller
|
||||
│ ├── project.py # Project management
|
||||
│ └── ...
|
||||
│
|
||||
├── schemas/ # Pydantic data models
|
||||
│ └── controller/
|
||||
│ └── chat.py # Chat API Schema
|
||||
│
|
||||
├── db/ # Database module
|
||||
│ └── tasks.py # Database tasks
|
||||
│
|
||||
└── docs/ # Documentation
|
||||
└── gns3-copilot/ # AI Copilot documentation
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Key Module Descriptions
|
||||
|
||||
### 1. AI Copilot Data Flow
|
||||
|
||||
```
|
||||
Tool Layer → Agent Layer → Service Layer → API Layer → Frontend
|
||||
```
|
||||
|
||||
**Tool Output Format**: All tools return `dict` or `list[dict]`, automatically serialized to JSON in the Service layer
|
||||
|
||||
**Key Files**:
|
||||
- `agent/gns3_copilot/tools_v2/*.py` - Tool implementations
|
||||
- `agent/gns3_copilot/agent_service.py:460-473` - Event conversion logic
|
||||
- `agent/gns3_copilot/utils/parse_tool_content.py` - Tool result parsing
|
||||
|
||||
### 2. SSE Event Types
|
||||
|
||||
| Type | Description |
|
||||
|------|-------------|
|
||||
| `content` | AI text streaming output |
|
||||
| `tool_call` | LLM tool invocation (progressive parameters) |
|
||||
| `tool_start` | Tool execution started |
|
||||
| `tool_end` | Tool execution completed (output as JSON) |
|
||||
| `error` | Error message |
|
||||
| `done` | Stream ended |
|
||||
|
||||
### 3. Important Tools
|
||||
|
||||
| Tool Name | File | Function |
|
||||
|-----------|------|----------|
|
||||
| `ExecuteMultipleDeviceCommands` | `display_tools_nornir.py` | Read-only diagnostic commands |
|
||||
| `ExecuteMultipleDeviceConfigCommands` | `config_tools_nornir.py` | Configuration commands |
|
||||
| `VPCSMultiCommands` | `vpcs_tools_telnetlib3.py` | VPCS virtual PC commands |
|
||||
| `GNS3TemplateTool` | `gns3_get_node_temp.py` | Get GNS3 templates |
|
||||
| `GNS3CreateNodeTool` | `gns3_create_node.py` | Create nodes |
|
||||
|
||||
---
|
||||
|
||||
## Code Standards
|
||||
|
||||
### Static Code Analysis (Flake8)
|
||||
|
||||
The project uses **flake8** for static code analysis. You must run checks before committing code.
|
||||
|
||||
#### Running Flake8
|
||||
|
||||
```bash
|
||||
# Activate virtual environment
|
||||
source venv/bin/activate
|
||||
|
||||
# Check a single file
|
||||
flake8 path/to/file.py
|
||||
|
||||
# Check the entire project
|
||||
flake8 gns3server/
|
||||
|
||||
# Check a specific directory
|
||||
flake8 gns3server/utils/
|
||||
```
|
||||
|
||||
#### Common Flake8 Error Codes
|
||||
|
||||
| Code | Description | Example |
|
||||
|------|-------------|---------|
|
||||
| **F401** | Module imported but unused | `import os` never used |
|
||||
| **F841** | Local variable assigned but never used | `x = 1` not used later |
|
||||
| **F824** | `global` declaration never assigned | `global _bar` never assigned in scope |
|
||||
| **E501** | Line too long (>79 characters) | Single line exceeds 79 characters |
|
||||
|
||||
#### Fix Examples
|
||||
|
||||
```python
|
||||
# F401: Remove unused imports
|
||||
# Bad
|
||||
import os # Never used
|
||||
# Good: Delete this line
|
||||
|
||||
# F841: Mark as intentionally unused
|
||||
# Bad
|
||||
def foo():
|
||||
x = 1 # Never used
|
||||
|
||||
# Good: Use or mark as intentionally unused
|
||||
def foo():
|
||||
x = 1
|
||||
_ = x # Mark as intentionally unused
|
||||
|
||||
# F824: Remove unnecessary global declaration
|
||||
# Bad
|
||||
def foo():
|
||||
global _fernet # Never assigned in this scope
|
||||
|
||||
# Good: Remove global statement (if only reading)
|
||||
def foo():
|
||||
# Just read the global variable, no global declaration needed
|
||||
pass
|
||||
|
||||
# E501: Break long lines
|
||||
# Bad
|
||||
raise RuntimeError("Encryption not initialized. Call init_encryption() first.")
|
||||
|
||||
# Good
|
||||
raise RuntimeError(
|
||||
"Encryption not initialized. Call init_encryption() first."
|
||||
)
|
||||
```
|
||||
|
||||
#### Ruff (Alternative)
|
||||
|
||||
[Ruff](https://docs.astral.sh/ruff/) is a faster Python linter that can replace flake8, isort, black, and more.
|
||||
|
||||
```bash
|
||||
# Install
|
||||
pip install ruff
|
||||
|
||||
# Usage
|
||||
ruff check gns3server/ # Check code
|
||||
ruff check --fix gns3server/ # Auto-fix
|
||||
ruff format gns3server/ # Format code
|
||||
```
|
||||
|
||||
### Python Code Style
|
||||
|
||||
```python
|
||||
# 1. Type annotations
|
||||
def process_data(input_data: dict[str, Any]) -> list[dict[str, Any]]:
|
||||
pass
|
||||
|
||||
# 2. Error handling
|
||||
try:
|
||||
result = tool.invoke(args)
|
||||
except Exception as e:
|
||||
logger.error("Tool failed: %s", e, exc_info=True)
|
||||
return {"error": str(e)}
|
||||
|
||||
# 3. JSON serialization
|
||||
if not isinstance(output, str):
|
||||
output = json.dumps(output, ensure_ascii=False, indent=2)
|
||||
```
|
||||
|
||||
### Import Order
|
||||
|
||||
```python
|
||||
# 1. Standard library
|
||||
import asyncio
|
||||
import json
|
||||
import logging
|
||||
|
||||
# 2. Third-party libraries
|
||||
from langchain.tools import BaseTool
|
||||
from pydantic import BaseModel
|
||||
|
||||
# 3. Local modules
|
||||
from gns3server.agent.gns3_copilot.agent import agent_builder
|
||||
from gns3server.controller import Controller
|
||||
```
|
||||
|
||||
### Copyright Header
|
||||
|
||||
```python
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
#
|
||||
# GNS3-Copilot - AI-powered Network Lab Assistant for GNS3
|
||||
#
|
||||
# Copyright (C) 2025 Yue Guobin (岳国宾)
|
||||
# Author: Yue Guobin (岳国宾)
|
||||
#
|
||||
# Project Home: https://github.com/yueguobin/gns3-copilot
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Git Commit Standards
|
||||
|
||||
### Commit Message Format
|
||||
|
||||
```
|
||||
<type>(<scope>): <subject>
|
||||
|
||||
<body>
|
||||
|
||||
<footer>
|
||||
```
|
||||
|
||||
### Type Categories
|
||||
|
||||
| Type | Description | Example |
|
||||
|------|-------------|---------|
|
||||
| `feat` | New feature | `feat(copilot): add user authentication` |
|
||||
| `fix` | Bug fix | `fix(api): correct JSON serialization` |
|
||||
| `docs` | Documentation update | `docs: update API design doc` |
|
||||
| `refactor` | Refactoring | `refactor(agent): simplify state management` |
|
||||
| `chore` | Build/toolchain | `chore: update dependencies` |
|
||||
|
||||
### Example
|
||||
|
||||
```
|
||||
fix(copilot): serialize tool output to standard JSON format
|
||||
|
||||
Changed tool output serialization in AgentService._convert_event_to_chunk()
|
||||
from str() to json.dumps() to ensure structured data is properly formatted.
|
||||
|
||||
Changes:
|
||||
- Added json import to agent_service.py
|
||||
- Modified on_tool_end event handling
|
||||
|
||||
Benefits:
|
||||
- Frontend can parse tool results with JSON.parse()
|
||||
- Chinese characters are preserved (not escaped)
|
||||
|
||||
Co-Authored-By: YueGuobin <yueguobin@outlook.com>
|
||||
```
|
||||
|
||||
### IMPORTANT: Use Your Own Git Account for Commits
|
||||
|
||||
When creating git commits, **ALWAYS** use your own git account information for authorship.
|
||||
|
||||
**Before committing**, verify your git configuration:
|
||||
|
||||
```bash
|
||||
# Check current git user configuration
|
||||
git config user.name
|
||||
git config user.email
|
||||
|
||||
# If incorrect, set your own information
|
||||
git config user.name "Your Name"
|
||||
git config user.email "your.email@example.com"
|
||||
```
|
||||
|
||||
**For this project**, the current configured user is:
|
||||
```
|
||||
Name: YueGuobin
|
||||
Email: yueguobin@outlook.com
|
||||
```
|
||||
|
||||
You may use `Co-Authored-By` to credit contributors, but the `Author` field should always be **your own account**:
|
||||
|
||||
```bash
|
||||
git commit -m "feat: add new feature
|
||||
|
||||
Co-Authored-By: ContributorName <contributor@example.com>"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Development Notes
|
||||
|
||||
### 1. When Modifying Tool Output Format
|
||||
|
||||
**Must update the following locations**:
|
||||
- `agent/gns3_copilot/tools_v2/*.py` - Tool implementation
|
||||
- `agent/gns3_copilot/agent_service.py` - Event conversion
|
||||
- `docs/gns3-copilot/ai-chat-api-design.md` - API documentation
|
||||
|
||||
### 2. Data Serialization Principles
|
||||
|
||||
- **Tool Layer**: Return Python `dict`/`list`
|
||||
- **Service Layer**: Use `json.dumps()` for serialization
|
||||
- **API Layer**: Use Pydantic validation then serialize to SSE
|
||||
|
||||
### 3. Logging
|
||||
|
||||
```python
|
||||
logger.info("Operation started: project_id=%s", project_id)
|
||||
logger.debug("Detailed info: data=%s", data)
|
||||
logger.error("Error occurred: %s", error, exc_info=True)
|
||||
```
|
||||
|
||||
### 4. Security Considerations
|
||||
|
||||
- Prohibit dangerous commands (reload, erase startup-config, etc.)
|
||||
- Use `filter_forbidden_commands()` to filter commands
|
||||
- Validate user input (project_id format, etc.)
|
||||
|
||||
---
|
||||
|
||||
## Common Commands
|
||||
|
||||
```bash
|
||||
# Run tests
|
||||
pytest tests/
|
||||
|
||||
# Static code analysis (must run before committing)
|
||||
source venv/bin/activate
|
||||
flake8 gns3server/
|
||||
|
||||
# Check a single file
|
||||
flake8 path/to/file.py
|
||||
|
||||
# Syntax check
|
||||
python3 -m py_compile gns3server/agent/gns3_copilot/agent_service.py
|
||||
|
||||
# Check git status
|
||||
git status
|
||||
|
||||
# View git history
|
||||
git log --oneline -15
|
||||
|
||||
# View file modification history
|
||||
git blame file.py -L 100,120
|
||||
|
||||
# Commit code (verify your git user info first!)
|
||||
git config user.name && git config user.email
|
||||
git add files...
|
||||
git commit -m "type(scope): description"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- [AI Chat API Design](./docs/gns3-copilot/ai-chat-api-design.md)
|
||||
- [Command Security Policy](./docs/gns3-copilot/command-security.md)
|
||||
- [LLM Model Configuration](./docs/gns3-copilot/llm-model-configs-api.md)
|
||||
- [Context Window Management](./docs/gns3-copilot/context-window-management.md)
|
||||
|
||||
---
|
||||
|
||||
**Document Maintenance**: Please update this document promptly when project structure or development standards change.
|
||||
375
README.md
375
README.md
@ -1,156 +1,114 @@
|
||||
# GNS3 server repository
|
||||
GNS3-server
|
||||
===========
|
||||
|
||||
[](https://github.com/psf/black)
|
||||
[](https://github.com/GNS3/gns3-server/actions?query=workflow%3Atesting+branch%3A3.0)
|
||||
[](https://pypi.python.org/pypi/gns3-server)
|
||||
[](https://snyk.io/test/github/GNS3/gns3-server)
|
||||
[](https://github.com/GNS3/gns3-server/actions?query=workflow%3Atesting)
|
||||
|
||||
The GNS3 server manages emulators and other virtualization software such as Dynamips, Qemu/KVM, Docker, VPCS, VirtualBox and VMware Workstation.
|
||||
Clients like the [GNS3 GUI](https://github.com/GNS3/gns3-gui/) and the [GNS3 Web UI](https://github.com/GNS3/gns3-web-ui/) control the server using a HTTP REST API.
|
||||
[](https://pypi.python.org/pypi/gns3-server)
|
||||
|
||||
## Installation
|
||||
[](https://snyk.io/test/github/GNS3/gns3-server)
|
||||
|
||||
These instructions are for using GNS3, please see below for development.
|
||||
This is the GNS3 server repository.
|
||||
|
||||
### Windows & macOS
|
||||
The GNS3 server manages emulators such as Dynamips, VirtualBox or
|
||||
Qemu/KVM. Clients like the [GNS3 GUI](https://github.com/GNS3/gns3-gui/)
|
||||
and the [GNS3 Web UI](https://github.com/GNS3/gns3-web-ui) control the
|
||||
server using an HTTP REST API.
|
||||
|
||||
Please use our [Windows installer or DMG package](https://gns3.com/software/download) to install the stable build along with the GNS3 VM.
|
||||
Note that as of GNS3 version above 3.0, you must run the server using the GNS3 VM or on a Linux system (remote, cloud or virtual machine).
|
||||
Software dependencies
|
||||
---------------------
|
||||
|
||||
### Linux
|
||||
In addition of Python dependencies listed in a section below, other
|
||||
software may be required, recommended or optional.
|
||||
|
||||
#### Ubuntu based distributions
|
||||
- [uBridge](https://github.com/GNS3/ubridge/) is required, it
|
||||
interconnects the nodes.
|
||||
- [Dynamips](https://github.com/GNS3/dynamips/) is required for
|
||||
running IOS routers (using real IOS images) as well as the internal
|
||||
switches and hubs.
|
||||
- [VPCS](https://github.com/GNS3/vpcs/) is recommended, it is a
|
||||
builtin node simulating a very simple computer to perform
|
||||
connectitivy tests using ping, traceroute etc.
|
||||
- Qemu is strongly recommended on Linux, as most node types are based
|
||||
on Qemu, for example Cisco IOSv and Arista vEOS.
|
||||
- libvirt is recommended (Linux only), as it\'s needed for the NAT
|
||||
cloud.
|
||||
- Docker is optional (Linux only), some nodes are based on Docker.
|
||||
- mtools is recommended to support data transfer to/from QEMU VMs
|
||||
using virtual disks.
|
||||
- i386-libraries of libc and libcrypto are optional (Linux only), they
|
||||
are only needed to run IOU based nodes.
|
||||
|
||||
We build and test packages for actively supported Ubuntu versions.
|
||||
Other distros based on Ubuntu, like Mint, should also be supported.
|
||||
### Docker support
|
||||
|
||||
Packages can be installed from our Personal Package Archives (PPA) repository:
|
||||
Docker support needs the script program (bsdutils or
|
||||
util-linux package), when running a docker VM and a static
|
||||
busybox during installation (python3 setup.py install / pip3 install /
|
||||
package creation).
|
||||
|
||||
```shell
|
||||
sudo apt update
|
||||
sudo apt install software-properties-common
|
||||
sudo add-apt-repository ppa:gns3/ppa
|
||||
sudo apt update
|
||||
sudo apt install gns3-gui gns3-server
|
||||
Branches
|
||||
--------
|
||||
|
||||
### master
|
||||
|
||||
master is the next stable release, you can test it in your day to day
|
||||
activities. Bug fixes or small improvements pull requests go here.
|
||||
|
||||
### 2.x (2.3 for example)
|
||||
|
||||
Next major release
|
||||
|
||||
*Never* use this branch for production. Pull requests for major new
|
||||
features go here.
|
||||
|
||||
Linux
|
||||
-----
|
||||
|
||||
GNS3 is perhaps packaged for your distribution:
|
||||
|
||||
- Gentoo: <https://packages.gentoo.org/package/net-misc/gns3-server>
|
||||
- Alpine:
|
||||
<https://pkgs.alpinelinux.org/package/v3.10/community/x86_64/gns3-server>
|
||||
- NixOS:
|
||||
<https://search.nixos.org/packages?channel=unstable&from=0&size=50&sort=relevance&type=packages&query=gns3-server>
|
||||
|
||||
Linux (Debian based)
|
||||
--------------------
|
||||
|
||||
The following instructions have been tested with Ubuntu and Mint. You
|
||||
must be connected to the Internet in order to install the dependencies.
|
||||
|
||||
Dependencies:
|
||||
|
||||
- Python >= 3.8, setuptools and the ones listed
|
||||
[here](https://github.com/GNS3/gns3-server/blob/master/requirements.txt)
|
||||
|
||||
The following commands will install some of these dependencies:
|
||||
|
||||
``` {.bash}
|
||||
sudo apt-get install python3-setuptools python3-pip
|
||||
```
|
||||
|
||||
#### Other Linux distributions
|
||||
Finally, these commands will install the server as well as the rest of
|
||||
the dependencies:
|
||||
|
||||
GNS3 is often packaged for other distributions by third-parties:
|
||||
|
||||
* [Gentoo](https://packages.gentoo.org/package/net-misc/gns3-server)
|
||||
* [Alpine](https://pkgs.alpinelinux.org/package/v3.10/community/x86_64/gns3-server)
|
||||
* [NixOS](https://search.nixos.org/packages?channel=21.11&from=0&size=50&sort=relevance&type=packages&query=gns3-server)
|
||||
|
||||
#### PyPi
|
||||
|
||||
You may use PyPi in case no package is provided, or you would like to do a manual installation:
|
||||
|
||||
* https://pypi.org/project/gns3-server/
|
||||
* https://pypi.org/project/gns3-gui/
|
||||
|
||||
```shell
|
||||
python3 -m pip install gns3-gui
|
||||
python3 -m pip install gns3-server
|
||||
```
|
||||
|
||||
#### Optional Features
|
||||
|
||||
GNS3 server supports optional features that can be installed as needed:
|
||||
|
||||
**AI Features** (Optional — includes AI Copilot and MCP):
|
||||
```shell
|
||||
python3 -m pip install gns3-server[ai-features]
|
||||
```
|
||||
AI-powered assistant for network topology design, automation, and MCP protocol support for AI agent integration.
|
||||
|
||||
**Development** (For contributors):
|
||||
```shell
|
||||
python3 -m pip install gns3-server[dev]
|
||||
```
|
||||
|
||||
**Web Wireshark** (Optional):
|
||||
```shell
|
||||
pip install gns3-server && gns3server-web-wireshark-setup
|
||||
```
|
||||
Browser-based packet capture analysis using Wireshark in a Docker container.
|
||||
|
||||
**Combination Installation**:
|
||||
You can install multiple optional features together:
|
||||
```shell
|
||||
python3 -m pip install gns3-server[ai-features,dev]
|
||||
```
|
||||
|
||||
**Why optional?**
|
||||
- Reduces installation size for users who don't need specific features
|
||||
- Supports restricted environments (government, education, corporate) where certain libraries may not be allowed
|
||||
- Faster installation for basic GNS3 usage
|
||||
- Allows users to choose only the features they need
|
||||
|
||||
**Note:** If you install without optional extras, the server will work normally but optional features will be disabled. You can add features later by running the appropriate install command.
|
||||
|
||||
**Uninstalling AI Features:**
|
||||
|
||||
To remove AI Features dependencies (AI Copilot + MCP):
|
||||
|
||||
```shell
|
||||
gns3server-uninstall-ai-features
|
||||
```
|
||||
|
||||
This will remove all AI Copilot and MCP dependencies while keeping the core functionality intact. The server will continue to work, but AI features will be disabled.
|
||||
|
||||
Please see our [documentation](https://docs.gns3.com/docs/getting-started/installation/linux) for more details.
|
||||
|
||||
### Software dependencies
|
||||
|
||||
In addition to Python dependencies, other software may be required, recommended or optional.
|
||||
|
||||
* [uBridge](https://github.com/GNS3/ubridge/) is required, it interconnects the nodes.
|
||||
* [Dynamips](https://github.com/GNS3/dynamips/) is required for running IOS routers (using real IOS images) as well as the internal switches and hubs.
|
||||
* [VPCS](https://github.com/GNS3/vpcs/) is recommended, it is a builtin node simulating a very simple computer to perform connectivity tests using ping, traceroute etc.
|
||||
* Qemu is strongly recommended as most node types are based on Qemu, for example Cisco IOSv and Arista vEOS.
|
||||
* libvirt is recommended as it's needed for the NAT cloud.
|
||||
* Docker is optional, some nodes are based on Docker.
|
||||
* mtools is recommended to support data transfer to/from QEMU VMs using virtual disks.
|
||||
* i386-libraries of libc and libcrypto are optional, they are only needed to run IOU based nodes.
|
||||
|
||||
Note that Docker needs the script program (`bsdutils` or `util-linux` package), when running a Docker VM and a static busybox during installation (python3 setup.py install / pip3 install / package creation).
|
||||
|
||||
## Development
|
||||
|
||||
### Setting up
|
||||
|
||||
These commands will install the server with core Python dependencies:
|
||||
|
||||
```shell
|
||||
git clone https://github.com/GNS3/gns3-server
|
||||
cd gns3-server
|
||||
git checkout 3.1
|
||||
python3 -m venv venv-gns3server
|
||||
source venv-gns3server/bin/activate
|
||||
``` {.bash}
|
||||
cd gns3-server-master
|
||||
python3 -m pip install -r requirements.txt
|
||||
python3 -m pip install .
|
||||
python3 -m gns3server
|
||||
gns3server
|
||||
```
|
||||
|
||||
**For AI Copilot development**, install with additional dependencies:
|
||||
To run tests use:
|
||||
|
||||
```shell
|
||||
python3 -m pip install .[ai-features,dev]
|
||||
``` {.bash}
|
||||
python3 -m pytest tests
|
||||
```
|
||||
|
||||
**For development (tests and linting)**:
|
||||
|
||||
```shell
|
||||
python3 -m pip install .[dev]
|
||||
```
|
||||
|
||||
You will have to manually install other software dependencies (see above), for Dynamips, VPCS and uBridge the easiest is to install from our PPA.
|
||||
|
||||
### Docker container
|
||||
|
||||
Alternatively, you can run the GNS3 server in a container
|
||||
For development, you can run the GNS3 server in a container
|
||||
|
||||
```shell
|
||||
``` {.bash}
|
||||
bash scripts/docker_dev_server.sh
|
||||
```
|
||||
|
||||
@ -160,36 +118,145 @@ bash scripts/docker_dev_server.sh
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
### Run as daemon (Unix only)
|
||||
|
||||
You will find init sample scripts for various systems inside the init
|
||||
directory.
|
||||
|
||||
Useful options:
|
||||
|
||||
- `--daemon`: start process as a daemon
|
||||
- `--log logfile`: store output in a logfile
|
||||
- `--pid pidfile`: store the pid of the running process in a file and
|
||||
prevent double execution
|
||||
|
||||
All init scripts require the creation of a GNS3 user. You can change it
|
||||
to another user.
|
||||
|
||||
``` {.bash}
|
||||
sudo adduser gns3
|
||||
```
|
||||
|
||||
upstart
|
||||
-------
|
||||
|
||||
For ubuntu < 15.04
|
||||
|
||||
You need to copy init/gns3.conf.upstart to /etc/init/gns3.conf
|
||||
|
||||
``` {.bash}
|
||||
sudo chown root /etc/init/gns3.conf
|
||||
sudo service gns3 start
|
||||
```
|
||||
|
||||
systemd
|
||||
-------
|
||||
|
||||
You need to copy init/gns3.service.systemd to
|
||||
/lib/systemd/system/gns3.service
|
||||
|
||||
``` {.bash}
|
||||
sudo chown root /lib/systemd/system/gns3.service
|
||||
sudo systemctl start gns3
|
||||
```
|
||||
|
||||
Windows
|
||||
-------
|
||||
|
||||
Please use our [all-in-one
|
||||
installer](https://community.gns3.com/software/download) to install the
|
||||
stable build.
|
||||
|
||||
If you install via source you need to first install:
|
||||
|
||||
- Python (3.3 or above) - <https://www.python.org/downloads/windows/>
|
||||
- Pywin32 - <https://sourceforge.net/projects/pywin32/>
|
||||
|
||||
Then you can call
|
||||
|
||||
``` {.bash}
|
||||
python setup.py install
|
||||
```
|
||||
|
||||
to install the remaining dependencies.
|
||||
|
||||
To run the tests, you also need to call
|
||||
|
||||
``` {.bash}
|
||||
pip install pytest pytest-capturelog
|
||||
```
|
||||
|
||||
before actually running the tests with
|
||||
|
||||
``` {.bash}
|
||||
python setup.py test
|
||||
```
|
||||
|
||||
or with
|
||||
|
||||
``` {.bash}
|
||||
py.test -v
|
||||
```
|
||||
|
||||
Mac OS X
|
||||
--------
|
||||
|
||||
Please use our DMG package for a simple installation.
|
||||
|
||||
If you want to test the current git version or contribute to the
|
||||
project, you can follow these instructions with virtualenvwrapper:
|
||||
<http://virtualenvwrapper.readthedocs.org/> and homebrew:
|
||||
<http://brew.sh/>.
|
||||
|
||||
``` {.bash}
|
||||
brew install python3
|
||||
mkvirtualenv gns3-server --python=/usr/local/bin/python3.5
|
||||
python3 setup.py install
|
||||
gns3server
|
||||
```
|
||||
|
||||
SSL
|
||||
---
|
||||
|
||||
If you want enable SSL support on GNS3 you can generate a self signed
|
||||
certificate:
|
||||
|
||||
``` {.bash}
|
||||
bash gns3server/cert_utils/create_cert.sh
|
||||
```
|
||||
|
||||
This command will put the files in \~/.config/GNS3/ssl
|
||||
|
||||
After you can start the server in SSL mode with:
|
||||
|
||||
``` {.bash}
|
||||
python gns3server/main.py --certfile ~/.config/GNS3/ssl/server.cert --certkey ~/.config/GNS3/ssl/server.key --ssl
|
||||
```
|
||||
|
||||
Or in your gns3\_server.conf by adding in the Server section:
|
||||
|
||||
``` {.ini}
|
||||
[Server]
|
||||
certfile=/Users/noplay/.config/GNS3/ssl/server.cert
|
||||
certkey=/Users/noplay/.config/GNS3/ssl/server.key
|
||||
ssl=True
|
||||
```
|
||||
|
||||
### Running tests
|
||||
|
||||
First, install the development dependencies:
|
||||
Just run:
|
||||
|
||||
```shell
|
||||
python3 -m pip install -r dev-requirements.txt
|
||||
``` {.bash}
|
||||
py.test -vv
|
||||
```
|
||||
|
||||
Then run the tests using pytest:
|
||||
If you want test coverage:
|
||||
|
||||
```shell
|
||||
python3 -m pytest -vv tests/
|
||||
``` {.bash}
|
||||
py.test --cov-report term-missing --cov=gns3server
|
||||
```
|
||||
|
||||
### API documentation
|
||||
Security issues
|
||||
---------------
|
||||
|
||||
The API documentation can be accessed when running the server locally:
|
||||
|
||||
* On `http://IP:PORT/docs` to see with Swagger UI (i.e. `http://localhost:3080/docs`)
|
||||
* On `http://IP:PORT/redoc` to see with ReDoc (i.e. `http://localhost:3080/redoc`)
|
||||
|
||||
The documentation can also be viewed [online](http://apiv3.gns3.net) however it may not be the most up-to-date version since it needs manually synchronization with the current code. Also, you cannot use this to interact with a GNS3 server.
|
||||
|
||||
### Branches
|
||||
|
||||
#### master
|
||||
|
||||
master is the next stable release, you can test it in your day-to -day activities.
|
||||
Bug fixes or small improvements pull requests go here.
|
||||
|
||||
3.x development brand for the next major release.
|
||||
|
||||
**Never** use this branch for production. Pull requests for major new features go here.
|
||||
Please use GitHub's report a vulnerability feature. More information can be found in https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability
|
||||
|
||||
@ -1,50 +0,0 @@
|
||||
# ==============================================================================
|
||||
# GNS3 Copilot AI Agent Dependencies
|
||||
# ==============================================================================
|
||||
# Install with: pip install gns3-server[ai-features]
|
||||
# Or directly: pip install -r ai-requirements.txt
|
||||
# ==============================================================================
|
||||
|
||||
# Core AI and Automation Framework
|
||||
# Note: aiosqlite is in core requirements.txt
|
||||
langchain>=1.2.10
|
||||
langchain-core>=1.2.16
|
||||
langgraph>=1.0.9
|
||||
langgraph-checkpoint>=4.0.0
|
||||
langgraph-checkpoint-sqlite>=3.0.3
|
||||
langgraph-checkpoint-postgres>=3.0.4
|
||||
|
||||
# Model Providers
|
||||
langchain-openai>=1.1.10
|
||||
langchain-anthropic>=1.3.4
|
||||
langchain-google-genai>=4.2.1
|
||||
langchain-aws>=1.3.1
|
||||
langchain-ollama>=1.0.1
|
||||
langchain-deepseek>=1.0.1
|
||||
langchain-xai>=1.2.2
|
||||
|
||||
# Token Counting
|
||||
tiktoken>=0.8.0
|
||||
|
||||
# LangSmith SDK
|
||||
langsmith>=0.7.7
|
||||
|
||||
# Network Automation
|
||||
netmiko>=4.7.0
|
||||
nornir>=3.5.0
|
||||
nornir-netmiko>=1.0.1
|
||||
nornir-utils>=0.2.0
|
||||
nornir-salt>=0.23.0
|
||||
|
||||
# Environment & Configuration
|
||||
python-dotenv>=1.2.1
|
||||
|
||||
# Authentication
|
||||
PyJWT>=2.10.1
|
||||
psycopg-pool>=3.1.0
|
||||
|
||||
# Skills Repository Management
|
||||
PyYAML>=6.0.0
|
||||
GitPython>=3.1.0
|
||||
|
||||
# Note: httpx is only for testing (in dev-requirements.txt)
|
||||
113
conf/gns3_server.conf
Normal file
113
conf/gns3_server.conf
Normal file
@ -0,0 +1,113 @@
|
||||
[Server]
|
||||
; IP where the server listen for connections
|
||||
host = 0.0.0.0
|
||||
; HTTP port for controlling the servers
|
||||
port = 3080
|
||||
|
||||
; Option to enable SSL encryption
|
||||
ssl = False
|
||||
certfile=/home/gns3/.config/GNS3/ssl/server.cert
|
||||
certkey=/home/gns3/.config/GNS3/ssl/server.key
|
||||
|
||||
; Path where binary images are stored
|
||||
images_path = /home/gns3/GNS3/images
|
||||
|
||||
; Path where user projects are stored
|
||||
projects_path = /home/gns3/GNS3/projects
|
||||
|
||||
; Path where custom user appliances are stored
|
||||
appliances_path = /home/gns3/GNS3/appliances
|
||||
|
||||
; Path where custom user symbols are stored
|
||||
symbols_path = /home/gns3/GNS3/symbols
|
||||
|
||||
; Path where files like built-in appliances and Docker resources are stored
|
||||
; The default path is the local user data directory
|
||||
; (Linux: "~/.local/share/GNS3", macOS: "~/Library/Application Support/GNS3", Windows: "%APPDATA%\GNS3")
|
||||
; resources_path = /home/gns3/GNS3/resources
|
||||
|
||||
; Option to automatically send crash reports to the GNS3 team
|
||||
report_errors = True
|
||||
|
||||
; First console port of the range allocated to devices
|
||||
console_start_port_range = 5000
|
||||
; Last console port of the range allocated to devices
|
||||
console_end_port_range = 10000
|
||||
|
||||
; First VNC console port of the range allocated to devices.
|
||||
; The value MUST BE >= 5900 and <= 65535
|
||||
vnc_console_start_port_range = 5900
|
||||
; Last VNC console port of the range allocated to devices
|
||||
; The value MUST BE >= 5900 and <= 65535
|
||||
vnc_console_end_port_range = 10000
|
||||
|
||||
; First port of the range allocated for inter-device communication. Two ports are allocated per link.
|
||||
udp_start_port_range = 20000
|
||||
; Last port of the range allocated for inter-device communication. Two ports are allocated per link
|
||||
udp_end_port_range = 30000
|
||||
|
||||
; uBridge executable location, default: search in PATH
|
||||
;ubridge_path = ubridge
|
||||
|
||||
; Option to enable HTTP authentication.
|
||||
auth = False
|
||||
; Username for HTTP authentication.
|
||||
user = gns3
|
||||
; Password for HTTP authentication.
|
||||
password = gns3
|
||||
|
||||
; Only allow these interfaces to be used by GNS3, for the Cloud node for example (Linux/OSX only)
|
||||
; Do not forget to allow virbr0 in order for the NAT node to work
|
||||
allowed_interfaces = eth0,eth1,virbr0
|
||||
|
||||
; Specify the NAT interface to be used by the NAT node
|
||||
; Default is virbr0 on Linux (requires libvirt) and vmnet8 for other platforms (requires VMware)
|
||||
default_nat_interface = vmnet10
|
||||
|
||||
; Enable the built-in templates
|
||||
enable_builtin_templates = True
|
||||
|
||||
; Install built-in appliances
|
||||
install_builtin_appliances = True
|
||||
|
||||
; check if hardware virtualization is used by other emulators (KVM, VMware or VirtualBox)
|
||||
hardware_virtualization_check = True
|
||||
|
||||
[VPCS]
|
||||
; VPCS executable location, default: search in PATH
|
||||
;vpcs_path = vpcs
|
||||
|
||||
[Dynamips]
|
||||
; Enable auxiliary console ports on IOS routers
|
||||
allocate_aux_console_ports = False
|
||||
mmap_support = True
|
||||
; Dynamips executable path, default: search in PATH
|
||||
;dynamips_path = dynamips
|
||||
sparse_memory_support = True
|
||||
ghost_ios_support = True
|
||||
|
||||
[IOU]
|
||||
; Path of your .iourc file. If not provided, the file is searched in $HOME/.iourc
|
||||
iourc_path = /home/gns3/.iourc
|
||||
; Validate if the iourc license file is correct. If you turn this off and your licence is invalid IOU will not start and no errors will be shown.
|
||||
license_check = True
|
||||
|
||||
[Qemu]
|
||||
; !! Remember to add the gns3 user to the KVM group, otherwise you will not have read / write permissions to /dev/kvm !! (Linux only, has priority over enable_hardware_acceleration)
|
||||
enable_kvm = True
|
||||
; Require KVM to be installed in order to start VMs (Linux only, has priority over require_hardware_acceleration)
|
||||
require_kvm = True
|
||||
; Enable hardware acceleration (all platforms)
|
||||
enable_hardware_acceleration = True
|
||||
; Require hardware acceleration in order to start VMs (all platforms)
|
||||
require_hardware_acceleration = False
|
||||
; Allow unsafe additional command line options
|
||||
allow_unsafe_options = False
|
||||
; Path to the OVMF firmware directory
|
||||
ovmf_firmware_dir = "/usr/share/OVMF"
|
||||
|
||||
[VMware]
|
||||
; First vmnet interface of the range that can be managed by the GNS3 server
|
||||
vmnet_start_range = 2
|
||||
; Last vmnet interface of the range that can be managed by the GNS3 server. It must be maximum 19 on Windows.
|
||||
vmnet_end_range = 255
|
||||
@ -1,6 +1,6 @@
|
||||
pytest==9.0.3 # fix CVE-2025-71176; Python 3.10+ required
|
||||
-rrequirements.txt
|
||||
|
||||
pytest==8.4.2 # version 8.4.2 is the last one supporting Python 3.9
|
||||
flake8==7.3.0
|
||||
pytest-timeout==2.4.0
|
||||
pytest-asyncio==1.4.0
|
||||
httpx==0.28.1
|
||||
httpx_ws==0.7.2 # upgrading leads to failures in tests
|
||||
pytest-aiohttp==1.1.0
|
||||
|
||||
@ -1,15 +0,0 @@
|
||||
version: '3.7'
|
||||
|
||||
services:
|
||||
gns3server:
|
||||
privileged: true
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
volumes:
|
||||
- ./gns3server:/server/
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
command: python3 -m gns3server --local --port 3080
|
||||
ports:
|
||||
- 3080:3080
|
||||
- 5000-5100:5000-5100
|
||||
@ -1 +0,0 @@
|
||||
apiv3.gns3.net
|
||||
443
docs/LICENSE
443
docs/LICENSE
@ -1,443 +0,0 @@
|
||||
Creative Commons Attribution-ShareAlike 4.0 International
|
||||
|
||||
Copyright (c) 2026 GNS3 Web UI Project
|
||||
|
||||
=======================================================================
|
||||
|
||||
Creative Commons Attribution-ShareAlike 4.0 International
|
||||
|
||||
Copyright (C) 2025 Creative Commons Corporation
|
||||
|
||||
Creative Commons Corporation ("Creative Commons") is not a law firm and
|
||||
does not provide legal services or legal advice. Distribution of
|
||||
Creative Commons public licenses does not create a lawyer-client or
|
||||
other relationship. Creative Commons makes its licenses and related
|
||||
information available on an "as-is" basis. Creative Commons gives no
|
||||
warranties regarding its licenses, any material licensed under their
|
||||
terms and conditions, or any related information. Creative Commons
|
||||
disclaims all liability for damages resulting from their use to the
|
||||
fullest extent possible.
|
||||
|
||||
Using Creative Commons Public Licenses
|
||||
|
||||
Creative Commons public licenses provide a standard set of terms and
|
||||
conditions that creators and other rights holders may use to share
|
||||
original works of authorship and other material subject to copyright
|
||||
and certain other rights specified in the public license below. The
|
||||
following considerations are for informational purposes only, are not
|
||||
exhaustive, and do not form part of our licenses.
|
||||
|
||||
Considerations for licensors: Our public licenses are
|
||||
intended for use by those authorized to give the public
|
||||
permission to use material in ways otherwise restricted by
|
||||
copyright and certain other rights. Our licenses are
|
||||
irrevocable. Licensors should read and understand the terms
|
||||
and conditions of the license they choose before applying it.
|
||||
Licensors should also secure all rights necessary before
|
||||
applying our licenses so that the public can reuse the
|
||||
material as expected. Licensors should clearly mark any
|
||||
material not subject to the license. This includes other CC-
|
||||
licensed material, or material used under an exception or
|
||||
limitation to copyright. More considerations for licensors:
|
||||
wiki.creativecommons.org/Considerations_for_licensors
|
||||
|
||||
Considerations for the public: Our public licenses are
|
||||
intended for use by those authorized to give the public
|
||||
permission to use material in ways otherwise restricted by
|
||||
copyright and certain other rights. Our licenses are
|
||||
irrevocable. Licensors should read and understand the terms
|
||||
and conditions of the license they choose before applying it.
|
||||
Licensors should also secure all rights necessary before
|
||||
applying our licenses so that the public can reuse the
|
||||
material as expected. Licensors should clearly mark any
|
||||
material not subject to the license. This includes other CC-
|
||||
licensed material, or material used under an exception or
|
||||
limitation to copyright. More considerations for licensors:
|
||||
wiki.creativecommons.org/Considerations_for_licensors
|
||||
|
||||
Creative Commons Attribution-ShareAlike 4.0 International Public
|
||||
License
|
||||
|
||||
By exercising the Licensed Rights (defined below), You accept and agree
|
||||
to be bound by the terms and conditions of this Creative Commons
|
||||
Attribution-ShareAlike 4.0 International Public License ("Public
|
||||
License"). To the extent this Public License may be interpreted as a
|
||||
contract, You are granted the Licensed Rights in consideration of Your
|
||||
acceptance of these terms and conditions, and the Licensor grants You
|
||||
such rights in consideration of benefits the Licensor receives from
|
||||
making the Licensed Material available under these terms and conditions.
|
||||
|
||||
Section 1 – Definitions.
|
||||
|
||||
a. Adapted Material means material subject to Copyright and Similar
|
||||
Rights that is derived from or based upon the Licensed Material
|
||||
and in which the Licensed Material is translated, altered,
|
||||
arranged, transformed, or otherwise modified in a manner requiring
|
||||
permission under the Copyright and Similar Rights held by the
|
||||
Licensor. For purposes of this Public License, where the Licensed
|
||||
Material is a musical work, performance, or sound recording,
|
||||
Adapted Material is always produced where the Licensed Material is
|
||||
synched in timed relation with a moving image.
|
||||
|
||||
b. Adapter's License means the license You apply to Your Copyright
|
||||
and Similar Rights in Your contributions to Adapted Material in
|
||||
accordance with the terms and conditions of this Public License.
|
||||
|
||||
c. Copyright and Similar Rights means copyright and/or similar rights
|
||||
closely related to copyright including, without limitation,
|
||||
publication, distribution, public performance, public display, and
|
||||
adaptation rights, and rights in database extensions and
|
||||
collections.
|
||||
|
||||
d. Licensed Material means the artistic or literary work, database,
|
||||
or other material to which the Licensor applied this Public
|
||||
License.
|
||||
|
||||
e. Licensed Rights means rights granted to You subject to the terms
|
||||
and conditions of this Public License, which are limited to all
|
||||
Copyright and Similar Rights that apply to Your use of the
|
||||
Licensed Material and that the Licensor has authority to license.
|
||||
|
||||
f. Licensor means the individual(s) or entity(ies) granting rights
|
||||
under this Public License.
|
||||
|
||||
g. Share means to provide material to the public by any means or
|
||||
process that requires permission under the Licensed Rights, such
|
||||
as reproduction, public display, public performance, distribution,
|
||||
dissemination, communication, or importation, and to make material
|
||||
available to the public including in ways that members of the
|
||||
public may access the material from a place and at a time
|
||||
individually chosen by them.
|
||||
|
||||
h. Sui Generis Database Rights means rights other than copyright
|
||||
resulting from Directive 96/9/EC of the European Parliament and
|
||||
of the Council of 11 March 1996 on the legal protection of
|
||||
databases, as amended and/or succeeded, as well as other
|
||||
essentially equivalent rights anywhere in the world.
|
||||
|
||||
i. You means the individual or entity exercising the Licensed Rights
|
||||
under this Public License. Your has a corresponding meaning.
|
||||
|
||||
Section 2 – Scope.
|
||||
|
||||
a. License grant.
|
||||
|
||||
1. Subject to the terms and conditions of this Public License,
|
||||
the Licensor hereby grants You a worldwide, royalty-free,
|
||||
non-sublicensable, non-exclusive, irrevocable license to
|
||||
exercise the Licensed Rights in the Licensed Material to:
|
||||
|
||||
a. reproduce and Share the Licensed Material, in whole or
|
||||
in part; and
|
||||
|
||||
b. produce, reproduce, and Share Adapted Material.
|
||||
|
||||
2. Exceptions and Limitations. For the avoidance of doubt,
|
||||
where Exceptions and Limitations apply to Your use, this
|
||||
Public License does not apply, and You do not need to
|
||||
comply with its terms and conditions.
|
||||
|
||||
3. Term. The term of this Public License is specified in
|
||||
Section 6(a).
|
||||
|
||||
4. Media and formats; technical modifications allowed. The
|
||||
Licensor authorizes You to exercise the Licensed Rights in
|
||||
all media and formats whether now known or hereafter created,
|
||||
and to make technical modifications necessary to do so. The
|
||||
Licensor waives and/or agrees not to assert any right or
|
||||
authority to forbid You from making technical modifications
|
||||
necessary to exercise the Licensed Rights, including
|
||||
technical modifications necessary to circumvent Effective
|
||||
Technological Measures. For purposes of this Public License,
|
||||
simply making modifications authorized by this Section 2(a)
|
||||
(4) never produces Adapted Material.
|
||||
|
||||
5. Downstream recipients.
|
||||
|
||||
a. Offer from the Licensor – Licensed Material. Every
|
||||
recipient of the Licensed Material automatically
|
||||
receives an offer from the Licensor to exercise the
|
||||
Licensed Rights under the terms and conditions of this
|
||||
Public License.
|
||||
|
||||
b. Additional offer from the Licensor – Adapted Material.
|
||||
Every recipient of Adapted Material from You
|
||||
automatically receives an offer from the Licensor to
|
||||
exercise the Licensed Rights in the Adapted Material
|
||||
under the conditions of the Adapter's License You
|
||||
apply.
|
||||
|
||||
6. No endorsement. Nothing in this Public License constitutes or
|
||||
may be construed as permission to assert or imply that You
|
||||
are, or that Your use of the Licensed Material is, connected
|
||||
with, or sponsored, endorsed, or granted official status by,
|
||||
the Licensor or others designated to receive attribution as
|
||||
provided in Section 3(a)(1)(A)(i).
|
||||
|
||||
b. Other rights. Moral rights, such as the right of integrity, are
|
||||
not licensed under this Public License, nor are publicity,
|
||||
privacy, and/or other similar personality rights; however, to the
|
||||
extent possible, the Licensor waives and/or agrees not to assert
|
||||
any such rights held by the Licensor to the limited extent
|
||||
necessary to allow You to exercise the Licensed Rights, but not
|
||||
otherwise.
|
||||
|
||||
c. Patent and trademark rights are not licensed under this Public
|
||||
License.
|
||||
|
||||
d. To the extent possible, the Licensor waives any right to collect
|
||||
royalties from You for the exercise of the Licensed Rights,
|
||||
whether directly or through a collecting society under any
|
||||
voluntary or waivable statutory or compulsory licensing scheme.
|
||||
In all other cases the Licensor expressly reserves any right to
|
||||
collect such royalties.
|
||||
|
||||
Section 3 – License Conditions.
|
||||
|
||||
Your exercise of the Licensed Rights is expressly made subject to
|
||||
the following conditions.
|
||||
|
||||
a. Attribution.
|
||||
|
||||
1. If You Share the Licensed Material (including in modified
|
||||
form), You must:
|
||||
|
||||
a. retain the following if it is supplied by the
|
||||
Licensor with the Licensed Material:
|
||||
|
||||
i. identification of the creator(s) of the
|
||||
Licensed Material and any others designated to
|
||||
receive attribution, in any reasonable manner
|
||||
requested by the Licensor (including by
|
||||
pseudonym if designated);
|
||||
|
||||
ii. a copyright notice;
|
||||
|
||||
iii. a notice that refers to this Public License;
|
||||
|
||||
iv. a notice that refers to the disclaimer of
|
||||
warranties;
|
||||
|
||||
v. a URI or hyperlink to the Licensed Material to
|
||||
the extent reasonably practicable;
|
||||
|
||||
b. indicate if You modified the Licensed Material and
|
||||
retain an indication of any previous modifications; and
|
||||
|
||||
c. indicate the Licensed Material is licensed under this
|
||||
Public License, and include the text of, or the URI
|
||||
or hyperlink to, this Public License.
|
||||
|
||||
2. You may satisfy the conditions in Section 3(a)(1) in any
|
||||
reasonable manner based on the medium, means, and context in
|
||||
which You Share the Licensed Material. For example, it may
|
||||
be reasonable to satisfy the conditions by providing a URI
|
||||
or hyperlink to a resource that includes the required
|
||||
information.
|
||||
|
||||
3. If requested by the Licensor, You must remove any of the
|
||||
information required by Section 3(a)(1)(A) to the extent
|
||||
reasonably practicable.
|
||||
|
||||
4. If You Share Adapted Material You produce, the Adapter's
|
||||
License You apply must not prevent recipients of the
|
||||
Adapted Material from complying with this Public License.
|
||||
|
||||
b. ShareAlike.
|
||||
|
||||
In addition to the conditions in Section 3(a), if You Share
|
||||
Adapted Material You produce, the following conditions also apply.
|
||||
|
||||
1. The Adapter's License You apply must be a Creative Commons
|
||||
license with the same License Elements, this version or
|
||||
later, or a BY-SA Compatible License.
|
||||
|
||||
2. You must include the text of, or the URI or hyperlink to,
|
||||
the Adapter's License You apply. You may satisfy this
|
||||
condition in any reasonable manner based on the medium,
|
||||
means, and context in which You Share Adapted Material.
|
||||
|
||||
3. You may not offer or impose any additional or different terms
|
||||
or conditions on, or apply any Effective Technological
|
||||
Measures to, Adapted Material that restrict exercise of the
|
||||
rights granted under the Adapter's License You apply.
|
||||
|
||||
Section 4 – Sui Generis Database Rights.
|
||||
|
||||
Where the Licensed Rights include Sui Generis Database Rights that
|
||||
apply to Your use of the Licensed Material:
|
||||
|
||||
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
|
||||
to extract, reuse, reproduce, and Share all or a substantial
|
||||
portion of the contents of the database;
|
||||
|
||||
b. if You include all or a substantial portion of the database
|
||||
contents in a database in which You have Sui Generis Database
|
||||
Rights, then the database in which You have Sui Generis Database
|
||||
Rights (but not its individual contents) is Adapted Material; and
|
||||
|
||||
c. You must comply with the conditions in Section 3(a) if You Share
|
||||
all or a substantial portion of the contents of the database.
|
||||
|
||||
For the avoidance of doubt, this Section 4 supplements and does not
|
||||
replace Your obligations under this Public License where the Licensed
|
||||
Rights include other Copyright and Similar Rights.
|
||||
|
||||
Section 5 – Disclaimer of Warranties and Limitation of Liability.
|
||||
|
||||
a. Unless otherwise separately undertaken by the Licensor, to the
|
||||
extent possible, the Licensor offers the Licensed Material as-is
|
||||
and as-available, and makes no representations or warranties of
|
||||
any kind concerning the Licensed Material, whether express,
|
||||
implied, statutory, or other. This includes, without limitation,
|
||||
warranties of title, merchantability, fitness for a particular
|
||||
purpose, non-infringement, absence of latent or other defects,
|
||||
accuracy, or the presence or absence of errors, whether or not
|
||||
known or discoverable. Where disclaimers of warranties are not
|
||||
allowed in full or in part, this disclaimer may not apply to You.
|
||||
|
||||
b. To the extent possible, in no event will the Licensor be liable
|
||||
to You on any legal theory (including, without limitation,
|
||||
negligence) or otherwise for any direct, special, indirect,
|
||||
incidental, consequential, punitive, exemplary, or other losses,
|
||||
costs, expenses, or damages that arise out of this Public License
|
||||
or use of the Licensed Material, even if the Licensor has been
|
||||
advised of the possibility of such losses, costs, expenses, or
|
||||
damages. Where a limitation of liability is not allowed in full
|
||||
or in part, this limitation may not apply to You.
|
||||
|
||||
c. The disclaimer of warranties and limitation of liability provided
|
||||
above shall be interpreted in a manner that, to the extent
|
||||
possible, most closely approximates an absolute disclaimer and
|
||||
waiver of all liability.
|
||||
|
||||
Section 6 – Term and Termination.
|
||||
|
||||
a. This Public License applies for the term of the Copyright and
|
||||
Similar Rights licensed here. However, if You fail to comply
|
||||
with this Public License, then Your rights under this Public
|
||||
License terminate automatically.
|
||||
|
||||
b. Where Your right to use the Licensed Material has terminated
|
||||
under Section 6(a), it reinstates:
|
||||
|
||||
1. automatically as of the date the violation is cured,
|
||||
provided it is cured within 30 days of Your discovery of
|
||||
the violation; or
|
||||
|
||||
2. upon express reinstatement by the Licensor.
|
||||
|
||||
For the avoidance of doubt, this Section 6(b) does not affect any
|
||||
right the Licensor may have to seek remedies for Your violations
|
||||
of this Public License.
|
||||
|
||||
c. For the avoidance of doubt, the Licensor may also offer the
|
||||
Licensed Material under separate terms or conditions or stop
|
||||
distributing the Licensed Material at any time; however, doing so
|
||||
will not terminate this Public License.
|
||||
|
||||
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
|
||||
License.
|
||||
|
||||
Section 7 – Other Terms and Conditions.
|
||||
|
||||
a. The Licensor shall not be bound by any additional or different
|
||||
terms or conditions communicated by You unless expressly agreed.
|
||||
|
||||
b. Any arrangements, understandings, or agreements regarding the
|
||||
Licensed Material not stated herein are separate from and
|
||||
independent of the terms and conditions of this Public License.
|
||||
|
||||
Section 8 – Interpretation.
|
||||
|
||||
a. For the avoidance of doubt, this Public License does not, and
|
||||
shall not be interpreted to, reduce, limit, restrict, or impose
|
||||
conditions on any use of the Licensed Material that could lawfully
|
||||
be made without permission under this Public License.
|
||||
|
||||
b. To the extent possible, if any provision of this Public License
|
||||
is deemed unenforceable, it shall be automatically reformed to
|
||||
the minimum extent necessary to make it enforceable. If the
|
||||
provision cannot be reformed, it shall be severed from this
|
||||
Public License without affecting the enforceability of the
|
||||
remaining terms and conditions.
|
||||
|
||||
c. No term or condition of this Public License will be waived and
|
||||
no failure to comply consented to unless expressly agreed to by
|
||||
the Licensor.
|
||||
|
||||
d. Nothing in this Public License constitutes or may be interpreted
|
||||
as a limitation upon, or waiver of, any privileges and immunities
|
||||
that apply to the Licensor or You, including from the legal
|
||||
processes of any jurisdiction or authority.
|
||||
|
||||
=======================================================================
|
||||
|
||||
Creative Commons is not a party to its public licenses. Notwithstanding,
|
||||
Creative Commons may elect to apply one of its public licenses to
|
||||
material it publishes and in those instances will be considered the
|
||||
"Licensor." The text of the Creative Commons public licenses is
|
||||
dedicated to the public domain under the CC0 Public Domain Dedication.
|
||||
The text of the Creative Commons public licenses is dedicated to the
|
||||
public domain under the CC0 Public Domain Dedication. Except for the
|
||||
limited purpose of indicating that material is shared under a Creative
|
||||
Commons public license or as otherwise permitted by the Creative Commons
|
||||
policies published at creativecommons.org/policies, Creative Commons
|
||||
does not authorize the use of the trademark "Creative Commons" or any
|
||||
other trademark or logo of Creative Commons without its prior written
|
||||
consent including, without limitation, in connection with any
|
||||
unauthorized modifications to any of its public licenses or any other
|
||||
arrangements, understandings, or agreements concerning use of licensed
|
||||
material. For the avoidance of doubt, this paragraph does not form part
|
||||
of the public licenses.
|
||||
|
||||
Creative Commons may be contacted at creativecommons.org.
|
||||
|
||||
=======================================================================
|
||||
|
||||
For the GNS3 Web UI documentation:
|
||||
|
||||
- Documentation License: CC BY-SA 4.0
|
||||
- Project License: GPLv3 (see root LICENSE file)
|
||||
- License URL: https://creativecommons.org/licenses/by-sa/4.0/
|
||||
|
||||
All documentation files in this directory are licensed under the
|
||||
Creative Commons Attribution-ShareAlike 4.0 International License
|
||||
(CC BY-SA 4.0).
|
||||
|
||||
=======================================================================
|
||||
|
||||
IMPORTANT: ShareAlike Requirements for Software Derivatives
|
||||
|
||||
Under the CC BY-SA 4.0 ShareAlike condition, if you create derivative
|
||||
works based on this documentation, including software that is considered
|
||||
a derivative of the documentation, you must:
|
||||
|
||||
1. **License your derivative work under CC BY-SA 4.0 or a compatible
|
||||
license** (such as GPLv3, which is compatible with CC BY-SA 4.0)
|
||||
|
||||
2. **Attribute the original documentation** to the GNS3 Web UI Project
|
||||
|
||||
3. **Indicate if you modified the documentation** and retain
|
||||
indications of previous modifications
|
||||
|
||||
4. **Include the license notice** and link to the CC BY-SA 4.0 license
|
||||
|
||||
What constitutes a derivative work:
|
||||
- Translations of the documentation
|
||||
- Adaptations, modifications, or enhancements to the documentation
|
||||
- Software that incorporates substantial portions of the documentation
|
||||
- Works based on the documentation's structure, organization, or content
|
||||
|
||||
Compatible licenses include:
|
||||
- CC BY-SA 4.0 or later
|
||||
- GPLv3 (GNU General Public License version 3)
|
||||
- AGPLv3 (GNU Affero General Public License version 3)
|
||||
- Other licenses approved as compatible by Creative Commons
|
||||
|
||||
For more information on CC BY-SA compatibility, see:
|
||||
https://creativecommons.org/compatiblelicenses
|
||||
|
||||
If you are unsure whether your use constitutes a derivative work or
|
||||
which license to apply, please consult the full CC BY-SA 4.0 license
|
||||
text above or seek legal advice.
|
||||
177
docs/Makefile
Normal file
177
docs/Makefile
Normal file
@ -0,0 +1,177 @@
|
||||
# Makefile for Sphinx documentation
|
||||
#
|
||||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXOPTS =
|
||||
SPHINXBUILD = sphinx-build
|
||||
PAPER =
|
||||
BUILDDIR = _build
|
||||
|
||||
# User-friendly check for sphinx-build
|
||||
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
|
||||
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
|
||||
endif
|
||||
|
||||
# Internal variables.
|
||||
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||
PAPEROPT_letter = -D latex_paper_size=letter
|
||||
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||
# the i18n builder cannot share the environment and doctrees with the others
|
||||
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||
|
||||
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
|
||||
|
||||
help:
|
||||
@echo "Please use \`make <target>' where <target> is one of"
|
||||
@echo " html to make standalone HTML files"
|
||||
@echo " dirhtml to make HTML files named index.html in directories"
|
||||
@echo " singlehtml to make a single large HTML file"
|
||||
@echo " pickle to make pickle files"
|
||||
@echo " json to make JSON files"
|
||||
@echo " htmlhelp to make HTML files and a HTML help project"
|
||||
@echo " qthelp to make HTML files and a qthelp project"
|
||||
@echo " devhelp to make HTML files and a Devhelp project"
|
||||
@echo " epub to make an epub"
|
||||
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
||||
@echo " latexpdf to make LaTeX files and run them through pdflatex"
|
||||
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
|
||||
@echo " text to make text files"
|
||||
@echo " man to make manual pages"
|
||||
@echo " texinfo to make Texinfo files"
|
||||
@echo " info to make Texinfo files and run them through makeinfo"
|
||||
@echo " gettext to make PO message catalogs"
|
||||
@echo " changes to make an overview of all changed/added/deprecated items"
|
||||
@echo " xml to make Docutils-native XML files"
|
||||
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
|
||||
@echo " linkcheck to check all external links for integrity"
|
||||
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
|
||||
|
||||
clean:
|
||||
rm -rf $(BUILDDIR)/*
|
||||
|
||||
html:
|
||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||
|
||||
dirhtml:
|
||||
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
|
||||
|
||||
singlehtml:
|
||||
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
|
||||
|
||||
pickle:
|
||||
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
|
||||
@echo
|
||||
@echo "Build finished; now you can process the pickle files."
|
||||
|
||||
json:
|
||||
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
|
||||
@echo
|
||||
@echo "Build finished; now you can process the JSON files."
|
||||
|
||||
htmlhelp:
|
||||
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
||||
".hhp project file in $(BUILDDIR)/htmlhelp."
|
||||
|
||||
qthelp:
|
||||
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
||||
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
||||
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/GNS3.qhcp"
|
||||
@echo "To view the help file:"
|
||||
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/GNS3.qhc"
|
||||
|
||||
devhelp:
|
||||
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
||||
@echo
|
||||
@echo "Build finished."
|
||||
@echo "To view the help file:"
|
||||
@echo "# mkdir -p $$HOME/.local/share/devhelp/GNS3"
|
||||
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/GNS3"
|
||||
@echo "# devhelp"
|
||||
|
||||
epub:
|
||||
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
|
||||
@echo
|
||||
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
|
||||
|
||||
latex:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo
|
||||
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
|
||||
@echo "Run \`make' in that directory to run these through (pdf)latex" \
|
||||
"(use \`make latexpdf' here to do that automatically)."
|
||||
|
||||
latexpdf:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo "Running LaTeX files through pdflatex..."
|
||||
$(MAKE) -C $(BUILDDIR)/latex all-pdf
|
||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||
|
||||
latexpdfja:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo "Running LaTeX files through platex and dvipdfmx..."
|
||||
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
|
||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||
|
||||
text:
|
||||
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
|
||||
@echo
|
||||
@echo "Build finished. The text files are in $(BUILDDIR)/text."
|
||||
|
||||
man:
|
||||
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
||||
@echo
|
||||
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
||||
|
||||
texinfo:
|
||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||
@echo
|
||||
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
|
||||
@echo "Run \`make' in that directory to run these through makeinfo" \
|
||||
"(use \`make info' here to do that automatically)."
|
||||
|
||||
info:
|
||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||
@echo "Running Texinfo files through makeinfo..."
|
||||
make -C $(BUILDDIR)/texinfo info
|
||||
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
|
||||
|
||||
gettext:
|
||||
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
|
||||
@echo
|
||||
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
|
||||
|
||||
changes:
|
||||
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
|
||||
@echo
|
||||
@echo "The overview file is in $(BUILDDIR)/changes."
|
||||
|
||||
linkcheck:
|
||||
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
|
||||
@echo
|
||||
@echo "Link check complete; look for any errors in the above output " \
|
||||
"or in $(BUILDDIR)/linkcheck/output.txt."
|
||||
|
||||
doctest:
|
||||
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
|
||||
@echo "Testing of doctests in the sources finished, look at the " \
|
||||
"results in $(BUILDDIR)/doctest/output.txt."
|
||||
|
||||
xml:
|
||||
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
|
||||
@echo
|
||||
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
|
||||
|
||||
pseudoxml:
|
||||
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
|
||||
@echo
|
||||
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
|
||||
120
docs/README.md
120
docs/README.md
@ -1,120 +0,0 @@
|
||||
<!--
|
||||
SPDX-License-Identifier: CC-BY-SA-4.0
|
||||
See LICENSE file for licensing information.
|
||||
-->
|
||||
|
||||
> This documentation is organized by AI with reference to actual code. AI can make mistakes — please verify against the source code when in doubt.
|
||||
|
||||
# GNS3 Server Documentation
|
||||
|
||||
---
|
||||
|
||||
## License
|
||||
|
||||
This documentation is licensed under the **Creative Commons Attribution-ShareAlike 4.0 International License (CC BY-SA 4.0)**.
|
||||
|
||||
⚠️ **Important - ShareAlike Requirement**: If you create derivative works based on this documentation (including software that incorporates substantial portions of the documentation), your work must also be licensed under **CC BY-SA 4.0 or a compatible license** (such as GPLv3).
|
||||
|
||||
- 📄 **Full License Text**: See [docs/LICENSE](./LICENSE)
|
||||
- 🔗 **License URL**: https://creativecommons.org/licenses/by-sa/4.0/
|
||||
- 📖 **Compatibility**: https://creativecommons.org/compatiblelicenses
|
||||
|
||||
**Dual License Structure**:
|
||||
- 📚 **Documentation**: CC BY-SA 4.0 (this directory)
|
||||
- 💻 **Software Code**: GPLv3 (see root [LICENSE](../LICENSE))
|
||||
|
||||
---
|
||||
|
||||
Technical documentation for the GNS3 server project, covering features, AI Copilot, development setup, and known issues.
|
||||
|
||||
## Directory Structure
|
||||
|
||||
```
|
||||
docs/
|
||||
├── README.md # This file
|
||||
├── development-setup.md # Ubuntu 24.04 development environment setup
|
||||
├── openapi.json # OpenAPI specification
|
||||
├── features/ # Feature documentation
|
||||
│ ├── compute-controller-setup.md # Controller + Compute architecture & configuration
|
||||
│ ├── statistics-api.md # Aggregated statistics API for monitoring
|
||||
│ ├── vnc-websocket-console.md # Browser-based VNC console via WebSocket
|
||||
│ └── web-wireshark-business-process.md # Web Wireshark (Docker + xpra packet capture)
|
||||
├── gns3-copilot/ # AI Copilot feature documentation
|
||||
│ ├── netmiko_devices.md # Netmiko supported devices (366 types)
|
||||
│ ├── template-based-configuration-roadmap.md # Future: template-based config with HITL
|
||||
│ └── implemented/ # Implemented features
|
||||
│ ├── chat-api.md # Chat API (SSE, session management)
|
||||
│ ├── llm-model-configs.md # LLM model configuration system
|
||||
│ ├── command-security.md # Command security and filtering
|
||||
│ ├── context-window-management.md # Context window optimization
|
||||
│ ├── node-control-tools.md # Node start/stop/suspend tools
|
||||
│ └── multi-vendor-device-support.md # Multi-vendor device support
|
||||
└── bugs/ # Known issues & bug reports
|
||||
└── telnet-server-connection-race-condition.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Features
|
||||
|
||||
### Controller + Compute Setup (`features/compute-controller-setup.md`)
|
||||
Architecture and minimum configuration for setting up GNS3 Controller with remote Compute nodes. Covers compute node config, controller registration, and multi-compute deployment.
|
||||
|
||||
### Statistics API (`features/statistics-api.md`)
|
||||
Aggregated server statistics API (`GET /v3/statistics`) for monitoring dashboards. Collects compute resources, project/node/link counts, and Web Wireshark container status in a single request.
|
||||
|
||||
### VNC WebSocket Console (`features/vnc-websocket-console.md`)
|
||||
Browser-based VNC console access via WebSocket. The Controller acts as WebSocket-to-WebSocket relay, and Compute bridges WebSocket to TCP for QEMU/Docker VMs. Supports noVNC clients.
|
||||
|
||||
### API Error Responses (`features/api-error-responses.md`)
|
||||
Unified error response format across all GNS3 API endpoints. Documents HTTP status codes, error types, and client-side error handling patterns.
|
||||
|
||||
### Web Wireshark (`features/web-wireshark-business-process.md`)
|
||||
Web-based packet capture analysis using Docker + xpra HTML5 client. Zero-install Wireshark experience directly in the browser, integrated with GNS3 topologies.
|
||||
|
||||
---
|
||||
|
||||
## GNS3 AI Copilot (`gns3-copilot/`)
|
||||
|
||||
### Implemented Features
|
||||
|
||||
| Feature | Description | Status |
|
||||
|---------|-------------|--------|
|
||||
| [Chat API](gns3-copilot/implemented/chat-api.md) | SSE streaming, session management, token statistics | Implemented |
|
||||
| [LLM Model Configs](gns3-copilot/implemented/llm-model-configs.md) | Multi-level model config (system/group/user) | Implemented |
|
||||
| [Command Security](gns3-copilot/implemented/command-security.md) | Command filtering, dangerous operation detection, HITL | Implemented |
|
||||
| [Context Window Management](gns3-copilot/implemented/context-window-management.md) | Token optimization, content filtering, compression | Implemented |
|
||||
| [Node Control Tools](gns3-copilot/implemented/node-control-tools.md) | Start/stop/suspend with batch ops and progress tracking | Implemented |
|
||||
| [Multi-Vendor Support](gns3-copilot/implemented/multi-vendor-device-support.md) | Cisco, Huawei, Ruijie, VPCS with custom Netmiko drivers | Implemented |
|
||||
|
||||
### Reference
|
||||
|
||||
- [Netmiko Supported Devices](gns3-copilot/netmiko_devices.md) — 366 device types (154 SSH, 55 Telnet, 3 custom GNS3 drivers)
|
||||
|
||||
### Roadmap
|
||||
|
||||
- [Template-Based Configuration with HITL](gns3-copilot/template-based-configuration-roadmap.md) — Jinja2 templates with human-in-the-loop confirmations for device configuration and node creation
|
||||
|
||||
---
|
||||
|
||||
## Known Issues (`bugs/`)
|
||||
|
||||
- [Telnet Server Connection Race Condition](bugs/telnet-server-connection-race-condition.md) — `getpeername()` error when client disconnects during connection setup (High severity, Open)
|
||||
|
||||
---
|
||||
|
||||
## Development Setup (`development-setup.md`)
|
||||
|
||||
Quick-start guide for Ubuntu 24.04: install via PPA, set up dependencies, and run gns3-server from source.
|
||||
|
||||
---
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- [GNS3 Server API Documentation](https://api.gns3.com/) — Interactive API docs (also available locally via `redoc.html`)
|
||||
- [GNS3 Web UI Documentation](https://docs.gns3.com/)
|
||||
- [LangGraph Documentation](https://langchain-ai.github.io/langgraph/)
|
||||
|
||||
---
|
||||
|
||||
_Last updated: 2026-04-20_
|
||||
14
docs/api/examples/compute_delete_projectsprojectid.txt
Normal file
14
docs/api/examples/compute_delete_projectsprojectid.txt
Normal file
@ -0,0 +1,14 @@
|
||||
curl -i -X DELETE 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80'
|
||||
|
||||
DELETE /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80 HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:26:17 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X DELETE 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/cloud/nodes/a022e62a-a40b-42a5-8efd-3d8141806276'
|
||||
|
||||
DELETE /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/cloud/nodes/a022e62a-a40b-42a5-8efd-3d8141806276 HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:25:49 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/cloud/nodes/{node_id}
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X DELETE 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/cloud/nodes/8a5e5e38-6a8a-408a-9d8c-31315e11d6f2/adapters/0/ports/0/nio'
|
||||
|
||||
DELETE /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/cloud/nodes/8a5e5e38-6a8a-408a-9d8c-31315e11d6f2/adapters/0/ports/0/nio HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:25:43 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/cloud/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X DELETE 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/docker/nodes/c5e6e56f-2698-4bae-9365-0a9f9efd3418/adapters/0/ports/0/nio'
|
||||
|
||||
DELETE /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/docker/nodes/c5e6e56f-2698-4bae-9365-0a9f9efd3418/adapters/0/ports/0/nio HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:25:50 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/docker/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X DELETE 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/iou/nodes/81f7488a-6a28-46f0-8b26-331906bdcf2e'
|
||||
|
||||
DELETE /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/iou/nodes/81f7488a-6a28-46f0-8b26-331906bdcf2e HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:25:57 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/iou/nodes/{node_id}
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X DELETE 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/iou/nodes/04e77370-e8a1-4c6c-9c2a-d7d9076a6f63/adapters/1/ports/0/nio'
|
||||
|
||||
DELETE /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/iou/nodes/04e77370-e8a1-4c6c-9c2a-d7d9076a6f63/adapters/1/ports/0/nio HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:25:59 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/iou/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X DELETE 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/nat/nodes/b77c05e8-dd60-4772-aedf-066339baee14'
|
||||
|
||||
DELETE /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/nat/nodes/b77c05e8-dd60-4772-aedf-066339baee14 HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:26:16 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/nat/nodes/{node_id}
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X DELETE 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/nat/nodes/bd5f949e-b288-4e5f-97c7-f6a053898140/adapters/0/ports/0/nio'
|
||||
|
||||
DELETE /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/nat/nodes/bd5f949e-b288-4e5f-97c7-f6a053898140/adapters/0/ports/0/nio HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:26:10 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/nat/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X DELETE 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/55307537-62a4-48ab-ac1c-ebd998794120'
|
||||
|
||||
DELETE /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/55307537-62a4-48ab-ac1c-ebd998794120 HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:26:40 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/qemu/nodes/{node_id}
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X DELETE 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/ab332598-68ef-4ef6-bb29-d2f31a961273/adapters/1/ports/0/nio'
|
||||
|
||||
DELETE /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/ab332598-68ef-4ef6-bb29-d2f31a961273/adapters/1/ports/0/nio HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:26:50 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/qemu/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X DELETE 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/traceng/nodes/36979ca4-4892-4b3e-9202-2143e261d128'
|
||||
|
||||
DELETE /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/traceng/nodes/36979ca4-4892-4b3e-9202-2143e261d128 HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:27:26 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/traceng/nodes/{node_id}
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X DELETE 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/traceng/nodes/09736166-0e3a-4fe5-b914-72151a6362e2/adapters/0/ports/0/nio'
|
||||
|
||||
DELETE /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/traceng/nodes/09736166-0e3a-4fe5-b914-72151a6362e2/adapters/0/ports/0/nio HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:27:26 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/traceng/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X DELETE 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/virtualbox/nodes/a0d3abeb-9538-4660-a6e5-677822f8f943/adapters/0/ports/0/nio'
|
||||
|
||||
DELETE /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/virtualbox/nodes/a0d3abeb-9538-4660-a6e5-677822f8f943/adapters/0/ports/0/nio HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:27:28 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/virtualbox/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X DELETE 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/vmware/nodes/90f57222-bdca-4d92-867c-de3f945f83f5/adapters/0/ports/0/nio'
|
||||
|
||||
DELETE /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/vmware/nodes/90f57222-bdca-4d92-867c-de3f945f83f5/adapters/0/ports/0/nio HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:27:42 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/vmware/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X DELETE 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/vpcs/nodes/f84fd457-cc5c-4eb9-88b8-3ac691d1fe52'
|
||||
|
||||
DELETE /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/vpcs/nodes/f84fd457-cc5c-4eb9-88b8-3ac691d1fe52 HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:27:48 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/vpcs/nodes/{node_id}
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X DELETE 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/vpcs/nodes/358e43b9-c971-4a31-a42a-b62d18342bc6/adapters/0/ports/0/nio'
|
||||
|
||||
DELETE /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/vpcs/nodes/358e43b9-c971-4a31-a42a-b62d18342bc6/adapters/0/ports/0/nio HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:27:48 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/vpcs/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio
|
||||
|
||||
34
docs/api/examples/compute_get_capabilities.txt
Normal file
34
docs/api/examples/compute_get_capabilities.txt
Normal file
@ -0,0 +1,34 @@
|
||||
curl -i -X GET 'http://localhost:3080/v2/compute/capabilities'
|
||||
|
||||
GET /v2/compute/capabilities HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 366
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:25:43 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/capabilities
|
||||
|
||||
{
|
||||
"node_types": [
|
||||
"cloud",
|
||||
"ethernet_hub",
|
||||
"ethernet_switch",
|
||||
"nat",
|
||||
"vpcs",
|
||||
"virtualbox",
|
||||
"dynamips",
|
||||
"frame_relay_switch",
|
||||
"atm_switch",
|
||||
"qemu",
|
||||
"vmware",
|
||||
"traceng",
|
||||
"docker",
|
||||
"iou"
|
||||
],
|
||||
"platform": "linuxdebian",
|
||||
"version": "2.2.4dev1"
|
||||
}
|
||||
22
docs/api/examples/compute_get_iouimages.txt
Normal file
22
docs/api/examples/compute_get_iouimages.txt
Normal file
@ -0,0 +1,22 @@
|
||||
curl -i -X GET 'http://localhost:3080/v2/compute/iou/images'
|
||||
|
||||
GET /v2/compute/iou/images HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 149
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:25:59 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/iou/images
|
||||
|
||||
[
|
||||
{
|
||||
"filename": "iou.bin",
|
||||
"filesize": 7,
|
||||
"md5sum": "e573e8f5c93c6c00783f20c7a170aa6c",
|
||||
"path": "iou.bin"
|
||||
}
|
||||
]
|
||||
79
docs/api/examples/compute_get_networkinterfaces.txt
Normal file
79
docs/api/examples/compute_get_networkinterfaces.txt
Normal file
@ -0,0 +1,79 @@
|
||||
curl -i -X GET 'http://localhost:3080/v2/compute/network/interfaces'
|
||||
|
||||
GET /v2/compute/network/interfaces HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 1601
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:26:16 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/network/interfaces
|
||||
|
||||
[
|
||||
{
|
||||
"id": "docker0",
|
||||
"ip_address": "172.17.0.1",
|
||||
"mac_address": "02:42:0f:c7:42:69",
|
||||
"name": "docker0",
|
||||
"netmask": "255.255.0.0",
|
||||
"special": true,
|
||||
"type": "ethernet"
|
||||
},
|
||||
{
|
||||
"id": "lo",
|
||||
"ip_address": "127.0.0.1",
|
||||
"mac_address": "00:00:00:00:00:00",
|
||||
"name": "lo",
|
||||
"netmask": "255.0.0.0",
|
||||
"special": true,
|
||||
"type": "ethernet"
|
||||
},
|
||||
{
|
||||
"id": "virbr0",
|
||||
"ip_address": "192.168.122.1",
|
||||
"mac_address": "52:54:00:d4:71:01",
|
||||
"name": "virbr0",
|
||||
"netmask": "255.255.255.0",
|
||||
"special": true,
|
||||
"type": "ethernet"
|
||||
},
|
||||
{
|
||||
"id": "virbr0-nic",
|
||||
"ip_address": "",
|
||||
"mac_address": "52:54:00:d4:71:01",
|
||||
"name": "virbr0-nic",
|
||||
"netmask": "",
|
||||
"special": true,
|
||||
"type": "ethernet"
|
||||
},
|
||||
{
|
||||
"id": "vmnet1",
|
||||
"ip_address": "172.16.9.1",
|
||||
"mac_address": "00:50:56:c0:00:01",
|
||||
"name": "vmnet1",
|
||||
"netmask": "255.255.255.0",
|
||||
"special": true,
|
||||
"type": "ethernet"
|
||||
},
|
||||
{
|
||||
"id": "vmnet8",
|
||||
"ip_address": "192.168.193.1",
|
||||
"mac_address": "00:50:56:c0:00:08",
|
||||
"name": "vmnet8",
|
||||
"netmask": "255.255.255.0",
|
||||
"special": true,
|
||||
"type": "ethernet"
|
||||
},
|
||||
{
|
||||
"id": "wlp2s0",
|
||||
"ip_address": "192.168.1.175",
|
||||
"mac_address": "9c:b6:d0:99:3c:07",
|
||||
"name": "wlp2s0",
|
||||
"netmask": "255.255.255.0",
|
||||
"special": false,
|
||||
"type": "ethernet"
|
||||
}
|
||||
]
|
||||
26
docs/api/examples/compute_get_projects.txt
Normal file
26
docs/api/examples/compute_get_projects.txt
Normal file
@ -0,0 +1,26 @@
|
||||
curl -i -X GET 'http://localhost:3080/v2/compute/projects'
|
||||
|
||||
GET /v2/compute/projects HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 252
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:26:17 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects
|
||||
|
||||
[
|
||||
{
|
||||
"name": "test",
|
||||
"project_id": "51010203-0405-0607-0809-0a0b0c0d0e0f",
|
||||
"variables": null
|
||||
},
|
||||
{
|
||||
"name": "test",
|
||||
"project_id": "52010203-0405-0607-0809-0a0b0c0d0e0b",
|
||||
"variables": null
|
||||
}
|
||||
]
|
||||
19
docs/api/examples/compute_get_projectsprojectid.txt
Normal file
19
docs/api/examples/compute_get_projectsprojectid.txt
Normal file
@ -0,0 +1,19 @@
|
||||
curl -i -X GET 'http://localhost:3080/v2/compute/projects/40010203-0405-0607-0809-0a0b0c0d0e02'
|
||||
|
||||
GET /v2/compute/projects/40010203-0405-0607-0809-0a0b0c0d0e02 HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 103
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:26:17 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}
|
||||
|
||||
{
|
||||
"name": "test",
|
||||
"project_id": "40010203-0405-0607-0809-0a0b0c0d0e02",
|
||||
"variables": null
|
||||
}
|
||||
@ -0,0 +1,70 @@
|
||||
curl -i -X GET 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/cloud/nodes/75228bef-1806-41fc-8b73-1c5752870ac6'
|
||||
|
||||
GET /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/cloud/nodes/75228bef-1806-41fc-8b73-1c5752870ac6 HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 1406
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:25:43 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/cloud/nodes/{node_id}
|
||||
|
||||
{
|
||||
"interfaces": [
|
||||
{
|
||||
"name": "docker0",
|
||||
"special": true,
|
||||
"type": "ethernet"
|
||||
},
|
||||
{
|
||||
"name": "lo",
|
||||
"special": true,
|
||||
"type": "ethernet"
|
||||
},
|
||||
{
|
||||
"name": "virbr0",
|
||||
"special": true,
|
||||
"type": "ethernet"
|
||||
},
|
||||
{
|
||||
"name": "virbr0-nic",
|
||||
"special": true,
|
||||
"type": "ethernet"
|
||||
},
|
||||
{
|
||||
"name": "vmnet1",
|
||||
"special": true,
|
||||
"type": "ethernet"
|
||||
},
|
||||
{
|
||||
"name": "vmnet8",
|
||||
"special": true,
|
||||
"type": "ethernet"
|
||||
},
|
||||
{
|
||||
"name": "wlp2s0",
|
||||
"special": false,
|
||||
"type": "ethernet"
|
||||
}
|
||||
],
|
||||
"name": "Cloud 1",
|
||||
"node_directory": "/tmp/pytest-of-grossmj/pytest-41/test_json4/project-files/builtin/75228bef-1806-41fc-8b73-1c5752870ac6",
|
||||
"node_id": "75228bef-1806-41fc-8b73-1c5752870ac6",
|
||||
"ports_mapping": [
|
||||
{
|
||||
"interface": "wlp2s0",
|
||||
"name": "wlp2s0",
|
||||
"port_number": 0,
|
||||
"type": "ethernet"
|
||||
}
|
||||
],
|
||||
"project_id": "a1e920ca-338a-4e9f-b363-aa607b09dd80",
|
||||
"remote_console_host": "",
|
||||
"remote_console_http_path": "/",
|
||||
"remote_console_port": 23,
|
||||
"remote_console_type": "none",
|
||||
"status": "started"
|
||||
}
|
||||
@ -0,0 +1,34 @@
|
||||
curl -i -X GET 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/iou/nodes/a4155e63-9b40-4c8e-bbbc-d93aad187b07'
|
||||
|
||||
GET /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/iou/nodes/a4155e63-9b40-4c8e-bbbc-d93aad187b07 HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 631
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:25:57 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/iou/nodes/{node_id}
|
||||
|
||||
{
|
||||
"application_id": 1,
|
||||
"command_line": "",
|
||||
"console": 5004,
|
||||
"console_type": "telnet",
|
||||
"ethernet_adapters": 2,
|
||||
"l1_keepalives": false,
|
||||
"md5sum": "e573e8f5c93c6c00783f20c7a170aa6c",
|
||||
"name": "PC TEST 1",
|
||||
"node_directory": "/tmp/pytest-of-grossmj/pytest-41/test_json4/project-files/iou/a4155e63-9b40-4c8e-bbbc-d93aad187b07",
|
||||
"node_id": "a4155e63-9b40-4c8e-bbbc-d93aad187b07",
|
||||
"nvram": 128,
|
||||
"path": "iou.bin",
|
||||
"project_id": "a1e920ca-338a-4e9f-b363-aa607b09dd80",
|
||||
"ram": 256,
|
||||
"serial_adapters": 2,
|
||||
"status": "stopped",
|
||||
"usage": "",
|
||||
"use_default_iou_values": true
|
||||
}
|
||||
@ -0,0 +1,28 @@
|
||||
curl -i -X GET 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/nat/nodes/f76e8c5c-0a0c-451d-a4ba-f01286d06a16'
|
||||
|
||||
GET /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/nat/nodes/f76e8c5c-0a0c-451d-a4ba-f01286d06a16 HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 335
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:26:09 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/nat/nodes/{node_id}
|
||||
|
||||
{
|
||||
"name": "Nat 1",
|
||||
"node_id": "f76e8c5c-0a0c-451d-a4ba-f01286d06a16",
|
||||
"ports_mapping": [
|
||||
{
|
||||
"interface": "virbr0",
|
||||
"name": "nat0",
|
||||
"port_number": 0,
|
||||
"type": "ethernet"
|
||||
}
|
||||
],
|
||||
"project_id": "a1e920ca-338a-4e9f-b363-aa607b09dd80",
|
||||
"status": "started"
|
||||
}
|
||||
@ -0,0 +1,59 @@
|
||||
curl -i -X GET 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/c54889dc-8163-4fa4-8e7c-14eca8dd6474'
|
||||
|
||||
GET /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/c54889dc-8163-4fa4-8e7c-14eca8dd6474 HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 1381
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:26:29 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/qemu/nodes/{node_id}
|
||||
|
||||
{
|
||||
"adapter_type": "e1000",
|
||||
"adapters": 1,
|
||||
"bios_image": "",
|
||||
"bios_image_md5sum": null,
|
||||
"boot_priority": "c",
|
||||
"cdrom_image": "",
|
||||
"cdrom_image_md5sum": null,
|
||||
"command_line": "",
|
||||
"console": 5004,
|
||||
"console_type": "telnet",
|
||||
"cpu_throttling": 0,
|
||||
"cpus": 1,
|
||||
"hda_disk_image": "",
|
||||
"hda_disk_image_md5sum": null,
|
||||
"hda_disk_interface": "ide",
|
||||
"hdb_disk_image": "",
|
||||
"hdb_disk_image_md5sum": null,
|
||||
"hdb_disk_interface": "ide",
|
||||
"hdc_disk_image": "",
|
||||
"hdc_disk_image_md5sum": null,
|
||||
"hdc_disk_interface": "ide",
|
||||
"hdd_disk_image": "",
|
||||
"hdd_disk_image_md5sum": null,
|
||||
"hdd_disk_interface": "ide",
|
||||
"initrd": "",
|
||||
"initrd_md5sum": null,
|
||||
"kernel_command_line": "",
|
||||
"kernel_image": "",
|
||||
"kernel_image_md5sum": null,
|
||||
"legacy_networking": false,
|
||||
"mac_address": "0c:dd:80:64:74:00",
|
||||
"name": "PC TEST 1",
|
||||
"node_directory": "/tmp/tmp3gc2avyo/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/project-files/qemu/c54889dc-8163-4fa4-8e7c-14eca8dd6474",
|
||||
"node_id": "c54889dc-8163-4fa4-8e7c-14eca8dd6474",
|
||||
"on_close": "power_off",
|
||||
"options": "",
|
||||
"platform": "x86_64",
|
||||
"process_priority": "low",
|
||||
"project_id": "a1e920ca-338a-4e9f-b363-aa607b09dd80",
|
||||
"qemu_path": "/tmp/tmphb4tqqk2/qemu-system-x86_64",
|
||||
"ram": 256,
|
||||
"status": "stopped",
|
||||
"usage": ""
|
||||
}
|
||||
@ -0,0 +1,26 @@
|
||||
curl -i -X GET 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/traceng/nodes/c03cc894-a5e9-4359-b85a-1fd917184de4'
|
||||
|
||||
GET /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/traceng/nodes/c03cc894-a5e9-4359-b85a-1fd917184de4 HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 443
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:27:26 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/traceng/nodes/{node_id}
|
||||
|
||||
{
|
||||
"command_line": "",
|
||||
"console": null,
|
||||
"console_type": "none",
|
||||
"default_destination": "",
|
||||
"ip_address": "",
|
||||
"name": "TraceNG TEST 1",
|
||||
"node_directory": "/tmp/tmp3gc2avyo/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/project-files/traceng/c03cc894-a5e9-4359-b85a-1fd917184de4",
|
||||
"node_id": "c03cc894-a5e9-4359-b85a-1fd917184de4",
|
||||
"project_id": "a1e920ca-338a-4e9f-b363-aa607b09dd80",
|
||||
"status": "stopped"
|
||||
}
|
||||
@ -0,0 +1,32 @@
|
||||
curl -i -X GET 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/virtualbox/nodes/bcd3206f-3edd-4b44-b5c8-e40f4a5c8909'
|
||||
|
||||
GET /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/virtualbox/nodes/bcd3206f-3edd-4b44-b5c8-e40f4a5c8909 HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 483
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:27:27 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/virtualbox/nodes/{node_id}
|
||||
|
||||
{
|
||||
"adapter_type": "Intel PRO/1000 MT Desktop (82540EM)",
|
||||
"adapters": 0,
|
||||
"console": 5004,
|
||||
"console_type": "telnet",
|
||||
"headless": false,
|
||||
"linked_clone": false,
|
||||
"name": "VMTEST",
|
||||
"node_directory": null,
|
||||
"node_id": "bcd3206f-3edd-4b44-b5c8-e40f4a5c8909",
|
||||
"on_close": "power_off",
|
||||
"project_id": "a1e920ca-338a-4e9f-b363-aa607b09dd80",
|
||||
"ram": 0,
|
||||
"status": "stopped",
|
||||
"usage": "",
|
||||
"use_any_adapter": false,
|
||||
"vmname": "VMTEST"
|
||||
}
|
||||
@ -0,0 +1,31 @@
|
||||
curl -i -X GET 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/vmware/nodes/716f8727-4421-4ba9-9e24-031505533c36'
|
||||
|
||||
GET /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/vmware/nodes/716f8727-4421-4ba9-9e24-031505533c36 HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 611
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:27:29 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/vmware/nodes/{node_id}
|
||||
|
||||
{
|
||||
"adapter_type": "e1000",
|
||||
"adapters": 0,
|
||||
"console": 5004,
|
||||
"console_type": "telnet",
|
||||
"headless": false,
|
||||
"linked_clone": false,
|
||||
"name": "VMTEST",
|
||||
"node_directory": "/tmp/tmp3gc2avyo/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/project-files/vmware/716f8727-4421-4ba9-9e24-031505533c36",
|
||||
"node_id": "716f8727-4421-4ba9-9e24-031505533c36",
|
||||
"on_close": "power_off",
|
||||
"project_id": "a1e920ca-338a-4e9f-b363-aa607b09dd80",
|
||||
"status": "stopped",
|
||||
"usage": "",
|
||||
"use_any_adapter": false,
|
||||
"vmx_path": "/tmp/pytest-of-grossmj/pytest-41/test_vmware_get0/test.vmx"
|
||||
}
|
||||
@ -0,0 +1,24 @@
|
||||
curl -i -X GET 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/vpcs/nodes/aa44ff6f-52fa-4bf9-9b93-2e73c9eb8071'
|
||||
|
||||
GET /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/vpcs/nodes/aa44ff6f-52fa-4bf9-9b93-2e73c9eb8071 HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 384
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:27:47 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/vpcs/nodes/{node_id}
|
||||
|
||||
{
|
||||
"command_line": "",
|
||||
"console": 5004,
|
||||
"console_type": "telnet",
|
||||
"name": "PC TEST 1",
|
||||
"node_directory": "/tmp/tmp3gc2avyo/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/project-files/vpcs/aa44ff6f-52fa-4bf9-9b93-2e73c9eb8071",
|
||||
"node_id": "aa44ff6f-52fa-4bf9-9b93-2e73c9eb8071",
|
||||
"project_id": "a1e920ca-338a-4e9f-b363-aa607b09dd80",
|
||||
"status": "stopped"
|
||||
}
|
||||
32
docs/api/examples/compute_get_qemubinaries.txt
Normal file
32
docs/api/examples/compute_get_qemubinaries.txt
Normal file
@ -0,0 +1,32 @@
|
||||
curl -i -X GET 'http://localhost:3080/v2/compute/qemu/binaries' -d '{"archs": ["i386"]}'
|
||||
|
||||
GET /v2/compute/qemu/binaries HTTP/1.1
|
||||
{
|
||||
"archs": [
|
||||
"i386"
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 212
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:26:55 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/qemu/binaries
|
||||
|
||||
[
|
||||
{
|
||||
"path": "/tmp/x86_64",
|
||||
"version": "2.2.0"
|
||||
},
|
||||
{
|
||||
"path": "/tmp/alpha",
|
||||
"version": "2.1.0"
|
||||
},
|
||||
{
|
||||
"path": "/tmp/i386",
|
||||
"version": "2.1.0"
|
||||
}
|
||||
]
|
||||
19
docs/api/examples/compute_get_qemucapabilities.txt
Normal file
19
docs/api/examples/compute_get_qemucapabilities.txt
Normal file
@ -0,0 +1,19 @@
|
||||
curl -i -X GET 'http://localhost:3080/v2/compute/qemu/capabilities'
|
||||
|
||||
GET /v2/compute/qemu/capabilities HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 39
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:27:19 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/qemu/capabilities
|
||||
|
||||
{
|
||||
"kvm": [
|
||||
"x86_64"
|
||||
]
|
||||
}
|
||||
18
docs/api/examples/compute_get_version.txt
Normal file
18
docs/api/examples/compute_get_version.txt
Normal file
@ -0,0 +1,18 @@
|
||||
curl -i -X GET 'http://localhost:3080/v2/compute/version'
|
||||
|
||||
GET /v2/compute/version HTTP/1.1
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 49
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:27:25 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/version
|
||||
|
||||
{
|
||||
"local": true,
|
||||
"version": "2.2.4dev1"
|
||||
}
|
||||
22
docs/api/examples/compute_post_projects.txt
Normal file
22
docs/api/examples/compute_post_projects.txt
Normal file
@ -0,0 +1,22 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects' -d '{"name": "test", "project_id": "10010203-0405-0607-0809-0a0b0c0d0e0f"}'
|
||||
|
||||
POST /v2/compute/projects HTTP/1.1
|
||||
{
|
||||
"name": "test",
|
||||
"project_id": "10010203-0405-0607-0809-0a0b0c0d0e0f"
|
||||
}
|
||||
|
||||
|
||||
HTTP/1.1 201
|
||||
Connection: close
|
||||
Content-Length: 103
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:26:17 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects
|
||||
|
||||
{
|
||||
"name": "test",
|
||||
"project_id": "10010203-0405-0607-0809-0a0b0c0d0e0f",
|
||||
"variables": null
|
||||
}
|
||||
14
docs/api/examples/compute_post_projectsprojectidclose.txt
Normal file
14
docs/api/examples/compute_post_projectsprojectidclose.txt
Normal file
@ -0,0 +1,14 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/close' -d '{}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/close HTTP/1.1
|
||||
{}
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:26:17 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/close
|
||||
|
||||
@ -0,0 +1,72 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/cloud/nodes' -d '{"name": "Cloud 1"}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/cloud/nodes HTTP/1.1
|
||||
{
|
||||
"name": "Cloud 1"
|
||||
}
|
||||
|
||||
|
||||
HTTP/1.1 201
|
||||
Connection: close
|
||||
Content-Length: 1406
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:25:43 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/cloud/nodes
|
||||
|
||||
{
|
||||
"interfaces": [
|
||||
{
|
||||
"name": "docker0",
|
||||
"special": true,
|
||||
"type": "ethernet"
|
||||
},
|
||||
{
|
||||
"name": "lo",
|
||||
"special": true,
|
||||
"type": "ethernet"
|
||||
},
|
||||
{
|
||||
"name": "virbr0",
|
||||
"special": true,
|
||||
"type": "ethernet"
|
||||
},
|
||||
{
|
||||
"name": "virbr0-nic",
|
||||
"special": true,
|
||||
"type": "ethernet"
|
||||
},
|
||||
{
|
||||
"name": "vmnet1",
|
||||
"special": true,
|
||||
"type": "ethernet"
|
||||
},
|
||||
{
|
||||
"name": "vmnet8",
|
||||
"special": true,
|
||||
"type": "ethernet"
|
||||
},
|
||||
{
|
||||
"name": "wlp2s0",
|
||||
"special": false,
|
||||
"type": "ethernet"
|
||||
}
|
||||
],
|
||||
"name": "Cloud 1",
|
||||
"node_directory": "/tmp/pytest-of-grossmj/pytest-41/test_json4/project-files/builtin/3cba86a4-73d7-4989-9c83-f0bb480ff950",
|
||||
"node_id": "3cba86a4-73d7-4989-9c83-f0bb480ff950",
|
||||
"ports_mapping": [
|
||||
{
|
||||
"interface": "wlp2s0",
|
||||
"name": "wlp2s0",
|
||||
"port_number": 0,
|
||||
"type": "ethernet"
|
||||
}
|
||||
],
|
||||
"project_id": "a1e920ca-338a-4e9f-b363-aa607b09dd80",
|
||||
"remote_console_host": "",
|
||||
"remote_console_http_path": "/",
|
||||
"remote_console_port": 23,
|
||||
"remote_console_type": "none",
|
||||
"status": "started"
|
||||
}
|
||||
@ -0,0 +1,25 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/cloud/nodes/5a669280-f313-421f-8d05-5cd30731964f/adapters/0/ports/0/nio' -d '{"lport": 4242, "rhost": "127.0.0.1", "rport": 4343, "type": "nio_udp"}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/cloud/nodes/5a669280-f313-421f-8d05-5cd30731964f/adapters/0/ports/0/nio HTTP/1.1
|
||||
{
|
||||
"lport": 4242,
|
||||
"rhost": "127.0.0.1",
|
||||
"rport": 4343,
|
||||
"type": "nio_udp"
|
||||
}
|
||||
|
||||
|
||||
HTTP/1.1 201
|
||||
Connection: close
|
||||
Content-Length: 89
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:25:43 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/cloud/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio
|
||||
|
||||
{
|
||||
"lport": 4242,
|
||||
"rhost": "127.0.0.1",
|
||||
"rport": 4343,
|
||||
"type": "nio_udp"
|
||||
}
|
||||
@ -0,0 +1,20 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/cloud/nodes/3c524997-ecb4-43c8-b0eb-4978446be73d/adapters/0/ports/0/start_capture' -d '{"capture_file_name": "test.pcap", "data_link_type": "DLT_EN10MB"}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/cloud/nodes/3c524997-ecb4-43c8-b0eb-4978446be73d/adapters/0/ports/0/start_capture HTTP/1.1
|
||||
{
|
||||
"capture_file_name": "test.pcap",
|
||||
"data_link_type": "DLT_EN10MB"
|
||||
}
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 104
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:25:49 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/cloud/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/start_capture
|
||||
|
||||
{
|
||||
"pcap_file_path": "/tmp/pytest-of-grossmj/pytest-41/test_json4/project-files/captures/test.pcap"
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/cloud/nodes/5def67e9-a974-4da2-9cd3-17866ede1898/adapters/0/ports/0/stop_capture' -d '{}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/cloud/nodes/5def67e9-a974-4da2-9cd3-17866ede1898/adapters/0/ports/0/stop_capture HTTP/1.1
|
||||
{}
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:25:49 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/cloud/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/stop_capture
|
||||
|
||||
@ -0,0 +1,25 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/docker/nodes/bfba66b2-35db-441e-8015-3041cf886105/adapters/0/ports/0/nio' -d '{"lport": 4242, "rhost": "127.0.0.1", "rport": 4343, "type": "nio_udp"}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/docker/nodes/bfba66b2-35db-441e-8015-3041cf886105/adapters/0/ports/0/nio HTTP/1.1
|
||||
{
|
||||
"lport": 4242,
|
||||
"rhost": "127.0.0.1",
|
||||
"rport": 4343,
|
||||
"type": "nio_udp"
|
||||
}
|
||||
|
||||
|
||||
HTTP/1.1 201
|
||||
Connection: close
|
||||
Content-Length: 89
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:25:50 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/docker/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio
|
||||
|
||||
{
|
||||
"lport": 4242,
|
||||
"rhost": "127.0.0.1",
|
||||
"rport": 4343,
|
||||
"type": "nio_udp"
|
||||
}
|
||||
@ -0,0 +1,20 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/docker/nodes/937a4da0-7334-4fee-a351-5433acaaa298/adapters/0/ports/0/start_capture' -d '{"capture_file_name": "test.pcap", "data_link_type": "DLT_EN10MB"}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/docker/nodes/937a4da0-7334-4fee-a351-5433acaaa298/adapters/0/ports/0/start_capture HTTP/1.1
|
||||
{
|
||||
"capture_file_name": "test.pcap",
|
||||
"data_link_type": "DLT_EN10MB"
|
||||
}
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 104
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:25:51 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/docker/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/start_capture
|
||||
|
||||
{
|
||||
"pcap_file_path": "/tmp/pytest-of-grossmj/pytest-41/test_json4/project-files/captures/test.pcap"
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/docker/nodes/e44e037c-3b3e-4172-aff7-b9bb510646c6/adapters/0/ports/0/stop_capture' -d '{}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/docker/nodes/e44e037c-3b3e-4172-aff7-b9bb510646c6/adapters/0/ports/0/stop_capture HTTP/1.1
|
||||
{}
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:25:51 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/docker/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/stop_capture
|
||||
|
||||
@ -0,0 +1,17 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/docker/nodes/c5f0877d-6201-4fe8-8c0b-aaeb84222bee/duplicate' -d '{"destination_node_id": "72462999-933a-4be7-9ef5-0528f04c3870"}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/docker/nodes/c5f0877d-6201-4fe8-8c0b-aaeb84222bee/duplicate HTTP/1.1
|
||||
{
|
||||
"destination_node_id": "72462999-933a-4be7-9ef5-0528f04c3870"
|
||||
}
|
||||
|
||||
|
||||
HTTP/1.1 201
|
||||
Connection: close
|
||||
Content-Length: 4
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:25:51 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/docker/nodes/{node_id}/duplicate
|
||||
|
||||
true
|
||||
39
docs/api/examples/compute_post_projectsprojectidiounodes.txt
Normal file
39
docs/api/examples/compute_post_projectsprojectidiounodes.txt
Normal file
@ -0,0 +1,39 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/iou/nodes' -d '{"name": "PC TEST 1", "node_id": "0de29446-fa90-4e91-89f3-5ea84860f212", "path": "iou.bin", "startup_config_content": "hostname test"}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/iou/nodes HTTP/1.1
|
||||
{
|
||||
"name": "PC TEST 1",
|
||||
"node_id": "0de29446-fa90-4e91-89f3-5ea84860f212",
|
||||
"path": "iou.bin",
|
||||
"startup_config_content": "hostname test"
|
||||
}
|
||||
|
||||
|
||||
HTTP/1.1 201
|
||||
Connection: close
|
||||
Content-Length: 631
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:25:56 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/iou/nodes
|
||||
|
||||
{
|
||||
"application_id": 1,
|
||||
"command_line": "",
|
||||
"console": 5004,
|
||||
"console_type": "telnet",
|
||||
"ethernet_adapters": 2,
|
||||
"l1_keepalives": false,
|
||||
"md5sum": "e573e8f5c93c6c00783f20c7a170aa6c",
|
||||
"name": "PC TEST 1",
|
||||
"node_directory": "/tmp/pytest-of-grossmj/pytest-41/test_json4/project-files/iou/0de29446-fa90-4e91-89f3-5ea84860f212",
|
||||
"node_id": "0de29446-fa90-4e91-89f3-5ea84860f212",
|
||||
"nvram": 128,
|
||||
"path": "iou.bin",
|
||||
"project_id": "a1e920ca-338a-4e9f-b363-aa607b09dd80",
|
||||
"ram": 256,
|
||||
"serial_adapters": 2,
|
||||
"status": "stopped",
|
||||
"usage": "",
|
||||
"use_default_iou_values": true
|
||||
}
|
||||
@ -0,0 +1,21 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/iou/nodes/fadca255-3eb8-44fa-9a14-31c52604d094/adapters/1/ports/0/nio' -d '{"ethernet_device": "docker0", "type": "nio_ethernet"}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/iou/nodes/fadca255-3eb8-44fa-9a14-31c52604d094/adapters/1/ports/0/nio HTTP/1.1
|
||||
{
|
||||
"ethernet_device": "docker0",
|
||||
"type": "nio_ethernet"
|
||||
}
|
||||
|
||||
|
||||
HTTP/1.1 201
|
||||
Connection: close
|
||||
Content-Length: 64
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:25:58 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/iou/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio
|
||||
|
||||
{
|
||||
"ethernet_device": "docker0",
|
||||
"type": "nio_ethernet"
|
||||
}
|
||||
@ -0,0 +1,20 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/iou/nodes/b63d611d-066b-4673-ad6c-c0e8a93cedbb/adapters/0/ports/0/start_capture' -d '{"capture_file_name": "test.pcap", "data_link_type": "DLT_EN10MB"}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/iou/nodes/b63d611d-066b-4673-ad6c-c0e8a93cedbb/adapters/0/ports/0/start_capture HTTP/1.1
|
||||
{
|
||||
"capture_file_name": "test.pcap",
|
||||
"data_link_type": "DLT_EN10MB"
|
||||
}
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 104
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:25:59 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/iou/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/start_capture
|
||||
|
||||
{
|
||||
"pcap_file_path": "/tmp/pytest-of-grossmj/pytest-41/test_json4/project-files/captures/test.pcap"
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/iou/nodes/73ab14a4-9338-4428-89a7-bce3d8daf1eb/adapters/0/ports/0/stop_capture' -d '{}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/iou/nodes/73ab14a4-9338-4428-89a7-bce3d8daf1eb/adapters/0/ports/0/stop_capture HTTP/1.1
|
||||
{}
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:25:59 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/iou/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/stop_capture
|
||||
|
||||
@ -0,0 +1,17 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/iou/nodes/12cd096f-f0c1-45f9-ac57-360f1d379c48/duplicate' -d '{"destination_node_id": "3949cfaa-2574-4064-a088-5f48ae784e9b"}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/iou/nodes/12cd096f-f0c1-45f9-ac57-360f1d379c48/duplicate HTTP/1.1
|
||||
{
|
||||
"destination_node_id": "3949cfaa-2574-4064-a088-5f48ae784e9b"
|
||||
}
|
||||
|
||||
|
||||
HTTP/1.1 201
|
||||
Connection: close
|
||||
Content-Length: 4
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:26:09 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/iou/nodes/{node_id}/duplicate
|
||||
|
||||
true
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/iou/nodes/c9e6143c-cf69-416d-8935-8af81fb8ff1d/reload' -d '{}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/iou/nodes/c9e6143c-cf69-416d-8935-8af81fb8ff1d/reload HTTP/1.1
|
||||
{}
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:25:57 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/iou/nodes/{node_id}/reload
|
||||
|
||||
@ -0,0 +1,36 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/iou/nodes/03423f2a-311d-4436-8c9a-8b34945f6cd2/start' -d '{"iourc_content": "test"}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/iou/nodes/03423f2a-311d-4436-8c9a-8b34945f6cd2/start HTTP/1.1
|
||||
{
|
||||
"iourc_content": "test"
|
||||
}
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 631
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:25:57 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/iou/nodes/{node_id}/start
|
||||
|
||||
{
|
||||
"application_id": 1,
|
||||
"command_line": "",
|
||||
"console": 5004,
|
||||
"console_type": "telnet",
|
||||
"ethernet_adapters": 2,
|
||||
"l1_keepalives": false,
|
||||
"md5sum": "e573e8f5c93c6c00783f20c7a170aa6c",
|
||||
"name": "PC TEST 1",
|
||||
"node_directory": "/tmp/pytest-of-grossmj/pytest-41/test_json4/project-files/iou/03423f2a-311d-4436-8c9a-8b34945f6cd2",
|
||||
"node_id": "03423f2a-311d-4436-8c9a-8b34945f6cd2",
|
||||
"nvram": 128,
|
||||
"path": "iou.bin",
|
||||
"project_id": "a1e920ca-338a-4e9f-b363-aa607b09dd80",
|
||||
"ram": 256,
|
||||
"serial_adapters": 2,
|
||||
"status": "stopped",
|
||||
"usage": "",
|
||||
"use_default_iou_values": true
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/iou/nodes/5fcb7418-3e0c-4a47-8cff-c5e0b3e68000/stop' -d '{}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/iou/nodes/5fcb7418-3e0c-4a47-8cff-c5e0b3e68000/stop HTTP/1.1
|
||||
{}
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:25:57 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/iou/nodes/{node_id}/stop
|
||||
|
||||
30
docs/api/examples/compute_post_projectsprojectidnatnodes.txt
Normal file
30
docs/api/examples/compute_post_projectsprojectidnatnodes.txt
Normal file
@ -0,0 +1,30 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/nat/nodes' -d '{"name": "Nat 1"}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/nat/nodes HTTP/1.1
|
||||
{
|
||||
"name": "Nat 1"
|
||||
}
|
||||
|
||||
|
||||
HTTP/1.1 201
|
||||
Connection: close
|
||||
Content-Length: 335
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:26:09 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/nat/nodes
|
||||
|
||||
{
|
||||
"name": "Nat 1",
|
||||
"node_id": "4b2c0443-0726-4507-a30b-7ac535b1bbaf",
|
||||
"ports_mapping": [
|
||||
{
|
||||
"interface": "virbr0",
|
||||
"name": "nat0",
|
||||
"port_number": 0,
|
||||
"type": "ethernet"
|
||||
}
|
||||
],
|
||||
"project_id": "a1e920ca-338a-4e9f-b363-aa607b09dd80",
|
||||
"status": "started"
|
||||
}
|
||||
@ -0,0 +1,25 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/nat/nodes/d8f89cb0-b60f-404a-8431-af581957e29c/adapters/0/ports/0/nio' -d '{"lport": 4242, "rhost": "127.0.0.1", "rport": 4343, "type": "nio_udp"}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/nat/nodes/d8f89cb0-b60f-404a-8431-af581957e29c/adapters/0/ports/0/nio HTTP/1.1
|
||||
{
|
||||
"lport": 4242,
|
||||
"rhost": "127.0.0.1",
|
||||
"rport": 4343,
|
||||
"type": "nio_udp"
|
||||
}
|
||||
|
||||
|
||||
HTTP/1.1 201
|
||||
Connection: close
|
||||
Content-Length: 89
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:26:09 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/nat/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio
|
||||
|
||||
{
|
||||
"lport": 4242,
|
||||
"rhost": "127.0.0.1",
|
||||
"rport": 4343,
|
||||
"type": "nio_udp"
|
||||
}
|
||||
@ -0,0 +1,20 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/nat/nodes/bc78e678-408d-4d03-9670-c29da452f6c7/adapters/0/ports/0/start_capture' -d '{"capture_file_name": "test.pcap", "data_link_type": "DLT_EN10MB"}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/nat/nodes/bc78e678-408d-4d03-9670-c29da452f6c7/adapters/0/ports/0/start_capture HTTP/1.1
|
||||
{
|
||||
"capture_file_name": "test.pcap",
|
||||
"data_link_type": "DLT_EN10MB"
|
||||
}
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 104
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:26:16 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/nat/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/start_capture
|
||||
|
||||
{
|
||||
"pcap_file_path": "/tmp/pytest-of-grossmj/pytest-41/test_json4/project-files/captures/test.pcap"
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/nat/nodes/da53ab8a-106c-48a9-ba35-48167fb1b6d1/adapters/0/ports/0/stop_capture' -d '{}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/nat/nodes/da53ab8a-106c-48a9-ba35-48167fb1b6d1/adapters/0/ports/0/stop_capture HTTP/1.1
|
||||
{}
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:26:16 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/nat/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/stop_capture
|
||||
|
||||
17
docs/api/examples/compute_post_projectsprojectidportsudp.txt
Normal file
17
docs/api/examples/compute_post_projectsprojectidportsudp.txt
Normal file
@ -0,0 +1,17 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/ports/udp' -d '{}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/ports/udp HTTP/1.1
|
||||
{}
|
||||
|
||||
|
||||
HTTP/1.1 201
|
||||
Connection: close
|
||||
Content-Length: 25
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:26:16 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/ports/udp
|
||||
|
||||
{
|
||||
"udp_port": 20000
|
||||
}
|
||||
@ -0,0 +1,63 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes' -d '{"hda_disk_image": "hello.img", "name": "PC TEST 1", "qemu_path": "/tmp/tmphb4tqqk2/qemu-system-x86_64"}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes HTTP/1.1
|
||||
{
|
||||
"hda_disk_image": "hello.img",
|
||||
"name": "PC TEST 1",
|
||||
"qemu_path": "/tmp/tmphb4tqqk2/qemu-system-x86_64"
|
||||
}
|
||||
|
||||
|
||||
HTTP/1.1 201
|
||||
Connection: close
|
||||
Content-Length: 1420
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:26:28 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/qemu/nodes
|
||||
|
||||
{
|
||||
"adapter_type": "e1000",
|
||||
"adapters": 1,
|
||||
"bios_image": "",
|
||||
"bios_image_md5sum": null,
|
||||
"boot_priority": "c",
|
||||
"cdrom_image": "",
|
||||
"cdrom_image_md5sum": null,
|
||||
"command_line": "",
|
||||
"console": 5004,
|
||||
"console_type": "telnet",
|
||||
"cpu_throttling": 0,
|
||||
"cpus": 1,
|
||||
"hda_disk_image": "hello.img",
|
||||
"hda_disk_image_md5sum": "7d793037a0760186574b0282f2f435e7",
|
||||
"hda_disk_interface": "ide",
|
||||
"hdb_disk_image": "",
|
||||
"hdb_disk_image_md5sum": null,
|
||||
"hdb_disk_interface": "ide",
|
||||
"hdc_disk_image": "",
|
||||
"hdc_disk_image_md5sum": null,
|
||||
"hdc_disk_interface": "ide",
|
||||
"hdd_disk_image": "",
|
||||
"hdd_disk_image_md5sum": null,
|
||||
"hdd_disk_interface": "ide",
|
||||
"initrd": "",
|
||||
"initrd_md5sum": null,
|
||||
"kernel_command_line": "",
|
||||
"kernel_image": "",
|
||||
"kernel_image_md5sum": null,
|
||||
"legacy_networking": false,
|
||||
"mac_address": "0c:dd:80:dd:e2:00",
|
||||
"name": "PC TEST 1",
|
||||
"node_directory": "/tmp/tmp3gc2avyo/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/project-files/qemu/2320a0b9-ed9b-45d9-9bef-c6d13bd9dde2",
|
||||
"node_id": "2320a0b9-ed9b-45d9-9bef-c6d13bd9dde2",
|
||||
"on_close": "power_off",
|
||||
"options": "",
|
||||
"platform": "x86_64",
|
||||
"process_priority": "low",
|
||||
"project_id": "a1e920ca-338a-4e9f-b363-aa607b09dd80",
|
||||
"qemu_path": "/tmp/tmphb4tqqk2/qemu-system-x86_64",
|
||||
"ram": 256,
|
||||
"status": "stopped",
|
||||
"usage": ""
|
||||
}
|
||||
@ -0,0 +1,25 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/5048489f-46b4-4720-bee9-f4cf1ec7af49/adapters/1/ports/0/nio' -d '{"lport": 4242, "rhost": "127.0.0.1", "rport": 4343, "type": "nio_udp"}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/5048489f-46b4-4720-bee9-f4cf1ec7af49/adapters/1/ports/0/nio HTTP/1.1
|
||||
{
|
||||
"lport": 4242,
|
||||
"rhost": "127.0.0.1",
|
||||
"rport": 4343,
|
||||
"type": "nio_udp"
|
||||
}
|
||||
|
||||
|
||||
HTTP/1.1 201
|
||||
Connection: close
|
||||
Content-Length: 89
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:26:44 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/qemu/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio
|
||||
|
||||
{
|
||||
"lport": 4242,
|
||||
"rhost": "127.0.0.1",
|
||||
"rport": 4343,
|
||||
"type": "nio_udp"
|
||||
}
|
||||
@ -0,0 +1,20 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/40fc7ce3-f4fe-469e-a94a-fb95906d9e22/adapters/0/ports/0/start_capture' -d '{"capture_file_name": "test.pcap", "data_link_type": "DLT_EN10MB"}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/40fc7ce3-f4fe-469e-a94a-fb95906d9e22/adapters/0/ports/0/start_capture HTTP/1.1
|
||||
{
|
||||
"capture_file_name": "test.pcap",
|
||||
"data_link_type": "DLT_EN10MB"
|
||||
}
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 123
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:27:24 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/qemu/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/start_capture
|
||||
|
||||
{
|
||||
"pcap_file_path": "/tmp/tmp3gc2avyo/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/project-files/captures/test.pcap"
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/4258adbd-3115-4b8f-b751-cb117dcff450/adapters/0/ports/0/stop_capture' -d '{}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/4258adbd-3115-4b8f-b751-cb117dcff450/adapters/0/ports/0/stop_capture HTTP/1.1
|
||||
{}
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:27:24 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/qemu/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/stop_capture
|
||||
|
||||
@ -0,0 +1,17 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/839fb609-bd90-4a20-b496-6e225594c697/duplicate' -d '{"destination_node_id": "eb9e761d-0029-4644-b586-dc903e7abd71"}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/839fb609-bd90-4a20-b496-6e225594c697/duplicate HTTP/1.1
|
||||
{
|
||||
"destination_node_id": "eb9e761d-0029-4644-b586-dc903e7abd71"
|
||||
}
|
||||
|
||||
|
||||
HTTP/1.1 201
|
||||
Connection: close
|
||||
Content-Length: 4
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:27:21 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/qemu/nodes/{node_id}/duplicate
|
||||
|
||||
true
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/314c42be-e138-42f3-a59e-a7c3c2e6514f/reload' -d '{}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/314c42be-e138-42f3-a59e-a7c3c2e6514f/reload HTTP/1.1
|
||||
{}
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:26:33 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/qemu/nodes/{node_id}/reload
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/ad58dbd9-6558-4750-bec5-1de4cf77ed70/resume' -d '{}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/ad58dbd9-6558-4750-bec5-1de4cf77ed70/resume HTTP/1.1
|
||||
{}
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:26:35 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/qemu/nodes/{node_id}/resume
|
||||
|
||||
@ -0,0 +1,59 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/9a4b2f04-74a6-4528-a6a7-b02365417fe9/start' -d '{}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/9a4b2f04-74a6-4528-a6a7-b02365417fe9/start HTTP/1.1
|
||||
{}
|
||||
|
||||
|
||||
HTTP/1.1 200
|
||||
Connection: close
|
||||
Content-Length: 1381
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:26:30 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/qemu/nodes/{node_id}/start
|
||||
|
||||
{
|
||||
"adapter_type": "e1000",
|
||||
"adapters": 1,
|
||||
"bios_image": "",
|
||||
"bios_image_md5sum": null,
|
||||
"boot_priority": "c",
|
||||
"cdrom_image": "",
|
||||
"cdrom_image_md5sum": null,
|
||||
"command_line": "",
|
||||
"console": 5004,
|
||||
"console_type": "telnet",
|
||||
"cpu_throttling": 0,
|
||||
"cpus": 1,
|
||||
"hda_disk_image": "",
|
||||
"hda_disk_image_md5sum": null,
|
||||
"hda_disk_interface": "ide",
|
||||
"hdb_disk_image": "",
|
||||
"hdb_disk_image_md5sum": null,
|
||||
"hdb_disk_interface": "ide",
|
||||
"hdc_disk_image": "",
|
||||
"hdc_disk_image_md5sum": null,
|
||||
"hdc_disk_interface": "ide",
|
||||
"hdd_disk_image": "",
|
||||
"hdd_disk_image_md5sum": null,
|
||||
"hdd_disk_interface": "ide",
|
||||
"initrd": "",
|
||||
"initrd_md5sum": null,
|
||||
"kernel_command_line": "",
|
||||
"kernel_image": "",
|
||||
"kernel_image_md5sum": null,
|
||||
"legacy_networking": false,
|
||||
"mac_address": "0c:dd:80:7f:e9:00",
|
||||
"name": "PC TEST 1",
|
||||
"node_directory": "/tmp/tmp3gc2avyo/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/project-files/qemu/9a4b2f04-74a6-4528-a6a7-b02365417fe9",
|
||||
"node_id": "9a4b2f04-74a6-4528-a6a7-b02365417fe9",
|
||||
"on_close": "power_off",
|
||||
"options": "",
|
||||
"platform": "x86_64",
|
||||
"process_priority": "low",
|
||||
"project_id": "a1e920ca-338a-4e9f-b363-aa607b09dd80",
|
||||
"qemu_path": "/tmp/tmphb4tqqk2/qemu-system-x86_64",
|
||||
"ram": 256,
|
||||
"status": "stopped",
|
||||
"usage": ""
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/6aacea07-76ca-4fb9-94d2-24da00e33037/stop' -d '{}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/6aacea07-76ca-4fb9-94d2-24da00e33037/stop HTTP/1.1
|
||||
{}
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:26:31 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/qemu/nodes/{node_id}/stop
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/073074f6-83d4-40b4-8042-771b3df49f60/suspend' -d '{}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/qemu/nodes/073074f6-83d4-40b4-8042-771b3df49f60/suspend HTTP/1.1
|
||||
{}
|
||||
|
||||
|
||||
HTTP/1.1 204
|
||||
Connection: close
|
||||
Content-Length: 0
|
||||
Content-Type: application/octet-stream
|
||||
Date: Wed, 08 Jan 2020 02:26:33 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/qemu/nodes/{node_id}/suspend
|
||||
|
||||
@ -0,0 +1,28 @@
|
||||
curl -i -X POST 'http://localhost:3080/v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/traceng/nodes' -d '{"name": "TraceNG TEST 1"}'
|
||||
|
||||
POST /v2/compute/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/traceng/nodes HTTP/1.1
|
||||
{
|
||||
"name": "TraceNG TEST 1"
|
||||
}
|
||||
|
||||
|
||||
HTTP/1.1 201
|
||||
Connection: close
|
||||
Content-Length: 443
|
||||
Content-Type: application/json
|
||||
Date: Wed, 08 Jan 2020 02:27:26 GMT
|
||||
Server: Python/3.6 GNS3/2.2.4dev1
|
||||
X-Route: /v2/compute/projects/{project_id}/traceng/nodes
|
||||
|
||||
{
|
||||
"command_line": "",
|
||||
"console": null,
|
||||
"console_type": "none",
|
||||
"default_destination": "",
|
||||
"ip_address": "",
|
||||
"name": "TraceNG TEST 1",
|
||||
"node_directory": "/tmp/tmp3gc2avyo/projects/a1e920ca-338a-4e9f-b363-aa607b09dd80/project-files/traceng/f27f5247-e419-4404-9150-b1bb9306d783",
|
||||
"node_id": "f27f5247-e419-4404-9150-b1bb9306d783",
|
||||
"project_id": "a1e920ca-338a-4e9f-b363-aa607b09dd80",
|
||||
"status": "stopped"
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user