mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-11-13 10:25:53 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
43c7acb0cf | ||
|
|
239d9e6fd6 | ||
|
|
9e54ab77d0 | ||
|
|
5dbedb744e | ||
|
|
7a463676cd | ||
|
|
b0700b8787 | ||
|
|
06ce0868ec | ||
|
|
7c33d3510a | ||
|
|
cb1f73e9a2 | ||
|
|
2476581dca | ||
|
|
b7af2e4d5c | ||
|
|
b002812907 | ||
|
|
af78031322 | ||
|
|
61c87e57a4 | ||
|
|
9cce4de190 | ||
|
|
54d50b2ef4 | ||
|
|
9e518412b3 | ||
|
|
e9154f6af6 | ||
|
|
dd05884096 | ||
|
|
e58f86e204 | ||
|
|
a6bc6bc79c | ||
|
|
336b77e28a | ||
|
|
3dbce3fa40 | ||
|
|
053a16960c | ||
|
|
a860243531 | ||
|
|
99886d3f0c | ||
|
|
6fb613dcff | ||
|
|
4f803ff162 | ||
|
|
591d4f29ff | ||
|
|
87d85c1947 | ||
|
|
54c4bd31d4 | ||
|
|
907807dc53 | ||
|
|
5cbfafbeb2 | ||
|
|
6229fadace | ||
|
|
81a48df9bb | ||
|
|
2289fd4a2f | ||
|
|
4ac999461b | ||
|
|
3b87a19979 | ||
|
|
a86f881d83 | ||
|
|
457ae4783f | ||
|
|
878987a26e | ||
|
|
40d7ae6866 | ||
|
|
39f6f4edd5 | ||
|
|
5b3be13e73 | ||
|
|
16908df8b2 | ||
|
|
c357d52ba4 | ||
|
|
44a142e91d | ||
|
|
28004479fd | ||
|
|
e8b8554c1a | ||
|
|
424db843ca | ||
|
|
0c6749f62b | ||
|
|
cdae1f9e00 | ||
|
|
cf0cc8bb87 | ||
|
|
c41c01b95f | ||
|
|
2340823f53 | ||
|
|
470cea327f | ||
|
|
6edcbd0461 | ||
|
|
a7e449ff0e | ||
|
|
e763980dbe | ||
|
|
f1ae3b3778 | ||
|
|
9400c49b82 | ||
|
|
773bad811a | ||
|
|
6b54cc27da | ||
|
|
351ed64de9 | ||
|
|
81ddb0cfe6 | ||
|
|
0c19bc8d43 | ||
|
|
264f9da576 | ||
|
|
30a9ea8675 |
No files matched your search
@@ -1,5 +1,50 @@
|
||||
# Change Log
|
||||
|
||||
## 2.2.0b3 15/06/2019
|
||||
|
||||
* Fix template migration issues from GUI to controller. Fixes https://github.com/GNS3/gns3-gui/issues/2803
|
||||
* Refresh mounted media after ISO switch.
|
||||
* Resolve conflicts in docker volumes instead of error. Fixes https://github.com/GNS3/gns3-server/issues/1595
|
||||
* %guest-cid% variable implementation for Qemu VMs. Fixes https://github.com/GNS3/gns3-gui/issues/2804
|
||||
* Fix KeyError: 'usage' exception when configuring IOU template. Fixes https://github.com/GNS3/gns3-gui/issues/2806
|
||||
|
||||
## 2.2.0b2 29/05/2019
|
||||
|
||||
* Ignore Unicode errors when reading base config file contents.
|
||||
* Sync appliances.
|
||||
* Support snapshots for portable projects. Fixes https://github.com/GNS3/gns3-gui/issues/2792
|
||||
* Update the GNS3 version in topology file if converted. Ref https://github.com/GNS3/gns3-gui/issues/2798
|
||||
* Support for log rotation and compression. Fixes #1586
|
||||
* Do not start QEMU console if QEMU process is not started. Fixes https://github.com/GNS3/gns3-gui/issues/2712
|
||||
* Avoid sending warning message all the time for Ethernet switch.
|
||||
* Support to include snapshots in portable projects.
|
||||
|
||||
## 2.1.20 29/05/2019
|
||||
|
||||
* Ignore Unicode errors when reading base config file contents.
|
||||
|
||||
## 2.1.19 28/05/2019
|
||||
|
||||
* Sync appliances.
|
||||
* Remove yarl from requirements.txt since it is installed by aiohttp.
|
||||
* Drop typing dependency.
|
||||
|
||||
## 2.1.18 22/05/2019
|
||||
|
||||
* Revert "Force aiohttp version to 2.3.10 and aiohttp-cors version to 0.5.3" Ref https://github.com/GNS3/gns3-server/issues/1583 Ref https://github.com/GNS3/gns3-server/issues/1592
|
||||
* Fix invalid reStructuredText for long description in setup.py
|
||||
|
||||
## 2.2.0b1 21/05/2019
|
||||
|
||||
* Upgrade GNS3 Web UI to v2019.2.0-alpha.3
|
||||
* Change behavior when an IOU license is verified. Fixes https://github.com/GNS3/gns3-server/issues/1555
|
||||
* Fix Qemu VM state support after closing a project and check for JSON data returned by qemu-img. Fixes #1591
|
||||
* Ensure Qemu monitor commands are executed. Ref #1582.
|
||||
* Set console type to "none" by default for Ethernet switches and add a warning if trying to use "telnet". Fixes https://github.com/GNS3/gns3-gui/issues/2776
|
||||
* Add %console-port% variable for additional Qemu options. Fixes https://github.com/GNS3/gns3-gui/issues/2786
|
||||
* Fix invalid reStructuredText for long description in setup.py
|
||||
* Support for additional persistent docker volumes
|
||||
|
||||
## 2.2.0a5 15/04/2019
|
||||
|
||||
* Back to the major.minor version for config files. Ref https://github.com/GNS3/gns3-gui/issues/2756
|
||||
@@ -10,6 +55,10 @@
|
||||
* Prevent locked nodes to be deleted. Fixes https://github.com/GNS3/gns3-gui/issues/2764
|
||||
* Remove old unused argument option. Fixes #1569
|
||||
|
||||
## 2.1.17 17/05/2019
|
||||
|
||||
* Force aiohttp version to 2.3.10 and aiohttp-cors version to 0.5.3 This is to fix build issue for Ubuntu 19.04 package on Launchpad. Ref #1583 https://github.com/GNS3/gns3-gui/issues/2774
|
||||
|
||||
## 2.1.16 15/04/2019
|
||||
|
||||
* Fix broken embedded console for Ethernet switch. Fixes #1574
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
# Dockerfile for GNS3 server development
|
||||
|
||||
FROM ubuntu:16.04
|
||||
FROM ubuntu:18.04
|
||||
|
||||
ENV DEBIAN_FRONTEND noninteractive
|
||||
|
||||
|
||||
+5
-4
@@ -23,7 +23,7 @@ master is the next stable release, you can test it in your day to day activities
|
||||
Bug fixes or small improvements pull requests go here.
|
||||
|
||||
2.x (2.1 for example)
|
||||
********
|
||||
*********************
|
||||
Next major release
|
||||
|
||||
*Never* use this branch for production. Pull requests for major new features go here.
|
||||
@@ -100,7 +100,7 @@ All the init script require the creation of a GNS3 user. You can change it to an
|
||||
sudo adduser gns3
|
||||
|
||||
upstart
|
||||
~~~~~~~
|
||||
-------
|
||||
|
||||
For ubuntu < 15.04
|
||||
|
||||
@@ -113,7 +113,8 @@ You need to copy init/gns3.conf.upstart to /etc/init/gns3.conf
|
||||
|
||||
|
||||
systemd
|
||||
~~~~~~~~
|
||||
-------
|
||||
|
||||
You need to copy init/gns3.service.systemd to /lib/systemd/system/gns3.service
|
||||
|
||||
.. code:: bash
|
||||
@@ -219,5 +220,5 @@ If you want test coverage:
|
||||
|
||||
Security issues
|
||||
----------------
|
||||
Please contact us using contact informations available here:
|
||||
Please contact us using contact form available here:
|
||||
http://docs.gns3.com/1ON9JBXSeR7Nt2-Qum2o3ZX0GU86BZwlmNSUgvmqNWGY/index.html
|
||||
@@ -1,6 +1,6 @@
|
||||
-rrequirements.txt
|
||||
|
||||
sphinx==1.8.3
|
||||
pytest==4.4.0
|
||||
pytest==4.4.1
|
||||
pep8==1.7.1
|
||||
pytest-timeout==1.3.3
|
||||
@@ -0,0 +1,68 @@
|
||||
{
|
||||
"name": "ParrotOS",
|
||||
"category": "guest",
|
||||
"description": " Parrot is a GNU/Linux distribution based on Debian Testing and designed with Security, Development and Privacy in mind. It includes a full portable laboratory for security and digital forensics experts, but it also includes all you need to develop your own software or protect your privacy while surfing the net.",
|
||||
"vendor_name": "Parrot Project",
|
||||
"vendor_url": "https://parrotsec.org/",
|
||||
"documentation_url": "https://docs.parrotsec.org/doku.php",
|
||||
"product_name": "ParrotOS",
|
||||
"product_url": "https://parrotsec.org/",
|
||||
"registry_version": 3,
|
||||
"status": "stable",
|
||||
"maintainer": "Brent Stewart",
|
||||
"maintainer_email": "brent@stewart.tc",
|
||||
"usage": "Passwords are set during installation.",
|
||||
"symbol": "parrotlogo.png",
|
||||
"qemu": {
|
||||
"adapter_type": "e1000",
|
||||
"adapters": 1,
|
||||
"ram": 2048,
|
||||
"arch": "x86_64",
|
||||
"console_type": "vnc",
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "Parrot-security-4.6_amd64.iso",
|
||||
"version": "Security Build 4.6",
|
||||
"md5sum": "ead812edc83119e8bcb4ee9daabdc105",
|
||||
"filesize": 3788668928,
|
||||
"download_url": "https://www.parrotsec.org/download-security.php",
|
||||
"direct_download_url": "https://download.parrotsec.org/parrot/iso/4.6/Parrot-security-4.6_amd64.iso"
|
||||
},
|
||||
{
|
||||
"filename": "Parrot-security-3.11_amd64.iso",
|
||||
"version": "Security Build 3.11",
|
||||
"md5sum": "71c94474fb474f682da0844d95f0040b",
|
||||
"filesize": 3788668928,
|
||||
"download_url": "https://www.parrotsec.org/download.fx",
|
||||
"direct_download_url": "https://www.parrotsec.org/download-full.fx"
|
||||
},
|
||||
{
|
||||
"filename": "empty30G.qcow2",
|
||||
"version": "1.0",
|
||||
"md5sum": "3411a599e822f2ac6be560a26405821a",
|
||||
"filesize": 197120,
|
||||
"download_url": "https://sourceforge.net/projects/gns-3/files/Empty%20Qemu%30disk/",
|
||||
"direct_download_url": "http://sourceforge.net/projects/gns-3/files/Empty%20Qemu%20disk/empty30G.qcow2/download"
|
||||
}
|
||||
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "Security Build 4.6",
|
||||
"images": {
|
||||
"hda_disk_image": "empty30G.qcow2",
|
||||
"cdrom_image": "Parrot-security-4.6_amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Security Build 3.11",
|
||||
"images": {
|
||||
"hda_disk_image": "empty30G.qcow2",
|
||||
"cdrom_image": "Parrot-security-3.11_amd64.iso"
|
||||
}
|
||||
}
|
||||
|
||||
]
|
||||
}
|
||||
@@ -21,7 +21,6 @@
|
||||
"ram": 2048,
|
||||
"arch": "x86_64",
|
||||
"console_type": "telnet",
|
||||
"boot_priority": "d",
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
@@ -33,10 +32,10 @@
|
||||
"download_url": "https://www.arista.com/en/support/software-download"
|
||||
},
|
||||
{
|
||||
"filename": "vEOS-lab-4.20.11M.vmdk",
|
||||
"version": "4.20.11M",
|
||||
"md5sum": "19e482a193f237c157ce35c389ca9417",
|
||||
"filesize": 658178048,
|
||||
"filename": "vEOS-lab-4.20.10M-combined.vmdk",
|
||||
"version": "4.20.10M-combined",
|
||||
"md5sum": "d1f2d650f93dbf24e04fdd2c9d62bd62",
|
||||
"filesize": 334626816,
|
||||
"download_url": "https://www.arista.com/en/support/software-download"
|
||||
},
|
||||
{
|
||||
@@ -46,6 +45,34 @@
|
||||
"filesize": 662044672,
|
||||
"download_url": "https://www.arista.com/en/support/software-download"
|
||||
},
|
||||
{
|
||||
"filename": "vEOS-lab-4.19.10M-combined.vmdk",
|
||||
"version": "4.19.10M-combined",
|
||||
"md5sum": "103daa45c33be4584cbe6adc60de46a3",
|
||||
"filesize": 324141056,
|
||||
"download_url": "https://www.arista.com/en/support/software-download"
|
||||
},
|
||||
{
|
||||
"filename": "vEOS-lab-4.19.10M.vmdk",
|
||||
"version": "4.19.10M",
|
||||
"md5sum": "665ed14389411ae5f16ba0a2ff84240a",
|
||||
"filesize": 637337600,
|
||||
"download_url": "https://www.arista.com/en/support/software-download"
|
||||
},
|
||||
{
|
||||
"filename": "vEOS-lab-4.18.10M-combined.vmdk",
|
||||
"version": "4.18.10M-combined",
|
||||
"md5sum": "e33e0ef5b8cecc84c5bb57569b36b9c6",
|
||||
"filesize": 317652992,
|
||||
"download_url": "https://www.arista.com/en/support/software-download"
|
||||
},
|
||||
{
|
||||
"filename": "vEOS-lab-4.18.10M.vmdk",
|
||||
"version": "4.18.10M",
|
||||
"md5sum": "1d87e9ace37fe3706dbf3e49c8d4d231",
|
||||
"filesize": 624427008,
|
||||
"download_url": "https://www.arista.com/en/support/software-download"
|
||||
},
|
||||
{
|
||||
"filename": "vEOS-lab-4.18.5M.vmdk",
|
||||
"version": "4.18.5M",
|
||||
@@ -133,101 +160,126 @@
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "4.21.1.1F",
|
||||
"name": "4.21.1F",
|
||||
"images": {
|
||||
"cdrom_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hda_disk_image": "vEOS-lab-4.21.1.1F.vmdk"
|
||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hdb_disk_image": "vEOS-lab-4.21.1.1F.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.20.11M",
|
||||
"name": "4.20.10M-combined",
|
||||
"images": {
|
||||
"cdrom_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hda_disk_image": "vEOS-lab-4.20.11M.vmdk"
|
||||
"hda_disk_image": "vEOS-lab-4.20.10M-combined.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.20.1F",
|
||||
"images": {
|
||||
"cdrom_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hda_disk_image": "vEOS-lab-4.20.1F.vmdk"
|
||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hdb_disk_image": "vEOS-lab-4.20.1F.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.19.10M-combined",
|
||||
"images": {
|
||||
"hda_disk_image": "vEOS-lab-4.19.10M-combined.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.19.10M",
|
||||
"images": {
|
||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hdb_disk_image": "vEOS-lab-4.19.10M.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.18.10M-combined",
|
||||
"images": {
|
||||
"hda_disk_image": "vEOS-lab-4.18.10M-combined.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.18.10M",
|
||||
"images": {
|
||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hdb_disk_image": "vEOS-lab-4.18.10M.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.18.5M",
|
||||
"images": {
|
||||
"cdrom_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hda_disk_image": "vEOS-lab-4.18.5M.vmdk"
|
||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hdb_disk_image": "vEOS-lab-4.18.5M.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.18.1F",
|
||||
"images": {
|
||||
"cdrom_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hda_disk_image": "vEOS-lab-4.18.1F.vmdk"
|
||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hdb_disk_image": "vEOS-lab-4.18.1F.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.17.8M",
|
||||
"images": {
|
||||
"cdrom_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hda_disk_image": "vEOS-lab-4.17.8M.vmdk"
|
||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hdb_disk_image": "vEOS-lab-4.17.8M.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.17.2F",
|
||||
"images": {
|
||||
"cdrom_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hda_disk_image": "vEOS-lab-4.17.2F.vmdk"
|
||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hdb_disk_image": "vEOS-lab-4.17.2F.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.16.13M",
|
||||
"images": {
|
||||
"cdrom_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hda_disk_image": "vEOS-lab-4.16.13M.vmdk"
|
||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hdb_disk_image": "vEOS-lab-4.16.13M.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.16.6M",
|
||||
"images": {
|
||||
"cdrom_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hda_disk_image": "vEOS-lab-4.16.6M.vmdk"
|
||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hdb_disk_image": "vEOS-lab-4.16.6M.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.15.10M",
|
||||
"images": {
|
||||
"cdrom_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hda_disk_image": "vEOS-lab-4.15.10M.vmdk"
|
||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hdb_disk_image": "vEOS-lab-4.15.10M.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.15.5M",
|
||||
"images": {
|
||||
"cdrom_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hda_disk_image": "vEOS-lab-4.15.5M.vmdk"
|
||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hdb_disk_image": "vEOS-lab-4.15.5M.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.14.14M",
|
||||
"images": {
|
||||
"cdrom_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hda_disk_image": "vEOS-lab-4.14.14M.vmdk"
|
||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hdb_disk_image": "vEOS-lab-4.14.14M.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.13.16M",
|
||||
"images": {
|
||||
"cdrom_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hda_disk_image": "vEOS-lab-4.13.16M.vmdk"
|
||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hdb_disk_image": "vEOS-lab-4.13.16M.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.13.8M",
|
||||
"images": {
|
||||
"cdrom_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hda_disk_image": "vEOS-lab-4.13.8M.vmdk"
|
||||
"hda_disk_image": "Aboot-veos-serial-8.0.0.iso",
|
||||
"hdb_disk_image": "vEOS-lab-4.13.8M.vmdk"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"name": "AsteriskNOW",
|
||||
"name": "AsteriskNOW / FreePBX",
|
||||
"category": "guest",
|
||||
"description": "AsteriskNOW makes it easy to create custom telephony solutions by automatically installing the 'plumbing'. It's a complete Linux distribution with Asterisk, the DAHDI driver framework, and, the FreePBX administrative GUI. Much of the complexity of Asterisk and Linux is handled by the installer, the yum package management utility and the administrative GUI. With AsteriskNOW, application developers and integrators can concentrate on building solutions, not maintaining the plumbing.",
|
||||
"vendor_name": "Digium",
|
||||
"vendor_url": "http://www.asterisk.org/",
|
||||
"documentation_url": "https://wiki.asterisk.org/wiki/display/AST/Installing+AsteriskNOW",
|
||||
"product_name": "AsteriskNOW",
|
||||
"product_name": "AsteriskNOW / FreePBX",
|
||||
"product_url": "http://www.asterisk.org/downloads/asterisknow",
|
||||
"registry_version": 3,
|
||||
"status": "stable",
|
||||
@@ -24,6 +24,22 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "SNG7-FPBX-64bit-1904-2.iso",
|
||||
"version": "14-1904",
|
||||
"md5sum": "f37c316bc0ff208682769b6f2d468e93",
|
||||
"filesize": 2015363072,
|
||||
"download_url": "https://www.freepbx.org/downloads/",
|
||||
"direct_download_url": "https://downloads.freepbxdistro.org/ISO/SNG7-FPBX-64bit-1904-2.iso"
|
||||
},
|
||||
{
|
||||
"filename": "SNG7-FPBX-64bit-1805-2.iso",
|
||||
"version": "14-1805",
|
||||
"md5sum": "64f0c38c17ce680f7106f94183bc5745",
|
||||
"filesize": 1755316224,
|
||||
"download_url": "https://www.freepbx.org/downloads/",
|
||||
"direct_download_url": "https://downloads.freepbxdistro.org/ISO/SNG7-FPBX-64bit-1805-2.iso"
|
||||
},
|
||||
{
|
||||
"filename": "AsteriskNow-1013-current-64.iso",
|
||||
"version": "10.13",
|
||||
@@ -58,6 +74,20 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "14-1904",
|
||||
"images": {
|
||||
"hda_disk_image": "empty30G.qcow2",
|
||||
"cdrom_image": "SNG7-FPBX-64bit-1904-2.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "14-1805",
|
||||
"images": {
|
||||
"hda_disk_image": "empty30G.qcow2",
|
||||
"cdrom_image": "SNG7-FPBX-64bit-1805-2.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "10.13",
|
||||
"images": {
|
||||
|
||||
@@ -19,6 +19,15 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "BSDRP-1.92-full-amd64-serial.img",
|
||||
"version": "1.92",
|
||||
"md5sum": "b02f2502188915490bb9756ffca36910",
|
||||
"filesize": 1000000000,
|
||||
"download_url": "https://bsdrp.net/downloads",
|
||||
"direct_download_url": "https://sourceforge.net/projects/bsdrp/files/BSD_Router_Project/1.92/amd64/BSDRP-1.92-full-amd64-serial.img.xz/download",
|
||||
"compression": "xz"
|
||||
},
|
||||
{
|
||||
"filename": "BSDRP-1.91-full-amd64-serial.img",
|
||||
"version": "1.91",
|
||||
@@ -57,6 +66,12 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "1.92",
|
||||
"images": {
|
||||
"hda_disk_image": "BSDRP-1.92-full-amd64-serial.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "1.91",
|
||||
"images": {
|
||||
|
||||
@@ -27,6 +27,22 @@
|
||||
},
|
||||
"images": [
|
||||
|
||||
{
|
||||
"filename": "CentOS 7-18.10 (64bit).vmdk",
|
||||
"version": "7-1810",
|
||||
"md5sum": "7307e143c11910f3c782b1e013e6f14f",
|
||||
"filesize": 4886233088,
|
||||
"download_url": "http://www.osboxes.org/centos/"
|
||||
},
|
||||
|
||||
{
|
||||
"filename": "CentOS 7-1804 (64bit).vmdk",
|
||||
"version": "7-1804",
|
||||
"md5sum": "eae8dc48bb390c0c2d9a9a0432ced9bc",
|
||||
"filesize": 4701356032,
|
||||
"download_url": "http://www.osboxes.org/centos/"
|
||||
},
|
||||
|
||||
{
|
||||
"filename": "CentOS 7-1611 (64bit).vmdk",
|
||||
"version": "7-1611",
|
||||
@@ -36,6 +52,20 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "7-1810",
|
||||
"images": {
|
||||
"hda_disk_image": "CentOS 7-18.10 (64bit).vmdk"
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"name": "7-1804",
|
||||
"images": {
|
||||
"hda_disk_image": "CentOS 7-1804 (64bit).vmdk"
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"name": "7-1611",
|
||||
"images": {
|
||||
|
||||
@@ -24,17 +24,17 @@
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "Check_Point_R80.10_T421_Gaia.iso",
|
||||
"filename": "Check_Point_R80.10_T479_Gaia.iso",
|
||||
"version": "80.10",
|
||||
"md5sum": "12d9723fadb89bb722e20ca3f89012ce",
|
||||
"filesize": 3420127232,
|
||||
"download_url": "https://supportcenter.checkpoint.com/supportcenter/portal?eventSubmit_doGoviewsolutiondetails=&solutionid=sk104859"
|
||||
"md5sum": "1b97cce21dbee78fec505b44e637cc9a",
|
||||
"filesize": 3301212160,
|
||||
"download_url": "https://supportcenter.checkpoint.com/supportcenter/portal/user/anon/page/default.psml/media-type/html?action=portlets.DCFileAction&eventSubmit_doGetdcdetails=&fileid=54509"
|
||||
},
|
||||
{
|
||||
"filename": "Check_Point_R77.30_T204_Install_and_Upgrade.Gaia.iso",
|
||||
"filename": "Check_Point_R77.30_Install_and_Upgrade_T5.Gaia.iso",
|
||||
"version": "77.30",
|
||||
"md5sum": "6fa7586bbb6832fa965d3173276c5b87",
|
||||
"filesize": 2799271936,
|
||||
"md5sum": "3f6f459df3fb3beaf7b2457f08982425",
|
||||
"filesize": 289692076,
|
||||
"download_url": "https://supportcenter.checkpoint.com/supportcenter/portal?eventSubmit_doGoviewsolutiondetails=&solutionid=sk104859"
|
||||
},
|
||||
{
|
||||
@@ -58,14 +58,14 @@
|
||||
"name": "80.10",
|
||||
"images": {
|
||||
"hda_disk_image": "empty100G.qcow2",
|
||||
"cdrom_image": "Check_Point_R80.10_T421_Gaia.iso"
|
||||
"cdrom_image": "Check_Point_R80.10_T479_Gaia.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "77.30",
|
||||
"images": {
|
||||
"hda_disk_image": "empty100G.qcow2",
|
||||
"cdrom_image": "Check_Point_R77.30_T204_Install_and_Upgrade.Gaia.iso"
|
||||
"cdrom_image": "Check_Point_R77.30_Install_and_Upgrade_T5.Gaia.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"maintainer": "GNS3 Team",
|
||||
"maintainer_email": "developers@gns3.net",
|
||||
"dynamips": {
|
||||
"chassis": "",
|
||||
"platform": "c3745",
|
||||
"ram": 256,
|
||||
"nvram": 256,
|
||||
|
||||
@@ -25,12 +25,19 @@
|
||||
"options": "-smp 2"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "dcnm-va.11.1.1.iso",
|
||||
"version": "11.1.1",
|
||||
"md5sum": "43af970d046d1430d3ec7950dbe4a20a",
|
||||
"filesize": 4432132096,
|
||||
"download_url": "https://software.cisco.com/download/home/281722751/type/282088134/release/11.1%25281%2529"
|
||||
},
|
||||
{
|
||||
"filename": "dcnm-va.10.1.1.iso",
|
||||
"version": "10.1.1",
|
||||
"md5sum": "4eca14506decaf166251c64e67adb110",
|
||||
"filesize": 2927532032,
|
||||
"download_url": "https://software.cisco.com/download/release.html?mdfid=281722751&softwareid=282088134&release=10.1(1)&relind=AVAILABLE&rellifecycle=&reltype=latest"
|
||||
"download_url": "https://software.cisco.com/download/home/281722751/type/282088134/release/10.1%25281%2529"
|
||||
},
|
||||
{
|
||||
"filename": "empty100G.qcow2",
|
||||
@@ -42,6 +49,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "11.1.1",
|
||||
"images": {
|
||||
"hda_disk_image": "empty100G.qcow2",
|
||||
"cdrom_image": "dcnm-va.11.1.1.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "10.1.1",
|
||||
"images": {
|
||||
|
||||
@@ -24,6 +24,13 @@
|
||||
"options": "-smp 4 -cpu host"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "xrv9k-fullk9-x-6.5.2.qcow2",
|
||||
"version": "6.5.2",
|
||||
"md5sum": "506d9e23dda7365c99dd82b613859697",
|
||||
"filesize": 1205010432,
|
||||
"download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/6.5.1"
|
||||
},
|
||||
{
|
||||
"filename": "xrv9k-fullk9-x-6.5.1.qcow2",
|
||||
"version": "6.5.1",
|
||||
@@ -67,6 +74,12 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "6.5.2",
|
||||
"images": {
|
||||
"hda_disk_image": "xrv9k-fullk9-x-6.5.2.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.5.1",
|
||||
"images": {
|
||||
|
||||
@@ -27,6 +27,13 @@
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "ise-2.4.0.357.SPA.x86_64.iso",
|
||||
"version": "2.4.0.357",
|
||||
"md5sum": "766945618a0ff35f6c720b3bc4b46bfb",
|
||||
"filesize": 8326062080,
|
||||
"download_url": "https://software.cisco.com/download/home/283801620/type/283802505/release/2.4.0"
|
||||
},
|
||||
{
|
||||
"filename": "ise-2.2.0.470.SPA.x86_64.iso",
|
||||
"version": "2.2.0.470",
|
||||
"md5sum": "7fe5e730d0a51ef66e69d1463717ff3f",
|
||||
@@ -65,6 +72,13 @@
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "2.4.0.357",
|
||||
"images": {
|
||||
"hda_disk_image": "empty200G.qcow2",
|
||||
"cdrom_image": "ise-2.4.0.357.SPA.x86_64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2.2.0.470",
|
||||
"images": {
|
||||
"hda_disk_image": "empty200G.qcow2",
|
||||
|
||||
@@ -21,6 +21,24 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "coreos_production_qemu_image.img",
|
||||
"version": "2079.4.0",
|
||||
"md5sum": "d5e28d68bcadf252ff9c909a159b9504",
|
||||
"filesize": 970129408,
|
||||
"download_url": "http://stable.release.core-os.net/amd64-usr/2079.4.0/",
|
||||
"direct_download_url": "http://stable.release.core-os.net/amd64-usr/2079.4.0/coreos_production_qemu_image.img.bz2",
|
||||
"compression": "bzip2"
|
||||
},
|
||||
{
|
||||
"filename": "coreos_production_qemu_image.2023.5.0.img",
|
||||
"version": "2023.5.0",
|
||||
"md5sum": "f8b12e524aa81220222d06473b3f36dc",
|
||||
"filesize": 587661312,
|
||||
"download_url": "http://stable.release.core-os.net/amd64-usr/2023.5.0/",
|
||||
"direct_download_url": "http://stable.release.core-os.net/amd64-usr/2023.5.0/coreos_production_qemu_image.img.bz2",
|
||||
"compression": "bzip2"
|
||||
},
|
||||
{
|
||||
"filename": "coreos_production_qemu_image.1911.5.0.img",
|
||||
"version": "1911.5.0",
|
||||
@@ -185,6 +203,18 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "2079.4.0",
|
||||
"images": {
|
||||
"hda_disk_image": "coreos_production_qemu_image.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2023.5.0",
|
||||
"images": {
|
||||
"hda_disk_image": "coreos_production_qemu_image.2023.5.0.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "1911.5.0",
|
||||
"images": {
|
||||
|
||||
@@ -23,6 +23,22 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "cumulus-linux-3.7.6-vx-amd64-qemu.qcow2",
|
||||
"version": "3.7.6",
|
||||
"md5sum": "34de965074332cbc40d51832da7d6a5d",
|
||||
"filesize": 540278784,
|
||||
"download_url": "https://cumulusnetworks.com/cumulus-vx/download/",
|
||||
"direct_download_url": "http://cumulusfiles.s3.amazonaws.com/CumulusLinux-3.7.6/cumulus-linux-3.7.6-vx-amd64-qemu.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "cumulus-linux-3.7.3-vx-amd64-qemu.qcow2",
|
||||
"version": "3.7.3",
|
||||
"md5sum": "e6f438cd44ede841ff290c85dedd127e",
|
||||
"filesize": 1514340352,
|
||||
"download_url": "https://cumulusnetworks.com/cumulus-vx/download/",
|
||||
"direct_download_url": "http://cumulusfiles.s3.amazonaws.com/CumulusLinux-3.7.3/cumulus-linux-3.7.3-vx-amd64-qemu.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "cumulus-linux-3.7.2-vx-amd64-qemu.qcow2",
|
||||
"version": "3.7.2",
|
||||
@@ -42,8 +58,8 @@
|
||||
{
|
||||
"filename": "cumulus-linux-3.6.2-vx-amd64.qcow2",
|
||||
"version": "3.6.2",
|
||||
"md5sum": "02b0621d68fb2e709b4bcc48748c7b6f",
|
||||
"filesize": 1150746624,
|
||||
"md5sum": "fda2cfc556de7b12daf45369bd60d33b",
|
||||
"filesize": 1157169152,
|
||||
"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"
|
||||
},
|
||||
@@ -189,6 +205,18 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "3.7.6",
|
||||
"images": {
|
||||
"hda_disk_image": "cumulus-linux-3.7.6-vx-amd64-qemu.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "3.7.3",
|
||||
"images": {
|
||||
"hda_disk_image": "cumulus-linux-3.7.3-vx-amd64-qemu.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "3.7.2",
|
||||
"images": {
|
||||
|
||||
@@ -1,189 +1,153 @@
|
||||
{
|
||||
"name": "EXOS",
|
||||
"name": "EXOS VM",
|
||||
"category": "multilayer_switch",
|
||||
"description": "ExtremeXOS was designed from the ground up to meet the needs of large cloud and private data centers, service providers, intelligent, converged enterprise edge networks, and everything in between. It provides the high performance and rich features required by these diverse environments.",
|
||||
"description": "The ExtremeXOS VM is created and maintained by Extreme Networks for users to emulate a network using EXOS switches.",
|
||||
"vendor_name": "Extreme Networks",
|
||||
"vendor_url": "http://www.extremenetworks.com/",
|
||||
"documentation_url": "http://www.extremenetworks.com/support/documentation",
|
||||
"product_name": "EXOS",
|
||||
"product_url": "http://www.extremenetworks.com/product/extremexos-network-operating-system",
|
||||
"vendor_url": "https://www.extremenetworks.com",
|
||||
"documentation_url": "https://www.extremenetworks.com/support/documentation",
|
||||
"product_name": "EXOS VM",
|
||||
"registry_version": 3,
|
||||
"status": "stable",
|
||||
"maintainer": "GNS3 Team",
|
||||
"maintainer_email": "developers@gns3.net",
|
||||
"usage": "You can change the console to telnet after install. Default user: admin (no password set)",
|
||||
"first_port_name": "Management",
|
||||
"maintainer": "Extreme Networks",
|
||||
"maintainer_email": "GitHubscripting@extremenetworks.com",
|
||||
"usage": "Boot up and login is admin with no password.",
|
||||
"symbol": "ethernet_switch.svg",
|
||||
"first_port_name": "Mgmt",
|
||||
"port_name_format": "Port{port1}",
|
||||
"qemu": {
|
||||
"adapter_type": "rtl8139",
|
||||
"adapters": 13,
|
||||
"ram": 256,
|
||||
"ram": 512,
|
||||
"hda_disk_interface": "ide",
|
||||
"arch": "x86_64",
|
||||
"console_type": "telnet",
|
||||
"boot_priority": "cd",
|
||||
"kvm": "require",
|
||||
"options": "-smp 2 -cpu core2duo"
|
||||
"boot_priority": "dc",
|
||||
"kvm": "allow",
|
||||
"options": "-cpu core2duo"
|
||||
},
|
||||
|
||||
"images": [
|
||||
{
|
||||
"filename": "exosvm-22.6.1.4.iso",
|
||||
|
||||
{
|
||||
"filename": "EXOS-VM_v30.2.1.8.qcow2",
|
||||
"version": "30.2.1.8",
|
||||
"md5sum": "4bdbf3ddff7a030e19c6bb71270b56d2",
|
||||
"filesize": 355205120,
|
||||
"direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v30.2.1.8.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "EXOS-VM_v30.1.1.4.qcow2",
|
||||
"version": "30.1.1.4",
|
||||
"md5sum": "92d3f9b13d750f7bfa804823fa545772",
|
||||
"filesize": 383385600,
|
||||
"direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v30.1.1.4.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "EXOS-VM_v22.6.1.4.qcow2",
|
||||
"version": "22.6.1.4",
|
||||
"md5sum": "66146aba82575b3879431143b6dc8a35",
|
||||
"filesize": 53706752,
|
||||
"download_url": "https://github.com/extremenetworks/Virtual_EXOS",
|
||||
"direct_download_url": "https://github.com/extremenetworks/Virtual_EXOS/raw/master/vm-22.6.1.4.iso"
|
||||
"md5sum": "82b31b11b26143a82c8259a4825696fc",
|
||||
"filesize": 180355072,
|
||||
"direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v22.6.1.4.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "exosvm-22.5.1.7.iso",
|
||||
{
|
||||
"filename": "EXOS-VM_v22.5.1.7.qcow2",
|
||||
"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"
|
||||
"md5sum": "d2e8ae6783b6ed777ad5cd8cafd83c86",
|
||||
"filesize": 180289536,
|
||||
"direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v22.5.1.7.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "exosvm-22.4.1.4.iso",
|
||||
"filename": "EXOS-VM_v22.4.1.4-disk1.qcow2",
|
||||
"version": "22.4.1.4",
|
||||
"md5sum": "2134a511084519a5f8ad00a6f7cd71a9",
|
||||
"filesize": 49993728,
|
||||
"download_url": "https://github.com/extremenetworks/Virtual_EXOS",
|
||||
"direct_download_url": "https://github.com/extremenetworks/Virtual_EXOS/raw/master/vm-22.4.1.4.iso"
|
||||
"md5sum": "5f1ee41912d74d423ce8ae57ea413602",
|
||||
"filesize": 229638144,
|
||||
"direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v22.4.1.4-disk1.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "exosvm-22.2.1.5.iso",
|
||||
"filename": "EXOS-VM_v22.3.1.4patch1-4-disk1.qcow2",
|
||||
"version": "22.3.1.4",
|
||||
"md5sum": "a4585b6e987ff730f5c044af339fe090",
|
||||
"filesize": 218431488,
|
||||
"direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v22.3.1.4patch1-4-disk1.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "EXOS-VM_v22.2.1.5-disk1.qcow2",
|
||||
"version": "22.2.1.5",
|
||||
"md5sum": "bf51fd5b3c5e9dab10a616055265bcf2",
|
||||
"filesize": 44578816,
|
||||
"download_url": "https://github.com/extremenetworks/Virtual_EXOS",
|
||||
"direct_download_url": "https://github.com/extremenetworks/Virtual_EXOS/raw/master/vm-22.2.1.5.iso"
|
||||
"md5sum": "e3cfe92077addda6ad34185288c90acf",
|
||||
"filesize": 179568640,
|
||||
"direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v22.2.1.5-disk1.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "exosvm-22.1.1.5.iso",
|
||||
"filename": "EXOS-VM_v22.1.1.5-disk1.qcow2",
|
||||
"version": "22.1.1.5",
|
||||
"md5sum": "df3897ca2d7c7053582587ed120114fa",
|
||||
"filesize": 44220416,
|
||||
"download_url": "https://github.com/extremenetworks/Virtual_EXOS",
|
||||
"direct_download_url": "https://github.com/extremenetworks/Virtual_EXOS/raw/master/vm-22.1.1.5.iso"
|
||||
"md5sum": "77683060e75d81b776761f6829b15e9b",
|
||||
"filesize": 179437568,
|
||||
"direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v22.1.1.5-disk1.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "exosvm-21.1.2.14.iso",
|
||||
"version": "21.1.2.14",
|
||||
"md5sum": "de0752d56e41d92027ce1fccd604b14b",
|
||||
"filesize": 41101312,
|
||||
"download_url": "https://github.com/extremenetworks/Virtual_EXOS",
|
||||
"direct_download_url": "https://github.com/extremenetworks/Virtual_EXOS/blob/master/vm-21.1.2.14.iso?raw=true"
|
||||
},
|
||||
{
|
||||
"filename": "exosvm-21.1.1.4.iso",
|
||||
{
|
||||
"filename": "EXOS-VM_v21.1.1.4-disk1.qcow2",
|
||||
"version": "21.1.1.4",
|
||||
"md5sum": "4d5db0e01a39b08775ed6a3e2c8bf663",
|
||||
"filesize": 41046016,
|
||||
"download_url": "https://github.com/extremenetworks/Virtual_EXOS",
|
||||
"direct_download_url": "https://github.com/extremenetworks/Virtual_EXOS/blob/master/vm-21.1.1.4.iso?raw=true"
|
||||
},
|
||||
{
|
||||
"filename": "exospc-16.2.1.6.iso",
|
||||
"version": "16.2.1.6",
|
||||
"md5sum": "b4be339afb02c03dcb4349630c1adb4f",
|
||||
"filesize": 36306944,
|
||||
"download_url": "https://github.com/extremenetworks/Virtual_EXOS",
|
||||
"direct_download_url": "https://github.com/extremenetworks/Virtual_EXOS/blob/master/exospc-16.2.1.6.iso?raw=true"
|
||||
},
|
||||
{
|
||||
"filename": "exospc-16.1.3.6.iso",
|
||||
"version": "16.1.3.6",
|
||||
"md5sum": "4c17b2bf2a4909527f6c866a68ba406e",
|
||||
"filesize": 35758080,
|
||||
"download_url": "https://github.com/extremenetworks/Virtual_EXOS",
|
||||
"direct_download_url": "https://github.com/extremenetworks/Virtual_EXOS/blob/master/exospc-16.1.3.6.iso?raw=true"
|
||||
},
|
||||
{
|
||||
"filename": "exospc-16.1.2.14.iso",
|
||||
"version": "16.1.2.14",
|
||||
"md5sum": "140cdc11f426156ffcbde150b2f46768",
|
||||
"filesize": 35743744,
|
||||
"download_url": "https://github.com/extremenetworks/Virtual_EXOS",
|
||||
"direct_download_url": "https://github.com/extremenetworks/Virtual_EXOS/blob/master/exospc-16.1.2.14.iso?raw=true"
|
||||
},
|
||||
{
|
||||
"filename": "empty8G.qcow2",
|
||||
"version": "1.0",
|
||||
"md5sum": "f1d2c25b6990f99bd05b433ab603bdb4",
|
||||
"filesize": 197120,
|
||||
"download_url": "https://sourceforge.net/projects/gns-3/files/Empty%20Qemu%20disk/",
|
||||
"direct_download_url": "https://sourceforge.net/projects/gns-3/files/Empty%20Qemu%20disk/empty8G.qcow2/download"
|
||||
"md5sum": "654606809b6fd3bca400377483eb4a79",
|
||||
"filesize": 117560832,
|
||||
"direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v21.1.1.4-disk1.qcow2"
|
||||
}
|
||||
|
||||
],
|
||||
|
||||
"versions": [
|
||||
|
||||
{
|
||||
"name": "22.6.1.4",
|
||||
"name": "30.2.1.8",
|
||||
"images": {
|
||||
"hda_disk_image": "empty8G.qcow2",
|
||||
"cdrom_image": "exosvm-22.6.1.4.iso"
|
||||
"hda_disk_image": "EXOS-VM_v30.2.1.8.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "30.1.1.4",
|
||||
"images": {
|
||||
"hda_disk_image": "EXOS-VM_v30.1.1.4.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "22.6.1.4",
|
||||
"images": {
|
||||
"hda_disk_image": "EXOS-VM_v22.6.1.4.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "22.5.1.7",
|
||||
"images": {
|
||||
"hda_disk_image": "empty8G.qcow2",
|
||||
"cdrom_image": "exosvm-22.5.1.7.iso"
|
||||
"hda_disk_image": "EXOS-VM_v22.5.1.7.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "22.4.1.4",
|
||||
"images": {
|
||||
"hda_disk_image": "empty8G.qcow2",
|
||||
"cdrom_image": "exosvm-22.4.1.4.iso"
|
||||
"hda_disk_image": "EXOS-VM_v22.4.1.4-disk1.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "22.3.1.4",
|
||||
"images": {
|
||||
"hda_disk_image": "EXOS-VM_v22.3.1.4patch1-4-disk1.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "22.2.1.5",
|
||||
"images": {
|
||||
"hda_disk_image": "empty8G.qcow2",
|
||||
"cdrom_image": "exosvm-22.2.1.5.iso"
|
||||
"hda_disk_image": "EXOS-VM_v22.2.1.5-disk1.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "22.1.1.5",
|
||||
"images": {
|
||||
"hda_disk_image": "empty8G.qcow2",
|
||||
"cdrom_image": "exosvm-22.1.1.5.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "21.1.2.14",
|
||||
"images": {
|
||||
"hda_disk_image": "empty8G.qcow2",
|
||||
"cdrom_image": "exosvm-21.1.2.14.iso"
|
||||
"hda_disk_image": "EXOS-VM_v22.1.1.5-disk1.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "21.1.1.4",
|
||||
"images": {
|
||||
"hda_disk_image": "empty8G.qcow2",
|
||||
"cdrom_image": "exosvm-21.1.1.4.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "16.2.1.6",
|
||||
"images": {
|
||||
"hda_disk_image": "empty8G.qcow2",
|
||||
"cdrom_image": "exospc-16.2.1.6.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "16.1.3.6",
|
||||
"images": {
|
||||
"hda_disk_image": "empty8G.qcow2",
|
||||
"cdrom_image": "exospc-16.1.3.6.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "16.1.2.14",
|
||||
"images": {
|
||||
"hda_disk_image": "empty8G.qcow2",
|
||||
"cdrom_image": "exospc-16.1.2.14.iso"
|
||||
"hda_disk_image": "EXOS-VM_v21.1.1.4-disk1.qcow2"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -34,6 +34,13 @@
|
||||
"filesize": 30998528,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FAD_KVM-V500-build0442-FORTINET.out.kvm-boot.qcow2",
|
||||
"version": "5.2.2",
|
||||
"md5sum": "7d959ed264b064716e8f1378fceed48f",
|
||||
"filesize": 104857600,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FAD_KVM-V500-build0423-FORTINET.out.kvm-boot.qcow2",
|
||||
"version": "5.2.0",
|
||||
@@ -190,6 +197,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "5.2.2",
|
||||
"images": {
|
||||
"hda_disk_image": "FAD_KVM-V500-build0442-FORTINET.out.kvm-boot.qcow2",
|
||||
"hdb_disk_image": "FAD_KVM-FORTINET.out.kvm-data.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.2.0",
|
||||
"images": {
|
||||
|
||||
@@ -26,6 +26,13 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FAZ_VM64_KVM-v6-build1050-FORTINET.out.kvm.qcow2",
|
||||
"version": "6.2.0",
|
||||
"md5sum": "dc123116e4c816d8b4dee244bd671844",
|
||||
"filesize": 140177408,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FAZ_VM64_KVM-v6-build0255-FORTINET.out.kvm.qcow2",
|
||||
"version": "6.0.3",
|
||||
@@ -148,6 +155,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "6.2.0",
|
||||
"images": {
|
||||
"hda_disk_image": "FAZ_VM64_KVM-v6-build1050-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.0.3",
|
||||
"images": {
|
||||
|
||||
@@ -26,6 +26,13 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FAC_VM_KVM-v6-build0010-FORTINET.out.kvm.qcow2",
|
||||
"version": "6.0.0",
|
||||
"md5sum": "6699c0b24e54dc6a5215ba3945abb364",
|
||||
"filesize": 74317824,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FAC_VM_KVM-v5-build0366-FORTINET.out.kvm.qcow2",
|
||||
"version": "5.5.0",
|
||||
@@ -90,75 +97,82 @@
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FAC_VM_KVM-v500-DATADRIVE.qcow2",
|
||||
"version": "5.x.x",
|
||||
"filename": "FAC_VM_KVM-ALL-DATADRIVE.qcow2",
|
||||
"version": "All",
|
||||
"md5sum": "09bad6cfe6301930adbc829eb8a67149",
|
||||
"filesize": 258048,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "6.0.0",
|
||||
"images": {
|
||||
"hda_disk_image": "FAC_VM_KVM-v6-build0010-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "FAC_VM_KVM-ALL-DATADRIVE.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.5.0",
|
||||
"images": {
|
||||
"hda_disk_image": "FAC_VM_KVM-v5-build0366-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "FAC_VM_KVM-v500-DATADRIVE.qcow2"
|
||||
"hdb_disk_image": "FAC_VM_KVM-ALL-DATADRIVE.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.4.1",
|
||||
"images": {
|
||||
"hda_disk_image": "FAC_VM_KVM-v5-build0297-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "FAC_VM_KVM-v500-DATADRIVE.qcow2"
|
||||
"hdb_disk_image": "FAC_VM_KVM-ALL-DATADRIVE.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"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"
|
||||
"hdb_disk_image": "FAC_VM_KVM-ALL-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"
|
||||
"hdb_disk_image": "FAC_VM_KVM-ALL-DATADRIVE.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.2.0",
|
||||
"images": {
|
||||
"hda_disk_image": "FAC_VM_KVM-v5-build0155-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "FAC_VM_KVM-v500-DATADRIVE.qcow2"
|
||||
"hdb_disk_image": "FAC_VM_KVM-ALL-DATADRIVE.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.1.2",
|
||||
"images": {
|
||||
"hda_disk_image": "FAC_VM_KVM-v500-build0091-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "FAC_VM_KVM-v500-DATADRIVE.qcow2"
|
||||
"hdb_disk_image": "FAC_VM_KVM-ALL-DATADRIVE.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.1.1",
|
||||
"images": {
|
||||
"hda_disk_image": "FAC_VM_KVM-v500-build0086-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "FAC_VM_KVM-v500-DATADRIVE.qcow2"
|
||||
"hdb_disk_image": "FAC_VM_KVM-ALL-DATADRIVE.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.1.0",
|
||||
"images": {
|
||||
"hda_disk_image": "FAC_VM_KVM-v500-build0083-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "FAC_VM_KVM-v500-DATADRIVE.qcow2"
|
||||
"hdb_disk_image": "FAC_VM_KVM-ALL-DATADRIVE.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.0.0",
|
||||
"images": {
|
||||
"hda_disk_image": "FAC_VM_KVM-v500-build0012-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "FAC_VM_KVM-v500-DATADRIVE.qcow2"
|
||||
"hdb_disk_image": "FAC_VM_KVM-ALL-DATADRIVE.qcow2"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -26,6 +26,13 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FCHKVM-v400-build0230-FORTINET.out.kvm.qcow2",
|
||||
"version": "4.2.9",
|
||||
"md5sum": "a3583f162004da2f1e0b751e7b23504a",
|
||||
"filesize": 27672576,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FCHKVM-v400-build0226-FORTINET.out.kvm.qcow2",
|
||||
"version": "4.2.8",
|
||||
@@ -113,6 +120,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "4.2.9",
|
||||
"images": {
|
||||
"hda_disk_image": "FCHKVM-v400-build0230-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty100G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "4.2.8",
|
||||
"images": {
|
||||
|
||||
@@ -26,6 +26,13 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FGT_VM64_KVM-v6-build0866-FORTINET.out.kvm.qcow2",
|
||||
"version": "6.2.0",
|
||||
"md5sum": "588df9ba0db485976f6681810001ae73",
|
||||
"filesize": 57868288,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FGT_VM64_KVM-v6-build0200-FORTINET.out.kvm.qcow2",
|
||||
"version": "6.0.3",
|
||||
@@ -218,6 +225,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "6.2.0",
|
||||
"images": {
|
||||
"hda_disk_image": "FGT_VM64_KVM-v6-build0866-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.0.3",
|
||||
"images": {
|
||||
|
||||
@@ -26,6 +26,13 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FML_VMKV-64-v60-build0143-FORTINET.out.kvm.qcow2",
|
||||
"version": "6.0.4",
|
||||
"md5sum": "e6401ecfe9b145256cccb29757bbddfe",
|
||||
"filesize": 98959360,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FML_VMKV-64-v60-build0126-FORTINET.out.kvm.qcow2",
|
||||
"version": "6.0.3",
|
||||
@@ -162,6 +169,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "6.0.4",
|
||||
"images": {
|
||||
"hda_disk_image": "FML_VMKV-64-v60-build0143-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.0.3",
|
||||
"images": {
|
||||
|
||||
@@ -26,6 +26,13 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FMG_VM64_KVM-v6-build1050-FORTINET.out.kvm.qcow2",
|
||||
"version": "6.2.0",
|
||||
"md5sum": "c19d2527f91ad1bbafbde5bf08487867",
|
||||
"filesize": 126894080,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FMG_VM64_KVM-v6-build0255-FORTINET.out.kvm.qcow2",
|
||||
"version": "6.0.3",
|
||||
@@ -142,9 +149,9 @@
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "6.0.3",
|
||||
"name": "6.2.0",
|
||||
"images": {
|
||||
"hda_disk_image": "FMG_VM64_KVM-v6-build0255-FORTINET.out.kvm.qcow2",
|
||||
"hda_disk_image": "FMG_VM64_KVM-v6-build1050-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -26,6 +26,13 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FPX_KVM-v100-build0162-FORTINET.out.kvm.qcow2",
|
||||
"version": "1.1.2",
|
||||
"md5sum": "00db4c04fcc4ac0d7c389a86c71d20a5",
|
||||
"filesize": 44601344,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FPX_KVM-v100-build0147-FORTINET.out.kvm.qcow2",
|
||||
"version": "1.1.0",
|
||||
@@ -43,6 +50,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "1.1.2",
|
||||
"images": {
|
||||
"hda_disk_image": "FPX_KVM-v100-build0162-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "1.1.0",
|
||||
"images": {
|
||||
|
||||
@@ -27,7 +27,14 @@
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "fortirecorder-FRC_VMKV-64-v26-build0607-FORTINET.out.kvm.qcow2",
|
||||
"filename": "FRC_VMKV-64-v27-build0700-FORTINET.out.kvm.qcow2",
|
||||
"version": "2.7.1",
|
||||
"md5sum": "3736c66af7d958fc672fe29439b405b8",
|
||||
"filesize": 79429632,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FRC_VMKV-64-v26-build0607-FORTINET.out.kvm.qcow2",
|
||||
"version": "2.6.3",
|
||||
"md5sum": "ffa5d42119de576631673516f60e028b",
|
||||
"filesize": 63569920,
|
||||
@@ -43,10 +50,17 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "2.7.1",
|
||||
"images": {
|
||||
"hda_disk_image": "FRC_VMKV-64-v27-build0700-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2.6.3",
|
||||
"images": {
|
||||
"hda_disk_image": "fortirecorder-FRC_VMKV-64-v26-build0607-FORTINET.out.kvm.qcow2",
|
||||
"hda_disk_image": "FRC_VMKV-64-v26-build0607-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,6 +27,13 @@
|
||||
"options": "-smp 2"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FSA_KVM-v300-build0060-FORTINET.out.kvm.qcow2",
|
||||
"version": "3.0.4",
|
||||
"md5sum": "7e744c4d62430917aea4533672710b5a",
|
||||
"filesize": 157221376,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FSA_KVM-v300-build0049-FORTINET.out.kvm.qcow2",
|
||||
"version": "3.0.3",
|
||||
@@ -92,13 +99,20 @@
|
||||
},
|
||||
{
|
||||
"filename": "FSA-datadrive.qcow2",
|
||||
"version": "2.x",
|
||||
"version": "All",
|
||||
"md5sum": "f2dc0a8fc7591699c364aff400369157",
|
||||
"filesize": 200192,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "3.0.4",
|
||||
"images": {
|
||||
"hda_disk_image": "FSA_KVM-v300-build0060-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "FSA-datadrive.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "3.0.3",
|
||||
"images": {
|
||||
|
||||
@@ -28,6 +28,27 @@
|
||||
"options": "-smp 4"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FortiSIEM-VA-5.2.1.1553-OS.qcow2",
|
||||
"version": "5.2.1",
|
||||
"md5sum": "9dc3f4a9614b65c83d3e9733248cbcea",
|
||||
"filesize": 3902208000,
|
||||
"download_url": "https://images-cdn.fortisiem.fortinet.com/VirtualAppliances/release510.html"
|
||||
},
|
||||
{
|
||||
"filename": "FortiSIEM-VA-5.2.1.1553-CMDB.qcow2",
|
||||
"version": "5.2.1",
|
||||
"md5sum": "ea3f69191eb803cdf021227ec666bf7b",
|
||||
"filesize": 46858240,
|
||||
"download_url": "https://images-cdn.fortisiem.fortinet.com/VirtualAppliances/release510.html"
|
||||
},
|
||||
{
|
||||
"filename": "FortiSIEM-VA-5.2.1.1553-SVN.qcow2",
|
||||
"version": "5.2.1",
|
||||
"md5sum": "eff32e40baf6ede7bc57ad8d241812ad",
|
||||
"filesize": 46858240,
|
||||
"download_url": "https://images-cdn.fortisiem.fortinet.com/VirtualAppliances/release510.html"
|
||||
},
|
||||
{
|
||||
"filename": "FortiSIEM-VA-5.1.0.1336.qcow2",
|
||||
"version": "5.1.0",
|
||||
@@ -114,6 +135,14 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "5.2.1",
|
||||
"images": {
|
||||
"hda_disk_image": "FortiSIEM-VA-5.2.1.1553-OS.qcow2",
|
||||
"hdb_disk_image": "FortiSIEM-VA-5.2.1.1553-CMDB.qcow2",
|
||||
"hdc_disk_image": "FortiSIEM-VA-5.2.1.1553-SVN.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "5.1.0",
|
||||
"images": {
|
||||
|
||||
@@ -26,6 +26,13 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FWB_KVM-v600-build0383-FORTINET.out.kvm.qcow2",
|
||||
"version": "6.1.0",
|
||||
"md5sum": "d2dbbde9f03eb716a54119cc3e6055c4",
|
||||
"filesize": 190120448,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FWB_KVM-v600-build0056-FORTINET.out.kvm.qcow2",
|
||||
"version": "6.0.2",
|
||||
@@ -107,6 +114,13 @@
|
||||
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "6.1.0",
|
||||
"images": {
|
||||
"hda_disk_image": "FWB_KVM-v600-build0383-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.0.2",
|
||||
"images": {
|
||||
|
||||
@@ -24,6 +24,14 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FreeNAS-11.2-U3.iso",
|
||||
"version": "11.2 U3",
|
||||
"md5sum": "59ee32e2598a792eec0355b40a511251",
|
||||
"filesize": 600387584,
|
||||
"download_url": "http://www.freenas.org/download/",
|
||||
"direct_download_url": "https://download.freenas.org/11.2/STABLE/U3/x64/FreeNAS-11.2-U3.iso"
|
||||
},
|
||||
{
|
||||
"filename": "FreeNAS-11.2-RELEASE.iso",
|
||||
"version": "11.2",
|
||||
@@ -90,6 +98,14 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "11.2 U3",
|
||||
"images": {
|
||||
"hda_disk_image": "empty30G.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2",
|
||||
"cdrom_image": "FreeNAS-11.2-U3.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "11.2",
|
||||
"images": {
|
||||
|
||||
@@ -14,12 +14,22 @@
|
||||
"qemu": {
|
||||
"adapter_type": "virtio-net-pci",
|
||||
"adapters": 8,
|
||||
"ram": 256,
|
||||
"ram": 512,
|
||||
"hda_disk_interface": "virtio",
|
||||
"arch": "x86_64",
|
||||
"console_type": "telnet",
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "frr7.0-vm0.3.qcow2",
|
||||
"version": "FRR7.0 - VM0.3",
|
||||
"md5sum": "5fa8ce0ee74215f4c4a8c61778ee0b10",
|
||||
"filesize": 2044657664,
|
||||
"download_url": "https://sourceforge.net/projects/frr/files/",
|
||||
"direct_download_url": "https://sourceforge.net/projects/frr/files/FRR7.0-VM0.3.qcow2.bz2/download",
|
||||
"compression": "bzip2"
|
||||
},
|
||||
{
|
||||
"filename": "frr6.0-vm0.2.qcow2",
|
||||
"version": "FRR6.0 - VM0.2",
|
||||
@@ -40,6 +50,12 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "FRR7.0 - VM0.3",
|
||||
"images": {
|
||||
"hda_disk_image": "frr7.0-vm0.3.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "FRR6.0 - VM0.2",
|
||||
"images": {
|
||||
|
||||
@@ -24,6 +24,24 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "ipfire-2.23.2gb-ext4.x86_64-full-core131.img",
|
||||
"version": "2.23",
|
||||
"md5sum": "604c06e20c36985ff00802da4509340c",
|
||||
"filesize": 1541160960,
|
||||
"download_url": "http://www.ipfire.org/download",
|
||||
"direct_download_url": "https://muug.ca/mirror/ipfire/releases/ipfire-2.x/2.23-core131/ipfire-2.23.2gb-ext4.x86_64-full-core131.img.xz",
|
||||
"compression": "xz"
|
||||
},
|
||||
{
|
||||
"filename": "ipfire-2.21.2gb-ext4.x86_64-full-core129.img",
|
||||
"version": "2.21.129",
|
||||
"md5sum": "84801c588174763c585967a2851a7769",
|
||||
"filesize": 1541160960,
|
||||
"download_url": "http://www.ipfire.org/download",
|
||||
"direct_download_url": "https://downloads.ipfire.org/releases/ipfire-2.x/2.21-core129/ipfire-2.21.2gb-ext4.x86_64-full-core129.img.xz",
|
||||
"compression": "xz"
|
||||
},
|
||||
{
|
||||
"filename": "ipfire-2.21.2gb-ext4.x86_64-full-core124.img",
|
||||
"version": "2.21.124",
|
||||
@@ -89,6 +107,18 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "2.23",
|
||||
"images": {
|
||||
"hda_disk_image": "ipfire-2.23.2gb-ext4.x86_64-full-core131.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2.21.129",
|
||||
"images": {
|
||||
"hda_disk_image": "ipfire-2.21.2gb-ext4.x86_64-full-core129.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2.21.124",
|
||||
"images": {
|
||||
|
||||
@@ -20,6 +20,30 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "kali-linux-mate-2019.2-amd64.iso",
|
||||
"version": "2019.2 (MATE)",
|
||||
"md5sum": "fec8dd7009f932c51a74323df965a709",
|
||||
"filesize": 3313217536,
|
||||
"download_url": "https://www.kali.org/downloads/",
|
||||
"direct_download_url": "http://cdimage.kali.org/kali-2019.1a/kali-linux-mate-2019.2-amd64.iso"
|
||||
},
|
||||
{
|
||||
"filename": "kali-linux-2019.2-amd64.iso",
|
||||
"version": "2019.2",
|
||||
"md5sum": "0f89b6225d7ea9c18682f7cc541c1179",
|
||||
"filesize": 3353227264,
|
||||
"download_url": "https://www.kali.org/downloads/",
|
||||
"direct_download_url": "http://cdimage.kali.org/kali-2019.1a/kali-linux-2019.2-amd64.iso"
|
||||
},
|
||||
{
|
||||
"filename": "kali-linux-2019.1a-amd64.iso",
|
||||
"version": "2019.1a",
|
||||
"md5sum": "58c6111ed0be1919ea87267e7e65ab0f",
|
||||
"filesize": 3483873280,
|
||||
"download_url": "https://www.kali.org/downloads/",
|
||||
"direct_download_url": "http://cdimage.kali.org/kali-2019.1a/kali-linux-2019.1a-amd64.iso"
|
||||
},
|
||||
{
|
||||
"filename": "kali-linux-2018.4-amd64.iso",
|
||||
"version": "2018.4",
|
||||
@@ -94,6 +118,24 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "2019.2 (MATE)",
|
||||
"images": {
|
||||
"cdrom_image": "kali-linux-mate-2019.2-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2019.2",
|
||||
"images": {
|
||||
"cdrom_image": "kali-linux-2019.2-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2019.1a",
|
||||
"images": {
|
||||
"cdrom_image": "kali-linux-2019.1a-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2018.4",
|
||||
"images": {
|
||||
|
||||
@@ -23,6 +23,14 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "kerio-control-appliance-9.3.0-3273-vmware-disk1.vmdk",
|
||||
"version": "9.3.0",
|
||||
"md5sum": "6e6faf64b4ffce8b5639cdfce11ba31e",
|
||||
"filesize": 192825856,
|
||||
"download_url": "http://www.kerio.com/support/kerio-control",
|
||||
"direct_download_url": "http://cdn.kerio.com/dwn/control/control-9.3.0-3273/kerio-control-appliance-9.3.0-3273-vmware-disk1.vmdk"
|
||||
},
|
||||
{
|
||||
"filename": "kerio-control-appliance-9.2.7-2921-vmware-disk1.vmdk",
|
||||
"version": "9.2.7",
|
||||
@@ -79,6 +87,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.3.0",
|
||||
"images": {
|
||||
"hda_disk_image": "kerio-control-appliance-9.3.0-3273-vmware-disk1.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9.2.7",
|
||||
"images": {
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
{
|
||||
"name": "LEDE",
|
||||
"category": "router",
|
||||
"description": "LEDE is a highly extensible GNU/Linux distribution for embedded devices (typically wireless routers). Unlike many other distributions for these routers, OpenWrt is built from the ground up to be a full-featured, easily modifiable operating system for your router. In practice, this means that you can have all the features you need with none of the bloat, powered by a Linux kernel that's more recent than most other distributions.",
|
||||
"vendor_name": "LEDE Project",
|
||||
"vendor_url": "https://lede-project.org/",
|
||||
"documentation_url": "http://wiki.openwrt.org/doc/",
|
||||
"product_name": "LEDE",
|
||||
"product_url": "https://lede-project.org/",
|
||||
"registry_version": 3,
|
||||
"status": "stable",
|
||||
"maintainer": "GNS3 Team",
|
||||
"maintainer_email": "developers@gns3.net",
|
||||
"usage": "Ethernet0 is the LAN link, Ethernet1 the WAN link.",
|
||||
"qemu": {
|
||||
"adapter_type": "virtio-net-pci",
|
||||
"adapters": 2,
|
||||
"ram": 64,
|
||||
"arch": "i386",
|
||||
"console_type": "telnet",
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "lede-17.01.4-x86-generic-combined-squashfs.img",
|
||||
"version": "17.01.4",
|
||||
"md5sum": "ae5d8d3fcab109565fe337d28e51c4b4",
|
||||
"filesize": 19779546,
|
||||
"download_url": "https://downloads.lede-project.org/releases/17.01.4/targets/x86/generic/",
|
||||
"direct_download_url": "https://downloads.lede-project.org/releases/17.01.4/targets/x86/generic/lede-17.01.4-x86-generic-combined-squashfs.img"
|
||||
},
|
||||
{
|
||||
"filename": "lede-17.01.3-x86-generic-combined-squashfs.img",
|
||||
"version": "17.01.3",
|
||||
"md5sum": "d315fc638160a9aec0966d58828bfccf",
|
||||
"filesize": 19775618,
|
||||
"download_url": "https://downloads.lede-project.org/releases/17.01.3/targets/x86/generic/",
|
||||
"direct_download_url": "https://downloads.lede-project.org/releases/17.01.3/targets/x86/generic/lede-17.01.3-x86-generic-combined-squashfs.img"
|
||||
},
|
||||
{
|
||||
"filename": "lede-17.01.2-x86-generic-combined-squashfs.img",
|
||||
"version": "17.01.2",
|
||||
"md5sum": "a466e493ef12935dad5e0c622b1a7859",
|
||||
"filesize": 19774794,
|
||||
"download_url": "https://downloads.lede-project.org/releases/17.01.2/targets/x86/generic/",
|
||||
"direct_download_url": "https://downloads.lede-project.org/releases/17.01.2/targets/x86/generic/lede-17.01.2-x86-generic-combined-squashfs.img"
|
||||
},
|
||||
{
|
||||
"filename": "lede-17.01.1-x86-generic-combined-squashfs.img",
|
||||
"version": "17.01.1",
|
||||
"md5sum": "b050e734c605a34a429389c752ae7c30",
|
||||
"filesize": 19771166,
|
||||
"download_url": "https://downloads.lede-project.org/releases/17.01.1/targets/x86/generic/",
|
||||
"direct_download_url": "https://downloads.lede-project.org/releases/17.01.1/targets/x86/generic/lede-17.01.1-x86-generic-combined-squashfs.img"
|
||||
},
|
||||
{
|
||||
"filename": "lede-17.01.0-r3205-59508e3-x86-generic-combined-squashfs.img",
|
||||
"version": "17.01.0",
|
||||
"md5sum": "3c5e068d50a377d4e26b548ab1ca7b1e",
|
||||
"filesize": 19755118,
|
||||
"download_url": "https://downloads.lede-project.org/releases/17.01.0/targets/x86/generic/",
|
||||
"direct_download_url": "https://downloads.lede-project.org/releases/17.01.0/targets/x86/generic/lede-17.01.0-r3205-59508e3-x86-generic-combined-squashfs.img"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "lede 17.01.4",
|
||||
"images": {
|
||||
"hda_disk_image": "lede-17.01.4-x86-generic-combined-squashfs.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "lede 17.01.3",
|
||||
"images": {
|
||||
"hda_disk_image": "lede-17.01.3-x86-generic-combined-squashfs.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "lede 17.01.2",
|
||||
"images": {
|
||||
"hda_disk_image": "lede-17.01.2-x86-generic-combined-squashfs.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "lede 17.01.1",
|
||||
"images": {
|
||||
"hda_disk_image": "lede-17.01.1-x86-generic-combined-squashfs.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "lede 17.01.0",
|
||||
"images": {
|
||||
"hda_disk_image": "lede-17.01.0-r3205-59508e3-x86-generic-combined-squashfs.img"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -26,6 +26,24 @@
|
||||
"options": "-nographic"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "chr-6.44.3.img",
|
||||
"version": "6.44.2",
|
||||
"md5sum": "c46b33125d536faa24473a519abbb89d",
|
||||
"filesize": 67108864,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "https://download.mikrotik.com/routeros/6.44.2/chr-6.44.2.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.44.2.img",
|
||||
"version": "6.44.2",
|
||||
"md5sum": "f1ddaa47829e12c1f9f023d8c06b88cc",
|
||||
"filesize": 67108864,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "https://download.mikrotik.com/routeros/6.44.2/chr-6.44.2.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.43.8.img",
|
||||
"version": "6.43.8",
|
||||
@@ -88,198 +106,21 @@
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "https://download2.mikrotik.com/routeros/6.40.3/chr-6.40.3.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.39.2.img",
|
||||
"version": "6.39.2",
|
||||
"md5sum": "ecb37373dedfba04267a999d23b8e203",
|
||||
"filesize": 134217728,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "https://download2.mikrotik.com/routeros/6.39.2/chr-6.39.2.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.39.1.img",
|
||||
"version": "6.39.1",
|
||||
"md5sum": "c53293bc41f76d85a8642005fd1cbd54",
|
||||
"filesize": 134217728,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "https://download2.mikrotik.com/routeros/6.39.1/chr-6.39.1.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.39.img",
|
||||
"version": "6.39",
|
||||
"md5sum": "7e77c8ac4c9aeaf88f6ff15897f33163",
|
||||
"filesize": 134217728,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "https://download2.mikrotik.com/routeros/6.39/chr-6.39.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.38.7.img",
|
||||
"version": "6.38.7",
|
||||
"md5sum": "69a51c96b1247bbaf1253d2873617122",
|
||||
"filesize": 134217728,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "https://download2.mikrotik.com/routeros/6.38.7/chr-6.38.7.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.38.5.img",
|
||||
"version": "6.38.5",
|
||||
"md5sum": "8147f42ea1ee96f580a35a298b7f9354",
|
||||
"filesize": 134217728,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "https://download2.mikrotik.com/routeros/6.38.5/chr-6.38.5.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.38.1.img",
|
||||
"version": "6.38.1",
|
||||
"md5sum": "753ed7c86e0f54fd9e18d044db64538d",
|
||||
"filesize": 134217728,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "https://download2.mikrotik.com/routeros/6.38.1/chr-6.38.1.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.38.img",
|
||||
"version": "6.38",
|
||||
"md5sum": "37e2165112f8a9beccac06a9a6009000",
|
||||
"filesize": 134217728,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "http://download2.mikrotik.com/routeros/6.38/chr-6.38.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.37.3.img",
|
||||
"version": "6.37.3",
|
||||
"md5sum": "bda87db475f80debdf3181accf6b78e2",
|
||||
"filesize": 134217728,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "http://download2.mikrotik.com/routeros/6.37.3/chr-6.37.3.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.37.1.img",
|
||||
"version": "6.37.1",
|
||||
"md5sum": "713b14a5aba9f967f7bdd9029c8d85b6",
|
||||
"filesize": 134217728,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "http://download2.mikrotik.com/routeros/6.37.1/chr-6.37.1.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.36.4.img",
|
||||
"version": "6.36.4",
|
||||
"md5sum": "09527bde50697711926c08d545940c1e",
|
||||
"filesize": 134217728,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "http://download2.mikrotik.com/routeros/6.36.4/chr-6.36.4.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.34.2.vmdk",
|
||||
"version": "6.34.2 (.vmdk)",
|
||||
"md5sum": "0360f121b76a8b491a05dc37640ca319",
|
||||
"filesize": 30277632,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "http://download2.mikrotik.com/routeros/6.34.2/chr-6.34.2.vmdk"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.34.2.vdi",
|
||||
"version": "6.34.2 (.vdi)",
|
||||
"md5sum": "e7e4021aeeee2eaabd024d48702bb2e1",
|
||||
"filesize": 30409728,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "http://download2.mikrotik.com/routeros/6.34.2/chr-6.34.2.vdi"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.34.2.img",
|
||||
"version": "6.34.2 (.img)",
|
||||
"md5sum": "984d4d11c2ff209fcdc21ac42895edbe",
|
||||
"filesize": 134217728,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "http://download2.mikrotik.com/routeros/6.34.2/chr-6.34.2.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.34.vmdk",
|
||||
"version": "6.34 (.vmdk)",
|
||||
"md5sum": "c5e6d192ae19d263a9a313d4b4bee7e4",
|
||||
"filesize": 30277632,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "http://download2.mikrotik.com/routeros/6.34/chr-6.34.vmdk"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.34.vdi",
|
||||
"version": "6.34 (.vdi)",
|
||||
"md5sum": "34b161f83a792c744c76a529afc094a8",
|
||||
"filesize": 30409728,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "http://download2.mikrotik.com/routeros/6.34/chr-6.34.vdi"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.34.img",
|
||||
"version": "6.34 (.img)",
|
||||
"md5sum": "32ffde7fb934c7bfee555c899ccd77b6",
|
||||
"filesize": 134217728,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "http://download2.mikrotik.com/routeros/6.34/chr-6.34.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.33.5.vmdk",
|
||||
"version": "6.33.5 (.vmdk)",
|
||||
"md5sum": "cd284e28aa02ae59f55ed8f43ff27fbf",
|
||||
"filesize": 23920640,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "http://download2.mikrotik.com/routeros/6.33.5/chr-6.33.5.vmdk"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.33.5.vdi",
|
||||
"version": "6.33.5 (.vdi)",
|
||||
"md5sum": "fa84e63a558e7c61d7d338386cfd08c9",
|
||||
"filesize": 24118272,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "http://download2.mikrotik.com/routeros/6.33.5/chr-6.33.5.vdi"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.33.5.img",
|
||||
"version": "6.33.5 (.img)",
|
||||
"md5sum": "210cc8ad06f25c9f27b6b99f6e00bd91",
|
||||
"filesize": 67108864,
|
||||
"direct_download_url": "http://download2.mikrotik.com/routeros/6.33.5/chr-6.33.5.img.zip",
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.33.3.vmdk",
|
||||
"version": "6.33.3 (.vmdk)",
|
||||
"md5sum": "08532a5af1a830182d65c416eab2b089",
|
||||
"filesize": 23920640,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "http://download2.mikrotik.com/routeros/6.33.3/chr-6.33.3.vmdk"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.33.2.vmdk",
|
||||
"version": "6.33.2 (.vmdk)",
|
||||
"md5sum": "6291893c2c9626603c6d38d23390a8be",
|
||||
"filesize": 23920640,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "http://download2.mikrotik.com/routeros/6.33.2/chr-6.33.2.vmdk"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.33.vmdk",
|
||||
"version": "6.33 (.vmdk)",
|
||||
"md5sum": "63bee5405fa1e209388adc6b5f78bb70",
|
||||
"filesize": 23920640,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "http://download2.mikrotik.com/routeros/6.33/chr-6.33.vmdk"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "6.44.3",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.44.3.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.44.2",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.44.2.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.43.8",
|
||||
"images": {
|
||||
@@ -315,138 +156,6 @@
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.40.3.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.39.2",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.39.2.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.39.1",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.39.1.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.39",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.39.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.38.7",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.38.7.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.38.5",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.38.5.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.38.1",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.38.1.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.38",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.38.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.37.3",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.37.3.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.37.1",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.37.1.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.36.4",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.36.4.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.34.2 (.vmdk)",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.34.2.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.34.2 (.vdi)",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.34.2.vdi"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.34.2 (.img)",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.34.2.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.34 (.vmdk)",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.34.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.34 (.vdi)",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.34.vdi"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.34 (.img)",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.34.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.33.5 (.vmdk)",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.33.5.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.33.5 (.vdi)",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.33.5.vdi"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.33.5 (.img)",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.33.5.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.33.3 (.vmdk)",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.33.3.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.33.2 (.vmdk)",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.33.2.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.33 (.vmdk)",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.33.vmdk"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"name": "OpenNAC",
|
||||
"category": "guest",
|
||||
"description": "openNAC is an opensource Network Access Control for corporate LAN / WAN environments. It enables authentication, authorization and audit policy-based all access to network. It supports diferent network vendors like Cisco, Alcatel, 3Com or Extreme Networks, and different clients like PCs with Windows or Linux, Mac,devices like smartphones and tablets. Based on open source components and self-development It is based on industry standards such as FreeRadius, 802.1x, AD, ldap, ...It is very extensible, new features can be incorporated because it is architectured in plugins. Easily integrated with existing systems Last but not least, It provides value added services such as configuration management, network, backup configurations, Network Discovery and Network Monitoring. Download the OVA, then extract the VMDK (tar -xvf FILE.ova), then convert to qcow2 (qemu-img convert -O qcow2 FILE.vmdk FILE.qcow2).",
|
||||
"vendor_name": "Opennactech",
|
||||
"vendor_url": "http://www.opennac.org/opennac/en.html",
|
||||
"documentation_url": "http://www.opennac.org/opennac/en/support.html",
|
||||
"product_name": "OpenNAC",
|
||||
"product_url": "https://opennac.org/",
|
||||
"registry_version": 3,
|
||||
"status": "stable",
|
||||
"maintainer": "Brent Stewart",
|
||||
"maintainer_email": "brent@stewart.tc",
|
||||
"usage": "Passwords are set during installation.",
|
||||
"symbol": "opennac.png",
|
||||
"qemu": {
|
||||
"adapter_type": "e1000",
|
||||
"adapters": 1,
|
||||
"ram": 512,
|
||||
"arch": "x86_64",
|
||||
"console_type": "vnc",
|
||||
"kvm": "require",
|
||||
"options": "-smp 2"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "opennac_3711_img.qcow2",
|
||||
"version": "OpenNAC 3711",
|
||||
"md5sum": "88d6129265860aa58c5306cd7b413aab",
|
||||
"filesize": 3968729088,
|
||||
"download_url": "http://www.opennac.org/opennac/en/download.html",
|
||||
"direct_download_url": "http://sourceforge.net/projects/opennac/files/ova/opennac_3711_img.ova/download"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "OpenNAC 3711",
|
||||
"images": {
|
||||
"hda_disk_image": "opennac_3711_img.qcow2"
|
||||
}
|
||||
}
|
||||
|
||||
]
|
||||
}
|
||||
@@ -15,7 +15,7 @@
|
||||
"qemu": {
|
||||
"adapter_type": "virtio-net-pci",
|
||||
"adapters": 4,
|
||||
"ram": 64,
|
||||
"ram": 128,
|
||||
"arch": "x86_64",
|
||||
"console_type": "telnet",
|
||||
"kvm": "allow"
|
||||
|
||||
@@ -11,7 +11,8 @@
|
||||
"status": "stable",
|
||||
"maintainer": "GNS3 Team",
|
||||
"maintainer_email": "developers@gns3.net",
|
||||
"usage": "Boot the live CD",
|
||||
"usage": "Rename the downloaded file to include the version number. Boot the live CD",
|
||||
"symbol": "packetfence2.png",
|
||||
"qemu": {
|
||||
"adapter_type": "virtio-net-pci",
|
||||
"adapters": 2,
|
||||
@@ -22,6 +23,24 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "PacketFenceZEN_USB-9.0.1.img",
|
||||
"version": "9.0.1",
|
||||
"md5sum": "05a18a5a3c53bf10e84082b3d8db3961",
|
||||
"filesize": 3221225472,
|
||||
"download_url": "https://packetfence.org/download.html#/zen",
|
||||
"direct_download_url": "https://sourceforge.net/projects/packetfence/files/PacketFence%20ZEN/9.0.1/PacketFenceZEN_USB-9.0.1.tar.bz2/download",
|
||||
"compression": "bzip2"
|
||||
},
|
||||
{
|
||||
"filename": "PacketFenceZEN_USB-8.3.0.img",
|
||||
"version": "8.3.0",
|
||||
"md5sum": "b9de52dc2513220ad42d350486da4884",
|
||||
"filesize": 3221225472,
|
||||
"download_url": "https://packetfence.org/download.html#/zen",
|
||||
"direct_download_url": "https://sourceforge.net/projects/packetfence/files/PacketFence%20ZEN/8.3.0/PacketFenceZEN_USB-8.3.0.tar.bz2/download",
|
||||
"compression": "bzip2"
|
||||
},
|
||||
{
|
||||
"filename": "PacketFenceZEN_USB-8.1.0.img",
|
||||
"version": "8.1.0",
|
||||
@@ -66,54 +85,21 @@
|
||||
"download_url": "https://packetfence.org/download.html#/zen",
|
||||
"direct_download_url": "https://sourceforge.net/projects/packetfence/files/PacketFence%20ZEN/7.0.0/PacketFenceZEN_USB-7.0.0.tar.bz2/download",
|
||||
"compression": "bzip2"
|
||||
},
|
||||
{
|
||||
"filename": "PacketFenceZEN_USB-6.5.1.img",
|
||||
"version": "6.5.1",
|
||||
"md5sum": "937c02640bd487889b7071e8f094a62a",
|
||||
"filesize": 3221225472,
|
||||
"download_url": "https://packetfence.org/download.html#/zen",
|
||||
"direct_download_url": "http://sourceforge.net/projects/packetfence/files/PacketFence%20ZEN/6.5.1/PacketFenceZEN_USB-6.5.1.tar.bz2/download",
|
||||
"compression": "bzip2"
|
||||
},
|
||||
{
|
||||
"filename": "PacketFenceZEN_USB-6.5.0.img",
|
||||
"version": "6.5.0",
|
||||
"md5sum": "5d5ff015f115e9dbcfd355f1bb22f5d9",
|
||||
"filesize": 3221225472,
|
||||
"download_url": "https://packetfence.org/download.html#/zen",
|
||||
"direct_download_url": "http://sourceforge.net/projects/packetfence/files/PacketFence%20ZEN/6.5.0/PacketFenceZEN_USB-6.5.0.tar.bz2/download",
|
||||
"compression": "bzip2"
|
||||
},
|
||||
{
|
||||
"filename": "PacketFenceZEN_USB-6.4.0.img",
|
||||
"version": "6.4.0",
|
||||
"md5sum": "7f2bea58421d094152ea71f49cc3084a",
|
||||
"filesize": 3221225472,
|
||||
"download_url": "https://packetfence.org/download.html#/zen",
|
||||
"direct_download_url": "https://sourceforge.net/projects/packetfence/files/PacketFence%20ZEN/6.4.0/PacketFenceZEN_USB-6.4.0.tar.bz2/download",
|
||||
"compression": "bzip2"
|
||||
},
|
||||
{
|
||||
"filename": "PacketFenceZEN_USB-6.3.0.img",
|
||||
"version": "6.3.0",
|
||||
"md5sum": "94e19349faedf292743fdc0ab48f8466",
|
||||
"filesize": 3221225472,
|
||||
"download_url": "https://packetfence.org/download.html#/zen",
|
||||
"direct_download_url": "https://sourceforge.net/projects/packetfence/files/PacketFence%20ZEN/6.3.0/PacketFenceZEN_USB-6.3.0.tar.bz2/download",
|
||||
"compression": "bzip2"
|
||||
},
|
||||
{
|
||||
"filename": "PacketFenceZEN_USB-6.2.1.img",
|
||||
"version": "6.2.1",
|
||||
"md5sum": "f212be7c8621b90d973f500f00ef1277",
|
||||
"filesize": 3221225472,
|
||||
"download_url": "https://packetfence.org/download.html#/zen",
|
||||
"direct_download_url": "http://sourceforge.net/projects/packetfence/files/PacketFence%20ZEN/6.2.1/PacketFenceZEN_USB-6.2.1.tar.bz2/download",
|
||||
"compression": "bzip2"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "9.0.1",
|
||||
"images": {
|
||||
"hda_disk_image": "PacketFenceZEN_USB-9.0.1.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "8.3.0",
|
||||
"images": {
|
||||
"hda_disk_image": "PacketFenceZEN_USB-8.3.0.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "8.1.0",
|
||||
"images": {
|
||||
@@ -143,36 +129,6 @@
|
||||
"images": {
|
||||
"hda_disk_image": "PacketFenceZEN_USB-7.0.0.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.5.0",
|
||||
"images": {
|
||||
"hda_disk_image": "PacketFenceZEN_USB-6.5.1.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.5.0",
|
||||
"images": {
|
||||
"hda_disk_image": "PacketFenceZEN_USB-6.5.0.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.4.0",
|
||||
"images": {
|
||||
"hda_disk_image": "PacketFenceZEN_USB-6.4.0.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.3.0",
|
||||
"images": {
|
||||
"hda_disk_image": "PacketFenceZEN_USB-6.3.0.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.2.1",
|
||||
"images": {
|
||||
"hda_disk_image": "PacketFenceZEN_USB-6.2.1.img"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -22,6 +22,14 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "Parrot-security-4.6_amd64.iso",
|
||||
"version": "Security Build 4.6",
|
||||
"md5sum": "ead812edc83119e8bcb4ee9daabdc105",
|
||||
"filesize": 3788668928,
|
||||
"download_url": "https://www.parrotsec.org/download-security.php",
|
||||
"direct_download_url": "https://download.parrotsec.org/parrot/iso/4.6/Parrot-security-4.6_amd64.iso"
|
||||
},
|
||||
{
|
||||
"filename": "Parrot-security-3.11_amd64.iso",
|
||||
"version": "Security Build 3.11",
|
||||
@@ -41,6 +49,13 @@
|
||||
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "Security Build 4.6",
|
||||
"images": {
|
||||
"hda_disk_image": "empty30G.qcow2",
|
||||
"cdrom_image": "Parrot-security-4.6_amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Security Build 3.11",
|
||||
"images": {
|
||||
|
||||
@@ -17,11 +17,19 @@
|
||||
"adapter_type": "e1000",
|
||||
"adapters": 2,
|
||||
"ram": 3072,
|
||||
"arch": "i386",
|
||||
"console_type": "telnet",
|
||||
"arch": "x86_64",
|
||||
"console_type": "vnc",
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "securityonion-16.04.6.1.iso",
|
||||
"version": "16.04.6.1",
|
||||
"md5sum": "ca835cef92c2c0daafa16e789c343d1d",
|
||||
"filesize": 2020605952,
|
||||
"download_url": "https://github.com/Security-Onion-Solutions/security-onion/releases/",
|
||||
"direct_download_url": "https://github.com/Security-Onion-Solutions/security-onion/releases/download/v16.04.5.3_20181010/securityonion-16.04.6.1.iso"
|
||||
},
|
||||
{
|
||||
"filename": "securityonion-16.04.5.3.iso",
|
||||
"version": "16.04.5.3",
|
||||
@@ -58,6 +66,12 @@
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "16.04.6.1",
|
||||
"images": {
|
||||
"hda_disk_image": "empty30G.qcow2",
|
||||
"cdrom_image": "securityonion-16.04.6.1.iso"
|
||||
}
|
||||
}, {
|
||||
"name": "16.04.5.3",
|
||||
"images": {
|
||||
"hda_disk_image": "empty30G.qcow2",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "VyOS",
|
||||
"category": "router",
|
||||
"description": "VyOS is a community fork of Vyatta, a Linux-based network operating system that provides software-based network routing, firewall, and VPN functionality.",
|
||||
"description": "VyOS is a community fork of Vyatta, a Linux-based network operating system that provides software-based network routing, firewall, and VPN functionality. VyOS has a subscription LTS version and a community rolling release. The latest version in this appliance is in the rolling release track.",
|
||||
"vendor_name": "Linux",
|
||||
"vendor_url": "http://vyos.net/",
|
||||
"documentation_url": "http://vyos.net/wiki/User_Guide",
|
||||
@@ -9,6 +9,7 @@
|
||||
"product_url": "http://vyos.net/",
|
||||
"registry_version": 3,
|
||||
"status": "stable",
|
||||
"symbol": "vyos.png",
|
||||
"maintainer": "GNS3 Team",
|
||||
"maintainer_email": "developers@gns3.net",
|
||||
"usage": "Default username/password is vyos/vyos. At first boot the router will start from the cdrom, login and then type install system and follow the instructions.",
|
||||
@@ -24,10 +25,10 @@
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "vyos-1.2.0-beta1-amd64.iso",
|
||||
"version": "1.2.0-beta1",
|
||||
"md5sum": "c2906532d4c7a0d29b61e8eab326d6c7",
|
||||
"filesize": 243269632,
|
||||
"filename": "vyos-1.2.0-rolling+201906040337-amd64.iso",
|
||||
"version": "1.2.0-2019-06-04",
|
||||
"md5sum": "2a1342985b2a9edfef9f66310ce11a92",
|
||||
"filesize": 427819008,
|
||||
"download_url": "http://dev.packages.vyos.net/iso/preview/1.2.0-beta1/",
|
||||
"direct_download_url": "http://dev.packages.vyos.net/iso/preview/1.2.0-beta1/vyos-1.2.0-beta1-amd64.iso"
|
||||
},
|
||||
@@ -74,10 +75,10 @@
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "1.2.0-beta1",
|
||||
"name": "1.2.0-2019-06-04",
|
||||
"images": {
|
||||
"hda_disk_image": "empty8G.qcow2",
|
||||
"cdrom_image": "vyos-1.2.0-beta1-amd64.iso"
|
||||
"cdrom_image": "vyos-1.2.0-rolling+201906040337-amd64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@@ -27,10 +27,10 @@
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "MSEdge-Win10-VMWare-disk1.vmdk",
|
||||
"filename": "MSEdge-Win10-VMware-disk1.vmdk",
|
||||
"version": "10 w/ Edge",
|
||||
"md5sum": "fef74c69e1949480d4e2095324a169af",
|
||||
"filesize": 5636608512,
|
||||
"md5sum": "670f3c2b03a5629dc85d0d1c261e5929",
|
||||
"filesize": 7293386240,
|
||||
"download_url": "https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/"
|
||||
},
|
||||
{
|
||||
@@ -80,7 +80,7 @@
|
||||
{
|
||||
"name": "10 w/ Edge",
|
||||
"images": {
|
||||
"hda_disk_image": "MSEdge-Win10-VMWare-disk1.vmdk"
|
||||
"hda_disk_image": "MSEdge-Win10-VMware-disk1.vmdk"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@@ -26,6 +26,7 @@ import shlex
|
||||
import aiohttp
|
||||
import subprocess
|
||||
import os
|
||||
import re
|
||||
|
||||
from gns3server.utils.asyncio.telnet_server import AsyncioTelnetServer
|
||||
from gns3server.utils.asyncio.raw_command_server import AsyncioRawCommandServer
|
||||
@@ -64,11 +65,12 @@ class DockerVM(BaseNode):
|
||||
:param console_http_port: Port to redirect HTTP queries
|
||||
:param console_http_path: Url part with the path of the web interface
|
||||
:param extra_hosts: Hosts which will be written into /etc/hosts into docker conainer
|
||||
:param extra_volumes: Additional directories to make persistent
|
||||
"""
|
||||
|
||||
def __init__(self, name, node_id, project, manager, image, console=None, aux=None, start_command=None,
|
||||
adapters=None, environment=None, console_type="telnet", console_resolution="1024x768",
|
||||
console_http_port=80, console_http_path="/", extra_hosts=None):
|
||||
console_http_port=80, console_http_path="/", extra_hosts=None, extra_volumes=[]):
|
||||
|
||||
super().__init__(name, node_id, project, manager, console=console, aux=aux, allocate_aux=True, console_type=console_type)
|
||||
|
||||
@@ -89,6 +91,7 @@ class DockerVM(BaseNode):
|
||||
self._console_http_port = console_http_port
|
||||
self._console_websocket = None
|
||||
self._extra_hosts = extra_hosts
|
||||
self._extra_volumes = extra_volumes or []
|
||||
self._permissions_fixed = False
|
||||
self._display = None
|
||||
self._closing = False
|
||||
@@ -125,7 +128,8 @@ class DockerVM(BaseNode):
|
||||
"status": self.status,
|
||||
"environment": self.environment,
|
||||
"node_directory": self.working_path,
|
||||
"extra_hosts": self.extra_hosts
|
||||
"extra_hosts": self.extra_hosts,
|
||||
"extra_volumes": self.extra_volumes,
|
||||
}
|
||||
|
||||
def _get_free_display_port(self):
|
||||
@@ -197,6 +201,14 @@ class DockerVM(BaseNode):
|
||||
def extra_hosts(self, extra_hosts):
|
||||
self._extra_hosts = extra_hosts
|
||||
|
||||
@property
|
||||
def extra_volumes(self):
|
||||
return self._extra_volumes
|
||||
|
||||
@extra_volumes.setter
|
||||
def extra_volumes(self, extra_volumes):
|
||||
self._extra_volumes = extra_volumes
|
||||
|
||||
async def _get_container_state(self):
|
||||
"""
|
||||
Returns the container state (e.g. running, paused etc.)
|
||||
@@ -236,21 +248,32 @@ class DockerVM(BaseNode):
|
||||
|
||||
# We mount our own etc/network
|
||||
try:
|
||||
network_config = self._create_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))
|
||||
volumes = ["/etc/network"]
|
||||
|
||||
self._volumes = ["/etc/network"]
|
||||
volumes.extend((image_info.get("Config", {}).get("Volumes") or {}).keys())
|
||||
for volume in self._extra_volumes:
|
||||
if not volume.strip() or volume[0] != "/" or volume.find("..") >= 0:
|
||||
raise DockerError("Persistent volume '{}' has invalid format. It must start with a '/' and not contain '..'.".format(volume))
|
||||
volumes.extend(self._extra_volumes)
|
||||
|
||||
volumes = image_info.get("Config", {}).get("Volumes")
|
||||
if volumes is None:
|
||||
return binds
|
||||
for volume in volumes.keys():
|
||||
self._volumes = []
|
||||
# define lambdas for validation checks
|
||||
nf = lambda x: re.sub(r"//+", "/", (x if x.endswith("/") else x + "/"))
|
||||
generalises = lambda v1, v2: nf(v2).startswith(nf(v1))
|
||||
for volume in volumes:
|
||||
# remove any mount that is equal or more specific, then append this one
|
||||
self._volumes = list(filter(lambda v: not generalises(volume, v), self._volumes))
|
||||
# if there is nothing more general, append this mount
|
||||
if not [ v for v in self._volumes if generalises(v, volume) ] :
|
||||
self._volumes.append(volume)
|
||||
|
||||
for volume in self._volumes:
|
||||
source = os.path.join(self.working_dir, os.path.relpath(volume, "/"))
|
||||
os.makedirs(source, exist_ok=True)
|
||||
binds.append("{}:/gns3volumes{}".format(source, volume))
|
||||
self._volumes.append(volume)
|
||||
|
||||
return binds
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@ class EthernetSwitch(Device):
|
||||
:param hypervisor: Dynamips hypervisor instance
|
||||
"""
|
||||
|
||||
def __init__(self, name, node_id, project, manager, console=None, console_type="telnet", ports=None, hypervisor=None):
|
||||
def __init__(self, name, node_id, project, manager, console=None, console_type="none", ports=None, hypervisor=None):
|
||||
|
||||
super().__init__(name, node_id, project, manager, hypervisor)
|
||||
self._nios = {}
|
||||
@@ -131,7 +131,12 @@ class EthernetSwitch(Device):
|
||||
|
||||
@console_type.setter
|
||||
def console_type(self, console_type):
|
||||
self._console_type = console_type
|
||||
|
||||
if self._console_type != console_type:
|
||||
if console_type == "telnet":
|
||||
self.project.emit("log.warning", {
|
||||
"message": '"{name}": Telnet access for switches is not available in this version of GNS3'.format(name=self._name)})
|
||||
self._console_type = console_type
|
||||
|
||||
@property
|
||||
def ports_mapping(self):
|
||||
@@ -184,6 +189,8 @@ class EthernetSwitch(Device):
|
||||
# self._telnet_server = (await asyncio.start_server(self._telnet.run, self._manager.port_manager.console_host, self.console))
|
||||
#except OSError as e:
|
||||
# self.project.emit("log.warning", {"message": "Could not start Telnet server on socket {}:{}: {}".format(self._manager.port_manager.console_host, self.console, e)})
|
||||
if self._console_type == "telnet":
|
||||
self.project.emit("log.warning", {"message": '"{name}": Telnet access for switches is not available in this version of GNS3'.format(name=self._name)})
|
||||
self._hypervisor.devices.append(self)
|
||||
|
||||
async def set_name(self, new_name):
|
||||
|
||||
@@ -342,7 +342,7 @@ class IOUVM(BaseNode):
|
||||
@iourc_content.setter
|
||||
def iourc_content(self, value):
|
||||
|
||||
if value is not None:
|
||||
if value:
|
||||
# If we don't save the value in the ~/ the licence is lost at project
|
||||
# reload
|
||||
path = os.path.join(os.path.expanduser("~/"), ".iourc")
|
||||
@@ -402,6 +402,7 @@ class IOUVM(BaseNode):
|
||||
raise IOUError("Invalid licence check setting")
|
||||
|
||||
if server_wide_license_check is False:
|
||||
log.warning("License check is explicitly disabled on this server")
|
||||
return
|
||||
|
||||
config = configparser.ConfigParser()
|
||||
@@ -508,7 +509,7 @@ class IOUVM(BaseNode):
|
||||
|
||||
iourc_path = self.iourc_path
|
||||
if not iourc_path:
|
||||
raise IOUError("Could not find an iourc file (IOU license)")
|
||||
raise IOUError("Could not find an iourc file (IOU license), please configure an IOU license")
|
||||
if not os.path.isfile(iourc_path):
|
||||
raise IOUError("The iourc path '{}' is not a regular file".format(iourc_path))
|
||||
|
||||
@@ -528,8 +529,7 @@ class IOUVM(BaseNode):
|
||||
|
||||
# created a environment variable pointing to the iourc file.
|
||||
env = os.environ.copy()
|
||||
|
||||
if "IOURC" not in os.environ:
|
||||
if "IOURC" not in os.environ and iourc_path:
|
||||
env["IOURC"] = iourc_path
|
||||
|
||||
# create a symbolic link to the image to avoid IOU error "failed code signing checks"
|
||||
|
||||
@@ -30,6 +30,7 @@ from ...utils.asyncio import subprocess_check_output
|
||||
from ..base_manager import BaseManager
|
||||
from .qemu_error import QemuError
|
||||
from .qemu_vm import QemuVM
|
||||
from .utils.guest_cid import get_next_guest_cid
|
||||
|
||||
import logging
|
||||
log = logging.getLogger(__name__)
|
||||
@@ -40,6 +41,33 @@ class Qemu(BaseManager):
|
||||
_NODE_CLASS = QemuVM
|
||||
_NODE_TYPE = "qemu"
|
||||
|
||||
def __init__(self):
|
||||
|
||||
super().__init__()
|
||||
self._guest_cid_lock = asyncio.Lock()
|
||||
|
||||
async def create_node(self, *args, **kwargs):
|
||||
"""
|
||||
Creates a new Qemu VM.
|
||||
|
||||
:returns: QemuVM instance
|
||||
"""
|
||||
|
||||
node = await super().create_node(*args, **kwargs)
|
||||
|
||||
# allocate a guest console ID (CID)
|
||||
if node.console_type != "none" and node.console:
|
||||
# by default, the guest CID is equal to the console port
|
||||
node.guest_cid = node.console
|
||||
else:
|
||||
# otherwise pick a guest CID if no console port is configured
|
||||
async with self._guest_cid_lock:
|
||||
# wait for a node to be completely created before adding a new one
|
||||
# this is important otherwise we allocate the same guest ID
|
||||
# when creating multiple Qemu VMs at the same time
|
||||
node.guest_cid = get_next_guest_cid(self.nodes)
|
||||
return node
|
||||
|
||||
@staticmethod
|
||||
async def get_kvm_archs():
|
||||
"""
|
||||
|
||||
@@ -36,6 +36,7 @@ import json
|
||||
from gns3server.utils import parse_version
|
||||
from gns3server.utils.asyncio import subprocess_check_output, cancellable_wait_run_in_executor
|
||||
from .qemu_error import QemuError
|
||||
from .utils.qcow2 import Qcow2, Qcow2Error
|
||||
from ..adapters.ethernet_adapter import EthernetAdapter
|
||||
from ..nios.nio_udp import NIOUDP
|
||||
from ..nios.nio_tap import NIOTAP
|
||||
@@ -43,7 +44,6 @@ from ..base_node import BaseNode
|
||||
from ...schemas.qemu import QEMU_OBJECT_SCHEMA, QEMU_PLATFORMS
|
||||
from ...utils.asyncio import monitor_process
|
||||
from ...utils.images import md5sum
|
||||
from .qcow2 import Qcow2, Qcow2Error
|
||||
from ...utils import macaddress_to_int, int_to_macaddress
|
||||
|
||||
|
||||
@@ -80,6 +80,7 @@ class QemuVM(BaseNode):
|
||||
self._qemu_img_stdout_file = ""
|
||||
self._execute_lock = asyncio.Lock()
|
||||
self._local_udp_tunnels = {}
|
||||
self._guest_cid = None
|
||||
|
||||
# QEMU VM settings
|
||||
if qemu_path:
|
||||
@@ -124,6 +125,26 @@ class QemuVM(BaseNode):
|
||||
self.adapters = 1 # creates 1 adapter by default
|
||||
log.info('QEMU VM "{name}" [{id}] has been created'.format(name=self._name, id=self._id))
|
||||
|
||||
@property
|
||||
def guest_cid(self):
|
||||
"""
|
||||
Returns the CID (console ID) which is an unique identifier between 3 and 65535
|
||||
|
||||
:returns: integer between 3 and 65535
|
||||
"""
|
||||
|
||||
return self._guest_cid
|
||||
|
||||
@guest_cid.setter
|
||||
def guest_cid(self, guest_cid):
|
||||
"""
|
||||
Set the CID (console ID) which is an unique identifier between 3 and 65535
|
||||
|
||||
:returns: integer between 3 and 65535
|
||||
"""
|
||||
|
||||
self._guest_cid = guest_cid
|
||||
|
||||
@property
|
||||
def monitor(self):
|
||||
"""
|
||||
@@ -413,10 +434,31 @@ class QemuVM(BaseNode):
|
||||
:param cdrom_image: QEMU cdrom image path
|
||||
"""
|
||||
|
||||
self._cdrom_image = self.manager.get_abs_image_path(cdrom_image, self.project.path)
|
||||
log.info('QEMU VM "{name}" [{id}] has set the QEMU cdrom image path to {cdrom_image}'.format(name=self._name,
|
||||
id=self._id,
|
||||
cdrom_image=self._cdrom_image))
|
||||
if cdrom_image:
|
||||
self._cdrom_image = self.manager.get_abs_image_path(cdrom_image, self.project.path)
|
||||
|
||||
log.info('QEMU VM "{name}" [{id}] has set the QEMU cdrom image path to {cdrom_image}'.format(name=self._name,
|
||||
id=self._id,
|
||||
cdrom_image=self._cdrom_image))
|
||||
else:
|
||||
self._cdrom_image = ""
|
||||
|
||||
async def update_cdrom_image(self):
|
||||
"""
|
||||
Update the cdrom image path for the Qemu guest OS
|
||||
"""
|
||||
|
||||
if self.is_running():
|
||||
if self._cdrom_image:
|
||||
self._cdrom_option() # this will check the cdrom image is accessible
|
||||
await self._control_vm("eject -f ide1-cd0")
|
||||
await self._control_vm("change ide1-cd0 {}".format(self._cdrom_image))
|
||||
log.info('QEMU VM "{name}" [{id}] has changed the cdrom image path to {cdrom_image}'.format(name=self._name,
|
||||
id=self._id,
|
||||
cdrom_image=self._cdrom_image))
|
||||
else:
|
||||
await self._control_vm("eject -f ide1-cd0")
|
||||
log.info('QEMU VM "{name}" [{id}] has ejected the cdrom image'.format(name=self._name, id=self._id))
|
||||
|
||||
@property
|
||||
def bios_image(self):
|
||||
@@ -966,10 +1008,14 @@ class QemuVM(BaseNode):
|
||||
set_link_commands.append("set_link gns3-{} off".format(adapter_number))
|
||||
else:
|
||||
set_link_commands.append("set_link gns3-{} off".format(adapter_number))
|
||||
await self._control_vm_commands(set_link_commands)
|
||||
|
||||
if "-loadvm" not in command_string:
|
||||
# only set the link statuses if not restoring a previous VM state
|
||||
await self._control_vm_commands(set_link_commands)
|
||||
|
||||
try:
|
||||
await self.start_wrap_console()
|
||||
if self.is_running():
|
||||
await self.start_wrap_console()
|
||||
except OSError as e:
|
||||
raise QemuError("Could not start Telnet QEMU console {}\n".format(e))
|
||||
|
||||
@@ -1081,7 +1127,15 @@ class QemuVM(BaseNode):
|
||||
return result
|
||||
|
||||
try:
|
||||
writer.write(command.encode('ascii') + b"\n")
|
||||
cmd_byte = command.encode('ascii')
|
||||
writer.write(cmd_byte + b"\n")
|
||||
if not expected:
|
||||
while True:
|
||||
line = await asyncio.wait_for(reader.readline(), timeout=3) # echo of the command
|
||||
if not line or cmd_byte in line:
|
||||
break
|
||||
except asyncio.TimeoutError:
|
||||
log.warning("Missing echo of command '{}'".format(command))
|
||||
except OSError as e:
|
||||
log.warning("Could not write to QEMU monitor: {}".format(e))
|
||||
writer.close()
|
||||
@@ -1089,13 +1143,15 @@ class QemuVM(BaseNode):
|
||||
if expected:
|
||||
try:
|
||||
while result is None:
|
||||
line = await reader.readline()
|
||||
line = await asyncio.wait_for(reader.readline(), timeout=3)
|
||||
if not line:
|
||||
break
|
||||
for expect in expected:
|
||||
if expect in line:
|
||||
result = line.decode("utf-8").strip()
|
||||
break
|
||||
except asyncio.TimeoutError:
|
||||
log.warning("Timeout while waiting for result of command '{}'".format(command))
|
||||
except (ConnectionError, EOFError) as e:
|
||||
log.warning("Could not read from QEMU monitor: {}".format(e))
|
||||
writer.close()
|
||||
@@ -1118,6 +1174,9 @@ class QemuVM(BaseNode):
|
||||
log.info("Execute QEMU monitor command: {}".format(command))
|
||||
try:
|
||||
writer.write(command.encode('ascii') + b"\n")
|
||||
await asyncio.wait_for(reader.readline(), timeout=3) # echo of the command
|
||||
except asyncio.TimeoutError:
|
||||
log.warning("Missing echo of command '{}'".format(command))
|
||||
except OSError as e:
|
||||
log.warning("Could not write to QEMU monitor: {}".format(e))
|
||||
writer.close()
|
||||
@@ -1130,7 +1189,9 @@ class QemuVM(BaseNode):
|
||||
if not (await super().close()):
|
||||
return False
|
||||
|
||||
self.on_close = "power_off"
|
||||
#FIXME: Don't wait for ACPI shutdown when closing the project, should we?
|
||||
if self.on_close == "shutdown_signal":
|
||||
self.on_close = "power_off"
|
||||
await self.stop()
|
||||
|
||||
for adapter in self._ethernet_adapters:
|
||||
@@ -1835,18 +1896,22 @@ class QemuVM(BaseNode):
|
||||
if not os.path.exists(disk):
|
||||
continue
|
||||
output = await subprocess_check_output(qemu_img_path, "info", "--output=json", disk)
|
||||
json_data = json.loads(output)
|
||||
if "snapshots" in json_data:
|
||||
for snapshot in json_data["snapshots"]:
|
||||
if snapshot["name"] == snapshot_name:
|
||||
# delete the snapshot
|
||||
command = [qemu_img_path, "snapshot", "-d", snapshot_name, disk]
|
||||
retcode = await self._qemu_img_exec(command)
|
||||
if retcode:
|
||||
stdout = self.read_qemu_img_stdout()
|
||||
log.warning("Could not delete saved VM state from disk {}: {}".format(disk, stdout))
|
||||
else:
|
||||
log.info("Deleted saved VM state from disk {}".format(disk))
|
||||
if output:
|
||||
try:
|
||||
json_data = json.loads(output)
|
||||
except ValueError as e:
|
||||
raise QemuError("Invalid JSON data returned by qemu-img while looking for the Qemu VM saved state snapshot: {}".format(e))
|
||||
if "snapshots" in json_data:
|
||||
for snapshot in json_data["snapshots"]:
|
||||
if snapshot["name"] == snapshot_name:
|
||||
# delete the snapshot
|
||||
command = [qemu_img_path, "snapshot", "-d", snapshot_name, disk]
|
||||
retcode = await self._qemu_img_exec(command)
|
||||
if retcode:
|
||||
stdout = self.read_qemu_img_stdout()
|
||||
log.warning("Could not delete saved VM state from disk {}: {}".format(disk, stdout))
|
||||
else:
|
||||
log.info("Deleted saved VM state from disk {}".format(disk))
|
||||
except subprocess.SubprocessError as e:
|
||||
raise QemuError("Error while looking for the Qemu VM saved state snapshot: {}".format(e))
|
||||
|
||||
@@ -1866,14 +1931,19 @@ class QemuVM(BaseNode):
|
||||
if not os.path.exists(disk):
|
||||
continue
|
||||
output = await subprocess_check_output(qemu_img_path, "info", "--output=json", disk)
|
||||
json_data = json.loads(output)
|
||||
if "snapshots" in json_data:
|
||||
for snapshot in json_data["snapshots"]:
|
||||
if snapshot["name"] == snapshot_name:
|
||||
log.info('QEMU VM "{name}" [{id}] VM saved state detected (snapshot name: {snapshot})'.format(name=self._name,
|
||||
id=self.id,
|
||||
snapshot=snapshot_name))
|
||||
return ["-loadvm", snapshot_name]
|
||||
if output:
|
||||
try:
|
||||
json_data = json.loads(output)
|
||||
except ValueError as e:
|
||||
raise QemuError("Invalid JSON data returned by qemu-img while looking for the Qemu VM saved state snapshot: {}".format(e))
|
||||
if "snapshots" in json_data:
|
||||
for snapshot in json_data["snapshots"]:
|
||||
if snapshot["name"] == snapshot_name:
|
||||
log.info('QEMU VM "{name}" [{id}] VM saved state detected (snapshot name: {snapshot})'.format(name=self._name,
|
||||
id=self.id,
|
||||
snapshot=snapshot_name))
|
||||
return ["-loadvm", snapshot_name]
|
||||
|
||||
except subprocess.SubprocessError as e:
|
||||
raise QemuError("Error while looking for the Qemu VM saved state snapshot: {}".format(e))
|
||||
return []
|
||||
@@ -1889,6 +1959,9 @@ class QemuVM(BaseNode):
|
||||
additional_options = additional_options.replace("%vm-id%", self._id)
|
||||
additional_options = additional_options.replace("%project-id%", self.project.id)
|
||||
additional_options = additional_options.replace("%project-path%", '"' + self.project.path.replace('"', '\\"') + '"')
|
||||
additional_options = additional_options.replace("%guest-cid%", str(self._guest_cid))
|
||||
if self._console_type != "none" and self._console:
|
||||
additional_options = additional_options.replace("%console-port%", str(self._console))
|
||||
command = [self.qemu_path]
|
||||
command.extend(["-name", self._name])
|
||||
command.extend(["-m", "{}M".format(self._ram)])
|
||||
|
||||
Whitespace-only changes.
@@ -0,0 +1,38 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Copyright (C) 2017 GNS3 Technologies Inc.
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from ..qemu_error import QemuError
|
||||
|
||||
import logging
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def get_next_guest_cid(nodes):
|
||||
"""
|
||||
Calculates free guest_id from given nodes
|
||||
|
||||
:param nodes:
|
||||
:raises QemuError when exceeds number
|
||||
:return: integer first free cid
|
||||
"""
|
||||
|
||||
used = set([n.guest_cid for n in nodes])
|
||||
pool = set(range(3, 65535))
|
||||
try:
|
||||
return (pool - used).pop()
|
||||
except KeyError:
|
||||
raise QemuError("Cannot create a new Qemu VM (limit of 65535 guest ID on one host reached)")
|
||||
File renamed without changes.
@@ -125,7 +125,7 @@ class Config:
|
||||
|
||||
if self._main_config_file is None:
|
||||
|
||||
# TODO: migrate versioned config file from a previous version of GNS3 (for instance 2.2.0 -> 2.2.1)
|
||||
# TODO: migrate versioned config file from a previous version of GNS3 (for instance 2.2 -> 2.3) + support profiles
|
||||
# migrate post version 2.2.0 config files if they exist
|
||||
os.makedirs(versioned_user_dir, exist_ok=True)
|
||||
try:
|
||||
|
||||
@@ -175,7 +175,6 @@ class Controller:
|
||||
|
||||
try:
|
||||
if not os.path.exists(self._config_file):
|
||||
await self._import_gns3_gui_conf()
|
||||
self._config_loaded = True
|
||||
self.save()
|
||||
with open(self._config_file) as f:
|
||||
@@ -254,118 +253,6 @@ class Controller:
|
||||
os.makedirs(images_path, exist_ok=True)
|
||||
return images_path
|
||||
|
||||
async def _import_gns3_gui_conf(self):
|
||||
"""
|
||||
Import old config from GNS3 GUI
|
||||
"""
|
||||
|
||||
config_file = os.path.join(os.path.dirname(self._config_file), "gns3_gui.conf")
|
||||
if os.path.exists(config_file):
|
||||
with open(config_file) as f:
|
||||
settings = json.load(f)
|
||||
server_settings = settings.get("Servers", {})
|
||||
for remote in server_settings.get("remote_servers", []):
|
||||
try:
|
||||
await self.add_compute(host=remote.get("host", "localhost"),
|
||||
port=remote.get("port", 3080),
|
||||
protocol=remote.get("protocol", "http"),
|
||||
name=remote.get("url"),
|
||||
user=remote.get("user"),
|
||||
password=remote.get("password"))
|
||||
except aiohttp.web.HTTPConflict:
|
||||
pass # if the server is broken we skip it
|
||||
if "vm" in server_settings:
|
||||
vmname = None
|
||||
vm_settings = server_settings["vm"]
|
||||
if vm_settings["virtualization"] == "VMware":
|
||||
engine = "vmware"
|
||||
vmname = vm_settings.get("vmname", "")
|
||||
elif vm_settings["virtualization"] == "VirtualBox":
|
||||
engine = "virtualbox"
|
||||
vmname = vm_settings.get("vmname", "")
|
||||
else:
|
||||
engine = "remote"
|
||||
# In case of remote server we match the compute with url parameter
|
||||
for compute in self._computes.values():
|
||||
if compute.host == vm_settings.get("remote_vm_host") and compute.port == vm_settings.get("remote_vm_port"):
|
||||
vmname = compute.name
|
||||
|
||||
if vm_settings.get("auto_stop", True):
|
||||
when_exit = "stop"
|
||||
else:
|
||||
when_exit = "keep"
|
||||
|
||||
self.gns3vm.settings = {
|
||||
"engine": engine,
|
||||
"enable": vm_settings.get("auto_start", False),
|
||||
"when_exit": when_exit,
|
||||
"headless": vm_settings.get("headless", False),
|
||||
"vmname": vmname
|
||||
}
|
||||
|
||||
vms = []
|
||||
for vm in settings.get("Qemu", {}).get("vms", []):
|
||||
vm["template_type"] = "qemu"
|
||||
vms.append(vm)
|
||||
for vm in settings.get("IOU", {}).get("devices", []):
|
||||
vm["template_type"] = "iou"
|
||||
vms.append(vm)
|
||||
for vm in settings.get("Docker", {}).get("containers", []):
|
||||
vm["template_type"] = "docker"
|
||||
vms.append(vm)
|
||||
for vm in settings.get("Builtin", {}).get("cloud_nodes", []):
|
||||
vm["template_type"] = "cloud"
|
||||
vms.append(vm)
|
||||
for vm in settings.get("Builtin", {}).get("ethernet_switches", []):
|
||||
vm["template_type"] = "ethernet_switch"
|
||||
vms.append(vm)
|
||||
for vm in settings.get("Builtin", {}).get("ethernet_hubs", []):
|
||||
vm["template_type"] = "ethernet_hub"
|
||||
vms.append(vm)
|
||||
for vm in settings.get("Dynamips", {}).get("routers", []):
|
||||
vm["template_type"] = "dynamips"
|
||||
vms.append(vm)
|
||||
for vm in settings.get("VMware", {}).get("vms", []):
|
||||
vm["template_type"] = "vmware"
|
||||
vms.append(vm)
|
||||
for vm in settings.get("VirtualBox", {}).get("vms", []):
|
||||
vm["template_type"] = "virtualbox"
|
||||
vms.append(vm)
|
||||
for vm in settings.get("VPCS", {}).get("nodes", []):
|
||||
vm["template_type"] = "vpcs"
|
||||
vms.append(vm)
|
||||
for vm in settings.get("TraceNG", {}).get("nodes", []):
|
||||
vm["template_type"] = "traceng"
|
||||
vms.append(vm)
|
||||
|
||||
for vm in vms:
|
||||
# remove deprecated properties
|
||||
for prop in vm.copy():
|
||||
if prop in ["enable_remote_console", "use_ubridge", "acpi_shutdown"]:
|
||||
del vm[prop]
|
||||
|
||||
# remove deprecated default_symbol and hover_symbol
|
||||
# and set symbol if not present
|
||||
deprecated = ["default_symbol", "hover_symbol"]
|
||||
if len([prop for prop in vm.keys() if prop in deprecated]) > 0:
|
||||
if "default_symbol" in vm.keys():
|
||||
del vm["default_symbol"]
|
||||
if "hover_symbol" in vm.keys():
|
||||
del vm["hover_symbol"]
|
||||
|
||||
if "symbol" not in vm.keys():
|
||||
vm["symbol"] = ":/symbols/computer.svg"
|
||||
|
||||
vm.setdefault("template_id", str(uuid.uuid4()))
|
||||
try:
|
||||
template = Template(vm["template_id"], vm)
|
||||
template.__json__() # Check if loaded without error
|
||||
self.template_manager.templates[template.id] = template
|
||||
except KeyError as e:
|
||||
# template data is not complete (missing name or type)
|
||||
log.warning("Cannot load template {} ('{}'): missing key {}".format(vm["template_id"], vm.get("name", "unknown"), e))
|
||||
continue
|
||||
|
||||
async def add_compute(self, compute_id=None, name=None, force=False, connect=True, **kwargs):
|
||||
"""
|
||||
Add a server to the dictionary of computes controlled by this controller
|
||||
|
||||
@@ -22,10 +22,16 @@ import uuid
|
||||
import shutil
|
||||
import zipfile
|
||||
import aiohttp
|
||||
import aiofiles
|
||||
import itertools
|
||||
import tempfile
|
||||
|
||||
from .topology import load_topology
|
||||
from ..utils.asyncio import wait_run_in_executor
|
||||
from ..utils.asyncio import aiozipstream
|
||||
|
||||
import logging
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
"""
|
||||
Handle the import of project from a .gns3project
|
||||
@@ -126,6 +132,14 @@ async def import_project(controller, project_id, stream, location=None, name=Non
|
||||
node["compute_id"] = "vm"
|
||||
else:
|
||||
# Round-robin through available compute resources.
|
||||
# computes = []
|
||||
# for compute_id in controller.computes:
|
||||
# compute = controller.get_compute(compute_id)
|
||||
# # only use the local compute or any connected compute
|
||||
# if compute_id == "local" or compute.connected:
|
||||
# computes.append(compute_id)
|
||||
# else:
|
||||
# log.warning(compute.name, "is not connected!")
|
||||
compute_nodes = itertools.cycle(controller.computes)
|
||||
for node in topology["topology"]["nodes"]:
|
||||
node["compute_id"] = next(compute_nodes)
|
||||
@@ -148,8 +162,13 @@ async def import_project(controller, project_id, stream, location=None, name=Non
|
||||
json.dump(topology, f, indent=4)
|
||||
os.remove(os.path.join(path, "project.gns3"))
|
||||
|
||||
if os.path.exists(os.path.join(path, "images")):
|
||||
_import_images(controller, path)
|
||||
images_path = os.path.join(path, "images")
|
||||
if os.path.exists(images_path):
|
||||
await _import_images(controller, images_path)
|
||||
|
||||
snapshots_path = os.path.join(path, "snapshots")
|
||||
if os.path.exists(snapshots_path):
|
||||
await _import_snapshots(snapshots_path, project_name, project_id)
|
||||
|
||||
project = await controller.load_project(dot_gns3_path, load=False)
|
||||
return project
|
||||
@@ -204,13 +223,13 @@ async def _upload_file(compute, project_id, file_path, path):
|
||||
await compute.http_query("POST", path, f, timeout=None)
|
||||
|
||||
|
||||
def _import_images(controller, path):
|
||||
async def _import_images(controller, images_path):
|
||||
"""
|
||||
Copy images to the images directory or delete them if they already exists.
|
||||
"""
|
||||
|
||||
image_dir = controller.images_path()
|
||||
root = os.path.join(path, "images")
|
||||
root = images_path
|
||||
for (dirpath, dirnames, filenames) in os.walk(root, followlinks=False):
|
||||
for filename in filenames:
|
||||
path = os.path.join(dirpath, filename)
|
||||
@@ -218,4 +237,54 @@ def _import_images(controller, 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)
|
||||
await wait_run_in_executor(shutil.move, path, dst)
|
||||
|
||||
|
||||
async def _import_snapshots(snapshots_path, project_name, project_id):
|
||||
"""
|
||||
Import the snapshots and update their project name and ID to be the same as the main project.
|
||||
"""
|
||||
|
||||
for snapshot in os.listdir(snapshots_path):
|
||||
if not snapshot.endswith(".gns3project"):
|
||||
continue
|
||||
snapshot_path = os.path.join(snapshots_path, snapshot)
|
||||
with tempfile.TemporaryDirectory(dir=snapshots_path) as tmpdir:
|
||||
|
||||
# extract everything to a temporary directory
|
||||
try:
|
||||
with open(snapshot_path, "rb") as f:
|
||||
with zipfile.ZipFile(f) as zip_file:
|
||||
await wait_run_in_executor(zip_file.extractall, tmpdir)
|
||||
except OSError as e:
|
||||
raise aiohttp.web.HTTPConflict(text="Cannot open snapshot '{}': {}".format(os.path.basename(snapshot), e))
|
||||
except zipfile.BadZipFile:
|
||||
raise aiohttp.web.HTTPConflict(text="Cannot extract files from snapshot '{}': not a GNS3 project (invalid zip)".format(os.path.basename(snapshot)))
|
||||
|
||||
# patch the topology with the correct project name and ID
|
||||
try:
|
||||
topology_file_path = os.path.join(tmpdir, "project.gns3")
|
||||
with open(topology_file_path, encoding="utf-8") as f:
|
||||
topology = json.load(f)
|
||||
|
||||
topology["name"] = project_name
|
||||
topology["project_id"] = project_id
|
||||
with open(topology_file_path, "w+", encoding="utf-8") as f:
|
||||
json.dump(topology, f, indent=4, sort_keys=True)
|
||||
except OSError as e:
|
||||
raise aiohttp.web.HTTPConflict(text="Cannot update snapshot '{}': the project.gns3 file cannot be modified: {}".format(os.path.basename(snapshot), e))
|
||||
except (ValueError, KeyError):
|
||||
raise aiohttp.web.HTTPConflict(text="Cannot update snapshot '{}': the project.gns3 file is corrupted".format(os.path.basename(snapshot)))
|
||||
|
||||
# write everything back to the original snapshot file
|
||||
try:
|
||||
with aiozipstream.ZipFile(compression=zipfile.ZIP_STORED) as zstream:
|
||||
for root, dirs, files in os.walk(tmpdir, topdown=True, followlinks=False):
|
||||
for file in files:
|
||||
path = os.path.join(root, file)
|
||||
zstream.write(path, os.path.relpath(path, tmpdir))
|
||||
async with aiofiles.open(snapshot_path, 'wb+') as f:
|
||||
async for chunk in zstream:
|
||||
await f.write(chunk)
|
||||
except OSError as e:
|
||||
raise aiohttp.web.HTTPConflict(text="Cannot update snapshot '{}': the snapshot cannot be recreated: {}".format(os.path.basename(snapshot), e))
|
||||
@@ -187,7 +187,7 @@ class Node:
|
||||
if not os.path.isabs(path):
|
||||
path = os.path.join(self.project.controller.configs_path(), path)
|
||||
try:
|
||||
with open(path, encoding="utf-8") as f:
|
||||
with open(path, encoding="utf-8", errors="ignore") as f:
|
||||
return f.read()
|
||||
except OSError:
|
||||
return None
|
||||
@@ -495,8 +495,8 @@ class Node:
|
||||
if self.node_type == "iou":
|
||||
license_check = self._project.controller.iou_license.get("license_check", True)
|
||||
iourc_content = self._project.controller.iou_license.get("iourc_content", None)
|
||||
if license_check and not iourc_content:
|
||||
raise aiohttp.web.HTTPConflict(text="IOU licence is not configured")
|
||||
#if license_check and not iourc_content:
|
||||
# raise aiohttp.web.HTTPConflict(text="IOU licence is not configured")
|
||||
await self.post("/start", timeout=240, data={"license_check": license_check, "iourc_content": iourc_content})
|
||||
else:
|
||||
await self.post("/start", data=data, timeout=240)
|
||||
|
||||
@@ -63,7 +63,7 @@ class TemplateManager:
|
||||
builtins.append(Template(uuid.uuid3(uuid.NAMESPACE_DNS, "cloud"), {"template_type": "cloud", "name": "Cloud", "category": 2, "symbol": ":/symbols/cloud.svg"}, builtin=True))
|
||||
builtins.append(Template(uuid.uuid3(uuid.NAMESPACE_DNS, "nat"), {"template_type": "nat", "name": "NAT", "category": 2, "symbol": ":/symbols/cloud.svg"}, builtin=True))
|
||||
builtins.append(Template(uuid.uuid3(uuid.NAMESPACE_DNS, "vpcs"), {"template_type": "vpcs", "name": "VPCS", "default_name_format": "PC-{0}", "category": 2, "symbol": ":/symbols/vpcs_guest.svg", "properties": {"base_script_file": "vpcs_base_config.txt"}}, builtin=True))
|
||||
builtins.append(Template(uuid.uuid3(uuid.NAMESPACE_DNS, "ethernet_switch"), {"template_type": "ethernet_switch", "console_type": "telnet", "name": "Ethernet switch", "category": 1, "symbol": ":/symbols/ethernet_switch.svg"}, builtin=True))
|
||||
builtins.append(Template(uuid.uuid3(uuid.NAMESPACE_DNS, "ethernet_switch"), {"template_type": "ethernet_switch", "console_type": "none", "name": "Ethernet switch", "category": 1, "symbol": ":/symbols/ethernet_switch.svg"}, builtin=True))
|
||||
builtins.append(Template(uuid.uuid3(uuid.NAMESPACE_DNS, "ethernet_hub"), {"template_type": "ethernet_hub", "name": "Ethernet hub", "category": 1, "symbol": ":/symbols/hub.svg"}, builtin=True))
|
||||
builtins.append(Template(uuid.uuid3(uuid.NAMESPACE_DNS, "frame_relay_switch"), {"template_type": "frame_relay_switch", "name": "Frame Relay switch", "category": 1, "symbol": ":/symbols/frame_relay_switch.svg"}, builtin=True))
|
||||
builtins.append(Template(uuid.uuid3(uuid.NAMESPACE_DNS, "atm_switch"), {"template_type": "atm_switch", "name": "ATM switch", "category": 1, "symbol": ":/symbols/atm_switch.svg"}, builtin=True))
|
||||
|
||||
@@ -128,17 +128,18 @@ def load_topology(path):
|
||||
raise aiohttp.web.HTTPConflict(text="Could not load topology {}: {}".format(path, str(e)))
|
||||
|
||||
if topo.get("revision", 0) > GNS3_FILE_FORMAT_REVISION:
|
||||
raise aiohttp.web.HTTPConflict(text="This project is designed for a more recent version of GNS3 please update GNS3 to version {} or later".format(topo["version"]))
|
||||
raise aiohttp.web.HTTPConflict(text="This project was created with more recent version of GNS3 (file revision: {}). Please upgrade GNS3 to version {} or later".format(topo["revision"], topo["version"]))
|
||||
|
||||
changed = False
|
||||
if "revision" not in topo or topo["revision"] < GNS3_FILE_FORMAT_REVISION:
|
||||
# If it's an old GNS3 file we need to convert it
|
||||
# first we backup the file
|
||||
# Convert the topology if this is an old one but backup the file first
|
||||
try:
|
||||
shutil.copy(path, path + ".backup{}".format(topo.get("revision", 0)))
|
||||
except (OSError) as e:
|
||||
except OSError as e:
|
||||
raise aiohttp.web.HTTPConflict(text="Can't write backup of the topology {}: {}".format(path, str(e)))
|
||||
changed = True
|
||||
# update the version because we converted the topology
|
||||
topo["version"] = __version__
|
||||
|
||||
if "revision" not in topo or topo["revision"] < 5:
|
||||
topo = _convert_1_3_later(topo, path)
|
||||
|
||||
@@ -58,7 +58,7 @@ class CrashReport:
|
||||
Report crash to a third party service
|
||||
"""
|
||||
|
||||
DSN = "https://7beef06951ab456bb9e17c0ffad7f494:2277ec5146db4649abde8c25c233e8b3@sentry.io/38482"
|
||||
DSN = "https://52dee6fc5b2a4a61880328386919e2f4:c84e7bbd39ce43b7aec27349e49fedf0@sentry.io/38482"
|
||||
if hasattr(sys, "frozen"):
|
||||
cacert = get_resource("cacert.pem")
|
||||
if cacert is not None and os.path.isfile(cacert):
|
||||
|
||||
@@ -61,7 +61,8 @@ class DockerHandler:
|
||||
console_http_port=request.json.get("console_http_port", 80),
|
||||
console_http_path=request.json.get("console_http_path", "/"),
|
||||
aux=request.json.get("aux"),
|
||||
extra_hosts=request.json.get("extra_hosts"))
|
||||
extra_hosts=request.json.get("extra_hosts"),
|
||||
extra_volumes=request.json.get("extra_volumes"))
|
||||
for name, value in request.json.items():
|
||||
if name != "node_id":
|
||||
if hasattr(container, name) and getattr(container, name) != value:
|
||||
@@ -316,7 +317,7 @@ class DockerHandler:
|
||||
props = [
|
||||
"name", "console", "aux", "console_type", "console_resolution",
|
||||
"console_http_port", "console_http_path", "start_command",
|
||||
"environment", "adapters", "extra_hosts"
|
||||
"environment", "adapters", "extra_hosts", "extra_volumes"
|
||||
]
|
||||
|
||||
changed = False
|
||||
|
||||
@@ -116,7 +116,7 @@ class QEMUHandler:
|
||||
description="Update a Qemu VM instance",
|
||||
input=QEMU_UPDATE_SCHEMA,
|
||||
output=QEMU_OBJECT_SCHEMA)
|
||||
def update(request, response):
|
||||
async def update(request, response):
|
||||
|
||||
qemu_manager = Qemu.instance()
|
||||
vm = qemu_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
|
||||
@@ -125,6 +125,9 @@ class QEMUHandler:
|
||||
for name, value in request.json.items():
|
||||
if hasattr(vm, name) and getattr(vm, name) != value:
|
||||
setattr(vm, name, value)
|
||||
if name == "cdrom_image":
|
||||
# let the guest know about the new cdrom image
|
||||
await vm.update_cdrom_image()
|
||||
|
||||
vm.updated()
|
||||
response.json(vm)
|
||||
|
||||
@@ -305,6 +305,10 @@ class ProjectHandler:
|
||||
|
||||
controller = Controller.instance()
|
||||
project = await controller.get_loaded_project(request.match_info["project_id"])
|
||||
if request.query.get("include_snapshots", "no").lower() == "yes":
|
||||
include_snapshots = True
|
||||
else:
|
||||
include_snapshots = False
|
||||
if request.query.get("include_images", "no").lower() == "yes":
|
||||
include_images = True
|
||||
else:
|
||||
@@ -323,7 +327,7 @@ class ProjectHandler:
|
||||
begin = time.time()
|
||||
with tempfile.TemporaryDirectory() as tmp_dir:
|
||||
with aiozipstream.ZipFile(compression=compression) as zstream:
|
||||
await export_project(zstream, project, tmp_dir, include_images=include_images)
|
||||
await export_project(zstream, project, tmp_dir, include_snapshots=include_snapshots, include_images=include_images)
|
||||
|
||||
# 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
|
||||
|
||||
+9
-2
@@ -101,6 +101,9 @@ def parse_arguments(argv):
|
||||
parser.add_argument("-d", "--debug", action="store_true", help="show debug logs")
|
||||
parser.add_argument("--shell", action="store_true", help="start a shell inside the server (debugging purpose only you need to install ptpython before)")
|
||||
parser.add_argument("--log", help="send output to logfile instead of console")
|
||||
parser.add_argument("--logmaxsize", help="maximum logfile size in bytes (default is 10MB)")
|
||||
parser.add_argument("--logbackupcount", help="number of historical log files to keep (default is 10)")
|
||||
parser.add_argument("--logcompression", action="store_true", help="compress inactive (historical) logs")
|
||||
parser.add_argument("--daemon", action="store_true", help="start as a daemon")
|
||||
parser.add_argument("--pid", help="store process pid")
|
||||
parser.add_argument("--profile", help="Settings profile (blank will use default settings files)")
|
||||
@@ -123,7 +126,10 @@ def parse_arguments(argv):
|
||||
"allow": config.getboolean("allow_remote_console", False),
|
||||
"quiet": config.getboolean("quiet", False),
|
||||
"debug": config.getboolean("debug", False),
|
||||
"logfile": config.getboolean("logfile", "")
|
||||
"logfile": config.getboolean("logfile", ""),
|
||||
"logmaxsize": config.get("logmaxsize", 10000000), # default is 10MB
|
||||
"logbackupcount": config.get("logbackupcount", 10),
|
||||
"logcompression": config.getboolean("logcompression", False)
|
||||
}
|
||||
|
||||
parser.set_defaults(**defaults)
|
||||
@@ -208,7 +214,8 @@ def run():
|
||||
if args.debug:
|
||||
level = logging.DEBUG
|
||||
|
||||
user_log = init_logger(level, logfile=args.log, quiet=args.quiet)
|
||||
user_log = init_logger(level, logfile=args.log, max_bytes=int(args.logmaxsize), backup_count=int(args.logbackupcount),
|
||||
compression=args.logcompression, quiet=args.quiet)
|
||||
user_log.info("GNS3 server version {}".format(__version__))
|
||||
current_year = datetime.date.today().year
|
||||
user_log.info("Copyright (c) 2007-{} GNS3 Technologies Inc.".format(current_year))
|
||||
|
||||
@@ -95,6 +95,14 @@ DOCKER_CREATE_SCHEMA = {
|
||||
"type": ["string", "null"],
|
||||
"minLength": 0,
|
||||
},
|
||||
"extra_volumes": {
|
||||
"description": "Additional directories to make persistent",
|
||||
"type": "array",
|
||||
"minItems": 0,
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"container_id": {
|
||||
"description": "Docker container ID Read only",
|
||||
"type": "string",
|
||||
@@ -198,6 +206,14 @@ DOCKER_OBJECT_SCHEMA = {
|
||||
"type": ["string", "null"],
|
||||
"minLength": 0,
|
||||
},
|
||||
"extra_volumes": {
|
||||
"description": "Additional directories to make persistent",
|
||||
"type": "array",
|
||||
"minItems": 0,
|
||||
"items": {
|
||||
"type": "string",
|
||||
}
|
||||
},
|
||||
"node_directory": {
|
||||
"description": "Path to the node working directory Read only",
|
||||
"type": "string"
|
||||
|
||||
@@ -80,7 +80,12 @@ DOCKER_TEMPLATE_PROPERTIES = {
|
||||
"extra_hosts": {
|
||||
"description": "Docker extra hosts (added to /etc/hosts)",
|
||||
"type": "string",
|
||||
"default": "",
|
||||
"default": ""
|
||||
},
|
||||
"extra_volumes": {
|
||||
"description": "Additional directories to make persistent",
|
||||
"type": "array",
|
||||
"default": []
|
||||
},
|
||||
"custom_adapters": CUSTOM_ADAPTERS_ARRAY_SCHEMA
|
||||
}
|
||||
|
||||
@@ -109,7 +109,7 @@ ETHERNET_SWITCH_TEMPLATE_PROPERTIES = {
|
||||
"console_type": {
|
||||
"description": "Console type",
|
||||
"enum": ["telnet", "none"],
|
||||
"default": "telnet"
|
||||
"default": "none"
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@ IOU_TEMPLATE_PROPERTIES = {
|
||||
"usage": {
|
||||
"description": "How to use the IOU VM",
|
||||
"type": "string",
|
||||
"default": ""
|
||||
},
|
||||
"ethernet_adapters": {
|
||||
"description": "Number of ethernet adapters",
|
||||
|
||||
@@ -98,6 +98,8 @@ THE SOFTWARE.
|
||||
|
||||
@angular/material/table
|
||||
|
||||
@angular/material/tabs
|
||||
|
||||
@angular/material/toolbar
|
||||
|
||||
@angular/material/tooltip
|
||||
|
||||
@@ -0,0 +1,428 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="filter-capture.svg"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:version="0.32"
|
||||
id="svg11300"
|
||||
height="48px"
|
||||
width="48px"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||
version="1.1">
|
||||
<defs
|
||||
id="defs3">
|
||||
<linearGradient
|
||||
id="linearGradient2846">
|
||||
<stop
|
||||
id="stop2848"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#8a8a8a;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop2850"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#484848;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2366">
|
||||
<stop
|
||||
id="stop2368"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.21904762;"
|
||||
offset="0.50000000"
|
||||
id="stop2374" />
|
||||
<stop
|
||||
id="stop2370"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4487">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4489" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop4491" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4477">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4479" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop4481" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4467">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4469" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.24761905;"
|
||||
offset="1.0000000"
|
||||
id="stop4471" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4454">
|
||||
<stop
|
||||
style="stop-color:#729fcf;stop-opacity:0.20784314;"
|
||||
offset="0.0000000"
|
||||
id="stop4456" />
|
||||
<stop
|
||||
style="stop-color:#729fcf;stop-opacity:0.67619050;"
|
||||
offset="1.0000000"
|
||||
id="stop4458" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4440">
|
||||
<stop
|
||||
style="stop-color:#7d7d7d;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4442" />
|
||||
<stop
|
||||
id="stop4448"
|
||||
offset="0.50000000"
|
||||
style="stop-color:#b1b1b1;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
style="stop-color:#686868;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop4444" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4440"
|
||||
id="linearGradient4446"
|
||||
x1="30.656250"
|
||||
y1="34.000000"
|
||||
x2="33.218750"
|
||||
y2="31.062500"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.334593,0.000000,0.000000,1.291292,-6.973842,-7.460658)" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4454"
|
||||
id="radialGradient4460"
|
||||
cx="18.240929"
|
||||
cy="21.817987"
|
||||
fx="18.240929"
|
||||
fy="21.817987"
|
||||
r="8.3085051"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4467"
|
||||
id="radialGradient4473"
|
||||
cx="15.414371"
|
||||
cy="13.078408"
|
||||
fx="15.414371"
|
||||
fy="13.078408"
|
||||
r="6.6562500"
|
||||
gradientTransform="matrix(2.592963,-7.746900e-24,-5.714443e-24,2.252104,-25.05975,-18.94100)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4487"
|
||||
id="radialGradient4493"
|
||||
cx="24.130018"
|
||||
cy="37.967922"
|
||||
fx="24.130018"
|
||||
fy="37.967922"
|
||||
r="16.528622"
|
||||
gradientTransform="matrix(0.47747795,0,0,0.17126529,6.9831225,31.643536)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="25.743469"
|
||||
x2="17.500893"
|
||||
y1="13.602121"
|
||||
x1="18.292673"
|
||||
id="linearGradient2372"
|
||||
xlink:href="#linearGradient2366"
|
||||
inkscape:collect="always" />
|
||||
<radialGradient
|
||||
r="16.528622"
|
||||
fy="37.967922"
|
||||
fx="24.130018"
|
||||
cy="37.967922"
|
||||
cx="24.130018"
|
||||
gradientTransform="matrix(1.000000,0.000000,0.000000,0.237968,-2.471981e-16,28.93278)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient2842"
|
||||
xlink:href="#linearGradient4477"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="30.557772"
|
||||
x2="31.335964"
|
||||
y1="26.580296"
|
||||
x1="27.366341"
|
||||
id="linearGradient2852"
|
||||
xlink:href="#linearGradient2846"
|
||||
inkscape:collect="always" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
stroke="#3465a4"
|
||||
inkscape:window-y="48"
|
||||
inkscape:window-x="130"
|
||||
inkscape:window-height="1752"
|
||||
inkscape:window-width="3070"
|
||||
inkscape:showpageshadow="false"
|
||||
inkscape:document-units="px"
|
||||
inkscape:grid-bbox="true"
|
||||
showgrid="false"
|
||||
inkscape:current-layer="g1772"
|
||||
inkscape:cy="37.212656"
|
||||
inkscape:cx="23.821561"
|
||||
inkscape:zoom="11.313708"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="0.25490196"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
fill="#729fcf"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata4">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Jakub Steiner</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:source>http://jimmac.musichall.cz</dc:source>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1"
|
||||
id="layer1">
|
||||
<g
|
||||
id="g1772">
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="opacity:0.17112298;color:#000000;fill:url(#radialGradient2842);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;"
|
||||
id="path4475"
|
||||
sodipodi:cx="24.130018"
|
||||
sodipodi:cy="37.967922"
|
||||
sodipodi:rx="16.528622"
|
||||
sodipodi:ry="3.9332814"
|
||||
d="M 40.658640 37.967922 A 16.528622 3.9332814 0 1 1 7.6013966,37.967922 A 16.528622 3.9332814 0 1 1 40.658640 37.967922 z"
|
||||
transform="matrix(1.446431,0.000000,0.000000,1.519990,-10.97453,-17.75168)" />
|
||||
<path
|
||||
sodipodi:nodetypes="csscccscccscczzzz"
|
||||
id="path2844"
|
||||
d="M 18.627569,3.1435548 C 10.488439,3.1435548 3.8827682,9.7492259 3.8827682,17.888356 C 3.8827682,26.027486 10.488439,32.633158 18.627569,32.633158 C 22.107124,32.633158 25.178570,31.248765 27.701292,29.230511 C 27.495915,30.237392 27.623257,31.265879 28.457436,31.990436 L 39.421520,41.517846 C 40.654936,42.589175 42.508982,42.448806 43.580310,41.215389 C 44.651638,39.981971 44.511269,38.127927 43.277853,37.056599 L 32.313769,27.529188 C 31.642242,26.945909 30.820891,26.773219 30.007531,26.886466 C 31.994231,24.374044 33.372370,21.337663 33.372370,17.888356 C 33.372370,9.7492259 26.766699,3.1435548 18.627569,3.1435548 z M 18.551954,4.3697381 C 26.191413,4.3697381 31.843729,9.1586886 31.843729,17.661513 C 31.843729,26.336626 26.027039,30.953288 18.551954,30.953288 C 11.249005,30.953288 5.2601806,25.475196 5.2601806,17.661513 C 5.2601806,9.6774061 11.084819,4.3697380 18.551954,4.3697381 z "
|
||||
style="opacity:1.0000000;color:#000000;fill:#dcdcdc;fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient2852);stroke-width:2.0000010;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;" />
|
||||
<path
|
||||
style="opacity:1.0000000;color:#000000;fill:#dcdcdc;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000004;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;"
|
||||
d="M 18.602905,3.0803551 C 10.437465,3.0803551 3.8104408,9.7073791 3.8104408,17.872819 C 3.8104408,26.038259 10.437465,32.665283 18.602905,32.665283 C 22.093708,32.665283 25.175082,31.276416 27.705960,29.251638 C 27.499919,30.261774 27.627672,31.293585 28.464547,32.020484 L 39.464073,41.578691 C 40.701476,42.653483 42.561515,42.512661 43.636306,41.275256 C 44.711097,40.037852 44.570274,38.177814 43.332871,37.103023 L 32.333346,27.544815 C 31.659648,26.959651 30.835642,26.786402 30.019653,26.900016 C 32.012775,24.379472 33.395369,21.333276 33.395369,17.872819 C 33.395369,9.7073791 26.768345,3.0803551 18.602905,3.0803551 z M 18.527046,6.2664243 C 24.808154,6.2664245 29.905864,11.364135 29.905864,17.645243 C 29.905864,23.926351 24.808154,29.024061 18.527046,29.024061 C 12.245938,29.024061 7.1482276,23.926351 7.1482276,17.645243 C 7.1482278,11.364135 12.245938,6.2664243 18.527046,6.2664243 z "
|
||||
id="path4430" />
|
||||
<path
|
||||
style="opacity:1.0000000;color:#000000;fill:url(#linearGradient4446);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;"
|
||||
d="M 39.507004,41.577690 C 39.028332,39.304503 40.904334,36.766268 43.091057,36.789315 C 43.091057,36.789315 32.330690,27.531204 32.330690,27.531204 C 29.385899,27.474498 28.061188,29.803820 28.553876,32.131126 L 39.507004,41.577690 z "
|
||||
id="path4438"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="opacity:1.0000000;color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient2372);stroke-width:0.80273360;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;"
|
||||
id="path4450"
|
||||
sodipodi:cx="17.500893"
|
||||
sodipodi:cy="18.920233"
|
||||
sodipodi:rx="11.048544"
|
||||
sodipodi:ry="11.048544"
|
||||
d="M 28.549437 18.920233 A 11.048544 11.048544 0 1 1 6.4523487,18.920233 A 11.048544 11.048544 0 1 1 28.549437 18.920233 z"
|
||||
transform="matrix(1.245743,0.000000,0.000000,1.245743,-3.425346,-6.177033)" />
|
||||
<ellipse
|
||||
id="path4485"
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient4493);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
|
||||
cx="18.504675"
|
||||
cy="38.146122"
|
||||
rx="7.8920522"
|
||||
ry="2.8307779" />
|
||||
<rect
|
||||
style="opacity:0.43315509;color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000311;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;"
|
||||
id="rect4495"
|
||||
width="19.048439"
|
||||
height="4.4404783"
|
||||
x="40.373337"
|
||||
y="0.14086054"
|
||||
rx="2.1366608"
|
||||
ry="1.8879365"
|
||||
transform="matrix(0.752986,0.658037,-0.648902,0.760872,0.000000,0.000000)" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="color:#000000;fill:url(#radialGradient4460);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3063a3;stroke-width:0.71499395;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10.000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;"
|
||||
id="path4452"
|
||||
sodipodi:cx="17.589281"
|
||||
sodipodi:cy="18.478292"
|
||||
sodipodi:rx="8.3085051"
|
||||
sodipodi:ry="8.3085051"
|
||||
d="M 25.897786 18.478292 A 8.3085051 8.3085051 0 1 1 9.2807760,18.478292 A 8.3085051 8.3085051 0 1 1 25.897786 18.478292 z"
|
||||
transform="matrix(1.398614,0.000000,0.000000,1.398614,-6.224338,-8.298958)" />
|
||||
<path
|
||||
style="opacity:0.83422458;color:#000000;fill:url(#radialGradient4473);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;"
|
||||
d="M 18.156915,7.3966938 C 12.949325,7.3966938 8.7323681,11.613651 8.7323681,16.821241 C 8.7323681,18.325216 9.1526753,19.709014 9.7795400,20.971144 C 11.031920,21.432757 12.362297,21.746827 13.774307,21.746827 C 19.945262,21.746827 24.873589,16.885190 25.254413,10.809698 C 23.523449,8.7641668 21.044374,7.3966938 18.156915,7.3966938 z "
|
||||
id="path4462" />
|
||||
<g
|
||||
transform="matrix(0.02264973,0,0,0.02609408,48.046283,48.655279)"
|
||||
id="g6-3"
|
||||
style="opacity:0.4;fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1">
|
||||
<g
|
||||
id="g8-6"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m -1627.0838,-595.53083 c 10.4,11.3 16.1,26 16.1,41.3 l 0,449.7 c 0,27.099997 32.7,40.799997 52,21.799997 l 125.5,-143.799997 c 16.8,-20.1 26,-30.1 26,-50.1 l 0,-277.4 c 0,-15.3 5.8,-30 16.1,-41.3 l 360,-390.6 c 27,-29.29997 6.2,-76.79997 -33.7,-76.79997 l -888.3,0 c -39.9,-0.1 -60.7,47.3 -33.7,76.69997 l 360,390.5 z"
|
||||
id="path10-7"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:82.35282898;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</g>
|
||||
<g
|
||||
id="g12-5"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g14-3"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g16-5"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g18-6"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g20-2"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g22-9"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g24-1"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g26-2"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g28-7"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g30-0"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g32-9"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g34-3"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g36-6"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g38-0"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g40-6"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(0.0233822,0,0,0.02642586,47.842749,48.274221)"
|
||||
id="g6"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:70.51978302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
|
||||
<g
|
||||
id="g8"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:70.51978302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m -1627.0838,-595.53083 c 10.4,11.3 16.1,26 16.1,41.3 l 0,449.7 c 0,27.099997 32.7,40.799997 52,21.799997 l 125.5,-143.799997 c 16.8,-20.1 26,-30.1 26,-50.1 l 0,-277.4 c 0,-15.3 5.8,-30 16.1,-41.3 l 360,-390.6 c 27,-29.29997 6.2,-76.79997 -33.7,-76.79997 l -888.3,0 c -39.9,-0.1 -60.7,47.3 -33.7,76.69997 l 360,390.5 z"
|
||||
id="path10"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:70.51978302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</g>
|
||||
<g
|
||||
id="g12"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:70.51978302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<g
|
||||
id="g14"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:70.51978302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<g
|
||||
id="g16"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:70.51978302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<g
|
||||
id="g18"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:70.51978302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<g
|
||||
id="g20"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:70.51978302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<g
|
||||
id="g22"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:70.51978302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<g
|
||||
id="g24"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:70.51978302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<g
|
||||
id="g26"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:70.51978302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<g
|
||||
id="g28"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:70.51978302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<g
|
||||
id="g30"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:70.51978302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<g
|
||||
id="g32"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:70.51978302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<g
|
||||
id="g34"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:70.51978302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<g
|
||||
id="g36"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:70.51978302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<g
|
||||
id="g38"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:70.51978302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<g
|
||||
id="g40"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:70.51978302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 21 KiB |
@@ -0,0 +1,708 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="filter.svg"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:version="0.32"
|
||||
id="svg11300"
|
||||
height="48px"
|
||||
width="48px"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||
version="1.1">
|
||||
<defs
|
||||
id="defs3">
|
||||
<linearGradient
|
||||
id="linearGradient2846">
|
||||
<stop
|
||||
id="stop2848"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#8a8a8a;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop2850"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#484848;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2366">
|
||||
<stop
|
||||
id="stop2368"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.21904762;"
|
||||
offset="0.50000000"
|
||||
id="stop2374" />
|
||||
<stop
|
||||
id="stop2370"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4467">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4469" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.24761905;"
|
||||
offset="1.0000000"
|
||||
id="stop4471" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4454">
|
||||
<stop
|
||||
style="stop-color:#729fcf;stop-opacity:0.20784314;"
|
||||
offset="0.0000000"
|
||||
id="stop4456" />
|
||||
<stop
|
||||
style="stop-color:#729fcf;stop-opacity:0.67619050;"
|
||||
offset="1.0000000"
|
||||
id="stop4458" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4440">
|
||||
<stop
|
||||
style="stop-color:#7d7d7d;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4442" />
|
||||
<stop
|
||||
id="stop4448"
|
||||
offset="0.50000000"
|
||||
style="stop-color:#b1b1b1;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
style="stop-color:#686868;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop4444" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
gradientTransform="matrix(1.5770403,0,0,1.4373405,-85.325285,-112.88055)"
|
||||
y2="78.206215"
|
||||
x2="71.53405"
|
||||
y1="124.11652"
|
||||
x1="71.288956"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2306"
|
||||
xlink:href="#linearGradient5075"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
id="linearGradient3340">
|
||||
<stop
|
||||
id="stop3342"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3344"
|
||||
offset="1"
|
||||
style="stop-color:#ffffff;stop-opacity:0.62886596;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5075">
|
||||
<stop
|
||||
id="stop5077"
|
||||
offset="0"
|
||||
style="stop-color:#adb0a8;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop5079"
|
||||
offset="1"
|
||||
style="stop-color:#464744;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2584">
|
||||
<stop
|
||||
id="stop2586"
|
||||
offset="0"
|
||||
style="stop-color:#000000;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop2588"
|
||||
offset="1"
|
||||
style="stop-color:#ffffff;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2684">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop2686" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop2688" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
y2="52.510574"
|
||||
x2="14"
|
||||
y1="15.291994"
|
||||
x1="15.089521"
|
||||
gradientTransform="translate(-4e-4,-9.426e-2)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2864"
|
||||
xlink:href="#linearGradient3081"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="93.204849"
|
||||
x2="169"
|
||||
y1="110.33805"
|
||||
x1="169"
|
||||
gradientTransform="matrix(1,0,0,1.004384,-145.0004,-71.4625)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2862"
|
||||
xlink:href="#linearGradient2697"
|
||||
inkscape:collect="always" />
|
||||
<radialGradient
|
||||
r="11"
|
||||
fy="100.20107"
|
||||
fx="169.77171"
|
||||
cy="100.20107"
|
||||
cx="169.77171"
|
||||
gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-175.6121,212.6949)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient2860"
|
||||
xlink:href="#linearGradient2679"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="105.49083"
|
||||
x2="174.74524"
|
||||
y1="84.263489"
|
||||
x1="174.83363"
|
||||
gradientTransform="matrix(1.103262,0,0,1.054917,-163.1228,-76.31138)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2858"
|
||||
xlink:href="#linearGradient2817"
|
||||
inkscape:collect="always" />
|
||||
<radialGradient
|
||||
r="11"
|
||||
fy="100.20107"
|
||||
fx="169.77171"
|
||||
cy="100.20107"
|
||||
cx="169.77171"
|
||||
gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-175.6121,186.6949)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient2831"
|
||||
xlink:href="#linearGradient2679"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="52.510574"
|
||||
x2="14"
|
||||
y1="15.291994"
|
||||
x1="15.089521"
|
||||
gradientTransform="translate(-4e-4,-26.09426)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2825"
|
||||
xlink:href="#linearGradient3081"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="105.49083"
|
||||
x2="174.74524"
|
||||
y1="84.263489"
|
||||
x1="174.83363"
|
||||
gradientTransform="matrix(1.103262,0,0,1.054917,-163.1228,-76.31138)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2823"
|
||||
xlink:href="#linearGradient2817"
|
||||
inkscape:collect="always" />
|
||||
<radialGradient
|
||||
r="11"
|
||||
fy="100.20107"
|
||||
fx="169.77171"
|
||||
cy="100.20107"
|
||||
cx="169.77171"
|
||||
gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-175.6121,212.6949)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient2809"
|
||||
xlink:href="#linearGradient2679"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="93.204849"
|
||||
x2="169"
|
||||
y1="110.33805"
|
||||
x1="169"
|
||||
gradientTransform="translate(-145.0004,-97.0943)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2806"
|
||||
xlink:href="#linearGradient2697"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="93.204849"
|
||||
x2="169"
|
||||
y1="110.33805"
|
||||
x1="169"
|
||||
gradientTransform="matrix(1,0,0,1.004384,-145.0004,-71.4625)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2803"
|
||||
xlink:href="#linearGradient2697"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="52.510574"
|
||||
x2="14"
|
||||
y1="15.291994"
|
||||
x1="15.089521"
|
||||
gradientTransform="translate(-4e-4,-9.426e-2)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2800"
|
||||
xlink:href="#linearGradient3081"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="52.510574"
|
||||
x2="14"
|
||||
y1="15.291994"
|
||||
x1="15.089521"
|
||||
gradientTransform="translate(133,70.99999)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2797"
|
||||
xlink:href="#linearGradient3081"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="93.204849"
|
||||
x2="169"
|
||||
y1="110.33805"
|
||||
x1="169"
|
||||
gradientTransform="translate(-12,0)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2795"
|
||||
xlink:href="#linearGradient2697"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="93.204849"
|
||||
x2="169"
|
||||
y1="110.33805"
|
||||
x1="169"
|
||||
gradientTransform="translate(-12,0)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2793"
|
||||
xlink:href="#linearGradient2697"
|
||||
inkscape:collect="always" />
|
||||
<radialGradient
|
||||
r="11"
|
||||
fy="100.20107"
|
||||
fx="169.77171"
|
||||
cy="100.20107"
|
||||
cx="169.77171"
|
||||
gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient2791"
|
||||
xlink:href="#linearGradient2679"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="52.510574"
|
||||
x2="14"
|
||||
y1="15.291994"
|
||||
x1="15.089521"
|
||||
gradientTransform="translate(133,70.99999)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2753"
|
||||
xlink:href="#linearGradient3081"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="93.204849"
|
||||
x2="169"
|
||||
y1="110.33805"
|
||||
x1="169"
|
||||
gradientTransform="translate(-12,0)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2751"
|
||||
xlink:href="#linearGradient2697"
|
||||
inkscape:collect="always" />
|
||||
<radialGradient
|
||||
r="11"
|
||||
fy="100.20107"
|
||||
fx="169.77171"
|
||||
cy="100.20107"
|
||||
cx="169.77171"
|
||||
gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient2749"
|
||||
xlink:href="#linearGradient2679"
|
||||
inkscape:collect="always" />
|
||||
<radialGradient
|
||||
r="15.644737"
|
||||
fy="36.421127"
|
||||
fx="24.837126"
|
||||
cy="36.421127"
|
||||
cx="24.837126"
|
||||
gradientTransform="matrix(1,0,0,0.536723,-1.44832e-12,16.87306)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient2747"
|
||||
xlink:href="#linearGradient8662"
|
||||
inkscape:collect="always" />
|
||||
<radialGradient
|
||||
r="15.644737"
|
||||
fy="36.421127"
|
||||
fx="24.837126"
|
||||
cy="36.421127"
|
||||
cx="24.837126"
|
||||
gradientTransform="matrix(1,0,0,0.536723,4.579205e-13,16.87306)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient2745"
|
||||
xlink:href="#linearGradient8662"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="52.510574"
|
||||
x2="14"
|
||||
y1="15.291994"
|
||||
x1="15.089521"
|
||||
gradientTransform="translate(133,70.99999)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2733"
|
||||
xlink:href="#linearGradient3081"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="93.204849"
|
||||
x2="169"
|
||||
y1="110.33805"
|
||||
x1="169"
|
||||
gradientTransform="translate(-12,0)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2731"
|
||||
xlink:href="#linearGradient2697"
|
||||
inkscape:collect="always" />
|
||||
<radialGradient
|
||||
r="11"
|
||||
fy="100.20107"
|
||||
fx="169.77171"
|
||||
cy="100.20107"
|
||||
cx="169.77171"
|
||||
gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient2729"
|
||||
xlink:href="#linearGradient2679"
|
||||
inkscape:collect="always" />
|
||||
<radialGradient
|
||||
r="15.644737"
|
||||
fy="36.421127"
|
||||
fx="24.837126"
|
||||
cy="36.421127"
|
||||
cx="24.837126"
|
||||
gradientTransform="matrix(1,0,0,0.536723,-1.432388e-12,16.87306)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient2727"
|
||||
xlink:href="#linearGradient8662"
|
||||
inkscape:collect="always" />
|
||||
<radialGradient
|
||||
r="15.644737"
|
||||
fy="36.421127"
|
||||
fx="24.837126"
|
||||
cy="36.421127"
|
||||
cx="24.837126"
|
||||
gradientTransform="matrix(1,0,0,0.536723,4.526469e-13,16.87306)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient2725"
|
||||
xlink:href="#linearGradient8662"
|
||||
inkscape:collect="always" />
|
||||
<radialGradient
|
||||
r="15.644737"
|
||||
fy="36.421127"
|
||||
fx="24.837126"
|
||||
cy="36.421127"
|
||||
cx="24.837126"
|
||||
gradientTransform="matrix(1,0,0,0.536723,-1.416456e-12,16.87306)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient2139"
|
||||
xlink:href="#linearGradient8662"
|
||||
inkscape:collect="always" />
|
||||
<radialGradient
|
||||
r="15.644737"
|
||||
fy="36.421127"
|
||||
fx="24.837126"
|
||||
cy="36.421127"
|
||||
cx="24.837126"
|
||||
gradientTransform="matrix(1,0,0,0.536723,4.473733e-13,16.87306)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient2137"
|
||||
xlink:href="#linearGradient8662"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="52.510574"
|
||||
x2="14"
|
||||
y1="15.291994"
|
||||
x1="15.089521"
|
||||
gradientTransform="translate(133,70.99999)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2124"
|
||||
xlink:href="#linearGradient3081"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="93.204849"
|
||||
x2="169"
|
||||
y1="110.33805"
|
||||
x1="169"
|
||||
gradientTransform="translate(-12,0)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2122"
|
||||
xlink:href="#linearGradient2697"
|
||||
inkscape:collect="always" />
|
||||
<radialGradient
|
||||
r="11"
|
||||
fy="100.20107"
|
||||
fx="169.77171"
|
||||
cy="100.20107"
|
||||
cx="169.77171"
|
||||
gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient2112"
|
||||
xlink:href="#linearGradient2679"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
id="linearGradient8662"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop8664"
|
||||
offset="0"
|
||||
style="stop-color:#000000;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop8666"
|
||||
offset="1"
|
||||
style="stop-color:#000000;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3081"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop3083"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3085"
|
||||
offset="1"
|
||||
style="stop-color:#ffffff;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient2679">
|
||||
<stop
|
||||
style="stop-color:#f7f7f7;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop2681" />
|
||||
<stop
|
||||
style="stop-color:#ccd0c7;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop2683" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2697">
|
||||
<stop
|
||||
style="stop-color:#babdb6"
|
||||
offset="0"
|
||||
id="stop2699" />
|
||||
<stop
|
||||
style="stop-color:#555753"
|
||||
offset="1"
|
||||
id="stop2701" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2584-8">
|
||||
<stop
|
||||
id="stop2586-4"
|
||||
offset="0"
|
||||
style="stop-color:#000000;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop2588-8"
|
||||
offset="1"
|
||||
style="stop-color:#ffffff;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2817">
|
||||
<stop
|
||||
id="stop2819"
|
||||
offset="0"
|
||||
style="stop-color:#000000;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop2821"
|
||||
offset="1"
|
||||
style="stop-color:#ffffff;stop-opacity:0.48453608;" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
stroke="#3465a4"
|
||||
inkscape:window-y="48"
|
||||
inkscape:window-x="130"
|
||||
inkscape:window-height="1752"
|
||||
inkscape:window-width="3070"
|
||||
inkscape:showpageshadow="false"
|
||||
inkscape:document-units="px"
|
||||
inkscape:grid-bbox="true"
|
||||
showgrid="false"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:cy="24.580209"
|
||||
inkscape:cx="-23.904288"
|
||||
inkscape:zoom="11.313708"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="0.25490196"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
fill="#729fcf"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata4">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Jakub Steiner</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:source>http://jimmac.musichall.cz</dc:source>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1"
|
||||
id="layer1">
|
||||
<g
|
||||
transform="matrix(0.04112758,0,0,0.04208992,87.449849,49.200049)"
|
||||
id="g6-3"
|
||||
style="opacity:0.4;fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1">
|
||||
<g
|
||||
id="g8-6"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m -1627.0838,-595.53083 c 10.4,11.3 16.1,26 16.1,41.3 l 0,449.7 c 0,27.099997 32.7,40.799997 52,21.799997 l 125.5,-143.799997 c 16.8,-20.1 26,-30.1 26,-50.1 l 0,-277.4 c 0,-15.3 5.8,-30 16.1,-41.3 l 360,-390.6 c 27,-29.29997 6.2,-76.79997 -33.7,-76.79997 l -888.3,0 c -39.9,-0.1 -60.7,47.3 -33.7,76.69997 l 360,390.5 z"
|
||||
id="path10-7"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:82.35282898;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</g>
|
||||
<g
|
||||
id="g12-5"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g14-3"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g16-5"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g18-6"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g20-2"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g22-9"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g24-1"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g26-2"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g28-7"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g30-0"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g32-9"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g34-3"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g36-6"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g38-0"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
<g
|
||||
id="g40-6"
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(0.04245758,0,0,0.04262509,87.080268,48.585402)"
|
||||
id="g6"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:70.51978539;stroke-miterlimit:4;stroke-dasharray:none">
|
||||
<g
|
||||
id="g8"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:70.51978539;stroke-miterlimit:4;stroke-dasharray:none">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m -1627.0838,-595.53083 c 10.4,11.3 16.1,26 16.1,41.3 l 0,449.7 c 0,27.099997 32.7,40.799997 52,21.799997 l 125.5,-143.799997 c 16.8,-20.1 26,-30.1 26,-50.1 l 0,-277.4 c 0,-15.3 5.8,-30 16.1,-41.3 l 360,-390.6 c 27,-29.29997 6.2,-76.79997 -33.7,-76.79997 l -888.3,0 c -39.9,-0.1 -60.7,47.3 -33.7,76.69997 l 360,390.5 z"
|
||||
id="path10"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:70.51978539;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</g>
|
||||
<g
|
||||
id="g12"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:70.51978539;stroke-miterlimit:4;stroke-dasharray:none" />
|
||||
<g
|
||||
id="g14"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:70.51978539;stroke-miterlimit:4;stroke-dasharray:none" />
|
||||
<g
|
||||
id="g16"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:70.51978539;stroke-miterlimit:4;stroke-dasharray:none" />
|
||||
<g
|
||||
id="g18"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:70.51978539;stroke-miterlimit:4;stroke-dasharray:none" />
|
||||
<g
|
||||
id="g20"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:70.51978539;stroke-miterlimit:4;stroke-dasharray:none" />
|
||||
<g
|
||||
id="g22"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:70.51978539;stroke-miterlimit:4;stroke-dasharray:none" />
|
||||
<g
|
||||
id="g24"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:70.51978539;stroke-miterlimit:4;stroke-dasharray:none" />
|
||||
<g
|
||||
id="g26"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:70.51978539;stroke-miterlimit:4;stroke-dasharray:none" />
|
||||
<g
|
||||
id="g28"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:70.51978539;stroke-miterlimit:4;stroke-dasharray:none" />
|
||||
<g
|
||||
id="g30"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:70.51978539;stroke-miterlimit:4;stroke-dasharray:none" />
|
||||
<g
|
||||
id="g32"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:70.51978539;stroke-miterlimit:4;stroke-dasharray:none" />
|
||||
<g
|
||||
id="g34"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:70.51978539;stroke-miterlimit:4;stroke-dasharray:none" />
|
||||
<g
|
||||
id="g36"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:70.51978539;stroke-miterlimit:4;stroke-dasharray:none" />
|
||||
<g
|
||||
id="g38"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:70.51978539;stroke-miterlimit:4;stroke-dasharray:none" />
|
||||
<g
|
||||
id="g40"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:70.51978539;stroke-miterlimit:4;stroke-dasharray:none" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:r_cy="true"
|
||||
inkscape:r_cx="true"
|
||||
style="display:inline"
|
||||
inkscape:label="Layer 1"
|
||||
id="layer1-4"
|
||||
transform="matrix(0.52129778,0,0,0.55541254,0.16640648,22.45761)" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 23 KiB |
@@ -0,0 +1,312 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://web.resource.org/cc/"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="system-search.svg"
|
||||
sodipodi:docbase="/home/tigert/cvs/freedesktop.org/tango-icon-theme/scalable/actions"
|
||||
inkscape:version="0.43+devel"
|
||||
sodipodi:version="0.32"
|
||||
id="svg11300"
|
||||
height="48px"
|
||||
width="48px"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape">
|
||||
<defs
|
||||
id="defs3">
|
||||
<linearGradient
|
||||
id="linearGradient2846">
|
||||
<stop
|
||||
id="stop2848"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#8a8a8a;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop2850"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#484848;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2366">
|
||||
<stop
|
||||
id="stop2368"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.21904762;"
|
||||
offset="0.50000000"
|
||||
id="stop2374" />
|
||||
<stop
|
||||
id="stop2370"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4487">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4489" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop4491" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4477">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4479" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop4481" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4467">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4469" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.24761905;"
|
||||
offset="1.0000000"
|
||||
id="stop4471" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4454">
|
||||
<stop
|
||||
style="stop-color:#729fcf;stop-opacity:0.20784314;"
|
||||
offset="0.0000000"
|
||||
id="stop4456" />
|
||||
<stop
|
||||
style="stop-color:#729fcf;stop-opacity:0.67619050;"
|
||||
offset="1.0000000"
|
||||
id="stop4458" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4440">
|
||||
<stop
|
||||
style="stop-color:#7d7d7d;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4442" />
|
||||
<stop
|
||||
id="stop4448"
|
||||
offset="0.50000000"
|
||||
style="stop-color:#b1b1b1;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
style="stop-color:#686868;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop4444" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4440"
|
||||
id="linearGradient4446"
|
||||
x1="30.656250"
|
||||
y1="34.000000"
|
||||
x2="33.218750"
|
||||
y2="31.062500"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.334593,0.000000,0.000000,1.291292,-6.973842,-7.460658)" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4454"
|
||||
id="radialGradient4460"
|
||||
cx="18.240929"
|
||||
cy="21.817987"
|
||||
fx="18.240929"
|
||||
fy="21.817987"
|
||||
r="8.3085051"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4467"
|
||||
id="radialGradient4473"
|
||||
cx="15.414371"
|
||||
cy="13.078408"
|
||||
fx="15.414371"
|
||||
fy="13.078408"
|
||||
r="6.6562500"
|
||||
gradientTransform="matrix(2.592963,-7.746900e-24,-5.714443e-24,2.252104,-25.05975,-18.94100)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4487"
|
||||
id="radialGradient4493"
|
||||
cx="24.130018"
|
||||
cy="37.967922"
|
||||
fx="24.130018"
|
||||
fy="37.967922"
|
||||
r="16.528622"
|
||||
gradientTransform="matrix(1.000000,0.000000,0.000000,0.237968,3.152859e-15,28.93278)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="25.743469"
|
||||
x2="17.500893"
|
||||
y1="13.602121"
|
||||
x1="18.292673"
|
||||
id="linearGradient2372"
|
||||
xlink:href="#linearGradient2366"
|
||||
inkscape:collect="always" />
|
||||
<radialGradient
|
||||
r="16.528622"
|
||||
fy="37.967922"
|
||||
fx="24.130018"
|
||||
cy="37.967922"
|
||||
cx="24.130018"
|
||||
gradientTransform="matrix(1.000000,0.000000,0.000000,0.237968,-2.471981e-16,28.93278)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient2842"
|
||||
xlink:href="#linearGradient4477"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="30.557772"
|
||||
x2="31.335964"
|
||||
y1="26.580296"
|
||||
x1="27.366341"
|
||||
id="linearGradient2852"
|
||||
xlink:href="#linearGradient2846"
|
||||
inkscape:collect="always" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
stroke="#3465a4"
|
||||
inkscape:window-y="187"
|
||||
inkscape:window-x="239"
|
||||
inkscape:window-height="754"
|
||||
inkscape:window-width="691"
|
||||
inkscape:showpageshadow="false"
|
||||
inkscape:document-units="px"
|
||||
inkscape:grid-bbox="true"
|
||||
showgrid="false"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:cy="23.070520"
|
||||
inkscape:cx="23.821561"
|
||||
inkscape:zoom="11.313708"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="0.25490196"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
fill="#729fcf" />
|
||||
<metadata
|
||||
id="metadata4">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Jakub Steiner</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:source>http://jimmac.musichall.cz</dc:source>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1"
|
||||
id="layer1">
|
||||
<g
|
||||
id="g1772">
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="opacity:0.17112298;color:#000000;fill:url(#radialGradient2842);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;"
|
||||
id="path4475"
|
||||
sodipodi:cx="24.130018"
|
||||
sodipodi:cy="37.967922"
|
||||
sodipodi:rx="16.528622"
|
||||
sodipodi:ry="3.9332814"
|
||||
d="M 40.658640 37.967922 A 16.528622 3.9332814 0 1 1 7.6013966,37.967922 A 16.528622 3.9332814 0 1 1 40.658640 37.967922 z"
|
||||
transform="matrix(1.446431,0.000000,0.000000,1.519990,-10.97453,-17.75168)" />
|
||||
<path
|
||||
sodipodi:nodetypes="csscccscccscczzzz"
|
||||
id="path2844"
|
||||
d="M 18.627569,3.1435548 C 10.488439,3.1435548 3.8827682,9.7492259 3.8827682,17.888356 C 3.8827682,26.027486 10.488439,32.633158 18.627569,32.633158 C 22.107124,32.633158 25.178570,31.248765 27.701292,29.230511 C 27.495915,30.237392 27.623257,31.265879 28.457436,31.990436 L 39.421520,41.517846 C 40.654936,42.589175 42.508982,42.448806 43.580310,41.215389 C 44.651638,39.981971 44.511269,38.127927 43.277853,37.056599 L 32.313769,27.529188 C 31.642242,26.945909 30.820891,26.773219 30.007531,26.886466 C 31.994231,24.374044 33.372370,21.337663 33.372370,17.888356 C 33.372370,9.7492259 26.766699,3.1435548 18.627569,3.1435548 z M 18.551954,4.3697381 C 26.191413,4.3697381 31.843729,9.1586886 31.843729,17.661513 C 31.843729,26.336626 26.027039,30.953288 18.551954,30.953288 C 11.249005,30.953288 5.2601806,25.475196 5.2601806,17.661513 C 5.2601806,9.6774061 11.084819,4.3697380 18.551954,4.3697381 z "
|
||||
style="opacity:1.0000000;color:#000000;fill:#dcdcdc;fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient2852);stroke-width:2.0000010;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;" />
|
||||
<path
|
||||
style="opacity:1.0000000;color:#000000;fill:#dcdcdc;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000004;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;"
|
||||
d="M 18.602905,3.0803551 C 10.437465,3.0803551 3.8104408,9.7073791 3.8104408,17.872819 C 3.8104408,26.038259 10.437465,32.665283 18.602905,32.665283 C 22.093708,32.665283 25.175082,31.276416 27.705960,29.251638 C 27.499919,30.261774 27.627672,31.293585 28.464547,32.020484 L 39.464073,41.578691 C 40.701476,42.653483 42.561515,42.512661 43.636306,41.275256 C 44.711097,40.037852 44.570274,38.177814 43.332871,37.103023 L 32.333346,27.544815 C 31.659648,26.959651 30.835642,26.786402 30.019653,26.900016 C 32.012775,24.379472 33.395369,21.333276 33.395369,17.872819 C 33.395369,9.7073791 26.768345,3.0803551 18.602905,3.0803551 z M 18.527046,6.2664243 C 24.808154,6.2664245 29.905864,11.364135 29.905864,17.645243 C 29.905864,23.926351 24.808154,29.024061 18.527046,29.024061 C 12.245938,29.024061 7.1482276,23.926351 7.1482276,17.645243 C 7.1482278,11.364135 12.245938,6.2664243 18.527046,6.2664243 z "
|
||||
id="path4430" />
|
||||
<path
|
||||
style="opacity:1.0000000;color:#000000;fill:url(#linearGradient4446);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;"
|
||||
d="M 39.507004,41.577690 C 39.028332,39.304503 40.904334,36.766268 43.091057,36.789315 C 43.091057,36.789315 32.330690,27.531204 32.330690,27.531204 C 29.385899,27.474498 28.061188,29.803820 28.553876,32.131126 L 39.507004,41.577690 z "
|
||||
id="path4438"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="opacity:1.0000000;color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient2372);stroke-width:0.80273360;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;"
|
||||
id="path4450"
|
||||
sodipodi:cx="17.500893"
|
||||
sodipodi:cy="18.920233"
|
||||
sodipodi:rx="11.048544"
|
||||
sodipodi:ry="11.048544"
|
||||
d="M 28.549437 18.920233 A 11.048544 11.048544 0 1 1 6.4523487,18.920233 A 11.048544 11.048544 0 1 1 28.549437 18.920233 z"
|
||||
transform="matrix(1.245743,0.000000,0.000000,1.245743,-3.425346,-6.177033)" />
|
||||
<path
|
||||
transform="matrix(0.497764,0.000000,0.000000,0.609621,8.973526,15.61929)"
|
||||
d="M 40.658640 37.967922 A 16.528622 3.9332814 0 1 1 7.6013966,37.967922 A 16.528622 3.9332814 0 1 1 40.658640 37.967922 z"
|
||||
sodipodi:ry="3.9332814"
|
||||
sodipodi:rx="16.528622"
|
||||
sodipodi:cy="37.967922"
|
||||
sodipodi:cx="24.130018"
|
||||
id="path4485"
|
||||
style="opacity:1.0000000;color:#000000;fill:url(#radialGradient4493);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;"
|
||||
sodipodi:type="arc" />
|
||||
<rect
|
||||
style="opacity:0.43315509;color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000311;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;"
|
||||
id="rect4495"
|
||||
width="19.048439"
|
||||
height="4.4404783"
|
||||
x="40.373337"
|
||||
y="0.14086054"
|
||||
rx="2.1366608"
|
||||
ry="1.8879365"
|
||||
transform="matrix(0.752986,0.658037,-0.648902,0.760872,0.000000,0.000000)" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="color:#000000;fill:url(#radialGradient4460);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3063a3;stroke-width:0.71499395;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10.000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;"
|
||||
id="path4452"
|
||||
sodipodi:cx="17.589281"
|
||||
sodipodi:cy="18.478292"
|
||||
sodipodi:rx="8.3085051"
|
||||
sodipodi:ry="8.3085051"
|
||||
d="M 25.897786 18.478292 A 8.3085051 8.3085051 0 1 1 9.2807760,18.478292 A 8.3085051 8.3085051 0 1 1 25.897786 18.478292 z"
|
||||
transform="matrix(1.398614,0.000000,0.000000,1.398614,-6.224338,-8.298958)" />
|
||||
<path
|
||||
style="opacity:0.83422458;color:#000000;fill:url(#radialGradient4473);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;"
|
||||
d="M 18.156915,7.3966938 C 12.949325,7.3966938 8.7323681,11.613651 8.7323681,16.821241 C 8.7323681,18.325216 9.1526753,19.709014 9.7795400,20.971144 C 11.031920,21.432757 12.362297,21.746827 13.774307,21.746827 C 19.945262,21.746827 24.873589,16.885190 25.254413,10.809698 C 23.523449,8.7641668 21.044374,7.3966938 18.156915,7.3966938 z "
|
||||
id="path4462" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 15 KiB |
@@ -32,9 +32,9 @@
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
<link rel="stylesheet" href="styles.0a22cbd56b6e27a9938f.css"></head>
|
||||
<link rel="stylesheet" href="styles.7a07d35efbc0270fb065.css"></head>
|
||||
<!-- <body class="mat-app-background" oncontextmenu="return false;"> -->
|
||||
<body class="mat-app-background" oncontextmenu="return false;">
|
||||
<app-root></app-root>
|
||||
<script type="text/javascript" src="runtime.a5dd35324ddfd942bef1.js"></script><script type="text/javascript" src="polyfills.f4c5bd079c16579a94cf.js"></script><script type="text/javascript" src="main.4afddaebdefb25000188.js"></script></body>
|
||||
<script type="text/javascript" src="runtime.26209474bfa8dc87a77c.js"></script><script type="text/javascript" src="polyfills.9cf8d114d9c6322da643.js"></script><script type="text/javascript" src="main.d7e59714b81de1a1004d.js"></script></body>
|
||||
</html>
|
||||
@@ -1 +0,0 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{"+/L5":function(n,e,t){var l=t("t1UP").isCustomProperty,o=t("vd7W").TYPE,r=o.Identifier,i=o.Colon,a=o.ExclamationMark,u=o.Solidus,s=o.Asterisk,d=o.DollarSign,c=o.HyphenMinus,p=o.Semicolon,f=o.PlusSign,h=o.NumberSign;function m(n){return this.Raw(n,a,p,!1,!0)}function v(n){return this.Raw(n,a,p,!1,!1)}function g(){var n=this.scanner.currentToken,e=this.Value();return"Raw"!==e.type&&!1===this.scanner.eof&&this.scanner.tokenType!==p&&this.scanner.tokenType!==a&&!1===this.scanner.isBalanceEdge(n)&&this.scanner.error(),e}n.exports={name:"Declaration",structure:{important:[Boolean,String],property:String,value:["Value","Raw"]},parse:function(){var n,e=this.scanner.tokenStart,t=this.scanner.currentToken,o=(function(){var n=this.scanner.tokenStart,e=0;switch(this.scanner.tokenType){case s:case d:case f:case h:e=1;break;case u:e=this.scanner.lookupType(1)===u?2:1}return this.scanner.lookupType(e)===c&&e++,e&&this.scanner.skip(e),this.scanner.eat(r),this.scanner.substrToCursor(n)}).call(this),b=l(o),y=b?this.parseCustomProperty:this.parseValue,_=b?v:m,w=!1;return this.scanner.skipSC(),this.scanner.eat(i),b||this.scanner.skipSC(),n=y?this.parseWithFallback(g,_):_.call(this,this.scanner.currentToken),this.scanner.tokenType===a&&(w=function(n){n.eat(a),n.skipSC();var e=n.consume(r);return"important"===e||e}(this.scanner),this.scanner.skipSC()),!1===this.scanner.eof&&this.scanner.tokenType!==p&&!1===this.scanner.isBalanceEdge(t)&&this.scanner.error(),{type:"Declaration",loc:this.getLocation(e,this.scanner.tokenStart),important:w,property:o,value:n}},generate:function(n){this.chunk(n.property),this.chunk(":"),this.node(n.value),n.important&&this.chunk(!0===n.important?"!important":"!"+n.important)},walkContext:"declaration"}},"+Kd2":function(n,e,t){var l=t("vd7W").TYPE,o=l.Identifier,r=l.Comma,i=l.Semicolon,a=l.HyphenMinus,u=l.ExclamationMark;n.exports=function(){var n=this.createList();this.scanner.skipSC();var e=this.scanner.tokenStart;return this.scanner.eat(a),this.scanner.source.charCodeAt(this.scanner.tokenStart)!==a&&this.scanner.error("HyphenMinus is expected"),this.scanner.eat(o),n.push({type:"Identifier",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}),this.scanner.skipSC(),this.scanner.tokenType===r&&(n.push(this.Operator()),n.push(this.parseCustomProperty?this.Value(null):this.Raw(this.scanner.currentToken,u,i,!1,!1))),n}},"+gEr":function(n,e,t){"use strict";t.d(e,"a",function(){return i}),t.d(e,"b",function(){return a});var l=t("mrSG"),o=t("MGBS"),r=t("zotm"),i={leading:!0,trailing:!1};function a(n,e){return void 0===e&&(e=i),function(t){return t.lift(new u(n,e.leading,e.trailing))}}var u=function(){function n(n,e,t){this.durationSelector=n,this.leading=e,this.trailing=t}return n.prototype.call=function(n,e){return e.subscribe(new s(n,this.durationSelector,this.leading,this.trailing))},n}(),s=function(n){function e(e,t,l,o){var r=n.call(this,e)||this;return r.destination=e,r.durationSelector=t,r._leading=l,r._trailing=o,r._hasValue=!1,r}return l.__extends(e,n),e.prototype._next=function(n){this._hasValue=!0,this._sendValue=n,this._throttled||(this._leading?this.send():this.throttle(n))},e.prototype.send=function(){var n=this._sendValue;this._hasValue&&(this.destination.next(n),this.throttle(n)),this._hasValue=!1,this._sendValue=null},e.prototype.throttle=function(n){var e=this.tryDurationSelector(n);e&&this.add(this._throttled=Object(r.a)(this,e))},e.prototype.tryDurationSelector=function(n){try{return this.durationSelector(n)}catch(e){return this.destination.error(e),null}},e.prototype.throttlingDone=function(){var n=this._throttled,e=this._trailing;n&&n.unsubscribe(),this._throttled=null,e&&this.send()},e.prototype.notifyNext=function(n,e,t,l,o){this.throttlingDone()},e.prototype.notifyComplete=function(){this.throttlingDone()},e}(o.a)},"+ryv":function(n,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var l=t("CcnG");e.HotkeyOptions=new l.InjectionToken("HotkeyOptions")},"+tJ4":function(n,e,t){"use strict";t.d(e,"a",function(){return l});var l=function(n){return function(e){for(var t=0,l=n.length;t<l&&!e.closed;t++)e.next(n[t]);e.closed||e.complete()}}},"+umK":function(n,e,t){"use strict";function l(){}t.d(e,"a",function(){return l})},"/+5V":function(n,e){function t(n){function e(n){return null!==n&&("Type"===n.type||"Property"===n.type||"Keyword"===n.type)}var t=null;return null!==this.matched&&function l(o){if(Array.isArray(o.match)){for(var r=0;r<o.match.length;r++)if(l(o.match[r]))return e(o.syntax)&&t.unshift(o.syntax),!0}else if(o.node===n)return t=e(o.syntax)?[o.syntax]:[],!0;return!1}(this.matched),t}function l(n,e,l){var o=t.call(n,e);return null!==o&&o.some(l)}n.exports={getTrace:t,isType:function(n,e){return l(this,n,function(n){return"Type"===n.type&&n.name===e})},isProperty:function(n,e){return l(this,n,function(n){return"Property"===n.type&&n.name===e})},isKeyword:function(n){returLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{"+/L5":function(n,e,t){var l=t("t1UP").isCustomProperty,o=t("vd7W").TYPE,r=o.Identifier,i=o.Colon,a=o.ExclamationMark,u=o.Solidus,s=o.Asterisk,d=o.DollarSign,c=o.HyphenMinus,p=o.Semicolon,f=o.PlusSign,h=o.NumberSign;function m(n){return this.Raw(n,a,p,!1,!0)}function v(n){return this.Raw(n,a,p,!1,!1)}function g(){var n=this.scanner.currentToken,e=this.Value();return"Raw"!==e.type&&!1===this.scanner.eof&&this.scanner.tokenType!==p&&this.scanner.tokenType!==a&&!1===this.scanner.isBalanceEdge(n)&&this.scanner.error(),e}n.exports={name:"Declaration",structure:{important:[Boolean,String],property:String,value:["Value","Raw"]},parse:function(){var n,e=this.scanner.tokenStart,t=this.scanner.currentToken,o=(function(){var n=this.scanner.tokenStart,e=0;switch(this.scanner.tokenType){case s:case d:case f:case h:e=1;break;case u:e=this.scanner.lookupType(1)===u?2:1}return this.scanner.lookupType(e)===c&&e++,e&&this.scanner.skip(e),this.scanner.eat(r),this.scanner.substrToCursor(n)}).call(this),b=l(o),y=b?this.parseCustomProperty:this.parseValue,_=b?v:m,w=!1;return this.scanner.skipSC(),this.scanner.eat(i),b||this.scanner.skipSC(),n=y?this.parseWithFallback(g,_):_.call(this,this.scanner.currentToken),this.scanner.tokenType===a&&(w=function(n){n.eat(a),n.skipSC();var e=n.consume(r);return"important"===e||e}(this.scanner),this.scanner.skipSC()),!1===this.scanner.eof&&this.scanner.tokenType!==p&&!1===this.scanner.isBalanceEdge(t)&&this.scanner.error(),{type:"Declaration",loc:this.getLocation(e,this.scanner.tokenStart),important:w,property:o,value:n}},generate:function(n){this.chunk(n.property),this.chunk(":"),this.node(n.value),n.important&&this.chunk(!0===n.important?"!important":"!"+n.important)},walkContext:"declaration"}},"+Kd2":function(n,e,t){var l=t("vd7W").TYPE,o=l.Identifier,r=l.Comma,i=l.Semicolon,a=l.HyphenMinus,u=l.ExclamationMark;n.exports=function(){var n=this.createList();this.scanner.skipSC();var e=this.scanner.tokenStart;return this.scanner.eat(a),this.scanner.source.charCodeAt(this.scanner.tokenStart)!==a&&this.scanner.error("HyphenMinus is expected"),this.scanner.eat(o),n.push({type:"Identifier",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}),this.scanner.skipSC(),this.scanner.tokenType===r&&(n.push(this.Operator()),n.push(this.parseCustomProperty?this.Value(null):this.Raw(this.scanner.currentToken,u,i,!1,!1))),n}},"+gEr":function(n,e,t){"use strict";t.d(e,"a",function(){return i}),t.d(e,"b",function(){return a});var l=t("mrSG"),o=t("MGBS"),r=t("zotm"),i={leading:!0,trailing:!1};function a(n,e){return void 0===e&&(e=i),function(t){return t.lift(new u(n,e.leading,e.trailing))}}var u=function(){function n(n,e,t){this.durationSelector=n,this.leading=e,this.trailing=t}return n.prototype.call=function(n,e){return e.subscribe(new s(n,this.durationSelector,this.leading,this.trailing))},n}(),s=function(n){function e(e,t,l,o){var r=n.call(this,e)||this;return r.destination=e,r.durationSelector=t,r._leading=l,r._trailing=o,r._hasValue=!1,r}return l.__extends(e,n),e.prototype._next=function(n){this._hasValue=!0,this._sendValue=n,this._throttled||(this._leading?this.send():this.throttle(n))},e.prototype.send=function(){var n=this._sendValue;this._hasValue&&(this.destination.next(n),this.throttle(n)),this._hasValue=!1,this._sendValue=null},e.prototype.throttle=function(n){var e=this.tryDurationSelector(n);e&&this.add(this._throttled=Object(r.a)(this,e))},e.prototype.tryDurationSelector=function(n){try{return this.durationSelector(n)}catch(e){return this.destination.error(e),null}},e.prototype.throttlingDone=function(){var n=this._throttled,e=this._trailing;n&&n.unsubscribe(),this._throttled=null,e&&this.send()},e.prototype.notifyNext=function(n,e,t,l,o){this.throttlingDone()},e.prototype.notifyComplete=function(){this.throttlingDone()},e}(o.a)},"+ryv":function(n,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var l=t("CcnG");e.HotkeyOptions=new l.InjectionToken("HotkeyOptions")},"+tJ4":function(n,e,t){"use strict";t.d(e,"a",function(){return l});var l=function(n){return function(e){for(var t=0,l=n.length;t<l&&!e.closed;t++)e.next(n[t]);e.complete()}}},"+umK":function(n,e,t){"use strict";function l(){}t.d(e,"a",function(){return l})},"/+5V":function(n,e){function t(n){function e(n){return null!==n&&("Type"===n.type||"Property"===n.type||"Keyword"===n.type)}var t=null;return null!==this.matched&&function l(o){if(Array.isArray(o.match)){for(var r=0;r<o.match.length;r++)if(l(o.match[r]))return e(o.syntax)&&t.unshift(o.syntax),!0}else if(o.node===n)return t=e(o.syntax)?[o.syntax]:[],!0;return!1}(this.matched),t}function l(n,e,l){var o=t.call(n,e);return null!==o&&o.some(l)}n.exports={getTrace:t,isType:function(n,e){return l(this,n,function(n){return"Type"===n.type&&n.name===e})},isProperty:function(n,e){return l(this,n,function(n){return"Property"===n.type&&n.name===e})},isKeyword:function(n){return l(this,nLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{"0TWp":function(e,t,n){!function(){"use strict";!function(e){var t=e.performance;function n(e){t&&t.mark&&t.mark(e)}function r(e,n){t&&t.measure&&t.measure(e,n)}n("Zone");var o=!0===e.__zone_symbol__forceDuplicateZoneCheck;if(e.Zone){if(o||"function"!=typeof e.Zone.__symbol__)throw new Error("Zone already loaded.");return e.Zone}var a,i=function(){function t(e,t){this._parent=e,this._name=t?t.name||"unnamed":"<root>",this._properties=t&&t.properties||{},this._zoneDelegate=new c(this,this._parent&&this._parent._zoneDelegate,t)}return t.assertZonePatched=function(){if(e.Promise!==P.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")},Object.defineProperty(t,"root",{get:function(){for(var e=t.current;e.parent;)e=e.parent;return e},enumerable:!0,configurable:!0}),Object.defineProperty(t,"current",{get:function(){return Z.zone},enumerable:!0,configurable:!0}),Object.defineProperty(t,"currentTask",{get:function(){return j},enumerable:!0,configurable:!0}),t.__load_patch=function(a,i){if(P.hasOwnProperty(a)){if(o)throw Error("Already loaded patch: "+a)}else if(!e["__Zone_disable_"+a]){var s="Zone:"+a;n(s),P[a]=i(e,t,D),r(s,s)}},Object.defineProperty(t.prototype,"parent",{get:function(){return this._parent},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),t.prototype.get=function(e){var t=this.getZoneWith(e);if(t)return t._properties[e]},t.prototype.getZoneWith=function(e){for(var t=this;t;){if(t._properties.hasOwnProperty(e))return t;t=t._parent}return null},t.prototype.fork=function(e){if(!e)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,e)},t.prototype.wrap=function(e,t){if("function"!=typeof e)throw new Error("Expecting function got: "+e);var n=this._zoneDelegate.intercept(this,e,t),r=this;return function(){return r.runGuarded(n,this,arguments,t)}},t.prototype.run=function(e,t,n,r){Z={parent:Z,zone:this};try{return this._zoneDelegate.invoke(this,e,t,n,r)}finally{Z=Z.parent}},t.prototype.runGuarded=function(e,t,n,r){void 0===t&&(t=null),Z={parent:Z,zone:this};try{try{return this._zoneDelegate.invoke(this,e,t,n,r)}catch(o){if(this._zoneDelegate.handleError(this,o))throw o}}finally{Z=Z.parent}},t.prototype.runTask=function(e,t,n){if(e.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(e.zone||y).name+"; Execution: "+this.name+")");if(e.state!==_||e.type!==O&&e.type!==S){var r=e.state!=k;r&&e._transitionTo(k,b),e.runCount++;var o=j;j=e,Z={parent:Z,zone:this};try{e.type==S&&e.data&&!e.data.isPeriodic&&(e.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,e,t,n)}catch(a){if(this._zoneDelegate.handleError(this,a))throw a}}finally{e.state!==_&&e.state!==w&&(e.type==O||e.data&&e.data.isPeriodic?r&&e._transitionTo(b,k):(e.runCount=0,this._updateTaskCount(e,-1),r&&e._transitionTo(_,k,_))),Z=Z.parent,j=o}}},t.prototype.scheduleTask=function(e){if(e.zone&&e.zone!==this)for(var t=this;t;){if(t===e.zone)throw Error("can not reschedule task to "+this.name+" which is descendants of the original zone "+e.zone.name);t=t.parent}e._transitionTo(m,_);var n=[];e._zoneDelegates=n,e._zone=this;try{e=this._zoneDelegate.scheduleTask(this,e)}catch(r){throw e._transitionTo(w,m,_),this._zoneDelegate.handleError(this,r),r}return e._zoneDelegates===n&&this._updateTaskCount(e,1),e.state==m&&e._transitionTo(b,m),e},t.prototype.scheduleMicroTask=function(e,t,n,r){return this.scheduleTask(new l(E,e,t,n,r,void 0))},t.prototype.scheduleMacroTask=function(e,t,n,r,o){return this.scheduleTask(new l(S,e,t,n,r,o))},t.prototype.scheduleEventTask=function(e,t,n,r,o){return this.scheduleTask(new l(O,e,t,n,r,o))},t.prototype.cancelTask=function(e){if(e.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(e.zone||y).name+"; Execution: "+this.name+")");e._transitionTo(T,b,k);try{this._zoneDelegate.cancelTask(this,e)}catch(t){throw e._transitionTo(w,T),this._zoneDelegate.handleError(this,t),t}return this._updateTaskCount(e,-1),e._transitionTo(_,T),e.runCount=0,e},t.prototype._updateTaskCount=function(e,t){var n=e._zoneDelegates;-1==t&&(e._zoneDelegates=null);for(var r=0;r<n.length;r++)n[r]._updateTaskCount(e.type,t)},t.__symbol__=I,t}(),s={name:"",onHasTask:function(e,t,n,r){return e.hasTask(n,r)},onScheduleTask:function(e,t,n,r){return e.scheduleTask(n,r)},onInvokeTask:function(e,t,n,r,o,a){return e.invokeTask(n,r,o,a)},onCancelTask:function(e,t,n,r){return e.cancelTask(n,r)}},c=function(){function e(e,t,n){this._taskCounts={microTask:0,macroTask:0,eventTask:0},this.zone=e,this._parentDelegate=t,this._forkZS=n&&(n&&n.onFork?n:t._fLine truncated
|
||||
@@ -1 +0,0 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{"0TWp":function(e,t,n){!function(){"use strict";!function(e){var t=e.performance;function n(e){t&&t.mark&&t.mark(e)}function r(e,n){t&&t.measure&&t.measure(e,n)}n("Zone");var o=!0===e.__zone_symbol__forceDuplicateZoneCheck;if(e.Zone){if(o||"function"!=typeof e.Zone.__symbol__)throw new Error("Zone already loaded.");return e.Zone}var a,i=function(){function t(e,t){this._parent=e,this._name=t?t.name||"unnamed":"<root>",this._properties=t&&t.properties||{},this._zoneDelegate=new c(this,this._parent&&this._parent._zoneDelegate,t)}return t.assertZonePatched=function(){if(e.Promise!==Z.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")},Object.defineProperty(t,"root",{get:function(){for(var e=t.current;e.parent;)e=e.parent;return e},enumerable:!0,configurable:!0}),Object.defineProperty(t,"current",{get:function(){return O.zone},enumerable:!0,configurable:!0}),Object.defineProperty(t,"currentTask",{get:function(){return P},enumerable:!0,configurable:!0}),t.__load_patch=function(a,i){if(Z.hasOwnProperty(a)){if(o)throw Error("Already loaded patch: "+a)}else if(!e["__Zone_disable_"+a]){var s="Zone:"+a;n(s),Z[a]=i(e,t,z),r(s,s)}},Object.defineProperty(t.prototype,"parent",{get:function(){return this._parent},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),t.prototype.get=function(e){var t=this.getZoneWith(e);if(t)return t._properties[e]},t.prototype.getZoneWith=function(e){for(var t=this;t;){if(t._properties.hasOwnProperty(e))return t;t=t._parent}return null},t.prototype.fork=function(e){if(!e)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,e)},t.prototype.wrap=function(e,t){if("function"!=typeof e)throw new Error("Expecting function got: "+e);var n=this._zoneDelegate.intercept(this,e,t),r=this;return function(){return r.runGuarded(n,this,arguments,t)}},t.prototype.run=function(e,t,n,r){O={parent:O,zone:this};try{return this._zoneDelegate.invoke(this,e,t,n,r)}finally{O=O.parent}},t.prototype.runGuarded=function(e,t,n,r){void 0===t&&(t=null),O={parent:O,zone:this};try{try{return this._zoneDelegate.invoke(this,e,t,n,r)}catch(o){if(this._zoneDelegate.handleError(this,o))throw o}}finally{O=O.parent}},t.prototype.runTask=function(e,t,n){if(e.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(e.zone||y).name+"; Execution: "+this.name+")");if(e.state!==m||e.type!==D&&e.type!==S){var r=e.state!=b;r&&e._transitionTo(b,_),e.runCount++;var o=P;P=e,O={parent:O,zone:this};try{e.type==S&&e.data&&!e.data.isPeriodic&&(e.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,e,t,n)}catch(a){if(this._zoneDelegate.handleError(this,a))throw a}}finally{e.state!==m&&e.state!==w&&(e.type==D||e.data&&e.data.isPeriodic?r&&e._transitionTo(_,b):(e.runCount=0,this._updateTaskCount(e,-1),r&&e._transitionTo(m,b,m))),O=O.parent,P=o}}},t.prototype.scheduleTask=function(e){if(e.zone&&e.zone!==this)for(var t=this;t;){if(t===e.zone)throw Error("can not reschedule task to "+this.name+" which is descendants of the original zone "+e.zone.name);t=t.parent}e._transitionTo(k,m);var n=[];e._zoneDelegates=n,e._zone=this;try{e=this._zoneDelegate.scheduleTask(this,e)}catch(r){throw e._transitionTo(w,k,m),this._zoneDelegate.handleError(this,r),r}return e._zoneDelegates===n&&this._updateTaskCount(e,1),e.state==k&&e._transitionTo(_,k),e},t.prototype.scheduleMicroTask=function(e,t,n,r){return this.scheduleTask(new l(E,e,t,n,r,void 0))},t.prototype.scheduleMacroTask=function(e,t,n,r,o){return this.scheduleTask(new l(S,e,t,n,r,o))},t.prototype.scheduleEventTask=function(e,t,n,r,o){return this.scheduleTask(new l(D,e,t,n,r,o))},t.prototype.cancelTask=function(e){if(e.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(e.zone||y).name+"; Execution: "+this.name+")");e._transitionTo(T,_,b);try{this._zoneDelegate.cancelTask(this,e)}catch(t){throw e._transitionTo(w,T),this._zoneDelegate.handleError(this,t),t}return this._updateTaskCount(e,-1),e._transitionTo(m,T),e.runCount=0,e},t.prototype._updateTaskCount=function(e,t){var n=e._zoneDelegates;-1==t&&(e._zoneDelegates=null);for(var r=0;r<n.length;r++)n[r]._updateTaskCount(e.type,t)},t.__symbol__=I,t}(),s={name:"",onHasTask:function(e,t,n,r){return e.hasTask(n,r)},onScheduleTask:function(e,t,n,r){return e.scheduleTask(n,r)},onInvokeTask:function(e,t,n,r,o,a){return e.invokeTask(n,r,o,a)},onCancelTask:function(e,t,n,r){return e.cancelTask(n,r)}},c=function(){function e(e,t,n){this._taskCounts={microTask:0,macroTask:0,eventTask:0},this.zone=e,this._parentDelegate=t,this._forkZS=n&&(n&&n.onFork?n:t._fLine truncated
|
||||
File renamed without changes.
@@ -1,6 +0,0 @@
|
||||
/*!
|
||||
* Bootstrap v4.3.1 (https://getbootstrap.com/)
|
||||
* Copyright 2011-2019 The Bootstrap Authors
|
||||
* Copyright 2011-2019 Twitter, Inc.
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||
*/:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}h1,h2,h3,h4,h5,h6{margin-top:0}dl,ol,p,ul{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote,figure{margin:0 0 1rem}b,strong{font-weight:bolder}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]),a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:dotted 1px;outline:-webkit-focus-ring-color auto 5px}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{box-sizing:content-box;height:0;overflow:visible;margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:Line truncated
|
||||
@@ -0,0 +1,6 @@
|
||||
/*!
|
||||
* Bootstrap v4.3.1 (https://getbootstrap.com/)
|
||||
* Copyright 2011-2019 The Bootstrap Authors
|
||||
* Copyright 2011-2019 Twitter, Inc.
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||
*/:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}h1,h2,h3,h4,h5,h6{margin-top:0}dl,ol,p,ul{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote,figure{margin:0 0 1rem}b,strong{font-weight:bolder}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]),a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:dotted 1px;outline:-webkit-focus-ring-color auto 5px}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{box-sizing:content-box;height:0;overflow:visible;margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:Line truncated
|
||||
@@ -253,5 +253,5 @@ class Hypervisor(UBridgeHypervisor):
|
||||
command = [self._path]
|
||||
command.extend(["-H", "{}:{}".format(self._host, self._port)])
|
||||
if log.getEffectiveLevel() == logging.DEBUG:
|
||||
command.extend(["-d", "2"])
|
||||
command.extend(["-d", "1"])
|
||||
return command
|
||||
@@ -23,7 +23,7 @@
|
||||
# or negative for a release candidate or beta (after the base version
|
||||
# number has been incremented)
|
||||
|
||||
__version__ = "2.2.0a5"
|
||||
__version__ = "2.2.0b3"
|
||||
__version_info__ = (2, 2, 0, -99)
|
||||
|
||||
# If it's a git checkout try to add the commit
|
||||
|
||||
@@ -21,6 +21,11 @@
|
||||
|
||||
import logging
|
||||
import sys
|
||||
import os
|
||||
import shutil
|
||||
import gzip
|
||||
|
||||
from logging.handlers import RotatingFileHandler
|
||||
|
||||
|
||||
class ColouredFormatter(logging.Formatter):
|
||||
@@ -108,9 +113,37 @@ class LogFilter:
|
||||
return 1
|
||||
|
||||
|
||||
def init_logger(level, logfile=None, quiet=False):
|
||||
class CompressedRotatingFileHandler(RotatingFileHandler):
|
||||
"""
|
||||
Custom rotating file handler with compression support.
|
||||
"""
|
||||
|
||||
def doRollover(self):
|
||||
if self.stream:
|
||||
self.stream.close()
|
||||
if self.backupCount > 0:
|
||||
for i in range(self.backupCount - 1, 0, -1):
|
||||
sfn = "%s.%d.gz" % (self.baseFilename, i)
|
||||
dfn = "%s.%d.gz" % (self.baseFilename, i + 1)
|
||||
if os.path.exists(sfn):
|
||||
if os.path.exists(dfn):
|
||||
os.remove(dfn)
|
||||
os.rename(sfn, dfn)
|
||||
dfn = self.baseFilename + ".1.gz"
|
||||
if os.path.exists(dfn):
|
||||
os.remove(dfn)
|
||||
with open(self.baseFilename, 'rb') as f_in, gzip.open(dfn, 'wb') as f_out:
|
||||
shutil.copyfileobj(f_in, f_out)
|
||||
self.mode = 'w'
|
||||
self.stream = self._open()
|
||||
|
||||
|
||||
def init_logger(level, logfile=None, max_bytes=10000000, backup_count=10, compression=True, quiet=False):
|
||||
if logfile and len(logfile) > 0:
|
||||
stream_handler = logging.FileHandler(logfile)
|
||||
if compression:
|
||||
stream_handler = CompressedRotatingFileHandler(logfile, maxBytes=max_bytes, backupCount=backup_count)
|
||||
else:
|
||||
stream_handler = RotatingFileHandler(logfile, maxBytes=max_bytes, backupCount=backup_count)
|
||||
stream_handler.formatter = ColouredFormatter("{asctime} {levelname} {filename}:{lineno} {message}", "%Y-%m-%d %H:%M:%S", "{")
|
||||
elif sys.platform.startswith("win"):
|
||||
stream_handler = WinStreamHandler(sys.stdout)
|
||||
|
||||
@@ -146,7 +146,7 @@ deb-src http://archive.ubuntu.com/ubuntu/ ${UBUNTU_CODENAME}-updates main univer
|
||||
EOFLIST2
|
||||
fi
|
||||
|
||||
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A2E3EF7B
|
||||
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys A2E3EF7B
|
||||
|
||||
log "Update system packages"
|
||||
apt-get update
|
||||
|
||||
@@ -62,6 +62,7 @@ def test_json(vm, project):
|
||||
'console_http_port': 80,
|
||||
'console_http_path': '/',
|
||||
'extra_hosts': None,
|
||||
'extra_volumes': [],
|
||||
'aux': vm.aux,
|
||||
'start_command': vm.start_command,
|
||||
'environment': vm.environment,
|
||||
@@ -98,7 +99,7 @@ def test_create(loop, project, manager):
|
||||
"CapAdd": ["ALL"],
|
||||
"Binds": [
|
||||
"{}:/gns3:ro".format(get_resource("compute/docker/resources")),
|
||||
"{}:/gns3volumes/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network"))
|
||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network"))
|
||||
],
|
||||
"Privileged": True
|
||||
},
|
||||
@@ -137,7 +138,7 @@ def test_create_with_tag(loop, project, manager):
|
||||
"CapAdd": ["ALL"],
|
||||
"Binds": [
|
||||
"{}:/gns3:ro".format(get_resource("compute/docker/resources")),
|
||||
"{}:/gns3volumes/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network"))
|
||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network"))
|
||||
],
|
||||
"Privileged": True
|
||||
},
|
||||
@@ -179,7 +180,7 @@ def test_create_vnc(loop, project, manager):
|
||||
"CapAdd": ["ALL"],
|
||||
"Binds": [
|
||||
"{}:/gns3:ro".format(get_resource("compute/docker/resources")),
|
||||
"{}:/gns3volumes/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network")),
|
||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network")),
|
||||
'/tmp/.X11-unix/:/tmp/.X11-unix/'
|
||||
],
|
||||
"Privileged": True
|
||||
@@ -295,7 +296,7 @@ def test_create_start_cmd(loop, project, manager):
|
||||
"CapAdd": ["ALL"],
|
||||
"Binds": [
|
||||
"{}:/gns3:ro".format(get_resource("compute/docker/resources")),
|
||||
"{}:/gns3volumes/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network"))
|
||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network"))
|
||||
],
|
||||
"Privileged": True
|
||||
},
|
||||
@@ -395,7 +396,7 @@ def test_create_image_not_available(loop, project, manager):
|
||||
"CapAdd": ["ALL"],
|
||||
"Binds": [
|
||||
"{}:/gns3:ro".format(get_resource("compute/docker/resources")),
|
||||
"{}:/gns3volumes/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network"))
|
||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network"))
|
||||
],
|
||||
"Privileged": True
|
||||
},
|
||||
@@ -438,7 +439,7 @@ def test_create_with_user(loop, project, manager):
|
||||
"CapAdd": ["ALL"],
|
||||
"Binds": [
|
||||
"{}:/gns3:ro".format(get_resource("compute/docker/resources")),
|
||||
"{}:/gns3volumes/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network"))
|
||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network"))
|
||||
],
|
||||
"Privileged": True
|
||||
},
|
||||
@@ -458,6 +459,324 @@ def test_create_with_user(loop, project, manager):
|
||||
})
|
||||
assert vm._cid == "e90e34656806"
|
||||
|
||||
def test_create_with_extra_volumes_invalid_format_1(loop, project, manager):
|
||||
|
||||
response = {
|
||||
"Id": "e90e34656806",
|
||||
"Warnings": []
|
||||
}
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images:
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock:
|
||||
vm = DockerVM("test", str(uuid.uuid4()), project, manager, "ubuntu:latest", extra_volumes=["vol1"])
|
||||
with pytest.raises(DockerError):
|
||||
loop.run_until_complete(asyncio.ensure_future(vm.create()))
|
||||
|
||||
def test_create_with_extra_volumes_invalid_format_2(loop, project, manager):
|
||||
|
||||
response = {
|
||||
"Id": "e90e34656806",
|
||||
"Warnings": []
|
||||
}
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images:
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock:
|
||||
vm = DockerVM("test", str(uuid.uuid4()), project, manager, "ubuntu:latest", extra_volumes=["/vol1", ""])
|
||||
with pytest.raises(DockerError):
|
||||
loop.run_until_complete(asyncio.ensure_future(vm.create()))
|
||||
|
||||
def test_create_with_extra_volumes_invalid_format_3(loop, project, manager):
|
||||
|
||||
response = {
|
||||
"Id": "e90e34656806",
|
||||
"Warnings": []
|
||||
}
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images:
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock:
|
||||
vm = DockerVM("test", str(uuid.uuid4()), project, manager, "ubuntu:latest", extra_volumes=["/vol1/.."])
|
||||
with pytest.raises(DockerError):
|
||||
loop.run_until_complete(asyncio.ensure_future(vm.create()))
|
||||
|
||||
def test_create_with_extra_volumes_duplicate_1_image(loop, project, manager):
|
||||
|
||||
response = {
|
||||
"Id": "e90e34656806",
|
||||
"Warnings": [],
|
||||
"Config" : {
|
||||
"Volumes" : {
|
||||
"/vol/1": None
|
||||
},
|
||||
},
|
||||
}
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images:
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock:
|
||||
vm = DockerVM("test", str(uuid.uuid4()), project, manager, "ubuntu:latest", extra_volumes=["/vol/1"])
|
||||
loop.run_until_complete(asyncio.ensure_future(vm.create()))
|
||||
mock.assert_called_with("POST", "containers/create", data={
|
||||
"Tty": True,
|
||||
"OpenStdin": True,
|
||||
"StdinOnce": False,
|
||||
"HostConfig":
|
||||
{
|
||||
"CapAdd": ["ALL"],
|
||||
"Binds": [
|
||||
"{}:/gns3:ro".format(get_resource("compute/docker/resources")),
|
||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network")),
|
||||
"{}:/gns3volumes/vol/1".format(os.path.join(vm.working_dir, "vol", "1")),
|
||||
],
|
||||
"Privileged": True
|
||||
},
|
||||
"Volumes": {},
|
||||
"NetworkDisabled": True,
|
||||
"Name": "test",
|
||||
"Hostname": "test",
|
||||
"Image": "ubuntu:latest",
|
||||
"Env": [
|
||||
"container=docker",
|
||||
"GNS3_MAX_ETHERNET=eth0",
|
||||
"GNS3_VOLUMES=/etc/network:/vol/1"
|
||||
],
|
||||
"Entrypoint": ["/gns3/init.sh"],
|
||||
"Cmd": ["/bin/sh"]
|
||||
})
|
||||
assert vm._cid == "e90e34656806"
|
||||
|
||||
def test_create_with_extra_volumes_duplicate_2_user(loop, project, manager):
|
||||
|
||||
response = {
|
||||
"Id": "e90e34656806",
|
||||
"Warnings": [],
|
||||
}
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images:
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock:
|
||||
vm = DockerVM("test", str(uuid.uuid4()), project, manager, "ubuntu:latest", extra_volumes=["/vol/1", "/vol/1"])
|
||||
loop.run_until_complete(asyncio.ensure_future(vm.create()))
|
||||
mock.assert_called_with("POST", "containers/create", data={
|
||||
"Tty": True,
|
||||
"OpenStdin": True,
|
||||
"StdinOnce": False,
|
||||
"HostConfig":
|
||||
{
|
||||
"CapAdd": ["ALL"],
|
||||
"Binds": [
|
||||
"{}:/gns3:ro".format(get_resource("compute/docker/resources")),
|
||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network")),
|
||||
"{}:/gns3volumes/vol/1".format(os.path.join(vm.working_dir, "vol", "1")),
|
||||
],
|
||||
"Privileged": True
|
||||
},
|
||||
"Volumes": {},
|
||||
"NetworkDisabled": True,
|
||||
"Name": "test",
|
||||
"Hostname": "test",
|
||||
"Image": "ubuntu:latest",
|
||||
"Env": [
|
||||
"container=docker",
|
||||
"GNS3_MAX_ETHERNET=eth0",
|
||||
"GNS3_VOLUMES=/etc/network:/vol/1"
|
||||
],
|
||||
"Entrypoint": ["/gns3/init.sh"],
|
||||
"Cmd": ["/bin/sh"]
|
||||
})
|
||||
assert vm._cid == "e90e34656806"
|
||||
|
||||
def test_create_with_extra_volumes_duplicate_3_subdir(loop, project, manager):
|
||||
|
||||
response = {
|
||||
"Id": "e90e34656806",
|
||||
"Warnings": [],
|
||||
}
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images:
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock:
|
||||
vm = DockerVM("test", str(uuid.uuid4()), project, manager, "ubuntu:latest", extra_volumes=["/vol/1/", "/vol"])
|
||||
loop.run_until_complete(asyncio.ensure_future(vm.create()))
|
||||
mock.assert_called_with("POST", "containers/create", data={
|
||||
"Tty": True,
|
||||
"OpenStdin": True,
|
||||
"StdinOnce": False,
|
||||
"HostConfig":
|
||||
{
|
||||
"CapAdd": ["ALL"],
|
||||
"Binds": [
|
||||
"{}:/gns3:ro".format(get_resource("compute/docker/resources")),
|
||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network")),
|
||||
"{}:/gns3volumes/vol".format(os.path.join(vm.working_dir, "vol")),
|
||||
],
|
||||
"Privileged": True
|
||||
},
|
||||
"Volumes": {},
|
||||
"NetworkDisabled": True,
|
||||
"Name": "test",
|
||||
"Hostname": "test",
|
||||
"Image": "ubuntu:latest",
|
||||
"Env": [
|
||||
"container=docker",
|
||||
"GNS3_MAX_ETHERNET=eth0",
|
||||
"GNS3_VOLUMES=/etc/network:/vol"
|
||||
],
|
||||
"Entrypoint": ["/gns3/init.sh"],
|
||||
"Cmd": ["/bin/sh"]
|
||||
})
|
||||
assert vm._cid == "e90e34656806"
|
||||
|
||||
def test_create_with_extra_volumes_duplicate_4_backslash(loop, project, manager):
|
||||
|
||||
response = {
|
||||
"Id": "e90e34656806",
|
||||
"Warnings": [],
|
||||
}
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images:
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock:
|
||||
vm = DockerVM("test", str(uuid.uuid4()), project, manager, "ubuntu:latest", extra_volumes=["/vol//", "/vol"])
|
||||
loop.run_until_complete(asyncio.ensure_future(vm.create()))
|
||||
mock.assert_called_with("POST", "containers/create", data={
|
||||
"Tty": True,
|
||||
"OpenStdin": True,
|
||||
"StdinOnce": False,
|
||||
"HostConfig":
|
||||
{
|
||||
"CapAdd": ["ALL"],
|
||||
"Binds": [
|
||||
"{}:/gns3:ro".format(get_resource("compute/docker/resources")),
|
||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network")),
|
||||
"{}:/gns3volumes/vol".format(os.path.join(vm.working_dir, "vol")),
|
||||
],
|
||||
"Privileged": True
|
||||
},
|
||||
"Volumes": {},
|
||||
"NetworkDisabled": True,
|
||||
"Name": "test",
|
||||
"Hostname": "test",
|
||||
"Image": "ubuntu:latest",
|
||||
"Env": [
|
||||
"container=docker",
|
||||
"GNS3_MAX_ETHERNET=eth0",
|
||||
"GNS3_VOLUMES=/etc/network:/vol"
|
||||
],
|
||||
"Entrypoint": ["/gns3/init.sh"],
|
||||
"Cmd": ["/bin/sh"]
|
||||
})
|
||||
assert vm._cid == "e90e34656806"
|
||||
|
||||
def test_create_with_extra_volumes_duplicate_5_subdir_issue_1595(loop, project, manager):
|
||||
|
||||
response = {
|
||||
"Id": "e90e34656806",
|
||||
"Warnings": [],
|
||||
}
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images:
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock:
|
||||
vm = DockerVM("test", str(uuid.uuid4()), project, manager, "ubuntu:latest", extra_volumes=["/etc"])
|
||||
loop.run_until_complete(asyncio.ensure_future(vm.create()))
|
||||
mock.assert_called_with("POST", "containers/create", data={
|
||||
"Tty": True,
|
||||
"OpenStdin": True,
|
||||
"StdinOnce": False,
|
||||
"HostConfig":
|
||||
{
|
||||
"CapAdd": ["ALL"],
|
||||
"Binds": [
|
||||
"{}:/gns3:ro".format(get_resource("compute/docker/resources")),
|
||||
"{}:/gns3volumes/etc".format(os.path.join(vm.working_dir, "etc")),
|
||||
],
|
||||
"Privileged": True
|
||||
},
|
||||
"Volumes": {},
|
||||
"NetworkDisabled": True,
|
||||
"Name": "test",
|
||||
"Hostname": "test",
|
||||
"Image": "ubuntu:latest",
|
||||
"Env": [
|
||||
"container=docker",
|
||||
"GNS3_MAX_ETHERNET=eth0",
|
||||
"GNS3_VOLUMES=/etc"
|
||||
],
|
||||
"Entrypoint": ["/gns3/init.sh"],
|
||||
"Cmd": ["/bin/sh"]
|
||||
})
|
||||
assert vm._cid == "e90e34656806"
|
||||
|
||||
def test_create_with_extra_volumes_duplicate_6_subdir_issue_1595(loop, project, manager):
|
||||
|
||||
response = {
|
||||
"Id": "e90e34656806",
|
||||
"Warnings": [],
|
||||
}
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images:
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock:
|
||||
vm = DockerVM("test", str(uuid.uuid4()), project, manager, "ubuntu:latest", extra_volumes=["/etc/test", "/etc"])
|
||||
loop.run_until_complete(asyncio.ensure_future(vm.create()))
|
||||
mock.assert_called_with("POST", "containers/create", data={
|
||||
"Tty": True,
|
||||
"OpenStdin": True,
|
||||
"StdinOnce": False,
|
||||
"HostConfig":
|
||||
{
|
||||
"CapAdd": ["ALL"],
|
||||
"Binds": [
|
||||
"{}:/gns3:ro".format(get_resource("compute/docker/resources")),
|
||||
"{}:/gns3volumes/etc".format(os.path.join(vm.working_dir, "etc")),
|
||||
],
|
||||
"Privileged": True
|
||||
},
|
||||
"Volumes": {},
|
||||
"NetworkDisabled": True,
|
||||
"Name": "test",
|
||||
"Hostname": "test",
|
||||
"Image": "ubuntu:latest",
|
||||
"Env": [
|
||||
"container=docker",
|
||||
"GNS3_MAX_ETHERNET=eth0",
|
||||
"GNS3_VOLUMES=/etc"
|
||||
],
|
||||
"Entrypoint": ["/gns3/init.sh"],
|
||||
"Cmd": ["/bin/sh"]
|
||||
})
|
||||
assert vm._cid == "e90e34656806"
|
||||
|
||||
def test_create_with_extra_volumes(loop, project, manager):
|
||||
|
||||
response = {
|
||||
"Id": "e90e34656806",
|
||||
"Warnings": [],
|
||||
"Config" : {
|
||||
"Volumes" : {
|
||||
"/vol/1": None
|
||||
},
|
||||
},
|
||||
}
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images:
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock:
|
||||
vm = DockerVM("test", str(uuid.uuid4()), project, manager, "ubuntu:latest", extra_volumes=["/vol/2"])
|
||||
loop.run_until_complete(asyncio.ensure_future(vm.create()))
|
||||
mock.assert_called_with("POST", "containers/create", data={
|
||||
"Tty": True,
|
||||
"OpenStdin": True,
|
||||
"StdinOnce": False,
|
||||
"HostConfig":
|
||||
{
|
||||
"CapAdd": ["ALL"],
|
||||
"Binds": [
|
||||
"{}:/gns3:ro".format(get_resource("compute/docker/resources")),
|
||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network")),
|
||||
"{}:/gns3volumes/vol/1".format(os.path.join(vm.working_dir, "vol", "1")),
|
||||
"{}:/gns3volumes/vol/2".format(os.path.join(vm.working_dir, "vol", "2")),
|
||||
],
|
||||
"Privileged": True
|
||||
},
|
||||
"Volumes": {},
|
||||
"NetworkDisabled": True,
|
||||
"Name": "test",
|
||||
"Hostname": "test",
|
||||
"Image": "ubuntu:latest",
|
||||
"Env": [
|
||||
"container=docker",
|
||||
"GNS3_MAX_ETHERNET=eth0",
|
||||
"GNS3_VOLUMES=/etc/network:/vol/1:/vol/2"
|
||||
],
|
||||
"Entrypoint": ["/gns3/init.sh"],
|
||||
"Cmd": ["/bin/sh"]
|
||||
})
|
||||
assert vm._cid == "e90e34656806"
|
||||
|
||||
def test_get_container_state(loop, vm):
|
||||
response = {
|
||||
"State": {
|
||||
@@ -660,7 +979,7 @@ def test_update(loop, vm):
|
||||
"CapAdd": ["ALL"],
|
||||
"Binds": [
|
||||
"{}:/gns3:ro".format(get_resource("compute/docker/resources")),
|
||||
"{}:/gns3volumes/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network"))
|
||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network"))
|
||||
],
|
||||
"Privileged": True
|
||||
},
|
||||
@@ -729,7 +1048,7 @@ def test_update_running(loop, vm):
|
||||
"CapAdd": ["ALL"],
|
||||
"Binds": [
|
||||
"{}:/gns3:ro".format(get_resource("compute/docker/resources")),
|
||||
"{}:/gns3volumes/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network"))
|
||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network"))
|
||||
],
|
||||
"Privileged": True
|
||||
},
|
||||
@@ -1003,7 +1322,7 @@ def test_mount_binds(vm, tmpdir):
|
||||
dst = os.path.join(vm.working_dir, "test/experimental")
|
||||
assert vm._mount_binds(image_infos) == [
|
||||
"{}:/gns3:ro".format(get_resource("compute/docker/resources")),
|
||||
"{}:/gns3volumes/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network")),
|
||||
"{}:/gns3volumes/etc/network".format(os.path.join(vm.working_dir, "etc", "network")),
|
||||
"{}:/gns3volumes{}".format(dst, "/test/experimental")
|
||||
]
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ import pytest
|
||||
import shutil
|
||||
import asyncio
|
||||
|
||||
from gns3server.compute.qemu.qcow2 import Qcow2, Qcow2Error
|
||||
from gns3server.compute.qemu.utils.qcow2 import Qcow2, Qcow2Error
|
||||
|
||||
|
||||
def qemu_img():
|
||||
|
||||
@@ -97,7 +97,7 @@ def test_vm_create(loop, tmpdir, project, manager, fake_qemu_binary):
|
||||
f.write('hello')
|
||||
|
||||
vm = QemuVM("test", "00010203-0405-0607-0809-0a0b0c0d0e0f", project, manager, qemu_path=fake_qemu_binary)
|
||||
vm._hda_disk_image = fake_img
|
||||
vm._hda_disk_image = fake_img
|
||||
|
||||
loop.run_until_complete(asyncio.ensure_future(vm.create()))
|
||||
|
||||
|
||||
@@ -106,97 +106,6 @@ def test_import_computes_1_x(controller, controller_config_path, async_run):
|
||||
assert compute.password is None
|
||||
|
||||
|
||||
def test_import_gns3vm_1_x(controller, controller_config_path, async_run):
|
||||
"""
|
||||
At first start the server should import the
|
||||
gns3vm settings from the gns3_gui 1.X
|
||||
"""
|
||||
gns3_gui_conf = {
|
||||
"Servers": {
|
||||
"vm": {
|
||||
"adjust_local_server_ip": True,
|
||||
"auto_start": True,
|
||||
"auto_stop": False,
|
||||
"headless": True,
|
||||
"remote_vm_host": "",
|
||||
"remote_vm_password": "",
|
||||
"remote_vm_port": 3080,
|
||||
"remote_vm_protocol": "http",
|
||||
"remote_vm_url": "",
|
||||
"remote_vm_user": "",
|
||||
"virtualization": "VMware",
|
||||
"vmname": "GNS3 VM",
|
||||
"vmx_path": "/Users/joe/Documents/Virtual Machines.localized/GNS3 VM.vmwarevm/GNS3 VM.vmx"
|
||||
}
|
||||
}
|
||||
}
|
||||
config_dir = os.path.dirname(controller_config_path)
|
||||
os.makedirs(config_dir, exist_ok=True)
|
||||
with open(os.path.join(config_dir, "gns3_gui.conf"), "w+") as f:
|
||||
json.dump(gns3_gui_conf, f)
|
||||
|
||||
controller.gns3vm.settings["engine"] = None
|
||||
async_run(controller._load_controller_settings())
|
||||
assert controller.gns3vm.settings["engine"] == "vmware"
|
||||
assert controller.gns3vm.settings["enable"]
|
||||
assert controller.gns3vm.settings["headless"]
|
||||
assert controller.gns3vm.settings["when_exit"] == "keep"
|
||||
assert controller.gns3vm.settings["vmname"] == "GNS3 VM"
|
||||
|
||||
|
||||
def test_import_remote_gns3vm_1_x(controller, controller_config_path, async_run):
|
||||
"""
|
||||
At first start the server should import the
|
||||
computes and remote GNS3 VM from the gns3_gui 1.X
|
||||
"""
|
||||
gns3_gui_conf = {
|
||||
"Servers": {
|
||||
"remote_servers": [
|
||||
{
|
||||
"host": "127.0.0.1",
|
||||
"password": "",
|
||||
"port": 3080,
|
||||
"protocol": "http",
|
||||
"url": "http://127.0.0.1:3080",
|
||||
"user": ""
|
||||
},
|
||||
{
|
||||
"host": "127.0.0.1",
|
||||
"password": "",
|
||||
"port": 3081,
|
||||
"protocol": "http",
|
||||
"url": "http://127.0.0.1:3081",
|
||||
"user": ""
|
||||
}
|
||||
],
|
||||
"vm": {
|
||||
"adjust_local_server_ip": True,
|
||||
"auto_start": True,
|
||||
"auto_stop": False,
|
||||
"headless": True,
|
||||
"remote_vm_host": "127.0.0.1",
|
||||
"remote_vm_password": "",
|
||||
"remote_vm_port": 3081,
|
||||
"remote_vm_protocol": "http",
|
||||
"remote_vm_url": "http://127.0.0.1:3081",
|
||||
"remote_vm_user": "",
|
||||
"virtualization": "remote",
|
||||
"vmname": "GNS3 VM",
|
||||
"vmx_path": "/Users/joe/Documents/Virtual Machines.localized/GNS3 VM.vmwarevm/GNS3 VM.vmx"
|
||||
}
|
||||
}
|
||||
}
|
||||
config_dir = os.path.dirname(controller_config_path)
|
||||
os.makedirs(config_dir, exist_ok=True)
|
||||
with open(os.path.join(config_dir, "gns3_gui.conf"), "w+") as f:
|
||||
json.dump(gns3_gui_conf, f)
|
||||
|
||||
with asyncio_patch("gns3server.controller.compute.Compute.connect"):
|
||||
async_run(controller._load_controller_settings())
|
||||
assert controller.gns3vm.settings["engine"] == "remote"
|
||||
assert controller.gns3vm.settings["vmname"] == "http://127.0.0.1:3081"
|
||||
|
||||
|
||||
def test_load_projects(controller, projects_dir, async_run):
|
||||
controller.save()
|
||||
|
||||
|
||||
@@ -405,8 +405,8 @@ def test_start_iou(compute, project, async_run, controller):
|
||||
compute.post = AsyncioMagicMock()
|
||||
|
||||
# Without licence configured it should raise an error
|
||||
with pytest.raises(aiohttp.web.HTTPConflict):
|
||||
async_run(node.start())
|
||||
#with pytest.raises(aiohttp.web.HTTPConflict):
|
||||
# async_run(node.start())
|
||||
|
||||
controller._iou_license_settings = {"license_check": True, "iourc_content": "aa"}
|
||||
async_run(node.start())
|
||||
|
||||
@@ -811,7 +811,7 @@ def test_ethernet_switch_template_create(http_controller):
|
||||
"builtin": False,
|
||||
"category": "switch",
|
||||
"compute_id": "local",
|
||||
"console_type": "telnet",
|
||||
"console_type": "none",
|
||||
"default_name_format": "Switch{0}",
|
||||
"name": "Ethernet switch template",
|
||||
"ports_mapping": [{"ethertype": "",
|
||||
|
||||
@@ -28,6 +28,7 @@ import shutil
|
||||
|
||||
|
||||
from gns3server.controller.topology import load_topology, GNS3_FILE_FORMAT_REVISION
|
||||
from gns3server.version import __version__
|
||||
|
||||
topologies_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)), "topologies")
|
||||
|
||||
@@ -104,7 +105,7 @@ def compare_dict(path, source, reference):
|
||||
"""
|
||||
assert isinstance(source, dict), "Source is not a dict in {}".format(path)
|
||||
for key in source:
|
||||
assert key in reference, "Unexcepted {} in {} it should be {}".format(key, source, reference)
|
||||
assert key in reference, "Unexpected {} in {} it should be {}".format(key, source, reference)
|
||||
for key in sorted(reference.keys()):
|
||||
val = reference[key]
|
||||
assert key in source, "{} is missing in {}".format(key, source)
|
||||
@@ -113,10 +114,12 @@ def compare_dict(path, source, reference):
|
||||
pass
|
||||
elif val == "ANYUUID" and len(source[key]) == 36:
|
||||
pass
|
||||
# We test that the revision number has been bumpd to last version. This avoid modifying all the tests
|
||||
# We test that the revision number has been bumped to last version. This avoid modifying all the tests
|
||||
# at each new revision bump.
|
||||
elif key == "revision":
|
||||
assert source[key] == GNS3_FILE_FORMAT_REVISION
|
||||
elif key == "version":
|
||||
assert source[key] == __version__
|
||||
else:
|
||||
assert val == source[key], "Wrong value for {}: \n{}\nit should be\n{}".format(key, source[key], val)
|
||||
elif isinstance(val, dict):
|
||||
|
||||
Reference in new issue
Block a user