mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-08-29 13:30:12 +03:00
Compare commits
206 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a3e85b7041 | ||
|
|
80da7da515 | ||
|
|
d2f73cae28 | ||
|
|
da2942c139 | ||
|
|
5485eef3ad | ||
|
|
ccf4b3f9db | ||
|
|
b797981a65 | ||
|
|
a225622a6e | ||
|
|
3f19ede8d2 | ||
|
|
668169d1cc | ||
|
|
66b39f0616 | ||
|
|
7efef28d4f | ||
|
|
d9140d2f8c | ||
|
|
e2657febf0 | ||
|
|
d161f1997d | ||
|
|
37490f2c74 | ||
|
|
9b1d7d44bf | ||
|
|
9562c9d828 | ||
|
|
6c2a980afc | ||
|
|
00ac2c19bd | ||
|
|
6742d09a70 | ||
|
|
41e8777609 | ||
|
|
20868aa233 | ||
|
|
27c6535ad0 | ||
|
|
c75e1ba0be | ||
|
|
c1e845cb22 | ||
|
|
803cc17410 | ||
|
|
f088c55cfe | ||
|
|
8a8864c90b | ||
|
|
1986bce538 | ||
|
|
c528d2cd95 | ||
|
|
7529ee4168 | ||
|
|
61c7f4469d | ||
|
|
896b4fc56a | ||
|
|
a58fa8602b | ||
|
|
d8f8b6ec70 | ||
|
|
b256d5a5f6 | ||
|
|
ea09cc2724 | ||
|
|
e3e0a511b6 | ||
|
|
0ecaab4da0 | ||
|
|
40644f33e6 | ||
|
|
809d4cc609 | ||
|
|
89e4e836c9 | ||
|
|
69ddcf553f | ||
|
|
1e1ec5aae8 | ||
|
|
e30e6435ca | ||
|
|
77700f361c | ||
|
|
ad4aa1d49b | ||
|
|
8499ed3d65 | ||
|
|
db605120fa | ||
|
|
9106ac4522 | ||
|
|
713dbb7f45 | ||
|
|
c3d23d7cae | ||
|
|
a1edf74fcf | ||
|
|
59a95edd3d | ||
|
|
e34a7afe79 | ||
|
|
2dcbe0f1c2 | ||
|
|
b1c8ce8b58 | ||
|
|
b304511b5e | ||
|
|
163d4e0534 | ||
|
|
72f64ee60b | ||
|
|
cd03abb7ed | ||
|
|
6551bf56f8 | ||
|
|
de0d050689 | ||
|
|
d59709071a | ||
|
|
ae3ae46151 | ||
|
|
58fc6a8478 | ||
|
|
d9b8d0d1ff | ||
|
|
2b0b31b402 | ||
|
|
4a47151526 | ||
|
|
adeec10188 | ||
|
|
e747deae88 | ||
|
|
264fffbc6c | ||
|
|
a295d653b8 | ||
|
|
c6eec799fb | ||
|
|
8503840307 | ||
|
|
c4dbecc1ea | ||
|
|
3d71967983 | ||
|
|
161e016594 | ||
|
|
82f795c9ee | ||
|
|
2670c68467 | ||
|
|
6f7730c455 | ||
|
|
274cef6cf5 | ||
|
|
fbea9b655d | ||
|
|
6869f2d71d | ||
|
|
e871a1aed6 | ||
|
|
b222fba42c | ||
|
|
f9957b1d90 | ||
|
|
bc6374f7fc | ||
|
|
c739a16d70 | ||
|
|
7684ce60ce | ||
|
|
4701712a86 | ||
|
|
e5ff9e7f00 | ||
|
|
7adb0c5226 | ||
|
|
667833dda5 | ||
|
|
646ff00ade | ||
|
|
ffcfa4ccb1 | ||
|
|
5c63928636 | ||
|
|
0624c1b945 | ||
|
|
b658f7ff68 | ||
|
|
cd51afb01f | ||
|
|
14ffa2c2d6 | ||
|
|
09aaf43dd1 | ||
|
|
590eedeb46 | ||
|
|
d3710e8e9a | ||
|
|
0da1a6639a | ||
|
|
729eb43115 | ||
|
|
4d85e517b4 | ||
|
|
3b95859b79 | ||
|
|
47cc827c1f | ||
|
|
715b7032bc | ||
|
|
bc1729b255 | ||
|
|
3dd4184193 | ||
|
|
2b4a05eedd | ||
|
|
898a9ce208 | ||
|
|
dd87ccff4d | ||
|
|
78c7d36b1c | ||
|
|
44d4a426b5 | ||
|
|
3273f7e992 | ||
|
|
d2d19b43c2 | ||
|
|
fe2014854e | ||
|
|
ebe4fdc5b5 | ||
|
|
43d7e8a437 | ||
|
|
833b5a9ea8 | ||
|
|
05dda0117f | ||
|
|
6f0dfecc3d | ||
|
|
2414b7a968 | ||
|
|
7b20314edb | ||
|
|
193f470eaf | ||
|
|
4335fd7ce0 | ||
|
|
ef2cf277c1 | ||
|
|
66db267e27 | ||
|
|
27fbe37375 | ||
|
|
7b3fd4450e | ||
|
|
58d1e8f0c5 | ||
|
|
8ce690ce78 | ||
|
|
c676a5bf82 | ||
|
|
37f17209d3 | ||
|
|
f24134a8f5 | ||
|
|
1f2036defd | ||
|
|
f2aaf5ab38 | ||
|
|
32f48e555c | ||
|
|
942f021b58 | ||
|
|
4dc321454e | ||
|
|
3a24318694 | ||
|
|
bae6221991 | ||
|
|
c67ba6da0d | ||
|
|
4d23ca221f | ||
|
|
09eab9529a | ||
|
|
3bb23708fc | ||
|
|
672b3c052b | ||
|
|
bfe7b7a735 | ||
|
|
230866890e | ||
|
|
355cfb7571 | ||
|
|
8dddfe056e | ||
|
|
9c33827de3 | ||
|
|
a34fa53823 | ||
|
|
565a76ae27 | ||
|
|
dc9c3b1c5d | ||
|
|
a394fb71dc | ||
|
|
6cbf3baa1b | ||
|
|
10322135e3 | ||
|
|
12d1d04462 | ||
|
|
8b4c2f5e90 | ||
|
|
aaffc731ee | ||
|
|
5ce55aff02 | ||
|
|
aa1c0bb557 | ||
|
|
25bc2dce57 | ||
|
|
7e35d164dc | ||
|
|
8666ffaff3 | ||
|
|
020f6a123d | ||
|
|
c2c89b0ff3 | ||
|
|
ef3570dc95 | ||
|
|
add8c4e8a2 | ||
|
|
c05e6f4de4 | ||
|
|
e32576d5ed | ||
|
|
bd3657d8f3 | ||
|
|
4418d6bb2b | ||
|
|
dbcafdd314 | ||
|
|
4dd1803a70 | ||
|
|
99272fb7e0 | ||
|
|
a24d2e25ed | ||
|
|
a5a663bc99 | ||
|
|
2b7eb91694 | ||
|
|
684770a220 | ||
|
|
f6546bf1de | ||
|
|
355b97398b | ||
|
|
6242a0be80 | ||
|
|
18413c923c | ||
|
|
ffd628902c | ||
|
|
ca34053125 | ||
|
|
d06f93e772 | ||
|
|
0e89ff56a8 | ||
|
|
f00f21c4bd | ||
|
|
2e9127449c | ||
|
|
483719568f | ||
|
|
018598a300 | ||
|
|
e262a46cfd | ||
|
|
00bf1c028b | ||
|
|
21ebb934f4 | ||
|
|
2ecd2cfe3b | ||
|
|
ce4b3091dd | ||
|
|
f722816849 | ||
|
|
4cb38b23eb | ||
|
|
f3e46227d8 | ||
|
|
185cd01e19 |
57
.dockerignore
Normal file
57
.dockerignore
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
# Version control
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
.gitattributes
|
||||||
|
|
||||||
|
# CI / GitHub / Docker
|
||||||
|
.github
|
||||||
|
.whitesource
|
||||||
|
.dockerignore
|
||||||
|
|
||||||
|
# Editor / IDE
|
||||||
|
.idea
|
||||||
|
.vscode
|
||||||
|
.settings
|
||||||
|
.project
|
||||||
|
.pydevproject
|
||||||
|
.mr.developer.cfg
|
||||||
|
|
||||||
|
# Claude
|
||||||
|
.claude
|
||||||
|
|
||||||
|
# Python build artifacts
|
||||||
|
__pycache__
|
||||||
|
*.py[cod]
|
||||||
|
*.so
|
||||||
|
*.egg
|
||||||
|
*.egg-info
|
||||||
|
build/
|
||||||
|
dist/
|
||||||
|
eggs/
|
||||||
|
parts/
|
||||||
|
var/
|
||||||
|
sdist/
|
||||||
|
develop-eggs/
|
||||||
|
.installed.cfg
|
||||||
|
lib/
|
||||||
|
lib64/
|
||||||
|
.ropeproject
|
||||||
|
|
||||||
|
# Test & coverage
|
||||||
|
tests/
|
||||||
|
pytest.ini
|
||||||
|
.coveragerc
|
||||||
|
.coverage
|
||||||
|
.coverage*
|
||||||
|
.tox
|
||||||
|
.cache
|
||||||
|
.pytest_cache
|
||||||
|
nosetests.xml
|
||||||
|
|
||||||
|
# Virtualenv
|
||||||
|
env/
|
||||||
|
venv/
|
||||||
|
.venv/
|
||||||
|
|
||||||
|
# Editor backup files
|
||||||
|
*~
|
||||||
40
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
40
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
name: Bug report
|
||||||
|
description: Report a bug so we can fix it.
|
||||||
|
title: "[Bug]: "
|
||||||
|
labels: ["bug"]
|
||||||
|
body:
|
||||||
|
- type: textarea
|
||||||
|
id: what-happened
|
||||||
|
attributes:
|
||||||
|
label: What happened?
|
||||||
|
description: A clear description of the bug.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: reproduce
|
||||||
|
attributes:
|
||||||
|
label: Steps to reproduce
|
||||||
|
description: How can we reproduce this? Numbered steps if possible.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: expected
|
||||||
|
attributes:
|
||||||
|
label: Expected behavior
|
||||||
|
description: What did you expect to happen instead?
|
||||||
|
- type: input
|
||||||
|
id: version
|
||||||
|
attributes:
|
||||||
|
label: Version / commit
|
||||||
|
description: Which version or commit hash are you on?
|
||||||
|
- type: textarea
|
||||||
|
id: environment
|
||||||
|
attributes:
|
||||||
|
label: Environment
|
||||||
|
description: OS, runtime version, anything else that might be relevant.
|
||||||
|
- type: textarea
|
||||||
|
id: logs
|
||||||
|
attributes:
|
||||||
|
label: Relevant logs
|
||||||
|
description: Paste any relevant log output. This is automatically rendered as code.
|
||||||
|
render: shell
|
||||||
@ -10,7 +10,7 @@ jobs:
|
|||||||
name: Add issue to project
|
name: Add issue to project
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/add-to-project@v1.0.1
|
- uses: actions/add-to-project@v2
|
||||||
with:
|
with:
|
||||||
project-url: https://github.com/orgs/GNS3/projects/3
|
project-url: https://github.com/orgs/GNS3/projects/3
|
||||||
github-token: ${{ secrets.ADD_NEW_ISSUES_TO_PROJECT }}
|
github-token: ${{ secrets.ADD_NEW_ISSUES_TO_PROJECT }}
|
||||||
|
|||||||
6
.github/workflows/codeql-analysis.yml
vendored
6
.github/workflows/codeql-analysis.yml
vendored
@ -56,11 +56,11 @@ jobs:
|
|||||||
# your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
|
# your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v3
|
uses: github/codeql-action/init@v4
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
build-mode: ${{ matrix.build-mode }}
|
build-mode: ${{ matrix.build-mode }}
|
||||||
@ -88,6 +88,6 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v3
|
uses: github/codeql-action/analyze@v4
|
||||||
with:
|
with:
|
||||||
category: "/language:${{matrix.language}}"
|
category: "/language:${{matrix.language}}"
|
||||||
|
|||||||
68
.github/workflows/docker-build.yml
vendored
Normal file
68
.github/workflows/docker-build.yml
vendored
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
name: Build and Push Docker Image
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- v2.*
|
||||||
|
- v3.*
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
DOCKERHUB_ORG: ${{ vars.DOCKERHUB_ORG || 'gns3' }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Check for stable release
|
||||||
|
id: ver
|
||||||
|
run: |
|
||||||
|
TAG="${GITHUB_REF_NAME#v}"
|
||||||
|
echo "tag=$TAG" >> $GITHUB_OUTPUT
|
||||||
|
if echo "$TAG" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+$'; then
|
||||||
|
echo "stable=true" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "stable=false" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Set lowercase image name vars
|
||||||
|
if: steps.ver.outputs.stable == 'true'
|
||||||
|
id: names
|
||||||
|
run: |
|
||||||
|
echo "owner=$(echo '${{ github.repository_owner }}' | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "repo=$(echo '${{ github.event.repository.name }}' | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
if: steps.ver.outputs.stable == 'true'
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Login to GitHub Container Registry
|
||||||
|
if: steps.ver.outputs.stable == 'true'
|
||||||
|
uses: docker/login-action@v4
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.repository_owner }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
if: steps.ver.outputs.stable == 'true'
|
||||||
|
uses: docker/login-action@v4
|
||||||
|
with:
|
||||||
|
registry: docker.io
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Build and push
|
||||||
|
if: steps.ver.outputs.stable == 'true'
|
||||||
|
uses: docker/build-push-action@v6
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
push: true
|
||||||
|
tags: |
|
||||||
|
${{ env.DOCKERHUB_ORG }}/${{ github.event.repository.name }}:${{ steps.ver.outputs.tag }}
|
||||||
|
${{ env.DOCKERHUB_ORG }}/${{ github.event.repository.name }}:latest
|
||||||
|
ghcr.io/${{ steps.names.outputs.owner }}/${{ steps.names.outputs.repo }}:${{ steps.ver.outputs.tag }}
|
||||||
|
ghcr.io/${{ steps.names.outputs.owner }}/${{ steps.names.outputs.repo }}:latest
|
||||||
@ -12,11 +12,11 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v7
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
ref: "gh-pages"
|
ref: "gh-pages"
|
||||||
- uses: actions/setup-python@v5
|
- uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: 3.8
|
python-version: 3.8
|
||||||
- name: Merge changes from 3.0 branch
|
- name: Merge changes from 3.0 branch
|
||||||
|
|||||||
10
.github/workflows/testing.yml
vendored
10
.github/workflows/testing.yml
vendored
@ -18,16 +18,12 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
os: ["ubuntu-latest"]
|
os: ["ubuntu-latest"]
|
||||||
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
|
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
|
||||||
#include:
|
|
||||||
# only test with Python 3.10 on Windows
|
|
||||||
# - os: windows-latest
|
|
||||||
# python-version: "3.10"
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v7
|
||||||
- name: Set up Python ${{ matrix.python-version }}
|
- name: Set up Python ${{ matrix.python-version }}
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
|
|||||||
88
CHANGELOG
88
CHANGELOG
@ -1,5 +1,93 @@
|
|||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
|
## 2.2.61 30/07/2026
|
||||||
|
|
||||||
|
* Sync appliances
|
||||||
|
* fix(import): unvalidated symlink creation in import_project
|
||||||
|
* fix(qemu): fix addition of QEMU RNG device causes interface names to change
|
||||||
|
* fix(qemu): remove trailing space from RNG object argument
|
||||||
|
* fix: do not start nodes when deleting a project
|
||||||
|
* fix: correct always-true state check in DockerVM.stop()
|
||||||
|
|
||||||
|
## 2.2.60 15/07/2026
|
||||||
|
|
||||||
|
* Sync appliances
|
||||||
|
* Only set IOU images to be executable when importing images
|
||||||
|
* fix(import): project import does not move images symlinks into place
|
||||||
|
* Search for system UEFI that is compatible with Python < 3.12
|
||||||
|
* Add OVMF firmware directory configuration
|
||||||
|
* Automatically add a Random Number Generator (RNG) device when using uefi option is enabled
|
||||||
|
* fix(docker): handle container name conflict automatically
|
||||||
|
* fix: gns3-server crashes on startup if "Open this project in the background" is active but there is a problem with that project
|
||||||
|
* Handle HTTPNotFound exception when retrieving compute status
|
||||||
|
* Fix: Check compute connectivity before open() during project deletion
|
||||||
|
* API endpoints to manage base configuration files for templates
|
||||||
|
|
||||||
|
## 2.2.59 08/05/2026
|
||||||
|
|
||||||
|
* Sync appliances
|
||||||
|
* Fix snapshot restore does not work after export/import of project
|
||||||
|
* Warn to use 64-bit IOU images. Fixes #2716 32-bit IOU image support has been removed from the GNS3 VM.
|
||||||
|
* Fix telnet console silent-proxy hang on non-ConnectionError exit (#2344)
|
||||||
|
|
||||||
|
## 2.2.58.1 12/04/2026
|
||||||
|
|
||||||
|
* Sync appliances
|
||||||
|
|
||||||
|
## 2.2.58 10/04/2026
|
||||||
|
|
||||||
|
* Bundle web-ui v2.2.58
|
||||||
|
* Sync appliances
|
||||||
|
* Snapshot refactoring
|
||||||
|
|
||||||
|
## 2.2.57 23/03/2026
|
||||||
|
|
||||||
|
* feat(telnet_server): improve error handling and connection management
|
||||||
|
* Deactivate 'use default IOU values' by default and update RAM/NVRAM values
|
||||||
|
* Make sure the node shows as stopped when the wrap console cannot be stopped
|
||||||
|
* tests(controller,port): short_name finishes successfully when port name is None
|
||||||
|
* fix(controller,port): handle None port name to prevent TypeError in short_name method
|
||||||
|
* fix: busybox static link detection on Alpine/musl
|
||||||
|
* Take populated disks into consideration when calculating PCI device ID
|
||||||
|
|
||||||
|
## 2.2.56.1 28/01/2026
|
||||||
|
|
||||||
|
* Fix telnet keepalive options on macOS
|
||||||
|
* Upgrade dependencies
|
||||||
|
* Drop Python 3.8 support
|
||||||
|
|
||||||
|
## 2.2.56 21/01/2026
|
||||||
|
|
||||||
|
* Set default location of udhcpc in "/etc/network/udhcpc". Fixes #2582
|
||||||
|
* Upgrade pywin32 to v311
|
||||||
|
|
||||||
|
## 2.2.55 19/11/2025
|
||||||
|
|
||||||
|
* Docker API version requirements and process to handle older daemons
|
||||||
|
* Use docker_name property when creating a container
|
||||||
|
* Set name of container in Docker
|
||||||
|
* Support for Python 3.14
|
||||||
|
* Enable ip cef in IOU L2 and IOU L3 base configs
|
||||||
|
* Only build and push Docker image when releasing a new version
|
||||||
|
* Fix pushing Docker image to Docker hub
|
||||||
|
* Update security issues in README.md. Fixes #2535
|
||||||
|
* Add missing 'nat' template type in schema. Fixes #2529
|
||||||
|
* Resolve deprecation warnings of regex library
|
||||||
|
|
||||||
|
## 2.2.54 21/04/2025
|
||||||
|
|
||||||
|
* Bundle web-ui v2.2.54
|
||||||
|
* Add new method to find the IP address of a VBox GNS3 VM + allow NAT Network
|
||||||
|
* Add edk2-stable202502 UEFI firmwares and try to first use firmwares from the ovmf package if installed. Fixes #2494
|
||||||
|
* Try to detect swtpm and AppArmor issue. Ref https://github.com/GNS3/gns3-gui/issues/3725
|
||||||
|
* Fix Docker logs decoding. Ref #2522
|
||||||
|
* Add delay after starting a Docker container and adding connections in uBridge. Ref #2522
|
||||||
|
* Fix TypeError when reading Docker container logs. Ref #2522
|
||||||
|
* Replace "Docker hub" by "Docker repository" because it is possible to use different repositories
|
||||||
|
* Upgrade dependencies
|
||||||
|
* Improvements for remote-install.sh
|
||||||
|
|
||||||
|
|
||||||
## 2.2.53 21/01/2025
|
## 2.2.53 21/01/2025
|
||||||
|
|
||||||
* Bundle web-ui v2.2.53
|
* Bundle web-ui v2.2.53
|
||||||
|
|||||||
19
Dockerfile
19
Dockerfile
@ -1,13 +1,16 @@
|
|||||||
# Dockerfile for GNS3 server development
|
# Dockerfile for GNS3 server development
|
||||||
|
|
||||||
FROM ubuntu:18.04
|
FROM ubuntu:24.04
|
||||||
|
|
||||||
ENV DEBIAN_FRONTEND noninteractive
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
# Set the locale
|
# Set the locale
|
||||||
ENV LANG en_US.UTF-8
|
ENV LANG=en_US.UTF-8
|
||||||
ENV LANGUAGE en_US:en
|
ENV LANGUAGE=en_US:en
|
||||||
ENV LC_ALL en_US.UTF-8
|
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 apt-get update && apt-get install -y software-properties-common
|
||||||
RUN add-apt-repository ppa:gns3/ppa
|
RUN add-apt-repository ppa:gns3/ppa
|
||||||
@ -17,13 +20,13 @@ RUN apt-get update && apt-get install -y \
|
|||||||
python3-dev \
|
python3-dev \
|
||||||
qemu-system-x86 \
|
qemu-system-x86 \
|
||||||
qemu-kvm \
|
qemu-kvm \
|
||||||
libvirt-bin \
|
libvirt-daemon-system libvirt-clients \
|
||||||
x11vnc
|
x11vnc
|
||||||
|
|
||||||
RUN locale-gen en_US.UTF-8
|
RUN locale-gen en_US.UTF-8
|
||||||
|
|
||||||
# Install uninstall to install dependencies
|
# Install uninstall to install dependencies
|
||||||
RUN apt-get install -y vpcs ubridge
|
RUN apt-get install -y vpcs ubridge dynamips
|
||||||
|
|
||||||
ADD . /server
|
ADD . /server
|
||||||
WORKDIR /server
|
WORKDIR /server
|
||||||
@ -32,4 +35,4 @@ RUN pip3 install --no-cache-dir -r /server/requirements.txt
|
|||||||
|
|
||||||
EXPOSE 3080
|
EXPOSE 3080
|
||||||
|
|
||||||
CMD python3 -m gns3server
|
CMD [ "python3", "-m", "gns3server", "--port", "3080" ]
|
||||||
|
|||||||
@ -112,6 +112,12 @@ For development, you can run the GNS3 server in a container
|
|||||||
bash scripts/docker_dev_server.sh
|
bash scripts/docker_dev_server.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### use Docker Compose
|
||||||
|
|
||||||
|
``` {.bash}
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
### Run as daemon (Unix only)
|
### Run as daemon (Unix only)
|
||||||
|
|
||||||
You will find init sample scripts for various systems inside the init
|
You will find init sample scripts for various systems inside the init
|
||||||
@ -253,5 +259,4 @@ py.test --cov-report term-missing --cov=gns3server
|
|||||||
Security issues
|
Security issues
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
Please contact us using contact form available 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
|
||||||
<http://docs.gns3.com/1ON9JBXSeR7Nt2-Qum2o3ZX0GU86BZwlmNSUgvmqNWGY/index.html>
|
|
||||||
|
|||||||
7
compose.yaml
Normal file
7
compose.yaml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
services:
|
||||||
|
gen3-server:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
ports:
|
||||||
|
- "8001:3080"
|
||||||
@ -103,6 +103,8 @@ enable_hardware_acceleration = True
|
|||||||
require_hardware_acceleration = False
|
require_hardware_acceleration = False
|
||||||
; Allow unsafe additional command line options
|
; Allow unsafe additional command line options
|
||||||
allow_unsafe_options = False
|
allow_unsafe_options = False
|
||||||
|
; Path to the OVMF firmware directory
|
||||||
|
ovmf_firmware_dir = "/usr/share/OVMF"
|
||||||
|
|
||||||
[VMware]
|
[VMware]
|
||||||
; First vmnet interface of the range that can be managed by the GNS3 server
|
; First vmnet interface of the range that can be managed by the GNS3 server
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
-rrequirements.txt
|
-rrequirements.txt
|
||||||
|
|
||||||
pytest==8.3.3
|
pytest==8.4.2 # version 8.4.2 is the last one supporting Python 3.9
|
||||||
flake8==7.1.0
|
flake8==7.3.0
|
||||||
pytest-timeout==2.3.1
|
pytest-timeout==2.4.0
|
||||||
pytest-aiohttp==1.0.5
|
pytest-aiohttp==1.1.0
|
||||||
|
|||||||
17
docs/api/examples/controller_get_templateidbaseconfig.txt
Normal file
17
docs/api/examples/controller_get_templateidbaseconfig.txt
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
curl -i -X 'http://localhost:3080/v2/templates/19021f99-e36f-394d-b4a1-8aaa902ab9cc/base-config/vpcs_base_config.txt'
|
||||||
|
|
||||||
|
GET /v2/templates/19021f99-e36f-394d-b4a1-8aaa902ab9cc/base-config/vpcs_base_config.txt HTTP/1.1
|
||||||
|
|
||||||
|
HTTP/1.1 200 OK
|
||||||
|
Connection: close
|
||||||
|
X-Route: /v2/templates/{template_id}/base-config/{filename}
|
||||||
|
Server: Python/3.14 GNS3/2.2.60.dev1+713dbb7f
|
||||||
|
Content-Type: application/json
|
||||||
|
Content-Length: 144
|
||||||
|
Date: Mon, 18 May 2026 18:34:10 GMT
|
||||||
|
|
||||||
|
{
|
||||||
|
"content": "# test config\n\ndhcp\n",
|
||||||
|
"filename": "vpcs_base_config.txt",
|
||||||
|
"template_id": "19021f99-e36f-394d-b4a1-8aaa902ab9cc"
|
||||||
|
}
|
||||||
44
docs/api/examples/controller_get_templatesbaseconfigs.txt
Normal file
44
docs/api/examples/controller_get_templatesbaseconfigs.txt
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
curl -i -X 'http://localhost:3080/v2/templates/base-configs'
|
||||||
|
|
||||||
|
GET /v2/templates/base-configs HTTP/1.1
|
||||||
|
|
||||||
|
HTTP/1.1 200 OK
|
||||||
|
Connection: close
|
||||||
|
X-Route: /v2/templates/base-configs
|
||||||
|
Server: Python/3.14 GNS3/2.2.60.dev1+713dbb7f
|
||||||
|
Content-Type: application/json
|
||||||
|
Content-Length: 576
|
||||||
|
Date: Mon, 18 May 2026 18:28:53 GMT
|
||||||
|
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"filename": "config1.txt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "config2.txt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "ios_base_startup-config.txt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "ios_etherswitch_startup-config.txt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "iou_l2_base_startup-config.txt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "iou_l3_base_startup-config.txt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "test_config.txt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "update_test.txt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "vpcs_base_config.txt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "vpcs_base_config2.txt"
|
||||||
|
}
|
||||||
|
]
|
||||||
17
docs/api/examples/controller_put_templateidbaseconfig.txt
Normal file
17
docs/api/examples/controller_put_templateidbaseconfig.txt
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
curl -i -X 'http://localhost:3080/v2/templates/19021f99-e36f-394d-b4a1-8aaa902ab9cc/base-config/vpcs_base_config.txt'
|
||||||
|
|
||||||
|
PUT /v2/templates/19021f99-e36f-394d-b4a1-8aaa902ab9cc/base-config/vpcs_base_config.txt HTTP/1.1
|
||||||
|
|
||||||
|
HTTP/1.1 200 OK
|
||||||
|
Connection: close
|
||||||
|
X-Route: /v2/templates/{template_id}/base-config/{filename}
|
||||||
|
Server: Python/3.14 GNS3/2.2.60.dev1+713dbb7f
|
||||||
|
Content-Type: application/json
|
||||||
|
Content-Length: 144
|
||||||
|
Date: Mon, 18 May 2026 18:37:57 GMT
|
||||||
|
|
||||||
|
{
|
||||||
|
"content": "# test config\n\ndhcp\n",
|
||||||
|
"filename": "vpcs_base_config.txt",
|
||||||
|
"template_id": "19021f99-e36f-394d-b4a1-8aaa902ab9cc"
|
||||||
|
}
|
||||||
38
docs/api/v2/controller/template/templatesbaseconfigs.rst
Normal file
38
docs/api/v2/controller/template/templatesbaseconfigs.rst
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
GET /v2/templates/base-configs
|
||||||
|
------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
|
||||||
|
GET /v2/templates/base-configs
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
List all available base configuration files
|
||||||
|
|
||||||
|
Response status codes
|
||||||
|
**********************
|
||||||
|
- **200**: List of base configuration files returned
|
||||||
|
|
||||||
|
Output
|
||||||
|
*******
|
||||||
|
|
||||||
|
.. raw:: html
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Type</th>
|
||||||
|
<th>Description</th>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>filename</td>
|
||||||
|
<td>string</td>
|
||||||
|
<td>Name of the base configuration file</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
|
||||||
|
Sample session
|
||||||
|
***************
|
||||||
|
|
||||||
|
.. literalinclude:: ../../../examples/controller_get_templatesbaseconfigs.txt
|
||||||
@ -0,0 +1,90 @@
|
|||||||
|
/v2/templates/{template_id}/base-config/{filename}
|
||||||
|
------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
|
||||||
|
GET /v2/templates/**{template_id}**/base-configs/**{filename}**
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
List all available base configuration files
|
||||||
|
|
||||||
|
Response status codes
|
||||||
|
**********************
|
||||||
|
- **200**: List of base configuration files returned
|
||||||
|
|
||||||
|
Output
|
||||||
|
*******
|
||||||
|
|
||||||
|
.. raw:: html
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Type</th>
|
||||||
|
<th>Description</th>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>filename</td>
|
||||||
|
<td>string</td>
|
||||||
|
<td>Name of the base configuration file</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
|
||||||
|
Sample session
|
||||||
|
***************
|
||||||
|
|
||||||
|
.. literalinclude:: ../../../examples/controller_get_templateidbaseconfig.txt
|
||||||
|
|
||||||
|
|
||||||
|
PUT /v2/templates/**{template_id}**/base-config/**{filename}**
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Update base configuration file content
|
||||||
|
|
||||||
|
Response status codes
|
||||||
|
**********************
|
||||||
|
- **200**: File updated
|
||||||
|
- **404**: File not found
|
||||||
|
|
||||||
|
Input
|
||||||
|
*******
|
||||||
|
|
||||||
|
.. raw:: html
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Mandatory</th>
|
||||||
|
<th>Type</th>
|
||||||
|
<th>Description</th>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr><td>content</td><td>✔</td><td>string</td><td>New file content</td></tr>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
|
||||||
|
Output
|
||||||
|
*******
|
||||||
|
|
||||||
|
.. raw:: html
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Mandatory</th>
|
||||||
|
<th>Type</th>
|
||||||
|
<th>Description</th>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr><td>template_id</td><td>✔</td><td>string</td><td>Template UUID</td></tr>
|
||||||
|
<tr><td>filename</td><td>✔</td><td>string</td><td>Base configuration filename</td></tr>
|
||||||
|
<tr><td>content</td><td>✔</td><td>string</td><td>Updated file content</td></tr>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
|
||||||
|
Sample session
|
||||||
|
***************
|
||||||
|
|
||||||
|
.. literalinclude:: ../../../examples/controller_put_templateidbaseconfig.txt
|
||||||
@ -25,6 +25,38 @@
|
|||||||
"options": "-cpu host -nographic"
|
"options": "-cpu host -nographic"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "AlmaLinux-10-GenericCloud-10.0-20250528.0.x86_64.qcow2",
|
||||||
|
"version": "10.0",
|
||||||
|
"md5sum": "e5099e33f16014b6cc851482d865720d",
|
||||||
|
"filesize": 460062720,
|
||||||
|
"download_url": "https://vault.almalinux.org/10.0/cloud/x86_64/images/",
|
||||||
|
"direct_download_url": "https://vault.almalinux.org/10.0/cloud/x86_64/images/AlmaLinux-10-GenericCloud-10.0-20250528.0.x86_64.qcow2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "AlmaLinux-9-GenericCloud-9.6-20250522.x86_64.qcow2",
|
||||||
|
"version": "9.6",
|
||||||
|
"md5sum": "ae02074389961caf08bbe44439603061",
|
||||||
|
"filesize": 530776064,
|
||||||
|
"download_url": "https://vault.almalinux.org/9.6/cloud/x86_64/images/",
|
||||||
|
"direct_download_url": "https://vault.almalinux.org/9.6/cloud/x86_64/images/AlmaLinux-9-GenericCloud-9.6-20250522.x86_64.qcow2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "AlmaLinux-9-GenericCloud-9.5-20241120.x86_64.qcow2",
|
||||||
|
"version": "9.5",
|
||||||
|
"md5sum": "cb48bc1c609a1d3d62f48397acdd038e",
|
||||||
|
"filesize": 490995712,
|
||||||
|
"download_url": "https://vault.almalinux.org/9.5/cloud/x86_64/images/",
|
||||||
|
"direct_download_url": "https://vault.almalinux.org/9.5/cloud/x86_64/images/AlmaLinux-9-GenericCloud-9.5-20241120.x86_64"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "AlmaLinux-9-GenericCloud-9.4-20240805.x86_64.qcow2",
|
||||||
|
"version": "9.4",
|
||||||
|
"md5sum": "7c5040c044a989c524d40824cebb4a4d",
|
||||||
|
"filesize": 591724544,
|
||||||
|
"download_url": "https://vault.almalinux.org/9.4/cloud/x86_64/images/",
|
||||||
|
"direct_download_url": "https://vault.almalinux.org/9.4/cloud/x86_64/images/AlmaLinux-9-GenericCloud-9.4-20240805.x86_64.qcow2"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "AlmaLinux-9-GenericCloud-9.2-20230513.x86_64.qcow2",
|
"filename": "AlmaLinux-9-GenericCloud-9.2-20230513.x86_64.qcow2",
|
||||||
"version": "9.2",
|
"version": "9.2",
|
||||||
@ -33,6 +65,14 @@
|
|||||||
"download_url": "https://vault.almalinux.org/9.2/cloud/x86_64/images/",
|
"download_url": "https://vault.almalinux.org/9.2/cloud/x86_64/images/",
|
||||||
"direct_download_url": "https://vault.almalinux.org/9.2/cloud/x86_64/images/AlmaLinux-9-GenericCloud-9.2-20230513.x86_64.qcow2"
|
"direct_download_url": "https://vault.almalinux.org/9.2/cloud/x86_64/images/AlmaLinux-9-GenericCloud-9.2-20230513.x86_64.qcow2"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"filename": "AlmaLinux-8-GenericCloud-8.9-20231128.x86_64.qcow2",
|
||||||
|
"version": "8.9",
|
||||||
|
"md5sum": "1afc48c798960f0c6ebb65428c0ea973",
|
||||||
|
"filesize": 697434112,
|
||||||
|
"download_url": "https://vault.almalinux.org/8.9/cloud/x86_64/images/",
|
||||||
|
"direct_download_url": "https://vault.almalinux.org/8.9/cloud/x86_64/images/AlmaLinux-8-GenericCloud-8.9-20231128.x86_64.qcow2"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "AlmaLinux-8-GenericCloud-8.8-20230524.x86_64.qcow2",
|
"filename": "AlmaLinux-8-GenericCloud-8.8-20230524.x86_64.qcow2",
|
||||||
"version": "8.8",
|
"version": "8.8",
|
||||||
@ -59,6 +99,34 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "10.0",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "AlmaLinux-10-GenericCloud-10.0-20250528.0.x86_64.qcow2",
|
||||||
|
"cdrom_image": "almalinux-cloud-init-data.iso"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "9.6",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "AlmaLinux-9-GenericCloud-9.6-20250522.x86_64.qcow2",
|
||||||
|
"cdrom_image": "almalinux-cloud-init-data.iso"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "9.5",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "AlmaLinux-9-GenericCloud-9.5-20241120.x86_64.qcow2",
|
||||||
|
"cdrom_image": "almalinux-cloud-init-data.iso"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "9.4",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "AlmaLinux-9-GenericCloud-9.4-20240805.x86_64.qcow2",
|
||||||
|
"cdrom_image": "almalinux-cloud-init-data.iso"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "9.2",
|
"name": "9.2",
|
||||||
"images": {
|
"images": {
|
||||||
@ -66,6 +134,13 @@
|
|||||||
"cdrom_image": "almalinux-cloud-init-data.iso"
|
"cdrom_image": "almalinux-cloud-init-data.iso"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "8.9",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "AlmaLinux-8-GenericCloud-8.9-20231128.x86_64.qcow2",
|
||||||
|
"cdrom_image": "almalinux-cloud-init-data.iso"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "8.8",
|
"name": "8.8",
|
||||||
"images": {
|
"images": {
|
||||||
|
|||||||
21
gns3server/appliances/alpinet.gns3a
Normal file
21
gns3server/appliances/alpinet.gns3a
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"appliance_id": "a2209414-88a6-403b-a2e1-477a057ec954",
|
||||||
|
"name": "AlpiNet",
|
||||||
|
"category": "guest",
|
||||||
|
"description": "AlpiNet is a lightweight Alpine-based networking toolbox for GNS3.\n\nCOMPREHENSIVE TOOLKIT:\n• Network: ip, ifconfig, ping, traceroute, mtr, arping, nmap, tcpdump\n• Performance: iperf, iperf3\n• HTTP/Web: curl, wget\n• TCP/UDP: netcat, socat, telnet\n• Advanced: ethtool, bridge-utils, vlan\n• Firewall: iptables, ip6tables, nftables\n• File Transfer: FTP (lftp), TFTP, SSH (scp/sftp), rsync\n• DNS: host, nslookup, dig\n• System: nano, tmux, screen, htop, bash\n• Text Tools: grep, sed, awk, jq, less\n• Compression: tar, gzip\n• Utilities: tree, file, openssl\n\nType 'alpinet-tools' in the container for the complete tool list.\n\nOptimized for network testing, troubleshooting, and education.",
|
||||||
|
"vendor_name": "AlpiNet Project",
|
||||||
|
"vendor_url": "https://www.alpinelinux.org/",
|
||||||
|
"product_name": "AlpiNet",
|
||||||
|
"registry_version": 4,
|
||||||
|
"status": "stable",
|
||||||
|
"maintainer": "nazDridoy",
|
||||||
|
"maintainer_email": "nazdridoy399@gmail.com",
|
||||||
|
"usage": "The /root directory is persistent across restarts. Type 'alpinet-tools' to see all available utilities.",
|
||||||
|
"symbol": "AlpiNet.svg",
|
||||||
|
"docker": {
|
||||||
|
"adapters": 1,
|
||||||
|
"image": "gns3/alpinet:latest",
|
||||||
|
"console_type": "telnet",
|
||||||
|
"environment": "TERM=xterm"
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -29,23 +29,30 @@
|
|||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
{
|
{
|
||||||
"filename": "vEOS-lab-4.33.1F.qcow2",
|
"filename": "vEOS64-lab-4.35.3F.qcow2",
|
||||||
"version": "4.33.1F",
|
"version": "4.35.3F",
|
||||||
"md5sum": "8f662409c0732ed9f682edce63601e8a",
|
"md5sum": "00d11e33dc4288f509441a4ab6319ca0",
|
||||||
"filesize": 611909632,
|
"filesize": 638910464,
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
"download_url": "https://www.arista.com/en/support/software-download"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "vEOS-lab-4.32.3M.qcow2",
|
"filename": "vEOS64-lab-4.33.2F.qcow2",
|
||||||
"version": "4.32.3M",
|
"version": "4.33.2F",
|
||||||
"md5sum": "46fc46f5ed1da8752eed8396f08862f8",
|
"md5sum": "fbe629a8342cd0b3b19566b9d7ef4f4f",
|
||||||
"filesize": 605683712,
|
"filesize": 610992128,
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
"download_url": "https://www.arista.com/en/support/software-download"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "vEOS-lab-4.31.6M.qcow2",
|
"filename": "vEOS64-lab-4.32.4.1M.qcow2",
|
||||||
|
"version": "4.32.4.1M",
|
||||||
|
"md5sum": "cd369b5ccfd87ccd83a34538681ba35f",
|
||||||
|
"filesize": 605159424,
|
||||||
|
"download_url": "https://www.arista.com/en/support/software-download"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "vEOS64-lab-4.31.6M.qcow2",
|
||||||
"version": "4.31.6M",
|
"version": "4.31.6M",
|
||||||
"md5sum": "7410110b77472f058322ec4681f8a356",
|
"md5sum": "02fbd929de9416e1096cd2454507d6ce",
|
||||||
"filesize": 590479360,
|
"filesize": 590479360,
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
"download_url": "https://www.arista.com/en/support/software-download"
|
||||||
},
|
},
|
||||||
@ -59,24 +66,31 @@
|
|||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
"name": "4.33.1F",
|
"name": "4.35.3F",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.2.iso",
|
"hda_disk_image": "Aboot-veos-serial-8.0.2.iso",
|
||||||
"hdb_disk_image": "vEOS-lab-4.33.1F.qcow2"
|
"hdb_disk_image": "vEOS64-lab-4.35.3F.qcow2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "4.32.3M",
|
"name": "4.33.2F",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.2.iso",
|
"hda_disk_image": "Aboot-veos-serial-8.0.2.iso",
|
||||||
"hdb_disk_image": "vEOS-lab-4.32.3M.qcow2"
|
"hdb_disk_image": "vEOS64-lab-4.33.2F.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "4.32.4.1M",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "Aboot-veos-serial-8.0.2.iso",
|
||||||
|
"hdb_disk_image": "vEOS64-lab-4.32.4.1M.qcow2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "4.31.6M",
|
"name": "4.31.6M",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.2.iso",
|
"hda_disk_image": "Aboot-veos-serial-8.0.2.iso",
|
||||||
"hdb_disk_image": "vEOS-lab-4.31.6M.qcow2"
|
"hdb_disk_image": "vEOS64-lab-4.31.6M.qcow2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
59
gns3server/appliances/armbian.gns3a
Normal file
59
gns3server/appliances/armbian.gns3a
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
{
|
||||||
|
"appliance_id": "b3b90fde-143a-4129-8031-ccbba73c5e02",
|
||||||
|
"name": "armbian",
|
||||||
|
"category": "guest",
|
||||||
|
"description": "A highly optimized base operating system specialized for single board computers (SBCs) and its extensive build framework.",
|
||||||
|
"vendor_name": "The Armbian team",
|
||||||
|
"vendor_url": "https://armbian.com/",
|
||||||
|
"documentation_url": "https://docs.armbian.com/",
|
||||||
|
"product_name": "Armbian UEFI x86",
|
||||||
|
"product_url": "https://armbian.com/boards/uefi-x86",
|
||||||
|
"registry_version": 4,
|
||||||
|
"status": "stable",
|
||||||
|
"maintainer": "GNS3 Team",
|
||||||
|
"maintainer_email": "developers@gns3.net",
|
||||||
|
"usage": "By first login you create root password and new sudo user.\n\nBoot disk from UEFI shell, type: FS0:EFI\\BOOT\\BOOTX64 and press <Enter>",
|
||||||
|
"port_name_format": "Ethernet{0}",
|
||||||
|
"qemu": {
|
||||||
|
"adapter_type": "virtio-net-pci",
|
||||||
|
"adapters": 2,
|
||||||
|
"ram": 256,
|
||||||
|
"hda_disk_interface": "virtio",
|
||||||
|
"arch": "x86_64",
|
||||||
|
"console_type": "spice+agent",
|
||||||
|
"uefi": false,
|
||||||
|
"boot_priority": "c",
|
||||||
|
"kvm": "require",
|
||||||
|
"options": "-nographic"
|
||||||
|
},
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "OVMF-edk2-stable202305.fd",
|
||||||
|
"version": "stable202305",
|
||||||
|
"md5sum": "6c4cf1519fec4a4b95525d9ae562963a",
|
||||||
|
"filesize": 4194304,
|
||||||
|
"download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/",
|
||||||
|
"direct_download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/OVMF-edk2-stable202305.fd.zip/download",
|
||||||
|
"compression": "zip"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "Armbian_26.5.1_Uefi-x86_trixie_cloud_6.18.32_minimal.img.qcow2",
|
||||||
|
"version": "Armbian 26.5.1 Minimal (CLI)",
|
||||||
|
"md5sum": "7f4c915668718d6135406de5a6c4fc30",
|
||||||
|
"filesize": 877920512,
|
||||||
|
"download_url": "https://armbian.com/boards/uefi-x86",
|
||||||
|
"direct_download_url": "https://armbian.atomonetworks.com/dl/uefi-x86/archive/Armbian_26.5.1_Uefi-x86_trixie_cloud_6.18.32_minimal.img.qcow2.xz",
|
||||||
|
"compression": "xz"
|
||||||
|
}
|
||||||
|
|
||||||
|
],
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "Armbian 26.5.1 Minimal (CLI)",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "Armbian_26.5.1_Uefi-x86_trixie_cloud_6.18.32_minimal.img.qcow2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -32,6 +32,27 @@
|
|||||||
"process_priority": "normal"
|
"process_priority": "normal"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "arubaoscx-disk-image-genericx86-p4-20241115202521.vmdk",
|
||||||
|
"version": "10.15.0005",
|
||||||
|
"md5sum": "69b3675391c04c1a6e0fd0bf8d8bc2d9",
|
||||||
|
"filesize": 420049408,
|
||||||
|
"download_url": "https://networkingsupport.hpe.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "arubaoscx-disk-image-genericx86-p4-20240731173624.vmdk",
|
||||||
|
"version": "10.14.1000",
|
||||||
|
"md5sum": "01d6932fbc9c46180a4f41aee9e98301",
|
||||||
|
"filesize": 412140544,
|
||||||
|
"download_url": "https://networkingsupport.hpe.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "arubaoscx-disk-image-genericx86-p4-20240528190307.vmdk",
|
||||||
|
"version": "10.14.0001",
|
||||||
|
"md5sum": "83902dbaa74c37cdda3f066f79431933",
|
||||||
|
"filesize": 401023488,
|
||||||
|
"download_url": "https://networkingsupport.hpe.com"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "arubaoscx-disk-image-genericx86-p4-20240129204649.vmdk",
|
"filename": "arubaoscx-disk-image-genericx86-p4-20240129204649.vmdk",
|
||||||
"version": "10.13.1000",
|
"version": "10.13.1000",
|
||||||
@ -139,6 +160,24 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "10.15.0005",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "arubaoscx-disk-image-genericx86-p4-20241115202521.vmdk"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "10.14.1000",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "arubaoscx-disk-image-genericx86-p4-20240731173624.vmdk"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "10.14.0001",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "arubaoscx-disk-image-genericx86-p4-20240528190307.vmdk"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "10.13.1000",
|
"name": "10.13.1000",
|
||||||
"images": {
|
"images": {
|
||||||
|
|||||||
42
gns3server/appliances/asterfusion-vAsterNOS-VPP.gns3a
Normal file
42
gns3server/appliances/asterfusion-vAsterNOS-VPP.gns3a
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
{
|
||||||
|
"appliance_id": "4aa78f74-c769-43e0-9ef1-5dd2cf1909c6",
|
||||||
|
"name": "Asterfusion AsterNOS-VPP",
|
||||||
|
"category": "router",
|
||||||
|
"description": "AsterNOS-VPP leverages SONiC’s robust routing features and management capability with VPP’s high-performance data forwarding. It supports L3 routing, NAT, PPPoE, and VPN services. Minimum requirements: 4 vCPUs and 8GB RAM.",
|
||||||
|
"vendor_name": "Asterfusion",
|
||||||
|
"vendor_url": "https://cloudswit.ch/product/sonic-enterprise-distribution/#vAsterNOS",
|
||||||
|
"documentation_url": "https://docs.asternos.com/routing",
|
||||||
|
"product_name": "AsterNOS-VPP",
|
||||||
|
"registry_version": 6,
|
||||||
|
"status": "stable",
|
||||||
|
"maintainer": "Asterfusion Product Team",
|
||||||
|
"maintainer_email": "bd@cloudswit.ch",
|
||||||
|
"availability": "with-registration",
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "AsterNOS-VPP_V6.1-R0101P02_x86.img",
|
||||||
|
"version": "6.1",
|
||||||
|
"md5sum": "55834c3e8849ab226144d79ef76acf81",
|
||||||
|
"filesize": 1318201015,
|
||||||
|
"download_url": "https://asternos.dev/api/file/b2c9fd83-a9d3-46f3-9676-6b49dd481d6c",
|
||||||
|
"compression": "gzip"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"qemu": {
|
||||||
|
"adapter_type": "virtio-net-pci",
|
||||||
|
"adapters": 4,
|
||||||
|
"ram": 8192,
|
||||||
|
"cpus": 4,
|
||||||
|
"arch": "x86_64",
|
||||||
|
"console_type": "telnet",
|
||||||
|
"kvm": "require"
|
||||||
|
},
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "6.1",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "AsterNOS-VPP_V6.1-R0101P02_x86.img"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
50
gns3server/appliances/asterfusion-vAsterNOS-campus.gns3a
Normal file
50
gns3server/appliances/asterfusion-vAsterNOS-campus.gns3a
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
"appliance_id": "9e934470-d898-4289-a5ed-50af094e629e",
|
||||||
|
"name": "Asterfusion vAsterNOS campus",
|
||||||
|
"category": "multilayer_switch",
|
||||||
|
"description": "AsterNOS is the core technology of Asterfusion’s one-stop SONiC turnkey solution designed for cloud, enterprise, and AI-driven scenarios. AsterNOS v5.2 Campus is specifically designed for traditional campus networks, offering comprehensive L2/L3 capabilities suitable for various campus scenarios such as schools, office buildings, and hospitals. This version supports a fully cloud-integrated Layer 3 network architecture, providing rich routing and switching functionalities to ensure high-performance operation and ease of maintenance. It can also be deployed in the GNS3 simulation environment to experience a complete All-Layer 3 Cloud-Campus network. This version is ideal for enterprises and campus networks requiring high-performance multi-service transport, supporting cross-domain connectivity and providing nanosecond-level time synchronization. It is well-suited for applications with stringent time accuracy requirements, such as financial trading, industrial automation, and smart manufacturing. NOTICE: This appliance file is a virtualized version of AsterNOS and is intended to be used only to experience the basic functionality and industry standard CLI (Klish), not for official software testing. For more information about AsterNOS commercial version, please feel free to contact us via Email: bd@cloudswit.ch",
|
||||||
|
"vendor_name": "Asterfusion",
|
||||||
|
"vendor_url": "https://cloudswit.ch/",
|
||||||
|
"vendor_logo_url": "https://raw.githubusercontent.com/GNS3/gns3-registry/master/vendor-logos/asterfusion.png",
|
||||||
|
"documentation_url": "https://help.cloudswit.ch/portal/en/kb/articles/vasternos",
|
||||||
|
"product_name": "vAsterNOS",
|
||||||
|
"product_url": "https://cloudswit.ch/",
|
||||||
|
"registry_version": 4,
|
||||||
|
"status": "experimental",
|
||||||
|
"maintainer": "Asterfusion",
|
||||||
|
"maintainer_email": "bd@cloudswit.ch",
|
||||||
|
"usage": "The login is admin and the password is asteros",
|
||||||
|
"symbol": "asterfusion-vAsterNOS.svg",
|
||||||
|
"first_port_name": "eth0",
|
||||||
|
"port_name_format": "Ethernet{0}",
|
||||||
|
"qemu": {
|
||||||
|
"adapter_type": "e1000",
|
||||||
|
"adapters": 10,
|
||||||
|
"ram": 4096,
|
||||||
|
"cpus": 4,
|
||||||
|
"hda_disk_interface": "virtio",
|
||||||
|
"arch": "x86_64",
|
||||||
|
"console_type": "telnet",
|
||||||
|
"boot_priority": "d",
|
||||||
|
"kvm": "require"
|
||||||
|
},
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "vAsterNOS-V5.2R012P01.img",
|
||||||
|
"version": "5.2-12-1",
|
||||||
|
"md5sum": "d18c0cfd786607ccc6dc1069a8f40465",
|
||||||
|
"filesize": 2823290880,
|
||||||
|
"download_url": "https://drive.cloudswitch.io/external/d29f6d0a6c8322fea42b3c08e95113d026b8ec6aafbe29193c338333077f3da7"
|
||||||
|
}
|
||||||
|
|
||||||
|
],
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "5.2-12-1",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "vAsterNOS-V5.2R012P01.img"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
@ -6,14 +6,14 @@
|
|||||||
"vendor_name": "Asterfusion",
|
"vendor_name": "Asterfusion",
|
||||||
"vendor_url": "https://cloudswit.ch/",
|
"vendor_url": "https://cloudswit.ch/",
|
||||||
"vendor_logo_url": "https://raw.githubusercontent.com/GNS3/gns3-registry/master/vendor-logos/asterfusion.png",
|
"vendor_logo_url": "https://raw.githubusercontent.com/GNS3/gns3-registry/master/vendor-logos/asterfusion.png",
|
||||||
"documentation_url": "https://help.cloudswit.ch/portal/en/kb/articles/vasternos",
|
"documentation_url": "https://asternos.com/community/space/vasternos/post/vasternos-for-data-center-network",
|
||||||
"product_name": "vAsterNOS",
|
"product_name": "vAsterNOS",
|
||||||
"product_url": "https://cloudswit.ch/product/sonic-enterprise-distribution",
|
"product_url": "https://cloudswit.ch/product/sonic-enterprise-distribution",
|
||||||
"registry_version": 4,
|
"registry_version": 4,
|
||||||
"status": "experimental",
|
"status": "experimental",
|
||||||
"maintainer": "Asterfusion",
|
"maintainer": "Asterfusion",
|
||||||
"maintainer_email": "bd@cloudswit.ch",
|
"maintainer_email": "bd@cloudswit.ch",
|
||||||
"usage": "The login is admin, passwd asteros",
|
"usage": "The login is admin and the password is asteros",
|
||||||
"symbol": "asterfusion-vAsterNOS.svg",
|
"symbol": "asterfusion-vAsterNOS.svg",
|
||||||
"first_port_name": "eth0",
|
"first_port_name": "eth0",
|
||||||
"port_name_format": "Ethernet{0}",
|
"port_name_format": "Ethernet{0}",
|
||||||
@ -30,18 +30,18 @@
|
|||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
{
|
{
|
||||||
"filename": "vAsterNOS-V3.1.img",
|
"filename": "AsterNOS_V3.1_R0408P01-VS.img.gz",
|
||||||
"version": "V3.1",
|
"version": "V3.1",
|
||||||
"md5sum": "c323c9c3f60e1a93eca2acdc5034b85c",
|
"md5sum": "5c182306af67be2c79a5642551412e48",
|
||||||
"filesize": 2724659200,
|
"filesize": 1425945924,
|
||||||
"download_url": "https://drive.cloudswitch.io/external/8ae2e3932ad8bb2ec30dd25be415d288ff3e4a949c557c6bd48ac6e6265bcfc1"
|
"download_url": "http://pub.asternos.com/AsterNOS_V3.1_R0408P01-VS.img.gz"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
"name": "V3.1",
|
"name": "V3.1",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "vAsterNOS-V3.1.img"
|
"hda_disk_image": "AsterNOS_V3.1_R0408P01-VS.img.gz"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@ -1,41 +1,56 @@
|
|||||||
{
|
{
|
||||||
"appliance_id": "088df570-f637-46f5-8a68-85acde538e5e",
|
"appliance_id": "8fecbf89-5cd1-4aea-b735-5f36cf0efbb7",
|
||||||
"name": "BIRD",
|
"name": "BIRD",
|
||||||
"category": "router",
|
"category": "router",
|
||||||
"description": "The BIRD project aims to develop a fully functional dynamic IP routing daemon primarily targeted on (but not limited to) Linux, FreeBSD and other UNIX-like systems and distributed under the GNU General Public License.",
|
"description": "The BIRD project aims to develop a fully functional dynamic IP routing daemon primarily targeted on (but not limited to) Linux, FreeBSD and other UNIX-like systems and distributed under the GNU General Public License.",
|
||||||
"vendor_name": "CZ.NIC Labs",
|
"vendor_name": "CZ.NIC Labs",
|
||||||
"vendor_url": "http://bird.network.cz/",
|
"vendor_url": "https://bird.network.cz",
|
||||||
"documentation_url": "http://bird.network.cz/?get_doc&f=bird.html",
|
"documentation_url": "https://bird.network.cz/?get_doc&f=bird.html&v=20",
|
||||||
"product_name": "BIRD internet routing daemon",
|
"product_name": "BIRD internet routing daemon",
|
||||||
"registry_version": 4,
|
"registry_version": 4,
|
||||||
"status": "stable",
|
"status": "stable",
|
||||||
"maintainer": "GNS3 Team",
|
"maintainer": "Bernhard Ehlers",
|
||||||
"maintainer_email": "developers@gns3.net",
|
"maintainer_email": "dev-ehlers@mailbox.org",
|
||||||
"usage": "\n*** BIRD v1 is end-of-life ***\nPlease use the BIRD2 appliance.\n\nConfigure interfaces in /opt/bootlocal.sh, BIRD configuration is done in /usr/local/etc/bird",
|
"usage": "Username:\tgns3\nPassword:\tgns3\nTo become root, use \"sudo -s\".\n\nNetwork configuration:\nsudo nano /etc/network/interfaces\nsudo systemctl restart networking\n\nBIRD:\nRestart: sudo systemctl restart bird\nReconfigure: birdc configure",
|
||||||
|
"port_name_format": "eth{0}",
|
||||||
"qemu": {
|
"qemu": {
|
||||||
"adapter_type": "e1000",
|
"adapter_type": "virtio-net-pci",
|
||||||
"adapters": 4,
|
"adapters": 4,
|
||||||
"ram": 128,
|
"ram": 512,
|
||||||
"hda_disk_interface": "ide",
|
"hda_disk_interface": "scsi",
|
||||||
"arch": "x86_64",
|
"arch": "x86_64",
|
||||||
"console_type": "telnet",
|
"console_type": "telnet",
|
||||||
"kvm": "allow"
|
"kvm": "allow"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
{
|
{
|
||||||
"filename": "bird-tinycore64-1.5.0.img",
|
"filename": "bird2-debian-2.14.qcow2",
|
||||||
"version": "1.5.0",
|
"version": "2.14",
|
||||||
"md5sum": "08d50ba2b1b262e2e03e4babf90abf69",
|
"md5sum": "029cf1756201ee79497c169502b08b88",
|
||||||
"filesize": 22413312,
|
"filesize": 303717376,
|
||||||
"download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/",
|
"download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/",
|
||||||
"direct_download_url": "http://downloads.sourceforge.net/project/gns-3/Qemu%20Appliances/bird-tinycore64-1.5.0.img"
|
"direct_download_url": "https://downloads.sourceforge.net/project/gns-3/Qemu%20Appliances/bird2-debian-2.14.qcow2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "bird2-debian-2.0.12.qcow2",
|
||||||
|
"version": "2.0.12",
|
||||||
|
"md5sum": "435218a2e90cba921cc7fde1d64a9419",
|
||||||
|
"filesize": 287965184,
|
||||||
|
"download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/",
|
||||||
|
"direct_download_url": "https://downloads.sourceforge.net/project/gns-3/Qemu%20Appliances/bird2-debian-2.0.12.qcow2"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
"name": "1.5.0",
|
"name": "2.14",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "bird-tinycore64-1.5.0.img"
|
"hda_disk_image": "bird2-debian-2.14.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "2.0.12",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "bird2-debian-2.0.12.qcow2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@ -1,57 +0,0 @@
|
|||||||
{
|
|
||||||
"appliance_id": "8fecbf89-5cd1-4aea-b735-5f36cf0efbb7",
|
|
||||||
"name": "BIRD2",
|
|
||||||
"category": "router",
|
|
||||||
"description": "The BIRD project aims to develop a fully functional dynamic IP routing daemon primarily targeted on (but not limited to) Linux, FreeBSD and other UNIX-like systems and distributed under the GNU General Public License.",
|
|
||||||
"vendor_name": "CZ.NIC Labs",
|
|
||||||
"vendor_url": "https://bird.network.cz",
|
|
||||||
"documentation_url": "https://bird.network.cz/?get_doc&f=bird.html&v=20",
|
|
||||||
"product_name": "BIRD internet routing daemon",
|
|
||||||
"registry_version": 4,
|
|
||||||
"status": "stable",
|
|
||||||
"maintainer": "Bernhard Ehlers",
|
|
||||||
"maintainer_email": "dev-ehlers@mailbox.org",
|
|
||||||
"usage": "Username:\tgns3\nPassword:\tgns3\nTo become root, use \"sudo -s\".\n\nNetwork configuration:\nsudo nano /etc/network/interfaces\nsudo systemctl restart networking\n\nBIRD:\nRestart: sudo systemctl restart bird\nReconfigure: birdc configure",
|
|
||||||
"port_name_format": "eth{0}",
|
|
||||||
"qemu": {
|
|
||||||
"adapter_type": "virtio-net-pci",
|
|
||||||
"adapters": 4,
|
|
||||||
"ram": 512,
|
|
||||||
"hda_disk_interface": "scsi",
|
|
||||||
"arch": "x86_64",
|
|
||||||
"console_type": "telnet",
|
|
||||||
"kvm": "allow"
|
|
||||||
},
|
|
||||||
"images": [
|
|
||||||
{
|
|
||||||
"filename": "bird2-debian-2.14.qcow2",
|
|
||||||
"version": "2.14",
|
|
||||||
"md5sum": "029cf1756201ee79497c169502b08b88",
|
|
||||||
"filesize": 303717376,
|
|
||||||
"download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/",
|
|
||||||
"direct_download_url": "https://downloads.sourceforge.net/project/gns-3/Qemu%20Appliances/bird2-debian-2.14.qcow2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "bird2-debian-2.0.12.qcow2",
|
|
||||||
"version": "2.0.12",
|
|
||||||
"md5sum": "435218a2e90cba921cc7fde1d64a9419",
|
|
||||||
"filesize": 287965184,
|
|
||||||
"download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/",
|
|
||||||
"direct_download_url": "https://downloads.sourceforge.net/project/gns-3/Qemu%20Appliances/bird2-debian-2.0.12.qcow2"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"versions": [
|
|
||||||
{
|
|
||||||
"name": "2.14",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "bird2-debian-2.14.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "2.0.12",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "bird2-debian-2.0.12.qcow2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -27,44 +27,28 @@
|
|||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
{
|
{
|
||||||
"filename": "CentOS-Stream-GenericCloud-9-20230704.1.x86_64.qcow2",
|
"filename": "CentOS-Stream-GenericCloud-10-20260504.0.x86_64.qcow2",
|
||||||
"version": "Stream-9 (20230704.1)",
|
"version": "Stream-10 (20260504.0)",
|
||||||
"md5sum": "e04511e019325a97837edd9eafe02b48",
|
"md5sum": "932b0bcc7e5c7404f91432979dc95314",
|
||||||
"filesize": 1087868416,
|
"filesize": 2173501440,
|
||||||
|
"download_url": "https://cloud.centos.org/centos/10-stream/x86_64/images",
|
||||||
|
"direct_download_url": "https://cloud.centos.org/centos/10-stream/x86_64/images/CentOS-Stream-GenericCloud-10-20260504.0.x86_64.qcow2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "CentOS-Stream-GenericCloud-9-20260504.0.x86_64.qcow2",
|
||||||
|
"version": "Stream-9 (20260504.0)",
|
||||||
|
"md5sum": "ebfbbd23ba7b85bbaf83c6c0626c2b70",
|
||||||
|
"filesize": 1877251072,
|
||||||
"download_url": "https://cloud.centos.org/centos/9-stream/x86_64/images",
|
"download_url": "https://cloud.centos.org/centos/9-stream/x86_64/images",
|
||||||
"direct_download_url": "https://cloud.centos.org/centos/9-stream/x86_64/images/CentOS-Stream-GenericCloud-9-20230704.1.x86_64.qcow2"
|
"direct_download_url": "https://cloud.centos.org/centos/9-stream/x86_64/images/CentOS-Stream-GenericCloud-9-20260504.0.x86_64.qcow2"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "CentOS-Stream-GenericCloud-8-20230710.0.x86_64.qcow2",
|
"filename": "CentOS-Stream-GenericCloud-8-20240603.0.x86_64.qcow2",
|
||||||
"version": "Stream-8 (20230710.0)",
|
"version": "Stream-8 (20240603.0)",
|
||||||
"md5sum": "83e02ce98c29753c86fb7be7d802aa75",
|
"md5sum": "77f3c9650785b8e977209796e09ee33e",
|
||||||
"filesize": 1676164096,
|
"filesize": 2003698688,
|
||||||
"download_url": "https://cloud.centos.org/centos/8-stream/x86_64/images",
|
"download_url": "https://cloud.centos.org/centos/8-stream/x86_64/images",
|
||||||
"direct_download_url": "https://cloud.centos.org/centos/8-stream/x86_64/images/CentOS-Stream-GenericCloud-8-20230710.0.x86_64.qcow2"
|
"direct_download_url": "https://cloud.centos.org/centos/8-stream/x86_64/images/CentOS-Stream-GenericCloud-8-20240603.0.x86_64.qcow2"
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "CentOS-8-GenericCloud-8.4.2105-20210603.0.x86_64.qcow2",
|
|
||||||
"version": "8.4 (2105)",
|
|
||||||
"md5sum": "032eed270415526546eac07628905a62",
|
|
||||||
"filesize": 1309652992,
|
|
||||||
"download_url": "https://cloud.centos.org/centos/8/x86_64/images",
|
|
||||||
"direct_download_url": "https://cloud.centos.org/centos/8/x86_64/images/CentOS-8-GenericCloud-8.4.2105-20210603.0.x86_64.qcow2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "CentOS-7-x86_64-GenericCloud-2111.qcow2",
|
|
||||||
"version": "7 (2111)",
|
|
||||||
"md5sum": "730b8662695831670721c8245be61dac",
|
|
||||||
"filesize": 897384448,
|
|
||||||
"download_url": "https://cloud.centos.org/centos/7/images",
|
|
||||||
"direct_download_url": "https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud-2111.qcow2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "CentOS-7-x86_64-GenericCloud-1809.qcow2",
|
|
||||||
"version": "7 (1809)",
|
|
||||||
"md5sum": "da79108d1324b27bd1759362b82fbe40",
|
|
||||||
"filesize": 914948096,
|
|
||||||
"download_url": "https://cloud.centos.org/centos/7/images",
|
|
||||||
"direct_download_url": "https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud-1809.qcow2"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "centos-cloud-init-data.iso",
|
"filename": "centos-cloud-init-data.iso",
|
||||||
@ -77,37 +61,23 @@
|
|||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
"name": "Stream-9 (20230704.1)",
|
"name": "Stream-10 (20260504.0)",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "CentOS-Stream-GenericCloud-9-20230704.1.x86_64.qcow2",
|
"hda_disk_image": "CentOS-Stream-GenericCloud-10-20260504.0.x86_64.qcow2",
|
||||||
"cdrom_image": "centos-cloud-init-data.iso"
|
"cdrom_image": "centos-cloud-init-data.iso"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Stream-8 (20230710.0)",
|
"name": "Stream-9 (20260504.0)",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "CentOS-Stream-GenericCloud-8-20230710.0.x86_64.qcow2",
|
"hda_disk_image": "CentOS-Stream-GenericCloud-9-20260504.0.x86_64.qcow2",
|
||||||
"cdrom_image": "centos-cloud-init-data.iso"
|
"cdrom_image": "centos-cloud-init-data.iso"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "8.4 (2105)",
|
"name": "Stream-8 (20240603.0)",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "CentOS-8-GenericCloud-8.4.2105-20210603.0.x86_64.qcow2",
|
"hda_disk_image": "CentOS-Stream-GenericCloud-8-20240603.0.x86_64.qcow2",
|
||||||
"cdrom_image": "centos-cloud-init-data.iso"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7 (2111)",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "CentOS-7-x86_64-GenericCloud-2111.qcow2",
|
|
||||||
"cdrom_image": "centos-cloud-init-data.iso"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7 (1809)",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "CentOS-7-x86_64-GenericCloud-1809.qcow2",
|
|
||||||
"cdrom_image": "centos-cloud-init-data.iso"
|
"cdrom_image": "centos-cloud-init-data.iso"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"appliance_id": "cc2b1802-3520-4963-8ff7-c19b1f6418c5",
|
"appliance_id": "cc2b1802-3520-4963-8ff7-c19b1f6418c5",
|
||||||
|
"tags": ["device_type:cisco_ios_telnet"],
|
||||||
"name": "Cisco 1700",
|
"name": "Cisco 1700",
|
||||||
"category": "router",
|
"category": "router",
|
||||||
"description": "Cisco 1700 Router",
|
"description": "Cisco 1700 Router",
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"appliance_id": "ed474fea-cd3b-4e2e-be84-a855a133060a",
|
"appliance_id": "ed474fea-cd3b-4e2e-be84-a855a133060a",
|
||||||
|
"tags": ["device_type:cisco_ios_telnet"],
|
||||||
"name": "Cisco 2600",
|
"name": "Cisco 2600",
|
||||||
"category": "router",
|
"category": "router",
|
||||||
"description": "Cisco 2600 Router",
|
"description": "Cisco 2600 Router",
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"appliance_id": "ed0f079e-a506-4cb4-b46c-714a80bbe2d3",
|
"appliance_id": "ed0f079e-a506-4cb4-b46c-714a80bbe2d3",
|
||||||
|
"tags": ["device_type:cisco_ios_telnet"],
|
||||||
"name": "Cisco 2691",
|
"name": "Cisco 2691",
|
||||||
"category": "router",
|
"category": "router",
|
||||||
"description": "Cisco 2691 Router",
|
"description": "Cisco 2691 Router",
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"appliance_id": "7ada6336-7280-4306-9f32-6b1e242ae989",
|
"appliance_id": "7ada6336-7280-4306-9f32-6b1e242ae989",
|
||||||
|
"tags": ["device_type:cisco_ios_telnet"],
|
||||||
"name": "Cisco 3620",
|
"name": "Cisco 3620",
|
||||||
"category": "router",
|
"category": "router",
|
||||||
"description": "Cisco 3620 Router",
|
"description": "Cisco 3620 Router",
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"appliance_id": "ef119e49-19fe-4239-9c6b-16ea12f6ec01",
|
"appliance_id": "ef119e49-19fe-4239-9c6b-16ea12f6ec01",
|
||||||
|
"tags": ["device_type:cisco_ios_telnet"],
|
||||||
"name": "Cisco 3640",
|
"name": "Cisco 3640",
|
||||||
"category": "router",
|
"category": "router",
|
||||||
"description": "Cisco 3640 Router",
|
"description": "Cisco 3640 Router",
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"appliance_id": "ac460a9c-9274-4ccf-a056-af50b699925f",
|
"appliance_id": "ac460a9c-9274-4ccf-a056-af50b699925f",
|
||||||
|
"tags": ["device_type:cisco_ios_telnet"],
|
||||||
"name": "Cisco 3660",
|
"name": "Cisco 3660",
|
||||||
"category": "router",
|
"category": "router",
|
||||||
"description": "Cisco 3660 Router",
|
"description": "Cisco 3660 Router",
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"appliance_id": "5b9c5293-a5a7-47a3-9df4-6cf658f2f378",
|
"appliance_id": "5b9c5293-a5a7-47a3-9df4-6cf658f2f378",
|
||||||
|
"tags": ["device_type:cisco_ios_telnet"],
|
||||||
"name": "Cisco 3725",
|
"name": "Cisco 3725",
|
||||||
"category": "router",
|
"category": "router",
|
||||||
"description": "Cisco 3725 Router",
|
"description": "Cisco 3725 Router",
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"appliance_id": "18737edb-e43f-4fb0-8a0f-88982cff58b1",
|
"appliance_id": "18737edb-e43f-4fb0-8a0f-88982cff58b1",
|
||||||
|
"tags": ["device_type:cisco_ios_telnet"],
|
||||||
"name": "Cisco 3745",
|
"name": "Cisco 3745",
|
||||||
"category": "router",
|
"category": "router",
|
||||||
"description": "Cisco 3745 Multiservice Access Router",
|
"description": "Cisco 3745 Multiservice Access Router",
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"appliance_id": "38aa3135-f169-4131-9b64-73605787b5ef",
|
"appliance_id": "38aa3135-f169-4131-9b64-73605787b5ef",
|
||||||
|
"tags": ["device_type:cisco_ios_telnet"],
|
||||||
"name": "Cisco 7200",
|
"name": "Cisco 7200",
|
||||||
"category": "router",
|
"category": "router",
|
||||||
"description": "Cisco 7200 Router",
|
"description": "Cisco 7200 Router",
|
||||||
@ -50,6 +51,12 @@
|
|||||||
"version": "124-25G",
|
"version": "124-25G",
|
||||||
"md5sum": "9c7cc9b3f3b3571411a7f62faaa2c036",
|
"md5sum": "9c7cc9b3f3b3571411a7f62faaa2c036",
|
||||||
"filesize": 71528984
|
"filesize": 71528984
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "c7200-itpk9-mz.124-15.SW.image",
|
||||||
|
"version": "124-15.SW",
|
||||||
|
"md5sum": "3334a0facdbd26164e83d3c201fff5b5",
|
||||||
|
"filesize": 46423952
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
@ -87,6 +94,13 @@
|
|||||||
"images": {
|
"images": {
|
||||||
"image": "c7200-a3jk9s-mz.124-25g.image"
|
"image": "c7200-a3jk9s-mz.124-25g.image"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "124-15.SW",
|
||||||
|
"idlepc": "0x60b2bc68",
|
||||||
|
"images": {
|
||||||
|
"image": "c7200-itpk9-mz.124-15.SW.image"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
43
gns3server/appliances/cisco-alpine-trex.gns3a
Normal file
43
gns3server/appliances/cisco-alpine-trex.gns3a
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"appliance_id": "924a2ef5-7b91-45ae-a1e4-7220338b76b0",
|
||||||
|
"name": "Cisco Alpine Linux TRex",
|
||||||
|
"category": "guest",
|
||||||
|
"description": "Alpine Linux VM image configured to run Cisco's Trex traffic generator in stateless mode",
|
||||||
|
"vendor_name": "Cisco",
|
||||||
|
"vendor_url": "http://www.cisco.com/",
|
||||||
|
"documentation_url": "https://trex-tgn.cisco.com/",
|
||||||
|
"product_name": "Alpine Linux Virt",
|
||||||
|
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||||
|
"registry_version": 4,
|
||||||
|
"status": "experimental",
|
||||||
|
"maintainer": "GNS3 Team",
|
||||||
|
"maintainer_email": "developers@gns3.net",
|
||||||
|
"usage": "By default, a \"cisco\" account with password \"cisco\" is created.",
|
||||||
|
"port_name_format": "eth{0}",
|
||||||
|
"qemu": {
|
||||||
|
"adapter_type": "virtio-net-pci",
|
||||||
|
"adapters": 3,
|
||||||
|
"ram": 512,
|
||||||
|
"hda_disk_interface": "virtio",
|
||||||
|
"arch": "x86_64",
|
||||||
|
"console_type": "vnc",
|
||||||
|
"kvm": "allow"
|
||||||
|
},
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "alpine-trex-3-21-3.qcow2",
|
||||||
|
"version": "2.87",
|
||||||
|
"md5sum": "54cf267bbc2ab7a1c71dc53bced6e128",
|
||||||
|
"filesize": 465174528,
|
||||||
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "2.87",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "alpine-trex-3-21-3.qcow2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -5,9 +5,9 @@
|
|||||||
"description": "The Adaptive Security Virtual Appliance is a virtualized network security solution based on the market-leading Cisco ASA 5500-X Series firewalls. It supports both traditional and next-generation software-defined network (SDN) and Cisco Application Centric Infrastructure (ACI) environments to provide policy enforcement and threat inspection across heterogeneous multisite environments.",
|
"description": "The Adaptive Security Virtual Appliance is a virtualized network security solution based on the market-leading Cisco ASA 5500-X Series firewalls. It supports both traditional and next-generation software-defined network (SDN) and Cisco Application Centric Infrastructure (ACI) environments to provide policy enforcement and threat inspection across heterogeneous multisite environments.",
|
||||||
"vendor_name": "Cisco",
|
"vendor_name": "Cisco",
|
||||||
"vendor_url": "http://www.cisco.com/",
|
"vendor_url": "http://www.cisco.com/",
|
||||||
"documentation_url": "http://www.cisco.com/c/en/us/support/security/virtual-adaptive-security-appliance-firewall/products-installation-guides-list.html",
|
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/asav/",
|
||||||
"product_name": "ASAv",
|
"product_name": "ASAv",
|
||||||
"product_url": "http://www.cisco.com/c/en/us/products/security/virtual-adaptive-security-appliance-firewall/index.html",
|
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||||
"registry_version": 4,
|
"registry_version": 4,
|
||||||
"status": "stable",
|
"status": "stable",
|
||||||
"maintainer": "GNS3 Team",
|
"maintainer": "GNS3 Team",
|
||||||
@ -26,26 +26,33 @@
|
|||||||
"kvm": "require"
|
"kvm": "require"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "asav9-23-1.qcow2",
|
||||||
|
"version": "9.23.1 CML",
|
||||||
|
"md5sum": "30454794b46fe07d1cd6a3ee72b511e1",
|
||||||
|
"filesize": 400687104,
|
||||||
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "asav9-22-1-1.qcow2",
|
"filename": "asav9-22-1-1.qcow2",
|
||||||
"version": "9.22.1.1 CML",
|
"version": "9.22.1.1 CML",
|
||||||
"md5sum": "250a924cdc2370208eaac9d1dc8dc9e3",
|
"md5sum": "250a924cdc2370208eaac9d1dc8dc9e3",
|
||||||
"filesize": 379518976,
|
"filesize": 379518976,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/cisco-modeling-labs-personal/cisco-modeling-labs-personal/CML-PERSONAL.html"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "asav9-18-2.qcow2",
|
"filename": "asav9-18-2.qcow2",
|
||||||
"version": "9.18.2 CML",
|
"version": "9.18.2 CML",
|
||||||
"md5sum": "6f10fe106edfad9163625770a47a6b73",
|
"md5sum": "6f10fe106edfad9163625770a47a6b73",
|
||||||
"filesize": 340262912,
|
"filesize": 340262912,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/cisco-modeling-labs-personal/cisco-modeling-labs-personal/CML-PERSONAL.html"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "asav9-16-2.qcow2",
|
"filename": "asav9-16-2.qcow2",
|
||||||
"version": "9.16.2 CML",
|
"version": "9.16.2 CML",
|
||||||
"md5sum": "1f8db97063a7f738fddc81ac880a906c",
|
"md5sum": "1f8db97063a7f738fddc81ac880a906c",
|
||||||
"filesize": 262078976,
|
"filesize": 262078976,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/cisco-modeling-labs-personal/cisco-modeling-labs-personal/CML-PERSONAL.html"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "asav9-16-2.qcow2",
|
"filename": "asav9-16-2.qcow2",
|
||||||
@ -133,6 +140,12 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "9.23.1 CML",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "asav9-23-1.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "9.22.1.1 CML",
|
"name": "9.22.1.1 CML",
|
||||||
"images": {
|
"images": {
|
||||||
|
|||||||
@ -5,9 +5,9 @@
|
|||||||
"description": "The Cisco Catalyst 8000V Edge Software is a virtual, form-factor router deployed on a virtual machine (VM) running on an x86 server hardware.",
|
"description": "The Cisco Catalyst 8000V Edge Software is a virtual, form-factor router deployed on a virtual machine (VM) running on an x86 server hardware.",
|
||||||
"vendor_name": "Cisco",
|
"vendor_name": "Cisco",
|
||||||
"vendor_url": "http://www.cisco.com/",
|
"vendor_url": "http://www.cisco.com/",
|
||||||
"documentation_url": "https://www.cisco.com/c/en/us/td/docs/routers/C8000V/Configuration/c8000v-installation-configuration-guide.html",
|
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/cat-8000v/",
|
||||||
"product_name": "c8000v",
|
"product_name": "c8000v",
|
||||||
"product_url": "https://www.cisco.com/c/en/us/support/routers/catalyst-8000v-edge-software/series.html",
|
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||||
"registry_version": 4,
|
"registry_version": 4,
|
||||||
"status": "stable",
|
"status": "stable",
|
||||||
"maintainer": "GNS3 Team",
|
"maintainer": "GNS3 Team",
|
||||||
@ -24,6 +24,13 @@
|
|||||||
"kvm": "require"
|
"kvm": "require"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "c8000v-universalk9_8G_serial.17.15.01a.qcow2",
|
||||||
|
"version": "17.15.01a 8G",
|
||||||
|
"md5sum": "41efa0aedd67f1f57cde1263c79d9ff6",
|
||||||
|
"filesize": 1846280192,
|
||||||
|
"download_url": "https://software.cisco.com/download/home/286327102/type/282046477/release/IOSXE-17.15.1a"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "c8000v-universalk9_8G_serial.17.09.04a.qcow2",
|
"filename": "c8000v-universalk9_8G_serial.17.09.04a.qcow2",
|
||||||
"version": "17.09.04a 8G",
|
"version": "17.09.04a 8G",
|
||||||
@ -68,6 +75,12 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "17.15.01a 8G",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "c8000v-universalk9_8G_serial.17.15.01a.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "17.09.04a 8G",
|
"name": "17.09.04a 8G",
|
||||||
"images": {
|
"images": {
|
||||||
|
|||||||
@ -5,9 +5,9 @@
|
|||||||
"description": "Cisco IOS-XE 9000v. This appliance requires 16GB of memory to run! Recommend 2 or more vCPUs for faster boot performance",
|
"description": "Cisco IOS-XE 9000v. This appliance requires 16GB of memory to run! Recommend 2 or more vCPUs for faster boot performance",
|
||||||
"vendor_name": "Cisco",
|
"vendor_name": "Cisco",
|
||||||
"vendor_url": "http://www.cisco.com/",
|
"vendor_url": "http://www.cisco.com/",
|
||||||
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/2-5/#!cml-release-notes",
|
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/cat-9000v/",
|
||||||
"product_name": "Cisco CAT IOS-XE 9000v",
|
"product_name": "Cisco CAT IOS-XE 9000v",
|
||||||
"product_url": "http://virl.cisco.com/",
|
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||||
"registry_version": 4,
|
"registry_version": 4,
|
||||||
"status": "experimental",
|
"status": "experimental",
|
||||||
"maintainer": "GNS3 Team",
|
"maintainer": "GNS3 Team",
|
||||||
@ -31,14 +31,14 @@
|
|||||||
"version": "17.12(1)",
|
"version": "17.12(1)",
|
||||||
"md5sum": "e587e92186f42bdf69d7fa27f34425f7",
|
"md5sum": "e587e92186f42bdf69d7fa27f34425f7",
|
||||||
"filesize": 2739404800,
|
"filesize": 2739404800,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "cat9kv-prd-17.10.01prd7.qcow2",
|
"filename": "cat9kv-prd-17.10.01prd7.qcow2",
|
||||||
"version": "17.10(1)",
|
"version": "17.10(1)",
|
||||||
"md5sum": "ffdbace33d31deae33e2a920a96b79ef",
|
"md5sum": "ffdbace33d31deae33e2a920a96b79ef",
|
||||||
"filesize": 2155806720,
|
"filesize": 2155806720,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
|||||||
@ -5,9 +5,9 @@
|
|||||||
"description": "The Cisco Cloud Services Router 1000V (CSR 1000V) is a router and network services platform in virtual form factor that is intended for deployment in cloud and virtual data centers. It is optimized to serve as a single-tenant or multitenant WAN gateway. Using proven, industry-leading Cisco IOS\u00ae XE Software networking and security features, the CSR 1000V enables enterprises to transparently extend their WANs into external provider-hosted clouds and cloud providers to offer their tenants enterprise-class networking services.",
|
"description": "The Cisco Cloud Services Router 1000V (CSR 1000V) is a router and network services platform in virtual form factor that is intended for deployment in cloud and virtual data centers. It is optimized to serve as a single-tenant or multitenant WAN gateway. Using proven, industry-leading Cisco IOS\u00ae XE Software networking and security features, the CSR 1000V enables enterprises to transparently extend their WANs into external provider-hosted clouds and cloud providers to offer their tenants enterprise-class networking services.",
|
||||||
"vendor_name": "Cisco",
|
"vendor_name": "Cisco",
|
||||||
"vendor_url": "http://www.cisco.com/",
|
"vendor_url": "http://www.cisco.com/",
|
||||||
"documentation_url": "http://www.cisco.com/c/en/us/support/routers/cloud-services-router-1000v-series/products-installation-and-configuration-guides-list.html",
|
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/csr-1000v/",
|
||||||
"product_name": "CSR1000v",
|
"product_name": "CSR1000v",
|
||||||
"product_url": "http://www.cisco.com/c/en/us/support/routers/cloud-services-router-1000v-series/tsd-products-support-series-home.html",
|
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||||
"registry_version": 4,
|
"registry_version": 4,
|
||||||
"status": "stable",
|
"status": "stable",
|
||||||
"maintainer": "GNS3 Team",
|
"maintainer": "GNS3 Team",
|
||||||
@ -17,7 +17,7 @@
|
|||||||
"qemu": {
|
"qemu": {
|
||||||
"adapter_type": "vmxnet3",
|
"adapter_type": "vmxnet3",
|
||||||
"adapters": 4,
|
"adapters": 4,
|
||||||
"ram": 3072,
|
"ram": 4096,
|
||||||
"hda_disk_interface": "ide",
|
"hda_disk_interface": "ide",
|
||||||
"arch": "x86_64",
|
"arch": "x86_64",
|
||||||
"console_type": "telnet",
|
"console_type": "telnet",
|
||||||
@ -134,21 +134,21 @@
|
|||||||
"version": "16.5.1b",
|
"version": "16.5.1b",
|
||||||
"md5sum": "ac11d33041b8ff6dc3553e324d02cccb",
|
"md5sum": "ac11d33041b8ff6dc3553e324d02cccb",
|
||||||
"filesize": 1209543680,
|
"filesize": 1209543680,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "csr1000v-universalk9.03.17.00.S.156-1.S-ext.qcow2",
|
"filename": "csr1000v-universalk9.03.17.00.S.156-1.S-ext.qcow2",
|
||||||
"version": "3.17",
|
"version": "3.17",
|
||||||
"md5sum": "06cbfcd11f3557391db64fe2a6015a6e",
|
"md5sum": "06cbfcd11f3557391db64fe2a6015a6e",
|
||||||
"filesize": 1346305024,
|
"filesize": 1346305024,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "csr1000v-universalk9.16.3.1-build2.qcow2",
|
"filename": "csr1000v-universalk9.16.3.1-build2.qcow2",
|
||||||
"version": "16.3.1-build2",
|
"version": "16.3.1-build2",
|
||||||
"md5sum": "a770e96de928265515304c9c9d6b46b9",
|
"md5sum": "a770e96de928265515304c9c9d6b46b9",
|
||||||
"filesize": 1280835584,
|
"filesize": 1280835584,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "csr1000v-universalk9.16.03.01.qcow2",
|
"filename": "csr1000v-universalk9.16.03.01.qcow2",
|
||||||
@ -162,21 +162,21 @@
|
|||||||
"version": "16.3.2",
|
"version": "16.3.2",
|
||||||
"md5sum": "2e5803d23cd52cba5d55fa8306be5f13",
|
"md5sum": "2e5803d23cd52cba5d55fa8306be5f13",
|
||||||
"filesize": 1167720448,
|
"filesize": 1167720448,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "csr1000v-universalk9.16.4.1.qcow2",
|
"filename": "csr1000v-universalk9.16.4.1.qcow2",
|
||||||
"version": "16.4.1",
|
"version": "16.4.1",
|
||||||
"md5sum": "3428e0dcf5132a1b11ab7696d8c61b2e",
|
"md5sum": "3428e0dcf5132a1b11ab7696d8c61b2e",
|
||||||
"filesize": 1261961216,
|
"filesize": 1261961216,
|
||||||
"download_url": "https://virl.mediuscorp.com/my-account/"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "csr1000v-universalk9.16.6.1.qcow2",
|
"filename": "csr1000v-universalk9.16.6.1.qcow2",
|
||||||
"version": "16.6.1-VIRL",
|
"version": "16.6.1-VIRL",
|
||||||
"md5sum": "996eb6dbf54781f6393bd689571a818c",
|
"md5sum": "996eb6dbf54781f6393bd689571a818c",
|
||||||
"filesize": 1316301824,
|
"filesize": 1316301824,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
|||||||
@ -1,12 +1,14 @@
|
|||||||
{
|
{
|
||||||
"appliance_id": "3bf492b6-5717-4257-9bfd-b34617c6f133",
|
"appliance_id": "3bf492b6-5717-4257-9bfd-b34617c6f133",
|
||||||
|
"tags": ["device_type:cisco_ios_telnet"],
|
||||||
"name": "Cisco IOSv",
|
"name": "Cisco IOSv",
|
||||||
"category": "router",
|
"category": "router",
|
||||||
"description": "Cisco Virtual IOS allows user to run IOS on a standard computer.",
|
"description": "Cisco Virtual IOS allows user to run IOS on a standard computer.",
|
||||||
"vendor_name": "Cisco",
|
"vendor_name": "Cisco",
|
||||||
"vendor_url": "http://www.cisco.com/",
|
"vendor_url": "http://www.cisco.com/",
|
||||||
|
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/iosv/",
|
||||||
"product_name": "IOSv",
|
"product_name": "IOSv",
|
||||||
"product_url": "http://virl.cisco.com/",
|
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||||
"registry_version": 4,
|
"registry_version": 4,
|
||||||
"status": "stable",
|
"status": "stable",
|
||||||
"maintainer": "GNS3 Team",
|
"maintainer": "GNS3 Team",
|
||||||
@ -25,85 +27,113 @@
|
|||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
{
|
{
|
||||||
"filename": "IOSv_startup_config.img",
|
"filename": "vios-adventerprisek9-m.spa.159-3.m10.qcow2",
|
||||||
"version": "1",
|
"version": "15.9(3)M10",
|
||||||
"md5sum": "bc605651c4688276f81fd59dcf5cc786",
|
"md5sum": "960ff630ce3fc030f6155a8e77d64105",
|
||||||
"filesize": 1048576,
|
"filesize": 57323520,
|
||||||
"download_url": "https://sourceforge.net/projects/gns-3/files",
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
"direct_download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/IOSv_startup_config.img/download"
|
},
|
||||||
|
{
|
||||||
|
"filename": "vios-adventerprisek9-m.spa.159-3.m9.qcow2",
|
||||||
|
"version": "15.9(3)M9",
|
||||||
|
"md5sum": "01b707a2e33185d6d33e0255ced45d23",
|
||||||
|
"filesize": 57323008,
|
||||||
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "vios-adventerprisek9-m.spa.159-3.m8.qcow2",
|
"filename": "vios-adventerprisek9-m.spa.159-3.m8.qcow2",
|
||||||
"version": "15.9(3)M8",
|
"version": "15.9(3)M8",
|
||||||
"md5sum": "8d93a185c2fa778178a933f20b02150a",
|
"md5sum": "8d93a185c2fa778178a933f20b02150a",
|
||||||
"filesize": 57319424,
|
"filesize": 57319424,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "vios-adventerprisek9-m.spa.159-3.m6.qcow2",
|
"filename": "vios-adventerprisek9-m.spa.159-3.m6.qcow2",
|
||||||
"version": "15.9(3)M6",
|
"version": "15.9(3)M6",
|
||||||
"md5sum": "49a6977977263b2774bebc56e4e678ff",
|
"md5sum": "49a6977977263b2774bebc56e4e678ff",
|
||||||
"filesize": 57309696,
|
"filesize": 57309696,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "vios-adventerprisek9-m.spa.159-3.m4.qcow2",
|
"filename": "vios-adventerprisek9-m.spa.159-3.m4.qcow2",
|
||||||
"version": "15.9(3)M4",
|
"version": "15.9(3)M4",
|
||||||
"md5sum": "355b13ab821e64e2939fd7008d6304d7",
|
"md5sum": "355b13ab821e64e2939fd7008d6304d7",
|
||||||
"filesize": 57297920,
|
"filesize": 57297920,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "vios-adventerprisek9-m.spa.159-3.m3.qcow2",
|
"filename": "vios-adventerprisek9-m.spa.159-3.m3.qcow2",
|
||||||
"version": "15.9(3)M3",
|
"version": "15.9(3)M3",
|
||||||
"md5sum": "12893843af18e4c62f13d07266755653",
|
"md5sum": "12893843af18e4c62f13d07266755653",
|
||||||
"filesize": 57296384,
|
"filesize": 57296384,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "vios-adventerprisek9-m.spa.159-3.m2.qcow2",
|
"filename": "vios-adventerprisek9-m.spa.159-3.m2.qcow2",
|
||||||
"version": "15.9(3)M2",
|
"version": "15.9(3)M2",
|
||||||
"md5sum": "a19e998bc3086825c751d125af722329",
|
"md5sum": "a19e998bc3086825c751d125af722329",
|
||||||
"filesize": 57308672,
|
"filesize": 57308672,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "vios-adventerprisek9-m.spa.158-3.m2.qcow2",
|
"filename": "vios-adventerprisek9-m.spa.158-3.m2.qcow2",
|
||||||
"version": "15.8(3)M2",
|
"version": "15.8(3)M2",
|
||||||
"md5sum": "40e3d25b5b0cb13d639fcd2cf18e9965",
|
"md5sum": "40e3d25b5b0cb13d639fcd2cf18e9965",
|
||||||
"filesize": 57129984,
|
"filesize": 57129984,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "vios-adventerprisek9-m.vmdk.SPA.157-3.M3",
|
"filename": "vios-adventerprisek9-m.vmdk.SPA.157-3.M3",
|
||||||
"version": "15.7(3)M3",
|
"version": "15.7(3)M3",
|
||||||
"md5sum": "37c148ffa14a82f418a6e9c2b049fafe",
|
"md5sum": "37c148ffa14a82f418a6e9c2b049fafe",
|
||||||
"filesize": 134021120,
|
"filesize": 134021120,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "vios-adventerprisek9-m.vmdk.SPA.156-2.T",
|
"filename": "vios-adventerprisek9-m.vmdk.SPA.156-2.T",
|
||||||
"version": "15.6(2)T",
|
"version": "15.6(2)T",
|
||||||
"md5sum": "83707e3cc93646da58ee6563a68002b5",
|
"md5sum": "83707e3cc93646da58ee6563a68002b5",
|
||||||
"filesize": 128450560,
|
"filesize": 128450560,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "vios-adventerprisek9-m.vmdk.SPA.156-1.T",
|
"filename": "vios-adventerprisek9-m.vmdk.SPA.156-1.T",
|
||||||
"version": "15.6(1)T",
|
"version": "15.6(1)T",
|
||||||
"md5sum": "e7cb1bbd0c59280dd946feefa68fa270",
|
"md5sum": "e7cb1bbd0c59280dd946feefa68fa270",
|
||||||
"filesize": 128122880,
|
"filesize": 128122880,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "vios-adventerprisek9-m.vmdk.SPA.155-3.M",
|
"filename": "vios-adventerprisek9-m.vmdk.SPA.155-3.M",
|
||||||
"version": "15.5(3)M",
|
"version": "15.5(3)M",
|
||||||
"md5sum": "79f613ac3b179d5a64520730925130b2",
|
"md5sum": "79f613ac3b179d5a64520730925130b2",
|
||||||
"filesize": 127926272,
|
"filesize": 127926272,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "IOSv_startup_config.img",
|
||||||
|
"version": "1",
|
||||||
|
"md5sum": "bc605651c4688276f81fd59dcf5cc786",
|
||||||
|
"filesize": 1048576,
|
||||||
|
"download_url": "https://sourceforge.net/projects/gns-3/files",
|
||||||
|
"direct_download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/IOSv_startup_config.img/download"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "15.9(3)M10",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "vios-adventerprisek9-m.spa.159-3.m10.qcow2",
|
||||||
|
"hdb_disk_image": "IOSv_startup_config.img"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "15.9(3)M9",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "vios-adventerprisek9-m.spa.159-3.m9.qcow2",
|
||||||
|
"hdb_disk_image": "IOSv_startup_config.img"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "15.9(3)M8",
|
"name": "15.9(3)M8",
|
||||||
"images": {
|
"images": {
|
||||||
|
|||||||
@ -1,12 +1,14 @@
|
|||||||
{
|
{
|
||||||
"appliance_id": "4368f802-ddec-4863-adbd-a36a6d83cd4c",
|
"appliance_id": "4368f802-ddec-4863-adbd-a36a6d83cd4c",
|
||||||
|
"tags": ["device_type:cisco_ios_telnet"],
|
||||||
"name": "Cisco IOSvL2",
|
"name": "Cisco IOSvL2",
|
||||||
"category": "multilayer_switch",
|
"category": "multilayer_switch",
|
||||||
"description": "Cisco Virtual IOS L2 allows user to run a IOS switching image on a standard computer.",
|
"description": "Cisco Virtual IOS L2 allows user to run a IOS switching image on a standard computer.",
|
||||||
"vendor_name": "Cisco",
|
"vendor_name": "Cisco",
|
||||||
"vendor_url": "http://www.cisco.com/",
|
"vendor_url": "http://www.cisco.com/",
|
||||||
|
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/iosvl2/",
|
||||||
"product_name": "IOSvL2",
|
"product_name": "IOSvL2",
|
||||||
"product_url": "http://virl.cisco.com/",
|
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||||
"registry_version": 4,
|
"registry_version": 4,
|
||||||
"status": "stable",
|
"status": "stable",
|
||||||
"maintainer": "GNS3 Team",
|
"maintainer": "GNS3 Team",
|
||||||
@ -29,35 +31,35 @@
|
|||||||
"version": "15.2(20200924:215240)",
|
"version": "15.2(20200924:215240)",
|
||||||
"md5sum": "99ecab32de12410c533e6abd4e9710aa",
|
"md5sum": "99ecab32de12410c533e6abd4e9710aa",
|
||||||
"filesize": 90409984,
|
"filesize": 90409984,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "vios_l2-adventerprisek9-m.ssa.high_iron_20190423.qcow2",
|
"filename": "vios_l2-adventerprisek9-m.ssa.high_iron_20190423.qcow2",
|
||||||
"version": "15.2(6.0.81)E",
|
"version": "15.2(6.0.81)E",
|
||||||
"md5sum": "71cacb678f98a106f99e889b97b34686",
|
"md5sum": "71cacb678f98a106f99e889b97b34686",
|
||||||
"filesize": 44950016,
|
"filesize": 44950016,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "vios_l2-adventerprisek9-m.SSA.high_iron_20180619.qcow2",
|
"filename": "vios_l2-adventerprisek9-m.SSA.high_iron_20180619.qcow2",
|
||||||
"version": "15.2.1",
|
"version": "15.2.1",
|
||||||
"md5sum": "14b981002e40b660f2d7400401e04c14",
|
"md5sum": "14b981002e40b660f2d7400401e04c14",
|
||||||
"filesize": 44938752,
|
"filesize": 44938752,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "vios_l2-adventerprisek9-m.03.2017.qcow2",
|
"filename": "vios_l2-adventerprisek9-m.03.2017.qcow2",
|
||||||
"version": "15.2(20170321:233949)",
|
"version": "15.2(20170321:233949)",
|
||||||
"md5sum": "8f14b50083a14688dec2fc791706bb3e",
|
"md5sum": "8f14b50083a14688dec2fc791706bb3e",
|
||||||
"filesize": 41157632,
|
"filesize": 41157632,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "vios_l2-adventerprisek9-m.vmdk.SSA.152-4.0.55.E",
|
"filename": "vios_l2-adventerprisek9-m.vmdk.SSA.152-4.0.55.E",
|
||||||
"version": "15.2(4.0.55)E",
|
"version": "15.2(4.0.55)E",
|
||||||
"md5sum": "1a3a21f5697cae64bb930895b986d71e",
|
"md5sum": "1a3a21f5697cae64bb930895b986d71e",
|
||||||
"filesize": 96862208,
|
"filesize": 96862208,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
|||||||
@ -5,9 +5,9 @@
|
|||||||
"description": "IOS XRv supports the control plane features introduced in Cisco IOS XR.",
|
"description": "IOS XRv supports the control plane features introduced in Cisco IOS XR.",
|
||||||
"vendor_name": "Cisco",
|
"vendor_name": "Cisco",
|
||||||
"vendor_url": "http://www.cisco.com/",
|
"vendor_url": "http://www.cisco.com/",
|
||||||
"documentation_url": "http://www.cisco.com/c/en/us/td/docs/ios_xr_sw/ios_xrv/release/notes/xrv-rn.html",
|
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/ios-xrv/",
|
||||||
"product_name": "IOS XRv",
|
"product_name": "IOS XRv",
|
||||||
"product_url": "http://virl.cisco.com/",
|
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||||
"registry_version": 4,
|
"registry_version": 4,
|
||||||
"status": "stable",
|
"status": "stable",
|
||||||
"maintainer": "GNS3 Team",
|
"maintainer": "GNS3 Team",
|
||||||
@ -30,14 +30,14 @@
|
|||||||
"version": "6.1.3",
|
"version": "6.1.3",
|
||||||
"md5sum": "1693b5d22a398587dd0fed2877d8dfac",
|
"md5sum": "1693b5d22a398587dd0fed2877d8dfac",
|
||||||
"filesize": 428588544,
|
"filesize": 428588544,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "iosxrv-k9-demo-6.0.1.qcow2",
|
"filename": "iosxrv-k9-demo-6.0.1.qcow2",
|
||||||
"version": "6.0.1",
|
"version": "6.0.1",
|
||||||
"md5sum": "0831ecf43628eccb752ebb275de9a62a",
|
"md5sum": "0831ecf43628eccb752ebb275de9a62a",
|
||||||
"filesize": 908132352,
|
"filesize": 908132352,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
|||||||
@ -5,9 +5,9 @@
|
|||||||
"description": "IOS XRv 9000 (aka Sunstone) is the 1st VM released running the 64-bit IOS XR operating system as used on the NCS-6xxx platform. This appliance requires 4 vCPUs and 16GB of memory to run!",
|
"description": "IOS XRv 9000 (aka Sunstone) is the 1st VM released running the 64-bit IOS XR operating system as used on the NCS-6xxx platform. This appliance requires 4 vCPUs and 16GB of memory to run!",
|
||||||
"vendor_name": "Cisco",
|
"vendor_name": "Cisco",
|
||||||
"vendor_url": "http://www.cisco.com/",
|
"vendor_url": "http://www.cisco.com/",
|
||||||
"documentation_url": "http://www.cisco.com/c/en/us/td/docs/ios_xr_sw/ios_xrv/release/notes/xrv-rn.html",
|
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/ios-xrv-9000/",
|
||||||
"product_name": "IOS XRv 9000",
|
"product_name": "IOS XRv 9000",
|
||||||
"product_url": "http://virl.cisco.com/",
|
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||||
"registry_version": 4,
|
"registry_version": 4,
|
||||||
"status": "experimental",
|
"status": "experimental",
|
||||||
"maintainer": "GNS3 Team",
|
"maintainer": "GNS3 Team",
|
||||||
@ -19,99 +19,56 @@
|
|||||||
"adapter_type": "virtio-net-pci",
|
"adapter_type": "virtio-net-pci",
|
||||||
"adapters": 7,
|
"adapters": 7,
|
||||||
"ram": 16384,
|
"ram": 16384,
|
||||||
|
"cpus": 4,
|
||||||
"hda_disk_interface": "ide",
|
"hda_disk_interface": "ide",
|
||||||
"arch": "x86_64",
|
"arch": "x86_64",
|
||||||
"console_type": "telnet",
|
"console_type": "telnet",
|
||||||
"kvm": "require",
|
"kvm": "require",
|
||||||
"options": "-smp 4 -cpu host"
|
"options": "-cpu host"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "xrv9k-fullk9-x-25.1.1.qcow2",
|
||||||
|
"version": "25.1.1",
|
||||||
|
"md5sum": "554d795d495badf90b6c75a2a342b409",
|
||||||
|
"filesize": 2002911232,
|
||||||
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "xrv9k-fullk9-x-24.3.1.qcow2",
|
||||||
|
"version": "24.3.1",
|
||||||
|
"md5sum": "bd047c457e29952f265583f299bab845",
|
||||||
|
"filesize": 1704658432,
|
||||||
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "xrv9k-fullk9-x-7.7.1.qcow2",
|
"filename": "xrv9k-fullk9-x-7.7.1.qcow2",
|
||||||
"version": "7.7.1",
|
"version": "7.7.1",
|
||||||
"md5sum": "682fff40d2ff373d8da3342906553b54",
|
"md5sum": "682fff40d2ff373d8da3342906553b54",
|
||||||
"filesize": 1643905024,
|
"filesize": 1643905024,
|
||||||
"download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/7.1.1"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "xrv9k-fullk9-x-7.1.1.qcow2",
|
"filename": "xrv9k-fullk9-x-7.1.1.qcow2",
|
||||||
"version": "7.1.1",
|
"version": "7.1.1",
|
||||||
"md5sum": "dcf241e3f8df0151fec2c7bfac9d96ac",
|
"md5sum": "dcf241e3f8df0151fec2c7bfac9d96ac",
|
||||||
"filesize": 1443758080,
|
"filesize": 1443758080,
|
||||||
"download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/7.1.1"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "xrv9k-fullk9-x-7.0.1.qcow2",
|
|
||||||
"version": "7.0.1",
|
|
||||||
"md5sum": "ca2817767fa546e303c3c536e211d33e",
|
|
||||||
"filesize": 1446445056,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/7.0.1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "xrv9k-fullk9-x-6.6.2.qcow2",
|
|
||||||
"version": "6.6.2",
|
|
||||||
"md5sum": "fd630be3c449e625073286a3a66021ae",
|
|
||||||
"filesize": 1452998656,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/6.6.2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "xrv9k-fullk9-x-6.5.3.qcow2",
|
|
||||||
"version": "6.5.3",
|
|
||||||
"md5sum": "71f018e3ea895b663129090fb4f0ff40",
|
|
||||||
"filesize": 1205075968,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/6.5.3"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "xrv9k-fullk9-x-6.5.2.qcow2",
|
|
||||||
"version": "6.5.2",
|
|
||||||
"md5sum": "506d9e23dda7365c99dd82b613859697",
|
|
||||||
"filesize": 1205010432,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/6.5.1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "xrv9k-fullk9-x-6.5.1.qcow2",
|
|
||||||
"version": "6.5.1",
|
|
||||||
"md5sum": "730868e7cd46de9aa2e950899c7f9498",
|
|
||||||
"filesize": 1208811520,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/6.5.1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "xrv9k-fullk9-x-6.4.2.qcow2",
|
|
||||||
"version": "6.4.2",
|
|
||||||
"md5sum": "6958763192c7bb59a1b8049d377de1b4",
|
|
||||||
"filesize": 1311703040,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/6.4.2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "xrv9k-fullk9-x-6.4.1.qcow2",
|
|
||||||
"version": "6.4.1",
|
|
||||||
"md5sum": "9c56b684e307706005a503e289cb9317",
|
|
||||||
"filesize": 1304887296,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/6.4.1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "xrv9k-fullk9-x-6.2.25.qcow2",
|
|
||||||
"version": "6.2.25",
|
|
||||||
"md5sum": "3f54e62b6f7cedfb2607233e5e465766",
|
|
||||||
"filesize": 1190723584,
|
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "xrv9k-fullk9-x.qcow2-6.0.1",
|
|
||||||
"version": "6.0.1",
|
|
||||||
"md5sum": "e20d046807075046c35b6ce7d6766a7f",
|
|
||||||
"filesize": 2109210624,
|
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "xrv9k-fullk9-x.qcow2-6.0.0",
|
|
||||||
"version": "6.0.0",
|
|
||||||
"md5sum": "64c538c34252aaeb4ed1ddb93d6803fd",
|
|
||||||
"filesize": 2572943360,
|
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "25.1.1",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "xrv9k-fullk9-x-25.1.1.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "24.3.1",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "xrv9k-fullk9-x-24.3.1.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "7.7.1",
|
"name": "7.7.1",
|
||||||
"images": {
|
"images": {
|
||||||
@ -123,66 +80,6 @@
|
|||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "xrv9k-fullk9-x-7.1.1.qcow2"
|
"hda_disk_image": "xrv9k-fullk9-x-7.1.1.qcow2"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7.0.1",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "xrv9k-fullk9-x-7.0.1.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "6.6.2",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "xrv9k-fullk9-x-6.6.2.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "6.5.3",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "xrv9k-fullk9-x-6.5.3.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "6.5.2",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "xrv9k-fullk9-x-6.5.2.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "6.5.1",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "xrv9k-fullk9-x-6.5.1.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "6.4.2",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "xrv9k-fullk9-x-6.4.2.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "6.4.1",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "xrv9k-fullk9-x-6.4.1.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "6.2.25",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "xrv9k-fullk9-x-6.2.25.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "6.0.1",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "xrv9k-fullk9-x.qcow2-6.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "6.0.0",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "xrv9k-fullk9-x.qcow2-6.0.0"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,11 +1,14 @@
|
|||||||
{
|
{
|
||||||
"appliance_id": "9593db48-558a-4914-bb78-a20605f39c65",
|
"appliance_id": "9593db48-558a-4914-bb78-a20605f39c65",
|
||||||
|
"tags": ["device_type:cisco_ios_telnet"],
|
||||||
"name": "Cisco IOU L2",
|
"name": "Cisco IOU L2",
|
||||||
"category": "multilayer_switch",
|
"category": "multilayer_switch",
|
||||||
"description": "Cisco IOS on UNIX Layer 2 image.",
|
"description": "Cisco IOS on UNIX Layer 2 image.",
|
||||||
"vendor_name": "Cisco",
|
"vendor_name": "Cisco",
|
||||||
"vendor_url": "http://www.cisco.com",
|
"vendor_url": "http://www.cisco.com",
|
||||||
|
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/iol-l2/",
|
||||||
"product_name": "Cisco IOU L2",
|
"product_name": "Cisco IOU L2",
|
||||||
|
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||||
"registry_version": 4,
|
"registry_version": 4,
|
||||||
"status": "experimental",
|
"status": "experimental",
|
||||||
"maintainer": "GNS3 Team",
|
"maintainer": "GNS3 Team",
|
||||||
@ -13,11 +16,17 @@
|
|||||||
"iou": {
|
"iou": {
|
||||||
"ethernet_adapters": 4,
|
"ethernet_adapters": 4,
|
||||||
"serial_adapters": 0,
|
"serial_adapters": 0,
|
||||||
"nvram": 512,
|
"nvram": 256,
|
||||||
"ram": 512,
|
"ram": 1024,
|
||||||
"startup_config": "iou_l2_base_startup-config.txt"
|
"startup_config": "iou_l2_base_startup-config.txt"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "x86_64_crb_linux_l2-adventerprisek9-ms.17.16.1a.iol",
|
||||||
|
"version": "17.16.1a",
|
||||||
|
"md5sum": "d55879318e51c5401fb9314d45c67728",
|
||||||
|
"filesize": 244265240
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "x86_64_crb_linux_l2-adventerprisek9-ms.iol",
|
"filename": "x86_64_crb_linux_l2-adventerprisek9-ms.iol",
|
||||||
"version": "17.15.1",
|
"version": "17.15.1",
|
||||||
@ -29,27 +38,15 @@
|
|||||||
"version": "17.12.1",
|
"version": "17.12.1",
|
||||||
"md5sum": "2b5055e4cef8fd257416d74a94adb626",
|
"md5sum": "2b5055e4cef8fd257416d74a94adb626",
|
||||||
"filesize": 240355720
|
"filesize": 240355720
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "i86bi-linux-l2-ipbasek9-15.1g.bin",
|
|
||||||
"version": "15.1g",
|
|
||||||
"md5sum": "0b8b9e14ca99b68c654e44c4296857ba",
|
|
||||||
"filesize": 62137336
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "i86bi-linux-l2-adventerprisek9-15.1a.bin",
|
|
||||||
"version": "15.1a",
|
|
||||||
"md5sum": "9549a20a7391fb849da32caa77a0d254",
|
|
||||||
"filesize": 72726092
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "i86bi-linux-l2-adventerprisek9-15.2d.bin",
|
|
||||||
"version": "15.2d",
|
|
||||||
"md5sum": "f16db44433beb3e8c828db5ddad1de8a",
|
|
||||||
"filesize": 105036380
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "17.16.1a",
|
||||||
|
"images": {
|
||||||
|
"image": "x86_64_crb_linux_l2-adventerprisek9-ms.17.16.1a.iol"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "17.15.1",
|
"name": "17.15.1",
|
||||||
"images": {
|
"images": {
|
||||||
@ -61,24 +58,6 @@
|
|||||||
"images": {
|
"images": {
|
||||||
"image": "x86_64_crb_linux_l2-adventerprisek9-ms"
|
"image": "x86_64_crb_linux_l2-adventerprisek9-ms"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "15.1g",
|
|
||||||
"images": {
|
|
||||||
"image": "i86bi-linux-l2-ipbasek9-15.1g.bin"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "15.1a",
|
|
||||||
"images": {
|
|
||||||
"image": "i86bi-linux-l2-adventerprisek9-15.1a.bin"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "15.2d",
|
|
||||||
"images": {
|
|
||||||
"image": "i86bi-linux-l2-adventerprisek9-15.2d.bin"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,11 +1,14 @@
|
|||||||
{
|
{
|
||||||
"appliance_id": "87bf6f58-1e5a-4ee2-afe7-715dabffcf18",
|
"appliance_id": "87bf6f58-1e5a-4ee2-afe7-715dabffcf18",
|
||||||
|
"tags": ["device_type:cisco_ios_telnet"],
|
||||||
"name": "Cisco IOU L3",
|
"name": "Cisco IOU L3",
|
||||||
"category": "router",
|
"category": "router",
|
||||||
"description": "Cisco IOS on UNIX Layer 3 image.",
|
"description": "Cisco IOS on UNIX Layer 3 image.",
|
||||||
"vendor_name": "Cisco",
|
"vendor_name": "Cisco",
|
||||||
"vendor_url": "http://www.cisco.com",
|
"vendor_url": "http://www.cisco.com",
|
||||||
|
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/iol/",
|
||||||
"product_name": "Cisco IOU L3",
|
"product_name": "Cisco IOU L3",
|
||||||
|
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||||
"registry_version": 4,
|
"registry_version": 4,
|
||||||
"status": "experimental",
|
"status": "experimental",
|
||||||
"maintainer": "GNS3 Team",
|
"maintainer": "GNS3 Team",
|
||||||
@ -13,11 +16,17 @@
|
|||||||
"iou": {
|
"iou": {
|
||||||
"ethernet_adapters": 2,
|
"ethernet_adapters": 2,
|
||||||
"serial_adapters": 2,
|
"serial_adapters": 2,
|
||||||
"nvram": 512,
|
"nvram": 256,
|
||||||
"ram": 512,
|
"ram": 1024,
|
||||||
"startup_config": "iou_l3_base_startup-config.txt"
|
"startup_config": "iou_l3_base_startup-config.txt"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "x86_64_crb_linux-adventerprisek9-ms.17.16.1a.iol",
|
||||||
|
"version": "17.16.1a",
|
||||||
|
"md5sum": "39bdf959c3b99a3c81d66451f1cf0404",
|
||||||
|
"filesize": 293062920
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "x86_64_crb_linux-adventerprisek9-ms.iol",
|
"filename": "x86_64_crb_linux-adventerprisek9-ms.iol",
|
||||||
"version": "17.15.1",
|
"version": "17.15.1",
|
||||||
@ -29,27 +38,15 @@
|
|||||||
"version": "17.12.1",
|
"version": "17.12.1",
|
||||||
"md5sum": "4a2fce8de21d1831fbceffd155e41ae7",
|
"md5sum": "4a2fce8de21d1831fbceffd155e41ae7",
|
||||||
"filesize": 288947184
|
"filesize": 288947184
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "i86bi_LinuxL3-AdvEnterpriseK9-M2_157_3_May_2018.bin",
|
|
||||||
"version": "15.7(3)M2",
|
|
||||||
"md5sum": "d6874260c3daeeb96d10fc844ae0b93b",
|
|
||||||
"filesize": 184759244
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "i86bi-linux-l3-adventerprisek9-ms.155-2.T.bin",
|
|
||||||
"version": "155-2T",
|
|
||||||
"md5sum": "45e99761a95cbd3ee3924ecf0f3d89e5",
|
|
||||||
"filesize": 172982492
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "i86bi-linux-l3-adventerprisek9-15.4.1T.bin",
|
|
||||||
"version": "15.4.1T",
|
|
||||||
"md5sum": "2eabae17778316c49cbc80e8e81262f9",
|
|
||||||
"filesize": 152677848
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "17.16.1a",
|
||||||
|
"images": {
|
||||||
|
"image": "x86_64_crb_linux-adventerprisek9-ms.17.16.1a.iol"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "17.15.1",
|
"name": "17.15.1",
|
||||||
"images": {
|
"images": {
|
||||||
@ -61,24 +58,6 @@
|
|||||||
"images": {
|
"images": {
|
||||||
"image": "x86_64_crb_linux-adventerprisek9-ms"
|
"image": "x86_64_crb_linux-adventerprisek9-ms"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "15.7(3)M2",
|
|
||||||
"images": {
|
|
||||||
"image": "i86bi_LinuxL3-AdvEnterpriseK9-M2_157_3_May_2018.bin"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "155-2T",
|
|
||||||
"images": {
|
|
||||||
"image": "i86bi-linux-l3-adventerprisek9-ms.155-2.T.bin"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "15.4.1T",
|
|
||||||
"images": {
|
|
||||||
"image": "i86bi-linux-l3-adventerprisek9-15.4.1T.bin"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,8 +5,9 @@
|
|||||||
"description": "NXOSv is a reference platform for an implementation of the Cisco Nexus operating system, based on the Nexus 7000-series platforms, running as a full virtual machine on a hypervisor. This includes NXAPI and MPLS LDP support.",
|
"description": "NXOSv is a reference platform for an implementation of the Cisco Nexus operating system, based on the Nexus 7000-series platforms, running as a full virtual machine on a hypervisor. This includes NXAPI and MPLS LDP support.",
|
||||||
"vendor_name": "Cisco",
|
"vendor_name": "Cisco",
|
||||||
"vendor_url": "http://www.cisco.com/",
|
"vendor_url": "http://www.cisco.com/",
|
||||||
|
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/nx-os/",
|
||||||
"product_name": "NX-OSv",
|
"product_name": "NX-OSv",
|
||||||
"product_url": "http://virl.cisco.com/",
|
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||||
"registry_version": 4,
|
"registry_version": 4,
|
||||||
"status": "stable",
|
"status": "stable",
|
||||||
"maintainer": "GNS3 Team",
|
"maintainer": "GNS3 Team",
|
||||||
@ -29,14 +30,14 @@
|
|||||||
"version": "7.3.0",
|
"version": "7.3.0",
|
||||||
"md5sum": "b4cd6edf15ab4c6bce53c3f6c1e3a742",
|
"md5sum": "b4cd6edf15ab4c6bce53c3f6c1e3a742",
|
||||||
"filesize": 214368256,
|
"filesize": 214368256,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "titanium-d1.7.2.0.D1.1.vmdk",
|
"filename": "titanium-d1.7.2.0.D1.1.vmdk",
|
||||||
"version": "7.2.0",
|
"version": "7.2.0",
|
||||||
"md5sum": "0ee38c7d717840cb4ca822f4870671d0",
|
"md5sum": "0ee38c7d717840cb4ca822f4870671d0",
|
||||||
"filesize": 361103360,
|
"filesize": 361103360,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://u.cisco.com/my-learning/my-account"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
|||||||
69
gns3server/appliances/cisco-nxosv9k-lite.gns3a
Normal file
69
gns3server/appliances/cisco-nxosv9k-lite.gns3a
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
{
|
||||||
|
"appliance_id": "4c7fd5da-be86-4168-8484-7071dc9c71fb",
|
||||||
|
"name": "Cisco NX-OSv 9000 Lite",
|
||||||
|
"category": "multilayer_switch",
|
||||||
|
"description": "The NX-OSv 9000 is a virtual platform that is designed to simulate the control plane aspects of a network element running Cisco Nexus 9000 software. The NX-OSv 9000 shares the same software image running on Cisco Nexus 9000 hardware platform although no specific hardware emulation is implemented. When the software runs as a virtual machine, line card (LC) ASIC provisioning or any interaction from the control plane to hardware ASIC is handled by the NX-OSv 9000 software data plane.\nThe NX-OSv 9000 for the Cisco Nexus 9000 Series provides a useful tool to enable the devops model and rapidly test changes to the infrastructure or to infrastructure automation tools. This enables network simulations in large scale for customers to validate configuration changes on a simulated network prior to applying them on a production network. Some users have also expressed interest in using the simulation system for feature test ,verification, and automation tooling development and test simualtion prior to deployment. NX-OSv 9000 can be used as a programmability vehicle to validate software defined networks (SDNs) and Network Function Virtualization (NFV) based solutions.\nThe lite version has a reduced memory footprint, resulting in a much smaller image size than the earlier images for Cisco Nexus 9300v and 9500v.",
|
||||||
|
"vendor_name": "Cisco",
|
||||||
|
"vendor_url": "http://www.cisco.com/",
|
||||||
|
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/nx-os-9000/",
|
||||||
|
"product_name": "NX-OSv 9000",
|
||||||
|
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||||
|
"registry_version": 4,
|
||||||
|
"status": "stable",
|
||||||
|
"availability": "service-contract",
|
||||||
|
"maintainer": "GNS3 Team",
|
||||||
|
"maintainer_email": "developers@gns3.net",
|
||||||
|
"first_port_name": "mgmt0",
|
||||||
|
"port_name_format": "Ethernet1/{port1}",
|
||||||
|
"qemu": {
|
||||||
|
"adapter_type": "e1000",
|
||||||
|
"adapters": 10,
|
||||||
|
"ram": 6144,
|
||||||
|
"cpus": 2,
|
||||||
|
"hda_disk_interface": "sata",
|
||||||
|
"arch": "x86_64",
|
||||||
|
"console_type": "telnet",
|
||||||
|
"kvm": "require"
|
||||||
|
},
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "nexus9500v64-lite.10.5.5.M.qcow2",
|
||||||
|
"version": "9500v lite 10.5.5.M",
|
||||||
|
"md5sum": "a9aafd88f36a7f44a5a2ef3322cd9bde",
|
||||||
|
"filesize": 2617638912,
|
||||||
|
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.5(5)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "nexus9300v64-lite.10.5.5.M.qcow2",
|
||||||
|
"version": "9300v lite 10.5.5.M",
|
||||||
|
"md5sum": "78610953005faab9505252baf4c86b78",
|
||||||
|
"filesize": 2617573376,
|
||||||
|
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.5(5)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "OVMF-edk2-stable202305.fd",
|
||||||
|
"version": "stable202305",
|
||||||
|
"md5sum": "6c4cf1519fec4a4b95525d9ae562963a",
|
||||||
|
"filesize": 4194304,
|
||||||
|
"download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/",
|
||||||
|
"direct_download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/OVMF-edk2-stable202305.fd.zip/download",
|
||||||
|
"compression": "zip"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "9500v lite 10.5.5.M",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "nexus9500v64-lite.10.5.5.M.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "9300v lite 10.5.5.M",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "nexus9300v64-lite.10.5.5.M.qcow2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -5,8 +5,9 @@
|
|||||||
"description": "The NX-OSv 9000 is a virtual platform that is designed to simulate the control plane aspects of a network element running Cisco Nexus 9000 software. The NX-OSv 9000 shares the same software image running on Cisco Nexus 9000 hardware platform although no specific hardware emulation is implemented. When the software runs as a virtual machine, line card (LC) ASIC provisioning or any interaction from the control plane to hardware ASIC is handled by the NX-OSv 9000 software data plane.\nThe NX-OSv 9000 for the Cisco Nexus 9000 Series provides a useful tool to enable the devops model and rapidly test changes to the infrastructure or to infrastructure automation tools. This enables network simulations in large scale for customers to validate configuration changes on a simulated network prior to applying them on a production network. Some users have also expressed interest in using the simulation system for feature test ,verification, and automation tooling development and test simualtion prior to deployment. NX-OSv 9000 can be used as a programmability vehicle to validate software defined networks (SDNs) and Network Function Virtualization (NFV) based solutions.",
|
"description": "The NX-OSv 9000 is a virtual platform that is designed to simulate the control plane aspects of a network element running Cisco Nexus 9000 software. The NX-OSv 9000 shares the same software image running on Cisco Nexus 9000 hardware platform although no specific hardware emulation is implemented. When the software runs as a virtual machine, line card (LC) ASIC provisioning or any interaction from the control plane to hardware ASIC is handled by the NX-OSv 9000 software data plane.\nThe NX-OSv 9000 for the Cisco Nexus 9000 Series provides a useful tool to enable the devops model and rapidly test changes to the infrastructure or to infrastructure automation tools. This enables network simulations in large scale for customers to validate configuration changes on a simulated network prior to applying them on a production network. Some users have also expressed interest in using the simulation system for feature test ,verification, and automation tooling development and test simualtion prior to deployment. NX-OSv 9000 can be used as a programmability vehicle to validate software defined networks (SDNs) and Network Function Virtualization (NFV) based solutions.",
|
||||||
"vendor_name": "Cisco",
|
"vendor_name": "Cisco",
|
||||||
"vendor_url": "http://www.cisco.com/",
|
"vendor_url": "http://www.cisco.com/",
|
||||||
"documentation_url": "http://www.cisco.com/c/en/us/td/docs/switches/datacenter/nexus9000/sw/7-x/nx-osv/configuration/guide/b_NX-OSv_9000/b_NX-OSv_chapter_01.html",
|
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/nx-os-9000/",
|
||||||
"product_name": "NX-OSv 9000",
|
"product_name": "NX-OSv 9000",
|
||||||
|
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||||
"registry_version": 4,
|
"registry_version": 4,
|
||||||
"status": "stable",
|
"status": "stable",
|
||||||
"availability": "service-contract",
|
"availability": "service-contract",
|
||||||
@ -26,12 +27,47 @@
|
|||||||
"kvm": "require"
|
"kvm": "require"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "nexus9500v64.10.5.5.M.qcow2",
|
||||||
|
"version": "9500v 10.5.5.M",
|
||||||
|
"md5sum": "c1d34bb3331d958d3219a56b6885150e",
|
||||||
|
"filesize": 2919170048,
|
||||||
|
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.5(5)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "nexus9300v64.10.5.5.M.qcow2",
|
||||||
|
"version": "9300v 10.5.5.M",
|
||||||
|
"md5sum": "f1cc2342b920320654d232b68551ccfd",
|
||||||
|
"filesize": 2919104512,
|
||||||
|
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.5(5)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "nexus9500v64.10.5.1.F.qcow2",
|
||||||
|
"version": "9500v 10.5.1.F",
|
||||||
|
"md5sum": "2fa6fb4dd4c5e49d53896d60fa746e59",
|
||||||
|
"filesize": 2388459520,
|
||||||
|
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.5(1)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "nexus9300v64.10.5.1.F.qcow2",
|
||||||
|
"version": "9300v 10.5.1.F",
|
||||||
|
"md5sum": "2bbc767debbc7c1144eabe176ae67503",
|
||||||
|
"filesize": 2388393984,
|
||||||
|
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.5(1)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "nexus9500v64.10.3.1.F.qcow2",
|
||||||
|
"version": "9500v 10.3.1.F",
|
||||||
|
"md5sum": "41e3c1c0c003b13f1bf774f0d1873e87",
|
||||||
|
"filesize": 2097510400,
|
||||||
|
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.3(1)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "nexus9300v64.10.3.1.F.qcow2",
|
"filename": "nexus9300v64.10.3.1.F.qcow2",
|
||||||
"version": "9300v 10.3.1.F",
|
"version": "9300v 10.3.1.F",
|
||||||
"md5sum": "a6ffd2501a5791c11cee319943b912da",
|
"md5sum": "a6ffd2501a5791c11cee319943b912da",
|
||||||
"filesize": 2097086464,
|
"filesize": 2097086464,
|
||||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.1(1)"
|
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.3(1)"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "nexus9500v64.10.1.1.qcow2",
|
"filename": "nexus9500v64.10.1.1.qcow2",
|
||||||
@ -47,181 +83,6 @@
|
|||||||
"filesize": 1990983680,
|
"filesize": 1990983680,
|
||||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.1(1)"
|
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.1(1)"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"filename": "nexus9500v.9.3.13.qcow2",
|
|
||||||
"version": "9500v 9.3.13",
|
|
||||||
"md5sum": "bacf0f664ee34625c85a9f278b2466a2",
|
|
||||||
"filesize": 2248409088,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(13)"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nexus9300v.9.3.13.qcow2",
|
|
||||||
"version": "9300v 9.3.13",
|
|
||||||
"md5sum": "d8ce30cb762df02d77ec27786a2435ad",
|
|
||||||
"filesize": 2248343552,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(13)"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nexus9500v.9.3.12.qcow2",
|
|
||||||
"version": "9500v 9.3.12",
|
|
||||||
"md5sum": "452e5cb2a7a25feaa3ba0624a82ff9ca",
|
|
||||||
"filesize": 1997996032,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(12)"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nexus9300v.9.3.12.qcow2",
|
|
||||||
"version": "9300v 9.3.12",
|
|
||||||
"md5sum": "7b6b5dad1001e11d6ebb54662616e9f2",
|
|
||||||
"filesize": 1997930496,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(12)"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nexus9500v.9.3.9.qcow2",
|
|
||||||
"version": "9500v 9.3.9",
|
|
||||||
"md5sum": "30c25039927f89aebe73ea20d15abd6d",
|
|
||||||
"filesize": 1980760064,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(9)"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nexus9300v.9.3.9.qcow2",
|
|
||||||
"version": "9300v 9.3.9",
|
|
||||||
"md5sum": "e807005cb7d2d2957b4af0e59f368b36",
|
|
||||||
"filesize": 1980563456,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(9)"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nexus9300v.9.3.8.qcow2",
|
|
||||||
"version": "9300v 9.3.8",
|
|
||||||
"md5sum": "f8bd834f8395c134dc98d895c98441af",
|
|
||||||
"filesize": 1976434688,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(8)"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nexus9500v.9.3.7.qcow2",
|
|
||||||
"version": "9500v 9.3.7",
|
|
||||||
"md5sum": "65f669e0dd379a05a8cdbb9d7592a064",
|
|
||||||
"filesize": 1986068480,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(7)"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nexus9500v.9.3.3.qcow2",
|
|
||||||
"version": "9500v 9.3.3",
|
|
||||||
"md5sum": "7230c944041fdaa0e1b18cecccbc9a32",
|
|
||||||
"filesize": 1714159616,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(3)"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nexus9300v.9.3.3.qcow2",
|
|
||||||
"version": "9300v 9.3.3",
|
|
||||||
"md5sum": "8e9a7c4815907ef47d850623f77042e2",
|
|
||||||
"filesize": 1714225152,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(3)"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nxosv.9.3.1.qcow2",
|
|
||||||
"version": "9.3.1",
|
|
||||||
"md5sum": "148fd38cb1ff78df2883f844e172fad9",
|
|
||||||
"filesize": 1435041792,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(1)?i=!pp"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nxosv-final.9.2.3.qcow2",
|
|
||||||
"version": "9.2.3",
|
|
||||||
"md5sum": "74bd9a5b4970e868685f753e48979194",
|
|
||||||
"filesize": 1357643776,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.2%25283%2529"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nxosv-final.9.2.2.qcow2",
|
|
||||||
"version": "9.2.2",
|
|
||||||
"md5sum": "2119702c488552fc4d1b4210a04d4f64",
|
|
||||||
"filesize": 1344077824,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.2%25281%2529"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nxosv-final.9.2.1.qcow2",
|
|
||||||
"version": "9.2.1",
|
|
||||||
"md5sum": "1d7fa4654602d7ffbf62544edfe71986",
|
|
||||||
"filesize": 1330315264,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.2%25281%2529"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nxosv-final.7.0.3.I7.9.qcow2",
|
|
||||||
"version": "7.0.3.I7.9",
|
|
||||||
"md5sum": "50678c719f6b822c43dd096dbdf359e8",
|
|
||||||
"filesize": 1003618304,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/7.0(3)I7(9)?i=!pp"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nxosv-final.7.0.3.I7.7.qcow2",
|
|
||||||
"version": "7.0.3.I7.7",
|
|
||||||
"md5sum": "5daab34b672f9534c9aee59a6c8903b3",
|
|
||||||
"filesize": 996212736,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/7.0%25283%2529I7%25287%2529"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nxosv-final.7.0.3.I7.6.qcow2",
|
|
||||||
"version": "7.0.3.I7.6",
|
|
||||||
"md5sum": "a122ee954b4c11761abd99291b70544e",
|
|
||||||
"filesize": 1031995392,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/7.0%25283%2529I7%25286%2529"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nxosv-final.7.0.3.I7.5.qcow2",
|
|
||||||
"version": "7.0.3.I7.5",
|
|
||||||
"md5sum": "68a4008e189c8a35ccb8ee58db9608bb",
|
|
||||||
"filesize": 1027670016,
|
|
||||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/7.0%25283%2529I7%25285%2529"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nxosv-final.7.0.3.I7.4.qcow2",
|
|
||||||
"version": "7.0.3.I7.4",
|
|
||||||
"md5sum": "1e980c95ca47045ae45ded6e07fabfb8",
|
|
||||||
"filesize": 985792512,
|
|
||||||
"download_url": "https://software.cisco.com/download/"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nxosv-final.7.0.3.I7.3.qcow2",
|
|
||||||
"version": "7.0.3.I7.3",
|
|
||||||
"md5sum": "9d7a20367bf681a239f14097bbce470a",
|
|
||||||
"filesize": 983629824,
|
|
||||||
"download_url": "https://software.cisco.com/download/"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nxosv-final.7.0.3.I7.2.qcow2",
|
|
||||||
"version": "7.0.3.I7.2",
|
|
||||||
"md5sum": "17295efb13e83b24a439148449bfd5ab",
|
|
||||||
"filesize": 906231808,
|
|
||||||
"download_url": "https://software.cisco.com/download/"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nxosv-final.7.0.3.I7.1.qcow2",
|
|
||||||
"version": "7.0.3.I7.1",
|
|
||||||
"md5sum": "3c122f27d0c3684c63657207eadf4d06",
|
|
||||||
"filesize": 903151616,
|
|
||||||
"download_url": "https://software.cisco.com/download/"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nxosv-final.7.0.3.I6.1.qcow2",
|
|
||||||
"version": "7.0.3.I6.1",
|
|
||||||
"md5sum": "18bb991b814a508d1190575f99deed99",
|
|
||||||
"filesize": 780402688,
|
|
||||||
"download_url": "https://software.cisco.com/download/"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nxosv-final.7.0.3.I5.2.qcow2",
|
|
||||||
"version": "7.0.3.I5.2",
|
|
||||||
"md5sum": "c06aaa02f758a64fd8fee9406756f1da",
|
|
||||||
"filesize": 777715712,
|
|
||||||
"download_url": "https://software.cisco.com/download/"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "nxosv-final.7.0.3.I5.1.qcow2",
|
|
||||||
"version": "7.0.3.I5.1",
|
|
||||||
"md5sum": "201ea658fa4c57452ee4b2aa4f5262a7",
|
|
||||||
"filesize": 784990208,
|
|
||||||
"download_url": "https://software.cisco.com/download/"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"filename": "OVMF-edk2-stable202305.fd",
|
"filename": "OVMF-edk2-stable202305.fd",
|
||||||
"version": "stable202305",
|
"version": "stable202305",
|
||||||
@ -233,6 +94,41 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "9500v 10.5.5.M",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "nexus9500v64.10.5.5.M.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "9300v 10.5.5.M",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "nexus9300v64.10.5.5.M.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "9500v 10.5.1.F",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "nexus9500v64.10.5.1.F.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "9300v 10.5.1.F",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "nexus9300v64.10.5.1.F.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "9500v 10.3.1.F",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "nexus9500v64.10.3.1.F.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "9300v 10.3.1.F",
|
"name": "9300v 10.3.1.F",
|
||||||
"images": {
|
"images": {
|
||||||
@ -253,181 +149,6 @@
|
|||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
"hda_disk_image": "nexus9300v.10.1.1.qcow2"
|
"hda_disk_image": "nexus9300v.10.1.1.qcow2"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "9500v 9.3.13",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nexus9500v.9.3.13.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "9300v 9.3.13",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nexus9300v.9.3.13.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "9500v 9.3.12",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nexus9500v.9.3.12.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "9300v 9.3.12",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nexus9300v.9.3.12.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "9500v 9.3.9",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nexus9500v.9.3.9.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "9300v 9.3.9",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nexus9300v.9.3.9.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "9300v 9.3.8",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nexus9300v.9.3.8.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "9500v 9.3.7",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nexus9500v.9.3.7.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "9500v 9.3.3",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nexus9500v.9.3.3.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "9300v 9.3.3",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nexus9300v.9.3.3.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "9.3.1",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nxosv.9.3.1.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "9.2.3",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nxosv-final.9.2.3.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "9.2.2",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nxosv-final.9.2.2.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "9.2.1",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nxosv-final.9.2.1.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7.0.3.I7.9",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nxosv-final.7.0.3.I7.9.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7.0.3.I7.7",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nxosv-final.7.0.3.I7.7.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7.0.3.I7.6",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nxosv-final.7.0.3.I7.6.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7.0.3.I7.5",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nxosv-final.7.0.3.I7.5.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7.0.3.I7.4",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nxosv-final.7.0.3.I7.4.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7.0.3.I7.3",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nxosv-final.7.0.3.I7.3.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7.0.3.I7.2",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nxosv-final.7.0.3.I7.2.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7.0.3.I7.1",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nxosv-final.7.0.3.I7.1.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7.0.3.I6.1",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nxosv-final.7.0.3.I6.1.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7.0.3.I5.2",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nxosv-final.7.0.3.I5.2.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7.0.3.I5.1",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "nxosv-final.7.0.3.I5.1.qcow2"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
"vendor_url": "https://www.extremenetworks.com",
|
"vendor_url": "https://www.extremenetworks.com",
|
||||||
"documentation_url": "https://www.extremenetworks.com/support/documentation",
|
"documentation_url": "https://www.extremenetworks.com/support/documentation",
|
||||||
"product_name": "EXOS VM",
|
"product_name": "EXOS VM",
|
||||||
"registry_version": 4,
|
"registry_version": 5,
|
||||||
"status": "stable",
|
"status": "stable",
|
||||||
"maintainer": "Extreme Networks",
|
"maintainer": "Extreme Networks",
|
||||||
"maintainer_email": "GitHubscripting@extremenetworks.com",
|
"maintainer_email": "GitHubscripting@extremenetworks.com",
|
||||||
@ -18,18 +18,32 @@
|
|||||||
"qemu": {
|
"qemu": {
|
||||||
"adapter_type": "rtl8139",
|
"adapter_type": "rtl8139",
|
||||||
"adapters": 13,
|
"adapters": 13,
|
||||||
"ram": 512,
|
"ram": 1024,
|
||||||
"hda_disk_interface": "ide",
|
"hda_disk_interface": "ide",
|
||||||
"arch": "x86_64",
|
"arch": "x86_64",
|
||||||
"console_type": "telnet",
|
"console_type": "telnet",
|
||||||
"boot_priority": "dc",
|
"boot_priority": "dc",
|
||||||
"kvm": "allow",
|
"kvm": "allow",
|
||||||
"options": "-cpu core2duo"
|
"options": "-nographic -cpu host -enable-kvm"
|
||||||
},
|
},
|
||||||
|
|
||||||
"images": [
|
"images": [
|
||||||
|
|
||||||
{
|
{
|
||||||
|
"filename": "EXOS-VM_33.6.1.14.qcow2",
|
||||||
|
"version": "33.6.1.14",
|
||||||
|
"md5sum": "01ea4bea3f321f91910565bb223a2540",
|
||||||
|
"filesize": 278647296,
|
||||||
|
"direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_33.6.1.14.qcow2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "EXOS-VM_32.7.2.19.qcow2",
|
||||||
|
"version": "32.7.2.19",
|
||||||
|
"md5sum": "eba580a2e18d2a9cc972c9ece8917ea8",
|
||||||
|
"filesize": 236847104,
|
||||||
|
"direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_32.7.2.19.qcow2"
|
||||||
|
},
|
||||||
|
{
|
||||||
"filename": "EXOS-VM_v32.6.3.126.qcow2",
|
"filename": "EXOS-VM_v32.6.3.126.qcow2",
|
||||||
"version": "32.6.3.126",
|
"version": "32.6.3.126",
|
||||||
"md5sum": "5856b6c427bd605fe1c7adb6ee6b2659",
|
"md5sum": "5856b6c427bd605fe1c7adb6ee6b2659",
|
||||||
@ -41,6 +55,18 @@
|
|||||||
|
|
||||||
"versions": [
|
"versions": [
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "33.6.1.14",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "EXOS-VM_33.6.1.14.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "32.7.2.19",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "EXOS-VM_32.7.2.19.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "32.6.3.126",
|
"name": "32.6.3.126",
|
||||||
"images": {
|
"images": {
|
||||||
|
|||||||
@ -28,6 +28,13 @@
|
|||||||
"options": "-nographic"
|
"options": "-nographic"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "FEGNS3.9.3.0.0.qcow2",
|
||||||
|
"version": "v9.3.0.0",
|
||||||
|
"md5sum": "2abfa8d64219aa75522238f87b782726",
|
||||||
|
"filesize": 490209280,
|
||||||
|
"direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_VOSS/FEGNS3.9.3.0.0.qcow2"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "VOSSGNS3.8.10.1.0.qcow2",
|
"filename": "VOSSGNS3.8.10.1.0.qcow2",
|
||||||
"version": "v8.10.1.0",
|
"version": "v8.10.1.0",
|
||||||
@ -93,6 +100,13 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "v9.3.0.0",
|
||||||
|
"images":
|
||||||
|
{
|
||||||
|
"hda_disk_image": "FEGNS3.9.3.0.0.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "v8.10.1.0",
|
"name": "v8.10.1.0",
|
||||||
"images":
|
"images":
|
||||||
|
|||||||
@ -27,20 +27,36 @@
|
|||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
{
|
{
|
||||||
"filename": "Fedora-Cloud-Base-39-1.5.x86_64.qcow2",
|
"filename": "Fedora-Cloud-Base-Generic-44-1.7.x86_64.qcow2",
|
||||||
"version": "39-1.5",
|
"version": "44-1.7",
|
||||||
"md5sum": "800a10df2d369891ed65900bcacacd47",
|
"md5sum": "49784011eb752291bfead24d3be8163f",
|
||||||
"filesize": 544604160,
|
"filesize": 583729152,
|
||||||
"download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/39/Cloud/x86_64/images",
|
"download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/44/Cloud/x86_64/images",
|
||||||
"direct_download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/39/Cloud/x86_64/images/Fedora-Cloud-Base-39-1.5.x86_64.qcow2"
|
"direct_download_url": "https://fedora.mirrorservice.org/fedora/linux/releases/44/Cloud/x86_64/images/Fedora-Cloud-Base-Generic-44-1.7.x86_64.qcow2"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "Fedora-Cloud-Base-38-1.6.x86_64.qcow2",
|
"filename": "Fedora-Cloud-Base-Generic-43-1.6.x86_64.qcow2",
|
||||||
"version": "38-1.6",
|
"version": "43-1.6",
|
||||||
"md5sum": "53ddfe7b28666d5ddc55e93ff06abad2",
|
"md5sum": "f2f671db53fae58b79bb2e2259fa3622",
|
||||||
"filesize": 497287168,
|
"filesize": 583335936,
|
||||||
"download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/38/Cloud/x86_64/images",
|
"download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/43/Cloud/x86_64/images",
|
||||||
"direct_download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/38/Cloud/x86_64/images/Fedora-Cloud-Base-38-1.6.x86_64.qcow2"
|
"direct_download_url": "https://fedora.mirrorservice.org/fedora/linux/releases/43/Cloud/x86_64/images/Fedora-Cloud-Base-Generic-43-1.6.x86_64.qcow2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "Fedora-Cloud-Base-Generic-42-1.1.x86_64.qcow2",
|
||||||
|
"version": "42-1.1",
|
||||||
|
"md5sum": "2d660d2adc20b1fe793df5cb66f1d868",
|
||||||
|
"filesize": 532217856,
|
||||||
|
"download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/42/Cloud/x86_64/images",
|
||||||
|
"direct_download_url": "https://fedora.mirrorservice.org/fedora/linux/releases/42/Cloud/x86_64/images/Fedora-Cloud-Base-Generic-42-1.1.x86_64.qcow2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "Fedora-Cloud-Base-Generic-41-1.4.x86_64.qcow2",
|
||||||
|
"version": "41-1.4",
|
||||||
|
"md5sum": "8efc9edc04f38775de72ce067166b2a1",
|
||||||
|
"filesize": 491716608,
|
||||||
|
"download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/41/Cloud/x86_64/images",
|
||||||
|
"direct_download_url": "https://fedora.mirrorservice.org/fedora/linux/releases/41/Cloud/x86_64/images/Fedora-Cloud-Base-Generic-41-1.4.x86_64.qcow2"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "fedora-cloud-init-data.iso",
|
"filename": "fedora-cloud-init-data.iso",
|
||||||
@ -53,16 +69,30 @@
|
|||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
"name": "39-1.5",
|
"name": "44-1.7",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "Fedora-Cloud-Base-39-1.5.x86_64.qcow2",
|
"hda_disk_image": "Fedora-Cloud-Base-Generic-44-1.7.x86_64.qcow2",
|
||||||
"cdrom_image": "fedora-cloud-init-data.iso"
|
"cdrom_image": "fedora-cloud-init-data.iso"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "38-1.6",
|
"name": "43-1.6",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "Fedora-Cloud-Base-38-1.6.x86_64.qcow2",
|
"hda_disk_image": "Fedora-Cloud-Base-Generic-43-1.6.x86_64.qcow2",
|
||||||
|
"cdrom_image": "fedora-cloud-init-data.iso"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "42-1.1",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "Fedora-Cloud-Base-Generic-42-1.1.x86_64.qcow2",
|
||||||
|
"cdrom_image": "fedora-cloud-init-data.iso"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "41-1.4",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "Fedora-Cloud-Base-Generic-41-1.4.x86_64.qcow2",
|
||||||
"cdrom_image": "fedora-cloud-init-data.iso"
|
"cdrom_image": "fedora-cloud-init-data.iso"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,6 +29,27 @@
|
|||||||
"kvm": "allow"
|
"kvm": "allow"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "FAZ_VM64_KVM-v7.4.6.M-build2588-FORTINET.out.kvm.qcow2",
|
||||||
|
"version": "7.4.6",
|
||||||
|
"md5sum": "fba982436ff430465df6f6f283a2bd71",
|
||||||
|
"filesize": 511053824,
|
||||||
|
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "FAZ_VM64_KVM-v7.4.5.M-build2553-FORTINET.out.kvm.qcow2",
|
||||||
|
"version": "7.4.5",
|
||||||
|
"md5sum": "78464ee460fce69c360901ca9ccfe4a0",
|
||||||
|
"filesize": 510988288,
|
||||||
|
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "FAZ_VM64_KVM-v7.4.4.F-build2550-FORTINET.out.kvm.qcow2",
|
||||||
|
"version": "7.4.4",
|
||||||
|
"md5sum": "7bec1725b1e39dd66f4daae07492f1b4",
|
||||||
|
"filesize": 511217664,
|
||||||
|
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "FAZ_VM64_KVM-v7.4.3-build2487-FORTINET.out.kvm.qcow2",
|
"filename": "FAZ_VM64_KVM-v7.4.3-build2487-FORTINET.out.kvm.qcow2",
|
||||||
"version": "7.4.3",
|
"version": "7.4.3",
|
||||||
@ -277,6 +298,27 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "7.4.6",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "FAZ_VM64_KVM-v7.4.6.M-build2588-FORTINET.out.kvm.qcow2",
|
||||||
|
"hdb_disk_image": "empty30G.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "7.4.5",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "FAZ_VM64_KVM-v7.4.5.M-build2553-FORTINET.out.kvm.qcow2",
|
||||||
|
"hdb_disk_image": "empty30G.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "7.4.4",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "FAZ_VM64_KVM-v7.4.4.F-build2550-FORTINET.out.kvm.qcow2",
|
||||||
|
"hdb_disk_image": "empty30G.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "7.4.3",
|
"name": "7.4.3",
|
||||||
"images": {
|
"images": {
|
||||||
|
|||||||
@ -28,6 +28,27 @@
|
|||||||
"kvm": "allow"
|
"kvm": "allow"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "FGT_VM64_KVM-v7.4.7.M-build2731-FORTINET.out.kvm.qcow2",
|
||||||
|
"version": "7.4.7",
|
||||||
|
"md5sum": "2ce4039789e84b3fe85565e0c4110718",
|
||||||
|
"filesize": 103677952,
|
||||||
|
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "FGT_VM64_KVM-v7.4.6.M-build2726-FORTINET.out.kvm.qcow2",
|
||||||
|
"version": "7.4.6",
|
||||||
|
"md5sum": "b787c1c5ab365f267d7e4e88b1cdc10b",
|
||||||
|
"filesize": 103677952,
|
||||||
|
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "FGT_VM64_KVM-v7.4.5.M-build2702-FORTINET.out.kvm.qcow2",
|
||||||
|
"version": "7.4.5",
|
||||||
|
"md5sum": "8465e74c4ef1751619ebb989838d457c",
|
||||||
|
"filesize": 102367232,
|
||||||
|
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "FGT_VM64_KVM-v7.4.4.F-build2662-FORTINET.out.kvm.qcow2",
|
"filename": "FGT_VM64_KVM-v7.4.4.F-build2662-FORTINET.out.kvm.qcow2",
|
||||||
"version": "7.4.4",
|
"version": "7.4.4",
|
||||||
@ -388,6 +409,27 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "7.4.7",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "FGT_VM64_KVM-v7.4.7.M-build2731-FORTINET.out.kvm.qcow2",
|
||||||
|
"hdb_disk_image": "empty30G.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "7.4.6",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "FGT_VM64_KVM-v7.4.6.M-build2726-FORTINET.out.kvm.qcow2",
|
||||||
|
"hdb_disk_image": "empty30G.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "7.4.5",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "FGT_VM64_KVM-v7.4.5.M-build2702-FORTINET.out.kvm.qcow2",
|
||||||
|
"hdb_disk_image": "empty30G.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "7.4.4",
|
"name": "7.4.4",
|
||||||
"images": {
|
"images": {
|
||||||
|
|||||||
@ -30,489 +30,55 @@
|
|||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
{
|
{
|
||||||
"filename": "FMG_VM64_KVM-v7.4.3-build2487-FORTINET.out.kvm.qcow2",
|
"filename": "FMG_VM64_KVM-v7.4.6.M-build2588-FORTINET.out.kvm.qcow2",
|
||||||
"version": "7.4.23",
|
"version": "7.4.6",
|
||||||
"md5sum": "b01d9f86aa27c538407d518df1326863",
|
"md5sum": "7cb219e1070d393f61cf750d818b23b1",
|
||||||
"filesize": 346107904,
|
"filesize": 349122560,
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "FMG_VM64_KVM-v7.4.2-build2397-FORTINET.out.kvm.qcow2",
|
"filename": "FMG_VM64_KVM-v7.4.5.M-build2553-FORTINET.out.kvm.qcow2",
|
||||||
"version": "7.4.2",
|
"version": "7.4.5",
|
||||||
"md5sum": "36371fbf06210ded57c00b2ff290f2c5",
|
"md5sum": "fa59ddce0cb933741f16866472026723",
|
||||||
"filesize": 322514944,
|
"filesize": 349769728,
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "FMG_VM64_KVM-v7.4.1-build2308-FORTINET.out.kvm.qcow2",
|
"filename": "FMG_VM64_KVM-v7.4.4.F-build2550-FORTINET.out.kvm.qcow2",
|
||||||
"version": "7.4.1",
|
"version": "7.4.4",
|
||||||
"md5sum": "e542cc8f2d8f46e9c32b783bf31bef39",
|
"md5sum": "770727bb30555e6938308bbf95f19555",
|
||||||
"filesize": 309387264,
|
"filesize": 349847552,
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "FMG_VM64_KVM-v7.2.5-build1574-FORTINET.out.kvm.qcow2",
|
"filename": "empty500G.qcow2",
|
||||||
"version": "7.2.5",
|
|
||||||
"md5sum": "754326845096afd909ec45d98f8d5a83",
|
|
||||||
"filesize": 278401024,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v7.2.4-build1460-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "7.2.4",
|
|
||||||
"md5sum": "98fa9830d9ecb5911a703d03b80026b6",
|
|
||||||
"filesize": 261992448,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v7.2.2-build1334-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "7.2.2",
|
|
||||||
"md5sum": "2ff1298257321cd485d2cad91d6ce510",
|
|
||||||
"filesize": 246083584,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v7.2.1-build1215-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "7.2.1",
|
|
||||||
"md5sum": "1a3eeff1204fa8f4243773f7521e12b5",
|
|
||||||
"filesize": 242814976,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v7.0.12-build0623-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "7.0.12",
|
|
||||||
"md5sum": "5b6f6a2b8bc00e56337aa7023a9025cf",
|
|
||||||
"filesize": 249520128,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v7.0.11-build0595-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "7.0.11",
|
|
||||||
"md5sum": "7b166222136e26190159f37cccbaab6e",
|
|
||||||
"filesize": 249360384,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v7.0.9-build0489-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "7.0.9",
|
|
||||||
"md5sum": "dbeb6a79b6e421000573dbbbdb50b8b5",
|
|
||||||
"filesize": 247955456,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v7.0.6-build0372-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "7.0.6",
|
|
||||||
"md5sum": "dfa4df9e976ed87e73cb9601a8a70323",
|
|
||||||
"filesize": 239190016,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v7.0.5-build0365-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "7.0.5",
|
|
||||||
"md5sum": "e8b9c992784cea766b52a427a5fe0279",
|
|
||||||
"filesize": 237535232,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v6.4.14-build2660-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "6.4.14",
|
|
||||||
"md5sum": "0fe56e363b166c07b710bde795e36049",
|
|
||||||
"filesize": 219430912,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v6.4.12-build2610-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "6.4.12",
|
|
||||||
"md5sum": "36c0dc531d921e5f1e1e09b030f7c813",
|
|
||||||
"filesize": 219455488,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v6-build2288-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "6.4.5",
|
|
||||||
"md5sum": "bd2791984b03f55a6825297e83c6576a",
|
|
||||||
"filesize": 117014528,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v6-build2253-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "6.4.4",
|
|
||||||
"md5sum": "3554a47fde2dc91d17eec16fd0dc10a3",
|
|
||||||
"filesize": 116621312,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v6-build1183-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "6.2.2",
|
|
||||||
"md5sum": "f5051a8fe49d916bb554b9bae32a1eb4",
|
|
||||||
"filesize": 139145216,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v6-build1050-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "6.2.0",
|
|
||||||
"md5sum": "c19d2527f91ad1bbafbde5bf08487867",
|
|
||||||
"filesize": 126894080,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v6-build0349-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "6.0.6",
|
|
||||||
"md5sum": "d03f024c948ba6e2bb9e66c11ca8f34c",
|
|
||||||
"filesize": 112553984,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v6-build0255-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "6.0.3",
|
|
||||||
"md5sum": "5f34d52d9289b0be2a4c04943446ea39",
|
|
||||||
"filesize": 115703808,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v6-build0205-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "6.0.2",
|
|
||||||
"md5sum": "8f748649c537d9b5466b24c5b4e62017",
|
|
||||||
"filesize": 116981760,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v6-build0092-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "6.0.0",
|
|
||||||
"md5sum": "73bfe1bc70124521a524d857646b9c2e",
|
|
||||||
"filesize": 119066624,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v5-build1631-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "5.6.2",
|
|
||||||
"md5sum": "c81cc247e8eb03249b475fe0e847653e",
|
|
||||||
"filesize": 106946560,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v5-build1619-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "5.6.1",
|
|
||||||
"md5sum": "8cc553842564d232af295d6a0c784c1f",
|
|
||||||
"filesize": 106831872,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v5-build1557-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "5.6.0",
|
|
||||||
"md5sum": "f8bd600796f894f4ca1ea2d6b4066d3d",
|
|
||||||
"filesize": 108363776,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v5-build1225-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "5.4.4",
|
|
||||||
"md5sum": "53bc6e320fe7bde5d2b636bde95a910c",
|
|
||||||
"filesize": 89911296,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v5-build1187-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "5.4.3",
|
|
||||||
"md5sum": "53602c776d215d98e32163a10804fc49",
|
|
||||||
"filesize": 87425024,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v5-build1151-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "5.4.2",
|
|
||||||
"md5sum": "8e131ad40009c740f3efdee6dc3a0ac3",
|
|
||||||
"filesize": 86437888,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v5-build1082-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "5.4.1",
|
|
||||||
"md5sum": "fc1815410f3f0536e2e3a9c1c5c07f41",
|
|
||||||
"filesize": 83124224,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v5-build1019-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "5.4.0",
|
|
||||||
"md5sum": "1cfb22671cb372d8bf3e47b9c3c55ded",
|
|
||||||
"filesize": 77541376,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v5-build0786-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "5.2.10",
|
|
||||||
"md5sum": "377fe38bf07bc2435608e5b65f780f07",
|
|
||||||
"filesize": 64962560,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v5-build0780-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "5.2.9",
|
|
||||||
"md5sum": "04268e779d3d5e6c928c6fd638423c52",
|
|
||||||
"filesize": 65007616,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v5-build0777-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "5.2.8",
|
|
||||||
"md5sum": "6dbf148ace9bf309ad383757afd75fad",
|
|
||||||
"filesize": 65011712,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "FMG_VM64_KVM-v5-build0757-FORTINET.out.kvm.qcow2",
|
|
||||||
"version": "5.2.7",
|
|
||||||
"md5sum": "d37dbaa49d7522324681eeba19f7699b",
|
|
||||||
"filesize": 65056768,
|
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "empty30G.qcow2",
|
|
||||||
"version": "1.0",
|
"version": "1.0",
|
||||||
"md5sum": "3411a599e822f2ac6be560a26405821a",
|
"md5sum": "658c825441b9b3080ba00f9eec002eaa",
|
||||||
"filesize": 197120,
|
"filesize": 204608,
|
||||||
"download_url": "https://sourceforge.net/projects/gns-3/files/Empty%20Qemu%20disk/",
|
"download_url": "https://sourceforge.net/projects/gns-3/files/Empty%20Qemu%20disk/",
|
||||||
"direct_download_url": "https://sourceforge.net/projects/gns-3/files/Empty%20Qemu%20disk/empty30G.qcow2/download"
|
"direct_download_url": "https://sourceforge.net/projects/gns-3/files/Empty%20Qemu%20disk/empty500G.qcow2/download"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
"name": "7.4.3",
|
"name": "7.4.6",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v7.4.3-build2487-FORTINET.out.kvm.qcow2",
|
"hda_disk_image": "FMG_VM64_KVM-v7.4.6.M-build2588-FORTINET.out.kvm.qcow2",
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
"hdb_disk_image": "empty500G.qcow2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "7.4.2",
|
"name": "7.4.5",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v7.4.2-build2397-FORTINET.out.kvm.qcow2",
|
"hda_disk_image": "FMG_VM64_KVM-v7.4.5.M-build2553-FORTINET.out.kvm.qcow2",
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
"hdb_disk_image": "empty500G.qcow2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "7.4.1",
|
"name": "7.4.4",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v7.4.1-build2308-FORTINET.out.kvm.qcow2",
|
"hda_disk_image": "FMG_VM64_KVM-v7.4.4.F-build2550-FORTINET.out.kvm.qcow2",
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
"hdb_disk_image": "empty500G.qcow2"
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7.2.5",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v7.2.5-build1574-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7.2.4",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v7.2.4-build1460-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7.2.2",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v7.2.2-build1334-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7.2.1",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v7.2.1-build1215-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7.0.12",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v7.0.12-build0623-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7.0.11",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v7.0.11-build0595-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7.0.9",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v7.0.9-build0489-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7.0.6",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v7.0.6-build0372-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "7.0.5",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v7.0.5-build0365-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "6.4.14",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v6.4.14-build2660-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "6.4.12",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v6.4.12-build2610-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "6.4.5",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v6-build2288-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "6.4.4",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v6-build2253-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "6.2.2",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v6-build1183-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "6.2.0",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v6-build1050-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "6.0.6",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v6-build0349-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "6.0.3",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v6-build0255-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "6.0.2",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v6-build0205-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "6.0.0",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v6-build0092-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "5.6.2",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v5-build1631-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "5.6.1",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v5-build1619-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "5.6.0",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v5-build1557-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "5.4.4",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v5-build1225-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "5.4.3",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v5-build1187-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "5.4.2",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v5-build1151-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "5.4.1",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v5-build1082-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "5.4.0",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v5-build1019-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "5.2.10",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v5-build0786-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "5.2.9",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v5-build0780-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "5.2.8",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v5-build0777-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "5.2.7",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "FMG_VM64_KVM-v5-build0757-FORTINET.out.kvm.qcow2",
|
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@ -25,19 +25,19 @@
|
|||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
{
|
{
|
||||||
"filename": "rtr.qcow2",
|
"filename": "rtr-x86_64.qcow2",
|
||||||
"version": "20.7.1",
|
"version": "25.8.29",
|
||||||
"md5sum": "4707415d15d20ced92423d90e52eedcd",
|
"md5sum": "13d72fdfd772258808a9d4b75fa67083",
|
||||||
"filesize": 254767616,
|
"filesize": 73269248,
|
||||||
"download_url": "http://freerouter.nop.hu/",
|
"download_url": "http://www.freertr.org/",
|
||||||
"direct_download_url": "http://dl.nop.hu/rtr.qcow2"
|
"direct_download_url": "http://dl.nop.hu/rtr-x86_64.qcow2"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
"name": "20.7.1",
|
"name": "25.8.29",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "rtr.qcow2"
|
"hda_disk_image": "rtr-x86_64.qcow2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
60
gns3server/appliances/home-assistant.gns3a
Normal file
60
gns3server/appliances/home-assistant.gns3a
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
{
|
||||||
|
"appliance_id": "4ac0d5bc-714d-4a5a-8af5-8fb452046acd",
|
||||||
|
"name": "Home Assistant",
|
||||||
|
"category": "guest",
|
||||||
|
"description": "Open source home automation that puts local control and privacy first. Powered by a worldwide community of tinkerers and DIY enthusiasts.",
|
||||||
|
"vendor_name": "Open Home Foundation",
|
||||||
|
"vendor_url": "https://www.openhomefoundation.org/",
|
||||||
|
"vendor_logo_url": "https://www.openhomefoundation.org/assets/images/logo/open-home-foundation.svg",
|
||||||
|
"documentation_url": "https://www.home-assistant.io/installation/alternative",
|
||||||
|
"product_name": "haos",
|
||||||
|
"product_url": "https://www.home-assistant.io/",
|
||||||
|
"registry_version": 8,
|
||||||
|
"status": "stable",
|
||||||
|
"availability": "free",
|
||||||
|
"maintainer": "Neyder Achahuanco Apaza",
|
||||||
|
"maintainer_email": "gns3@neyder.net",
|
||||||
|
"usage": "You will be able to reach Home Assistant on homeassistant.local:8123, you might need to access Home Assistant at homeassistant:8123 or http://X.X.X.X:8123 (replace X.X.X.X with your virtual machine\u2019s IP address).\nYou can access trough console with root user without password.",
|
||||||
|
"symbol": "home-assistant-logomark-color-on-light.svg",
|
||||||
|
"default_username": "cisco",
|
||||||
|
"default_password": "admin",
|
||||||
|
"settings": [
|
||||||
|
{
|
||||||
|
"name": "Default template settings",
|
||||||
|
"default": true,
|
||||||
|
"template_type": "qemu",
|
||||||
|
"template_properties":
|
||||||
|
{
|
||||||
|
"adapter_type": "virtio-net-pci",
|
||||||
|
"platform": "x86_64",
|
||||||
|
"adapters": 1,
|
||||||
|
"ram": 2048,
|
||||||
|
"cpus": 2,
|
||||||
|
"hda_disk_interface": "virtio",
|
||||||
|
"console_type": "telnet",
|
||||||
|
"boot_priority": "cd",
|
||||||
|
"on_close": "shutdown_signal",
|
||||||
|
"uefi": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "haos_ova-17.1.qcow2",
|
||||||
|
"version": "17.1",
|
||||||
|
"md5sum": "e1b950430045859a3ac035cb420df158",
|
||||||
|
"filesize": 1024393216,
|
||||||
|
"download_url": "https://www.home-assistant.io/installation/alternative",
|
||||||
|
"direct_download_url": "https://github.com/home-assistant/operating-system/releases/download/17.1/haos_ova-17.1.qcow2.xz",
|
||||||
|
"compression": "xz"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "haos_ova-17.1.qcow2"
|
||||||
|
},
|
||||||
|
"name": "17.1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"appliance_id": "bd86792e-9870-4b42-8f16-cb2776f1d5d5",
|
"appliance_id": "bd86792e-9870-4b42-8f16-cb2776f1d5d5",
|
||||||
|
"tags": ["device_type:gns3_huawei_telnet_ce"],
|
||||||
"name": "HuaWei CE12800",
|
"name": "HuaWei CE12800",
|
||||||
"category": "multilayer_switch",
|
"category": "multilayer_switch",
|
||||||
"description": "CE12800 series switches are high-performance core switches designed for data center networks and high-end campus networks. The switches provide stable, reliable, secure, and high-performance Layer 2/Layer 3 switching services, to help build an elastic, virtualized, agile, and high-quality network.",
|
"description": "CE12800 series switches are high-performance core switches designed for data center networks and high-end campus networks. The switches provide stable, reliable, secure, and high-performance Layer 2/Layer 3 switching services, to help build an elastic, virtualized, agile, and high-quality network.",
|
||||||
|
|||||||
258
gns3server/appliances/infix.gns3a
Normal file
258
gns3server/appliances/infix.gns3a
Normal file
@ -0,0 +1,258 @@
|
|||||||
|
{
|
||||||
|
"appliance_id": "4d351078-c6f5-444c-ab30-0ef20e3d8c53",
|
||||||
|
"name": "Infix",
|
||||||
|
"category": "router",
|
||||||
|
"description": "Infix OS is a free Linux-based operating system with made-easy management using NETCONF, RESTCONF, or the built-in command line interface (CLI). It is suitable for both end-devices with a single Ethernet port and switches/routers with multiple ports. Immutable by design, extensions are possible using Docker containers.",
|
||||||
|
"vendor_name": "KernelKit",
|
||||||
|
"vendor_url": "https://github.com/kernelkit",
|
||||||
|
"vendor_logo_url": "https://kernelkit.org/assets/img/jack.png",
|
||||||
|
"product_name": "Infix",
|
||||||
|
"registry_version": 4,
|
||||||
|
"documentation_url": "https://kernelkit.org/infix/latest/",
|
||||||
|
"status": "stable",
|
||||||
|
"availability": "free",
|
||||||
|
"maintainer": "KernelKit",
|
||||||
|
"maintainer_email": "kernelkit@googlegroups.com",
|
||||||
|
"usage": "Default login, user/pass: admin/admin\n\nType 'cli' (and Enter) followed by 'help' for an overview of commands and relevant configuration files.",
|
||||||
|
"port_name_format": "eth{0}",
|
||||||
|
"linked_clone": true,
|
||||||
|
"symbol": "router_red.svg",
|
||||||
|
"qemu": {
|
||||||
|
"adapter_type": "virtio-net-pci",
|
||||||
|
"adapters": 10,
|
||||||
|
"ram": 512,
|
||||||
|
"cpus": 1,
|
||||||
|
"hda_disk_interface": "virtio",
|
||||||
|
"arch": "x86_64",
|
||||||
|
"console_type": "telnet",
|
||||||
|
"process_priority": "normal",
|
||||||
|
"kvm": "allow"
|
||||||
|
},
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "OVMF-edk2-stable202305.fd",
|
||||||
|
"version": "stable202305",
|
||||||
|
"md5sum": "6c4cf1519fec4a4b95525d9ae562963a",
|
||||||
|
"filesize": 4194304,
|
||||||
|
"download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/",
|
||||||
|
"direct_download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/OVMF-edk2-stable202305.fd.zip/download",
|
||||||
|
"compression": "zip"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "infix-x86_64-disk-24.11.1.img",
|
||||||
|
"filesize": 536870912,
|
||||||
|
"md5sum": "673a123fe122d1c2f5724baf9965a19d",
|
||||||
|
"version": "24.11.1",
|
||||||
|
"download_url": "https://github.com/kernelkit/infix/releases/download/v24.11.1/infix-x86_64-24.11.1.tar.gz",
|
||||||
|
"compression": "gzip"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "infix-x86_64-disk-25.01.0.img",
|
||||||
|
"filesize": 536870912,
|
||||||
|
"md5sum": "a814d93b385116b4a35712c445b5f830",
|
||||||
|
"version": "25.01.0",
|
||||||
|
"download_url": "https://github.com/kernelkit/infix/releases/download/v25.01.0/infix-x86_64-25.01.0.tar.gz",
|
||||||
|
"compression": "gzip"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "infix-x86_64-disk-25.02.0.img",
|
||||||
|
"filesize": 536870912,
|
||||||
|
"md5sum": "8e29474c97df3486eb063a8af5043f50",
|
||||||
|
"version": "25.02.0",
|
||||||
|
"download_url": "https://github.com/kernelkit/infix/releases/download/v25.02.0/infix-x86_64-25.02.0.tar.gz",
|
||||||
|
"compression": "gzip"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "infix-x86_64-disk-25.03.0.img",
|
||||||
|
"filesize": 536870912,
|
||||||
|
"md5sum": "5e1ed1081cd1673bfed4a9b5b1c58e08",
|
||||||
|
"version": "25.03.0",
|
||||||
|
"download_url": "https://github.com/kernelkit/infix/releases/download/v25.03.0/infix-x86_64-25.03.0.tar.gz",
|
||||||
|
"compression": "gzip"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "infix-x86_64-disk-25.04.0.qcow2",
|
||||||
|
"filesize": 259723776,
|
||||||
|
"md5sum": "84bd999513325d0007d0e6587abc6140",
|
||||||
|
"version": "25.04.0",
|
||||||
|
"direct_download_url": "https://github.com/kernelkit/infix/releases/download/v25.04.0/infix-x86_64-disk-25.04.0.qcow2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "infix-x86_64-disk-25.05.0.qcow2",
|
||||||
|
"filesize": 259958784,
|
||||||
|
"md5sum": "a6b1b3a6bccc60bb5214f2b864602fde",
|
||||||
|
"version": "25.05.0",
|
||||||
|
"direct_download_url": "https://github.com/kernelkit/infix/releases/download/v25.05.0/infix-x86_64-disk-25.05.0.qcow2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "infix-x86_64-disk-25.08.0.qcow2",
|
||||||
|
"filesize": 284453888,
|
||||||
|
"md5sum": "5fbf146d2ac73d1bd8fa1c509d6169b1",
|
||||||
|
"version": "25.08.0",
|
||||||
|
"direct_download_url": "https://github.com/kernelkit/infix/releases/download/v25.08.0/infix-x86_64-disk-25.08.0.qcow2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "infix-x86_64-disk-25.09.0.qcow2",
|
||||||
|
"filesize": 285120000,
|
||||||
|
"md5sum": "9761968406780a5b28311b8527f8629f",
|
||||||
|
"version": "25.09.0",
|
||||||
|
"direct_download_url": "https://github.com/kernelkit/infix/releases/download/v25.09.0/infix-x86_64-disk-25.09.0.qcow2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "infix-x86_64-disk-25.10.0.qcow2",
|
||||||
|
"filesize": 288818688,
|
||||||
|
"md5sum": "781d0fce9fbf789f6ea6ff10dc104afb",
|
||||||
|
"version": "25.10.0",
|
||||||
|
"direct_download_url": "https://github.com/kernelkit/infix/releases/download/v25.10.0/infix-x86_64-disk-25.10.0.qcow2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "infix-x86_64-disk-25.11.0.qcow2",
|
||||||
|
"filesize": 288930816,
|
||||||
|
"md5sum": "e2eb1a4fff9d56815f37c2e82a6279fb",
|
||||||
|
"version": "25.11.0",
|
||||||
|
"direct_download_url": "https://github.com/kernelkit/infix/releases/download/v25.11.0/infix-x86_64-disk-25.11.0.qcow2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "infix-x86_64-v26.01.0.qcow2",
|
||||||
|
"filesize": 307363840,
|
||||||
|
"md5sum": "bd3b9c56f98ba264c36e4d6f69931546",
|
||||||
|
"version": "26.01.0",
|
||||||
|
"direct_download_url": "https://github.com/kernelkit/infix/releases/download/v26.01.0/infix-x86_64-v26.01.0.qcow2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "infix-x86_64-v26.02.1.qcow2",
|
||||||
|
"filesize": 316407808,
|
||||||
|
"md5sum": "0c4da508cfcb702c066f47227644b65f",
|
||||||
|
"version": "26.02.1",
|
||||||
|
"direct_download_url": "https://github.com/kernelkit/infix/releases/download/v26.02.1/infix-x86_64-v26.02.1.qcow2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "infix-x86_64-v26.03.0.qcow2",
|
||||||
|
"filesize": 320339968,
|
||||||
|
"md5sum": "24cd1006734993dab338e5c75f80b875",
|
||||||
|
"version": "26.03.0",
|
||||||
|
"direct_download_url": "https://github.com/kernelkit/infix/releases/download/v26.03.0/infix-x86_64-v26.03.0.qcow2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "infix-x86_64-v26.05.0.qcow2",
|
||||||
|
"filesize": 330039296,
|
||||||
|
"md5sum": "60f7c36c389c33ab108acc021f41ccd5",
|
||||||
|
"version": "26.05.0",
|
||||||
|
"direct_download_url": "https://github.com/kernelkit/infix/releases/download/v26.05.0/infix-x86_64-v26.05.0.qcow2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "infix-x86_64-v26.06.0.qcow2",
|
||||||
|
"filesize": 363593728,
|
||||||
|
"md5sum": "79ca8bd8534bbaa1af0ab874a49d6f4c",
|
||||||
|
"version": "26.06.0",
|
||||||
|
"direct_download_url": "https://github.com/kernelkit/infix/releases/download/v26.06.0/infix-x86_64-v26.06.0.qcow2"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "26.06.0",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "infix-x86_64-v26.06.0.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "26.05.0",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "infix-x86_64-v26.05.0.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "26.03.0",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "infix-x86_64-v26.03.0.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "26.02.1",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "infix-x86_64-v26.02.1.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "26.01.0",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "infix-x86_64-v26.01.0.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "25.11.0",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "infix-x86_64-disk-25.11.0.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "25.10.0",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "infix-x86_64-disk-25.10.0.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "25.09.0",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "infix-x86_64-disk-25.09.0.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "25.08.0",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "infix-x86_64-disk-25.08.0.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "25.05.0",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "infix-x86_64-disk-25.05.0.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "25.04.0",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "infix-x86_64-disk-25.04.0.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "25.03.0",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "infix-x86_64-disk-25.03.0.img"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "25.02.0",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "infix-x86_64-disk-25.02.0.img"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "25.01.0",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "infix-x86_64-disk-25.01.0.img"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "24.11.1",
|
||||||
|
"images": {
|
||||||
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
|
"hda_disk_image": "infix-x86_64-disk-24.11.1.img"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
75
gns3server/appliances/juniper-vJunos-router.gns3a
Normal file
75
gns3server/appliances/juniper-vJunos-router.gns3a
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
{
|
||||||
|
"appliance_id": "12394e0d-9ac5-4da5-8e91-94a462536b61",
|
||||||
|
"name": "vJunos-router",
|
||||||
|
"category": "router",
|
||||||
|
"description": "vJunos-router",
|
||||||
|
"vendor_name": "Juniper",
|
||||||
|
"vendor_url": "https://www.juniper.net",
|
||||||
|
"documentation_url": "https://www.juniper.net/documentation/product/us/en/vjunos-router/",
|
||||||
|
"product_name": "vJunos Router",
|
||||||
|
"registry_version": 6,
|
||||||
|
"status": "stable",
|
||||||
|
"availability": "free",
|
||||||
|
"maintainer": "AAm-kun",
|
||||||
|
"maintainer_email": "github@sugarpapa.mozmail.com",
|
||||||
|
"usage": "GNS3 SHOULD be a baremetal installation. Using the GNS3 VM MIGHT result in unwanted issues. Default user is root. No password is needed.",
|
||||||
|
"symbol": "juniper-vmx.svg",
|
||||||
|
"first_port_name": "fxp0",
|
||||||
|
"port_name_format": "ge-0/0/{port0}",
|
||||||
|
"qemu": {
|
||||||
|
"adapter_type": "virtio-net-pci",
|
||||||
|
"adapters": 11,
|
||||||
|
"ram": 5120,
|
||||||
|
"cpus": 4,
|
||||||
|
"hda_disk_interface": "virtio",
|
||||||
|
"arch": "x86_64",
|
||||||
|
"console_type": "telnet",
|
||||||
|
"kvm": "require",
|
||||||
|
"options": "-serial mon:stdio -nographic -smbios type=1,product=VM-VMX,family=lab -cpu host",
|
||||||
|
"on_close": "power_off"
|
||||||
|
},
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "vJunos-router-24.2R1-S2.qcow2",
|
||||||
|
"version": "24.2R1-S2",
|
||||||
|
"md5sum": "dd906b4d19463e22f3e1a297ff1a7464",
|
||||||
|
"filesize": 3675783168,
|
||||||
|
"download_url": "https://support.juniper.net/support/downloads/?p=vjunos-router"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "vJunos-router-23.4R2-S2.1.qcow2",
|
||||||
|
"version": "23.4R2-S2.1",
|
||||||
|
"md5sum": "e25f5acdfc6c076d0023fd8289bcdd89",
|
||||||
|
"filesize": 3644063744,
|
||||||
|
"download_url": "https://support.juniper.net/support/downloads/?p=vjunos-router"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "vJunos-router-23.2R1.15.qcow2",
|
||||||
|
"version": "23.2R1.15",
|
||||||
|
"md5sum": "18670fb67633822697fdd3cf982e7eb1",
|
||||||
|
"filesize": 3653566464,
|
||||||
|
"download_url": "https://support.juniper.net/support/downloads/?p=vjunos-router"
|
||||||
|
}
|
||||||
|
|
||||||
|
],
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "vJunos-router-24.2R1-S2.qcow2"
|
||||||
|
},
|
||||||
|
"name": "24.2R1-S2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "vJunos-router-23.4R2-S2.1.qcow2"
|
||||||
|
},
|
||||||
|
"name": "23.4R2-S2.1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "vJunos-router-23.2R1.15.qcow2"
|
||||||
|
},
|
||||||
|
"name": "23.2R1.15"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -11,237 +11,34 @@
|
|||||||
"status": "stable",
|
"status": "stable",
|
||||||
"maintainer": "GNS3 Team",
|
"maintainer": "GNS3 Team",
|
||||||
"maintainer_email": "developers@gns3.net",
|
"maintainer_email": "developers@gns3.net",
|
||||||
"usage": "Default password is toor\nEnable persistence by selecting boot option 'Live USB Persistence'",
|
"usage": "Default username is kali and the default password is kali",
|
||||||
"port_name_format": "eth{0}",
|
"port_name_format": "eth{0}",
|
||||||
"qemu": {
|
"qemu": {
|
||||||
"adapter_type": "e1000",
|
"adapter_type": "e1000",
|
||||||
"adapters": 8,
|
"adapters": 8,
|
||||||
"ram": 1024,
|
"ram": 2048,
|
||||||
|
"cpus": 2,
|
||||||
"hda_disk_interface": "ide",
|
"hda_disk_interface": "ide",
|
||||||
"arch": "x86_64",
|
"arch": "x86_64",
|
||||||
"console_type": "vnc",
|
"console_type": "vnc",
|
||||||
"boot_priority": "d",
|
|
||||||
"kvm": "require"
|
"kvm": "require"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
{
|
{
|
||||||
"filename": "kali-linux-2021.1-live-amd64.iso",
|
"filename": "kali-linux-2025.4-qemu-amd64.qcow2",
|
||||||
"version": "2021.1",
|
"version": "2025.4",
|
||||||
"md5sum": "3a3716fef866e5c29a1c1ccfc94264b5",
|
"md5sum": "a4be43351b5deb5b2823cb38a73b2095",
|
||||||
"filesize": 3591385088,
|
"filesize": 15719268352,
|
||||||
"download_url": "http://cdimage.kali.org/kali-2021.1/",
|
"download_url": "https://cdimage.kali.org/kali-2025.4/",
|
||||||
"direct_download_url": "http://cdimage.kali.org/kali-2021.1/kali-linux-2021.1-live-amd64.iso"
|
"direct_download_url": "https://cdimage.kali.org/kali-2025.4/kali-linux-2025.4-qemu-amd64.7z",
|
||||||
},
|
"compression": "7z"
|
||||||
{
|
|
||||||
"filename": "kali-linux-2019.3-amd64.iso",
|
|
||||||
"version": "2019.3",
|
|
||||||
"md5sum": "9c6fb00558f78ed06992d89f745ef975",
|
|
||||||
"filesize": 3037736960,
|
|
||||||
"download_url": "http://old.kali.org/kali-images/kali-2019.3",
|
|
||||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2019.3/kali-linux-2019.3-amd64.iso"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "kali-linux-2019.2-amd64.iso",
|
|
||||||
"version": "2019.2",
|
|
||||||
"md5sum": "0f89b6225d7ea9c18682f7cc541c1179",
|
|
||||||
"filesize": 3353227264,
|
|
||||||
"download_url": "http://old.kali.org/kali-images/kali-2019.2",
|
|
||||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2019.2/kali-linux-2019.2-amd64.iso"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "kali-linux-mate-2019.2-amd64.iso",
|
|
||||||
"version": "2019.2 (MATE)",
|
|
||||||
"md5sum": "fec8dd7009f932c51a74323df965a709",
|
|
||||||
"filesize": 3313217536,
|
|
||||||
"download_url": "http://old.kali.org/kali-images/kali-2019.2",
|
|
||||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2019.2/kali-linux-mate-2019.2-amd64.iso"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "kali-linux-2019.1a-amd64.iso",
|
|
||||||
"version": "2019.1a",
|
|
||||||
"md5sum": "58c6111ed0be1919ea87267e7e65ab0f",
|
|
||||||
"filesize": 3483873280,
|
|
||||||
"download_url": "http://old.kali.org/kali-images/kali-2019.1a",
|
|
||||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2019.1a/kali-linux-2019.1a-amd64.iso"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "kali-linux-2018.4-amd64.iso",
|
|
||||||
"version": "2018.4",
|
|
||||||
"md5sum": "1b2d598bb8d2003e6207c119c0ba42fe",
|
|
||||||
"filesize": 3139436544,
|
|
||||||
"download_url": "http://old.kali.org/kali-images/kali-2018.4",
|
|
||||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2018.4/kali-linux-2018.4-amd64.iso"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "kali-linux-2018.3a-amd64.iso",
|
|
||||||
"version": "2018.3a",
|
|
||||||
"md5sum": "2da675d016bd690c05e180e33aa98b94",
|
|
||||||
"filesize": 3192651776,
|
|
||||||
"download_url": "http://old.kali.org/kali-images/kali-2018.3a",
|
|
||||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2018.3a/kali-linux-2018.3a-amd64.iso"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "kali-linux-2018.1-amd64.iso",
|
|
||||||
"version": "2018.1",
|
|
||||||
"md5sum": "a3feb90df5b71b3c7f4a02bdddf221d7",
|
|
||||||
"filesize": 3028500480,
|
|
||||||
"download_url": "http://old.kali.org/kali-images/kali-2018.1",
|
|
||||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2018.1/kali-linux-2018.1-amd64.iso"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "kali-linux-2017.3-amd64.iso",
|
|
||||||
"version": "2017.3",
|
|
||||||
"md5sum": "b465580c897e94675ac1daf031fa66b9",
|
|
||||||
"filesize": 2886402048,
|
|
||||||
"download_url": "http://old.kali.org/kali-images/kali-2017.3/",
|
|
||||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2017.3/kali-linux-2017.3-amd64.iso"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "kali-linux-2017.2-amd64.iso",
|
|
||||||
"version": "2017.2",
|
|
||||||
"md5sum": "541654f8f818450dc0db866a0a0f6eec",
|
|
||||||
"filesize": 3020619776,
|
|
||||||
"download_url": "http://old.kali.org/kali-images/kali-2017.2/",
|
|
||||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2017.2/kali-linux-2017.2-amd64.iso"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "kali-linux-2017.1-amd64.iso",
|
|
||||||
"version": "2017.1",
|
|
||||||
"md5sum": "c8e742283929d7a12dbe7c58e398ff08",
|
|
||||||
"filesize": 2794307584,
|
|
||||||
"download_url": "http://old.kali.org/kali-images/kali-2017.1/",
|
|
||||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2017.1/kali-linux-2017.1-amd64.iso"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "kali-linux-2016.2-amd64.iso",
|
|
||||||
"version": "2016.2",
|
|
||||||
"md5sum": "3d163746bc5148e61ad689d94bc263f9",
|
|
||||||
"filesize": 3076767744,
|
|
||||||
"download_url": "http://old.kali.org/kali-images/kali-2016.2/",
|
|
||||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2016.2/kali-linux-2016.2-amd64.iso"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "kali-linux-2016.1-amd64.iso",
|
|
||||||
"version": "2016.1",
|
|
||||||
"md5sum": "2e1230dc14036935b3279dfe3e49ad39",
|
|
||||||
"filesize": 2945482752,
|
|
||||||
"download_url": "http://old.kali.org/kali-images/kali-2016.1/",
|
|
||||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2016.1/kali-linux-2016.1-amd64.iso"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "kali-linux-2.0-amd64.iso",
|
|
||||||
"version": "2.0",
|
|
||||||
"md5sum": "ef192433017c5d99a156eaef51fd389d",
|
|
||||||
"filesize": 3320512512,
|
|
||||||
"download_url": "https://www.offensive-security.com/kali-linux-vmware-arm-image-download/",
|
|
||||||
"direct_download_url": "http://images.kali.org/Kali-Linux-2.0.0-vm-amd64.7z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "kali-linux-persistence-1gb.qcow2",
|
|
||||||
"version": "1.0",
|
|
||||||
"md5sum": "14e9c92f3ba5a0bd1128c1ea26a129ea",
|
|
||||||
"filesize": 34734080,
|
|
||||||
"download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/",
|
|
||||||
"direct_download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/kali-linux-persistence-1gb.qcow2/download"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
"name": "2021.1",
|
"name": "2025.4",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
"hda_disk_image": "kali-linux-2025.4-qemu-amd64.qcow2"
|
||||||
"cdrom_image": "kali-linux-2021.1-live-amd64.iso"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "2019.3",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
|
||||||
"cdrom_image": "kali-linux-2019.3-amd64.iso"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "2019.2",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
|
||||||
"cdrom_image": "kali-linux-2019.2-amd64.iso"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "2019.2 (MATE)",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
|
||||||
"cdrom_image": "kali-linux-mate-2019.2-amd64.iso"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "2019.1a",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
|
||||||
"cdrom_image": "kali-linux-2019.1a-amd64.iso"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "2018.4",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
|
||||||
"cdrom_image": "kali-linux-2018.4-amd64.iso"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "2018.3a",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
|
||||||
"cdrom_image": "kali-linux-2018.3a-amd64.iso"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "2018.1",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
|
||||||
"cdrom_image": "kali-linux-2018.1-amd64.iso"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "2017.3",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
|
||||||
"cdrom_image": "kali-linux-2017.3-amd64.iso"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "2017.2",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
|
||||||
"cdrom_image": "kali-linux-2017.2-amd64.iso"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "2017.1",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
|
||||||
"cdrom_image": "kali-linux-2017.1-amd64.iso"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "2016.2",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
|
||||||
"cdrom_image": "kali-linux-2016.2-amd64.iso"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "2016.1",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
|
||||||
"cdrom_image": "kali-linux-2016.1-amd64.iso"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "2.0",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
|
||||||
"cdrom_image": "kali-linux-2.0-amd64.iso"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@ -27,6 +27,24 @@
|
|||||||
"options": "-nographic"
|
"options": "-nographic"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "chr-7.22.1.img",
|
||||||
|
"version": "7.22.1",
|
||||||
|
"md5sum": "a67290634f489071eae2fd99dcadba86",
|
||||||
|
"filesize": 134217728,
|
||||||
|
"download_url": "http://www.mikrotik.com/download",
|
||||||
|
"direct_download_url": "https://download.mikrotik.com/routeros/7.22.1/chr-7.22.1.img.zip",
|
||||||
|
"compression": "zip"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "chr-7.20.8.img",
|
||||||
|
"version": "7.20.8",
|
||||||
|
"md5sum": "a432cf89f405115163952eefd82934e4",
|
||||||
|
"filesize": 134217728,
|
||||||
|
"download_url": "http://www.mikrotik.com/download",
|
||||||
|
"direct_download_url": "https://download.mikrotik.com/routeros/7.20.8/chr-7.20.8.img.zip",
|
||||||
|
"compression": "zip"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "chr-7.16.img",
|
"filename": "chr-7.16.img",
|
||||||
"version": "7.16",
|
"version": "7.16",
|
||||||
@ -74,6 +92,18 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "7.22.1",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "chr-7.22.1.img"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "7.20.8",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "chr-7.20.8.img"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "7.16",
|
"name": "7.16",
|
||||||
"images": {
|
"images": {
|
||||||
|
|||||||
22
gns3server/appliances/mikrotik-winbox-2026.gns3a
Normal file
22
gns3server/appliances/mikrotik-winbox-2026.gns3a
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"appliance_id": "1174e46d-4a29-4554-a1e8-71ed90682295",
|
||||||
|
"name": "MikroTik WinBox 2026",
|
||||||
|
"category": "guest",
|
||||||
|
"description": "Mikrotik's WinBox router management software for GNS3 2026",
|
||||||
|
"vendor_name": "MikroTik",
|
||||||
|
"vendor_url": "https://mikrotik.com",
|
||||||
|
"documentation_url": "https://mikrotik.com/winbox",
|
||||||
|
"product_name": "MikroTik WinBox",
|
||||||
|
"product_url": "https://mikrotik.com/winbox",
|
||||||
|
"registry_version": 4,
|
||||||
|
"status": "stable",
|
||||||
|
"availability": "free",
|
||||||
|
"maintainer": "h3ck13r",
|
||||||
|
"maintainer_email": "pisdushko1886@gmail.com",
|
||||||
|
"usage": "Connect WinBox to a MikroTik CHR port and start them both. Open WinBox console and wait until MikroTik appear in neighbors tab, provide credentials and connect.",
|
||||||
|
"docker": {
|
||||||
|
"adapters": 1,
|
||||||
|
"image": "snatao808/winbox-mikrotik-2026",
|
||||||
|
"console_type": "vnc"
|
||||||
|
}
|
||||||
|
}
|
||||||
44
gns3server/appliances/nethsecurity.gns3a
Normal file
44
gns3server/appliances/nethsecurity.gns3a
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"appliance_id": "bb9ff73a-701e-40e8-b68a-6a6efeb04e99",
|
||||||
|
"name": "NethSecurity",
|
||||||
|
"category": "firewall",
|
||||||
|
"description": "NethSecurity is an Unified Threat Management (UTM) solution that provides a comprehensive suite of security features, including firewall, content filtering, deep packet inspection (DPI) using Netifyd, Dedalo hotspot, OpenVPN, and an optional remote controller. It is designed to be easy to install and configure, making it a good choice for both small and medium-sized businesses (SMBs) as well as enterprise organizations.",
|
||||||
|
"vendor_name": "Nethesis",
|
||||||
|
"vendor_url": "https://www.nethesis.it/",
|
||||||
|
"documentation_url": "https://docs.nethsecurity.org/en/latest/",
|
||||||
|
"product_name": "NethSecurity",
|
||||||
|
"product_url": "https://nethsecurity.org/",
|
||||||
|
"registry_version": 4,
|
||||||
|
"status": "stable",
|
||||||
|
"maintainer": "GNS3 Team",
|
||||||
|
"maintainer_email": "developers@gns3.net",
|
||||||
|
"usage": "Ethernet0 is the LAN link, Ethernet1 the WAN link. The default username is root and the password is Nethesis,1234",
|
||||||
|
"qemu": {
|
||||||
|
"adapter_type": "virtio-net-pci",
|
||||||
|
"adapters": 2,
|
||||||
|
"ram": 1024,
|
||||||
|
"hda_disk_interface": "scsi",
|
||||||
|
"arch": "x86_64",
|
||||||
|
"console_type": "telnet",
|
||||||
|
"kvm": "allow"
|
||||||
|
},
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "nethsecurity-8-24.10.0-ns.1.5.1-x86-64-generic-squashfs-combined-efi.img",
|
||||||
|
"version": "8-24.10.0-ns.1.5.1",
|
||||||
|
"md5sum": "be670218effca1b86dac6b8d95012791",
|
||||||
|
"filesize": 331644416,
|
||||||
|
"download_url": "https://nethsecurity.org/download",
|
||||||
|
"direct_download_url": "https://updates.nethsecurity.nethserver.org/stable/8-24.10.0-ns.1.5.1/targets/x86/64/nethsecurity-8-24.10.0-ns.1.5.1-x86-64-generic-squashfs-combined-efi.img.gz",
|
||||||
|
"compression": "gzip"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "8-24.10.0-ns.1.5.1",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "nethsecurity-8-24.10.0-ns.1.5.1-x86-64-generic-squashfs-combined-efi.img"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -23,6 +23,24 @@
|
|||||||
"kvm": "allow"
|
"kvm": "allow"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "openwrt-25.12.0-x86-64-generic-ext4-combined.img",
|
||||||
|
"version": "25.12.0",
|
||||||
|
"md5sum": "8c0e01307fc47c1f862a5d0c9a51c2c5",
|
||||||
|
"filesize": 126353408,
|
||||||
|
"download_url": "https://downloads.openwrt.org/releases/25.12.0/targets/x86/64/",
|
||||||
|
"direct_download_url": "https://downloads.openwrt.org/releases/25.12.0/targets/x86/64/openwrt-25.12.0-x86-64-generic-ext4-combined.img.gz",
|
||||||
|
"compression": "gzip"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "openwrt-24.10.2-x86-64-generic-ext4-combined.img",
|
||||||
|
"version": "24.10.2",
|
||||||
|
"md5sum": "0769916238524161b0a9a639ae261381",
|
||||||
|
"filesize": 126353408,
|
||||||
|
"download_url": "https://downloads.openwrt.org/releases/24.10.2/targets/x86/64/",
|
||||||
|
"direct_download_url": "https://downloads.openwrt.org/releases/24.10.2/targets/x86/64/openwrt-24.10.2-x86-64-generic-ext4-combined.img.gz",
|
||||||
|
"compression": "gzip"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "openwrt-23.05.0-x86-64-generic-ext4-combined.img",
|
"filename": "openwrt-23.05.0-x86-64-generic-ext4-combined.img",
|
||||||
"version": "23.05.0",
|
"version": "23.05.0",
|
||||||
@ -223,7 +241,19 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
|
"name": "25.12.0",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "openwrt-25.12.0-x86-64-generic-ext4-combined.img"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "24.10.2",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "openwrt-24.10.2-x86-64-generic-ext4-combined.img"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
"name": "23.05.0",
|
"name": "23.05.0",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "openwrt-23.05.0-x86-64-generic-ext4-combined.img"
|
"hda_disk_image": "openwrt-23.05.0-x86-64-generic-ext4-combined.img"
|
||||||
|
|||||||
@ -25,6 +25,29 @@
|
|||||||
"kvm": "require"
|
"kvm": "require"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "OPNsense-26.1-nano-amd64.img",
|
||||||
|
"version": "26.1",
|
||||||
|
"md5sum": "3b774e8fb651a5d00aa6fa3e0d1b1ff0",
|
||||||
|
"filesize": 3221225472,
|
||||||
|
"download_url": "https://opnsense.c0urier.net/releases/26.1/",
|
||||||
|
"direct_download_url": "https://opnsense.c0urier.net/releases/26.1/OPNsense-26.1-nano-amd64.img.bz2",
|
||||||
|
"compression": "bzip2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "OPNsense-25.7-nano-amd64.img",
|
||||||
|
"version": "25.7",
|
||||||
|
"md5sum": "07aa8b44ebc57fa9ca0145f777901a59",
|
||||||
|
"filesize": 3221225472,
|
||||||
|
"download_url": "https://opnsense.c0urier.net/releases/25.7/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "OPNsense-25.1-nano-amd64.img",
|
||||||
|
"version": "25.1",
|
||||||
|
"md5sum": "9c119e4fed7dd7c1c162d8be4088d983",
|
||||||
|
"filesize": 3221225472,
|
||||||
|
"download_url": "https://opnsense.c0urier.net/releases/25.1/"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "OPNsense-24.7-nano-amd64.img",
|
"filename": "OPNsense-24.7-nano-amd64.img",
|
||||||
"version": "24.7",
|
"version": "24.7",
|
||||||
@ -76,6 +99,24 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "26.1",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "OPNsense-26.1-nano-amd64.img"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "25.7",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "OPNsense-25.7-nano-amd64.img"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "25.1",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "OPNsense-25.1-nano-amd64.img"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "24.7",
|
"name": "24.7",
|
||||||
"images": {
|
"images": {
|
||||||
|
|||||||
@ -17,7 +17,7 @@
|
|||||||
"qemu": {
|
"qemu": {
|
||||||
"adapter_type": "virtio-net-pci",
|
"adapter_type": "virtio-net-pci",
|
||||||
"adapters": 1,
|
"adapters": 1,
|
||||||
"ram": 1024,
|
"ram": 1536,
|
||||||
"hda_disk_interface": "virtio",
|
"hda_disk_interface": "virtio",
|
||||||
"arch": "x86_64",
|
"arch": "x86_64",
|
||||||
"console_type": "telnet",
|
"console_type": "telnet",
|
||||||
@ -27,44 +27,36 @@
|
|||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
{
|
{
|
||||||
"filename": "OL9U2_x86_64-kvm-b197.qcow",
|
"filename": "OL10U1_x86_64-kvm-b270.qcow2",
|
||||||
"version": "9.2",
|
"version": "10.1",
|
||||||
"md5sum": "2ff3d0bc8a243ad89c96215f303f1c73",
|
"md5sum": "c3ed48965110e0cbbd75734d3c23a2ce",
|
||||||
"filesize": 560791552,
|
"filesize": 1044119552,
|
||||||
"download_url": "https://yum.oracle.com/oracle-linux-templates.html",
|
"download_url": "https://yum.oracle.com/oracle-linux-templates.html",
|
||||||
"direct_download_url": "https://yum.oracle.com/templates/OracleLinux/OL9/u2/x86_64/OL9U2_x86_64-kvm-b197.qcow"
|
"direct_download_url": "https://yum.oracle.com/templates/OracleLinux/OL10/u1/x86_64/OL10U1_x86_64-kvm-b270.qcow2"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "OL9U1_x86_64-kvm-b158.qcow",
|
"filename": "OL9U7_x86_64-kvm-b269.qcow2",
|
||||||
"version": "9.1",
|
"version": "9.7",
|
||||||
"md5sum": "9f32851b96fc38191892197fa11f7435",
|
"md5sum": "fe0c555620d2001bb4d4d95a53b43738",
|
||||||
"filesize": 539033600,
|
"filesize": 792985600,
|
||||||
"download_url": "https://yum.oracle.com/oracle-linux-templates.html",
|
"download_url": "https://yum.oracle.com/oracle-linux-templates.html",
|
||||||
"direct_download_url": "https://yum.oracle.com/templates/OracleLinux/OL9/u1/x86_64/OL9U1_x86_64-kvm-b158.qcow"
|
"direct_download_url": "https://yum.oracle.com/templates/OracleLinux/OL9/u7/x86_64/OL9U7_x86_64-kvm-b269.qcow2"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "OL8U8_x86_64-kvm-b198.qcow",
|
"filename": "OL8U10_x86_64-kvm-b271.qcow2",
|
||||||
"version": "8.8",
|
"version": "8.10",
|
||||||
"md5sum": "717622f373d77349cc102a3a325efbd3",
|
"md5sum": "f3184e536af1c2aba6b6f499b1a7085a",
|
||||||
"filesize": 934215680,
|
"filesize": 1585643520,
|
||||||
"download_url": "https://yum.oracle.com/oracle-linux-templates.html",
|
"download_url": "https://yum.oracle.com/oracle-linux-templates.html",
|
||||||
"direct_download_url": "https://yum.oracle.com/templates/OracleLinux/OL8/u8/x86_64/OL8U8_x86_64-kvm-b198.qcow"
|
"direct_download_url": "https://yum.oracle.com/templates/OracleLinux/OL8/u10/x86_64/OL8U10_x86_64-kvm-b271.qcow2"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "OL8U7_x86_64-kvm-b148.qcow",
|
"filename": "OL7U9_x86_64-kvm-b257.qcow2",
|
||||||
"version": "8.7",
|
|
||||||
"md5sum": "962cdde7e810888b9914e937222f687f",
|
|
||||||
"filesize": 913965056,
|
|
||||||
"download_url": "https://yum.oracle.com/oracle-linux-templates.html",
|
|
||||||
"direct_download_url": "https://yum.oracle.com/templates/OracleLinux/OL8/u7/x86_64/OL8U7_x86_64-kvm-b148.qcow"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "OL7U9_x86_64-kvm-b145.qcow",
|
|
||||||
"version": "7.9",
|
"version": "7.9",
|
||||||
"md5sum": "e60d4145a69b34026db6121109ca9131",
|
"md5sum": "d3af7cf0b8f44d298a67ce9ebe184494",
|
||||||
"filesize": 725221376,
|
"filesize": 998244352,
|
||||||
"download_url": "https://yum.oracle.com/oracle-linux-templates.html",
|
"download_url": "https://yum.oracle.com/oracle-linux-templates.html",
|
||||||
"direct_download_url": "https://yum.oracle.com/templates/OracleLinux/OL7/u9/x86_64/OL7U9_x86_64-kvm-b145.qcow"
|
"direct_download_url": "https://yum.oracle.com/templates/OracleLinux/OL7/u9/x86_64/OL7U9_x86_64-kvm-b257.qcow2"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "oracle-cloud-init-data.iso",
|
"filename": "oracle-cloud-init-data.iso",
|
||||||
@ -76,38 +68,31 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
"name": "9.2",
|
"name": "10.1",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "OL9U2_x86_64-kvm-b197.qcow",
|
"hda_disk_image": "OL10U1_x86_64-kvm-b270.qcow2",
|
||||||
"cdrom_image": "oracle-cloud-init-data.iso"
|
"cdrom_image": "oracle-cloud-init-data.iso"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "9.1",
|
"name": "9.7",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "OL9U1_x86_64-kvm-b158.qcow",
|
"hda_disk_image": "OL9U7_x86_64-kvm-b269.qcow2",
|
||||||
"cdrom_image": "oracle-cloud-init-data.iso"
|
"cdrom_image": "oracle-cloud-init-data.iso"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "8.8",
|
"name": "8.10",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "OL8U8_x86_64-kvm-b198.qcow",
|
"hda_disk_image": "OL8U10_x86_64-kvm-b271.qcow2",
|
||||||
"cdrom_image": "oracle-cloud-init-data.iso"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "8.7",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "OL8U7_x86_64-kvm-b148.qcow",
|
|
||||||
"cdrom_image": "oracle-cloud-init-data.iso"
|
"cdrom_image": "oracle-cloud-init-data.iso"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "7.9",
|
"name": "7.9",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "OL7U9_x86_64-kvm-b145.qcow",
|
"hda_disk_image": "OL7U9_x86_64-kvm-b257.qcow2",
|
||||||
"cdrom_image": "oracle-cloud-init-data.iso"
|
"cdrom_image": "oracle-cloud-init-data.iso"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,11 +13,11 @@
|
|||||||
"availability": "service-contract",
|
"availability": "service-contract",
|
||||||
"maintainer": "Da-Geek",
|
"maintainer": "Da-Geek",
|
||||||
"maintainer_email": "dageek@dageeks-geeks.gg",
|
"maintainer_email": "dageek@dageeks-geeks.gg",
|
||||||
"usage": "You should download Red Hat Enterprise Linux KVM Guest Image from https://access.redhat.com/downloads/content/479/ver=/rhel---9/9.3/x86_64/product-software attach/customize rhel-cloud-init.iso and start.\nusername: cloud-user\npassword: redhat",
|
"usage": "You should download Red Hat Enterprise Linux KVM Guest Image from https://access.redhat.com/downloads/content/rhel attach/customize rhel-cloud-init.iso and start.\nusername: cloud-user\npassword: redhat",
|
||||||
"qemu": {
|
"qemu": {
|
||||||
"adapter_type": "virtio-net-pci",
|
"adapter_type": "virtio-net-pci",
|
||||||
"adapters": 1,
|
"adapters": 1,
|
||||||
"ram": 1024,
|
"ram": 1536,
|
||||||
"hda_disk_interface": "virtio",
|
"hda_disk_interface": "virtio",
|
||||||
"arch": "x86_64",
|
"arch": "x86_64",
|
||||||
"console_type": "telnet",
|
"console_type": "telnet",
|
||||||
@ -27,32 +27,46 @@
|
|||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
{
|
{
|
||||||
"filename": "rhel-9.3-x86_64-kvm.qcow2",
|
"filename": "rhel-10.1-x86_64-kvm.qcow2",
|
||||||
"version": "9.3",
|
"version": "10.1",
|
||||||
"md5sum": "409d8d15f5177db2617b0e3e02139b5c",
|
"md5sum": "b2f35b1ac0600de31cadf30a622a2fef",
|
||||||
"filesize": 858193920,
|
"filesize": 1010827264,
|
||||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---9/9.3/x86_64/product-software"
|
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---10/10.1/x86_64/product-software"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "rhel-9.2-x86_64-kvm.qcow2",
|
"filename": "rhel-10.0-x86_64-kvm.qcow2",
|
||||||
"version": "9.2",
|
"version": "10.0",
|
||||||
"md5sum": "f33845298b387dbcfbf162c6b4e3f8c8",
|
"md5sum": "ea5918fa116ec53f9ef1ce4be69ae2be",
|
||||||
"filesize": 819265536,
|
"filesize": 855506944,
|
||||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/9.2/x86_64/product-software"
|
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---10/10.0/x86_64/product-software"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "rhel-baseos-9.1-x86_64-kvm.qcow2",
|
"filename": "rhel-9.7-x86_64-kvm.qcow2",
|
||||||
"version": "9.1",
|
"version": "9.7",
|
||||||
"md5sum": "622de743da83bcec1ad2959ecaedb8f4",
|
"md5sum": "abc2f42cc5daeea6b03d0d2d478a0d1c",
|
||||||
"filesize": 753401856,
|
"filesize": 1229979648,
|
||||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/9.1/x86_64/product-software"
|
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---9/9.7/x86_64/product-software"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "rhel-baseos-9.0-x86_64-kvm.qcow2",
|
"filename": "rhel-9.6-x86_64-kvm.qcow2",
|
||||||
"version": "9.0",
|
"version": "9.6",
|
||||||
"md5sum": "4a41497d354fe99a4abf55f1ed73edcb",
|
"md5sum": "056648d716275053ebe77b1d4f68c862",
|
||||||
"filesize": 696582144,
|
"filesize": 1060438016,
|
||||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/9.0/x86_64/product-software"
|
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---9/9.6/x86_64/product-software"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "rhel-9.4-x86_64-kvm.qcow2",
|
||||||
|
"version": "9.4",
|
||||||
|
"md5sum": "77a2ca9a4cb0448260e04f0d2ebf9807",
|
||||||
|
"filesize": 957218816,
|
||||||
|
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---9/9.4/x86_64/product-software"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "rhel-8.10-x86_64-kvm.qcow2",
|
||||||
|
"version": "8.10",
|
||||||
|
"md5sum": "5fda99fcab47e3b235c6ccdb6e80d362",
|
||||||
|
"filesize": 1065091072,
|
||||||
|
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/8.10/x86_64/product-software"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "rhel-8.8-x86_64-kvm.qcow2",
|
"filename": "rhel-8.8-x86_64-kvm.qcow2",
|
||||||
@ -61,13 +75,6 @@
|
|||||||
"filesize": 926810112,
|
"filesize": 926810112,
|
||||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/8.8/x86_64/product-software"
|
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/8.8/x86_64/product-software"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"filename": "rhel-8.7-x86_64-kvm.qcow2",
|
|
||||||
"version": "8.7",
|
|
||||||
"md5sum": "ab71a2c4cc276441bf999f531e064507",
|
|
||||||
"filesize": 858128384,
|
|
||||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/8.7/x86_64/product-software"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"filename": "rhel-8.6-x86_64-kvm.qcow2",
|
"filename": "rhel-8.6-x86_64-kvm.qcow2",
|
||||||
"version": "8.6",
|
"version": "8.6",
|
||||||
@ -76,31 +83,10 @@
|
|||||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/8.6/x86_64/product-software"
|
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/8.6/x86_64/product-software"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "rhel-8.5-x86_64-kvm.qcow2",
|
"filename": "rhel-server-7.9-update-12-x86_64-kvm.qcow2",
|
||||||
"version": "8.5",
|
|
||||||
"md5sum": "1efb78dbb2033ba4ac6589a06c95c2d4",
|
|
||||||
"filesize": 779419648,
|
|
||||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/8.5/x86_64/product-software"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "rhel-8.4-x86_64-kvm.qcow2",
|
|
||||||
"version": "8.4",
|
|
||||||
"md5sum": "db4c3a72857b784dc6e96120351f2894",
|
|
||||||
"filesize": 727449600,
|
|
||||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/8.4/x86_64/product-software"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "rhel-8.3-x86_64-kvm.qcow2",
|
|
||||||
"version": "8.3",
|
|
||||||
"md5sum": "dd554c059e0910379fff88f677f4a4b3",
|
|
||||||
"filesize": 1316683776,
|
|
||||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/8.3/x86_64/product-software"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "rhel-server-7.9-x86_64-kvm.qcow2",
|
|
||||||
"version": "7.9",
|
"version": "7.9",
|
||||||
"md5sum": "8d6669b3e2bb8df15b9b4280936cf950",
|
"md5sum": "f77fc7e3cf31a210a8244e486466ce34",
|
||||||
"filesize": 827777024,
|
"filesize": 838036992,
|
||||||
"download_url": "https://access.redhat.com/downloads/content/69/ver=/rhel---7/7.9/x86_64/product-software"
|
"download_url": "https://access.redhat.com/downloads/content/69/ver=/rhel---7/7.9/x86_64/product-software"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -112,38 +98,53 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "rhel-cloud-init.iso",
|
"filename": "rhel-cloud-init.iso",
|
||||||
"version": "1.0",
|
"version": "1.1",
|
||||||
"md5sum": "421745b0d13615ecd48696f98d8b6352",
|
"md5sum": "f1f908d36e67f843dd94db1c2e8c8373",
|
||||||
"filesize": 374784,
|
"filesize": 374784,
|
||||||
"download_url": "https://gitlab.com/neyder/rhel-cloud-init/raw/master/rhel-cloud-init.iso"
|
"download_url": "https://github.com/GNS3/gns3-registry/tree/master/cloud-init/rhel",
|
||||||
|
"direct_download_url": "https://github.com/GNS3/gns3-registry/raw/master/cloud-init/rhel/rhel-cloud-init.iso"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
"name": "9.3",
|
"name": "10.1",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "rhel-9.3-x86_64-kvm.qcow2",
|
"hda_disk_image": "rhel-10.1-x86_64-kvm.qcow2",
|
||||||
"cdrom_image": "rhel-cloud-init.iso"
|
"cdrom_image": "rhel-cloud-init.iso"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "9.2",
|
"name": "10.0",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "rhel-9.2-x86_64-kvm.qcow2",
|
"hda_disk_image": "rhel-10.0-x86_64-kvm.qcow2",
|
||||||
"cdrom_image": "rhel-cloud-init.iso"
|
"cdrom_image": "rhel-cloud-init.iso"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "9.1",
|
"name": "9.7",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "rhel-baseos-9.1-x86_64-kvm.qcow2",
|
"hda_disk_image": "rhel-9.7-x86_64-kvm.qcow2",
|
||||||
"cdrom_image": "rhel-cloud-init.iso"
|
"cdrom_image": "rhel-cloud-init.iso"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "9.0",
|
"name": "9.6",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "rhel-baseos-9.0-x86_64-kvm.qcow2",
|
"hda_disk_image": "rhel-9.6-x86_64-kvm.qcow2",
|
||||||
|
"cdrom_image": "rhel-cloud-init.iso"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "9.4",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "rhel-9.4-x86_64-kvm.qcow2",
|
||||||
|
"cdrom_image": "rhel-cloud-init.iso"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "8.10",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "rhel-8.10-x86_64-kvm.qcow2",
|
||||||
"cdrom_image": "rhel-cloud-init.iso"
|
"cdrom_image": "rhel-cloud-init.iso"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -154,13 +155,6 @@
|
|||||||
"cdrom_image": "rhel-cloud-init.iso"
|
"cdrom_image": "rhel-cloud-init.iso"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "8.7",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "rhel-8.7-x86_64-kvm.qcow2",
|
|
||||||
"cdrom_image": "rhel-cloud-init.iso"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "8.6",
|
"name": "8.6",
|
||||||
"images": {
|
"images": {
|
||||||
@ -168,31 +162,10 @@
|
|||||||
"cdrom_image": "rhel-cloud-init.iso"
|
"cdrom_image": "rhel-cloud-init.iso"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "8.5",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "rhel-8.5-x86_64-kvm.qcow2",
|
|
||||||
"cdrom_image": "rhel-cloud-init.iso"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "8.4",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "rhel-8.4-x86_64-kvm.qcow2",
|
|
||||||
"cdrom_image": "rhel-cloud-init.iso"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "8.3",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "rhel-8.3-x86_64-kvm.qcow2",
|
|
||||||
"cdrom_image": "rhel-cloud-init.iso"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "7.9",
|
"name": "7.9",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "rhel-server-7.9-x86_64-kvm.qcow2",
|
"hda_disk_image": "rhel-server-7.9-update-12-x86_64-kvm.qcow2",
|
||||||
"cdrom_image": "rhel-cloud-init.iso"
|
"cdrom_image": "rhel-cloud-init.iso"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@ -17,7 +17,7 @@
|
|||||||
"qemu": {
|
"qemu": {
|
||||||
"adapter_type": "virtio-net-pci",
|
"adapter_type": "virtio-net-pci",
|
||||||
"adapters": 1,
|
"adapters": 1,
|
||||||
"ram": 1024,
|
"ram": 1536,
|
||||||
"hda_disk_interface": "virtio",
|
"hda_disk_interface": "virtio",
|
||||||
"arch": "x86_64",
|
"arch": "x86_64",
|
||||||
"console_type": "telnet",
|
"console_type": "telnet",
|
||||||
@ -26,6 +26,30 @@
|
|||||||
"options": "-nographic -cpu host"
|
"options": "-nographic -cpu host"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "Rocky-10-GenericCloud-Base-10.1-20251116.0.x86_64.qcow2",
|
||||||
|
"version": "10.1",
|
||||||
|
"md5sum": "729d7235716bd41a0a15e07d2b44c679",
|
||||||
|
"filesize": 575406080,
|
||||||
|
"download_url": "https://download.rockylinux.org/pub/rocky/9/images/x86_64/",
|
||||||
|
"direct_download_url": "https://download.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-GenericCloud-Base-10.1-20251116.0.x86_64.qcow2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "Rocky-9-GenericCloud-Base-9.7-20251123.2.x86_64.qcow2",
|
||||||
|
"version": "9.7",
|
||||||
|
"md5sum": "4a0cbfb45b97f09b690044429aaca1c8",
|
||||||
|
"filesize": 648806400,
|
||||||
|
"download_url": "https://download.rockylinux.org/pub/rocky/9/images/x86_64/",
|
||||||
|
"direct_download_url": "https://download.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-GenericCloud-Base-9.7-20251123.2.x86_64.qcow2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "Rocky-9-GenericCloud-Base-9.5-20241118.0.x86_64.qcow2",
|
||||||
|
"version": "9.5",
|
||||||
|
"md5sum": "880eccf788301bb9f34669faebe09276",
|
||||||
|
"filesize": 609812480,
|
||||||
|
"download_url": "https://download.rockylinux.org/pub/rocky/9/images/x86_64/",
|
||||||
|
"direct_download_url": "https://download.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-GenericCloud-Base-9.5-20241118.0.x86_64.qcow2"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "Rocky-9-GenericCloud-Base-9.3-20231113.0.x86_64.qcow2",
|
"filename": "Rocky-9-GenericCloud-Base-9.3-20231113.0.x86_64.qcow2",
|
||||||
"version": "9.3",
|
"version": "9.3",
|
||||||
@ -68,6 +92,27 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "10.1",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "Rocky-10-GenericCloud-Base-10.1-20251116.0.x86_64.qcow2",
|
||||||
|
"cdrom_image": "rocky-cloud-init-data.iso"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "9.7",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "Rocky-9-GenericCloud-Base-9.7-20251123.2.x86_64.qcow2",
|
||||||
|
"cdrom_image": "rocky-cloud-init-data.iso"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "9.5",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "Rocky-9-GenericCloud-Base-9.5-20241118.0.x86_64.qcow2",
|
||||||
|
"cdrom_image": "rocky-cloud-init-data.iso"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "9.3",
|
"name": "9.3",
|
||||||
"images": {
|
"images": {
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
"appliance_id": "ed6b9f98-7de2-4d61-a3ed-ad4c3e323ace",
|
"appliance_id": "ed6b9f98-7de2-4d61-a3ed-ad4c3e323ace",
|
||||||
"name": "Tiny Core Linux",
|
"name": "Tiny Core Linux",
|
||||||
"category": "guest",
|
"category": "guest",
|
||||||
"description": "Core Linux is a smaller variant of Tiny Core without a graphical desktop.\n\nIt provides a complete Linux system using only a few MiB.",
|
"description": "TinyCore is a Linux system with a graphical desktop using only a few MiB.",
|
||||||
"vendor_name": "Team Tiny Core",
|
"vendor_name": "Team Tiny Core",
|
||||||
"vendor_url": "http://distro.ibiblio.org/tinycorelinux",
|
"vendor_url": "http://distro.ibiblio.org/tinycorelinux",
|
||||||
"documentation_url": "http://wiki.tinycorelinux.net/",
|
"documentation_url": "http://wiki.tinycorelinux.net/",
|
||||||
@ -25,6 +25,14 @@
|
|||||||
"options": "-vga std -usbdevice tablet"
|
"options": "-vga std -usbdevice tablet"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "linux-tinycore-17.0.qcow2",
|
||||||
|
"version": "17.0",
|
||||||
|
"md5sum": "6434d4da25dd0277cc90b000bb4ac8f1",
|
||||||
|
"filesize": 35061760,
|
||||||
|
"download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/",
|
||||||
|
"direct_download_url": "http://downloads.sourceforge.net/project/gns-3/Qemu%20Appliances/linux-tinycore-17.0.qcow2"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "linux-tinycore-11.1.qcow2",
|
"filename": "linux-tinycore-11.1.qcow2",
|
||||||
"version": "11.1",
|
"version": "11.1",
|
||||||
@ -51,6 +59,12 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "17.0",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "linux-tinycore-17.0.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "11.1",
|
"name": "11.1",
|
||||||
"images": {
|
"images": {
|
||||||
|
|||||||
@ -14,7 +14,7 @@
|
|||||||
"symbol": "linux_guest.svg",
|
"symbol": "linux_guest.svg",
|
||||||
"docker": {
|
"docker": {
|
||||||
"adapters": 1,
|
"adapters": 1,
|
||||||
"image": "gns3/ubuntu:noble",
|
"image": "gns3/ubuntu:resolute",
|
||||||
"console_type": "telnet"
|
"console_type": "telnet"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,27 +9,82 @@
|
|||||||
"documentation_url": "https://docs.vyos.io/",
|
"documentation_url": "https://docs.vyos.io/",
|
||||||
"product_name": "VyOS Universal Router",
|
"product_name": "VyOS Universal Router",
|
||||||
"product_url": "https://vyos.io/vyos-universal-router",
|
"product_url": "https://vyos.io/vyos-universal-router",
|
||||||
"registry_version": 4,
|
"registry_version": 8,
|
||||||
"status": "stable",
|
"status": "stable",
|
||||||
"availability": "service-contract",
|
"availability": "service-contract",
|
||||||
"maintainer": "VyOS Inc.",
|
"maintainer": "VyOS Inc.",
|
||||||
"maintainer_email": "support@vyos.io",
|
"maintainer_email": "support@vyos.io",
|
||||||
"usage": "\nDefault credentials:\nUser: vyos\nPassword: vyos",
|
"installation_instructions": "To install the appliance, you must:\n\n1. Have an active VyOS subscription (for details, visit https://vyos.io/).\n2. Download the QEMU/KVM image for your target version from the support portal: https://support.vyos.io/.\n3. Import the downloaded image for installation in the next step.\n\nAlternatively, you can:\n- Build your own image, or\n- Use any compatible qcow2 images (including rolling or stream releases) by selecting \"Create a new version\" and enabling the \"Allow custom files\" feature.",
|
||||||
|
"usage": "No extra installation steps are required - simply boot the router.\nFor more details, please refer to the documentation: https://docs.vyos.io/",
|
||||||
|
"default_username": "vyos",
|
||||||
|
"default_password": "vyos",
|
||||||
"symbol": "vyos.svg",
|
"symbol": "vyos.svg",
|
||||||
"port_name_format": "eth{0}",
|
"settings": [
|
||||||
"qemu": {
|
{
|
||||||
"adapter_type": "virtio-net-pci",
|
"name": "default x86_64",
|
||||||
"adapters": 10,
|
"default": true,
|
||||||
"ram": 2048,
|
"template_type": "qemu",
|
||||||
"cpus": 4,
|
"template_properties": {
|
||||||
"hda_disk_interface": "virtio",
|
"adapter_type": "virtio-net-pci",
|
||||||
"arch": "x86_64",
|
"adapters": 10,
|
||||||
"console_type": "telnet",
|
"port_name_format": "eth{0}",
|
||||||
"boot_priority": "c",
|
"ram": 2048,
|
||||||
"kvm": "require",
|
"cpus": 4,
|
||||||
"on_close": "shutdown_signal"
|
"hda_disk_interface": "virtio",
|
||||||
},
|
"platform": "x86_64",
|
||||||
|
"console_type": "telnet",
|
||||||
|
"boot_priority": "c",
|
||||||
|
"options": "-cpu host",
|
||||||
|
"uefi": false,
|
||||||
|
"on_close": "shutdown_signal"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "1.5 x86_64",
|
||||||
|
"inherit_default_properties": true,
|
||||||
|
"template_type": "qemu",
|
||||||
|
"template_properties": {
|
||||||
|
"ram": 8192,
|
||||||
|
"cpus": 4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "vyos-1.5.0-kvm-amd64.qcow2",
|
||||||
|
"version": "1.5.0",
|
||||||
|
"md5sum": "f84587bd6c45b139563a1d1d2fe0b2e8",
|
||||||
|
"filesize": 618528768,
|
||||||
|
"download_url": "https://support.vyos.io/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "vyos-1.4.4-kvm-amd64.qcow2",
|
||||||
|
"version": "1.4.4",
|
||||||
|
"md5sum": "942dae45d63924b58b65d069890765d4",
|
||||||
|
"filesize": 518782976,
|
||||||
|
"download_url": "https://support.vyos.io/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "vyos-1.4.3-kvm-amd64.qcow2",
|
||||||
|
"version": "1.4.3",
|
||||||
|
"md5sum": "4eec0ba2ec367bbbdf2d2f212f947746",
|
||||||
|
"filesize": 515047424,
|
||||||
|
"download_url": "https://support.vyos.io/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "vyos-1.4.2-kvm-amd64.qcow2",
|
||||||
|
"version": "1.4.2",
|
||||||
|
"md5sum": "78c5935e05a7bbd94a639fcee18f5799",
|
||||||
|
"filesize": 514064384,
|
||||||
|
"download_url": "https://support.vyos.io/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "vyos-1.4.1-kvm-amd64.qcow2",
|
||||||
|
"version": "1.4.1",
|
||||||
|
"md5sum": "5b8ebcd9905719d24405ed093afdd8ba",
|
||||||
|
"filesize": 513736704,
|
||||||
|
"download_url": "https://support.vyos.io/"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "vyos-1.4.0-kvm-amd64.qcow2",
|
"filename": "vyos-1.4.0-kvm-amd64.qcow2",
|
||||||
"version": "1.4.0",
|
"version": "1.4.0",
|
||||||
@ -104,11 +159,42 @@
|
|||||||
"filename": "vyos-1.2.5-amd64.qcow2",
|
"filename": "vyos-1.2.5-amd64.qcow2",
|
||||||
"version": "1.2.5",
|
"version": "1.2.5",
|
||||||
"md5sum": "110c22309ec480600446fd2fb4f27a0d",
|
"md5sum": "110c22309ec480600446fd2fb4f27a0d",
|
||||||
"filesize": 411500544 ,
|
"filesize": 411500544,
|
||||||
"download_url": "https://support.vyos.io/"
|
"download_url": "https://support.vyos.io/"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "1.5.0",
|
||||||
|
"settings": "1.5 x86_64",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "vyos-1.5.0-kvm-amd64.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "1.4.4",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "vyos-1.4.4-kvm-amd64.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "1.4.3",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "vyos-1.4.3-kvm-amd64.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "1.4.2",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "vyos-1.4.2-kvm-amd64.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "1.4.1",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "vyos-1.4.1-kvm-amd64.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "1.4.0",
|
"name": "1.4.0",
|
||||||
"images": {
|
"images": {
|
||||||
|
|||||||
86
gns3server/appliances/westermo-weos.gns3a
Normal file
86
gns3server/appliances/westermo-weos.gns3a
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
{
|
||||||
|
"appliance_id": "90afc191-6195-4ff2-905b-5470573a882b",
|
||||||
|
"name": "Westermo WeOS",
|
||||||
|
"category": "router",
|
||||||
|
"description": "Westermo Operating System (WeOS) is a leading-edge industrial network operating system that is being continuously developed whilst being subjected to exhaustive quality testing. It powers the most reliable switches and routers on the market, designed for harsh industrial environments. WeOS has extensive support for network and security protocols that have been made simple to configure and maintain. WeOS along with Westermo’s robust hardware provides the world’s most reliable network solutions.",
|
||||||
|
"vendor_name": "Westermo",
|
||||||
|
"vendor_url": "https://www.westermo.com/",
|
||||||
|
"vendor_logo_url": "https://api-0831ddf0-b06c-4a4e-bcf7-afba78872de1.digizuite.app/DigizuiteCore/CollaborationService/api/share/asset/4C90E538E869D47D2782840A06F726F6D7548D864857388E38218F",
|
||||||
|
"documentation_url": "https://docs.westermo.com/weos/weos-5/",
|
||||||
|
"product_name": "WeOS",
|
||||||
|
"product_url": "https://www.westermo.com/products/software/weos",
|
||||||
|
"registry_version": 4,
|
||||||
|
"status": "stable",
|
||||||
|
"availability": "free",
|
||||||
|
"maintainer": "Westermo",
|
||||||
|
"maintainer_email": "info@westermo.com",
|
||||||
|
"usage": "\nFactory Configuration\n=====================\nAll ports are in VLAN1 untagged. The system will acquire a link-local\nIPv4 address (169.254.0.0/16) and will also request an address using\nDHCP. mDNS is enabled and the device is reachable under these names\n(where XX-XX-XX corresponds to the last three octets in the device's\nMAC address): zero-XX-XX-XX.local, zero.local, and weos.local.\n\nManagement\n==========\nAccessible via console, ssh, and http/https.\n\nUsername: admin\nPassword: admin\n\nUpgrade\n=======\nTo upgrade a device, simply download the new version and replace the\nHDA (Primary Master) image under the HDD tab in the configuration pane\nof the device.\n",
|
||||||
|
"symbol": ":/symbols/classic/router.svg",
|
||||||
|
"port_name_format": "eth{0}",
|
||||||
|
"linked_clone": true,
|
||||||
|
"qemu": {
|
||||||
|
"adapter_type": "virtio-net-pci",
|
||||||
|
"adapters": 8,
|
||||||
|
"ram": 512,
|
||||||
|
"cpus": 1,
|
||||||
|
"hda_disk_interface": "virtio",
|
||||||
|
"hdb_disk_interface": "virtio",
|
||||||
|
"arch": "x86_64",
|
||||||
|
"console_type": "telnet",
|
||||||
|
"kvm": "allow",
|
||||||
|
"options": "-nographic --machine pc-i440fx-4.2"
|
||||||
|
},
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "Config-zero-1.0.0.disk",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"md5sum": "afe7b74683971fec48802997f6470ca5",
|
||||||
|
"filesize": 17825792,
|
||||||
|
"direct_download_url": "https://dropzone.westermo.com/file.aspx?id=e6a7676d-85a7-4374-8961-c68aacb74921"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "WeOS-zero-5.29.0.disk",
|
||||||
|
"version": "5.29.0",
|
||||||
|
"filesize": 81788928,
|
||||||
|
"md5sum": "f464de7b2b424f4a8ad7c650108fee3d",
|
||||||
|
"direct_download_url": "https://dropzone.westermo.com/file.aspx?id=52655074-0fab-4119-ba01-b68200a733ab"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "WeOS-zero-5.28.0.disk",
|
||||||
|
"version": "5.28.0",
|
||||||
|
"md5sum": "7b4e29761091c12ec2cd482f7c1a0bea",
|
||||||
|
"filesize": 75497472,
|
||||||
|
"direct_download_url": "https://dropzone.westermo.com/file.aspx?id=4926adbe-0cd6-4851-b70f-e9d60b3b3f06"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "WeOS-zero-5.27.0.disk",
|
||||||
|
"version": "5.27.0",
|
||||||
|
"md5sum": "8bd4944b60eaeca391bb5d1dc0defb8b",
|
||||||
|
"filesize": 78643200,
|
||||||
|
"direct_download_url": "https://dropzone.westermo.com/file.aspx?id=1a7bf389-a4b1-4dae-b121-6fb3d6781542"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "5.29.0",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "WeOS-zero-5.29.0.disk",
|
||||||
|
"hdb_disk_image": "Config-zero-1.0.0.disk"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "5.28.0",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "WeOS-zero-5.28.0.disk",
|
||||||
|
"hdb_disk_image": "Config-zero-1.0.0.disk"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "5.27.0",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "WeOS-zero-5.27.0.disk",
|
||||||
|
"hdb_disk_image": "Config-zero-1.0.0.disk"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -30,19 +30,11 @@
|
|||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
{
|
{
|
||||||
"filename": "WinDev2308Eval-disk1.vmdk",
|
"filename": "WinDev2407Eval-disk1.vmdk",
|
||||||
"version": "2308",
|
"version": "2407",
|
||||||
"md5sum": "6a9b4ed6d7481f7bbf8a054c797b1eee",
|
"md5sum": "66e7233c7922ef128c5b7c957d20bcbe",
|
||||||
"filesize": 24945341952,
|
"filesize": 25984826368,
|
||||||
"download_url": "https://download.microsoft.com/download/7/1/3/7135f2ab-8528-49fc-9252-8d5d94c697ef/WinDev2308Eval.VMWare.zip",
|
"download_url": "https://download.microsoft.com/download/e/e/c/eec4775f-f2e8-4476-98b2-ca51502a6429/WinDev2407Eval.VMWare.zip",
|
||||||
"compression": "zip"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "WinDev2212Eval-disk1.vmdk",
|
|
||||||
"version": "2212",
|
|
||||||
"md5sum": "c79f393a067b92e01a513a118d455ac8",
|
|
||||||
"filesize": 24620493824,
|
|
||||||
"download_url": "https://aka.ms/windev_VM_vmware",
|
|
||||||
"compression": "zip"
|
"compression": "zip"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -57,17 +49,10 @@
|
|||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
"name": "2308",
|
"name": "2407",
|
||||||
"images": {
|
"images": {
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||||
"hda_disk_image": "WinDev2308Eval-disk1.vmdk"
|
"hda_disk_image": "WinDev2407Eval-disk1.vmdk"
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "2212",
|
|
||||||
"images": {
|
|
||||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
|
||||||
"hda_disk_image": "WinDev2212Eval-disk1.vmdk"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@ -312,8 +312,10 @@ class BaseNode:
|
|||||||
Stop the node process.
|
Stop the node process.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
await self.stop_wrap_console()
|
try:
|
||||||
self.status = "stopped"
|
await self.stop_wrap_console()
|
||||||
|
finally:
|
||||||
|
self.status = "stopped"
|
||||||
|
|
||||||
def suspend(self):
|
def suspend(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@ -311,7 +311,7 @@ class Cloud(BaseNode):
|
|||||||
if not port_info["interface"] in network_interfaces:
|
if not port_info["interface"] in network_interfaces:
|
||||||
raise NodeError("Interface '{}' could not be found on this system, please update '{}'".format(port_info["interface"], self.name))
|
raise NodeError("Interface '{}' could not be found on this system, please update '{}'".format(port_info["interface"], self.name))
|
||||||
|
|
||||||
if sys.platform.startswith("linux"):
|
if sys.platform.startswith("linux") or sys.platform.startswith("openbsd"):
|
||||||
await self._add_linux_ethernet(port_info, bridge_name)
|
await self._add_linux_ethernet(port_info, bridge_name)
|
||||||
elif sys.platform.startswith("darwin"):
|
elif sys.platform.startswith("darwin"):
|
||||||
await self._add_osx_ethernet(port_info, bridge_name)
|
await self._add_osx_ethernet(port_info, bridge_name)
|
||||||
|
|||||||
@ -33,15 +33,15 @@ from gns3server.config import Config
|
|||||||
from gns3server.utils.asyncio import locking
|
from gns3server.utils.asyncio import locking
|
||||||
from gns3server.compute.base_manager import BaseManager
|
from gns3server.compute.base_manager import BaseManager
|
||||||
from gns3server.compute.docker.docker_vm import DockerVM
|
from gns3server.compute.docker.docker_vm import DockerVM
|
||||||
from gns3server.compute.docker.docker_error import DockerError, DockerHttp304Error, DockerHttp404Error
|
from gns3server.compute.docker.docker_error import DockerError, DockerHttp304Error, DockerHttp404Error, DockerHttp409Error
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
# Be careful to keep it consistent
|
# Be careful to keep it consistent
|
||||||
DOCKER_MINIMUM_API_VERSION = "1.25"
|
DOCKER_MINIMUM_API_VERSION = "1.40"
|
||||||
DOCKER_MINIMUM_VERSION = "1.13"
|
DOCKER_MINIMUM_VERSION = "19.03.8"
|
||||||
DOCKER_PREFERRED_API_VERSION = "1.30"
|
DOCKER_PREFERRED_API_VERSION = "1.44"
|
||||||
CHUNK_SIZE = 1024 * 8 # 8KB
|
CHUNK_SIZE = 1024 * 8 # 8KB
|
||||||
|
|
||||||
|
|
||||||
@ -79,8 +79,10 @@ class Docker(BaseManager):
|
|||||||
stderr=asyncio.subprocess.DEVNULL
|
stderr=asyncio.subprocess.DEVNULL
|
||||||
)
|
)
|
||||||
stdout, _ = await proc.communicate()
|
stdout, _ = await proc.communicate()
|
||||||
if proc.returncode == 1:
|
if proc.returncode == 1 or "static" in busybox_exec:
|
||||||
# ldd returns 1 if the file is not a dynamic executable
|
# ldd returns 1 if the file is not a dynamic executable
|
||||||
|
# on Alpine/musl, ldd returns 0 even for static binaries,
|
||||||
|
# so also trust binaries named busybox-static or busybox.static
|
||||||
log.info(f"Installing busybox from '{busybox_path}' to '{dst_busybox}'")
|
log.info(f"Installing busybox from '{busybox_path}' to '{dst_busybox}'")
|
||||||
shutil.copy2(busybox_path, dst_busybox, follow_symlinks=True)
|
shutil.copy2(busybox_path, dst_busybox, follow_symlinks=True)
|
||||||
return
|
return
|
||||||
@ -123,22 +125,30 @@ class Docker(BaseManager):
|
|||||||
if not self._connected:
|
if not self._connected:
|
||||||
try:
|
try:
|
||||||
self._connected = True
|
self._connected = True
|
||||||
connector = self.connector()
|
self._connector = self.connector()
|
||||||
version = await self.query("GET", "version")
|
docker_info = await self.query("GET", "version")
|
||||||
except (aiohttp.ClientOSError, FileNotFoundError):
|
except (aiohttp.ClientOSError, FileNotFoundError):
|
||||||
self._connected = False
|
self._connected = False
|
||||||
raise DockerError("Can't connect to docker daemon")
|
raise DockerError("Can't connect to Docker daemon")
|
||||||
|
|
||||||
docker_version = parse_version(version['ApiVersion'])
|
api_version = parse_version(docker_info['ApiVersion'])
|
||||||
|
version = docker_info["Version"]
|
||||||
|
|
||||||
if docker_version < parse_version(DOCKER_MINIMUM_API_VERSION):
|
if api_version < parse_version(DOCKER_MINIMUM_API_VERSION):
|
||||||
raise DockerError(
|
raise DockerError("Docker version is {}. GNS3 requires a minimum version of {}".format(
|
||||||
"Docker version is {}. GNS3 requires a minimum version of {}".format(
|
version,
|
||||||
version["Version"], DOCKER_MINIMUM_VERSION))
|
DOCKER_MINIMUM_VERSION)
|
||||||
|
)
|
||||||
|
|
||||||
preferred_api_version = parse_version(DOCKER_PREFERRED_API_VERSION)
|
preferred_api_version = parse_version(DOCKER_PREFERRED_API_VERSION)
|
||||||
if docker_version >= preferred_api_version:
|
if api_version >= preferred_api_version:
|
||||||
self._api_version = DOCKER_PREFERRED_API_VERSION
|
self._api_version = DOCKER_PREFERRED_API_VERSION
|
||||||
|
else:
|
||||||
|
# use the Min API version supported by the daemon
|
||||||
|
self._api_version = docker_info['MinAPIVersion']
|
||||||
|
log.warning("Using Docker client with the minimum API version {}".format(self._api_version))
|
||||||
|
|
||||||
|
log.info("Connected to Docker daemon version {} using API version {}".format(version, self._api_version))
|
||||||
|
|
||||||
def connector(self):
|
def connector(self):
|
||||||
|
|
||||||
@ -173,11 +183,10 @@ class Docker(BaseManager):
|
|||||||
response = await self.http_query(method, path, data=data, params=params)
|
response = await self.http_query(method, path, data=data, params=params)
|
||||||
body = await response.read()
|
body = await response.read()
|
||||||
response.close()
|
response.close()
|
||||||
if body and len(body):
|
if response.headers.get('CONTENT-TYPE') == 'application/json':
|
||||||
if response.headers.get('CONTENT-TYPE') == 'application/json':
|
body = json.loads(body.decode("utf-8", errors="ignore"))
|
||||||
body = json.loads(body.decode("utf-8"))
|
else:
|
||||||
else:
|
body = body.decode("utf-8", errors="ignore")
|
||||||
body = body.decode("utf-8")
|
|
||||||
log.debug("Query Docker %s %s params=%s data=%s Response: %s", method, path, params, data, body)
|
log.debug("Query Docker %s %s params=%s data=%s Response: %s", method, path, params, data, body)
|
||||||
return body
|
return body
|
||||||
|
|
||||||
@ -187,7 +196,7 @@ class Docker(BaseManager):
|
|||||||
|
|
||||||
:param method: HTTP method
|
:param method: HTTP method
|
||||||
:param path: Endpoint in API
|
:param path: Endpoint in API
|
||||||
:param data: Dictionnary with the body. Will be transformed to a JSON
|
:param data: Dictionary with the body. Will be transformed to a JSON
|
||||||
:param params: Parameters added as a query arg
|
:param params: Parameters added as a query arg
|
||||||
:param timeout: Timeout
|
:param timeout: Timeout
|
||||||
:returns: HTTP response
|
:returns: HTTP response
|
||||||
@ -198,12 +207,11 @@ class Docker(BaseManager):
|
|||||||
timeout = 60 * 60 * 24 * 31 # One month timeout
|
timeout = 60 * 60 * 24 * 31 # One month timeout
|
||||||
|
|
||||||
if path == 'version':
|
if path == 'version':
|
||||||
url = "http://docker/v1.24/" + path
|
url = "http://docker/" + path
|
||||||
else:
|
else:
|
||||||
url = "http://docker/v" + DOCKER_MINIMUM_API_VERSION + "/" + path
|
await self._check_connection() # version is use by check connection
|
||||||
|
url = "http://docker/v" + self._api_version + "/" + path
|
||||||
try:
|
try:
|
||||||
if path != "version": # version is use by check connection
|
|
||||||
await self._check_connection()
|
|
||||||
if self._session is None or self._session.closed:
|
if self._session is None or self._session.closed:
|
||||||
connector = self.connector()
|
connector = self.connector()
|
||||||
self._session = aiohttp.ClientSession(connector=connector)
|
self._session = aiohttp.ClientSession(connector=connector)
|
||||||
@ -228,6 +236,8 @@ class Docker(BaseManager):
|
|||||||
raise DockerHttp304Error("Docker has returned an error: {} {}".format(response.status, body))
|
raise DockerHttp304Error("Docker has returned an error: {} {}".format(response.status, body))
|
||||||
elif response.status == 404:
|
elif response.status == 404:
|
||||||
raise DockerHttp404Error("Docker has returned an error: {} {}".format(response.status, body))
|
raise DockerHttp404Error("Docker has returned an error: {} {}".format(response.status, body))
|
||||||
|
elif response.status == 409:
|
||||||
|
raise DockerHttp409Error("Docker has returned an error: {} {}".format(response.status, body))
|
||||||
else:
|
else:
|
||||||
raise DockerError("Docker has returned an error: {} {}".format(response.status, body))
|
raise DockerError("Docker has returned an error: {} {}".format(response.status, body))
|
||||||
return response
|
return response
|
||||||
@ -261,21 +271,21 @@ class Docker(BaseManager):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
if progress_callback:
|
if progress_callback:
|
||||||
progress_callback("Pulling '{}' from docker hub".format(image))
|
progress_callback("Pulling '{}' from Docker repository".format(image))
|
||||||
try:
|
try:
|
||||||
response = await self.http_query("POST", "images/create", params={"fromImage": image}, timeout=None)
|
response = await self.http_query("POST", "images/create", params={"fromImage": image}, timeout=None)
|
||||||
except DockerError as e:
|
except DockerError as e:
|
||||||
raise DockerError("Could not pull the '{}' image from Docker Hub, please check your Internet connection (original error: {})".format(image, e))
|
raise DockerError("Could not pull the '{}' image from Docker repository, please check your Internet connection (original error: {})".format(image, e))
|
||||||
# The pull api will stream status via an HTTP JSON stream
|
# The pull api will stream status via an HTTP JSON stream
|
||||||
content = ""
|
content = ""
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
chunk = await response.content.read(CHUNK_SIZE)
|
chunk = await response.content.read(CHUNK_SIZE)
|
||||||
except aiohttp.ServerDisconnectedError:
|
except aiohttp.ServerDisconnectedError:
|
||||||
log.error("Disconnected from server while pulling Docker image '{}' from docker hub".format(image))
|
log.error("Disconnected from server while pulling Docker image '{}' from Docker repository".format(image))
|
||||||
break
|
break
|
||||||
except asyncio.TimeoutError:
|
except asyncio.TimeoutError:
|
||||||
log.error("Timeout while pulling Docker image '{}' from docker hub".format(image))
|
log.error("Timeout while pulling Docker image '{}' from Docker repository".format(image))
|
||||||
break
|
break
|
||||||
if not chunk:
|
if not chunk:
|
||||||
break
|
break
|
||||||
|
|||||||
@ -32,3 +32,7 @@ class DockerHttp304Error(DockerError):
|
|||||||
|
|
||||||
class DockerHttp404Error(DockerError):
|
class DockerHttp404Error(DockerError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class DockerHttp409Error(DockerError):
|
||||||
|
pass
|
||||||
|
|||||||
@ -43,7 +43,8 @@ from ..nios.nio_udp import NIOUDP
|
|||||||
from .docker_error import (
|
from .docker_error import (
|
||||||
DockerError,
|
DockerError,
|
||||||
DockerHttp304Error,
|
DockerHttp304Error,
|
||||||
DockerHttp404Error
|
DockerHttp404Error,
|
||||||
|
DockerHttp409Error
|
||||||
)
|
)
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
@ -153,6 +154,14 @@ class DockerVM(BaseNode):
|
|||||||
def ethernet_adapters(self):
|
def ethernet_adapters(self):
|
||||||
return self._ethernet_adapters
|
return self._ethernet_adapters
|
||||||
|
|
||||||
|
@property
|
||||||
|
def docker_name(self):
|
||||||
|
"""
|
||||||
|
Container name in Docker
|
||||||
|
"""
|
||||||
|
|
||||||
|
return "GNS3.{}.{}".format(self.name, self._project.id)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def mac_address(self):
|
def mac_address(self):
|
||||||
"""
|
"""
|
||||||
@ -365,7 +374,7 @@ class DockerVM(BaseNode):
|
|||||||
try:
|
try:
|
||||||
image_infos = await self._get_image_information()
|
image_infos = await self._get_image_information()
|
||||||
except DockerHttp404Error:
|
except DockerHttp404Error:
|
||||||
log.info("Image '{}' is missing, pulling it from Docker hub...".format(self._image))
|
log.info("Image '{}' is missing, pulling it from Docker repository...".format(self._image))
|
||||||
await self.pull_image(self._image)
|
await self.pull_image(self._image)
|
||||||
image_infos = await self._get_image_information()
|
image_infos = await self._get_image_information()
|
||||||
|
|
||||||
@ -451,9 +460,31 @@ class DockerVM(BaseNode):
|
|||||||
if extra_hosts:
|
if extra_hosts:
|
||||||
params["Env"].append("GNS3_EXTRA_HOSTS={}".format(extra_hosts))
|
params["Env"].append("GNS3_EXTRA_HOSTS={}".format(extra_hosts))
|
||||||
|
|
||||||
result = await self.manager.query("POST", "containers/create", data=params)
|
try:
|
||||||
self._cid = result['Id']
|
# Supported names in Docker: [a-zA-Z0-9][a-zA-Z0-9_.-]
|
||||||
log.info("Docker container '{name}' [{id}] created".format(name=self._name, id=self._id))
|
result = await self.manager.query("POST", f"containers/create?name={self.docker_name}", data=params)
|
||||||
|
except DockerHttp409Error:
|
||||||
|
# Container name already exists. This can happen when the server crashes
|
||||||
|
# and leaves containers behind. Try to remove the conflicting container.
|
||||||
|
log.warning(f"Container name '{self.docker_name}' is already in use, attempting to clean up the stale container...")
|
||||||
|
try:
|
||||||
|
# Try to get and remove the conflicting container
|
||||||
|
try:
|
||||||
|
container_info = await self.manager.query("GET", f"containers/{self.docker_name}/json")
|
||||||
|
container_id = container_info["Id"]
|
||||||
|
# Force remove the container
|
||||||
|
await self.manager.query("DELETE", f"containers/{container_id}", params={"force": 1, "v": 1})
|
||||||
|
log.info(f"Removed stale container '{self.docker_name}' ({container_id})")
|
||||||
|
except DockerHttp404Error:
|
||||||
|
# Container doesn't exist anymore, race condition - just continue
|
||||||
|
pass
|
||||||
|
# Retry creating the container
|
||||||
|
result = await self.manager.query("POST", f"containers/create?name={self.docker_name}", data=params)
|
||||||
|
except DockerError as e:
|
||||||
|
log.error(f"Failed to clean up conflicting container '{self.docker_name}': {e}")
|
||||||
|
raise
|
||||||
|
self._cid = result["Id"]
|
||||||
|
log.info(f"Docker container '{self._name}' [{self._id}] created")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def _format_env(self, variables, env):
|
def _format_env(self, variables, env):
|
||||||
@ -522,6 +553,7 @@ class DockerVM(BaseNode):
|
|||||||
await self._clean_servers()
|
await self._clean_servers()
|
||||||
|
|
||||||
await self.manager.query("POST", "containers/{}/start".format(self._cid))
|
await self.manager.query("POST", "containers/{}/start".format(self._cid))
|
||||||
|
await asyncio.sleep(0.5) # give the Docker container some time to start
|
||||||
self._namespace = await self._get_namespace()
|
self._namespace = await self._get_namespace()
|
||||||
|
|
||||||
await self._start_ubridge(require_privileged_access=True)
|
await self._start_ubridge(require_privileged_access=True)
|
||||||
@ -837,7 +869,7 @@ class DockerVM(BaseNode):
|
|||||||
await self._fix_permissions()
|
await self._fix_permissions()
|
||||||
|
|
||||||
state = await self._get_container_state()
|
state = await self._get_container_state()
|
||||||
if state != "stopped" or state != "exited":
|
if state != "stopped" and state != "exited":
|
||||||
# t=5 number of seconds to wait before killing the container
|
# t=5 number of seconds to wait before killing the container
|
||||||
try:
|
try:
|
||||||
await self.manager.query("POST", "containers/{}/stop".format(self._cid), params={"t": 5})
|
await self.manager.query("POST", "containers/{}/stop".format(self._cid), params={"t": 5})
|
||||||
|
|||||||
@ -3,7 +3,12 @@
|
|||||||
# script for udhcpc
|
# script for udhcpc
|
||||||
# Copyright (c) 2008 Natanael Copa <natanael.copa@gmail.com>
|
# Copyright (c) 2008 Natanael Copa <natanael.copa@gmail.com>
|
||||||
|
|
||||||
UDHCPC="/gns3/etc/udhcpc"
|
if [ -d /etc/network ]; then
|
||||||
|
UDHCPC="/etc/network/udhcpc"
|
||||||
|
else
|
||||||
|
UDHCPC="/gns3/etc/udhcpc"
|
||||||
|
fi
|
||||||
|
|
||||||
UDHCPC_CONF="$UDHCPC/udhcpc.conf"
|
UDHCPC_CONF="$UDHCPC/udhcpc.conf"
|
||||||
|
|
||||||
RESOLV_CONF="/etc/resolv.conf"
|
RESOLV_CONF="/etc/resolv.conf"
|
||||||
|
|||||||
@ -87,11 +87,11 @@ class IOUVM(BaseNode):
|
|||||||
self._serial_adapters = []
|
self._serial_adapters = []
|
||||||
self.ethernet_adapters = 2 # one adapter = 4 interfaces
|
self.ethernet_adapters = 2 # one adapter = 4 interfaces
|
||||||
self.serial_adapters = 2 # one adapter = 4 interfaces
|
self.serial_adapters = 2 # one adapter = 4 interfaces
|
||||||
self._use_default_iou_values = True # for RAM & NVRAM values
|
self._use_default_iou_values = False # for RAM & NVRAM values
|
||||||
self._nvram = 128 # Kilobytes
|
self._nvram = 256 # Kilobytes
|
||||||
self._startup_config = ""
|
self._startup_config = ""
|
||||||
self._private_config = ""
|
self._private_config = ""
|
||||||
self._ram = 256 # Megabytes
|
self._ram = 1024 # Megabytes
|
||||||
self._application_id = application_id
|
self._application_id = application_id
|
||||||
self._l1_keepalives = False # used to overcome the always-up Ethernet interfaces (not supported by all IOSes).
|
self._l1_keepalives = False # used to overcome the always-up Ethernet interfaces (not supported by all IOSes).
|
||||||
|
|
||||||
@ -578,7 +578,7 @@ class IOUVM(BaseNode):
|
|||||||
callback = functools.partial(self._termination_callback, "IOU")
|
callback = functools.partial(self._termination_callback, "IOU")
|
||||||
gns3server.utils.asyncio.monitor_process(self._iou_process, callback)
|
gns3server.utils.asyncio.monitor_process(self._iou_process, callback)
|
||||||
except FileNotFoundError as e:
|
except FileNotFoundError as e:
|
||||||
raise IOUError("Could not start IOU: {}: 32-bit binary support is probably not installed".format(e))
|
raise IOUError("Could not start IOU: {}: 32-bit binary support is probably not installed, it is recommended to use a 64-bit image instead".format(e))
|
||||||
except (OSError, subprocess.SubprocessError) as e:
|
except (OSError, subprocess.SubprocessError) as e:
|
||||||
iou_stdout = self.read_iou_stdout()
|
iou_stdout = self.read_iou_stdout()
|
||||||
log.error("Could not start IOU {}: {}\n{}".format(self._path, e, iou_stdout))
|
log.error("Could not start IOU {}: {}\n{}".format(self._path, e, iou_stdout))
|
||||||
|
|||||||
@ -33,7 +33,9 @@ import gns3server
|
|||||||
import subprocess
|
import subprocess
|
||||||
import time
|
import time
|
||||||
import json
|
import json
|
||||||
|
import psutil
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
from gns3server.utils import parse_version, shlex_quote
|
from gns3server.utils import parse_version, shlex_quote
|
||||||
from gns3server.utils.asyncio import subprocess_check_output, cancellable_wait_run_in_executor
|
from gns3server.utils.asyncio import subprocess_check_output, cancellable_wait_run_in_executor
|
||||||
from .qemu_error import QemuError
|
from .qemu_error import QemuError
|
||||||
@ -224,7 +226,7 @@ class QemuVM(BaseNode):
|
|||||||
if qemu_bin == "qemu":
|
if qemu_bin == "qemu":
|
||||||
self._platform = "i386"
|
self._platform = "i386"
|
||||||
else:
|
else:
|
||||||
self._platform = re.sub(r'^qemu-system-(\w+).*$', r'\1', qemu_bin, re.IGNORECASE)
|
self._platform = re.sub(r'^qemu-system-(\w+).*$', r'\1', qemu_bin, flags=re.IGNORECASE)
|
||||||
if self._platform.split(".")[0] not in QEMU_PLATFORMS:
|
if self._platform.split(".")[0] not in QEMU_PLATFORMS:
|
||||||
raise QemuError("Platform {} is unknown".format(self._platform))
|
raise QemuError("Platform {} is unknown".format(self._platform))
|
||||||
log.info('QEMU VM "{name}" [{id}] has set the QEMU path to {qemu_path}'.format(name=self._name,
|
log.info('QEMU VM "{name}" [{id}] has set the QEMU path to {qemu_path}'.format(name=self._name,
|
||||||
@ -1166,6 +1168,21 @@ class QemuVM(BaseNode):
|
|||||||
except OSError as e:
|
except OSError as e:
|
||||||
raise QemuError("Could not start Telnet QEMU console {}\n".format(e))
|
raise QemuError("Could not start Telnet QEMU console {}\n".format(e))
|
||||||
|
|
||||||
|
def _find_partition_for_path(self, path):
|
||||||
|
"""
|
||||||
|
Finds the disk partition for a given path.
|
||||||
|
"""
|
||||||
|
|
||||||
|
path = os.path.abspath(path)
|
||||||
|
partitions = psutil.disk_partitions()
|
||||||
|
# find the partition with the longest matching mount point
|
||||||
|
matching_partition = None
|
||||||
|
for partition in partitions:
|
||||||
|
if path.startswith(partition.mountpoint):
|
||||||
|
if matching_partition is None or len(partition.mountpoint) > len(matching_partition.mountpoint):
|
||||||
|
matching_partition = partition
|
||||||
|
return matching_partition
|
||||||
|
|
||||||
async def _termination_callback(self, returncode):
|
async def _termination_callback(self, returncode):
|
||||||
"""
|
"""
|
||||||
Called when the process has stopped.
|
Called when the process has stopped.
|
||||||
@ -1178,7 +1195,17 @@ class QemuVM(BaseNode):
|
|||||||
await self.stop()
|
await self.stop()
|
||||||
# A return code of 1 seem fine on Windows
|
# A return code of 1 seem fine on Windows
|
||||||
if returncode != 0 and (not sys.platform.startswith("win") or returncode != 1):
|
if returncode != 0 and (not sys.platform.startswith("win") or returncode != 1):
|
||||||
self.project.emit("log.error", {"message": "QEMU process has stopped, return code: {}\n{}".format(returncode, self.read_stdout())})
|
qemu_stdout = self.read_stdout()
|
||||||
|
# additional permissions need to be configured for swtpm in AppArmor if the working dir
|
||||||
|
# is located on a different partition than the partition for the root directory
|
||||||
|
if "TPM result for CMD_INIT" in qemu_stdout:
|
||||||
|
partition = self._find_partition_for_path(self.project.path)
|
||||||
|
if partition and partition.mountpoint != "/":
|
||||||
|
qemu_stdout += "\nTPM error: the project directory is not on the same partition as the root directory which can be a problem when using AppArmor.\n" \
|
||||||
|
"Please try to execute the following commands on the server:\n\n" \
|
||||||
|
"echo 'owner {}/** rwk,' | sudo tee /etc/apparmor.d/local/usr.bin.swtpm > /dev/null\n" \
|
||||||
|
"sudo service apparmor restart".format(os.path.dirname(self.project.path))
|
||||||
|
self.project.emit("log.error", {"message": "QEMU process has stopped, return code: {}\n{}".format(returncode, qemu_stdout)})
|
||||||
|
|
||||||
async def stop(self):
|
async def stop(self):
|
||||||
"""
|
"""
|
||||||
@ -2029,20 +2056,59 @@ class QemuVM(BaseNode):
|
|||||||
else:
|
else:
|
||||||
raise QemuError("bios image '{}' is not accessible".format(self._bios_image))
|
raise QemuError("bios image '{}' is not accessible".format(self._bios_image))
|
||||||
options.extend(["-bios", self._bios_image.replace(",", ",,")])
|
options.extend(["-bios", self._bios_image.replace(",", ",,")])
|
||||||
|
|
||||||
elif self._uefi:
|
elif self._uefi:
|
||||||
# get the OVMF firmware from the images directory
|
ovmf_firmware_dir = self._manager.config.get_section_config("Qemu").get("ovmf_firmware_dir", "/usr/share/OVMF")
|
||||||
ovmf_firmware_path = self.manager.get_abs_image_path("OVMF_CODE.fd")
|
system_ovmf_firmware_dir = Path(ovmf_firmware_dir)
|
||||||
|
log.info("Using OVMF firmware directory: {}".format(system_ovmf_firmware_dir))
|
||||||
|
old_ovmf_vars_path = os.path.join(self.working_dir, "OVMF_VARS.fd")
|
||||||
|
if os.path.exists(old_ovmf_vars_path):
|
||||||
|
# the node has its own UEFI variables store already, we must also use the old UEFI firmware
|
||||||
|
ovmf_firmware_path = self.manager.get_abs_image_path("OVMF_CODE.fd")
|
||||||
|
else:
|
||||||
|
# Use a manual case-insensitive search instead
|
||||||
|
try:
|
||||||
|
system_ovmf_firmware_path = next((f for f in system_ovmf_firmware_dir.glob("*.fd")
|
||||||
|
if f.name.lower() == "ovmf_code_4m.fd"), None)
|
||||||
|
except (FileNotFoundError, StopIteration):
|
||||||
|
system_ovmf_firmware_path = None
|
||||||
|
|
||||||
|
if system_ovmf_firmware_path:
|
||||||
|
ovmf_firmware_path = str(system_ovmf_firmware_path)
|
||||||
|
else:
|
||||||
|
# otherwise, get the UEFI firmware from the images directory
|
||||||
|
ovmf_firmware_path = self.manager.get_abs_image_path("OVMF_CODE_4M.fd")
|
||||||
|
|
||||||
log.info("Configuring UEFI boot mode using OVMF file: '{}'".format(ovmf_firmware_path))
|
log.info("Configuring UEFI boot mode using OVMF file: '{}'".format(ovmf_firmware_path))
|
||||||
options.extend(["-drive", "if=pflash,format=raw,readonly,file={}".format(ovmf_firmware_path)])
|
options.extend(["-drive", "if=pflash,format=raw,readonly,file={}".format(ovmf_firmware_path)])
|
||||||
|
|
||||||
|
# try to use the UEFI variables store from the system first
|
||||||
|
try:
|
||||||
|
system_ovmf_vars_path = next((f for f in system_ovmf_firmware_dir.glob("*.fd")
|
||||||
|
if f.name.lower() == "ovmf_vars_4m.fd"), None)
|
||||||
|
except (FileNotFoundError, StopIteration):
|
||||||
|
system_ovmf_vars_path = None
|
||||||
|
if system_ovmf_vars_path:
|
||||||
|
ovmf_vars_path = str(system_ovmf_vars_path)
|
||||||
|
else:
|
||||||
|
# otherwise, get the UEFI variables store from the images directory
|
||||||
|
ovmf_vars_path = self.manager.get_abs_image_path("OVMF_VARS_4M.fd")
|
||||||
|
|
||||||
# the node should have its own copy of OVMF_VARS.fd (the UEFI variables store)
|
# the node should have its own copy of OVMF_VARS.fd (the UEFI variables store)
|
||||||
ovmf_vars_node_path = os.path.join(self.working_dir, "OVMF_VARS.fd")
|
if os.path.exists(old_ovmf_vars_path):
|
||||||
if not os.path.exists(ovmf_vars_node_path):
|
ovmf_vars_node_path = old_ovmf_vars_path
|
||||||
try:
|
else:
|
||||||
shutil.copyfile(self.manager.get_abs_image_path("OVMF_VARS.fd"), ovmf_vars_node_path)
|
ovmf_vars_node_path = os.path.join(self.working_dir, "OVMF_VARS_4M.fd")
|
||||||
except OSError as e:
|
if not os.path.exists(ovmf_vars_node_path):
|
||||||
raise QemuError("Cannot copy OVMF_VARS.fd file to the node working directory: {}".format(e))
|
try:
|
||||||
|
shutil.copyfile(ovmf_vars_path, ovmf_vars_node_path)
|
||||||
|
except OSError as e:
|
||||||
|
raise QemuError("Cannot copy OVMF_VARS_4M.fd file to the node working directory: {}".format(e))
|
||||||
options.extend(["-drive", "if=pflash,format=raw,file={}".format(ovmf_vars_node_path)])
|
options.extend(["-drive", "if=pflash,format=raw,file={}".format(ovmf_vars_node_path)])
|
||||||
|
|
||||||
|
# edk2 firmware requires a Random Number Generator (RNG) device in order to turn network adapters on
|
||||||
|
options.extend(["-object", "rng-random,filename=/dev/urandom,id=rng0"])
|
||||||
|
options.extend(["-device", "virtio-rng-pci,rng=rng0"])
|
||||||
return options
|
return options
|
||||||
|
|
||||||
def _linux_boot_options(self):
|
def _linux_boot_options(self):
|
||||||
@ -2141,14 +2207,31 @@ class QemuVM(BaseNode):
|
|||||||
patched_qemu = True
|
patched_qemu = True
|
||||||
|
|
||||||
# Each 32 PCI device we need to add a PCI bridge with max 9 bridges
|
# Each 32 PCI device we need to add a PCI bridge with max 9 bridges
|
||||||
pci_devices = 4 + len(self._ethernet_adapters) # 4 PCI devices are use by default by qemu
|
# Count PCI devices: 4 default + disks (virtio/sata/nvme/scsi) + network adapters
|
||||||
|
pci_disk_devices = 0
|
||||||
|
for drive in ["a", "b", "c", "d"]:
|
||||||
|
# config disk replaces hdd when enabled
|
||||||
|
if drive == "d" and self._create_config_disk:
|
||||||
|
continue
|
||||||
|
if getattr(self, "_hd{}_disk_image".format(drive)):
|
||||||
|
interface = getattr(self, "_hd{}_disk_interface".format(drive))
|
||||||
|
# virtio, sata, nvme, and scsi each consume 1 PCI slot; ide and none don't
|
||||||
|
if interface not in ("none", "ide"):
|
||||||
|
pci_disk_devices += 1
|
||||||
|
# config disk (replaces hdd) also consumes a PCI slot if created
|
||||||
|
if self._create_config_disk and self.config_disk_image:
|
||||||
|
interface = self.hdd_disk_interface if self.hdd_disk_interface != "none" else self.hda_disk_interface
|
||||||
|
if interface not in ("none", "ide"):
|
||||||
|
pci_disk_devices += 1
|
||||||
|
|
||||||
|
pci_devices = 4 + pci_disk_devices + len(self._ethernet_adapters)
|
||||||
pci_bridges = math.floor(pci_devices / 32)
|
pci_bridges = math.floor(pci_devices / 32)
|
||||||
pci_bridges_created = 0
|
pci_bridges_created = 0
|
||||||
if pci_bridges >= 1:
|
if pci_bridges >= 1:
|
||||||
if self._qemu_version and parse_version(self._qemu_version) < parse_version("2.4.0"):
|
if self._qemu_version and parse_version(self._qemu_version) < parse_version("2.4.0"):
|
||||||
raise QemuError("Qemu version 2.4 or later is required to run this VM with a large number of network adapters")
|
raise QemuError("Qemu version 2.4 or later is required to run this VM with a large number of network adapters")
|
||||||
|
|
||||||
pci_device_id = 4 + pci_bridges # Bridge consume PCI ports
|
pci_device_id = 4 + pci_bridges + pci_disk_devices # Bridges and disks consume PCI ports
|
||||||
for adapter_number, adapter in enumerate(self._ethernet_adapters):
|
for adapter_number, adapter in enumerate(self._ethernet_adapters):
|
||||||
mac = int_to_macaddress(macaddress_to_int(self._mac_address) + adapter_number)
|
mac = int_to_macaddress(macaddress_to_int(self._mac_address) + adapter_number)
|
||||||
|
|
||||||
@ -2397,7 +2480,6 @@ class QemuVM(BaseNode):
|
|||||||
elif sys.platform.startswith("win") or sys.platform.startswith("darwin"):
|
elif sys.platform.startswith("win") or sys.platform.startswith("darwin"):
|
||||||
command.extend(["-enable-hax"])
|
command.extend(["-enable-hax"])
|
||||||
command.extend(["-boot", "order={}".format(self._boot_priority)])
|
command.extend(["-boot", "order={}".format(self._boot_priority)])
|
||||||
command.extend(self._bios_option())
|
|
||||||
command.extend(self._cdrom_option())
|
command.extend(self._cdrom_option())
|
||||||
command.extend((await self._disk_options()))
|
command.extend((await self._disk_options()))
|
||||||
command.extend(self._linux_boot_options())
|
command.extend(self._linux_boot_options())
|
||||||
@ -2415,6 +2497,8 @@ class QemuVM(BaseNode):
|
|||||||
raise QemuError("Console type {} is unknown".format(self._console_type))
|
raise QemuError("Console type {} is unknown".format(self._console_type))
|
||||||
command.extend(self._monitor_options())
|
command.extend(self._monitor_options())
|
||||||
command.extend((await self._network_options()))
|
command.extend((await self._network_options()))
|
||||||
|
# bios options must be last to have predictable NIC numbering, see https://github.com/GNS3/gns3-server/issues/2838
|
||||||
|
command.extend(self._bios_option())
|
||||||
if self.on_close != "save_vm_state":
|
if self.on_close != "save_vm_state":
|
||||||
await self._clear_save_vm_stated()
|
await self._clear_save_vm_stated()
|
||||||
else:
|
else:
|
||||||
|
|||||||
@ -13,8 +13,7 @@ logging console discriminator EXCESS
|
|||||||
!
|
!
|
||||||
no ip icmp rate-limit unreachable
|
no ip icmp rate-limit unreachable
|
||||||
!
|
!
|
||||||
! due to some bugs with IOU, try to change the following line to 'ip cef' if your routing does not work
|
ip cef
|
||||||
no ip cef
|
|
||||||
no ip domain lookup
|
no ip domain lookup
|
||||||
!
|
!
|
||||||
!
|
!
|
||||||
|
|||||||
@ -12,8 +12,7 @@ no ip icmp rate-limit unreachable
|
|||||||
!
|
!
|
||||||
!
|
!
|
||||||
!
|
!
|
||||||
! due to some bugs with IOU, try to change the following line to 'ip cef' if your routing does not work
|
ip cef
|
||||||
no ip cef
|
|
||||||
no ip domain lookup
|
no ip domain lookup
|
||||||
!
|
!
|
||||||
!
|
!
|
||||||
|
|||||||
@ -217,7 +217,7 @@ class Controller:
|
|||||||
try:
|
try:
|
||||||
os.makedirs(os.path.dirname(self._config_file), exist_ok=True)
|
os.makedirs(os.path.dirname(self._config_file), exist_ok=True)
|
||||||
with open(self._config_file, 'w+') as f:
|
with open(self._config_file, 'w+') as f:
|
||||||
json.dump(controller_settings, f, indent=4)
|
json.dump(controller_settings, f, indent=4, sort_keys=True)
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
log.error("Cannot write controller configuration file '{}': {}".format(self._config_file, e))
|
log.error("Cannot write controller configuration file '{}': {}".format(self._config_file, e))
|
||||||
|
|
||||||
@ -562,7 +562,15 @@ class Controller:
|
|||||||
|
|
||||||
for project in self._projects.values():
|
for project in self._projects.values():
|
||||||
if project.auto_open:
|
if project.auto_open:
|
||||||
await project.open()
|
try:
|
||||||
|
await project.open()
|
||||||
|
except aiohttp.web.HTTPClientError as e:
|
||||||
|
details = e.text or e.reason or str(e)
|
||||||
|
log.warning(
|
||||||
|
"Failed to auto-open project '%s': %s",
|
||||||
|
project.name,
|
||||||
|
details,
|
||||||
|
)
|
||||||
|
|
||||||
def get_free_project_name(self, base_name):
|
def get_free_project_name(self, base_name):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@ -32,7 +32,16 @@ log = logging.getLogger(__name__)
|
|||||||
CHUNK_SIZE = 1024 * 8 # 8KB
|
CHUNK_SIZE = 1024 * 8 # 8KB
|
||||||
|
|
||||||
|
|
||||||
async def export_project(zstream, project, temporary_dir, include_images=False, include_snapshots=False, keep_compute_ids=False, allow_all_nodes=False, reset_mac_addresses=False):
|
async def export_project(
|
||||||
|
zstream,
|
||||||
|
project,
|
||||||
|
temporary_dir,
|
||||||
|
include_images=False,
|
||||||
|
include_snapshots=False,
|
||||||
|
keep_compute_ids=False,
|
||||||
|
allow_all_nodes=False,
|
||||||
|
reset_mac_addresses=False
|
||||||
|
):
|
||||||
"""
|
"""
|
||||||
Export a project to a zip file.
|
Export a project to a zip file.
|
||||||
|
|
||||||
@ -46,7 +55,7 @@ async def export_project(zstream, project, temporary_dir, include_images=False,
|
|||||||
:param include_snapshots: save snapshots to the zip file
|
:param include_snapshots: save snapshots to the zip file
|
||||||
:param keep_compute_ids: If false replace all compute IDs y local (standard behavior for .gns3project to make it portable)
|
:param keep_compute_ids: If false replace all compute IDs y local (standard behavior for .gns3project to make it portable)
|
||||||
:param allow_all_nodes: Allow all nodes type to be included in the zip even if not portable
|
:param allow_all_nodes: Allow all nodes type to be included in the zip even if not portable
|
||||||
:param reset_mac_addresses: Reset MAC addresses for each node.
|
:param reset_mac_addresses: Reset MAC addresses for each node
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# To avoid issue with data not saved we disallow the export of a running project
|
# To avoid issue with data not saved we disallow the export of a running project
|
||||||
@ -62,7 +71,16 @@ async def export_project(zstream, project, temporary_dir, include_images=False,
|
|||||||
# First we process the .gns3 in order to be sure we don't have an error
|
# First we process the .gns3 in order to be sure we don't have an error
|
||||||
for file in os.listdir(project._path):
|
for file in os.listdir(project._path):
|
||||||
if file.endswith(".gns3"):
|
if file.endswith(".gns3"):
|
||||||
await _patch_project_file(project, os.path.join(project._path, file), zstream, include_images, keep_compute_ids, allow_all_nodes, temporary_dir, reset_mac_addresses)
|
await _patch_project_file(
|
||||||
|
project,
|
||||||
|
os.path.join(project._path, file),
|
||||||
|
zstream,
|
||||||
|
include_images,
|
||||||
|
keep_compute_ids,
|
||||||
|
allow_all_nodes,
|
||||||
|
temporary_dir,
|
||||||
|
reset_mac_addresses
|
||||||
|
)
|
||||||
|
|
||||||
# Export the local files
|
# Export the local files
|
||||||
for root, dirs, files in os.walk(project._path, topdown=True, followlinks=False):
|
for root, dirs, files in os.walk(project._path, topdown=True, followlinks=False):
|
||||||
@ -87,6 +105,10 @@ async def export_project(zstream, project, temporary_dir, include_images=False,
|
|||||||
# save empty directories
|
# save empty directories
|
||||||
for directory in dirs:
|
for directory in dirs:
|
||||||
path = os.path.join(root, directory)
|
path = os.path.join(root, directory)
|
||||||
|
if path == temporary_dir:
|
||||||
|
continue
|
||||||
|
if include_snapshots is False and path.endswith("snapshots"):
|
||||||
|
continue
|
||||||
if not os.listdir(path):
|
if not os.listdir(path):
|
||||||
zstream.write(path, os.path.relpath(path, project._path))
|
zstream.write(path, os.path.relpath(path, project._path))
|
||||||
except FileNotFoundError as e:
|
except FileNotFoundError as e:
|
||||||
@ -142,7 +164,7 @@ def _is_exportable(path, include_snapshots=False):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# do not export snapshots by default
|
# do not export snapshots by default
|
||||||
if include_snapshots is False and path.endswith("snapshots"):
|
if include_snapshots is False and os.path.dirname(path).endswith("snapshots"):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# do not export directories of snapshots
|
# do not export directories of snapshots
|
||||||
@ -167,7 +189,16 @@ def _is_exportable(path, include_snapshots=False):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
async def _patch_project_file(project, path, zstream, include_images, keep_compute_ids, allow_all_nodes, temporary_dir, reset_mac_addresses):
|
async def _patch_project_file(
|
||||||
|
project,
|
||||||
|
path,
|
||||||
|
zstream,
|
||||||
|
include_images,
|
||||||
|
keep_compute_ids,
|
||||||
|
allow_all_nodes,
|
||||||
|
temporary_dir,
|
||||||
|
reset_mac_addresses
|
||||||
|
):
|
||||||
"""
|
"""
|
||||||
Patch a project file (.gns3) to export a project.
|
Patch a project file (.gns3) to export a project.
|
||||||
The .gns3 file is renamed to project.gns3
|
The .gns3 file is renamed to project.gns3
|
||||||
@ -240,7 +271,7 @@ async def _patch_project_file(project, path, zstream, include_images, keep_compu
|
|||||||
for compute_id, image_type, image in remote_images:
|
for compute_id, image_type, image in remote_images:
|
||||||
await _export_remote_images(project, compute_id, image_type, image, zstream, temporary_dir)
|
await _export_remote_images(project, compute_id, image_type, image, zstream, temporary_dir)
|
||||||
|
|
||||||
zstream.writestr("project.gns3", json.dumps(topology).encode())
|
zstream.writestr("project.gns3", json.dumps(topology, indent=4, sort_keys=True).encode())
|
||||||
return images
|
return images
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -247,6 +247,7 @@ class VirtualBoxGNS3VM(BaseGNS3VM):
|
|||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
async def list(self):
|
async def list(self):
|
||||||
"""
|
"""
|
||||||
List all VirtualBox VMs
|
List all VirtualBox VMs
|
||||||
@ -267,8 +268,8 @@ class VirtualBoxGNS3VM(BaseGNS3VM):
|
|||||||
|
|
||||||
# get a NAT interface number
|
# get a NAT interface number
|
||||||
nat_interface_number = await self._look_for_interface("nat")
|
nat_interface_number = await self._look_for_interface("nat")
|
||||||
if nat_interface_number < 0:
|
if nat_interface_number < 0 and await self._look_for_interface("natnetwork") < 0:
|
||||||
raise GNS3VMError('VM "{}" must have a NAT interface configured in order to start'.format(self.vmname))
|
raise GNS3VMError('VM "{}" must have a NAT or NAT Network interface configured in order to start'.format(self.vmname))
|
||||||
|
|
||||||
if sys.platform.startswith("darwin") and parse_version(self._system_properties["API version"]) >= parse_version("7_0"):
|
if sys.platform.startswith("darwin") and parse_version(self._system_properties["API version"]) >= parse_version("7_0"):
|
||||||
# VirtualBox 7.0+ on macOS requires a host-only network interface
|
# VirtualBox 7.0+ on macOS requires a host-only network interface
|
||||||
@ -337,39 +338,68 @@ class VirtualBoxGNS3VM(BaseGNS3VM):
|
|||||||
elif vm_state == "paused":
|
elif vm_state == "paused":
|
||||||
args = [self._vmname, "resume"]
|
args = [self._vmname, "resume"]
|
||||||
await self._execute("controlvm", args)
|
await self._execute("controlvm", args)
|
||||||
ip_address = "127.0.0.1"
|
|
||||||
try:
|
|
||||||
# get a random port on localhost
|
|
||||||
with socket.socket() as s:
|
|
||||||
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
||||||
s.bind((ip_address, 0))
|
|
||||||
api_port = s.getsockname()[1]
|
|
||||||
except OSError as e:
|
|
||||||
raise GNS3VMError("Error while getting random port: {}".format(e))
|
|
||||||
|
|
||||||
if await self._check_vbox_port_forwarding():
|
log.info("Retrieving IP address from GNS3 VM...")
|
||||||
# delete the GNS3VM NAT port forwarding rule if it exists
|
ip = await self._get_ip_from_guest_property()
|
||||||
log.info("Removing GNS3VM NAT port forwarding rule from interface {}".format(nat_interface_number))
|
if ip:
|
||||||
await self._execute("controlvm", [self._vmname, "natpf{}".format(nat_interface_number), "delete", "GNS3VM"])
|
self.ip_address = ip
|
||||||
|
else:
|
||||||
|
# if we can't get the IP address from the guest property, we try to get it from the GNS3 server (a NAT interface is required)
|
||||||
|
if nat_interface_number < 0:
|
||||||
|
raise GNS3VMError("Could not find guest IP address for {}".format(self.vmname))
|
||||||
|
log.warning("Could not find IP address from guest property, trying to get it from GNS3 server")
|
||||||
|
ip_address = "127.0.0.1"
|
||||||
|
try:
|
||||||
|
# get a random port on localhost
|
||||||
|
with socket.socket() as s:
|
||||||
|
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||||
|
s.bind((ip_address, 0))
|
||||||
|
api_port = s.getsockname()[1]
|
||||||
|
except OSError as e:
|
||||||
|
raise GNS3VMError("Error while getting random port: {}".format(e))
|
||||||
|
|
||||||
# add a GNS3VM NAT port forwarding rule to redirect 127.0.0.1 with random port to the port in the VM
|
if await self._check_vbox_port_forwarding():
|
||||||
log.info("Adding GNS3VM NAT port forwarding rule with port {} to interface {}".format(api_port, nat_interface_number))
|
# delete the GNS3VM NAT port forwarding rule if it exists
|
||||||
await self._execute("controlvm", [self._vmname, "natpf{}".format(nat_interface_number),
|
log.info("Removing GNS3VM NAT port forwarding rule from interface {}".format(nat_interface_number))
|
||||||
"GNS3VM,tcp,{},{},,{}".format(ip_address, api_port, self.port)])
|
await self._execute("controlvm", [self._vmname, "natpf{}".format(nat_interface_number), "delete", "GNS3VM"])
|
||||||
|
|
||||||
self.ip_address = await self._get_ip(interface_number, api_port)
|
# add a GNS3VM NAT port forwarding rule to redirect 127.0.0.1 with random port to the port in the VM
|
||||||
log.info("GNS3 VM has been started with IP {}".format(self.ip_address))
|
log.info("Adding GNS3VM NAT port forwarding rule with port {} to interface {}".format(api_port, nat_interface_number))
|
||||||
|
await self._execute("controlvm", [self._vmname, "natpf{}".format(nat_interface_number),
|
||||||
|
"GNS3VM,tcp,{},{},,{}".format(ip_address, api_port, self.port)])
|
||||||
|
|
||||||
|
self.ip_address = await self._get_ip_from_server(interface_number, api_port)
|
||||||
|
|
||||||
|
log.info("GNS3 VM has been started with IP '{}'".format(self.ip_address))
|
||||||
self.running = True
|
self.running = True
|
||||||
|
|
||||||
async def _get_ip(self, hostonly_interface_number, api_port):
|
async def _get_ip_from_guest_property(self):
|
||||||
"""
|
"""
|
||||||
Get the IP from VirtualBox.
|
Get the IP from VirtualBox by retrieving the guest property (Guest Additions must be installed).
|
||||||
|
"""
|
||||||
|
|
||||||
|
remaining_try = 180 # try for 3 minutes
|
||||||
|
while remaining_try > 0:
|
||||||
|
result = await self._execute("guestproperty", ["get", self._vmname, "/VirtualBox/GuestInfo/Net/0/V4/IP"])
|
||||||
|
for info in result.splitlines():
|
||||||
|
if ':' in info:
|
||||||
|
name, value = info.split(':', 1)
|
||||||
|
if name == "Value":
|
||||||
|
return value.strip()
|
||||||
|
remaining_try -= 1
|
||||||
|
await asyncio.sleep(1)
|
||||||
|
return None
|
||||||
|
|
||||||
|
async def _get_ip_from_server(self, hostonly_interface_number, api_port):
|
||||||
|
"""
|
||||||
|
Get the IP from VirtualBox by sending a request to the GNS3 server.
|
||||||
|
|
||||||
Due to VirtualBox limitation the only way is to send request each
|
Due to VirtualBox limitation the only way is to send request each
|
||||||
second to a GNS3 endpoint in order to get the list of the interfaces and
|
second to a GNS3 endpoint in order to get the list of the interfaces and
|
||||||
their IP and after that match it with VirtualBox host only.
|
their IP and after that match it with VirtualBox host only.
|
||||||
"""
|
"""
|
||||||
remaining_try = 300
|
|
||||||
|
remaining_try = 180 # try for 3 minutes
|
||||||
while remaining_try > 0:
|
while remaining_try > 0:
|
||||||
async with aiohttp.ClientSession() as session:
|
async with aiohttp.ClientSession() as session:
|
||||||
try:
|
try:
|
||||||
|
|||||||
@ -39,8 +39,18 @@ Handle the import of project from a .gns3project
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
async def import_project(controller, project_id, stream, location=None, name=None, keep_compute_ids=False,
|
async def import_project(
|
||||||
auto_start=False, auto_open=False, auto_close=True):
|
controller,
|
||||||
|
project_id,
|
||||||
|
stream,
|
||||||
|
location=None,
|
||||||
|
name=None,
|
||||||
|
reset_mac_addresses=False,
|
||||||
|
keep_compute_ids=False,
|
||||||
|
auto_start=False,
|
||||||
|
auto_open=False,
|
||||||
|
auto_close=True,
|
||||||
|
):
|
||||||
"""
|
"""
|
||||||
Import a project contain in a zip file
|
Import a project contain in a zip file
|
||||||
|
|
||||||
@ -51,7 +61,9 @@ async def import_project(controller, project_id, stream, location=None, name=Non
|
|||||||
:param stream: A io.BytesIO of the zipfile
|
:param stream: A io.BytesIO of the zipfile
|
||||||
:param location: Directory for the project if None put in the default directory
|
:param location: Directory for the project if None put in the default directory
|
||||||
:param name: Wanted project name, generate one from the .gns3 if None
|
:param name: Wanted project name, generate one from the .gns3 if None
|
||||||
|
:param reset_mac_addresses: Reset MAC addresses for each node
|
||||||
:param keep_compute_ids: keep compute IDs unchanged
|
:param keep_compute_ids: keep compute IDs unchanged
|
||||||
|
:param project_name: Original project name when restoring a snapshot
|
||||||
|
|
||||||
:returns: Project
|
:returns: Project
|
||||||
"""
|
"""
|
||||||
@ -72,12 +84,14 @@ async def import_project(controller, project_id, stream, location=None, name=Non
|
|||||||
# We import the project on top of an existing project (snapshots)
|
# We import the project on top of an existing project (snapshots)
|
||||||
if topology["project_id"] == project_id:
|
if topology["project_id"] == project_id:
|
||||||
project_name = topology["name"]
|
project_name = topology["name"]
|
||||||
|
restoring_snapshot = True
|
||||||
else:
|
else:
|
||||||
# If the project name is already used we generate a new one
|
# If the project name is already used we generate a new one
|
||||||
if name:
|
if name:
|
||||||
project_name = controller.get_free_project_name(name)
|
project_name = controller.get_free_project_name(name)
|
||||||
else:
|
else:
|
||||||
project_name = controller.get_free_project_name(topology["name"])
|
project_name = controller.get_free_project_name(topology["name"])
|
||||||
|
restoring_snapshot = False
|
||||||
except (ValueError, KeyError):
|
except (ValueError, KeyError):
|
||||||
raise aiohttp.web.HTTPConflict(text="Cannot import project, the project.gns3 file is corrupted")
|
raise aiohttp.web.HTTPConflict(text="Cannot import project, the project.gns3 file is corrupted")
|
||||||
|
|
||||||
@ -105,27 +119,11 @@ async def import_project(controller, project_id, stream, location=None, name=Non
|
|||||||
topology["auto_open"] = auto_open
|
topology["auto_open"] = auto_open
|
||||||
topology["auto_close"] = auto_close
|
topology["auto_close"] = auto_close
|
||||||
|
|
||||||
# Generate a new node id
|
if not restoring_snapshot:
|
||||||
node_old_to_new = {}
|
# Do not re-generate IDs if we are restoring a snapshot because they should be the same in a project
|
||||||
for node in topology["topology"]["nodes"]:
|
regenerate_topology_ids(topology, path, reset_mac_addresses=reset_mac_addresses)
|
||||||
if "node_id" in node:
|
|
||||||
node_old_to_new[node["node_id"]] = str(uuid.uuid4())
|
|
||||||
_move_node_file(path, node["node_id"], node_old_to_new[node["node_id"]])
|
|
||||||
node["node_id"] = node_old_to_new[node["node_id"]]
|
|
||||||
else:
|
|
||||||
node["node_id"] = str(uuid.uuid4())
|
|
||||||
|
|
||||||
# Update link to use new id
|
# Modify the compute id of the node depending on compute capacity
|
||||||
for link in topology["topology"]["links"]:
|
|
||||||
link["link_id"] = str(uuid.uuid4())
|
|
||||||
for node in link["nodes"]:
|
|
||||||
node["node_id"] = node_old_to_new[node["node_id"]]
|
|
||||||
|
|
||||||
# Generate new drawings id
|
|
||||||
for drawing in topology["topology"]["drawings"]:
|
|
||||||
drawing["drawing_id"] = str(uuid.uuid4())
|
|
||||||
|
|
||||||
# Modify the compute id of the node depending of compute capacity
|
|
||||||
if not keep_compute_ids:
|
if not keep_compute_ids:
|
||||||
# For some VM type we move them to the GNS3 VM if possible
|
# For some VM type we move them to the GNS3 VM if possible
|
||||||
# unless it's a linux host without GNS3 VM
|
# unless it's a linux host without GNS3 VM
|
||||||
@ -135,14 +133,6 @@ async def import_project(controller, project_id, stream, location=None, name=Non
|
|||||||
node["compute_id"] = "vm"
|
node["compute_id"] = "vm"
|
||||||
else:
|
else:
|
||||||
# Round-robin through available compute resources.
|
# Round-robin through available compute resources.
|
||||||
# computes = []
|
|
||||||
# for compute_id in controller.computes:
|
|
||||||
# compute = controller.get_compute(compute_id)
|
|
||||||
# # only use the local compute or any connected compute
|
|
||||||
# if compute_id == "local" or compute.connected:
|
|
||||||
# computes.append(compute_id)
|
|
||||||
# else:
|
|
||||||
# log.warning(compute.name, "is not connected!")
|
|
||||||
compute_nodes = itertools.cycle(controller.computes)
|
compute_nodes = itertools.cycle(controller.computes)
|
||||||
for node in topology["topology"]["nodes"]:
|
for node in topology["topology"]["nodes"]:
|
||||||
node["compute_id"] = next(compute_nodes)
|
node["compute_id"] = next(compute_nodes)
|
||||||
@ -162,7 +152,7 @@ async def import_project(controller, project_id, stream, location=None, name=Non
|
|||||||
# We change the project_id to avoid erasing the project
|
# We change the project_id to avoid erasing the project
|
||||||
topology["project_id"] = project_id
|
topology["project_id"] = project_id
|
||||||
with open(dot_gns3_path, "w+") as f:
|
with open(dot_gns3_path, "w+") as f:
|
||||||
json.dump(topology, f, indent=4)
|
json.dump(topology, f, indent=4, sort_keys=True)
|
||||||
os.remove(os.path.join(path, "project.gns3"))
|
os.remove(os.path.join(path, "project.gns3"))
|
||||||
|
|
||||||
images_path = os.path.join(path, "images")
|
images_path = os.path.join(path, "images")
|
||||||
@ -170,30 +160,93 @@ async def import_project(controller, project_id, stream, location=None, name=Non
|
|||||||
await _import_images(controller, images_path)
|
await _import_images(controller, images_path)
|
||||||
|
|
||||||
snapshots_path = os.path.join(path, "snapshots")
|
snapshots_path = os.path.join(path, "snapshots")
|
||||||
if os.path.exists(snapshots_path):
|
if not restoring_snapshot and os.path.exists(snapshots_path):
|
||||||
await _import_snapshots(snapshots_path, project_name, project_id)
|
await update_snapshots(snapshots_path, path, project_name, project_id, reset_mac_addresses=reset_mac_addresses)
|
||||||
|
|
||||||
project = await controller.load_project(dot_gns3_path, load=False)
|
project = await controller.load_project(dot_gns3_path, load=False)
|
||||||
return project
|
return project
|
||||||
|
|
||||||
|
|
||||||
def _create_symbolic_links(zip_file, path):
|
def _create_symbolic_links(zip_file, path):
|
||||||
"""
|
"""
|
||||||
Manually create symbolic links (if any) because ZipFile does not support it.
|
Manually create symbolic links (if any) because ZipFile does not support it.
|
||||||
|
Refuse any target that escapes `path`.
|
||||||
|
|
||||||
:param zip_file: ZipFile instance
|
:param zip_file: ZipFile instance
|
||||||
:param path: project location
|
:param path: project location
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
path_root = os.path.realpath(path) + os.sep
|
||||||
for zip_info in zip_file.infolist():
|
for zip_info in zip_file.infolist():
|
||||||
if stat.S_ISLNK(zip_info.external_attr >> 16):
|
if not stat.S_ISLNK(zip_info.external_attr >> 16):
|
||||||
symlink_target = zip_file.read(zip_info.filename).decode()
|
continue
|
||||||
symlink_path = os.path.join(path, zip_info.filename)
|
symlink_target = zip_file.read(zip_info.filename).decode()
|
||||||
try:
|
symlink_path = os.path.join(path, zip_info.filename)
|
||||||
# remove the regular file and replace it by a symbolic link
|
|
||||||
os.remove(symlink_path)
|
# 1. Reject absolute targets outright.
|
||||||
os.symlink(symlink_target, symlink_path)
|
if os.path.isabs(symlink_target):
|
||||||
except OSError as e:
|
raise aiohttp.web.HTTPConflict(
|
||||||
raise aiohttp.web.HTTPConflict(text=f"Cannot create symbolic link: {e}")
|
text=f"Symlink {zip_info.filename!r} has absolute target {symlink_target!r}, refusing"
|
||||||
|
)
|
||||||
|
|
||||||
|
# 2. Reject paths where the entry name itself escapes (defence in depth;
|
||||||
|
# extractall normally would already have caught this).
|
||||||
|
member_abs = os.path.realpath(symlink_path)
|
||||||
|
if not (member_abs + os.sep).startswith(path_root) and member_abs + os.sep != path_root:
|
||||||
|
raise aiohttp.web.HTTPConflict(
|
||||||
|
text=f"Symlink entry {zip_info.filename!r} escapes project dir, refusing"
|
||||||
|
)
|
||||||
|
|
||||||
|
# 3. Resolve the symlink target relative to the entry's own parent
|
||||||
|
# directory and verify the resolved real path stays inside `path`.
|
||||||
|
link_dir = os.path.realpath(os.path.dirname(symlink_path))
|
||||||
|
resolved_target = os.path.realpath(os.path.join(link_dir, symlink_target))
|
||||||
|
if not (resolved_target + os.sep).startswith(path_root) and resolved_target + os.sep != path_root:
|
||||||
|
raise aiohttp.web.HTTPConflict(
|
||||||
|
text=f"Symlink {zip_info.filename!r} -> {symlink_target!r} escapes project dir, refusing"
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
os.remove(symlink_path)
|
||||||
|
os.symlink(symlink_target, symlink_path)
|
||||||
|
except OSError as e:
|
||||||
|
raise aiohttp.web.HTTPConflict(text=f"Cannot create symbolic link: {e}")
|
||||||
|
|
||||||
|
|
||||||
|
def regenerate_topology_ids(topology, new_project_path, reset_mac_addresses=False):
|
||||||
|
"""
|
||||||
|
Regenerate IDs in the topology and move the files of the nodes to match the new IDs.
|
||||||
|
This is necessary because IDs must be unique across projects.
|
||||||
|
|
||||||
|
:param topology: topology content
|
||||||
|
:param new_project_path: new project path
|
||||||
|
:param reset_mac_addresses: reset MAC addresses
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Generate new node IDs
|
||||||
|
node_old_to_new = {}
|
||||||
|
for node in topology["topology"]["nodes"]:
|
||||||
|
new_node_id = str(uuid.uuid4())
|
||||||
|
if "node_id" in node:
|
||||||
|
node_old_to_new[node["node_id"]] = new_node_id
|
||||||
|
_move_node_file(new_project_path, node["node_id"], new_node_id)
|
||||||
|
node["node_id"] = new_node_id
|
||||||
|
if reset_mac_addresses:
|
||||||
|
if "properties" in node:
|
||||||
|
for prop, value in node["properties"].items():
|
||||||
|
# reset the MAC address
|
||||||
|
if prop in ("mac_addr", "mac_address"):
|
||||||
|
node["properties"][prop] = None
|
||||||
|
|
||||||
|
# Generate new link IDs
|
||||||
|
for link in topology["topology"]["links"]:
|
||||||
|
link["link_id"] = str(uuid.uuid4())
|
||||||
|
for node in link["nodes"]:
|
||||||
|
node["node_id"] = node_old_to_new[node["node_id"]]
|
||||||
|
|
||||||
|
# Generate new drawings IDs
|
||||||
|
for drawing in topology["topology"]["drawings"]:
|
||||||
|
drawing["drawing_id"] = str(uuid.uuid4())
|
||||||
|
|
||||||
def _move_node_file(path, old_id, new_id):
|
def _move_node_file(path, old_id, new_id):
|
||||||
"""
|
"""
|
||||||
@ -246,7 +299,7 @@ async def _upload_file(compute, project_id, file_path, path):
|
|||||||
|
|
||||||
async def _import_images(controller, images_path):
|
async def _import_images(controller, images_path):
|
||||||
"""
|
"""
|
||||||
Copy images to the images directory or delete them if they already exists.
|
Copy images to the images directory or delete them if they already exist.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
image_dir = controller.images_path()
|
image_dir = controller.images_path()
|
||||||
@ -254,23 +307,31 @@ async def _import_images(controller, images_path):
|
|||||||
for (dirpath, dirnames, filenames) in os.walk(root, followlinks=False):
|
for (dirpath, dirnames, filenames) in os.walk(root, followlinks=False):
|
||||||
for filename in filenames:
|
for filename in filenames:
|
||||||
path = os.path.join(dirpath, filename)
|
path = os.path.join(dirpath, filename)
|
||||||
if os.path.islink(path):
|
|
||||||
continue
|
|
||||||
dst = os.path.join(image_dir, os.path.relpath(path, root))
|
dst = os.path.join(image_dir, os.path.relpath(path, root))
|
||||||
os.makedirs(os.path.dirname(dst), exist_ok=True)
|
os.makedirs(os.path.dirname(dst), exist_ok=True)
|
||||||
await wait_run_in_executor(shutil.move, path, dst)
|
if not os.path.exists(dst):
|
||||||
|
await wait_run_in_executor(shutil.move, path, dst)
|
||||||
|
try:
|
||||||
|
with open(dst, "rb") as f:
|
||||||
|
# read the first 7 bytes of the file.
|
||||||
|
elf_header_start = f.read(7)
|
||||||
|
# IOU images must start with the ELF magic number, be 32-bit or 64-bit, little endian and have an ELF version of 1
|
||||||
|
if elf_header_start == b'\x7fELF\x01\x01\x01' or elf_header_start == b'\x7fELF\x02\x01\x01':
|
||||||
|
os.chmod(dst, stat.S_IWRITE | stat.S_IREAD | stat.S_IEXEC)
|
||||||
|
except OSError as e:
|
||||||
|
continue
|
||||||
|
|
||||||
|
async def update_snapshots(snapshots_dir, project_path, project_name, project_id, reset_mac_addresses=True):
|
||||||
async def _import_snapshots(snapshots_path, project_name, project_id):
|
|
||||||
"""
|
"""
|
||||||
Import the snapshots and update their project name and ID to be the same as the main project.
|
Load the snapshots and update their project name and project ID to be the same as the main project.
|
||||||
|
Regenerate all the node, link and drawing IDs
|
||||||
"""
|
"""
|
||||||
|
|
||||||
for snapshot in os.listdir(snapshots_path):
|
for snapshot in os.listdir(snapshots_dir):
|
||||||
if not snapshot.endswith(".gns3project"):
|
if not (snapshot.endswith(".gns3snapshot") or snapshot.endswith(".gns3project")):
|
||||||
continue
|
continue
|
||||||
snapshot_path = os.path.join(snapshots_path, snapshot)
|
snapshot_path = os.path.join(snapshots_dir, snapshot)
|
||||||
with tempfile.TemporaryDirectory(dir=snapshots_path) as tmpdir:
|
with tempfile.TemporaryDirectory(dir=snapshots_dir) as tmpdir:
|
||||||
|
|
||||||
# extract everything to a temporary directory
|
# extract everything to a temporary directory
|
||||||
try:
|
try:
|
||||||
@ -288,9 +349,9 @@ async def _import_snapshots(snapshots_path, project_name, project_id):
|
|||||||
topology_file_path = os.path.join(tmpdir, "project.gns3")
|
topology_file_path = os.path.join(tmpdir, "project.gns3")
|
||||||
with open(topology_file_path, encoding="utf-8") as f:
|
with open(topology_file_path, encoding="utf-8") as f:
|
||||||
topology = json.load(f)
|
topology = json.load(f)
|
||||||
|
|
||||||
topology["name"] = project_name
|
topology["name"] = project_name
|
||||||
topology["project_id"] = project_id
|
topology["project_id"] = project_id
|
||||||
|
regenerate_topology_ids(topology, tmpdir, reset_mac_addresses)
|
||||||
with open(topology_file_path, "w+", encoding="utf-8") as f:
|
with open(topology_file_path, "w+", encoding="utf-8") as f:
|
||||||
json.dump(topology, f, indent=4, sort_keys=True)
|
json.dump(topology, f, indent=4, sort_keys=True)
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
@ -308,5 +369,6 @@ async def _import_snapshots(snapshots_path, project_name, project_id):
|
|||||||
async with aiofiles.open(snapshot_path, 'wb+') as f:
|
async with aiofiles.open(snapshot_path, 'wb+') as f:
|
||||||
async for chunk in zstream:
|
async for chunk in zstream:
|
||||||
await f.write(chunk)
|
await f.write(chunk)
|
||||||
|
log.info("Project '{}': updated and repacked snapshot file '{}'".format(project_name, snapshot))
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
raise aiohttp.web.HTTPConflict(text="Cannot update snapshot '{}': the snapshot cannot be recreated: {}".format(os.path.basename(snapshot), e))
|
raise aiohttp.web.HTTPConflict(text="Cannot update snapshot '{}': the snapshot cannot be recreated: {}".format(os.path.basename(snapshot), e))
|
||||||
|
|||||||
@ -91,7 +91,7 @@ class Node:
|
|||||||
self._first_port_name = None
|
self._first_port_name = None
|
||||||
self._console_auto_start = False
|
self._console_auto_start = False
|
||||||
|
|
||||||
# This properties will be recompute
|
# This properties will be recomputed
|
||||||
ignore_properties = ("width", "height", "hover_symbol")
|
ignore_properties = ("width", "height", "hover_symbol")
|
||||||
self.properties = kwargs.pop('properties', {})
|
self.properties = kwargs.pop('properties', {})
|
||||||
|
|
||||||
@ -382,6 +382,7 @@ class Node:
|
|||||||
await self.parse_node_response(response.json)
|
await self.parse_node_response(response.json)
|
||||||
return True
|
return True
|
||||||
trial += 1
|
trial += 1
|
||||||
|
return False
|
||||||
|
|
||||||
async def update(self, **kwargs):
|
async def update(self, **kwargs):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@ -84,9 +84,9 @@ class Port:
|
|||||||
# If port name format has changed we use the port name as the short name (1.X behavior)
|
# If port name format has changed we use the port name as the short name (1.X behavior)
|
||||||
if self._short_name:
|
if self._short_name:
|
||||||
return self._short_name
|
return self._short_name
|
||||||
elif '/' in self._name:
|
elif self._name and '/' in self._name:
|
||||||
return self._name.replace(self.long_name_type(), self.short_name_type())
|
return self._name.replace(self.long_name_type(), self.short_name_type())
|
||||||
elif self._name.startswith("{}{}".format(self.long_name_type(), self._interface_number)):
|
elif self._name and self._name.startswith("{}{}".format(self.long_name_type(), self._interface_number)):
|
||||||
return self.short_name_type() + "{}".format(self._interface_number)
|
return self.short_name_type() + "{}".format(self._interface_number)
|
||||||
return self._name
|
return self._name
|
||||||
|
|
||||||
|
|||||||
@ -15,7 +15,6 @@
|
|||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import sys
|
|
||||||
import re
|
import re
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
@ -46,7 +45,7 @@ from ..utils.asyncio import locking
|
|||||||
from ..utils.asyncio import aiozipstream
|
from ..utils.asyncio import aiozipstream
|
||||||
from ..utils.asyncio import wait_run_in_executor
|
from ..utils.asyncio import wait_run_in_executor
|
||||||
from .export_project import export_project
|
from .export_project import export_project
|
||||||
from .import_project import import_project, _move_node_file
|
from .import_project import import_project, update_snapshots, regenerate_topology_ids
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
@ -96,6 +95,7 @@ class Project:
|
|||||||
self._show_interface_labels = show_interface_labels
|
self._show_interface_labels = show_interface_labels
|
||||||
self._variables = variables
|
self._variables = variables
|
||||||
self._supplier = supplier
|
self._supplier = supplier
|
||||||
|
self._snapshots_config_file = "snapshots.conf"
|
||||||
|
|
||||||
self._loading = False
|
self._loading = False
|
||||||
self._closing = False
|
self._closing = False
|
||||||
@ -189,19 +189,7 @@ class Project:
|
|||||||
self._drawings = {}
|
self._drawings = {}
|
||||||
self._snapshots = {}
|
self._snapshots = {}
|
||||||
self._computes = []
|
self._computes = []
|
||||||
|
self._load_snapshot_config()
|
||||||
# List the available snapshots
|
|
||||||
snapshot_dir = os.path.join(self.path, "snapshots")
|
|
||||||
if os.path.exists(snapshot_dir):
|
|
||||||
for snap in os.listdir(snapshot_dir):
|
|
||||||
if snap.endswith(".gns3project"):
|
|
||||||
try:
|
|
||||||
snapshot = Snapshot(self, filename=snap)
|
|
||||||
except ValueError:
|
|
||||||
log.error("Invalid snapshot file: {}".format(snap))
|
|
||||||
continue
|
|
||||||
self._snapshots[snapshot.id] = snapshot
|
|
||||||
|
|
||||||
# Create the project on demand on the compute node
|
# Create the project on demand on the compute node
|
||||||
self._project_created_on_compute = set()
|
self._project_created_on_compute = set()
|
||||||
|
|
||||||
@ -782,6 +770,60 @@ class Project:
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
raise aiohttp.web.HTTPNotFound(text="Snapshot ID {} doesn't exist".format(snapshot_id))
|
raise aiohttp.web.HTTPNotFound(text="Snapshot ID {} doesn't exist".format(snapshot_id))
|
||||||
|
|
||||||
|
def _load_snapshot_config(self):
|
||||||
|
|
||||||
|
snapshot_dir = os.path.join(self.path, "snapshots")
|
||||||
|
self._snapshot_conf_path = os.path.join(snapshot_dir, self._snapshots_config_file)
|
||||||
|
self._snapshot_conf = []
|
||||||
|
if os.path.isfile(self._snapshot_conf_path):
|
||||||
|
try:
|
||||||
|
with open(self._snapshot_conf_path, encoding="utf-8") as f:
|
||||||
|
self._snapshot_conf = json.load(f)
|
||||||
|
except (OSError, UnicodeDecodeError, ValueError):
|
||||||
|
log.exception("Could not read snapshot config %s", self._snapshot_conf_path)
|
||||||
|
raise aiohttp.web.HTTPConflict(text="Could not read snapshot configuration file")
|
||||||
|
|
||||||
|
# Load all legacy snapshots (.gns3project files) to create an initial snapshot config if it doesn't exist
|
||||||
|
if os.path.exists(snapshot_dir) and not self._snapshot_conf:
|
||||||
|
for snap in os.listdir(snapshot_dir):
|
||||||
|
if snap.endswith(".gns3project"):
|
||||||
|
try:
|
||||||
|
snapshot = Snapshot(self, filename=snap)
|
||||||
|
except ValueError:
|
||||||
|
log.error("Invalid snapshot file: {}".format(snap))
|
||||||
|
continue
|
||||||
|
self._snapshots[snapshot.id] = snapshot
|
||||||
|
else:
|
||||||
|
# Create the Snapshot instances from the snapshot config file
|
||||||
|
for snapshot_entry in self._snapshot_conf:
|
||||||
|
try:
|
||||||
|
path = os.path.join(snapshot_dir, snapshot_entry["filename"])
|
||||||
|
if not os.path.isfile(path):
|
||||||
|
log.warning("Snapshot file '{}' does not exist".format(path))
|
||||||
|
continue
|
||||||
|
snapshot_entry.pop("project_id")
|
||||||
|
snapshot = Snapshot(self, **snapshot_entry)
|
||||||
|
self._snapshots[snapshot.id] = snapshot
|
||||||
|
except KeyError:
|
||||||
|
log.error("Invalid entry in snapshot config file: {}".format(snapshot_entry))
|
||||||
|
continue
|
||||||
|
|
||||||
|
self._save_snapshot_config()
|
||||||
|
|
||||||
|
def _save_snapshot_config(self):
|
||||||
|
|
||||||
|
if not self._snapshots:
|
||||||
|
return
|
||||||
|
|
||||||
|
self._snapshot_conf = []
|
||||||
|
for snapshot in self._snapshots.values():
|
||||||
|
self._snapshot_conf.append(snapshot.__json__())
|
||||||
|
try:
|
||||||
|
with open(self._snapshot_conf_path, 'w+') as f:
|
||||||
|
json.dump(self._snapshot_conf, f, indent=4)
|
||||||
|
except OSError as e:
|
||||||
|
log.error("Cannot write snapshot config '{}': {}".format(self._snapshot_conf_path, e))
|
||||||
|
|
||||||
@open_required
|
@open_required
|
||||||
async def snapshot(self, name):
|
async def snapshot(self, name):
|
||||||
"""
|
"""
|
||||||
@ -795,12 +837,14 @@ class Project:
|
|||||||
snapshot = Snapshot(self, name=name)
|
snapshot = Snapshot(self, name=name)
|
||||||
await snapshot.create()
|
await snapshot.create()
|
||||||
self._snapshots[snapshot.id] = snapshot
|
self._snapshots[snapshot.id] = snapshot
|
||||||
|
self._save_snapshot_config()
|
||||||
return snapshot
|
return snapshot
|
||||||
|
|
||||||
@open_required
|
@open_required
|
||||||
async def delete_snapshot(self, snapshot_id):
|
async def delete_snapshot(self, snapshot_id):
|
||||||
snapshot = self.get_snapshot(snapshot_id)
|
snapshot = self.get_snapshot(snapshot_id)
|
||||||
del self._snapshots[snapshot.id]
|
del self._snapshots[snapshot.id]
|
||||||
|
self._save_snapshot_config()
|
||||||
os.remove(snapshot.path)
|
os.remove(snapshot.path)
|
||||||
|
|
||||||
@locking
|
@locking
|
||||||
@ -861,12 +905,23 @@ class Project:
|
|||||||
|
|
||||||
async def delete(self):
|
async def delete(self):
|
||||||
|
|
||||||
|
# Check compute connectivity before open() to avoid 120s timeout
|
||||||
|
# when remote computes are unreachable
|
||||||
|
disconnected = self._get_disconnected_computes()
|
||||||
|
if disconnected:
|
||||||
|
compute_names = ", ".join([f"'{c.name}'" for c in disconnected])
|
||||||
|
raise aiohttp.web.HTTPForbidden(
|
||||||
|
f"Cannot delete project '{self.name}': {len(disconnected)} compute(s) are disconnected: {compute_names}. "
|
||||||
|
f"Please fix the connection or delete the project manually on those computes."
|
||||||
|
)
|
||||||
|
|
||||||
if self._status != "opened":
|
if self._status != "opened":
|
||||||
try:
|
try:
|
||||||
await self.open()
|
await self.open(auto_start=False)
|
||||||
except aiohttp.web.HTTPConflict as e:
|
except aiohttp.web.HTTPConflict as e:
|
||||||
# ignore missing images or other conflicts when deleting a project
|
# ignore missing images or other conflicts when deleting a project
|
||||||
log.warning("Conflict while deleting project: {}".format(e.text))
|
log.warning(f"Conflict while deleting project: {e}")
|
||||||
|
|
||||||
await self.delete_on_computes()
|
await self.delete_on_computes()
|
||||||
await self.close()
|
await self.close()
|
||||||
try:
|
try:
|
||||||
@ -878,6 +933,42 @@ class Project:
|
|||||||
raise aiohttp.web.HTTPConflict(text="Cannot delete project directory {}: {}".format(self.path, str(e)))
|
raise aiohttp.web.HTTPConflict(text="Cannot delete project directory {}: {}".format(self.path, str(e)))
|
||||||
self.emit_controller_notification("project.deleted", self.__json__())
|
self.emit_controller_notification("project.deleted", self.__json__())
|
||||||
|
|
||||||
|
def _get_disconnected_computes(self):
|
||||||
|
"""
|
||||||
|
Check compute connectivity by reading the topology file directly,
|
||||||
|
without opening the project (which would try to connect to computes).
|
||||||
|
Returns a list of disconnected Compute objects.
|
||||||
|
"""
|
||||||
|
if self._status == "opened":
|
||||||
|
# Project is already open, use the already-loaded _computes list
|
||||||
|
compute_ids = self._computes
|
||||||
|
else:
|
||||||
|
# Read compute IDs from topology file without connecting
|
||||||
|
path = self._topology_file()
|
||||||
|
if not os.path.exists(path):
|
||||||
|
return []
|
||||||
|
try:
|
||||||
|
project_data = load_topology(path)
|
||||||
|
except (ValueError, OSError) as e:
|
||||||
|
log.warning(f"Could not read topology file for project '{self._name}': {e}")
|
||||||
|
return []
|
||||||
|
topology = project_data.get("topology", {})
|
||||||
|
compute_ids = set()
|
||||||
|
for node in topology.get("nodes", []):
|
||||||
|
compute_id = node.get("compute_id")
|
||||||
|
if compute_id:
|
||||||
|
compute_ids.add(compute_id)
|
||||||
|
|
||||||
|
disconnected = []
|
||||||
|
for compute_id in compute_ids:
|
||||||
|
try:
|
||||||
|
compute = self._controller.get_compute(compute_id)
|
||||||
|
if not compute.connected:
|
||||||
|
disconnected.append(compute)
|
||||||
|
except aiohttp.web.HTTPNotFound:
|
||||||
|
log.warning(f"Compute '{compute_id}' not found in controller")
|
||||||
|
return disconnected
|
||||||
|
|
||||||
async def delete_on_computes(self):
|
async def delete_on_computes(self):
|
||||||
"""
|
"""
|
||||||
Delete the project on computes but not on controller
|
Delete the project on computes but not on controller
|
||||||
@ -891,7 +982,7 @@ class Project:
|
|||||||
def _get_default_project_directory(cls):
|
def _get_default_project_directory(cls):
|
||||||
"""
|
"""
|
||||||
Return the default location for the project directory
|
Return the default location for the project directory
|
||||||
depending of the operating system
|
depending on the operating system
|
||||||
"""
|
"""
|
||||||
|
|
||||||
server_config = Config.instance().get_section_config("Server")
|
server_config = Config.instance().get_section_config("Server")
|
||||||
@ -907,12 +998,15 @@ class Project:
|
|||||||
return os.path.join(self.path, self._filename)
|
return os.path.join(self.path, self._filename)
|
||||||
|
|
||||||
@locking
|
@locking
|
||||||
async def open(self):
|
async def open(self, auto_start=True):
|
||||||
"""
|
"""
|
||||||
Load topology elements
|
Load topology elements
|
||||||
|
|
||||||
|
:param auto_start: whether the nodes may be started when the project
|
||||||
|
has auto start enabled
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if self._closing is True:
|
if self._closing:
|
||||||
raise aiohttp.web.HTTPConflict(text="Project is closing, please try again in a few seconds...")
|
raise aiohttp.web.HTTPConflict(text="Project is closing, please try again in a few seconds...")
|
||||||
|
|
||||||
if self._status == "opened":
|
if self._status == "opened":
|
||||||
@ -1023,7 +1117,7 @@ class Project:
|
|||||||
self._loading = False
|
self._loading = False
|
||||||
self.emit_controller_notification("project.opened", self.__json__())
|
self.emit_controller_notification("project.opened", self.__json__())
|
||||||
# Should we start the nodes when project is open
|
# Should we start the nodes when project is open
|
||||||
if self._auto_start:
|
if self._auto_start and auto_start:
|
||||||
# Start all in the background without waiting for completion
|
# Start all in the background without waiting for completion
|
||||||
# we ignore errors because we want to let the user open
|
# we ignore errors because we want to let the user open
|
||||||
# their project and fix it
|
# their project and fix it
|
||||||
@ -1083,7 +1177,14 @@ class Project:
|
|||||||
with tempfile.TemporaryDirectory(dir=working_dir) as tmpdir:
|
with tempfile.TemporaryDirectory(dir=working_dir) as tmpdir:
|
||||||
# Do not compress the exported project when duplicating
|
# Do not compress the exported project when duplicating
|
||||||
with aiozipstream.ZipFile(compression=zipfile.ZIP_STORED) as zstream:
|
with aiozipstream.ZipFile(compression=zipfile.ZIP_STORED) as zstream:
|
||||||
await export_project(zstream, self, tmpdir, keep_compute_ids=True, allow_all_nodes=True, reset_mac_addresses=reset_mac_addresses)
|
await export_project(
|
||||||
|
zstream,
|
||||||
|
self,
|
||||||
|
tmpdir,
|
||||||
|
keep_compute_ids=True,
|
||||||
|
include_snapshots=True,
|
||||||
|
allow_all_nodes=True
|
||||||
|
)
|
||||||
|
|
||||||
# export the project to a temporary location
|
# export the project to a temporary location
|
||||||
project_path = os.path.join(tmpdir, "project.gns3p")
|
project_path = os.path.join(tmpdir, "project.gns3p")
|
||||||
@ -1092,11 +1193,20 @@ class Project:
|
|||||||
async for chunk in zstream:
|
async for chunk in zstream:
|
||||||
await f.write(chunk)
|
await f.write(chunk)
|
||||||
|
|
||||||
# import the temporary project
|
new_project_id = str(uuid.uuid4())
|
||||||
|
# import the duplicated project
|
||||||
with open(project_path, "rb") as f:
|
with open(project_path, "rb") as f:
|
||||||
project = await import_project(self._controller, str(uuid.uuid4()), f, location=location, name=name, keep_compute_ids=True)
|
project = await import_project(
|
||||||
|
self._controller,
|
||||||
|
new_project_id,
|
||||||
|
f,
|
||||||
|
location=location,
|
||||||
|
name=name,
|
||||||
|
reset_mac_addresses=reset_mac_addresses,
|
||||||
|
keep_compute_ids=True
|
||||||
|
)
|
||||||
|
|
||||||
log.info("Project '{}' duplicated in {:.4f} seconds".format(project.name, time.time() - begin))
|
log.info("Project '{}': duplicated in {:.4f} seconds".format(project.name, time.time() - begin))
|
||||||
except (ValueError, OSError, UnicodeEncodeError) as e:
|
except (ValueError, OSError, UnicodeEncodeError) as e:
|
||||||
raise aiohttp.web.HTTPConflict(text="Cannot duplicate project: {}".format(str(e)))
|
raise aiohttp.web.HTTPConflict(text="Cannot duplicate project: {}".format(str(e)))
|
||||||
|
|
||||||
@ -1105,6 +1215,62 @@ class Project:
|
|||||||
|
|
||||||
return project
|
return project
|
||||||
|
|
||||||
|
async def _fast_duplication(self, name=None, location=None, reset_mac_addresses=True):
|
||||||
|
"""
|
||||||
|
Fast duplication of a project.
|
||||||
|
|
||||||
|
Copy the project files directly rather than in an import-export fashion.
|
||||||
|
|
||||||
|
:param name: Name of the new project. A new one will be generated in case of conflicts
|
||||||
|
:param location: Parent directory of the new project
|
||||||
|
:param reset_mac_addresses: Reset MAC addresses for the duplicated project
|
||||||
|
"""
|
||||||
|
|
||||||
|
# remote replication is not supported with remote computes
|
||||||
|
for compute in self.computes:
|
||||||
|
if compute.id != "local":
|
||||||
|
log.warning("Fast duplication is not supported with remote compute: '{}'".format(compute.id))
|
||||||
|
return None
|
||||||
|
# work dir
|
||||||
|
p_work = pathlib.Path(location or self.path).parent.absolute()
|
||||||
|
t0 = time.time()
|
||||||
|
new_project_id = str(uuid.uuid4())
|
||||||
|
if location:
|
||||||
|
new_project_path = p_work.joinpath(location)
|
||||||
|
else:
|
||||||
|
new_project_path = p_work.joinpath(new_project_id)
|
||||||
|
# copy dir
|
||||||
|
await wait_run_in_executor(shutil.copytree, self.path, new_project_path.as_posix(), symlinks=True, ignore_dangling_symlinks=True)
|
||||||
|
log.info("Project content copied from '{}' to '{}' in {}s".format(self.path, new_project_path, time.time() - t0))
|
||||||
|
topology = json.loads(new_project_path.joinpath('{}.gns3'.format(self.name)).read_bytes())
|
||||||
|
project_name = name or topology["name"]
|
||||||
|
# If the project name is already used we generate a new one
|
||||||
|
project_name = self.controller.get_free_project_name(project_name)
|
||||||
|
topology["name"] = project_name
|
||||||
|
# To avoid unexpected behavior (project start without manual operations just after import)
|
||||||
|
topology["auto_start"] = False
|
||||||
|
topology["auto_open"] = False
|
||||||
|
topology["auto_close"] = False
|
||||||
|
|
||||||
|
# regenerate IDs for the duplicated project
|
||||||
|
regenerate_topology_ids(topology, new_project_path, reset_mac_addresses)
|
||||||
|
|
||||||
|
# dump the updated .gns3 project file
|
||||||
|
dot_gns3_path = new_project_path.joinpath('{}.gns3'.format(project_name))
|
||||||
|
topology["project_id"] = new_project_id
|
||||||
|
with open(dot_gns3_path, "w+") as f:
|
||||||
|
json.dump(topology, f, indent=4, sort_keys=True)
|
||||||
|
|
||||||
|
# update the snapshots with new IDs
|
||||||
|
snapshots_dir = os.path.join(new_project_path, "snapshots")
|
||||||
|
if os.path.isdir(snapshots_dir):
|
||||||
|
await update_snapshots(snapshots_dir, new_project_path, project_name, new_project_id)
|
||||||
|
|
||||||
|
os.remove(new_project_path.joinpath('{}.gns3'.format(self.name)))
|
||||||
|
project = await self.controller.load_project(dot_gns3_path, load=False)
|
||||||
|
log.info("Project '{}': fast duplicated in {:.4f} seconds".format(project.name, time.time() - t0))
|
||||||
|
return project
|
||||||
|
|
||||||
def is_running(self):
|
def is_running(self):
|
||||||
"""
|
"""
|
||||||
If a node is started or paused return True
|
If a node is started or paused return True
|
||||||
@ -1203,11 +1369,13 @@ class Project:
|
|||||||
data['z'] = z
|
data['z'] = z
|
||||||
data['locked'] = False # duplicated node must not be locked
|
data['locked'] = False # duplicated node must not be locked
|
||||||
new_node_uuid = str(uuid.uuid4())
|
new_node_uuid = str(uuid.uuid4())
|
||||||
new_node = await self.add_node(node.compute,
|
new_node = await self.add_node(
|
||||||
node.name,
|
node.compute,
|
||||||
new_node_uuid,
|
node.name,
|
||||||
node_type=node_type,
|
new_node_uuid,
|
||||||
**data)
|
node_type=node_type,
|
||||||
|
**data
|
||||||
|
)
|
||||||
try:
|
try:
|
||||||
await node.post("/duplicate", timeout=None, data={
|
await node.post("/duplicate", timeout=None, data={
|
||||||
"destination_node_id": new_node_uuid
|
"destination_node_id": new_node_uuid
|
||||||
@ -1255,72 +1423,4 @@ class Project:
|
|||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<gns3server.controller.Project {} {}>".format(self._name, self._id)
|
return "<gns3server.controller.Project {} {}>".format(self._name, self._id)
|
||||||
|
|
||||||
async def _fast_duplication(self, name=None, location=None, reset_mac_addresses=True):
|
|
||||||
"""
|
|
||||||
Fast duplication of a project.
|
|
||||||
|
|
||||||
Copy the project files directly rather than in an import-export fashion.
|
|
||||||
|
|
||||||
:param name: Name of the new project. A new one will be generated in case of conflicts
|
|
||||||
:param location: Parent directory of the new project
|
|
||||||
:param reset_mac_addresses: Reset MAC addresses for the new project
|
|
||||||
"""
|
|
||||||
|
|
||||||
# remote replication is not supported with remote computes
|
|
||||||
for compute in self.computes:
|
|
||||||
if compute.id != "local":
|
|
||||||
log.warning("Fast duplication is not supported with remote compute: '{}'".format(compute.id))
|
|
||||||
return None
|
|
||||||
# work dir
|
|
||||||
p_work = pathlib.Path(location or self.path).parent.absolute()
|
|
||||||
t0 = time.time()
|
|
||||||
new_project_id = str(uuid.uuid4())
|
|
||||||
if location:
|
|
||||||
new_project_path = p_work.joinpath(location)
|
|
||||||
else:
|
|
||||||
new_project_path = p_work.joinpath(new_project_id)
|
|
||||||
# copy dir
|
|
||||||
await wait_run_in_executor(shutil.copytree, self.path, new_project_path.as_posix(), symlinks=True, ignore_dangling_symlinks=True)
|
|
||||||
log.info("Project content copied from '{}' to '{}' in {}s".format(self.path, new_project_path, time.time() - t0))
|
|
||||||
topology = json.loads(new_project_path.joinpath('{}.gns3'.format(self.name)).read_bytes())
|
|
||||||
project_name = name or topology["name"]
|
|
||||||
# If the project name is already used we generate a new one
|
|
||||||
project_name = self.controller.get_free_project_name(project_name)
|
|
||||||
topology["name"] = project_name
|
|
||||||
# To avoid unexpected behavior (project start without manual operations just after import)
|
|
||||||
topology["auto_start"] = False
|
|
||||||
topology["auto_open"] = False
|
|
||||||
topology["auto_close"] = False
|
|
||||||
# change node ID
|
|
||||||
node_old_to_new = {}
|
|
||||||
for node in topology["topology"]["nodes"]:
|
|
||||||
new_node_id = str(uuid.uuid4())
|
|
||||||
if "node_id" in node:
|
|
||||||
node_old_to_new[node["node_id"]] = new_node_id
|
|
||||||
_move_node_file(new_project_path, node["node_id"], new_node_id)
|
|
||||||
node["node_id"] = new_node_id
|
|
||||||
if reset_mac_addresses:
|
|
||||||
if "properties" in node:
|
|
||||||
for prop, value in node["properties"].items():
|
|
||||||
# reset the MAC address
|
|
||||||
if prop in ("mac_addr", "mac_address"):
|
|
||||||
node["properties"][prop] = None
|
|
||||||
# change link ID
|
|
||||||
for link in topology["topology"]["links"]:
|
|
||||||
link["link_id"] = str(uuid.uuid4())
|
|
||||||
for node in link["nodes"]:
|
|
||||||
node["node_id"] = node_old_to_new[node["node_id"]]
|
|
||||||
# Generate new drawings id
|
|
||||||
for drawing in topology["topology"]["drawings"]:
|
|
||||||
drawing["drawing_id"] = str(uuid.uuid4())
|
|
||||||
|
|
||||||
# And we dump the updated.gns3
|
|
||||||
dot_gns3_path = new_project_path.joinpath('{}.gns3'.format(project_name))
|
|
||||||
topology["project_id"] = new_project_id
|
|
||||||
with open(dot_gns3_path, "w+") as f:
|
|
||||||
json.dump(topology, f, indent=4)
|
|
||||||
|
|
||||||
os.remove(new_project_path.joinpath('{}.gns3'.format(self.name)))
|
|
||||||
project = await self.controller.load_project(dot_gns3_path, load=False)
|
|
||||||
log.info("Project '{}' fast duplicated in {:.4f} seconds".format(project.name, time.time() - t0))
|
|
||||||
return project
|
|
||||||
|
|||||||
@ -35,30 +35,47 @@ import logging
|
|||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
# The string use to extract the date from the filename
|
# Used to extract the date and time from the filename
|
||||||
FILENAME_TIME_FORMAT = "%d%m%y_%H%M%S"
|
FILENAME_DATETIME_FORMAT = "%d%m%y_%H%M%S"
|
||||||
|
|
||||||
|
# Used to create a description of the snapshot with a human-readable date and time
|
||||||
|
DESCRIPTION_DATETIME_FORMAT = "%Y-%m-%d at %H:%M:%S"
|
||||||
|
|
||||||
class Snapshot:
|
class Snapshot:
|
||||||
"""
|
"""
|
||||||
A snapshot object
|
A snapshot object
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, project, name=None, filename=None):
|
def __init__(self, project, snapshot_id=None, name=None, filename=None, created_at=None, description=None):
|
||||||
|
|
||||||
assert filename or name, "You need to pass a name or a filename"
|
assert filename or name, "You need to pass a name or a filename"
|
||||||
|
|
||||||
self._id = str(uuid.uuid4()) # We don't need to keep id between project loading because they are use only as key for operation like delete, update.. but have no impact on disk
|
if snapshot_id:
|
||||||
|
self._id = snapshot_id
|
||||||
|
else:
|
||||||
|
self._id = str(uuid.uuid4())
|
||||||
|
|
||||||
self._project = project
|
self._project = project
|
||||||
if name:
|
if name:
|
||||||
self._name = name
|
self._name = name
|
||||||
self._created_at = datetime.now(timezone.utc).timestamp()
|
|
||||||
filename = self._name + "_" + datetime.fromtimestamp(self._created_at, tz=timezone.utc).replace(tzinfo=None).strftime(FILENAME_TIME_FORMAT) + ".gns3project"
|
if created_at:
|
||||||
|
self._created_at = created_at
|
||||||
|
else:
|
||||||
|
self._created_at = int(datetime.now(timezone.utc).timestamp())
|
||||||
|
if not filename:
|
||||||
|
filename = self._name + ".gns3snapshot"
|
||||||
else:
|
else:
|
||||||
self._name = filename.rsplit("_", 2)[0]
|
self._name = filename.rsplit("_", 2)[0]
|
||||||
datestring = filename.replace(self._name + "_", "").split(".")[0]
|
datestring = filename.replace(self._name + "_", "").split(".")[0]
|
||||||
self._created_at = datetime.strptime(datestring, FILENAME_TIME_FORMAT).replace(tzinfo=timezone.utc).timestamp()
|
self._created_at = int(datetime.strptime(datestring, FILENAME_DATETIME_FORMAT).replace(tzinfo=timezone.utc).timestamp())
|
||||||
|
|
||||||
|
if not description:
|
||||||
|
date = datetime.fromtimestamp(self._created_at, tz=timezone.utc).replace(tzinfo=None).strftime(DESCRIPTION_DATETIME_FORMAT)
|
||||||
|
description = "Snapshot '{}' taken on {}".format(self._name, date)
|
||||||
|
|
||||||
|
self._description = description
|
||||||
|
self._filename = filename
|
||||||
self._path = os.path.join(project.path, "snapshots", filename)
|
self._path = os.path.join(project.path, "snapshots", filename)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@ -69,13 +86,17 @@ class Snapshot:
|
|||||||
def name(self):
|
def name(self):
|
||||||
return self._name
|
return self._name
|
||||||
|
|
||||||
|
@property
|
||||||
|
def description(self):
|
||||||
|
return self._description
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def path(self):
|
def path(self):
|
||||||
return self._path
|
return self._path
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def created_at(self):
|
def created_at(self):
|
||||||
return int(self._created_at)
|
return self._created_at
|
||||||
|
|
||||||
async def create(self):
|
async def create(self):
|
||||||
"""
|
"""
|
||||||
@ -114,14 +135,22 @@ class Snapshot:
|
|||||||
await self._project.close(ignore_notification=True)
|
await self._project.close(ignore_notification=True)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
begin = time.time()
|
||||||
# delete the current project files
|
# delete the current project files
|
||||||
project_files_path = os.path.join(self._project.path, "project-files")
|
project_files_path = os.path.join(self._project.path, "project-files")
|
||||||
if os.path.exists(project_files_path):
|
if os.path.exists(project_files_path):
|
||||||
await wait_run_in_executor(shutil.rmtree, project_files_path)
|
await wait_run_in_executor(shutil.rmtree, project_files_path, ignore_errors=True)
|
||||||
with open(self._path, "rb") as f:
|
with open(self._path, "rb") as f:
|
||||||
project = await import_project(self._project.controller, self._project.id, f, location=self._project.path,
|
project = await import_project(
|
||||||
auto_start=self._project.auto_start, auto_open=self._project.auto_open,
|
self._project.controller,
|
||||||
auto_close=self._project.auto_close)
|
self._project.id,
|
||||||
|
f,
|
||||||
|
location=self._project.path,
|
||||||
|
auto_start=self._project.auto_start,
|
||||||
|
auto_open=self._project.auto_open,
|
||||||
|
auto_close=self._project.auto_close
|
||||||
|
)
|
||||||
|
log.info("Snapshot '{}' restored in {:.4f} seconds".format(self.name, time.time() - begin))
|
||||||
except (OSError, PermissionError) as e:
|
except (OSError, PermissionError) as e:
|
||||||
raise aiohttp.web.HTTPConflict(text=str(e))
|
raise aiohttp.web.HTTPConflict(text=str(e))
|
||||||
await project.open()
|
await project.open()
|
||||||
@ -132,6 +161,8 @@ class Snapshot:
|
|||||||
return {
|
return {
|
||||||
"snapshot_id": self._id,
|
"snapshot_id": self._id,
|
||||||
"name": self._name,
|
"name": self._name,
|
||||||
"created_at": int(self._created_at),
|
"created_at": self._created_at,
|
||||||
|
"description": self._description,
|
||||||
|
"filename": self._filename,
|
||||||
"project_id": self._project.id
|
"project_id": self._project.id
|
||||||
}
|
}
|
||||||
|
|||||||
@ -57,7 +57,7 @@ class CrashReport:
|
|||||||
Report crash to a third party service
|
Report crash to a third party service
|
||||||
"""
|
"""
|
||||||
|
|
||||||
DSN = "https://98c55f74bc61432b375d3eb392af9f7d@o19455.ingest.us.sentry.io/38482"
|
DSN = "https://89ba0bf8d773c2c95518bfb696d6d86f@o19455.ingest.us.sentry.io/38482"
|
||||||
_instance = None
|
_instance = None
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|||||||
BIN
gns3server/disks/OVMF_CODE_4M.fd
Normal file
BIN
gns3server/disks/OVMF_CODE_4M.fd
Normal file
Binary file not shown.
BIN
gns3server/disks/OVMF_VARS_4M.fd
Normal file
BIN
gns3server/disks/OVMF_VARS_4M.fd
Normal file
Binary file not shown.
@ -22,6 +22,7 @@ from gns3server.schemas.template import TEMPLATE_USAGE_SCHEMA
|
|||||||
|
|
||||||
import hashlib
|
import hashlib
|
||||||
import json
|
import json
|
||||||
|
import os
|
||||||
|
|
||||||
from gns3server.schemas.template import (
|
from gns3server.schemas.template import (
|
||||||
TEMPLATE_OBJECT_SCHEMA,
|
TEMPLATE_OBJECT_SCHEMA,
|
||||||
@ -173,3 +174,131 @@ class TemplateHandler:
|
|||||||
compute_id=request.json.get("compute_id"))
|
compute_id=request.json.get("compute_id"))
|
||||||
response.set_status(201)
|
response.set_status(201)
|
||||||
response.json(node)
|
response.json(node)
|
||||||
|
|
||||||
|
@Route.get(
|
||||||
|
r"/templates/{template_id}/base-config/{filename}",
|
||||||
|
description="Get base configuration file content",
|
||||||
|
)
|
||||||
|
def get_base_config(request, response):
|
||||||
|
|
||||||
|
controller = Controller.instance()
|
||||||
|
|
||||||
|
template_id = request.match_info["template_id"]
|
||||||
|
|
||||||
|
template = controller.template_manager.get_template(template_id)
|
||||||
|
|
||||||
|
filename = os.path.basename(request.match_info["filename"])
|
||||||
|
|
||||||
|
path = os.path.join(controller.configs_path(), filename)
|
||||||
|
|
||||||
|
try:
|
||||||
|
if not os.path.exists(path):
|
||||||
|
response.set_status(404)
|
||||||
|
response.json({"message": "File not found"})
|
||||||
|
return
|
||||||
|
|
||||||
|
with open(path, encoding="utf-8", errors="ignore") as f:
|
||||||
|
content = f.read()
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
response.set_status(500)
|
||||||
|
response.json({"message": str(e)})
|
||||||
|
return
|
||||||
|
|
||||||
|
response.set_status(200)
|
||||||
|
response.json({
|
||||||
|
"template_id": template.id,
|
||||||
|
"filename": filename,
|
||||||
|
"content": content
|
||||||
|
})
|
||||||
|
|
||||||
|
@Route.put(
|
||||||
|
r"/templates/{template_id}/base-config/{filename}",
|
||||||
|
description="Update base configuration file content",
|
||||||
|
parameters={
|
||||||
|
"template_id": "Template UUID",
|
||||||
|
"filename": "Base config filename"
|
||||||
|
},
|
||||||
|
status_codes={
|
||||||
|
200: "File updated",
|
||||||
|
400: "Invalid request",
|
||||||
|
404: "Template or file not found"
|
||||||
|
},
|
||||||
|
)
|
||||||
|
def update_base_config(request, response):
|
||||||
|
|
||||||
|
controller = Controller.instance()
|
||||||
|
|
||||||
|
template_id = request.match_info["template_id"]
|
||||||
|
filename = os.path.basename(request.match_info["filename"])
|
||||||
|
|
||||||
|
try:
|
||||||
|
template = controller.template_manager.get_template(template_id)
|
||||||
|
except Exception:
|
||||||
|
response.set_status(404)
|
||||||
|
response.json({"message": "Template not found"})
|
||||||
|
return
|
||||||
|
|
||||||
|
path = os.path.join(controller.configs_path(), filename)
|
||||||
|
|
||||||
|
body = request.json
|
||||||
|
|
||||||
|
if not body or "content" not in body:
|
||||||
|
response.set_status(400)
|
||||||
|
response.json({"message": "Missing 'content' field"})
|
||||||
|
return
|
||||||
|
|
||||||
|
content = body["content"]
|
||||||
|
|
||||||
|
try:
|
||||||
|
os.makedirs(controller.configs_path(), exist_ok=True)
|
||||||
|
|
||||||
|
with open(path, "w", encoding="utf-8") as f:
|
||||||
|
f.write(content)
|
||||||
|
|
||||||
|
except OSError as e:
|
||||||
|
response.set_status(500)
|
||||||
|
response.json({"message": str(e)})
|
||||||
|
return
|
||||||
|
|
||||||
|
response.set_status(200)
|
||||||
|
response.json({
|
||||||
|
"template_id": template.id,
|
||||||
|
"filename": filename,
|
||||||
|
"content": content
|
||||||
|
})
|
||||||
|
|
||||||
|
@Route.get(
|
||||||
|
r"/templates/base-configs",
|
||||||
|
description="List all available base configuration files",
|
||||||
|
status_codes={
|
||||||
|
200: "List of base configuration files returned"
|
||||||
|
}
|
||||||
|
)
|
||||||
|
def list_base_configs(request, response):
|
||||||
|
|
||||||
|
controller = Controller.instance()
|
||||||
|
|
||||||
|
configs_path = controller.configs_path()
|
||||||
|
|
||||||
|
try:
|
||||||
|
files = []
|
||||||
|
|
||||||
|
if os.path.exists(configs_path):
|
||||||
|
for filename in os.listdir(configs_path):
|
||||||
|
|
||||||
|
path = os.path.join(configs_path, filename)
|
||||||
|
|
||||||
|
if os.path.isfile(path):
|
||||||
|
files.append({"filename": filename})
|
||||||
|
|
||||||
|
except OSError as e:
|
||||||
|
response.set_status(500)
|
||||||
|
response.json({
|
||||||
|
"message": str(e)
|
||||||
|
})
|
||||||
|
return
|
||||||
|
|
||||||
|
files = sorted(files, key=lambda x: x["filename"])
|
||||||
|
response.set_status(200)
|
||||||
|
response.json(files)
|
||||||
|
|||||||
@ -235,9 +235,9 @@ def run():
|
|||||||
return
|
return
|
||||||
log.info("HTTP authentication is enabled with username '{}'".format(user))
|
log.info("HTTP authentication is enabled with username '{}'".format(user))
|
||||||
|
|
||||||
# we only support Python 3 version >= 3.8
|
# we only support Python 3 version >= 3.9
|
||||||
if sys.version_info < (3, 8, 0):
|
if sys.version_info < (3, 9, 0):
|
||||||
raise SystemExit("Python 3.8 or higher is required")
|
raise SystemExit("Python 3.9 or higher is required")
|
||||||
|
|
||||||
user_log.info("Running with Python {major}.{minor}.{micro} and has PID {pid}".format(major=sys.version_info[0], minor=sys.version_info[1],
|
user_log.info("Running with Python {major}.{minor}.{micro} and has PID {pid}".format(major=sys.version_info[0], minor=sys.version_info[1],
|
||||||
micro=sys.version_info[2], pid=os.getpid()))
|
micro=sys.version_info[2], pid=os.getpid()))
|
||||||
|
|||||||
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