mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-11-07 15:43:43 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1aca7dbe04 | ||
|
|
338128ca3e | ||
|
|
c80a55b18c | ||
|
|
284a4b62fb | ||
|
|
d33fefa183 | ||
|
|
dfb48c884b | ||
|
|
18ba60d1a3 | ||
|
|
521132726e | ||
|
|
f80aca7633 | ||
|
|
84914ecfa4 | ||
|
|
5696d1ccb7 | ||
|
|
18b0863ba8 | ||
|
|
ece47dc279 | ||
|
|
6e1d49d8ca | ||
|
|
2e550d839e | ||
|
|
a4b24eaceb | ||
|
|
f04702d607 | ||
|
|
6f11df6189 | ||
|
|
9cf2e4f5a6 | ||
|
|
9316876f97 | ||
|
|
f3b8f43689 | ||
|
|
2d74d1ad94 | ||
|
|
ec50cc7c0d | ||
|
|
f8ee3b3d50 | ||
|
|
67e42f9353 | ||
|
|
31a490211b | ||
|
|
c7df8331ed | ||
|
|
de1654a50f | ||
|
|
a6959de1f8 | ||
|
|
8cfedce468 | ||
|
|
77dd772314 | ||
|
|
9ff302592c | ||
|
|
6b3d4feab8 | ||
|
|
78b2b93540 | ||
|
|
0303e21059 | ||
|
|
e20d1adb0e | ||
|
|
e5bee8ff52 | ||
|
|
58471ea7f4 | ||
|
|
9fb0ba5a71 | ||
|
|
3d738e83f5 | ||
|
|
40c22e389e | ||
|
|
0419c081fe | ||
|
|
dced70a565 | ||
|
|
0d0a06799d | ||
|
|
eeae27ae0d | ||
|
|
8d4df08150 | ||
|
|
fd1d8d9d86 | ||
|
|
4ddce880ea | ||
|
|
e0209a0491 | ||
|
|
e96d8ae497 | ||
|
|
129f0a631c | ||
|
|
ad1f1cdb96 | ||
|
|
ab6c6535c6 | ||
|
|
3444615253 | ||
|
|
028f977823 | ||
|
|
b6cf3aabca | ||
|
|
6546407e5d | ||
|
|
46b022f726 | ||
|
|
8f296e54f4 | ||
|
|
fc7d5be736 | ||
|
|
600c18f04b | ||
|
|
852de03d43 | ||
|
|
470e6cb901 | ||
|
|
e8273fb19e | ||
|
|
4b3d6572d4 | ||
|
|
fad3df453d | ||
|
|
d1c8f33fc5 | ||
|
|
3634cc8307 | ||
|
|
3b108563a0 | ||
|
|
7277d526e3 | ||
|
|
790bf4521d | ||
|
|
9e5ca50302 | ||
|
|
35ec8bed6e | ||
|
|
0433065b8b | ||
|
|
7c5a5a9001 | ||
|
|
1b32ef7854 | ||
|
|
f5b1920f8c | ||
|
|
4341db0ff3 | ||
|
|
162a8baf7b | ||
|
|
4280655b3a | ||
|
|
d47e546fce | ||
|
|
2b4d623f13 | ||
|
|
3c901a84bf | ||
|
|
ec3c36d6da | ||
|
|
908911e764 | ||
|
|
bdd703a0dc | ||
|
|
4acc457674 | ||
|
|
67bf14776f | ||
|
|
2eb64200a4 | ||
|
|
988ca7574c | ||
|
|
527d4bb3ea | ||
|
|
1e4075ec37 | ||
|
|
9d8ddea577 | ||
|
|
bccfb64958 |
No files matched your search
@@ -2,9 +2,13 @@ name: testing
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
branches:
|
||||
- master
|
||||
- 2.2
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
branches:
|
||||
- master
|
||||
- 2.2
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -12,7 +16,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: ["3.6", "3.7", "3.8", "3.9", "3.10"]
|
||||
python-version: ["3.6", "3.7", "3.8", "3.9", "3.10", "3.11"]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
@@ -1,5 +1,42 @@
|
||||
# Change Log
|
||||
|
||||
## 2.2.35 08/11/2022
|
||||
|
||||
* Release web-ui v2.2.35
|
||||
* Fix issues with VMnet interface on macOS >= 11.0. Ref #3381
|
||||
* Use importlib_resources instead of pkg_resources and install built-in appliances in config dir.
|
||||
* Fix console vnc don't use configured ports in some case. Fixes #2111
|
||||
* Add missing VMware settings in gns3_server.conf
|
||||
* Make version PEP 440 compliant
|
||||
* Support for Python 3.11
|
||||
* Allow for more dependency versions at patch level
|
||||
* Replace deprecated distro.linux_distribution() call
|
||||
* Update gns3.service.systemd
|
||||
* gns3.service.openrc: make openrc script posix compliant
|
||||
* fix: use exact match to find interface in windows to avoid get wrong interface
|
||||
|
||||
## 2.2.34 28/08/2022
|
||||
|
||||
* Use original $PATH in init.sh for Docker containers. Ref #2069
|
||||
* Support pytest-asyncio 0.19.0
|
||||
* Upgrade dev dependencies and fix issues after upgrading to pytest-aiohttp v1.0.4
|
||||
* Update compute.py
|
||||
|
||||
## 2.2.33.1 21/06/2022
|
||||
|
||||
* Add missing file for web-ui v2.2.33
|
||||
|
||||
## 2.2.33 20/06/2022
|
||||
|
||||
* Release web-ui v2.2.33
|
||||
* Upgrade sentry-sdk and psutil
|
||||
* Remove parameter "Name" not useful to create a Docker container
|
||||
* Support to reset all console connections. Ref https://github.com/GNS3/gns3-server/issues/1619
|
||||
* Config option to disable built-in templates
|
||||
* Add hostname entry to sample network config for Docker nodes. Fixes #2039
|
||||
* Run Xtigervnc with MIT-SHM extension disabled for Docker VNC console support. Fixes #2071
|
||||
* Added OpenRC init script
|
||||
|
||||
## 2.2.32 27/04/2022
|
||||
|
||||
* Docker: load custom interface files from /etc/network/interfaces (commented by default). Ref #2052
|
||||
|
||||
+3
-2
@@ -1,17 +1,18 @@
|
||||
version: '{build}-{branch}'
|
||||
|
||||
image: Visual Studio 2015
|
||||
image: Visual Studio 2022
|
||||
|
||||
platform: x64
|
||||
|
||||
environment:
|
||||
PYTHON: "C:\\Python36-x64"
|
||||
PYTHON: "C:\\Python37-x64"
|
||||
DISTUTILS_USE_SDK: "1"
|
||||
API_TOKEN:
|
||||
secure: VEKn4bYH3QO0ixtQW5ni4Enmn8cS1NlZV246ludBDgQ=
|
||||
|
||||
install:
|
||||
- cinst nmap
|
||||
- "%PYTHON%\\python.exe -m pip install -U pip setuptools" # upgrade pip & setuptools first
|
||||
- "%PYTHON%\\python.exe -m pip install -r dev-requirements.txt"
|
||||
- "%PYTHON%\\python.exe -m pip install -r win-requirements.txt"
|
||||
|
||||
|
||||
@@ -59,6 +59,9 @@ allowed_interfaces = eth0,eth1,virbr0
|
||||
; Default is virbr0 on Linux (requires libvirt) and vmnet8 for other platforms (requires VMware)
|
||||
default_nat_interface = vmnet10
|
||||
|
||||
; Enable the built-in templates
|
||||
enable_builtin_templates = True
|
||||
|
||||
[VPCS]
|
||||
; VPCS executable location, default: search in PATH
|
||||
;vpcs_path = vpcs
|
||||
@@ -87,3 +90,9 @@ require_kvm = True
|
||||
enable_hardware_acceleration = True
|
||||
; Require hardware acceleration in order to start VMs (all platforms)
|
||||
require_hardware_acceleration = False
|
||||
|
||||
[VMware]
|
||||
; First vmnet interface of the range that can be managed by the GNS3 server
|
||||
vmnet_start_range = 2
|
||||
; Last vmnet interface of the range that can be managed by the GNS3 server. It must be maximum 19 on Windows.
|
||||
vmnet_end_range = 255
|
||||
@@ -1,6 +1,8 @@
|
||||
-rrequirements.txt
|
||||
|
||||
pytest==7.0.0
|
||||
flake8==4.0.1
|
||||
pytest-timeout==1.4.2
|
||||
pytest-aiohttp==0.3.0
|
||||
pytest==7.2.0; python_version >= '3.7'
|
||||
pytest==7.0.1; python_version < '3.7' # v7.0.1 is the last version to support Python 3.6
|
||||
flake8==5.0.4
|
||||
pytest-timeout==2.1.0
|
||||
pytest-aiohttp==1.0.4; python_version >= '3.7'
|
||||
pytest-aiohttp==0.3.0; python_version < '3.7' # last version to support Python 3.6
|
||||
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"appliance_id": "3da5c614-772c-4963-af86-f24e058c9216",
|
||||
"name": "Alpine Linux Virt",
|
||||
"category": "guest",
|
||||
"description": "Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox.\n\nThis is the qemu version of Alpine Linux, stripped down to the maximum, only the default packages are installed without an SSH server.",
|
||||
"vendor_name": "Alpine Linux Development Team",
|
||||
"vendor_url": "http://alpinelinux.org",
|
||||
"documentation_url": "http://wiki.alpinelinux.org",
|
||||
"product_name": "Alpine Linux Virt",
|
||||
"registry_version": 4,
|
||||
"status": "stable",
|
||||
"availability": "free",
|
||||
"maintainer": "Adnan RIHAN",
|
||||
"maintainer_email": "adnan@rihan.fr",
|
||||
"usage": "Autologin is enabled as \"root\" with no password.\n\nThe network interfaces aren't configured, you can do either of the following:\n- Use alpine's DHCP client: `udhcpc`\n- Configure them manually (ip address add …, ip route add …)\n- Modify interfaces file in /etc/network/interfaces\n- Use alpine's wizard: `setup-interfaces`",
|
||||
"symbol": "alpine-virt-qemu.svg",
|
||||
"port_name_format": "eth{0}",
|
||||
"qemu": {
|
||||
"adapter_type": "virtio-net-pci",
|
||||
"adapters": 1,
|
||||
"ram": 128,
|
||||
"hda_disk_interface": "virtio",
|
||||
"arch": "x86_64",
|
||||
"console_type": "telnet",
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "alpine-virt-3.16.img",
|
||||
"version": "3.16",
|
||||
"md5sum": "ce90ff64b8f8e5860c49ea4a038e54cc",
|
||||
"filesize": 96468992,
|
||||
"download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/",
|
||||
"direct_download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/alpine-virt-3.16.img/download"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "3.16",
|
||||
"images": {
|
||||
"hda_disk_image": "alpine-virt-3.16.img"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -4,7 +4,7 @@
|
||||
"category": "multilayer_switch",
|
||||
"description": "The ArubaOS-CX Simulation Software is a virtual platform to enable simulation of the ArubaOS-CX Network Operating System. Simulated networks can be created using many of the protocols in the ArubaOS-CX Operating system like OSPF, BGP (inc. EVPN). Key features like the Aruba Network Analytics Engine and the REST API can be simulated, providing a lightweight development platform to building the modern network.",
|
||||
"vendor_name": "HPE Aruba",
|
||||
"vendor_url": "arubanetworks.com",
|
||||
"vendor_url": "https://www.arubanetworks.com",
|
||||
"product_name": "ArubaOS-CX Simulation Software",
|
||||
"registry_version": 4,
|
||||
"status": "stable",
|
||||
@@ -30,6 +30,20 @@
|
||||
"process_priority": "normal"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "arubaoscx-disk-image-genericx86-p4-20220815162137.vmdk",
|
||||
"version": "10.10.1000",
|
||||
"md5sum": "40f9ddf1e12640376af443b5d982f2f6",
|
||||
"filesize": 356162560,
|
||||
"download_url": "https://asp.arubanetworks.com/"
|
||||
},
|
||||
{
|
||||
"filename": "arubaoscx-disk-image-genericx86-p4-20220616193419.vmdk",
|
||||
"version": "10.10.0002",
|
||||
"md5sum": "ed031aeb6caf92adb408c7603d294fd4",
|
||||
"filesize": 355858944,
|
||||
"download_url": "https://asp.arubanetworks.com/"
|
||||
},
|
||||
{
|
||||
"filename": "arubaoscx-disk-image-genericx86-p4-20220223012712.vmdk",
|
||||
"version": "10.09.1000",
|
||||
@@ -88,6 +102,18 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "10.10.1000",
|
||||
"images": {
|
||||
"hda_disk_image": "arubaoscx-disk-image-genericx86-p4-20220815162137.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "10.10.0002",
|
||||
"images": {
|
||||
"hda_disk_image": "arubaoscx-disk-image-genericx86-p4-20220616193419.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "10.09.1000",
|
||||
"images": {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"category": "firewall",
|
||||
"description": "Aruba Virtual Gateways allow customers to bring their public cloud infrastructure to the SD-WAN fabric and facilitate connectivity between branches and the public cloud.",
|
||||
"vendor_name": "HPE Aruba",
|
||||
"vendor_url": "arubanetworks.com",
|
||||
"vendor_url": "https://www.arubanetworks.com",
|
||||
"documentation_url": "https://asp.arubanetworks.com/downloads;products=Aruba%20SD-WAN",
|
||||
"product_name": "Aruba SD-WAN Virtual Gateway",
|
||||
"product_url": "https://www.arubanetworks.com/products/networking/gateways-and-controllers/",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"category": "guest",
|
||||
"description": "Aruba Virtual Mobility Controller",
|
||||
"vendor_name": "HPE Aruba",
|
||||
"vendor_url": "arubanetworks.com",
|
||||
"vendor_url": "https://www.arubanetworks.com",
|
||||
"product_name": "Aruba VMC",
|
||||
"registry_version": 4,
|
||||
"status": "stable",
|
||||
|
||||
@@ -27,6 +27,13 @@
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "asav9-16-2.qcow2",
|
||||
"version": "9.16.2 CML",
|
||||
"md5sum": "1f8db97063a7f738fddc81ac880a906c",
|
||||
"filesize": 262078976,
|
||||
"download_url": "https://learningnetworkstore.cisco.com/cisco-modeling-labs-personal/cisco-modeling-labs-personal/CML-PERSONAL.html"
|
||||
},
|
||||
{
|
||||
"filename": "asav9-16-2.qcow2",
|
||||
"version": "9.16.2",
|
||||
"md5sum": "c3aa2b73b029146ec345bf888dd54eab",
|
||||
@@ -112,6 +119,12 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "9.16.2 CML",
|
||||
"images": {
|
||||
"hda_disk_image": "asav9-16-2.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9.16.2",
|
||||
"images": {
|
||||
|
||||
@@ -24,6 +24,13 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "c8000v-universalk9_8G_serial.17.06.01a.qcow2",
|
||||
"version": "17.06.01a 8G",
|
||||
"md5sum": "d8b8ae633d953ec1b6d8f18a09a4f4e7",
|
||||
"filesize": 1595277312,
|
||||
"download_url": "https://software.cisco.com/download/home/286327102/type/282046477/release/Bengaluru-17.6.1a"
|
||||
},
|
||||
{
|
||||
"filename": "c8000v-universalk9_8G_serial.17.04.01a.qcow2",
|
||||
"version": "17.04.01a 8G",
|
||||
@@ -40,6 +47,12 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "17.06.01a 8G",
|
||||
"images": {
|
||||
"hda_disk_image": "c8000v-universalk9_8G_serial.17.06.01a.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "17.04.01a 8G",
|
||||
"images": {
|
||||
|
||||
@@ -18,6 +18,12 @@
|
||||
"startup_config": "iou_l3_base_startup-config.txt"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "i86bi_LinuxL3-AdvEnterpriseK9-M2_157_3_May_2018.bin",
|
||||
"version": "15.7(3)M2",
|
||||
"md5sum": "d6874260c3daeeb96d10fc844ae0b93b",
|
||||
"filesize": 184759244
|
||||
},
|
||||
{
|
||||
"filename": "i86bi-linux-l3-adventerprisek9-ms.155-2.T.bin",
|
||||
"version": "155-2T",
|
||||
@@ -32,6 +38,12 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "15.7(3)M2",
|
||||
"images": {
|
||||
"image": "i86bi_LinuxL3-AdvEnterpriseK9-M2_157_3_May_2018.bin"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "155-2T",
|
||||
"images": {
|
||||
|
||||
@@ -33,6 +33,13 @@
|
||||
"filesize": 1592000512,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.1(1)"
|
||||
},
|
||||
{
|
||||
"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",
|
||||
@@ -176,6 +183,13 @@
|
||||
"bios_image": "OVMF-20160813.fd",
|
||||
"hda_disk_image": "nexus9500v64.10.1.1.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9300v 9.3.8",
|
||||
"images": {
|
||||
"bios_image": "OVMF-20160813.fd",
|
||||
"hda_disk_image": "nexus9300v.9.3.8.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9500v 9.3.7",
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
"status": "stable",
|
||||
"maintainer": "GNS3 Team",
|
||||
"maintainer_email": "developers@gns3.net",
|
||||
"usage": "Default username is cumulus and password is CumulusLinux! in version 4.1 and earlier, and cumulus in version 4.2 and later.",
|
||||
"usage": "Default username/password is cumulus/CumulusLinux! in version 4.1 and earlier, and cumulus/cumulus in version 4.2 and later.",
|
||||
"first_port_name": "eth0",
|
||||
"port_name_format": "swp{port1}",
|
||||
"qemu": {
|
||||
@@ -25,6 +25,14 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "cumulus-linux-5.1.0-vx-amd64-qemu.qcow2",
|
||||
"version": "5.1.0",
|
||||
"md5sum": "b46a68bbb57e77fab5c2927367bead13",
|
||||
"filesize": 4174446592,
|
||||
"download_url": "https://www.nvidia.com/en-us/networking/ethernet-switching/cumulus-vx/download/",
|
||||
"direct_download_url": "https://d2cd9e7ca6hntp.cloudfront.net/public/CumulusLinux-5.1.0/cumulus-linux-5.1.0-vx-amd64-qemu.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "cumulus-linux-4.3.0-vx-amd64-qemu.qcow2",
|
||||
"version": "4.3.0",
|
||||
@@ -231,6 +239,12 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "5.1.0",
|
||||
"images": {
|
||||
"hda_disk_image": "cumulus-linux-5.1.0-vx-amd64-qemu.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.3.0",
|
||||
"images": {
|
||||
|
||||
@@ -24,20 +24,20 @@
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "debian-11-genericcloud-amd64-20220328-962.qcow2",
|
||||
"version": "11.3",
|
||||
"md5sum": "7cf51e23747898485971a656ac2eb96d",
|
||||
"filesize": 253296640,
|
||||
"filename": "debian-11-genericcloud-amd64-20220911-1135.qcow2",
|
||||
"version": "11.5",
|
||||
"md5sum": "06e481ddd23682af4326226661c13d8f",
|
||||
"filesize": 254672896,
|
||||
"download_url": "https://cloud.debian.org/images/cloud/bullseye/",
|
||||
"direct_download_url": "https://cloud.debian.org/images/cloud/bullseye/20220328-962/debian-11-genericcloud-amd64-20220328-962.qcow2"
|
||||
"direct_download_url": "https://cloud.debian.org/images/cloud/bullseye/20220911-1135/debian-11-genericcloud-amd64-20220911-1135.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "debian-10-genericcloud-amd64-20220328-962.qcow2",
|
||||
"version": "10.12",
|
||||
"md5sum": "e92dfa1fc779fff807856f6ea6876e42",
|
||||
"filesize": 232980480,
|
||||
"filename": "debian-10-genericcloud-amd64-20220911-1135.qcow2",
|
||||
"version": "10.13",
|
||||
"md5sum": "9d4d1175bef974caba79dd6ca33d500c",
|
||||
"filesize": 234749952,
|
||||
"download_url": "https://cloud.debian.org/images/cloud/buster/",
|
||||
"direct_download_url": "https://cloud.debian.org/images/cloud/buster/20220328-962/debian-10-genericcloud-amd64-20220328-962.qcow2"
|
||||
"direct_download_url": "https://cloud.debian.org/images/cloud/buster/20220911-1135/debian-10-genericcloud-amd64-20220911-1135.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "debian-cloud-init-data.iso",
|
||||
@@ -49,16 +49,16 @@
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "11.3",
|
||||
"name": "11.5",
|
||||
"images": {
|
||||
"hda_disk_image": "debian-11-genericcloud-amd64-20220328-962.qcow2",
|
||||
"hda_disk_image": "debian-11-genericcloud-amd64-20220911-1135.qcow2",
|
||||
"cdrom_image": "debian-cloud-init-data.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "10.12",
|
||||
"name": "10.13",
|
||||
"images": {
|
||||
"hda_disk_image": "debian-10-genericcloud-amd64-20220328-962.qcow2",
|
||||
"hda_disk_image": "debian-10-genericcloud-amd64-20220911-1135.qcow2",
|
||||
"cdrom_image": "debian-cloud-init-data.iso"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"appliance_id": "1cfdf900-7c30-4cb7-8f03-3f61d2581633",
|
||||
"name": "Empty VM",
|
||||
"category": "guest",
|
||||
"description": "An empty VM with empty hard disks 8G, 30G & 100G.",
|
||||
"description": "A empty VM with empty hard disks 8G, 30G, 100G & 200G.",
|
||||
"vendor_name": "GNS3",
|
||||
"vendor_url": "https://gns3.com",
|
||||
"documentation_url": "",
|
||||
@@ -20,7 +20,7 @@
|
||||
"ram": 1024,
|
||||
"arch": "x86_64",
|
||||
"console_type": "vnc",
|
||||
"hda_disk_interface": "sata",
|
||||
"hda_disk_interface": "sata",
|
||||
"boot_priority": "d",
|
||||
"kvm": "allow"
|
||||
},
|
||||
@@ -48,6 +48,14 @@
|
||||
"filesize": 198656,
|
||||
"download_url": "https://sourceforge.net/projects/gns-3/files/Empty%20Qemu%20disk/",
|
||||
"direct_download_url": "https://sourceforge.net/projects/gns-3/files/Empty%20Qemu%20disk/empty100G.qcow2/download"
|
||||
},
|
||||
{
|
||||
"filename": "empty200G.qcow2",
|
||||
"version": "200G",
|
||||
"md5sum": "d1686d2f25695dee32eab9a6f4652c7c",
|
||||
"filesize": 200192,
|
||||
"download_url": "https://sourceforge.net/projects/gns-3/files/Empty%20Qemu%20disk/",
|
||||
"direct_download_url": "https://sourceforge.net/projects/gns-3/files/Empty%20Qemu%20disk/empty200G.qcow2/download"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
@@ -63,11 +71,17 @@
|
||||
"hda_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
{
|
||||
"name": "100G",
|
||||
"images": {
|
||||
"hda_disk_image": "empty100G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "200G",
|
||||
"images": {
|
||||
"hda_disk_image": "empty200G.qcow2"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -27,6 +27,20 @@
|
||||
"options": "-cpu core2duo"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "EXOS-VM_v32.1.1.6.qcow2",
|
||||
"version": "32.1.1.6",
|
||||
"md5sum": "48868bbcb4255d6365049b5941dd2af7",
|
||||
"filesize": 231211008,
|
||||
"direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v32.1.1.6.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "EXOS-VM_v31.7.1.4.qcow2",
|
||||
"version": "31.7.1.4",
|
||||
"md5sum": "a70e4fa3bc361434237ad12937aaf0fb",
|
||||
"filesize": 458227712,
|
||||
"direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v31.7.1.4.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "EXOS-VM_v31.1.1.3.qcow2",
|
||||
"version": "31.1.1.3",
|
||||
@@ -99,6 +113,18 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "32.1.1.6",
|
||||
"images": {
|
||||
"hda_disk_image": "EXOS-VM_v32.1.1.6.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "31.7.1.4",
|
||||
"images": {
|
||||
"hda_disk_image": "EXOS-VM_v31.7.1.4.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "31.1.1.3",
|
||||
"images": {
|
||||
|
||||
@@ -27,6 +27,13 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FAZ_VM64_KVM-v7.2.1-build1215-FORTINET.out.kvm.qcow2",
|
||||
"version": "7.2.1",
|
||||
"md5sum": "c13b6c7678a2fc12ab969fc681ad3af5",
|
||||
"filesize": 340631552,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FAZ_VM64_KVM-v6-build2288-FORTINET.out.kvm.qcow2",
|
||||
"version": "6.4.5",
|
||||
@@ -177,6 +184,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "7.2.1",
|
||||
"images": {
|
||||
"hda_disk_image": "FAZ_VM64_KVM-v7.2.1-build1215-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.4.5",
|
||||
"images": {
|
||||
|
||||
@@ -27,6 +27,13 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FGT_VM64_KVM-v7.2.1.F-build1254-FORTINET.out.kvm.qcow2",
|
||||
"version": "7.2.1",
|
||||
"md5sum": "e382a1ad5c7c16f49a1c0d3f45e3a3b2",
|
||||
"filesize": 86704128,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FGT_VM64_KVM-v6-build1828-FORTINET.out.kvm.qcow2",
|
||||
"version": "6.4.5",
|
||||
@@ -254,6 +261,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "7.2.1",
|
||||
"images": {
|
||||
"hda_disk_image": "FGT_VM64_KVM-v7.2.1.F-build1254-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.4.5",
|
||||
"images": {
|
||||
|
||||
@@ -27,6 +27,13 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FML_VMKV-64-v721.M-build0364-FORTINET.out.kvm.qcow2",
|
||||
"version": "7.2.1",
|
||||
"md5sum": "b7bf13c2fb013693936b45d89dfab1ac",
|
||||
"filesize": 123535360,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FML_VMKV-64-v60-build0257-FORTINET.out.kvm.qcow2",
|
||||
"version": "6.2.1",
|
||||
@@ -184,6 +191,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "7.2.1",
|
||||
"images": {
|
||||
"hda_disk_image": "FML_VMKV-64-v721.M-build0364-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.2.1",
|
||||
"images": {
|
||||
|
||||
@@ -27,6 +27,13 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FMG_VM64_KVM-v7.2.1-build1215-FORTINET.out.kvm.qcow2",
|
||||
"version": "7.2.1",
|
||||
"md5sum": "1a3eeff1204fa8f4243773f7521e12b5",
|
||||
"filesize": 242814976,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FMG_VM64_KVM-v6-build2288-FORTINET.out.kvm.qcow2",
|
||||
"version": "6.4.5",
|
||||
@@ -177,6 +184,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "7.2.1",
|
||||
"images": {
|
||||
"hda_disk_image": "FMG_VM64_KVM-v7.2.1-build1215-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.4.5",
|
||||
"images": {
|
||||
|
||||
@@ -27,6 +27,13 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FPX_KVM-v700.M-build0102-FORTINET.out.kvm.qcow2",
|
||||
"version": "7.0.6",
|
||||
"md5sum": "ad0a4612580b5a2754cc4e0121a9cf22",
|
||||
"filesize": 146800640,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FPX_KVM-v100-build0162-FORTINET.out.kvm.qcow2",
|
||||
"version": "1.1.2",
|
||||
@@ -51,6 +58,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "7.0.6",
|
||||
"images": {
|
||||
"hda_disk_image": "FPX_KVM-v700.M-build0102-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "1.1.2",
|
||||
"images": {
|
||||
|
||||
@@ -28,6 +28,13 @@
|
||||
"options": "-smp 2"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FSA_KVM-v400-build0231-FORTINET.out.kvm.qcow2",
|
||||
"version": "4.2.2",
|
||||
"md5sum": "02b7f49e3c04861601a7af26452eed66",
|
||||
"filesize": 156172304,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FSA_KVM-v300-build0124-FORTINET.out.kvm.qcow2",
|
||||
"version": "3.1.2",
|
||||
@@ -114,6 +121,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "4.2.2",
|
||||
"images": {
|
||||
"hda_disk_image": "FSA_KVM-v400-build0231-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "FSA-datadrive.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "3.1.2",
|
||||
"images": {
|
||||
|
||||
@@ -27,6 +27,13 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FWB_KVM-v700-build0097-FORTINET.out.kvm.qcow2",
|
||||
"version": "7.0.1",
|
||||
"md5sum": "a197e9db03ffaf7feb520c8f77f940f7",
|
||||
"filesize": 257622528,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FWB_KVM-v600-build0727-FORTINET.out.kvm.qcow2",
|
||||
"version": "6.2.1",
|
||||
@@ -121,6 +128,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "7.0.1",
|
||||
"images": {
|
||||
"hda_disk_image": "FWB_KVM-v700-build0097-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.2.1",
|
||||
"images": {
|
||||
|
||||
@@ -24,125 +24,35 @@
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FreeBSD-12.1-RELEASE-amd64.qcow2",
|
||||
"version": "12.1",
|
||||
"md5sum": "0079b4ca99f64bb825cfbaefcca10fd4",
|
||||
"filesize": 3043229696,
|
||||
"filename": "FreeBSD-13.0-RELEASE-amd64.qcow2",
|
||||
"version": "13.0",
|
||||
"md5sum": "e8e598959da456c03260421b5f9890de",
|
||||
"filesize": 3466854400,
|
||||
"download_url": "https://www.freebsd.org/where.html",
|
||||
"direct_download_url": "https://download.freebsd.org/ftp/releases/VM-IMAGES/12.1-RELEASE/amd64/Latest/FreeBSD-12.1-RELEASE-amd64.qcow2.xz",
|
||||
"direct_download_url": "https://download.freebsd.org/ftp/releases/VM-IMAGES/13.0-RELEASE/amd64/Latest/FreeBSD-13.0-RELEASE-amd64.qcow2.xz",
|
||||
"compression": "xz"
|
||||
},
|
||||
{
|
||||
"filename": "FreeBSD-12.0-RELEASE-amd64.qcow2",
|
||||
"version": "12.0",
|
||||
"md5sum": "4d2126ba79dad224628be6f25a908bd8",
|
||||
"filesize": 2644836352,
|
||||
"filename": "FreeBSD-12.3-RELEASE-amd64.qcow2",
|
||||
"version": "12.3",
|
||||
"md5sum": "3d7d5396f3d89ed30c2bfa2ee2e6b013",
|
||||
"filesize": 3412000768,
|
||||
"download_url": "https://www.freebsd.org/where.html",
|
||||
"direct_download_url": "https://download.freebsd.org/ftp/releases/VM-IMAGES/12.0-RELEASE/amd64/Latest/FreeBSD-12.0-RELEASE-amd64.qcow2.xz",
|
||||
"compression": "xz"
|
||||
},
|
||||
{
|
||||
"filename": "FreeBSD-11.3-RELEASE-amd64.qcow2",
|
||||
"version": "11.3",
|
||||
"md5sum": "cdb35f676571b91584ff88502c48d399",
|
||||
"filesize": 1698037760,
|
||||
"download_url": "https://www.freebsd.org/where.html",
|
||||
"direct_download_url": "https://download.freebsd.org/ftp/releases/VM-IMAGES/11.3-RELEASE/amd64/Latest/FreeBSD-11.3-RELEASE-amd64.qcow2.xz",
|
||||
"compression": "xz"
|
||||
},
|
||||
{
|
||||
"filename": "FreeBSD-11.2-RELEASE-amd64.qcow2",
|
||||
"version": "11.2",
|
||||
"md5sum": "44d37e65be4bb4054f067911c84d074a",
|
||||
"filesize": 1630076928,
|
||||
"download_url": "https://www.freebsd.org/where.html",
|
||||
"direct_download_url": "https://download.freebsd.org/ftp/releases/VM-IMAGES/11.2-RELEASE/amd64/Latest/FreeBSD-11.2-RELEASE-amd64.qcow2.xz",
|
||||
"compression": "xz"
|
||||
},
|
||||
{
|
||||
"filename": "FreeBSD-11.1-RELEASE-amd64.qcow2",
|
||||
"version": "11.1",
|
||||
"md5sum": "d78b2a7d05ec62f799e14ded4817ea69",
|
||||
"filesize": 1533345792,
|
||||
"download_url": "https://www.freebsd.org/where.html",
|
||||
"direct_download_url": "https://download.freebsd.org/ftp/releases/VM-IMAGES/11.1-RELEASE/amd64/Latest/FreeBSD-11.1-RELEASE-amd64.qcow2.xz",
|
||||
"compression": "xz"
|
||||
},
|
||||
{
|
||||
"filename": "FreeBSD-11.0-RELEASE-amd64.qcow2",
|
||||
"version": "11.0",
|
||||
"md5sum": "1b04999198f492afd6dc4935b8c7cc22",
|
||||
"filesize": 1384382464,
|
||||
"download_url": "https://www.freebsd.org/where.html",
|
||||
"direct_download_url": "https://download.freebsd.org/ftp/releases/VM-IMAGES/11.0-RELEASE/amd64/Latest/FreeBSD-11.0-RELEASE-amd64.qcow2.xz",
|
||||
"compression": "xz"
|
||||
},
|
||||
{
|
||||
"filename": "FreeBSD-10.4-RELEASE-amd64.qcow2",
|
||||
"version": "10.4",
|
||||
"md5sum": "ad498873733c57d1f6d890d587a11e3c",
|
||||
"filesize": 1013448704,
|
||||
"download_url": "https://www.freebsd.org/where.html",
|
||||
"direct_download_url": "https://download.freebsd.org/ftp/releases/VM-IMAGES/10.4-RELEASE/amd64/Latest/FreeBSD-10.4-RELEASE-amd64.qcow2.xz",
|
||||
"compression": "xz"
|
||||
},
|
||||
{
|
||||
"filename": "FreeBSD-10.3-RELEASE-amd64.qcow2",
|
||||
"version": "10.3",
|
||||
"md5sum": "1a00cebef520dfac8d2bda10ea16a951",
|
||||
"filesize": 974651392,
|
||||
"download_url": "https://www.freebsd.org/where.html",
|
||||
"direct_download_url": "https://download.freebsd.org/ftp/releases/VM-IMAGES/10.3-RELEASE/amd64/Latest/FreeBSD-10.3-RELEASE-amd64.qcow2.xz",
|
||||
"direct_download_url": "https://download.freebsd.org/ftp/releases/VM-IMAGES/12.3-RELEASE/amd64/Latest/FreeBSD-12.3-RELEASE-amd64.qcow2.xz",
|
||||
"compression": "xz"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "12.1",
|
||||
"name": "13.0",
|
||||
"images": {
|
||||
"hda_disk_image": "FreeBSD-12.1-RELEASE-amd64.qcow2"
|
||||
"hda_disk_image": "FreeBSD-13.0-RELEASE-amd64.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "12.0",
|
||||
"name": "12.3",
|
||||
"images": {
|
||||
"hda_disk_image": "FreeBSD-12.0-RELEASE-amd64.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "11.3",
|
||||
"images": {
|
||||
"hda_disk_image": "FreeBSD-11.3-RELEASE-amd64.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "11.2",
|
||||
"images": {
|
||||
"hda_disk_image": "FreeBSD-11.2-RELEASE-amd64.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "11.1",
|
||||
"images": {
|
||||
"hda_disk_image": "FreeBSD-11.1-RELEASE-amd64.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "11.0",
|
||||
"images": {
|
||||
"hda_disk_image": "FreeBSD-11.0-RELEASE-amd64.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "10.4",
|
||||
"images": {
|
||||
"hda_disk_image": "FreeBSD-10.4-RELEASE-amd64.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "10.3",
|
||||
"images": {
|
||||
"hda_disk_image": "FreeBSD-10.3-RELEASE-amd64.qcow2"
|
||||
"hda_disk_image": "FreeBSD-12.3-RELEASE-amd64.qcow2"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
"status": "experimental",
|
||||
"availability": "service-contract",
|
||||
"maintainer": "none",
|
||||
"maintainer_email": "none",
|
||||
"maintainer_email": "",
|
||||
"usage": "Default user is super, default password is super.",
|
||||
"port_name_format": "GigabitEthernet0/0/{0}",
|
||||
"qemu": {
|
||||
@@ -26,6 +26,13 @@
|
||||
"options": "-machine type=pc,accel=kvm -vga std -usbdevice tablet -cpu host"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "huaweiar1k-5.170-V300R021C00SPC100T-Auto-update-esn.qcow2",
|
||||
"version": "V300R021C00SPC100T",
|
||||
"md5sum": "9d98b31d400a94af37b5af6e9cfe8d80",
|
||||
"filesize": 673465344,
|
||||
"download_url": "https://support.huawei.com/enterprise/en/routers/ar1000v-pid-21768212/software"
|
||||
},
|
||||
{
|
||||
"filename": "ar1k-V300R019C00SPC300.qcow2",
|
||||
"version": "V300R019C00SPC300",
|
||||
@@ -33,13 +40,21 @@
|
||||
"filesize": 534904832,
|
||||
"download_url": "https://support.huawei.com/enterprise/en/routers/ar1000v-pid-21768212/software"
|
||||
}
|
||||
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "V300R021C00SPC100T",
|
||||
"images": {
|
||||
"hda_disk_image": "huaweiar1k-5.170-V300R021C00SPC100T-Auto-update-esn.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "V300R019C00SPC300",
|
||||
"images": {
|
||||
"hda_disk_image": "ar1k-V300R019C00SPC300.qcow2"
|
||||
}
|
||||
}
|
||||
|
||||
]
|
||||
}
|
||||
@@ -10,7 +10,7 @@
|
||||
"status": "experimental",
|
||||
"availability": "service-contract",
|
||||
"maintainer": "none",
|
||||
"maintainer_email": "none",
|
||||
"maintainer_email": "",
|
||||
"port_name_format": "GE1/0/{0}",
|
||||
"qemu": {
|
||||
"adapter_type": "e1000",
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
"status": "experimental",
|
||||
"availability": "service-contract",
|
||||
"maintainer": "none",
|
||||
"maintainer_email": "none",
|
||||
"maintainer_email": "",
|
||||
"first_port_name": "eth0",
|
||||
"port_name_format": "Ethernet1/0/{0}",
|
||||
"qemu": {
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
"status": "experimental",
|
||||
"availability": "service-contract",
|
||||
"maintainer": "none",
|
||||
"maintainer_email": "none",
|
||||
"maintainer_email": "",
|
||||
"usage": "Default password is admin. Default username and password for web is admin/Admin@123.",
|
||||
"first_port_name": "GigabitEthernet0/0/0",
|
||||
"port_name_format": "GigabitEthernet1/0/{0}",
|
||||
|
||||
@@ -12,13 +12,13 @@
|
||||
"status": "experimental",
|
||||
"maintainer": "none",
|
||||
"maintainer_email": "developers@gns3.net",
|
||||
"usage": "Initial username is root, password is root.\n",
|
||||
"usage": "Connect VCP by port Eth1.\nData port ge/xe-x/0/0 to ge/xe-x/0/9 mapping to Eth3 to Eth12.\nInitial username is root, password is root.\n",
|
||||
"symbol": "juniper-vmx.svg",
|
||||
"first_port_name": "Eth0",
|
||||
"port_name_format": "Eth{port1}",
|
||||
"qemu": {
|
||||
"adapter_type": "virtio-net-pci",
|
||||
"adapters": 12,
|
||||
"adapters": 13,
|
||||
"ram": 4096,
|
||||
"hda_disk_interface": "ide",
|
||||
"arch": "x86_64",
|
||||
|
||||
@@ -28,6 +28,18 @@
|
||||
"options": "-nographic -enable-kvm"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "junos-x86-64-20.4R3.8.img",
|
||||
"version": "20.4R3.8-KVM",
|
||||
"md5sum": "69638ba0ad83d7a99a28b658b1dd8def",
|
||||
"filesize": 2773090304
|
||||
},
|
||||
{
|
||||
"filename": "metadata.img",
|
||||
"version": "20.4R3.8-KVM",
|
||||
"md5sum": "ae4e3562aa389929476d82420c79d511",
|
||||
"filesize": 393216
|
||||
},
|
||||
{
|
||||
"filename": "junos-x86-64-20.3R1.8.img",
|
||||
"version": "20.3R1.8-KVM",
|
||||
@@ -42,6 +54,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "20.4R3.8-KVM",
|
||||
"images": {
|
||||
"hda_disk_image": "junos-x86-64-20.4R3.8.img",
|
||||
"hdb_disk_image": "metadata.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "20.3R1.8-KVM",
|
||||
"images": {
|
||||
|
||||
@@ -28,81 +28,81 @@
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "chr-7.1rc7.img",
|
||||
"version": "7.1rc7",
|
||||
"md5sum": "04bc0ae1e5fbbda1522135bc57cf6560",
|
||||
"filename": "chr-7.4rc2.img",
|
||||
"version": "7.4rc2",
|
||||
"md5sum": "ddb107c95cc7d231f8d8bbdb4eebdab6",
|
||||
"filesize": 134217728,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "https://download.mikrotik.com/routeros/7.1rc7/chr-7.1rc7.img.zip",
|
||||
"direct_download_url": "https://download.mikrotik.com/routeros/7.4rc2/chr-7.4rc2.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-7.1.img",
|
||||
"version": "7.1",
|
||||
"md5sum": "41545bc7b55717fe5bb1e489ee39ca45",
|
||||
"filename": "chr-7.3.1.img",
|
||||
"version": "7.3.1",
|
||||
"md5sum": "99f8ea75f8b745a8bf5ca3cc1bd325e3",
|
||||
"filesize": 134217728,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "https://download.mikrotik.com/routeros/7.1/chr-7.1.img.zip",
|
||||
"direct_download_url": "https://download.mikrotik.com/routeros/7.3.1/chr-7.3.1.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.49rc2.img",
|
||||
"version": "6.49rc2",
|
||||
"md5sum": "e1088f8f64ac3d6ecf2e56ac96261226",
|
||||
"filesize": 67108864,
|
||||
"filename": "chr-7.1.5.img",
|
||||
"version": "7.1.5",
|
||||
"md5sum": "9c0be05f891df2b1400bdae5e719898e",
|
||||
"filesize": 134217728,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "https://download.mikrotik.com/routeros/6.49rc2/chr-6.49rc2.img.zip",
|
||||
"direct_download_url": "https://download.mikrotik.com/routeros/7.1.5/chr-7.1.5.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.49.1.img",
|
||||
"version": "6.49.1",
|
||||
"md5sum": "6c896c4c853de99f2ea77f0f4b102261",
|
||||
"filename": "chr-6.49.6.img",
|
||||
"version": "6.49.6",
|
||||
"md5sum": "ae27d38acc9c4dcd875e0f97bcae8d97",
|
||||
"filesize": 67108864,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "https://download.mikrotik.com/routeros/6.49.1/chr-6.49.1.img.zip",
|
||||
"direct_download_url": "https://download.mikrotik.com/routeros/6.49.6/chr-6.49.6.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.48.5.img",
|
||||
"version": "6.48.5",
|
||||
"md5sum": "d14debd4cd989f16f695b5b075960703",
|
||||
"filename": "chr-6.48.6.img",
|
||||
"version": "6.48.6",
|
||||
"md5sum": "875574a561570227ff8f395aabe478c6",
|
||||
"filesize": 67108864,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "https://download.mikrotik.com/routeros/6.48.5/chr-6.48.5.img.zip",
|
||||
"direct_download_url": "https://download.mikrotik.com/routeros/6.48.6/chr-6.48.6.img.zip",
|
||||
"compression": "zip"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "7.1rc7",
|
||||
"name": "7.4rc2",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-7.1rc7.img"
|
||||
"hda_disk_image": "chr-7.4rc2.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.1",
|
||||
"name": "7.3.1",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-7.1.img"
|
||||
"hda_disk_image": "chr-7.3.1.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.49rc2",
|
||||
"name": "7.1.5",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.49rc2.img"
|
||||
"hda_disk_image": "chr-7.1.5.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.49.1",
|
||||
"name": "6.49.6",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.49.1.img"
|
||||
"hda_disk_image": "chr-6.49.6.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.48.5",
|
||||
"name": "6.48.6",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.48.5.img"
|
||||
"hda_disk_image": "chr-6.48.6.img"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -29,8 +29,8 @@
|
||||
"version": "0.4",
|
||||
"md5sum": "e678698c97804901c7a53f6b68c8b861",
|
||||
"filesize": 26476544,
|
||||
"download_url": "https://www.b-ehlers.de/projects/netem/index.html",
|
||||
"direct_download_url": "https://www.b-ehlers.de/projects/netem/NETem-v4.qcow2"
|
||||
"download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/",
|
||||
"direct_download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/NETem-v4.qcow2/download"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
|
||||
@@ -23,6 +23,24 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "openwrt-22.03.0-x86-64-generic-ext4-combined.img",
|
||||
"version": "22.03.0",
|
||||
"md5sum": "0f9a266bd8a6cdfcaf0b59f7ba103a0e",
|
||||
"filesize": 126353408,
|
||||
"download_url": "https://downloads.openwrt.org/releases/22.03.0/targets/x86/64/",
|
||||
"direct_download_url": "https://downloads.openwrt.org/releases/22.03.0/targets/x86/64/openwrt-22.03.0-x86-64-generic-ext4-combined.img.gz",
|
||||
"compression": "gzip"
|
||||
},
|
||||
{
|
||||
"filename": "openwrt-21.02.3-x86-64-generic-ext4-combined.img",
|
||||
"version": "21.02.3",
|
||||
"md5sum": "652c432e758420cb8d749139e8bef14b",
|
||||
"filesize": 126353408,
|
||||
"download_url": "https://downloads.openwrt.org/releases/21.02.3/targets/x86/64/",
|
||||
"direct_download_url": "https://downloads.openwrt.org/releases/21.02.3/targets/x86/64/openwrt-21.02.3-x86-64-generic-ext4-combined.img.gz",
|
||||
"compression": "gzip"
|
||||
},
|
||||
{
|
||||
"filename": "openwrt-21.02.1-x86-64-generic-ext4-combined.img",
|
||||
"version": "21.02.1",
|
||||
@@ -196,6 +214,18 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "22.03.0",
|
||||
"images": {
|
||||
"hda_disk_image": "openwrt-22.03.0-x86-64-generic-ext4-combined.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "21.02.3",
|
||||
"images": {
|
||||
"hda_disk_image": "openwrt-21.02.3-x86-64-generic-ext4-combined.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "21.02.1",
|
||||
"images": {
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
"usage": "Default password is raspberry",
|
||||
"symbol": "rpi.png",
|
||||
"qemu": {
|
||||
"adapter_type": "virtio",
|
||||
"adapter_type": "e1000",
|
||||
"adapters": 1,
|
||||
"ram": 1024,
|
||||
"hda_disk_interface": "sata",
|
||||
@@ -25,6 +25,20 @@
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "2022-07-01-raspios-bullseye-i386.iso",
|
||||
"version": "2022-07-01",
|
||||
"md5sum": "e57f42852306ac5ed0d9e97bdc3513cb",
|
||||
"filesize": 3607101440,
|
||||
"download_url": "https://www.raspberrypi.org/downloads/raspberry-pi-desktop/"
|
||||
},
|
||||
{
|
||||
"filename": "2021-01-11-raspios-buster-i386.iso",
|
||||
"version": "2021-01-11",
|
||||
"md5sum": "14c0b29c393adee45b90d265b3243564",
|
||||
"filesize": 3091660800,
|
||||
"download_url": "https://www.raspberrypi.org/downloads/raspberry-pi-desktop/"
|
||||
},
|
||||
{
|
||||
"filename": "2020-02-12-rpd-x86-buster.iso",
|
||||
"version": "2020-02-12",
|
||||
"md5sum": "98f34fb53086752b4c9c452094f30740",
|
||||
@@ -41,6 +55,20 @@
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "2022-07-01",
|
||||
"images": {
|
||||
"hda_disk_image": "empty8G.qcow2",
|
||||
"cdrom_image": "2022-07-01-raspios-bullseye-i386.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2021-01-11",
|
||||
"images": {
|
||||
"hda_disk_image": "empty8G.qcow2",
|
||||
"cdrom_image": "2021-01-11-raspios-buster-i386.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2020-02-12",
|
||||
"images": {
|
||||
"hda_disk_image": "empty8G.qcow2",
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"appliance_id": "c811e588-39ef-41e9-9f60-6e8e08618c3d",
|
||||
"name": "ReactOS",
|
||||
"category": "guest",
|
||||
"description": "Imagine running your favorite Windows applications and drivers in an open-source environment you can trust.\nThat's the mission of ReactOS! ",
|
||||
"vendor_name": "ReactOS Project",
|
||||
"vendor_url": "https://reactos.org/",
|
||||
"documentation_url": "https://reactos.org/what-is-reactos/",
|
||||
"product_name": "ReactOS",
|
||||
"product_url": "https://reactos.org/",
|
||||
"registry_version": 3,
|
||||
"status": "stable",
|
||||
"maintainer": "Savio D'souza",
|
||||
"maintainer_email": "savio2002@yahoo.co.in",
|
||||
"usage": "Passwords are set during installation.",
|
||||
"qemu": {
|
||||
"adapter_type": "e1000",
|
||||
"adapters": 1,
|
||||
"ram": 1024,
|
||||
"hda_disk_interface": "ide",
|
||||
"arch": "x86_64",
|
||||
"console_type": "vnc",
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "ReactOS-0.4.14-release-15-gb6088a6.iso",
|
||||
"version": "Installer-0.4.14-release-15",
|
||||
"md5sum": "af4be6b27463446905f155f14232d2b4",
|
||||
"filesize": 140509184,
|
||||
"download_url": "https://reactos.org/download",
|
||||
"direct_download_url": "https://sourceforge.net/projects/reactos/files/ReactOS/0.4.14/ReactOS-0.4.14-release-21-g1302c1b-iso.zip/download"
|
||||
},
|
||||
{
|
||||
"filename": "ReactOS-0.4.14-release-15-gb6088a6-Live.iso",
|
||||
"version": "Live-0.4.14-release-15",
|
||||
"md5sum": "73c1a0169a9a3b8a4feb91f4d00f5e97",
|
||||
"filesize": 267386880,
|
||||
"download_url": "https://reactos.org/download",
|
||||
"direct_download_url": "https://sourceforge.net/projects/reactos/files/ReactOS/0.4.14/ReactOS-0.4.14-release-21-g1302c1b-live.zip/download"
|
||||
},
|
||||
{
|
||||
"filename": "empty30G.qcow2",
|
||||
"version": "1.0",
|
||||
"md5sum": "3411a599e822f2ac6be560a26405821a",
|
||||
"filesize": 197120,
|
||||
"download_url": "https://sourceforge.net/projects/gns-3/files/Empty%20Qemu%30disk/",
|
||||
"direct_download_url": "https://sourceforge.net/projects/gns-3/files/Empty%20Qemu%20disk/empty30G.qcow2/download"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "Installer-0.4.14-release-15",
|
||||
"images": {
|
||||
"hda_disk_image": "empty30G.qcow2",
|
||||
"cdrom_image": "ReactOS-0.4.14-release-15-gb6088a6.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Live-0.4.14-release-15",
|
||||
"images": {
|
||||
"hda_disk_image": "empty30G.qcow2",
|
||||
"cdrom_image": "ReactOS-0.4.14-release-15-gb6088a6-Live.iso"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -26,6 +26,13 @@
|
||||
"options": "-nographic"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "ubuntu-22.04-server-cloudimg-amd64.img",
|
||||
"version": "22.04 (LTS)",
|
||||
"md5sum": "ac2351289daa173fa1ed6b2b81d81d7c",
|
||||
"filesize": 624295936,
|
||||
"download_url": "https://cloud-images.ubuntu.com/releases/jammy/release/ubuntu-22.04-server-cloudimg-amd64.img"
|
||||
},
|
||||
{
|
||||
"filename": "ubuntu-20.04-server-cloudimg-amd64.img",
|
||||
"version": "20.04 (LTS)",
|
||||
@@ -70,6 +77,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "22.04 (LTS)",
|
||||
"images": {
|
||||
"hda_disk_image": "ubuntu-22.04-server-cloudimg-amd64.img",
|
||||
"cdrom_image": "ubuntu-cloud-init-data.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "20.04 (LTS)",
|
||||
"images": {
|
||||
|
||||
@@ -23,94 +23,55 @@
|
||||
"console_type": "vnc",
|
||||
"boot_priority": "c",
|
||||
"kvm": "require",
|
||||
"options": "-vga virtio"
|
||||
"options": "-vga qxl"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "Ubuntu 20.10 (64bit).vmdk",
|
||||
"version": "20.10",
|
||||
"md5sum": "d7fb9d7b5f6e55349204d493d00507d2",
|
||||
"filesize": 7512915968,
|
||||
"download_url": "http://www.osboxes.org/ubuntu/"
|
||||
"filename": "Ubuntu 22.04 (64bit).vmdk",
|
||||
"version": "22.04",
|
||||
"md5sum": "208657d5c13fd1e041794794ada32581",
|
||||
"filesize": 9110487040,
|
||||
"download_url": "https://www.osboxes.org/ubuntu/"
|
||||
},
|
||||
{
|
||||
"filename": "Ubuntu 20.04.2 (64bit).vmdk",
|
||||
"version": "20.04.2",
|
||||
"md5sum": "e995e5768c1dbee94bc02072d841bb50",
|
||||
"filesize": 7625179136,
|
||||
"download_url": "http://www.osboxes.org/ubuntu/"
|
||||
"filename": "Ubuntu 20.04.4 (64bit).vmdk",
|
||||
"version": "20.04.4",
|
||||
"md5sum": "0482557da31d29f4f175945333e617f0",
|
||||
"filesize": 8531083264,
|
||||
"download_url": "https://www.osboxes.org/ubuntu/"
|
||||
},
|
||||
{
|
||||
"filename": "Ubuntu 20.04 (64bit).vmdk",
|
||||
"version": "20.04",
|
||||
"md5sum": "cf619dfe9bb8d89e2b18b067f02e57a0",
|
||||
"filesize": 6629883904,
|
||||
"download_url": "http://www.osboxes.org/ubuntu/"
|
||||
},
|
||||
{
|
||||
"filename": "Ubuntu 19.04 (64bit).vmdk",
|
||||
"version": "19.04",
|
||||
"md5sum": "21535675c54507e9325bf8774a7bd73e",
|
||||
"filesize": 5558435840,
|
||||
"download_url": "http://www.osboxes.org/ubuntu/"
|
||||
},
|
||||
{
|
||||
"filename": "Ubuntu 18.10 Cosmic (64Bit).vmdk",
|
||||
"version": "18.10",
|
||||
"md5sum": "7f72be569356baa20863cd354d2efa60",
|
||||
"filesize": 6747389952,
|
||||
"download_url": "http://www.osboxes.org/ubuntu/"
|
||||
},
|
||||
{
|
||||
"filename": "Ubuntu 18.04.2 (64bit).vmdk",
|
||||
"version": "18.04.2",
|
||||
"md5sum": "d57b732d90759e3b3a62594a83f8f196",
|
||||
"filesize": 6003097600,
|
||||
"download_url": "http://www.osboxes.org/ubuntu/"
|
||||
"filename": "Ubuntu 18.04.6 (64bit).vmdk",
|
||||
"version": "18.04.6",
|
||||
"md5sum": "2a41138b36edd3f81b4cb89ea471f3fc",
|
||||
"filesize": 7011631104,
|
||||
"download_url": "https://www.osboxes.org/ubuntu/"
|
||||
},
|
||||
{
|
||||
"filename": "Ubuntu 16.04.6 (64bit).vmdk",
|
||||
"version": "16.04.6",
|
||||
"md5sum": "33b2964cef607c1c9fe748db8a2fa6ea",
|
||||
"filesize": 4780982272,
|
||||
"download_url": "http://www.osboxes.org/ubuntu/"
|
||||
"download_url": "https://www.osboxes.org/ubuntu/"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "20.10",
|
||||
"name": "22.04",
|
||||
"images": {
|
||||
"hda_disk_image": "Ubuntu 20.10 (64bit).vmdk"
|
||||
"hda_disk_image": "Ubuntu 22.04 (64bit).vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "20.04.2",
|
||||
"name": "20.04.4",
|
||||
"images": {
|
||||
"hda_disk_image": "Ubuntu 20.04.2 (64bit).vmdk"
|
||||
"hda_disk_image": "Ubuntu 20.04.4 (64bit).vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "20.04",
|
||||
"name": "18.04.6",
|
||||
"images": {
|
||||
"hda_disk_image": "Ubuntu 20.04 (64bit).vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "19.04",
|
||||
"images": {
|
||||
"hda_disk_image": "Ubuntu 19.04 (64bit).vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "18.10",
|
||||
"images": {
|
||||
"hda_disk_image": "Ubuntu 18.10 Cosmic (64Bit).vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "18.04.2",
|
||||
"images": {
|
||||
"hda_disk_image": "Ubuntu 18.04.2 (64bit).vmdk"
|
||||
"hda_disk_image": "Ubuntu 18.04.6 (64bit).vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
"registry_version": 3,
|
||||
"status": "stable",
|
||||
"maintainer": "Mohamad Siblini",
|
||||
"maintainer_email": "https://www.ictkin.com/contact",
|
||||
"maintainer_email": "info@ictkin.com",
|
||||
"usage": "Username: gns3\nPassword: gns3 | MD5: 435f15a54f7f673e302ad26f05226e0e",
|
||||
"port_name_format": "ens{0}",
|
||||
"qemu": {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"appliance_id": "f82b74c4-0f30-456f-a582-63daca528502",
|
||||
"name": "VyOS",
|
||||
"category": "router",
|
||||
"description": "VyOS is a community fork of Vyatta, a Linux-based network operating system that provides software-based network routing, firewall, and VPN functionality. VyOS has a subscription LTS version and a community rolling release. The latest version in this appliance is the monthly snapshot of the rolling release track.",
|
||||
"description": "VyOS is a community fork of Vyatta, a Linux-based network operating system that provides software-based network routing, firewall, and VPN functionality.",
|
||||
"vendor_name": "Linux",
|
||||
"vendor_url": "https://vyos.net/",
|
||||
"documentation_url": "https://docs.vyos.io/",
|
||||
@@ -26,6 +26,20 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "vyos-1.3.2-amd64.iso",
|
||||
"version": "1.3.2",
|
||||
"md5sum": "070743faac800f9e5197058a8b6b3ba1",
|
||||
"filesize": 334495744,
|
||||
"download_url": "https://support.vyos.io/en/downloads/files/vyos-1-3-2-generic-iso-image"
|
||||
},
|
||||
{
|
||||
"filename": "vyos-1.3.1-S1-amd64.iso",
|
||||
"version": "1.3.1-S1",
|
||||
"md5sum": "781f345e8a4ab9eb9e075ce5c87c8817",
|
||||
"filesize": 351272960,
|
||||
"download_url": "https://support.vyos.io/en/downloads/files/vyos-1-3-1-s1-generic-iso-image"
|
||||
},
|
||||
{
|
||||
"filename": "vyos-1.3.1-amd64.iso",
|
||||
"version": "1.3.1",
|
||||
@@ -40,14 +54,6 @@
|
||||
"filesize": 338690048,
|
||||
"download_url": "https://support.vyos.io/en/downloads/files/vyos-1-3-0-generic-iso-image"
|
||||
},
|
||||
{
|
||||
"filename": "vyos-1.3.0-epa3-amd64.iso",
|
||||
"version": "1.3.0-epa3",
|
||||
"md5sum": "1b5de684d8995844e35fa5cec3171811",
|
||||
"filesize": 331350016,
|
||||
"download_url": "https://vyos.net/get/snapshots/",
|
||||
"direct_download_url": "https://s3.amazonaws.com/s3-us.vyos.io/snapshot/vyos-1.3.0-epa3/vyos-1.3.0-epa3-amd64.iso"
|
||||
},
|
||||
{
|
||||
"filename": "vyos-1.2.8-amd64.iso",
|
||||
"version": "1.2.8",
|
||||
@@ -80,6 +86,20 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "1.3.2",
|
||||
"images": {
|
||||
"hda_disk_image": "empty8G.qcow2",
|
||||
"cdrom_image": "vyos-1.3.2-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "1.3.1-S1",
|
||||
"images": {
|
||||
"hda_disk_image": "empty8G.qcow2",
|
||||
"cdrom_image": "vyos-1.3.1-S1-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "1.3.1",
|
||||
"images": {
|
||||
@@ -94,13 +114,6 @@
|
||||
"cdrom_image": "vyos-1.3.0-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "1.3.0-epa3",
|
||||
"images": {
|
||||
"hda_disk_image": "empty8G.qcow2",
|
||||
"cdrom_image": "vyos-1.3.0-epa3-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "1.2.8",
|
||||
"images": {
|
||||
|
||||
@@ -397,6 +397,14 @@ class BaseNode:
|
||||
self._wrapper_telnet_server.close()
|
||||
await self._wrapper_telnet_server.wait_closed()
|
||||
|
||||
async def reset_console(self):
|
||||
"""
|
||||
Reset console
|
||||
"""
|
||||
|
||||
await self.stop_wrap_console()
|
||||
await self.start_wrap_console()
|
||||
|
||||
async def start_websocket_console(self, request):
|
||||
"""
|
||||
Connect to console using Websocket.
|
||||
@@ -570,8 +578,12 @@ class BaseNode:
|
||||
# no need to allocate a port when the console type is none
|
||||
self._console = None
|
||||
elif console_type == "vnc":
|
||||
# VNC is a special case and the range must be 5900-6000
|
||||
self._console = self._manager.port_manager.get_free_tcp_port(self._project, 5900, 6000)
|
||||
vnc_console_start_port_range, vnc_console_end_port_range = self._get_vnc_console_port_range()
|
||||
self._console = self._manager.port_manager.get_free_tcp_port(
|
||||
self._project,
|
||||
vnc_console_start_port_range,
|
||||
vnc_console_end_port_range
|
||||
)
|
||||
else:
|
||||
self._console = self._manager.port_manager.get_free_tcp_port(self._project)
|
||||
|
||||
@@ -770,18 +782,8 @@ class BaseNode:
|
||||
# on Linux we use RAW sockets by default excepting if host traffic must be blocked
|
||||
await self._ubridge_send('bridge add_nio_linux_raw {name} "{interface}"'.format(name=bridge_name, interface=ethernet_interface))
|
||||
elif sys.platform.startswith("win"):
|
||||
# on Windows we use Winpcap/Npcap
|
||||
windows_interfaces = interfaces()
|
||||
npf_id = None
|
||||
source_mac = None
|
||||
for interface in windows_interfaces:
|
||||
# Winpcap/Npcap uses a NPF ID to identify an interface on Windows
|
||||
if "netcard" in interface and ethernet_interface in interface["netcard"]:
|
||||
npf_id = interface["id"]
|
||||
source_mac = interface["mac_address"]
|
||||
elif ethernet_interface in interface["name"]:
|
||||
npf_id = interface["id"]
|
||||
source_mac = interface["mac_address"]
|
||||
npf_id, source_mac = self._find_windows_interface(ethernet_interface)
|
||||
|
||||
if npf_id:
|
||||
await self._ubridge_send('bridge add_nio_ethernet {name} "{interface}"'.format(name=bridge_name,
|
||||
interface=npf_id))
|
||||
@@ -805,6 +807,25 @@ class BaseNode:
|
||||
await self._ubridge_send('bridge set_pcap_filter {name} "not ether src {mac}"'.format(name=bridge_name, mac=source_mac))
|
||||
log.info('PCAP filter applied on "{interface}" for source MAC {mac}'.format(interface=ethernet_interface, mac=source_mac))
|
||||
|
||||
@staticmethod
|
||||
def _find_windows_interface(ethernet_interface):
|
||||
"""
|
||||
Get NPF ID and MAC address by input ethernet interface name.
|
||||
Return None, None when not match any interface
|
||||
|
||||
:returns: NPF ID and MAC address
|
||||
"""
|
||||
# on Windows we use Winpcap/Npcap
|
||||
windows_interfaces = interfaces()
|
||||
for interface in windows_interfaces:
|
||||
if str.strip(ethernet_interface) == str.strip(interface["name"]):
|
||||
return interface["id"], interface["mac_address"]
|
||||
|
||||
for interface in windows_interfaces:
|
||||
if "netcard" in interface and ethernet_interface in interface["netcard"]:
|
||||
return interface["id"], interface["mac_address"]
|
||||
return None, None
|
||||
|
||||
def _create_local_udp_tunnel(self):
|
||||
"""
|
||||
Creates a local UDP tunnel (pair of 2 NIOs, one for each direction)
|
||||
|
||||
@@ -314,7 +314,8 @@ class DockerVM(BaseNode):
|
||||
# DHCP config for eth{adapter}
|
||||
#auto eth{adapter}
|
||||
#iface eth{adapter} inet dhcp
|
||||
""".format(adapter=adapter))
|
||||
#\thostname {hostname}
|
||||
""".format(adapter=adapter, hostname=self._name))
|
||||
return path
|
||||
|
||||
async def create(self):
|
||||
@@ -334,7 +335,6 @@ class DockerVM(BaseNode):
|
||||
|
||||
params = {
|
||||
"Hostname": self._name,
|
||||
"Name": self._name,
|
||||
"Image": self._image,
|
||||
"NetworkDisabled": True,
|
||||
"Tty": True,
|
||||
@@ -584,6 +584,7 @@ class DockerVM(BaseNode):
|
||||
if tigervnc_path:
|
||||
with open(os.path.join(self.working_dir, "vnc.log"), "w") as fd:
|
||||
self._vnc_process = await asyncio.create_subprocess_exec(tigervnc_path,
|
||||
"-extension", "MIT-SHM",
|
||||
"-geometry", self._console_resolution,
|
||||
"-depth", "16",
|
||||
"-interface", self._manager.port_manager.console_host,
|
||||
@@ -595,8 +596,9 @@ class DockerVM(BaseNode):
|
||||
else:
|
||||
if restart is False:
|
||||
self._xvfb_process = await asyncio.create_subprocess_exec("Xvfb",
|
||||
"-nolisten",
|
||||
"tcp", ":{}".format(self._display),
|
||||
"-nolisten", "tcp",
|
||||
"-extension", "MIT-SHM",
|
||||
":{}".format(self._display),
|
||||
"-screen", "0",
|
||||
self._console_resolution + "x16")
|
||||
|
||||
@@ -606,6 +608,7 @@ class DockerVM(BaseNode):
|
||||
"-forever",
|
||||
"-nopw",
|
||||
"-shared",
|
||||
"-noshm",
|
||||
"-geometry", self._console_resolution,
|
||||
"-display", "WAIT:{}".format(self._display),
|
||||
"-rfbport", str(self.console),
|
||||
@@ -683,7 +686,6 @@ class DockerVM(BaseNode):
|
||||
# resize the container TTY.
|
||||
await self._manager.query("POST", "containers/{}/resize?h={}&w={}".format(self._cid, rows, columns))
|
||||
|
||||
|
||||
async def _start_console(self):
|
||||
"""
|
||||
Starts streaming the console via telnet
|
||||
@@ -739,6 +741,14 @@ class DockerVM(BaseNode):
|
||||
break
|
||||
await self.stop()
|
||||
|
||||
async def reset_console(self):
|
||||
"""
|
||||
Reset the console.
|
||||
"""
|
||||
|
||||
await self._clean_servers()
|
||||
await self._start_console()
|
||||
|
||||
async def is_running(self):
|
||||
"""
|
||||
Checks if the container is running.
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
# the start command of the container
|
||||
#
|
||||
OLD_PATH="$PATH"
|
||||
PATH=/gns3/bin:/tmp/gns3/bin:/sbin
|
||||
PATH=/gns3/bin:/tmp/gns3/bin:/sbin:$PATH
|
||||
|
||||
# bootstrap busybox commands
|
||||
if [ ! -d /tmp/gns3/bin ]; then
|
||||
|
||||
@@ -569,17 +569,39 @@ class IOUVM(BaseNode):
|
||||
log.error("Could not start IOU {}: {}\n{}".format(self._path, e, iou_stdout))
|
||||
raise IOUError("Could not start IOU {}: {}\n{}".format(self._path, e, iou_stdout))
|
||||
|
||||
if self.console and self.console_type == "telnet":
|
||||
server = AsyncioTelnetServer(reader=self._iou_process.stdout, writer=self._iou_process.stdin, binary=True, echo=True)
|
||||
try:
|
||||
self._telnet_server = await asyncio.start_server(server.run, self._manager.port_manager.console_host, self.console)
|
||||
except OSError as e:
|
||||
await self.stop()
|
||||
raise IOUError("Could not start Telnet server on socket {}:{}: {}".format(self._manager.port_manager.console_host, self.console, e))
|
||||
await self.start_console()
|
||||
|
||||
# configure networking support
|
||||
await self._networking()
|
||||
|
||||
async def start_console(self):
|
||||
"""
|
||||
Start the Telnet server to provide console access.
|
||||
"""
|
||||
|
||||
if self.console and self.console_type == "telnet":
|
||||
server = AsyncioTelnetServer(reader=self._iou_process.stdout, writer=self._iou_process.stdin, binary=True,
|
||||
echo=True)
|
||||
try:
|
||||
self._telnet_server = await asyncio.start_server(server.run, self._manager.port_manager.console_host,
|
||||
self.console)
|
||||
except OSError as e:
|
||||
await self.stop()
|
||||
raise IOUError(
|
||||
"Could not start Telnet server on socket {}:{}: {}".format(self._manager.port_manager.console_host,
|
||||
self.console, e))
|
||||
|
||||
async def reset_console(self):
|
||||
"""
|
||||
Reset the console.
|
||||
"""
|
||||
|
||||
if self._telnet_server:
|
||||
self._telnet_server.close()
|
||||
await self._telnet_server.wait_closed()
|
||||
self._telnet_server = None
|
||||
await self.start_console()
|
||||
|
||||
@locking
|
||||
async def _networking(self):
|
||||
"""
|
||||
|
||||
@@ -979,6 +979,14 @@ class VirtualBoxVM(BaseNode):
|
||||
self._remote_pipe.close()
|
||||
self._telnet_server = None
|
||||
|
||||
async def reset_console(self):
|
||||
"""
|
||||
Reset the console.
|
||||
"""
|
||||
|
||||
await self._stop_remote_console()
|
||||
await self._start_console()
|
||||
|
||||
@BaseNode.console_type.setter
|
||||
def console_type(self, new_console_type):
|
||||
"""
|
||||
|
||||
@@ -360,6 +360,8 @@ class VMware(BaseManager):
|
||||
|
||||
def refresh_vmnet_list(self, ubridge=True):
|
||||
|
||||
log.debug("Refreshing VMnet list with uBridge={}".format(ubridge))
|
||||
|
||||
if ubridge:
|
||||
# VMnet host adapters must be present when uBridge is used
|
||||
vmnet_interfaces = self._get_vmnet_interfaces_ubridge()
|
||||
@@ -368,6 +370,7 @@ class VMware(BaseManager):
|
||||
self._vmnets_info = vmnet_interfaces.copy()
|
||||
vmnet_interfaces = list(vmnet_interfaces.keys())
|
||||
|
||||
log.debug("Found {} VMnet interfaces".format(len(vmnet_interfaces)))
|
||||
# remove vmnets already in use
|
||||
for vmware_vm in self._nodes.values():
|
||||
for used_vmnet in vmware_vm.vmnets:
|
||||
@@ -378,6 +381,7 @@ class VMware(BaseManager):
|
||||
# remove vmnets that are not managed
|
||||
for vmnet in vmnet_interfaces.copy():
|
||||
if vmnet in vmnet_interfaces and self.is_managed_vmnet(vmnet) is False:
|
||||
log.debug("{} is not managed by GNS3".format(vmnet))
|
||||
vmnet_interfaces.remove(vmnet)
|
||||
|
||||
self._vmnets = vmnet_interfaces
|
||||
|
||||
@@ -465,6 +465,10 @@ class VMwareVM(BaseNode):
|
||||
|
||||
try:
|
||||
if self._ubridge_hypervisor:
|
||||
if parse_version(platform.mac_ver()[0]) >= parse_version("11.0.0"):
|
||||
# give VMware some time to create the bridge interfaces, so they can be found
|
||||
# by psutil and used by uBridge
|
||||
await asyncio.sleep(1)
|
||||
for adapter_number in range(0, self._adapters):
|
||||
nio = self._ethernet_adapters[adapter_number].get_nio(0)
|
||||
if nio:
|
||||
@@ -891,6 +895,14 @@ class VMwareVM(BaseNode):
|
||||
self._remote_pipe.close()
|
||||
self._telnet_server = None
|
||||
|
||||
async def reset_console(self):
|
||||
"""
|
||||
Reset the console.
|
||||
"""
|
||||
|
||||
await self._stop_remote_console()
|
||||
await self._start_console()
|
||||
|
||||
@BaseNode.console_type.setter
|
||||
def console_type(self, new_console_type):
|
||||
"""
|
||||
|
||||
@@ -22,6 +22,7 @@ import uuid
|
||||
import socket
|
||||
import shutil
|
||||
import aiohttp
|
||||
import importlib_resources
|
||||
|
||||
from ..config import Config
|
||||
from .project import Project
|
||||
@@ -35,7 +36,6 @@ from .symbols import Symbols
|
||||
from ..version import __version__
|
||||
from .topology import load_topology
|
||||
from .gns3vm import GNS3VM
|
||||
from ..utils.get_resource import get_resource
|
||||
from .gns3vm.gns3_vm_error import GNS3VMError
|
||||
|
||||
import logging
|
||||
@@ -65,7 +65,7 @@ class Controller:
|
||||
async def start(self):
|
||||
|
||||
log.info("Controller is starting")
|
||||
self.load_base_files()
|
||||
self._load_base_files()
|
||||
server_config = Config.instance().get_section_config("Server")
|
||||
Config.instance().listen_for_config_changes(self._update_config)
|
||||
host = server_config.get("host", "localhost")
|
||||
@@ -242,6 +242,7 @@ class Controller:
|
||||
if "iou_license" in controller_settings:
|
||||
self._iou_license_settings = controller_settings["iou_license"]
|
||||
|
||||
self._appliance_manager.install_builtin_appliances()
|
||||
self._appliance_manager.appliances_etag = controller_settings.get("appliances_etag")
|
||||
self._appliance_manager.load_appliances()
|
||||
self._template_manager.load_templates(controller_settings.get("templates"))
|
||||
@@ -269,20 +270,27 @@ class Controller:
|
||||
except OSError as e:
|
||||
log.error(str(e))
|
||||
|
||||
def load_base_files(self):
|
||||
def _load_base_files(self):
|
||||
"""
|
||||
At startup we copy base file to the user location to allow
|
||||
them to customize it
|
||||
"""
|
||||
|
||||
dst_path = self.configs_path()
|
||||
src_path = get_resource('configs')
|
||||
try:
|
||||
for file in os.listdir(src_path):
|
||||
if not os.path.exists(os.path.join(dst_path, file)):
|
||||
shutil.copy(os.path.join(src_path, file), os.path.join(dst_path, file))
|
||||
except OSError:
|
||||
pass
|
||||
if hasattr(sys, "frozen") and sys.platform.startswith("win"):
|
||||
resource_path = os.path.normpath(os.path.join(os.path.dirname(sys.executable), "configs"))
|
||||
for filename in os.listdir(resource_path):
|
||||
if not os.path.exists(os.path.join(dst_path, filename)):
|
||||
shutil.copy(os.path.join(resource_path, filename), os.path.join(dst_path, filename))
|
||||
else:
|
||||
for entry in importlib_resources.files('gns3server.configs').iterdir():
|
||||
full_path = os.path.join(dst_path, entry.name)
|
||||
if entry.is_file() and not os.path.exists(full_path):
|
||||
log.debug(f"Installing base config file {entry.name} to {full_path}")
|
||||
shutil.copy(str(entry), os.path.join(dst_path, entry.name))
|
||||
except OSError as e:
|
||||
log.error(f"Could not install base config files to {dst_path}: {e}")
|
||||
|
||||
def images_path(self):
|
||||
"""
|
||||
|
||||
@@ -15,17 +15,18 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import sys
|
||||
import os
|
||||
import shutil
|
||||
import json
|
||||
import uuid
|
||||
import asyncio
|
||||
import aiohttp
|
||||
import importlib_resources
|
||||
import shutil
|
||||
|
||||
from .appliance import Appliance
|
||||
from ..config import Config
|
||||
from ..utils.asyncio import locking
|
||||
from ..utils.get_resource import get_resource
|
||||
|
||||
import logging
|
||||
log = logging.getLogger(__name__)
|
||||
@@ -65,9 +66,9 @@ class ApplianceManager:
|
||||
|
||||
return self._appliances
|
||||
|
||||
def appliances_path(self):
|
||||
def _custom_appliances_path(self):
|
||||
"""
|
||||
Get the image storage directory
|
||||
Get the custom appliance storage directory
|
||||
"""
|
||||
|
||||
server_config = Config.instance().get_section_config("Server")
|
||||
@@ -75,13 +76,44 @@ class ApplianceManager:
|
||||
os.makedirs(appliances_path, exist_ok=True)
|
||||
return appliances_path
|
||||
|
||||
def _builtin_appliances_path(self):
|
||||
"""
|
||||
Get the built-in appliance storage directory
|
||||
"""
|
||||
|
||||
config = Config.instance()
|
||||
appliances_dir = os.path.join(config.config_dir, "appliances")
|
||||
os.makedirs(appliances_dir, exist_ok=True)
|
||||
return appliances_dir
|
||||
|
||||
def install_builtin_appliances(self):
|
||||
"""
|
||||
At startup we copy the built-in appliances files.
|
||||
"""
|
||||
|
||||
dst_path = self._builtin_appliances_path()
|
||||
try:
|
||||
if hasattr(sys, "frozen") and sys.platform.startswith("win"):
|
||||
resource_path = os.path.normpath(os.path.join(os.path.dirname(sys.executable), "appliances"))
|
||||
for filename in os.listdir(resource_path):
|
||||
if not os.path.exists(os.path.join(dst_path, filename)):
|
||||
shutil.copy(os.path.join(resource_path, filename), os.path.join(dst_path, filename))
|
||||
else:
|
||||
for entry in importlib_resources.files('gns3server.appliances').iterdir():
|
||||
full_path = os.path.join(dst_path, entry.name)
|
||||
if entry.is_file() and not os.path.exists(full_path):
|
||||
log.debug(f"Installing built-in appliance file {entry.name} to {full_path}")
|
||||
shutil.copy(str(entry), os.path.join(dst_path, entry.name))
|
||||
except OSError as e:
|
||||
log.error(f"Could not install built-in appliance files to {dst_path}: {e}")
|
||||
|
||||
def load_appliances(self, symbol_theme="Classic"):
|
||||
"""
|
||||
Loads appliance files from disk.
|
||||
"""
|
||||
|
||||
self._appliances = {}
|
||||
for directory, builtin in ((get_resource('appliances'), True,), (self.appliances_path(), False,)):
|
||||
for directory, builtin in ((self._builtin_appliances_path(), True,), (self._custom_appliances_path(), False,)):
|
||||
if directory and os.path.isdir(directory):
|
||||
for file in os.listdir(directory):
|
||||
if not file.endswith('.gns3a') and not file.endswith('.gns3appliance'):
|
||||
@@ -181,7 +213,7 @@ class ApplianceManager:
|
||||
from . import Controller
|
||||
Controller.instance().save()
|
||||
json_data = await response.json()
|
||||
appliances_dir = get_resource('appliances')
|
||||
appliances_dir = self._builtin_appliances_path()
|
||||
downloaded_appliance_files = []
|
||||
for appliance in json_data:
|
||||
if appliance["type"] == "file":
|
||||
|
||||
@@ -367,9 +367,6 @@ class Compute:
|
||||
log.warning("Cannot connect to compute '{}': {}".format(self._id, e))
|
||||
# Try to reconnect after 5 seconds if server unavailable only if not during tests (otherwise we create a ressource usage bomb)
|
||||
if not hasattr(sys, "_called_from_test") or not sys._called_from_test:
|
||||
if self.id != "local" and self.id != "vm" and not self._controller.compute_has_open_project(self):
|
||||
log.warning("Not reconnecting to compute '{}' because there is no project opened on it".format(self._id))
|
||||
return
|
||||
self._connection_failure += 1
|
||||
# After 5 failure we close the project using the compute to avoid sync issues
|
||||
if self._connection_failure == 10:
|
||||
|
||||
@@ -539,6 +539,17 @@ class Node:
|
||||
except asyncio.TimeoutError:
|
||||
raise aiohttp.web.HTTPRequestTimeout(text="Timeout when reloading {}".format(self._name))
|
||||
|
||||
async def reset_console(self):
|
||||
"""
|
||||
Reset the console
|
||||
"""
|
||||
|
||||
if self._console and self._console_type == "telnet":
|
||||
try:
|
||||
await self.post("/console/reset", timeout=240)
|
||||
except asyncio.TimeoutError:
|
||||
raise aiohttp.web.HTTPRequestTimeout(text="Timeout when reset console {}".format(self._name))
|
||||
|
||||
async def post(self, path, data=None, **kwargs):
|
||||
"""
|
||||
HTTP post on the node
|
||||
|
||||
@@ -1124,6 +1124,17 @@ class Project:
|
||||
pool.append(node.suspend)
|
||||
await pool.join()
|
||||
|
||||
@open_required
|
||||
async def reset_console_all(self):
|
||||
"""
|
||||
Reset console for all nodes
|
||||
"""
|
||||
|
||||
pool = Pool(concurrency=3)
|
||||
for node in self.nodes.values():
|
||||
pool.append(node.reset_console)
|
||||
await pool.join()
|
||||
|
||||
@open_required
|
||||
async def duplicate_node(self, node, x, y, z):
|
||||
"""
|
||||
|
||||
@@ -21,6 +21,7 @@ import aiohttp
|
||||
import jsonschema
|
||||
|
||||
from .template import Template
|
||||
from gns3server.config import Config
|
||||
|
||||
import logging
|
||||
log = logging.getLogger(__name__)
|
||||
@@ -60,13 +61,14 @@ class TemplateManager:
|
||||
|
||||
# Add builtins
|
||||
builtins = []
|
||||
builtins.append(Template(uuid.uuid3(uuid.NAMESPACE_DNS, "cloud"), {"template_type": "cloud", "name": "Cloud", "default_name_format": "Cloud{0}", "category": 2, "symbol": ":/symbols/cloud.svg"}, builtin=True))
|
||||
builtins.append(Template(uuid.uuid3(uuid.NAMESPACE_DNS, "nat"), {"template_type": "nat", "name": "NAT", "default_name_format": "NAT{0}", "category": 2, "symbol": ":/symbols/cloud.svg"}, builtin=True))
|
||||
builtins.append(Template(uuid.uuid3(uuid.NAMESPACE_DNS, "vpcs"), {"template_type": "vpcs", "name": "VPCS", "default_name_format": "PC{0}", "category": 2, "symbol": ":/symbols/vpcs_guest.svg", "properties": {"base_script_file": "vpcs_base_config.txt"}}, builtin=True))
|
||||
builtins.append(Template(uuid.uuid3(uuid.NAMESPACE_DNS, "ethernet_switch"), {"template_type": "ethernet_switch", "console_type": "none", "name": "Ethernet switch", "default_name_format": "Switch{0}", "category": 1, "symbol": ":/symbols/ethernet_switch.svg"}, builtin=True))
|
||||
builtins.append(Template(uuid.uuid3(uuid.NAMESPACE_DNS, "ethernet_hub"), {"template_type": "ethernet_hub", "name": "Ethernet hub", "default_name_format": "Hub{0}", "category": 1, "symbol": ":/symbols/hub.svg"}, builtin=True))
|
||||
builtins.append(Template(uuid.uuid3(uuid.NAMESPACE_DNS, "frame_relay_switch"), {"template_type": "frame_relay_switch", "name": "Frame Relay switch", "default_name_format": "FRSW{0}", "category": 1, "symbol": ":/symbols/frame_relay_switch.svg"}, builtin=True))
|
||||
builtins.append(Template(uuid.uuid3(uuid.NAMESPACE_DNS, "atm_switch"), {"template_type": "atm_switch", "name": "ATM switch", "default_name_format": "ATMSW{0}", "category": 1, "symbol": ":/symbols/atm_switch.svg"}, builtin=True))
|
||||
if Config.instance().get_section_config("Server").getboolean("enable_builtin_templates", True):
|
||||
builtins.append(Template(uuid.uuid3(uuid.NAMESPACE_DNS, "cloud"), {"template_type": "cloud", "name": "Cloud", "default_name_format": "Cloud{0}", "category": 2, "symbol": ":/symbols/cloud.svg"}, builtin=True))
|
||||
builtins.append(Template(uuid.uuid3(uuid.NAMESPACE_DNS, "nat"), {"template_type": "nat", "name": "NAT", "default_name_format": "NAT{0}", "category": 2, "symbol": ":/symbols/cloud.svg"}, builtin=True))
|
||||
builtins.append(Template(uuid.uuid3(uuid.NAMESPACE_DNS, "vpcs"), {"template_type": "vpcs", "name": "VPCS", "default_name_format": "PC{0}", "category": 2, "symbol": ":/symbols/vpcs_guest.svg", "properties": {"base_script_file": "vpcs_base_config.txt"}}, builtin=True))
|
||||
builtins.append(Template(uuid.uuid3(uuid.NAMESPACE_DNS, "ethernet_switch"), {"template_type": "ethernet_switch", "console_type": "none", "name": "Ethernet switch", "default_name_format": "Switch{0}", "category": 1, "symbol": ":/symbols/ethernet_switch.svg"}, builtin=True))
|
||||
builtins.append(Template(uuid.uuid3(uuid.NAMESPACE_DNS, "ethernet_hub"), {"template_type": "ethernet_hub", "name": "Ethernet hub", "default_name_format": "Hub{0}", "category": 1, "symbol": ":/symbols/hub.svg"}, builtin=True))
|
||||
builtins.append(Template(uuid.uuid3(uuid.NAMESPACE_DNS, "frame_relay_switch"), {"template_type": "frame_relay_switch", "name": "Frame Relay switch", "default_name_format": "FRSW{0}", "category": 1, "symbol": ":/symbols/frame_relay_switch.svg"}, builtin=True))
|
||||
builtins.append(Template(uuid.uuid3(uuid.NAMESPACE_DNS, "atm_switch"), {"template_type": "atm_switch", "name": "ATM switch", "default_name_format": "ATMSW{0}", "category": 1, "symbol": ":/symbols/atm_switch.svg"}, builtin=True))
|
||||
|
||||
#FIXME: disable TraceNG
|
||||
#if sys.platform.startswith("win"):
|
||||
|
||||
@@ -58,7 +58,7 @@ class CrashReport:
|
||||
Report crash to a third party service
|
||||
"""
|
||||
|
||||
DSN = "https://57f6b1102b6a4985a8e93aed51e19b8b@o19455.ingest.sentry.io/38482"
|
||||
DSN = "https://67695b9b3995495d9445159d973d2f0d@o19455.ingest.sentry.io/38482"
|
||||
_instance = None
|
||||
|
||||
def __init__(self):
|
||||
@@ -93,7 +93,7 @@ class CrashReport:
|
||||
"os:release": platform.release(),
|
||||
"os:win_32": " ".join(platform.win32_ver()),
|
||||
"os:mac": "{} {}".format(platform.mac_ver()[0], platform.mac_ver()[2]),
|
||||
"os:linux": " ".join(distro.linux_distribution()),
|
||||
"os:linux": distro.name(pretty=True),
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -425,3 +425,23 @@ class DockerHandler:
|
||||
docker_manager = Docker.instance()
|
||||
container = docker_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
|
||||
return await container.start_websocket_console(request)
|
||||
|
||||
@Route.post(
|
||||
r"/projects/{project_id}/docker/nodes/{node_id}/console/reset",
|
||||
description="Reset console",
|
||||
parameters={
|
||||
"project_id": "Project UUID",
|
||||
"node_id": "Node UUID",
|
||||
},
|
||||
status_codes={
|
||||
204: "Console has been reset",
|
||||
400: "Invalid request",
|
||||
404: "Instance doesn't exist",
|
||||
409: "Container not started"
|
||||
})
|
||||
async def reset_console(request, response):
|
||||
|
||||
docker_manager = Docker.instance()
|
||||
container = docker_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
|
||||
await container.reset_console()
|
||||
response.set_status(204)
|
||||
@@ -526,3 +526,23 @@ class DynamipsVMHandler:
|
||||
dynamips_manager = Dynamips.instance()
|
||||
vm = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
|
||||
return await vm.start_websocket_console(request)
|
||||
|
||||
@Route.post(
|
||||
r"/projects/{project_id}/dynamips/nodes/{node_id}/console/reset",
|
||||
description="Reset console",
|
||||
parameters={
|
||||
"project_id": "Project UUID",
|
||||
"node_id": "Node UUID",
|
||||
},
|
||||
status_codes={
|
||||
204: "Console has been reset",
|
||||
400: "Invalid request",
|
||||
404: "Instance doesn't exist",
|
||||
409: "Container not started"
|
||||
})
|
||||
async def reset_console(request, response):
|
||||
|
||||
dynamips_manager = Dynamips.instance()
|
||||
vm = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
|
||||
await vm.reset_console()
|
||||
response.set_status(204)
|
||||
@@ -467,3 +467,23 @@ class IOUHandler:
|
||||
iou_manager = IOU.instance()
|
||||
vm = iou_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
|
||||
return await vm.start_websocket_console(request)
|
||||
|
||||
@Route.post(
|
||||
r"/projects/{project_id}/iou/nodes/{node_id}/console/reset",
|
||||
description="Reset console",
|
||||
parameters={
|
||||
"project_id": "Project UUID",
|
||||
"node_id": "Node UUID",
|
||||
},
|
||||
status_codes={
|
||||
204: "Console has been reset",
|
||||
400: "Invalid request",
|
||||
404: "Instance doesn't exist",
|
||||
409: "Container not started"
|
||||
})
|
||||
async def reset_console(request, response):
|
||||
|
||||
iou_manager = IOU.instance()
|
||||
vm = iou_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
|
||||
await vm.reset_console()
|
||||
response.set_status(204)
|
||||
@@ -590,3 +590,23 @@ class QEMUHandler:
|
||||
qemu_manager = Qemu.instance()
|
||||
vm = qemu_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
|
||||
return await vm.start_websocket_console(request)
|
||||
|
||||
@Route.post(
|
||||
r"/projects/{project_id}/qemu/nodes/{node_id}/console/reset",
|
||||
description="Reset console",
|
||||
parameters={
|
||||
"project_id": "Project UUID",
|
||||
"node_id": "Node UUID",
|
||||
},
|
||||
status_codes={
|
||||
204: "Console has been reset",
|
||||
400: "Invalid request",
|
||||
404: "Instance doesn't exist",
|
||||
409: "Container not started"
|
||||
})
|
||||
async def reset_console(request, response):
|
||||
|
||||
qemu_manager = Qemu.instance()
|
||||
vm = qemu_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
|
||||
await vm.reset_console()
|
||||
response.set_status(204)
|
||||
@@ -437,3 +437,23 @@ class VirtualBoxHandler:
|
||||
virtualbox_manager = VirtualBox.instance()
|
||||
vm = virtualbox_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
|
||||
return await vm.start_websocket_console(request)
|
||||
|
||||
@Route.post(
|
||||
r"/projects/{project_id}/virtualbox/nodes/{node_id}/console/reset",
|
||||
description="Reset console",
|
||||
parameters={
|
||||
"project_id": "Project UUID",
|
||||
"node_id": "Node UUID",
|
||||
},
|
||||
status_codes={
|
||||
204: "Console has been reset",
|
||||
400: "Invalid request",
|
||||
404: "Instance doesn't exist",
|
||||
409: "Container not started"
|
||||
})
|
||||
async def reset_console(request, response):
|
||||
|
||||
virtualbox_manager = VirtualBox.instance()
|
||||
vm = virtualbox_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
|
||||
await vm.reset_console()
|
||||
response.set_status(204)
|
||||
@@ -422,3 +422,23 @@ class VMwareHandler:
|
||||
vmware_manager = VMware.instance()
|
||||
vm = vmware_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
|
||||
return await vm.start_websocket_console(request)
|
||||
|
||||
@Route.post(
|
||||
r"/projects/{project_id}/vmware/nodes/{node_id}/console/reset",
|
||||
description="Reset console",
|
||||
parameters={
|
||||
"project_id": "Project UUID",
|
||||
"node_id": "Node UUID",
|
||||
},
|
||||
status_codes={
|
||||
204: "Console has been reset",
|
||||
400: "Invalid request",
|
||||
404: "Instance doesn't exist",
|
||||
409: "Container not started"
|
||||
})
|
||||
async def reset_console(request, response):
|
||||
|
||||
vmware_manager = VMware.instance()
|
||||
vm = vmware_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
|
||||
await vm.reset_console()
|
||||
response.set_status(204)
|
||||
@@ -375,3 +375,23 @@ class VPCSHandler:
|
||||
vpcs_manager = VPCS.instance()
|
||||
vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
|
||||
return await vm.start_websocket_console(request)
|
||||
|
||||
@Route.post(
|
||||
r"/projects/{project_id}/vpcs/nodes/{node_id}/console/reset",
|
||||
description="Reset console",
|
||||
parameters={
|
||||
"project_id": "Project UUID",
|
||||
"node_id": "Node UUID",
|
||||
},
|
||||
status_codes={
|
||||
204: "Console has been reset",
|
||||
400: "Invalid request",
|
||||
404: "Instance doesn't exist",
|
||||
409: "Container not started"
|
||||
})
|
||||
async def reset_console(request, response):
|
||||
|
||||
vpcs_manager = VPCS.instance()
|
||||
vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
|
||||
await vm.reset_console()
|
||||
response.set_status(204)
|
||||
@@ -506,3 +506,40 @@ class NodeHandler:
|
||||
request.app['websockets'].discard(ws)
|
||||
|
||||
return ws
|
||||
|
||||
@Route.post(
|
||||
r"/projects/{project_id}/nodes/console/reset",
|
||||
parameters={
|
||||
"project_id": "Project UUID"
|
||||
},
|
||||
status_codes={
|
||||
204: "All nodes successfully reset consoles",
|
||||
400: "Invalid request",
|
||||
404: "Instance doesn't exist"
|
||||
},
|
||||
description="Reset console for all nodes belonging to the project",
|
||||
output=NODE_OBJECT_SCHEMA)
|
||||
async def reset_console_all(request, response):
|
||||
|
||||
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
|
||||
await project.reset_console_all()
|
||||
response.set_status(204)
|
||||
|
||||
@Route.post(
|
||||
r"/projects/{project_id}/nodes/{node_id}/console/reset",
|
||||
parameters={
|
||||
"project_id": "Project UUID",
|
||||
"node_id": "Node UUID"
|
||||
},
|
||||
status_codes={
|
||||
204: "Console reset",
|
||||
400: "Invalid request",
|
||||
404: "Instance doesn't exist"
|
||||
},
|
||||
description="Reload a node instance")
|
||||
async def console_reset(request, response):
|
||||
|
||||
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
|
||||
node = project.get_node(request.match_info["node_id"])
|
||||
await node.post("/console/reset", request.json)
|
||||
response.set_status(204)
|
||||
@@ -46,6 +46,6 @@
|
||||
|
||||
gtag('config', 'G-5D6FZL9923');
|
||||
</script>
|
||||
<script src="runtime.91a209cf21f6fb848205.js" defer></script><script src="polyfills-es5.865074f5cd9a121111a2.js" nomodule defer></script><script src="polyfills.2f91a039d848e57ff02e.js" defer></script><script src="main.4b4883543cd4ccdf0202.js" defer></script>
|
||||
<script src="runtime.91a209cf21f6fb848205.js" defer></script><script src="polyfills-es5.865074f5cd9a121111a2.js" nomodule defer></script><script src="polyfills.2f91a039d848e57ff02e.js" defer></script><script src="main.41e1ff185162d1659203.js" defer></script>
|
||||
|
||||
</body></html>
|
||||
@@ -1 +0,0 @@
|
||||
(self.webpackChunkgns3_web_ui=self.webpackChunkgns3_web_ui||[]).push([[179],{98255:function(ue){function q(f){return Promise.resolve().then(function(){var U=new Error("Cannot find module '"+f+"'");throw U.code="MODULE_NOT_FOUND",U})}q.keys=function(){return[]},q.resolve=q,q.id=98255,ue.exports=q},82908:function(ue){ue.exports=function(f,U){(null==U||U>f.length)&&(U=f.length);for(var B=0,V=new Array(U);B<U;B++)V[B]=f[B];return V},ue.exports.default=ue.exports,ue.exports.__esModule=!0},36457:function(ue){ue.exports=function(f){if(Array.isArray(f))return f},ue.exports.default=ue.exports,ue.exports.__esModule=!0},35036:function(ue){ue.exports=function(f,U){var B=null==f?null:"undefined"!=typeof Symbol&&f[Symbol.iterator]||f["@@iterator"];if(null!=B){var R,b,V=[],Z=!0,T=!1;try{for(B=B.call(f);!(Z=(R=B.next()).done)&&(V.push(R.value),!U||V.length!==U);Z=!0);}catch(v){T=!0,b=v}finally{try{!Z&&null!=B.return&&B.return()}finally{if(T)throw b}}return V}},ue.exports.default=ue.exports,ue.exports.__esModule=!0},13969:function(ue){ue.exports=function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")},ue.exports.default=ue.exports,ue.exports.__esModule=!0},6326:function(ue,q,f){var U=f(36457),B=f(35036),V=f(54850),Z=f(13969);ue.exports=function(R,b){return U(R)||B(R,b)||V(R,b)||Z()},ue.exports.default=ue.exports,ue.exports.__esModule=!0},54850:function(ue,q,f){var U=f(82908);ue.exports=function(V,Z){if(V){if("string"==typeof V)return U(V,Z);var T=Object.prototype.toString.call(V).slice(8,-1);if("Object"===T&&V.constructor&&(T=V.constructor.name),"Map"===T||"Set"===T)return Array.from(V);if("Arguments"===T||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(T))return U(V,Z)}},ue.exports.default=ue.exports,ue.exports.__esModule=!0},26552:function(ue,q,f){ue.exports=f(55590)},61855:function(ue,q,f){"use strict";f.d(q,{ZT:function(){return B},mG:function(){return v},Jh:function(){return I},ev:function(){return N}});var U=function($,ae){return(U=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(se,ce){se.__proto__=ce}||function(se,ce){for(var le in ce)Object.prototype.hasOwnProperty.call(ce,le)&&(se[le]=ce[le])})($,ae)};function B($,ae){if("function"!=typeof ae&&null!==ae)throw new TypeError("Class extends value "+String(ae)+" is not a constructor or null");function se(){this.constructor=$}U($,ae),$.prototype=null===ae?Object.create(ae):(se.prototype=ae.prototype,new se)}function v($,ae,se,ce){return new(se||(se=Promise))(function(oe,Ae){function be(_t){try{qe(ce.next(_t))}catch(yt){Ae(yt)}}function it(_t){try{qe(ce.throw(_t))}catch(yt){Ae(yt)}}function qe(_t){_t.done?oe(_t.value):function(oe){return oe instanceof se?oe:new se(function(Ae){Ae(oe)})}(_t.value).then(be,it)}qe((ce=ce.apply($,ae||[])).next())})}function I($,ae){var ce,le,oe,Ae,se={label:0,sent:function(){if(1&oe[0])throw oe[1];return oe[1]},trys:[],ops:[]};return Ae={next:be(0),throw:be(1),return:be(2)},"function"==typeof Symbol&&(Ae[Symbol.iterator]=function(){return this}),Ae;function be(qe){return function(_t){return function(qe){if(ce)throw new TypeError("Generator is already executing.");for(;se;)try{if(ce=1,le&&(oe=2&qe[0]?le.return:qe[0]?le.throw||((oe=le.return)&&oe.call(le),0):le.next)&&!(oe=oe.call(le,qe[1])).done)return oe;switch(le=0,oe&&(qe=[2&qe[0],oe.value]),qe[0]){case 0:case 1:oe=qe;break;case 4:return se.label++,{value:qe[1],done:!1};case 5:se.label++,le=qe[1],qe=[0];continue;case 7:qe=se.ops.pop(),se.trys.pop();continue;default:if(!(oe=(oe=se.trys).length>0&&oe[oe.length-1])&&(6===qe[0]||2===qe[0])){se=0;continue}if(3===qe[0]&&(!oe||qe[1]>oe[0]&&qe[1]<oe[3])){se.label=qe[1];break}if(6===qe[0]&&se.label<oe[1]){se.label=oe[1],oe=qe;break}if(oe&&se.label<oe[2]){se.label=oe[2],se.ops.push(qe);break}oe[2]&&se.ops.pop(),se.trys.pop();continue}qe=ae.call($,se)}catch(_t){qe=[6,_t],le=0}finally{ce=oe=0}if(5&qe[0])throw qe[1];return{value:qe[0]?qe[1]:void 0,done:!0}}([qe,_t])}}}function N($,ae,se){if(se||2===arguments.length)for(var oe,ce=0,le=ae.length;ce<le;ce++)(oe||!(ce in ae))&&(oe||(oe=Array.prototype.slice.call(ae,0,ce)),oe[ce]=ae[ce]);return $.concat(oe||Array.prototype.slice.call(ae))}},739:function(ue,q,f){"use strict";f.d(q,{l3:function(){return T},_j:function(){return V},LC:function(){return Z},ZN:function(){return O},jt:function(){return b},pV:function(){return E},F4:function(){return M},IO:function(){return A},vP:function(){return I},SB:function(){return k},oB:function(){return D},eR:function(){return _},X$:function(){return R},ZE:function(){return F},k1:function(){return z}});var U=f(14105),B=f(18967),V=function K(){(0,B.Z)(this,K)},Z=function K(){(0,B.Z)(this,K)},T="*";function R(K,j){return{type:7,name:K,definitions:j,options:{}}}function b(K){var j=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return{type:4,styles:j,timings:K}}function I(K){var j=arguments.length>1&&void 0!==arguments[1]?arguments[1]Line truncated
|
||||
@@ -15,6 +15,7 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import sys
|
||||
import asyncio
|
||||
|
||||
|
||||
@@ -39,7 +40,11 @@ class Pool():
|
||||
while len(self._tasks) > 0 or len(pending) > 0:
|
||||
while len(self._tasks) > 0 and len(pending) < self._concurrency:
|
||||
task, args, kwargs = self._tasks.pop(0)
|
||||
pending.add(task(*args, **kwargs))
|
||||
if sys.version_info >= (3, 7):
|
||||
t = asyncio.create_task(task(*args, **kwargs))
|
||||
else:
|
||||
t = asyncio.get_event_loop().create_task(task(*args, **kwargs))
|
||||
pending.add(t)
|
||||
(done, pending) = await asyncio.wait(pending, return_when=asyncio.FIRST_COMPLETED)
|
||||
for task in done:
|
||||
if task.exception():
|
||||
|
||||
@@ -15,33 +15,18 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import tempfile
|
||||
import pkg_resources
|
||||
import atexit
|
||||
import logging
|
||||
import os
|
||||
import sys
|
||||
import importlib_resources
|
||||
|
||||
from contextlib import ExitStack
|
||||
resource_manager = ExitStack()
|
||||
atexit.register(resource_manager.close)
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
try:
|
||||
egg_cache_dir = tempfile.mkdtemp()
|
||||
pkg_resources.set_extraction_path(egg_cache_dir)
|
||||
except ValueError:
|
||||
# If the path is already set the module throw an error
|
||||
pass
|
||||
|
||||
|
||||
@atexit.register
|
||||
def clean_egg_cache():
|
||||
try:
|
||||
import shutil
|
||||
log.debug("Clean egg cache %s", egg_cache_dir)
|
||||
shutil.rmtree(egg_cache_dir)
|
||||
except Exception:
|
||||
# We don't care if we can not cleanup
|
||||
pass
|
||||
|
||||
|
||||
def get_resource(resource_name):
|
||||
"""
|
||||
@@ -51,7 +36,9 @@ def get_resource(resource_name):
|
||||
resource_path = None
|
||||
if hasattr(sys, "frozen"):
|
||||
resource_path = os.path.normpath(os.path.join(os.path.dirname(sys.executable), resource_name))
|
||||
elif not hasattr(sys, "frozen") and pkg_resources.resource_exists("gns3server", resource_name):
|
||||
resource_path = pkg_resources.resource_filename("gns3server", resource_name)
|
||||
resource_path = os.path.normpath(resource_path)
|
||||
else:
|
||||
ref = importlib_resources.files("gns3server") / resource_name
|
||||
path = resource_manager.enter_context(importlib_resources.as_file(ref))
|
||||
if os.path.exists(path):
|
||||
resource_path = os.path.normpath(path)
|
||||
return resource_path
|
||||
@@ -23,15 +23,15 @@
|
||||
# or negative for a release candidate or beta (after the base version
|
||||
# number has been incremented)
|
||||
|
||||
__version__ = "2.2.32"
|
||||
__version_info__ = (2, 2, 32, 0)
|
||||
__version__ = "2.2.35"
|
||||
__version_info__ = (2, 2, 35, 0)
|
||||
|
||||
if "dev" in __version__:
|
||||
try:
|
||||
import os
|
||||
import subprocess
|
||||
if os.path.exists(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", ".git")):
|
||||
r = subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]).decode().strip()
|
||||
__version__ = "{}-{}".format(__version__, r)
|
||||
r = subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]).decode().strip("\n")
|
||||
__version__ += "+" + r
|
||||
except Exception as e:
|
||||
print(e)
|
||||
@@ -147,7 +147,7 @@ class Route(object):
|
||||
else:
|
||||
route = path
|
||||
|
||||
# Compute metadata for the documentation
|
||||
# Compute metadata for the documentation
|
||||
if api_version:
|
||||
handler = func.__module__.replace("_handler", "").replace("gns3server.handlers.api.", "")
|
||||
cls._documentation.setdefault(handler, {})
|
||||
@@ -164,8 +164,6 @@ class Route(object):
|
||||
"description": kw.get("description", ""),
|
||||
})
|
||||
|
||||
func = asyncio.coroutine(func)
|
||||
|
||||
async def control_schema(request):
|
||||
# This block is executed at each method call
|
||||
server_config = Config.instance().get_section_config("Server")
|
||||
@@ -181,7 +179,10 @@ class Route(object):
|
||||
response = Response(request=request, route=route, output_schema=output_schema)
|
||||
|
||||
request = await parse_request(request, None, raw)
|
||||
await func(request, response)
|
||||
if asyncio.iscoroutinefunction(func):
|
||||
await func(request, response)
|
||||
else:
|
||||
func(request, response)
|
||||
return response
|
||||
|
||||
# API call
|
||||
@@ -195,7 +196,10 @@ class Route(object):
|
||||
except OSError as e:
|
||||
log.warning("Could not write to the record file {}: {}".format(record_file, e))
|
||||
response = Response(request=request, route=route, output_schema=output_schema)
|
||||
await func(request, response)
|
||||
if asyncio.iscoroutinefunction(func):
|
||||
await func(request, response)
|
||||
else:
|
||||
func(request, response)
|
||||
except aiohttp.web.HTTPBadRequest as e:
|
||||
response = Response(request=request, route=route)
|
||||
response.set_status(e.status)
|
||||
|
||||
Executable
+52
@@ -0,0 +1,52 @@
|
||||
#!/sbin/openrc-run
|
||||
# Copyright 2022 Gentoo Authors
|
||||
# Distributed under the terms of the GNU General Public License v2
|
||||
|
||||
extra_started_commands="reload"
|
||||
|
||||
: ${GNS3_SERVER_BINARY:=${RC_PREFIX%/}/usr/bin/gns3server}
|
||||
: ${GNS3_SERVER_PIDFILE:=${RC_PREFIX%/}/run/${SVCNAME}.pid}
|
||||
: ${GNS3_SERVER_COMMAND_USER:=gns3:gns3}
|
||||
: ${GNS3_SERVER_LOG_ENABLED:=no}
|
||||
: ${GNS3_SERVER_LOG_PATH:=${RC_PREFIX%/}/var/log/GNS3}
|
||||
: ${GNS3_SERVER_LOG:=${GNS3_SERVER_LOG_PATH}/${RC_SVCNAME}.log}
|
||||
|
||||
command="${GNS3_SERVER_BINARY}"
|
||||
pidfile="${GNS3_SERVER_PIDFILE}"
|
||||
command_user="${GNS3_SERVER_COMMAND_USER}"
|
||||
command_background="yes"
|
||||
command_args="${GNS3_SERVER_OPTS}"
|
||||
|
||||
depend() {
|
||||
need net
|
||||
}
|
||||
|
||||
checkconfig() {
|
||||
if yesno "${GNS3_SERVER_LOG_ENABLED}" ; then
|
||||
command_args="${command_args} --log ${GNS3_SERVER_LOG}";
|
||||
if [ "${command_user}" ] ; then
|
||||
checkpath --directory --mode 0700 --owner "${command_user}" "${GNS3_SERVER_LOG_PATH}";
|
||||
else
|
||||
unset command_user
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
start_pre() {
|
||||
if [ "${RC_CMD}" != "restart" ] ; then
|
||||
checkconfig || return $?
|
||||
fi
|
||||
}
|
||||
|
||||
stop_pre() {
|
||||
if [ "${RC_CMD}" = "restart" ] ; then
|
||||
checkconfig || return $?
|
||||
fi
|
||||
}
|
||||
|
||||
reload() {
|
||||
checkconfig || return $?
|
||||
ebegin "Reloading ${RC_SVCNAME}"
|
||||
start-stop-daemon --signal HUP --pidfile "${pidfile}"
|
||||
eend $?
|
||||
}
|
||||
@@ -6,7 +6,7 @@ After=network.target network-online.target
|
||||
[Service]
|
||||
User=gns3
|
||||
Group=gns3
|
||||
ExecStart=/usr/bin/gns3server
|
||||
ExecStart=/usr/local/bin/gns3server
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
WantedBy=multi-user.target
|
||||
@@ -1,3 +1,4 @@
|
||||
[pytest]
|
||||
asyncio_mode=auto
|
||||
log_level=NOTSET
|
||||
ignore=env
|
||||
+16
-12
@@ -1,12 +1,16 @@
|
||||
jsonschema==3.2.0
|
||||
aiohttp==3.8.1
|
||||
aiohttp-cors==0.7.0
|
||||
aiofiles==0.8.0
|
||||
Jinja2==3.0.3
|
||||
sentry-sdk==1.5.10
|
||||
psutil==5.9.0
|
||||
async-timeout==4.0.2
|
||||
distro==1.7.0
|
||||
py-cpuinfo==8.0.0
|
||||
setuptools==60.6.0; python_version >= '3.7' # don't upgrade because of https://github.com/pypa/setuptools/issues/3084
|
||||
setuptools==59.6.0; python_version < '3.7' # v59.7.0 dropped support for Python 3.6
|
||||
jsonschema>=4.17.0,<4.18; python_version >= '3.7'
|
||||
jsonschema==3.2.0; python_version < '3.7' # v3.2.0 is the last version to support Python 3.6
|
||||
aiohttp>=3.8.3,<3.9
|
||||
aiohttp-cors>=0.7.0,<0.8
|
||||
aiofiles>=22.1.0,<22.2; python_version >= '3.7'
|
||||
aiofiles==0.8.0; python_version < '3.7' # v0.8.0 is the last version to support Python 3.6
|
||||
Jinja2>=3.1.2,<3.2; python_version >= '3.7'
|
||||
Jinja2==3.0.3; python_version < '3.7' # v3.0.3 is the last version to support Python 3.6
|
||||
sentry-sdk==1.10.1,<1.11
|
||||
psutil==5.9.2
|
||||
async-timeout>=4.0.2,<4.1
|
||||
distro>=1.7.0
|
||||
py-cpuinfo>=9.0.0,<10.0
|
||||
importlib-resources>=1.3
|
||||
setuptools>=60.8.1; python_version >= '3.7'
|
||||
setuptools==59.6.0; python_version < '3.7' # v59.6.0 is the last version to support Python 3.6
|
||||
@@ -81,6 +81,7 @@ setup(
|
||||
"Programming Language :: Python :: 3.8",
|
||||
"Programming Language :: Python :: 3.9",
|
||||
"Programming Language :: Python :: 3.10",
|
||||
"Programming Language :: Python :: 3.11",
|
||||
"Programming Language :: Python :: Implementation :: CPython",
|
||||
],
|
||||
)
|
||||
@@ -108,7 +108,6 @@ async def test_create(compute_project, manager):
|
||||
},
|
||||
"Volumes": {},
|
||||
"NetworkDisabled": True,
|
||||
"Name": "test",
|
||||
"Hostname": "test",
|
||||
"Image": "ubuntu:latest",
|
||||
"Env": [
|
||||
@@ -147,7 +146,6 @@ async def test_create_with_tag(compute_project, manager):
|
||||
},
|
||||
"Volumes": {},
|
||||
"NetworkDisabled": True,
|
||||
"Name": "test",
|
||||
"Hostname": "test",
|
||||
"Image": "ubuntu:16.04",
|
||||
"Env": [
|
||||
@@ -190,7 +188,6 @@ async def test_create_vnc(compute_project, manager):
|
||||
},
|
||||
"Volumes": {},
|
||||
"NetworkDisabled": True,
|
||||
"Name": "test",
|
||||
"Hostname": "test",
|
||||
"Image": "ubuntu:latest",
|
||||
"Env": [
|
||||
@@ -307,7 +304,6 @@ async def test_create_start_cmd(compute_project, manager):
|
||||
"Entrypoint": ["/gns3/init.sh"],
|
||||
"Cmd": ["/bin/ls"],
|
||||
"NetworkDisabled": True,
|
||||
"Name": "test",
|
||||
"Hostname": "test",
|
||||
"Image": "ubuntu:latest",
|
||||
"Env": [
|
||||
@@ -404,7 +400,6 @@ async def test_create_image_not_available(compute_project, manager):
|
||||
},
|
||||
"Volumes": {},
|
||||
"NetworkDisabled": True,
|
||||
"Name": "test",
|
||||
"Hostname": "test",
|
||||
"Image": "ubuntu:latest",
|
||||
"Env": [
|
||||
@@ -448,7 +443,6 @@ async def test_create_with_user(compute_project, manager):
|
||||
},
|
||||
"Volumes": {},
|
||||
"NetworkDisabled": True,
|
||||
"Name": "test",
|
||||
"Hostname": "test",
|
||||
"Image": "ubuntu:latest",
|
||||
"Env": [
|
||||
@@ -532,7 +526,6 @@ async def test_create_with_extra_volumes_duplicate_1_image(compute_project, mana
|
||||
},
|
||||
"Volumes": {},
|
||||
"NetworkDisabled": True,
|
||||
"Name": "test",
|
||||
"Hostname": "test",
|
||||
"Image": "ubuntu:latest",
|
||||
"Env": [
|
||||
@@ -572,7 +565,6 @@ async def test_create_with_extra_volumes_duplicate_2_user(compute_project, manag
|
||||
},
|
||||
"Volumes": {},
|
||||
"NetworkDisabled": True,
|
||||
"Name": "test",
|
||||
"Hostname": "test",
|
||||
"Image": "ubuntu:latest",
|
||||
"Env": [
|
||||
@@ -612,7 +604,6 @@ async def test_create_with_extra_volumes_duplicate_3_subdir(compute_project, man
|
||||
},
|
||||
"Volumes": {},
|
||||
"NetworkDisabled": True,
|
||||
"Name": "test",
|
||||
"Hostname": "test",
|
||||
"Image": "ubuntu:latest",
|
||||
"Env": [
|
||||
@@ -652,7 +643,6 @@ async def test_create_with_extra_volumes_duplicate_4_backslash(compute_project,
|
||||
},
|
||||
"Volumes": {},
|
||||
"NetworkDisabled": True,
|
||||
"Name": "test",
|
||||
"Hostname": "test",
|
||||
"Image": "ubuntu:latest",
|
||||
"Env": [
|
||||
@@ -691,7 +681,6 @@ async def test_create_with_extra_volumes_duplicate_5_subdir_issue_1595(compute_p
|
||||
},
|
||||
"Volumes": {},
|
||||
"NetworkDisabled": True,
|
||||
"Name": "test",
|
||||
"Hostname": "test",
|
||||
"Image": "ubuntu:latest",
|
||||
"Env": [
|
||||
@@ -730,7 +719,6 @@ async def test_create_with_extra_volumes_duplicate_6_subdir_issue_1595(compute_p
|
||||
},
|
||||
"Volumes": {},
|
||||
"NetworkDisabled": True,
|
||||
"Name": "test",
|
||||
"Hostname": "test",
|
||||
"Image": "ubuntu:latest",
|
||||
"Env": [
|
||||
@@ -777,7 +765,6 @@ async def test_create_with_extra_volumes(compute_project, manager):
|
||||
},
|
||||
"Volumes": {},
|
||||
"NetworkDisabled": True,
|
||||
"Name": "test",
|
||||
"Hostname": "test",
|
||||
"Image": "ubuntu:latest",
|
||||
"Env": [
|
||||
@@ -1001,7 +988,6 @@ async def test_update(vm):
|
||||
},
|
||||
"Volumes": {},
|
||||
"NetworkDisabled": True,
|
||||
"Name": "test",
|
||||
"Hostname": "test",
|
||||
"Image": "ubuntu:latest",
|
||||
"Env": [
|
||||
@@ -1070,7 +1056,6 @@ async def test_update_running(vm):
|
||||
},
|
||||
"Volumes": {},
|
||||
"NetworkDisabled": True,
|
||||
"Name": "test",
|
||||
"Hostname": "test",
|
||||
"Image": "ubuntu:latest",
|
||||
"Env": [
|
||||
@@ -1343,7 +1328,7 @@ async def test_start_vnc(vm):
|
||||
with asyncio_patch("asyncio.create_subprocess_exec") as mock_exec:
|
||||
await vm._start_vnc()
|
||||
assert vm._display is not None
|
||||
assert mock_exec.call_args[0] == ("/bin/Xtigervnc", "-geometry", vm.console_resolution, "-depth", "16", "-interface", "127.0.0.1", "-rfbport", str(vm.console), "-AlwaysShared", "-SecurityTypes", "None", ":{}".format(vm._display))
|
||||
assert mock_exec.call_args[0] == ("/bin/Xtigervnc", "-extension", "MIT-SHM", "-geometry", vm.console_resolution, "-depth", "16", "-interface", "127.0.0.1", "-rfbport", str(vm.console), "-AlwaysShared", "-SecurityTypes", "None", ":{}".format(vm._display))
|
||||
mock_wait.assert_called_with("/tmp/.X11-unix/X{}".format(vm._display))
|
||||
|
||||
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
import os
|
||||
import uuid
|
||||
import pytest
|
||||
import asyncio
|
||||
|
||||
from gns3server.compute.dynamips.nodes.router import Router
|
||||
from gns3server.compute.dynamips.dynamips_error import DynamipsError
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
from collections import OrderedDict
|
||||
|
||||
import pytest
|
||||
import asyncio
|
||||
|
||||
from tests.utils import asyncio_patch, AsyncioMagicMock
|
||||
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
import pytest
|
||||
|
||||
from gns3server.compute.vmware import VMware
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import pytest
|
||||
import asyncio
|
||||
|
||||
from gns3server.compute.vmware.vmware_vm import VMwareVM
|
||||
from gns3server.compute.vmware import VMware
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import pytest
|
||||
import asyncio
|
||||
|
||||
from tests.utils import asyncio_patch, AsyncioMagicMock
|
||||
from gns3server.utils.asyncio import wait_run_in_executor
|
||||
|
||||
@@ -24,6 +24,7 @@ import aiohttp
|
||||
from unittest.mock import MagicMock, patch
|
||||
from tests.utils import AsyncioMagicMock, asyncio_patch
|
||||
|
||||
from gns3server.config import Config
|
||||
from gns3server.controller.compute import Compute
|
||||
from gns3server.version import __version__
|
||||
|
||||
@@ -386,10 +387,10 @@ async def test_load_base_files(controller, config, tmpdir):
|
||||
with open(str(tmpdir / 'iou_l2_base_startup-config.txt'), 'w+') as f:
|
||||
f.write('test')
|
||||
|
||||
controller.load_base_files()
|
||||
controller._load_base_files()
|
||||
assert os.path.exists(str(tmpdir / 'iou_l3_base_startup-config.txt'))
|
||||
|
||||
# Check is the file has not been overwrite
|
||||
# Check is the file has not been overwritten
|
||||
with open(str(tmpdir / 'iou_l2_base_startup-config.txt')) as f:
|
||||
assert f.read() == 'test'
|
||||
|
||||
@@ -451,6 +452,15 @@ def test_load_templates(controller):
|
||||
assert cloud_uuid == template.id
|
||||
|
||||
|
||||
def test_load_templates_without_builtins(controller):
|
||||
|
||||
config = Config.instance()
|
||||
config.set("Server", "enable_builtin_templates", False)
|
||||
controller.template_manager.load_templates()
|
||||
|
||||
assert not controller.template_manager.templates.values()
|
||||
|
||||
|
||||
async def test_autoidlepc(controller):
|
||||
|
||||
controller._computes["local"] = AsyncioMagicMock()
|
||||
|
||||
@@ -829,6 +829,22 @@ async def test_suspend_all(project):
|
||||
assert len(compute.post.call_args_list) == 10
|
||||
|
||||
|
||||
async def test_console_reset_all(project):
|
||||
|
||||
compute = MagicMock()
|
||||
compute.id = "local"
|
||||
response = MagicMock()
|
||||
response.json = {"console": 2048, "console_type": "telnet"}
|
||||
compute.post = AsyncioMagicMock(return_value=response)
|
||||
|
||||
for node_i in range(0, 10):
|
||||
await project.add_node(compute, "test", None, node_type="vpcs", properties={"startup_config": "test.cfg"})
|
||||
|
||||
compute.post = AsyncioMagicMock()
|
||||
await project.reset_console_all()
|
||||
assert len(compute.post.call_args_list) == 10
|
||||
|
||||
|
||||
async def test_node_name(project):
|
||||
|
||||
compute = MagicMock()
|
||||
|
||||
@@ -185,12 +185,14 @@ async def test_qemu_update(compute_api, vm, free_console_port, fake_qemu_vm):
|
||||
"hdb_disk_image": "linux载.img"
|
||||
}
|
||||
|
||||
response = await compute_api.put("/projects/{project_id}/qemu/nodes/{node_id}".format(project_id=vm["project_id"], node_id=vm["node_id"]), params)
|
||||
assert response.status == 200
|
||||
assert response.json["name"] == "test"
|
||||
assert response.json["console"] == free_console_port
|
||||
assert response.json["hdb_disk_image"] == "linux载.img"
|
||||
assert response.json["ram"] == 1024
|
||||
with patch("gns3server.compute.qemu.qemu_vm.QemuVM.updated") as mock:
|
||||
response = await compute_api.put("/projects/{project_id}/qemu/nodes/{node_id}".format(project_id=vm["project_id"], node_id=vm["node_id"]), params)
|
||||
assert response.status == 200
|
||||
assert response.json["name"] == "test"
|
||||
assert response.json["console"] == free_console_port
|
||||
assert response.json["hdb_disk_image"] == "linux载.img"
|
||||
assert response.json["ram"] == 1024
|
||||
assert mock.called
|
||||
|
||||
|
||||
async def test_qemu_nio_create_udp(compute_api, vm):
|
||||
|
||||
@@ -140,6 +140,13 @@ async def test_reload_all_nodes(controller_api, project, compute):
|
||||
assert response.status == 204
|
||||
|
||||
|
||||
async def test_reset_console_all_nodes(controller_api, project, compute):
|
||||
|
||||
compute.post = AsyncioMagicMock()
|
||||
response = await controller_api.post("/projects/{}/nodes/console/reset".format(project.id))
|
||||
assert response.status == 204
|
||||
|
||||
|
||||
async def test_start_node(controller_api, project, node, compute):
|
||||
|
||||
compute.post = AsyncioMagicMock()
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
-rrequirements.txt
|
||||
|
||||
pywin32==303
|
||||
pywin32==305
|
||||
wmi==1.5.1
|
||||
Reference in new issue
Block a user