mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-11-13 18:35:15 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b5deb9d177 | ||
|
|
e1aa13fa73 | ||
|
|
62c51edbae | ||
|
|
a13d063aa1 | ||
|
|
1ef1872f8e | ||
|
|
657698a961 | ||
|
|
081ba31b50 | ||
|
|
aea4ae808f | ||
|
|
ae3515434c | ||
|
|
589c9754e8 | ||
|
|
4ecd3b2015 | ||
|
|
84ee3263ba | ||
|
|
174624121d | ||
|
|
d9a9abf845 | ||
|
|
0b07299472 | ||
|
|
7fb192699b | ||
|
|
bccdfc97d1 | ||
|
|
792c4310eb | ||
|
|
3e21f96bf9 | ||
|
|
5f932fee9f | ||
|
|
ef38ccfefa | ||
|
|
670b6d689a | ||
|
|
fc75a6b8d3 | ||
|
|
647ac87c89 | ||
|
|
817a053dfc | ||
|
|
df4e4bec24 | ||
|
|
60ac6d2dfe | ||
|
|
c0a0a13bdd | ||
|
|
a3044ede77 | ||
|
|
df3baffd9b | ||
|
|
e7b8309a80 | ||
|
|
029344da14 | ||
|
|
d0bab9947e | ||
|
|
e4a6db8ebc | ||
|
|
181a31be32 | ||
|
|
8d368cd0f6 | ||
|
|
41d4ecc4b7 | ||
|
|
4d95e0b51f | ||
|
|
4efdefaf5a | ||
|
|
b6b345508b | ||
|
|
5d2e539193 | ||
|
|
eb0e26b55f | ||
|
|
17d657c919 | ||
|
|
0aa9ab53d1 | ||
|
|
4021a13651 | ||
|
|
341e2e2e3a | ||
|
|
f8ecd61a98 | ||
|
|
c620d0be84 | ||
|
|
abfbadecd6 | ||
|
|
4a6202fa84 | ||
|
|
f89d645b56 | ||
|
|
b7dd8b5176 | ||
|
|
00cf66fb0f | ||
|
|
8d4e73d23c | ||
|
|
4e712280b3 | ||
|
|
4d57a3befa | ||
|
|
38b72079b2 | ||
|
|
814526ba26 | ||
|
|
f5dc635baa | ||
|
|
902de3dd47 | ||
|
|
ad9b6f42bf | ||
|
|
3560cda06c | ||
|
|
a3d1e865a8 | ||
|
|
089d25c79d | ||
|
|
59ce105a50 | ||
|
|
aeb33024ca | ||
|
|
c593785c6d | ||
|
|
689a82a180 | ||
|
|
23e83b730b | ||
|
|
e5d38811ca | ||
|
|
12e71a2917 | ||
|
|
17e51fdac6 | ||
|
|
d0ed6931d8 | ||
|
|
c274be1135 |
No files matched your search
@@ -30,3 +30,4 @@ env:
|
||||
- PYTHON_VERSION=3.4
|
||||
- PYTHON_VERSION=3.5
|
||||
- PYTHON_VERSION=3.6
|
||||
- PYTHON_VERSION=3.7
|
||||
@@ -1,5 +1,66 @@
|
||||
# Change Log
|
||||
|
||||
## 2.1.13 26/02/2019
|
||||
|
||||
* Force jsonschema dependency to 2.6.0
|
||||
* Less aggressive connections to uBridge. Ref #1289
|
||||
* Fix topology images (Pictures) disappearing from projects. Fixes #1514.
|
||||
* Reset MAC addresses when duplicating a project. Fixes #1522
|
||||
* Fix API call to create a node from an appliance doesn't return the new node data. Fixes #1527
|
||||
* Detect invalid environment variable and send a warning when creating a Docker node. Ref #2683
|
||||
* Do not export/import symlinks for projects. Fixes #2699
|
||||
* Fix symlink not being created for duplicated IOU devices. Fixes https://github.com/GNS3/gns3-gui/issues/2699
|
||||
* Configure coresPerSocket value in VMX file for the GNS3 VM. Fixes https://github.com/GNS3/gns3-gui/issues/2688
|
||||
* Count logical CPUs to detect if the number of vCPUs is too high when configuring the GNS3 VM. Fixes #2688.
|
||||
* Add explicit error when trying to pull a Docker image from Docker Hub without Internet access. Fixes #1506.
|
||||
* Fixes double display output in GRUB in QEMU v3.1. Fixes #1516.
|
||||
|
||||
## 2.1.12 23/01/2019
|
||||
|
||||
* Tune how to get the size of SVG images. Ref https://github.com/GNS3/gns3-gui/issues/2674.
|
||||
* Automatically create a symbolic link to the IOU image in the IOU working directory. Fixes #1484
|
||||
* Fix link pause/filters only work for the first interface of Docker containers. Fixes #1482
|
||||
* Telnet console resize support for Docker VM.
|
||||
* Fix _fix_permissions() garbles permissions in Docker VM. Ref #1428
|
||||
* Fix "None is not of type 'integer'" when opening project containing a Qemu VM. Fixes #2610.
|
||||
* Only require Xtigervnc or Xvfb+x11vnc for Docker with vnc console. Ref #1438
|
||||
* Support tigervnc in Docker VM. Ref #1438
|
||||
* Update minimum VIX version requirements for VMware. Ref #1415.
|
||||
|
||||
## 2.1.11 28/09/2018
|
||||
|
||||
* Catch some exceptions.
|
||||
|
||||
## 2.1.10 15/09/2018
|
||||
|
||||
* Include locale information and GNS3 VM version in crash reports.
|
||||
* Fix small errors like unhandled exceptions etc.
|
||||
* Import encodings.idna to avoid LookupError when standard library is in a zip file.
|
||||
* Catch exceptions in various locations to fix small issues reported by Sentry.
|
||||
* Check if serial pipe can be opened for VMware and VirtualBox VMs.
|
||||
* Improve the invalid port format detection. Fixes https://github.com/GNS3/gns3-gui/issues/2580
|
||||
* Update aiohttp verion requirement in order to support Python 3.7. Fixes https://github.com/GNS3/gns3-gui/issues/2566
|
||||
* Update setup.py and fix minor issues.
|
||||
* Catch asyncio.CancelledError when shutting down the server.
|
||||
* Report GNS3 VM errors to the GUI server summary. Ref #1359.
|
||||
* Replace vboxnet0 (if it does not exist) by the first available vboxnet interface on Windows. Fixes https://github.com/GNS3/gns3-vm/issues/102
|
||||
* Check if the VirtualBox host-only network exists when starting a GNS3 VM running on VirtualBox. Ref https://github.com/GNS3/gns3-vm/issues/102
|
||||
* Change file timestamps if necessary because ZIP does not support timestamps before 1980. Fixes #1360.
|
||||
* Add missing coroutine decorator Ref https://github.com/GNS3/gns3-gui/issues/2566
|
||||
* Refactor asyncio locking system for Python 3.7 support. Ref https://github.com/GNS3/gns3-gui/issues/2566 Ref https://github.com/GNS3/gns3-gui/issues/2568
|
||||
* Use asyncio.ensure_future() instead of asyncio.async() with conservative approach to support Python < 3.4.4. Fixes https://github.com/GNS3/gns3-gui/issues/2566
|
||||
* Forbid controller and compute servers to be different versions. Report last compute server error to clients and display in the server summary.
|
||||
* Fix exception with short names for Dynamips interfaces. Fixes #1386.
|
||||
* Add missing Qemu boot priority values. Fixes https://github.com/GNS3/gns3-server/issues/1385
|
||||
|
||||
## 2.1.9 13/08/2018
|
||||
|
||||
* Fix some more problems with interface short names. Fixes https://github.com/GNS3/gns3-gui/issues/2562
|
||||
* Fix incorrect short port names in topology summary. Fixes https://github.com/GNS3/gns3-gui/issues/2562
|
||||
* Set lower process priority when computing idle-pc value on Windows. Ref #2522.
|
||||
* Catch exception: ZIP does not support timestamps before 1980. Ref #1360.
|
||||
* Sync appliances
|
||||
|
||||
## 2.1.8 14/06/2018
|
||||
|
||||
* 'caplog.text()' syntax is deprecated, use 'caplog.text' property instead.
|
||||
@@ -647,7 +708,7 @@
|
||||
* Fix naming of IOU serial interfaces
|
||||
* Improve timeout management
|
||||
* When exporting debug information export GNS3 VM vmx content
|
||||
* /debug for exporting debug informations
|
||||
* /debug for exporting debug information
|
||||
* Raise error if using a non linked clone VM twice
|
||||
* Fix a possible deadlock at exit
|
||||
* Fix import of some old dynamips topologies
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
GET /v2/compute/debug
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Return debug informations about the compute
|
||||
Return debug information about the compute
|
||||
|
||||
Response status codes
|
||||
**********************
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"name": "AAA",
|
||||
"category": "guest",
|
||||
"description": "This appliance provides RADIUS and TACACS+ services with preconfigured users and groups.",
|
||||
"vendor_name": "Ubuntu",
|
||||
"vendor_url": "https://www.ubuntu.com/",
|
||||
"product_name": "AAA",
|
||||
"registry_version": 3,
|
||||
"status": "stable",
|
||||
"maintainer": "Andras Dosztal",
|
||||
"maintainer_email": "developers@gns3.net",
|
||||
"symbol": "linux_guest.svg",
|
||||
"usage": "RADIUS users:\n- alice\n- bob\n\nTACACS+ users:\n- gns3 (role: admin)\n- readonly\n\nAll users, as well as the RADIUS/TACACS+ clients have the password 'gns3' set.",
|
||||
"docker": {
|
||||
"adapters": 1,
|
||||
"image": "adosztal/aaa:latest",
|
||||
"console_type": "telnet"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"name": "cEOS",
|
||||
"category": "multilayer_switch",
|
||||
"description": "Arista cEOS\u2122 introduces the containerized packaging of EOS software and its agents for deployment in cloud infrastructure with the same proven EOS software image that runs on all Arista products. These flexible deployment options empower cloud network operators that are customizing their operating environments to provide a uniform workflow for development, testing and deployment of differentiated services.",
|
||||
"vendor_name": "Arista",
|
||||
"vendor_url": "http://www.arista.com/",
|
||||
"product_name": "cEOS",
|
||||
"registry_version": 3,
|
||||
"status": "experimental",
|
||||
"maintainer": "GNS3 Team",
|
||||
"maintainer_email": "developers@gns3.net",
|
||||
"usage": "Download:\nCreate a (free) Arista account and login.\nThen navigate to Support / Software Download and download the cEOS-lab image.\n\nInstallation:\nCopy the image to your GNS3VM (or other Linux) server, then run the following commands:\n\ndocker import cEOS-lab.tar.xz ceosimage:4.20.5F\necho \"rm /etc/systemd/system/getty.target.wants/getty@tty1.service\" | \\\ndocker run --name=ceos-container -e CEOS=1 -e container=docker -e EOS_PLATFORM=ceossim -e SKIP_ZEROTOUCH_BARRIER_IN_SYSDBINIT=1 -e ETBA=1 -e INTFTYPE=eth -i ceosimage:4.20.5F sh\ndocker commit --change='CMD [\"/sbin/init\"]' --change='VOLUME /mnt/flash' ceos-container ceosimage:GNS3\ndocker rm ceos-container\n\nUsage:\nThe login is admin, with no password by default",
|
||||
"symbol": ":/symbols/multilayer_switch.svg",
|
||||
"docker": {
|
||||
"adapters": 8,
|
||||
"image": "ceosimage:GNS3",
|
||||
"console_type": "telnet"
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,15 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "BSDRP-1.90-full-amd64-serial.img",
|
||||
"version": "1.90",
|
||||
"md5sum": "78b7182bed93888d17d18a67d5fec3a7",
|
||||
"filesize": 1000000000,
|
||||
"download_url": "https://bsdrp.net/downloads",
|
||||
"direct_download_url": "https://sourceforge.net/projects/bsdrp/files/BSD_Router_Project/1.90/amd64/BSDRP-1.90-full-amd64-serial.img.xz/download",
|
||||
"compression": "xz"
|
||||
},
|
||||
{
|
||||
"filename": "BSDRP-1.80-full-amd64-serial.img",
|
||||
"version": "1.80",
|
||||
@@ -39,6 +48,12 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "1.90",
|
||||
"images": {
|
||||
"hda_disk_image": "BSDRP-1.90-full-amd64-serial.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "1.80",
|
||||
"images": {
|
||||
|
||||
@@ -25,6 +25,20 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "asav992.qcow2",
|
||||
"version": "9.9.2",
|
||||
"md5sum": "0cba453dbf70313d8d63a00700618f52",
|
||||
"filesize": 204865536,
|
||||
"download_url": "https://software.cisco.com/download/home/286119613/type/280775065/release/9.9.2"
|
||||
},
|
||||
{
|
||||
"filename": "asav983.qcow2",
|
||||
"version": "9.8.3",
|
||||
"md5sum": "f9cf40b2d555a1bea6d36bc83f06ea33",
|
||||
"filesize": 199491584,
|
||||
"download_url": "https://software.cisco.com/download/home/286119613/type/280775065/release/9.8.3"
|
||||
},
|
||||
{
|
||||
"filename": "asav981-5.qcow2",
|
||||
"version": "9.8.1-5",
|
||||
@@ -97,6 +111,18 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "9.9.2",
|
||||
"images": {
|
||||
"hda_disk_image": "asav992.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9.8.3",
|
||||
"images": {
|
||||
"hda_disk_image": "asav983.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9.8.1-5",
|
||||
"images": {
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
"usage": "There is no default password and enable password. A default configuration is present.",
|
||||
"port_name_format": "Gi{port1}",
|
||||
"qemu": {
|
||||
"adapter_type": "virtio-net-pci",
|
||||
"adapter_type": "vmxnet3",
|
||||
"adapters": 4,
|
||||
"ram": 3072,
|
||||
"arch": "x86_64",
|
||||
@@ -22,6 +22,13 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "csr1000v-universalk9.16.08.01a-serial.qcow2",
|
||||
"version": "16.8.1a",
|
||||
"md5sum": "91e2572f20c77606d710223511cd279a",
|
||||
"filesize": 890044416,
|
||||
"download_url": "https://software.cisco.com/download/home/284364978/type/282046477"
|
||||
},
|
||||
{
|
||||
"filename": "csr1000v-universalk9.16.07.01-serial.qcow2",
|
||||
"version": "16.7.1",
|
||||
@@ -94,6 +101,12 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "16.8.1a",
|
||||
"images": {
|
||||
"hda_disk_image": "csr1000v-universalk9.16.08.01a-serial.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "16.7.1",
|
||||
"images": {
|
||||
|
||||
@@ -11,19 +11,32 @@
|
||||
"status": "experimental",
|
||||
"maintainer": "GNS3 Team",
|
||||
"maintainer_email": "developers@gns3.net",
|
||||
"usage": "Default username/password: admin/admin, cisco/cisco and lab/lab. There is no default configuration present.",
|
||||
"usage": "Default username/password: admin/admin, cisco/cisco and lab/lab. There is no default configuration present. Interfaces may take several minutes to be usable after appliance boot.",
|
||||
"first_port_name": "MgmtEth0/0/CPU0/0",
|
||||
"port_name_format": "GigabitEthernet0/0/0/{0}",
|
||||
"qemu": {
|
||||
"adapter_type": "e1000",
|
||||
"adapters": 4,
|
||||
"adapter_type": "virtio-net-pci",
|
||||
"adapters": 7,
|
||||
"ram": 16384,
|
||||
"arch": "i386",
|
||||
"arch": "x86_64",
|
||||
"console_type": "telnet",
|
||||
"kvm": "require",
|
||||
"options": "-smp 4"
|
||||
"options": "-smp 4 -cpu host"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "xrv9k-fullk9-x-6.4.2.qcow2",
|
||||
"version": "6.4.2",
|
||||
"md5sum": "6958763192c7bb59a1b8049d377de1b4",
|
||||
"filesize": 1311703040,
|
||||
"download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/6.4.2"
|
||||
},
|
||||
{ "filename": "xrv9k-fullk9-x-6.4.1.qcow2",
|
||||
"version": "6.4.1",
|
||||
"md5sum": "9c56b684e307706005a503e289cb9317",
|
||||
"filesize": 1304887296,
|
||||
"download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/6.4.1"
|
||||
},
|
||||
{
|
||||
"filename": "xrv9k-fullk9-x-6.2.25.qcow2",
|
||||
"version": "6.2.25",
|
||||
@@ -47,6 +60,18 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "6.4.2",
|
||||
"images": {
|
||||
"hda_disk_image": "xrv9k-fullk9-x-6.4.2.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.4.1",
|
||||
"images": {
|
||||
"hda_disk_image": "xrv9k-fullk9-x-6.4.1.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.2.25",
|
||||
"images": {
|
||||
|
||||
@@ -25,6 +25,20 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "nxosv-final.9.2.1.qcow2",
|
||||
"version": "9.2.1",
|
||||
"md5sum": "1d7fa4654602d7ffbf62544edfe71986",
|
||||
"filesize": 1330315264,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.2%25281%2529"
|
||||
},
|
||||
{
|
||||
"filename": "nxosv-final.7.0.3.I7.4.qcow2",
|
||||
"version": "7.0.3.I7.4",
|
||||
"md5sum": "1e980c95ca47045ae45ded6e07fabfb8",
|
||||
"filesize": 985792512,
|
||||
"download_url": "https://software.cisco.com/download/"
|
||||
},
|
||||
{
|
||||
"filename": "nxosv-final.7.0.3.I7.3.qcow2",
|
||||
"version": "7.0.3.I7.3",
|
||||
@@ -78,6 +92,20 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "9.2.1",
|
||||
"images": {
|
||||
"bios_image": "OVMF-20160813.fd",
|
||||
"hda_disk_image": "nxosv-final.9.2.1.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.0.3.I7.4",
|
||||
"images": {
|
||||
"bios_image": "OVMF-20160813.fd",
|
||||
"hda_disk_image": "nxosv-final.7.0.3.I7.4.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.0.3.I7.3",
|
||||
"images": {
|
||||
|
||||
@@ -21,6 +21,15 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "coreos_production_qemu_image.1688.5.3.img",
|
||||
"version": "1688.5.3",
|
||||
"md5sum": "f1015a9573fb6e378d2a5e86b4243acd",
|
||||
"filesize": 867368960,
|
||||
"download_url": "http://stable.release.core-os.net/amd64-usr/1688.5.3/",
|
||||
"direct_download_url": "http://stable.release.core-os.net/amd64-usr/1688.5.3/coreos_production_qemu_image.img.bz2",
|
||||
"compression": "bzip2"
|
||||
},
|
||||
{
|
||||
"filename": "coreos_production_qemu_image.1632.2.1.img",
|
||||
"version": "1632.2.1",
|
||||
@@ -158,10 +167,16 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "1688.5.3",
|
||||
"images": {
|
||||
"hda_disk_image": "coreos_production_qemu_image.1688.5.3.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "1632.2.1",
|
||||
"images": {
|
||||
"hda_disk_image": "coreos_production_qemu_image.1576.4.0.img"
|
||||
"hda_disk_image": "coreos_production_qemu_image.1632.2.1.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@@ -23,13 +23,45 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "cumulus-linux-3.6.2-vx-amd64.qcow2",
|
||||
"version": "3.6.2",
|
||||
"md5sum": "02b0621d68fb2e709b4bcc48748c7b6f",
|
||||
"filesize": 1150746624,
|
||||
"download_url": "https://cumulusnetworks.com/cumulus-vx/download/",
|
||||
"direct_download_url": "https://s3.amazonaws.com/cumulusfiles/CumulusLinux-3.6.2/cumulus-linux-3.6.2-vx-amd64.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "cumulus-linux-3.6.1-vx-amd64.qcow2",
|
||||
"version": "3.6.1",
|
||||
"md5sum": "b2145a689ceea668d003a0d2f2faa045",
|
||||
"filesize": 1068761088,
|
||||
"download_url": "https://cumulusnetworks.com/cumulus-vx/download/",
|
||||
"direct_download_url": "https://s3.amazonaws.com/cumulusfiles/CumulusLinux-3.6.1/cumulus-linux-3.6.1-vx-amd64.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "cumulus-linux-3.6.0-vx-amd64.qcow2",
|
||||
"version": "3.6.0",
|
||||
"md5sum": "b5356b6c922f5620d7e6971d44e9be4d",
|
||||
"filesize": 1105199104,
|
||||
"download_url": "https://cumulusnetworks.com/cumulus-vx/download/",
|
||||
"direct_download_url": "http://cumulusfiles.s3.amazonaws.com/cumulus-linux-3.6.0-vx-amd64.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "cumulus-linux-3.5.3-vx-amd64.qcow2",
|
||||
"version": "3.5.3",
|
||||
"md5sum": "4ecbd7341b214fa3c3b27ab11d1df2fb",
|
||||
"filesize": 1084358656,
|
||||
"download_url": "https://cumulusnetworks.com/cumulus-vx/download/",
|
||||
"direct_download_url": "http://cumulusfiles.s3.amazonaws.com/cumulus-linux-3.5.3-vx-amd64.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "cumulus-linux-3.5.2-vx-amd64.qcow2",
|
||||
"version": "3.5.2",
|
||||
"md5sum": "87d1d8b297e5ebd77924669dfb7e4c9f",
|
||||
"filesize": 996605952,
|
||||
"download_url": "https://cumulusnetworks.com/cumulus-vx/download/",
|
||||
"direct_download_url": "http://cumulusfiles.s3.amazonaws.com/cumulus-linux-3.5.0-vx-amd64.qcow2"
|
||||
"direct_download_url": "http://cumulusfiles.s3.amazonaws.com/cumulus-linux-3.5.3-vx-amd64.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "cumulus-linux-3.5.0-vx-amd64.qcow2",
|
||||
@@ -141,6 +173,30 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "3.6.2",
|
||||
"images": {
|
||||
"hda_disk_image": "cumulus-linux-3.6.2-vx-amd64.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "3.6.1",
|
||||
"images": {
|
||||
"hda_disk_image": "cumulus-linux-3.6.1-vx-amd64.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "3.6.0",
|
||||
"images": {
|
||||
"hda_disk_image": "cumulus-linux-3.6.0-vx-amd64.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "3.5.3",
|
||||
"images": {
|
||||
"hda_disk_image": "cumulus-linux-3.5.3-vx-amd64.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "3.5.2",
|
||||
"images": {
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"name": "DNS",
|
||||
"category": "guest",
|
||||
"description": "This appliance provides DNS using dnsmasq with the local domain set to \"lab\".",
|
||||
"vendor_name": "Ubuntu",
|
||||
"vendor_url": "https://www.ubuntu.com/",
|
||||
"product_name": "DNS",
|
||||
"registry_version": 3,
|
||||
"status": "stable",
|
||||
"maintainer": "Andras Dosztal",
|
||||
"maintainer_email": "developers@gns3.net",
|
||||
"symbol": "linux_guest.svg",
|
||||
"usage": "You can add records by adding entries to the /etc/hosts file in the following format:\n%IP_ADDRESS% %HOSTNAME%.lab %HOSTNAME%\n\nExample:\n192.168.123.10 router1.lab router1",
|
||||
"docker": {
|
||||
"adapters": 1,
|
||||
"image": "adosztal/dns:latest",
|
||||
"console_type": "telnet"
|
||||
}
|
||||
}
|
||||
@@ -26,6 +26,14 @@
|
||||
"options": "-smp 2 -cpu core2duo"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "exosvm-22.5.1.7.iso",
|
||||
"version": "22.5.1.7",
|
||||
"md5sum": "132ac87de368ab55d1f496f292338cd4",
|
||||
"filesize": 51779584,
|
||||
"download_url": "https://github.com/extremenetworks/Virtual_EXOS",
|
||||
"direct_download_url": "https://github.com/extremenetworks/Virtual_EXOS/raw/master/vm-22.5.1.7.iso"
|
||||
},
|
||||
{
|
||||
"filename": "exosvm-22.4.1.4.iso",
|
||||
"version": "22.4.1.4",
|
||||
@@ -100,6 +108,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "22.5.1.7",
|
||||
"images": {
|
||||
"hda_disk_image": "empty8G.qcow2",
|
||||
"cdrom_image": "exosvm-22.5.1.7.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "22.4.1.4",
|
||||
"images": {
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"name": "VOSS VM",
|
||||
"category": "multilayer_switch",
|
||||
"description": "The VOSS VM is a software emulation of a VSP8K switch.",
|
||||
"vendor_name": "Extreme Networks",
|
||||
"vendor_url": "http://www.extremenetworks.com",
|
||||
"documentation_url": "http://www.extremenetworks.com/support/documentation",
|
||||
"product_name": "VOSS_VM",
|
||||
"registry_version": 3,
|
||||
"status": "experimental",
|
||||
"maintainer": "Extreme Networks",
|
||||
"maintainer_email": "voss@extremenetworks.com",
|
||||
"usage": "Boot up and login is rwa/rwa",
|
||||
"symbol": "ethernet_switch.svg",
|
||||
"first_port_name": "Mgmt",
|
||||
"port_name_format": "1/{port1}",
|
||||
"qemu":
|
||||
{
|
||||
"adapter_type": "e1000",
|
||||
"adapters": 9,
|
||||
"ram": 1024,
|
||||
"hda_disk_interface": "ide",
|
||||
"arch": "i386",
|
||||
"console_type": "telnet",
|
||||
"kvm": "allow",
|
||||
"options": "-nographic"
|
||||
},
|
||||
|
||||
"images":
|
||||
[
|
||||
{
|
||||
"filename": "VOSSGNS3.7.1.0.0.qcow2",
|
||||
"version": "voss_7.1.0.0",
|
||||
"md5sum": "7bb2974efe1a1ab857debd9fa894dbe7",
|
||||
"filesize": 193724416,
|
||||
"direct_download_url": "https://stackingtool.extremenetworks.com/github/VOSSGNS3.7.1.0.0.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "VOSSGNS3.7.0.0.0.img",
|
||||
"version": "voss_7.0.0.0",
|
||||
"md5sum": "65fe97461156aa88c836a90be1287649",
|
||||
"filesize": 419430400,
|
||||
"direct_download_url": "https://stackingtool.extremenetworks.com/github/VOSSGNS3.7.0.0.0.img"
|
||||
}
|
||||
],
|
||||
|
||||
"versions":
|
||||
[
|
||||
{
|
||||
"name": "7.1.0.0",
|
||||
"images":
|
||||
{
|
||||
"hda_disk_image": "VOSSGNS3.7.1.0.0.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.0.0.0",
|
||||
"images": {
|
||||
"hda_disk_image": "VOSSGNS3.7.0.0.0.img"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
}
|
||||
@@ -27,6 +27,13 @@
|
||||
"options": "-smp 2 -cpu host"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "BIGIP-13.1.0.5-0.0.5.qcow2",
|
||||
"version": "13.1.0 HF5",
|
||||
"md5sum": "567b70fe36af0f5364883e97e2c08807",
|
||||
"filesize": 4402446336,
|
||||
"download_url": "https://downloads.f5.com/esd/serveDownload.jsp?path=/big-ip/big-ip_v13.x/13.1.0/english/13.1.0.5_virtual-edition/&sw=BIG-IP&pro=big-ip_v13.x&ver=13.1.0&container=13.1.0.5_Virtual-Edition&file=BIGIP-13.1.0.5-0.0.5.ALL.qcow2.zip"
|
||||
},
|
||||
{
|
||||
"filename": "BIGIP-13.1.0.2.0.0.6.qcow2",
|
||||
"version": "13.1.0 HF2",
|
||||
@@ -55,6 +62,13 @@
|
||||
"filesize": 3833135104,
|
||||
"download_url": "https://downloads.f5.com/esd/serveDownload.jsp?path=/big-ip/big-ip_v13.x/13.0.0/english/virtual-edition/&sw=BIG-IP&pro=big-ip_v13.x&ver=13.0.0&container=Virtual-Edition&file=BIGIP-13.0.0.0.0.1645.ALL.qcow2.zip"
|
||||
},
|
||||
{
|
||||
"filename": "BIGIP-12.1.3.4-0.0.2.qcow2",
|
||||
"version": "12.1.3 HF4",
|
||||
"md5sum": "b2ec82816480c18af1d45ee833744ee8",
|
||||
"filesize": 3383164928,
|
||||
"download_url": "https://downloads.f5.com/esd/serveDownload.jsp?path=/big-ip/big-ip_v12.x/12.1.3/english/12.1.3.4_virtual-edition/&sw=BIG-IP&pro=big-ip_v12.x&ver=12.1.3&container=12.1.3.4_Virtual-Edition&file=BIGIP-12.1.3.4-0.0.2.ALL.qcow2.zip"
|
||||
},
|
||||
{
|
||||
"filename": "BIGIP-12.1.2.1.0.271.LTM.qcow2",
|
||||
"version": "12.1.2 HF1",
|
||||
@@ -121,6 +135,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "13.1.0 HF5",
|
||||
"images": {
|
||||
"hda_disk_image": "BIGIP-13.1.0.5-0.0.5.qcow2",
|
||||
"hdb_disk_image": "empty100G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "13.1.0 HF2",
|
||||
"images": {
|
||||
@@ -149,6 +170,13 @@
|
||||
"hdb_disk_image": "empty100G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "12.1.3 HF4",
|
||||
"images": {
|
||||
"hda_disk_image": "BIGIP-12.1.3.4-0.0.2.qcow2",
|
||||
"hdb_disk_image": "empty100G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "12.1.2 HF1",
|
||||
"images": {
|
||||
|
||||
@@ -29,6 +29,13 @@
|
||||
"options": "-smp 2 -cpu host"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "BIG-IQ-5.4.0.2.24.7467.qcow2",
|
||||
"version": "5.4.0.2",
|
||||
"md5sum": "e3e6389438ba1e1676f507658f767e95",
|
||||
"filesize": 3480748032,
|
||||
"download_url": "https://downloads.f5.com/esd/serveDownload.jsp?path=/big-iq/big-iq_cm/5.4.0/english/virtual-edition_base-plus-hf2/&sw=BIG-IQ&pro=big-iq_CM&ver=5.4.0&container=Virtual-Edition_Base-Plus-HF2&file=BIG-IQ-5.4.0.2.24.7467.qcow2.zip"
|
||||
},
|
||||
{
|
||||
"filename": "BIG-IQ-5.4.0.0.0.7437.qcow2",
|
||||
"version": "5.4.0",
|
||||
@@ -81,6 +88,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "5.4.0.2",
|
||||
"images": {
|
||||
"hda_disk_image": "BIG-IQ-5.4.0.2.24.7467.qcow2",
|
||||
"hdb_disk_image": "empty100G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.4.0",
|
||||
"images": {
|
||||
|
||||
@@ -28,12 +28,33 @@
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FAD_KVM-v400-FORTINET.out.kvm-data.qcow2",
|
||||
"version": "4.x.x",
|
||||
"filename": "FAD_KVM-FORTINET.out.kvm-data.qcow2",
|
||||
"version": "ALL",
|
||||
"md5sum": "b7500835594e62d8acb1c6ec43d597c1",
|
||||
"filesize": 30998528,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FAD_KVM-V500-build0056-FORTINET.out.kvm-boot.qcow2",
|
||||
"version": "5.0.1",
|
||||
"md5sum": "8b3b789fb540b2c30066f66bcbe7f307",
|
||||
"filesize": 75038720,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FAD_KVM-V500-build0045-FORTINET.out.kvm-boot.qcow2",
|
||||
"version": "5.0.0",
|
||||
"md5sum": "d7381b3fb7a4534370ce8983e441d888",
|
||||
"filesize": 74383360,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FAD_KVM-V400-build0999-FORTINET.out.kvm-boot.qcow2",
|
||||
"version": "4.8.5",
|
||||
"md5sum": "d7825b8d0962800c37ffa814a6b2ad45",
|
||||
"filesize": 73334784,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FAD_KVM-V400-build0989-FORTINET.out.kvm-boot.qcow2",
|
||||
"version": "4.8.4",
|
||||
@@ -155,123 +176,144 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "5.0.1",
|
||||
"images": {
|
||||
"hda_disk_image": "FAD_KVM-V400-build0989-FORTINET.out.kvm-boot.qcow2",
|
||||
"hdb_disk_image": "FAD_KVM-FORTINET.out.kvm-data.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.0.0",
|
||||
"images": {
|
||||
"hda_disk_image": "FAD_KVM-V400-build0989-FORTINET.out.kvm-boot.qcow2",
|
||||
"hdb_disk_image": "FAD_KVM-FORTINET.out.kvm-data.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.8.5",
|
||||
"images": {
|
||||
"hda_disk_image": "FAD_KVM-V400-build0999-FORTINET.out.kvm-boot.qcow2",
|
||||
"hdb_disk_image": "FAD_KVM-FORTINET.out.kvm-data.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.8.4",
|
||||
"images": {
|
||||
"hda_disk_image": "FAD_KVM-V400-build0989-FORTINET.out.kvm-boot.qcow2",
|
||||
"hdb_disk_image": "FAD_KVM-v400-FORTINET.out.kvm-data.qcow2"
|
||||
"hdb_disk_image": "FAD_KVM-FORTINET.out.kvm-data.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.8.3",
|
||||
"images": {
|
||||
"hda_disk_image": "FAD_KVM-V400-build0983-FORTINET.out.kvm-boot.qcow2",
|
||||
"hdb_disk_image": "FAD_KVM-v400-FORTINET.out.kvm-data.qcow2"
|
||||
"hdb_disk_image": "FAD_KVM-FORTINET.out.kvm-data.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.8.2",
|
||||
"images": {
|
||||
"hda_disk_image": "FAD_KVM-V400-build0977-FORTINET.out.kvm-boot.qcow2",
|
||||
"hdb_disk_image": "FAD_KVM-v400-FORTINET.out.kvm-data.qcow2"
|
||||
"hdb_disk_image": "FAD_KVM-FORTINET.out.kvm-data.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.8.1",
|
||||
"images": {
|
||||
"hda_disk_image": "FAD_KVM-V400-build0970-FORTINET.out.kvm-boot.qcow2",
|
||||
"hdb_disk_image": "FAD_KVM-v400-FORTINET.out.kvm-data.qcow2"
|
||||
"hdb_disk_image": "FAD_KVM-FORTINET.out.kvm-data.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.8.0",
|
||||
"images": {
|
||||
"hda_disk_image": "FAD_KVM-V400-build0937-FORTINET.out.kvm-boot.qcow2",
|
||||
"hdb_disk_image": "FAD_KVM-v400-FORTINET.out.kvm-data.qcow2"
|
||||
"hdb_disk_image": "FAD_KVM-FORTINET.out.kvm-data.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.7.4",
|
||||
"images": {
|
||||
"hda_disk_image": "FAD_KVM-V400-build0858-FORTINET.out.kvm-boot.qcow2",
|
||||
"hdb_disk_image": "FAD_KVM-v400-FORTINET.out.kvm-data.qcow2"
|
||||
"hdb_disk_image": "FAD_KVM-FORTINET.out.kvm-data.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.7.3",
|
||||
"images": {
|
||||
"hda_disk_image": "FAD_KVM-V400-build0849-FORTINET.out.kvm-boot.qcow2",
|
||||
"hdb_disk_image": "FAD_KVM-v400-FORTINET.out.kvm-data.qcow2"
|
||||
"hdb_disk_image": "FAD_KVM-FORTINET.out.kvm-data.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.7.2",
|
||||
"images": {
|
||||
"hda_disk_image": "FAD_KVM-V400-build0844-FORTINET.out.kvm-boot.qcow2",
|
||||
"hdb_disk_image": "FAD_KVM-v400-FORTINET.out.kvm-data.qcow2"
|
||||
"hdb_disk_image": "FAD_KVM-FORTINET.out.kvm-data.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.7.1",
|
||||
"images": {
|
||||
"hda_disk_image": "FAD_KVM-V400-build0832-FORTINET.out.kvm-boot.qcow2",
|
||||
"hdb_disk_image": "FAD_KVM-v400-FORTINET.out.kvm-data.qcow2"
|
||||
"hdb_disk_image": "FAD_KVM-FORTINET.out.kvm-data.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.7.0",
|
||||
"images": {
|
||||
"hda_disk_image": "FAD_KVM-V400-build0828-FORTINET.out.kvm-boot.qcow2",
|
||||
"hdb_disk_image": "FAD_KVM-v400-FORTINET.out.kvm-data.qcow2"
|
||||
"hdb_disk_image": "FAD_KVM-FORTINET.out.kvm-data.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.6.2",
|
||||
"images": {
|
||||
"hda_disk_image": "FAD_KVM-V400-build0679-FORTINET.out.kvm-boot.qcow2",
|
||||
"hdb_disk_image": "FAD_KVM-v400-FORTINET.out.kvm-data.qcow2"
|
||||
"hdb_disk_image": "FAD_KVM-FORTINET.out.kvm-data.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.6.1",
|
||||
"images": {
|
||||
"hda_disk_image": "FAD_KVM-V400-build0677-FORTINET.out.kvm-boot.qcow2",
|
||||
"hdb_disk_image": "FAD_KVM-v400-FORTINET.out.kvm-data.qcow2"
|
||||
"hdb_disk_image": "FAD_KVM-FORTINET.out.kvm-data.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.6.0",
|
||||
"images": {
|
||||
"hda_disk_image": "FAD_KVM-V400-build0660-FORTINET.out.kvm-boot.qcow2",
|
||||
"hdb_disk_image": "FAD_KVM-v400-FORTINET.out.kvm-data.qcow2"
|
||||
"hdb_disk_image": "FAD_KVM-FORTINET.out.kvm-data.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.5.3",
|
||||
"images": {
|
||||
"hda_disk_image": "FAD_KVM-V400-build0605-FORTINET.out.kvm-boot.qcow2",
|
||||
"hdb_disk_image": "FAD_KVM-v400-FORTINET.out.kvm-data.qcow2"
|
||||
"hdb_disk_image": "FAD_KVM-FORTINET.out.kvm-data.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.5.2",
|
||||
"images": {
|
||||
"hda_disk_image": "FAD_KVM-v400-build0597-FORTINET.out.kvm-boot.qcow2",
|
||||
"hdb_disk_image": "FAD_KVM-v400-FORTINET.out.kvm-data.qcow2"
|
||||
"hdb_disk_image": "FAD_KVM-FORTINET.out.kvm-data.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.5.1",
|
||||
"images": {
|
||||
"hda_disk_image": "FAD_KVM-v400-build0581-FORTINET.out.kvm-boot.qcow2",
|
||||
"hdb_disk_image": "FAD_KVM-v400-FORTINET.out.kvm-data.qcow2"
|
||||
"hdb_disk_image": "FAD_KVM-FORTINET.out.kvm-data.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.5.0",
|
||||
"images": {
|
||||
"hda_disk_image": "FAD_KVM-v400-build0560-FORTINET.out.kvm-boot.qcow2",
|
||||
"hdb_disk_image": "FAD_KVM-v400-FORTINET.out.kvm-data.qcow2"
|
||||
"hdb_disk_image": "FAD_KVM-FORTINET.out.kvm-data.qcow2"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -26,6 +26,20 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FAZ_VM64_KVM-v6-build0092-FORTINET.out.kvm.qcow2",
|
||||
"version": "6.0.0",
|
||||
"md5sum": "e870087db55a095c75ddcafe73e1ea27",
|
||||
"filesize": 117940224,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FAZ_VM64_KVM-v5-build1631-FORTINET.out.kvm.qcow2",
|
||||
"version": "5.6.2",
|
||||
"md5sum": "c7f1cf26051b50b86e7e59b99e36756f",
|
||||
"filesize": 105816064,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FAZ_VM64_KVM-v5-build1619-FORTINET.out.kvm.qcow2",
|
||||
"version": "5.6.1",
|
||||
@@ -113,6 +127,20 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "6.0.0",
|
||||
"images": {
|
||||
"hda_disk_image": "FAZ_VM64_KVM-v6-build0092-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.6.2",
|
||||
"images": {
|
||||
"hda_disk_image": "FAZ_VM64_KVM-v5-build1631-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.6.1",
|
||||
"images": {
|
||||
|
||||
@@ -26,6 +26,20 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FAC_VM_KVM-v5-build0163-FORTINET.out.kvm.qcow2",
|
||||
"version": "5.2.2",
|
||||
"md5sum": "e746b3c6c29b0356ec6b90ed14d4b098",
|
||||
"filesize": 71565312,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FAC_VM_KVM-v500-build0161-FORTINET.out.kvm.qcow2",
|
||||
"version": "5.2.1",
|
||||
"md5sum": "c46ad2de4a20296ebd35b3fcc2d81a1d",
|
||||
"filesize": 72536064,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FAC_VM_KVM-v5-build0155-FORTINET.out.kvm.qcow2",
|
||||
"version": "5.2.0",
|
||||
@@ -70,6 +84,20 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "5.2.2",
|
||||
"images": {
|
||||
"hda_disk_image": "FAC_VM_KVM-v5-build0163-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "FAC_VM_KVM-v500-DATADRIVE.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.2.1",
|
||||
"images": {
|
||||
"hda_disk_image": "FAC_VM_KVM-v500-build0161-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "FAC_VM_KVM-v500-DATADRIVE.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.2.0",
|
||||
"images": {
|
||||
|
||||
@@ -26,6 +26,13 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FCHKVM-v400-build0222-FORTINET.out.kvm.qcow2",
|
||||
"version": "4.2.7",
|
||||
"md5sum": "d77790e414f4e2b31c756906a720e681",
|
||||
"filesize": 27631616,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FCHKVM-v400-build0216-FORTINET.out.kvm.qcow2",
|
||||
"version": "4.2.6",
|
||||
@@ -99,6 +106,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "4.2.7",
|
||||
"images": {
|
||||
"hda_disk_image": "FCHKVM-v400-build0222-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty100G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.2.6",
|
||||
"images": {
|
||||
|
||||
@@ -26,6 +26,20 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FGT_VM64_KVM-v6-build0076-FORTINET.out.kvm.qcow2",
|
||||
"version": "6.0.0",
|
||||
"md5sum": "161728b413e097954bd640ade89dfeb1",
|
||||
"filesize": 46104576,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FGT_VM64_KVM-v5-build1575-FORTINET.out.kvm.qcow2",
|
||||
"version": "5.6.4",
|
||||
"md5sum": "c312ea8ec1afffb73858fb1b15c095ef",
|
||||
"filesize": 41594880,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FGT_VM64_KVM-v5-build1547-FORTINET.out.kvm.qcow2",
|
||||
"version": "5.6.3",
|
||||
@@ -183,6 +197,20 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "6.0.0",
|
||||
"images": {
|
||||
"hda_disk_image": "FGT_VM64_KVM-v6-build0076-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.6.4",
|
||||
"images": {
|
||||
"hda_disk_image": "FGT_VM64_KVM-v5-build1575-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.6.3",
|
||||
"images": {
|
||||
|
||||
@@ -26,6 +26,20 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FML_VMKV-64-v54-build0719-FORTINET.out.kvm.qcow2",
|
||||
"version": "5.4.5",
|
||||
"md5sum": "e2f202efd28039a6f1f4ebb7ee69e214",
|
||||
"filesize": 97255424,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FML_VMKV-64-v54-build0714-FORTINET.out.kvm.qcow2",
|
||||
"version": "5.4.4",
|
||||
"md5sum": "6a3155d9cee6af3ecb016e59c0a0765f",
|
||||
"filesize": 93519872,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FML_VMKV-64-v54-build0712-FORTINET.out.kvm.qcow2",
|
||||
"version": "5.4.3",
|
||||
@@ -54,6 +68,13 @@
|
||||
"filesize": 101253120,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FML_VMKV-64-v53-build0653-FORTINET.out.kvm.qcow2",
|
||||
"version": "5.3.12",
|
||||
"md5sum": "aed4dcb17de047860736d8742362a754",
|
||||
"filesize": 89980928,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FML_VMKV-64-v53-build0648-FORTINET.out.kvm.qcow2",
|
||||
"version": "5.3.11",
|
||||
@@ -134,6 +155,20 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "5.4.5",
|
||||
"images": {
|
||||
"hda_disk_image": "FML_VMKV-64-v54-build0719-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.4.4",
|
||||
"images": {
|
||||
"hda_disk_image": "FML_VMKV-64-v54-build0714-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.4.3",
|
||||
"images": {
|
||||
@@ -162,6 +197,13 @@
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.3.12",
|
||||
"images": {
|
||||
"hda_disk_image": "FML_VMKV-64-v53-build0653-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.3.11",
|
||||
"images": {
|
||||
|
||||
@@ -26,6 +26,20 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FMG_VM64_KVM-v6-build0092-FORTINET.out.kvm.qcow2",
|
||||
"version": "6.0.0",
|
||||
"md5sum": "73bfe1bc70124521a524d857646b9c2e",
|
||||
"filesize": 119066624,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FMG_VM64_KVM-v5-build1631-FORTINET.out.kvm.qcow2",
|
||||
"version": "5.6.2",
|
||||
"md5sum": "c81cc247e8eb03249b475fe0e847653e",
|
||||
"filesize": 106946560,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FMG_VM64_KVM-v5-build1619-FORTINET.out.kvm.qcow2",
|
||||
"version": "5.6.1",
|
||||
@@ -113,6 +127,20 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "6.0.0",
|
||||
"images": {
|
||||
"hda_disk_image": "FMG_VM64_KVM-v6-build0092-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.6.2",
|
||||
"images": {
|
||||
"hda_disk_image": "FMG_VM64_KVM-v5-build1631-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.6.1",
|
||||
"images": {
|
||||
|
||||
@@ -27,6 +27,13 @@
|
||||
"options": "-smp 2"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FSA_KVM-v200-build0340-FORTINET.out.kvm.qcow2",
|
||||
"version": "2.5.2",
|
||||
"md5sum": "527f3225bd3fbd4ba23779cc1987d2ed",
|
||||
"filesize": 117834240,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FSA_KVM-v200-build0329-FORTINET.out.kvm.qcow2",
|
||||
"version": "2.5.1",
|
||||
@@ -78,6 +85,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "2.5.2",
|
||||
"images": {
|
||||
"hda_disk_image": "FSA_KVM-v200-build0340-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "FSA_v200-datadrive.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2.5.1",
|
||||
"images": {
|
||||
|
||||
@@ -28,6 +28,27 @@
|
||||
"options": "-smp 4"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FortiSIEM-VA-5.0.0.1201.qcow2",
|
||||
"version": "5.0.0",
|
||||
"md5sum": "1f2f0b1d84e89495fc5b5ca722cb5710",
|
||||
"filesize": 10029432832,
|
||||
"download_url": "https://images-cdn.fortisiem.fortinet.com/VirtualAppliances/latestrelease.html"
|
||||
},
|
||||
{
|
||||
"filename": "FortiSIEM-VA-5.0.0.1201-1.qcow2",
|
||||
"version": "5.0.0",
|
||||
"md5sum": "88e96259f44a82b7c545b82925880513",
|
||||
"filesize": 46858240,
|
||||
"download_url": "https://images-cdn.fortisiem.fortinet.com/VirtualAppliances/latestrelease.html"
|
||||
},
|
||||
{
|
||||
"filename": "FortiSIEM-VA-5.0.0.1201-2.qcow2",
|
||||
"version": "5.0.0",
|
||||
"md5sum": "58d61498e1adc1df062fc12113d42d86",
|
||||
"filesize": 46858240,
|
||||
"download_url": "https://images-cdn.fortisiem.fortinet.com/VirtualAppliances/latestrelease.html"
|
||||
},
|
||||
{
|
||||
"filename": "FortiSIEM-VA-KVM-4.10.0.1102.qcow2",
|
||||
"version": "4.10.0",
|
||||
@@ -72,6 +93,14 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "5.0.0",
|
||||
"images": {
|
||||
"hda_disk_image": "FortiSIEM-VA-5.0.0.1201.qcow2",
|
||||
"hdb_disk_image": "FortiSIEM-VA-5.0.0.1201-1.qcow2",
|
||||
"hdc_disk_image": "FortiSIEM-VA-5.0.0.1201-2.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.10.0",
|
||||
"images": {
|
||||
|
||||
@@ -26,6 +26,27 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FWB_KVM-v500-build1618-FORTINET.out.kvm.qcow2",
|
||||
"version": "5.9.1",
|
||||
"md5sum": "12bafff7bbfbf9a49554c6378f0e1a46",
|
||||
"filesize": 132579840,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FWB_KVM-v500-build1609-FORTINET.out.kvm.qcow2",
|
||||
"version": "5.9.0",
|
||||
"md5sum": "a957ae3d60eabc685fcda015c31a5d01",
|
||||
"filesize": 140837376,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FWB_KVM-v500-build1413-FORTINET.out.kvm.qcow2",
|
||||
"version": "5.8.6",
|
||||
"md5sum": "910fefe796daa5c963b0bde121996306",
|
||||
"filesize": 105775616,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FWB_KVM-v500-build0739-FORTINET.out.kvm-log.qcow2",
|
||||
"version": "5.5.4",
|
||||
@@ -60,9 +81,39 @@
|
||||
"md5sum": "0a613191948d3618ae16cd9f11988448",
|
||||
"filesize": 87162880,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "empty30G.qcow2",
|
||||
"version": "1.0",
|
||||
"md5sum": "3411a599e822f2ac6be560a26405821a",
|
||||
"filesize": 197120,
|
||||
"download_url": "https://sourceforge.net/projects/gns-3/files/Empty%20Qemu%20disk/",
|
||||
"direct_download_url": "http://sourceforge.net/projects/gns-3/files/Empty%20Qemu%20disk/empty30G.qcow2/download"
|
||||
}
|
||||
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "5.9.1",
|
||||
"images": {
|
||||
"hda_disk_image": "FWB_KVM-v500-build1618-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.9.0",
|
||||
"images": {
|
||||
"hda_disk_image": "FWB_KVM-v500-build1609-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.8.6",
|
||||
"images": {
|
||||
"hda_disk_image": "FWB_KVM-v500-build1413-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.5.4",
|
||||
"images": {
|
||||
|
||||
@@ -24,6 +24,14 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FreeNAS-11.1-U4.iso",
|
||||
"version": "11.1 U1",
|
||||
"md5sum": "d75623e5671dbc82f32f4b4f8d46092f",
|
||||
"filesize": 633833472,
|
||||
"download_url": "http://www.freenas.org/download/",
|
||||
"direct_download_url": "https://download.freenas.org/11/11.1-U4/x64/FreeNAS-11.1-U4.iso"
|
||||
},
|
||||
{
|
||||
"filename": "FreeNAS-11.1-U1.iso",
|
||||
"version": "11.1 U1",
|
||||
@@ -66,6 +74,14 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "11.1 U4",
|
||||
"images": {
|
||||
"hda_disk_image": "empty30G.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2",
|
||||
"cdrom_image": "FreeNAS-11.1-U4.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "11.1 U1",
|
||||
"images": {
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"name": "FRR",
|
||||
"category": "router",
|
||||
"description": "FRRouting (FRR) is an IP routing protocol suite for Linux and Unix platforms which includes protocol daemons for BGP, IS-IS, LDP, OSPF, PIM, and RIP.\n\nFRR’s seamless integration with the native Linux/Unix IP networking stacks makes it applicable to a wide variety of use cases including connecting hosts/VMs/containers to the network, advertising network services, LAN switching and routing, Internet access routers, and Internet peering.\n\nThis is an unofficial VM or FRR.",
|
||||
"vendor_name": "FRRouting Project",
|
||||
"vendor_url": "https://frrouting.org",
|
||||
"product_name": "FRR",
|
||||
"registry_version": 3,
|
||||
"status": "stable",
|
||||
"maintainer": "Andras Dosztal",
|
||||
"maintainer_email": "developers@gns3.net",
|
||||
"usage": "Credentials: frr / frr\nIf you exit from the router CLI, you can get back by typing 'vtysh' to the console.",
|
||||
"port_name_format": "ens{port3}",
|
||||
"qemu": {
|
||||
"adapter_type": "virtio-net-pci",
|
||||
"adapters": 8,
|
||||
"ram": 256,
|
||||
"arch": "x86_64",
|
||||
"console_type": "telnet",
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "frr4.0-vm0.1.qcow2",
|
||||
"version": "FRR4.0 - VM0.1",
|
||||
"md5sum": "e1dc58cbb2b71c58051538c07d412493",
|
||||
"filesize": 1670643712,
|
||||
"download_url": "https://sourceforge.net/projects/frr/files/",
|
||||
"direct_download_url": "https://sourceforge.net/projects/frr/files/frr4.0-vm0.1.qcow2.bz2/download",
|
||||
"compression": "bzip2"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "FRR4.0 - VM0.1",
|
||||
"images": {
|
||||
"hda_disk_image": "frr4.0-vm0.1.qcow2"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -4,7 +4,7 @@
|
||||
"description": "The HP VSR1000 Virtual Services Router Series is a software application, running on a server, which provides functionality similar to that of a physical router: robust routing between networked devices using a number of popular routing protocols. It also delivers the critical network services associated with today's enterprise routers such as VPN gateway, firewall and other security and traffic management functions.\n\nThe virtual services router (VSR) application runs on a hypervqcor on the server, and supports VMware vSphere and Linux KVM hypervqcors. From one to eight virtual CPUs are supported, depending on license.\n\nBecause the VSR1000 Series application runs the same HP Comware version 7 operating system as HP switches and routers, it enables significant operational savings. And being virtual, additional agility and ease of deployment is realized, as resources on the VSR can be dynamically allocated and upgraded upon demand as performance requirements grow.\n\nA variety of deployment models are supported including enterprise branch CPE routing, and cloud offload for small to medium workloads.",
|
||||
"vendor_name": "HPE",
|
||||
"vendor_url": "http://www.hpe.com",
|
||||
"documentation_url": "http://h20195.www2.hpe.com/v2/default.aspx?cc=us&lc=en&oid=5443878",
|
||||
"documentation_url": "https://support.hpe.com/hpesc/public/home/documentHome?document_type=135&sp4ts.oid=5195141",
|
||||
"product_name": "VSR1001",
|
||||
"product_url": "https://www.hpe.com/us/en/product-catalog/networking/networking-routers/pip.hpe-flexnetwork-vsr1000-virtual-services-router-series.5443163.html",
|
||||
"registry_version": 3,
|
||||
@@ -20,7 +20,8 @@
|
||||
"arch": "x86_64",
|
||||
"console_type": "vnc",
|
||||
"boot_priority": "c",
|
||||
"kvm": "require"
|
||||
"kvm": "require",
|
||||
"options": "-machine type=pc-1.0"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
@@ -28,56 +29,56 @@
|
||||
"version": "7.10.R0327L01",
|
||||
"md5sum": "907de5140a4a029afe1c517cfc27ecde",
|
||||
"filesize": 138739712,
|
||||
"download_url": "https://h10145.www1.hp.com/Downloads/DownloadSoftware.aspx?SoftwareReleaseUId=22702&ProductNumber=JG811AAE&lang=en&cc=us&prodSeriesId=5443163&SaidNumber="
|
||||
"download_url": "https://h10145.www1.hpe.com/Downloads/DownloadSoftware.aspx?SoftwareReleaseUId=22702&ProductNumber=JG811AAE&lang=en&cc=us&prodSeriesId=5443163&SaidNumber="
|
||||
},
|
||||
{
|
||||
"filename": "VSR1000_HPE-CMW710-R0326-X64.qco",
|
||||
"version": "7.10.R0326",
|
||||
"md5sum": "4153d638bfa72ca72a957ea8682ad0e2",
|
||||
"filesize": 138412032,
|
||||
"download_url": "https://h10145.www1.hp.com/Downloads/SoftwareReleases.aspx?ProductNumber=JG811AAE&lang=en&cc=us&prodSeriesId=5443163&SoftwareReleaseUId=11832&SerialNumber=&PurchaseDate="
|
||||
"download_url": "https://h10145.www1.hpe.com/Downloads/DownloadSoftware.aspx?SoftwareReleaseUId=21985&ProductNumber=JG811AAE&lang=en&cc=us&prodSeriesId=5443163&SaidNumber="
|
||||
},
|
||||
{
|
||||
"filename": "VSR1000_HPE-CMW710-E0325-X64.qco",
|
||||
"version": "7.10.E0325",
|
||||
"md5sum": "a6731f3af86bee9b209a8b342be6bf75",
|
||||
"filesize": 111738880,
|
||||
"download_url": "https://h10145.www1.hp.com/Downloads/SoftwareReleases.aspx?ProductNumber=JG811AAE&lang=en&cc=us&prodSeriesId=5443163&SoftwareReleaseUId=11832&SerialNumber=&PurchaseDate="
|
||||
"download_url": "https://h10145.www1.hpe.com/Downloads/DownloadSoftware.aspx?SoftwareReleaseUId=20278&ProductNumber=JG811AAE&lang=en&cc=us&prodSeriesId=5443163&SaidNumber="
|
||||
},
|
||||
{
|
||||
"filename": "VSR1000_HPE-CMW710-E0518-X64.qco",
|
||||
"version": "7.10.E0518",
|
||||
"md5sum": "4991436442ae706df8041c69778a48df",
|
||||
"filesize": 201588736,
|
||||
"download_url": "https://h10145.www1.hp.com/Downloads/SoftwareReleases.aspx?ProductNumber=JG811AAE&lang=en&cc=us&prodSeriesId=5443163&SoftwareReleaseUId=11832&SerialNumber=&PurchaseDate="
|
||||
"download_url": "https://h10145.www1.hpe.com/Downloads/DownloadSoftware.aspx?SoftwareReleaseUId=21929&ProductNumber=JG811AAE&lang=en&cc=us&prodSeriesId=5443163&SaidNumber="
|
||||
},
|
||||
{
|
||||
"filename": "VSR1000_HPE-CMW710-E0324-X64.qco",
|
||||
"version": "7.10.E0324",
|
||||
"md5sum": "7a0ff32281284c042591c6181426effd",
|
||||
"filesize": 111411200,
|
||||
"download_url": "https://h10145.www1.hp.com/Downloads/SoftwareReleases.aspx?ProductNumber=JG811AAE&lang=en&cc=us&prodSeriesId=5443163&SoftwareReleaseUId=11832&SerialNumber=&PurchaseDate="
|
||||
"download_url": "https://h10145.www1.hpe.com/Downloads/DownloadSoftware.aspx?SoftwareReleaseUId=18977&ProductNumber=JG811AAE&lang=en&cc=us&prodSeriesId=5443163&SaidNumber="
|
||||
},
|
||||
{
|
||||
"filename": "VSR1000_HPE-CMW710-E0322P01-X64.qco",
|
||||
"version": "7.10.E0322P01",
|
||||
"md5sum": "0aa2dbe5910fa64eb8c623e083b21a5e",
|
||||
"filesize": 110428160,
|
||||
"download_url": "https://h10145.www1.hp.com/Downloads/SoftwareReleases.aspx?ProductNumber=JG811AAE&lang=en&cc=us&prodSeriesId=5443163&SoftwareReleaseUId=11832&SerialNumber=&PurchaseDate="
|
||||
"download_url": "https://h10145.www1.hpe.com/Downloads/DownloadSoftware.aspx?SoftwareReleaseUId=18976&ProductNumber=JG811AAE&lang=en&cc=us&prodSeriesId=5443163&SaidNumber="
|
||||
},
|
||||
{
|
||||
"filename": "VSR1000_HPE-CMW710-E0322-X64.qco",
|
||||
"version": "7.10.E0322",
|
||||
"md5sum": "05e0dab6b7aa489f627448b4d79b1f50",
|
||||
"filesize": 113770496,
|
||||
"download_url": "https://h10145.www1.hp.com/Downloads/SoftwareReleases.aspx?ProductNumber=JG811AAE&lang=en&cc=us&prodSeriesId=5443163&SoftwareReleaseUId=11832&SerialNumber=&PurchaseDate="
|
||||
"download_url": "https://h10145.www1.hpe.com/Downloads/DownloadSoftware.aspx?SoftwareReleaseUId=18975&ProductNumber=JG811AAE&lang=en&cc=us&prodSeriesId=5443163&SaidNumber="
|
||||
},
|
||||
{
|
||||
"filename": "VSR1000_HPE-CMW710-E0321P01-X64.qco",
|
||||
"version": "7.10.E0321P01",
|
||||
"md5sum": "26d4375fafeedc81f298f29f593de252",
|
||||
"filesize": 113639424,
|
||||
"download_url": "https://h10145.www1.hp.com/Downloads/SoftwareReleases.aspx?ProductNumber=JG811AAE&lang=en&cc=us&prodSeriesId=5443163&SoftwareReleaseUId=11832&SerialNumber=&PurchaseDate="
|
||||
"download_url": "https://h10145.www1.hpe.com/Downloads/DownloadSoftware.aspx?SoftwareReleaseUId=16838&ProductNumber=JG811AAE&lang=en&cc=us&prodSeriesId=5443163&SaidNumber="
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
|
||||
@@ -24,6 +24,24 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "ipfire-2.19.1gb-ext4-scon.x86_64-full-core119.img",
|
||||
"version": "2.19.119",
|
||||
"md5sum": "b57be976ff54569b71eae4ee66634b0d",
|
||||
"filesize": 1063256064,
|
||||
"download_url": "http://www.ipfire.org/download",
|
||||
"direct_download_url": "https://downloads.ipfire.org/releases/ipfire-2.x/2.19-core119/ipfire-2.19.1gb-ext4-scon.x86_64-full-core119.img.gz",
|
||||
"compression": "gzip"
|
||||
},
|
||||
{
|
||||
"filename": "ipfire-2.19.1gb-ext4-scon.x86_64-full-core118.img",
|
||||
"version": "2.19.118",
|
||||
"md5sum": "4dbeb474848d87c16c20ff4e31feb204",
|
||||
"filesize": 1063256064,
|
||||
"download_url": "http://www.ipfire.org/download",
|
||||
"direct_download_url": "https://downloads.ipfire.org/releases/ipfire-2.x/2.19-core118/ipfire-2.19.1gb-ext4-scon.x86_64-full-core118.img.gz",
|
||||
"compression": "gzip"
|
||||
},
|
||||
{
|
||||
"filename": "ipfire-2.19.1gb-ext4-scon.x86_64-full-core117.img",
|
||||
"version": "2.19.117",
|
||||
@@ -62,6 +80,18 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "2.19.119",
|
||||
"images": {
|
||||
"hda_disk_image": "ipfire-2.19.1gb-ext4-scon.x86_64-full-core119.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2.19.118",
|
||||
"images": {
|
||||
"hda_disk_image": "ipfire-2.19.1gb-ext4-scon.x86_64-full-core118.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2.19.117",
|
||||
"images": {
|
||||
|
||||
@@ -18,13 +18,31 @@
|
||||
"qemu": {
|
||||
"adapter_type": "e1000",
|
||||
"adapters": 2,
|
||||
"ram": 2048,
|
||||
"ram": 1024,
|
||||
"arch": "x86_64",
|
||||
"console_type": "telnet",
|
||||
"kvm": "require",
|
||||
"options": "-nographic -enable-kvm"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "junos-vmx-x86-64-17.4R1.16.qcow2",
|
||||
"version": "17.4R1.16-KVM",
|
||||
"md5sum": "85239193e852d643dfd9d5c257240bdf",
|
||||
"filesize": 1325400064
|
||||
},
|
||||
{
|
||||
"filename": "vmxhdd-17.4R1.16.img",
|
||||
"version": "17.4R1.16-KVM",
|
||||
"md5sum": "69e9821ebc59367527336d8bcecd171c",
|
||||
"filesize": 108986368
|
||||
},
|
||||
{
|
||||
"filename": "metadata-usb-re-17.4R1.16.img",
|
||||
"version": "17.4R1.16-KVM",
|
||||
"md5sum": "a5b125822b798c7167c35966ea00229a",
|
||||
"filesize": 16777216
|
||||
},
|
||||
{
|
||||
"filename": "vcp_17.1R1.8-disk1.vmdk",
|
||||
"version": "17.1R1.8-ESXi",
|
||||
@@ -261,9 +279,35 @@
|
||||
"md5sum": "af48f7e03f94ffcfeecd15a59a4f1567",
|
||||
"filesize": 16777216,
|
||||
"download_url": "http://www.juniper.net/us/en/products-services/routing/mx-series/vmx/"
|
||||
},
|
||||
{
|
||||
"filename": "junos-vmx-x86-64-15.1F6.9.qcow2",
|
||||
"version": "15.1F6.9-KVM",
|
||||
"md5sum": "595f532b95d6d98590d0375a3d6d14b6",
|
||||
"filesize": 994181120
|
||||
},
|
||||
{
|
||||
"filename": "vmxhdd-15.1F6.9.img",
|
||||
"version": "15.1F6.9-KVM",
|
||||
"md5sum": "bae35d0bb72946d1e91ff9c5e7ddbf86",
|
||||
"filesize": 108986368
|
||||
},
|
||||
{
|
||||
"filename": "metadata-usb-re-15.1F6.9.img",
|
||||
"version": "15.1F6.9-KVM",
|
||||
"md5sum": "15238c3dbc987d1a641c919efe2731c5",
|
||||
"filesize": 16777216
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "17.4R1.16-KVM",
|
||||
"images": {
|
||||
"hda_disk_image": "junos-vmx-x86-64-17.4R1.16.qcow2",
|
||||
"hdb_disk_image": "vmxhdd-17.4R1.16.img",
|
||||
"hdc_disk_image": "metadata-usb-re-17.4R1.16.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "17.1R1.8-ESXi",
|
||||
"images": {
|
||||
@@ -367,6 +411,14 @@
|
||||
"hdb_disk_image": "vmxhdd-15.1.img",
|
||||
"hdc_disk_image": "metadata-usb-15.1.img"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "15.1F6.9",
|
||||
"images": {
|
||||
"hda_disk_image": "junos-vmx-x86-64-15.1F6.9.qcow2",
|
||||
"hdb_disk_image": "vmxhdd-15.1F6.9.img",
|
||||
"hdc_disk_image": "metadata-usb-re-15.1F6.9.img"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -25,13 +25,20 @@
|
||||
"options": "-nographic -enable-kvm -smp cpus=3"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "vFPC-20171213.img",
|
||||
"version": "17.4R1.16-KVM",
|
||||
"md5sum": "848a6256da7296e8fede368a258c68e4",
|
||||
"filesize": 2313158656,
|
||||
"download_url": "http://www.juniper.net/us/en/products-services/routing/mx-series/vmx/"
|
||||
},
|
||||
{
|
||||
"filename": "vfpc_17.1R1.8-disk1.vmdk",
|
||||
"version": "17.1R1.8-ESXi",
|
||||
"md5sum": "169dd487b8547d58b12b2918a5667360",
|
||||
"filesize": 102820352,
|
||||
"download_url": "http://www.juniper.net/us/en/products-services/routing/mx-series/vmx/"
|
||||
},
|
||||
},
|
||||
{
|
||||
"filename": "vFPC-20170216.img",
|
||||
"version": "17.1R1.8-KVM",
|
||||
@@ -108,17 +115,30 @@
|
||||
"md5sum": "5ccf252002184a21413cad23fd239c3f",
|
||||
"filesize": 2313158656,
|
||||
"download_url": "http://www.juniper.net/us/en/products-services/routing/mx-series/vmx/"
|
||||
},
|
||||
},
|
||||
{
|
||||
"filename": "vFPC-15.1F6.9.img",
|
||||
"version": "15.1F6.9-KVM",
|
||||
"md5sum": "7328501fdfa9b160955bc136664f1e86",
|
||||
"filesize": 2313158656,
|
||||
"download_url": "http://www.juniper.net/us/en/products-services/routing/mx-series/vmx/"
|
||||
},
|
||||
{
|
||||
"filename": "vFPC-20151203.img",
|
||||
"version": "15.1F4.15",
|
||||
"md5sum": "b3faa91b4d20836a9a6dd6bad2629dd1",
|
||||
"filesize": 2313158656,
|
||||
"download_url": "http://www.juniper.net/us/en/products-services/routing/mx-series/vmx/"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
||||
"versions": [
|
||||
{
|
||||
"name": "17.4R1.16-KVM",
|
||||
"images": {
|
||||
"hda_disk_image": "vFPC-20171213.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "17.1R1.8-ESXi",
|
||||
"images": {
|
||||
@@ -191,12 +211,18 @@
|
||||
"hda_disk_image": "vFPC-20160617.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "15.1F6.9-KVM",
|
||||
"images": {
|
||||
"hda_disk_image": "vFPC-15.1F6.9.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "15.1F4.15",
|
||||
"images": {
|
||||
"hda_disk_image": "vFPC-20151203.img"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
]
|
||||
}
|
||||
@@ -24,6 +24,13 @@
|
||||
"options": "-nographic"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "cosim_20180212.qcow2",
|
||||
"version": "17.4R1",
|
||||
"md5sum": "0372e9c1b7df3608099186ab8cbbf2ad",
|
||||
"filesize": 1911291904,
|
||||
"download_url": "https://www.juniper.net/us/en/dm/free-vqfx-trial/"
|
||||
},
|
||||
{
|
||||
"filename": "vqfx10k-pfe-20160609-2.vmdk",
|
||||
"version": "15.1X53-D60",
|
||||
@@ -33,6 +40,12 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "17.4R1",
|
||||
"images": {
|
||||
"hda_disk_image": "cosim_20180212.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "15.1X53-D60",
|
||||
"images": {
|
||||
|
||||
@@ -24,6 +24,13 @@
|
||||
"options": "-nographic -smp 2"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "jinstall-vqfx-10-f-17.4R1.16.img",
|
||||
"version": "17.4R1",
|
||||
"md5sum": "dd83313b0f5beaf68488ed3d5e1e5240",
|
||||
"filesize": 553910272,
|
||||
"download_url": "https://www.juniper.net/us/en/dm/free-vqfx-trial/"
|
||||
},
|
||||
{
|
||||
"filename": "vqfx10k-re-15.1X53-D60.vmdk",
|
||||
"version": "15.1X53-D60",
|
||||
@@ -33,6 +40,12 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "17.4R1",
|
||||
"images": {
|
||||
"hda_disk_image": "jinstall-vqfx-10-f-17.4R1.16.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "15.1X53-D60",
|
||||
"images": {
|
||||
|
||||
@@ -24,6 +24,13 @@
|
||||
"options": "-smp 2"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "junos-media-vsrx-vmdisk-18.1R1.9.qcow2",
|
||||
"version": "18.1R1",
|
||||
"md5sum": "4e9393142afc675d5d3d03c5071e70ce",
|
||||
"filesize": 4418961408,
|
||||
"download_url": "https://www.juniper.net/us/en/dm/free-vsrx-trial/"
|
||||
},
|
||||
{
|
||||
"filename": "media-vsrx-vmdisk-17.4R1.16.qcow2",
|
||||
"version": "17.4R1",
|
||||
@@ -31,6 +38,13 @@
|
||||
"filesize": 3965386752,
|
||||
"download_url": "https://www.juniper.net/us/en/dm/free-vsrx-trial/"
|
||||
},
|
||||
{
|
||||
"filename": "media-vsrx-vmdisk-17.3R2.10.qcow2",
|
||||
"version": "17.3R2",
|
||||
"md5sum": "8f2adfb0515913e0c7db32628a5deb3e",
|
||||
"filesize": 3784572928,
|
||||
"download_url": "https://www.juniper.net/us/en/dm/free-vsrx-trial/"
|
||||
},
|
||||
{
|
||||
"filename": "media-vsrx-vmdisk-17.3R1.10.qcow2",
|
||||
"version": "17.3R1",
|
||||
@@ -38,6 +52,13 @@
|
||||
"filesize": 3782541312,
|
||||
"download_url": "https://www.juniper.net/us/en/dm/free-vsrx-trial/"
|
||||
},
|
||||
{
|
||||
"filename": "media-vsrx-vmdisk-15.1X49-D130.6.qcow2",
|
||||
"version": "15.1X49-D130",
|
||||
"md5sum": "8ad03f4067b3fe5d2ed378733a5e8541",
|
||||
"filesize": 3300917248,
|
||||
"download_url": "https://www.juniper.net/us/en/dm/free-vsrx-trial/"
|
||||
},
|
||||
{
|
||||
"filename": "media-vsrx-vmdisk-15.1X49-D120.3.qcow2",
|
||||
"version": "15.1X49-D120",
|
||||
@@ -124,18 +145,36 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "18.1R1",
|
||||
"images": {
|
||||
"hda_disk_image": "junos-media-vsrx-vmdisk-18.1R1.9.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "17.4R1",
|
||||
"images": {
|
||||
"hda_disk_image": "media-vsrx-vmdisk-17.4R1.16.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "17.3R2",
|
||||
"images": {
|
||||
"hda_disk_image": "media-vsrx-vmdisk-17.3R2.10.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "17.3R1",
|
||||
"images": {
|
||||
"hda_disk_image": "media-vsrx-vmdisk-17.3R1.10.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "15.1X49-D130",
|
||||
"images": {
|
||||
"hda_disk_image": "media-vsrx-vmdisk-15.1X49-D130.6.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "15.1X49-D120",
|
||||
"images": {
|
||||
|
||||
@@ -20,6 +20,22 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "kali-linux-2018.3-amd64.iso",
|
||||
"version": "2018.3",
|
||||
"md5sum": "6dc3e57177249f73492b9edb95d082d1",
|
||||
"filesize": 3188391936,
|
||||
"download_url": "https://www.kali.org/downloads/",
|
||||
"direct_download_url": "http://cdimage.kali.org/kali-2018.3/kali-linux-2018.3-amd64.iso"
|
||||
},
|
||||
{
|
||||
"filename": "kali-linux-2018.1-amd64.iso",
|
||||
"version": "2018.1",
|
||||
"md5sum": "a3feb90df5b71b3c7f4a02bdddf221d7",
|
||||
"filesize": 3028500480,
|
||||
"download_url": "https://www.kali.org/downloads/",
|
||||
"direct_download_url": "http://cdimage.kali.org/kali-2018.1/kali-linux-2018.1-amd64.iso"
|
||||
},
|
||||
{
|
||||
"filename": "kali-linux-2017.3-amd64.iso",
|
||||
"version": "2017.3",
|
||||
@@ -70,6 +86,17 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "2018.3",
|
||||
"images": {
|
||||
"cdrom_image": "kali-linux-2018.3-amd64.iso"
|
||||
}
|
||||
}, {
|
||||
"name": "2018.1",
|
||||
"images": {
|
||||
"cdrom_image": "kali-linux-2018.1-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2017.3",
|
||||
"images": {
|
||||
|
||||
@@ -24,6 +24,14 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "kerio-connect-appliance-9.2.6-3851-p1-vmware-amd64-disk1.vmdk",
|
||||
"version": "9.2.6p1",
|
||||
"md5sum": "c6ed064114c6fd70608b7951b707528c",
|
||||
"filesize": 625852004,
|
||||
"download_url": "http://www.kerio.com/support/kerio-connect",
|
||||
"direct_download_url": "http://cdn.kerio.com/dwn/connect/connect-9.2.6-3851/kerio-connect-appliance-9.2.6-3851-p1-vmware-amd64-disk1.vmdk"
|
||||
},
|
||||
{
|
||||
"filename": "kerio-connect-appliance-9.2.5-3336-p3-vmware-amd64-disk1.vmdk",
|
||||
"version": "9.2.5p3",
|
||||
@@ -68,7 +76,13 @@
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "9.2.5",
|
||||
"name": "9.2.6p1",
|
||||
"images": {
|
||||
"hda_disk_image": "kerio-connect-appliance-9.2.6-3851-p1-vmware-amd64-disk1.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9.2.5p3",
|
||||
"images": {
|
||||
"hda_disk_image": "kerio-connect-appliance-9.2.5-3336-p3-vmware-amd64-disk1.vmdk"
|
||||
}
|
||||
|
||||
@@ -23,6 +23,14 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "kerio-control-appliance-9.2.5-2641-p5-vmware-disk1.vmdk",
|
||||
"version": "9.2.5p5",
|
||||
"md5sum": "fbb2824eb91ca2502c952c2e9c4e635d",
|
||||
"filesize": 190706688,
|
||||
"download_url": "http://www.kerio.com/support/kerio-control",
|
||||
"direct_download_url": "http://cdn.kerio.com/dwn/control/control-9.2.5-2641/kerio-control-appliance-9.2.5-2641-p5-vmware-disk1.vmdk"
|
||||
},
|
||||
{
|
||||
"filename": "kerio-control-appliance-9.2.4-2223-vmware-disk1.vmdk",
|
||||
"version": "9.2.4",
|
||||
@@ -63,6 +71,12 @@
|
||||
"direct_download_url": "http://cdn.kerio.com/dwn/control/control-9.1.4-1535/kerio-control-appliance-9.1.4-1535-vmware.vmdk" }
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "9.2.5p5",
|
||||
"images": {
|
||||
"hda_disk_image": "kerio-control-appliance-9.2.5-2641-p5-vmware-disk1.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9.2.4",
|
||||
"images": {
|
||||
|
||||
@@ -24,6 +24,14 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "kerio-operator-appliance-2.6.2-9085-vmware-disk1.vmdk",
|
||||
"version": "2.6.2",
|
||||
"md5sum": "abdfa7697e568b5d9a6396e11292e52a",
|
||||
"filesize": 306665472,
|
||||
"download_url": "http://www.kerio.com/support/kerio-operator",
|
||||
"direct_download_url": "http://cdn.kerio.com/dwn/operator/operator-2.6.2-9085/kerio-operator-appliance-2.6.2-9085-vmware-disk1.vmdk"
|
||||
},
|
||||
{
|
||||
"filename": "kerio-operator-appliance-2.6.0-8413-vmware-disk1.vmdk",
|
||||
"version": "2.6.0",
|
||||
@@ -66,6 +74,12 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "2.6.2",
|
||||
"images": {
|
||||
"hda_disk_image": "kerio-operator-appliance-2.6.2-9085-vmware-disk1.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2.6.0",
|
||||
"images": {
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"name": "Toolbox",
|
||||
"category": "guest",
|
||||
"description": "This appliance contains server side software for secondary management of network devices:\n- www (nginx) \n- ftp (vsftpd)\n- tftp (tftpd)\n- syslog (rsyslog)\n- dhcp (isc-dhcpd)\n- snmp server (snmpd + snmptrapd)",
|
||||
"vendor_name": "Ubuntu",
|
||||
"vendor_url": "https://www.ubuntu.com/",
|
||||
"product_name": "Networkers' toolbox",
|
||||
"registry_version": 3,
|
||||
"status": "stable",
|
||||
"maintainer": "Andras Dosztal",
|
||||
"maintainer_email": "developers@gns3.net",
|
||||
"symbol": "linux_guest.svg",
|
||||
"usage": "Root password: gns3",
|
||||
"docker": {
|
||||
"adapters": 1,
|
||||
"image": "adosztal/net_toolbox:latest",
|
||||
"console_type": "telnet"
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@
|
||||
"symbol": "linux_guest.svg",
|
||||
"docker": {
|
||||
"adapters": 1,
|
||||
"image": "gns3/network_automation:latest",
|
||||
"image": "adosztal/network_automation:latest",
|
||||
"console_type": "telnet"
|
||||
}
|
||||
}
|
||||
@@ -25,18 +25,31 @@
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "OPNsense-17.7-OpenSSL-nano-amd64.img",
|
||||
"version": "17.7",
|
||||
"md5sum": "14cde5c7a15b2298a242238ad3c3b65a",
|
||||
"filesize": 3221233664,
|
||||
"download_url": "https://opnsense.org/download/"
|
||||
"filename": "OPNsense-18.1.6-OpenSSL-nano-amd64.img",
|
||||
"version": "18.1.6",
|
||||
"md5sum": "042f328380ad0c8008759c43435e8843",
|
||||
"filesize": 272003136,
|
||||
"download_url": "https://opnsense.c0urier.net/releases/18.1/"
|
||||
},
|
||||
{
|
||||
"filename": "OPNsense-17.7.5-OpenSSL-nano-amd64.img",
|
||||
"version": "17.7.5",
|
||||
"md5sum": "6ec5b7f99cc727f904bbf2aaadcab0b8",
|
||||
"filesize": 237038601,
|
||||
"download_url": "https://opnsense.c0urier.net/releases/17.7/"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "17.7",
|
||||
"name": "18.1.6",
|
||||
"images": {
|
||||
"hda_disk_image": "OPNsense-17.7-OpenSSL-nano-amd64.img"
|
||||
"hda_disk_image": "OPNsense-18.1.6-OpenSSL-nano-amd64.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "17.7.5",
|
||||
"images": {
|
||||
"hda_disk_image": "OPNsense-17.7.5-OpenSSL-nano-amd64.img"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -1,123 +1,123 @@
|
||||
{
|
||||
"name": "PA-VM",
|
||||
"category": "firewall",
|
||||
"description": "The VM-Series combines next-generation firewall security and advanced threat prevention to protect your virtualized environments from advanced cyberthreats. The VM-Series natively analyzes all traffic in a single pass to determine the application identity, the content within, and the user identity.",
|
||||
"vendor_name": "Palo Alto Networks",
|
||||
"vendor_url": "http://www.paloaltonetworks.com/",
|
||||
"documentation_url": "https://www.paloaltonetworks.com/documentation/80/virtualization/virtualization",
|
||||
"product_name": "PAN VM-Series Firewall",
|
||||
"product_url": "https://www.paloaltonetworks.com/products/secure-the-network/virtualized-next-generation-firewall/vm-series",
|
||||
"registry_version": 3,
|
||||
"status": "experimental",
|
||||
"maintainer": "Community",
|
||||
"maintainer_email": "",
|
||||
"usage": "Default Username: admin\r\nDefault Password: admin\r\nPAN-VM goes through several iterations of host prompts during boot. This is normal and expected.\r\nLogin is available when prompt is PA-VM login:\r\n\r\nGetting Started:\r\nTo configure a static IP address at the console enter the following commands:\r\n\r\nconfigure\r\nset deviceconfig system ip-address <Static IP> netmask <Netmask> default-gateway <Gateway IP> type static\r\nset deviceconfig system dns-setting servers primary <DNS Server IP> secondary <DNS Server IP>\r\ncommit\r\n",
|
||||
"symbol": "pan-vm-fw.svg",
|
||||
"first_port_name": "management",
|
||||
"port_name_format": "ethernet1/{port1}",
|
||||
"qemu": {
|
||||
"adapter_type": "virtio-net-pci",
|
||||
"adapters": 25,
|
||||
"ram": 4096,
|
||||
"arch": "x86_64",
|
||||
"console_type": "telnet",
|
||||
"hda_disk_interface": "virtio",
|
||||
"kvm": "require",
|
||||
"options": "-smp 2"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "PA-VM-ESX-8.1.0-disk1.vmdk",
|
||||
"version": "8.1.0",
|
||||
"md5sum": "49af8e8225c2e90414bde0be15eaf421",
|
||||
"filesize": 2281454080,
|
||||
"download_url": "https://support.paloaltonetworks.com/Updates/SoftwareUpdates/"
|
||||
},
|
||||
{
|
||||
"filename": "PA-VM-KVM-8.1.0.qcow2",
|
||||
"version": "8.1.0",
|
||||
"md5sum": "459558515b965b2e43fde2842abbae66",
|
||||
"filesize": 2260467712,
|
||||
"download_url": "https://support.paloaltonetworks.com/Updates/SoftwareUpdates/"
|
||||
},
|
||||
{
|
||||
"filename": "PA-VM-ESX-8.0.0-disk1.vmdk",
|
||||
"version": "8.0.0",
|
||||
"md5sum": "a505fb1dbcc855ecf98630fd5d329f9a",
|
||||
"filesize": 2002713088,
|
||||
"download_url": "https://support.paloaltonetworks.com/Updates/SoftwareUpdates/"
|
||||
},
|
||||
{
|
||||
"filename": "PA-VM-KVM-8.0.0.qcow2",
|
||||
"version": "8.0.0",
|
||||
"md5sum": "b6a1ddc8552aff87f05f9c0d4cb54dc3",
|
||||
"filesize": 1987444736,
|
||||
"download_url": "https://support.paloaltonetworks.com/Updates/SoftwareUpdates/"
|
||||
},
|
||||
{
|
||||
"filename": "PA-VM-ESX-7.1.0-disk1.vmdk",
|
||||
"version": "7.1.0 (ESX)",
|
||||
"md5sum": "e044dc649b7146ee4f619edb0e5f6675",
|
||||
"filesize": 1871149056,
|
||||
"download_url": "https://support.paloaltonetworks.com/Updates/SoftwareUpdates/"
|
||||
},
|
||||
{
|
||||
"filename": "PA-VM-KVM-7.1.0.qcow2",
|
||||
"version": "7.1.0",
|
||||
"md5sum": "da300253709740068927408239c2e321",
|
||||
"filesize": 1858797568,
|
||||
"download_url": "https://support.paloaltonetworks.com/Updates/SoftwareUpdates/"
|
||||
},
|
||||
{
|
||||
"filename": "PA-VM-ESX-6.1.0-disk1.vmdk",
|
||||
"version": "6.1.0 (ESX)",
|
||||
"md5sum": "64b1e81cd54008318235832ea6d71424",
|
||||
"filesize": 2959736832,
|
||||
"download_url": "https://support.paloaltonetworks.com/Updates/SoftwareUpdates/"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "8.1.0 (ESX)",
|
||||
"images": {
|
||||
"hda_disk_image": "PA-VM-ESX-8.1.0-disk1.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "8.1.0",
|
||||
"images": {
|
||||
"hda_disk_image": "PA-VM-KVM-8.1.0.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "8.0.0 (ESX)",
|
||||
"images": {
|
||||
"hda_disk_image": "PA-VM-ESX-8.0.0-disk1.vmdk2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "8.0.0",
|
||||
"images": {
|
||||
"hda_disk_image": "PA-VM-KVM-8.0.0.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.1.0 (ESX)",
|
||||
"images": {
|
||||
"hda_disk_image": "PA-VM-ESX-7.1.0-disk1.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.1.0",
|
||||
"images": {
|
||||
"hda_disk_image": "PA-VM-KVM-7.1.0.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.1.0 (ESX)",
|
||||
"images": {
|
||||
"hda_disk_image": "PA-VM-ESX-6.1.0-disk1.vmdk"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
{
|
||||
"name": "PA-VM",
|
||||
"category": "firewall",
|
||||
"description": "The VM-Series combines next-generation firewall security and advanced threat prevention to protect your virtualized environments from advanced cyberthreats. The VM-Series natively analyzes all traffic in a single pass to determine the application identity, the content within, and the user identity.",
|
||||
"vendor_name": "Palo Alto Networks",
|
||||
"vendor_url": "http://www.paloaltonetworks.com/",
|
||||
"documentation_url": "https://www.paloaltonetworks.com/documentation/80/virtualization/virtualization",
|
||||
"product_name": "PAN VM-Series Firewall",
|
||||
"product_url": "https://www.paloaltonetworks.com/products/secure-the-network/virtualized-next-generation-firewall/vm-series",
|
||||
"registry_version": 3,
|
||||
"status": "experimental",
|
||||
"maintainer": "Community",
|
||||
"maintainer_email": "",
|
||||
"usage": "Default Username: admin\r\nDefault Password: admin\r\nPAN-VM goes through several iterations of host prompts during boot. This is normal and expected.\r\nLogin is available when prompt is PA-VM login:\r\n\r\nGetting Started:\r\nTo configure a static IP address at the console enter the following commands:\r\n\r\nconfigure\r\nset deviceconfig system ip-address <Static IP> netmask <Netmask> default-gateway <Gateway IP> type static\r\nset deviceconfig system dns-setting servers primary <DNS Server IP> secondary <DNS Server IP>\r\ncommit\r\n",
|
||||
"symbol": "pan-vm-fw.svg",
|
||||
"first_port_name": "management",
|
||||
"port_name_format": "ethernet1/{port1}",
|
||||
"qemu": {
|
||||
"adapter_type": "virtio-net-pci",
|
||||
"adapters": 25,
|
||||
"ram": 4096,
|
||||
"arch": "x86_64",
|
||||
"console_type": "telnet",
|
||||
"hda_disk_interface": "virtio",
|
||||
"kvm": "require",
|
||||
"options": "-smp 2"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "PA-VM-ESX-8.1.0-disk1.vmdk",
|
||||
"version": "8.1.0",
|
||||
"md5sum": "49af8e8225c2e90414bde0be15eaf421",
|
||||
"filesize": 2281454080,
|
||||
"download_url": "https://support.paloaltonetworks.com/Updates/SoftwareUpdates/"
|
||||
},
|
||||
{
|
||||
"filename": "PA-VM-KVM-8.1.0.qcow2",
|
||||
"version": "8.1.0",
|
||||
"md5sum": "459558515b965b2e43fde2842abbae66",
|
||||
"filesize": 2260467712,
|
||||
"download_url": "https://support.paloaltonetworks.com/Updates/SoftwareUpdates/"
|
||||
},
|
||||
{
|
||||
"filename": "PA-VM-ESX-8.0.0-disk1.vmdk",
|
||||
"version": "8.0.0",
|
||||
"md5sum": "a505fb1dbcc855ecf98630fd5d329f9a",
|
||||
"filesize": 2002713088,
|
||||
"download_url": "https://support.paloaltonetworks.com/Updates/SoftwareUpdates/"
|
||||
},
|
||||
{
|
||||
"filename": "PA-VM-KVM-8.0.0.qcow2",
|
||||
"version": "8.0.0",
|
||||
"md5sum": "b6a1ddc8552aff87f05f9c0d4cb54dc3",
|
||||
"filesize": 1987444736,
|
||||
"download_url": "https://support.paloaltonetworks.com/Updates/SoftwareUpdates/"
|
||||
},
|
||||
{
|
||||
"filename": "PA-VM-ESX-7.1.0-disk1.vmdk",
|
||||
"version": "7.1.0 (ESX)",
|
||||
"md5sum": "e044dc649b7146ee4f619edb0e5f6675",
|
||||
"filesize": 1871149056,
|
||||
"download_url": "https://support.paloaltonetworks.com/Updates/SoftwareUpdates/"
|
||||
},
|
||||
{
|
||||
"filename": "PA-VM-KVM-7.1.0.qcow2",
|
||||
"version": "7.1.0",
|
||||
"md5sum": "da300253709740068927408239c2e321",
|
||||
"filesize": 1858797568,
|
||||
"download_url": "https://support.paloaltonetworks.com/Updates/SoftwareUpdates/"
|
||||
},
|
||||
{
|
||||
"filename": "PA-VM-ESX-6.1.0-disk1.vmdk",
|
||||
"version": "6.1.0 (ESX)",
|
||||
"md5sum": "64b1e81cd54008318235832ea6d71424",
|
||||
"filesize": 2959736832,
|
||||
"download_url": "https://support.paloaltonetworks.com/Updates/SoftwareUpdates/"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "8.1.0 (ESX)",
|
||||
"images": {
|
||||
"hda_disk_image": "PA-VM-ESX-8.1.0-disk1.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "8.1.0",
|
||||
"images": {
|
||||
"hda_disk_image": "PA-VM-KVM-8.1.0.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "8.0.0 (ESX)",
|
||||
"images": {
|
||||
"hda_disk_image": "PA-VM-ESX-8.0.0-disk1.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "8.0.0",
|
||||
"images": {
|
||||
"hda_disk_image": "PA-VM-KVM-8.0.0.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.1.0 (ESX)",
|
||||
"images": {
|
||||
"hda_disk_image": "PA-VM-ESX-7.1.0-disk1.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.1.0",
|
||||
"images": {
|
||||
"hda_disk_image": "PA-VM-KVM-7.1.0.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.1.0 (ESX)",
|
||||
"images": {
|
||||
"hda_disk_image": "PA-VM-ESX-6.1.0-disk1.vmdk"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -17,103 +17,37 @@
|
||||
"ram": 2048,
|
||||
"arch": "x86_64",
|
||||
"console_type": "telnet",
|
||||
"boot_priority": "dc",
|
||||
"kvm": "allow",
|
||||
"process_priority": "normal"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "pfSense-CE-memstick-2.4.3-RELEASE-amd64.img",
|
||||
"version": "2.4.3",
|
||||
"md5sum": "b754d7e75dece5e756b6539c95714a74",
|
||||
"filesize": 650392576,
|
||||
"download_url": "https://www.pfsense.org/download/mirror.php?section=downloads"
|
||||
},
|
||||
{
|
||||
"filename": "pfSense-CE-2.3.5-RELEASE-2g-amd64-nanobsd.img",
|
||||
"version": "2.3.5",
|
||||
"md5sum": "b6cb76adba3e1113892f84ea01894228",
|
||||
"filesize": 1989969408,
|
||||
"download_url": "https://www.pfsense.org/download/mirror.php?section=downloads"
|
||||
},
|
||||
{
|
||||
"filename": "pfSense-CE-2.3.4-RELEASE-2g-amd64-nanobsd.img",
|
||||
"version": "2.3.4",
|
||||
"md5sum": "0c9871b54f932be2d550908f7c23b302",
|
||||
"filesize": 1989969408,
|
||||
"download_url": "https://www.pfsense.org/download/mirror.php?section=downloads"
|
||||
},
|
||||
{
|
||||
"filename": "pfSense-CE-2.3.3-RELEASE-2g-amd64-nanobsd.img",
|
||||
"version": "2.3.3",
|
||||
"md5sum": "200f073c4f0a4ba6690920079f23d5dd",
|
||||
"filesize": 1989969408,
|
||||
"download_url": "https://www.pfsense.org/download/mirror.php?section=downloads"
|
||||
},
|
||||
{
|
||||
"filename": "pfSense-CE-2.3.2-RELEASE-2g-amd64-nanobsd.img",
|
||||
"version": "2.3.2",
|
||||
"md5sum": "c91f2c8e287f4930695e65a6793cb8fe",
|
||||
"filesize": 1989969408,
|
||||
"download_url": "https://www.pfsense.org/download/mirror.php?section=downloads"
|
||||
},
|
||||
{
|
||||
"filename": "pfSense-CE-2.3.1-RELEASE-2g-amd64-nanobsd.img",
|
||||
"version": "2.3.1",
|
||||
"md5sum": "719149eed51e03872a8cfd235d958d2e",
|
||||
"filesize": 1989969408,
|
||||
"download_url": "https://www.pfsense.org/download/mirror.php?section=downloads"
|
||||
},
|
||||
{
|
||||
"filename": "pfSense-CE-2.3-RELEASE-2g-amd64-nanobsd.img",
|
||||
"version": "2.3",
|
||||
"md5sum": "8ab5047bd4c5bbabf71055fb75177d85",
|
||||
"filesize": 1989969408,
|
||||
"download_url": "https://www.pfsense.org/download/mirror.php?section=downloads"
|
||||
},
|
||||
{
|
||||
"filename": "pfSense-2.2.6-RELEASE-1g-amd64-nanobsd.img",
|
||||
"version": "2.2.6",
|
||||
"md5sum": "7bbe39c4ec698685c9f9b615926820a9",
|
||||
"filesize": 997097472,
|
||||
"download_url": "https://www.pfsense.org/download/mirror.php?section=downloads"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "2.4.3",
|
||||
"images": {
|
||||
"hda_disk_image": "pfSense-CE-memstick-2.4.3-RELEASE-amd64.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2.3.5",
|
||||
"images": {
|
||||
"hda_disk_image": "pfSense-CE-2.3.5-RELEASE-2g-amd64-nanobsd.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2.3.4",
|
||||
"images": {
|
||||
"hda_disk_image": "pfSense-CE-2.3.4-RELEASE-2g-amd64-nanobsd.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2.3.3",
|
||||
"images": {
|
||||
"hda_disk_image": "pfSense-CE-2.3.3-RELEASE-2g-amd64-nanobsd.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2.3.2",
|
||||
"images": {
|
||||
"hda_disk_image": "pfSense-CE-2.3.2-RELEASE-2g-amd64-nanobsd.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2.3.1",
|
||||
"images": {
|
||||
"hda_disk_image": "pfSense-CE-2.3.1-RELEASE-2g-amd64-nanobsd.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2.3",
|
||||
"images": {
|
||||
"hda_disk_image": "pfSense-CE-2.3-RELEASE-2g-amd64-nanobsd.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2.2.6",
|
||||
"images": {
|
||||
"hda_disk_image": "pfSense-2.2.6-RELEASE-1g-amd64-nanobsd.img"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -11,6 +11,6 @@
|
||||
"maintainer_email": "developers@gns3.net",
|
||||
"docker": {
|
||||
"adapters": 1,
|
||||
"image": "gns3/python-go-perl-php:latest"
|
||||
"image": "adosztal/python-go-perl-php:latest"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"name": "TacacsGUI",
|
||||
"category": "guest",
|
||||
"description": "TacacsGUI Free Access Control Server for Your Network Devices. GUI for powerful daemon. The project of Alexey Mochalin, based on tacacs daemon by Marc Huber",
|
||||
"vendor_name": "TacacsGUI",
|
||||
"vendor_url": "https://tacacsgui.com/",
|
||||
"documentation_url": "https://tacacsgui.com/documentation/",
|
||||
"product_name": "TacacsGUI",
|
||||
"product_url": "https://drive.google.com/open?id=1U8tbj14NqEyCmarayhZm54qTyjgsJm4B",
|
||||
"registry_version": 3,
|
||||
"status": "stable",
|
||||
"maintainer": "GNS3 Team",
|
||||
"maintainer_email": "developers@gns3.net",
|
||||
"usage": "Credentials: SSH ---> username: root ---> password: 1234 MySQL DB: ---> username: root --> password: tacacs Web interface: ---> username: tacgui ---> password: abc123",
|
||||
"port_name_format": "Port{port1}",
|
||||
"qemu": {
|
||||
"adapter_type": "e1000",
|
||||
"adapters": 1,
|
||||
"ram": 1024,
|
||||
"hda_disk_interface": "ide",
|
||||
"arch": "x86_64",
|
||||
"console_type": "telnet",
|
||||
"boot_priority": "c",
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "tac_plus.qcow2",
|
||||
"version": "201710201114",
|
||||
"md5sum": "6b5e66590051124dae586b8640b2eb11",
|
||||
"filesize": 160301056,
|
||||
"download_url": "https://drive.google.com/open?id=1U8tbj14NqEyCmarayhZm54qTyjgsJm4B"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "201710201114",
|
||||
"images": {
|
||||
"hda_disk_image": "tac_plus.qcow2"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -25,6 +25,13 @@
|
||||
"options": "-nographic"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "ubuntu-18.04-server-cloudimg-amd64.img",
|
||||
"version": "18.04",
|
||||
"md5sum": "f4134e7fa16d7fa766c7467cbe25c949",
|
||||
"filesize": 336134144,
|
||||
"download_url": "https://cloud-images.ubuntu.com/releases/18.04/release-20180426.2/ubuntu-18.04-server-cloudimg-amd64.img"
|
||||
},
|
||||
{
|
||||
"filename": "ubuntu-17.10-server-cloudimg-amd64.img",
|
||||
"version": "17.10",
|
||||
@@ -55,6 +62,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "18.04 (LTS)",
|
||||
"images": {
|
||||
"hda_disk_image": "ubuntu-18.04-server-cloudimg-amd64.img",
|
||||
"cdrom_image": "ubuntu-cloud-init-data.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "17.10",
|
||||
"images": {
|
||||
|
||||
@@ -24,6 +24,13 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "untangle_1321_x64.iso",
|
||||
"version": "13.2.1",
|
||||
"md5sum": "4ce49535372f85565922c7e90bc11ba3",
|
||||
"filesize": 627048448,
|
||||
"download_url": "https://www.untangle.com/get-untangle/"
|
||||
},
|
||||
{
|
||||
"filename": "untangle_1320_x64.iso",
|
||||
"version": "13.2.0",
|
||||
@@ -97,6 +104,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "13.2.1",
|
||||
"images": {
|
||||
"hda_disk_image": "empty30G.qcow2",
|
||||
"cdrom_image": "untangle_1321_x64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "13.2.0",
|
||||
"images": {
|
||||
|
||||
@@ -24,6 +24,14 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "zentyal-5.1-development-amd64.iso",
|
||||
"version": "5.1",
|
||||
"md5sum": "dac5623b92c1b361d7805ab8c95c0d99",
|
||||
"filesize": 947912704,
|
||||
"download_url": "http://download.zentyal.com/",
|
||||
"direct_download_url": "http://download.zentyal.com/zentyal-5.1-development-amd64.iso"
|
||||
},
|
||||
{
|
||||
"filename": "zentyal-5.0.1-development-amd64.iso",
|
||||
"version": "5.0.1",
|
||||
@@ -74,6 +82,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "5.1",
|
||||
"images": {
|
||||
"hda_disk_image": "empty100G.qcow2",
|
||||
"cdrom_image": "zentyal-5.1-development-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.0.1",
|
||||
"images": {
|
||||
|
||||
@@ -30,6 +30,7 @@ log = logging.getLogger(__name__)
|
||||
|
||||
from uuid import UUID, uuid4
|
||||
from gns3server.utils.interfaces import is_interface_up
|
||||
from gns3server.utils.asyncio import asyncio_ensure_future
|
||||
from ..config import Config
|
||||
from ..utils.asyncio import wait_run_in_executor
|
||||
from ..utils import force_unix_path
|
||||
@@ -127,7 +128,7 @@ class BaseManager:
|
||||
|
||||
tasks = []
|
||||
for node_id in self._nodes.keys():
|
||||
tasks.append(asyncio.async(self.close_node(node_id)))
|
||||
tasks.append(asyncio_ensure_future(self.close_node(node_id)))
|
||||
|
||||
if tasks:
|
||||
done, _ = yield from asyncio.wait(tasks)
|
||||
@@ -275,7 +276,7 @@ class BaseManager:
|
||||
destination_dir = destination_node.working_dir
|
||||
try:
|
||||
shutil.rmtree(destination_dir)
|
||||
shutil.copytree(source_node.working_dir, destination_dir)
|
||||
shutil.copytree(source_node.working_dir, destination_dir, symlinks=True, ignore_dangling_symlinks=True)
|
||||
except OSError as e:
|
||||
raise aiohttp.web.HTTPConflict(text="Can't duplicate node data: {}".format(e))
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ import re
|
||||
|
||||
from gns3server.utils.interfaces import interfaces
|
||||
from ..compute.port_manager import PortManager
|
||||
from ..utils.asyncio import wait_run_in_executor, locked_coroutine
|
||||
from ..utils.asyncio import wait_run_in_executor, locking
|
||||
from ..utils.asyncio.telnet_server import AsyncioTelnetServer
|
||||
from ..ubridge.hypervisor import Hypervisor
|
||||
from ..ubridge.ubridge_error import UbridgeError
|
||||
@@ -516,7 +516,8 @@ class BaseNode:
|
||||
except UbridgeError as e:
|
||||
raise UbridgeError("Error while sending command '{}': {}: {}".format(command, e, self._ubridge_hypervisor.read_stdout()))
|
||||
|
||||
@locked_coroutine
|
||||
@locking
|
||||
@asyncio.coroutine
|
||||
def _start_ubridge(self):
|
||||
"""
|
||||
Starts uBridge (handles connections to and from this node).
|
||||
|
||||
@@ -163,7 +163,7 @@ class Cloud(BaseNode):
|
||||
|
||||
try:
|
||||
output = yield from gns3server.utils.asyncio.subprocess_check_output("networksetup", "-listallhardwareports")
|
||||
except (FileNotFoundError, subprocess.SubprocessError) as e:
|
||||
except (OSError, subprocess.SubprocessError) as e:
|
||||
log.warn("Could not execute networksetup: {}".format(e))
|
||||
return False
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ import asyncio
|
||||
import logging
|
||||
import aiohttp
|
||||
from gns3server.utils import parse_version
|
||||
from gns3server.utils.asyncio import locked_coroutine
|
||||
from gns3server.utils.asyncio import locking
|
||||
from gns3server.compute.base_manager import BaseManager
|
||||
from gns3server.compute.docker.docker_vm import DockerVM
|
||||
from gns3server.compute.docker.docker_error import DockerError, DockerHttp304Error, DockerHttp404Error
|
||||
@@ -182,7 +182,8 @@ class Docker(BaseManager):
|
||||
autoping=True)
|
||||
return connection
|
||||
|
||||
@locked_coroutine
|
||||
@locking
|
||||
@asyncio.coroutine
|
||||
def pull_image(self, image, progress_callback=None):
|
||||
"""
|
||||
Pull image from docker repository
|
||||
@@ -199,7 +200,10 @@ class Docker(BaseManager):
|
||||
|
||||
if progress_callback:
|
||||
progress_callback("Pulling '{}' from docker hub".format(image))
|
||||
response = yield from self.http_query("POST", "images/create", params={"fromImage": image}, timeout=None)
|
||||
try:
|
||||
response = yield from self.http_query("POST", "images/create", params={"fromImage": image}, timeout=None)
|
||||
except DockerError as e:
|
||||
raise DockerError("Could not pull the '{}' image from Docker Hub, please check your Internet connection (original error: {})".format(image, e))
|
||||
# The pull api will stream status via an HTTP JSON stream
|
||||
content = ""
|
||||
while True:
|
||||
|
||||
@@ -24,11 +24,14 @@ import shutil
|
||||
import psutil
|
||||
import shlex
|
||||
import aiohttp
|
||||
import subprocess
|
||||
import os
|
||||
|
||||
from gns3server.utils.asyncio.telnet_server import AsyncioTelnetServer
|
||||
from gns3server.utils.asyncio.raw_command_server import AsyncioRawCommandServer
|
||||
from gns3server.utils.asyncio import wait_for_file_creation
|
||||
from gns3server.utils.asyncio import asyncio_ensure_future
|
||||
from gns3server.utils.asyncio import monitor_process
|
||||
from gns3server.utils.get_resource import get_resource
|
||||
|
||||
from gns3server.ubridge.ubridge_error import UbridgeError, UbridgeNamespaceError
|
||||
@@ -80,12 +83,14 @@ class DockerVM(BaseNode):
|
||||
self._ethernet_adapters = []
|
||||
self._temporary_directory = None
|
||||
self._telnet_servers = []
|
||||
self._x11vnc_process = None
|
||||
self._vnc_process = None
|
||||
self._xvfb_process = None
|
||||
self._console_resolution = console_resolution
|
||||
self._console_http_path = console_http_path
|
||||
self._console_http_port = console_http_port
|
||||
self._console_websocket = None
|
||||
self._extra_hosts = extra_hosts
|
||||
self._permissions_fixed = False
|
||||
|
||||
self._volumes = []
|
||||
# Keep a list of created bridge
|
||||
@@ -226,11 +231,13 @@ class DockerVM(BaseNode):
|
||||
binds = ["{}:/gns3:ro".format(ressources)]
|
||||
|
||||
# We mount our own etc/network
|
||||
network_config = self._create_network_config()
|
||||
try:
|
||||
network_config = self._create_network_config()
|
||||
except OSError as e:
|
||||
raise DockerError("Could not create network config in the container: {}".format(e))
|
||||
binds.append("{}:/gns3volumes/etc/network:rw".format(network_config))
|
||||
|
||||
self._volumes = ["/etc/network"]
|
||||
|
||||
volumes = image_infos.get("Config", {}).get("Volumes")
|
||||
if volumes is None:
|
||||
return binds
|
||||
@@ -283,11 +290,12 @@ class DockerVM(BaseNode):
|
||||
try:
|
||||
image_infos = yield from self._get_image_information()
|
||||
except DockerHttp404Error:
|
||||
log.info("Image %s is missing pulling it from docker hub", self._image)
|
||||
log.info("Image '{}' is missing, pulling it from Docker hub...".format(self._image))
|
||||
yield from self.pull_image(self._image)
|
||||
image_infos = yield from self._get_image_information()
|
||||
if image_infos is None:
|
||||
raise DockerError("Can't get image informations, please try again.")
|
||||
|
||||
if image_infos is None:
|
||||
raise DockerError("Cannot get information for image '{}', please try again.".format(self._image))
|
||||
|
||||
params = {
|
||||
"Hostname": self._name,
|
||||
@@ -311,7 +319,10 @@ class DockerVM(BaseNode):
|
||||
if params["Entrypoint"] is None:
|
||||
params["Entrypoint"] = []
|
||||
if self._start_command:
|
||||
params["Cmd"] = shlex.split(self._start_command)
|
||||
try:
|
||||
params["Cmd"] = shlex.split(self._start_command)
|
||||
except ValueError as e:
|
||||
raise DockerError("Invalid start command '{}': {}".format(self._start_command, e))
|
||||
if len(params["Cmd"]) == 0:
|
||||
params["Cmd"] = image_infos.get("Config", {"Cmd": []})["Cmd"]
|
||||
if params["Cmd"] is None:
|
||||
@@ -336,6 +347,9 @@ class DockerVM(BaseNode):
|
||||
if self._environment:
|
||||
for e in self._environment.strip().split("\n"):
|
||||
e = e.strip()
|
||||
if e.split("=")[0] == "":
|
||||
self.project.emit("log.warning", {"message": "{} has invalid environment variable: {}".format(self.name, e)})
|
||||
continue
|
||||
if not e.startswith("GNS3_"):
|
||||
formatted = self._format_env(variables, e)
|
||||
params["Env"].append(formatted)
|
||||
@@ -353,8 +367,7 @@ class DockerVM(BaseNode):
|
||||
|
||||
result = yield from self.manager.query("POST", "containers/create", data=params)
|
||||
self._cid = result['Id']
|
||||
log.info("Docker container '{name}' [{id}] created".format(
|
||||
name=self._name, id=self._id))
|
||||
log.info("Docker container '{name}' [{id}] created".format(name=self._name, id=self._id))
|
||||
return True
|
||||
|
||||
def _format_env(self, variables, env):
|
||||
@@ -432,12 +445,14 @@ class DockerVM(BaseNode):
|
||||
|
||||
if self.console_type == "telnet":
|
||||
yield from self._start_console()
|
||||
|
||||
elif self.console_type == "http" or self.console_type == "https":
|
||||
yield from self._start_http()
|
||||
|
||||
if self.allocate_aux:
|
||||
yield from self._start_aux()
|
||||
|
||||
self._permissions_fixed = False
|
||||
self.status = "started"
|
||||
log.info("Docker container '{name}' [{image}] started listen for {console_type} on {console}".format(name=self._name,
|
||||
image=self._image,
|
||||
@@ -447,22 +462,24 @@ class DockerVM(BaseNode):
|
||||
@asyncio.coroutine
|
||||
def _start_aux(self):
|
||||
"""
|
||||
Start an auxilary console
|
||||
Start an auxiliary console
|
||||
"""
|
||||
|
||||
# We can not use the API because docker doesn't expose a websocket api for exec
|
||||
# https://github.com/GNS3/gns3-gui/issues/1039
|
||||
process = yield from asyncio.subprocess.create_subprocess_exec(
|
||||
"docker", "exec", "-i", self._cid, "/gns3/bin/busybox", "script", "-qfc", "while true; do TERM=vt100 /gns3/bin/busybox sh; done", "/dev/null",
|
||||
stdout=asyncio.subprocess.PIPE,
|
||||
stderr=asyncio.subprocess.STDOUT,
|
||||
stdin=asyncio.subprocess.PIPE)
|
||||
try:
|
||||
process = yield from asyncio.subprocess.create_subprocess_exec("docker", "exec", "-i", self._cid, "/gns3/bin/busybox", "script", "-qfc", "while true; do TERM=vt100 /gns3/bin/busybox sh; done", "/dev/null",
|
||||
stdout=asyncio.subprocess.PIPE,
|
||||
stderr=asyncio.subprocess.STDOUT,
|
||||
stdin=asyncio.subprocess.PIPE)
|
||||
except OSError as e:
|
||||
raise DockerError("Could not start auxiliary console process: {}".format(e))
|
||||
server = AsyncioTelnetServer(reader=process.stdout, writer=process.stdin, binary=True, echo=True)
|
||||
try:
|
||||
self._telnet_servers.append((yield from asyncio.start_server(server.run, self._manager.port_manager.console_host, self.aux)))
|
||||
except OSError as e:
|
||||
raise DockerError("Could not start Telnet server on socket {}:{}: {}".format(self._manager.port_manager.console_host, self.aux, e))
|
||||
log.debug("Docker container '%s' started listen for auxilary telnet on %d", self.name, self.aux)
|
||||
log.debug("Docker container '%s' started listen for auxiliary telnet on %d", self.name, self.aux)
|
||||
|
||||
@asyncio.coroutine
|
||||
def _fix_permissions(self):
|
||||
@@ -472,6 +489,7 @@ class DockerVM(BaseNode):
|
||||
"""
|
||||
|
||||
state = yield from self._get_container_state()
|
||||
log.info("Docker container '{name}' fix ownership, state = {state}".format(name=self._name, state=state))
|
||||
if state == "stopped" or state == "exited":
|
||||
# We need to restart it to fix permissions
|
||||
yield from self.manager.query("POST", "containers/{}/start".format(self._cid))
|
||||
@@ -479,22 +497,27 @@ class DockerVM(BaseNode):
|
||||
for volume in self._volumes:
|
||||
log.debug("Docker container '{name}' [{image}] fix ownership on {path}".format(
|
||||
name=self._name, image=self._image, path=volume))
|
||||
process = yield from asyncio.subprocess.create_subprocess_exec(
|
||||
"docker",
|
||||
"exec",
|
||||
self._cid,
|
||||
"/gns3/bin/busybox",
|
||||
"sh",
|
||||
"-c",
|
||||
"("
|
||||
"/gns3/bin/busybox find \"{path}\" -depth -print0"
|
||||
" | /gns3/bin/busybox xargs -0 /gns3/bin/busybox stat -c '%a:%u:%g:%n' > \"{path}/.gns3_perms\""
|
||||
")"
|
||||
" && /gns3/bin/busybox chmod -R u+rX \"{path}\""
|
||||
" && /gns3/bin/busybox chown {uid}:{gid} -R \"{path}\""
|
||||
.format(uid=os.getuid(), gid=os.getgid(), path=volume),
|
||||
)
|
||||
|
||||
try:
|
||||
process = yield from asyncio.subprocess.create_subprocess_exec(
|
||||
"docker",
|
||||
"exec",
|
||||
self._cid,
|
||||
"/gns3/bin/busybox",
|
||||
"sh",
|
||||
"-c",
|
||||
"("
|
||||
"/gns3/bin/busybox find \"{path}\" -depth -print0"
|
||||
" | /gns3/bin/busybox xargs -0 /gns3/bin/busybox stat -c '%a:%u:%g:%n' > \"{path}/.gns3_perms\""
|
||||
")"
|
||||
" && /gns3/bin/busybox chmod -R u+rX \"{path}\""
|
||||
" && /gns3/bin/busybox chown {uid}:{gid} -R \"{path}\""
|
||||
.format(uid=os.getuid(), gid=os.getgid(), path=volume),
|
||||
)
|
||||
except OSError as e:
|
||||
raise DockerError("Could not fix permissions for {}: {}".format(volume, e))
|
||||
yield from process.wait()
|
||||
self._permissions_fixed = True
|
||||
|
||||
@asyncio.coroutine
|
||||
def _start_vnc(self):
|
||||
@@ -503,14 +526,54 @@ class DockerVM(BaseNode):
|
||||
"""
|
||||
|
||||
self._display = self._get_free_display_port()
|
||||
if shutil.which("Xvfb") is None or shutil.which("x11vnc") is None:
|
||||
raise DockerError("Please install Xvfb and x11vnc before using the VNC support")
|
||||
self._xvfb_process = yield from asyncio.create_subprocess_exec("Xvfb", "-nolisten", "tcp", ":{}".format(self._display), "-screen", "0", self._console_resolution + "x16")
|
||||
# We pass a port for TCPV6 due to a crash in X11VNC if not here: https://github.com/GNS3/gns3-server/issues/569
|
||||
self._x11vnc_process = yield from asyncio.create_subprocess_exec("x11vnc", "-forever", "-nopw", "-shared", "-geometry", self._console_resolution, "-display", "WAIT:{}".format(self._display), "-rfbport", str(self.console), "-rfbportv6", str(self.console), "-noncache", "-listen", self._manager.port_manager.console_host)
|
||||
if not (shutil.which("Xtigervnc") or shutil.which("Xvfb") and shutil.which("x11vnc")):
|
||||
raise DockerError("Please install tigervnc-standalone-server (recommended) or Xvfb + x11vnc before using VNC support")
|
||||
|
||||
if shutil.which("Xtigervnc"):
|
||||
with open(os.path.join(self.working_dir, "vnc.log"), "w") as fd:
|
||||
self._vnc_process = yield from asyncio.create_subprocess_exec("Xtigervnc",
|
||||
"-geometry", self._console_resolution,
|
||||
"-depth", "16",
|
||||
"-interface", self._manager.port_manager.console_host,
|
||||
"-rfbport", str(self.console),
|
||||
"-AlwaysShared",
|
||||
"-SecurityTypes", "None",
|
||||
":{}".format(self._display),
|
||||
stdout=fd, stderr=subprocess.STDOUT)
|
||||
else:
|
||||
self._xvfb_process = yield from asyncio.create_subprocess_exec("Xvfb",
|
||||
"-nolisten",
|
||||
"tcp", ":{}".format(self._display),
|
||||
"-screen", "0",
|
||||
self._console_resolution + "x16")
|
||||
|
||||
# We pass a port for TCPV6 due to a crash in X11VNC if not here: https://github.com/GNS3/gns3-server/issues/569
|
||||
with open(os.path.join(self.working_dir, "vnc.log"), "w") as fd:
|
||||
self._vnc_process = yield from asyncio.create_subprocess_exec("x11vnc",
|
||||
"-forever",
|
||||
"-nopw",
|
||||
"-shared",
|
||||
"-geometry", self._console_resolution,
|
||||
"-display", "WAIT:{}".format(self._display),
|
||||
"-rfbport", str(self.console),
|
||||
"-rfbportv6", str(self.console),
|
||||
"-noncache",
|
||||
"-listen", self._manager.port_manager.console_host,
|
||||
stdout=fd, stderr=subprocess.STDOUT)
|
||||
|
||||
x11_socket = os.path.join("/tmp/.X11-unix/", "X{}".format(self._display))
|
||||
yield from wait_for_file_creation(x11_socket)
|
||||
#monitor_process(self._vnc_process, self._vnc_callback)
|
||||
|
||||
def _vnc_callback(self, returncode):
|
||||
"""
|
||||
Called when the process has stopped.
|
||||
|
||||
:param returncode: Process returncode
|
||||
"""
|
||||
|
||||
if returncode != 0:
|
||||
self.project.emit("log.error", {"message": "The vnc process has stopped, return code: {}.".format(returncode)})
|
||||
|
||||
@asyncio.coroutine
|
||||
def _start_http(self):
|
||||
@@ -533,6 +596,19 @@ class DockerVM(BaseNode):
|
||||
])
|
||||
self._telnet_servers.append((yield from asyncio.start_server(server.run, self._manager.port_manager.console_host, self.console)))
|
||||
|
||||
@asyncio.coroutine
|
||||
def _window_size_changed_callback(self, columns, rows):
|
||||
"""
|
||||
Called when the console window size has been changed.
|
||||
(when naws is enabled in the Telnet server)
|
||||
|
||||
:param columns: number of columns
|
||||
:param rows: number of rows
|
||||
"""
|
||||
|
||||
# resize the container TTY.
|
||||
yield from self._manager.query("POST", "containers/{}/resize?h={}&w={}".format(self._cid, rows, columns))
|
||||
|
||||
@asyncio.coroutine
|
||||
def _start_console(self):
|
||||
"""
|
||||
@@ -555,8 +631,7 @@ class DockerVM(BaseNode):
|
||||
|
||||
output_stream = asyncio.StreamReader()
|
||||
input_stream = InputStream()
|
||||
|
||||
telnet = AsyncioTelnetServer(reader=output_stream, writer=input_stream, echo=True)
|
||||
telnet = AsyncioTelnetServer(reader=output_stream, writer=input_stream, echo=True, naws=True, window_size_changed_callback=self._window_size_changed_callback)
|
||||
try:
|
||||
self._telnet_servers.append((yield from asyncio.start_server(telnet.run, self._manager.port_manager.console_host, self.console)))
|
||||
except OSError as e:
|
||||
@@ -566,8 +641,7 @@ class DockerVM(BaseNode):
|
||||
input_stream.ws = self._console_websocket
|
||||
|
||||
output_stream.feed_data(self.name.encode() + b" console is now available... Press RETURN to get started.\r\n")
|
||||
|
||||
asyncio.async(self._read_console_output(self._console_websocket, output_stream))
|
||||
asyncio_ensure_future(self._read_console_output(self._console_websocket, output_stream))
|
||||
|
||||
@asyncio.coroutine
|
||||
def _read_console_output(self, ws, out):
|
||||
@@ -641,14 +715,15 @@ class DockerVM(BaseNode):
|
||||
if state == "paused":
|
||||
yield from self.unpause()
|
||||
|
||||
yield from self._fix_permissions()
|
||||
if not self._permissions_fixed:
|
||||
yield from self._fix_permissions()
|
||||
|
||||
state = yield from self._get_container_state()
|
||||
if state != "stopped" or state != "exited":
|
||||
# t=5 number of seconds to wait before killing the container
|
||||
try:
|
||||
yield from self.manager.query("POST", "containers/{}/stop".format(self._cid), params={"t": 5})
|
||||
log.info("Docker container '{name}' [{image}] stopped".format(
|
||||
name=self._name, image=self._image))
|
||||
log.info("Docker container '{name}' [{image}] stopped".format(name=self._name, image=self._image))
|
||||
except DockerHttp304Error:
|
||||
# Container is already stopped
|
||||
pass
|
||||
@@ -688,12 +763,13 @@ class DockerVM(BaseNode):
|
||||
if state == "paused" or state == "running":
|
||||
yield from self.stop()
|
||||
if self.console_type == "vnc":
|
||||
if self._x11vnc_process:
|
||||
if self._vnc_process:
|
||||
try:
|
||||
self._x11vnc_process.terminate()
|
||||
yield from self._x11vnc_process.wait()
|
||||
self._vnc_process.terminate()
|
||||
yield from self._vnc_process.wait()
|
||||
except ProcessLookupError:
|
||||
pass
|
||||
if self._xvfb_process:
|
||||
try:
|
||||
self._xvfb_process.terminate()
|
||||
yield from self._xvfb_process.wait()
|
||||
|
||||
@@ -36,6 +36,7 @@ log = logging.getLogger(__name__)
|
||||
from gns3server.utils.interfaces import interfaces, is_interface_up
|
||||
from gns3server.utils.asyncio import wait_run_in_executor
|
||||
from gns3server.utils import parse_version
|
||||
from gns3server.utils.asyncio import asyncio_ensure_future
|
||||
from uuid import uuid4
|
||||
from ..base_manager import BaseManager
|
||||
from ..port_manager import PortManager
|
||||
@@ -172,7 +173,7 @@ class Dynamips(BaseManager):
|
||||
|
||||
tasks = []
|
||||
for device in self._devices.values():
|
||||
tasks.append(asyncio.async(device.hypervisor.stop()))
|
||||
tasks.append(asyncio_ensure_future(device.hypervisor.stop()))
|
||||
|
||||
if tasks:
|
||||
done, _ = yield from asyncio.wait(tasks)
|
||||
@@ -196,7 +197,7 @@ class Dynamips(BaseManager):
|
||||
tasks = []
|
||||
for device in self._devices.values():
|
||||
if device.project.id == project.id:
|
||||
tasks.append(asyncio.async(device.delete()))
|
||||
tasks.append(asyncio_ensure_future(device.delete()))
|
||||
|
||||
if tasks:
|
||||
done, _ = yield from asyncio.wait(tasks)
|
||||
@@ -561,6 +562,7 @@ class Dynamips(BaseManager):
|
||||
|
||||
yield from vm.set_idlepc("0x0")
|
||||
was_auto_started = False
|
||||
old_priority = None
|
||||
try:
|
||||
status = yield from vm.get_status()
|
||||
if status != "running":
|
||||
@@ -572,6 +574,8 @@ class Dynamips(BaseManager):
|
||||
if not idlepcs:
|
||||
raise DynamipsError("No Idle-PC values found")
|
||||
|
||||
if sys.platform.startswith("win"):
|
||||
old_priority = vm.set_process_priority_windows(vm.hypervisor.process.pid)
|
||||
for idlepc in idlepcs:
|
||||
match = re.search(r"^0x[0-9a-f]{8}$", idlepc.split()[0])
|
||||
if not match:
|
||||
@@ -600,6 +604,8 @@ class Dynamips(BaseManager):
|
||||
except DynamipsError:
|
||||
raise
|
||||
finally:
|
||||
if old_priority is not None:
|
||||
vm.set_process_priority_windows(vm.hypervisor.process.pid, old_priority)
|
||||
if was_auto_started:
|
||||
yield from vm.stop()
|
||||
return validated_idlepc
|
||||
|
||||
@@ -87,6 +87,7 @@ class EthernetSwitch(Device):
|
||||
self._mappings = {}
|
||||
self._telnet_console = None
|
||||
self._telnet_shell = None
|
||||
self._telnet_server = None
|
||||
self._console = self._manager.port_manager.get_free_tcp_port(self._project)
|
||||
if ports is None:
|
||||
# create 8 ports by default
|
||||
@@ -217,8 +218,9 @@ class EthernetSwitch(Device):
|
||||
Deletes this Ethernet switch.
|
||||
"""
|
||||
yield from self._telnet.close()
|
||||
self._telnet_server.close()
|
||||
|
||||
if self._telnet_server:
|
||||
self._telnet_server.close()
|
||||
|
||||
for nio in self._nios.values():
|
||||
if nio:
|
||||
yield from nio.close()
|
||||
|
||||
@@ -40,7 +40,7 @@ from ..nios.nio_udp import NIOUDP
|
||||
|
||||
|
||||
from gns3server.utils.file_watcher import FileWatcher
|
||||
from gns3server.utils.asyncio import wait_run_in_executor, monitor_process
|
||||
from gns3server.utils.asyncio import wait_run_in_executor, monitor_process, asyncio_ensure_future
|
||||
from gns3server.utils.images import md5sum
|
||||
|
||||
|
||||
@@ -196,7 +196,7 @@ class Router(BaseNode):
|
||||
"""
|
||||
Called when the NVRAM file has changed
|
||||
"""
|
||||
asyncio.async(self.save_configs())
|
||||
asyncio_ensure_future(self.save_configs())
|
||||
|
||||
@property
|
||||
def dynamips_id(self):
|
||||
@@ -683,6 +683,29 @@ class Router(BaseNode):
|
||||
log.info('Router "{name}" [{id}]: idle-PC set to {idlepc}'.format(name=self._name, id=self._id, idlepc=idlepc))
|
||||
self._idlepc = idlepc
|
||||
|
||||
def set_process_priority_windows(self, pid, priority=None):
|
||||
"""
|
||||
Sets process priority on Windows
|
||||
|
||||
:param pid: process PID
|
||||
"""
|
||||
|
||||
import win32api
|
||||
import win32process
|
||||
import win32con
|
||||
import pywintypes
|
||||
|
||||
old_priority = None
|
||||
try:
|
||||
handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, True, pid)
|
||||
old_priority = win32process.GetPriorityClass(handle)
|
||||
if priority is None:
|
||||
priority = win32process.BELOW_NORMAL_PRIORITY_CLASS
|
||||
win32process.SetPriorityClass(handle, priority)
|
||||
except pywintypes.error as e:
|
||||
log.error("Cannot set priority for Dynamips process (PID={}) ".format(pid, e.strerror))
|
||||
return old_priority
|
||||
|
||||
@asyncio.coroutine
|
||||
def get_idle_pc_prop(self):
|
||||
"""
|
||||
@@ -701,8 +724,13 @@ class Router(BaseNode):
|
||||
yield from asyncio.sleep(20) # leave time to the router to boot
|
||||
|
||||
log.info('Router "{name}" [{id}] has started calculating Idle-PC values'.format(name=self._name, id=self._id))
|
||||
old_priority = None
|
||||
if sys.platform.startswith("win"):
|
||||
old_priority = self.set_process_priority_windows(self._hypervisor.process.pid)
|
||||
begin = time.time()
|
||||
idlepcs = yield from self._hypervisor.send('vm get_idle_pc_prop "{}" 0'.format(self._name))
|
||||
if old_priority is not None:
|
||||
self.set_process_priority_windows(self._hypervisor.process.pid, old_priority)
|
||||
log.info('Router "{name}" [{id}] has finished calculating Idle-PC values after {time:.4f} seconds'.format(name=self._name,
|
||||
id=self._id,
|
||||
time=time.time() - begin))
|
||||
|
||||
@@ -43,7 +43,7 @@ from .utils.iou_export import nvram_export
|
||||
from gns3server.ubridge.ubridge_error import UbridgeError
|
||||
from gns3server.utils.file_watcher import FileWatcher
|
||||
from gns3server.utils.asyncio.telnet_server import AsyncioTelnetServer
|
||||
from gns3server.utils.asyncio import locked_coroutine
|
||||
from gns3server.utils.asyncio import locking
|
||||
import gns3server.utils.asyncio
|
||||
import gns3server.utils.images
|
||||
|
||||
@@ -368,7 +368,7 @@ class IOUVM(BaseNode):
|
||||
|
||||
try:
|
||||
output = yield from gns3server.utils.asyncio.subprocess_check_output("ldd", self._path)
|
||||
except (FileNotFoundError, subprocess.SubprocessError) as e:
|
||||
except (OSError, subprocess.SubprocessError) as e:
|
||||
log.warn("Could not determine the shared library dependencies for {}: {}".format(self._path, e))
|
||||
return
|
||||
|
||||
@@ -421,7 +421,7 @@ class IOUVM(BaseNode):
|
||||
hostid = (yield from gns3server.utils.asyncio.subprocess_check_output("hostid")).strip()
|
||||
except FileNotFoundError as e:
|
||||
raise IOUError("Could not find hostid: {}".format(e))
|
||||
except subprocess.SubprocessError as e:
|
||||
except (OSError, subprocess.SubprocessError) as e:
|
||||
raise IOUError("Could not execute hostid: {}".format(e))
|
||||
|
||||
try:
|
||||
@@ -517,6 +517,17 @@ class IOUVM(BaseNode):
|
||||
|
||||
if "IOURC" not in os.environ:
|
||||
env["IOURC"] = iourc_path
|
||||
|
||||
# create a symbolic link to the image to avoid IOU error "failed code signing checks"
|
||||
# on newer images, see https://github.com/GNS3/gns3-server/issues/1484
|
||||
try:
|
||||
symlink = os.path.join(self.working_dir, os.path.basename(self.path))
|
||||
if os.path.islink(symlink):
|
||||
os.unlink(symlink)
|
||||
os.symlink(self.path, symlink)
|
||||
except OSError as e:
|
||||
raise IOUError("Could not create symbolic link: {}".format(e))
|
||||
|
||||
command = yield from self._build_command()
|
||||
try:
|
||||
log.info("Starting IOU: {}".format(command))
|
||||
@@ -550,7 +561,8 @@ class IOUVM(BaseNode):
|
||||
# configure networking support
|
||||
yield from self._networking()
|
||||
|
||||
@locked_coroutine
|
||||
@locking
|
||||
@asyncio.coroutine
|
||||
def _networking(self):
|
||||
"""
|
||||
Configures the IOL bridge in uBridge.
|
||||
|
||||
@@ -23,7 +23,7 @@ import logging
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
# This ports are disallowed by Chrome and Firefox to avoid issues, we skip them as well
|
||||
# These ports are disallowed by Chrome and Firefox to avoid issues, we skip them as well
|
||||
BANNED_PORTS = set((1, 7, 9, 11, 13, 15, 17, 19, 20, 21, 22, 23, 25, 37, 42, 43, 53, 77, 79, 87, 95, 101, 102, 103,
|
||||
104, 109, 110, 111, 113, 115, 117, 119, 123, 135, 139, 143, 179, 389, 465, 512, 513, 514, 515, 526,
|
||||
530, 531, 532, 540, 556, 563, 587, 601, 636, 993, 995, 2049, 3659, 4045, 6000, 6665, 6666, 6667,
|
||||
|
||||
@@ -29,7 +29,7 @@ from uuid import UUID, uuid4
|
||||
from .port_manager import PortManager
|
||||
from .notification_manager import NotificationManager
|
||||
from ..config import Config
|
||||
from ..utils.asyncio import wait_run_in_executor
|
||||
from ..utils.asyncio import wait_run_in_executor, asyncio_ensure_future
|
||||
from ..utils.path import check_path_allowed, get_default_project_directory
|
||||
|
||||
import logging
|
||||
@@ -346,7 +346,7 @@ class Project:
|
||||
|
||||
tasks = []
|
||||
for node in self._nodes:
|
||||
tasks.append(asyncio.async(node.manager.close_node(node.id)))
|
||||
tasks.append(asyncio_ensure_future(node.manager.close_node(node.id)))
|
||||
|
||||
if tasks:
|
||||
done, _ = yield from asyncio.wait(tasks)
|
||||
|
||||
@@ -186,14 +186,14 @@ class Qemu(BaseManager):
|
||||
return ""
|
||||
else:
|
||||
try:
|
||||
output = yield from subprocess_check_output(qemu_path, "-version")
|
||||
output = yield from subprocess_check_output(qemu_path, "-version", "-nographic")
|
||||
match = re.search("version\s+([0-9a-z\-\.]+)", output)
|
||||
if match:
|
||||
version = match.group(1)
|
||||
return version
|
||||
else:
|
||||
raise QemuError("Could not determine the Qemu version for {}".format(qemu_path))
|
||||
except subprocess.SubprocessError as e:
|
||||
except (OSError, subprocess.SubprocessError) as e:
|
||||
raise QemuError("Error while looking for the Qemu version: {}".format(e))
|
||||
|
||||
@staticmethod
|
||||
@@ -213,7 +213,7 @@ class Qemu(BaseManager):
|
||||
return version
|
||||
else:
|
||||
raise QemuError("Could not determine the Qemu-img version for {}".format(qemu_img_path))
|
||||
except subprocess.SubprocessError as e:
|
||||
except (OSError, subprocess.SubprocessError) as e:
|
||||
raise QemuError("Error while looking for the Qemu-img version: {}".format(e))
|
||||
|
||||
@staticmethod
|
||||
|
||||
@@ -1028,7 +1028,7 @@ class QemuVM(BaseNode):
|
||||
if expect in line:
|
||||
result = line.decode("utf-8").strip()
|
||||
break
|
||||
except EOFError as e:
|
||||
except (ConnectionError, EOFError) as e:
|
||||
log.warn("Could not read from QEMU monitor: {}".format(e))
|
||||
writer.close()
|
||||
return result
|
||||
@@ -1601,18 +1601,19 @@ class QemuVM(BaseNode):
|
||||
|
||||
return network_options
|
||||
|
||||
def _graphic(self):
|
||||
@asyncio.coroutine
|
||||
def _disable_graphics(self):
|
||||
"""
|
||||
Adds the correct graphic options depending of the OS
|
||||
Disable graphics depending of the QEMU version
|
||||
"""
|
||||
|
||||
if sys.platform.startswith("win"):
|
||||
if any(opt in self._options for opt in ["-display", "-nographic", "-curses", "-sdl" "-spice", "-vnc"]):
|
||||
return []
|
||||
if len(os.environ.get("DISPLAY", "")) > 0:
|
||||
return []
|
||||
if "-nographic" not in self._options:
|
||||
version = yield from self.manager.get_qemu_version(self.qemu_path)
|
||||
if version and parse_version(version) >= parse_version("3.0"):
|
||||
return ["-display", "none"]
|
||||
else:
|
||||
return ["-nographic"]
|
||||
return []
|
||||
|
||||
def _run_with_kvm(self, qemu_path, options):
|
||||
"""
|
||||
@@ -1678,7 +1679,8 @@ class QemuVM(BaseNode):
|
||||
raise QemuError("Console type {} is unknown".format(self._console_type))
|
||||
command.extend(self._monitor_options())
|
||||
command.extend((yield from self._network_options()))
|
||||
command.extend(self._graphic())
|
||||
if self._console_type == "telnet":
|
||||
command.extend((yield from self._disable_graphics()))
|
||||
if additional_options:
|
||||
try:
|
||||
command.extend(shlex.split(additional_options))
|
||||
|
||||
@@ -33,7 +33,7 @@ import xml.etree.ElementTree as ET
|
||||
from gns3server.utils import parse_version
|
||||
from gns3server.utils.asyncio.telnet_server import AsyncioTelnetServer
|
||||
from gns3server.utils.asyncio.serial import asyncio_open_serial
|
||||
from gns3server.utils.asyncio import locked_coroutine
|
||||
from gns3server.utils.asyncio import locking
|
||||
from gns3server.compute.virtualbox.virtualbox_error import VirtualBoxError
|
||||
from gns3server.compute.nios.nio_udp import NIOUDP
|
||||
from gns3server.compute.adapters.ethernet_adapter import EthernetAdapter
|
||||
@@ -217,6 +217,8 @@ class VirtualBoxVM(BaseNode):
|
||||
except ET.ParseError:
|
||||
raise VirtualBoxError("Cannot modify VirtualBox linked nodes file. "
|
||||
"File {} is corrupted.".format(self._linked_vbox_file()))
|
||||
except OSError as e:
|
||||
raise VirtualBoxError("Cannot modify VirtualBox linked nodes file '{}': {}".format(self._linked_vbox_file(), e))
|
||||
|
||||
machine = tree.getroot().find("{http://www.virtualbox.org/}Machine")
|
||||
if machine is not None and machine.get("uuid") != "{" + self.id + "}":
|
||||
@@ -245,6 +247,7 @@ class VirtualBoxVM(BaseNode):
|
||||
return True
|
||||
return False
|
||||
|
||||
@locking
|
||||
@asyncio.coroutine
|
||||
def start(self):
|
||||
"""
|
||||
@@ -296,7 +299,8 @@ class VirtualBoxVM(BaseNode):
|
||||
if (yield from self.check_hw_virtualization()):
|
||||
self._hw_virtualization = True
|
||||
|
||||
@locked_coroutine
|
||||
@locking
|
||||
@asyncio.coroutine
|
||||
def stop(self):
|
||||
"""
|
||||
Stops this VirtualBox VM.
|
||||
@@ -937,7 +941,12 @@ class VirtualBoxVM(BaseNode):
|
||||
"""
|
||||
Starts remote console support for this VM.
|
||||
"""
|
||||
self._remote_pipe = yield from asyncio_open_serial(self._get_pipe_name())
|
||||
|
||||
pipe_name = self._get_pipe_name()
|
||||
try:
|
||||
self._remote_pipe = yield from asyncio_open_serial(pipe_name)
|
||||
except OSError as e:
|
||||
raise VirtualBoxError("Could not open serial pipe '{}': {}".format(pipe_name, e))
|
||||
server = AsyncioTelnetServer(reader=self._remote_pipe,
|
||||
writer=self._remote_pipe,
|
||||
binary=True,
|
||||
|
||||
@@ -32,6 +32,7 @@ import shlex
|
||||
from collections import OrderedDict
|
||||
from gns3server.utils.interfaces import interfaces
|
||||
from gns3server.utils.asyncio import subprocess_check_output
|
||||
from gns3server.utils.asyncio import asyncio_ensure_future
|
||||
from gns3server.utils import parse_version
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
@@ -148,6 +149,7 @@ class VMware(BaseManager):
|
||||
VIX 1.13 was the release for Player 6.
|
||||
VIX 1.14 was the release for Player 7.
|
||||
VIX 1.15 was the release for Workstation Player 12.
|
||||
VIX 1.17 was the release for Workstation Player 14.
|
||||
|
||||
:param player_version: VMware Player major version.
|
||||
"""
|
||||
@@ -161,6 +163,8 @@ class VMware(BaseManager):
|
||||
yield from self.check_vmrun_version(minimum_required_version="1.14.0")
|
||||
elif player_version >= 12:
|
||||
yield from self.check_vmrun_version(minimum_required_version="1.15.0")
|
||||
elif player_version >= 14:
|
||||
yield from self.check_vmrun_version(minimum_required_version="1.17.0")
|
||||
self._host_type = "player"
|
||||
|
||||
@asyncio.coroutine
|
||||
@@ -171,6 +175,7 @@ class VMware(BaseManager):
|
||||
VIX 1.13 was the release for Workstation 10.
|
||||
VIX 1.14 was the release for Workstation 11.
|
||||
VIX 1.15 was the release for Workstation Pro 12.
|
||||
VIX 1.17 was the release for Workstation Pro 14.
|
||||
|
||||
:param ws_version: VMware Workstation major version.
|
||||
"""
|
||||
@@ -184,6 +189,8 @@ class VMware(BaseManager):
|
||||
yield from self.check_vmrun_version(minimum_required_version="1.14.0")
|
||||
elif ws_version >= 12:
|
||||
yield from self.check_vmrun_version(minimum_required_version="1.15.0")
|
||||
elif ws_version >= 14:
|
||||
yield from self.check_vmrun_version(minimum_required_version="1.17.0")
|
||||
self._host_type = "ws"
|
||||
|
||||
@asyncio.coroutine
|
||||
@@ -738,4 +745,4 @@ if __name__ == '__main__':
|
||||
loop = asyncio.get_event_loop()
|
||||
vmware = VMware.instance()
|
||||
print("=> Check version")
|
||||
loop.run_until_complete(asyncio.async(vmware.check_vmware_version()))
|
||||
loop.run_until_complete(asyncio_ensure_future(vmware.check_vmware_version()))
|
||||
@@ -26,7 +26,7 @@ import tempfile
|
||||
|
||||
from gns3server.utils.asyncio.telnet_server import AsyncioTelnetServer
|
||||
from gns3server.utils.asyncio.serial import asyncio_open_serial
|
||||
from gns3server.utils.asyncio import locked_coroutine
|
||||
from gns3server.utils.asyncio import locking
|
||||
from collections import OrderedDict
|
||||
from .vmware_error import VMwareError
|
||||
from ..nios.nio_udp import NIOUDP
|
||||
@@ -94,7 +94,8 @@ class VMwareVM(BaseNode):
|
||||
|
||||
return self._vmnets
|
||||
|
||||
@locked_coroutine
|
||||
@locking
|
||||
@asyncio.coroutine
|
||||
def _control_vm(self, subcommand, *additional_args):
|
||||
|
||||
args = [self._vmx_path]
|
||||
@@ -844,7 +845,12 @@ class VMwareVM(BaseNode):
|
||||
"""
|
||||
Starts remote console support for this VM.
|
||||
"""
|
||||
self._remote_pipe = yield from asyncio_open_serial(self._get_pipe_name())
|
||||
|
||||
pipe_name = self._get_pipe_name()
|
||||
try:
|
||||
self._remote_pipe = yield from asyncio_open_serial(self._get_pipe_name())
|
||||
except OSError as e:
|
||||
raise VMwareError("Could not open serial pipe '{}': {}".format(pipe_name, e))
|
||||
server = AsyncioTelnetServer(reader=self._remote_pipe,
|
||||
writer=self._remote_pipe,
|
||||
binary=True,
|
||||
|
||||
@@ -315,7 +315,7 @@ class VPCSVM(BaseNode):
|
||||
if sys.platform.startswith("win32"):
|
||||
try:
|
||||
self._process.send_signal(signal.CTRL_BREAK_EVENT)
|
||||
except OSError:
|
||||
except (SystemError, OSError):
|
||||
pass
|
||||
else:
|
||||
try:
|
||||
|
||||
@@ -66,10 +66,8 @@ class Controller:
|
||||
|
||||
def load_appliances(self):
|
||||
self._appliance_templates = {}
|
||||
for directory, builtin in (
|
||||
(get_resource('appliances'), True,), (self.appliances_path(), False,)
|
||||
):
|
||||
if os.path.isdir(directory):
|
||||
for directory, builtin in ((get_resource('appliances'), True,), (self.appliances_path(), False,)):
|
||||
if directory and os.path.isdir(directory):
|
||||
for file in os.listdir(directory):
|
||||
if not file.endswith('.gns3a') and not file.endswith('.gns3appliance'):
|
||||
continue
|
||||
@@ -200,7 +198,7 @@ class Controller:
|
||||
for c in computes:
|
||||
try:
|
||||
yield from self.add_compute(**c)
|
||||
except (aiohttp.web.HTTPConflict, KeyError):
|
||||
except (aiohttp.web.HTTPError, KeyError):
|
||||
pass # Skip not available servers at loading
|
||||
yield from self.load_projects()
|
||||
try:
|
||||
@@ -509,7 +507,7 @@ class Controller:
|
||||
return self._computes[compute_id]
|
||||
except KeyError:
|
||||
if compute_id == "vm":
|
||||
raise aiohttp.web.HTTPNotFound(text="You try to use a node on the GNS3 VM server but the GNS3 VM is not configured")
|
||||
raise aiohttp.web.HTTPNotFound(text="A node is set to use the GNS3 VM server but the GNS3 VM is not configured")
|
||||
raise aiohttp.web.HTTPNotFound(text="Compute ID {} doesn't exist".format(compute_id))
|
||||
|
||||
def has_compute(self, compute_id):
|
||||
|
||||
@@ -27,9 +27,9 @@ from operator import itemgetter
|
||||
|
||||
from ..utils import parse_version
|
||||
from ..utils.images import list_images
|
||||
from ..utils.asyncio import locked_coroutine
|
||||
from ..utils.asyncio import locking, asyncio_ensure_future
|
||||
from ..controller.controller_error import ControllerError
|
||||
from ..version import __version__
|
||||
from ..version import __version__, __version_info__
|
||||
|
||||
|
||||
import logging
|
||||
@@ -95,6 +95,7 @@ class Compute:
|
||||
self._set_auth(user, password)
|
||||
self._cpu_usage_percent = None
|
||||
self._memory_usage_percent = None
|
||||
self._last_error = None
|
||||
self._capabilities = {
|
||||
"version": None,
|
||||
"node_types": []
|
||||
@@ -137,6 +138,14 @@ class Compute:
|
||||
self._password = None
|
||||
self._auth = aiohttp.BasicAuth(self._user, "")
|
||||
|
||||
def set_last_error(self, msg):
|
||||
"""
|
||||
Set the last error message for this compute.
|
||||
|
||||
:param msg: message
|
||||
"""
|
||||
self._last_error = msg
|
||||
|
||||
@asyncio.coroutine
|
||||
def interfaces(self):
|
||||
"""
|
||||
@@ -301,7 +310,8 @@ class Compute:
|
||||
"connected": self._connected,
|
||||
"cpu_usage_percent": self._cpu_usage_percent,
|
||||
"memory_usage_percent": self._memory_usage_percent,
|
||||
"capabilities": self._capabilities
|
||||
"capabilities": self._capabilities,
|
||||
"last_error": self._last_error
|
||||
}
|
||||
|
||||
@asyncio.coroutine
|
||||
@@ -398,13 +408,14 @@ class Compute:
|
||||
except aiohttp.web.HTTPConflict:
|
||||
pass
|
||||
|
||||
@locked_coroutine
|
||||
@locking
|
||||
@asyncio.coroutine
|
||||
def connect(self):
|
||||
"""
|
||||
Check if remote server is accessible
|
||||
"""
|
||||
|
||||
if not self._connected and not self._closed:
|
||||
if not self._connected and not self._closed and self.host:
|
||||
try:
|
||||
log.info("Connecting to compute '{}'".format(self._id))
|
||||
response = yield from self._run_http_query("GET", "/capabilities")
|
||||
@@ -416,7 +427,7 @@ class Compute:
|
||||
if self._connection_failure == 5:
|
||||
log.warning("Cannot connect to compute '{}': {}".format(self._id, e))
|
||||
yield from self._controller.close_compute_projects(self)
|
||||
asyncio.get_event_loop().call_later(2, lambda: asyncio.async(self._try_reconnect()))
|
||||
asyncio.get_event_loop().call_later(2, lambda: asyncio_ensure_future(self._try_reconnect()))
|
||||
return
|
||||
except aiohttp.web.HTTPNotFound:
|
||||
raise aiohttp.web.HTTPConflict(text="The server {} is not a GNS3 server or it's a 1.X server".format(self._id))
|
||||
@@ -428,16 +439,40 @@ class Compute:
|
||||
raise aiohttp.web.HTTPConflict(text="Invalid server url for server {}".format(self._id))
|
||||
|
||||
if "version" not in response.json:
|
||||
msg = "The server {} is not a GNS3 server".format(self._id)
|
||||
log.error(msg)
|
||||
self._http_session.close()
|
||||
raise aiohttp.web.HTTPConflict(text="The server {} is not a GNS3 server".format(self._id))
|
||||
raise aiohttp.web.HTTPConflict(text=msg)
|
||||
self._capabilities = response.json
|
||||
if parse_version(__version__)[:2] != parse_version(response.json["version"])[:2]:
|
||||
self._http_session.close()
|
||||
raise aiohttp.web.HTTPConflict(text="The server {} versions are not compatible {} != {}".format(self._id, __version__, response.json["version"]))
|
||||
|
||||
if response.json["version"].split("-")[0] != __version__.split("-")[0]:
|
||||
if self._name.startswith("GNS3 VM"):
|
||||
msg = "GNS3 version {} is not the same as the GNS3 VM version {}. Please upgrade the GNS3 VM.".format(__version__,
|
||||
response.json["version"])
|
||||
else:
|
||||
msg = "GNS3 controller version {} is not the same as compute server {} version {}".format(__version__,
|
||||
self._name,
|
||||
response.json["version"])
|
||||
if __version_info__[3] == 0:
|
||||
# Stable release
|
||||
log.error(msg)
|
||||
self._http_session.close()
|
||||
self._last_error = msg
|
||||
raise aiohttp.web.HTTPConflict(text=msg)
|
||||
elif parse_version(__version__)[:2] != parse_version(response.json["version"])[:2]:
|
||||
# We don't allow different major version to interact even with dev build
|
||||
log.error(msg)
|
||||
self._http_session.close()
|
||||
self._last_error = msg
|
||||
raise aiohttp.web.HTTPConflict(text=msg)
|
||||
else:
|
||||
msg = "{}\nUsing different versions may result in unexpected problems. Please use at your own risk.".format(msg)
|
||||
self._controller.notification.emit("log.warning", {"message": msg})
|
||||
|
||||
self._notifications = asyncio.gather(self._connect_notification())
|
||||
self._connected = True
|
||||
self._connection_failure = 0
|
||||
self._last_error = None
|
||||
self._controller.notification.emit("compute.updated", self.__json__())
|
||||
|
||||
@asyncio.coroutine
|
||||
@@ -472,7 +507,7 @@ class Compute:
|
||||
|
||||
# Try to reconnect after 1 seconds if server unavailable only if not during tests (otherwise we create a ressources usage bomb)
|
||||
if not hasattr(sys, "_called_from_test") or not sys._called_from_test:
|
||||
asyncio.get_event_loop().call_later(1, lambda: asyncio.async(self.connect()))
|
||||
asyncio.get_event_loop().call_later(1, lambda: asyncio_ensure_future(self.connect()))
|
||||
self._ws = None
|
||||
self._cpu_usage_percent = None
|
||||
self._memory_usage_percent = None
|
||||
|
||||
@@ -55,7 +55,7 @@ class Drawing:
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def ressource_filename(self):
|
||||
def resource_filename(self):
|
||||
"""
|
||||
If the svg content has been dump to an external file return is name otherwise None
|
||||
"""
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import asyncio
|
||||
import aiohttp
|
||||
@@ -23,13 +24,14 @@ import zipfile
|
||||
import tempfile
|
||||
import zipstream
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
import logging
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@asyncio.coroutine
|
||||
def export_project(project, temporary_dir, include_images=False, keep_compute_id=False, allow_all_nodes=False):
|
||||
def export_project(project, temporary_dir, include_images=False, keep_compute_id=False, allow_all_nodes=False, reset_mac_addresses=False):
|
||||
"""
|
||||
Export a project to a zip file.
|
||||
|
||||
@@ -40,6 +42,7 @@ def export_project(project, temporary_dir, include_images=False, keep_compute_id
|
||||
:param include images: save OS images to the zip file
|
||||
:param keep_compute_id: If false replace all compute id by local (standard behavior for .gns3project to make it portable)
|
||||
:param allow_all_nodes: Allow all nodes type to be include in the zip even if not portable
|
||||
:param reset_mac_addresses: Reset MAC addresses for every nodes.
|
||||
|
||||
:returns: ZipStream object
|
||||
"""
|
||||
@@ -59,10 +62,10 @@ def export_project(project, temporary_dir, include_images=False, keep_compute_id
|
||||
# First we process the .gns3 in order to be sure we don't have an error
|
||||
for file in os.listdir(project._path):
|
||||
if file.endswith(".gns3"):
|
||||
yield from _patch_project_file(project, os.path.join(project._path, file), zstream, include_images, keep_compute_id, allow_all_nodes, temporary_dir)
|
||||
yield from _patch_project_file(project, os.path.join(project._path, file), zstream, include_images, keep_compute_id, allow_all_nodes, temporary_dir, reset_mac_addresses)
|
||||
|
||||
# Export the local files
|
||||
for root, dirs, files in os.walk(project._path, topdown=True):
|
||||
for root, dirs, files in os.walk(project._path, topdown=True, followlinks=False):
|
||||
files = [f for f in files if _is_exportable(os.path.join(root, f))]
|
||||
for file in files:
|
||||
path = os.path.join(root, file)
|
||||
@@ -77,6 +80,7 @@ def export_project(project, temporary_dir, include_images=False, keep_compute_id
|
||||
# ignore the .gns3 file
|
||||
if file.endswith(".gns3"):
|
||||
continue
|
||||
_patch_mtime(path)
|
||||
zstream.write(path, os.path.relpath(path, project._path), compress_type=zipfile.ZIP_DEFLATED)
|
||||
|
||||
# Export files from remote computes
|
||||
@@ -99,12 +103,30 @@ def export_project(project, temporary_dir, include_images=False, keep_compute_id
|
||||
f.write(data)
|
||||
response.close()
|
||||
f.close()
|
||||
_patch_mtime(temp_path)
|
||||
zstream.write(temp_path, arcname=compute_file["path"], compress_type=zipfile.ZIP_DEFLATED)
|
||||
downloaded_files.add(compute_file['path'])
|
||||
|
||||
return zstream
|
||||
|
||||
|
||||
def _patch_mtime(path):
|
||||
"""
|
||||
Patch the file mtime because ZIP does not support timestamps before 1980
|
||||
|
||||
:param path: file path
|
||||
"""
|
||||
|
||||
if sys.platform.startswith("win"):
|
||||
# only UNIX type platforms
|
||||
return
|
||||
st = os.stat(path)
|
||||
file_date = datetime.fromtimestamp(st.st_mtime)
|
||||
if file_date.year < 1980:
|
||||
new_mtime = file_date.replace(year=1980).timestamp()
|
||||
os.utime(path, (st.st_atime, new_mtime))
|
||||
|
||||
|
||||
def _is_exportable(path):
|
||||
"""
|
||||
:returns: True if file should not be included in the final archive
|
||||
@@ -114,6 +136,10 @@ def _is_exportable(path):
|
||||
if path.endswith("snapshots"):
|
||||
return False
|
||||
|
||||
# do not export symlinks
|
||||
if os.path.islink(path):
|
||||
return False
|
||||
|
||||
# do not export directories of snapshots
|
||||
if "{sep}snapshots{sep}".format(sep=os.path.sep) in path:
|
||||
return False
|
||||
@@ -135,7 +161,7 @@ def _is_exportable(path):
|
||||
|
||||
|
||||
@asyncio.coroutine
|
||||
def _patch_project_file(project, path, zstream, include_images, keep_compute_id, allow_all_nodes, temporary_dir):
|
||||
def _patch_project_file(project, path, zstream, include_images, keep_compute_id, allow_all_nodes, temporary_dir, reset_mac_addresses):
|
||||
"""
|
||||
Patch a project file (.gns3) to export a project.
|
||||
The .gns3 file is renamed to project.gns3
|
||||
@@ -168,6 +194,10 @@ def _patch_project_file(project, path, zstream, include_images, keep_compute_id,
|
||||
if "properties" in node and node["node_type"] != "docker":
|
||||
for prop, value in node["properties"].items():
|
||||
|
||||
# reset the MAC address
|
||||
if reset_mac_addresses and prop in ("mac_addr", "mac_address"):
|
||||
node["properties"][prop] = None
|
||||
|
||||
if node["node_type"] == "iou":
|
||||
if not prop == "path":
|
||||
continue
|
||||
@@ -228,6 +258,7 @@ def _export_local_image(image, zstream):
|
||||
|
||||
if os.path.exists(path):
|
||||
arcname = os.path.join("images", directory, os.path.basename(image))
|
||||
_patch_mtime(path)
|
||||
zstream.write(path, arcname)
|
||||
return
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ import asyncio
|
||||
import aiohttp
|
||||
import ipaddress
|
||||
|
||||
from ...utils.asyncio import locked_coroutine
|
||||
from ...utils.asyncio import locking, asyncio_ensure_future
|
||||
from .vmware_gns3_vm import VMwareGNS3VM
|
||||
from .virtualbox_gns3_vm import VirtualBoxGNS3VM
|
||||
from .remote_gns3_vm import RemoteGNS3VM
|
||||
@@ -246,13 +246,15 @@ class GNS3VM:
|
||||
except GNS3VMError as e:
|
||||
# User will receive the error later when they will try to use the node
|
||||
try:
|
||||
yield from self._controller.add_compute(compute_id="vm",
|
||||
name="GNS3 VM ({})".format(self.current_engine().vmname),
|
||||
host=None,
|
||||
force=True)
|
||||
compute = yield from self._controller.add_compute(compute_id="vm",
|
||||
name="GNS3 VM ({})".format(self.current_engine().vmname),
|
||||
host=None,
|
||||
force=True)
|
||||
compute.set_last_error(str(e))
|
||||
|
||||
except aiohttp.web.HTTPConflict:
|
||||
pass
|
||||
log.error("Can't start the GNS3 VM: %s", str(e))
|
||||
log.error("Cannot start the GNS3 VM: {}".format(e))
|
||||
|
||||
@asyncio.coroutine
|
||||
def exit_vm(self):
|
||||
@@ -265,7 +267,8 @@ class GNS3VM:
|
||||
except GNS3VMError as e:
|
||||
log.warn(str(e))
|
||||
|
||||
@locked_coroutine
|
||||
@locking
|
||||
@asyncio.coroutine
|
||||
def start(self):
|
||||
"""
|
||||
Start the GNS3 VM
|
||||
@@ -289,8 +292,9 @@ class GNS3VM:
|
||||
yield from engine.start()
|
||||
except Exception as e:
|
||||
yield from self._controller.delete_compute("vm")
|
||||
log.error("Can't start the GNS3 VM: {}".format(str(e)))
|
||||
log.error("Cannot start the GNS3 VM: {}".format(str(e)))
|
||||
yield from compute.update(name="GNS3 VM ({})".format(engine.vmname))
|
||||
compute.set_last_error(str(e))
|
||||
raise e
|
||||
yield from compute.connect() # we can connect now that the VM has started
|
||||
yield from compute.update(name="GNS3 VM ({})".format(engine.vmname),
|
||||
@@ -302,7 +306,7 @@ class GNS3VM:
|
||||
|
||||
# check if the VM is in the same subnet as the local server, start 10 seconds later to give
|
||||
# some time for the compute in the VM to be ready for requests
|
||||
asyncio.get_event_loop().call_later(10, lambda: asyncio.async(self._check_network(compute)))
|
||||
asyncio.get_event_loop().call_later(10, lambda: asyncio_ensure_future(self._check_network(compute)))
|
||||
|
||||
@asyncio.coroutine
|
||||
def _check_network(self, compute):
|
||||
@@ -336,8 +340,11 @@ class GNS3VM:
|
||||
self._controller.notification.emit("log.warning", {"message": msg})
|
||||
except ComputeError as e:
|
||||
log.warning("Could not check the VM is in the same subnet as the local server: {}".format(e))
|
||||
except aiohttp.web.HTTPConflict as e:
|
||||
log.warning("Could not check the VM is in the same subnet as the local server: {}".format(e.text))
|
||||
|
||||
@locked_coroutine
|
||||
@locking
|
||||
@asyncio.coroutine
|
||||
def _suspend(self):
|
||||
"""
|
||||
Suspend the GNS3 VM
|
||||
@@ -349,7 +356,8 @@ class GNS3VM:
|
||||
log.info("Suspend the GNS3 VM")
|
||||
yield from engine.suspend()
|
||||
|
||||
@locked_coroutine
|
||||
@locking
|
||||
@asyncio.coroutine
|
||||
def _stop(self):
|
||||
"""
|
||||
Stop the GNS3 VM
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import sys
|
||||
import aiohttp
|
||||
import logging
|
||||
import asyncio
|
||||
@@ -107,7 +108,6 @@ class VirtualBoxGNS3VM(BaseGNS3VM):
|
||||
Check if the DHCP server associated with a vboxnet is enabled.
|
||||
|
||||
:param vboxnet: vboxnet name
|
||||
|
||||
:returns: boolean
|
||||
"""
|
||||
|
||||
@@ -125,6 +125,41 @@ class VirtualBoxGNS3VM(BaseGNS3VM):
|
||||
return True
|
||||
return False
|
||||
|
||||
@asyncio.coroutine
|
||||
def _check_vboxnet_exists(self, vboxnet):
|
||||
"""
|
||||
Check if the vboxnet interface exists
|
||||
|
||||
:param vboxnet: vboxnet name
|
||||
:returns: boolean
|
||||
"""
|
||||
|
||||
properties = yield from self._execute("list", ["hostonlyifs"])
|
||||
for prop in properties.splitlines():
|
||||
try:
|
||||
name, value = prop.split(':', 1)
|
||||
except ValueError:
|
||||
continue
|
||||
if name.strip() == "Name" and value.strip() == vboxnet:
|
||||
return True
|
||||
return False
|
||||
|
||||
@asyncio.coroutine
|
||||
def _find_first_available_vboxnet(self):
|
||||
"""
|
||||
Find the first available vboxnet.
|
||||
"""
|
||||
|
||||
properties = yield from self._execute("list", ["hostonlyifs"])
|
||||
for prop in properties.splitlines():
|
||||
try:
|
||||
name, value = prop.split(':', 1)
|
||||
except ValueError:
|
||||
continue
|
||||
if name.strip() == "Name":
|
||||
return value.strip()
|
||||
return None
|
||||
|
||||
@asyncio.coroutine
|
||||
def _check_vbox_port_forwarding(self):
|
||||
"""
|
||||
@@ -158,18 +193,32 @@ class VirtualBoxGNS3VM(BaseGNS3VM):
|
||||
# get a NAT interface number
|
||||
nat_interface_number = yield from self._look_for_interface("nat")
|
||||
if nat_interface_number < 0:
|
||||
raise GNS3VMError("The GNS3 VM: {} must have a NAT interface configured in order to start".format(self.vmname))
|
||||
raise GNS3VMError('VM "{}" must have a NAT interface configured in order to start'.format(self.vmname))
|
||||
|
||||
hostonly_interface_number = yield from self._look_for_interface("hostonly")
|
||||
if hostonly_interface_number < 0:
|
||||
raise GNS3VMError("The GNS3 VM: {} must have a host only interface configured in order to start".format(self.vmname))
|
||||
raise GNS3VMError('VM "{}" must have a host-only interface configured in order to start'.format(self.vmname))
|
||||
|
||||
vboxnet = yield from self._look_for_vboxnet(hostonly_interface_number)
|
||||
if vboxnet is None:
|
||||
raise GNS3VMError("VirtualBox host-only network could not be found for interface {} on GNS3 VM".format(hostonly_interface_number))
|
||||
raise GNS3VMError('A VirtualBox host-only network could not be found on network adapter {} for "{}"'.format(hostonly_interface_number, self._vmname))
|
||||
|
||||
if not (yield from self._check_vboxnet_exists(vboxnet)):
|
||||
if sys.platform.startswith("win") and vboxnet == "vboxnet0":
|
||||
# The GNS3 VM is configured with vboxnet0 by default which is not available
|
||||
# on Windows. Try to patch this with the first available vboxnet we find.
|
||||
first_available_vboxnet = yield from self._find_first_available_vboxnet()
|
||||
if first_available_vboxnet is None:
|
||||
raise GNS3VMError('Please add a VirtualBox host-only network with DHCP enabled and attached it to network adapter {} for "{}"'.format(hostonly_interface_number, self._vmname))
|
||||
yield from self.set_hostonly_network(hostonly_interface_number, first_available_vboxnet)
|
||||
vboxnet = first_available_vboxnet
|
||||
else:
|
||||
raise GNS3VMError('VirtualBox host-only network "{}" does not exist, please make the sure the network adapter {} configuration is valid for "{}"'.format(vboxnet,
|
||||
hostonly_interface_number,
|
||||
self._vmname))
|
||||
|
||||
if not (yield from self._check_dhcp_server(vboxnet)):
|
||||
raise GNS3VMError("DHCP must be enabled on VirtualBox host-only network: {} for GNS3 VM".format(vboxnet))
|
||||
raise GNS3VMError('DHCP must be enabled on VirtualBox host-only network "{}"'.format(vboxnet))
|
||||
|
||||
vm_state = yield from self._get_state()
|
||||
log.info('"{}" state is {}'.format(self._vmname, vm_state))
|
||||
@@ -311,3 +360,17 @@ class VirtualBoxGNS3VM(BaseGNS3VM):
|
||||
|
||||
yield from self._execute("modifyvm", [self._vmname, "--memory", str(ram)], timeout=3)
|
||||
log.info("GNS3 VM RAM amount set to {}".format(ram))
|
||||
|
||||
@asyncio.coroutine
|
||||
def set_hostonly_network(self, adapter_number, hostonly_network_name):
|
||||
"""
|
||||
Set a VirtualBox host-only network on a network adapter for the GNS3 VM.
|
||||
|
||||
:param adapter_number: network adapter number
|
||||
:param hostonly_network_name: name of the VirtualBox host-only network
|
||||
"""
|
||||
|
||||
yield from self._execute("modifyvm", [self._vmname, "--hostonlyadapter{}".format(adapter_number), hostonly_network_name], timeout=3)
|
||||
log.info('VirtualBox host-only network "{}" set on network adapter {} for "{}"'.format(hostonly_network_name,
|
||||
adapter_number,
|
||||
self._vmname))
|
||||
@@ -72,13 +72,15 @@ class VMwareGNS3VM(BaseGNS3VM):
|
||||
if ram % 4 != 0:
|
||||
raise GNS3VMError("Allocated memory {} for the GNS3 VM must be a multiple of 4".format(ram))
|
||||
|
||||
available_vcpus = psutil.cpu_count(logical=False)
|
||||
available_vcpus = psutil.cpu_count()
|
||||
if vcpus > available_vcpus:
|
||||
raise GNS3VMError("You have allocated too many vCPUs for the GNS3 VM! (max available is {} vCPUs)".format(available_vcpus))
|
||||
|
||||
cores_per_sockets = int(available_vcpus / psutil.cpu_count(logical=False))
|
||||
try:
|
||||
pairs = VMware.parse_vmware_file(self._vmx_path)
|
||||
pairs["numvcpus"] = str(vcpus)
|
||||
pairs["cpuid.coresPerSocket"] = str(cores_per_sockets)
|
||||
pairs["memsize"] = str(ram)
|
||||
VMware.write_vmx_file(self._vmx_path, pairs)
|
||||
log.info("GNS3 VM vCPU count set to {} and RAM amount set to {}".format(vcpus, ram))
|
||||
|
||||
@@ -184,9 +184,11 @@ def _move_files_to_compute(compute, project_id, directory, files_path):
|
||||
|
||||
location = os.path.join(directory, files_path)
|
||||
if os.path.exists(location):
|
||||
for (dirpath, dirnames, filenames) in os.walk(location):
|
||||
for (dirpath, dirnames, filenames) in os.walk(location, followlinks=False):
|
||||
for filename in filenames:
|
||||
path = os.path.join(dirpath, filename)
|
||||
if os.path.islink(path):
|
||||
continue
|
||||
dst = os.path.relpath(path, directory)
|
||||
yield from _upload_file(compute, project_id, path, dst)
|
||||
yield from wait_run_in_executor(shutil.rmtree, os.path.join(directory, files_path))
|
||||
@@ -213,9 +215,11 @@ def _import_images(controller, path):
|
||||
|
||||
image_dir = controller.images_path()
|
||||
root = os.path.join(path, "images")
|
||||
for (dirpath, dirnames, filenames) in os.walk(root):
|
||||
for (dirpath, dirnames, filenames) in os.walk(root, followlinks=False):
|
||||
for filename in filenames:
|
||||
path = os.path.join(dirpath, filename)
|
||||
if os.path.islink(path):
|
||||
continue
|
||||
dst = os.path.join(image_dir, os.path.relpath(path, root))
|
||||
os.makedirs(os.path.dirname(dst), exist_ok=True)
|
||||
shutil.move(path, dst)
|
||||
@@ -22,6 +22,8 @@ import html
|
||||
import asyncio
|
||||
import aiohttp
|
||||
|
||||
from gns3server.utils.asyncio import asyncio_ensure_future
|
||||
|
||||
import logging
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@@ -296,7 +298,7 @@ class Link:
|
||||
|
||||
self._capturing = True
|
||||
self._capture_file_name = capture_file_name
|
||||
self._streaming_pcap = asyncio.async(self._start_streaming_pcap())
|
||||
self._streaming_pcap = asyncio_ensure_future(self._start_streaming_pcap())
|
||||
self._project.controller.notification.emit("link.updated", self.__json__())
|
||||
|
||||
@asyncio.coroutine
|
||||
|
||||
@@ -91,12 +91,12 @@ class Node:
|
||||
|
||||
# Update node properties with additional elements
|
||||
for prop in kwargs:
|
||||
if prop not in ignore_properties:
|
||||
if prop and prop not in ignore_properties:
|
||||
if hasattr(self, prop):
|
||||
try:
|
||||
setattr(self, prop, kwargs[prop])
|
||||
except AttributeError as e:
|
||||
log.critical("Can't set attribute %s", prop)
|
||||
log.critical("Cannot set attribute '%s'".format(prop))
|
||||
raise e
|
||||
else:
|
||||
if prop not in self.CONTROLLER_ONLY_PROPERTIES and kwargs[prop] is not None and kwargs[prop] != "":
|
||||
@@ -175,9 +175,9 @@ class Node:
|
||||
if not os.path.isabs(path):
|
||||
path = os.path.join(self.project.controller.configs_path(), path)
|
||||
try:
|
||||
with open(path) as f:
|
||||
with open(path, encoding="utf-8") as f:
|
||||
return f.read()
|
||||
except (PermissionError, OSError):
|
||||
except OSError:
|
||||
return None
|
||||
|
||||
@property
|
||||
@@ -254,7 +254,7 @@ class Node:
|
||||
try:
|
||||
self._width, self._height, filetype = self._project.controller.symbols.get_size(val)
|
||||
except (ValueError, OSError) as e:
|
||||
log.error("Could not write symbol: {}".format(e))
|
||||
log.error("Could not set symbol: {}".format(e))
|
||||
# If symbol is invalid we replace it by the default
|
||||
self.symbol = ":/symbols/computer.svg"
|
||||
if self._label is None:
|
||||
|
||||
@@ -33,8 +33,8 @@ class ATMPort(SerialPort):
|
||||
"""
|
||||
return "ATM"
|
||||
|
||||
@property
|
||||
def short_name_type(self):
|
||||
@staticmethod
|
||||
def short_name_type():
|
||||
"""
|
||||
Returns the short name type for this port.
|
||||
|
||||
@@ -42,10 +42,6 @@ class ATMPort(SerialPort):
|
||||
"""
|
||||
return "a"
|
||||
|
||||
@property
|
||||
def short_name(self):
|
||||
return "{}".format(self._port_number)
|
||||
|
||||
@property
|
||||
def data_link_types(self):
|
||||
"""
|
||||
|
||||
@@ -39,8 +39,8 @@ class EthernetPort(Port):
|
||||
|
||||
return "Ethernet"
|
||||
|
||||
@property
|
||||
def short_name_type(self):
|
||||
@staticmethod
|
||||
def short_name_type():
|
||||
"""
|
||||
Returns the short name type for this port.
|
||||
|
||||
|
||||
@@ -34,8 +34,8 @@ class FastEthernetPort(Port):
|
||||
|
||||
return "FastEthernet"
|
||||
|
||||
@property
|
||||
def short_name_type(self):
|
||||
@staticmethod
|
||||
def short_name_type():
|
||||
"""
|
||||
Returns the short name type for this port.
|
||||
|
||||
|
||||
@@ -34,10 +34,6 @@ class FrameRelayPort(SerialPort):
|
||||
|
||||
return "FrameRelay"
|
||||
|
||||
@property
|
||||
def short_name(self):
|
||||
return "{}".format(self._port_number)
|
||||
|
||||
@property
|
||||
def data_link_types(self):
|
||||
"""
|
||||
|
||||
@@ -34,8 +34,8 @@ class GigabitEthernetPort(Port):
|
||||
|
||||
return "GigabitEthernet"
|
||||
|
||||
@property
|
||||
def short_name_type(self):
|
||||
@staticmethod
|
||||
def short_name_type():
|
||||
"""
|
||||
Returns the short name type for this port.
|
||||
|
||||
|
||||
@@ -63,12 +63,14 @@ class Port:
|
||||
|
||||
@property
|
||||
def short_name(self):
|
||||
# If port name format has change we use the port name as the short name (1.X behavior)
|
||||
# If port name format has changed we use the port name as the short name (1.X behavior)
|
||||
if self._short_name:
|
||||
return self._short_name
|
||||
elif not self._name.startswith("{}{}".format(self.long_name_type(), self._interface_number)):
|
||||
return self._name
|
||||
return self.short_name_type + "{}/{}".format(self._interface_number, self._port_number)
|
||||
elif '/' 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)):
|
||||
return self.short_name_type() + "{}".format(self._interface_number)
|
||||
return self._name
|
||||
|
||||
@short_name.setter
|
||||
def short_name(self, val):
|
||||
|
||||
@@ -64,7 +64,7 @@ class StandardPortFactory:
|
||||
for port_number in range(0, port_by_adapter):
|
||||
if first_port_name and adapter_number == 0:
|
||||
port_name = first_port_name
|
||||
port = PortFactory(port_name, segment_number, adapter_number, port_number, "ethernet")
|
||||
port = PortFactory(port_name, segment_number, adapter_number, port_number, "ethernet", short_name=first_port_name)
|
||||
else:
|
||||
try:
|
||||
port_name = port_name_format.format(
|
||||
@@ -72,7 +72,7 @@ class StandardPortFactory:
|
||||
segment_number,
|
||||
adapter=adapter_number,
|
||||
**cls._generate_replacement(interface_number, segment_number))
|
||||
except (ValueError, KeyError) as e:
|
||||
except (IndexError, ValueError, KeyError) as e:
|
||||
raise aiohttp.web.HTTPConflict(text="Invalid port name format {}: {}".format(port_name_format, str(e)))
|
||||
port = PortFactory(port_name, segment_number, adapter_number, port_number, "ethernet")
|
||||
interface_number += 1
|
||||
@@ -190,7 +190,9 @@ class DynamipsPortFactory:
|
||||
if port_class:
|
||||
for port_number in range(0, cls.ADAPTER_MATRIX[properties[name]]["nb_ports"]):
|
||||
name = "{}{}/{}".format(port_class.long_name_type(), adapter_number, port_number)
|
||||
ports.append(port_class(name, adapter_number, adapter_number, port_number))
|
||||
port = port_class(name, adapter_number, adapter_number, port_number)
|
||||
port.short_name = "{}{}/{}".format(port_class.short_name_type(), adapter_number, port_number)
|
||||
ports.append(port)
|
||||
adapter_number += 1
|
||||
elif name.startswith("wic") and properties[name]:
|
||||
port_class = cls.WIC_MATRIX[properties[name]]["port"]
|
||||
@@ -198,7 +200,7 @@ class DynamipsPortFactory:
|
||||
for port_number in range(0, cls.WIC_MATRIX[properties[name]]["nb_ports"]):
|
||||
name = "{}{}/{}".format(port_class.long_name_type(), 0, display_wic_port_number)
|
||||
port = port_class(name, 0, 0, wic_port_number)
|
||||
port.short_name = "{}{}/{}".format(port.short_name_type, 0, display_wic_port_number)
|
||||
port.short_name = "{}{}/{}".format(port_class.short_name_type(), 0, display_wic_port_number)
|
||||
ports.append(port)
|
||||
display_wic_port_number += 1
|
||||
wic_port_number += 1
|
||||
|
||||
@@ -33,8 +33,8 @@ class POSPort(SerialPort):
|
||||
"""
|
||||
return "POS"
|
||||
|
||||
@property
|
||||
def short_name_type(self):
|
||||
@staticmethod
|
||||
def short_name_type():
|
||||
"""
|
||||
Returns the short name type for this port.
|
||||
|
||||
|
||||
@@ -34,8 +34,8 @@ class SerialPort(Port):
|
||||
|
||||
return "Serial"
|
||||
|
||||
@property
|
||||
def short_name_type(self):
|
||||
@staticmethod
|
||||
def short_name_type():
|
||||
"""
|
||||
Returns the short name type for this port.
|
||||
|
||||
|
||||
@@ -36,8 +36,9 @@ from .udp_link import UDPLink
|
||||
from ..config import Config
|
||||
from ..utils.path import check_path_allowed, get_default_project_directory
|
||||
from ..utils.asyncio.pool import Pool
|
||||
from ..utils.asyncio import locked_coroutine
|
||||
from ..utils.asyncio import locking
|
||||
from ..utils.asyncio import wait_run_in_executor
|
||||
from ..utils.asyncio import asyncio_ensure_future
|
||||
from .export_project import export_project
|
||||
from .import_project import import_project
|
||||
|
||||
@@ -145,7 +146,6 @@ class Project:
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
def reset(self):
|
||||
"""
|
||||
Called when open/close a project. Cleanup internal stuff
|
||||
@@ -524,7 +524,8 @@ class Project:
|
||||
self.dump()
|
||||
return node
|
||||
|
||||
@locked_coroutine
|
||||
@locking
|
||||
@asyncio.coroutine
|
||||
def __delete_node_links(self, node):
|
||||
"""
|
||||
Delete all link connected to this node.
|
||||
@@ -702,24 +703,26 @@ class Project:
|
||||
# We don't care if a compute is down at this step
|
||||
except (ComputeError, aiohttp.web.HTTPError, aiohttp.ClientResponseError, TimeoutError):
|
||||
pass
|
||||
self._cleanPictures()
|
||||
self._clean_pictures()
|
||||
self._status = "closed"
|
||||
if not ignore_notification:
|
||||
self.controller.notification.emit("project.closed", self.__json__())
|
||||
|
||||
def _cleanPictures(self):
|
||||
def _clean_pictures(self):
|
||||
"""
|
||||
Delete unused images
|
||||
Delete unused pictures.
|
||||
"""
|
||||
|
||||
# Project have been deleted
|
||||
if not os.path.exists(self.path):
|
||||
# Project have been deleted or is loading or is not opened
|
||||
if not os.path.exists(self.path) or self._loading or self._status != "opened":
|
||||
return
|
||||
try:
|
||||
pictures = set(os.listdir(self.pictures_directory))
|
||||
for drawing in self._drawings.values():
|
||||
try:
|
||||
pictures.remove(drawing.ressource_filename)
|
||||
resource_filename = drawing.resource_filename
|
||||
if resource_filename:
|
||||
pictures.remove(resource_filename)
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
@@ -731,11 +734,12 @@ class Project:
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
|
||||
for pict in pictures:
|
||||
os.remove(os.path.join(self.pictures_directory, pict))
|
||||
for pic_filename in pictures:
|
||||
path = os.path.join(self.pictures_directory, pic_filename)
|
||||
log.info("Deleting unused picture '{}'".format(path))
|
||||
os.remove(path)
|
||||
except OSError as e:
|
||||
log.warning(str(e))
|
||||
log.warning("Could not delete unused pictures: {}".format(e))
|
||||
|
||||
@asyncio.coroutine
|
||||
def delete(self):
|
||||
@@ -782,7 +786,8 @@ class Project:
|
||||
def _topology_file(self):
|
||||
return os.path.join(self.path, self._filename)
|
||||
|
||||
@locked_coroutine
|
||||
@locking
|
||||
@asyncio.coroutine
|
||||
def open(self):
|
||||
"""
|
||||
Load topology elements
|
||||
@@ -840,7 +845,7 @@ class Project:
|
||||
link = yield from self.add_link(link_id=link_data["link_id"])
|
||||
if "filters" in link_data:
|
||||
yield from link.update_filters(link_data["filters"])
|
||||
for node_link in link_data["nodes"]:
|
||||
for node_link in link_data.get("nodes", []):
|
||||
node = self.get_node(node_link["node_id"])
|
||||
port = node.get_port(node_link["adapter_number"], node_link["port_number"])
|
||||
if port is None:
|
||||
@@ -868,7 +873,7 @@ class Project:
|
||||
try:
|
||||
if os.path.exists(path + ".backup"):
|
||||
shutil.copy(path + ".backup", path)
|
||||
except (PermissionError, OSError):
|
||||
except OSError:
|
||||
pass
|
||||
self._status = "closed"
|
||||
self._loading = False
|
||||
@@ -887,7 +892,7 @@ class Project:
|
||||
# Start all in the background without waiting for completion
|
||||
# we ignore errors because we want to let the user open
|
||||
# their project and fix it
|
||||
asyncio.async(self.start_all())
|
||||
asyncio_ensure_future(self.start_all())
|
||||
|
||||
@asyncio.coroutine
|
||||
def wait_loaded(self):
|
||||
@@ -926,13 +931,13 @@ class Project:
|
||||
self.dump()
|
||||
try:
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
zipstream = yield from export_project(self, tmpdir, keep_compute_id=True, allow_all_nodes=True)
|
||||
zipstream = yield from export_project(self, tmpdir, keep_compute_id=True, allow_all_nodes=True, reset_mac_addresses=True)
|
||||
project_path = os.path.join(tmpdir, "project.gns3p")
|
||||
yield from wait_run_in_executor(self._create_duplicate_project_file, project_path, zipstream)
|
||||
with open(project_path, "rb") as f:
|
||||
project = yield from import_project(self._controller, str(uuid.uuid4()), f, location=location, name=name, keep_compute_id=True)
|
||||
except (OSError, UnicodeEncodeError) as e:
|
||||
raise aiohttp.web.HTTPConflict(text="Can not duplicate project: {}".format(str(e)))
|
||||
except (ValueError, OSError, UnicodeEncodeError) as e:
|
||||
raise aiohttp.web.HTTPConflict(text="Cannot duplicate project: {}".format(str(e)))
|
||||
|
||||
if previous_status == "closed":
|
||||
yield from self.close()
|
||||
|
||||
@@ -101,7 +101,7 @@ class Snapshot:
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
zipstream = yield from export_project(self._project, tmpdir, keep_compute_id=True, allow_all_nodes=True)
|
||||
yield from wait_run_in_executor(self._create_snapshot_file, zipstream)
|
||||
except OSError as e:
|
||||
except (ValueError, OSError, RuntimeError) as e:
|
||||
raise aiohttp.web.HTTPConflict(text="Could not create snapshot file '{}': {}".format(self.path, e))
|
||||
|
||||
@asyncio.coroutine
|
||||
|
||||
@@ -22,6 +22,9 @@ from ..utils.get_resource import get_resource
|
||||
from ..utils.picture import get_size
|
||||
from ..config import Config
|
||||
|
||||
import logging
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class Symbols:
|
||||
"""
|
||||
@@ -72,19 +75,25 @@ class Symbols:
|
||||
def symbols_path(self):
|
||||
directory = os.path.expanduser(Config.instance().get_section_config("Server").get("symbols_path", "~/GNS3/symbols"))
|
||||
if directory:
|
||||
os.makedirs(directory, exist_ok=True)
|
||||
try:
|
||||
os.makedirs(directory, exist_ok=True)
|
||||
except OSError as e:
|
||||
log.error("Could not create symbol directory '{}': {}".format(directory, e))
|
||||
return None
|
||||
return directory
|
||||
|
||||
def get_path(self, symbol_id):
|
||||
try:
|
||||
return self._symbols_path[symbol_id]
|
||||
# Symbol not found refresh cache
|
||||
# Symbol not found, let's refresh the cache
|
||||
except KeyError:
|
||||
self.list()
|
||||
try:
|
||||
self.list()
|
||||
return self._symbols_path[symbol_id]
|
||||
except KeyError:
|
||||
return self._symbols_path[":/symbols/computer.svg"]
|
||||
except (OSError, KeyError):
|
||||
log.warning("Could not retrieve symbol '{}'".format(symbol_id))
|
||||
symbols_path = self._symbols_path
|
||||
return symbols_path[":/symbols/computer.svg"]
|
||||
|
||||
def get_size(self, symbol_id):
|
||||
try:
|
||||
|
||||
@@ -409,7 +409,7 @@ def _convert_1_3_later(topo, topo_path):
|
||||
symbol = old_node.get("symbol", ":/symbols/computer.svg")
|
||||
old_node["ports"] = _create_cloud(node, old_node, symbol)
|
||||
else:
|
||||
raise NotImplementedError("Conversion of {} is not supported".format(old_node["type"]))
|
||||
raise aiohttp.web.HTTPConflict(text="Conversion of {} is not supported".format(old_node["type"]))
|
||||
|
||||
for prop in old_node.get("properties", {}):
|
||||
if prop not in ["console", "name", "console_type", "console_host", "use_ubridge"]:
|
||||
@@ -608,13 +608,13 @@ def _create_cloud(node, old_node, icon):
|
||||
elif old_port["name"].startswith("nio_nat"):
|
||||
continue
|
||||
else:
|
||||
raise NotImplementedError("The conversion of cloud with {} is not supported".format(old_port["name"]))
|
||||
raise aiohttp.web.HTTPConflict(text="The conversion of cloud with {} is not supported".format(old_port["name"]))
|
||||
|
||||
if port_type == "udp":
|
||||
try:
|
||||
_, lport, rhost, rport = old_port["name"].split(":")
|
||||
except ValueError:
|
||||
raise NotImplementedError("UDP tunnel using IPV6 is not supported in cloud")
|
||||
raise aiohttp.web.HTTPConflict(text="UDP tunnel using IPV6 is not supported in cloud")
|
||||
port = {
|
||||
"name": "UDP tunnel {}".format(len(ports) + 1),
|
||||
"port_number": len(ports) + 1,
|
||||
@@ -645,7 +645,7 @@ def _convert_snapshots(topo_dir):
|
||||
old_snapshots_dir = os.path.join(topo_dir, "project-files", "snapshots")
|
||||
if os.path.exists(old_snapshots_dir):
|
||||
new_snapshots_dir = os.path.join(topo_dir, "snapshots")
|
||||
os.makedirs(new_snapshots_dir)
|
||||
os.makedirs(new_snapshots_dir, exist_ok=True)
|
||||
|
||||
for snapshot in os.listdir(old_snapshots_dir):
|
||||
snapshot_dir = os.path.join(old_snapshots_dir, snapshot)
|
||||
|
||||
@@ -54,7 +54,7 @@ class UDPLink(Link):
|
||||
try:
|
||||
(node1_host, node2_host) = yield from node1.compute.get_ip_on_same_subnet(node2.compute)
|
||||
except ValueError as e:
|
||||
raise aiohttp.web.HTTPConflict(text=str(e))
|
||||
raise aiohttp.web.HTTPConflict(text="Cannot get an IP address on same subnet: {}".format(e))
|
||||
|
||||
# Reserve a UDP port on both side
|
||||
response = yield from node1.compute.post("/projects/{}/ports/udp".format(self._project.id))
|
||||
|
||||
@@ -20,7 +20,7 @@ import sys
|
||||
import struct
|
||||
import aiohttp
|
||||
import platform
|
||||
|
||||
import locale
|
||||
|
||||
try:
|
||||
import raven
|
||||
@@ -57,7 +57,7 @@ class CrashReport:
|
||||
Report crash to a third party service
|
||||
"""
|
||||
|
||||
DSN = "sync+https://95d9ad01f98746c2b9dacb7399526440:1e2d320de7be49ebbdebf47caf5b47ff@sentry.io/38482"
|
||||
DSN = "https://f4b829dcc310479882c429a04ec8e05e:e429c6d7e7d346d0b539da15fb737055@sentry.io/38482"
|
||||
if hasattr(sys, "frozen"):
|
||||
cacert = get_resource("cacert.pem")
|
||||
if cacert is not None and os.path.isfile(cacert):
|
||||
@@ -92,7 +92,8 @@ class CrashReport:
|
||||
"url": request.path,
|
||||
"data": request.json,
|
||||
})
|
||||
self._client.tags_context({
|
||||
|
||||
context = {
|
||||
"os:name": platform.system(),
|
||||
"os:release": platform.release(),
|
||||
"os:win_32": " ".join(platform.win32_ver()),
|
||||
@@ -105,7 +106,28 @@ class CrashReport:
|
||||
"python:bit": struct.calcsize("P") * 8,
|
||||
"python:encoding": sys.getdefaultencoding(),
|
||||
"python:frozen": "{}".format(hasattr(sys, "frozen"))
|
||||
})
|
||||
}
|
||||
|
||||
if sys.platform.startswith("linux") and not hasattr(sys, "frozen"):
|
||||
# add locale information
|
||||
try:
|
||||
language, encoding = locale.getlocale()
|
||||
context["locale:language"] = language
|
||||
context["locale:encoding"] = encoding
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
# add GNS3 VM version if it exists
|
||||
home = os.path.expanduser("~")
|
||||
gns3vm_version = os.path.join(home, ".config", "GNS3", "gns3vm_version")
|
||||
if os.path.isfile(gns3vm_version):
|
||||
try:
|
||||
with open(gns3vm_version) as fd:
|
||||
context["gns3vm:version"] = fd.readline().strip()
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
self._client.tags_context(context)
|
||||
try:
|
||||
report = self._client.captureException()
|
||||
except Exception as e:
|
||||
|
||||
@@ -263,10 +263,11 @@ class DockerHandler:
|
||||
|
||||
docker_manager = Docker.instance()
|
||||
container = docker_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
|
||||
nio = container.ethernet_adapters[int(request.match_info["adapter_number"])].get_nio(0)
|
||||
adapter_number = int(request.match_info["adapter_number"])
|
||||
nio = container.ethernet_adapters[adapter_number].get_nio(0)
|
||||
if "filters" in request.json and nio:
|
||||
nio.filters = request.json["filters"]
|
||||
yield from container.adapter_update_nio_binding(int(request.match_info["port_number"]), nio)
|
||||
yield from container.adapter_update_nio_binding(adapter_number, nio)
|
||||
response.set_status(201)
|
||||
response.json(request.json)
|
||||
|
||||
|
||||
@@ -301,12 +301,9 @@ class IOUHandler:
|
||||
nio = vm.adapters[adapter_number].get_nio(port_number)
|
||||
if "filters" in request.json and nio:
|
||||
nio.filters = request.json["filters"]
|
||||
yield from vm.adapter_update_nio_binding(
|
||||
adapter_number,
|
||||
port_number,
|
||||
nio)
|
||||
yield from vm.adapter_update_nio_binding(adapter_number, port_number, nio)
|
||||
response.set_status(201)
|
||||
response.json(nio)
|
||||
response.json(request.json)
|
||||
|
||||
@Route.delete(
|
||||
r"/projects/{project_id}/iou/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio",
|
||||
|
||||
@@ -20,6 +20,7 @@ import aiohttp
|
||||
from aiohttp.web import WebSocketResponse
|
||||
from gns3server.web.route import Route
|
||||
from gns3server.compute.notification_manager import NotificationManager
|
||||
from gns3server.utils.asyncio import asyncio_ensure_future
|
||||
|
||||
|
||||
@asyncio.coroutine
|
||||
@@ -43,7 +44,7 @@ class NotificationHandler:
|
||||
ws = WebSocketResponse()
|
||||
yield from ws.prepare(request)
|
||||
|
||||
asyncio.async(process_websocket(ws))
|
||||
asyncio_ensure_future(process_websocket(ws))
|
||||
|
||||
with notifications.queue() as queue:
|
||||
while True:
|
||||
|
||||
@@ -42,9 +42,9 @@ class ServerHandler:
|
||||
|
||||
@Route.get(
|
||||
r"/debug",
|
||||
description="Return debug informations about the compute",
|
||||
description="Return debug information about the compute",
|
||||
status_codes={
|
||||
201: "Writed"
|
||||
201: "Written"
|
||||
})
|
||||
def debug(request, response):
|
||||
response.content_type = "text/plain"
|
||||
|
||||
@@ -279,12 +279,13 @@ class VMwareHandler:
|
||||
|
||||
vmware_manager = VMware.instance()
|
||||
vm = vmware_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
|
||||
nio = vm.ethernet_adapters[int(request.match_info["adapter_number"])]
|
||||
adapter_number = int(request.match_info["adapter_number"])
|
||||
nio = vm.ethernet_adapters[adapter_number]
|
||||
if "filters" in request.json and nio:
|
||||
nio.filters = request.json["filters"]
|
||||
yield from vm.adapter_update_nio_binding(int(request.match_info["adapter_number"]), nio)
|
||||
response.set_status(201)
|
||||
response.json(request.json)
|
||||
yield from vm.adapter_update_nio_binding(adapter_number, nio)
|
||||
response.set_status(201)
|
||||
response.json(request.json)
|
||||
|
||||
@Route.delete(
|
||||
r"/projects/{project_id}/vmware/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio",
|
||||
|
||||
@@ -67,8 +67,9 @@ class ApplianceHandler:
|
||||
|
||||
controller = Controller.instance()
|
||||
project = controller.get_project(request.match_info["project_id"])
|
||||
yield from project.add_node_from_appliance(request.match_info["appliance_id"],
|
||||
x=request.json["x"],
|
||||
y=request.json["y"],
|
||||
compute_id=request.json.get("compute_id"))
|
||||
node = yield from project.add_node_from_appliance(request.match_info["appliance_id"],
|
||||
x=request.json["x"],
|
||||
y=request.json["y"],
|
||||
compute_id=request.json.get("compute_id"))
|
||||
response.set_status(201)
|
||||
response.json(node)
|
||||
@@ -59,7 +59,7 @@ class ComputeHandler:
|
||||
|
||||
@Route.put(
|
||||
r"/computes/{compute_id}",
|
||||
description="Get a compute server information",
|
||||
description="Update a compute server",
|
||||
status_codes={
|
||||
200: "Compute server updated",
|
||||
400: "Invalid request",
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import os
|
||||
import sys
|
||||
import aiohttp
|
||||
import asyncio
|
||||
import tempfile
|
||||
@@ -25,6 +26,7 @@ from gns3server.controller import Controller
|
||||
from gns3server.controller.import_project import import_project
|
||||
from gns3server.controller.export_project import export_project
|
||||
from gns3server.config import Config
|
||||
from gns3server.utils.asyncio import asyncio_ensure_future
|
||||
|
||||
|
||||
from gns3server.schemas.project import (
|
||||
@@ -246,7 +248,7 @@ class ProjectHandler:
|
||||
ws = aiohttp.web.WebSocketResponse()
|
||||
yield from ws.prepare(request)
|
||||
|
||||
asyncio.async(process_websocket(ws))
|
||||
asyncio_ensure_future(process_websocket(ws))
|
||||
|
||||
with controller.notification.queue(project) as queue:
|
||||
while True:
|
||||
@@ -285,9 +287,9 @@ class ProjectHandler:
|
||||
|
||||
try:
|
||||
with tempfile.TemporaryDirectory() as tmp_dir:
|
||||
datas = yield from export_project(
|
||||
project, tmp_dir,
|
||||
include_images=bool(int(request.query.get("include_images", "0"))))
|
||||
stream = yield from export_project(project,
|
||||
tmp_dir,
|
||||
include_images=bool(int(request.query.get("include_images", "0"))))
|
||||
# We need to do that now because export could failed and raise an HTTP error
|
||||
# that why response start need to be the later possible
|
||||
response.content_type = 'application/gns3project'
|
||||
@@ -295,15 +297,15 @@ class ProjectHandler:
|
||||
response.enable_chunked_encoding()
|
||||
yield from response.prepare(request)
|
||||
|
||||
for data in datas:
|
||||
for data in stream:
|
||||
response.write(data)
|
||||
yield from response.drain()
|
||||
|
||||
yield from response.write_eof()
|
||||
# Will be raise if you have no space left or permission issue on your temporary directory
|
||||
# RuntimeError: something was wrong during the zip process
|
||||
except (OSError, RuntimeError) as e:
|
||||
raise aiohttp.web.HTTPNotFound(text="Can't export project: {}".format(str(e)))
|
||||
except (ValueError, OSError, RuntimeError) as e:
|
||||
raise aiohttp.web.HTTPNotFound(text="Cannot export project: {}".format(str(e)))
|
||||
|
||||
@Route.post(
|
||||
r"/projects/{project_id}/import",
|
||||
@@ -332,14 +334,25 @@ class ProjectHandler:
|
||||
# We write the content to a temporary location and after we extract it all.
|
||||
# It could be more optimal to stream this but it is not implemented in Python.
|
||||
# Spooled means the file is temporary kept in memory until max_size is reached
|
||||
# Cannot use tempfile.SpooledTemporaryFile(max_size=10000) in Python 3.7 due
|
||||
# to a bug https://bugs.python.org/issue26175
|
||||
try:
|
||||
with tempfile.SpooledTemporaryFile(max_size=10000) as temp:
|
||||
while True:
|
||||
chunk = yield from request.content.read(1024)
|
||||
if not chunk:
|
||||
break
|
||||
temp.write(chunk)
|
||||
project = yield from import_project(controller, request.match_info["project_id"], temp, location=path, name=name)
|
||||
if sys.version_info >= (3, 7) and sys.version_info < (3, 8):
|
||||
with tempfile.TemporaryFile() as temp:
|
||||
while True:
|
||||
chunk = yield from request.content.read(1024)
|
||||
if not chunk:
|
||||
break
|
||||
temp.write(chunk)
|
||||
project = yield from import_project(controller, request.match_info["project_id"], temp, location=path, name=name)
|
||||
else:
|
||||
with tempfile.SpooledTemporaryFile(max_size=10000) as temp:
|
||||
while True:
|
||||
chunk = yield from request.content.read(1024)
|
||||
if not chunk:
|
||||
break
|
||||
temp.write(chunk)
|
||||
project = yield from import_project(controller, request.match_info["project_id"], temp, location=path, name=name)
|
||||
except OSError as e:
|
||||
raise aiohttp.web.HTTPInternalServerError(text="Could not import the project: {}".format(e))
|
||||
|
||||
|
||||
Loaded 100 of 140 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user