Compare commits

...
94 Commits
Author SHA1 Message Date
grossmj 1aca7dbe04 Release v2.2.35 2022-11-08 23:40:25 +08:00
grossmj 338128ca3e Upgrade pywin32 to v305 2022-11-08 23:39:10 +08:00
grossmj c80a55b18c Install appliances and configs without importlib_resources for Windows only 2022-11-08 23:07:45 +08:00
grossmj 284a4b62fb Fix copying appliances and configs when app is frozen 2022-11-08 22:50:59 +08:00
grossmj d33fefa183 Merge branch 'master' into 2.2 2022-11-08 19:29:39 +08:00
grossmj dfb48c884b Release web-ui v2.2.35 2022-11-08 19:29:21 +08:00
grossmj 18ba60d1a3 Downgrade psutil to v5.9.2 2022-11-08 19:18:07 +08:00
grossmj 521132726e Upgrade psutil to v5.9.4 2022-11-08 18:49:31 +08:00
grossmj f80aca7633 Sync appliance files 2022-11-08 18:40:27 +08:00
grossmj 84914ecfa4 Add debug messages to fix VMnet interface list refresh. Ref https://github.com/GNS3/gns3-gui/issues/3381 2022-11-08 12:54:47 +08:00
grossmj 5696d1ccb7 Fix issues with VMnet interface on macOS >= 11.0. Ref #3381 2022-11-07 23:59:33 +08:00
grossmj 18b0863ba8 Merge remote-tracking branch 'origin/2.2' into 2.2
# Conflicts:
#	requirements.txt
2022-11-07 21:50:59 +08:00
grossmj ece47dc279 Upgrade dependencies 2022-11-07 21:48:45 +08:00
Jeremy Grossmann 6e1d49d8ca Merge pull request #2133 from GNS3/use-importlib-resources
Migrate to importlib_resources
2022-11-07 21:24:35 +08:00
grossmj 2e550d839e Fix tests 2022-11-07 20:33:02 +08:00
grossmj a4b24eaceb Use importlib_resources instead of pkg_resources and install built-in appliances in config dir. 2022-11-07 20:12:03 +08:00
grossmj f04702d607 Fix console vnc don't use configured ports in some case. Fixes #2111 2022-11-06 19:36:31 +08:00
grossmj 6f11df6189 Add missing VMware settings in gns3_server.conf 2022-11-06 19:30:24 +08:00
grossmj 9cf2e4f5a6 Make version PEP 440 compliant 2022-11-06 17:51:31 +08:00
Jeremy Grossmann 9316876f97 Merge pull request #2123 from blueneekone/patch-1
Update gns3.service.systemd
2022-11-04 23:01:57 +08:00
grossmj f3b8f43689 Fix creating asyncio task in Python 3.6 2022-10-30 22:21:28 +08:00
grossmj 2d74d1ad94 Fix tests for Python 3.11 2022-10-30 22:07:44 +08:00
grossmj ec50cc7c0d Support for Python 3.11 2022-10-30 19:04:54 +08:00
grossmj f8ee3b3d50 Upgrade pywin32 to v304 2022-10-19 18:31:17 +08:00
Jeremy Grossmann 67e42f9353 Merge pull request #2128 from GNS3/fix/3393
Update requirements.txt
2022-10-18 22:31:56 +08:00
Jeremy Grossmann 31a490211b Merge branch '2.2' into fix/3393 2022-10-18 22:31:04 +08:00
grossmj c7df8331ed Upgrade to Visual Studio 2022 in appveyor.yml 2022-10-18 21:47:10 +08:00
grossmj de1654a50f Upgrade pip and setuptools in appveyor.yml 2022-10-18 21:40:08 +08:00
grossmj a6959de1f8 Upgrade pytest. Fixes #2130 2022-10-18 21:14:53 +08:00
grossmj 8cfedce468 Use jsonschema v3.2.0 for Python 3.6 2022-10-12 22:13:34 +08:00
grossmj 77dd772314 Allow for more dependency versions at patch level 2022-10-12 22:07:37 +08:00
grossmj 9ff302592c Upgrade to aiohttp 3.8.3 2022-10-12 21:40:23 +08:00
grossmj 6b3d4feab8 Replace deprecated distro.linux_distribution() call 2022-10-11 23:28:11 +08:00
grossmj 78b2b93540 Update dev-requirements.txt 2022-10-11 23:23:15 +08:00
grossmj 0303e21059 Update requirements.txt 2022-10-11 23:01:24 +08:00
grossmj e20d1adb0e Downgrade aiohttp to v3.8.1 2022-10-10 16:30:28 +08:00
grossmj e5bee8ff52 Downgrade Jinja2 to support Python 3.6 2022-10-10 15:52:36 +08:00
grossmj 58471ea7f4 Downgrade aiofiles to support Python 3.6 2022-10-10 15:50:35 +08:00
grossmj 9fb0ba5a71 Upgrade dependencies 2022-10-10 14:29:04 +08:00
Evan Waechtler 3d738e83f5 Update gns3.service.systemd
In reference to bug #1918, the gns3.service.systemd file references ExecPath /usr/bin/gns3server which needs to be changed to /usr/local/bin/gns3server for the daemon/service to run without failure.

Please see the change I made to the service above.
2022-10-02 23:25:58 -06:00
grossmj 40c22e389e Merge branch 'master' into 2.2 2022-09-29 14:56:35 +02:00
Jeremy Grossmann 0419c081fe Merge pull request #2083 from a60814billy/fix/binding-on-wrong-interface-in-windows
fix: binding to wrong interface in windows
2022-09-28 17:36:31 +02:00
grossmj dced70a565 Merge branch 'master' into 2.2 2022-09-27 11:55:53 +02:00
grossmj 0d0a06799d Development on 2.2.35dev1 2022-08-29 11:14:44 +02:00
grossmj eeae27ae0d Merge branch '2.2' 2022-08-29 11:11:29 +02:00
grossmj 8d4df08150 Release v2.2.34 2022-08-28 23:28:12 +02:00
grossmj fd1d8d9d86 Update appliance files 2022-08-28 22:51:26 +02:00
grossmj 4ddce880ea Merge remote-tracking branch 'origin/2.2' into 2.2 2022-08-28 22:32:49 +02:00
grossmj e0209a0491 Downgrade Jinja2 to v3.0.3 2022-08-28 22:32:42 +02:00
Jeremy Grossmann e96d8ae497 Merge pull request #2089 from SpikefishSolutions/spikefishjohn-patch-3
Update compute.py
2022-08-28 22:09:44 +02:00
grossmj 129f0a631c Use original $PATH in init.sh for Docker containers. Ref #2069 2022-08-28 12:06:56 +02:00
grossmj ad1f1cdb96 Merge remote-tracking branch 'origin/2.2' into 2.2 2022-08-28 00:03:03 +02:00
grossmj ab6c6535c6 Upgrade Sentry dependency 2022-08-28 00:02:54 +02:00
Jeremy Grossmann 3444615253 Merge pull request #2101 from GNS3/upgrade-dev-dependencies
Upgrade dev dependencies
2022-08-28 00:01:53 +02:00
grossmj 028f977823 Revert "Don't install nmap"
This reverts commit b6cf3aabca.
2022-08-28 00:01:26 +02:00
grossmj b6cf3aabca Don't install nmap 2022-08-27 23:55:42 +02:00
grossmj 6546407e5d Upgrade to Python 3.7 for Windows tests 2022-08-27 23:52:59 +02:00
grossmj 46b022f726 Restore missing loop 2022-08-27 23:45:30 +02:00
grossmj 8f296e54f4 Add back loop 2022-08-27 23:41:52 +02:00
grossmj fc7d5be736 Use pytest-asyncio auto mode 2022-08-27 21:10:17 +02:00
grossmj 600c18f04b Remove pytest.ini from tests dir 2022-08-27 21:00:31 +02:00
grossmj 852de03d43 Install latest dev dependencies for Python >= 3.7 2022-08-27 20:40:35 +02:00
grossmj 470e6cb901 Add pytest-asyncio 0.19.0 2022-08-27 19:41:46 +02:00
grossmj e8273fb19e Downgrade to pytest-aiohttp v0.3.0 2022-08-27 19:39:02 +02:00
grossmj 4b3d6572d4 Downgrade to pytest v7.0.1 (last version to support 2022-08-27 19:35:36 +02:00
grossmj fad3df453d Run tests on 2.2 branch 2022-08-27 19:31:24 +02:00
grossmj d1c8f33fc5 Upgrade dev dependencies and fix issues after upgrading to pytest-aiohttp v1.0.4 2022-08-27 19:16:02 +02:00
Jeremy Grossmann 3634cc8307 Merge pull request #2094 from mm1ke/master
gns3.service.openrc: make openrc script posix compliant
2022-08-08 19:29:30 +02:00
Michael Mair-Keimberger 3b108563a0 gns3.service.openrc: make openrc script posix compliant 2022-08-08 19:23:29 +02:00
John Fleming 7277d526e3 Update compute.py
Remove check for open project. Without this check a remote can be rebooted and will be usable once the main server polls it again. Without this the main server would need to open a project that already uses the remote server or restart the main server's gns3 process.
2022-07-18 18:43:57 -04:00
BoHong Li 790bf4521d fix: use exact match to find interface in windows to avoid get wrong interface 2022-07-06 14:22:11 +08:00
grossmj 9e5ca50302 Bump version to v2.2.34dev2 2022-06-23 10:55:19 +02:00
grossmj 35ec8bed6e Back to development on v2.2.34dev2 2022-06-21 11:52:58 +02:00
grossmj 0433065b8b Revert "Development on v2.2.34dev2"
This reverts commit 7c5a5a9001.
2022-06-21 11:51:01 +02:00
grossmj 7c5a5a9001 Development on v2.2.34dev2 2022-06-21 11:38:09 +02:00
grossmj 1b32ef7854 Release v2.2.33.1 2022-06-21 10:48:02 +02:00
grossmj f5b1920f8c Add missing web-ui file 2022-06-21 10:24:19 +02:00
grossmj 4341db0ff3 Development on v2.2.34dev1 2022-06-20 21:47:42 +02:00
grossmj 162a8baf7b Release v2.2.33 2022-06-20 20:53:21 +02:00
grossmj 4280655b3a Merge branch 'master' into 2.2 2022-06-20 20:49:51 +02:00
grossmj d47e546fce Release web-ui v2.2.33 2022-06-20 20:37:51 +02:00
grossmj 2b4d623f13 Upgrade sentry-sdk and psutil 2022-06-20 20:05:34 +02:00
grossmj 3c901a84bf Sync appliance files. 2022-06-20 20:02:04 +02:00
grossmj ec3c36d6da Fix Docker tests 2022-06-19 21:18:54 +02:00
grossmj 908911e764 Remove parameter "Name" not useful to create a Docker container 2022-06-18 19:41:20 +02:00
grossmj bdd703a0dc Support to reset all console connections. Ref https://github.com/GNS3/gns3-server/issues/1619 2022-06-15 15:30:44 +02:00
Jeremy Grossmann 4acc457674 Merge pull request #2073 from GNS3/disable-builtin-templates
Config setting to disable builtin templates
2022-06-15 15:08:21 +02:00
grossmj 67bf14776f Config option to disable built-in templates 2022-06-15 14:48:52 +02:00
grossmj 2eb64200a4 Add spaces before hostname for Docker network config. Ref #2039 2022-06-12 19:32:34 +08:00
grossmj 988ca7574c Add hostname entry to sample network config for Docker nodes. Fixes #2039 2022-06-08 01:07:31 +08:00
grossmj 527d4bb3ea Run Xtigervnc with MIT-SHM extension disabled for Docker VNC console support. Fixes #2071 2022-06-08 00:05:24 +08:00
Jeremy Grossmann 1e4075ec37 Merge pull request #2066 from wowpetr/add-openrc-init
Add OpenRC init script
2022-05-26 19:02:23 +07:00
Petr Losev 9d8ddea577 Added OpenRC init script 2022-05-16 07:06:29 +03:00
grossmj bccfb64958 Development on 2.2.33dev1 2022-04-27 19:51:24 +07:00
84 changed files with 1155 additions and 387 deletions

No files matched your search

+7 -3
View File
@@ -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
+37
View File
@@ -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
View File
@@ -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"
+9
View File
@@ -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
+6 -4
View File
@@ -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"
}
}
]
}
+27 -1
View File
@@ -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": {
+1 -1
View File
@@ -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/",
+1 -1
View File
@@ -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",
+13
View File
@@ -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": {
+13
View File
@@ -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": {
+12
View File
@@ -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": {
+14
View File
@@ -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",
+15 -1
View File
@@ -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": {
+14 -14
View File
@@ -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"
}
}
+17 -3
View File
@@ -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"
}
}
]
}
+26
View File
@@ -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": {
+14
View File
@@ -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": {
+14
View File
@@ -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": {
+14
View File
@@ -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": {
+14
View File
@@ -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": {
+14
View File
@@ -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": {
+14
View File
@@ -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": {
+14
View File
@@ -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": {
+14 -104
View File
@@ -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"
}
}
]
+16 -1
View File
@@ -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"
}
}
]
}
+1 -1
View File
@@ -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",
+1 -1
View File
@@ -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": {
+1 -1
View File
@@ -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}",
+2 -2
View File
@@ -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",
+19
View File
@@ -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": {
+32 -32
View File
@@ -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"
}
}
]
}
}
+2 -2
View File
@@ -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": [
+30
View File
@@ -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": {
+29 -1
View File
@@ -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",
+67
View File
@@ -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"
}
}
]
}
+14
View File
@@ -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 -62
View File
@@ -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"
}
},
{
+1 -1
View File
@@ -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": {
+29 -16
View File
@@ -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": {
+35 -14
View File
@@ -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)
+15 -5
View File
@@ -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.
+1 -1
View File
@@ -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
+29 -7
View File
@@ -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):
"""
+4
View File
@@ -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
+12
View File
@@ -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):
"""
+17 -9
View File
@@ -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):
"""
+38 -6
View File
@@ -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":
-3
View 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:
+11
View File
@@ -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
+11
View File
@@ -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):
"""
+9 -7
View File
@@ -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"):
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -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
+6 -1
View File
@@ -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():
+10 -23
View File
@@ -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
+4 -4
View File
@@ -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)
+9 -5
View File
@@ -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)
+52
View File
@@ -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 $?
}
+2 -2
View File
@@ -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
View File
@@ -1,3 +1,4 @@
[pytest]
asyncio_mode=auto
log_level=NOTSET
ignore=env
+16 -12
View File
@@ -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
+1
View File
@@ -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",
],
)
+1 -16
View File
@@ -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
-1
View File
@@ -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
-1
View File
@@ -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
+12 -2
View File
@@ -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()
+16
View File
@@ -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()
+8 -6
View File
@@ -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 -1
View File
@@ -1,4 +1,4 @@
-rrequirements.txt
pywin32==303
pywin32==305
wmi==1.5.1