Compare commits

..
46 Commits
Author SHA1 Message Date
grossmj d8054c7cb4 Release v2.2.19 2021-03-05 14:51:03 +10:30
grossmj 91570f475f Launch projects marked for auto open after SIGHUP is received 2021-03-05 14:47:20 +10:30
grossmj 42cda3af2b Sync appliance files. 2021-03-05 14:46:20 +10:30
grossmj e6be6bc958 Merge branch 'master' into 2.2 2021-03-02 17:18:24 +10:30
grossmj b7f8fb283b Sync appliance files. 2021-03-02 17:09:28 +10:30
piotrpekala7 72d5b5e7cc Release web UI 2.2.19 2021-03-02 00:31:54 +01:00
grossmj 8cce0eedee Fix console type error when creating Ethernet switch node. Fixes #1873 2021-03-01 13:55:52 +10:30
grossmj 11c53c128e Sync Juniper vSRX appliance file. 2021-02-24 14:28:12 +10:30
grossmj 17b56ac7cb Sync appliance files. 2021-02-24 14:08:13 +10:30
grossmj aca7344212 Upgrade Jinja to version 2.11.3. Fixes #1865 2021-02-17 17:23:04 +10:30
grossmj 3c5bbe04dc Development on 2.2.19dev1 2021-02-16 20:44:58 +10:30
grossmj c213cae500 Release v2.2.18 2021-02-16 19:09:46 +10:30
grossmj 1043be02a6 Merge branch 'master' into 2.2
# Conflicts:
#	gns3server/compute/qemu/qemu_vm.py
2021-02-16 19:02:12 +10:30
grossmj 56c25727b6 SIGHUP: remove projects with an empty project directory. 2021-02-16 17:00:59 +10:30
grossmj 0b854ffceb Bump version to 2.2.18dev2 2021-02-16 16:35:26 +10:30
piotrpekala7 366e904698 Release web UI 2.2.18 2021-02-15 23:55:14 +01:00
grossmj 16c84e23a9 Catch OSError exception in psutil. Fixes https://github.com/GNS3/gns3-gui/issues/3127 2021-02-15 15:57:24 +10:30
grossmj 64f172fe20 Expose 'auto_open' and 'auto_start' properties in API when creating project. Fixes https://github.com/GNS3/gns3-gui/issues/3119 2021-02-15 15:16:19 +10:30
Jeremy Grossmann bb0206d7d2 Add mtools package information. Ref https://github.com/GNS3/gns3-gui/issues/3076 2021-02-14 14:55:37 +10:30
grossmj 9de61cd671 Fix warning: 'ide-drive' is deprecated when using recent version of Qemu. Fixes https://github.com/GNS3/gns3-gui/issues/3101 2021-02-14 14:39:02 +10:30
grossmj 9e6ccc3f61 Fix bug when starting of vpcs stopped with "quit". Fixes https://github.com/GNS3/gns3-gui/issues/3110 2021-02-14 13:50:10 +10:30
grossmj 4c339eade1 Fix WinError 0 handling 2021-01-27 21:47:14 +10:30
grossmj 128e494134 Stop uBridge if VPCS node has been terminated. Ref https://github.com/GNS3/gns3-gui/issues/3110 2021-01-27 21:03:19 +10:30
Jeremy Grossmann 0e6b97b27b Merge pull request #1856 from BrentBaccala/master
Allow cloned QEMU disk images to be resized before the node starts
2021-01-10 16:57:10 +10:00
Brent Baccala 235a127111 Allow cloned QEMU disk images to be resized before the node starts,
by cloning the disk image in response to a resize request instead
of waiting until the node starts.
2020-12-30 15:36:38 -05:00
Jeremy Grossmann bb51146e80 Merge pull request #1852 from joyme123/update-python-version
fix(readme): update python version from 3.5.3 to 3.6
2020-12-23 14:39:08 +10:30
Pengfei Jiang e6944276a6 fix(readme): update python version from 3.5.3 to 3.6 2020-12-23 11:33:20 +08:00
Jeremy Grossmann 704858fd8d Merge pull request #1847 from b-ehlers/QemuConfig
Add Qemu config disk
2020-12-14 14:22:25 +10:30
grossmj 87ede50827 Development on 2.2.18dev1 2020-12-04 18:10:11 +10:30
Bernhard Ehlers e45bc5aec1 Fix mcopy error messages 2020-11-05 15:00:44 +01:00
Bernhard Ehlers de2b9caeeb Use HDD disk image as startup QEMU config disk 2020-10-19 03:19:22 +02:00
grossmj 4843084158 Prioritize the config disk over HD-D for Qemu VMs.
Fixes https://github.com/GNS3/gns3-gui/issues/3036

(cherry picked from commit c12b675691)
2020-08-18 10:54:11 +09:30
Jeremy Grossmann 01db2d2a86 Create config disk property false by default for Qemu templates
Ref https://github.com/GNS3/gns3-gui/issues/3035

(cherry picked from commit a2e884e315)
2020-08-17 12:45:57 +09:30
grossmj f2ddef855f Fix tests.
(cherry picked from commit 620d93634e)
2020-08-15 16:35:31 +09:30
grossmj ec02150fd2 Set default disk interface type to "none".
Fail-safe: use "ide" if an image is set but no interface type is configured.
Use the HDA disk interface type if none has been configured for HDD.

(cherry picked from commit 464fd804ce)
2020-08-15 16:14:16 +09:30
grossmj a56b816c1a Add explicit option to automatically create or not the config disk. Off by default.
(cherry picked from commit 56aba96a5f)
2020-08-14 17:57:24 +09:30
grossmj 9d3f7c79a2 Fix more tests
(cherry picked from commit 546982d1ea)
2020-08-13 17:18:45 +09:30
grossmj c684c554bf Fix tests
(cherry picked from commit 2ba6eac113)
2020-08-13 17:10:31 +09:30
Bernhard Ehlers 9acb2ceda1 QEMU config disk - improve error handling
(cherry picked from commit 068c31038f)
2020-07-03 11:31:17 +02:00
Bernhard Ehlers 053828f3e8 QEMU config disk - init config disk in base class
(cherry picked from commit 2bbee15b18)
2020-06-28 16:35:39 +02:00
Bernhard Ehlers f747b3a880 QEMU config disk - notification of import/export errors
(cherry picked from commit 50c49cfedb)
2020-06-28 09:21:57 +02:00
Bernhard Ehlers 750590d0db QEMU config disk - use disk interface of HD-D, fallback is HD-A
(cherry picked from commit b672900406)
2020-06-17 17:06:55 +02:00
Bernhard Ehlers 347035a99b QEMU config disk - add missing config disk to image directory
(cherry picked from commit 2e0fba925b)
2020-04-16 11:07:56 +02:00
Bernhard Ehlers 0db0f6256b QEMU config disk - get rid of mtoolsrc
(cherry picked from commit 450c6cddc7)
2020-04-15 20:50:59 +02:00
Bernhard Ehlers 99d9728360 QEMU config disk - preserve file timestamp on zip unpack
(cherry picked from commit 5c44268476)
2020-04-07 14:11:00 +02:00
Bernhard Ehlers 6a1eef0627 QEMU config disk - initial implementation. Ref #2958
(cherry picked from commit b69965791d)
2020-04-06 12:56:00 +02:00
56 changed files with 1583 additions and 191 deletions

No files matched your search

+27
View File
@@ -1,5 +1,32 @@
# Change Log
## 2.2.19 05/03/2021
* Launch projects marked for auto open after SIGHUP is received
* Release Web UI 2.2.19
* Fix console type error when creating Ethernet switch node. Fixes #1873
* Upgrade Jinja to version 2.11.3. Fixes #1865
## 2.2.18 16/02/2021
* SIGHUP: remove projects with an empty project directory.
* Release Web UI 2.2.18
* Catch OSError exception in psutil. Fixes https://github.com/GNS3/gns3-gui/issues/3127
* Expose 'auto_open' and 'auto_start' properties in API when creating project. Fixes https://github.com/GNS3/gns3-gui/issues/3119
* Add mtools package information. Ref https://github.com/GNS3/gns3-gui/issues/3076
* Fix warning: 'ide-drive' is deprecated when using recent version of Qemu. Fixes https://github.com/GNS3/gns3-gui/issues/3101
* Fix bug when starting of vpcs stopped with "quit". Fixes https://github.com/GNS3/gns3-gui/issues/3110
* Fix WinError 0 handling
* Stop uBridge if VPCS node has been terminated. Ref https://github.com/GNS3/gns3-gui/issues/3110
* Allow cloned QEMU disk images to be resized before the node starts, by cloning the disk image in response to a resize request instead of waiting until the node starts.
* Fix(readme): update python version from 3.5.3 to 3.6
* Use HDD disk image as startup QEMU config disk
* Create config disk property false by default for Qemu templates
* Set default disk interface type to "none".
* Add explicit option to automatically create or not the config disk. Off by default.
* QEMU config disk support
## 2.2.17 04/12/2020
* Close and remove projects deleted from disks after SIGHUP signal is received.
+3 -2
View File
@@ -24,8 +24,9 @@ In addition of Python dependencies listed in a section below, other software may
* `Dynamips <https://github.com/GNS3/dynamips/>`_ is required for running IOS routers (using real IOS images) as well as the internal switches and hubs.
* `VPCS <https://github.com/GNS3/vpcs/>`_ is recommended, it is a builtin node simulating a very simple computer to perform connectitivy tests using ping, traceroute etc.
* Qemu is strongly recommended on Linux, as most node types are based on Qemu, for example Cisco IOSv and Arista vEOS.
* libvirt is recommended (Linux only), as it's needed for the NAT cloud
* libvirt is recommended (Linux only), as it's needed for the NAT cloud.
* Docker is optional (Linux only), some nodes are based on Docker.
* mtools is recommended to support data transfer to/from QEMU VMs using virtual disks.
* i386-libraries of libc and libcrypto are optional (Linux only), they are only needed to run IOU based nodes.
Branches
@@ -59,7 +60,7 @@ You must be connected to the Internet in order to install the dependencies.
Dependencies:
- Python 3.5.3, setuptools and the ones listed `here <https://github.com/GNS3/gns3-server/blob/master/requirements.txt>`_
- Python 3.6, setuptools and the ones listed `here <https://github.com/GNS3/gns3-server/blob/master/requirements.txt>`_
The following commands will install some of these dependencies:
+59
View File
@@ -0,0 +1,59 @@
{
"name": "Aruba VGW",
"category": "firewall",
"description": "Aruba Virtual Gateways allow customers to bring their public cloud infrastructure to the SD-WAN fabric and facilitate connectivity between branches and the public cloud.",
"vendor_name": "HPE Aruba",
"vendor_url": "arubanetworks.com",
"documentation_url": "https://asp.arubanetworks.com/downloads;products=Aruba%20SD-WAN",
"product_url": "https://www.arubanetworks.com/products/networking/gateways-and-controllers/",
"product_name": "Aruba SD-WAN Virtual Gateway",
"registry_version": 4,
"status": "stable",
"availability": "service-contract",
"maintainer": "Aruba",
"maintainer_email": "mitchell.pompe@hpe.com",
"usage": "The device must receive an user-data.iso image, which can be mounted to the CD/DVD-ROM and retrieved from Aruba Central. https://help.central.arubanetworks.com/latest/documentation/online_help/content/gateways/vgw/vgw_man-esxi-gen-ud.htm . By default the VGW can be used with VNC, but once provisioned the command '#serial console redirect enable' will enable telnet usage for GNS3.",
"symbol": ":/symbols/classic/gateway.svg",
"first_port_name": "mgmt",
"port_name_format": "GE0/0/{0}",
"qemu": {
"adapter_type": "e1000",
"adapters": 4,
"ram": 4096,
"cpus": 3,
"hda_disk_interface": "ide",
"hdb_disk_interface": "ide",
"hdc_disk_interface": "ide",
"arch": "x86_64",
"console_type": "vnc",
"kernel_command_line": "",
"kvm": "require",
"options": "-smp cores=3,threads=1,sockets=1 -cpu host",
"process_priority": "normal"
},
"images": [
{
"filename": "ArubaOS_VGW_8.6.0.4-2.2.0.0_76905-disk1.vmdk",
"version": "8.6.0.4-2.2.0.0",
"md5sum": "24d3fdcbec01c1faa2d4e68659024b40",
"filesize": 226974208,
"download_url": "https://asp.arubanetworks.com/downloads"
},
{
"filename": "ArubaOS_VGW_8.6.0.4-2.2.0.0_76905-disk2.vmdk",
"version": "8.6.0.4-2.2.0.0",
"md5sum": "354edd27dc320c739919f55766737d06",
"filesize": 4203008,
"download_url": "https://asp.arubanetworks.com/downloads"
}
],
"versions": [
{
"name": "8.6.0.4-2.2.0.0",
"images": {
"hda_disk_image": "ArubaOS_VGW_8.6.0.4-2.2.0.0_76905-disk1.vmdk",
"hdb_disk_image": "ArubaOS_VGW_8.6.0.4-2.2.0.0_76905-disk2.vmdk"
}
}
]
}
+14
View File
@@ -31,6 +31,13 @@
"download_url": "https://sourceforge.net/projects/gns-3/files",
"direct_download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/IOSv_startup_config.img/download"
},
{
"filename": "vios-adventerprisek9-m.spa.158-3.m2.qcow2",
"version": "15.8(3)M2",
"md5sum": "40e3d25b5b0cb13d639fcd2cf18e9965",
"filesize": 57129984,
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
},
{
"filename": "vios-adventerprisek9-m.vmdk.SPA.157-3.M3",
"version": "15.7(3)M3",
@@ -61,6 +68,13 @@
}
],
"versions": [
{
"name": "15.8(3)M2",
"images": {
"hda_disk_image": "vios-adventerprisek9-m.spa.158-3.m2.qcow2",
"hdb_disk_image": "IOSv_startup_config.img"
}
},
{
"name": "15.7(3)M3",
"images": {
+1 -2
View File
@@ -20,8 +20,7 @@
"hda_disk_interface": "virtio",
"arch": "x86_64",
"console_type": "telnet",
"kvm": "require",
"options": "-machine pc-q35-4.2"
"kvm": "require"
},
"images": [
{
+13
View File
@@ -26,6 +26,13 @@
"options": "-cpu core2duo"
},
"images": [
{
"filename": "EXOS-VM_v31.1.1.3.qcow2",
"version": "31.1.1.3",
"md5sum": "e4936ad94a5304bfeeca8dfc6f285cc0",
"filesize": 561512448,
"direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_EXOS/EXOS-VM_v31.1.1.3.qcow2"
},
{
"filename": "EXOS-VM_v30.7.1.1.qcow2",
"version": "30.7.1.1",
@@ -91,6 +98,12 @@
}
],
"versions": [
{
"name": "31.1.1.3",
"images": {
"hda_disk_image": "EXOS-VM_v31.1.1.3.qcow2"
}
},
{
"name": "30.7.1.1",
"images": {
@@ -27,6 +27,13 @@
},
"images": [
{
"filename": "VOSSGNS3.8.3.0.0.qcow2",
"version": "v8.3.0.0",
"md5sum": "e1c789e439c5951728e349cf44690230",
"filesize": 384696320,
"direct_download_url": "https://akamai-ep.extremenetworks.com/Extreme_P/github-en/Virtual_VOSS/VOSSGNS3.8.3.0.0.qcow2"
},
{
"filename": "VOSSGNS3.8.2.0.0.qcow2",
"version": "v8.2.0.0",
"md5sum": "9a0cd77c08644abbf3a69771c125c011",
@@ -64,6 +71,12 @@
],
"versions": [
{
"name": "v8.3.0.0",
"images": {
"hda_disk_image": "VOSSGNS3.8.3.0.0.qcow2"
}
},
{
"name": "v8.2.0.0",
"images": {
"hda_disk_image": "VOSSGNS3.8.2.0.0.qcow2"
+1 -1
View File
@@ -30,7 +30,7 @@
{
"filename": "BIGIP-16.0.0.1-0.0.3.qcow2",
"version": "16.0.0.1",
"md5sum": "95ff618b7d0b53c4252299cd49b0e564",
"md5sum": "f153120d46e84c018c8ff78c6c7164bc",
"filesize": 5393088512,
"download_url": "https://downloads.f5.com/esd/serveDownload.jsp?path=/big-ip/big-ip_v16.x/16.0.0/english/16.0.0.1_virtual-edition/&sw=BIG-IP&pro=big-ip_v16.x&ver=16.0.0&container=16.0.0.1_Virtual-Edition&file=BIGIP-16.0.0.1-0.0.3.ALL.qcow2.zip"
},
+44
View File
@@ -0,0 +1,44 @@
{
"name": "HuaWei AR1000v",
"category": "router",
"description": "Huawei AR1000V Virtual Router (Virtual CPE, vCPE) is an NFV product based on the industry-leading Huawei VRP platform. The product has rich business capabilities, integrating routing, switching, security, VPN, QoS and other functions, with software and hardware decoupling, Features such as easy business deployment and intelligent operation and maintenance can be applied to scenarios such as enterprise interconnection (SD-WAN) corporate headquarters (Hub point), POP point access, and cloud access.",
"vendor_name": "HuaWei",
"vendor_url": "https://www.huawei.com",
"product_name": "HuaWei AR1000v",
"product_url": "https://support.huawei.com/enterprise/en/routers/ar1000v-pid-21768212",
"registry_version": 5,
"status": "experimental",
"availability": "service-contract",
"maintainer": "none",
"maintainer_email": "none",
"usage": "Default user is super, default password is super.",
"port_name_format": "GigabitEthernet0/0/{0}",
"qemu": {
"adapter_type": "virtio-net-pci",
"adapters": 6,
"ram": 4096,
"cpus": 1,
"arch": "x86_64",
"console_type": "telnet",
"boot_priority": "cd",
"kvm": "require",
"options": "-machine type=pc,accel=kvm -vga std -usbdevice tablet -cpu host"
},
"images": [
{
"filename": "ar1k-V300R019C00SPC300.qcow2",
"version": "V300R019C00SPC300",
"md5sum": "5263e1d8964643a22c87f59ff14a5bdc",
"filesize": 534904832,
"download_url": "https://support.huawei.com/enterprise/en/routers/ar1000v-pid-21768212/software"
}
],
"versions": [
{
"name": "V300R019C00SPC300",
"images": {
"hda_disk_image": "ar1k-V300R019C00SPC300.qcow2"
}
}
]
}
@@ -0,0 +1,42 @@
{
"name": "HuaWei CE12800",
"category": "multilayer_switch",
"description": "CE12800 series switches are high-performance core switches designed for data center networks and high-end campus networks. The switches provide stable, reliable, secure, and high-performance Layer 2/Layer 3 switching services, to help build an elastic, virtualized, agile, and high-quality network.",
"vendor_name": "HuaWei",
"vendor_url": "https://www.huawei.com",
"product_name": "HuaWei CE12800",
"registry_version": 5,
"status": "experimental",
"availability": "service-contract",
"maintainer": "none",
"maintainer_email": "none",
"port_name_format": "GE1/0/{0}",
"qemu": {
"adapter_type": "e1000",
"adapters": 12,
"ram": 2048,
"cpus": 2,
"hda_disk_interface": "ide",
"arch": "x86_64",
"console_type": "telnet",
"kvm": "require",
"options": "-machine type=pc-1.0,accel=kvm -serial mon:stdio -nographic -nodefaults -rtc base=utc -cpu host"
},
"images": [
{
"filename": "ce12800-V200R005C10SPC607B607.qcow2",
"version": "V200R005C10SPC607B607",
"md5sum": "a6f2b358b299e2b5f0da2820ef315368",
"filesize": 707002368,
"download_url": "https://support.huawei.com/enterprise/en/switches/cloudengine-12800-pid-7542409/software"
}
],
"versions": [
{
"images": {
"hda_disk_image": "ce12800-V200R005C10SPC607B607.qcow2"
},
"name": "V200R005C10SPC607B607"
}
]
}
+44
View File
@@ -0,0 +1,44 @@
{
"name": "HuaWei NE40E",
"category": "router",
"description": "Based on a 2T platform, the NetEngine 40E-X series provides the industry\u2019s highest capacity 2T routing line cards. Combining performance with low power consumption, innovative Internet Protocol (IP) hard pipe technology, and quick evolution capabilities, NetEngine 40E-X routers meet the low latency and high reliability requirements of business-critical services as well as mature Wide Area Network (WAN) Software-Defined Networking (SDN) solutions. They can serve as core nodes on enterprise WANs, access nodes on large-scale enterprise networks, interconnection and aggregation nodes on campus networks, and edge nodes on large-scale Internet Data Center (IDC) networks.",
"vendor_name": "HuaWei",
"vendor_url": "https://www.huawei.com",
"product_name": "HuaWei NE40E",
"product_url": "https://e.huawei.com/en/products/enterprise-networking/routers/ne/ne40e",
"registry_version": 5,
"status": "experimental",
"availability": "service-contract",
"maintainer": "none",
"maintainer_email": "none",
"first_port_name": "eth0",
"port_name_format": "Ethernet1/0/{0}",
"qemu": {
"adapter_type": "e1000",
"adapters": 12,
"ram": 2048,
"cpus": 2,
"hda_disk_interface": "ide",
"arch": "x86_64",
"console_type": "telnet",
"kvm": "require",
"options": "-machine type=pc-1.0,accel=kvm -serial mon:stdio -nographic -nodefaults -rtc base=utc -cpu host"
},
"images": [
{
"filename": "ne40e-V800R011C00SPC607B607.qcow2",
"version": "V800R011C00SPC607B607",
"md5sum": "2ac9c477e22a17860b76b3dc1d5aa119",
"filesize": 496959488,
"download_url": "https://support.huawei.com/enterprise/en/routers/ne40e-pid-15837/software"
}
],
"versions": [
{
"images": {
"hda_disk_image": "ne40e-V800R011C00SPC607B607.qcow2"
},
"name": "V800R011C00SPC607B607"
}
]
}
+49
View File
@@ -0,0 +1,49 @@
{
"name": "HuaWei USG6000v",
"category": "firewall",
"description": "Huawei USG6000V is a virtual service gateway based on Network Functions Virtualization (NFV). It features high virtual resource usage and provides virtualized gateway services, such as vFW, vIPsec, vLB, vIPS, vAV, and vURL Remote Query.\nHuawei USG6000V is compatible with most mainstream virtual platforms. It provides standard APIs, together with the OpenStack cloud platform, SDN Controller, and MANO to achieve intelligent solutions for cloud security. This gateway meets flexible service customization requirements for frequent security service changes, elastic and on-demand resource allocation, visualized network management, and rapid rollout.",
"vendor_name": "HuaWei",
"vendor_url": "https://www.huawei.com",
"product_name": "HuaWei USG6000v",
"product_url": "https://e.huawei.com/en/products/enterprise-networking/security/firewall-gateway/usg6000v",
"registry_version": 5,
"status": "experimental",
"availability": "service-contract",
"maintainer": "none",
"maintainer_email": "none",
"usage": "Default password is admin. Default username and password for web is admin/Admin@123.",
"first_port_name": "GigabitEthernet0/0/0",
"port_name_format": "GigabitEthernet1/0/{0}",
"qemu": {
"adapter_type": "virtio-net-pci",
"adapters": 6,
"ram": 4096,
"cpus": 2,
"hda_disk_interface": "ide",
"hdb_disk_interface": "ide",
"hdc_disk_interface": "ide",
"hdd_disk_interface": "ide",
"arch": "x86_64",
"console_type": "telnet",
"boot_priority": "dc",
"kvm": "require",
"options": "-machine type=pc,accel=kvm -vga std -usbdevice tablet"
},
"images": [
{
"filename": "usg6kv-v2-V500R001C10.qcow2",
"version": "V500R001C10",
"md5sum": "07f87aaa4f4d8b9a713d90eb32f89111",
"filesize": 737476608,
"download_url": "https://support.huawei.com/enterprise/en/security/usg6000v-pid-21431620/software"
}
],
"versions": [
{
"name": "V500R001C10",
"images": {
"hda_disk_image": "usg6kv-v2-V500R001C10.qcow2"
}
}
]
}
+46
View File
@@ -0,0 +1,46 @@
{
"name": "ipxe",
"category": "guest",
"description": "boot guest from network via iPXE",
"vendor_name": "Linux",
"vendor_url": "http://gns3.com/",
"documentation_url": "http://ipxe.org",
"product_name": "iPXE netboot",
"product_url": "http://ipxe.org/",
"registry_version": 3,
"status": "stable",
"maintainer": "GNS3 Team",
"maintainer_email": "developers@gns3.net",
"usage": "x86_64 guest booted from network via iPXE. If you need latest ipxe version - download, attach and boot iso from http://boot.ipxe.org/ipxe.iso. Don't forget to adjust memory according guest requirements. If guest is linux, you can add serial console options to kernel arguments.",
"symbol": "linux_guest.svg",
"port_name_format": "eth{0}",
"qemu": {
"adapter_type": "e1000",
"adapters": 1,
"ram": 1024,
"hda_disk_interface": "ide",
"arch": "x86_64",
"console_type": "telnet",
"boot_priority": "n",
"kvm": "allow",
"options": "-nographic"
},
"images": [
{
"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"
}
],
"versions": [
{
"name": "1.0",
"images": {
"hda_disk_image": "empty8G.qcow2"
}
}
]
}
@@ -46,24 +46,6 @@
"md5sum": "25322c2caf542059de72e9adbec1fb68",
"filesize": 10485760
},
{
"filename": "junos-vmx-x86-64-19.3R1.8.qcow2",
"version": "19.3R1.8-KVM",
"md5sum": "cd14a6884edeb6b337d3c2be02241c63",
"filesize": 1435238400
},
{
"filename": "vmxhdd-19.3R1.8.img",
"version": "19.3R1.8-KVM",
"md5sum": "ae26e0f32605a53a5c85342bad677c9f",
"filesize": 197120
},
{
"filename": "metadata-usb-re-19.3R1.8.img",
"version": "19.3R1.8-KVM",
"md5sum": "3c66c4657773a0cd2b38ffd84115446a",
"filesize": 10485760
},
{
"filename": "junos-vmx-x86-64-17.4R1.16.qcow2",
"version": "17.4R1.16-KVM",
@@ -365,14 +347,6 @@
"hdc_disk_image": "metadata-usb-re-20.2R1.10.img"
}
},
{
"name": "19.3R1.8-KVM",
"images": {
"hda_disk_image": "junos-vmx-x86-64-19.3R1.8.qcow2",
"hdb_disk_image": "vmxhdd-19.3R1.8.img",
"hdc_disk_image": "metadata-usb-re-19.3R1.8.img"
}
},
{
"name": "17.4R1.16-KVM",
"images": {
+52
View File
@@ -25,6 +25,20 @@
"options": "-smp 2"
},
"images": [
{
"filename": "junos-media-vsrx-x86-64-vmdisk-20.4R1.12.qcow2",
"version": "20.4R1",
"md5sum": "a445304c6f710d6d5401b486ef68cd20",
"filesize": 6796738560,
"download_url": "https://www.juniper.net/us/en/dm/free-vsrx-trial/"
},
{
"filename": "junos-vsrx3-x86-64-20.4R1.12.qcow2",
"version": "20.4R1 3.0",
"md5sum": "0e7a44a56c0326908fcbdc70451e08f5",
"filesize": 942211072,
"download_url": "https://www.juniper.net/us/en/dm/free-vsrx-trial/"
},
{
"filename": "junos-media-vsrx-x86-64-vmdisk-19.3R1.8.qcow2",
"version": "19.3R1",
@@ -32,6 +46,13 @@
"filesize": 5185142784,
"download_url": "https://www.juniper.net/us/en/dm/free-vsrx-trial/"
},
{
"filename": "junos-vsrx3-x86-64-19.3R1.8.qcow2",
"version": "19.3R1 3.0",
"md5sum": "b94d6e5b38737af09c5c9f49c623b69b",
"filesize": 834928640,
"download_url": "https://www.juniper.net/us/en/dm/free-vsrx-trial/"
},
{
"filename": "junos-media-vsrx-vmdisk-18.1R1.9.qcow2",
"version": "18.1R1",
@@ -39,6 +60,13 @@
"filesize": 4418961408,
"download_url": "https://www.juniper.net/us/en/dm/free-vsrx-trial/"
},
{
"filename": "junos-vsrx3-x86-64-18.4R3.3.qcow2",
"version": "18.4R3 3.0",
"md5sum": "bb1dec15bb047446f80d85a129cb57c6",
"filesize": 764805120,
"download_url": "https://www.juniper.net/us/en/dm/free-vsrx-trial/"
},
{
"filename": "media-vsrx-vmdisk-17.4R1.16.qcow2",
"version": "17.4R1",
@@ -153,18 +181,42 @@
}
],
"versions": [
{
"name": "20.4R1",
"images": {
"hda_disk_image": "junos-media-vsrx-x86-64-vmdisk-20.4R1.12.qcow2"
}
},
{
"name": "20.4R1 3.0",
"images": {
"hda_disk_image": "junos-vsrx3-x86-64-20.4R1.12.qcow2"
}
},
{
"name": "19.3R1",
"images": {
"hda_disk_image": "junos-media-vsrx-x86-64-vmdisk-19.3R1.8.qcow2"
}
},
{
"name": "19.3R1 3.0",
"images": {
"hda_disk_image": "junos-vsrx3-x86-64-19.3R1.8.qcow2"
}
},
{
"name": "18.1R1",
"images": {
"hda_disk_image": "junos-media-vsrx-vmdisk-18.1R1.9.qcow2"
}
},
{
"name": "18.4R3 3.0",
"images": {
"hda_disk_image": "junos-vsrx3-x86-64-18.4R3.3.qcow2"
}
},
{
"name": "17.4R1",
"images": {
@@ -0,0 +1,55 @@
{
"name": "OpenMediaVault",
"category": "guest",
"description": "openmediavault is the next generation network attached storage (NAS) solution based on Debian Linux. It contains services like SSH, (S)FTP, SMB/CIFS, DAAP media server, RSync, BitTorrent client and many more.",
"vendor_name": "Volker Theile",
"vendor_url": "https://www.openmediavault.org/",
"documentation_url": "hhttps://docs.openmediavault.org",
"product_name": "OpenMediaVault",
"product_url": "https://www.openmediavault.org/",
"registry_version": 3,
"status": "stable",
"maintainer": "Savio D'souza",
"maintainer_email": "savio2002@yahoo.in",
"usage": "Install OS to first Disk, poweroff, eject iso.\nAdd empty30G.qcow2 to Secondary master and slave this way you will get 3 hard disks for storage.\nDefault WUI credentials are admin:openmediavault.",
"port_name_format": "eth{0}",
"qemu": {
"adapter_type": "e1000",
"adapters": 1,
"ram": 2048,
"hda_disk_interface": "ide",
"hdb_disk_interface": "ide",
"arch": "x86_64",
"console_type": "vnc",
"boot_priority": "dc",
"kvm": "require"
},
"images": [
{
"filename": "openmediavault_5.5.11-amd64.iso",
"version": "5.5.11",
"md5sum": "76baad8e13dd49bee9b4b4a6936b7296",
"filesize": 608174080,
"download_url": "https://www.openmediavault.org/download.html",
"direct_download_url": "https://sourceforge.net/projects/openmediavault/files/latest/download"
},
{
"filename": "empty30G.qcow2",
"version": "1.0",
"md5sum": "3411a599e822f2ac6be560a26405821a",
"filesize": 197120,
"download_url": "https://sourceforge.net/projects/gns-3/files/Empty%20Qemu%20disk/",
"direct_download_url": "https://sourceforge.net/projects/gns-3/files/Empty%20Qemu%20disk/empty30G.qcow2/download"
}
],
"versions": [
{
"name": "5.5.11",
"images": {
"hda_disk_image": "empty30G.qcow2",
"hdb_disk_image": "empty30G.qcow2",
"cdrom_image": "openmediavault_5.5.11-amd64.iso"
}
}
]
}
+45
View File
@@ -22,6 +22,33 @@
"kvm": "allow"
},
"images": [
{
"filename": "openwrt-19.07.7-x86-64-combined-ext4.img",
"version": "19.07.7",
"md5sum": "0cfa752fab87014419ab00b18a6cc5a6",
"filesize": 285736960,
"download_url": "https://downloads.openwrt.org/releases/19.07.7/targets/x86/64/",
"direct_download_url": "https://downloads.openwrt.org/releases/19.07.7/targets/x86/64/openwrt-19.07.7-x86-64-combined-ext4.img.gz",
"compression": "gzip"
},
{
"filename": "openwrt-19.07.6-x86-64-combined-ext4.img",
"version": "19.07.6",
"md5sum": "db0d48f47917684f6ce9c8430d90bb8a",
"filesize": 285736960,
"download_url": "https://downloads.openwrt.org/releases/19.07.6/targets/x86/64/",
"direct_download_url": "https://downloads.openwrt.org/releases/19.07.6/targets/x86/64/openwrt-19.07.6-x86-64-combined-ext4.img.gz",
"compression": "gzip"
},
{
"filename": "openwrt-19.07.5-x86-64-combined-ext4.img",
"version": "19.07.5",
"md5sum": "20167cfbb8d51adad9e251f4cd3508fe",
"filesize": 285736960,
"download_url": "https://downloads.openwrt.org/releases/19.07.5/targets/x86/64/",
"direct_download_url": "https://downloads.openwrt.org/releases/19.07.5/targets/x86/64/openwrt-19.07.5-x86-64-combined-ext4.img.gz",
"compression": "gzip"
},
{
"filename": "openwrt-19.07.4-x86-64-combined-ext4.img",
"version": "19.07.4",
@@ -141,6 +168,24 @@
}
],
"versions": [
{
"name": "19.07.7",
"images": {
"hda_disk_image": "openwrt-19.07.7-x86-64-combined-ext4.img"
}
},
{
"name": "19.07.6",
"images": {
"hda_disk_image": "openwrt-19.07.6-x86-64-combined-ext4.img"
}
},
{
"name": "19.07.5",
"images": {
"hda_disk_image": "openwrt-19.07.5-x86-64-combined-ext4.img"
}
},
{
"name": "19.07.4",
"images": {
+81
View File
@@ -0,0 +1,81 @@
{
"name": "Puppy Linux",
"category": "guest",
"description": "Puppy Linux is a unique family of Linux distributions meant for the home-user computers. It was originally created by Barry Kauler in 2003.",
"vendor_name": "Puppy Linux",
"vendor_url": "http://puppylinux.com/",
"documentation_url": "http://wikka.puppylinux.com/HomePage",
"product_name": "Puppy Linux",
"registry_version": 3,
"status": "stable",
"maintainer": "Savio D'souza",
"maintainer_email": "savio2002@yahoo.in",
"usage": "No Password by default\nRun installer & install to local disk\nEject the ISO and reboot.",
"port_name_format": "eth{0}",
"qemu": {
"adapter_type": "e1000",
"adapters": 1,
"ram": 256,
"arch": "x86_64",
"console_type": "vnc",
"boot_priority": "cd",
"kvm": "require"
},
"images": [
{
"filename": "fossapup64-9.5.iso",
"version": "9.5",
"md5sum": "6a45e7a305b7d3172ebd9eab5ca460e4",
"filesize": 428867584,
"download_url": "http://puppylinux.com/index.html",
"direct_download_url": "http://distro.ibiblio.org/puppylinux/puppy-fossa/fossapup64-9.5.iso"
},
{
"filename": "bionicpup64-8.0-uefi.iso",
"version": "8.0",
"md5sum": "e31ddba0e6006021c157cb5a5b65ad5f",
"filesize": 371195904,
"download_url": "http://puppylinux.com/index.html",
"direct_download_url": "http://distro.ibiblio.org/puppylinux/puppy-bionic/bionicpup64/bionicpup64-8.0-uefi.iso"
},
{
"filename": "xenialpup64-7.5-uefi.iso",
"version": "7.5",
"md5sum": "4502bb9693bd72fb5dcfb86a2ce8255d",
"filesize": 346030080,
"download_url": "http://puppylinux.com/index.html",
"direct_download_url": "http://distro.ibiblio.org/puppylinux/puppy-xenial/64/xenialpup64-7.5-uefi.iso"
},
{
"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"
}
],
"versions": [
{
"name": "9.5",
"images": {
"hda_disk_image": "empty8G.qcow2",
"cdrom_image": "fossapup64-9.5.iso"
}
},
{
"name": "8.0",
"images": {
"hda_disk_image": "empty8G.qcow2",
"cdrom_image": "bionicpup64-8.0-uefi.iso"
}
},
{
"name": "7.5",
"images": {
"hda_disk_image": "empty8G.qcow2",
"cdrom_image": "xenialpup64-7.5-uefi.iso"
}
}
]
}
+50
View File
@@ -0,0 +1,50 @@
{
"name": "Raspian",
"category": "guest",
"description": "Raspberry Pi Desktop comes pre-installed with plenty of software for education, programming and general use; including Python, Scratch, Sonic Pi, Java, and more. Appliance created to demonstrate new_appliance.py - read more at https://nextpertise.net.",
"vendor_name": "Raspberry Pi Foundation",
"vendor_url": "https://www.raspberrypi.org",
"product_name": "Raspberry Pi Desktop",
"product_url": "https://www.raspberrypi.org/downloads/raspberry-pi-desktop/",
"registry_version": 4,
"status": "stable",
"availability": "free",
"maintainer": "Brent Stewart",
"maintainer_email": "brent@stewart.tc",
"usage": "Default password is raspberry",
"symbol": "rpi.png",
"qemu": {
"adapter_type": "virtio",
"adapters": 1,
"ram": 1024,
"hda_disk_interface": "sata",
"arch": "x86_64",
"console_type": "vnc",
"kvm": "disable"
},
"images": [
{
"filename": "2020-02-12-rpd-x86-buster.iso",
"version": "2020-02-12",
"md5sum": "98f34fb53086752b4c9c452094f30740",
"filesize": 3128147968,
"download_url": "https://www.raspberrypi.org/downloads/raspberry-pi-desktop/"
},
{
"filename": "empty8G.qcow2",
"version": "1",
"md5sum": "f1d2c25b6990f99bd05b433ab603bdb4",
"filesize": 197120,
"download_url": "https://sourceforge.net/projects/gns-3/files/Empty%20Qemu%20disk/empty8G.qcow2/download"
}
],
"versions": [
{
"name": "2020-02-12",
"images": {
"hda_disk_image": "empty8G.qcow2",
"cdrom_image": "2020-02-12-rpd-x86-buster.iso"
}
}
]
}
+80
View File
@@ -0,0 +1,80 @@
{
"name": "RHEL",
"category": "guest",
"description": "Red Hat Enterprise Linux Server provides core operating system functions and capabilities for application infrastructure.",
"vendor_name": "Red Hat",
"vendor_url": "https://redhat.com",
"documentation_url": "https://access.redhat.com/solutions/641193",
"product_name": "Red Hat Enterprise Linux KVM Guest Image",
"product_url": "https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux",
"registry_version": 5,
"status": "stable",
"availability": "service-contract",
"maintainer": "Neyder Achahuanco",
"maintainer_email": "neyder@neyder.net",
"usage": "You should download Red Hat Enterprise Linux KVM Guest Image from https://access.redhat.com/downloads/content/479/ver=/rhel---8/8.3/x86_64/product-software attach/customize cloud-init.iso and start.\nusername: cloud-user\npassword: redhat",
"qemu": {
"adapter_type": "virtio-net-pci",
"adapters": 1,
"ram": 1024,
"hda_disk_interface": "virtio",
"arch": "x86_64",
"console_type": "telnet",
"boot_priority": "c",
"kvm": "require",
"options": "-nographic"
},
"images": [
{
"filename": "rhel-8.3-x86_64-kvm.qcow2",
"version": "8.3",
"md5sum": "dd554c059e0910379fff88f677f4a4b3",
"filesize": 1316683776,
"download_url": "https://access.redhat.com/downloads/content/479/ver=/rhel---8/8.3/x86_64/product-software"
},
{
"filename": "rhel-server-7.9-x86_64-kvm.qcow2",
"version": "7.9",
"md5sum": "8d6669b3e2bb8df15b9b4280936cf950",
"filesize": 827777024,
"download_url": "https://access.redhat.com/downloads/content/69/ver=/rhel---7/7.9/x86_64/product-software"
},
{
"filename": "rhel-server-6.10-update-11-x86_64-kvm.qcow2",
"version": "6.10",
"md5sum": "6d672026d3a0eae794a677a18287f9c0",
"filesize": 341442560,
"download_url": "https://access.redhat.com/downloads/content/69/ver=/rhel---6/6.10/x86_64/product-software"
},
{
"filename": "rhel-cloud-init.iso",
"version": "1.0",
"md5sum": "421745b0d13615ecd48696f98d8b6352",
"filesize": 374784,
"download_url": "https://gitlab.com/neyder/rhel-cloud-init/raw/master/rhel-cloud-init.iso"
}
],
"versions": [
{
"images": {
"hda_disk_image": "rhel-8.3-x86_64-kvm.qcow2",
"cdrom_image": "rhel-cloud-init.iso"
},
"name": "8.3"
},
{
"images": {
"hda_disk_image": "rhel-server-7.9-x86_64-kvm.qcow2",
"cdrom_image": "rhel-cloud-init.iso"
},
"name": "7.9"
},
{
"images": {
"hda_disk_image": "rhel-server-6.10-update-11-x86_64-kvm.qcow2",
"cdrom_image": "rhel-cloud-init.iso"
},
"name": "6.10"
}
]
}
+14
View File
@@ -25,6 +25,13 @@
"options": "-nographic"
},
"images": [
{
"filename": "ubuntu-20.04-server-cloudimg-amd64.img",
"version": "20.04 (LTS)",
"md5sum": "044bc979b2238192ee3edb44e2bb6405",
"filesize": 552337408,
"download_url": "https://cloud-images.ubuntu.com/releases/focal/release-20210119.1/ubuntu-20.04-server-cloudimg-amd64.img"
},
{
"filename": "ubuntu-18.04-server-cloudimg-amd64.img",
"version": "18.04 (LTS)",
@@ -62,6 +69,13 @@
}
],
"versions": [
{
"name": "20.04 (LTS)",
"images": {
"hda_disk_image": "ubuntu-20.04-server-cloudimg-amd64.img",
"cdrom_image": "ubuntu-cloud-init-data.iso"
}
},
{
"name": "18.04 (LTS)",
"images": {
+25 -71
View File
@@ -1,76 +1,52 @@
{
"name": "VyOS",
"category": "router",
"description": "VyOS is a community fork of Vyatta, a Linux-based network operating system that provides software-based network routing, firewall, and VPN functionality. VyOS has a subscription LTS version and a community rolling release. The latest version in this appliance is in the rolling release track.",
"description": "VyOS is a community fork of Vyatta, a Linux-based network operating system that provides software-based network routing, firewall, and VPN functionality. VyOS has a subscription LTS version and a community rolling release. The latest version in this appliance is the monthly snapshot of the rolling release track.",
"vendor_name": "Linux",
"vendor_url": "http://vyos.net/",
"documentation_url": "http://vyos.net/wiki/User_Guide",
"vendor_url": "https://vyos.net/",
"documentation_url": "https://docs.vyos.io/",
"product_name": "VyOS",
"product_url": "http://vyos.net/",
"product_url": "https://vyos.net/",
"registry_version": 3,
"status": "stable",
"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.",
"symbol": "vyos.png",
"usage": "Default username/password is vyos/vyos.\n\nAt first boot of versions 1.1.x/1.2.x the router will start from the cdrom. Login and then type \"install image\" and follow the instructions.",
"symbol": "vyos.svg",
"port_name_format": "eth{0}",
"qemu": {
"adapter_type": "e1000",
"adapters": 3,
"ram": 512,
"hda_disk_interface": "ide",
"hda_disk_interface": "scsi",
"arch": "x86_64",
"console_type": "telnet",
"boot_priority": "dc",
"boot_priority": "cd",
"kvm": "allow"
},
"images": [
{
"filename": "vyos-1.2.6-amd64.iso",
"version": "1.2.6",
"md5sum": "dbf5335c16967cd5f768d1ca927666db",
"filesize": 428867584,
"download_url": "https://downloads.vyos.io/?dir=release/current/1.2.6"
"filename": "vyos-1.3-rolling-202101-qemu.qcow2",
"version": "1.3-snapshot-202101",
"md5sum": "b05a1f8a879c42342ea90f65ebe62f05",
"filesize": 315359232,
"download_url": "https://vyos.net/get/snapshots/",
"direct_download_url": "https://s3.amazonaws.com/s3-us.vyos.io/snapshot/vyos-1.3-rolling-202101/qemu/vyos-1.3-rolling-202101-qemu.qcow2"
},
{
"filename": "vyos-1.3-rolling-202005040117-amd64.iso",
"version": "1.3-rolling-202005040117",
"md5sum": "0500d5138cd05239b50f93fb24ac8b55",
"filesize": 438304768,
"download_url": "https://downloads.vyos.io/?dir=rolling/current/amd64",
"direct_download_url": "https://downloads.vyos.io/rolling/current/amd64/vyos-1.3-rolling-202005040117-amd64.iso"
"filename": "vyos-1.2.6-S1-amd64.iso",
"version": "1.2.6-S1",
"md5sum": "449873ae455d5f3f509db7a614e86984",
"filesize": 428867584,
"download_url": "https://support.vyos.io/en/downloads/files/vyos-1-2-6-s1-generic-iso-image"
},
{
"filename": "vyos-1.1.8-amd64.iso",
"version": "1.1.8",
"md5sum": "95a141d4b592b81c803cdf7e9b11d8ea",
"filesize": 241172480,
"download_url": "https://downloads.vyos.io/?dir=release/legacy/1.1.8",
"direct_download_url": "https://downloads.vyos.io/release/legacy/1.1.8/vyos-1.1.8-amd64.iso"
},
{
"filename": "vyos-1.1.7-amd64.iso",
"version": "1.1.7",
"md5sum": "9a7f745a0b0db0d4f1d9eee2a437fb54",
"filesize": 245366784,
"download_url": "https://downloads.vyos.io/?dir=release/legacy/1.1.7/",
"direct_download_url": "https://downloads.vyos.io/release/legacy/1.1.7/vyos-1.1.7-amd64.iso"
},
{
"filename": "vyos-1.1.6-amd64.iso",
"version": "1.1.6",
"md5sum": "3128954d026e567402a924c2424ce2bf",
"filesize": 245366784,
"download_url": "hhttps://downloads.vyos.io/?dir=release/legacy/1.1.6/",
"direct_download_url": "https://downloads.vyos.io/release/legacy/1.1.6/vyos-1.1.6-amd64.iso"
},
{
"filename": "vyos-1.1.5-amd64.iso",
"version": "1.1.5",
"md5sum": "193179532011ceaa87ee725bd8f22022",
"filesize": 247463936,
"download_url": "https://downloads.vyos.io/?dir=release/legacy/1.1.5/",
"direct_download_url": "https://downloads.vyos.io/release/legacy/1.1.5/vyos-1.1.5-amd64.iso"
"download_url": "https://support.vyos.io/en/downloads/files/vyos-1-1-8-iso",
"direct_download_url": "https://s3.amazonaws.com/s3-us.vyos.io/vyos-1.1.8-amd64.iso"
},
{
"filename": "empty8G.qcow2",
@@ -83,17 +59,16 @@
],
"versions": [
{
"name": "1.2.6",
"name": "1.3-snapshot-202101",
"images": {
"hda_disk_image": "empty8G.qcow2",
"cdrom_image": "vyos-1.2.6-amd64.iso"
"hda_disk_image": "vyos-1.3-rolling-202101-qemu.qcow2"
}
},
{
"name": "1.3-rolling-202005040117",
"name": "1.2.6-S1",
"images": {
"hda_disk_image": "empty8G.qcow2",
"cdrom_image": "vyos-1.3-rolling-202005040117-amd64.iso"
"cdrom_image": "vyos-1.2.6-S1-amd64.iso"
}
},
{
@@ -102,27 +77,6 @@
"hda_disk_image": "empty8G.qcow2",
"cdrom_image": "vyos-1.1.8-amd64.iso"
}
},
{
"name": "1.1.7",
"images": {
"hda_disk_image": "empty8G.qcow2",
"cdrom_image": "vyos-1.1.7-amd64.iso"
}
},
{
"name": "1.1.6",
"images": {
"hda_disk_image": "empty8G.qcow2",
"cdrom_image": "vyos-1.1.6-amd64.iso"
}
},
{
"name": "1.1.5",
"images": {
"hda_disk_image": "empty8G.qcow2",
"cdrom_image": "vyos-1.1.5-amd64.iso"
}
}
]
}
+51
View File
@@ -0,0 +1,51 @@
{
"name": "Windows",
"category": "guest",
"description": "Microsoft Windows XP is a graphical operating system developed, marketed, and sold by Microsoft.\n\nMicrosoft has released time limited VMs for testing Internet Explorer.",
"vendor_name": "Microsoft",
"vendor_url": "http://www.microsoft.com",
"product_name": "Windows XP",
"registry_version": 3,
"status": "experimental",
"maintainer": "GNS3 Team",
"maintainer_email": "developers@gns3.net",
"qemu": {
"adapter_type": "pcnet",
"adapters": 2,
"ram": 512,
"arch": "i386",
"console_type": "vnc",
"kvm": "require",
"options": "-vga std -soundhw es1370 -usbdevice tablet"
},
"images": [
{
"filename": "IE8 - WinXP-disk1.vmdk",
"version": "XP+IE8",
"md5sum": "9cf6a0d5af11bdad26a59731f6494666",
"filesize": 1241311744,
"download_url": "https://ia802808.us.archive.org/22/items/ie8.winxp.vmware/IE8-WinXP-VMWare.zip"
},
{
"filename": "IE6 - WinXP-disk1.vmdk",
"version": "XP+IE6",
"md5sum": "f7fc1948749f0a62c3cccf0775d74f05",
"filesize": 1063498240,
"download_url": "https://ia802903.us.archive.org/25/items/ie6.winxp.vmware/IE6%20-%20WinXP-VMWare.zip"
}
],
"versions": [
{
"name": "XP+IE8",
"images": {
"hda_disk_image": "IE8 - WinXP-disk1.vmdk"
}
},
{
"name": "XP+IE6",
"images": {
"hda_disk_image": "IE6 - WinXP-disk1.vmdk"
}
}
]
}
@@ -79,7 +79,7 @@ class EthernetSwitch(Device):
:param hypervisor: Dynamips hypervisor instance
"""
def __init__(self, name, node_id, project, manager, console=None, console_type="none", 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 = {}
@@ -90,6 +90,9 @@ class EthernetSwitch(Device):
self._console = console
self._console_type = console_type
if self._console_type is None:
self._console_type = "none"
if self._console is not None:
self._console = self._manager.port_manager.reserve_tcp_port(self._console, self._project)
else:
@@ -115,6 +118,7 @@ class EthernetSwitch(Device):
"project_id": self.project.id,
"ports_mapping": self._ports,
"status": "started"}
return ethernet_switch_info
@property
+23
View File
@@ -27,10 +27,13 @@ import re
import subprocess
from ...utils.asyncio import subprocess_check_output
from ...utils.get_resource import get_resource
from ..base_manager import BaseManager
from ..error import NodeError, ImageMissingError
from .qemu_error import QemuError
from .qemu_vm import QemuVM
from .utils.guest_cid import get_next_guest_cid
from .utils.ziputils import unpack_zip
import logging
log = logging.getLogger(__name__)
@@ -45,6 +48,8 @@ class Qemu(BaseManager):
super().__init__()
self._guest_cid_lock = asyncio.Lock()
self.config_disk = "config.img"
self._init_config_disk()
async def create_node(self, *args, **kwargs):
"""
@@ -343,3 +348,21 @@ class Qemu(BaseManager):
log.info("Qemu disk '{}' extended by {} MB".format(path, extend))
except (OSError, subprocess.SubprocessError) as e:
raise QemuError("Could not update disk image {}:{}".format(path, e))
def _init_config_disk(self):
"""
Initialize the default config disk
"""
try:
self.get_abs_image_path(self.config_disk)
except (NodeError, ImageMissingError):
config_disk_zip = get_resource("compute/qemu/resources/{}.zip".format(self.config_disk))
if config_disk_zip and os.path.exists(config_disk_zip):
directory = self.get_images_directory()
try:
unpack_zip(config_disk_zip, directory)
except OSError as e:
log.warning("Config disk creation: {}".format(e))
else:
log.warning("Config disk: image '{}' missing".format(self.config_disk))
+214 -38
View File
@@ -26,6 +26,7 @@ import re
import shlex
import math
import shutil
import struct
import asyncio
import socket
import gns3server
@@ -37,7 +38,9 @@ from gns3server.utils import parse_version, shlex_quote
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 .utils.ziputils import pack_zip, unpack_zip
from ..adapters.ethernet_adapter import EthernetAdapter
from ..error import NodeError, ImageMissingError
from ..nios.nio_udp import NIOUDP
from ..nios.nio_tap import NIOTAP
from ..base_node import BaseNode
@@ -101,10 +104,10 @@ class QemuVM(BaseNode):
self._hdb_disk_image = ""
self._hdc_disk_image = ""
self._hdd_disk_image = ""
self._hda_disk_interface = "ide"
self._hdb_disk_interface = "ide"
self._hdc_disk_interface = "ide"
self._hdd_disk_interface = "ide"
self._hda_disk_interface = "none"
self._hdb_disk_interface = "none"
self._hdc_disk_interface = "none"
self._hdd_disk_interface = "none"
self._cdrom_image = ""
self._bios_image = ""
self._boot_priority = "c"
@@ -119,12 +122,28 @@ class QemuVM(BaseNode):
self._kernel_command_line = ""
self._legacy_networking = False
self._replicate_network_connection_state = True
self._create_config_disk = False
self._on_close = "power_off"
self._cpu_throttling = 0 # means no CPU throttling
self._process_priority = "low"
self.mac_address = "" # this will generate a MAC address
self.adapters = 1 # creates 1 adapter by default
# config disk
self.config_disk_name = self.manager.config_disk
self.config_disk_image = ""
if self.config_disk_name:
if not shutil.which("mcopy"):
log.warning("Config disk: 'mtools' are not installed.")
self.config_disk_name = ""
else:
try:
self.config_disk_image = self.manager.get_abs_image_path(self.config_disk_name)
except (NodeError, ImageMissingError):
log.warning("Config disk: image '{}' missing".format(self.config_disk_name))
self.config_disk_name = ""
log.info('QEMU VM "{name}" [{id}] has been created'.format(name=self._name, id=self._id))
@property
@@ -652,6 +671,30 @@ class QemuVM(BaseNode):
log.info('QEMU VM "{name}" [{id}] has disabled network connection state replication'.format(name=self._name, id=self._id))
self._replicate_network_connection_state = replicate_network_connection_state
@property
def create_config_disk(self):
"""
Returns whether a config disk is automatically created on HDD disk interface (secondary slave)
:returns: boolean
"""
return self._create_config_disk
@create_config_disk.setter
def create_config_disk(self, create_config_disk):
"""
Sets whether a config disk is automatically created on HDD disk interface (secondary slave)
:param replicate_network_connection_state: boolean
"""
if create_config_disk:
log.info('QEMU VM "{name}" [{id}] has enabled the config disk creation feature'.format(name=self._name, id=self._id))
else:
log.info('QEMU VM "{name}" [{id}] has disabled the config disk creation feature'.format(name=self._name, id=self._id))
self._create_config_disk = create_config_disk
@property
def on_close(self):
"""
@@ -1115,6 +1158,7 @@ class QemuVM(BaseNode):
self._stop_cpulimit()
if self.on_close != "save_vm_state":
await self._clear_save_vm_stated()
await self._export_config()
await super().stop()
async def _open_qemu_monitor_connection_vm(self, timeout=10):
@@ -1627,6 +1671,139 @@ class QemuVM(BaseNode):
log.info("{} returned with {}".format(self._get_qemu_img(), retcode))
return retcode
async def _create_linked_clone(self, disk_name, disk_image, disk):
try:
qemu_img_path = self._get_qemu_img()
command = [qemu_img_path, "create", "-o", "backing_file={}".format(disk_image), "-f", "qcow2", disk]
retcode = await self._qemu_img_exec(command)
if retcode:
stdout = self.read_qemu_img_stdout()
raise QemuError("Could not create '{}' disk image: qemu-img returned with {}\n{}".format(disk_name,
retcode,
stdout))
except (OSError, subprocess.SubprocessError) as e:
stdout = self.read_qemu_img_stdout()
raise QemuError("Could not create '{}' disk image: {}\n{}".format(disk_name, e, stdout))
async def _mcopy(self, image, *args):
try:
# read offset of first partition from MBR
with open(image, "rb") as img_file:
mbr = img_file.read(512)
part_type, offset, signature = struct.unpack("<450xB3xL52xH", mbr)
if signature != 0xAA55:
raise OSError("{}: invalid MBR".format(image))
if part_type not in (1, 4, 6, 11, 12, 14):
raise OSError("{}: invalid partition type {:02X}"
.format(image, part_type))
part_image = image + "@@{}S".format(offset)
process = await asyncio.create_subprocess_exec(
"mcopy", "-i", part_image, *args,
stdin=subprocess.DEVNULL,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
cwd=self.working_dir)
(stdout, _) = await process.communicate()
retcode = process.returncode
except (OSError, subprocess.SubprocessError) as e:
raise OSError("mcopy failure: {}".format(e))
if retcode != 0:
stdout = stdout.decode("utf-8").rstrip()
if stdout:
raise OSError("mcopy failure: {}".format(stdout))
else:
raise OSError("mcopy failure: return code {}".format(retcode))
async def _export_config(self):
disk_name = getattr(self, "config_disk_name")
if not disk_name:
return
disk = os.path.join(self.working_dir, disk_name)
if not os.path.exists(disk):
return
config_dir = os.path.join(self.working_dir, "configs")
zip_file = os.path.join(self.working_dir, "config.zip")
try:
os.mkdir(config_dir)
await self._mcopy(disk, "-s", "-m", "-n", "--", "::/", config_dir)
if os.path.exists(zip_file):
os.remove(zip_file)
pack_zip(zip_file, config_dir)
except OSError as e:
log.warning("Can't export config: {}".format(e))
self.project.emit("log.warning", {"message": "{}: Can't export config: {}".format(self._name, e)})
shutil.rmtree(config_dir, ignore_errors=True)
async def _import_config(self):
disk_name = getattr(self, "config_disk_name")
if not disk_name:
return
disk = os.path.join(self.working_dir, disk_name)
zip_file = os.path.join(self.working_dir, "config.zip")
startup_config = self.hdd_disk_image
if startup_config and startup_config.lower().endswith(".zip") and \
not os.path.exists(zip_file) and not os.path.exists(disk):
try:
shutil.copyfile(startup_config, zip_file)
except OSError as e:
log.warning("Can't access startup config: {}".format(e))
self.project.emit("log.warning", {"message": "{}: Can't access startup config: {}".format(self._name, e)})
if not os.path.exists(zip_file):
return
config_dir = os.path.join(self.working_dir, "configs")
disk_tmp = disk + ".tmp"
try:
os.mkdir(config_dir)
shutil.copyfile(getattr(self, "config_disk_image"), disk_tmp)
unpack_zip(zip_file, config_dir)
config_files = [os.path.join(config_dir, fname)
for fname in os.listdir(config_dir)]
if config_files:
await self._mcopy(disk_tmp, "-s", "-m", "-o", "--", *config_files, "::/")
os.replace(disk_tmp, disk)
except OSError as e:
log.warning("Can't import config: {}".format(e))
self.project.emit("log.warning", {"message": "{}: Can't import config: {}".format(self._name, e)})
if os.path.exists(disk_tmp):
os.remove(disk_tmp)
os.remove(zip_file)
shutil.rmtree(config_dir, ignore_errors=True)
async def _disk_interface_options(self, disk, disk_index, interface, format=None):
options = []
extra_drive_options = ""
if format:
extra_drive_options += ",format={}".format(format)
# From Qemu man page: if the filename contains comma, you must double it
# (for instance, "file=my,,file" to use file "my,file").
disk = disk.replace(",", ",,")
if interface == "sata":
# special case, sata controller doesn't exist in Qemu
options.extend(["-device", 'ahci,id=ahci{}'.format(disk_index)])
options.extend(["-drive", 'file={},if=none,id=drive{},index={},media=disk{}'.format(disk, disk_index, disk_index, extra_drive_options)])
qemu_version = await self.manager.get_qemu_version(self.qemu_path)
if qemu_version and parse_version(qemu_version) >= parse_version("4.2.0"):
# The ‘ide-drive’ device is deprecated since version 4.2.0
# https://qemu.readthedocs.io/en/latest/system/deprecated.html#ide-drive-since-4-2
options.extend(["-device", 'ide-hd,drive=drive{},bus=ahci{}.0,id=drive{}'.format(disk_index, disk_index, disk_index)])
else:
options.extend(["-device", 'ide-drive,drive=drive{},bus=ahci{}.0,id=drive{}'.format(disk_index, disk_index, disk_index)])
elif interface == "nvme":
options.extend(["-drive", 'file={},if=none,id=drive{},index={},media=disk{}'.format(disk, disk_index, disk_index, extra_drive_options)])
options.extend(["-device", 'nvme,drive=drive{},serial={}'.format(disk_index, disk_index)])
elif interface == "scsi":
options.extend(["-device", 'virtio-scsi-pci,id=scsi{}'.format(disk_index)])
options.extend(["-drive", 'file={},if=none,id=drive{},index={},media=disk{}'.format(disk, disk_index, disk_index, extra_drive_options)])
options.extend(["-device", 'scsi-hd,drive=drive{}'.format(disk_index)])
#elif interface == "sd":
# options.extend(["-drive", 'file={},id=drive{},index={}{}'.format(disk, disk_index, disk_index, extra_drive_options)])
# options.extend(["-device", 'sd-card,drive=drive{},id=drive{}'.format(disk_index, disk_index, disk_index)])
else:
options.extend(["-drive", 'file={},if={},index={},media=disk,id=drive{}{}'.format(disk, interface, disk_index, disk_index, extra_drive_options)])
return options
async def _disk_options(self):
options = []
qemu_img_path = self._get_qemu_img()
@@ -1634,14 +1811,21 @@ class QemuVM(BaseNode):
drives = ["a", "b", "c", "d"]
for disk_index, drive in enumerate(drives):
disk_image = getattr(self, "_hd{}_disk_image".format(drive))
interface = getattr(self, "hd{}_disk_interface".format(drive))
# prioritize config disk over harddisk d
if drive == 'd' and self._create_config_disk:
continue
disk_image = getattr(self, "_hd{}_disk_image".format(drive))
if not disk_image:
continue
disk_name = "hd" + drive
interface = getattr(self, "hd{}_disk_interface".format(drive))
# fail-safe: use "ide" if there is a disk image and no interface type has been explicitly configured
if interface == "none":
interface = "ide"
setattr(self, "hd{}_disk_interface".format(drive), interface)
disk_name = "hd" + drive
if not os.path.isfile(disk_image) or not os.path.exists(disk_image):
if os.path.islink(disk_image):
raise QemuError("{} disk image '{}' linked to '{}' is not accessible".format(disk_name, disk_image, os.path.realpath(disk_image)))
@@ -1669,17 +1853,7 @@ class QemuVM(BaseNode):
disk = os.path.join(self.working_dir, "{}_disk.qcow2".format(disk_name))
if not os.path.exists(disk):
# create the disk
try:
command = [qemu_img_path, "create", "-o", "backing_file={}".format(disk_image), "-f", "qcow2", disk]
retcode = await self._qemu_img_exec(command)
if retcode:
stdout = self.read_qemu_img_stdout()
raise QemuError("Could not create '{}' disk image: qemu-img returned with {}\n{}".format(disk_name,
retcode,
stdout))
except (OSError, subprocess.SubprocessError) as e:
stdout = self.read_qemu_img_stdout()
raise QemuError("Could not create '{}' disk image: {}\n{}".format(disk_name, e, stdout))
await self._create_linked_clone(disk_name, disk_image, disk)
else:
# The disk exists we check if the clone works
try:
@@ -1691,27 +1865,26 @@ class QemuVM(BaseNode):
else:
disk = disk_image
# From Qemu man page: if the filename contains comma, you must double it
# (for instance, "file=my,,file" to use file "my,file").
disk = disk.replace(",", ",,")
options.extend(await self._disk_interface_options(disk, disk_index, interface))
if interface == "sata":
# special case, sata controller doesn't exist in Qemu
options.extend(["-device", 'ahci,id=ahci{}'.format(disk_index)])
options.extend(["-drive", 'file={},if=none,id=drive{},index={},media=disk'.format(disk, disk_index, disk_index)])
options.extend(["-device", 'ide-drive,drive=drive{},bus=ahci{}.0,id=drive{}'.format(disk_index, disk_index, disk_index)])
elif interface == "nvme":
options.extend(["-drive", 'file={},if=none,id=drive{},index={},media=disk'.format(disk, disk_index, disk_index)])
options.extend(["-device", 'nvme,drive=drive{},serial={}'.format(disk_index, disk_index)])
elif interface == "scsi":
options.extend(["-device", 'virtio-scsi-pci,id=scsi{}'.format(disk_index)])
options.extend(["-drive", 'file={},if=none,id=drive{},index={},media=disk'.format(disk, disk_index, disk_index)])
options.extend(["-device", 'scsi-hd,drive=drive{}'.format(disk_index)])
#elif interface == "sd":
# options.extend(["-drive", 'file={},id=drive{},index={}'.format(disk, disk_index, disk_index)])
# options.extend(["-device", 'sd-card,drive=drive{},id=drive{}'.format(disk_index, disk_index, disk_index)])
else:
options.extend(["-drive", 'file={},if={},index={},media=disk,id=drive{}'.format(disk, interface, disk_index, disk_index)])
# config disk
disk_image = getattr(self, "config_disk_image")
if disk_image and self._create_config_disk:
disk_name = getattr(self, "config_disk_name")
disk = os.path.join(self.working_dir, disk_name)
if self.hdd_disk_interface == "none":
# use the HDA interface type if none has been configured for HDD
self.hdd_disk_interface = getattr(self, "hda_disk_interface", "none")
await self._import_config()
disk_exists = os.path.exists(disk)
if not disk_exists:
try:
shutil.copyfile(disk_image, disk)
disk_exists = True
except OSError as e:
log.warning("Could not create '{}' disk image: {}".format(disk_name, e))
if disk_exists:
options.extend(await self._disk_interface_options(disk, 3, self.hdd_disk_interface, "raw"))
return options
@@ -1722,6 +1895,9 @@ class QemuVM(BaseNode):
if self.linked_clone:
disk_image_path = os.path.join(self.working_dir, "{}_disk.qcow2".format(drive_name))
if not os.path.exists(disk_image_path):
disk_image = getattr(self, "_{}_disk_image".format(drive_name))
await self._create_linked_clone(drive_name, disk_image, disk_image_path)
else:
disk_image_path = getattr(self, "{}_disk_image".format(drive_name))
Binary file not shown.
+53
View File
@@ -0,0 +1,53 @@
#!/usr/bin/env python3
#
# Copyright (C) 2020 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/>.
import os
import time
import shutil
import zipfile
def pack_zip(filename, root_dir=None, base_dir=None):
"""Create a zip archive"""
if filename[-4:].lower() == ".zip":
filename = filename[:-4]
shutil.make_archive(filename, 'zip', root_dir, base_dir)
def unpack_zip(filename, extract_dir=None):
"""Unpack a zip archive"""
dirs = []
if not extract_dir:
extract_dir = os.getcwd()
try:
with zipfile.ZipFile(filename, 'r') as zfile:
for zinfo in zfile.infolist():
fname = os.path.join(extract_dir, zinfo.filename)
date_time = time.mktime(zinfo.date_time + (0, 0, -1))
zfile.extract(zinfo, extract_dir)
# update timestamp
if zinfo.is_dir():
dirs.append((fname, date_time))
else:
os.utime(fname, (date_time, date_time))
# update timestamp of directories
for fname, date_time in reversed(dirs):
os.utime(fname, (date_time, date_time))
except zipfile.BadZipFile:
raise shutil.ReadError("%s is not a zip file" % filename)
+3 -1
View File
@@ -251,7 +251,7 @@ class VPCSVM(BaseNode):
log.error("Could not start VPCS {}: {}\n{}".format(self._vpcs_path(), e, vpcs_stdout))
raise VPCSError("Could not start VPCS {}: {}\n{}".format(self._vpcs_path(), e, vpcs_stdout))
def _termination_callback(self, returncode):
async def _termination_callback(self, returncode):
"""
Called when the process has stopped.
@@ -263,6 +263,8 @@ class VPCSVM(BaseNode):
self._started = False
self.status = "stopped"
self._process = None
await self._stop_ubridge()
await super().stop()
if returncode != 0:
self.project.emit("log.error", {"message": "VPCS process has stopped, return code: {}\n{}".format(returncode, self.read_vpcs_stdout())})
+2 -1
View File
@@ -148,12 +148,13 @@ class Controller:
# remove all projects deleted from disk.
for project in self._projects.copy().values():
if not os.path.exists(project.path):
if not os.path.exists(project.path) or not os.listdir(project.path):
log.info(f"Project '{project.name}' doesn't exist on the disk anymore, closing...")
await project.close()
self.remove_project(project)
await self.load_projects()
await self._project_auto_open()
def check_can_write_config(self):
"""
+1 -1
View File
@@ -58,7 +58,7 @@ class CrashReport:
Report crash to a third party service
"""
DSN = "https://8c30fa3843ab4cdc977e4710cefac0b1:212efa491b1b459f87a0242cb2598e0c@o19455.ingest.sentry.io/38482"
DSN = "https://289e75a5996944f9af6de8b071c99cf0:b1caf92ea47a4b489b569e70cd85c02b@o19455.ingest.sentry.io/38482"
_instance = None
def __init__(self):
@@ -53,12 +53,12 @@ class EthernetSwitchHandler:
# Use the Dynamips Ethernet switch to simulate this node
dynamips_manager = Dynamips.instance()
node = await dynamips_manager.create_node(request.json.pop("name"),
request.match_info["project_id"],
request.json.get("node_id"),
console=request.json.get("console"),
console_type=request.json.get("console_type"),
node_type="ethernet_switch",
ports=request.json.get("ports_mapping"))
request.match_info["project_id"],
request.json.get("node_id"),
console=request.json.get("console"),
console_type=request.json.get("console_type"),
node_type="ethernet_switch",
ports=request.json.get("ports_mapping"))
# On Linux, use the generic switch
# builtin_manager = Builtin.instance()
@@ -231,7 +231,7 @@ Processus:
try:
psinfo = proc.as_dict(attrs=["name", "exe"])
data += "* {} {}\n".format(psinfo["name"], psinfo["exe"])
except psutil.NoSuchProcess:
except (OSError, psutil.NoSuchProcess, psutil.AccessDenied):
pass
data += "\n\nProjects"
+2 -2
View File
@@ -195,7 +195,7 @@ def kill_ghosts():
if name in detect_process:
proc.kill()
log.warning("Killed ghost process %s", name)
except (psutil.NoSuchProcess, psutil.AccessDenied):
except (OSError, psutil.NoSuchProcess, psutil.AccessDenied):
pass
@@ -261,7 +261,7 @@ def run():
server.run()
except OSError as e:
# This is to ignore OSError: [WinError 0] The operation completed successfully exception on Windows.
if not sys.platform.startswith("win") and not e.winerror == 0:
if not sys.platform.startswith("win") or not e.winerror == 0:
raise
except Exception as e:
log.critical("Critical error while running the server: {}".format(e), exc_info=1)
+8
View File
@@ -72,6 +72,14 @@ PROJECT_CREATE_SCHEMA = {
"description": "Project auto close",
"type": "boolean"
},
"auto_open": {
"description": "Project open when GNS3 start",
"type": "boolean"
},
"auto_start": {
"description": "Project start when opened",
"type": "boolean"
},
"project_id": {
"description": "Project UUID",
"type": ["string", "null"],
+13
View File
@@ -190,6 +190,10 @@ QEMU_CREATE_SCHEMA = {
"description": "Replicate the network connection state for links in Qemu",
"type": ["boolean", "null"],
},
"create_config_disk": {
"description": "Automatically create a config disk on HDD disk interface (secondary slave)",
"type": ["boolean", "null"],
},
"on_close": {
"description": "Action to execute on the VM is closed",
"enum": ["power_off", "shutdown_signal", "save_vm_state"],
@@ -380,6 +384,10 @@ QEMU_UPDATE_SCHEMA = {
"description": "Replicate the network connection state for links in Qemu",
"type": ["boolean", "null"],
},
"create_config_disk": {
"description": "Automatically create a config disk on HDD disk interface (secondary slave)",
"type": ["boolean", "null"],
},
"on_close": {
"description": "Action to execute on the VM is closed",
"enum": ["power_off", "shutdown_signal", "save_vm_state"],
@@ -583,6 +591,10 @@ QEMU_OBJECT_SCHEMA = {
"description": "Replicate the network connection state for links in Qemu",
"type": "boolean",
},
"create_config_disk": {
"description": "Automatically create a config disk on HDD disk interface (secondary slave)",
"type": ["boolean", "null"],
},
"on_close": {
"description": "Action to execute on the VM is closed",
"enum": ["power_off", "shutdown_signal", "save_vm_state"],
@@ -653,6 +665,7 @@ QEMU_OBJECT_SCHEMA = {
"kernel_command_line",
"legacy_networking",
"replicate_network_connection_state",
"create_config_disk",
"on_close",
"cpu_throttling",
"process_priority",
+9 -4
View File
@@ -116,7 +116,7 @@ QEMU_TEMPLATE_PROPERTIES = {
"hda_disk_interface": {
"description": "QEMU hda interface",
"enum": ["ide", "sata", "nvme", "scsi", "sd", "mtd", "floppy", "pflash", "virtio", "none"],
"default": "ide"
"default": "none"
},
"hdb_disk_image": {
"description": "QEMU hdb disk image path",
@@ -126,7 +126,7 @@ QEMU_TEMPLATE_PROPERTIES = {
"hdb_disk_interface": {
"description": "QEMU hdb interface",
"enum": ["ide", "sata", "nvme", "scsi", "sd", "mtd", "floppy", "pflash", "virtio", "none"],
"default": "ide"
"default": "none"
},
"hdc_disk_image": {
"description": "QEMU hdc disk image path",
@@ -136,7 +136,7 @@ QEMU_TEMPLATE_PROPERTIES = {
"hdc_disk_interface": {
"description": "QEMU hdc interface",
"enum": ["ide", "sata", "nvme", "scsi", "sd", "mtd", "floppy", "pflash", "virtio", "none"],
"default": "ide"
"default": "none"
},
"hdd_disk_image": {
"description": "QEMU hdd disk image path",
@@ -146,7 +146,7 @@ QEMU_TEMPLATE_PROPERTIES = {
"hdd_disk_interface": {
"description": "QEMU hdd interface",
"enum": ["ide", "sata", "nvme", "scsi", "sd", "mtd", "floppy", "pflash", "virtio", "none"],
"default": "ide"
"default": "none"
},
"cdrom_image": {
"description": "QEMU cdrom image path",
@@ -183,6 +183,11 @@ QEMU_TEMPLATE_PROPERTIES = {
"type": "boolean",
"default": True
},
"create_config_disk": {
"description": "Automatically create a config disk on HDD disk interface (secondary slave)",
"type": "boolean",
"default": False
},
"on_close": {
"description": "Action to execute on the VM is closed",
"enum": ["power_off", "shutdown_signal", "save_vm_state"],
+405 -4
View File
@@ -23,6 +23,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@angular-react/core
MIT
@angular/animations
MIT
@@ -30,7 +33,7 @@ MIT
MIT
The MIT License
Copyright (c) 2020 Google LLC.
Copyright (c) 2021 Google LLC.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -67,7 +70,7 @@ MIT
MIT
The MIT License
Copyright (c) 2020 Google LLC.
Copyright (c) 2021 Google LLC.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -446,8 +449,8 @@ bootstrap
MIT
The MIT License (MIT)
Copyright (c) 2011-2020 Twitter, Inc.
Copyright (c) 2011-2020 The Bootstrap Authors
Copyright (c) 2011-2021 Twitter, Inc.
Copyright (c) 2011-2021 The Bootstrap Authors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -468,6 +471,31 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
classnames
MIT
The MIT License (MIT)
Copyright (c) 2017 Jed Watson
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
core-js
MIT
Copyright (c) 2014-2020 Denis Pushkarev
@@ -515,6 +543,31 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
css-to-style
MIT
The MIT License (MIT)
Copyright (c) 2020 Jacob Buck
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
css-tree
MIT
Copyright (C) 2016-2019 by Roman Dvornov
@@ -538,6 +591,25 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
d
ISC
ISC License
Copyright (c) 2013-2019, Mariusz Nowak, @medikoo, medikoo.com
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
d3-array
BSD-3-Clause
Copyright 2010-2016 Mike Bostock
@@ -1615,6 +1687,90 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dom-helpers
MIT
The MIT License (MIT)
Copyright (c) 2015 Jason Quense
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
eev
MIT
es5-ext
ISC
ISC License
Copyright (c) 2011-2019, Mariusz Nowak, @medikoo, medikoo.com
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
es6-symbol
ISC
ISC License
Copyright (c) 2013-2019, Mariusz Nowak, @medikoo, medikoo.com
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
ext
ISC
ISC License
Copyright (c) 2011-2019, Mariusz Nowak, @medikoo, medikoo.com
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
mousetrap
Apache-2.0 WITH LLVM-exception
@@ -2031,6 +2187,157 @@ Apache-2.0
limitations under the License.
object-assign
MIT
The MIT License (MIT)
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
prop-types
MIT
MIT License
Copyright (c) 2013-present, Facebook, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
prop-types-extra
MIT
The MIT License (MIT)
Copyright (c) 2015 react-bootstrap
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
react
MIT
MIT License
Copyright (c) Facebook, Inc. and its affiliates.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
react-bootstrap
MIT
The MIT License (MIT)
Copyright (c) 2014-present Stephen J. Collings, Matthew Honnibal, Pieter Vanderwerff
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
react-dom
MIT
MIT License
Copyright (c) Facebook, Inc. and its affiliates.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
regenerator-runtime
MIT
MIT License
@@ -2494,6 +2801,31 @@ THE SOFTWARE.
scheduler
MIT
MIT License
Copyright (c) Facebook, Inc. and its affiliates.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
source-map
BSD-3-Clause
@@ -2543,6 +2875,31 @@ WTFPL
0. You just DO WHAT THE FUCK YOU WANT TO.
stylenames
MIT
MIT License
Copyright (c) 2016 Kevin
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
svg-crowbar
MIT
Copyright (c) 2013 The New York Times
@@ -2569,6 +2926,25 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
type
ISC
ISC License
Copyright (c) 2019, Mariusz Nowak, @medikoo, medikoo.com
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
uuid
MIT
The MIT License (MIT)
@@ -2594,6 +2970,31 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
warning
MIT
MIT License
Copyright (c) 2013-present, Facebook, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
webpack
MIT
Copyright JS Foundation and other contributors
@@ -1,5 +1,7 @@
GNS3 WebUI is web implementation of user interface for GNS3 software.
Current version: 2.2.19
Current version: 2020.4.0-beta.1
Bug Fixes & enhancements
+2 -2
View File
@@ -33,7 +33,7 @@
}
})();
</script>
<link rel="stylesheet" href="styles.2c581a0a91b7aa4f301d.css"><link rel="stylesheet" href="theme-default-dark.0c2d0b433828ffcae19b.css"><link rel="stylesheet" href="theme-default.3b76617748d593b91f1e.css"></head>
<link rel="stylesheet" href="styles.0942250f369e8f2d5439.css"></head>
<!-- <body class="mat-app-background" oncontextmenu="return false;"> -->
<body class="mat-app-background" oncontextmenu="return false;">
<app-root></app-root>
@@ -48,5 +48,5 @@
gtag('config', 'G-5D6FZL9923');
</script>
<script src="runtime.b3b0f3122d9d931b48a7.js" defer></script><script src="polyfills-es5.0e607f2e1ad7b467b484.js" nomodule defer></script><script src="polyfills.d6c8f09f3c92e4ec2a1f.js" defer></script><script src="main.653d70aeac9ae0ee8541.js" defer></script></body>
<script src="runtime.7425f237727658da0a30.js" defer></script><script src="polyfills-es5.b186ac526f152db6b6ba.js" nomodule defer></script><script src="polyfills.4fe1bb939733274d40c5.js" defer></script><script src="main.490039d90f88a1275b1d.js" defer></script></body>
</html>
@@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{"+/L5":function(e,t,n){var r=n("t1UP").isCustomProperty,i=n("vd7W").TYPE,o=n("4njK").mode,a=i.Ident,s=i.Hash,c=i.Colon,l=i.Semicolon,u=i.Delim;function h(e){return this.Raw(e,o.exclamationMarkOrSemicolon,!0)}function d(e){return this.Raw(e,o.exclamationMarkOrSemicolon,!1)}function f(){var e=this.scanner.tokenIndex,t=this.Value();return"Raw"!==t.type&&!1===this.scanner.eof&&this.scanner.tokenType!==l&&!1===this.scanner.isDelim(33)&&!1===this.scanner.isBalanceEdge(e)&&this.error(),t}function p(){var e=this.scanner.tokenStart;if(this.scanner.tokenType===u)switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 42:case 36:case 43:case 35:case 38:this.scanner.next();break;case 47:this.scanner.next(),this.scanner.isDelim(47)&&this.scanner.next()}return this.eat(this.scanner.tokenType===s?s:a),this.scanner.substrToCursor(e)}function m(){this.eat(u),this.scanner.skipSC();var e=this.consume(a);return"important"===e||e}e.exports={name:"Declaration",structure:{important:[Boolean,String],property:String,value:["Value","Raw"]},parse:function(){var e,t=this.scanner.tokenStart,n=this.scanner.tokenIndex,i=p.call(this),o=r(i),a=o?this.parseCustomProperty:this.parseValue,s=o?d:h,u=!1;return this.scanner.skipSC(),this.eat(c),o||this.scanner.skipSC(),e=a?this.parseWithFallback(f,s):s.call(this,this.scanner.tokenIndex),this.scanner.isDelim(33)&&(u=m.call(this),this.scanner.skipSC()),!1===this.scanner.eof&&this.scanner.tokenType!==l&&!1===this.scanner.isBalanceEdge(n)&&this.error(),{type:"Declaration",loc:this.getLocation(t,this.scanner.tokenStart),important:u,property:i,value:e}},generate:function(e){this.chunk(e.property),this.chunk(":"),this.node(e.value),e.important&&this.chunk(!0===e.important?"!important":"!"+e.important)},walkContext:"declaration"}},"+4/i":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n("qCKp"),i=n("odkN");r.Observable.prototype.let=i.letProto,r.Observable.prototype.letBind=i.letProto},"+EXs":function(e,t,n){"use strict";function r(e){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}n.d(t,"a",function(){return o});var i=n("JL25");function o(e,t){return!t||"object"!==r(t)&&"function"!=typeof t?Object(i.a)(e):t}},"+Kd2":function(e,t,n){var r=n("vd7W").TYPE,i=n("4njK").mode,o=r.Comma;e.exports=function(){var e=this.createList();return this.scanner.skipSC(),e.push(this.Identifier()),this.scanner.skipSC(),this.scanner.tokenType===o&&(e.push(this.Operator()),e.push(this.parseCustomProperty?this.Value(null):this.Raw(this.scanner.tokenIndex,i.exclamationMarkOrSemicolon,!1))),e}},"+Wds":function(e,t,n){"use strict";var r=String.prototype.indexOf;e.exports=function(e){return r.call(this,e,arguments[1])>-1}},"+XMV":function(e,t,n){"use strict";e.exports=n("GOzd")()?String.prototype.contains:n("+Wds")},"+oeQ":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n("qCKp"),i=n("H+DX");r.Observable.prototype.observeOn=i.observeOn},"+psR":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n("qCKp"),i=n("16Oq");r.Observable.prototype.retry=i.retry},"+qxJ":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n("qCKp"),i=n("GsYY");r.Observable.prototype.distinctUntilChanged=i.distinctUntilChanged},"+v8i":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n("qCKp");r.Observable.concat=r.concat},"+wdc":function(e,t,n){"use strict";var r,i,o,a;if("object"==typeof performance&&"function"==typeof performance.now){var s=performance;t.unstable_now=function(){return s.now()}}else{var c=Date,l=c.now();t.unstable_now=function(){return c.now()-l}}if("undefined"==typeof window||"function"!=typeof MessageChannel){var u=null,h=null,d=function e(){if(null!==u)try{var n=t.unstable_now();u(!0,n),u=null}catch(r){throw setTimeout(e,0),r}};r=function(e){null!==u?setTimeout(r,0,e):(u=e,setTimeout(d,0))},i=function(e,t){h=setTimeout(e,t)},o=function(){clearTimeout(h)},t.unstable_shouldYield=function(){return!1},a=t.unstable_forceFrameRate=function(){}}else{var f=window.setTimeout,p=window.clearTimeout;if("undefined"!=typeof console){var m=window.cancelAnimationFrame;"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),"function"!=typeof m&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var g=!1,v=null,b=-1,y=5,_=0;t.unstable_shouldYield=function(){return t.unstable_now()>=_},a=function(){},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a posiLine truncated
@@ -1 +0,0 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{"+/L5":function(e,t,n){var i=n("t1UP").isCustomProperty,r=n("vd7W").TYPE,o=n("4njK").mode,a=r.Ident,s=r.Hash,c=r.Colon,l=r.Semicolon,u=r.Delim;function h(e){return this.Raw(e,o.exclamationMarkOrSemicolon,!0)}function d(e){return this.Raw(e,o.exclamationMarkOrSemicolon,!1)}function f(){var e=this.scanner.tokenIndex,t=this.Value();return"Raw"!==t.type&&!1===this.scanner.eof&&this.scanner.tokenType!==l&&!1===this.scanner.isDelim(33)&&!1===this.scanner.isBalanceEdge(e)&&this.error(),t}function p(){var e=this.scanner.tokenStart;if(this.scanner.tokenType===u)switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 42:case 36:case 43:case 35:case 38:this.scanner.next();break;case 47:this.scanner.next(),this.scanner.isDelim(47)&&this.scanner.next()}return this.eat(this.scanner.tokenType===s?s:a),this.scanner.substrToCursor(e)}function m(){this.eat(u),this.scanner.skipSC();var e=this.consume(a);return"important"===e||e}e.exports={name:"Declaration",structure:{important:[Boolean,String],property:String,value:["Value","Raw"]},parse:function(){var e,t=this.scanner.tokenStart,n=this.scanner.tokenIndex,r=p.call(this),o=i(r),a=o?this.parseCustomProperty:this.parseValue,s=o?d:h,u=!1;return this.scanner.skipSC(),this.eat(c),o||this.scanner.skipSC(),e=a?this.parseWithFallback(f,s):s.call(this,this.scanner.tokenIndex),this.scanner.isDelim(33)&&(u=m.call(this),this.scanner.skipSC()),!1===this.scanner.eof&&this.scanner.tokenType!==l&&!1===this.scanner.isBalanceEdge(n)&&this.error(),{type:"Declaration",loc:this.getLocation(t,this.scanner.tokenStart),important:u,property:r,value:e}},generate:function(e){this.chunk(e.property),this.chunk(":"),this.node(e.value),e.important&&this.chunk(!0===e.important?"!important":"!"+e.important)},walkContext:"declaration"}},"+4/i":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=n("qCKp"),r=n("odkN");i.Observable.prototype.let=r.letProto,i.Observable.prototype.letBind=r.letProto},"+924":function(e,t,n){"use strict";n.d(t,"d",function(){return r}),n.d(t,"c",function(){return o}),n.d(t,"b",function(){return a}),n.d(t,"a",function(){return s});var i=n("9AQC");function r(e,t){return void 0===t&&(t=0),"string"!=typeof e||0===t||e.length<=t?e:e.substr(0,t)+"..."}function o(e,t){var n=e,i=n.length;if(i<=150)return n;t>i&&(t=i);var r=Math.max(t-60,0);r<5&&(r=0);var o=Math.min(r+140,i);return o>i-5&&(o=i),o===i&&(r=Math.max(o-140,0)),n=n.slice(r,o),r>0&&(n="'{snip} "+n),o<i&&(n+=" {snip}"),n}function a(e,t){if(!Array.isArray(e))return"";for(var n=[],i=0;i<e.length;i++){var r=e[i];try{n.push(String(r))}catch(o){n.push("[value cannot be serialized]")}}return n.join(t)}function s(e,t){return!!Object(i.k)(e)&&(Object(i.j)(t)?t.test(e):"string"==typeof t&&-1!==e.indexOf(t))}},"+A1k":function(e,t,n){"use strict";(function(e){function i(){return"[object process]"===Object.prototype.toString.call("undefined"!=typeof process?process:0)}function r(e,t){return e.require(t)}n.d(t,"b",function(){return i}),n.d(t,"a",function(){return r}),n("9AQC"),n("6PXS")}).call(this,n("3UD+")(e))},"+Kd2":function(e,t,n){var i=n("vd7W").TYPE,r=n("4njK").mode,o=i.Comma;e.exports=function(){var e=this.createList();return this.scanner.skipSC(),e.push(this.Identifier()),this.scanner.skipSC(),this.scanner.tokenType===o&&(e.push(this.Operator()),e.push(this.parseCustomProperty?this.Value(null):this.Raw(this.scanner.tokenIndex,r.exclamationMarkOrSemicolon,!1))),e}},"+oeQ":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=n("qCKp"),r=n("H+DX");i.Observable.prototype.observeOn=r.observeOn},"+psR":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=n("qCKp"),r=n("16Oq");i.Observable.prototype.retry=r.retry},"+qxJ":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=n("qCKp"),r=n("GsYY");i.Observable.prototype.distinctUntilChanged=r.distinctUntilChanged},"+v8i":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=n("qCKp");i.Observable.concat=i.concat},"/+5V":function(e,t){function n(e){function t(e){return null!==e&&("Type"===e.type||"Property"===e.type||"Keyword"===e.type)}var n=null;return null!==this.matched&&function i(r){if(Array.isArray(r.match)){for(var o=0;o<r.match.length;o++)if(i(r.match[o]))return t(r.syntax)&&n.unshift(r.syntax),!0}else if(r.node===e)return n=t(r.syntax)?[r.syntax]:[],!0;return!1}(this.matched),n}function i(e,t,i){var r=n.call(e,t);return null!==r&&r.some(i)}e.exports={getTrace:n,isType:function(e,t){return i(this,e,function(e){return"Type"===e.type&&e.name===t})},isProperty:function(e,t){return i(this,e,function(e){return"Property"===e.type&&e.name===t})},isKeyword:function(e){return i(this,e,function(e){return"Keyword"===e.type})}}},"/BcF":function(e,t){e.exports={name:"Selector",structure:{children:[["TypeSelector","IdSelector","ClassSelector","AttributeSelector","PseudoClassSelecLine truncated
@@ -0,0 +1,10 @@
/*!
* Bootstrap v4.6.0 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors
* Copyright 2011-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/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","Liberation 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,Liberation 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:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{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{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}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([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}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;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}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}[role=button]{cursor:pointer}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}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}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{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:0;list-style:none}.list-inline-item{display:inLine truncated
/*!*/}@keyframes cdk-text-field-autofill-start{
/*!*/}@-webkit-keyframes cdk-text-field-autofill-end{
/*!*/}@keyframes cdk-text-field-autofill-end{
/*!*/}.cdk-text-field-autofill-monitored:-webkit-autofill{-webkit-animation:cdk-text-field-autofill-start 0s 1ms;animation:cdk-text-field-autofill-start 0s 1ms}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){-webkit-animation:cdk-text-field-autofill-end 0s 1ms;animation:cdk-text-field-autofill-end 0s 1ms}textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{padding:2px 0!important;box-sizing:content-box!important;height:auto!important;overflow:hidden!important}textarea.cdk-textarea-autosize-measuring-firefox{padding:2px 0!important;box-sizing:content-box!important;height:0!important}.mat-focus-indicator,.mat-mdc-focus-indicator{position:relative}.dark-theme{color:#fff!important}.dark-theme .mat-badge-content{color:#fff;background:#0097a7}.cdk-high-contrast-active .dark-theme .mat-badge-content{outline:1px solid;border-radius:0}.dark-theme .mat-badge-accent .mat-badge-content{background:#b0bec5;color:rgba(0,0,0,.87)}.dark-theme .mat-badge-warn .mat-badge-content{color:#fff;background:#f44336}.dark-theme .mat-badge{position:relative}.dark-theme .mat-badge-hidden .mat-badge-content{display:none}.dark-theme .mat-badge-disabled .mat-badge-content{background:#677074;color:hsla(0,0%,100%,.5)}.dark-theme .mat-badge-content{position:absolute;text-align:center;display:inline-block;border-radius:50%;transition:transform .2s ease-in-out;transform:scale(.6);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none}.dark-theme .mat-badge-content._mat-animation-noopable,.dark-theme .ng-animate-disabled .mat-badge-content{transition:none}.dark-theme .mat-badge-content.mat-badge-active{transform:none}.dark-theme .mat-badge-small .mat-badge-content{width:16px;height:16px;line-height:16px}.dark-theme .mat-badge-small.mat-badge-above .mat-badge-content{top:-8px}.dark-theme .mat-badge-small.mat-badge-below .mat-badge-content{bottom:-8px}.dark-theme .mat-badge-small.mat-badge-before .mat-badge-content{left:-16px}[dir=rtl] .dark-theme .mat-badge-small.mat-badge-before .mat-badge-content{left:auto;right:-16px}.dark-theme .mat-badge-small.mat-badge-after .mat-badge-content{right:-16px}[dir=rtl] .dark-theme .mat-badge-small.mat-badge-after .mat-badge-content{right:auto;left:-16px}.dark-theme .mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-8px}[dir=rtl] .dark-theme .mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-8px}.dark-theme .mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-8px}[dir=rtl] .dark-theme .mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-8px}.dark-theme .mat-badge-medium .mat-badge-content{width:22px;height:22px;line-height:22px}.dark-theme .mat-badge-medium.mat-badge-above .mat-badge-content{top:-11px}.dark-theme .mat-badge-medium.mat-badge-below .mat-badge-content{bottom:-11px}.dark-theme .mat-badge-medium.mat-badge-before .mat-badge-content{left:-22px}[dir=rtl] .dark-theme .mat-badge-medium.mat-badge-before .mat-badge-content{left:auto;right:-22px}.dark-theme .mat-badge-medium.mat-badge-after .mat-badge-content{right:-22px}[dir=rtl] .dark-theme .mat-badge-medium.mat-badge-after .mat-badge-content{right:auto;left:-22px}.dark-theme .mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-11px}[dir=rtl] .dark-theme .mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-11px}.dark-theme .mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-11px}[dir=rtl] .dark-theme .mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-11px}.dark-theme .mat-badge-large .mat-badge-content{width:28px;height:28px;line-height:28px}.dark-theme .mat-badge-large.mat-badge-above .mat-badge-content{top:-14px}.dark-theme .mat-badge-large.mat-badge-below .mat-badge-content{bottom:-14px}.dark-theme .mat-badge-large.mat-badge-before .mat-badge-content{left:-28px}[dir=rtl] .dark-theme .mat-badge-large.mat-badge-before .mat-badge-content{left:auto;right:-28px}.dark-theme .mat-badge-large.mat-badge-after .mat-badge-content{right:-28px}[dir=rtl] .dark-theme .mat-badge-large.mat-badge-after .mat-badge-content{right:auto;left:-28px}.dark-theme .mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-14px}[dir=rtl] .dark-theme .mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-14px}.dark-theme .mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-14px}[dir=rtl] .dark-theme .mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-14px}.dark-theme .mat-bottom-sheet-container{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);background:#263238;color:#fff}.mat-button-toggle-appearance-standard .mat-button-toggle-label-content{line-height:48px}.dark-theme .mat-divider{border-top-color:hsla(0,0%,10Line truncated
@@ -1,6 +0,0 @@
/*!
* Bootstrap v4.5.3 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors
* Copyright 2011-2020 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/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:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{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{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}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([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}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;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}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}[role=button]{cursor:pointer}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}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}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{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:0;list-style:none}.list-inline-item{display:inlinLine truncated
@@ -1,5 +0,0 @@
@font-face{font-family:Material Icons;font-style:normal;font-weight:400;src:url(MaterialIcons-Regular.4674f8ded773cb03e824.eot);src:local("Material Icons"),local("MaterialIcons-Regular"),url(MaterialIcons-Regular.cff684e59ffb052d72cb.woff2) format("woff2"),url(MaterialIcons-Regular.83bebaf37c09c7e1c3ee.woff) format("woff"),url(MaterialIcons-Regular.5e7382c63da0098d634a.ttf) format("truetype")}.material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:"liga"}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:100;src:local("Roboto Thin "),local("Roboto-Thin"),url(roboto-latin-100.c2aa4ab115bf9c6057cb.woff2) format("woff2"),url(roboto-latin-100.a45108d3b34af91f9113.woff) format("woff")}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:100;src:local("Roboto Thin italic"),local("Roboto-Thinitalic"),url(roboto-latin-100italic.7f839a8652da29745ce4.woff2) format("woff2"),url(roboto-latin-100italic.451d4e559d6f57cdf6a1.woff) format("woff")}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:300;src:local("Roboto Light "),local("Roboto-Light"),url(roboto-latin-300.37a7069dc30fc663c878.woff2) format("woff2"),url(roboto-latin-300.865f928cbabcc9f8f2b5.woff) format("woff")}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:300;src:local("Roboto Light italic"),local("Roboto-Lightitalic"),url(roboto-latin-300italic.c64e7e354c88e613c77c.woff2) format("woff2"),url(roboto-latin-300italic.bd5b7a13f2c52b531a2a.woff) format("woff")}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:400;src:local("Roboto Regular "),local("Roboto-Regular"),url(roboto-latin-400.176f8f5bd5f02b3abfcf.woff2) format("woff2"),url(roboto-latin-400.49ae34d4cc6b98c00c69.woff) format("woff")}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:400;src:local("Roboto Regular italic"),local("Roboto-Regularitalic"),url(roboto-latin-400italic.d022bc70dc1bf7b3425d.woff2) format("woff2"),url(roboto-latin-400italic.b1d9d9904bfca8802a63.woff) format("woff")}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:500;src:local("Roboto Medium "),local("Roboto-Medium"),url(roboto-latin-500.f5b74d7ffcdf85b9dd60.woff2) format("woff2"),url(roboto-latin-500.cea99d3e3e13a3a599a0.woff) format("woff")}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:500;src:local("Roboto Medium italic"),local("Roboto-Mediumitalic"),url(roboto-latin-500italic.0d8bb5b3ee5f5dac9e44.woff2) format("woff2"),url(roboto-latin-500italic.18d00f739ff1e1c52db1.woff) format("woff")}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:700;src:local("Roboto Bold "),local("Roboto-Bold"),url(roboto-latin-700.c18ee39fb002ad58b6dc.woff2) format("woff2"),url(roboto-latin-700.2267169ee7270a22a963.woff) format("woff")}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:700;src:local("Roboto Bold italic"),local("Roboto-Bolditalic"),url(roboto-latin-700italic.7d8125ff7f707231fd89.woff2) format("woff2"),url(roboto-latin-700italic.9360531f9bb817f917f0.woff) format("woff")}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:900;src:local("Roboto Black "),local("Roboto-Black"),url(roboto-latin-900.870c8c1486f76054301a.woff2) format("woff2"),url(roboto-latin-900.bac8362e7a6ea60b6983.woff) format("woff")}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:900;src:local("Roboto Black italic"),local("Roboto-Blackitalic"),url(roboto-latin-900italic.cb5ad999740e9d8a8bd1.woff2) format("woff2"),url(roboto-latin-900italic.c20d916c1a1b094c1cec.woff) format("woff")}.mat-badge-content{font-weight:600;font-size:12px;font-family:Roboto,Helvetica Neue,sans-serif}.mat-badge-small .mat-badge-content{font-size:9px}.mat-badge-large .mat-badge-content{font-size:24px}.mat-h1,.mat-headline,.mat-typography h1{font:400 24px/32px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h2,.mat-title,.mat-typography h2{font:500 20px/32px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h3,.mat-subheading-2,.mat-typography h3{font:400 16px/28px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h4,.mat-subheading-1,.mat-typography h4{font:400 15px/24px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h5,.mat-typography h5{font:400 calc(14px * .83)/20px Roboto,Helvetica Neue,sans-serif;margin:0 0 12px}.mat-h6,.mat-typography h6{font:400 calc(14px * .67)/20px Roboto,Helvetica Neue,sans-serif;margin:0 0 12px}.mat-body-2,.mat-body-strong{font:500 14px/24px Roboto,HeLine truncated
/*!*/}@keyframes cdk-text-field-autofill-start{
/*!*/}@-webkit-keyframes cdk-text-field-autofill-end{
/*!*/}@keyframes cdk-text-field-autofill-end{
/*!*/}.cdk-text-field-autofill-monitored:-webkit-autofill{-webkit-animation:cdk-text-field-autofill-start 0s 1ms;animation:cdk-text-field-autofill-start 0s 1ms}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){-webkit-animation:cdk-text-field-autofill-end 0s 1ms;animation:cdk-text-field-autofill-end 0s 1ms}textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{padding:2px 0!important;box-sizing:content-box!important;height:auto!important;overflow:hidden!important}textarea.cdk-textarea-autosize-measuring-firefox{padding:2px 0!important;box-sizing:content-box!important;height:0!important}.mat-focus-indicator,.mat-mdc-focus-indicator{position:relative}.mat-ripple-element{background-color:hsla(0,0%,100%,.1)}.mat-option{color:#fff}.mat-option.mat-active,.mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled),.mat-option:focus:not(.mat-option-disabled),.mat-option:hover:not(.mat-option-disabled){background:hsla(0,0%,100%,.04)}.mat-option.mat-active{color:#fff}.mat-option.mat-option-disabled{color:hsla(0,0%,100%,.5)}.mat-primary .mat-option.mat-selected:not(.mat-option-disabled){color:#0097a7}.mat-accent .mat-option.mat-selected:not(.mat-option-disabled){color:#b0bec5}.mat-warn .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}.mat-optgroup-label{color:hsla(0,0%,100%,.7)}.mat-optgroup-disabled .mat-optgroup-label{color:hsla(0,0%,100%,.5)}.mat-pseudo-checkbox{color:hsla(0,0%,100%,.7)}.mat-pseudo-checkbox:after{color:#263238}.mat-pseudo-checkbox-disabled{color:#686868}.mat-primary .mat-pseudo-checkbox-checked,.mat-primary .mat-pseudo-checkbox-indeterminate{background:#0097a7}.mat-accent .mat-pseudo-checkbox-checked,.mat-accent .mat-pseudo-checkbox-indeterminate,.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-indeterminate{background:#b0bec5}.mat-warn .mat-pseudo-checkbox-checked,.mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#686868}.mat-app-background{background-color:#263238;color:#fff}.mat-elevation-z0{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-elevation-z1{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.mat-elevation-z2{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-elevation-z3{box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}.mat-elevation-z4{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.mat-elevation-z5{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12)}.mat-elevation-z6{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-elevation-z7{box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)}.mat-elevation-z8{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mat-elevation-z9{box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)}.mat-elevation-z10{box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)}.mat-elevation-z11{box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)}.mat-elevation-z12{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-elevation-z13{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)}.mat-elevation-z14{box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)}.mat-elevation-z15{box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)}.mat-elevation-z16{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.mat-elevation-z17{box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)}.mat-elevation-z18{box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)}.mat-elevation-z19{box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)}.mat-elevation-z20{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)}.mat-elevation-z21{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)}.mat-elevation-z22{box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)}.mat-elevation-z23{box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),Line truncated
@@ -1,5 +0,0 @@
@font-face{font-family:Material Icons;font-style:normal;font-weight:400;src:url(MaterialIcons-Regular.4674f8ded773cb03e824.eot);src:local("Material Icons"),local("MaterialIcons-Regular"),url(MaterialIcons-Regular.cff684e59ffb052d72cb.woff2) format("woff2"),url(MaterialIcons-Regular.83bebaf37c09c7e1c3ee.woff) format("woff"),url(MaterialIcons-Regular.5e7382c63da0098d634a.ttf) format("truetype")}.material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:"liga"}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:100;src:local("Roboto Thin "),local("Roboto-Thin"),url(roboto-latin-100.c2aa4ab115bf9c6057cb.woff2) format("woff2"),url(roboto-latin-100.a45108d3b34af91f9113.woff) format("woff")}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:100;src:local("Roboto Thin italic"),local("Roboto-Thinitalic"),url(roboto-latin-100italic.7f839a8652da29745ce4.woff2) format("woff2"),url(roboto-latin-100italic.451d4e559d6f57cdf6a1.woff) format("woff")}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:300;src:local("Roboto Light "),local("Roboto-Light"),url(roboto-latin-300.37a7069dc30fc663c878.woff2) format("woff2"),url(roboto-latin-300.865f928cbabcc9f8f2b5.woff) format("woff")}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:300;src:local("Roboto Light italic"),local("Roboto-Lightitalic"),url(roboto-latin-300italic.c64e7e354c88e613c77c.woff2) format("woff2"),url(roboto-latin-300italic.bd5b7a13f2c52b531a2a.woff) format("woff")}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:400;src:local("Roboto Regular "),local("Roboto-Regular"),url(roboto-latin-400.176f8f5bd5f02b3abfcf.woff2) format("woff2"),url(roboto-latin-400.49ae34d4cc6b98c00c69.woff) format("woff")}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:400;src:local("Roboto Regular italic"),local("Roboto-Regularitalic"),url(roboto-latin-400italic.d022bc70dc1bf7b3425d.woff2) format("woff2"),url(roboto-latin-400italic.b1d9d9904bfca8802a63.woff) format("woff")}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:500;src:local("Roboto Medium "),local("Roboto-Medium"),url(roboto-latin-500.f5b74d7ffcdf85b9dd60.woff2) format("woff2"),url(roboto-latin-500.cea99d3e3e13a3a599a0.woff) format("woff")}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:500;src:local("Roboto Medium italic"),local("Roboto-Mediumitalic"),url(roboto-latin-500italic.0d8bb5b3ee5f5dac9e44.woff2) format("woff2"),url(roboto-latin-500italic.18d00f739ff1e1c52db1.woff) format("woff")}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:700;src:local("Roboto Bold "),local("Roboto-Bold"),url(roboto-latin-700.c18ee39fb002ad58b6dc.woff2) format("woff2"),url(roboto-latin-700.2267169ee7270a22a963.woff) format("woff")}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:700;src:local("Roboto Bold italic"),local("Roboto-Bolditalic"),url(roboto-latin-700italic.7d8125ff7f707231fd89.woff2) format("woff2"),url(roboto-latin-700italic.9360531f9bb817f917f0.woff) format("woff")}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:900;src:local("Roboto Black "),local("Roboto-Black"),url(roboto-latin-900.870c8c1486f76054301a.woff2) format("woff2"),url(roboto-latin-900.bac8362e7a6ea60b6983.woff) format("woff")}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:900;src:local("Roboto Black italic"),local("Roboto-Blackitalic"),url(roboto-latin-900italic.cb5ad999740e9d8a8bd1.woff2) format("woff2"),url(roboto-latin-900italic.c20d916c1a1b094c1cec.woff) format("woff")}.mat-badge-content{font-weight:600;font-size:12px;font-family:Roboto,Helvetica Neue,sans-serif}.mat-badge-small .mat-badge-content{font-size:9px}.mat-badge-large .mat-badge-content{font-size:24px}.mat-h1,.mat-headline,.mat-typography h1{font:400 24px/32px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h2,.mat-title,.mat-typography h2{font:500 20px/32px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h3,.mat-subheading-2,.mat-typography h3{font:400 16px/28px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h4,.mat-subheading-1,.mat-typography h4{font:400 15px/24px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h5,.mat-typography h5{font:400 calc(14px * .83)/20px Roboto,Helvetica Neue,sans-serif;margin:0 0 12px}.mat-h6,.mat-typography h6{font:400 calc(14px * .67)/20px Roboto,Helvetica Neue,sans-serif;margin:0 0 12px}.mat-body-2,.mat-body-strong{font:500 14px/24px Roboto,HeLine truncated
/*!*/}@keyframes cdk-text-field-autofill-start{
/*!*/}@-webkit-keyframes cdk-text-field-autofill-end{
/*!*/}@keyframes cdk-text-field-autofill-end{
/*!*/}.cdk-text-field-autofill-monitored:-webkit-autofill{-webkit-animation:cdk-text-field-autofill-start 0s 1ms;animation:cdk-text-field-autofill-start 0s 1ms}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){-webkit-animation:cdk-text-field-autofill-end 0s 1ms;animation:cdk-text-field-autofill-end 0s 1ms}textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{padding:2px 0!important;box-sizing:content-box!important;height:auto!important;overflow:hidden!important}textarea.cdk-textarea-autosize-measuring-firefox{padding:2px 0!important;box-sizing:content-box!important;height:0!important}.mat-focus-indicator,.mat-mdc-focus-indicator{position:relative}.mat-ripple-element{background-color:rgba(0,0,0,.1)}.mat-option{color:rgba(0,0,0,.87)}.mat-option.mat-active,.mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled),.mat-option:focus:not(.mat-option-disabled),.mat-option:hover:not(.mat-option-disabled){background:hsla(0,0%,100%,.04)}.mat-option.mat-active{color:rgba(0,0,0,.87)}.mat-option.mat-option-disabled{color:rgba(0,0,0,.38)}.mat-primary .mat-option.mat-selected:not(.mat-option-disabled){color:#0097a7}.mat-accent .mat-option.mat-selected:not(.mat-option-disabled){color:#448aff}.mat-warn .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}.mat-optgroup-label{color:rgba(0,0,0,.54)}.mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,.38)}.mat-pseudo-checkbox{color:rgba(0,0,0,.54)}.mat-pseudo-checkbox:after{color:#fff}.mat-pseudo-checkbox-disabled{color:#b0b0b0}.mat-primary .mat-pseudo-checkbox-checked,.mat-primary .mat-pseudo-checkbox-indeterminate{background:#0097a7}.mat-accent .mat-pseudo-checkbox-checked,.mat-accent .mat-pseudo-checkbox-indeterminate,.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-indeterminate{background:#448aff}.mat-warn .mat-pseudo-checkbox-checked,.mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.mat-app-background{background-color:#fff;color:rgba(0,0,0,.87)}.mat-elevation-z0{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-elevation-z1{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.mat-elevation-z2{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-elevation-z3{box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}.mat-elevation-z4{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.mat-elevation-z5{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12)}.mat-elevation-z6{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-elevation-z7{box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)}.mat-elevation-z8{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mat-elevation-z9{box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)}.mat-elevation-z10{box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)}.mat-elevation-z11{box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)}.mat-elevation-z12{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-elevation-z13{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)}.mat-elevation-z14{box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)}.mat-elevation-z15{box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)}.mat-elevation-z16{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.mat-elevation-z17{box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)}.mat-elevation-z18{box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)}.mat-elevation-z19{box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)}.mat-elevation-z20{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)}.mat-elevation-z21{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)}.mat-elevation-z22{box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)}.mat-elevation-z23{box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(Line truncated
+2 -2
View File
@@ -23,8 +23,8 @@
# or negative for a release candidate or beta (after the base version
# number has been incremented)
__version__ = "2.2.17"
__version_info__ = (2, 2, 17, 0)
__version__ = "2.2.19"
__version_info__ = (2, 2, 19, 0)
if "dev" in __version__:
try:
+1 -1
View File
@@ -2,7 +2,7 @@ jsonschema==3.2.0
aiohttp==3.6.2
aiohttp-cors==0.7.0
aiofiles==0.5.0
Jinja2>=2.7.3
Jinja2==2.11.3
sentry-sdk>=0.14.4
psutil==5.6.7
async-timeout==3.0.1
+1
View File
@@ -337,6 +337,7 @@ def test_set_qemu_path_kvm_binary(vm, fake_qemu_binary):
async def test_set_platform(compute_project, manager):
manager.config_disk = None # avoids conflict with config.img support
with patch("shutil.which", return_value="/bin/qemu-system-x86_64") as which_mock:
with patch("gns3server.compute.qemu.QemuVM._check_qemu_path"):
vm = QemuVM("test", "00010203-0405-0607-0809-0a0b0c0d0e0f", compute_project, manager, platform="x86_64")
+2 -1
View File
@@ -18,7 +18,7 @@
import uuid
import os
import pytest
from unittest.mock import patch
from unittest.mock import patch, MagicMock
from tests.utils import asyncio_patch
from gns3server.compute.vpcs import VPCS
@@ -41,6 +41,7 @@ async def vpcs(loop, port_manager):
async def qemu(loop, port_manager):
Qemu._instance = None
Qemu._init_config_disk = MagicMock() # do not create the config.img image
qemu = Qemu.instance()
qemu.port_manager = port_manager
return qemu
+2 -2
View File
@@ -117,8 +117,8 @@ def images_dir(config):
path = config.get_section_config("Server").get("images_path")
os.makedirs(path, exist_ok=True)
os.makedirs(os.path.join(path, "QEMU"))
os.makedirs(os.path.join(path, "IOU"))
os.makedirs(os.path.join(path, "QEMU"), exist_ok=True)
os.makedirs(os.path.join(path, "IOU"), exist_ok=True)
return path
+2 -1
View File
@@ -277,7 +277,8 @@ async def test_images(compute_api, fake_qemu_vm):
response = await compute_api.get("/qemu/images")
assert response.status == 200
assert response.json == [{"filename": "linux载.img", "path": "linux载.img", "md5sum": "c4ca4238a0b923820dcc509a6f75849b", "filesize": 1}]
assert response.json == [{'filename': 'config.img', 'filesize': 1048576, 'md5sum': '0ab49056760ae1db6c25376446190b47', 'path': 'config.img'},
{"filename": "linux载.img", "path": "linux载.img", "md5sum": "c4ca4238a0b923820dcc509a6f75849b", "filesize": 1}]
@pytest.mark.skipif(sys.platform.startswith("win"), reason="Does not work on Windows")
@@ -669,13 +669,13 @@ async def test_qemu_template_create(controller_api):
"default_name_format": "{name}-{0}",
"first_port_name": "",
"hda_disk_image": "IOSvL2-15.2.4.0.55E.qcow2",
"hda_disk_interface": "ide",
"hda_disk_interface": "none",
"hdb_disk_image": "",
"hdb_disk_interface": "ide",
"hdb_disk_interface": "none",
"hdc_disk_image": "",
"hdc_disk_interface": "ide",
"hdc_disk_interface": "none",
"hdd_disk_image": "",
"hdd_disk_interface": "ide",
"hdd_disk_interface": "none",
"initrd": "",
"kernel_command_line": "",
"kernel_image": "",