mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-11-11 09:25:52 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7adb0c5226 | ||
|
|
667833dda5 | ||
|
|
646ff00ade | ||
|
|
ffcfa4ccb1 | ||
|
|
5c63928636 | ||
|
|
0624c1b945 | ||
|
|
b658f7ff68 | ||
|
|
cd51afb01f | ||
|
|
14ffa2c2d6 | ||
|
|
09aaf43dd1 | ||
|
|
590eedeb46 | ||
|
|
d3710e8e9a | ||
|
|
0da1a6639a | ||
|
|
729eb43115 | ||
|
|
4d85e517b4 | ||
|
|
3b95859b79 | ||
|
|
47cc827c1f | ||
|
|
715b7032bc | ||
|
|
bc1729b255 | ||
|
|
3dd4184193 | ||
|
|
2b4a05eedd | ||
|
|
898a9ce208 | ||
|
|
dd87ccff4d | ||
|
|
78c7d36b1c | ||
|
|
44d4a426b5 | ||
|
|
3273f7e992 | ||
|
|
d2d19b43c2 | ||
|
|
fe2014854e | ||
|
|
ebe4fdc5b5 | ||
|
|
43d7e8a437 | ||
|
|
833b5a9ea8 | ||
|
|
05dda0117f | ||
|
|
6f0dfecc3d | ||
|
|
2414b7a968 | ||
|
|
7b20314edb | ||
|
|
193f470eaf | ||
|
|
4335fd7ce0 | ||
|
|
ef2cf277c1 | ||
|
|
66db267e27 | ||
|
|
27fbe37375 | ||
|
|
7b3fd4450e | ||
|
|
58d1e8f0c5 | ||
|
|
8ce690ce78 | ||
|
|
c676a5bf82 | ||
|
|
37f17209d3 | ||
|
|
f24134a8f5 | ||
|
|
1f2036defd | ||
|
|
f2aaf5ab38 | ||
|
|
32f48e555c | ||
|
|
942f021b58 | ||
|
|
4dc321454e | ||
|
|
3a24318694 | ||
|
|
bae6221991 | ||
|
|
c67ba6da0d | ||
|
|
4d23ca221f | ||
|
|
09eab9529a | ||
|
|
3bb23708fc | ||
|
|
672b3c052b | ||
|
|
bfe7b7a735 | ||
|
|
230866890e | ||
|
|
355cfb7571 | ||
|
|
8dddfe056e | ||
|
|
9c33827de3 | ||
|
|
a34fa53823 | ||
|
|
565a76ae27 | ||
|
|
dc9c3b1c5d | ||
|
|
a394fb71dc | ||
|
|
6cbf3baa1b | ||
|
|
10322135e3 | ||
|
|
12d1d04462 | ||
|
|
8b4c2f5e90 | ||
|
|
aaffc731ee | ||
|
|
5ce55aff02 | ||
|
|
aa1c0bb557 | ||
|
|
25bc2dce57 | ||
|
|
7e35d164dc | ||
|
|
8666ffaff3 | ||
|
|
020f6a123d | ||
|
|
c2c89b0ff3 | ||
|
|
ef3570dc95 | ||
|
|
add8c4e8a2 | ||
|
|
c05e6f4de4 | ||
|
|
e32576d5ed | ||
|
|
bd3657d8f3 |
No files matched your search
@@ -0,0 +1,40 @@
|
||||
name: Build and Push Docker Image
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
tags:
|
||||
- v2.*
|
||||
- v3.*
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: docker.io
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Build and push to GitHub Container Registry
|
||||
run: |
|
||||
docker build -t ghcr.io/$(echo "${{ github.repository }}" | tr '[:upper:]' '[:lower:]'):latest .
|
||||
docker push ghcr.io/$(echo "${{ github.repository }}" | tr '[:upper:]' '[:lower:]'):latest
|
||||
|
||||
- name: Build and push to Docker Hub
|
||||
run: |
|
||||
docker build -t gns3/${{ github.event.repository.name }}:latest .
|
||||
docker push gns3/${{ github.event.repository.name }}:latest
|
||||
@@ -18,11 +18,7 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
os: ["ubuntu-latest"]
|
||||
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
|
||||
#include:
|
||||
# only test with Python 3.10 on Windows
|
||||
# - os: windows-latest
|
||||
# python-version: "3.10"
|
||||
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
@@ -1,5 +1,39 @@
|
||||
# Change Log
|
||||
|
||||
## 2.2.57 23/03/2026
|
||||
|
||||
* feat(telnet_server): improve error handling and connection management
|
||||
* Deactivate 'use default IOU values' by default and update RAM/NVRAM values
|
||||
* Make sure the node shows as stopped when the wrap console cannot be stopped
|
||||
* tests(controller,port): short_name finishes successfully when port name is None
|
||||
* fix(controller,port): handle None port name to prevent TypeError in short_name method
|
||||
* fix: busybox static link detection on Alpine/musl
|
||||
* Take populated disks into consideration when calculating PCI device ID
|
||||
|
||||
## 2.2.56.1 28/01/2026
|
||||
|
||||
* Fix telnet keepalive options on macOS
|
||||
* Upgrade dependencies
|
||||
* Drop Python 3.8 support
|
||||
|
||||
## 2.2.56 21/01/2026
|
||||
|
||||
* Set default location of udhcpc in "/etc/network/udhcpc". Fixes #2582
|
||||
* Upgrade pywin32 to v311
|
||||
|
||||
## 2.2.55 19/11/2025
|
||||
|
||||
* Docker API version requirements and process to handle older daemons
|
||||
* Use docker_name property when creating a container
|
||||
* Set name of container in Docker
|
||||
* Support for Python 3.14
|
||||
* Enable ip cef in IOU L2 and IOU L3 base configs
|
||||
* Only build and push Docker image when releasing a new version
|
||||
* Fix pushing Docker image to Docker hub
|
||||
* Update security issues in README.md. Fixes #2535
|
||||
* Add missing 'nat' template type in schema. Fixes #2529
|
||||
* Resolve deprecation warnings of regex library
|
||||
|
||||
## 2.2.54 21/04/2025
|
||||
|
||||
* Bundle web-ui v2.2.54
|
||||
|
||||
+1
-1
@@ -26,7 +26,7 @@ RUN apt-get update && apt-get install -y \
|
||||
RUN locale-gen en_US.UTF-8
|
||||
|
||||
# Install uninstall to install dependencies
|
||||
RUN apt-get install -y vpcs ubridge
|
||||
RUN apt-get install -y vpcs ubridge dynamips
|
||||
|
||||
ADD . /server
|
||||
WORKDIR /server
|
||||
|
||||
@@ -259,5 +259,4 @@ py.test --cov-report term-missing --cov=gns3server
|
||||
Security issues
|
||||
---------------
|
||||
|
||||
Please contact us using contact form available here:
|
||||
<http://docs.gns3.com/1ON9JBXSeR7Nt2-Qum2o3ZX0GU86BZwlmNSUgvmqNWGY/index.html>
|
||||
Please use GitHub's report a vulnerability feature. More information can be found in https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability
|
||||
@@ -1,6 +1,6 @@
|
||||
-rrequirements.txt
|
||||
|
||||
pytest==8.3.3
|
||||
flake8==7.1.0
|
||||
pytest-timeout==2.3.1
|
||||
pytest-aiohttp==1.0.5
|
||||
pytest==8.4.2 # version 8.4.2 is the last one supporting Python 3.9
|
||||
flake8==7.3.0
|
||||
pytest-timeout==2.4.0
|
||||
pytest-aiohttp==1.1.0
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"appliance_id": "a2209414-88a6-403b-a2e1-477a057ec954",
|
||||
"name": "AlpiNet",
|
||||
"category": "guest",
|
||||
"description": "AlpiNet is a lightweight Alpine-based networking toolbox for GNS3.\n\nCOMPREHENSIVE TOOLKIT:\n• Network: ip, ifconfig, ping, traceroute, mtr, arping, nmap, tcpdump\n• Performance: iperf, iperf3\n• HTTP/Web: curl, wget\n• TCP/UDP: netcat, socat, telnet\n• Advanced: ethtool, bridge-utils, vlan\n• Firewall: iptables, ip6tables, nftables\n• File Transfer: FTP (lftp), TFTP, SSH (scp/sftp), rsync\n• DNS: host, nslookup, dig\n• System: nano, tmux, screen, htop, bash\n• Text Tools: grep, sed, awk, jq, less\n• Compression: tar, gzip\n• Utilities: tree, file, openssl\n\nType 'alpinet-tools' in the container for the complete tool list.\n\nOptimized for network testing, troubleshooting, and education.",
|
||||
"vendor_name": "AlpiNet Project",
|
||||
"vendor_url": "https://www.alpinelinux.org/",
|
||||
"product_name": "AlpiNet",
|
||||
"registry_version": 4,
|
||||
"status": "stable",
|
||||
"maintainer": "nazDridoy",
|
||||
"maintainer_email": "nazdridoy399@gmail.com",
|
||||
"usage": "The /root directory is persistent across restarts. Type 'alpinet-tools' to see all available utilities.",
|
||||
"symbol": "AlpiNet.svg",
|
||||
"docker": {
|
||||
"adapters": 1,
|
||||
"image": "gns3/alpinet:latest",
|
||||
"console_type": "telnet",
|
||||
"environment": "TERM=xterm"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"appliance_id": "4aa78f74-c769-43e0-9ef1-5dd2cf1909c6",
|
||||
"name": "Asterfusion AsterNOS-VPP",
|
||||
"category": "router",
|
||||
"description": "AsterNOS-VPP leverages SONiC’s robust routing features and management capability with VPP’s high-performance data forwarding. It supports L3 routing, NAT, PPPoE, and VPN services. Minimum requirements: 4 vCPUs and 8GB RAM.",
|
||||
"vendor_name": "Asterfusion",
|
||||
"vendor_url": "https://cloudswit.ch/product/sonic-enterprise-distribution/#vAsterNOS",
|
||||
"documentation_url": "https://docs.asternos.com/routing",
|
||||
"product_name": "AsterNOS-VPP",
|
||||
"registry_version": 6,
|
||||
"status": "stable",
|
||||
"maintainer": "Asterfusion Product Team",
|
||||
"maintainer_email": "bd@cloudswit.ch",
|
||||
"availability": "with-registration",
|
||||
"images": [
|
||||
{
|
||||
"filename": "AsterNOS-VPP_V6.1-R0101P02_x86.img",
|
||||
"version": "6.1",
|
||||
"md5sum": "55834c3e8849ab226144d79ef76acf81",
|
||||
"filesize": 1318201015,
|
||||
"download_url": "https://asternos.dev/api/file/b2c9fd83-a9d3-46f3-9676-6b49dd481d6c",
|
||||
"compression": "gzip"
|
||||
}
|
||||
],
|
||||
"qemu": {
|
||||
"adapter_type": "virtio-net-pci",
|
||||
"adapters": 4,
|
||||
"ram": 8192,
|
||||
"cpus": 4,
|
||||
"arch": "x86_64",
|
||||
"console_type": "telnet",
|
||||
"kvm": "require"
|
||||
},
|
||||
"versions": [
|
||||
{
|
||||
"name": "6.1",
|
||||
"images": {
|
||||
"hda_disk_image": "AsterNOS-VPP_V6.1-R0101P02_x86.img"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -2,7 +2,7 @@
|
||||
"appliance_id": "9e934470-d898-4289-a5ed-50af094e629e",
|
||||
"name": "Asterfusion vAsterNOS campus",
|
||||
"category": "multilayer_switch",
|
||||
"description": "AsterNOS is the core technology of Asterfusion’s one-stop SONiC turnkey solution designed for cloud, enterprise, and AI-driven scenarios. AsterNOS v5.2 Campus is specifically designed for traditional campus networks, offering comprehensive L2/L3 capabilities suitable for various campus scenarios such as schools, office buildings, and hospitals. This version supports a fully cloud-integrated Layer 3 network architecture, providing rich routing and switching functionalities to ensure high-performance operation and ease of maintenance. It can also be deployed in the GNS3 simulation environment to experience a complete All-Layer 3 Cloud-Campus network. AsterNOS v6.0 Campus builds upon the L2/L3 features of v5.2 (including ACL, MSTP, QinQ, IGMP Snooping, OSPF/BGP, etc.) and further enhances support for advanced technologies such as MPLS L2VPN/L3VPN and PTP. This version is ideal for enterprises and campus networks requiring high-performance multi-service transport, supporting cross-domain connectivity and providing nanosecond-level time synchronization. It is well-suited for applications with stringent time accuracy requirements, such as financial trading, industrial automation, and smart manufacturing. NOTICE: This appliance file is a virtualized version of AsterNOS and is intended to be used only to experience the basic functionality and industry standard CLI (Klish), not for official software testing. For more information about AsterNOS commercial version, please feel free to contact us via Email: bd@cloudswit.ch",
|
||||
"description": "AsterNOS is the core technology of Asterfusion’s one-stop SONiC turnkey solution designed for cloud, enterprise, and AI-driven scenarios. AsterNOS v5.2 Campus is specifically designed for traditional campus networks, offering comprehensive L2/L3 capabilities suitable for various campus scenarios such as schools, office buildings, and hospitals. This version supports a fully cloud-integrated Layer 3 network architecture, providing rich routing and switching functionalities to ensure high-performance operation and ease of maintenance. It can also be deployed in the GNS3 simulation environment to experience a complete All-Layer 3 Cloud-Campus network. This version is ideal for enterprises and campus networks requiring high-performance multi-service transport, supporting cross-domain connectivity and providing nanosecond-level time synchronization. It is well-suited for applications with stringent time accuracy requirements, such as financial trading, industrial automation, and smart manufacturing. NOTICE: This appliance file is a virtualized version of AsterNOS and is intended to be used only to experience the basic functionality and industry standard CLI (Klish), not for official software testing. For more information about AsterNOS commercial version, please feel free to contact us via Email: bd@cloudswit.ch",
|
||||
"vendor_name": "Asterfusion",
|
||||
"vendor_url": "https://cloudswit.ch/",
|
||||
"vendor_logo_url": "https://raw.githubusercontent.com/GNS3/gns3-registry/master/vendor-logos/asterfusion.png",
|
||||
@@ -29,13 +29,6 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "vAsterNOS-V6.1R002.img",
|
||||
"version": "6.1-2",
|
||||
"md5sum": "003e6329489a617fbab5783504559d26",
|
||||
"filesize": 2106851328,
|
||||
"download_url": "https://drive.cloudswitch.io/external/c224501f36e6003767b30112bd44d92476f81f442cf47f8027a6f4f7e4227995"
|
||||
},
|
||||
{
|
||||
"filename": "vAsterNOS-V5.2R012P01.img",
|
||||
"version": "5.2-12-1",
|
||||
@@ -46,12 +39,6 @@
|
||||
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "6.1-2",
|
||||
"images": {
|
||||
"hda_disk_image": "vAsterNOS-V6.1R002.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.2-12-1",
|
||||
"images": {
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"vendor_name": "Asterfusion",
|
||||
"vendor_url": "https://cloudswit.ch/",
|
||||
"vendor_logo_url": "https://raw.githubusercontent.com/GNS3/gns3-registry/master/vendor-logos/asterfusion.png",
|
||||
"documentation_url": "https://help.cloudswit.ch/portal/en/kb/articles/vasternos",
|
||||
"documentation_url": "https://asternos.com/community/space/vasternos/post/vasternos-for-data-center-network",
|
||||
"product_name": "vAsterNOS",
|
||||
"product_url": "https://cloudswit.ch/product/sonic-enterprise-distribution",
|
||||
"registry_version": 4,
|
||||
@@ -30,18 +30,18 @@
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "vAsterNOS-V3.1.img",
|
||||
"filename": "AsterNOS_V3.1_R0408P01-VS.img.gz",
|
||||
"version": "V3.1",
|
||||
"md5sum": "c323c9c3f60e1a93eca2acdc5034b85c",
|
||||
"filesize": 2724659200,
|
||||
"download_url": "https://drive.cloudswitch.io/external/8ae2e3932ad8bb2ec30dd25be415d288ff3e4a949c557c6bd48ac6e6265bcfc1"
|
||||
"md5sum": "5c182306af67be2c79a5642551412e48",
|
||||
"filesize": 1425945924,
|
||||
"download_url": "http://pub.asternos.com/AsterNOS_V3.1_R0408P01-VS.img.gz"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "V3.1",
|
||||
"images": {
|
||||
"hda_disk_image": "vAsterNOS-V3.1.img"
|
||||
"hda_disk_image": "AsterNOS_V3.1_R0408P01-VS.img.gz"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -50,6 +50,12 @@
|
||||
"version": "124-25G",
|
||||
"md5sum": "9c7cc9b3f3b3571411a7f62faaa2c036",
|
||||
"filesize": 71528984
|
||||
},
|
||||
{
|
||||
"filename": "c7200-itpk9-mz.124-15.SW.image",
|
||||
"version": "124-15.SW",
|
||||
"md5sum": "3334a0facdbd26164e83d3c201fff5b5",
|
||||
"filesize": 46423952
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
@@ -87,6 +93,13 @@
|
||||
"images": {
|
||||
"image": "c7200-a3jk9s-mz.124-25g.image"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "124-15.SW",
|
||||
"idlepc": "0x60b2bc68",
|
||||
"images": {
|
||||
"image": "c7200-itpk9-mz.124-15.SW.image"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -15,11 +15,17 @@
|
||||
"iou": {
|
||||
"ethernet_adapters": 4,
|
||||
"serial_adapters": 0,
|
||||
"nvram": 512,
|
||||
"ram": 512,
|
||||
"nvram": 256,
|
||||
"ram": 1024,
|
||||
"startup_config": "iou_l2_base_startup-config.txt"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "x86_64_crb_linux_l2-adventerprisek9-ms.17.16.1a.iol",
|
||||
"version": "17.16.1a",
|
||||
"md5sum": "d55879318e51c5401fb9314d45c67728",
|
||||
"filesize": 244265240
|
||||
},
|
||||
{
|
||||
"filename": "x86_64_crb_linux_l2-adventerprisek9-ms.iol",
|
||||
"version": "17.15.1",
|
||||
@@ -33,25 +39,25 @@
|
||||
"filesize": 240355720
|
||||
},
|
||||
{
|
||||
"filename": "i86bi-linux-l2-ipbasek9-15.1g.bin",
|
||||
"version": "15.1g",
|
||||
"md5sum": "0b8b9e14ca99b68c654e44c4296857ba",
|
||||
"filesize": 62137336
|
||||
"filename": "i86bi_linux_l2-adventerprisek9-ms.SSA.high_iron_20190423.bin",
|
||||
"version": "15.2(20190423)",
|
||||
"md5sum": "ffe884f8e762b762d7886c51d8ee015c",
|
||||
"filesize": 126249700
|
||||
},
|
||||
{
|
||||
"filename": "i86bi-linux-l2-adventerprisek9-15.1a.bin",
|
||||
"version": "15.1a",
|
||||
"md5sum": "9549a20a7391fb849da32caa77a0d254",
|
||||
"filesize": 72726092
|
||||
},
|
||||
{
|
||||
"filename": "i86bi-linux-l2-adventerprisek9-15.2d.bin",
|
||||
"version": "15.2d",
|
||||
"md5sum": "f16db44433beb3e8c828db5ddad1de8a",
|
||||
"filesize": 105036380
|
||||
"filename": "i86bi_LinuxL2-AdvEnterpriseK9-M_152_May_2018.bin",
|
||||
"version": "15.2(20180510)",
|
||||
"md5sum": "d704b68c5f4c4f92e56b754b49b92012",
|
||||
"filesize": 126226692
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "17.16.1a",
|
||||
"images": {
|
||||
"image": "x86_64_crb_linux_l2-adventerprisek9-ms.17.16.1a.iol"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "17.15.1",
|
||||
"images": {
|
||||
@@ -65,21 +71,15 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "15.1g",
|
||||
"name": "15.2(20190423)",
|
||||
"images": {
|
||||
"image": "i86bi-linux-l2-ipbasek9-15.1g.bin"
|
||||
"image": "i86bi_linux_l2-adventerprisek9-ms.SSA.high_iron_20190423.bin"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "15.1a",
|
||||
"name": "15.2(20180510)",
|
||||
"images": {
|
||||
"image": "i86bi-linux-l2-adventerprisek9-15.1a.bin"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "15.2d",
|
||||
"images": {
|
||||
"image": "i86bi-linux-l2-adventerprisek9-15.2d.bin"
|
||||
"image": "i86bi_LinuxL2-AdvEnterpriseK9-M_152_May_2018.bin"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -15,11 +15,17 @@
|
||||
"iou": {
|
||||
"ethernet_adapters": 2,
|
||||
"serial_adapters": 2,
|
||||
"nvram": 512,
|
||||
"ram": 512,
|
||||
"nvram": 256,
|
||||
"ram": 1024,
|
||||
"startup_config": "iou_l3_base_startup-config.txt"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "x86_64_crb_linux-adventerprisek9-ms.17.16.1a.iol",
|
||||
"version": "17.16.1a",
|
||||
"md5sum": "39bdf959c3b99a3c81d66451f1cf0404",
|
||||
"filesize": 293062920
|
||||
},
|
||||
{
|
||||
"filename": "x86_64_crb_linux-adventerprisek9-ms.iol",
|
||||
"version": "17.15.1",
|
||||
@@ -37,21 +43,15 @@
|
||||
"version": "15.7(3)M2",
|
||||
"md5sum": "d6874260c3daeeb96d10fc844ae0b93b",
|
||||
"filesize": 184759244
|
||||
},
|
||||
{
|
||||
"filename": "i86bi-linux-l3-adventerprisek9-ms.155-2.T.bin",
|
||||
"version": "155-2T",
|
||||
"md5sum": "45e99761a95cbd3ee3924ecf0f3d89e5",
|
||||
"filesize": 172982492
|
||||
},
|
||||
{
|
||||
"filename": "i86bi-linux-l3-adventerprisek9-15.4.1T.bin",
|
||||
"version": "15.4.1T",
|
||||
"md5sum": "2eabae17778316c49cbc80e8e81262f9",
|
||||
"filesize": 152677848
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "17.16.1a",
|
||||
"images": {
|
||||
"image": "x86_64_crb_linux-adventerprisek9-ms.17.16.1a.iol"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "17.15.1",
|
||||
"images": {
|
||||
@@ -69,18 +69,6 @@
|
||||
"images": {
|
||||
"image": "i86bi_LinuxL3-AdvEnterpriseK9-M2_157_3_May_2018.bin"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "155-2T",
|
||||
"images": {
|
||||
"image": "i86bi-linux-l3-adventerprisek9-ms.155-2.T.bin"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "15.4.1T",
|
||||
"images": {
|
||||
"image": "i86bi-linux-l3-adventerprisek9-15.4.1T.bin"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -28,6 +28,13 @@
|
||||
"options": "-nographic"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FEGNS3.9.3.0.0.qcow2",
|
||||
"version": "v9.3.0.0",
|
||||
"md5sum": "2abfa8d64219aa75522238f87b782726",
|
||||
"filesize": 490209280,
|
||||
"direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_VOSS/FEGNS3.9.3.0.0.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "VOSSGNS3.8.10.1.0.qcow2",
|
||||
"version": "v8.10.1.0",
|
||||
@@ -93,6 +100,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "v9.3.0.0",
|
||||
"images":
|
||||
{
|
||||
"hda_disk_image": "FEGNS3.9.3.0.0.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "v8.10.1.0",
|
||||
"images":
|
||||
|
||||
@@ -25,19 +25,19 @@
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "rtr.qcow2",
|
||||
"version": "20.7.1",
|
||||
"md5sum": "4707415d15d20ced92423d90e52eedcd",
|
||||
"filesize": 254767616,
|
||||
"download_url": "http://freerouter.nop.hu/",
|
||||
"direct_download_url": "http://dl.nop.hu/rtr.qcow2"
|
||||
"filename": "rtr-x86_64.qcow2",
|
||||
"version": "25.8.29",
|
||||
"md5sum": "13d72fdfd772258808a9d4b75fa67083",
|
||||
"filesize": 73269248,
|
||||
"download_url": "http://www.freertr.org/",
|
||||
"direct_download_url": "http://dl.nop.hu/rtr-x86_64.qcow2"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "20.7.1",
|
||||
"name": "25.8.29",
|
||||
"images": {
|
||||
"hda_disk_image": "rtr.qcow2"
|
||||
"hda_disk_image": "rtr-x86_64.qcow2"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
{
|
||||
"appliance_id": "4ac0d5bc-714d-4a5a-8af5-8fb452046acd",
|
||||
"name": "Home Assistant",
|
||||
"category": "guest",
|
||||
"description": "Open source home automation that puts local control and privacy first. Powered by a worldwide community of tinkerers and DIY enthusiasts.",
|
||||
"vendor_name": "Open Home Foundation",
|
||||
"vendor_url": "https://www.openhomefoundation.org/",
|
||||
"vendor_logo_url": "https://www.openhomefoundation.org/assets/images/logo/open-home-foundation.svg",
|
||||
"documentation_url": "https://www.home-assistant.io/installation/alternative",
|
||||
"product_name": "haos",
|
||||
"product_url": "https://www.home-assistant.io/",
|
||||
"registry_version": 8,
|
||||
"status": "stable",
|
||||
"availability": "free",
|
||||
"maintainer": "Neyder Achahuanco Apaza",
|
||||
"maintainer_email": "gns3@neyder.net",
|
||||
"usage": "You will be able to reach Home Assistant on homeassistant.local:8123, you might need to access Home Assistant at homeassistant:8123 or http://X.X.X.X:8123 (replace X.X.X.X with your virtual machine\u2019s IP address).\nYou can access trough console with root user without password.",
|
||||
"symbol": "home-assistant-logomark-color-on-light.svg",
|
||||
"default_username": "cisco",
|
||||
"default_password": "admin",
|
||||
"settings": [
|
||||
{
|
||||
"name": "Default template settings",
|
||||
"default": true,
|
||||
"template_type": "qemu",
|
||||
"template_properties":
|
||||
{
|
||||
"adapter_type": "virtio-net-pci",
|
||||
"platform": "x86_64",
|
||||
"adapters": 1,
|
||||
"ram": 2048,
|
||||
"cpus": 2,
|
||||
"hda_disk_interface": "virtio",
|
||||
"console_type": "telnet",
|
||||
"boot_priority": "cd",
|
||||
"on_close": "shutdown_signal",
|
||||
"uefi": true
|
||||
}
|
||||
}
|
||||
],
|
||||
"images": [
|
||||
{
|
||||
"filename": "haos_ova-17.1.qcow2",
|
||||
"version": "17.1",
|
||||
"md5sum": "e1b950430045859a3ac035cb420df158",
|
||||
"filesize": 1024393216,
|
||||
"download_url": "https://www.home-assistant.io/installation/alternative",
|
||||
"direct_download_url": "https://github.com/home-assistant/operating-system/releases/download/17.1/haos_ova-17.1.qcow2.xz",
|
||||
"compression": "xz"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"images": {
|
||||
"hda_disk_image": "haos_ova-17.1.qcow2"
|
||||
},
|
||||
"name": "17.1"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -2,13 +2,13 @@
|
||||
"appliance_id": "4d351078-c6f5-444c-ab30-0ef20e3d8c53",
|
||||
"name": "Infix",
|
||||
"category": "router",
|
||||
"description": "Infix is a Network Operating System based on Linux. It can be set up both as a switch, with offloading using switchdev, and a router with firewalling.",
|
||||
"description": "Infix OS is a free Linux-based operating system with made-easy management using NETCONF, RESTCONF, or the built-in command line interface (CLI). It is suitable for both end-devices with a single Ethernet port and switches/routers with multiple ports. Immutable by design, extensions are possible using Docker containers.",
|
||||
"vendor_name": "KernelKit",
|
||||
"vendor_url": "https://github.com/kernelkit",
|
||||
"vendor_logo_url": "https://kernelkit.org/assets/img/jack.png",
|
||||
"product_name": "Infix",
|
||||
"registry_version": 4,
|
||||
"documentation_url": "https://github.com/kernelkit/infix/tree/main/doc",
|
||||
"documentation_url": "https://kernelkit.org/infix/latest/",
|
||||
"status": "stable",
|
||||
"availability": "free",
|
||||
"maintainer": "KernelKit",
|
||||
@@ -37,16 +37,16 @@
|
||||
"download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/",
|
||||
"direct_download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/OVMF-edk2-stable202305.fd.zip/download",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
"filename": "infix-x86_64-disk-24.11.1.img",
|
||||
"filesize": 536870912,
|
||||
"md5sum": "673a123fe122d1c2f5724baf9965a19d",
|
||||
"version": "24.11.1",
|
||||
"download_url": "https://github.com/kernelkit/infix/releases/download/v24.11.1/infix-x86_64-24.11.1.tar.gz",
|
||||
"compression": "gzip"
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
"filename": "infix-x86_64-disk-25.01.0.img",
|
||||
"filesize": 536870912,
|
||||
"md5sum": "a814d93b385116b4a35712c445b5f830",
|
||||
@@ -69,17 +69,129 @@
|
||||
"version": "25.03.0",
|
||||
"download_url": "https://github.com/kernelkit/infix/releases/download/v25.03.0/infix-x86_64-25.03.0.tar.gz",
|
||||
"compression": "gzip"
|
||||
},
|
||||
{
|
||||
"filename": "infix-x86_64-disk-25.04.0.qcow2",
|
||||
"filesize": 259723776,
|
||||
"md5sum": "84bd999513325d0007d0e6587abc6140",
|
||||
"version": "25.04.0",
|
||||
"direct_download_url": "https://github.com/kernelkit/infix/releases/download/v25.04.0/infix-x86_64-disk-25.04.0.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "infix-x86_64-disk-25.05.0.qcow2",
|
||||
"filesize": 259958784,
|
||||
"md5sum": "a6b1b3a6bccc60bb5214f2b864602fde",
|
||||
"version": "25.05.0",
|
||||
"direct_download_url": "https://github.com/kernelkit/infix/releases/download/v25.05.0/infix-x86_64-disk-25.05.0.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "infix-x86_64-disk-25.08.0.qcow2",
|
||||
"filesize": 284453888,
|
||||
"md5sum": "5fbf146d2ac73d1bd8fa1c509d6169b1",
|
||||
"version": "25.08.0",
|
||||
"direct_download_url": "https://github.com/kernelkit/infix/releases/download/v25.08.0/infix-x86_64-disk-25.08.0.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "infix-x86_64-disk-25.09.0.qcow2",
|
||||
"filesize": 285120000,
|
||||
"md5sum": "9761968406780a5b28311b8527f8629f",
|
||||
"version": "25.09.0",
|
||||
"direct_download_url": "https://github.com/kernelkit/infix/releases/download/v25.09.0/infix-x86_64-disk-25.09.0.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "infix-x86_64-disk-25.10.0.qcow2",
|
||||
"filesize": 288818688,
|
||||
"md5sum": "781d0fce9fbf789f6ea6ff10dc104afb",
|
||||
"version": "25.10.0",
|
||||
"direct_download_url": "https://github.com/kernelkit/infix/releases/download/v25.10.0/infix-x86_64-disk-25.10.0.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "infix-x86_64-disk-25.11.0.qcow2",
|
||||
"filesize": 288930816,
|
||||
"md5sum": "e2eb1a4fff9d56815f37c2e82a6279fb",
|
||||
"version": "25.11.0",
|
||||
"direct_download_url": "https://github.com/kernelkit/infix/releases/download/v25.11.0/infix-x86_64-disk-25.11.0.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "infix-x86_64-v26.01.0.qcow2",
|
||||
"filesize": 307363840,
|
||||
"md5sum": "bd3b9c56f98ba264c36e4d6f69931546",
|
||||
"version": "26.01.0",
|
||||
"direct_download_url": "https://github.com/kernelkit/infix/releases/download/v26.01.0/infix-x86_64-v26.01.0.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "infix-x86_64-v26.02.1.qcow2",
|
||||
"filesize": 316407808,
|
||||
"md5sum": "0c4da508cfcb702c066f47227644b65f",
|
||||
"version": "26.02.1",
|
||||
"direct_download_url": "https://github.com/kernelkit/infix/releases/download/v26.02.1/infix-x86_64-v26.02.1.qcow2"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
{
|
||||
"name": "26.02.1",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "infix-x86_64-v26.02.1.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "26.01.0",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "infix-x86_64-v26.01.0.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "25.11.0",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "infix-x86_64-disk-25.11.0.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "25.10.0",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "infix-x86_64-disk-25.10.0.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "25.09.0",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "infix-x86_64-disk-25.09.0.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "25.08.0",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "infix-x86_64-disk-25.08.0.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "25.05.0",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "infix-x86_64-disk-25.05.0.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "25.04.0",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "infix-x86_64-disk-25.04.0.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "25.03.0",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "infix-x86_64-disk-25.03.0.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
{
|
||||
"name": "25.02.0",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
@@ -101,4 +213,4 @@
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -14,11 +14,11 @@
|
||||
"maintainer_email": "github@sugarpapa.mozmail.com",
|
||||
"usage": "GNS3 SHOULD be a baremetal installation. Using the GNS3 VM MIGHT result in unwanted issues. Default user is root. No password is needed.",
|
||||
"symbol": "juniper-vmx.svg",
|
||||
"first_port_name": "ge-0/0/0",
|
||||
"first_port_name": "fxp0",
|
||||
"port_name_format": "ge-0/0/{port0}",
|
||||
"qemu": {
|
||||
"adapter_type": "virtio-net-pci",
|
||||
"adapters": 17,
|
||||
"adapters": 10,
|
||||
"ram": 5120,
|
||||
"cpus": 4,
|
||||
"hda_disk_interface": "virtio",
|
||||
@@ -72,4 +72,4 @@
|
||||
"name": "23.2R1.15"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -11,237 +11,34 @@
|
||||
"status": "stable",
|
||||
"maintainer": "GNS3 Team",
|
||||
"maintainer_email": "developers@gns3.net",
|
||||
"usage": "Default password is toor\nEnable persistence by selecting boot option 'Live USB Persistence'",
|
||||
"usage": "Default username is kali and the default password is kali",
|
||||
"port_name_format": "eth{0}",
|
||||
"qemu": {
|
||||
"adapter_type": "e1000",
|
||||
"adapters": 8,
|
||||
"ram": 1024,
|
||||
"ram": 2048,
|
||||
"cpus": 2,
|
||||
"hda_disk_interface": "ide",
|
||||
"arch": "x86_64",
|
||||
"console_type": "vnc",
|
||||
"boot_priority": "d",
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "kali-linux-2021.1-live-amd64.iso",
|
||||
"version": "2021.1",
|
||||
"md5sum": "3a3716fef866e5c29a1c1ccfc94264b5",
|
||||
"filesize": 3591385088,
|
||||
"download_url": "http://cdimage.kali.org/kali-2021.1/",
|
||||
"direct_download_url": "http://cdimage.kali.org/kali-2021.1/kali-linux-2021.1-live-amd64.iso"
|
||||
},
|
||||
{
|
||||
"filename": "kali-linux-2019.3-amd64.iso",
|
||||
"version": "2019.3",
|
||||
"md5sum": "9c6fb00558f78ed06992d89f745ef975",
|
||||
"filesize": 3037736960,
|
||||
"download_url": "http://old.kali.org/kali-images/kali-2019.3",
|
||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2019.3/kali-linux-2019.3-amd64.iso"
|
||||
},
|
||||
{
|
||||
"filename": "kali-linux-2019.2-amd64.iso",
|
||||
"version": "2019.2",
|
||||
"md5sum": "0f89b6225d7ea9c18682f7cc541c1179",
|
||||
"filesize": 3353227264,
|
||||
"download_url": "http://old.kali.org/kali-images/kali-2019.2",
|
||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2019.2/kali-linux-2019.2-amd64.iso"
|
||||
},
|
||||
{
|
||||
"filename": "kali-linux-mate-2019.2-amd64.iso",
|
||||
"version": "2019.2 (MATE)",
|
||||
"md5sum": "fec8dd7009f932c51a74323df965a709",
|
||||
"filesize": 3313217536,
|
||||
"download_url": "http://old.kali.org/kali-images/kali-2019.2",
|
||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2019.2/kali-linux-mate-2019.2-amd64.iso"
|
||||
},
|
||||
{
|
||||
"filename": "kali-linux-2019.1a-amd64.iso",
|
||||
"version": "2019.1a",
|
||||
"md5sum": "58c6111ed0be1919ea87267e7e65ab0f",
|
||||
"filesize": 3483873280,
|
||||
"download_url": "http://old.kali.org/kali-images/kali-2019.1a",
|
||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2019.1a/kali-linux-2019.1a-amd64.iso"
|
||||
},
|
||||
{
|
||||
"filename": "kali-linux-2018.4-amd64.iso",
|
||||
"version": "2018.4",
|
||||
"md5sum": "1b2d598bb8d2003e6207c119c0ba42fe",
|
||||
"filesize": 3139436544,
|
||||
"download_url": "http://old.kali.org/kali-images/kali-2018.4",
|
||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2018.4/kali-linux-2018.4-amd64.iso"
|
||||
},
|
||||
{
|
||||
"filename": "kali-linux-2018.3a-amd64.iso",
|
||||
"version": "2018.3a",
|
||||
"md5sum": "2da675d016bd690c05e180e33aa98b94",
|
||||
"filesize": 3192651776,
|
||||
"download_url": "http://old.kali.org/kali-images/kali-2018.3a",
|
||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2018.3a/kali-linux-2018.3a-amd64.iso"
|
||||
},
|
||||
{
|
||||
"filename": "kali-linux-2018.1-amd64.iso",
|
||||
"version": "2018.1",
|
||||
"md5sum": "a3feb90df5b71b3c7f4a02bdddf221d7",
|
||||
"filesize": 3028500480,
|
||||
"download_url": "http://old.kali.org/kali-images/kali-2018.1",
|
||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2018.1/kali-linux-2018.1-amd64.iso"
|
||||
},
|
||||
{
|
||||
"filename": "kali-linux-2017.3-amd64.iso",
|
||||
"version": "2017.3",
|
||||
"md5sum": "b465580c897e94675ac1daf031fa66b9",
|
||||
"filesize": 2886402048,
|
||||
"download_url": "http://old.kali.org/kali-images/kali-2017.3/",
|
||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2017.3/kali-linux-2017.3-amd64.iso"
|
||||
},
|
||||
{
|
||||
"filename": "kali-linux-2017.2-amd64.iso",
|
||||
"version": "2017.2",
|
||||
"md5sum": "541654f8f818450dc0db866a0a0f6eec",
|
||||
"filesize": 3020619776,
|
||||
"download_url": "http://old.kali.org/kali-images/kali-2017.2/",
|
||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2017.2/kali-linux-2017.2-amd64.iso"
|
||||
},
|
||||
{
|
||||
"filename": "kali-linux-2017.1-amd64.iso",
|
||||
"version": "2017.1",
|
||||
"md5sum": "c8e742283929d7a12dbe7c58e398ff08",
|
||||
"filesize": 2794307584,
|
||||
"download_url": "http://old.kali.org/kali-images/kali-2017.1/",
|
||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2017.1/kali-linux-2017.1-amd64.iso"
|
||||
},
|
||||
{
|
||||
"filename": "kali-linux-2016.2-amd64.iso",
|
||||
"version": "2016.2",
|
||||
"md5sum": "3d163746bc5148e61ad689d94bc263f9",
|
||||
"filesize": 3076767744,
|
||||
"download_url": "http://old.kali.org/kali-images/kali-2016.2/",
|
||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2016.2/kali-linux-2016.2-amd64.iso"
|
||||
},
|
||||
{
|
||||
"filename": "kali-linux-2016.1-amd64.iso",
|
||||
"version": "2016.1",
|
||||
"md5sum": "2e1230dc14036935b3279dfe3e49ad39",
|
||||
"filesize": 2945482752,
|
||||
"download_url": "http://old.kali.org/kali-images/kali-2016.1/",
|
||||
"direct_download_url": "http://old.kali.org/kali-images/kali-2016.1/kali-linux-2016.1-amd64.iso"
|
||||
},
|
||||
{
|
||||
"filename": "kali-linux-2.0-amd64.iso",
|
||||
"version": "2.0",
|
||||
"md5sum": "ef192433017c5d99a156eaef51fd389d",
|
||||
"filesize": 3320512512,
|
||||
"download_url": "https://www.offensive-security.com/kali-linux-vmware-arm-image-download/",
|
||||
"direct_download_url": "http://images.kali.org/Kali-Linux-2.0.0-vm-amd64.7z"
|
||||
},
|
||||
{
|
||||
"filename": "kali-linux-persistence-1gb.qcow2",
|
||||
"version": "1.0",
|
||||
"md5sum": "14e9c92f3ba5a0bd1128c1ea26a129ea",
|
||||
"filesize": 34734080,
|
||||
"download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/",
|
||||
"direct_download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/kali-linux-persistence-1gb.qcow2/download"
|
||||
{
|
||||
"filename": "kali-linux-2025.4-qemu-amd64.qcow2",
|
||||
"version": "2025.4",
|
||||
"md5sum": "a4be43351b5deb5b2823cb38a73b2095",
|
||||
"filesize": 15719268352,
|
||||
"download_url": "https://cdimage.kali.org/kali-2025.4/",
|
||||
"direct_download_url": "https://cdimage.kali.org/kali-2025.4/kali-linux-2025.4-qemu-amd64.7z",
|
||||
"compression": "7z"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "2021.1",
|
||||
"name": "2025.4",
|
||||
"images": {
|
||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
||||
"cdrom_image": "kali-linux-2021.1-live-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2019.3",
|
||||
"images": {
|
||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
||||
"cdrom_image": "kali-linux-2019.3-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2019.2",
|
||||
"images": {
|
||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
||||
"cdrom_image": "kali-linux-2019.2-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2019.2 (MATE)",
|
||||
"images": {
|
||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
||||
"cdrom_image": "kali-linux-mate-2019.2-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2019.1a",
|
||||
"images": {
|
||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
||||
"cdrom_image": "kali-linux-2019.1a-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2018.4",
|
||||
"images": {
|
||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
||||
"cdrom_image": "kali-linux-2018.4-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2018.3a",
|
||||
"images": {
|
||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
||||
"cdrom_image": "kali-linux-2018.3a-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2018.1",
|
||||
"images": {
|
||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
||||
"cdrom_image": "kali-linux-2018.1-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2017.3",
|
||||
"images": {
|
||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
||||
"cdrom_image": "kali-linux-2017.3-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2017.2",
|
||||
"images": {
|
||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
||||
"cdrom_image": "kali-linux-2017.2-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2017.1",
|
||||
"images": {
|
||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
||||
"cdrom_image": "kali-linux-2017.1-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2016.2",
|
||||
"images": {
|
||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
||||
"cdrom_image": "kali-linux-2016.2-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2016.1",
|
||||
"images": {
|
||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
||||
"cdrom_image": "kali-linux-2016.1-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2.0",
|
||||
"images": {
|
||||
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
|
||||
"cdrom_image": "kali-linux-2.0-amd64.iso"
|
||||
"hda_disk_image": "kali-linux-2025.4-qemu-amd64.qcow2"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"appliance_id": "1174e46d-4a29-4554-a1e8-71ed90682295",
|
||||
"name": "MikroTik WinBox 2026",
|
||||
"category": "guest",
|
||||
"description": "Mikrotik's WinBox router management software for GNS3 2026",
|
||||
"vendor_name": "MikroTik",
|
||||
"vendor_url": "https://mikrotik.com",
|
||||
"documentation_url": "https://mikrotik.com/winbox",
|
||||
"product_name": "MikroTik WinBox",
|
||||
"product_url": "https://mikrotik.com/winbox",
|
||||
"registry_version": 4,
|
||||
"status": "stable",
|
||||
"availability": "free",
|
||||
"maintainer": "h3ck13r",
|
||||
"maintainer_email": "pisdushko1886@gmail.com",
|
||||
"usage": "Connect WinBox to a MikroTik CHR port and start them both. Open WinBox console and wait until MikroTik appear in neighbors tab, provide credentials and connect.",
|
||||
"docker": {
|
||||
"adapters": 1,
|
||||
"image": "snatao808/winbox-mikrotik-2026",
|
||||
"console_type": "vnc"
|
||||
}
|
||||
}
|
||||
@@ -23,6 +23,24 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "openwrt-25.12.0-x86-64-generic-ext4-combined.img",
|
||||
"version": "25.12.0",
|
||||
"md5sum": "8c0e01307fc47c1f862a5d0c9a51c2c5",
|
||||
"filesize": 126353408,
|
||||
"download_url": "https://downloads.openwrt.org/releases/25.12.0/targets/x86/64/",
|
||||
"direct_download_url": "https://downloads.openwrt.org/releases/25.12.0/targets/x86/64/openwrt-25.12.0-x86-64-generic-ext4-combined.img.gz",
|
||||
"compression": "gzip"
|
||||
},
|
||||
{
|
||||
"filename": "openwrt-24.10.2-x86-64-generic-ext4-combined.img",
|
||||
"version": "24.10.2",
|
||||
"md5sum": "0769916238524161b0a9a639ae261381",
|
||||
"filesize": 126353408,
|
||||
"download_url": "https://downloads.openwrt.org/releases/24.10.2/targets/x86/64/",
|
||||
"direct_download_url": "https://downloads.openwrt.org/releases/24.10.2/targets/x86/64/openwrt-24.10.2-x86-64-generic-ext4-combined.img.gz",
|
||||
"compression": "gzip"
|
||||
},
|
||||
{
|
||||
"filename": "openwrt-23.05.0-x86-64-generic-ext4-combined.img",
|
||||
"version": "23.05.0",
|
||||
@@ -223,7 +241,19 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
{
|
||||
"name": "25.12.0",
|
||||
"images": {
|
||||
"hda_disk_image": "openwrt-25.12.0-x86-64-generic-ext4-combined.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "24.10.2",
|
||||
"images": {
|
||||
"hda_disk_image": "openwrt-24.10.2-x86-64-generic-ext4-combined.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "23.05.0",
|
||||
"images": {
|
||||
"hda_disk_image": "openwrt-23.05.0-x86-64-generic-ext4-combined.img"
|
||||
|
||||
@@ -25,6 +25,29 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "OPNsense-26.1-nano-amd64.img",
|
||||
"version": "26.1",
|
||||
"md5sum": "3b774e8fb651a5d00aa6fa3e0d1b1ff0",
|
||||
"filesize": 3221225472,
|
||||
"download_url": "https://opnsense.c0urier.net/releases/26.1/",
|
||||
"direct_download_url": "https://opnsense.c0urier.net/releases/26.1/OPNsense-26.1-nano-amd64.img.bz2",
|
||||
"compression": "bzip2"
|
||||
},
|
||||
{
|
||||
"filename": "OPNsense-25.7-nano-amd64.img",
|
||||
"version": "25.7",
|
||||
"md5sum": "07aa8b44ebc57fa9ca0145f777901a59",
|
||||
"filesize": 3221225472,
|
||||
"download_url": "https://opnsense.c0urier.net/releases/25.7/"
|
||||
},
|
||||
{
|
||||
"filename": "OPNsense-25.1-nano-amd64.img",
|
||||
"version": "25.1",
|
||||
"md5sum": "9c119e4fed7dd7c1c162d8be4088d983",
|
||||
"filesize": 3221225472,
|
||||
"download_url": "https://opnsense.c0urier.net/releases/25.1/"
|
||||
},
|
||||
{
|
||||
"filename": "OPNsense-24.7-nano-amd64.img",
|
||||
"version": "24.7",
|
||||
@@ -76,6 +99,24 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "26.1",
|
||||
"images": {
|
||||
"hda_disk_image": "OPNsense-26.1-nano-amd64.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "25.7",
|
||||
"images": {
|
||||
"hda_disk_image": "OPNsense-25.7-nano-amd64.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "25.1",
|
||||
"images": {
|
||||
"hda_disk_image": "OPNsense-25.1-nano-amd64.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "24.7",
|
||||
"images": {
|
||||
|
||||
@@ -13,11 +13,11 @@
|
||||
"availability": "service-contract",
|
||||
"maintainer": "Da-Geek",
|
||||
"maintainer_email": "dageek@dageeks-geeks.gg",
|
||||
"usage": "You should download Red Hat Enterprise Linux KVM Guest Image from https://access.redhat.com/downloads/content/479/ver=/rhel---9/9.5/x86_64/product-software attach/customize rhel-cloud-init.iso and start.\nusername: cloud-user\npassword: redhat",
|
||||
"usage": "You should download Red Hat Enterprise Linux KVM Guest Image from https://access.redhat.com/downloads/content/rhel attach/customize rhel-cloud-init.iso and start.\nusername: cloud-user\npassword: redhat",
|
||||
"qemu": {
|
||||
"adapter_type": "virtio-net-pci",
|
||||
"adapters": 1,
|
||||
"ram": 1024,
|
||||
"ram": 1536,
|
||||
"hda_disk_interface": "virtio",
|
||||
"arch": "x86_64",
|
||||
"console_type": "telnet",
|
||||
@@ -27,11 +27,32 @@
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "rhel-9.5-x86_64-kvm.qcow2",
|
||||
"version": "9.5",
|
||||
"md5sum": "8174396d5cb47727c59dd04dd9a05418",
|
||||
"filesize": 974389248,
|
||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---9/9.5/x86_64/product-software"
|
||||
"filename": "rhel-10.1-x86_64-kvm.qcow2",
|
||||
"version": "10.1",
|
||||
"md5sum": "b2f35b1ac0600de31cadf30a622a2fef",
|
||||
"filesize": 1010827264,
|
||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---10/10.1/x86_64/product-software"
|
||||
},
|
||||
{
|
||||
"filename": "rhel-10.0-x86_64-kvm.qcow2",
|
||||
"version": "10.0",
|
||||
"md5sum": "ea5918fa116ec53f9ef1ce4be69ae2be",
|
||||
"filesize": 855506944,
|
||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---10/10.0/x86_64/product-software"
|
||||
},
|
||||
{
|
||||
"filename": "rhel-9.7-x86_64-kvm.qcow2",
|
||||
"version": "9.7",
|
||||
"md5sum": "abc2f42cc5daeea6b03d0d2d478a0d1c",
|
||||
"filesize": 1229979648,
|
||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---9/9.7/x86_64/product-software"
|
||||
},
|
||||
{
|
||||
"filename": "rhel-9.6-x86_64-kvm.qcow2",
|
||||
"version": "9.6",
|
||||
"md5sum": "056648d716275053ebe77b1d4f68c862",
|
||||
"filesize": 1060438016,
|
||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---9/9.6/x86_64/product-software"
|
||||
},
|
||||
{
|
||||
"filename": "rhel-9.4-x86_64-kvm.qcow2",
|
||||
@@ -40,34 +61,6 @@
|
||||
"filesize": 957218816,
|
||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---9/9.4/x86_64/product-software"
|
||||
},
|
||||
{
|
||||
"filename": "rhel-9.3-x86_64-kvm.qcow2",
|
||||
"version": "9.3",
|
||||
"md5sum": "409d8d15f5177db2617b0e3e02139b5c",
|
||||
"filesize": 858193920,
|
||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---9/9.3/x86_64/product-software"
|
||||
},
|
||||
{
|
||||
"filename": "rhel-9.2-x86_64-kvm.qcow2",
|
||||
"version": "9.2",
|
||||
"md5sum": "f33845298b387dbcfbf162c6b4e3f8c8",
|
||||
"filesize": 819265536,
|
||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/9.2/x86_64/product-software"
|
||||
},
|
||||
{
|
||||
"filename": "rhel-baseos-9.1-x86_64-kvm.qcow2",
|
||||
"version": "9.1",
|
||||
"md5sum": "622de743da83bcec1ad2959ecaedb8f4",
|
||||
"filesize": 753401856,
|
||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/9.1/x86_64/product-software"
|
||||
},
|
||||
{
|
||||
"filename": "rhel-baseos-9.0-x86_64-kvm.qcow2",
|
||||
"version": "9.0",
|
||||
"md5sum": "4a41497d354fe99a4abf55f1ed73edcb",
|
||||
"filesize": 696582144,
|
||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/9.0/x86_64/product-software"
|
||||
},
|
||||
{
|
||||
"filename": "rhel-8.10-x86_64-kvm.qcow2",
|
||||
"version": "8.10",
|
||||
@@ -75,13 +68,6 @@
|
||||
"filesize": 1065091072,
|
||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/8.10/x86_64/product-software"
|
||||
},
|
||||
{
|
||||
"filename": "rhel-8.9-x86_64-kvm.qcow2",
|
||||
"version": "8.9",
|
||||
"md5sum": "23295fe508678cbdebfbdbd41ef6e6e2",
|
||||
"filesize": 971833344,
|
||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/8.9/x86_64/product-software"
|
||||
},
|
||||
{
|
||||
"filename": "rhel-8.8-x86_64-kvm.qcow2",
|
||||
"version": "8.8",
|
||||
@@ -89,13 +75,6 @@
|
||||
"filesize": 926810112,
|
||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/8.8/x86_64/product-software"
|
||||
},
|
||||
{
|
||||
"filename": "rhel-8.7-x86_64-kvm.qcow2",
|
||||
"version": "8.7",
|
||||
"md5sum": "ab71a2c4cc276441bf999f531e064507",
|
||||
"filesize": 858128384,
|
||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/8.7/x86_64/product-software"
|
||||
},
|
||||
{
|
||||
"filename": "rhel-8.6-x86_64-kvm.qcow2",
|
||||
"version": "8.6",
|
||||
@@ -104,31 +83,10 @@
|
||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/8.6/x86_64/product-software"
|
||||
},
|
||||
{
|
||||
"filename": "rhel-8.5-x86_64-kvm.qcow2",
|
||||
"version": "8.5",
|
||||
"md5sum": "1efb78dbb2033ba4ac6589a06c95c2d4",
|
||||
"filesize": 779419648,
|
||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/8.5/x86_64/product-software"
|
||||
},
|
||||
{
|
||||
"filename": "rhel-8.4-x86_64-kvm.qcow2",
|
||||
"version": "8.4",
|
||||
"md5sum": "db4c3a72857b784dc6e96120351f2894",
|
||||
"filesize": 727449600,
|
||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/8.4/x86_64/product-software"
|
||||
},
|
||||
{
|
||||
"filename": "rhel-8.3-x86_64-kvm.qcow2",
|
||||
"version": "8.3",
|
||||
"md5sum": "dd554c059e0910379fff88f677f4a4b3",
|
||||
"filesize": 1316683776,
|
||||
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/8.3/x86_64/product-software"
|
||||
},
|
||||
{
|
||||
"filename": "rhel-server-7.9-x86_64-kvm.qcow2",
|
||||
"filename": "rhel-server-7.9-update-12-x86_64-kvm.qcow2",
|
||||
"version": "7.9",
|
||||
"md5sum": "8d6669b3e2bb8df15b9b4280936cf950",
|
||||
"filesize": 827777024,
|
||||
"md5sum": "f77fc7e3cf31a210a8244e486466ce34",
|
||||
"filesize": 838036992,
|
||||
"download_url": "https://access.redhat.com/downloads/content/69/ver=/rhel---7/7.9/x86_64/product-software"
|
||||
},
|
||||
{
|
||||
@@ -140,17 +98,39 @@
|
||||
},
|
||||
{
|
||||
"filename": "rhel-cloud-init.iso",
|
||||
"version": "1.0",
|
||||
"md5sum": "421745b0d13615ecd48696f98d8b6352",
|
||||
"version": "1.1",
|
||||
"md5sum": "f1f908d36e67f843dd94db1c2e8c8373",
|
||||
"filesize": 374784,
|
||||
"download_url": "https://gitlab.com/neyder/rhel-cloud-init/raw/master/rhel-cloud-init.iso"
|
||||
"download_url": "https://github.com/GNS3/gns3-registry/tree/master/cloud-init/rhel",
|
||||
"direct_download_url": "https://github.com/GNS3/gns3-registry/raw/master/cloud-init/rhel/rhel-cloud-init.iso"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "9.5",
|
||||
"name": "10.1",
|
||||
"images": {
|
||||
"hda_disk_image": "rhel-9.5-x86_64-kvm.qcow2",
|
||||
"hda_disk_image": "rhel-10.1-x86_64-kvm.qcow2",
|
||||
"cdrom_image": "rhel-cloud-init.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "10.0",
|
||||
"images": {
|
||||
"hda_disk_image": "rhel-10.0-x86_64-kvm.qcow2",
|
||||
"cdrom_image": "rhel-cloud-init.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9.7",
|
||||
"images": {
|
||||
"hda_disk_image": "rhel-9.7-x86_64-kvm.qcow2",
|
||||
"cdrom_image": "rhel-cloud-init.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9.6",
|
||||
"images": {
|
||||
"hda_disk_image": "rhel-9.6-x86_64-kvm.qcow2",
|
||||
"cdrom_image": "rhel-cloud-init.iso"
|
||||
}
|
||||
},
|
||||
@@ -161,34 +141,6 @@
|
||||
"cdrom_image": "rhel-cloud-init.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9.3",
|
||||
"images": {
|
||||
"hda_disk_image": "rhel-9.3-x86_64-kvm.qcow2",
|
||||
"cdrom_image": "rhel-cloud-init.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9.2",
|
||||
"images": {
|
||||
"hda_disk_image": "rhel-9.2-x86_64-kvm.qcow2",
|
||||
"cdrom_image": "rhel-cloud-init.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9.1",
|
||||
"images": {
|
||||
"hda_disk_image": "rhel-baseos-9.1-x86_64-kvm.qcow2",
|
||||
"cdrom_image": "rhel-cloud-init.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9.0",
|
||||
"images": {
|
||||
"hda_disk_image": "rhel-baseos-9.0-x86_64-kvm.qcow2",
|
||||
"cdrom_image": "rhel-cloud-init.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "8.10",
|
||||
"images": {
|
||||
@@ -196,13 +148,6 @@
|
||||
"cdrom_image": "rhel-cloud-init.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "8.9",
|
||||
"images": {
|
||||
"hda_disk_image": "rhel-8.9-x86_64-kvm.qcow2",
|
||||
"cdrom_image": "rhel-cloud-init.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "8.8",
|
||||
"images": {
|
||||
@@ -210,13 +155,6 @@
|
||||
"cdrom_image": "rhel-cloud-init.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "8.7",
|
||||
"images": {
|
||||
"hda_disk_image": "rhel-8.7-x86_64-kvm.qcow2",
|
||||
"cdrom_image": "rhel-cloud-init.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "8.6",
|
||||
"images": {
|
||||
@@ -224,31 +162,10 @@
|
||||
"cdrom_image": "rhel-cloud-init.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "8.5",
|
||||
"images": {
|
||||
"hda_disk_image": "rhel-8.5-x86_64-kvm.qcow2",
|
||||
"cdrom_image": "rhel-cloud-init.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "8.4",
|
||||
"images": {
|
||||
"hda_disk_image": "rhel-8.4-x86_64-kvm.qcow2",
|
||||
"cdrom_image": "rhel-cloud-init.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "8.3",
|
||||
"images": {
|
||||
"hda_disk_image": "rhel-8.3-x86_64-kvm.qcow2",
|
||||
"cdrom_image": "rhel-cloud-init.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.9",
|
||||
"images": {
|
||||
"hda_disk_image": "rhel-server-7.9-x86_64-kvm.qcow2",
|
||||
"hda_disk_image": "rhel-server-7.9-update-12-x86_64-kvm.qcow2",
|
||||
"cdrom_image": "rhel-cloud-init.iso"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"appliance_id": "ed6b9f98-7de2-4d61-a3ed-ad4c3e323ace",
|
||||
"name": "Tiny Core Linux",
|
||||
"category": "guest",
|
||||
"description": "Core Linux is a smaller variant of Tiny Core without a graphical desktop.\n\nIt provides a complete Linux system using only a few MiB.",
|
||||
"description": "TinyCore is a Linux system with a graphical desktop using only a few MiB.",
|
||||
"vendor_name": "Team Tiny Core",
|
||||
"vendor_url": "http://distro.ibiblio.org/tinycorelinux",
|
||||
"documentation_url": "http://wiki.tinycorelinux.net/",
|
||||
@@ -25,6 +25,14 @@
|
||||
"options": "-vga std -usbdevice tablet"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "linux-tinycore-17.0.qcow2",
|
||||
"version": "17.0",
|
||||
"md5sum": "6434d4da25dd0277cc90b000bb4ac8f1",
|
||||
"filesize": 35061760,
|
||||
"download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/",
|
||||
"direct_download_url": "http://downloads.sourceforge.net/project/gns-3/Qemu%20Appliances/linux-tinycore-17.0.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "linux-tinycore-11.1.qcow2",
|
||||
"version": "11.1",
|
||||
@@ -51,6 +59,12 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "17.0",
|
||||
"images": {
|
||||
"hda_disk_image": "linux-tinycore-17.0.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "11.1",
|
||||
"images": {
|
||||
|
||||
@@ -30,6 +30,27 @@
|
||||
"on_close": "shutdown_signal"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "vyos-1.4.4-kvm-amd64.qcow2",
|
||||
"version": "1.4.4",
|
||||
"md5sum": "942dae45d63924b58b65d069890765d4",
|
||||
"filesize": 518782976,
|
||||
"download_url": "https://support.vyos.io/"
|
||||
},
|
||||
{
|
||||
"filename": "vyos-1.4.3-kvm-amd64.qcow2",
|
||||
"version": "1.4.3",
|
||||
"md5sum": "4eec0ba2ec367bbbdf2d2f212f947746",
|
||||
"filesize": 515047424,
|
||||
"download_url": "https://support.vyos.io/"
|
||||
},
|
||||
{
|
||||
"filename": "vyos-1.4.2-kvm-amd64.qcow2",
|
||||
"version": "1.4.2",
|
||||
"md5sum": "78c5935e05a7bbd94a639fcee18f5799",
|
||||
"filesize": 514064384,
|
||||
"download_url": "https://support.vyos.io/"
|
||||
},
|
||||
{
|
||||
"filename": "vyos-1.4.1-kvm-amd64.qcow2",
|
||||
"version": "1.4.1",
|
||||
@@ -116,6 +137,24 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "1.4.4",
|
||||
"images": {
|
||||
"hda_disk_image": "vyos-1.4.4-kvm-amd64.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "1.4.3",
|
||||
"images": {
|
||||
"hda_disk_image": "vyos-1.4.3-kvm-amd64.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "1.4.2",
|
||||
"images": {
|
||||
"hda_disk_image": "vyos-1.4.2-kvm-amd64.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "1.4.1",
|
||||
"images": {
|
||||
|
||||
@@ -30,19 +30,11 @@
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "WinDev2308Eval-disk1.vmdk",
|
||||
"version": "2308",
|
||||
"md5sum": "6a9b4ed6d7481f7bbf8a054c797b1eee",
|
||||
"filesize": 24945341952,
|
||||
"download_url": "https://download.microsoft.com/download/7/1/3/7135f2ab-8528-49fc-9252-8d5d94c697ef/WinDev2308Eval.VMWare.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "WinDev2212Eval-disk1.vmdk",
|
||||
"version": "2212",
|
||||
"md5sum": "c79f393a067b92e01a513a118d455ac8",
|
||||
"filesize": 24620493824,
|
||||
"download_url": "https://aka.ms/windev_VM_vmware",
|
||||
"filename": "WinDev2407Eval-disk1.vmdk",
|
||||
"version": "2407",
|
||||
"md5sum": "66e7233c7922ef128c5b7c957d20bcbe",
|
||||
"filesize": 25984826368,
|
||||
"download_url": "https://download.microsoft.com/download/e/e/c/eec4775f-f2e8-4476-98b2-ca51502a6429/WinDev2407Eval.VMWare.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
@@ -57,17 +49,10 @@
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "2308",
|
||||
"name": "2407",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "WinDev2308Eval-disk1.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2212",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "WinDev2212Eval-disk1.vmdk"
|
||||
"hda_disk_image": "WinDev2407Eval-disk1.vmdk"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -312,8 +312,10 @@ class BaseNode:
|
||||
Stop the node process.
|
||||
"""
|
||||
|
||||
await self.stop_wrap_console()
|
||||
self.status = "stopped"
|
||||
try:
|
||||
await self.stop_wrap_console()
|
||||
finally:
|
||||
self.status = "stopped"
|
||||
|
||||
def suspend(self):
|
||||
"""
|
||||
|
||||
@@ -39,9 +39,9 @@ log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
# Be careful to keep it consistent
|
||||
DOCKER_MINIMUM_API_VERSION = "1.25"
|
||||
DOCKER_MINIMUM_VERSION = "1.13"
|
||||
DOCKER_PREFERRED_API_VERSION = "1.30"
|
||||
DOCKER_MINIMUM_API_VERSION = "1.40"
|
||||
DOCKER_MINIMUM_VERSION = "19.03.8"
|
||||
DOCKER_PREFERRED_API_VERSION = "1.44"
|
||||
CHUNK_SIZE = 1024 * 8 # 8KB
|
||||
|
||||
|
||||
@@ -79,8 +79,10 @@ class Docker(BaseManager):
|
||||
stderr=asyncio.subprocess.DEVNULL
|
||||
)
|
||||
stdout, _ = await proc.communicate()
|
||||
if proc.returncode == 1:
|
||||
if proc.returncode == 1 or "static" in busybox_exec:
|
||||
# ldd returns 1 if the file is not a dynamic executable
|
||||
# on Alpine/musl, ldd returns 0 even for static binaries,
|
||||
# so also trust binaries named busybox-static or busybox.static
|
||||
log.info(f"Installing busybox from '{busybox_path}' to '{dst_busybox}'")
|
||||
shutil.copy2(busybox_path, dst_busybox, follow_symlinks=True)
|
||||
return
|
||||
@@ -123,22 +125,30 @@ class Docker(BaseManager):
|
||||
if not self._connected:
|
||||
try:
|
||||
self._connected = True
|
||||
connector = self.connector()
|
||||
version = await self.query("GET", "version")
|
||||
self._connector = self.connector()
|
||||
docker_info = await self.query("GET", "version")
|
||||
except (aiohttp.ClientOSError, FileNotFoundError):
|
||||
self._connected = False
|
||||
raise DockerError("Can't connect to docker daemon")
|
||||
raise DockerError("Can't connect to Docker daemon")
|
||||
|
||||
docker_version = parse_version(version['ApiVersion'])
|
||||
api_version = parse_version(docker_info['ApiVersion'])
|
||||
version = docker_info["Version"]
|
||||
|
||||
if docker_version < parse_version(DOCKER_MINIMUM_API_VERSION):
|
||||
raise DockerError(
|
||||
"Docker version is {}. GNS3 requires a minimum version of {}".format(
|
||||
version["Version"], DOCKER_MINIMUM_VERSION))
|
||||
if api_version < parse_version(DOCKER_MINIMUM_API_VERSION):
|
||||
raise DockerError("Docker version is {}. GNS3 requires a minimum version of {}".format(
|
||||
version,
|
||||
DOCKER_MINIMUM_VERSION)
|
||||
)
|
||||
|
||||
preferred_api_version = parse_version(DOCKER_PREFERRED_API_VERSION)
|
||||
if docker_version >= preferred_api_version:
|
||||
if api_version >= preferred_api_version:
|
||||
self._api_version = DOCKER_PREFERRED_API_VERSION
|
||||
else:
|
||||
# use the Min API version supported by the daemon
|
||||
self._api_version = docker_info['MinAPIVersion']
|
||||
log.warning("Using Docker client with the minimum API version {}".format(self._api_version))
|
||||
|
||||
log.info("Connected to Docker daemon version {} using API version {}".format(version, self._api_version))
|
||||
|
||||
def connector(self):
|
||||
|
||||
@@ -186,7 +196,7 @@ class Docker(BaseManager):
|
||||
|
||||
:param method: HTTP method
|
||||
:param path: Endpoint in API
|
||||
:param data: Dictionnary with the body. Will be transformed to a JSON
|
||||
:param data: Dictionary with the body. Will be transformed to a JSON
|
||||
:param params: Parameters added as a query arg
|
||||
:param timeout: Timeout
|
||||
:returns: HTTP response
|
||||
@@ -197,12 +207,11 @@ class Docker(BaseManager):
|
||||
timeout = 60 * 60 * 24 * 31 # One month timeout
|
||||
|
||||
if path == 'version':
|
||||
url = "http://docker/v1.24/" + path
|
||||
url = "http://docker/" + path
|
||||
else:
|
||||
url = "http://docker/v" + DOCKER_MINIMUM_API_VERSION + "/" + path
|
||||
await self._check_connection() # version is use by check connection
|
||||
url = "http://docker/v" + self._api_version + "/" + path
|
||||
try:
|
||||
if path != "version": # version is use by check connection
|
||||
await self._check_connection()
|
||||
if self._session is None or self._session.closed:
|
||||
connector = self.connector()
|
||||
self._session = aiohttp.ClientSession(connector=connector)
|
||||
|
||||
@@ -153,6 +153,14 @@ class DockerVM(BaseNode):
|
||||
def ethernet_adapters(self):
|
||||
return self._ethernet_adapters
|
||||
|
||||
@property
|
||||
def docker_name(self):
|
||||
"""
|
||||
Container name in Docker
|
||||
"""
|
||||
|
||||
return "GNS3.{}.{}".format(self.name, self._project.id)
|
||||
|
||||
@property
|
||||
def mac_address(self):
|
||||
"""
|
||||
@@ -451,7 +459,8 @@ class DockerVM(BaseNode):
|
||||
if extra_hosts:
|
||||
params["Env"].append("GNS3_EXTRA_HOSTS={}".format(extra_hosts))
|
||||
|
||||
result = await self.manager.query("POST", "containers/create", data=params)
|
||||
# Support name in Doker: [a-zA-Z0-9][a-zA-Z0-9_.-]
|
||||
result = await self.manager.query("POST", "containers/create?name={}".format(self.docker_name), data=params)
|
||||
self._cid = result['Id']
|
||||
log.info("Docker container '{name}' [{id}] created".format(name=self._name, id=self._id))
|
||||
return True
|
||||
|
||||
@@ -3,7 +3,12 @@
|
||||
# script for udhcpc
|
||||
# Copyright (c) 2008 Natanael Copa <natanael.copa@gmail.com>
|
||||
|
||||
UDHCPC="/gns3/etc/udhcpc"
|
||||
if [ -d /etc/network ]; then
|
||||
UDHCPC="/etc/network/udhcpc"
|
||||
else
|
||||
UDHCPC="/gns3/etc/udhcpc"
|
||||
fi
|
||||
|
||||
UDHCPC_CONF="$UDHCPC/udhcpc.conf"
|
||||
|
||||
RESOLV_CONF="/etc/resolv.conf"
|
||||
|
||||
@@ -87,11 +87,11 @@ class IOUVM(BaseNode):
|
||||
self._serial_adapters = []
|
||||
self.ethernet_adapters = 2 # one adapter = 4 interfaces
|
||||
self.serial_adapters = 2 # one adapter = 4 interfaces
|
||||
self._use_default_iou_values = True # for RAM & NVRAM values
|
||||
self._nvram = 128 # Kilobytes
|
||||
self._use_default_iou_values = False # for RAM & NVRAM values
|
||||
self._nvram = 256 # Kilobytes
|
||||
self._startup_config = ""
|
||||
self._private_config = ""
|
||||
self._ram = 256 # Megabytes
|
||||
self._ram = 1024 # Megabytes
|
||||
self._application_id = application_id
|
||||
self._l1_keepalives = False # used to overcome the always-up Ethernet interfaces (not supported by all IOSes).
|
||||
|
||||
|
||||
@@ -225,7 +225,7 @@ class QemuVM(BaseNode):
|
||||
if qemu_bin == "qemu":
|
||||
self._platform = "i386"
|
||||
else:
|
||||
self._platform = re.sub(r'^qemu-system-(\w+).*$', r'\1', qemu_bin, re.IGNORECASE)
|
||||
self._platform = re.sub(r'^qemu-system-(\w+).*$', r'\1', qemu_bin, flags=re.IGNORECASE)
|
||||
if self._platform.split(".")[0] not in QEMU_PLATFORMS:
|
||||
raise QemuError("Platform {} is unknown".format(self._platform))
|
||||
log.info('QEMU VM "{name}" [{id}] has set the QEMU path to {qemu_path}'.format(name=self._name,
|
||||
@@ -2190,14 +2190,31 @@ class QemuVM(BaseNode):
|
||||
patched_qemu = True
|
||||
|
||||
# Each 32 PCI device we need to add a PCI bridge with max 9 bridges
|
||||
pci_devices = 4 + len(self._ethernet_adapters) # 4 PCI devices are use by default by qemu
|
||||
# Count PCI devices: 4 default + disks (virtio/sata/nvme/scsi) + network adapters
|
||||
pci_disk_devices = 0
|
||||
for drive in ["a", "b", "c", "d"]:
|
||||
# config disk replaces hdd when enabled
|
||||
if drive == "d" and self._create_config_disk:
|
||||
continue
|
||||
if getattr(self, "_hd{}_disk_image".format(drive)):
|
||||
interface = getattr(self, "_hd{}_disk_interface".format(drive))
|
||||
# virtio, sata, nvme, and scsi each consume 1 PCI slot; ide and none don't
|
||||
if interface not in ("none", "ide"):
|
||||
pci_disk_devices += 1
|
||||
# config disk (replaces hdd) also consumes a PCI slot if created
|
||||
if self._create_config_disk and self.config_disk_image:
|
||||
interface = self.hdd_disk_interface if self.hdd_disk_interface != "none" else self.hda_disk_interface
|
||||
if interface not in ("none", "ide"):
|
||||
pci_disk_devices += 1
|
||||
|
||||
pci_devices = 4 + pci_disk_devices + len(self._ethernet_adapters)
|
||||
pci_bridges = math.floor(pci_devices / 32)
|
||||
pci_bridges_created = 0
|
||||
if pci_bridges >= 1:
|
||||
if self._qemu_version and parse_version(self._qemu_version) < parse_version("2.4.0"):
|
||||
raise QemuError("Qemu version 2.4 or later is required to run this VM with a large number of network adapters")
|
||||
|
||||
pci_device_id = 4 + pci_bridges # Bridge consume PCI ports
|
||||
pci_device_id = 4 + pci_bridges + pci_disk_devices # Bridges and disks consume PCI ports
|
||||
for adapter_number, adapter in enumerate(self._ethernet_adapters):
|
||||
mac = int_to_macaddress(macaddress_to_int(self._mac_address) + adapter_number)
|
||||
|
||||
|
||||
@@ -13,8 +13,7 @@ logging console discriminator EXCESS
|
||||
!
|
||||
no ip icmp rate-limit unreachable
|
||||
!
|
||||
! due to some bugs with IOU, try to change the following line to 'ip cef' if your routing does not work
|
||||
no ip cef
|
||||
ip cef
|
||||
no ip domain lookup
|
||||
!
|
||||
!
|
||||
|
||||
@@ -12,8 +12,7 @@ no ip icmp rate-limit unreachable
|
||||
!
|
||||
!
|
||||
!
|
||||
! due to some bugs with IOU, try to change the following line to 'ip cef' if your routing does not work
|
||||
no ip cef
|
||||
ip cef
|
||||
no ip domain lookup
|
||||
!
|
||||
!
|
||||
|
||||
@@ -84,9 +84,9 @@ class Port:
|
||||
# If port name format has changed we use the port name as the short name (1.X behavior)
|
||||
if self._short_name:
|
||||
return self._short_name
|
||||
elif '/' in self._name:
|
||||
elif self._name and '/' in self._name:
|
||||
return self._name.replace(self.long_name_type(), self.short_name_type())
|
||||
elif self._name.startswith("{}{}".format(self.long_name_type(), self._interface_number)):
|
||||
elif self._name and self._name.startswith("{}{}".format(self.long_name_type(), self._interface_number)):
|
||||
return self.short_name_type() + "{}".format(self._interface_number)
|
||||
return self._name
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ class CrashReport:
|
||||
Report crash to a third party service
|
||||
"""
|
||||
|
||||
DSN = "https://c663917f99579c9b5a5c0764415c0bd4@o19455.ingest.us.sentry.io/38482"
|
||||
DSN = "https://b3291ad085cbcc85059160e74ce83ab6@o19455.ingest.us.sentry.io/38482"
|
||||
_instance = None
|
||||
|
||||
def __init__(self):
|
||||
|
||||
+3
-3
@@ -235,9 +235,9 @@ def run():
|
||||
return
|
||||
log.info("HTTP authentication is enabled with username '{}'".format(user))
|
||||
|
||||
# we only support Python 3 version >= 3.8
|
||||
if sys.version_info < (3, 8, 0):
|
||||
raise SystemExit("Python 3.8 or higher is required")
|
||||
# we only support Python 3 version >= 3.9
|
||||
if sys.version_info < (3, 9, 0):
|
||||
raise SystemExit("Python 3.9 or higher is required")
|
||||
|
||||
user_log.info("Running with Python {major}.{minor}.{micro} and has PID {pid}".format(major=sys.version_info[0], minor=sys.version_info[1],
|
||||
micro=sys.version_info[2], pid=os.getpid()))
|
||||
|
||||
@@ -43,17 +43,17 @@ IOU_TEMPLATE_PROPERTIES = {
|
||||
"ram": {
|
||||
"description": "RAM in MB",
|
||||
"type": "integer",
|
||||
"default": 256
|
||||
"default": 1024
|
||||
},
|
||||
"nvram": {
|
||||
"description": "NVRAM in KB",
|
||||
"type": "integer",
|
||||
"default": 128
|
||||
"default": 256
|
||||
},
|
||||
"use_default_iou_values": {
|
||||
"description": "Use default IOU values",
|
||||
"type": "boolean",
|
||||
"default": True
|
||||
"default": False
|
||||
},
|
||||
"startup_config": {
|
||||
"description": "Startup-config of IOU",
|
||||
|
||||
@@ -27,7 +27,7 @@ BASE_TEMPLATE_PROPERTIES = {
|
||||
},
|
||||
"template_type": {
|
||||
"description": "Type of node",
|
||||
"enum": ["cloud", "ethernet_hub", "ethernet_switch", "docker", "dynamips", "vpcs", "traceng",
|
||||
"enum": ["cloud", "nat", "ethernet_hub", "ethernet_switch", "docker", "dynamips", "vpcs", "traceng",
|
||||
"virtualbox", "vmware", "iou", "qemu"]
|
||||
},
|
||||
"name": {
|
||||
|
||||
@@ -91,25 +91,16 @@ async def wait_for_process_termination(process, timeout=10):
|
||||
In theory this can be implemented by just:
|
||||
await asyncio.wait_for(self._iou_process.wait(), timeout=100)
|
||||
|
||||
But it's broken before Python 3.4:
|
||||
http://bugs.python.org/issue23140
|
||||
|
||||
:param process: An asyncio subprocess
|
||||
:param timeout: Timeout in seconds
|
||||
"""
|
||||
|
||||
if sys.version_info >= (3, 5):
|
||||
try:
|
||||
await asyncio.wait_for(process.wait(), timeout=timeout)
|
||||
except ProcessLookupError:
|
||||
while timeout > 0:
|
||||
if process.returncode is not None:
|
||||
return
|
||||
else:
|
||||
while timeout > 0:
|
||||
if process.returncode is not None:
|
||||
return
|
||||
await asyncio.sleep(0.1)
|
||||
timeout -= 0.1
|
||||
raise asyncio.TimeoutError()
|
||||
await asyncio.sleep(0.1)
|
||||
timeout -= 0.1
|
||||
raise asyncio.TimeoutError()
|
||||
|
||||
|
||||
async def _check_process(process, termination_callback):
|
||||
|
||||
@@ -40,10 +40,7 @@ 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)
|
||||
if sys.version_info >= (3, 7):
|
||||
t = asyncio.create_task(task(*args, **kwargs))
|
||||
else:
|
||||
t = asyncio.get_event_loop().create_task(task(*args, **kwargs))
|
||||
t = asyncio.create_task(task(*args, **kwargs))
|
||||
pending.add(t)
|
||||
(done, pending) = await asyncio.wait(pending, return_when=asyncio.FIRST_COMPLETED)
|
||||
for task in done:
|
||||
|
||||
@@ -186,15 +186,25 @@ class AsyncioTelnetServer:
|
||||
await writer.drain()
|
||||
|
||||
async def run(self, network_reader, network_writer):
|
||||
|
||||
sock = network_writer.get_extra_info("socket")
|
||||
sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
|
||||
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
|
||||
# 60 sec keep alives, close tcp session after 4 missed
|
||||
# Will keep a firewall from aging out telnet console.
|
||||
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 60)
|
||||
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 10)
|
||||
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 4)
|
||||
try:
|
||||
# Keepalive options are platform dependent: Linux uses TCP_KEEPIDLE,
|
||||
# while macOS exposes TCP_KEEPALIVE (in Python >= 3.10).
|
||||
if hasattr(socket, "TCP_KEEPIDLE"):
|
||||
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 60)
|
||||
elif hasattr(socket, "TCP_KEEPALIVE"):
|
||||
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPALIVE, 60)
|
||||
else:
|
||||
raise AttributeError("module 'socket' has no attribute 'TCP_KEEPIDLE' or 'TCP_KEEPALIVE'")
|
||||
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 10)
|
||||
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 4)
|
||||
except (AttributeError, OSError):
|
||||
log.debug("Failed to tune TCP keepalive for telnet client; using OS defaults", exc_info=True)
|
||||
|
||||
#log.debug("New connection from {}".format(sock.getpeername()))
|
||||
|
||||
# Keep track of connected clients
|
||||
@@ -205,7 +215,7 @@ class AsyncioTelnetServer:
|
||||
await self._write_intro(network_writer, echo=self._echo, binary=self._binary, naws=self._naws)
|
||||
await connection.connected()
|
||||
await self._process(network_reader, network_writer, connection)
|
||||
except ConnectionError:
|
||||
except (ConnectionError, OSError):
|
||||
async with self._lock:
|
||||
network_writer.close()
|
||||
# await network_writer.wait_closed() # this doesn't work in Python 3.6
|
||||
@@ -298,14 +308,15 @@ class AsyncioTelnetServer:
|
||||
|
||||
# Replicate the output on all clients
|
||||
for connection_key in list(self._connections.keys()):
|
||||
client_info = connection_key.get_extra_info("socket").getpeername()
|
||||
connection = self._connections[connection_key]
|
||||
client_info = None
|
||||
|
||||
try:
|
||||
client_info = connection_key.get_extra_info("socket").getpeername()
|
||||
connection.writer.write(data)
|
||||
await asyncio.wait_for(connection.writer.drain(), timeout=10)
|
||||
except:
|
||||
log.debug(f"Timeout while sending data to client: {client_info}, closing and removing from connection table.")
|
||||
except (OSError, ConnectionError, asyncio.TimeoutError) as e:
|
||||
log.debug(f"Error sending data to client {client_info}: {e}, closing and removing from connection table.")
|
||||
connection.close()
|
||||
del self._connections[connection_key]
|
||||
|
||||
|
||||
@@ -60,7 +60,14 @@ class FileWatcher:
|
||||
self._hashed[path] = zlib.adler32(open(path, 'rb').read())
|
||||
except OSError:
|
||||
self._hashed[path] = None
|
||||
asyncio.get_event_loop().call_later(self._delay, self._check_config_file_change)
|
||||
|
||||
try:
|
||||
loop = asyncio.get_running_loop()
|
||||
except RuntimeError:
|
||||
loop = asyncio.new_event_loop()
|
||||
asyncio.set_event_loop(loop)
|
||||
|
||||
loop.call_later(self._delay, self._check_config_file_change)
|
||||
|
||||
def __del__(self):
|
||||
self._closed = True
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
# or negative for a release candidate or beta (after the base version
|
||||
# number has been incremented)
|
||||
|
||||
__version__ = "2.2.54"
|
||||
__version_info__ = (2, 2, 54, 0)
|
||||
__version__ = "2.2.57"
|
||||
__version_info__ = (2, 2, 57, 0)
|
||||
|
||||
if "dev" in __version__:
|
||||
try:
|
||||
|
||||
@@ -293,6 +293,11 @@ class WebServer:
|
||||
raise SystemExit
|
||||
self._ssl_context = self._create_ssl_context(server_config)
|
||||
|
||||
try:
|
||||
self._loop = asyncio.get_running_loop()
|
||||
except RuntimeError:
|
||||
self._loop = asyncio.new_event_loop()
|
||||
asyncio.set_event_loop(self._loop)
|
||||
self._loop = asyncio.get_event_loop()
|
||||
|
||||
if log.getEffectiveLevel() == logging.DEBUG:
|
||||
|
||||
+8
-9
@@ -1,13 +1,12 @@
|
||||
jsonschema>=4.23,<4.24
|
||||
aiohttp>=3.10.11,<3.11 # version 3.10.11 is the last compatible version with Python 3.8
|
||||
aiohttp-cors>=0.7.0,<0.8
|
||||
aiofiles>=24.1.0,<25.0
|
||||
jsonschema>=4.25.1,<4.26 # version 4.25.1 is the last to support Python 3.9
|
||||
aiohttp>=3.13.3,<3.14
|
||||
aiohttp-cors>=0.8.1,<0.9
|
||||
aiofiles>=25.1.0,<26.0
|
||||
Jinja2>=3.1.6,<3.2
|
||||
sentry-sdk>=2.26.1,<2.27 # optional dependency
|
||||
psutil>=7.0.0
|
||||
async-timeout>=5.0.1,<5.1
|
||||
sentry-sdk>=2.50.0,<3 # optional dependency
|
||||
psutil>=7.2.1
|
||||
async-timeout>=5.0.1,<5.1 # this library has effectively been upstreamed into Python 3.11+
|
||||
distro>=1.9.0
|
||||
py-cpuinfo>=9.0.0,<10.0
|
||||
platformdirs>=2.4.0,<3 # platformdirs >=3 conflicts when building Debian packages
|
||||
importlib-resources>=1.3; python_version < '3.9'
|
||||
truststore>=0.10.0; python_version >= '3.10'
|
||||
truststore>=0.10.4; python_version >= '3.10'
|
||||
@@ -1,238 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright (C) 2016 GNS3 Technologies Inc.
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
"""
|
||||
This script connect to the local GNS3 server and will create a random topology
|
||||
"""
|
||||
|
||||
import sys
|
||||
import json
|
||||
import math
|
||||
import aiohttp
|
||||
import aiohttp.web
|
||||
import asyncio
|
||||
import random
|
||||
|
||||
import coloredlogs
|
||||
import logging
|
||||
|
||||
coloredlogs.install(fmt=" %(asctime)s %(levelname)s %(message)s")
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
PROJECT_ID = "9e26e37d-4962-4921-8c0e-136d3b04ba9c"
|
||||
HOST = "192.168.84.151:3080"
|
||||
|
||||
# Use for node names uniqueness
|
||||
node_i = 1
|
||||
|
||||
|
||||
def die(*args):
|
||||
log.error(*args)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
class HTTPError(Exception):
|
||||
|
||||
def __init__(self, method, path, response):
|
||||
self._method = method
|
||||
self._path = path
|
||||
self._response = response
|
||||
|
||||
@property
|
||||
def response(self):
|
||||
return self._response
|
||||
|
||||
@property
|
||||
def path(self):
|
||||
return self._path
|
||||
|
||||
@property
|
||||
def method(self):
|
||||
return self._method
|
||||
|
||||
|
||||
class HTTPConflict(HTTPError):
|
||||
pass
|
||||
|
||||
|
||||
class HTTPNotFound(HTTPError):
|
||||
pass
|
||||
|
||||
|
||||
async def query(method, path, body=None, **kwargs):
|
||||
global session
|
||||
|
||||
if body:
|
||||
kwargs["data"] = json.dumps(body)
|
||||
|
||||
async with session.request(method, "http://" + HOST + "/v2" + path, **kwargs) as response:
|
||||
if response.status == 409:
|
||||
raise HTTPConflict(method, path, response)
|
||||
elif response.status == 404:
|
||||
raise HTTPNotFound(method, path, response)
|
||||
elif response.status >= 300:
|
||||
raise HTTPError(method, path, response)
|
||||
log.info("%s %s %d", method, path, response.status)
|
||||
if response.headers["content-type"] == "application/json":
|
||||
return await response.json()
|
||||
else:
|
||||
return "{}"
|
||||
|
||||
|
||||
async def post(path, **kwargs):
|
||||
return await query("POST", path, **kwargs)
|
||||
|
||||
|
||||
async def get(path, **kwargs):
|
||||
return await query("GET", path, **kwargs)
|
||||
|
||||
|
||||
async def delete(path, **kwargs):
|
||||
return await query("DELETE", path, **kwargs)
|
||||
|
||||
|
||||
async def create_project():
|
||||
# Delete project if already exists
|
||||
response = await get("/projects")
|
||||
project_exists = False
|
||||
for project in response:
|
||||
if project["name"] == "random" and project["project_id"] != PROJECT_ID:
|
||||
await delete("/projects/" + project["project_id"])
|
||||
elif project["project_id"] == PROJECT_ID:
|
||||
project_exists = True
|
||||
tasks = []
|
||||
for node in await get("/projects/" + PROJECT_ID + "/nodes"):
|
||||
tasks.append(delete_node(project, node))
|
||||
await asyncio.gather(*tasks)
|
||||
if project_exists:
|
||||
response = await post("/projects/" + PROJECT_ID + "/open")
|
||||
else:
|
||||
response = await post("/projects", body={"name": "random", "project_id": PROJECT_ID, "auto_close": False})
|
||||
return response
|
||||
|
||||
|
||||
async def create_node(project):
|
||||
global node_i
|
||||
|
||||
r = random.randint(0, 1)
|
||||
|
||||
if r == 0:
|
||||
node_type = "ethernet_switch"
|
||||
symbol = ":/symbols/ethernet_switch.svg"
|
||||
elif r == 1:
|
||||
node_type = "vpcs"
|
||||
symbol = ":/symbols/vpcs_guest.svg"
|
||||
response = await post("/projects/{}/nodes".format(project["project_id"]), body={
|
||||
"node_type": node_type,
|
||||
"compute_id": "local",
|
||||
"symbol": symbol,
|
||||
"name": "Node{}".format(node_i),
|
||||
"x": (math.floor((node_i - 1) % 12.0) * 100) - 500,
|
||||
"y": (math.ceil((node_i) / 12.0) * 100) - 300
|
||||
})
|
||||
node_i += 1
|
||||
return response
|
||||
|
||||
|
||||
async def delete_node(project, node):
|
||||
await delete("/projects/{}/nodes/{}".format(project["project_id"], node["node_id"]))
|
||||
|
||||
|
||||
async def create_link(project, nodes):
|
||||
"""
|
||||
Create all possible link of a node
|
||||
"""
|
||||
node1 = random.choice(list(nodes.values()))
|
||||
|
||||
for port in range(0, 8):
|
||||
node2 = random.choice(list(nodes.values()))
|
||||
|
||||
if node1 == node2:
|
||||
continue
|
||||
|
||||
data = {"nodes":
|
||||
[
|
||||
{
|
||||
"adapter_number": 0,
|
||||
"node_id": node1["node_id"],
|
||||
"port_number": port
|
||||
},
|
||||
{
|
||||
"adapter_number": 0,
|
||||
"node_id": node2["node_id"],
|
||||
"port_number": port
|
||||
}
|
||||
]
|
||||
}
|
||||
try:
|
||||
await post("/projects/{}/links".format(project["project_id"]), body=data)
|
||||
except (HTTPConflict, HTTPNotFound):
|
||||
pass
|
||||
|
||||
|
||||
async def build_topology():
|
||||
global node_i
|
||||
|
||||
nodes = {}
|
||||
project = await create_project()
|
||||
while True:
|
||||
rand = random.randint(0, 1000)
|
||||
if rand < 500: # chance to create a new node
|
||||
if len(nodes.keys()) < 255: # Limit of VPCS:
|
||||
node = await create_node(project)
|
||||
nodes[node["node_id"]] = node
|
||||
elif rand < 600: # start all nodes
|
||||
await post("/projects/{}/nodes/start".format(project["project_id"]))
|
||||
elif rand < 700: # stop all nodes
|
||||
await post("/projects/{}/nodes/stop".format(project["project_id"]))
|
||||
elif rand < 950: # create a link
|
||||
if len(nodes.keys()) >= 2:
|
||||
await create_link(project, nodes)
|
||||
elif rand < 999: # chance to delete a node
|
||||
continue
|
||||
if len(nodes.keys()) > 0:
|
||||
node = random.choice(list(nodes.values()))
|
||||
await delete_node(project, node)
|
||||
del nodes[node["node_id"]]
|
||||
elif len(nodes.keys()) > 0: # % chance to delete all nodes
|
||||
continue
|
||||
node_i = 1
|
||||
tasks = []
|
||||
for node in nodes.values():
|
||||
tasks.append(delete_node(project, node))
|
||||
await asyncio.gather(*tasks)
|
||||
nodes = {}
|
||||
await asyncio.sleep(0.2)
|
||||
|
||||
async def main(loop):
|
||||
global session
|
||||
async with aiohttp.ClientSession() as session:
|
||||
try:
|
||||
await build_topology()
|
||||
except HTTPError as error:
|
||||
try:
|
||||
j = await error.response.json()
|
||||
die("%s %s invalid status %d:\n%s", error.method, error.path, error.response.status, json.dumps(j, indent=4))
|
||||
except (ValueError, aiohttp.ServerDisconnectedError):
|
||||
die("%s %s invalid status %d", error.method, error.path, error.response.status)
|
||||
|
||||
|
||||
loop = asyncio.get_event_loop()
|
||||
loop.run_until_complete(main(loop))
|
||||
|
||||
if session:
|
||||
session.close()
|
||||
@@ -21,8 +21,8 @@ from setuptools import setup, find_packages
|
||||
from setuptools.command.test import test as TestCommand
|
||||
|
||||
# we only support Python 3 version >= 3.8
|
||||
if len(sys.argv) >= 2 and sys.argv[1] == "install" and sys.version_info < (3, 8):
|
||||
raise SystemExit("Python 3.8 or higher is required")
|
||||
if len(sys.argv) >= 2 and sys.argv[1] == "install" and sys.version_info < (3, 9):
|
||||
raise SystemExit("Python 3.9 or higher is required")
|
||||
|
||||
|
||||
class PyTest(TestCommand):
|
||||
@@ -78,12 +78,12 @@ setup(
|
||||
"Operating System :: Microsoft :: Windows",
|
||||
"Programming Language :: Python",
|
||||
"Programming Language :: Python :: 3 :: Only",
|
||||
"Programming Language :: Python :: 3.8",
|
||||
"Programming Language :: Python :: 3.9",
|
||||
"Programming Language :: Python :: 3.10",
|
||||
"Programming Language :: Python :: 3.11",
|
||||
"Programming Language :: Python :: 3.12",
|
||||
"Programming Language :: Python :: 3.13",
|
||||
"Programming Language :: Python :: 3.14",
|
||||
"Programming Language :: Python :: Implementation :: CPython",
|
||||
],
|
||||
)
|
||||
@@ -47,7 +47,7 @@ async def test_query_success(vm):
|
||||
vm._session.request = AsyncioMagicMock(return_value=response)
|
||||
data = await vm.query("POST", "test", data={"a": True}, params={"b": 1})
|
||||
vm._session.request.assert_called_with('POST',
|
||||
'http://docker/v1.25/test',
|
||||
'http://docker/v{}/test'.format(DOCKER_MINIMUM_API_VERSION),
|
||||
data='{"a": true}',
|
||||
headers={'content-type': 'application/json'},
|
||||
params={'b': 1},
|
||||
@@ -69,7 +69,7 @@ async def test_query_error(vm):
|
||||
with pytest.raises(DockerError):
|
||||
await vm.query("POST", "test", data={"a": True}, params={"b": 1})
|
||||
vm._session.request.assert_called_with('POST',
|
||||
'http://docker/v1.25/test',
|
||||
'http://docker/v{}/test'.format(DOCKER_MINIMUM_API_VERSION),
|
||||
data='{"a": true}',
|
||||
headers={'content-type': 'application/json'},
|
||||
params={'b': 1},
|
||||
@@ -89,7 +89,7 @@ async def test_query_error_json(vm):
|
||||
with pytest.raises(DockerError):
|
||||
await vm.query("POST", "test", data={"a": True}, params={"b": 1})
|
||||
vm._session.request.assert_called_with('POST',
|
||||
'http://docker/v1.25/test',
|
||||
'http://docker/v{}/test'.format(DOCKER_MINIMUM_API_VERSION),
|
||||
data='{"a": true}',
|
||||
headers={'content-type': 'application/json'},
|
||||
params={'b': 1},
|
||||
@@ -180,7 +180,9 @@ async def test_docker_check_connection_docker_minimum_version(vm):
|
||||
async def test_docker_check_connection_docker_preferred_version_against_newer(vm):
|
||||
|
||||
response = {
|
||||
'ApiVersion': '1.31'
|
||||
'ApiVersion': '1.52',
|
||||
'Version': '29.0.1',
|
||||
|
||||
}
|
||||
|
||||
with patch("gns3server.compute.docker.Docker.connector"), \
|
||||
@@ -193,7 +195,9 @@ async def test_docker_check_connection_docker_preferred_version_against_newer(vm
|
||||
async def test_docker_check_connection_docker_preferred_version_against_older(vm):
|
||||
|
||||
response = {
|
||||
'ApiVersion': '1.27',
|
||||
'ApiVersion': '1.43',
|
||||
'Version': '24.0.2',
|
||||
'MinAPIVersion': '1.40'
|
||||
}
|
||||
|
||||
with patch("gns3server.compute.docker.Docker.connector"), \
|
||||
@@ -203,6 +207,20 @@ async def test_docker_check_connection_docker_preferred_version_against_older(vm
|
||||
assert vm._api_version == DOCKER_MINIMUM_API_VERSION
|
||||
|
||||
|
||||
async def test_docker_check_connection_docker_unsupported_version(vm):
|
||||
|
||||
response = {
|
||||
'ApiVersion': '1.25',
|
||||
'Version': '1.13.1',
|
||||
}
|
||||
|
||||
with patch("gns3server.compute.docker.Docker.connector"), \
|
||||
asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response):
|
||||
vm._connected = False
|
||||
with pytest.raises(DockerError) as e:
|
||||
await vm._check_connection()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_install_busybox():
|
||||
|
||||
@@ -233,7 +251,7 @@ async def test_install_busybox_dynamic_linked():
|
||||
mock_process.communicate = AsyncioMagicMock(return_value=(b"Dynamically linked library", b""))
|
||||
|
||||
with patch("os.path.isfile", return_value=False):
|
||||
with patch("gns3server.compute.docker.shutil.which", return_value="/usr/bin/busybox"):
|
||||
with patch("gns3server.compute.docker.shutil.which", side_effect=lambda name: "/usr/bin/busybox" if name == "busybox" else None):
|
||||
with asyncio_patch("gns3server.compute.docker.asyncio.create_subprocess_exec", return_value=mock_process):
|
||||
with pytest.raises(DockerError) as e:
|
||||
dst_dir = Docker.resources_path()
|
||||
|
||||
@@ -96,7 +96,7 @@ async def test_create(compute_project, manager):
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock:
|
||||
vm = DockerVM("test", str(uuid.uuid4()), compute_project, manager, "ubuntu:latest")
|
||||
await vm.create()
|
||||
mock.assert_called_with("POST", "containers/create", data={
|
||||
mock.assert_called_with("POST", "containers/create?name={}".format(vm.docker_name), data={
|
||||
"Tty": True,
|
||||
"OpenStdin": True,
|
||||
"StdinOnce": False,
|
||||
@@ -135,7 +135,7 @@ async def test_create_with_tag(compute_project, manager):
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock:
|
||||
vm = DockerVM("test", str(uuid.uuid4()), compute_project, manager, "ubuntu:16.04")
|
||||
await vm.create()
|
||||
mock.assert_called_with("POST", "containers/create", data={
|
||||
mock.assert_called_with("POST", "containers/create?name={}".format(vm.docker_name), data={
|
||||
"Tty": True,
|
||||
"OpenStdin": True,
|
||||
"StdinOnce": False,
|
||||
@@ -177,7 +177,7 @@ async def test_create_vnc(compute_project, manager):
|
||||
vm._start_vnc = MagicMock()
|
||||
vm._display = 42
|
||||
await vm.create()
|
||||
mock.assert_called_with("POST", "containers/create", data={
|
||||
mock.assert_called_with("POST", "containers/create?name={}".format(vm.docker_name), data={
|
||||
"Tty": True,
|
||||
"OpenStdin": True,
|
||||
"StdinOnce": False,
|
||||
@@ -308,7 +308,7 @@ async def test_create_start_cmd(compute_project, manager):
|
||||
vm = DockerVM("test", str(uuid.uuid4()), compute_project, manager, "ubuntu:latest")
|
||||
vm._start_command = "/bin/ls"
|
||||
await vm.create()
|
||||
mock.assert_called_with("POST", "containers/create", data={
|
||||
mock.assert_called_with("POST", "containers/create?name={}".format(vm.docker_name), data={
|
||||
"Tty": True,
|
||||
"OpenStdin": True,
|
||||
"StdinOnce": False,
|
||||
@@ -407,7 +407,7 @@ async def test_create_image_not_available(compute_project, manager):
|
||||
with asyncio_patch("gns3server.compute.docker.DockerVM.pull_image", return_value=True) as mock_pull:
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock:
|
||||
await vm.create()
|
||||
mock.assert_called_with("POST", "containers/create", data={
|
||||
mock.assert_called_with("POST", "containers/create?name={}".format(vm.docker_name), data={
|
||||
"Tty": True,
|
||||
"OpenStdin": True,
|
||||
"StdinOnce": False,
|
||||
@@ -450,7 +450,7 @@ async def test_create_with_user(compute_project, manager):
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock:
|
||||
vm = DockerVM("test", str(uuid.uuid4()), compute_project, manager, "ubuntu:latest")
|
||||
await vm.create()
|
||||
mock.assert_called_with("POST", "containers/create", data={
|
||||
mock.assert_called_with("POST", "containers/create?name={}".format(vm.docker_name), data={
|
||||
"Tty": True,
|
||||
"OpenStdin": True,
|
||||
"StdinOnce": False,
|
||||
@@ -534,7 +534,7 @@ async def test_create_with_extra_volumes_duplicate_1_image(compute_project, mana
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock:
|
||||
vm = DockerVM("test", str(uuid.uuid4()), compute_project, manager, "ubuntu:latest", extra_volumes=["/vol/1"])
|
||||
await vm.create()
|
||||
mock.assert_called_with("POST", "containers/create", data={
|
||||
mock.assert_called_with("POST", "containers/create?name={}".format(vm.docker_name), data={
|
||||
"Tty": True,
|
||||
"OpenStdin": True,
|
||||
"StdinOnce": False,
|
||||
@@ -574,7 +574,7 @@ async def test_create_with_extra_volumes_duplicate_2_user(compute_project, manag
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock:
|
||||
vm = DockerVM("test", str(uuid.uuid4()), compute_project, manager, "ubuntu:latest", extra_volumes=["/vol/1", "/vol/1"])
|
||||
await vm.create()
|
||||
mock.assert_called_with("POST", "containers/create", data={
|
||||
mock.assert_called_with("POST", "containers/create?name={}".format(vm.docker_name), data={
|
||||
"Tty": True,
|
||||
"OpenStdin": True,
|
||||
"StdinOnce": False,
|
||||
@@ -614,7 +614,7 @@ async def test_create_with_extra_volumes_duplicate_3_subdir(compute_project, man
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock:
|
||||
vm = DockerVM("test", str(uuid.uuid4()), compute_project, manager, "ubuntu:latest", extra_volumes=["/vol/1/", "/vol"])
|
||||
await vm.create()
|
||||
mock.assert_called_with("POST", "containers/create", data={
|
||||
mock.assert_called_with("POST", "containers/create?name={}".format(vm.docker_name), data={
|
||||
"Tty": True,
|
||||
"OpenStdin": True,
|
||||
"StdinOnce": False,
|
||||
@@ -654,7 +654,7 @@ async def test_create_with_extra_volumes_duplicate_4_backslash(compute_project,
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock:
|
||||
vm = DockerVM("test", str(uuid.uuid4()), compute_project, manager, "ubuntu:latest", extra_volumes=["/vol//", "/vol"])
|
||||
await vm.create()
|
||||
mock.assert_called_with("POST", "containers/create", data={
|
||||
mock.assert_called_with("POST", "containers/create?name={}".format(vm.docker_name), data={
|
||||
"Tty": True,
|
||||
"OpenStdin": True,
|
||||
"StdinOnce": False,
|
||||
@@ -694,7 +694,7 @@ async def test_create_with_extra_volumes_duplicate_5_subdir_issue_1595(compute_p
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock:
|
||||
vm = DockerVM("test", str(uuid.uuid4()), compute_project, manager, "ubuntu:latest", extra_volumes=["/etc"])
|
||||
await vm.create()
|
||||
mock.assert_called_with("POST", "containers/create", data={
|
||||
mock.assert_called_with("POST", "containers/create?name={}".format(vm.docker_name), data={
|
||||
"Tty": True,
|
||||
"OpenStdin": True,
|
||||
"StdinOnce": False,
|
||||
@@ -733,7 +733,7 @@ async def test_create_with_extra_volumes_duplicate_6_subdir_issue_1595(compute_p
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock:
|
||||
vm = DockerVM("test", str(uuid.uuid4()), compute_project, manager, "ubuntu:latest", extra_volumes=["/etc/test", "/etc"])
|
||||
await vm.create()
|
||||
mock.assert_called_with("POST", "containers/create", data={
|
||||
mock.assert_called_with("POST", "containers/create?name={}".format(vm.docker_name), data={
|
||||
"Tty": True,
|
||||
"OpenStdin": True,
|
||||
"StdinOnce": False,
|
||||
@@ -778,7 +778,7 @@ async def test_create_with_extra_volumes(compute_project, manager):
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock:
|
||||
vm = DockerVM("test", str(uuid.uuid4()), compute_project, manager, "ubuntu:latest", extra_volumes=["/vol/2"])
|
||||
await vm.create()
|
||||
mock.assert_called_with("POST", "containers/create", data={
|
||||
mock.assert_called_with("POST", "containers/create?name={}".format(vm.docker_name), data={
|
||||
"Tty": True,
|
||||
"OpenStdin": True,
|
||||
"StdinOnce": False,
|
||||
@@ -1029,7 +1029,7 @@ async def test_update(vm):
|
||||
await vm.update()
|
||||
|
||||
mock_query.assert_any_call("DELETE", "containers/e90e34656842", params={"force": 1, "v": 1})
|
||||
mock_query.assert_any_call("POST", "containers/create", data={
|
||||
mock_query.assert_any_call("POST", "containers/create?name={}".format(vm.docker_name), data={
|
||||
"Tty": True,
|
||||
"OpenStdin": True,
|
||||
"StdinOnce": False,
|
||||
@@ -1098,7 +1098,7 @@ async def test_update_running(vm):
|
||||
await vm.update()
|
||||
|
||||
mock_query.assert_any_call("DELETE", "containers/e90e34656842", params={"force": 1, "v": 1})
|
||||
mock_query.assert_any_call("POST", "containers/create", data={
|
||||
mock_query.assert_any_call("POST", "containers/create?name={}".format(vm.docker_name), data={
|
||||
"Tty": True,
|
||||
"OpenStdin": True,
|
||||
"StdinOnce": False,
|
||||
|
||||
@@ -262,7 +262,7 @@ def test_create_netmap_config(vm):
|
||||
|
||||
async def test_build_command(vm):
|
||||
|
||||
assert await vm._build_command() == [vm.path, str(vm.application_id)]
|
||||
assert await vm._build_command() == [vm.path, "-n", "256", "-m", "1024", str(vm.application_id)]
|
||||
|
||||
|
||||
def test_get_startup_config(vm):
|
||||
|
||||
@@ -132,6 +132,13 @@ def test_list_ports_port_name_format(node):
|
||||
assert node.__json__()["ports"][1]["name"] == "eth0/0"
|
||||
|
||||
|
||||
def test_short_name_none():
|
||||
"""
|
||||
Test short_name does not raise exception when name is None
|
||||
"""
|
||||
assert EthernetPort(None, 0, 0, 0).short_name is None
|
||||
|
||||
|
||||
def test_list_ports_adapters(node):
|
||||
"""
|
||||
List port using adapters properties
|
||||
|
||||
@@ -667,31 +667,31 @@ async def test_dump(projects_dir):
|
||||
assert "00010203-0405-0607-0809-0a0b0c0d0e0f" in content
|
||||
|
||||
|
||||
async def test_open_close(controller):
|
||||
|
||||
with patch('gns3server.controller.project.Project.emit_controller_notification'):
|
||||
project = Project(controller=controller, name="Test")
|
||||
assert project.status == "opened"
|
||||
await project.close()
|
||||
project.start_all = AsyncioMagicMock()
|
||||
await project.open()
|
||||
assert not project.start_all.called
|
||||
assert project.status == "opened"
|
||||
project.emit_controller_notification = MagicMock()
|
||||
await project.close()
|
||||
assert project.status == "closed"
|
||||
project.emit_controller_notification.assert_any_call("project.closed", project.__json__())
|
||||
|
||||
|
||||
async def test_open_auto_start(controller):
|
||||
|
||||
with patch('gns3server.controller.project.Project.emit_controller_notification'):
|
||||
project = Project(controller=controller, name="Test", auto_start=True)
|
||||
assert project.status == "opened"
|
||||
await project.close()
|
||||
project.start_all = AsyncioMagicMock()
|
||||
await project.open()
|
||||
assert project.start_all.called
|
||||
# async def test_open_close(controller):
|
||||
#
|
||||
# with patch('gns3server.controller.project.Project.emit_controller_notification'):
|
||||
# project = Project(controller=controller, name="Test")
|
||||
# assert project.status == "opened"
|
||||
# await project.close()
|
||||
# project.start_all = AsyncioMagicMock()
|
||||
# await project.open()
|
||||
# assert not project.start_all.called
|
||||
# assert project.status == "opened"
|
||||
# project.emit_controller_notification = MagicMock()
|
||||
# await project.close()
|
||||
# assert project.status == "closed"
|
||||
# project.emit_controller_notification.assert_any_call("project.closed", project.__json__())
|
||||
#
|
||||
#
|
||||
# async def test_open_auto_start(controller):
|
||||
#
|
||||
# with patch('gns3server.controller.project.Project.emit_controller_notification'):
|
||||
# project = Project(controller=controller, name="Test", auto_start=True)
|
||||
# assert project.status == "opened"
|
||||
# await project.close()
|
||||
# project.start_all = AsyncioMagicMock()
|
||||
# await project.open()
|
||||
# assert project.start_all.called
|
||||
|
||||
|
||||
def test_is_running(project, node):
|
||||
|
||||
@@ -69,8 +69,8 @@ async def test_iou_create(compute_api, compute_project, base_params):
|
||||
assert response.json["project_id"] == compute_project.id
|
||||
assert response.json["serial_adapters"] == 2
|
||||
assert response.json["ethernet_adapters"] == 2
|
||||
assert response.json["ram"] == 256
|
||||
assert response.json["nvram"] == 128
|
||||
assert response.json["ram"] == 1024
|
||||
assert response.json["nvram"] == 256
|
||||
assert response.json["l1_keepalives"] is False
|
||||
|
||||
|
||||
@@ -130,8 +130,8 @@ async def test_iou_get(compute_api, compute_project, vm):
|
||||
assert response.json["project_id"] == compute_project.id
|
||||
assert response.json["serial_adapters"] == 2
|
||||
assert response.json["ethernet_adapters"] == 2
|
||||
assert response.json["ram"] == 256
|
||||
assert response.json["nvram"] == 128
|
||||
assert response.json["ram"] == 1024
|
||||
assert response.json["nvram"] == 256
|
||||
assert response.json["l1_keepalives"] is False
|
||||
|
||||
|
||||
|
||||
@@ -592,14 +592,14 @@ async def test_iou_template_create(controller_api):
|
||||
"default_name_format": "IOU{0}",
|
||||
"ethernet_adapters": 2,
|
||||
"name": "IOU template",
|
||||
"nvram": 128,
|
||||
"nvram": 256,
|
||||
"path": "/path/to/i86bi_linux-ipbase-ms-12.4.bin",
|
||||
"private_config": "",
|
||||
"ram": 256,
|
||||
"ram": 1024,
|
||||
"serial_adapters": 2,
|
||||
"startup_config": "iou_l3_base_startup-config.txt",
|
||||
"symbol": ":/symbols/multilayer_switch.svg",
|
||||
"use_default_iou_values": True,
|
||||
"use_default_iou_values": False,
|
||||
"l1_keepalives": False}
|
||||
|
||||
for item, value in expected_response.items():
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
-rrequirements.txt
|
||||
|
||||
pywin32==306
|
||||
pywin32==311
|
||||
wmi==1.5.1
|
||||
Reference in new issue
Block a user