mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-08-29 05:20:14 +03:00
Compare commits
No commits in common. "v3.1.0a5" and "master" have entirely different histories.
@ -1,37 +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 iptables FORWARD blocks bridge](./docker-iptables-forward-bridge.md)** - Docker sets FORWARD chain to DROP, blocking kernel bridge forwarding; `sudo iptables -P FORWARD ACCEPT` to fix
|
||||
|
||||
### 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,38 +0,0 @@
|
||||
---
|
||||
name: docker-iptables-forward-bridge
|
||||
description: Docker iptables FORWARD DROP blocks kernel bridge forwarding, fix and symptoms
|
||||
metadata:
|
||||
type: reference
|
||||
---
|
||||
|
||||
Docker sets the iptables `FORWARD` chain default policy to `DROP` when the
|
||||
Docker daemon starts. This blocks **all** forwarded traffic through Linux
|
||||
kernel bridges on the host — including `gns3br{N}` bridges created by the
|
||||
builtin Ethernet Switch (ubridge `brctl`).
|
||||
|
||||
## Symptoms
|
||||
|
||||
- Nodes connected to the switch can send frames into the bridge (visible in
|
||||
`tcpdump -i gns3br{N}`) but never receive forwarded unicast frames.
|
||||
- `bridge fdb show` may fail to learn MAC addresses (frames dropped before
|
||||
the bridge learning path).
|
||||
- ARP and multicast/broadcast may appear to work because they flood, but
|
||||
unicast replies never reach the destination.
|
||||
- OSPF Hello / CDP visible on both sides but ICMP echo reply never returns.
|
||||
- `ubridge bridge get_stats` shows symmetric IN/OUT counts (relay is fine),
|
||||
`bridge fdb show` shows learned MACs, `bridge link show` shows `state forwarding`
|
||||
on all ports — yet unicast still doesn't work.
|
||||
|
||||
## Fix
|
||||
|
||||
Run once per host boot, or make persistent via iptables-persistent / firewall config:
|
||||
|
||||
```bash
|
||||
sudo iptables -P FORWARD ACCEPT
|
||||
```
|
||||
|
||||
## Related
|
||||
|
||||
- [[ethernet-switch-ubridge-brctl-migration]] — the kernel bridge that hits this
|
||||
- [[gns3-server-linux-only]] — datapath constraint
|
||||
- [[gns3-ubridge-permission]] — another host-level prerequisite (CAP_NET_ADMIN)
|
||||
@ -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,172 +0,0 @@
|
||||
---
|
||||
name: gns3-api-testing
|
||||
description: Use this skill when testing GNS3 server REST API endpoints with curl — covers JWT auth, common patterns, and marker/link examples.
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# GNS3 Server API Testing with curl
|
||||
|
||||
## Core Principle
|
||||
|
||||
Fixed routine for testing the GNS3 server API: **get a JWT token first, then send `Authorization: Bearer <token>` with every request.**
|
||||
Default address `http://127.0.0.1:3080`, API prefix `/v3`.
|
||||
|
||||
---
|
||||
|
||||
## Authentication (always first)
|
||||
|
||||
```bash
|
||||
TOKEN=$(curl -s -X POST http://127.0.0.1:3080/v3/access/users/authenticate \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"username":"admin","password":"admin"}' \
|
||||
| python3 -c "import sys,json; print(json.load(sys.stdin)['access_token'])")
|
||||
```
|
||||
|
||||
Persist to a file for reuse (avoids re-logging in each time):
|
||||
|
||||
```bash
|
||||
echo "$TOKEN" > /tmp/gns3_token.txt
|
||||
TOKEN=$(cat /tmp/gns3_token.txt)
|
||||
```
|
||||
|
||||
Then attach to every request:
|
||||
```bash
|
||||
AUTH="Authorization: Bearer $TOKEN"
|
||||
curl -s -H "$AUTH" http://127.0.0.1:3080/v3/...
|
||||
```
|
||||
|
||||
> **Endpoint note**: login is `/v3/access/users/authenticate`, **not** `/v3/auth/login`.
|
||||
> OpenAPI spec is at `/openapi.json` (not `/v3/openapi.json`).
|
||||
|
||||
---
|
||||
|
||||
## Common Variables
|
||||
|
||||
```bash
|
||||
BASE="http://127.0.0.1:3080/v3"
|
||||
PID=<project_id>
|
||||
LID=<link_id>
|
||||
NID=<node_id>
|
||||
AUTH="Authorization: Bearer $TOKEN"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Generic Request Patterns
|
||||
|
||||
### GET (query)
|
||||
```bash
|
||||
curl -s -H "$AUTH" $BASE/projects/$PID/links | python3 -m json.tool
|
||||
```
|
||||
|
||||
### POST (create) — with JSON body
|
||||
```bash
|
||||
curl -s -X POST -H "$AUTH" -H "Content-Type: application/json" \
|
||||
-d '{"name":"foo","bpf":"icmp"}' \
|
||||
$BASE/projects/$PID/links/$LID/markers
|
||||
```
|
||||
|
||||
### HTTP status code only (body not needed)
|
||||
```bash
|
||||
curl -s -o /dev/null -w "HTTP %{http_code}\n" -X DELETE -H "$AUTH" \
|
||||
$BASE/projects/$PID/links/$LID/markers/global-icmp
|
||||
```
|
||||
|
||||
### Extract a field from the response
|
||||
```bash
|
||||
LID=$(curl -s -H "$AUTH" -X POST ... | python3 -c "import sys,json; print(json.load(sys.stdin)['link_id'])")
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Status Code Reference
|
||||
|
||||
| Code | Meaning |
|
||||
|---|---|
|
||||
| 200 | GET/PUT succeeded |
|
||||
| 201 | POST created |
|
||||
| 204 | DELETE succeeded (no body) |
|
||||
| 401 | Not authenticated (token missing/expired) |
|
||||
| 404 | Resource not found |
|
||||
| 409 | Conflict (e.g. per-link edit of an inherited marker) |
|
||||
| 422 | Schema validation failed (e.g. marker name starting with `global`) |
|
||||
|
||||
---
|
||||
|
||||
## Marker Cheat Sheet
|
||||
|
||||
### Project-level global marker definitions (inheritance)
|
||||
```bash
|
||||
# Create a def → fans out to every link automatically
|
||||
curl -s -X POST -H "$AUTH" -H "Content-Type: application/json" \
|
||||
-d '{"name":"icmp","bpf":"icmp","tag":1,"color":"#ff5722"}' \
|
||||
$BASE/projects/$PID/marker-definitions
|
||||
|
||||
# List all defs + the link_ids each is bound to
|
||||
curl -s -H "$AUTH" $BASE/projects/$PID/marker-definitions
|
||||
|
||||
# Update a def → syncs to every link
|
||||
curl -s -X PUT -H "$AUTH" -H "Content-Type: application/json" \
|
||||
-d '{"bpf":"icmp","tag":99}' \
|
||||
$BASE/projects/$PID/marker-definitions/icmp
|
||||
|
||||
# Delete a def → removes the inherited marker from every link
|
||||
curl -s -X DELETE -H "$AUTH" $BASE/projects/$PID/marker-definitions/icmp
|
||||
```
|
||||
|
||||
### Per-link markers
|
||||
```bash
|
||||
# List markers on a link
|
||||
curl -s -H "$AUTH" $BASE/projects/$PID/links/$LID/markers
|
||||
|
||||
# Create a private marker (name cannot start with "global")
|
||||
curl -s -X POST -H "$AUTH" -H "Content-Type: application/json" \
|
||||
-d '{"bpf":"tcp port 80"}' \
|
||||
$BASE/projects/$PID/links/$LID/markers
|
||||
|
||||
# Delete (inherited markers return 409)
|
||||
curl -s -X DELETE -H "$AUTH" $BASE/projects/$PID/links/$LID/markers/<name>
|
||||
```
|
||||
|
||||
### Project-level aggregation query
|
||||
```bash
|
||||
curl -s -H "$AUTH" $BASE/projects/$PID/markers # all markers across links, flattened
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Link / Node Cheat Sheet
|
||||
|
||||
```bash
|
||||
# List all links in a project (includes the markers field)
|
||||
curl -s -H "$AUTH" $BASE/projects/$PID/links
|
||||
|
||||
# List nodes (check ports[].link_id to find free ports)
|
||||
curl -s -H "$AUTH" $BASE/projects/$PID/nodes
|
||||
|
||||
# Create a VPCS
|
||||
curl -s -X POST -H "$AUTH" -H "Content-Type: application/json" \
|
||||
-d '{"name":"t1","node_type":"vpcs","compute_id":"local"}' \
|
||||
$BASE/projects/$PID/nodes
|
||||
|
||||
# Start a node
|
||||
curl -s -o /dev/null -X POST -H "$AUTH" $BASE/projects/$PID/nodes/$NID/start
|
||||
|
||||
# Create a link (both ends: node + adapter/port)
|
||||
curl -s -X POST -H "$AUTH" -H "Content-Type: application/json" \
|
||||
-d "{\"nodes\":[{\"node_id\":\"$N1\",\"adapter_number\":0,\"port_number\":0},{\"node_id\":\"$N2\",\"adapter_number\":0,\"port_number\":0}]}" \
|
||||
$BASE/projects/$PID/links
|
||||
```
|
||||
|
||||
> **Port occupancy**: VPCS has only one interface (port 0); once linked it cannot connect again.
|
||||
> Confirm `ports[].link_id` is empty before creating a link; `"Port is already used"` means the port is taken.
|
||||
|
||||
---
|
||||
|
||||
## Gotchas
|
||||
|
||||
- **`POST /links` response may show `markers: []`** — the create response is serialized before the inheritance hook runs.
|
||||
The inherited marker is actually applied; check `GET /links/{lid}/markers` or refresh `GET /links` to see it.
|
||||
- **Restart gns3server after code changes** — the Python process does not hot-reload.
|
||||
- **Wrap JSON bodies in single quotes** in the shell (double quotes inside); to interpolate a shell variable use `\"$VAR\"`.
|
||||
- **Pipe long output through `python3 -m json.tool`** to pretty-print; extract fields with `python3 -c "import sys,json; ..."`.
|
||||
@ -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
|
||||
@ -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
|
||||
|
||||
21
.github/workflows/testing.yml
vendored
21
.github/workflows/testing.yml
vendored
@ -4,20 +4,21 @@ on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- 3.1
|
||||
- 2.2
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- 3.1
|
||||
- 2.2
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
|
||||
os: ["ubuntu-latest"]
|
||||
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
@ -25,11 +26,17 @@ jobs:
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
cache: pip
|
||||
- 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'
|
||||
run: |
|
||||
python -m pip install -r win-requirements.txt
|
||||
curl -O "http://www.win10pcap.org/download/Win10Pcap-v10.2-5002.msi"
|
||||
msiexec /i "Win10Pcap-v10.2-5002.msi" /qn /norestart
|
||||
|
||||
- name: Lint with flake8
|
||||
run: |
|
||||
@ -39,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
|
||||
|
||||
27
.gitignore
vendored
27
.gitignore
vendored
@ -5,12 +5,6 @@ __pycache__
|
||||
#py.test
|
||||
.cache
|
||||
|
||||
# environment file
|
||||
.env
|
||||
|
||||
# hypothesis files
|
||||
.hypothesis
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
@ -65,25 +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/
|
||||
|
||||
gns3.log
|
||||
/configs/
|
||||
|
||||
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"
|
||||
}
|
||||
}
|
||||
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.1.1
|
||||
-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."
|
||||
130
docs/README.md
130
docs/README.md
@ -1,130 +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.
|
||||
|
||||
### Marker (Traffic Insight) (`features/marker-traffic-insight.md`)
|
||||
Real-time traffic insight via per-link BPF markers and project-level inherited definitions. A marker taps a link in uBridge, emitting match notifications and pcap capture on BPF hit; definitions fan out to every capable link automatically.
|
||||
|
||||
### Docker exec Console (Vendor NOS) (`features/docker-exec-console.md`)
|
||||
Console for vendor NOS containers (SR Linux, XRd, …) whose CLI is a TUI off PID 1: runs the vendor CLI via the Docker exec API, plus `GNS3_SKIP_INIT`/`GNS3_INTERFACE_NAMES` boot knobs and SKIP_INIT volume persistence.
|
||||
|
||||
### Cisco XRd Control Plane (`features/vendor-nos-xrd.md`)
|
||||
Cisco XRd as a GNS3 Docker router: vendor path + shm/device injection (`GNS3_SHM_SIZE`/`GNS3_DEVICES`), config-file injection (`extra_configs`), udev masking (`GNS3_MASK_UDEV`) so privileged systemd containers don't disturb the host, and the host-readiness check.
|
||||
|
||||
---
|
||||
|
||||
## 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)
|
||||
- [Docker Link UDP Self-Loop](bugs/link-udp-self-loop.md) — intermittent one-way link (both ends handed the same UDP port by an allocation race); **fixed** (Medium severity)
|
||||
|
||||
---
|
||||
|
||||
## 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-08-14_
|
||||
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