mirror of
https://github.com/GNS3/gns3-server
synced 2025-04-22 10:29:03 +00:00
Compare commits
85 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
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 | ||
![]() |
369fcaa512 | ||
![]() |
7b7d3d676f | ||
![]() |
d1186b2acc | ||
![]() |
bd58196817 | ||
![]() |
ccc8974d92 | ||
![]() |
0090ff3722 | ||
![]() |
2c727c6bd2 | ||
![]() |
13b0caef4f | ||
![]() |
8ed1fa6ad5 | ||
![]() |
a689a55937 | ||
![]() |
1c0b0ae423 | ||
![]() |
ad7813d04b | ||
![]() |
685bf88005 | ||
![]() |
a1090a3da8 | ||
![]() |
c8e5b41f39 | ||
![]() |
94b5d3e636 | ||
![]() |
df56955bf0 | ||
![]() |
423d3fd82b | ||
![]() |
86fbae00e1 | ||
![]() |
91e9fa1cbc | ||
![]() |
6314dd3c35 | ||
![]() |
e94b55e3bf | ||
![]() |
6c521b5f7a | ||
![]() |
a8014da10b | ||
![]() |
f6080013e3 | ||
![]() |
fc54c6e496 | ||
![]() |
04cd107651 | ||
![]() |
19cabdfde6 | ||
![]() |
af7fbe6bb4 | ||
![]() |
3d58b437b4 | ||
![]() |
83921a45df | ||
![]() |
11c9802268 | ||
![]() |
a60e0d424d | ||
![]() |
db1fb29c63 | ||
![]() |
1a6a729736 | ||
![]() |
77c356c82c | ||
![]() |
b4819b5500 | ||
![]() |
a5f0dba5cf | ||
![]() |
11a9451098 | ||
![]() |
754680d8e9 | ||
![]() |
05773ce189 | ||
![]() |
aeae9deb01 | ||
![]() |
f3749e83ec | ||
![]() |
c2db4e8542 | ||
![]() |
52a7696618 | ||
![]() |
7bf17392dd | ||
![]() |
fb06eb3c0c | ||
![]() |
753135a80d | ||
![]() |
c05e1cb8e7 | ||
![]() |
48b7e6ca50 | ||
![]() |
dbe2b8a5fb | ||
![]() |
80487eb62d | ||
![]() |
6e66b26b88 | ||
![]() |
9990666076 | ||
![]() |
97e5a5edc3 |
2
.github/workflows/testing.yml
vendored
2
.github/workflows/testing.yml
vendored
@ -18,7 +18,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
os: ["ubuntu-latest"]
|
os: ["ubuntu-latest"]
|
||||||
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
|
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
|
||||||
#include:
|
#include:
|
||||||
# only test with Python 3.10 on Windows
|
# only test with Python 3.10 on Windows
|
||||||
# - os: windows-latest
|
# - os: windows-latest
|
||||||
|
43
CHANGELOG
43
CHANGELOG
@ -1,5 +1,48 @@
|
|||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
|
## 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
|
||||||
|
|
||||||
|
* Bundle web-ui v2.2.53
|
||||||
|
* Add more information when patching .vbox file. Ref https://github.com/GNS3/gns3-gui/issues/3542
|
||||||
|
* Increase timeout to run compute HTTP queries. Fixes #2461
|
||||||
|
* Use 'allow_methods="*"' in aiohttp_cors.ResourceOptions(). Fixes #2459
|
||||||
|
* Upgrade dependencies
|
||||||
|
* Update remote-install.sh to support a custom repository and the deb822 source format
|
||||||
|
* Fix: do not use the iourc file if IOU licence check is not enabled
|
||||||
|
|
||||||
|
|
||||||
|
## 2.2.52 02/12/2024
|
||||||
|
|
||||||
|
* Bundle web-ui v2.2.52
|
||||||
|
* Remove restrictions based on file extension when listing images and fix ELF header checks
|
||||||
|
* Fix use project name instead of ID for fast duplication when running local server. Fixes #2446
|
||||||
|
* Overwrite user resources when the originals have changed.
|
||||||
|
* Relax setuptools requirement to allow for easier Debian packaging on Ubuntu Focal & Jammy
|
||||||
|
|
||||||
|
## 2.2.51 07/11/2024
|
||||||
|
|
||||||
|
* Catch error when cannot resize Docker container TTY.
|
||||||
|
* Do not use "ide" if there is a disk image and no interface type has been explicitly configured.
|
||||||
|
* Use @locking when sending uBridge commands. Ref https://github.com/GNS3/gns3-gui/issues/3651
|
||||||
|
* Fix run Docker containers with user namespaces enabled. Fixes #2414
|
||||||
|
* Python 3.13 support
|
||||||
|
* Upgrade dependencies
|
||||||
|
* Fix errors in init.sh. Fixes #2431
|
||||||
|
|
||||||
## 2.2.50 21/10/2024
|
## 2.2.50 21/10/2024
|
||||||
|
|
||||||
* Bundle web-ui v2.2.50
|
* Bundle web-ui v2.2.50
|
||||||
|
21
Dockerfile
21
Dockerfile
@ -1,24 +1,27 @@
|
|||||||
# 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
|
||||||
RUN apt-get update && apt-get install -y \
|
RUN apt-get update && apt-get install -y \
|
||||||
locales \
|
locales \
|
||||||
python3-pip \
|
python3-pip \
|
||||||
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
|
||||||
|
|
||||||
@ -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
|
||||||
|
7
compose.yaml
Normal file
7
compose.yaml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
services:
|
||||||
|
gen3-server:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
ports:
|
||||||
|
- "8001:3080"
|
@ -25,6 +25,14 @@
|
|||||||
"options": "-cpu host -nographic"
|
"options": "-cpu host -nographic"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"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 +41,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 +75,13 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"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 +89,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": {
|
||||||
|
56
gns3server/appliances/alpine-cloud.gns3a
Normal file
56
gns3server/appliances/alpine-cloud.gns3a
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
{
|
||||||
|
"appliance_id": "edbaa01e-2032-4ee2-bb9f-dd5c4d84c270",
|
||||||
|
"name": "Alpine Cloud Guest",
|
||||||
|
"category": "guest",
|
||||||
|
"description": "Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox.",
|
||||||
|
"vendor_name": "Alpine Linux Development Team",
|
||||||
|
"vendor_url": "http://alpinelinux.org",
|
||||||
|
"vendor_logo_url": "https://raw.githubusercontent.com/GNS3/gns3-registry/master/vendor-logos/Alpine Linux.png",
|
||||||
|
"documentation_url": "http://wiki.alpinelinux.org",
|
||||||
|
"product_name": "Alpine Linux",
|
||||||
|
"product_url": "https://www.alpinelinux.org/cloud/",
|
||||||
|
"registry_version": 4,
|
||||||
|
"status": "stable",
|
||||||
|
"maintainer": "GNS3 Team",
|
||||||
|
"maintainer_email": "developers@gns3.net",
|
||||||
|
"usage": "\nUsername: alpine\nPassword: alpine",
|
||||||
|
"port_name_format": "Ethernet{0}",
|
||||||
|
"qemu": {
|
||||||
|
"adapter_type": "virtio-net-pci",
|
||||||
|
"adapters": 1,
|
||||||
|
"ram": 1024,
|
||||||
|
"hda_disk_interface": "virtio",
|
||||||
|
"arch": "x86_64",
|
||||||
|
"console_type": "telnet",
|
||||||
|
"boot_priority": "c",
|
||||||
|
"kvm": "require",
|
||||||
|
"options": "-nographic"
|
||||||
|
},
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "generic_alpine-3.21.2-x86_64-bios-cloudinit-r0.qcow2",
|
||||||
|
"version": "3.21.2",
|
||||||
|
"md5sum": "b40825dff2867e0ffaffbc4c87674462",
|
||||||
|
"filesize": 189726720,
|
||||||
|
"download_url": "https://www.alpinelinux.org/cloud/",
|
||||||
|
"direct_download_url": "https://dl-cdn.alpinelinux.org/alpine/v3.21/releases/cloud/generic_alpine-3.21.2-x86_64-bios-cloudinit-r0.qcow2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "alpine-cloud-init-data.iso",
|
||||||
|
"version": "1.0",
|
||||||
|
"md5sum": "b1b4b16cc3bf0250c0fa377c19c97683",
|
||||||
|
"filesize": 374784,
|
||||||
|
"download_url": "https://github.com/GNS3/gns3-registry/tree/master/cloud-init/alpine-cloud",
|
||||||
|
"direct_download_url": "https://github.com/GNS3/gns3-registry/raw/master/cloud-init/alpine-cloud/alpine-cloud-init-data.iso"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "3.21.2",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "generic_alpine-3.21.2-x86_64-bios-cloudinit-r0.qcow2",
|
||||||
|
"cdrom_image": "alpine-cloud-init-data.iso"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -2,14 +2,14 @@
|
|||||||
"appliance_id": "c90f3ff3-4ed2-4437-9afb-21232fa92015",
|
"appliance_id": "c90f3ff3-4ed2-4437-9afb-21232fa92015",
|
||||||
"name": "Arista vEOS",
|
"name": "Arista vEOS",
|
||||||
"category": "multilayer_switch",
|
"category": "multilayer_switch",
|
||||||
"description": "Arista EOS\u00ae is the core of Arista cloud networking solutions for next-generation data centers and cloud networks. Cloud architectures built with Arista EOS scale to tens of thousands of compute and storage nodes with management and provisioning capabilities that work at scale. Through its programmability, EOS enables a set of software applications that deliver workflow automation, high availability, unprecedented network visibility and analytics and rapid integration with a wide range of third-party applications for virtualization, management, automation and orchestration services.\n\nArista Extensible Operating System (EOS) is a fully programmable and highly modular, Linux-based network operation system, using familiar industry standard CLI and runs a single binary software image across the Arista switching family. Architected for resiliency and programmability, EOS has a unique multi-process state sharing architecture that separates state information and packet forwarding from protocol processing and application logic.",
|
"description": "Arista EOS is the core of Arista cloud networking solutions for next-generation data centers and cloud networks. Cloud architectures built with Arista EOS scale to tens of thousands of compute and storage nodes with management and provisioning capabilities that work at scale. Through its programmability, EOS enables a set of software applications that deliver workflow automation, high availability, unprecedented network visibility and analytics and rapid integration with a wide range of third-party applications for virtualization, management, automation and orchestration services.\n\nArista Extensible Operating System (EOS) is a fully programmable and highly modular, Linux-based network operation system, using familiar industry standard CLI and runs a single binary software image across the Arista switching family. Architected for resiliency and programmability, EOS has a unique multi-process state sharing architecture that separates state information and packet forwarding from protocol processing and application logic.",
|
||||||
"vendor_name": "Arista",
|
"vendor_name": "Arista",
|
||||||
"vendor_url": "http://www.arista.com/",
|
"vendor_url": "http://www.arista.com/",
|
||||||
"documentation_url": "https://www.arista.com/assets/data/docs/Manuals/EOS-4.17.2F-Manual.pdf",
|
"documentation_url": "https://www.arista.com/assets/data/docs/Manuals/EOS-4.17.2F-Manual.pdf",
|
||||||
"product_name": "vEOS",
|
"product_name": "vEOS",
|
||||||
"product_url": "https://eos.arista.com/",
|
"product_url": "https://eos.arista.com/",
|
||||||
"registry_version": 4,
|
"registry_version": 4,
|
||||||
"status": "experimental",
|
"status": "stable",
|
||||||
"maintainer": "GNS3 Team",
|
"maintainer": "GNS3 Team",
|
||||||
"maintainer_email": "developers@gns3.net",
|
"maintainer_email": "developers@gns3.net",
|
||||||
"usage": "The login is admin, with no password by default",
|
"usage": "The login is admin, with no password by default",
|
||||||
@ -29,87 +29,24 @@
|
|||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
{
|
{
|
||||||
"filename": "vEOS64-lab-4.32.0F.vmdk",
|
"filename": "vEOS64-lab-4.33.2F.qcow2",
|
||||||
"version": "4.32.0F",
|
"version": "4.33.2F",
|
||||||
"md5sum": "851771260bb18ad3e90fa6956f0c6161",
|
"md5sum": "fbe629a8342cd0b3b19566b9d7ef4f4f",
|
||||||
"filesize": 591724544,
|
"filesize": 610992128,
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
"download_url": "https://www.arista.com/en/support/software-download"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "vEOS64-lab-4.31.3M.vmdk",
|
"filename": "vEOS64-lab-4.32.4.1M.qcow2",
|
||||||
"version": "4.31.3M",
|
"version": "4.32.4.1M",
|
||||||
"md5sum": "7df107da137f4a4e752014d4f0e94cd3",
|
"md5sum": "cd369b5ccfd87ccd83a34538681ba35f",
|
||||||
"filesize": 577961984,
|
"filesize": 605159424,
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
"download_url": "https://www.arista.com/en/support/software-download"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "vEOS64-lab-4.30.6M.vmdk",
|
"filename": "vEOS64-lab-4.31.6M.qcow2",
|
||||||
"version": "4.30.6M",
|
"version": "4.31.6M",
|
||||||
"md5sum": "19721aace820b9ebf6d7ae6524803cf5",
|
"md5sum": "02fbd929de9416e1096cd2454507d6ce",
|
||||||
"filesize": 553123840,
|
"filesize": 590479360,
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS64-lab-4.29.8M.vmdk",
|
|
||||||
"version": "4.29.8M",
|
|
||||||
"md5sum": "131888f74cd63a93894521d40eb4d0b6",
|
|
||||||
"filesize": 548405248,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS64-lab-4.28.11M.vmdk",
|
|
||||||
"version": "4.28.11M",
|
|
||||||
"md5sum": "6cac0e7b04a74ee0dc358327a00accfd",
|
|
||||||
"filesize": 513343488,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS64-lab-4.27.12M.vmdk",
|
|
||||||
"version": "4.27.12M",
|
|
||||||
"md5sum": "34c4f785c7fc054cda8754dd13c0d7c7",
|
|
||||||
"filesize": 496697344,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.32.0F.vmdk",
|
|
||||||
"version": "4.32.0F",
|
|
||||||
"md5sum": "584b901a1249717504050e48f74fb8dd",
|
|
||||||
"filesize": 591396864,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.31.3M.vmdk",
|
|
||||||
"version": "4.31.3M",
|
|
||||||
"md5sum": "a2e130697cdf8547006eebebde6eefca",
|
|
||||||
"filesize": 590086144,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.30.6M.vmdk",
|
|
||||||
"version": "4.30.6M",
|
|
||||||
"md5sum": "a4467648bcfa7b19640af8a4ad3153c6",
|
|
||||||
"filesize": 565968896,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.29.8M.vmdk",
|
|
||||||
"version": "4.29.8M",
|
|
||||||
"md5sum": "1952f6114a4376212c525db9ec8efd5f",
|
|
||||||
"filesize": 558039040,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.28.11M.vmdk",
|
|
||||||
"version": "4.28.11M",
|
|
||||||
"md5sum": "5502df24dfc231c45afb33d6018c16d0",
|
|
||||||
"filesize": 521338880,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.27.12M.vmdk",
|
|
||||||
"version": "4.27.12M",
|
|
||||||
"md5sum": "e08a97e7c1977993f947fedeb4c6ddd5",
|
|
||||||
"filesize": 504299520,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
"download_url": "https://www.arista.com/en/support/software-download"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -118,459 +55,28 @@
|
|||||||
"md5sum": "8d7e754efebca1930a93a2587ff7606c",
|
"md5sum": "8d7e754efebca1930a93a2587ff7606c",
|
||||||
"filesize": 6291456,
|
"filesize": 6291456,
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
"download_url": "https://www.arista.com/en/support/software-download"
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.26.2F.vmdk",
|
|
||||||
"version": "4.26.2F",
|
|
||||||
"md5sum": "de8ce9750fddb63bd3f71bccfcd7651e",
|
|
||||||
"filesize": 475332608,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.25.3M.vmdk",
|
|
||||||
"version": "4.25.3M",
|
|
||||||
"md5sum": "2f196969036b4d283e86f15118d59c26",
|
|
||||||
"filesize": 451543040,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.24.3M.vmdk",
|
|
||||||
"version": "4.24.3M",
|
|
||||||
"md5sum": "0a28e44c7ce4a8965f24a4a463a89b7d",
|
|
||||||
"filesize": 455213056,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.24.2.1F.vmdk",
|
|
||||||
"version": "4.24.2.1F",
|
|
||||||
"md5sum": "6bab8b59ce5230e243e56f4127448fc8",
|
|
||||||
"filesize": 455213056,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.23.4.2M.vmdk",
|
|
||||||
"version": "4.23.4.2M",
|
|
||||||
"md5sum": "d21cbef4e39f1e783b13a926cb54a242",
|
|
||||||
"filesize": 454295552,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.23.0.1F.vmdk",
|
|
||||||
"version": "4.23.0.1F",
|
|
||||||
"md5sum": "08d52154aa11a834aef9f42bbf29f977",
|
|
||||||
"filesize": 439484416,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.22.2.1F.vmdk",
|
|
||||||
"version": "4.22.2.1F",
|
|
||||||
"md5sum": "2a425bf8efe569a2bdf0e328f240cd16",
|
|
||||||
"filesize": 426377216,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.22.0F.vmdk",
|
|
||||||
"version": "4.22.0F",
|
|
||||||
"md5sum": "cfcc75c2b8176cfd819afcfd6799b74c",
|
|
||||||
"filesize": 414121984,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.21.1.1F.vmdk",
|
|
||||||
"version": "4.21.1F",
|
|
||||||
"md5sum": "02bfb7e53781fd44ff02357f201586d9",
|
|
||||||
"filesize": 358809600,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.20.10M-combined.vmdk",
|
|
||||||
"version": "4.20.10M-combined",
|
|
||||||
"md5sum": "d1f2d650f93dbf24e04fdd2c9d62bd62",
|
|
||||||
"filesize": 334626816,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.20.1F.vmdk",
|
|
||||||
"version": "4.20.1F",
|
|
||||||
"md5sum": "aadb6f3dbff28317f68cb4c4502d0db8",
|
|
||||||
"filesize": 662044672,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.19.10M-combined.vmdk",
|
|
||||||
"version": "4.19.10M-combined",
|
|
||||||
"md5sum": "103daa45c33be4584cbe6adc60de46a3",
|
|
||||||
"filesize": 324141056,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.19.10M.vmdk",
|
|
||||||
"version": "4.19.10M",
|
|
||||||
"md5sum": "665ed14389411ae5f16ba0a2ff84240a",
|
|
||||||
"filesize": 637337600,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.18.10M-combined.vmdk",
|
|
||||||
"version": "4.18.10M-combined",
|
|
||||||
"md5sum": "e33e0ef5b8cecc84c5bb57569b36b9c6",
|
|
||||||
"filesize": 317652992,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.18.10M.vmdk",
|
|
||||||
"version": "4.18.10M",
|
|
||||||
"md5sum": "1d87e9ace37fe3706dbf3e49c8d4d231",
|
|
||||||
"filesize": 624427008,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.18.5M.vmdk",
|
|
||||||
"version": "4.18.5M",
|
|
||||||
"md5sum": "b1ee6268dbaf2b2276fd7a5286c7ce2b",
|
|
||||||
"filesize": 623116288,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.18.1F.vmdk",
|
|
||||||
"version": "4.18.1F",
|
|
||||||
"md5sum": "9648c63185f3b793b47528a858ca4364",
|
|
||||||
"filesize": 620625920,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.17.8M.vmdk",
|
|
||||||
"version": "4.17.8M",
|
|
||||||
"md5sum": "afc79a06f930ea2cc0ae3e03cbfd3f23",
|
|
||||||
"filesize": 608829440,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.17.2F.vmdk",
|
|
||||||
"version": "4.17.2F",
|
|
||||||
"md5sum": "3b4845edfa77cf9aaeb9c0a005d3e277",
|
|
||||||
"filesize": 609615872,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.16.13M.vmdk",
|
|
||||||
"version": "4.16.13M",
|
|
||||||
"md5sum": "4d0facf90140fc3aab031f0f8f88a32f",
|
|
||||||
"filesize": 521404416,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.16.6M.vmdk",
|
|
||||||
"version": "4.16.6M",
|
|
||||||
"md5sum": "b3f7b7cee17f2e66bb38b453a4939fef",
|
|
||||||
"filesize": 519962624,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.15.10M.vmdk",
|
|
||||||
"version": "4.15.10M",
|
|
||||||
"md5sum": "98e08281a9c48ddf6f3c5d62a124a20f",
|
|
||||||
"filesize": 517079040,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.15.5M.vmdk",
|
|
||||||
"version": "4.15.5M",
|
|
||||||
"md5sum": "cd74bb69c7ee905ac3d33c4d109f3ab7",
|
|
||||||
"filesize": 516030464,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.14.14M.vmdk",
|
|
||||||
"version": "4.14.14M",
|
|
||||||
"md5sum": "d81ba0522f4d7838d96f7985e41cdc47",
|
|
||||||
"filesize": 422641664,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.13.16M.vmdk",
|
|
||||||
"version": "4.13.16M",
|
|
||||||
"md5sum": "5763b2c043830c341c8b1009f4ea9a49",
|
|
||||||
"filesize": 404684800,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "vEOS-lab-4.13.8M.vmdk",
|
|
||||||
"version": "4.13.8M",
|
|
||||||
"md5sum": "a47145b9e6e7a24171c0850f8755535e",
|
|
||||||
"filesize": 409010176,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"version": "8.0.0",
|
|
||||||
"md5sum": "488ad1c435d18c69bb8d69c7806457c9",
|
|
||||||
"filesize": 5242880,
|
|
||||||
"download_url": "https://www.arista.com/en/support/software-download"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
"name": "4.32.0F",
|
"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": "vEOS64-lab-4.32.0F.vmdk"
|
"hdb_disk_image": "vEOS64-lab-4.33.2F.qcow2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "4.31.3M",
|
"name": "4.32.4.1M",
|
||||||
"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": "vEOS64-lab-4.31.3M.vmdk"
|
"hdb_disk_image": "vEOS64-lab-4.32.4.1M.qcow2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "4.30.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": "vEOS64-lab-4.30.6M.vmdk"
|
"hdb_disk_image": "vEOS64-lab-4.31.6M.qcow2"
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.29.8M",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.2.iso",
|
|
||||||
"hdb_disk_image": "vEOS64-lab-4.29.8M.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.28.11M",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.2.iso",
|
|
||||||
"hdb_disk_image": "vEOS64-lab-4.28.11M.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.27.12M",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.2.iso",
|
|
||||||
"hdb_disk_image": "vEOS64-lab-4.27.12M.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.32.0F",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.2.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.32.0F.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.31.3M",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.2.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.31.3M.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.30.6M",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.2.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.30.6M.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.29.8M",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.2.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.29.8M.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.28.11M",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.2.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.28.11M.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.27.12M",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.2.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.27.12M.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.26.2F",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.26.2F.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.25.3M",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.25.3M.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.24.3M",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.24.3M.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.24.2.1F",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.24.2.1F.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.23.4.2M",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.23.4.2M.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.23.0.1F",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.23.0.1F.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.22.2.1F",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.22.2.1F.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.22.0F",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.22.0F.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.21.1F",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.21.1.1F.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.20.10M-combined",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "vEOS-lab-4.20.10M-combined.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.20.1F",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.20.1F.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.19.10M-combined",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "vEOS-lab-4.19.10M-combined.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.19.10M",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.19.10M.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.18.10M-combined",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "vEOS-lab-4.18.10M-combined.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.18.10M",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.18.10M.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.18.5M",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.18.5M.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.18.1F",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.18.1F.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.17.8M",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.17.8M.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.17.2F",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.17.2F.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.16.13M",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.16.13M.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.16.6M",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.16.6M.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.15.10M",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.15.10M.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.15.5M",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.15.5M.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.14.14M",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.14.14M.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.13.16M",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.13.16M.vmdk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "4.13.8M",
|
|
||||||
"images": {
|
|
||||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
|
||||||
"hdb_disk_image": "vEOS-lab-4.13.8M.vmdk"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -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": {
|
||||||
|
63
gns3server/appliances/asterfusion-vAsterNOS-campus.gns3a
Normal file
63
gns3server/appliances/asterfusion-vAsterNOS-campus.gns3a
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
{
|
||||||
|
"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. AsterNOS v6.0 Campus builds upon the L2/L3 features of v5.2 (including ACL, MSTP, QinQ, IGMP Snooping, OSPF/BGP, etc.) and further enhances support for advanced technologies such as MPLS L2VPN/L3VPN and PTP. 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-V6.1R002.img",
|
||||||
|
"version": "6.1-2",
|
||||||
|
"md5sum": "003e6329489a617fbab5783504559d26",
|
||||||
|
"filesize": 2106851328,
|
||||||
|
"download_url": "https://drive.cloudswitch.io/external/c224501f36e6003767b30112bd44d92476f81f442cf47f8027a6f4f7e4227995"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "vAsterNOS-V5.2R012P01.img",
|
||||||
|
"version": "5.2-12-1",
|
||||||
|
"md5sum": "d18c0cfd786607ccc6dc1069a8f40465",
|
||||||
|
"filesize": 2823290880,
|
||||||
|
"download_url": "https://drive.cloudswitch.io/external/d29f6d0a6c8322fea42b3c08e95113d026b8ec6aafbe29193c338333077f3da7"
|
||||||
|
}
|
||||||
|
|
||||||
|
],
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "6.1-2",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "vAsterNOS-V6.1R002.img"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "5.2-12-1",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "vAsterNOS-V5.2R012P01.img"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -13,7 +13,7 @@
|
|||||||
"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}",
|
||||||
|
@ -27,44 +27,28 @@
|
|||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
{
|
{
|
||||||
"filename": "CentOS-Stream-GenericCloud-9-20230704.1.x86_64.qcow2",
|
"filename": "CentOS-Stream-GenericCloud-x86_64-10-20250331.0.x86_64.qcow2",
|
||||||
"version": "Stream-9 (20230704.1)",
|
"version": "Stream-10 (20250331.0)",
|
||||||
"md5sum": "e04511e019325a97837edd9eafe02b48",
|
"md5sum": "776033371ca346001dd6390f0cbaf0d0",
|
||||||
"filesize": 1087868416,
|
"filesize": 952041472,
|
||||||
|
"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-x86_64-10-20250331.0.x86_64.qcow2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "CentOS-Stream-GenericCloud-9-20250331.0.x86_64.qcow2",
|
||||||
|
"version": "Stream-9 (20250331.0)",
|
||||||
|
"md5sum": "4aaeddc6ca497065522c75a7471f9bfd",
|
||||||
|
"filesize": 1250625536,
|
||||||
"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-20250331.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 (20250331.0)",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "CentOS-Stream-GenericCloud-9-20230704.1.x86_64.qcow2",
|
"hda_disk_image": "CentOS-Stream-GenericCloud-x86_64-10-20250331.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 (20250331.0)",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "CentOS-Stream-GenericCloud-8-20230710.0.x86_64.qcow2",
|
"hda_disk_image": "CentOS-Stream-GenericCloud-9-20250331.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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,11 +33,23 @@
|
|||||||
"md5sum": "cbbbea66a253f1dac0fcf81274dc778d",
|
"md5sum": "cbbbea66a253f1dac0fcf81274dc778d",
|
||||||
"filesize": 87756936
|
"filesize": 87756936
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"filename": "c7200-adventerprisek9-mz.152-4.M11.image",
|
||||||
|
"version": "152-4.M11",
|
||||||
|
"md5sum": "9a2005ad09ce1ec6fe7cf9af1e9b099e",
|
||||||
|
"filesize": 128487680
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "c7200-adventerprisek9-mz.124-24.T5.image",
|
"filename": "c7200-adventerprisek9-mz.124-24.T5.image",
|
||||||
"version": "124-24.T5",
|
"version": "124-24.T5",
|
||||||
"md5sum": "6b89d0d804e1f2bb5b8bda66b5692047",
|
"md5sum": "6b89d0d804e1f2bb5b8bda66b5692047",
|
||||||
"filesize": 102345240
|
"filesize": 102345240
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "c7200-a3jk9s-mz.124-25g.image",
|
||||||
|
"version": "124-25G",
|
||||||
|
"md5sum": "9c7cc9b3f3b3571411a7f62faaa2c036",
|
||||||
|
"filesize": 71528984
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
@ -55,12 +67,26 @@
|
|||||||
"image": "c7200-advipservicesk9-mz.152-4.S5.image"
|
"image": "c7200-advipservicesk9-mz.152-4.S5.image"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "152-4.M11",
|
||||||
|
"idlepc": "0x6062e5c0",
|
||||||
|
"images": {
|
||||||
|
"image": "c7200-adventerprisek9-mz.152-4.M11.image"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "124-24.T5",
|
"name": "124-24.T5",
|
||||||
"idlepc": "0x606df838",
|
"idlepc": "0x606df838",
|
||||||
"images": {
|
"images": {
|
||||||
"image": "c7200-adventerprisek9-mz.124-24.T5.image"
|
"image": "c7200-adventerprisek9-mz.124-24.T5.image"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "124-25G",
|
||||||
|
"idlepc": "0x6066a998",
|
||||||
|
"images": {
|
||||||
|
"image": "c7200-a3jk9s-mz.124-25g.image"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -5,14 +5,14 @@
|
|||||||
"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",
|
||||||
"maintainer_email": "developers@gns3.net",
|
"maintainer_email": "developers@gns3.net",
|
||||||
"usage": "There is no default password and enable password. A default configuration is present. ASAv goes through a double-boot before becoming active. This is normal and expected.",
|
"usage": "There is no default password and enable password. A default configuration is present. ASAv goes through a double-boot before becoming active. This is normal and expected. Switch to the Telnet console type after the first boot.",
|
||||||
"symbol": ":/symbols/asa.svg",
|
"symbol": ":/symbols/asa.svg",
|
||||||
"first_port_name": "Management0/0",
|
"first_port_name": "Management0/0",
|
||||||
"port_name_format": "Gi0/{0}",
|
"port_name_format": "Gi0/{0}",
|
||||||
@ -26,6 +26,13 @@
|
|||||||
"kvm": "require"
|
"kvm": "require"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "asav9-22-1-1.qcow2",
|
||||||
|
"version": "9.22.1.1 CML",
|
||||||
|
"md5sum": "250a924cdc2370208eaac9d1dc8dc9e3",
|
||||||
|
"filesize": 379518976,
|
||||||
|
"download_url": "https://learningnetworkstore.cisco.com/cisco-modeling-labs-personal/cisco-modeling-labs-personal/CML-PERSONAL.html"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "asav9-18-2.qcow2",
|
"filename": "asav9-18-2.qcow2",
|
||||||
"version": "9.18.2 CML",
|
"version": "9.18.2 CML",
|
||||||
@ -126,6 +133,12 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "9.22.1.1 CML",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "asav9-22-1-1.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "9.18.2 CML",
|
"name": "9.18.2 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",
|
||||||
|
@ -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",
|
||||||
@ -24,12 +24,26 @@
|
|||||||
"kvm": "require"
|
"kvm": "require"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "csr1000v-universalk9.17.03.08a-serial.qcow2",
|
||||||
|
"version": "17.03.08a",
|
||||||
|
"md5sum": "6abece87d6db99d9fd6917203e253f91",
|
||||||
|
"filesize": 1421410304,
|
||||||
|
"download_url": "https://software.cisco.com/download/home/286323714/type/282046477/release/Amsterdam-17.3.8a"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "csr1000v-universalk9.17.03.06-serial.qcow2",
|
"filename": "csr1000v-universalk9.17.03.06-serial.qcow2",
|
||||||
"version": "17.03.06",
|
"version": "17.03.06",
|
||||||
"md5sum": "086ab9bef6e66de847af0da3910c60e8",
|
"md5sum": "086ab9bef6e66de847af0da3910c60e8",
|
||||||
"filesize": 1422000128,
|
"filesize": 1422000128,
|
||||||
"download_url": "https://software.cisco.com/download/home/284364978/type/282046477/release/Gibraltar-16.12.3"
|
"download_url": "https://software.cisco.com/download/home/286323714/type/282046477/release/Amsterdam-17.3.6"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "csr1000v-ucmk9.16.12.5-serial.qcow2",
|
||||||
|
"version": "16.12.05",
|
||||||
|
"md5sum": "5c0cc217f0f0648407b34b11a1dd5b8e",
|
||||||
|
"filesize": 844103680,
|
||||||
|
"download_url": "https://software.cisco.com/download/home/286323714/type/286321980/release/16.12.5"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "csr1000v-universalk9.16.12.03-serial.qcow2",
|
"filename": "csr1000v-universalk9.16.12.03-serial.qcow2",
|
||||||
@ -155,7 +169,7 @@
|
|||||||
"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://learningnetworkstore.cisco.com/myaccount"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "csr1000v-universalk9.16.6.1.qcow2",
|
"filename": "csr1000v-universalk9.16.6.1.qcow2",
|
||||||
@ -166,13 +180,25 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "17.03.08a",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "csr1000v-universalk9.17.03.08a-serial.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "17.03.06",
|
"name": "17.03.06",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "csr1000v-universalk9.17.03.06-serial.qcow2"
|
"hda_disk_image": "csr1000v-universalk9.17.03.06-serial.qcow2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"name": "16.12.05",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "csr1000v-ucmk9.16.12.5-serial.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
"name": "16.12.3",
|
"name": "16.12.3",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "csr1000v-universalk9.16.12.03-serial.qcow2"
|
"hda_disk_image": "csr1000v-universalk9.16.12.03-serial.qcow2"
|
||||||
|
@ -5,8 +5,9 @@
|
|||||||
"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/iol/",
|
||||||
"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,12 +26,11 @@
|
|||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
{
|
{
|
||||||
"filename": "IOSv_startup_config.img",
|
"filename": "vios-adventerprisek9-m.spa.159-3.m9.qcow2",
|
||||||
"version": "1",
|
"version": "15.9(3)M9",
|
||||||
"md5sum": "bc605651c4688276f81fd59dcf5cc786",
|
"md5sum": "01b707a2e33185d6d33e0255ced45d23",
|
||||||
"filesize": 1048576,
|
"filesize": 57323008,
|
||||||
"download_url": "https://sourceforge.net/projects/gns-3/files",
|
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
||||||
"direct_download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/IOSv_startup_config.img/download"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "vios-adventerprisek9-m.spa.159-3.m8.qcow2",
|
"filename": "vios-adventerprisek9-m.spa.159-3.m8.qcow2",
|
||||||
@ -101,9 +101,24 @@
|
|||||||
"md5sum": "79f613ac3b179d5a64520730925130b2",
|
"md5sum": "79f613ac3b179d5a64520730925130b2",
|
||||||
"filesize": 127926272,
|
"filesize": 127926272,
|
||||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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)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": {
|
||||||
|
@ -5,8 +5,9 @@
|
|||||||
"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",
|
||||||
|
@ -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",
|
||||||
|
@ -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",
|
||||||
@ -26,92 +26,35 @@
|
|||||||
"options": "-smp 4 -cpu host"
|
"options": "-smp 4 -cpu host"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "xrv9k-fullk9-x-24.3.1.qcow2",
|
||||||
|
"version": "24.3.1",
|
||||||
|
"md5sum": "bd047c457e29952f265583f299bab845",
|
||||||
|
"filesize": 1704658432,
|
||||||
|
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"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://learningnetworkstore.cisco.com/myaccount"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"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"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"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"
|
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"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 +66,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"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,9 @@
|
|||||||
"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,13 +15,19 @@
|
|||||||
"iou": {
|
"iou": {
|
||||||
"ethernet_adapters": 4,
|
"ethernet_adapters": 4,
|
||||||
"serial_adapters": 0,
|
"serial_adapters": 0,
|
||||||
"nvram": 128,
|
"nvram": 512,
|
||||||
"ram": 256,
|
"ram": 512,
|
||||||
"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.bin",
|
"filename": "x86_64_crb_linux_l2-adventerprisek9-ms.iol",
|
||||||
|
"version": "17.15.1",
|
||||||
|
"md5sum": "6c587cdfd5056078e70b3f6c26800d66",
|
||||||
|
"filesize": 243251976
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "x86_64_crb_linux_l2-adventerprisek9-ms",
|
||||||
"version": "17.12.1",
|
"version": "17.12.1",
|
||||||
"md5sum": "2b5055e4cef8fd257416d74a94adb626",
|
"md5sum": "2b5055e4cef8fd257416d74a94adb626",
|
||||||
"filesize": 240355720
|
"filesize": 240355720
|
||||||
@ -44,10 +52,16 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "17.15.1",
|
||||||
|
"images": {
|
||||||
|
"image": "x86_64_crb_linux_l2-adventerprisek9-ms.iol"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "17.12.1",
|
"name": "17.12.1",
|
||||||
"images": {
|
"images": {
|
||||||
"image": "x86_64_crb_linux_l2-adventerprisek9-ms.bin"
|
"image": "x86_64_crb_linux_l2-adventerprisek9-ms"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -5,7 +5,9 @@
|
|||||||
"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,13 +15,19 @@
|
|||||||
"iou": {
|
"iou": {
|
||||||
"ethernet_adapters": 2,
|
"ethernet_adapters": 2,
|
||||||
"serial_adapters": 2,
|
"serial_adapters": 2,
|
||||||
"nvram": 128,
|
"nvram": 512,
|
||||||
"ram": 256,
|
"ram": 512,
|
||||||
"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.bin",
|
"filename": "x86_64_crb_linux-adventerprisek9-ms.iol",
|
||||||
|
"version": "17.15.1",
|
||||||
|
"md5sum": "5d584f6cfbeaadc87d55f613da1049ed",
|
||||||
|
"filesize": 292001512
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "x86_64_crb_linux-adventerprisek9-ms",
|
||||||
"version": "17.12.1",
|
"version": "17.12.1",
|
||||||
"md5sum": "4a2fce8de21d1831fbceffd155e41ae7",
|
"md5sum": "4a2fce8de21d1831fbceffd155e41ae7",
|
||||||
"filesize": 288947184
|
"filesize": 288947184
|
||||||
@ -44,10 +52,16 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "17.15.1",
|
||||||
|
"images": {
|
||||||
|
"image": "x86_64_crb_linux-adventerprisek9-ms.iol"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "17.12.1",
|
"name": "17.12.1",
|
||||||
"images": {
|
"images": {
|
||||||
"image": "x86_64_crb_linux-adventerprisek9-ms.bin"
|
"image": "x86_64_crb_linux-adventerprisek9-ms"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -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",
|
||||||
|
@ -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,33 @@
|
|||||||
"kvm": "require"
|
"kvm": "require"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"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 +69,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 +80,27 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"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 +121,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"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,21 @@
|
|||||||
"options": ""
|
"options": ""
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
{
|
{
|
||||||
|
"filename": "MFG_CTVM_8_10_196_0.iso",
|
||||||
|
"version": "8.10.196.0",
|
||||||
|
"md5sum": "6093aca44dcf45c999f83e62dc9aeea2",
|
||||||
|
"filesize": 650809344,
|
||||||
|
"download_url": "https://software.cisco.com/download/release.html?mdfid=284464214&flowid=&softwareid=280926587&release=8.10.196.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "MFG_CTVM_8_5_182_0.iso",
|
||||||
|
"version": "8.5.182.0",
|
||||||
|
"md5sum": "1cf3c57c2b123e739ab4662ea0abbc34",
|
||||||
|
"filesize": 388579328,
|
||||||
|
"download_url": "https://software.cisco.com/download/home/284464214/type/280926587/release/8.5.182.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
"filename": "MFG_CTVM_8_3_102_0.iso",
|
"filename": "MFG_CTVM_8_3_102_0.iso",
|
||||||
"version": "8.3.102.0",
|
"version": "8.3.102.0",
|
||||||
"md5sum": "7f6b7968b5bed04b5ecc119b6ba4e41c",
|
"md5sum": "7f6b7968b5bed04b5ecc119b6ba4e41c",
|
||||||
@ -73,6 +87,20 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "8.10.196.0",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "empty8G.qcow2",
|
||||||
|
"cdrom_image": "MFG_CTVM_8_10_196_0.iso"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "8.5.182.0",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "empty8G.qcow2",
|
||||||
|
"cdrom_image": "MFG_CTVM_8_5_182_0.iso"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "8.3.102.0",
|
"name": "8.3.102.0",
|
||||||
"images": {
|
"images": {
|
||||||
|
@ -30,6 +30,13 @@
|
|||||||
"images": [
|
"images": [
|
||||||
|
|
||||||
{
|
{
|
||||||
|
"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 +48,12 @@
|
|||||||
|
|
||||||
"versions": [
|
"versions": [
|
||||||
|
|
||||||
|
{
|
||||||
|
"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": {
|
||||||
|
@ -26,6 +26,22 @@
|
|||||||
"options": "-nographic"
|
"options": "-nographic"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"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-Base-Generic.x86_64-40-1.14.qcow2",
|
||||||
|
"version": "40-1.14",
|
||||||
|
"md5sum": "3eed4b1a9de35208ed30d9bb72c1522d",
|
||||||
|
"filesize": 397475840,
|
||||||
|
"download_url": "https://download.fedoraproject.org/pub/fedora/linux/releases/40/Cloud/x86_64/images",
|
||||||
|
"direct_download_url": "https://fedora.mirrorservice.org/fedora/linux/releases/40/Cloud/x86_64/images/Fedora-Cloud-Base-Generic.x86_64-40-1.14.qcow2"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "Fedora-Cloud-Base-39-1.5.x86_64.qcow2",
|
"filename": "Fedora-Cloud-Base-39-1.5.x86_64.qcow2",
|
||||||
"version": "39-1.5",
|
"version": "39-1.5",
|
||||||
@ -52,6 +68,20 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "40-1.14",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "Fedora-Cloud-Base-Generic.x86_64-40-1.14.qcow2",
|
||||||
|
"cdrom_image": "fedora-cloud-init-data.iso"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "39-1.5",
|
"name": "39-1.5",
|
||||||
"images": {
|
"images": {
|
||||||
|
@ -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": {
|
||||||
|
@ -29,9 +29,30 @@
|
|||||||
"kvm": "allow"
|
"kvm": "allow"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "FMG_VM64_KVM-v7.4.6.M-build2588-FORTINET.out.kvm.qcow2",
|
||||||
|
"version": "7.4.6",
|
||||||
|
"md5sum": "7cb219e1070d393f61cf750d818b23b1",
|
||||||
|
"filesize": 349122560,
|
||||||
|
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "FMG_VM64_KVM-v7.4.5.M-build2553-FORTINET.out.kvm.qcow2",
|
||||||
|
"version": "7.4.5",
|
||||||
|
"md5sum": "fa59ddce0cb933741f16866472026723",
|
||||||
|
"filesize": 349769728,
|
||||||
|
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "FMG_VM64_KVM-v7.4.4.F-build2550-FORTINET.out.kvm.qcow2",
|
||||||
|
"version": "7.4.4",
|
||||||
|
"md5sum": "770727bb30555e6938308bbf95f19555",
|
||||||
|
"filesize": 349847552,
|
||||||
|
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "FMG_VM64_KVM-v7.4.3-build2487-FORTINET.out.kvm.qcow2",
|
"filename": "FMG_VM64_KVM-v7.4.3-build2487-FORTINET.out.kvm.qcow2",
|
||||||
"version": "7.4.23",
|
"version": "7.4.3",
|
||||||
"md5sum": "b01d9f86aa27c538407d518df1326863",
|
"md5sum": "b01d9f86aa27c538407d518df1326863",
|
||||||
"filesize": 346107904,
|
"filesize": 346107904,
|
||||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||||
@ -277,6 +298,27 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "7.4.6",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "FMG_VM64_KVM-v7.4.6.M-build2588-FORTINET.out.kvm.qcow2",
|
||||||
|
"hdb_disk_image": "empty30G.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "7.4.5",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "FMG_VM64_KVM-v7.4.5.M-build2553-FORTINET.out.kvm.qcow2",
|
||||||
|
"hdb_disk_image": "empty30G.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "7.4.4",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "FMG_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": {
|
||||||
|
104
gns3server/appliances/infix.gns3a
Normal file
104
gns3server/appliances/infix.gns3a
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
{
|
||||||
|
"appliance_id": "4d351078-c6f5-444c-ab30-0ef20e3d8c53",
|
||||||
|
"name": "Infix",
|
||||||
|
"category": "router",
|
||||||
|
"description": "Infix is a Network Operating System based on Linux. It can be set up both as a switch, with offloading using switchdev, and a router with firewalling.",
|
||||||
|
"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://github.com/kernelkit/infix/tree/main/doc",
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
50
gns3server/appliances/innovaphone-app.gns3a
Normal file
50
gns3server/appliances/innovaphone-app.gns3a
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
"appliance_id": "92dbd0e9-144e-4c59-a4a8-97b6a1661818",
|
||||||
|
"name": "Innovaphone App-Platform",
|
||||||
|
"category": "guest",
|
||||||
|
"description": "In addition to telephony, apps for Video Telephony, Chat, Conferencing, Application Sharing and many other functions have become indispensable UCC tools in the area of business communication. Based on the myApps platform and its various components, innovaphone provides a collaborative work and communication platform for enhanced corporate communications \u2013 regardless of the location and the device being used. The innovaphone platform myApps consists of many independent components that work well individually, yet unfold their remarkable performance when combined.",
|
||||||
|
"vendor_name": "Innovaphone",
|
||||||
|
"vendor_url": "https://www.innovaphone.com",
|
||||||
|
"vendor_logo_url": "https://www.innovaphone.com/content/downloads/innovaphone-myapps-logo-short-without-background-screen.png",
|
||||||
|
"documentation_url": "https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Platform",
|
||||||
|
"product_name": "App-Platform",
|
||||||
|
"product_url": "https://www.innovaphone.com/en/products/myapps/myapps-platform.html",
|
||||||
|
"registry_version": 4,
|
||||||
|
"status": "experimental",
|
||||||
|
"availability": "free-to-try",
|
||||||
|
"maintainer": "Thomas Marchsteiner",
|
||||||
|
"maintainer_email": "thomas.marchsteiner@acp.at",
|
||||||
|
"usage": "Default users console:root/iplinux , ssh:admin/ipapps , Webinterface:pwd \nAfter first boot wait for automatic reboot.\nA static ip can be set via the setip utility. \nLoading another keymap can be done via the loadkeys command. \nThe app-platform-disk1.vmdk file is contained within an ova file. \nIt can be extraced with the tar utility, 7Zip or any other tool which can handle tar files.",
|
||||||
|
"symbol": "innovaphone-ap-icon.jpg",
|
||||||
|
"first_port_name": "eth0",
|
||||||
|
"qemu": {
|
||||||
|
"adapter_type": "vmxnet3",
|
||||||
|
"adapters": 1,
|
||||||
|
"ram": 512,
|
||||||
|
"cpus": 1,
|
||||||
|
"hda_disk_interface": "scsi",
|
||||||
|
"arch": "x86_64",
|
||||||
|
"console_type": "vnc",
|
||||||
|
"boot_priority": "d",
|
||||||
|
"kvm": "allow",
|
||||||
|
"on_close": "power_off",
|
||||||
|
"process_priority": "normal"
|
||||||
|
},
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "app-platform-disk1_120010.vmdk",
|
||||||
|
"version": "12.0010",
|
||||||
|
"md5sum": "d5a5a77f682c2c988b0810935d79a787",
|
||||||
|
"filesize": 129474560,
|
||||||
|
"download_url": "https://store.innovaphone.com/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "app-platform-disk1_120010.vmdk"
|
||||||
|
},
|
||||||
|
"name": "12.0010"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
78
gns3server/appliances/innovaphone-ipva.gns3a
Normal file
78
gns3server/appliances/innovaphone-ipva.gns3a
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
{
|
||||||
|
"appliance_id": "ddf8f7a4-60c0-4c9d-849c-ffc3c9d1d082",
|
||||||
|
"name": "Innovaphone IPVA",
|
||||||
|
"category": "guest",
|
||||||
|
"description": "The innovaphone PBX is a professional IP telephone system. The IPVA is a software-only solution. It appears as and performs as an innovaphone 'hard-box' excluding DSP-, ISDN-/AB-resources.",
|
||||||
|
"vendor_name": "Innovaphone",
|
||||||
|
"vendor_url": "https://www.innovaphone.com/",
|
||||||
|
"vendor_logo_url": "https://www.innovaphone.com/content/downloads/innovaphone-myapps-logo-short-without-background-screen.png",
|
||||||
|
"documentation_url": "https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_Innovaphone_Virtual_Appliance_(IPVA)",
|
||||||
|
"product_name": "IPVA",
|
||||||
|
"product_url": "https://www.innovaphone.com/en/products/innovaphone-pbx.html",
|
||||||
|
"registry_version": 4,
|
||||||
|
"status": "experimental",
|
||||||
|
"availability": "free-to-try",
|
||||||
|
"maintainer": "Thomas Marchsteiner",
|
||||||
|
"maintainer_email": "thomas.marchsteiner@acp.at",
|
||||||
|
"usage": "Default user admin/ipva \nDefault network configuration: DHCP client on eth0 with fallback to static address 192.168.0.1/24 after timeout. Static address 192.168.1.1/24 on eth1\n The ova in the zip file contains the disk images to run this appliance. Disableing the dhcp client and setting a static IP is possible with the following commands:\n> config change IP0 ETH0 /addr 192.168.0.1 /mask 255.255.255.0 \n> config change DHCP0 /mode off \n> config write \n> config activate \n> reset",
|
||||||
|
"symbol": "innovaphone-pbx-green.png",
|
||||||
|
"first_port_name": "eth0",
|
||||||
|
"port_name_format": "eth{port1}",
|
||||||
|
"qemu": {
|
||||||
|
"adapter_type": "vmxnet3",
|
||||||
|
"adapters": 2,
|
||||||
|
"ram": 256,
|
||||||
|
"cpus": 1,
|
||||||
|
"hda_disk_interface": "ide",
|
||||||
|
"hdb_disk_interface": "ide",
|
||||||
|
"hdc_disk_interface": "ide",
|
||||||
|
"hdd_disk_interface": "ide",
|
||||||
|
"arch": "x86_64",
|
||||||
|
"console_type": "vnc",
|
||||||
|
"boot_priority": "d",
|
||||||
|
"kvm": "allow",
|
||||||
|
"on_close": "power_off",
|
||||||
|
"process_priority": "normal"
|
||||||
|
},
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "ipva-qemu-disk1-14r2.vmdk",
|
||||||
|
"version": "14r2",
|
||||||
|
"md5sum": "aaa1c3885eee30ca6ffa3827619e8643",
|
||||||
|
"filesize": 6269952,
|
||||||
|
"download_url": "https://store.innovaphone.com/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "ipva-qemu-disk2-14r2.vmdk",
|
||||||
|
"version": "14r2",
|
||||||
|
"md5sum": "008a8fc6b0b1e5f11a3e7fd6f22ba349",
|
||||||
|
"filesize": 72192,
|
||||||
|
"download_url": "https://store.innovaphone.com/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "ipva-qemu-disk3-14r2.vmdk",
|
||||||
|
"version": "14r2",
|
||||||
|
"md5sum": "20516731c480e2112b3fb4a4d7f514f2",
|
||||||
|
"filesize": 68096,
|
||||||
|
"download_url": "https://store.innovaphone.com/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "ipva-qemu-disk4-14r2.vmdk",
|
||||||
|
"version": "14r2",
|
||||||
|
"md5sum": "15d7d79ef8c28bd29b2eceac8405f964",
|
||||||
|
"filesize": 68096,
|
||||||
|
"download_url": "https://store.innovaphone.com/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "ipva-qemu-disk1-14r2.vmdk",
|
||||||
|
"hdb_disk_image": "ipva-qemu-disk2-14r2.vmdk",
|
||||||
|
"hdc_disk_image": "ipva-qemu-disk3-14r2.vmdk",
|
||||||
|
"hdd_disk_image": "ipva-qemu-disk4-14r2.vmdk"
|
||||||
|
},
|
||||||
|
"name": "14r2"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
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": "ge-0/0/0",
|
||||||
|
"port_name_format": "ge-0/0/{port0}",
|
||||||
|
"qemu": {
|
||||||
|
"adapter_type": "virtio-net-pci",
|
||||||
|
"adapters": 17,
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
52
gns3server/appliances/nixos.gns3a
Normal file
52
gns3server/appliances/nixos.gns3a
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
{
|
||||||
|
"appliance_id": "00714342-14b2-4281-aa20-9043ca8dc26e",
|
||||||
|
"name": "NixOS",
|
||||||
|
"category": "guest",
|
||||||
|
"description": "NixOS QEMU Appliance for images created with nixos-generator. Automatically sets hostname based on vmname.",
|
||||||
|
"vendor_name": "NixOS",
|
||||||
|
"vendor_url": "https://nixos.org/",
|
||||||
|
"vendor_logo_url": "https://avatars.githubusercontent.com/u/487568",
|
||||||
|
"documentation_url": "https://github.com/ob7/gns3-nixos-appliance",
|
||||||
|
"product_name": "NixOS",
|
||||||
|
"product_url": "https://github.com/NixOS/nixpkgs",
|
||||||
|
"registry_version": 4,
|
||||||
|
"status": "experimental",
|
||||||
|
"availability": "free",
|
||||||
|
"maintainer": "ob7dev",
|
||||||
|
"maintainer_email": "dev@ob7.us",
|
||||||
|
"usage": "For custom NixOS images, create qcow2 VM with: nixos-generate -f qcow -c ./server.nix Import it into GNS3 as image. VM name is passed into QEMU guest with Advanced Options field entry: -fw_cfg name=opt/vm_hostname,string=%vm-name%",
|
||||||
|
"symbol": ":/symbols/affinity/circle/gray/template.svg",
|
||||||
|
"first_port_name": "eth0",
|
||||||
|
"port_name_format": "eth{0}",
|
||||||
|
"qemu": {
|
||||||
|
"adapter_type": "e1000",
|
||||||
|
"adapters": 4,
|
||||||
|
"ram": 256,
|
||||||
|
"cpus": 1,
|
||||||
|
"hda_disk_interface": "ide",
|
||||||
|
"arch": "x86_64",
|
||||||
|
"console_type": "telnet",
|
||||||
|
"kvm": "allow",
|
||||||
|
"options": "-fw_cfg name=opt/vm_hostname,string=%vm-name%",
|
||||||
|
"on_close": "power_off"
|
||||||
|
},
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "nixos-24-11.qcow2",
|
||||||
|
"version": "24.11",
|
||||||
|
"md5sum": "2459f05136836dd430402d75cba0f205",
|
||||||
|
"download_url": "https://github.com/nix-community/nixos-generators",
|
||||||
|
"filesize": 1749483520,
|
||||||
|
"download_url": "https://f.ob7.us/gns3/",
|
||||||
|
"direct_download_url": "http://ob7.us/nixos-24-11.qcow2"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "24.11",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "nixos-24-11.qcow2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -26,6 +26,14 @@
|
|||||||
"options": "-cpu host -nographic"
|
"options": "-cpu host -nographic"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "OL9U5_x86_64-kvm-b259.qcow2",
|
||||||
|
"version": "9.5",
|
||||||
|
"md5sum": "05e9b62c408ab49a02d6833fc683d1ad",
|
||||||
|
"filesize": 652935168,
|
||||||
|
"download_url": "https://yum.oracle.com/oracle-linux-templates.html",
|
||||||
|
"direct_download_url": "https://yum.oracle.com/templates/OracleLinux/OL9/u5/x86_64/OL9U5_x86_64-kvm-b259.qcow2"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "OL9U2_x86_64-kvm-b197.qcow",
|
"filename": "OL9U2_x86_64-kvm-b197.qcow",
|
||||||
"version": "9.2",
|
"version": "9.2",
|
||||||
@ -42,6 +50,14 @@
|
|||||||
"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/u1/x86_64/OL9U1_x86_64-kvm-b158.qcow"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"filename": "OL8U10_x86_64-kvm-b258.qcow2",
|
||||||
|
"version": "8.10",
|
||||||
|
"md5sum": "bb07581af5122515b6822595ded5deef",
|
||||||
|
"filesize": 1251672064,
|
||||||
|
"download_url": "https://yum.oracle.com/oracle-linux-templates.html",
|
||||||
|
"direct_download_url": "https://yum.oracle.com/templates/OracleLinux/OL8/u10/x86_64/OL8U10_x86_64-kvm-b258.qcow2"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "OL8U8_x86_64-kvm-b198.qcow",
|
"filename": "OL8U8_x86_64-kvm-b198.qcow",
|
||||||
"version": "8.8",
|
"version": "8.8",
|
||||||
@ -76,7 +92,14 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
|
"name": "9.5",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "OL9U5_x86_64-kvm-b259.qcow2",
|
||||||
|
"cdrom_image": "oracle-cloud-init-data.iso"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
"name": "9.2",
|
"name": "9.2",
|
||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "OL9U2_x86_64-kvm-b197.qcow",
|
"hda_disk_image": "OL9U2_x86_64-kvm-b197.qcow",
|
||||||
@ -90,6 +113,13 @@
|
|||||||
"cdrom_image": "oracle-cloud-init-data.iso"
|
"cdrom_image": "oracle-cloud-init-data.iso"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "8.10",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "OL8U10_x86_64-kvm-b258.qcow2",
|
||||||
|
"cdrom_image": "oracle-cloud-init-data.iso"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "8.8",
|
"name": "8.8",
|
||||||
"images": {
|
"images": {
|
||||||
|
@ -24,6 +24,13 @@
|
|||||||
"process_priority": "normal"
|
"process_priority": "normal"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "pfSense-CE-2.7.2-RELEASE-amd64.iso",
|
||||||
|
"version": "2.7.2",
|
||||||
|
"md5sum": "50c3e723d68ec74d038041a34fa846f8",
|
||||||
|
"filesize": 874672128,
|
||||||
|
"download_url": "https://www.pfsense.org/download/mirror.php?section=downloads"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "pfSense-CE-2.7.0-RELEASE-amd64.iso",
|
"filename": "pfSense-CE-2.7.0-RELEASE-amd64.iso",
|
||||||
"version": "2.7.0",
|
"version": "2.7.0",
|
||||||
@ -76,6 +83,13 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "2.7.2",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "empty100G.qcow2",
|
||||||
|
"cdrom_image": "pfSense-CE-2.7.2-RELEASE-amd64.iso"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "2.7.0",
|
"name": "2.7.0",
|
||||||
"images": {
|
"images": {
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
"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/479/ver=/rhel---9/9.5/x86_64/product-software 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,
|
||||||
@ -26,6 +26,20 @@
|
|||||||
"options": "-cpu host -nographic"
|
"options": "-cpu host -nographic"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "rhel-9.5-x86_64-kvm.qcow2",
|
||||||
|
"version": "9.5",
|
||||||
|
"md5sum": "8174396d5cb47727c59dd04dd9a05418",
|
||||||
|
"filesize": 974389248,
|
||||||
|
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---9/9.5/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-9.3-x86_64-kvm.qcow2",
|
"filename": "rhel-9.3-x86_64-kvm.qcow2",
|
||||||
"version": "9.3",
|
"version": "9.3",
|
||||||
@ -54,6 +68,20 @@
|
|||||||
"filesize": 696582144,
|
"filesize": 696582144,
|
||||||
"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---8/9.0/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.9-x86_64-kvm.qcow2",
|
||||||
|
"version": "8.9",
|
||||||
|
"md5sum": "23295fe508678cbdebfbdbd41ef6e6e2",
|
||||||
|
"filesize": 971833344,
|
||||||
|
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/8.9/x86_64/product-software"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "rhel-8.8-x86_64-kvm.qcow2",
|
"filename": "rhel-8.8-x86_64-kvm.qcow2",
|
||||||
"version": "8.8",
|
"version": "8.8",
|
||||||
@ -119,6 +147,20 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "9.5",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "rhel-9.5-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": "9.3",
|
"name": "9.3",
|
||||||
"images": {
|
"images": {
|
||||||
@ -147,6 +189,20 @@
|
|||||||
"cdrom_image": "rhel-cloud-init.iso"
|
"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"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "8.9",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "rhel-8.9-x86_64-kvm.qcow2",
|
||||||
|
"cdrom_image": "rhel-cloud-init.iso"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "8.8",
|
"name": "8.8",
|
||||||
"images": {
|
"images": {
|
||||||
|
@ -26,6 +26,14 @@
|
|||||||
"options": "-nographic -cpu host"
|
"options": "-nographic -cpu host"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"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 +76,13 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"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": {
|
||||||
|
50
gns3server/appliances/stormshield-eva.gns3a
Normal file
50
gns3server/appliances/stormshield-eva.gns3a
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
"appliance_id": "60801097-332e-4f40-a63e-8ad62047c01f",
|
||||||
|
"name": "Stormshield EVA",
|
||||||
|
"category": "firewall",
|
||||||
|
"description": "Stormshield EVA (Elastic Virtual Appliance) is a french virtual firewall designed to protect network infrastructures. It offers advanced features such as filtering, intrusion prevention (IPS), VPN management (IPSec/SSL), and access control.",
|
||||||
|
"vendor_name": "Stormshield",
|
||||||
|
"vendor_url": "https://www.stormshield.com/",
|
||||||
|
"vendor_logo_url": "https://www.stormshield.com/wp-content/uploads/stormshield-logo.png",
|
||||||
|
"documentation_url": "https://www.stormshield.com/fr/ressourcescenter/network-security-elastic-virtual-appliances/",
|
||||||
|
"product_name": "Stormshield EVA",
|
||||||
|
"product_url": "https://www.stormshield.com/fr/produits-et-services/produits/protection-des-reseaux/nos-produits/appliances-virtuelles/",
|
||||||
|
"registry_version": 4,
|
||||||
|
"status": "stable",
|
||||||
|
"availability": "service-contract",
|
||||||
|
"maintainer": "Samy SCANNA",
|
||||||
|
"maintainer_email": "samy.scanna@outlook.com",
|
||||||
|
"usage": "After the first boot, the appliance automatically runs the configuration script to set up the password, and network interfaces.",
|
||||||
|
"symbol": "stormshield.png",
|
||||||
|
"port_name_format": "port{port1}",
|
||||||
|
"qemu": {
|
||||||
|
"adapter_type": "vmxnet3",
|
||||||
|
"adapters": 8,
|
||||||
|
"ram": 2048,
|
||||||
|
"cpus": 1,
|
||||||
|
"hda_disk_interface": "scsi",
|
||||||
|
"arch": "x86_64",
|
||||||
|
"console_type": "telnet",
|
||||||
|
"kvm": "allow",
|
||||||
|
"options": "-serial stdio",
|
||||||
|
"on_close": "shutdown_signal",
|
||||||
|
"process_priority": "normal"
|
||||||
|
},
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "utm-SNS-EVA-4.3.33-kvm.qcow2",
|
||||||
|
"version": "4.3.33",
|
||||||
|
"md5sum": "21d94d0e20f2e270f06c5853fd750d5b",
|
||||||
|
"filesize": 284360704,
|
||||||
|
"download_url": "https://mystormshield.eu/product/download/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "utm-SNS-EVA-4.3.33-kvm.qcow2"
|
||||||
|
},
|
||||||
|
"name": "4.3.33"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -10,8 +10,8 @@
|
|||||||
"product_url": "http://www.cisco.com/",
|
"product_url": "http://www.cisco.com/",
|
||||||
"registry_version": 4,
|
"registry_version": 4,
|
||||||
"status": "experimental",
|
"status": "experimental",
|
||||||
"maintainer": "Laurent LEVIER",
|
"maintainer": "Christopher Uhrig",
|
||||||
"maintainer_email": "laurent.levier@orange.com",
|
"maintainer_email": "christopher.uhrig@telekom.de",
|
||||||
"usage": "Initial username is admin, password is admin as well.",
|
"usage": "Initial username is admin, password is admin as well.",
|
||||||
"first_port_name": "Management0/0",
|
"first_port_name": "Management0/0",
|
||||||
"port_name_format": "Ge0/{0}",
|
"port_name_format": "Ge0/{0}",
|
||||||
@ -39,6 +39,20 @@
|
|||||||
"md5sum": "4aa487101d4cdc390f53a6e8b6f45ca7",
|
"md5sum": "4aa487101d4cdc390f53a6e8b6f45ca7",
|
||||||
"filesize": 328400896,
|
"filesize": 328400896,
|
||||||
"download_url": "http://www.cisco.com/"
|
"download_url": "http://www.cisco.com/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "viptela-edge-20.9.5.1-genericx86-64.qcow2",
|
||||||
|
"version": "20.9.5.1",
|
||||||
|
"md5sum": "41d9e981908fd83695de78d6ca5794bd",
|
||||||
|
"filesize": 409468928,
|
||||||
|
"download_url": "https://software.cisco.com/download/home/286320995/type/286321047/release/20.9.5.1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "viptela-edge-20.12.4-genericx86-64.qcow2",
|
||||||
|
"version": "20.12.4",
|
||||||
|
"md5sum": "9f1aedada5e632c7bc29a51c004f4486",
|
||||||
|
"filesize": 411762688,
|
||||||
|
"download_url": "https://software.cisco.com/download/home/286320995/type/286321047/release/20.12.4"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
@ -53,6 +67,18 @@
|
|||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "viptela-edge-genericx86-64.qcow2"
|
"hda_disk_image": "viptela-edge-genericx86-64.qcow2"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "20.9.5.1",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "viptela-edge-20.9.5.1-genericx86-64.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "20.12.4",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "viptela-edge-20.12.4-genericx86-64.qcow2"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,20 @@
|
|||||||
"options": "-smp 2,maxcpus=2 -cpu host"
|
"options": "-smp 2,maxcpus=2 -cpu host"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "viptela-smart-20.12.4-genericx86-64.qcow2",
|
||||||
|
"version": "20.12.4",
|
||||||
|
"md5sum": "0e7b6468498a89195ab815260bc4cfb6",
|
||||||
|
"filesize": 411762688,
|
||||||
|
"download_url": "https://software.cisco.com/download/home/286320995/type/286321043/release/20.12.4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "viptela-smart-20.9.5.1-genericx86-64.qcow2",
|
||||||
|
"version": "20.9.5.1",
|
||||||
|
"md5sum": "08e105778bb68f8f24f323dfd263a91a",
|
||||||
|
"filesize": 409468928,
|
||||||
|
"download_url": "https://software.cisco.com/download/home/286320995/type/286321043/release/20.9.5.1"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"filename": "viptela-smart-19.2.0-genericx86-64.qcow2",
|
"filename": "viptela-smart-19.2.0-genericx86-64.qcow2",
|
||||||
"version": "19.2.0",
|
"version": "19.2.0",
|
||||||
@ -31,7 +45,7 @@
|
|||||||
"filesize": 328400896,
|
"filesize": 328400896,
|
||||||
"download_url": "http://www.cisco.com/"
|
"download_url": "http://www.cisco.com/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "viptela-smart-genericx86-64-disk1.vmdk",
|
"filename": "viptela-smart-genericx86-64-disk1.vmdk",
|
||||||
"version": "18.3.7",
|
"version": "18.3.7",
|
||||||
"md5sum": "ab9b06c212319336810a4b336ec3dd96",
|
"md5sum": "ab9b06c212319336810a4b336ec3dd96",
|
||||||
@ -51,6 +65,18 @@
|
|||||||
"images": {
|
"images": {
|
||||||
"hda_disk_image": "viptela-smart-19.2.0-genericx86-64.qcow2"
|
"hda_disk_image": "viptela-smart-19.2.0-genericx86-64.qcow2"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "20.9.5.1",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "viptela-smart-20.9.5.1-genericx86-64.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "20.12.4",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "viptela-smart-20.12.4-genericx86-64.qcow2"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -10,8 +10,8 @@
|
|||||||
"product_url": "http://www.cisco.com/",
|
"product_url": "http://www.cisco.com/",
|
||||||
"registry_version": 4,
|
"registry_version": 4,
|
||||||
"status": "experimental",
|
"status": "experimental",
|
||||||
"maintainer": "Laurent LEVIER",
|
"maintainer": "Christopher Uhrig",
|
||||||
"maintainer_email": "laurent.levier@orange.com",
|
"maintainer_email": "christopher.uhrig@telekom.de",
|
||||||
"usage": "Initial username is admin, password is admin as well.",
|
"usage": "Initial username is admin, password is admin as well.",
|
||||||
"qemu": {
|
"qemu": {
|
||||||
"adapter_type": "vmxnet3",
|
"adapter_type": "vmxnet3",
|
||||||
@ -25,14 +25,28 @@
|
|||||||
"options": "-cpu host -smp 2,maxcpus=2"
|
"options": "-cpu host -smp 2,maxcpus=2"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
{
|
{
|
||||||
|
"filename": "viptela-vmanage-20.12.4-genericx86-64.qcow2",
|
||||||
|
"version": "20.12.4",
|
||||||
|
"md5sum": "4e0d4c379623c495a0bb671a76a12f9f",
|
||||||
|
"filesize": 4951375872,
|
||||||
|
"download_url": "https://software.cisco.com/download/home/286320995/type/286321039/release/20.12.4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "viptela-vmanage-20.9.5.2-genericx86-64.qcow2",
|
||||||
|
"version": "20.9.5.2",
|
||||||
|
"md5sum": "a8a4ebee0274541200f4fe94a739d454",
|
||||||
|
"filesize": 3133865984,
|
||||||
|
"download_url": "https://software.cisco.com/download/home/286320995/type/286321039/release/20.9.5.2"
|
||||||
|
},
|
||||||
|
{
|
||||||
"filename": "viptela-vmanage-19.2.0-genericx86-64.qcow2",
|
"filename": "viptela-vmanage-19.2.0-genericx86-64.qcow2",
|
||||||
"version": "19.2.0",
|
"version": "19.2.0",
|
||||||
"md5sum": "27ef126f178c6c929a36ad2cf6ed8db7",
|
"md5sum": "27ef126f178c6c929a36ad2cf6ed8db7",
|
||||||
"filesize": 1185349632,
|
"filesize": 1185349632,
|
||||||
"download_url": "http://www.cisco.com/"
|
"download_url": "http://www.cisco.com/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename": "viptela-vmanage-genericx86-64-disk1.vmdk",
|
"filename": "viptela-vmanage-genericx86-64-disk1.vmdk",
|
||||||
"version": "18.3.7",
|
"version": "18.3.7",
|
||||||
"md5sum": "2290c6467c907d9ca9c65793fe898716",
|
"md5sum": "2290c6467c907d9ca9c65793fe898716",
|
||||||
@ -55,6 +69,20 @@
|
|||||||
"hda_disk_image": "viptela-vmanage-19.2.0-genericx86-64.qcow2",
|
"hda_disk_image": "viptela-vmanage-19.2.0-genericx86-64.qcow2",
|
||||||
"hdb_disk_image": "empty30G.qcow2"
|
"hdb_disk_image": "empty30G.qcow2"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "20.12.4",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "viptela-vmanage-20.12.4-genericx86-64.qcow2",
|
||||||
|
"hdb_disk_image": "empty30G.qcow2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "20.9.5.2",
|
||||||
|
"images": {
|
||||||
|
"hda_disk_image": "viptela-vmanage-20.9.5.2-genericx86-64.qcow2",
|
||||||
|
"hdb_disk_image": "empty30G.qcow2"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "18.3.7",
|
"name": "18.3.7",
|
||||||
|
@ -30,6 +30,13 @@
|
|||||||
"on_close": "shutdown_signal"
|
"on_close": "shutdown_signal"
|
||||||
},
|
},
|
||||||
"images": [
|
"images": [
|
||||||
|
{
|
||||||
|
"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",
|
||||||
@ -109,6 +116,12 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"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": {
|
||||||
|
@ -406,13 +406,11 @@ class BaseNode:
|
|||||||
Stops the telnet proxy.
|
Stops the telnet proxy.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if self._wrapper_telnet_server:
|
if self._wrap_console_writer:
|
||||||
self._wrap_console_writer.close()
|
self._wrap_console_writer.close()
|
||||||
if sys.version_info >= (3, 7, 0):
|
await self._wrap_console_writer.wait_closed()
|
||||||
try:
|
self._wrap_console_writer = None
|
||||||
await self._wrap_console_writer.wait_closed()
|
if self._wrapper_telnet_server:
|
||||||
except ConnectionResetError:
|
|
||||||
pass
|
|
||||||
self._wrapper_telnet_server.close()
|
self._wrapper_telnet_server.close()
|
||||||
await self._wrapper_telnet_server.wait_closed()
|
await self._wrapper_telnet_server.wait_closed()
|
||||||
self._wrapper_telnet_server = None
|
self._wrapper_telnet_server = None
|
||||||
@ -662,6 +660,7 @@ class BaseNode:
|
|||||||
path = shutil.which(path)
|
path = shutil.which(path)
|
||||||
return path
|
return path
|
||||||
|
|
||||||
|
@locking
|
||||||
async def _ubridge_send(self, command):
|
async def _ubridge_send(self, command):
|
||||||
"""
|
"""
|
||||||
Sends a command to uBridge hypervisor.
|
Sends a command to uBridge hypervisor.
|
||||||
|
@ -173,11 +173,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
|
||||||
|
|
||||||
@ -261,21 +260,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
|
||||||
|
@ -365,7 +365,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()
|
||||||
|
|
||||||
@ -383,8 +383,8 @@ class DockerVM(BaseNode):
|
|||||||
"CapAdd": ["ALL"],
|
"CapAdd": ["ALL"],
|
||||||
"Privileged": True,
|
"Privileged": True,
|
||||||
"Binds": self._mount_binds(image_infos),
|
"Binds": self._mount_binds(image_infos),
|
||||||
|
"UsernsMode": "host",
|
||||||
},
|
},
|
||||||
"UsernsMode": "host",
|
|
||||||
"Volumes": {},
|
"Volumes": {},
|
||||||
"Env": ["container=docker"], # Systemd compliant: https://github.com/GNS3/gns3-server/issues/573
|
"Env": ["container=docker"], # Systemd compliant: https://github.com/GNS3/gns3-server/issues/573
|
||||||
"Cmd": [],
|
"Cmd": [],
|
||||||
@ -522,6 +522,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)
|
||||||
@ -710,7 +711,10 @@ class DockerVM(BaseNode):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# resize the container TTY.
|
# resize the container TTY.
|
||||||
await self._manager.query("POST", "containers/{}/resize?h={}&w={}".format(self._cid, rows, columns))
|
try:
|
||||||
|
await self._manager.query("POST", "containers/{}/resize?h={}&w={}".format(self._cid, rows, columns))
|
||||||
|
except DockerError as e:
|
||||||
|
log.warning(f"Could not resize the container TTY: {e}")
|
||||||
|
|
||||||
async def _start_console(self):
|
async def _start_console(self):
|
||||||
"""
|
"""
|
||||||
|
@ -25,7 +25,7 @@ PATH=/gns3/bin:/tmp/gns3/bin:/sbin:$PATH
|
|||||||
# bootstrap busybox commands
|
# bootstrap busybox commands
|
||||||
if [ ! -d /tmp/gns3/bin ]; then
|
if [ ! -d /tmp/gns3/bin ]; then
|
||||||
busybox mkdir -p /tmp/gns3/bin
|
busybox mkdir -p /tmp/gns3/bin
|
||||||
for applet in `busybox --list-full`
|
for applet in `busybox --list`
|
||||||
do
|
do
|
||||||
ln -s /gns3/bin/busybox "/tmp/gns3/bin/$applet"
|
ln -s /gns3/bin/busybox "/tmp/gns3/bin/$applet"
|
||||||
done
|
done
|
||||||
|
@ -390,14 +390,16 @@ class IOUVM(BaseNode):
|
|||||||
raise IOUError("The following shared library dependencies cannot be found for IOU image {}: {}".format(self._path,
|
raise IOUError("The following shared library dependencies cannot be found for IOU image {}: {}".format(self._path,
|
||||||
", ".join(missing_libs)))
|
", ".join(missing_libs)))
|
||||||
|
|
||||||
async def _check_iou_licence(self):
|
def _is_iou_license_check_enabled(self):
|
||||||
"""
|
"""
|
||||||
Checks for a valid IOU key in the iourc file (paranoid mode).
|
Returns if IOU license check is enabled.
|
||||||
|
|
||||||
|
:return: boolean
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# license check is sent by the controller
|
# license check is sent by the controller
|
||||||
if self.license_check is False:
|
if self.license_check is False:
|
||||||
return
|
return False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# we allow license check to be disabled server wide
|
# we allow license check to be disabled server wide
|
||||||
@ -407,7 +409,14 @@ class IOUVM(BaseNode):
|
|||||||
|
|
||||||
if server_wide_license_check is False:
|
if server_wide_license_check is False:
|
||||||
log.warning("License check is explicitly disabled on this server")
|
log.warning("License check is explicitly disabled on this server")
|
||||||
return
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
async def _check_iou_license(self):
|
||||||
|
"""
|
||||||
|
Checks for a valid IOU key in the iourc file (paranoid mode).
|
||||||
|
"""
|
||||||
|
|
||||||
config = configparser.ConfigParser()
|
config = configparser.ConfigParser()
|
||||||
try:
|
try:
|
||||||
@ -511,15 +520,16 @@ class IOUVM(BaseNode):
|
|||||||
except OSError as e:
|
except OSError as e:
|
||||||
raise IOUError("Could not rename nvram files: {}".format(e))
|
raise IOUError("Could not rename nvram files: {}".format(e))
|
||||||
|
|
||||||
iourc_path = self.iourc_path
|
iourc_path = None
|
||||||
if not iourc_path:
|
if self._is_iou_license_check_enabled():
|
||||||
raise IOUError("Could not find an iourc file (IOU license), please configure an IOU license")
|
iourc_path = self.iourc_path
|
||||||
if not os.path.isfile(iourc_path):
|
if not iourc_path:
|
||||||
raise IOUError("The iourc path '{}' is not a regular file".format(iourc_path))
|
raise IOUError("Could not find an iourc file (IOU license), please configure an IOU license")
|
||||||
|
if not os.path.isfile(iourc_path):
|
||||||
|
raise IOUError("The iourc path '{}' is not a regular file".format(iourc_path))
|
||||||
|
await self._check_iou_license()
|
||||||
|
|
||||||
await self._check_iou_licence()
|
|
||||||
await self._start_ubridge()
|
await self._start_ubridge()
|
||||||
|
|
||||||
self._create_netmap_config()
|
self._create_netmap_config()
|
||||||
if self.use_default_iou_values:
|
if self.use_default_iou_values:
|
||||||
# make sure we have the default nvram amount to correctly push the configs
|
# make sure we have the default nvram amount to correctly push the configs
|
||||||
@ -531,7 +541,7 @@ class IOUVM(BaseNode):
|
|||||||
|
|
||||||
self._nvram_watcher = FileWatcher(self._nvram_file(), self._nvram_changed, delay=2)
|
self._nvram_watcher = FileWatcher(self._nvram_file(), self._nvram_changed, delay=2)
|
||||||
|
|
||||||
# created a environment variable pointing to the iourc file.
|
# created an environment variable pointing to the iourc file.
|
||||||
env = os.environ.copy()
|
env = os.environ.copy()
|
||||||
if "IOURC" not in os.environ and iourc_path:
|
if "IOURC" not in os.environ and iourc_path:
|
||||||
env["IOURC"] = iourc_path
|
env["IOURC"] = iourc_path
|
||||||
|
@ -33,6 +33,7 @@ import gns3server
|
|||||||
import subprocess
|
import subprocess
|
||||||
import time
|
import time
|
||||||
import json
|
import json
|
||||||
|
import psutil
|
||||||
|
|
||||||
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
|
||||||
@ -1166,6 +1167,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 +1194,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):
|
||||||
"""
|
"""
|
||||||
@ -1915,11 +1941,6 @@ class QemuVM(BaseNode):
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
interface = getattr(self, "hd{}_disk_interface".format(drive))
|
interface = getattr(self, "hd{}_disk_interface".format(drive))
|
||||||
# fail-safe: use "ide" if there is a disk image and no interface type has been explicitly configured
|
|
||||||
if interface == "none":
|
|
||||||
interface = "ide"
|
|
||||||
setattr(self, "hd{}_disk_interface".format(drive), interface)
|
|
||||||
|
|
||||||
disk_name = "hd" + drive
|
disk_name = "hd" + drive
|
||||||
if not os.path.isfile(disk_image) or not os.path.exists(disk_image):
|
if not os.path.isfile(disk_image) or not os.path.exists(disk_image):
|
||||||
if os.path.islink(disk_image):
|
if os.path.islink(disk_image):
|
||||||
@ -2034,19 +2055,42 @@ 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_path = self.manager.get_abs_image_path("OVMF_CODE.fd")
|
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:
|
||||||
|
system_ovmf_firmware_path = "/usr/share/OVMF/OVMF_CODE_4M.fd"
|
||||||
|
if os.path.exists(system_ovmf_firmware_path):
|
||||||
|
ovmf_firmware_path = 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
|
||||||
|
system_ovmf_vars_path = "/usr/share/OVMF/OVMF_VARS_4M.fd"
|
||||||
|
if os.path.exists(system_ovmf_vars_path):
|
||||||
|
ovmf_vars_path = 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)])
|
||||||
return options
|
return options
|
||||||
|
|
||||||
|
@ -218,28 +218,45 @@ class VirtualBoxVM(BaseNode):
|
|||||||
"""
|
"""
|
||||||
Fix the VM uuid in the case of linked clone
|
Fix the VM uuid in the case of linked clone
|
||||||
"""
|
"""
|
||||||
if os.path.exists(self._linked_vbox_file()):
|
|
||||||
try:
|
|
||||||
tree = ET.parse(self._linked_vbox_file())
|
|
||||||
except ET.ParseError:
|
|
||||||
raise VirtualBoxError("Cannot modify VirtualBox linked nodes file. "
|
|
||||||
"File {} is corrupted.".format(self._linked_vbox_file()))
|
|
||||||
except OSError as e:
|
|
||||||
raise VirtualBoxError("Cannot modify VirtualBox linked nodes file '{}': {}".format(self._linked_vbox_file(), e))
|
|
||||||
|
|
||||||
machine = tree.getroot().find("{http://www.virtualbox.org/}Machine")
|
linked_vbox_file = self._linked_vbox_file()
|
||||||
if machine is not None and machine.get("uuid") != "{" + self.id + "}":
|
if not os.path.exists(linked_vbox_file):
|
||||||
|
raise VirtualBoxError("Cannot find VirtualBox linked node file: {}".format(linked_vbox_file))
|
||||||
|
|
||||||
for image in tree.getroot().findall("{http://www.virtualbox.org/}Image"):
|
try:
|
||||||
currentSnapshot = machine.get("currentSnapshot")
|
tree = ET.parse(linked_vbox_file)
|
||||||
if currentSnapshot:
|
except ET.ParseError:
|
||||||
newSnapshot = re.sub(r"\{.*\}", "{" + str(uuid.uuid4()) + "}", currentSnapshot)
|
raise VirtualBoxError("Cannot modify VirtualBox linked node file. "
|
||||||
shutil.move(os.path.join(self.working_dir, self._vmname, "Snapshots", currentSnapshot) + ".vdi",
|
"File {} is corrupted.".format(linked_vbox_file))
|
||||||
os.path.join(self.working_dir, self._vmname, "Snapshots", newSnapshot) + ".vdi")
|
except OSError as e:
|
||||||
image.set("uuid", newSnapshot)
|
raise VirtualBoxError("Cannot modify VirtualBox linked node file '{}': {}".format(linked_vbox_file, e))
|
||||||
|
|
||||||
machine.set("uuid", "{" + self.id + "}")
|
machine = tree.getroot().find("{http://www.virtualbox.org/}Machine")
|
||||||
tree.write(self._linked_vbox_file())
|
if machine is not None and machine.get("uuid") != "{" + self.id + "}":
|
||||||
|
|
||||||
|
for image in tree.getroot().findall("{http://www.virtualbox.org/}Image"):
|
||||||
|
currentSnapshot = machine.get("currentSnapshot")
|
||||||
|
if currentSnapshot:
|
||||||
|
newSnapshot = re.sub(r"\{.*\}", "{" + str(uuid.uuid4()) + "}", currentSnapshot)
|
||||||
|
shutil.move(
|
||||||
|
os.path.join(self.working_dir, self._vmname, "Snapshots", currentSnapshot) + ".vdi",
|
||||||
|
os.path.join(self.working_dir, self._vmname, "Snapshots", newSnapshot) + ".vdi"
|
||||||
|
)
|
||||||
|
log.info("VirtualBox VM '{name}' [{id}] snapshot file moved from '{current}' to '{new}'".format(
|
||||||
|
name=self.name,
|
||||||
|
id=self.id,
|
||||||
|
current=currentSnapshot,
|
||||||
|
new=newSnapshot,
|
||||||
|
))
|
||||||
|
image.set("uuid", newSnapshot)
|
||||||
|
|
||||||
|
log.info("VirtualBox VM '{name}' [{id}] '{vbox_file}' has been patched".format(
|
||||||
|
name=self.name,
|
||||||
|
id=self.id,
|
||||||
|
vbox_file=linked_vbox_file,
|
||||||
|
))
|
||||||
|
machine.set("uuid", "{" + self.id + "}")
|
||||||
|
tree.write(linked_vbox_file)
|
||||||
|
|
||||||
async def check_hw_virtualization(self):
|
async def check_hw_virtualization(self):
|
||||||
"""
|
"""
|
||||||
@ -458,7 +475,7 @@ class VirtualBoxVM(BaseNode):
|
|||||||
|
|
||||||
async def save_linked_hdds_info(self):
|
async def save_linked_hdds_info(self):
|
||||||
"""
|
"""
|
||||||
Save linked cloned hard disks information.
|
Save linked cloned hard disk information.
|
||||||
|
|
||||||
:returns: disk table information
|
:returns: disk table information
|
||||||
"""
|
"""
|
||||||
|
@ -29,7 +29,7 @@ except ImportError:
|
|||||||
from importlib import resources as importlib_resources
|
from importlib import resources as importlib_resources
|
||||||
|
|
||||||
from ..config import Config
|
from ..config import Config
|
||||||
from ..utils import parse_version
|
from ..utils import parse_version, md5sum
|
||||||
from ..utils.images import default_images_directory
|
from ..utils.images import default_images_directory
|
||||||
|
|
||||||
from .project import Project
|
from .project import Project
|
||||||
@ -289,12 +289,21 @@ class Controller:
|
|||||||
except OSError as e:
|
except OSError as e:
|
||||||
log.error(str(e))
|
log.error(str(e))
|
||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def install_resource_files(dst_path, resource_name):
|
def install_resource_files(dst_path, resource_name, upgrade_resources=True):
|
||||||
"""
|
"""
|
||||||
Install files from resources to user's file system
|
Install files from resources to user's file system
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
def should_copy(src, dst, upgrade_resources):
|
||||||
|
if not os.path.exists(dst):
|
||||||
|
return True
|
||||||
|
if upgrade_resources is False:
|
||||||
|
return False
|
||||||
|
# copy the resource if it is different
|
||||||
|
return md5sum(src) != md5sum(dst)
|
||||||
|
|
||||||
if hasattr(sys, "frozen") and sys.platform.startswith("win"):
|
if hasattr(sys, "frozen") and sys.platform.startswith("win"):
|
||||||
resource_path = os.path.normpath(os.path.join(os.path.dirname(sys.executable), resource_name))
|
resource_path = os.path.normpath(os.path.join(os.path.dirname(sys.executable), resource_name))
|
||||||
for filename in os.listdir(resource_path):
|
for filename in os.listdir(resource_path):
|
||||||
@ -303,7 +312,7 @@ class Controller:
|
|||||||
else:
|
else:
|
||||||
for entry in importlib_resources.files('gns3server').joinpath(resource_name).iterdir():
|
for entry in importlib_resources.files('gns3server').joinpath(resource_name).iterdir():
|
||||||
full_path = os.path.join(dst_path, entry.name)
|
full_path = os.path.join(dst_path, entry.name)
|
||||||
if entry.is_file() and not os.path.exists(full_path):
|
if entry.is_file() and should_copy(str(entry), full_path, upgrade_resources):
|
||||||
log.debug(f'Installing {resource_name} resource file "{entry.name}" to "{full_path}"')
|
log.debug(f'Installing {resource_name} resource file "{entry.name}" to "{full_path}"')
|
||||||
shutil.copy(str(entry), os.path.join(dst_path, entry.name))
|
shutil.copy(str(entry), os.path.join(dst_path, entry.name))
|
||||||
elif entry.is_dir():
|
elif entry.is_dir():
|
||||||
@ -319,7 +328,7 @@ class Controller:
|
|||||||
dst_path = self.configs_path()
|
dst_path = self.configs_path()
|
||||||
log.info(f"Installing base configs in '{dst_path}'")
|
log.info(f"Installing base configs in '{dst_path}'")
|
||||||
try:
|
try:
|
||||||
Controller.install_resource_files(dst_path, "configs")
|
Controller.install_resource_files(dst_path, "configs", upgrade_resources=False)
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
log.error(f"Could not install base config files to {dst_path}: {e}")
|
log.error(f"Could not install base config files to {dst_path}: {e}")
|
||||||
|
|
||||||
@ -332,7 +341,7 @@ class Controller:
|
|||||||
dst_path = self.disks_path()
|
dst_path = self.disks_path()
|
||||||
log.info(f"Installing built-in disks in '{dst_path}'")
|
log.info(f"Installing built-in disks in '{dst_path}'")
|
||||||
try:
|
try:
|
||||||
Controller.install_resource_files(dst_path, "disks")
|
Controller.install_resource_files(dst_path, "disks", upgrade_resources=False)
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
log.error(f"Could not install disk files to {dst_path}: {e}")
|
log.error(f"Could not install disk files to {dst_path}: {e}")
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ class ApplianceManager:
|
|||||||
os.makedirs(appliances_path, exist_ok=True)
|
os.makedirs(appliances_path, exist_ok=True)
|
||||||
return appliances_path
|
return appliances_path
|
||||||
|
|
||||||
def builtin_appliances_path(self, delete_first=False):
|
def builtin_appliances_path(self):
|
||||||
"""
|
"""
|
||||||
Get the built-in appliance storage directory
|
Get the built-in appliance storage directory
|
||||||
"""
|
"""
|
||||||
@ -91,8 +91,6 @@ class ApplianceManager:
|
|||||||
appname = vendor = "GNS3"
|
appname = vendor = "GNS3"
|
||||||
resources_path = os.path.expanduser(server_config.get("resources_path", platformdirs.user_data_dir(appname, vendor, roaming=True)))
|
resources_path = os.path.expanduser(server_config.get("resources_path", platformdirs.user_data_dir(appname, vendor, roaming=True)))
|
||||||
appliances_dir = os.path.join(resources_path, "appliances")
|
appliances_dir = os.path.join(resources_path, "appliances")
|
||||||
if delete_first:
|
|
||||||
shutil.rmtree(appliances_dir, ignore_errors=True)
|
|
||||||
os.makedirs(appliances_dir, exist_ok=True)
|
os.makedirs(appliances_dir, exist_ok=True)
|
||||||
return appliances_dir
|
return appliances_dir
|
||||||
|
|
||||||
@ -101,7 +99,7 @@ class ApplianceManager:
|
|||||||
At startup we copy the built-in appliances files.
|
At startup we copy the built-in appliances files.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
dst_path = self.builtin_appliances_path(delete_first=True)
|
dst_path = self.builtin_appliances_path()
|
||||||
log.info(f"Installing built-in appliances in '{dst_path}'")
|
log.info(f"Installing built-in appliances in '{dst_path}'")
|
||||||
from . import Controller
|
from . import Controller
|
||||||
try:
|
try:
|
||||||
|
@ -18,14 +18,19 @@
|
|||||||
import ipaddress
|
import ipaddress
|
||||||
import aiohttp
|
import aiohttp
|
||||||
import asyncio
|
import asyncio
|
||||||
import async_timeout
|
|
||||||
import socket
|
import socket
|
||||||
import json
|
import json
|
||||||
import uuid
|
import uuid
|
||||||
import sys
|
import sys
|
||||||
import io
|
import io
|
||||||
|
|
||||||
from operator import itemgetter
|
from operator import itemgetter
|
||||||
|
|
||||||
|
if sys.version_info >= (3, 11):
|
||||||
|
from asyncio import timeout as asynctimeout
|
||||||
|
else:
|
||||||
|
from async_timeout import timeout as asynctimeout
|
||||||
|
|
||||||
from ..utils import parse_version
|
from ..utils import parse_version
|
||||||
from ..utils.asyncio import locking
|
from ..utils.asyncio import locking
|
||||||
from ..controller.controller_error import ControllerError
|
from ..controller.controller_error import ControllerError
|
||||||
@ -483,8 +488,8 @@ class Compute:
|
|||||||
""" Returns URL for specific path at Compute"""
|
""" Returns URL for specific path at Compute"""
|
||||||
return self._getUrl(path)
|
return self._getUrl(path)
|
||||||
|
|
||||||
async def _run_http_query(self, method, path, data=None, timeout=20, raw=False):
|
async def _run_http_query(self, method, path, data=None, timeout=120, raw=False):
|
||||||
async with async_timeout.timeout(delay=timeout):
|
async with asynctimeout(delay=timeout):
|
||||||
url = self._getUrl(path)
|
url = self._getUrl(path)
|
||||||
headers = {}
|
headers = {}
|
||||||
headers['content-type'] = 'application/json'
|
headers['content-type'] = 'application/json'
|
||||||
|
@ -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:
|
||||||
|
@ -588,7 +588,7 @@ class Project:
|
|||||||
|
|
||||||
if node_type == "iou":
|
if node_type == "iou":
|
||||||
async with self._iou_id_lock:
|
async with self._iou_id_lock:
|
||||||
# wait for a IOU node to be completely created before adding a new one
|
# wait for an IOU node to be completely created before adding a new one
|
||||||
# this is important otherwise we allocate the same application ID (used
|
# this is important otherwise we allocate the same application ID (used
|
||||||
# to generate MAC addresses) when creating multiple IOU node at the same time
|
# to generate MAC addresses) when creating multiple IOU node at the same time
|
||||||
if "properties" in kwargs.keys():
|
if "properties" in kwargs.keys():
|
||||||
@ -1275,7 +1275,10 @@ class Project:
|
|||||||
p_work = pathlib.Path(location or self.path).parent.absolute()
|
p_work = pathlib.Path(location or self.path).parent.absolute()
|
||||||
t0 = time.time()
|
t0 = time.time()
|
||||||
new_project_id = str(uuid.uuid4())
|
new_project_id = str(uuid.uuid4())
|
||||||
new_project_path = p_work.joinpath(new_project_id)
|
if location:
|
||||||
|
new_project_path = p_work.joinpath(location)
|
||||||
|
else:
|
||||||
|
new_project_path = p_work.joinpath(new_project_id)
|
||||||
# copy dir
|
# copy dir
|
||||||
await wait_run_in_executor(shutil.copytree, self.path, new_project_path.as_posix(), symlinks=True, ignore_dangling_symlinks=True)
|
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))
|
log.info("Project content copied from '{}' to '{}' in {}s".format(self.path, new_project_path, time.time() - t0))
|
||||||
|
@ -57,7 +57,7 @@ class CrashReport:
|
|||||||
Report crash to a third party service
|
Report crash to a third party service
|
||||||
"""
|
"""
|
||||||
|
|
||||||
DSN = "https://decb06a5d7bda07bef342a41c5c9d6e1@o19455.ingest.us.sentry.io/38482"
|
DSN = "https://c663917f99579c9b5a5c0764415c0bd4@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.
@ -46,6 +46,6 @@
|
|||||||
|
|
||||||
gtag('config', 'G-0BT7QQV1W1');
|
gtag('config', 'G-0BT7QQV1W1');
|
||||||
</script>
|
</script>
|
||||||
<script src="runtime.415291667f70565cd8ef.js" defer></script><script src="polyfills-es5.865074f5cd9a121111a2.js" nomodule defer></script><script src="polyfills.2f91a039d848e57ff02e.js" defer></script><script src="main.df8c319a3da6fb0e3629.js" defer></script>
|
<script src="runtime.415291667f70565cd8ef.js" defer></script><script src="polyfills-es5.865074f5cd9a121111a2.js" nomodule defer></script><script src="polyfills.2f91a039d848e57ff02e.js" defer></script><script src="main.9bcf455e62558dedfd48.js" defer></script>
|
||||||
|
|
||||||
</body></html>
|
</body></html>
|
File diff suppressed because one or more lines are too long
@ -23,6 +23,7 @@ import textwrap
|
|||||||
import posixpath
|
import posixpath
|
||||||
import socket
|
import socket
|
||||||
import errno
|
import errno
|
||||||
|
import hashlib
|
||||||
|
|
||||||
|
|
||||||
def force_unix_path(path):
|
def force_unix_path(path):
|
||||||
@ -120,3 +121,14 @@ def is_ipv6_enabled() -> bool:
|
|||||||
if e.errno == errno.EADDRINUSE:
|
if e.errno == errno.EADDRINUSE:
|
||||||
return True
|
return True
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
def md5sum(filename):
|
||||||
|
"""
|
||||||
|
Calculate the MD5 checksum of a file.
|
||||||
|
"""
|
||||||
|
|
||||||
|
hash_md5 = hashlib.md5()
|
||||||
|
with open(filename, "rb") as f:
|
||||||
|
for chunk in iter(lambda: f.read(4096), b""):
|
||||||
|
hash_md5.update(chunk)
|
||||||
|
return hash_md5.hexdigest()
|
||||||
|
@ -45,7 +45,7 @@ def list_images(emulator_type):
|
|||||||
|
|
||||||
# We limit recursion to path outside the default images directory
|
# We limit recursion to path outside the default images directory
|
||||||
# the reason is in the default directory manage file organization and
|
# the reason is in the default directory manage file organization and
|
||||||
# it should be flatten to keep things simple
|
# it should be flat to keep things simple
|
||||||
recurse = True
|
recurse = True
|
||||||
if os.path.commonprefix([directory, general_images_directory]) == general_images_directory:
|
if os.path.commonprefix([directory, general_images_directory]) == general_images_directory:
|
||||||
recurse = False
|
recurse = False
|
||||||
@ -53,37 +53,53 @@ def list_images(emulator_type):
|
|||||||
directory = os.path.normpath(directory)
|
directory = os.path.normpath(directory)
|
||||||
for root, _, filenames in _os_walk(directory, recurse=recurse):
|
for root, _, filenames in _os_walk(directory, recurse=recurse):
|
||||||
for filename in filenames:
|
for filename in filenames:
|
||||||
if filename not in files:
|
if filename in files:
|
||||||
if filename.endswith(".md5sum") or filename.startswith("."):
|
log.debug("File {} has already been found, skipping...".format(filename))
|
||||||
|
continue
|
||||||
|
if filename.endswith(".md5sum") or filename.startswith("."):
|
||||||
|
continue
|
||||||
|
|
||||||
|
files.add(filename)
|
||||||
|
|
||||||
|
filesize = os.stat(os.path.join(root, filename)).st_size
|
||||||
|
if filesize < 7:
|
||||||
|
log.debug("File {} is too small to be an image, skipping...".format(filename))
|
||||||
|
continue
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(os.path.join(root, filename), "rb") as f:
|
||||||
|
# read the first 7 bytes of the file.
|
||||||
|
elf_header_start = f.read(7)
|
||||||
|
if emulator_type == "dynamips" and elf_header_start != b'\x7fELF\x01\x02\x01':
|
||||||
|
# IOS images must start with the ELF magic number, be 32-bit, big endian and have an ELF version of 1
|
||||||
|
log.warning("IOS image {} does not start with a valid ELF magic number, skipping...".format(filename))
|
||||||
|
continue
|
||||||
|
elif emulator_type == "iou" and elf_header_start != b'\x7fELF\x02\x01\x01' and elf_header_start != b'\x7fELF\x01\x01\x01':
|
||||||
|
# IOU images must start with the ELF magic number, be 32-bit or 64-bit, little endian and have an ELF version of 1
|
||||||
|
log.warning("IOU image {} does not start with a valid ELF magic number, skipping...".format(filename))
|
||||||
|
continue
|
||||||
|
elif emulator_type == "qemu" and elf_header_start[:4] == b'\x7fELF':
|
||||||
|
# QEMU images should not start with an ELF magic number
|
||||||
|
log.warning("QEMU image {} starts with an ELF magic number, skipping...".format(filename))
|
||||||
continue
|
continue
|
||||||
elif ((filename.endswith(".image") or filename.endswith(".bin")) and emulator_type == "dynamips") \
|
|
||||||
or ((filename.endswith(".bin") or filename.startswith("i86bi")) and emulator_type == "iou") \
|
|
||||||
or (not filename.endswith(".bin") and not filename.endswith(".image") and emulator_type == "qemu"):
|
|
||||||
files.add(filename)
|
|
||||||
|
|
||||||
# It the image is located in the standard directory the path is relative
|
# It the image is located in the standard directory the path is relative
|
||||||
if os.path.commonprefix([root, default_directory]) != default_directory:
|
if os.path.commonprefix([root, default_directory]) != default_directory:
|
||||||
path = os.path.join(root, filename)
|
path = os.path.join(root, filename)
|
||||||
else:
|
else:
|
||||||
path = os.path.relpath(os.path.join(root, filename), default_directory)
|
path = os.path.relpath(os.path.join(root, filename), default_directory)
|
||||||
|
|
||||||
try:
|
images.append(
|
||||||
if emulator_type in ["dynamips", "iou"]:
|
{
|
||||||
with open(os.path.join(root, filename), "rb") as f:
|
"filename": filename,
|
||||||
# read the first 7 bytes of the file.
|
"path": force_unix_path(path),
|
||||||
elf_header_start = f.read(7)
|
"md5sum": md5sum(os.path.join(root, filename)),
|
||||||
# valid IOU or IOS images must start with the ELF magic number, be 32-bit or 64-bit,
|
"filesize": filesize
|
||||||
# little endian and have an ELF version of 1
|
}
|
||||||
if elf_header_start != b'\x7fELF\x02\x01\x01' and elf_header_start != b'\x7fELF\x01\x01\x01':
|
)
|
||||||
continue
|
|
||||||
|
|
||||||
images.append({
|
except OSError as e:
|
||||||
"filename": filename,
|
log.warning("Can't add image {}: {}".format(path, str(e)))
|
||||||
"path": force_unix_path(path),
|
|
||||||
"md5sum": md5sum(os.path.join(root, filename)),
|
|
||||||
"filesize": os.stat(os.path.join(root, filename)).st_size})
|
|
||||||
except OSError as e:
|
|
||||||
log.warning("Can't add image {}: {}".format(path, str(e)))
|
|
||||||
return images
|
return images
|
||||||
|
|
||||||
|
|
||||||
|
@ -23,8 +23,8 @@
|
|||||||
# or negative for a release candidate or beta (after the base version
|
# or negative for a release candidate or beta (after the base version
|
||||||
# number has been incremented)
|
# number has been incremented)
|
||||||
|
|
||||||
__version__ = "2.2.50"
|
__version__ = "2.2.54"
|
||||||
__version_info__ = (2, 2, 50, 0)
|
__version_info__ = (2, 2, 54, 0)
|
||||||
|
|
||||||
if "dev" in __version__:
|
if "dev" in __version__:
|
||||||
try:
|
try:
|
||||||
|
@ -311,7 +311,13 @@ class WebServer:
|
|||||||
# Background task started with the server
|
# Background task started with the server
|
||||||
self._app.on_startup.append(self._on_startup)
|
self._app.on_startup.append(self._on_startup)
|
||||||
|
|
||||||
resource_options = aiohttp_cors.ResourceOptions(allow_credentials=True, expose_headers="*", allow_headers="*", max_age=0)
|
resource_options = aiohttp_cors.ResourceOptions(
|
||||||
|
allow_credentials=True,
|
||||||
|
expose_headers="*",
|
||||||
|
allow_headers="*",
|
||||||
|
allow_methods="*",
|
||||||
|
max_age=0
|
||||||
|
)
|
||||||
|
|
||||||
# Allow CORS for this domains
|
# Allow CORS for this domains
|
||||||
cors = aiohttp_cors.setup(self._app, defaults={
|
cors = aiohttp_cors.setup(self._app, defaults={
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
jsonschema>=4.23,<4.24
|
jsonschema>=4.23,<4.24
|
||||||
aiohttp>=3.10.3,<3.11
|
aiohttp>=3.10.11,<3.11 # version 3.10.11 is the last compatible version with Python 3.8
|
||||||
aiohttp-cors>=0.7.0,<0.8
|
aiohttp-cors>=0.7.0,<0.8
|
||||||
aiofiles>=24.1.0,<25.0
|
aiofiles>=24.1.0,<25.0
|
||||||
Jinja2>=3.1.4,<3.2
|
Jinja2>=3.1.6,<3.2
|
||||||
sentry-sdk==2.12,<2.13 # optional dependency
|
sentry-sdk>=2.26.1,<2.27 # optional dependency
|
||||||
psutil==6.0.0
|
psutil>=7.0.0
|
||||||
async-timeout>=4.0.3,<4.1
|
async-timeout>=5.0.1,<5.1
|
||||||
distro>=1.9.0
|
distro>=1.9.0
|
||||||
py-cpuinfo>=9.0.0,<10.0
|
py-cpuinfo>=9.0.0,<10.0
|
||||||
platformdirs>=2.4.0
|
platformdirs>=2.4.0,<3 # platformdirs >=3 conflicts when building Debian packages
|
||||||
importlib-resources>=1.3; python_version < '3.9'
|
importlib-resources>=1.3; python_version < '3.9'
|
||||||
truststore>=0.9.1; python_version >= '3.10'
|
truststore>=0.10.0; python_version >= '3.10'
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
# Copyright (C) 2015 GNS3 Technologies Inc.
|
# Copyright (C) 2025 GNS3 Technologies Inc.
|
||||||
#
|
#
|
||||||
# This program is free software: you can redistribute it and/or modify
|
# This program is free software: you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
@ -16,19 +16,21 @@
|
|||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
#
|
#
|
||||||
# Install GNS3 on a remote Ubuntu LTS server
|
# Install GNS3 on a remote Ubuntu server
|
||||||
# This create a dedicated user and setup all the package
|
# This creates a dedicated user and setup all the packages
|
||||||
# and optionnaly a VPN
|
# and optionally a VPN
|
||||||
#
|
#
|
||||||
|
|
||||||
function help {
|
function help {
|
||||||
echo "Usage:" >&2
|
echo "Usage:" >&2
|
||||||
echo "--with-openvpn: Install OpenVPN" >&2
|
echo "--with-openvpn: Install OpenVPN" >&2
|
||||||
echo "--with-iou: Install IOU" >&2
|
echo "--with-iou: Install IOU support" >&2
|
||||||
echo "--with-i386-repository: Add the i386 repositories required by IOU if they are not already available on the system. Warning: this will replace your source.list in order to use the official Ubuntu mirror" >&2
|
echo "--with-i386-repository: Add the i386 repositories required by IOU i386 images. This is not needed for recent x86_64 IOU images." >&2
|
||||||
echo "--with-welcome: Install GNS3-VM welcome.py script" >&2
|
echo "--with-welcome: Install GNS3-VM welcome.py script" >&2
|
||||||
echo "--without-kvm: Disable KVM, required if system do not support it (limitation in some hypervisors and cloud providers). Warning: only disable KVM if strictly necessary as this will degrade performance" >&2
|
echo "--without-kvm: Disable KVM, required if system do not support it (limitation in some hypervisors and cloud providers). Warning: only disable KVM if strictly necessary as this will degrade performance" >&2
|
||||||
echo "--unstable: Use the GNS3 unstable repository"
|
echo "--without-system-upgrade: Do not upgrade the system" >&2
|
||||||
|
echo "--unstable: Use the GNS3 unstable repository" >&2
|
||||||
|
echo "--custom-repository <repository>: Use a custom repository" >&2
|
||||||
echo "--help: This help" >&2
|
echo "--help: This help" >&2
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,21 +39,31 @@ function log {
|
|||||||
}
|
}
|
||||||
|
|
||||||
lsb_release -d | grep "LTS" > /dev/null
|
lsb_release -d | grep "LTS" > /dev/null
|
||||||
|
|
||||||
|
if [ "$EUID" -ne 0 ]
|
||||||
|
then
|
||||||
|
echo "This script must be run as root"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
if [ $? != 0 ]
|
if [ $? != 0 ]
|
||||||
then
|
then
|
||||||
echo "This script can only be run on a Linux Ubuntu LTS release"
|
echo "This script can only be run on a Linux Ubuntu LTS release"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Default repository
|
||||||
|
REPOSITORY="ppa"
|
||||||
|
|
||||||
# Read the options
|
# Read the options
|
||||||
USE_VPN=0
|
USE_VPN=0
|
||||||
USE_IOU=0
|
USE_IOU=0
|
||||||
I386_REPO=0
|
I386_REPO=0
|
||||||
DISABLE_KVM=0
|
DISABLE_KVM=0
|
||||||
UNSTABLE=0
|
NO_SYSTEM_UPGRADE=0
|
||||||
WELCOME_SETUP=0
|
WELCOME_SETUP=0
|
||||||
|
|
||||||
TEMP=`getopt -o h --long with-openvpn,with-iou,with-i386-repository,with-welcome,without-kvm,unstable,help -n 'gns3-remote-install.sh' -- "$@"`
|
TEMP=`getopt -o h --long with-openvpn,with-iou,with-i386-repository,with-welcome,without-kvm,unstable,custom-repository:,help -n 'gns3-remote-install.sh' -- "$@"`
|
||||||
if [ $? != 0 ]
|
if [ $? != 0 ]
|
||||||
then
|
then
|
||||||
help
|
help
|
||||||
@ -82,10 +94,18 @@ while true ; do
|
|||||||
DISABLE_KVM=1
|
DISABLE_KVM=1
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
--unstable)
|
--without-system-upgrade)
|
||||||
UNSTABLE=1
|
NO_SYSTEM_UPGRADE=1
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
|
--unstable)
|
||||||
|
REPOSITORY="unstable"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--custom-repository)
|
||||||
|
REPOSITORY="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
-h|--help)
|
-h|--help)
|
||||||
help
|
help
|
||||||
exit 1
|
exit 1
|
||||||
@ -95,99 +115,66 @@ while true ; do
|
|||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
|
if [ "$REPOSITORY" == "ppa-v3" ]
|
||||||
|
then
|
||||||
|
if ! python3 -c 'import sys; assert sys.version_info >= (3,9)' > /dev/null 2>&1; then
|
||||||
|
echo "GNS3 version >= 3.0 requires Python 3.9 or later"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# Exit in case of error
|
# Exit in case of error
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
export DEBIAN_FRONTEND="noninteractive"
|
export DEBIAN_FRONTEND="noninteractive"
|
||||||
UBUNTU_CODENAME=`lsb_release -c -s`
|
UBUNTU_CODENAME=`lsb_release -c -s`
|
||||||
|
|
||||||
log "Add GNS3 repository"
|
log "Updating system packages, installing curl and software-properties-common"
|
||||||
|
apt update
|
||||||
|
apt install -y curl software-properties-common
|
||||||
|
|
||||||
if [ "$UBUNTU_CODENAME" == "trusty" ]
|
if [ $NO_SYSTEM_UPGRADE == 0 ]
|
||||||
then
|
then
|
||||||
if [ $UNSTABLE == 1 ]
|
log "Upgrading system packages"
|
||||||
then
|
apt upgrade --yes -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold"
|
||||||
cat <<EOFLIST > /etc/apt/sources.list.d/gns3.list
|
|
||||||
deb http://ppa.launchpad.net/gns3/unstable/ubuntu $UBUNTU_CODENAME main
|
|
||||||
deb-src http://ppa.launchpad.net/gns3/unstable/ubuntu $UBUNTU_CODENAME main
|
|
||||||
deb http://ppa.launchpad.net/gns3/qemu/ubuntu $UBUNTU_CODENAME main
|
|
||||||
deb-src http://ppa.launchpad.net/gns3/qemu/ubuntu $UBUNTU_CODENAME main
|
|
||||||
EOFLIST
|
|
||||||
else
|
|
||||||
cat <<EOFLIST > /etc/apt/sources.list.d/gns3.list
|
|
||||||
deb http://ppa.launchpad.net/gns3/ppa/ubuntu $UBUNTU_CODENAME main
|
|
||||||
deb-src http://ppa.launchpad.net/gns3/ppa/ubuntu $UBUNTU_CODENAME main
|
|
||||||
deb http://ppa.launchpad.net/gns3/qemu/ubuntu $UBUNTU_CODENAME main
|
|
||||||
deb-src http://ppa.launchpad.net/gns3/qemu/ubuntu $UBUNTU_CODENAME main
|
|
||||||
EOFLIST
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if [ $UNSTABLE == 1 ]
|
|
||||||
then
|
|
||||||
cat <<EOFLIST > /etc/apt/sources.list.d/gns3.list
|
|
||||||
deb http://ppa.launchpad.net/gns3/unstable/ubuntu $UBUNTU_CODENAME main
|
|
||||||
deb-src http://ppa.launchpad.net/gns3/unstable/ubuntu $UBUNTU_CODENAME main
|
|
||||||
EOFLIST
|
|
||||||
else
|
|
||||||
cat <<EOFLIST > /etc/apt/sources.list.d/gns3.list
|
|
||||||
deb http://ppa.launchpad.net/gns3/ppa/ubuntu $UBUNTU_CODENAME main
|
|
||||||
deb-src http://ppa.launchpad.net/gns3/ppa/ubuntu $UBUNTU_CODENAME main
|
|
||||||
EOFLIST
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ $I386_REPO == 1 ]
|
log "Adding GNS3 repository ppa:gns3/$REPOSITORY"
|
||||||
then
|
# use sudo -E to preserve proxy config
|
||||||
cat <<EOFLIST2 >> /etc/apt/sources.list
|
sudo -E apt-add-repository -y "ppa:gns3/$REPOSITORY"
|
||||||
###### Ubuntu Main Repos
|
|
||||||
deb http://archive.ubuntu.com/ubuntu/ $UBUNTU_CODENAME main universe multiverse
|
|
||||||
deb-src http://archive.ubuntu.com/ubuntu/ $UBUNTU_CODENAME main universe multiverse
|
|
||||||
|
|
||||||
###### Ubuntu Update Repos
|
log "Installing the GNS3 server and its dependencies"
|
||||||
deb http://archive.ubuntu.com/ubuntu/ ${UBUNTU_CODENAME}-security main universe multiverse
|
apt install -y gns3-server
|
||||||
deb http://archive.ubuntu.com/ubuntu/ ${UBUNTU_CODENAME}-updates main universe multiverse
|
|
||||||
deb-src http://archive.ubuntu.com/ubuntu/ ${UBUNTU_CODENAME}-security main universe multiverse
|
|
||||||
deb-src http://archive.ubuntu.com/ubuntu/ ${UBUNTU_CODENAME}-updates main universe multiverse
|
|
||||||
EOFLIST2
|
|
||||||
fi
|
|
||||||
|
|
||||||
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys A2E3EF7B
|
log "Creating user GNS3 with /opt/gns3 as home directory"
|
||||||
|
|
||||||
log "Update system packages"
|
|
||||||
apt-get update
|
|
||||||
|
|
||||||
log "Upgrade packages"
|
|
||||||
apt-get upgrade --yes --force-yes -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold"
|
|
||||||
|
|
||||||
log "Install GNS3 packages"
|
|
||||||
apt-get install -y gns3-server
|
|
||||||
|
|
||||||
log "Create user GNS3 with /opt/gns3 as home directory"
|
|
||||||
if [ ! -d "/opt/gns3" ]
|
if [ ! -d "/opt/gns3" ]
|
||||||
then
|
then
|
||||||
useradd -m -d /opt/gns3 gns3
|
useradd -m -d /opt/gns3 gns3
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
log "Adding GNS3 to the ubridge group"
|
||||||
log "Add GNS3 to the ubridge group"
|
|
||||||
usermod -aG ubridge gns3
|
usermod -aG ubridge gns3
|
||||||
|
|
||||||
log "Install docker"
|
log "Installing Docker"
|
||||||
if [ ! -f "/usr/bin/docker" ]
|
if [ ! -f "/usr/bin/docker" ]
|
||||||
then
|
then
|
||||||
curl -sSL https://get.docker.com | bash
|
curl -sSL https://get.docker.com | bash
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log "Add GNS3 to the docker group"
|
log "Adding GNS3 to the docker group"
|
||||||
usermod -aG docker gns3
|
usermod -aG docker gns3
|
||||||
|
|
||||||
if [ $USE_IOU == 1 ]
|
if [ $USE_IOU == 1 ]
|
||||||
then
|
then
|
||||||
log "Setup IOU"
|
log "Setting up IOU support"
|
||||||
dpkg --add-architecture i386
|
if [ $I386_REPO == 1 ]
|
||||||
apt-get update
|
then
|
||||||
|
log "Enabling i386 architecture for IOU support"
|
||||||
|
dpkg --add-architecture i386
|
||||||
|
apt update
|
||||||
|
fi
|
||||||
|
|
||||||
apt-get install -y gns3-iou
|
apt install -y gns3-iou
|
||||||
|
|
||||||
# Force the host name to gns3vm
|
# Force the host name to gns3vm
|
||||||
echo gns3vm > /etc/hostname
|
echo gns3vm > /etc/hostname
|
||||||
@ -196,31 +183,18 @@ then
|
|||||||
|
|
||||||
# Force hostid for IOU
|
# Force hostid for IOU
|
||||||
dd if=/dev/zero bs=4 count=1 of=/etc/hostid
|
dd if=/dev/zero bs=4 count=1 of=/etc/hostid
|
||||||
|
|
||||||
# Block potential IOU phone home call (xml.cisco.com is not in use at this time)
|
|
||||||
log "Block IOU phone home call"
|
|
||||||
if [ "$UBUNTU_CODENAME" == "focal" ]
|
|
||||||
then
|
|
||||||
iptables -I OUTPUT -p udp --dport 53 -m string --hex-string "|03|xml|05|cisco|03|com" --algo bm -j DROP
|
|
||||||
echo iptables-persistent iptables-persistent/autosave_v4 boolean true | debconf-set-selections
|
|
||||||
echo iptables-persistent iptables-persistent/autosave_v6 boolean true | debconf-set-selections
|
|
||||||
apt-get install -y iptables-persistent
|
|
||||||
else
|
|
||||||
echo "127.0.0.254 xml.cisco.com" | tee --append /etc/hosts
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log "Add gns3 to the kvm group"
|
log "Adding gns3 to the kvm group"
|
||||||
usermod -aG kvm gns3
|
usermod -aG kvm gns3
|
||||||
|
|
||||||
log "Setup GNS3 server"
|
log "Setting up the GNS3 server configuration"
|
||||||
|
|
||||||
mkdir -p /etc/gns3
|
mkdir -p /etc/gns3
|
||||||
cat <<EOFC > /etc/gns3/gns3_server.conf
|
cat <<EOFC > /etc/gns3/gns3_server.conf
|
||||||
[Server]
|
[Server]
|
||||||
host = 0.0.0.0
|
host = 0.0.0.0
|
||||||
port = 3080
|
port = 3080
|
||||||
images_path = /opt/gns3/images
|
images_path = /opt/gns3/images
|
||||||
projects_path = /opt/gns3/projects
|
projects_path = /opt/gns3/projects
|
||||||
appliances_path = /opt/gns3/appliances
|
appliances_path = /opt/gns3/appliances
|
||||||
@ -234,52 +208,15 @@ EOFC
|
|||||||
|
|
||||||
if [ $DISABLE_KVM == 1 ]
|
if [ $DISABLE_KVM == 1 ]
|
||||||
then
|
then
|
||||||
log "Disable KVM support"
|
log "Disabling KVM support"
|
||||||
sed -i 's/hardware_acceleration = True/hardware_acceleration = False/g' /etc/gns3/gns3_server.conf
|
sed -i 's/hardware_acceleration = True/hardware_acceleration = False/g' /etc/gns3/gns3_server.conf
|
||||||
fi
|
fi
|
||||||
|
|
||||||
chown -R gns3:gns3 /etc/gns3
|
chown -R gns3:gns3 /etc/gns3
|
||||||
chmod -R 700 /etc/gns3
|
chmod -R 700 /etc/gns3
|
||||||
|
|
||||||
if [ "$UBUNTU_CODENAME" == "trusty" ]
|
log "Installing the GNS3 systemd service"
|
||||||
then
|
cat <<EOFI > /lib/systemd/system/gns3.service
|
||||||
cat <<EOFI > /etc/init/gns3.conf
|
|
||||||
description "GNS3 server"
|
|
||||||
author "GNS3 Team"
|
|
||||||
|
|
||||||
start on filesystem or runlevel [2345]
|
|
||||||
stop on runlevel [016]
|
|
||||||
respawn
|
|
||||||
console log
|
|
||||||
|
|
||||||
|
|
||||||
script
|
|
||||||
exec start-stop-daemon --start --make-pidfile --pidfile /var/run/gns3.pid --chuid gns3 --exec "/usr/bin/gns3server"
|
|
||||||
end script
|
|
||||||
|
|
||||||
pre-start script
|
|
||||||
echo "" > /var/log/upstart/gns3.log
|
|
||||||
echo "[`date`] GNS3 Starting"
|
|
||||||
end script
|
|
||||||
|
|
||||||
pre-stop script
|
|
||||||
echo "[`date`] GNS3 Stopping"
|
|
||||||
end script
|
|
||||||
EOFI
|
|
||||||
|
|
||||||
chown root:root /etc/init/gns3.conf
|
|
||||||
chmod 644 /etc/init/gns3.conf
|
|
||||||
|
|
||||||
|
|
||||||
log "Start GNS3 service"
|
|
||||||
set +e
|
|
||||||
service gns3 stop
|
|
||||||
set -e
|
|
||||||
service gns3 start
|
|
||||||
|
|
||||||
else
|
|
||||||
# Install systemd service
|
|
||||||
cat <<EOFI > /lib/systemd/system/gns3.service
|
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=GNS3 server
|
Description=GNS3 server
|
||||||
After=network-online.target
|
After=network-online.target
|
||||||
@ -302,15 +239,15 @@ LimitNOFILE=16384
|
|||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
EOFI
|
EOFI
|
||||||
chmod 755 /lib/systemd/system/gns3.service
|
|
||||||
chown root:root /lib/systemd/system/gns3.service
|
|
||||||
|
|
||||||
log "Start GNS3 service"
|
chmod 755 /lib/systemd/system/gns3.service
|
||||||
systemctl enable gns3
|
chown root:root /lib/systemd/system/gns3.service
|
||||||
systemctl start gns3
|
|
||||||
fi
|
|
||||||
|
|
||||||
log "GNS3 installed with success"
|
log "Starting the GNS3 service"
|
||||||
|
systemctl enable gns3
|
||||||
|
systemctl start gns3
|
||||||
|
|
||||||
|
log "GNS3 has been installed with success"
|
||||||
|
|
||||||
if [ $WELCOME_SETUP == 1 ]
|
if [ $WELCOME_SETUP == 1 ]
|
||||||
then
|
then
|
||||||
@ -319,11 +256,9 @@ gns3 ALL = (ALL) NOPASSWD: /usr/bin/apt-key
|
|||||||
gns3 ALL = (ALL) NOPASSWD: /usr/bin/apt-get
|
gns3 ALL = (ALL) NOPASSWD: /usr/bin/apt-get
|
||||||
gns3 ALL = (ALL) NOPASSWD: /usr/sbin/reboot
|
gns3 ALL = (ALL) NOPASSWD: /usr/sbin/reboot
|
||||||
EOFI
|
EOFI
|
||||||
NEEDRESTART_MODE=a apt-get install -y net-tools
|
NEEDRESTART_MODE=a apt install -y net-tools
|
||||||
NEEDRESTART_MODE=a apt-get install -y python3-pip
|
NEEDRESTART_MODE=a apt install -y dialog
|
||||||
NEEDRESTART_MODE=a apt-get install -y dialog
|
NEEDRESTART_MODE=a apt install -y python3-dialog
|
||||||
pip install --no-input --upgrade pip
|
|
||||||
pip install --no-input pythondialog
|
|
||||||
|
|
||||||
#Pull down welcome script from repo
|
#Pull down welcome script from repo
|
||||||
curl https://raw.githubusercontent.com/GNS3/gns3-server/master/scripts/welcome.py > /usr/local/bin/welcome.py
|
curl https://raw.githubusercontent.com/GNS3/gns3-server/master/scripts/welcome.py > /usr/local/bin/welcome.py
|
||||||
@ -350,19 +285,15 @@ fi
|
|||||||
|
|
||||||
if [ $USE_VPN == 1 ]
|
if [ $USE_VPN == 1 ]
|
||||||
then
|
then
|
||||||
log "Setup VPN"
|
log "Setting up OpenVPN"
|
||||||
|
|
||||||
log "Change GNS3 to listen on VPN interface"
|
log "Changing the GNS3 server configuration to listen on VPN interface"
|
||||||
|
|
||||||
sed -i 's/host = 0.0.0.0/host = 172.16.253.1/' /etc/gns3/gns3_server.conf
|
sed -i 's/host = 0.0.0.0/host = 172.16.253.1/' /etc/gns3/gns3_server.conf
|
||||||
|
|
||||||
log "Install packages for OpenVPN"
|
log "Installing the OpenVPN packages"
|
||||||
|
|
||||||
apt-get install -y \
|
apt install -y openvpn uuid dnsutils nginx-light
|
||||||
openvpn \
|
|
||||||
uuid \
|
|
||||||
dnsutils \
|
|
||||||
nginx-light
|
|
||||||
|
|
||||||
MY_IP_ADDR=$(dig @ns1.google.com -t txt o-o.myaddr.l.google.com +short -4 | sed 's/"//g')
|
MY_IP_ADDR=$(dig @ns1.google.com -t txt o-o.myaddr.l.google.com +short -4 | sed 's/"//g')
|
||||||
|
|
||||||
@ -370,7 +301,7 @@ log "IP detected: $MY_IP_ADDR"
|
|||||||
|
|
||||||
UUID=$(uuid)
|
UUID=$(uuid)
|
||||||
|
|
||||||
log "Update motd"
|
log "Updating motd"
|
||||||
|
|
||||||
cat <<EOFMOTD > /etc/update-motd.d/70-openvpn
|
cat <<EOFMOTD > /etc/update-motd.d/70-openvpn
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
@ -381,7 +312,7 @@ echo "http://$MY_IP_ADDR:8003/$UUID/$HOSTNAME.ovpn"
|
|||||||
echo ""
|
echo ""
|
||||||
echo "And add it to your openvpn client."
|
echo "And add it to your openvpn client."
|
||||||
echo ""
|
echo ""
|
||||||
echo "apt-get remove nginx-light to disable the HTTP server."
|
echo "apt remove nginx-light to disable the HTTP server."
|
||||||
echo "And remove this file with rm /etc/update-motd.d/70-openvpn"
|
echo "And remove this file with rm /etc/update-motd.d/70-openvpn"
|
||||||
EOFMOTD
|
EOFMOTD
|
||||||
chmod 755 /etc/update-motd.d/70-openvpn
|
chmod 755 /etc/update-motd.d/70-openvpn
|
||||||
@ -391,7 +322,7 @@ mkdir -p /etc/openvpn/
|
|||||||
[ -d /dev/net ] || mkdir -p /dev/net
|
[ -d /dev/net ] || mkdir -p /dev/net
|
||||||
[ -c /dev/net/tun ] || mknod /dev/net/tun c 10 200
|
[ -c /dev/net/tun ] || mknod /dev/net/tun c 10 200
|
||||||
|
|
||||||
log "Create keys"
|
log "Creating OpenVPN keys"
|
||||||
|
|
||||||
[ -f /etc/openvpn/dh.pem ] || openssl dhparam -out /etc/openvpn/dh.pem 2048
|
[ -f /etc/openvpn/dh.pem ] || openssl dhparam -out /etc/openvpn/dh.pem 2048
|
||||||
[ -f /etc/openvpn/key.pem ] || openssl genrsa -out /etc/openvpn/key.pem 2048
|
[ -f /etc/openvpn/key.pem ] || openssl genrsa -out /etc/openvpn/key.pem 2048
|
||||||
@ -399,7 +330,7 @@ chmod 600 /etc/openvpn/key.pem
|
|||||||
[ -f /etc/openvpn/csr.pem ] || openssl req -new -key /etc/openvpn/key.pem -out /etc/openvpn/csr.pem -subj /CN=OpenVPN/
|
[ -f /etc/openvpn/csr.pem ] || openssl req -new -key /etc/openvpn/key.pem -out /etc/openvpn/csr.pem -subj /CN=OpenVPN/
|
||||||
[ -f /etc/openvpn/cert.pem ] || openssl x509 -req -in /etc/openvpn/csr.pem -out /etc/openvpn/cert.pem -signkey /etc/openvpn/key.pem -days 24855
|
[ -f /etc/openvpn/cert.pem ] || openssl x509 -req -in /etc/openvpn/csr.pem -out /etc/openvpn/cert.pem -signkey /etc/openvpn/key.pem -days 24855
|
||||||
|
|
||||||
log "Create client configuration"
|
log "Creating OpenVPN client configuration"
|
||||||
cat <<EOFCLIENT > /root/client.ovpn
|
cat <<EOFCLIENT > /root/client.ovpn
|
||||||
client
|
client
|
||||||
nobind
|
nobind
|
||||||
@ -441,7 +372,7 @@ status openvpn-status-1194.log
|
|||||||
log-append /var/log/openvpn-udp1194.log
|
log-append /var/log/openvpn-udp1194.log
|
||||||
EOFUDP
|
EOFUDP
|
||||||
|
|
||||||
log "Setup HTTP server for serving client certificate"
|
log "Setting up an HTTP server for serving client certificate"
|
||||||
mkdir -p /usr/share/nginx/openvpn/$UUID
|
mkdir -p /usr/share/nginx/openvpn/$UUID
|
||||||
cp /root/client.ovpn /usr/share/nginx/openvpn/$UUID/$HOSTNAME.ovpn
|
cp /root/client.ovpn /usr/share/nginx/openvpn/$UUID/$HOSTNAME.ovpn
|
||||||
touch /usr/share/nginx/openvpn/$UUID/index.html
|
touch /usr/share/nginx/openvpn/$UUID/index.html
|
||||||
@ -458,7 +389,7 @@ EOFNGINX
|
|||||||
service nginx stop
|
service nginx stop
|
||||||
service nginx start
|
service nginx start
|
||||||
|
|
||||||
log "Restart OpenVPN and GNS3"
|
log "Restarting OpenVPN and GNS3"
|
||||||
|
|
||||||
set +e
|
set +e
|
||||||
service openvpn stop
|
service openvpn stop
|
||||||
@ -466,15 +397,15 @@ service openvpn start
|
|||||||
service gns3 stop
|
service gns3 stop
|
||||||
service gns3 start
|
service gns3 start
|
||||||
|
|
||||||
log "Download http://$MY_IP_ADDR:8003/$UUID/$HOSTNAME.ovpn to setup your OpenVPN client after rebooting the server"
|
log "Please download http://$MY_IP_ADDR:8003/$UUID/$HOSTNAME.ovpn to setup your OpenVPN client after rebooting the server"
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ $WELCOME_SETUP == 1 ]
|
if [ $WELCOME_SETUP == 1 ]
|
||||||
then
|
then
|
||||||
NEEDRESTART_MODE=a apt-get update
|
NEEDRESTART_MODE=a apt update
|
||||||
NEEDRESTART_MODE=a apt-get upgrade
|
NEEDRESTART_MODE=a apt upgrade
|
||||||
python3 -c 'import sys; sys.path.append("/usr/local/bin/"); import welcome; ws = welcome.Welcome_dialog(); ws.repair_remote_install()'
|
python3 -c 'import sys; sys.path.append("/usr/local/bin/"); import welcome; ws = welcome.Welcome_dialog(); ws.repair_remote_install()'
|
||||||
cd /opt/gns3
|
cd /opt/gns3
|
||||||
su gns3
|
su gns3
|
||||||
fi
|
fi
|
||||||
|
8
setup.py
8
setup.py
@ -16,9 +16,6 @@
|
|||||||
# 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 sys
|
||||||
import os
|
|
||||||
import shutil
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
from setuptools import setup, find_packages
|
from setuptools import setup, find_packages
|
||||||
from setuptools.command.test import test as TestCommand
|
from setuptools.command.test import test as TestCommand
|
||||||
@ -67,8 +64,8 @@ setup(
|
|||||||
include_package_data=True,
|
include_package_data=True,
|
||||||
zip_safe=False,
|
zip_safe=False,
|
||||||
platforms="any",
|
platforms="any",
|
||||||
python_requires='>=3.8',
|
python_requires=">=3.8",
|
||||||
setup_requires=["setuptools>=17.1"],
|
setup_requires=["setuptools>=45.2"],
|
||||||
classifiers=[
|
classifiers=[
|
||||||
"Development Status :: 5 - Production/Stable",
|
"Development Status :: 5 - Production/Stable",
|
||||||
"Environment :: Console",
|
"Environment :: Console",
|
||||||
@ -86,6 +83,7 @@ setup(
|
|||||||
"Programming Language :: Python :: 3.10",
|
"Programming Language :: Python :: 3.10",
|
||||||
"Programming Language :: Python :: 3.11",
|
"Programming Language :: Python :: 3.11",
|
||||||
"Programming Language :: Python :: 3.12",
|
"Programming Language :: Python :: 3.12",
|
||||||
|
"Programming Language :: Python :: 3.13",
|
||||||
"Programming Language :: Python :: Implementation :: CPython",
|
"Programming Language :: Python :: Implementation :: CPython",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -107,9 +107,9 @@ async def test_create(compute_project, manager):
|
|||||||
"{}:/gns3:ro".format(Docker.resources_path()),
|
"{}:/gns3:ro".format(Docker.resources_path()),
|
||||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network"))
|
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network"))
|
||||||
],
|
],
|
||||||
"Privileged": True
|
"Privileged": True,
|
||||||
|
"UsernsMode": "host"
|
||||||
},
|
},
|
||||||
"UsernsMode": "host",
|
|
||||||
"Volumes": {},
|
"Volumes": {},
|
||||||
"NetworkDisabled": True,
|
"NetworkDisabled": True,
|
||||||
"Hostname": "test",
|
"Hostname": "test",
|
||||||
@ -146,9 +146,9 @@ async def test_create_with_tag(compute_project, manager):
|
|||||||
"{}:/gns3:ro".format(Docker.resources_path()),
|
"{}:/gns3:ro".format(Docker.resources_path()),
|
||||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network"))
|
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network"))
|
||||||
],
|
],
|
||||||
"Privileged": True
|
"Privileged": True,
|
||||||
|
"UsernsMode": "host"
|
||||||
},
|
},
|
||||||
"UsernsMode": "host",
|
|
||||||
"Volumes": {},
|
"Volumes": {},
|
||||||
"NetworkDisabled": True,
|
"NetworkDisabled": True,
|
||||||
"Hostname": "test",
|
"Hostname": "test",
|
||||||
@ -189,9 +189,9 @@ async def test_create_vnc(compute_project, manager):
|
|||||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network")),
|
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network")),
|
||||||
"/tmp/.X11-unix/X{0}:/tmp/.X11-unix/X{0}:ro".format(vm._display)
|
"/tmp/.X11-unix/X{0}:/tmp/.X11-unix/X{0}:ro".format(vm._display)
|
||||||
],
|
],
|
||||||
"Privileged": True
|
"Privileged": True,
|
||||||
|
"UsernsMode": "host"
|
||||||
},
|
},
|
||||||
"UsernsMode": "host",
|
|
||||||
"Volumes": {},
|
"Volumes": {},
|
||||||
"NetworkDisabled": True,
|
"NetworkDisabled": True,
|
||||||
"Hostname": "test",
|
"Hostname": "test",
|
||||||
@ -319,9 +319,9 @@ async def test_create_start_cmd(compute_project, manager):
|
|||||||
"{}:/gns3:ro".format(Docker.resources_path()),
|
"{}:/gns3:ro".format(Docker.resources_path()),
|
||||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network"))
|
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network"))
|
||||||
],
|
],
|
||||||
"Privileged": True
|
"Privileged": True,
|
||||||
|
"UsernsMode": "host"
|
||||||
},
|
},
|
||||||
"UsernsMode": "host",
|
|
||||||
"Volumes": {},
|
"Volumes": {},
|
||||||
"Entrypoint": ["/gns3/init.sh"],
|
"Entrypoint": ["/gns3/init.sh"],
|
||||||
"Cmd": ["/bin/ls"],
|
"Cmd": ["/bin/ls"],
|
||||||
@ -418,9 +418,9 @@ async def test_create_image_not_available(compute_project, manager):
|
|||||||
"{}:/gns3:ro".format(Docker.resources_path()),
|
"{}:/gns3:ro".format(Docker.resources_path()),
|
||||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network"))
|
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network"))
|
||||||
],
|
],
|
||||||
"Privileged": True
|
"Privileged": True,
|
||||||
|
"UsernsMode": "host"
|
||||||
},
|
},
|
||||||
"UsernsMode": "host",
|
|
||||||
"Volumes": {},
|
"Volumes": {},
|
||||||
"NetworkDisabled": True,
|
"NetworkDisabled": True,
|
||||||
"Hostname": "test",
|
"Hostname": "test",
|
||||||
@ -462,9 +462,9 @@ async def test_create_with_user(compute_project, manager):
|
|||||||
"{}:/gns3:ro".format(Docker.resources_path()),
|
"{}:/gns3:ro".format(Docker.resources_path()),
|
||||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network"))
|
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network"))
|
||||||
],
|
],
|
||||||
"Privileged": True
|
"Privileged": True,
|
||||||
|
"UsernsMode": "host"
|
||||||
},
|
},
|
||||||
"UsernsMode": "host",
|
|
||||||
"Volumes": {},
|
"Volumes": {},
|
||||||
"NetworkDisabled": True,
|
"NetworkDisabled": True,
|
||||||
"Hostname": "test",
|
"Hostname": "test",
|
||||||
@ -546,9 +546,9 @@ async def test_create_with_extra_volumes_duplicate_1_image(compute_project, mana
|
|||||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network")),
|
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network")),
|
||||||
"{}:/gns3volumes/vol/1".format(os.path.join(vm.working_dir, "vol", "1")),
|
"{}:/gns3volumes/vol/1".format(os.path.join(vm.working_dir, "vol", "1")),
|
||||||
],
|
],
|
||||||
"Privileged": True
|
"Privileged": True,
|
||||||
|
"UsernsMode": "host"
|
||||||
},
|
},
|
||||||
"UsernsMode": "host",
|
|
||||||
"Volumes": {},
|
"Volumes": {},
|
||||||
"NetworkDisabled": True,
|
"NetworkDisabled": True,
|
||||||
"Hostname": "test",
|
"Hostname": "test",
|
||||||
@ -586,9 +586,9 @@ async def test_create_with_extra_volumes_duplicate_2_user(compute_project, manag
|
|||||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network")),
|
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network")),
|
||||||
"{}:/gns3volumes/vol/1".format(os.path.join(vm.working_dir, "vol", "1")),
|
"{}:/gns3volumes/vol/1".format(os.path.join(vm.working_dir, "vol", "1")),
|
||||||
],
|
],
|
||||||
"Privileged": True
|
"Privileged": True,
|
||||||
|
"UsernsMode": "host"
|
||||||
},
|
},
|
||||||
"UsernsMode": "host",
|
|
||||||
"Volumes": {},
|
"Volumes": {},
|
||||||
"NetworkDisabled": True,
|
"NetworkDisabled": True,
|
||||||
"Hostname": "test",
|
"Hostname": "test",
|
||||||
@ -626,9 +626,9 @@ async def test_create_with_extra_volumes_duplicate_3_subdir(compute_project, man
|
|||||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network")),
|
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network")),
|
||||||
"{}:/gns3volumes/vol".format(os.path.join(vm.working_dir, "vol")),
|
"{}:/gns3volumes/vol".format(os.path.join(vm.working_dir, "vol")),
|
||||||
],
|
],
|
||||||
"Privileged": True
|
"Privileged": True,
|
||||||
|
"UsernsMode": "host"
|
||||||
},
|
},
|
||||||
"UsernsMode": "host",
|
|
||||||
"Volumes": {},
|
"Volumes": {},
|
||||||
"NetworkDisabled": True,
|
"NetworkDisabled": True,
|
||||||
"Hostname": "test",
|
"Hostname": "test",
|
||||||
@ -666,9 +666,9 @@ async def test_create_with_extra_volumes_duplicate_4_backslash(compute_project,
|
|||||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network")),
|
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network")),
|
||||||
"{}:/gns3volumes/vol".format(os.path.join(vm.working_dir, "vol")),
|
"{}:/gns3volumes/vol".format(os.path.join(vm.working_dir, "vol")),
|
||||||
],
|
],
|
||||||
"Privileged": True
|
"Privileged": True,
|
||||||
|
"UsernsMode": "host"
|
||||||
},
|
},
|
||||||
"UsernsMode": "host",
|
|
||||||
"Volumes": {},
|
"Volumes": {},
|
||||||
"NetworkDisabled": True,
|
"NetworkDisabled": True,
|
||||||
"Hostname": "test",
|
"Hostname": "test",
|
||||||
@ -705,9 +705,9 @@ async def test_create_with_extra_volumes_duplicate_5_subdir_issue_1595(compute_p
|
|||||||
"{}:/gns3:ro".format(Docker.resources_path()),
|
"{}:/gns3:ro".format(Docker.resources_path()),
|
||||||
"{}:/gns3volumes/etc".format(os.path.join(vm.working_dir, "etc")),
|
"{}:/gns3volumes/etc".format(os.path.join(vm.working_dir, "etc")),
|
||||||
],
|
],
|
||||||
"Privileged": True
|
"Privileged": True,
|
||||||
|
"UsernsMode": "host"
|
||||||
},
|
},
|
||||||
"UsernsMode": "host",
|
|
||||||
"Volumes": {},
|
"Volumes": {},
|
||||||
"NetworkDisabled": True,
|
"NetworkDisabled": True,
|
||||||
"Hostname": "test",
|
"Hostname": "test",
|
||||||
@ -744,9 +744,9 @@ async def test_create_with_extra_volumes_duplicate_6_subdir_issue_1595(compute_p
|
|||||||
"{}:/gns3:ro".format(Docker.resources_path()),
|
"{}:/gns3:ro".format(Docker.resources_path()),
|
||||||
"{}:/gns3volumes/etc".format(os.path.join(vm.working_dir, "etc")),
|
"{}:/gns3volumes/etc".format(os.path.join(vm.working_dir, "etc")),
|
||||||
],
|
],
|
||||||
"Privileged": True
|
"Privileged": True,
|
||||||
|
"UsernsMode": "host"
|
||||||
},
|
},
|
||||||
"UsernsMode": "host",
|
|
||||||
"Volumes": {},
|
"Volumes": {},
|
||||||
"NetworkDisabled": True,
|
"NetworkDisabled": True,
|
||||||
"Hostname": "test",
|
"Hostname": "test",
|
||||||
@ -791,9 +791,9 @@ async def test_create_with_extra_volumes(compute_project, manager):
|
|||||||
"{}:/gns3volumes/vol/1".format(os.path.join(vm.working_dir, "vol", "1")),
|
"{}:/gns3volumes/vol/1".format(os.path.join(vm.working_dir, "vol", "1")),
|
||||||
"{}:/gns3volumes/vol/2".format(os.path.join(vm.working_dir, "vol", "2")),
|
"{}:/gns3volumes/vol/2".format(os.path.join(vm.working_dir, "vol", "2")),
|
||||||
],
|
],
|
||||||
"Privileged": True
|
"Privileged": True,
|
||||||
|
"UsernsMode": "host"
|
||||||
},
|
},
|
||||||
"UsernsMode": "host",
|
|
||||||
"Volumes": {},
|
"Volumes": {},
|
||||||
"NetworkDisabled": True,
|
"NetworkDisabled": True,
|
||||||
"Hostname": "test",
|
"Hostname": "test",
|
||||||
@ -1040,9 +1040,9 @@ async def test_update(vm):
|
|||||||
"{}:/gns3:ro".format(Docker.resources_path()),
|
"{}:/gns3:ro".format(Docker.resources_path()),
|
||||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network"))
|
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network"))
|
||||||
],
|
],
|
||||||
"Privileged": True
|
"Privileged": True,
|
||||||
|
"UsernsMode": "host"
|
||||||
},
|
},
|
||||||
"UsernsMode": "host",
|
|
||||||
"Volumes": {},
|
"Volumes": {},
|
||||||
"NetworkDisabled": True,
|
"NetworkDisabled": True,
|
||||||
"Hostname": "test",
|
"Hostname": "test",
|
||||||
@ -1109,9 +1109,9 @@ async def test_update_running(vm):
|
|||||||
"{}:/gns3:ro".format(Docker.resources_path()),
|
"{}:/gns3:ro".format(Docker.resources_path()),
|
||||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network"))
|
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network"))
|
||||||
],
|
],
|
||||||
"Privileged": True
|
"Privileged": True,
|
||||||
|
"UsernsMode": "host"
|
||||||
},
|
},
|
||||||
"UsernsMode": "host",
|
|
||||||
"Volumes": {},
|
"Volumes": {},
|
||||||
"NetworkDisabled": True,
|
"NetworkDisabled": True,
|
||||||
"Hostname": "test",
|
"Hostname": "test",
|
||||||
|
@ -96,7 +96,7 @@ async def test_start(vm):
|
|||||||
|
|
||||||
mock_process = MagicMock()
|
mock_process = MagicMock()
|
||||||
vm._check_requirements = AsyncioMagicMock(return_value=True)
|
vm._check_requirements = AsyncioMagicMock(return_value=True)
|
||||||
vm._check_iou_licence = AsyncioMagicMock(return_value=True)
|
vm._check_iou_license = AsyncioMagicMock(return_value=True)
|
||||||
vm._start_ubridge = AsyncioMagicMock(return_value=True)
|
vm._start_ubridge = AsyncioMagicMock(return_value=True)
|
||||||
vm._ubridge_send = AsyncioMagicMock()
|
vm._ubridge_send = AsyncioMagicMock()
|
||||||
|
|
||||||
@ -108,7 +108,7 @@ async def test_start(vm):
|
|||||||
assert vm.command_line == ' '.join(mock_exec.call_args[0])
|
assert vm.command_line == ' '.join(mock_exec.call_args[0])
|
||||||
|
|
||||||
assert vm._check_requirements.called
|
assert vm._check_requirements.called
|
||||||
assert vm._check_iou_licence.called
|
assert vm._check_iou_license.called
|
||||||
assert vm._start_ubridge.called
|
assert vm._start_ubridge.called
|
||||||
vm._ubridge_send.assert_any_call("iol_bridge delete IOL-BRIDGE-513")
|
vm._ubridge_send.assert_any_call("iol_bridge delete IOL-BRIDGE-513")
|
||||||
vm._ubridge_send.assert_any_call("iol_bridge create IOL-BRIDGE-513 513")
|
vm._ubridge_send.assert_any_call("iol_bridge create IOL-BRIDGE-513 513")
|
||||||
@ -123,7 +123,8 @@ async def test_start_with_iourc(vm, tmpdir):
|
|||||||
mock_process = MagicMock()
|
mock_process = MagicMock()
|
||||||
|
|
||||||
vm._check_requirements = AsyncioMagicMock(return_value=True)
|
vm._check_requirements = AsyncioMagicMock(return_value=True)
|
||||||
vm._check_iou_licence = AsyncioMagicMock(return_value=True)
|
vm._is_iou_license_check_enabled = AsyncioMagicMock(return_value=True)
|
||||||
|
vm._check_iou_license = AsyncioMagicMock(return_value=True)
|
||||||
vm._start_ioucon = AsyncioMagicMock(return_value=True)
|
vm._start_ioucon = AsyncioMagicMock(return_value=True)
|
||||||
vm._start_ubridge = AsyncioMagicMock(return_value=True)
|
vm._start_ubridge = AsyncioMagicMock(return_value=True)
|
||||||
vm._ubridge_send = AsyncioMagicMock()
|
vm._ubridge_send = AsyncioMagicMock()
|
||||||
@ -158,7 +159,7 @@ async def test_stop(vm):
|
|||||||
|
|
||||||
process = MagicMock()
|
process = MagicMock()
|
||||||
vm._check_requirements = AsyncioMagicMock(return_value=True)
|
vm._check_requirements = AsyncioMagicMock(return_value=True)
|
||||||
vm._check_iou_licence = AsyncioMagicMock(return_value=True)
|
vm._check_iou_license = AsyncioMagicMock(return_value=True)
|
||||||
vm._start_ioucon = AsyncioMagicMock(return_value=True)
|
vm._start_ioucon = AsyncioMagicMock(return_value=True)
|
||||||
vm._start_ubridge = AsyncioMagicMock(return_value=True)
|
vm._start_ubridge = AsyncioMagicMock(return_value=True)
|
||||||
vm._ubridge_send = AsyncioMagicMock()
|
vm._ubridge_send = AsyncioMagicMock()
|
||||||
@ -183,7 +184,7 @@ async def test_reload(vm, fake_iou_bin):
|
|||||||
|
|
||||||
process = MagicMock()
|
process = MagicMock()
|
||||||
vm._check_requirements = AsyncioMagicMock(return_value=True)
|
vm._check_requirements = AsyncioMagicMock(return_value=True)
|
||||||
vm._check_iou_licence = AsyncioMagicMock(return_value=True)
|
vm._check_iou_license = AsyncioMagicMock(return_value=True)
|
||||||
vm._start_ioucon = AsyncioMagicMock(return_value=True)
|
vm._start_ioucon = AsyncioMagicMock(return_value=True)
|
||||||
vm._start_ubridge = AsyncioMagicMock(return_value=True)
|
vm._start_ubridge = AsyncioMagicMock(return_value=True)
|
||||||
vm._ubridge_send = AsyncioMagicMock()
|
vm._ubridge_send = AsyncioMagicMock()
|
||||||
@ -376,42 +377,42 @@ def test_get_legacy_vm_workdir():
|
|||||||
async def test_invalid_iou_file(vm, iourc_file):
|
async def test_invalid_iou_file(vm, iourc_file):
|
||||||
|
|
||||||
hostname = socket.gethostname()
|
hostname = socket.gethostname()
|
||||||
await vm._check_iou_licence()
|
await vm._check_iou_license()
|
||||||
|
|
||||||
# Missing ;
|
# Missing ;
|
||||||
with pytest.raises(IOUError):
|
with pytest.raises(IOUError):
|
||||||
with open(iourc_file, "w+") as f:
|
with open(iourc_file, "w+") as f:
|
||||||
f.write("[license]\n{} = aaaaaaaaaaaaaaaa".format(hostname))
|
f.write("[license]\n{} = aaaaaaaaaaaaaaaa".format(hostname))
|
||||||
await vm._check_iou_licence()
|
await vm._check_iou_license()
|
||||||
|
|
||||||
# Key too short
|
# Key too short
|
||||||
with pytest.raises(IOUError):
|
with pytest.raises(IOUError):
|
||||||
with open(iourc_file, "w+") as f:
|
with open(iourc_file, "w+") as f:
|
||||||
f.write("[license]\n{} = aaaaaaaaaaaaaa;".format(hostname))
|
f.write("[license]\n{} = aaaaaaaaaaaaaa;".format(hostname))
|
||||||
await vm._check_iou_licence()
|
await vm._check_iou_license()
|
||||||
|
|
||||||
# Invalid hostname
|
# Invalid hostname
|
||||||
with pytest.raises(IOUError):
|
with pytest.raises(IOUError):
|
||||||
with open(iourc_file, "w+") as f:
|
with open(iourc_file, "w+") as f:
|
||||||
f.write("[license]\nbla = aaaaaaaaaaaaaa;")
|
f.write("[license]\nbla = aaaaaaaaaaaaaa;")
|
||||||
await vm._check_iou_licence()
|
await vm._check_iou_license()
|
||||||
|
|
||||||
# Missing licence section
|
# Missing licence section
|
||||||
with pytest.raises(IOUError):
|
with pytest.raises(IOUError):
|
||||||
with open(iourc_file, "w+") as f:
|
with open(iourc_file, "w+") as f:
|
||||||
f.write("[licensetest]\n{} = aaaaaaaaaaaaaaaa;")
|
f.write("[licensetest]\n{} = aaaaaaaaaaaaaaaa;")
|
||||||
await vm._check_iou_licence()
|
await vm._check_iou_license()
|
||||||
|
|
||||||
# Broken config file
|
# Broken config file
|
||||||
with pytest.raises(IOUError):
|
with pytest.raises(IOUError):
|
||||||
with open(iourc_file, "w+") as f:
|
with open(iourc_file, "w+") as f:
|
||||||
f.write("[")
|
f.write("[")
|
||||||
await vm._check_iou_licence()
|
await vm._check_iou_license()
|
||||||
|
|
||||||
# Missing file
|
# Missing file
|
||||||
with pytest.raises(IOUError):
|
with pytest.raises(IOUError):
|
||||||
os.remove(iourc_file)
|
os.remove(iourc_file)
|
||||||
await vm._check_iou_licence()
|
await vm._check_iou_license()
|
||||||
|
|
||||||
|
|
||||||
def test_iourc_content(vm):
|
def test_iourc_content(vm):
|
||||||
|
@ -353,16 +353,23 @@ async def test_set_platform(compute_project, manager):
|
|||||||
async def test_disk_options(vm, tmpdir, fake_qemu_img_binary):
|
async def test_disk_options(vm, tmpdir, fake_qemu_img_binary):
|
||||||
|
|
||||||
vm._hda_disk_image = str(tmpdir / "test.qcow2")
|
vm._hda_disk_image = str(tmpdir / "test.qcow2")
|
||||||
|
vm._hda_disk_interface = "ide"
|
||||||
|
vm._hdb_disk_image = str(tmpdir / "test2.qcow2")
|
||||||
open(vm._hda_disk_image, "w+").close()
|
open(vm._hda_disk_image, "w+").close()
|
||||||
|
open(vm._hdb_disk_image, "w+").close()
|
||||||
|
|
||||||
with asyncio_patch("gns3server.compute.qemu.qemu_vm.QemuVM._find_disk_file_format", return_value="qcow2"):
|
with (asyncio_patch("gns3server.compute.qemu.qemu_vm.QemuVM._find_disk_file_format", return_value="qcow2")):
|
||||||
with asyncio_patch("asyncio.create_subprocess_exec", return_value=MagicMock()) as process:
|
with asyncio_patch("asyncio.create_subprocess_exec", return_value=MagicMock()) as process:
|
||||||
options = await vm._disk_options()
|
options = await vm._disk_options()
|
||||||
assert process.called
|
assert process.called
|
||||||
args, kwargs = process.call_args
|
args, kwargs = process.call_args
|
||||||
assert args == (fake_qemu_img_binary, "create", "-o", "backing_file={}".format(vm._hda_disk_image), "-F", "qcow2", "-f", "qcow2", os.path.join(vm.working_dir, "hda_disk.qcow2"))
|
assert args == (fake_qemu_img_binary, "create", "-o", "backing_file={}".format(vm._hda_disk_image), "-F", "qcow2", "-f", "qcow2", os.path.join(vm.working_dir, "hda_disk.qcow2")) or \
|
||||||
|
args == (fake_qemu_img_binary, "create", "-o", "backing_file={}".format(vm._hdb_disk_image), "-F", "qcow2", "-f", "qcow2", os.path.join(vm.working_dir, "hdb_disk.qcow2"))
|
||||||
|
|
||||||
assert options == ['-drive', 'file=' + os.path.join(vm.working_dir, "hda_disk.qcow2") + ',if=ide,index=0,media=disk,id=drive0']
|
assert options == [
|
||||||
|
'-drive', 'file=' + os.path.join(vm.working_dir, "hda_disk.qcow2") + ',if=ide,index=0,media=disk,id=drive0',
|
||||||
|
'-drive', 'file=' + os.path.join(vm.working_dir, "hdb_disk.qcow2") + ',if=none,index=1,media=disk,id=drive1',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
async def test_cdrom_option(vm, tmpdir, fake_qemu_img_binary):
|
async def test_cdrom_option(vm, tmpdir, fake_qemu_img_binary):
|
||||||
@ -389,16 +396,20 @@ async def test_uefi_boot_mode_option(vm, tmpdir, images_dir, fake_qemu_img_binar
|
|||||||
vm._uefi = True
|
vm._uefi = True
|
||||||
|
|
||||||
# create fake OVMF files
|
# create fake OVMF files
|
||||||
ovmf_code_path = os.path.join(images_dir, "OVMF_CODE.fd")
|
system_ovmf_firmware_path = "/usr/share/OVMF/OVMF_CODE_4M.fd"
|
||||||
with open(ovmf_code_path, "w+") as f:
|
if os.path.exists(system_ovmf_firmware_path):
|
||||||
f.write('1')
|
ovmf_code_path = system_ovmf_firmware_path
|
||||||
ovmf_vars_path = os.path.join(images_dir, "OVMF_VARS.fd")
|
else:
|
||||||
|
ovmf_code_path = os.path.join(images_dir, "OVMF_CODE_4M.fd")
|
||||||
|
with open(ovmf_code_path, "w+") as f:
|
||||||
|
f.write('1')
|
||||||
|
ovmf_vars_path = os.path.join(images_dir, "OVMF_VARS_4M.fd")
|
||||||
with open(ovmf_vars_path, "w+") as f:
|
with open(ovmf_vars_path, "w+") as f:
|
||||||
f.write('1')
|
f.write('1')
|
||||||
|
|
||||||
options = await vm._build_command()
|
options = await vm._build_command()
|
||||||
assert ' '.join(["-drive", "if=pflash,format=raw,readonly,file={}".format(ovmf_code_path)]) in ' '.join(options)
|
assert ' '.join(["-drive", "if=pflash,format=raw,readonly,file={}".format(ovmf_code_path)]) in ' '.join(options)
|
||||||
assert ' '.join(["-drive", "if=pflash,format=raw,file={}".format(os.path.join(vm.working_dir, "OVMF_VARS.fd"))]) in ' '.join(options)
|
assert ' '.join(["-drive", "if=pflash,format=raw,file={}".format(os.path.join(vm.working_dir, "OVMF_VARS_4M.fd"))]) in ' '.join(options)
|
||||||
|
|
||||||
|
|
||||||
async def test_uefi_with_bios_image_already_configured(vm, tmpdir, fake_qemu_img_binary):
|
async def test_uefi_with_bios_image_already_configured(vm, tmpdir, fake_qemu_img_binary):
|
||||||
@ -440,9 +451,13 @@ async def test_tpm_option(vm, tmpdir, fake_qemu_img_binary):
|
|||||||
async def test_disk_options_multiple_disk(vm, tmpdir, fake_qemu_img_binary):
|
async def test_disk_options_multiple_disk(vm, tmpdir, fake_qemu_img_binary):
|
||||||
|
|
||||||
vm._hda_disk_image = str(tmpdir / "test0.qcow2")
|
vm._hda_disk_image = str(tmpdir / "test0.qcow2")
|
||||||
|
vm._hda_disk_interface = "ide"
|
||||||
vm._hdb_disk_image = str(tmpdir / "test1.qcow2")
|
vm._hdb_disk_image = str(tmpdir / "test1.qcow2")
|
||||||
|
vm._hdb_disk_interface = "ide"
|
||||||
vm._hdc_disk_image = str(tmpdir / "test2.qcow2")
|
vm._hdc_disk_image = str(tmpdir / "test2.qcow2")
|
||||||
|
vm._hdc_disk_interface = "ide"
|
||||||
vm._hdd_disk_image = str(tmpdir / "test3.qcow2")
|
vm._hdd_disk_image = str(tmpdir / "test3.qcow2")
|
||||||
|
vm._hdd_disk_interface = "ide"
|
||||||
open(vm._hda_disk_image, "w+").close()
|
open(vm._hda_disk_image, "w+").close()
|
||||||
open(vm._hdb_disk_image, "w+").close()
|
open(vm._hdb_disk_image, "w+").close()
|
||||||
open(vm._hdc_disk_image, "w+").close()
|
open(vm._hdc_disk_image, "w+").close()
|
||||||
|
@ -239,12 +239,12 @@ async def test_list_images(qemu, tmpdir):
|
|||||||
os.makedirs(tmp_images_dir, exist_ok=True)
|
os.makedirs(tmp_images_dir, exist_ok=True)
|
||||||
for image in fake_images:
|
for image in fake_images:
|
||||||
with open(os.path.join(tmp_images_dir, image), "w+") as f:
|
with open(os.path.join(tmp_images_dir, image), "w+") as f:
|
||||||
f.write("1")
|
f.write("1234567")
|
||||||
|
|
||||||
with patch("gns3server.utils.images.default_images_directory", return_value=str(tmp_images_dir)):
|
with patch("gns3server.utils.images.default_images_directory", return_value=str(tmp_images_dir)):
|
||||||
assert sorted(await qemu.list_images(), key=lambda k: k['filename']) == [
|
assert sorted(await qemu.list_images(), key=lambda k: k['filename']) == [
|
||||||
{"filename": "a.qcow2", "path": "a.qcow2", "md5sum": "c4ca4238a0b923820dcc509a6f75849b", "filesize": 1},
|
{"filename": "a.qcow2", "path": "a.qcow2", "md5sum": "fcea920f7412b5da7be0cf42b8c93759", "filesize": 7},
|
||||||
{"filename": "b.qcow2", "path": "b.qcow2", "md5sum": "c4ca4238a0b923820dcc509a6f75849b", "filesize": 1}
|
{"filename": "b.qcow2", "path": "b.qcow2", "md5sum": "fcea920f7412b5da7be0cf42b8c93759", "filesize": 7}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@ -255,19 +255,19 @@ async def test_list_images_recursives(qemu, tmpdir):
|
|||||||
fake_images = ["a.qcow2", "b.qcow2", ".blu.qcow2", "a.qcow2.md5sum"]
|
fake_images = ["a.qcow2", "b.qcow2", ".blu.qcow2", "a.qcow2.md5sum"]
|
||||||
for image in fake_images:
|
for image in fake_images:
|
||||||
with open(os.path.join(tmp_images_dir, image), "w+") as f:
|
with open(os.path.join(tmp_images_dir, image), "w+") as f:
|
||||||
f.write("1")
|
f.write("1234567")
|
||||||
os.makedirs(os.path.join(tmp_images_dir, "c"))
|
os.makedirs(os.path.join(tmp_images_dir, "c"))
|
||||||
fake_images = ["c.qcow2", "c.qcow2.md5sum"]
|
fake_images = ["c.qcow2", "c.qcow2.md5sum"]
|
||||||
for image in fake_images:
|
for image in fake_images:
|
||||||
with open(os.path.join(tmp_images_dir, "c", image), "w+") as f:
|
with open(os.path.join(tmp_images_dir, "c", image), "w+") as f:
|
||||||
f.write("1")
|
f.write("1234567")
|
||||||
|
|
||||||
with patch("gns3server.utils.images.default_images_directory", return_value=str(tmp_images_dir)):
|
with patch("gns3server.utils.images.default_images_directory", return_value=str(tmp_images_dir)):
|
||||||
|
|
||||||
assert sorted(await qemu.list_images(), key=lambda k: k['filename']) == [
|
assert sorted(await qemu.list_images(), key=lambda k: k['filename']) == [
|
||||||
{"filename": "a.qcow2", "path": "a.qcow2", "md5sum": "c4ca4238a0b923820dcc509a6f75849b", "filesize": 1},
|
{"filename": "a.qcow2", "path": "a.qcow2", "md5sum": "fcea920f7412b5da7be0cf42b8c93759", "filesize": 7},
|
||||||
{"filename": "b.qcow2", "path": "b.qcow2", "md5sum": "c4ca4238a0b923820dcc509a6f75849b", "filesize": 1},
|
{"filename": "b.qcow2", "path": "b.qcow2", "md5sum": "fcea920f7412b5da7be0cf42b8c93759", "filesize": 7},
|
||||||
{"filename": "c.qcow2", "path": force_unix_path(os.path.sep.join(["c", "c.qcow2"])), "md5sum": "c4ca4238a0b923820dcc509a6f75849b", "filesize": 1}
|
{"filename": "c.qcow2", "path": force_unix_path(os.path.sep.join(["c", "c.qcow2"])), "md5sum": "fcea920f7412b5da7be0cf42b8c93759", "filesize": 7}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ async def test_compute_httpQuery(compute):
|
|||||||
response.status = 200
|
response.status = 200
|
||||||
await compute.post("/projects", {"a": "b"})
|
await compute.post("/projects", {"a": "b"})
|
||||||
await compute.close()
|
await compute.close()
|
||||||
mock.assert_called_with("POST", "https://example.com:84/v2/compute/projects", data=b'{"a": "b"}', headers={'content-type': 'application/json'}, auth=None, chunked=None, timeout=20)
|
mock.assert_called_with("POST", "https://example.com:84/v2/compute/projects", data=b'{"a": "b"}', headers={'content-type': 'application/json'}, auth=None, chunked=None, timeout=120)
|
||||||
assert compute._auth is None
|
assert compute._auth is None
|
||||||
|
|
||||||
|
|
||||||
@ -99,7 +99,7 @@ async def test_compute_httpQueryAuth(compute):
|
|||||||
compute.password = "toor"
|
compute.password = "toor"
|
||||||
await compute.post("/projects", {"a": "b"})
|
await compute.post("/projects", {"a": "b"})
|
||||||
await compute.close()
|
await compute.close()
|
||||||
mock.assert_called_with("POST", "https://example.com:84/v2/compute/projects", data=b'{"a": "b"}', headers={'content-type': 'application/json'}, auth=compute._auth, chunked=None, timeout=20)
|
mock.assert_called_with("POST", "https://example.com:84/v2/compute/projects", data=b'{"a": "b"}', headers={'content-type': 'application/json'}, auth=compute._auth, chunked=None, timeout=120)
|
||||||
assert compute._auth.login == "root"
|
assert compute._auth.login == "root"
|
||||||
assert compute._auth.password == "toor"
|
assert compute._auth.password == "toor"
|
||||||
|
|
||||||
@ -156,7 +156,7 @@ async def test_compute_httpQueryNotConnectedInvalidVersion(compute):
|
|||||||
with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock:
|
with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock:
|
||||||
with pytest.raises(aiohttp.web.HTTPConflict):
|
with pytest.raises(aiohttp.web.HTTPConflict):
|
||||||
await compute.post("/projects", {"a": "b"})
|
await compute.post("/projects", {"a": "b"})
|
||||||
mock.assert_any_call("GET", "https://example.com:84/v2/compute/capabilities", headers={'content-type': 'application/json'}, data=None, auth=None, chunked=None, timeout=20)
|
mock.assert_any_call("GET", "https://example.com:84/v2/compute/capabilities", headers={'content-type': 'application/json'}, data=None, auth=None, chunked=None, timeout=120)
|
||||||
await compute.close()
|
await compute.close()
|
||||||
|
|
||||||
|
|
||||||
@ -169,7 +169,7 @@ async def test_compute_httpQueryNotConnectedNonGNS3Server(compute):
|
|||||||
with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock:
|
with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock:
|
||||||
with pytest.raises(aiohttp.web.HTTPConflict):
|
with pytest.raises(aiohttp.web.HTTPConflict):
|
||||||
await compute.post("/projects", {"a": "b"})
|
await compute.post("/projects", {"a": "b"})
|
||||||
mock.assert_any_call("GET", "https://example.com:84/v2/compute/capabilities", headers={'content-type': 'application/json'}, data=None, auth=None, chunked=None, timeout=20)
|
mock.assert_any_call("GET", "https://example.com:84/v2/compute/capabilities", headers={'content-type': 'application/json'}, data=None, auth=None, chunked=None, timeout=120)
|
||||||
await compute.close()
|
await compute.close()
|
||||||
|
|
||||||
|
|
||||||
@ -182,7 +182,7 @@ async def test_compute_httpQueryNotConnectedNonGNS3Server2(compute):
|
|||||||
with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock:
|
with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock:
|
||||||
with pytest.raises(aiohttp.web.HTTPConflict):
|
with pytest.raises(aiohttp.web.HTTPConflict):
|
||||||
await compute.post("/projects", {"a": "b"})
|
await compute.post("/projects", {"a": "b"})
|
||||||
mock.assert_any_call("GET", "https://example.com:84/v2/compute/capabilities", headers={'content-type': 'application/json'}, data=None, auth=None, chunked=None, timeout=20)
|
mock.assert_any_call("GET", "https://example.com:84/v2/compute/capabilities", headers={'content-type': 'application/json'}, data=None, auth=None, chunked=None, timeout=120)
|
||||||
|
|
||||||
|
|
||||||
async def test_compute_httpQueryError(compute):
|
async def test_compute_httpQueryError(compute):
|
||||||
@ -217,7 +217,7 @@ async def test_compute_httpQuery_project(compute):
|
|||||||
project = Project(name="Test")
|
project = Project(name="Test")
|
||||||
mock_notification.assert_called()
|
mock_notification.assert_called()
|
||||||
await compute.post("/projects", project)
|
await compute.post("/projects", project)
|
||||||
mock.assert_called_with("POST", "https://example.com:84/v2/compute/projects", data=json.dumps(project.__json__()), headers={'content-type': 'application/json'}, auth=None, chunked=None, timeout=20)
|
mock.assert_called_with("POST", "https://example.com:84/v2/compute/projects", data=json.dumps(project.__json__()), headers={'content-type': 'application/json'}, auth=None, chunked=None, timeout=120)
|
||||||
await compute.close()
|
await compute.close()
|
||||||
|
|
||||||
# FIXME: https://github.com/aio-libs/aiohttp/issues/2525
|
# FIXME: https://github.com/aio-libs/aiohttp/issues/2525
|
||||||
@ -424,7 +424,7 @@ async def test_interfaces(compute):
|
|||||||
response.status = 200
|
response.status = 200
|
||||||
with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock:
|
with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock:
|
||||||
assert await compute.interfaces() == res
|
assert await compute.interfaces() == res
|
||||||
mock.assert_any_call("GET", "https://example.com:84/v2/compute/network/interfaces", auth=None, chunked=None, data=None, headers={'content-type': 'application/json'}, timeout=20)
|
mock.assert_any_call("GET", "https://example.com:84/v2/compute/network/interfaces", auth=None, chunked=None, data=None, headers={'content-type': 'application/json'}, timeout=120)
|
||||||
await compute.close()
|
await compute.close()
|
||||||
|
|
||||||
|
|
||||||
|
@ -144,7 +144,7 @@ def fake_image(tmpdir):
|
|||||||
|
|
||||||
path = str(tmpdir / "7200.bin")
|
path = str(tmpdir / "7200.bin")
|
||||||
with open(path, "wb+") as f:
|
with open(path, "wb+") as f:
|
||||||
f.write(b'\x7fELF\x01\x01\x01')
|
f.write(b'\x7fELF\x01\x02\x01')
|
||||||
os.chmod(path, stat.S_IREAD)
|
os.chmod(path, stat.S_IREAD)
|
||||||
return path
|
return path
|
||||||
|
|
||||||
@ -168,7 +168,7 @@ async def test_images(compute_api, tmpdir, fake_image, fake_file):
|
|||||||
assert response.json == [{"filename": "7200.bin",
|
assert response.json == [{"filename": "7200.bin",
|
||||||
"path": "7200.bin",
|
"path": "7200.bin",
|
||||||
"filesize": 7,
|
"filesize": 7,
|
||||||
"md5sum": "e573e8f5c93c6c00783f20c7a170aa6c"
|
"md5sum": "b0d5aa897d937aced5a6b1046e8f7e2e"
|
||||||
}]
|
}]
|
||||||
|
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ def fake_qemu_vm(images_dir):
|
|||||||
img_dir = os.path.join(images_dir, "QEMU")
|
img_dir = os.path.join(images_dir, "QEMU")
|
||||||
bin_path = os.path.join(img_dir, "linux载.img")
|
bin_path = os.path.join(img_dir, "linux载.img")
|
||||||
with open(bin_path, "w+") as f:
|
with open(bin_path, "w+") as f:
|
||||||
f.write("1")
|
f.write("1234567")
|
||||||
os.chmod(bin_path, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)
|
os.chmod(bin_path, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)
|
||||||
return bin_path
|
return bin_path
|
||||||
|
|
||||||
@ -101,7 +101,7 @@ async def test_qemu_create_with_params(compute_api, compute_project, base_params
|
|||||||
assert response.json["project_id"] == compute_project.id
|
assert response.json["project_id"] == compute_project.id
|
||||||
assert response.json["ram"] == 1024
|
assert response.json["ram"] == 1024
|
||||||
assert response.json["hda_disk_image"] == "linux载.img"
|
assert response.json["hda_disk_image"] == "linux载.img"
|
||||||
assert response.json["hda_disk_image_md5sum"] == "c4ca4238a0b923820dcc509a6f75849b"
|
assert response.json["hda_disk_image_md5sum"] == "fcea920f7412b5da7be0cf42b8c93759"
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skipif(sys.platform.startswith("win"), reason="Not supported on Windows")
|
@pytest.mark.skipif(sys.platform.startswith("win"), reason="Not supported on Windows")
|
||||||
@ -279,7 +279,7 @@ async def test_images(compute_api, fake_qemu_vm):
|
|||||||
|
|
||||||
response = await compute_api.get("/qemu/images")
|
response = await compute_api.get("/qemu/images")
|
||||||
assert response.status == 200
|
assert response.status == 200
|
||||||
assert {"filename": "linux载.img", "path": "linux载.img", "md5sum": "c4ca4238a0b923820dcc509a6f75849b", "filesize": 1} in response.json
|
assert {"filename": "linux载.img", "path": "linux载.img", "md5sum": "fcea920f7412b5da7be0cf42b8c93759", "filesize": 7} in response.json
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skipif(sys.platform.startswith("win"), reason="Does not work on Windows")
|
@pytest.mark.skipif(sys.platform.startswith("win"), reason="Does not work on Windows")
|
||||||
|
@ -114,66 +114,91 @@ def test_remove_checksum(tmpdir):
|
|||||||
|
|
||||||
def test_list_images(tmpdir):
|
def test_list_images(tmpdir):
|
||||||
|
|
||||||
path1 = tmpdir / "images1" / "IOS" / "test1.image"
|
# IOS image in the images directory
|
||||||
path1.write(b'\x7fELF\x01\x01\x01', ensure=True)
|
ios_image_1 = tmpdir / "images1" / "IOS" / "ios_image_1.image"
|
||||||
path1 = force_unix_path(str(path1))
|
ios_image_1.write(b'\x7fELF\x01\x02\x01', ensure=True)
|
||||||
|
ios_image_1 = force_unix_path(str(ios_image_1))
|
||||||
|
|
||||||
path2 = tmpdir / "images2" / "test2.image"
|
# IOS image in an additional images path
|
||||||
path2.write(b'\x7fELF\x01\x01\x01', ensure=True)
|
ios_image_2 = tmpdir / "images2" / "ios_image_2.image"
|
||||||
path2 = force_unix_path(str(path2))
|
ios_image_2.write(b'\x7fELF\x01\x02\x01', ensure=True)
|
||||||
|
ios_image_2 = force_unix_path(str(ios_image_2))
|
||||||
|
|
||||||
# Invalid image because not a valid elf file
|
# Not a valid elf file
|
||||||
path = tmpdir / "images2" / "test_invalid.image"
|
not_elf_file = tmpdir / "images1" / "IOS" / "not_elf.image"
|
||||||
path.write(b'NOTANELF', ensure=True)
|
not_elf_file.write(b'NOTANELF', ensure=True)
|
||||||
|
not_elf_file = force_unix_path(str(not_elf_file))
|
||||||
|
|
||||||
|
# Invalid image because it is very small
|
||||||
|
small_file = tmpdir / "images1" / "too_small.image"
|
||||||
|
small_file.write(b'1', ensure=True)
|
||||||
|
|
||||||
if sys.platform.startswith("linux"):
|
if sys.platform.startswith("linux"):
|
||||||
path3 = tmpdir / "images1" / "IOU" / "test3.bin"
|
# 64-bit IOU image
|
||||||
path3.write(b'\x7fELF\x02\x01\x01', ensure=True)
|
iou_image_1 = tmpdir / "images1" / "IOU" / "iou64.bin"
|
||||||
path3 = force_unix_path(str(path3))
|
iou_image_1.write(b'\x7fELF\x02\x01\x01', ensure=True)
|
||||||
|
iou_image_1 = force_unix_path(str(iou_image_1))
|
||||||
|
# 32-bit IOU image
|
||||||
|
iou_image_2 = tmpdir / "images1" / "IOU" / "iou32.bin"
|
||||||
|
iou_image_2.write(b'\x7fELF\x01\x01\x01', ensure=True) # 32-bit IOU image
|
||||||
|
iou_image_2 = force_unix_path(str(iou_image_2))
|
||||||
|
|
||||||
path4 = tmpdir / "images1" / "QEMU" / "test4.qcow2"
|
|
||||||
path4.write("1", ensure=True)
|
|
||||||
path4 = force_unix_path(str(path4))
|
|
||||||
|
|
||||||
path5 = tmpdir / "images1" / "QEMU" / "test4.qcow2.md5sum"
|
# Qemu image
|
||||||
path5.write("1", ensure=True)
|
qemu_image_1 = tmpdir / "images1" / "QEMU" / "qemu_image.qcow2"
|
||||||
path5 = force_unix_path(str(path5))
|
qemu_image_1.write("1234567", ensure=True)
|
||||||
|
qemu_image_1 = force_unix_path(str(qemu_image_1))
|
||||||
|
|
||||||
|
# ELF file inside the Qemu
|
||||||
|
elf_file = tmpdir / "images1" / "QEMU" / "elf_file.bin"
|
||||||
|
elf_file.write(b'\x7fELF\x02\x01\x01', ensure=True) # ELF file
|
||||||
|
elf_file = force_unix_path(str(elf_file))
|
||||||
|
|
||||||
|
md5sum_file = tmpdir / "images1" / "QEMU" / "image.qcow2.md5sum"
|
||||||
|
md5sum_file.write("1", ensure=True)
|
||||||
|
md5sum_file = force_unix_path(str(md5sum_file))
|
||||||
|
|
||||||
with patch("gns3server.config.Config.get_section_config", return_value={
|
with patch("gns3server.config.Config.get_section_config", return_value={
|
||||||
"images_path": str(tmpdir / "images1"),
|
"images_path": str(tmpdir / "images1"),
|
||||||
"additional_images_path": "/tmp/null24564;{}".format(str(tmpdir / "images2")),
|
"additional_images_path": "/tmp/null24564;{}".format(str(tmpdir / "images2")),
|
||||||
"local": False}):
|
"local": False}):
|
||||||
|
|
||||||
assert list_images("dynamips") == [
|
assert sorted(list_images("dynamips"), key=lambda k: k['filename']) == [
|
||||||
{
|
{
|
||||||
'filename': 'test1.image',
|
'filename': 'ios_image_1.image',
|
||||||
'filesize': 7,
|
'filesize': 7,
|
||||||
'md5sum': 'e573e8f5c93c6c00783f20c7a170aa6c',
|
'md5sum': 'b0d5aa897d937aced5a6b1046e8f7e2e',
|
||||||
'path': 'test1.image'
|
'path': 'ios_image_1.image'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'filename': 'test2.image',
|
'filename': 'ios_image_2.image',
|
||||||
'filesize': 7,
|
'filesize': 7,
|
||||||
'md5sum': 'e573e8f5c93c6c00783f20c7a170aa6c',
|
'md5sum': 'b0d5aa897d937aced5a6b1046e8f7e2e',
|
||||||
'path': str(path2)
|
'path': str(ios_image_2)
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
if sys.platform.startswith("linux"):
|
if sys.platform.startswith("linux"):
|
||||||
assert list_images("iou") == [
|
assert sorted(list_images("iou"), key=lambda k: k['filename']) == [
|
||||||
{
|
{
|
||||||
'filename': 'test3.bin',
|
'filename': 'iou32.bin',
|
||||||
|
'filesize': 7,
|
||||||
|
'md5sum': 'e573e8f5c93c6c00783f20c7a170aa6c',
|
||||||
|
'path': 'iou32.bin'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'filename': 'iou64.bin',
|
||||||
'filesize': 7,
|
'filesize': 7,
|
||||||
'md5sum': 'c73626d23469519894d58bc98bee9655',
|
'md5sum': 'c73626d23469519894d58bc98bee9655',
|
||||||
'path': 'test3.bin'
|
'path': 'iou64.bin'
|
||||||
}
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
assert list_images("qemu") == [
|
assert sorted(list_images("qemu"), key=lambda k: k['filename']) == [
|
||||||
{
|
{
|
||||||
'filename': 'test4.qcow2',
|
'filename': 'qemu_image.qcow2',
|
||||||
'filesize': 1,
|
'filesize': 7,
|
||||||
'md5sum': 'c4ca4238a0b923820dcc509a6f75849b',
|
'md5sum': 'fcea920f7412b5da7be0cf42b8c93759',
|
||||||
'path': 'test4.qcow2'
|
'path': 'qemu_image.qcow2'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
Loading…
Reference in New Issue
Block a user