Merge remote-tracking branch 'origin/3.0' into gh-pages
29
CHANGELOG
@ -1,5 +1,33 @@
|
||||
# Change Log
|
||||
|
||||
## 3.0.4 25/02/2025
|
||||
|
||||
* Require minimum 8 characters for passwords
|
||||
* Bundle web-ui v3.0.4
|
||||
* Upgrade dependencies
|
||||
* Fix auto idle-pc for IOS templates
|
||||
* Update schemas to add constraints for values like ram, nvram etc.
|
||||
* Install custom symbols. Fixes #2492
|
||||
* Fix VMware add ubridge connection. Fixes #2490
|
||||
|
||||
## 3.0.3 22/01/2025
|
||||
|
||||
* Bundle web-ui v3.0.3
|
||||
* Refactor command line arguments parsing
|
||||
* Fix capture on IOU/IOL links. Fixes #2477
|
||||
* Use Python 3.9 to publish API documentation
|
||||
* Upgrade dependencies
|
||||
|
||||
## 2.2.53 21/01/2025
|
||||
|
||||
* Bundle web-ui v2.2.53
|
||||
* Add more information when patching .vbox file. Ref https://github.com/GNS3/gns3-gui/issues/3542
|
||||
* Increase timeout to run compute HTTP queries. Fixes #2461
|
||||
* Use 'allow_methods="*"' in aiohttp_cors.ResourceOptions(). Fixes #2459
|
||||
* Upgrade dependencies
|
||||
* Update remote-install.sh to support a custom repository and the deb822 source format
|
||||
* Fix: do not use the iourc file if IOU licence check is not enabled
|
||||
|
||||
## 3.0.2 03/01/2025
|
||||
|
||||
* Bundle web-ui v3.0.2
|
||||
@ -31,7 +59,6 @@
|
||||
## 2.2.52 02/12/2024
|
||||
|
||||
* Bundle web-ui v2.2.52
|
||||
* Sync appliances
|
||||
* Remove restrictions based on file extension when listing images and fix ELF header checks
|
||||
* Fix use project name instead of ID for fast duplication when running local server. Fixes #2446
|
||||
* Overwrite user resources when the originals have changed.
|
||||
|
@ -1,7 +1,7 @@
|
||||
pytest==8.3.3
|
||||
pytest==8.3.4
|
||||
flake8==7.1.1
|
||||
pytest-timeout==2.3.1
|
||||
pytest-asyncio==0.21.2
|
||||
pytest-asyncio==0.25.2
|
||||
requests==2.32.3
|
||||
httpx==0.27.2 # version 0.24.1 is required by httpx_ws
|
||||
httpx_ws==0.6.2
|
||||
httpx==0.28.1
|
||||
httpx_ws==0.7.1
|
||||
|
@ -284,7 +284,7 @@ async def start_iou_node_capture(
|
||||
"""
|
||||
|
||||
pcap_file_path = os.path.join(node.project.capture_working_directory(), node_capture_data.capture_file_name)
|
||||
await node.start_capture(adapter_number, pcap_file_path)
|
||||
await node.start_capture(adapter_number, port_number, pcap_file_path)
|
||||
return {"pcap_file_path": str(pcap_file_path)}
|
||||
|
||||
|
||||
|
@ -188,7 +188,7 @@ async def vmware_vms(compute_id: Union[str, UUID]) -> List[schemas.ComputeVMware
|
||||
|
||||
|
||||
@router.post("/{compute_id}/dynamips/auto_idlepc")
|
||||
async def dynamips_autoidlepc(compute_id: Union[str, UUID], auto_idle_pc: schemas.AutoIdlePC) -> str:
|
||||
async def dynamips_autoidlepc(compute_id: Union[str, UUID], auto_idle_pc: schemas.AutoIdlePC):
|
||||
"""
|
||||
Find a suitable Idle-PC value for a given IOS image. This may take a few minutes.
|
||||
"""
|
||||
|
56
gns3server/appliances/alpine-cloud.gns3a
Normal file
@ -0,0 +1,56 @@
|
||||
{
|
||||
"appliance_id": "edbaa01e-2032-4ee2-bb9f-dd5c4d84c270",
|
||||
"name": "Alpine Cloud Guest",
|
||||
"category": "guest",
|
||||
"description": "Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox.",
|
||||
"vendor_name": "Alpine Linux Development Team",
|
||||
"vendor_url": "http://alpinelinux.org",
|
||||
"vendor_logo_url": "https://raw.githubusercontent.com/GNS3/gns3-registry/master/vendor-logos/Alpine Linux.png",
|
||||
"documentation_url": "http://wiki.alpinelinux.org",
|
||||
"product_name": "Alpine Linux",
|
||||
"product_url": "https://www.alpinelinux.org/cloud/",
|
||||
"registry_version": 4,
|
||||
"status": "stable",
|
||||
"maintainer": "GNS3 Team",
|
||||
"maintainer_email": "developers@gns3.net",
|
||||
"usage": "\nUsername: alpine\nPassword: alpine",
|
||||
"port_name_format": "Ethernet{0}",
|
||||
"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": "generic_alpine-3.21.2-x86_64-bios-cloudinit-r0.qcow2",
|
||||
"version": "3.21.2",
|
||||
"md5sum": "b40825dff2867e0ffaffbc4c87674462",
|
||||
"filesize": 189726720,
|
||||
"download_url": "https://www.alpinelinux.org/cloud/",
|
||||
"direct_download_url": "https://dl-cdn.alpinelinux.org/alpine/v3.21/releases/cloud/generic_alpine-3.21.2-x86_64-bios-cloudinit-r0.qcow2"
|
||||
},
|
||||
{
|
||||
"filename": "alpine-cloud-init-data.iso",
|
||||
"version": "1.0",
|
||||
"md5sum": "b1b4b16cc3bf0250c0fa377c19c97683",
|
||||
"filesize": 374784,
|
||||
"download_url": "https://github.com/GNS3/gns3-registry/tree/master/cloud-init/alpine-cloud",
|
||||
"direct_download_url": "https://github.com/GNS3/gns3-registry/raw/master/cloud-init/alpine-cloud/alpine-cloud-init-data.iso"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "3.21.2",
|
||||
"images": {
|
||||
"hda_disk_image": "generic_alpine-3.21.2-x86_64-bios-cloudinit-r0.qcow2",
|
||||
"cdrom_image": "alpine-cloud-init-data.iso"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
@ -5,9 +5,9 @@
|
||||
"description": "The Adaptive Security Virtual Appliance is a virtualized network security solution based on the market-leading Cisco ASA 5500-X Series firewalls. It supports both traditional and next-generation software-defined network (SDN) and Cisco Application Centric Infrastructure (ACI) environments to provide policy enforcement and threat inspection across heterogeneous multisite environments.",
|
||||
"vendor_name": "Cisco",
|
||||
"vendor_url": "http://www.cisco.com/",
|
||||
"documentation_url": "http://www.cisco.com/c/en/us/support/security/virtual-adaptive-security-appliance-firewall/products-installation-guides-list.html",
|
||||
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/asav/",
|
||||
"product_name": "ASAv",
|
||||
"product_url": "http://www.cisco.com/c/en/us/products/security/virtual-adaptive-security-appliance-firewall/index.html",
|
||||
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||
"registry_version": 4,
|
||||
"status": "stable",
|
||||
"maintainer": "GNS3 Team",
|
||||
|
@ -5,9 +5,9 @@
|
||||
"description": "The Cisco Catalyst 8000V Edge Software is a virtual, form-factor router deployed on a virtual machine (VM) running on an x86 server hardware.",
|
||||
"vendor_name": "Cisco",
|
||||
"vendor_url": "http://www.cisco.com/",
|
||||
"documentation_url": "https://www.cisco.com/c/en/us/td/docs/routers/C8000V/Configuration/c8000v-installation-configuration-guide.html",
|
||||
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/cat-8000v/",
|
||||
"product_name": "c8000v",
|
||||
"product_url": "https://www.cisco.com/c/en/us/support/routers/catalyst-8000v-edge-software/series.html",
|
||||
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||
"registry_version": 4,
|
||||
"status": "stable",
|
||||
"maintainer": "GNS3 Team",
|
||||
@ -24,6 +24,13 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "c8000v-universalk9_8G_serial.17.15.01a.qcow2",
|
||||
"version": "17.15.01a 8G",
|
||||
"md5sum": "41efa0aedd67f1f57cde1263c79d9ff6",
|
||||
"filesize": 1846280192,
|
||||
"download_url": "https://software.cisco.com/download/home/286327102/type/282046477/release/IOSXE-17.15.1a"
|
||||
},
|
||||
{
|
||||
"filename": "c8000v-universalk9_8G_serial.17.09.04a.qcow2",
|
||||
"version": "17.09.04a 8G",
|
||||
@ -68,6 +75,12 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "17.15.01a 8G",
|
||||
"images": {
|
||||
"hda_disk_image": "c8000v-universalk9_8G_serial.17.15.01a.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "17.09.04a 8G",
|
||||
"images": {
|
||||
|
@ -5,9 +5,9 @@
|
||||
"description": "Cisco IOS-XE 9000v. This appliance requires 16GB of memory to run! Recommend 2 or more vCPUs for faster boot performance",
|
||||
"vendor_name": "Cisco",
|
||||
"vendor_url": "http://www.cisco.com/",
|
||||
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/2-5/#!cml-release-notes",
|
||||
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/cat-9000v/",
|
||||
"product_name": "Cisco CAT IOS-XE 9000v",
|
||||
"product_url": "http://virl.cisco.com/",
|
||||
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||
"registry_version": 4,
|
||||
"status": "experimental",
|
||||
"maintainer": "GNS3 Team",
|
||||
|
@ -5,9 +5,9 @@
|
||||
"description": "The Cisco Cloud Services Router 1000V (CSR 1000V) is a router and network services platform in virtual form factor that is intended for deployment in cloud and virtual data centers. It is optimized to serve as a single-tenant or multitenant WAN gateway. Using proven, industry-leading Cisco IOS\u00ae XE Software networking and security features, the CSR 1000V enables enterprises to transparently extend their WANs into external provider-hosted clouds and cloud providers to offer their tenants enterprise-class networking services.",
|
||||
"vendor_name": "Cisco",
|
||||
"vendor_url": "http://www.cisco.com/",
|
||||
"documentation_url": "http://www.cisco.com/c/en/us/support/routers/cloud-services-router-1000v-series/products-installation-and-configuration-guides-list.html",
|
||||
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/csr-1000v/",
|
||||
"product_name": "CSR1000v",
|
||||
"product_url": "http://www.cisco.com/c/en/us/support/routers/cloud-services-router-1000v-series/tsd-products-support-series-home.html",
|
||||
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||
"registry_version": 4,
|
||||
"status": "stable",
|
||||
"maintainer": "GNS3 Team",
|
||||
@ -169,7 +169,7 @@
|
||||
"version": "16.4.1",
|
||||
"md5sum": "3428e0dcf5132a1b11ab7696d8c61b2e",
|
||||
"filesize": 1261961216,
|
||||
"download_url": "https://virl.mediuscorp.com/my-account/"
|
||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
||||
},
|
||||
{
|
||||
"filename": "csr1000v-universalk9.16.6.1.qcow2",
|
||||
|
@ -5,8 +5,9 @@
|
||||
"description": "Cisco Virtual IOS allows user to run IOS on a standard computer.",
|
||||
"vendor_name": "Cisco",
|
||||
"vendor_url": "http://www.cisco.com/",
|
||||
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/iol/",
|
||||
"product_name": "IOSv",
|
||||
"product_url": "http://virl.cisco.com/",
|
||||
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||
"registry_version": 4,
|
||||
"status": "stable",
|
||||
"maintainer": "GNS3 Team",
|
||||
@ -25,12 +26,11 @@
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "IOSv_startup_config.img",
|
||||
"version": "1",
|
||||
"md5sum": "bc605651c4688276f81fd59dcf5cc786",
|
||||
"filesize": 1048576,
|
||||
"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.159-3.m9.qcow2",
|
||||
"version": "15.9(3)M9",
|
||||
"md5sum": "01b707a2e33185d6d33e0255ced45d23",
|
||||
"filesize": 57323008,
|
||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
||||
},
|
||||
{
|
||||
"filename": "vios-adventerprisek9-m.spa.159-3.m8.qcow2",
|
||||
@ -101,9 +101,24 @@
|
||||
"md5sum": "79f613ac3b179d5a64520730925130b2",
|
||||
"filesize": 127926272,
|
||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
||||
},
|
||||
{
|
||||
"filename": "IOSv_startup_config.img",
|
||||
"version": "1",
|
||||
"md5sum": "bc605651c4688276f81fd59dcf5cc786",
|
||||
"filesize": 1048576,
|
||||
"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"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "15.9(3)M9",
|
||||
"images": {
|
||||
"hda_disk_image": "vios-adventerprisek9-m.spa.159-3.m9.qcow2",
|
||||
"hdb_disk_image": "IOSv_startup_config.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "15.9(3)M8",
|
||||
"images": {
|
||||
|
@ -5,8 +5,9 @@
|
||||
"description": "Cisco Virtual IOS L2 allows user to run a IOS switching image on a standard computer.",
|
||||
"vendor_name": "Cisco",
|
||||
"vendor_url": "http://www.cisco.com/",
|
||||
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/iosvl2/",
|
||||
"product_name": "IOSvL2",
|
||||
"product_url": "http://virl.cisco.com/",
|
||||
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||
"registry_version": 4,
|
||||
"status": "stable",
|
||||
"maintainer": "GNS3 Team",
|
||||
|
@ -5,9 +5,9 @@
|
||||
"description": "IOS XRv supports the control plane features introduced in Cisco IOS XR.",
|
||||
"vendor_name": "Cisco",
|
||||
"vendor_url": "http://www.cisco.com/",
|
||||
"documentation_url": "http://www.cisco.com/c/en/us/td/docs/ios_xr_sw/ios_xrv/release/notes/xrv-rn.html",
|
||||
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/ios-xrv/",
|
||||
"product_name": "IOS XRv",
|
||||
"product_url": "http://virl.cisco.com/",
|
||||
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||
"registry_version": 4,
|
||||
"status": "stable",
|
||||
"maintainer": "GNS3 Team",
|
||||
|
@ -5,9 +5,9 @@
|
||||
"description": "IOS XRv 9000 (aka Sunstone) is the 1st VM released running the 64-bit IOS XR operating system as used on the NCS-6xxx platform. This appliance requires 4 vCPUs and 16GB of memory to run!",
|
||||
"vendor_name": "Cisco",
|
||||
"vendor_url": "http://www.cisco.com/",
|
||||
"documentation_url": "http://www.cisco.com/c/en/us/td/docs/ios_xr_sw/ios_xrv/release/notes/xrv-rn.html",
|
||||
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/ios-xrv-9000/",
|
||||
"product_name": "IOS XRv 9000",
|
||||
"product_url": "http://virl.cisco.com/",
|
||||
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||
"registry_version": 4,
|
||||
"status": "experimental",
|
||||
"maintainer": "GNS3 Team",
|
||||
@ -26,92 +26,35 @@
|
||||
"options": "-smp 4 -cpu host"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "xrv9k-fullk9-x-24.3.1.qcow2",
|
||||
"version": "24.3.1",
|
||||
"md5sum": "bd047c457e29952f265583f299bab845",
|
||||
"filesize": 1704658432,
|
||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
||||
},
|
||||
{
|
||||
"filename": "xrv9k-fullk9-x-7.7.1.qcow2",
|
||||
"version": "7.7.1",
|
||||
"md5sum": "682fff40d2ff373d8da3342906553b54",
|
||||
"filesize": 1643905024,
|
||||
"download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/7.1.1"
|
||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
||||
},
|
||||
{
|
||||
"filename": "xrv9k-fullk9-x-7.1.1.qcow2",
|
||||
"version": "7.1.1",
|
||||
"md5sum": "dcf241e3f8df0151fec2c7bfac9d96ac",
|
||||
"filesize": 1443758080,
|
||||
"download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/7.1.1"
|
||||
},
|
||||
{
|
||||
"filename": "xrv9k-fullk9-x-7.0.1.qcow2",
|
||||
"version": "7.0.1",
|
||||
"md5sum": "ca2817767fa546e303c3c536e211d33e",
|
||||
"filesize": 1446445056,
|
||||
"download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/7.0.1"
|
||||
},
|
||||
{
|
||||
"filename": "xrv9k-fullk9-x-6.6.2.qcow2",
|
||||
"version": "6.6.2",
|
||||
"md5sum": "fd630be3c449e625073286a3a66021ae",
|
||||
"filesize": 1452998656,
|
||||
"download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/6.6.2"
|
||||
},
|
||||
{
|
||||
"filename": "xrv9k-fullk9-x-6.5.3.qcow2",
|
||||
"version": "6.5.3",
|
||||
"md5sum": "71f018e3ea895b663129090fb4f0ff40",
|
||||
"filesize": 1205075968,
|
||||
"download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/6.5.3"
|
||||
},
|
||||
{
|
||||
"filename": "xrv9k-fullk9-x-6.5.2.qcow2",
|
||||
"version": "6.5.2",
|
||||
"md5sum": "506d9e23dda7365c99dd82b613859697",
|
||||
"filesize": 1205010432,
|
||||
"download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/6.5.1"
|
||||
},
|
||||
{
|
||||
"filename": "xrv9k-fullk9-x-6.5.1.qcow2",
|
||||
"version": "6.5.1",
|
||||
"md5sum": "730868e7cd46de9aa2e950899c7f9498",
|
||||
"filesize": 1208811520,
|
||||
"download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/6.5.1"
|
||||
},
|
||||
{
|
||||
"filename": "xrv9k-fullk9-x-6.4.2.qcow2",
|
||||
"version": "6.4.2",
|
||||
"md5sum": "6958763192c7bb59a1b8049d377de1b4",
|
||||
"filesize": 1311703040,
|
||||
"download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/6.4.2"
|
||||
},
|
||||
{
|
||||
"filename": "xrv9k-fullk9-x-6.4.1.qcow2",
|
||||
"version": "6.4.1",
|
||||
"md5sum": "9c56b684e307706005a503e289cb9317",
|
||||
"filesize": 1304887296,
|
||||
"download_url": "https://software.cisco.com/download/home/286288939/type/280805694/release/6.4.1"
|
||||
},
|
||||
{
|
||||
"filename": "xrv9k-fullk9-x-6.2.25.qcow2",
|
||||
"version": "6.2.25",
|
||||
"md5sum": "3f54e62b6f7cedfb2607233e5e465766",
|
||||
"filesize": 1190723584,
|
||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
||||
},
|
||||
{
|
||||
"filename": "xrv9k-fullk9-x.qcow2-6.0.1",
|
||||
"version": "6.0.1",
|
||||
"md5sum": "e20d046807075046c35b6ce7d6766a7f",
|
||||
"filesize": 2109210624,
|
||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
||||
},
|
||||
{
|
||||
"filename": "xrv9k-fullk9-x.qcow2-6.0.0",
|
||||
"version": "6.0.0",
|
||||
"md5sum": "64c538c34252aaeb4ed1ddb93d6803fd",
|
||||
"filesize": 2572943360,
|
||||
"download_url": "https://learningnetworkstore.cisco.com/myaccount"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "24.3.1",
|
||||
"images": {
|
||||
"hda_disk_image": "xrv9k-fullk9-x-24.3.1.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.7.1",
|
||||
"images": {
|
||||
@ -123,66 +66,6 @@
|
||||
"images": {
|
||||
"hda_disk_image": "xrv9k-fullk9-x-7.1.1.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.0.1",
|
||||
"images": {
|
||||
"hda_disk_image": "xrv9k-fullk9-x-7.0.1.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.6.2",
|
||||
"images": {
|
||||
"hda_disk_image": "xrv9k-fullk9-x-6.6.2.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.5.3",
|
||||
"images": {
|
||||
"hda_disk_image": "xrv9k-fullk9-x-6.5.3.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.5.2",
|
||||
"images": {
|
||||
"hda_disk_image": "xrv9k-fullk9-x-6.5.2.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.5.1",
|
||||
"images": {
|
||||
"hda_disk_image": "xrv9k-fullk9-x-6.5.1.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.4.2",
|
||||
"images": {
|
||||
"hda_disk_image": "xrv9k-fullk9-x-6.4.2.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.4.1",
|
||||
"images": {
|
||||
"hda_disk_image": "xrv9k-fullk9-x-6.4.1.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.2.25",
|
||||
"images": {
|
||||
"hda_disk_image": "xrv9k-fullk9-x-6.2.25.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.0.1",
|
||||
"images": {
|
||||
"hda_disk_image": "xrv9k-fullk9-x.qcow2-6.0.1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.0.0",
|
||||
"images": {
|
||||
"hda_disk_image": "xrv9k-fullk9-x.qcow2-6.0.0"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -5,7 +5,9 @@
|
||||
"description": "Cisco IOS on UNIX Layer 2 image.",
|
||||
"vendor_name": "Cisco",
|
||||
"vendor_url": "http://www.cisco.com",
|
||||
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/iol-l2/",
|
||||
"product_name": "Cisco IOU L2",
|
||||
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||
"registry_version": 4,
|
||||
"status": "experimental",
|
||||
"maintainer": "GNS3 Team",
|
||||
|
@ -5,7 +5,9 @@
|
||||
"description": "Cisco IOS on UNIX Layer 3 image.",
|
||||
"vendor_name": "Cisco",
|
||||
"vendor_url": "http://www.cisco.com",
|
||||
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/iol/",
|
||||
"product_name": "Cisco IOU L3",
|
||||
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||
"registry_version": 4,
|
||||
"status": "experimental",
|
||||
"maintainer": "GNS3 Team",
|
||||
|
@ -5,8 +5,9 @@
|
||||
"description": "NXOSv is a reference platform for an implementation of the Cisco Nexus operating system, based on the Nexus 7000-series platforms, running as a full virtual machine on a hypervisor. This includes NXAPI and MPLS LDP support.",
|
||||
"vendor_name": "Cisco",
|
||||
"vendor_url": "http://www.cisco.com/",
|
||||
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/nx-os/",
|
||||
"product_name": "NX-OSv",
|
||||
"product_url": "http://virl.cisco.com/",
|
||||
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||
"registry_version": 4,
|
||||
"status": "stable",
|
||||
"maintainer": "GNS3 Team",
|
||||
|
@ -5,8 +5,9 @@
|
||||
"description": "The NX-OSv 9000 is a virtual platform that is designed to simulate the control plane aspects of a network element running Cisco Nexus 9000 software. The NX-OSv 9000 shares the same software image running on Cisco Nexus 9000 hardware platform although no specific hardware emulation is implemented. When the software runs as a virtual machine, line card (LC) ASIC provisioning or any interaction from the control plane to hardware ASIC is handled by the NX-OSv 9000 software data plane.\nThe NX-OSv 9000 for the Cisco Nexus 9000 Series provides a useful tool to enable the devops model and rapidly test changes to the infrastructure or to infrastructure automation tools. This enables network simulations in large scale for customers to validate configuration changes on a simulated network prior to applying them on a production network. Some users have also expressed interest in using the simulation system for feature test ,verification, and automation tooling development and test simualtion prior to deployment. NX-OSv 9000 can be used as a programmability vehicle to validate software defined networks (SDNs) and Network Function Virtualization (NFV) based solutions.",
|
||||
"vendor_name": "Cisco",
|
||||
"vendor_url": "http://www.cisco.com/",
|
||||
"documentation_url": "http://www.cisco.com/c/en/us/td/docs/switches/datacenter/nexus9000/sw/7-x/nx-osv/configuration/guide/b_NX-OSv_9000/b_NX-OSv_chapter_01.html",
|
||||
"documentation_url": "https://developer.cisco.com/docs/modeling-labs/nx-os-9000/",
|
||||
"product_name": "NX-OSv 9000",
|
||||
"product_url": "https://developer.cisco.com/modeling-labs/",
|
||||
"registry_version": 4,
|
||||
"status": "stable",
|
||||
"availability": "service-contract",
|
||||
@ -26,12 +27,33 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "nexus9500v64.10.5.1.F.qcow2",
|
||||
"version": "9500v 10.5.1.F",
|
||||
"md5sum": "2fa6fb4dd4c5e49d53896d60fa746e59",
|
||||
"filesize": 2388459520,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.5(1)"
|
||||
},
|
||||
{
|
||||
"filename": "nexus9300v64.10.5.1.F.qcow2",
|
||||
"version": "9300v 10.5.1.F",
|
||||
"md5sum": "2bbc767debbc7c1144eabe176ae67503",
|
||||
"filesize": 2388393984,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.5(1)"
|
||||
},
|
||||
{
|
||||
"filename": "nexus9500v64.10.3.1.F.qcow2",
|
||||
"version": "9500v 10.3.1.F",
|
||||
"md5sum": "41e3c1c0c003b13f1bf774f0d1873e87",
|
||||
"filesize": 2097510400,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.3(1)"
|
||||
},
|
||||
{
|
||||
"filename": "nexus9300v64.10.3.1.F.qcow2",
|
||||
"version": "9300v 10.3.1.F",
|
||||
"md5sum": "a6ffd2501a5791c11cee319943b912da",
|
||||
"filesize": 2097086464,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.1(1)"
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.3(1)"
|
||||
},
|
||||
{
|
||||
"filename": "nexus9500v64.10.1.1.qcow2",
|
||||
@ -47,181 +69,6 @@
|
||||
"filesize": 1990983680,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/10.1(1)"
|
||||
},
|
||||
{
|
||||
"filename": "nexus9500v.9.3.13.qcow2",
|
||||
"version": "9500v 9.3.13",
|
||||
"md5sum": "bacf0f664ee34625c85a9f278b2466a2",
|
||||
"filesize": 2248409088,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(13)"
|
||||
},
|
||||
{
|
||||
"filename": "nexus9300v.9.3.13.qcow2",
|
||||
"version": "9300v 9.3.13",
|
||||
"md5sum": "d8ce30cb762df02d77ec27786a2435ad",
|
||||
"filesize": 2248343552,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(13)"
|
||||
},
|
||||
{
|
||||
"filename": "nexus9500v.9.3.12.qcow2",
|
||||
"version": "9500v 9.3.12",
|
||||
"md5sum": "452e5cb2a7a25feaa3ba0624a82ff9ca",
|
||||
"filesize": 1997996032,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(12)"
|
||||
},
|
||||
{
|
||||
"filename": "nexus9300v.9.3.12.qcow2",
|
||||
"version": "9300v 9.3.12",
|
||||
"md5sum": "7b6b5dad1001e11d6ebb54662616e9f2",
|
||||
"filesize": 1997930496,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(12)"
|
||||
},
|
||||
{
|
||||
"filename": "nexus9500v.9.3.9.qcow2",
|
||||
"version": "9500v 9.3.9",
|
||||
"md5sum": "30c25039927f89aebe73ea20d15abd6d",
|
||||
"filesize": 1980760064,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(9)"
|
||||
},
|
||||
{
|
||||
"filename": "nexus9300v.9.3.9.qcow2",
|
||||
"version": "9300v 9.3.9",
|
||||
"md5sum": "e807005cb7d2d2957b4af0e59f368b36",
|
||||
"filesize": 1980563456,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(9)"
|
||||
},
|
||||
{
|
||||
"filename": "nexus9300v.9.3.8.qcow2",
|
||||
"version": "9300v 9.3.8",
|
||||
"md5sum": "f8bd834f8395c134dc98d895c98441af",
|
||||
"filesize": 1976434688,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(8)"
|
||||
},
|
||||
{
|
||||
"filename": "nexus9500v.9.3.7.qcow2",
|
||||
"version": "9500v 9.3.7",
|
||||
"md5sum": "65f669e0dd379a05a8cdbb9d7592a064",
|
||||
"filesize": 1986068480,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(7)"
|
||||
},
|
||||
{
|
||||
"filename": "nexus9500v.9.3.3.qcow2",
|
||||
"version": "9500v 9.3.3",
|
||||
"md5sum": "7230c944041fdaa0e1b18cecccbc9a32",
|
||||
"filesize": 1714159616,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(3)"
|
||||
},
|
||||
{
|
||||
"filename": "nexus9300v.9.3.3.qcow2",
|
||||
"version": "9300v 9.3.3",
|
||||
"md5sum": "8e9a7c4815907ef47d850623f77042e2",
|
||||
"filesize": 1714225152,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(3)"
|
||||
},
|
||||
{
|
||||
"filename": "nxosv.9.3.1.qcow2",
|
||||
"version": "9.3.1",
|
||||
"md5sum": "148fd38cb1ff78df2883f844e172fad9",
|
||||
"filesize": 1435041792,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(1)?i=!pp"
|
||||
},
|
||||
{
|
||||
"filename": "nxosv-final.9.2.3.qcow2",
|
||||
"version": "9.2.3",
|
||||
"md5sum": "74bd9a5b4970e868685f753e48979194",
|
||||
"filesize": 1357643776,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.2%25283%2529"
|
||||
},
|
||||
{
|
||||
"filename": "nxosv-final.9.2.2.qcow2",
|
||||
"version": "9.2.2",
|
||||
"md5sum": "2119702c488552fc4d1b4210a04d4f64",
|
||||
"filesize": 1344077824,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.2%25281%2529"
|
||||
},
|
||||
{
|
||||
"filename": "nxosv-final.9.2.1.qcow2",
|
||||
"version": "9.2.1",
|
||||
"md5sum": "1d7fa4654602d7ffbf62544edfe71986",
|
||||
"filesize": 1330315264,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.2%25281%2529"
|
||||
},
|
||||
{
|
||||
"filename": "nxosv-final.7.0.3.I7.9.qcow2",
|
||||
"version": "7.0.3.I7.9",
|
||||
"md5sum": "50678c719f6b822c43dd096dbdf359e8",
|
||||
"filesize": 1003618304,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/7.0(3)I7(9)?i=!pp"
|
||||
},
|
||||
{
|
||||
"filename": "nxosv-final.7.0.3.I7.7.qcow2",
|
||||
"version": "7.0.3.I7.7",
|
||||
"md5sum": "5daab34b672f9534c9aee59a6c8903b3",
|
||||
"filesize": 996212736,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/7.0%25283%2529I7%25287%2529"
|
||||
},
|
||||
{
|
||||
"filename": "nxosv-final.7.0.3.I7.6.qcow2",
|
||||
"version": "7.0.3.I7.6",
|
||||
"md5sum": "a122ee954b4c11761abd99291b70544e",
|
||||
"filesize": 1031995392,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/7.0%25283%2529I7%25286%2529"
|
||||
},
|
||||
{
|
||||
"filename": "nxosv-final.7.0.3.I7.5.qcow2",
|
||||
"version": "7.0.3.I7.5",
|
||||
"md5sum": "68a4008e189c8a35ccb8ee58db9608bb",
|
||||
"filesize": 1027670016,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/7.0%25283%2529I7%25285%2529"
|
||||
},
|
||||
{
|
||||
"filename": "nxosv-final.7.0.3.I7.4.qcow2",
|
||||
"version": "7.0.3.I7.4",
|
||||
"md5sum": "1e980c95ca47045ae45ded6e07fabfb8",
|
||||
"filesize": 985792512,
|
||||
"download_url": "https://software.cisco.com/download/"
|
||||
},
|
||||
{
|
||||
"filename": "nxosv-final.7.0.3.I7.3.qcow2",
|
||||
"version": "7.0.3.I7.3",
|
||||
"md5sum": "9d7a20367bf681a239f14097bbce470a",
|
||||
"filesize": 983629824,
|
||||
"download_url": "https://software.cisco.com/download/"
|
||||
},
|
||||
{
|
||||
"filename": "nxosv-final.7.0.3.I7.2.qcow2",
|
||||
"version": "7.0.3.I7.2",
|
||||
"md5sum": "17295efb13e83b24a439148449bfd5ab",
|
||||
"filesize": 906231808,
|
||||
"download_url": "https://software.cisco.com/download/"
|
||||
},
|
||||
{
|
||||
"filename": "nxosv-final.7.0.3.I7.1.qcow2",
|
||||
"version": "7.0.3.I7.1",
|
||||
"md5sum": "3c122f27d0c3684c63657207eadf4d06",
|
||||
"filesize": 903151616,
|
||||
"download_url": "https://software.cisco.com/download/"
|
||||
},
|
||||
{
|
||||
"filename": "nxosv-final.7.0.3.I6.1.qcow2",
|
||||
"version": "7.0.3.I6.1",
|
||||
"md5sum": "18bb991b814a508d1190575f99deed99",
|
||||
"filesize": 780402688,
|
||||
"download_url": "https://software.cisco.com/download/"
|
||||
},
|
||||
{
|
||||
"filename": "nxosv-final.7.0.3.I5.2.qcow2",
|
||||
"version": "7.0.3.I5.2",
|
||||
"md5sum": "c06aaa02f758a64fd8fee9406756f1da",
|
||||
"filesize": 777715712,
|
||||
"download_url": "https://software.cisco.com/download/"
|
||||
},
|
||||
{
|
||||
"filename": "nxosv-final.7.0.3.I5.1.qcow2",
|
||||
"version": "7.0.3.I5.1",
|
||||
"md5sum": "201ea658fa4c57452ee4b2aa4f5262a7",
|
||||
"filesize": 784990208,
|
||||
"download_url": "https://software.cisco.com/download/"
|
||||
},
|
||||
{
|
||||
"filename": "OVMF-edk2-stable202305.fd",
|
||||
"version": "stable202305",
|
||||
@ -233,6 +80,27 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "9500v 10.5.1.F",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nexus9500v64.10.5.1.F.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9300v 10.5.1.F",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nexus9300v64.10.5.1.F.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9500v 10.3.1.F",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nexus9500v64.10.3.1.F.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9300v 10.3.1.F",
|
||||
"images": {
|
||||
@ -253,181 +121,6 @@
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nexus9300v.10.1.1.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9500v 9.3.13",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nexus9500v.9.3.13.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9300v 9.3.13",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nexus9300v.9.3.13.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9500v 9.3.12",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nexus9500v.9.3.12.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9300v 9.3.12",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nexus9300v.9.3.12.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9500v 9.3.9",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nexus9500v.9.3.9.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9300v 9.3.9",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nexus9300v.9.3.9.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9300v 9.3.8",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nexus9300v.9.3.8.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9500v 9.3.7",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nexus9500v.9.3.7.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9500v 9.3.3",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nexus9500v.9.3.3.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9300v 9.3.3",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nexus9300v.9.3.3.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9.3.1",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nxosv.9.3.1.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9.2.3",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nxosv-final.9.2.3.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9.2.2",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nxosv-final.9.2.2.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9.2.1",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nxosv-final.9.2.1.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.0.3.I7.9",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nxosv-final.7.0.3.I7.9.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.0.3.I7.7",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nxosv-final.7.0.3.I7.7.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.0.3.I7.6",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nxosv-final.7.0.3.I7.6.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.0.3.I7.5",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nxosv-final.7.0.3.I7.5.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.0.3.I7.4",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nxosv-final.7.0.3.I7.4.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.0.3.I7.3",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nxosv-final.7.0.3.I7.3.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.0.3.I7.2",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nxosv-final.7.0.3.I7.2.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.0.3.I7.1",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nxosv-final.7.0.3.I7.1.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.0.3.I6.1",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nxosv-final.7.0.3.I6.1.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.0.3.I5.2",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nxosv-final.7.0.3.I5.2.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.0.3.I5.1",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "nxosv-final.7.0.3.I5.1.qcow2"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -29,6 +29,27 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FAZ_VM64_KVM-v7.4.6.M-build2588-FORTINET.out.kvm.qcow2",
|
||||
"version": "7.4.6",
|
||||
"md5sum": "fba982436ff430465df6f6f283a2bd71",
|
||||
"filesize": 511053824,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FAZ_VM64_KVM-v7.4.5.M-build2553-FORTINET.out.kvm.qcow2",
|
||||
"version": "7.4.5",
|
||||
"md5sum": "78464ee460fce69c360901ca9ccfe4a0",
|
||||
"filesize": 510988288,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FAZ_VM64_KVM-v7.4.4.F-build2550-FORTINET.out.kvm.qcow2",
|
||||
"version": "7.4.4",
|
||||
"md5sum": "7bec1725b1e39dd66f4daae07492f1b4",
|
||||
"filesize": 511217664,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FAZ_VM64_KVM-v7.4.3-build2487-FORTINET.out.kvm.qcow2",
|
||||
"version": "7.4.3",
|
||||
@ -277,6 +298,27 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "7.4.6",
|
||||
"images": {
|
||||
"hda_disk_image": "FAZ_VM64_KVM-v7.4.6.M-build2588-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.4.5",
|
||||
"images": {
|
||||
"hda_disk_image": "FAZ_VM64_KVM-v7.4.5.M-build2553-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.4.4",
|
||||
"images": {
|
||||
"hda_disk_image": "FAZ_VM64_KVM-v7.4.4.F-build2550-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.4.3",
|
||||
"images": {
|
||||
|
@ -28,6 +28,27 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FGT_VM64_KVM-v7.4.7.M-build2731-FORTINET.out.kvm.qcow2",
|
||||
"version": "7.4.7",
|
||||
"md5sum": "2ce4039789e84b3fe85565e0c4110718",
|
||||
"filesize": 103677952,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FGT_VM64_KVM-v7.4.6.M-build2726-FORTINET.out.kvm.qcow2",
|
||||
"version": "7.4.6",
|
||||
"md5sum": "b787c1c5ab365f267d7e4e88b1cdc10b",
|
||||
"filesize": 103677952,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FGT_VM64_KVM-v7.4.5.M-build2702-FORTINET.out.kvm.qcow2",
|
||||
"version": "7.4.5",
|
||||
"md5sum": "8465e74c4ef1751619ebb989838d457c",
|
||||
"filesize": 102367232,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FGT_VM64_KVM-v7.4.4.F-build2662-FORTINET.out.kvm.qcow2",
|
||||
"version": "7.4.4",
|
||||
@ -388,6 +409,27 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "7.4.7",
|
||||
"images": {
|
||||
"hda_disk_image": "FGT_VM64_KVM-v7.4.7.M-build2731-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.4.6",
|
||||
"images": {
|
||||
"hda_disk_image": "FGT_VM64_KVM-v7.4.6.M-build2726-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.4.5",
|
||||
"images": {
|
||||
"hda_disk_image": "FGT_VM64_KVM-v7.4.5.M-build2702-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.4.4",
|
||||
"images": {
|
||||
|
@ -29,9 +29,30 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "FMG_VM64_KVM-v7.4.6.M-build2588-FORTINET.out.kvm.qcow2",
|
||||
"version": "7.4.6",
|
||||
"md5sum": "7cb219e1070d393f61cf750d818b23b1",
|
||||
"filesize": 349122560,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FMG_VM64_KVM-v7.4.5.M-build2553-FORTINET.out.kvm.qcow2",
|
||||
"version": "7.4.5",
|
||||
"md5sum": "fa59ddce0cb933741f16866472026723",
|
||||
"filesize": 349769728,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FMG_VM64_KVM-v7.4.4.F-build2550-FORTINET.out.kvm.qcow2",
|
||||
"version": "7.4.4",
|
||||
"md5sum": "770727bb30555e6938308bbf95f19555",
|
||||
"filesize": 349847552,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
},
|
||||
{
|
||||
"filename": "FMG_VM64_KVM-v7.4.3-build2487-FORTINET.out.kvm.qcow2",
|
||||
"version": "7.4.23",
|
||||
"version": "7.4.3",
|
||||
"md5sum": "b01d9f86aa27c538407d518df1326863",
|
||||
"filesize": 346107904,
|
||||
"download_url": "https://support.fortinet.com/Download/FirmwareImages.aspx"
|
||||
@ -277,6 +298,27 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "7.4.6",
|
||||
"images": {
|
||||
"hda_disk_image": "FMG_VM64_KVM-v7.4.6.M-build2588-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.4.5",
|
||||
"images": {
|
||||
"hda_disk_image": "FMG_VM64_KVM-v7.4.5.M-build2553-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.4.4",
|
||||
"images": {
|
||||
"hda_disk_image": "FMG_VM64_KVM-v7.4.4.F-build2550-FORTINET.out.kvm.qcow2",
|
||||
"hdb_disk_image": "empty30G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.4.3",
|
||||
"images": {
|
||||
|
75
gns3server/appliances/infix.gns3a
Normal file
@ -0,0 +1,75 @@
|
||||
{
|
||||
"appliance_id": "4d351078-c6f5-444c-ab30-0ef20e3d8c53",
|
||||
"name": "Infix",
|
||||
"category": "router",
|
||||
"description": "Infix is a Network Operating System based on Linux. It can be set up both as a switch, with offloading using switchdev, and a router with firewalling.",
|
||||
"vendor_name": "KernelKit",
|
||||
"vendor_url": "https://github.com/kernelkit",
|
||||
"vendor_logo_url": "https://kernelkit.org/assets/img/jack.png",
|
||||
"product_name": "Infix",
|
||||
"registry_version": 4,
|
||||
"documentation_url": "https://github.com/kernelkit/infix/tree/main/doc",
|
||||
"status": "stable",
|
||||
"availability": "free",
|
||||
"maintainer": "KernelKit",
|
||||
"maintainer_email": "kernelkit@googlegroups.com",
|
||||
"usage": "Default login, user/pass: admin/admin\n\nType 'cli' (and Enter) followed by 'help' for an overview of commands and relevant configuration files.",
|
||||
"port_name_format": "eth{0}",
|
||||
"linked_clone": true,
|
||||
"symbol": "router_red.svg",
|
||||
"qemu": {
|
||||
"adapter_type": "virtio-net-pci",
|
||||
"adapters": 10,
|
||||
"ram": 512,
|
||||
"cpus": 1,
|
||||
"hda_disk_interface": "virtio",
|
||||
"arch": "x86_64",
|
||||
"console_type": "telnet",
|
||||
"process_priority": "normal",
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "OVMF-edk2-stable202305.fd",
|
||||
"version": "stable202305",
|
||||
"md5sum": "6c4cf1519fec4a4b95525d9ae562963a",
|
||||
"filesize": 4194304,
|
||||
"download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/",
|
||||
"direct_download_url": "https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/OVMF-edk2-stable202305.fd.zip/download",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "infix-x86_64-disk-24.11.1.img",
|
||||
"filesize": 536870912,
|
||||
"md5sum": "673a123fe122d1c2f5724baf9965a19d",
|
||||
"version": "24.11.1",
|
||||
"download_url": "https://github.com/kernelkit/infix/releases/download/v24.11.1/infix-x86_64-24.11.1.tar.gz",
|
||||
"compression": "gzip"
|
||||
},
|
||||
{
|
||||
"filename": "infix-x86_64-disk-25.01.0.img",
|
||||
"filesize": 536870912,
|
||||
"md5sum": "a814d93b385116b4a35712c445b5f830",
|
||||
"version": "25.01.0",
|
||||
"download_url": "https://github.com/kernelkit/infix/releases/download/v25.01.0/infix-x86_64-25.01.0.tar.gz",
|
||||
"compression": "gzip"
|
||||
}
|
||||
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "25.01.0",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "infix-x86_64-disk-25.01.0.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "24.11.1",
|
||||
"images": {
|
||||
"bios_image": "OVMF-edk2-stable202305.fd",
|
||||
"hda_disk_image": "infix-x86_64-disk-24.11.1.img"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
50
gns3server/appliances/stormshield-eva.gns3a
Normal file
@ -0,0 +1,50 @@
|
||||
{
|
||||
"appliance_id": "60801097-332e-4f40-a63e-8ad62047c01f",
|
||||
"name": "Stormshield EVA",
|
||||
"category": "firewall",
|
||||
"description": "Stormshield EVA (Elastic Virtual Appliance) is a french virtual firewall designed to protect network infrastructures. It offers advanced features such as filtering, intrusion prevention (IPS), VPN management (IPSec/SSL), and access control.",
|
||||
"vendor_name": "Stormshield",
|
||||
"vendor_url": "https://www.stormshield.com/",
|
||||
"vendor_logo_url": "https://www.stormshield.com/wp-content/uploads/stormshield-logo.png",
|
||||
"documentation_url": "https://www.stormshield.com/fr/ressourcescenter/network-security-elastic-virtual-appliances/",
|
||||
"product_name": "Stormshield EVA",
|
||||
"product_url": "https://www.stormshield.com/fr/produits-et-services/produits/protection-des-reseaux/nos-produits/appliances-virtuelles/",
|
||||
"registry_version": 4,
|
||||
"status": "stable",
|
||||
"availability": "service-contract",
|
||||
"maintainer": "Samy SCANNA",
|
||||
"maintainer_email": "samy.scanna@outlook.com",
|
||||
"usage": "After the first boot, the appliance automatically runs the configuration script to set up the password, and network interfaces.",
|
||||
"symbol": "stormshield.png",
|
||||
"port_name_format": "port{port1}",
|
||||
"qemu": {
|
||||
"adapter_type": "vmxnet3",
|
||||
"adapters": 8,
|
||||
"ram": 2048,
|
||||
"cpus": 1,
|
||||
"hda_disk_interface": "scsi",
|
||||
"arch": "x86_64",
|
||||
"console_type": "telnet",
|
||||
"kvm": "allow",
|
||||
"options": "-serial stdio",
|
||||
"on_close": "shutdown_signal",
|
||||
"process_priority": "normal"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "utm-SNS-EVA-4.3.33-kvm.qcow2",
|
||||
"version": "4.3.33",
|
||||
"md5sum": "21d94d0e20f2e270f06c5853fd750d5b",
|
||||
"filesize": 284360704,
|
||||
"download_url": "https://mystormshield.eu/product/download/"
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"images": {
|
||||
"hda_disk_image": "utm-SNS-EVA-4.3.33-kvm.qcow2"
|
||||
},
|
||||
"name": "4.3.33"
|
||||
}
|
||||
]
|
||||
}
|
@ -30,6 +30,13 @@
|
||||
"on_close": "shutdown_signal"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "vyos-1.4.1-kvm-amd64.qcow2",
|
||||
"version": "1.4.1",
|
||||
"md5sum": "5b8ebcd9905719d24405ed093afdd8ba",
|
||||
"filesize": 513736704,
|
||||
"download_url": "https://support.vyos.io/"
|
||||
},
|
||||
{
|
||||
"filename": "vyos-1.4.0-kvm-amd64.qcow2",
|
||||
"version": "1.4.0",
|
||||
@ -109,6 +116,12 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "1.4.1",
|
||||
"images": {
|
||||
"hda_disk_image": "vyos-1.4.1-kvm-amd64.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "1.4.0",
|
||||
"images": {
|
||||
|
@ -233,32 +233,36 @@ class VirtualBoxVM(BaseNode):
|
||||
"""
|
||||
Fix the VM uuid in the case of linked clone
|
||||
"""
|
||||
if os.path.exists(self._linked_vbox_file()):
|
||||
try:
|
||||
tree = ET.parse(self._linked_vbox_file())
|
||||
except ET.ParseError:
|
||||
raise VirtualBoxError(
|
||||
"Cannot modify VirtualBox linked nodes file. "
|
||||
"File {} is corrupted.".format(self._linked_vbox_file())
|
||||
|
||||
linked_vbox_file = self._linked_vbox_file()
|
||||
if not os.path.exists(linked_vbox_file):
|
||||
raise VirtualBoxError("Cannot find VirtualBox linked node file: {}".format(linked_vbox_file))
|
||||
|
||||
try:
|
||||
tree = ET.parse(linked_vbox_file)
|
||||
except ET.ParseError:
|
||||
raise VirtualBoxError(f"Cannot modify VirtualBox linked node file. "
|
||||
"File {linked_vbox_file} is corrupted.")
|
||||
except OSError as e:
|
||||
raise VirtualBoxError(f"Cannot modify VirtualBox linked nodes file '{self._linked_vbox_file()}': {e}")
|
||||
|
||||
machine = tree.getroot().find("{http://www.virtualbox.org/}Machine")
|
||||
if machine is not None and machine.get("uuid") != "{" + self.id + "}":
|
||||
|
||||
for image in tree.getroot().findall("{http://www.virtualbox.org/}Image"):
|
||||
currentSnapshot = machine.get("currentSnapshot")
|
||||
if currentSnapshot:
|
||||
newSnapshot = re.sub(r"\{.*\}", "{" + str(uuid.uuid4()) + "}", currentSnapshot)
|
||||
shutil.move(
|
||||
os.path.join(self.working_dir, self._vmname, "Snapshots", currentSnapshot) + ".vdi",
|
||||
os.path.join(self.working_dir, self._vmname, "Snapshots", newSnapshot) + ".vdi"
|
||||
)
|
||||
except OSError as e:
|
||||
raise VirtualBoxError(f"Cannot modify VirtualBox linked nodes file '{self._linked_vbox_file()}': {e}")
|
||||
log.info(f"VirtualBox VM '{self.name}' [{self.id}] snapshot file moved from '{currentSnapshot}' to '{newSnapshot}'")
|
||||
image.set("uuid", newSnapshot)
|
||||
|
||||
machine = tree.getroot().find("{http://www.virtualbox.org/}Machine")
|
||||
if machine is not None and machine.get("uuid") != "{" + self.id + "}":
|
||||
|
||||
for image in tree.getroot().findall("{http://www.virtualbox.org/}Image"):
|
||||
currentSnapshot = machine.get("currentSnapshot")
|
||||
if currentSnapshot:
|
||||
newSnapshot = re.sub(r"\{.*\}", "{" + str(uuid.uuid4()) + "}", currentSnapshot)
|
||||
shutil.move(
|
||||
os.path.join(self.working_dir, self._vmname, "Snapshots", currentSnapshot) + ".vdi",
|
||||
os.path.join(self.working_dir, self._vmname, "Snapshots", newSnapshot) + ".vdi",
|
||||
)
|
||||
image.set("uuid", newSnapshot)
|
||||
|
||||
machine.set("uuid", "{" + self.id + "}")
|
||||
tree.write(self._linked_vbox_file())
|
||||
log.info(f"VirtualBox VM '{self.name}' [{self.id}] '{linked_vbox_file}' has been patched")
|
||||
machine.set("uuid", "{" + self.id + "}")
|
||||
tree.write(linked_vbox_file)
|
||||
|
||||
async def check_hw_virtualization(self):
|
||||
"""
|
||||
@ -488,7 +492,7 @@ class VirtualBoxVM(BaseNode):
|
||||
|
||||
async def save_linked_hdds_info(self):
|
||||
"""
|
||||
Save linked cloned hard disks information.
|
||||
Save linked cloned hard disk information.
|
||||
|
||||
:returns: disk table information
|
||||
"""
|
||||
|
@ -352,6 +352,7 @@ class VMwareVM(BaseNode):
|
||||
vnet = self._get_vnet(adapter_number)
|
||||
await self._ubridge_send(f"bridge create {vnet}")
|
||||
vmnet_interface = os.path.basename(self._vmx_pairs[vnet])
|
||||
block_host_traffic = self.manager.config.settings.VMware.block_host_traffic
|
||||
|
||||
if sys.platform.startswith("darwin"):
|
||||
if parse_version(platform.mac_ver()[0]) >= parse_version("11.0.0"):
|
||||
@ -360,13 +361,11 @@ class VMwareVM(BaseNode):
|
||||
vmnet_interface = self.manager.find_bridge_interface(vmnet_interface)
|
||||
if not vmnet_interface:
|
||||
raise VMwareError(f"Could not find bridge interface linked with {vmnet_interface}")
|
||||
block_host_traffic = self.manager.config.get_section_config("VMware").getboolean("block_host_traffic", False)
|
||||
await self._add_ubridge_ethernet_connection(vnet, vmnet_interface, block_host_traffic)
|
||||
else:
|
||||
# special case on macOS, we cannot bind VMnet interfaces using the libpcap
|
||||
await self._ubridge_send('bridge add_nio_fusion_vmnet {name} "{interface}"'.format(name=vnet, interface=vmnet_interface))
|
||||
else:
|
||||
block_host_traffic = self.manager.config.VMware.block_host_traffic
|
||||
await self._add_ubridge_ethernet_connection(vnet, vmnet_interface, block_host_traffic)
|
||||
|
||||
if isinstance(nio, NIOUDP):
|
||||
|
@ -74,6 +74,7 @@ class Controller:
|
||||
|
||||
log.info("Controller is starting")
|
||||
await self._install_base_configs()
|
||||
await self._install_custom_symbols()
|
||||
installed_disks = await self._install_builtin_disks()
|
||||
if installed_disks:
|
||||
await update_disk_checksums(installed_disks)
|
||||
@ -371,6 +372,19 @@ class Controller:
|
||||
except OSError as e:
|
||||
log.error(f"Could not install disk files to {dst_path}: {e}")
|
||||
|
||||
async def _install_custom_symbols(self):
|
||||
"""
|
||||
At startup we copy custom symbols to the user location to allow
|
||||
them to use with appliances
|
||||
"""
|
||||
|
||||
dst_path = self.symbols.symbols_path()
|
||||
log.info(f"Installing custom symbols in '{dst_path}'")
|
||||
try:
|
||||
return await Controller.install_resource_files(dst_path, "custom_symbols", upgrade_resources=False)
|
||||
except OSError as e:
|
||||
log.error(f"Could not install custom symbols to {dst_path}: {e}")
|
||||
|
||||
def images_path(self):
|
||||
"""
|
||||
Get the image storage directory
|
||||
|
@ -58,7 +58,7 @@ class CrashReport:
|
||||
Report crash to a third party service
|
||||
"""
|
||||
|
||||
DSN = "https://9cf53e6b9adfe49b867f1847b7cc4d72@o19455.ingest.us.sentry.io/38482"
|
||||
DSN = "https://0d64280ffb5ae409d448f255b9956a88@o19455.ingest.us.sentry.io/38482"
|
||||
_instance = None
|
||||
|
||||
def __init__(self):
|
||||
|
1
gns3server/custom_symbols/6wind.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg id="f6fe4215-7336-420b-bd07-06692844737a" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 67.6 65.59"><title>vrouter-logo-generic</title><circle cx="34" cy="32.75" r="19.09" style="fill:#3d4859;opacity:0.8999999761581421;isolation:isolate"/><circle cx="34.04" cy="32.79" r="11.18" style="fill:#5e7ce2;opacity:0.8999999761581421;isolation:isolate"/><path d="M44.61,7.88l20.74-5.6c1.22-.33,2,.41,1.7,1.65L62.21,24.86c-.47,2-3.1,3.65-4.17,2.62l-4.92-4.76-7.84,8.13c-1.07,1.11-2.48,1.49-3.15.85l-3.62-3.49c-.66-.64-.33-2.07.73-3.18l7.84-8.13-4.93-4.76C41.07,11.1,42.62,8.42,44.61,7.88Z" transform="translate(-1.16 -2.2)" style="fill:#0aaded;opacity:0.8999999761581421;isolation:isolate"/><path d="M26.06,62.11,5.32,67.72c-1.21.33-2-.42-1.7-1.65L8.47,45.14c.44-2,3.08-3.65,4.15-2.62l4.93,4.76,7.84-8.13c1.07-1.11,2.49-1.49,3.15-.85l3.63,3.49c.67.64.33,2.07-.72,3.18L23.61,53.1l4.91,4.76C29.6,58.9,28.05,61.58,26.06,62.11Z" transform="translate(-1.16 -2.2)" style="fill:#5e7ce2;opacity:0.8999999761581421;isolation:isolate"/><path d="M25.29,8.71l5.6,20.75c.33,1.21-.41,2-1.64,1.69L8.31,26.31c-2-.47-3.65-3.1-2.61-4.17l4.75-4.91L2.32,9.38C1.21,8.31.83,6.9,1.47,6.24L5,2.6c.64-.66,2.07-.33,3.18.73l8.13,7.86L21,6.25C22.07,5.17,24.75,6.72,25.29,8.71Z" transform="translate(-1.16 -2.2)" style="fill:#5e7ce2;opacity:0.8999999761581421;isolation:isolate"/><path d="M44.64,61.15,39,40.4c-.33-1.21.42-2,1.65-1.7l20.93,4.84c2,.46,3.65,3.09,2.62,4.16l-4.76,4.94,8.13,7.84c1.11,1.06,1.49,2.48.85,3.14L65,67.24c-.64.67-2.07.34-3.18-.72l-8.13-7.84L48.9,63.61C47.85,64.69,45.17,63.14,44.64,61.15Z" transform="translate(-1.16 -2.2)" style="fill:#0aaded;opacity:0.8999999761581421;isolation:isolate"/></svg>
|
After Width: | Height: | Size: 1.7 KiB |
46
gns3server/custom_symbols/alpine-virt-qemu.svg
Normal file
@ -0,0 +1,46 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg height="59.253815" id="Andysvg" version="1.0" width="65.414536" x="0.00000000" y="0.00000000" xmlns="http://www.w3.org/2000/svg" xmlns:bx="https://boxy-svg.com">
|
||||
<defs id="defs3">
|
||||
<linearGradient id="linearGradient891" x1="92.437965" x2="27.674332" y1="-3.9104078" y2="91.076988" gradientTransform="matrix(0.8184166,0,0,0.530237,-9.8827678,-14.589608)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop889" offset="0" style="stop-color:#626262;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop890" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient905" x1="-77.726181" x2="95.64444" y1="208.43991" y2="11.699047" gradientTransform="matrix(0.7314635,0,0,0.5932693,-9.8827694,-14.589616)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop889" offset="0" style="stop-color:#626262;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop890" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<radialGradient cx="60.004654" cy="56.485935" id="radialGradient1132" r="68.589226" gradientTransform="matrix(0.8184166,0,0,0.530237,-9.8827678,-14.589608)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop1134" offset="0" style="stop-color:#8bb7df;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop1136" offset="0.7621" style="stop-color:#2a6092;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop1135" offset="1" style="stop-color:#375e82;stop-opacity:1.0000000;"/>
|
||||
</radialGradient>
|
||||
<linearGradient id="linearGradient1140" x1="45.685757" x2="41.96706" y1="110.4447" y2="232.24953" gradientTransform="matrix(1.2743811,0,0,0.3405213,-9.8827694,-14.589616)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop889" offset="0" style="stop-color:#626262;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop890" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient1144" x1="31.449743" x2="31.617281" y1="203.49899" y2="251.21892" gradientTransform="matrix(1.4044089,0,0,0.3089952,-9.8827694,-14.589616)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop893" offset="0" style="stop-color:#ffffff;stop-opacity:0.00000000;"/>
|
||||
<stop id="stop894" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient1146" x1="39.810947" x2="17.87653" y1="90.197021" y2="113.71949" gradientTransform="matrix(0.8811179,0,0,0.4925045,-9.8827694,-14.589616)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop893" offset="0" style="stop-color:#ffffff;stop-opacity:0.00000000;"/>
|
||||
<stop id="stop894" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient1156" x1="25.220816" x2="25.220816" y1="178.48862" y2="234.26866" gradientTransform="matrix(1.6156202,0,0,0.2685999,-9.8827678,-14.589608)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop889" offset="0" style="stop-color:#626262;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop890" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient1157" x1="51.46093" x2="-16.224497" y1="269.85831" y2="176.28694" gradientTransform="matrix(1.6156202,0,0,0.2685999,-9.8827678,-14.589608)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop889" offset="0" style="stop-color:#626262;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop890" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<rect height="5.4088969" id="rect1155" style="fill: url(#linearGradient1156); fill-opacity: 1; fill-rule: evenodd; stroke: url(#linearGradient1157); stroke-width: 0.953444pt;" width="38.405891" x="12.350429" y="36.575089"/>
|
||||
<path d="M 0.19287398,54.885213 C -0.67386281,56.46268 1.5579198,59.253939 3.3933636,59.253939 L 62.069027,59.253939 C 63.628857,59.253939 65.976201,57.281205 65.269522,55.925378 L 58.655165,43.235277 C 58.145696,42.257819 57.005954,41.779036 55.881408,41.779036 L 8.9408812,41.779036 C 8.0135624,41.779036 7.0317541,42.438291 6.5938539,43.235277 L 0.19287398,54.885213 z " id="path1139" style="fill: url(#linearGradient1140); fill-opacity: 1; fill-rule: evenodd; stroke-width: 1.44735pt;"/>
|
||||
<rect height="39.110481" id="rect1137" rx="3.6272225" ry="3.536587" style="fill: url(#linearGradient905); fill-opacity: 1; fill-rule: evenodd; stroke-width: 1.62827;" width="48.220726" x="7.4732022" y="-0.010164791"/>
|
||||
<rect height="24.74659" id="rect1131" style="fill: url(#radialGradient1132); fill-opacity: 1; fill-rule: evenodd; stroke: url(#linearGradient891); stroke-width: 0.965037pt;" width="38.813015" x="12.390426" y="6.027596"/>
|
||||
<path d="M 8.5906358,19.782157 L 8.3772707,34.032521 C 8.3432557,36.304242 9.6712558,37.75887 12.004493,37.777143 L 38.568566,37.985175 L 41.128957,32.160207 L 11.471076,31.952177 L 11.257713,19.678141 L 8.5906358,19.782157 z " id="path1145" style="fill: url(#linearGradient1146); fill-opacity: 1; fill-rule: evenodd; stroke-width: 1pt;"/>
|
||||
<path d="M 2.7205883,54.675124 C 2.1113822,55.866786 2.9089235,57.975349 4.9701318,57.975349 L 60.179981,57.975349 C 61.276346,57.975349 62.926231,56.48511 62.429524,55.460899 L 57.78047,45.874547 C 57.422369,45.136152 56.621274,44.774474 55.830865,44.774474 L 8.8693353,44.774468 C 8.2175462,44.774468 7.5274604,45.272486 7.2196723,45.874547 L 2.7205883,54.675124 z " id="path1143" style="fill: url(#linearGradient1144); fill-opacity: 1; fill-rule: evenodd; stroke-width: 1pt;"/>
|
||||
<rect x="12.664" y="6.294" width="38.092" height="24.48" style="fill: rgb(255, 255, 255);"/>
|
||||
<path d="M 28.718 20.949 L 28.718 18.69 L 27.09 20.318 C 27.266 20.44 27.431 20.541 27.587 20.622 C 27.741 20.704 27.887 20.768 28.023 20.815 C 28.159 20.864 28.284 20.896 28.399 20.918 C 28.516 20.939 28.622 20.948 28.718 20.949 M 37.035 20.762 C 37.038 20.764 37.054 20.778 37.082 20.796 C 37.113 20.815 37.155 20.839 37.212 20.862 C 37.269 20.886 37.339 20.91 37.426 20.927 C 37.512 20.945 37.613 20.956 37.728 20.956 C 37.825 20.956 37.931 20.948 38.048 20.927 C 38.164 20.907 38.292 20.875 38.429 20.826 C 38.566 20.779 38.713 20.716 38.871 20.633 C 39.029 20.551 39.196 20.449 39.374 20.325 L 38.14 19.116 L 34.048 15.009 L 32.253 16.805 L 29.832 14.307 L 23.753 20.317 C 23.931 20.442 24.098 20.542 24.256 20.624 C 24.413 20.707 24.561 20.771 24.697 20.818 C 24.835 20.866 24.961 20.899 25.078 20.919 C 25.195 20.939 25.301 20.948 25.398 20.948 C 25.513 20.948 25.614 20.936 25.7 20.919 C 25.785 20.901 25.856 20.878 25.914 20.855 C 25.97 20.831 26.013 20.806 26.043 20.788 C 26.072 20.769 26.088 20.755 26.091 20.753 L 28.835 18.009 L 29.816 17.068 L 32.534 19.786 L 33.483 20.762 C 33.485 20.764 33.501 20.778 33.53 20.796 C 33.56 20.815 33.602 20.839 33.66 20.862 C 33.716 20.886 33.788 20.91 33.873 20.927 C 33.959 20.945 34.06 20.956 34.176 20.956 C 34.273 20.956 34.379 20.948 34.496 20.927 C 34.613 20.907 34.74 20.875 34.877 20.826 C 35.014 20.779 35.161 20.716 35.319 20.633 C 35.476 20.551 35.644 20.449 35.823 20.325 L 33.642 18.19 L 34.047 17.785 L 35.934 19.672 L 37.035 20.762 M 37.011 9.382 L 42.371 18.668 L 37.011 27.955 L 26.288 27.955 L 20.926 18.668 L 26.288 9.382 L 37.011 9.382 Z" style="fill: rgb(13, 89, 127); fill-opacity: 1; fill-rule: nonzero; stroke: none;" id="path58" bx:origin="0 0"/>
|
||||
</svg>
|
After Width: | Height: | Size: 7.2 KiB |
24
gns3server/custom_symbols/arista_bybaro.svg
Normal file
@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg id="svg1998" width="51.358818" height="47.630692" version="1.0" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs id="defs2001">
|
||||
<marker orient="auto" refY="0" refX="0" id="Arrow2Lstart" style="overflow:visible">
|
||||
<path id="path11918" style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " transform="matrix(1.1,0,0,1.1,1.1,0)"/>
|
||||
</marker>
|
||||
<marker orient="auto" refY="0" refX="0" id="Arrow1Send" style="overflow:visible">
|
||||
<path id="path11921" d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none" transform="matrix(-0.2,0,0,-0.2,-1.2,0)"/>
|
||||
</marker>
|
||||
<marker orient="auto" refY="0" refX="0" id="Arrow1Lstart" style="overflow:visible">
|
||||
<path id="path11936" d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none" transform="matrix(0.8,0,0,0.8,10,0)"/>
|
||||
</marker>
|
||||
<linearGradient id="linearGradient9199" gradientUnits="userSpaceOnUse" gradientTransform="matrix(24.666332,1.3331909e-2,-1.2883406e-2,23.708747,-8.6563136,-4.6316275)" x1="2.1178279" y1="0.30649999" x2="-0.4954865" y2="0.30649999">
|
||||
<stop style="stop-opacity: 1; stop-color: rgb(239, 239, 239);" offset="0" id="stop8333"/>
|
||||
<stop style="stop-opacity: 1; stop-color: rgb(255, 255, 255);" offset="1" id="stop8335"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<path id="path11907" d="M 1.8402723,44.565612 L 1.8402723,47.615693 L 44.293781,47.615693 L 44.293781,44.565612 L 1.8402723,44.565612" style="fill:#000000;fill-opacity:0.39215686;stroke:none;stroke-width:0.001"/>
|
||||
<path id="path11020" d="M 44.370594,6.1851672 L 51.194316,1.0980117 L 51.358819,41.344844 L 44.266438,47.63069 L 44.370594,6.1851672" style="fill:#000000;fill-opacity:0.39215686;stroke:none;stroke-width:0.001"/>
|
||||
<path id="path2037" d="M 0.062500355,5.0439492 L 0.062500355,46.326915 L 44.31814,46.326915 L 44.31814,5.0439492 L 0.062500355,5.0439492" style="fill-opacity: 1; stroke: none; stroke-width: 0.001; fill: rgb(239, 239, 239);"/>
|
||||
<path id="path2041" d="M -0.028418806,5.1647552 L 5.5982489,0.11782966 L 50.022311,0.14184042 L 44.346312,5.1887393 L -0.028418806,5.1647552" style="fill:url(#linearGradient9199);fill-opacity:1;stroke:none;stroke-width:0.001"/>
|
||||
<path id="path2045" d="M 44.228586,5.0887264 L 49.976169,0.12831483 L 49.976169,41.348635 L 44.228586,46.309047 L 44.228586,5.0887264" style="fill-opacity: 1; stroke: none; stroke-width: 0.001; fill: rgb(223, 223, 223);"/>
|
||||
<path class="st0" d="M 40.254 38.435 L 24.509 13.686 C 23.584 12.049 20.925 12.049 19.901 13.789 L 4.254 38.435 L 9.369 38.435 L 14.073 30.969 L 24.099 30.969 L 26.753 26.67 L 16.731 26.67 L 22.255 18.082 L 35.039 38.435 L 40.254 38.435 Z" style="fill: rgb(24, 61, 100);"/>
|
||||
</svg>
|
After Width: | Height: | Size: 2.9 KiB |
48
gns3server/custom_symbols/asterfusion-vAsterNOS.svg
Normal file
@ -0,0 +1,48 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="_图层_1" data-name="图层 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 66 44.52">
|
||||
<defs>
|
||||
<style>
|
||||
.cls-1 {
|
||||
fill: none;
|
||||
}
|
||||
|
||||
.cls-2 {
|
||||
clip-path: url(#clippath);
|
||||
}
|
||||
|
||||
.cls-3 {
|
||||
fill: #fff;
|
||||
}
|
||||
|
||||
.cls-4 {
|
||||
fill: #abbbed;
|
||||
}
|
||||
|
||||
.cls-5 {
|
||||
fill: #96aae9;
|
||||
}
|
||||
|
||||
.cls-6 {
|
||||
fill: #7989bb;
|
||||
}
|
||||
</style>
|
||||
<clipPath id="clippath">
|
||||
<rect class="cls-1" x=".1" y="8.18" width="64.89" height="27.34"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<rect x="1.34" y="23.21" width="49.53" height="13.54"/>
|
||||
<polygon points="50.88 23.21 50.88 36.75 66 23.21 66 9.64 50.88 23.21"/>
|
||||
<rect class="cls-1" x=".1" y="8.18" width="64.89" height="27.34"/>
|
||||
<rect class="cls-1" x=".1" y="8.18" width="64.89" height="27.34"/>
|
||||
<rect class="cls-5" x=".22" y="21.87" width="49.53" height="13.54"/>
|
||||
<polygon class="cls-4" points="15.34 8.3 .22 21.87 49.75 21.87 64.87 8.3 15.34 8.3"/>
|
||||
<polygon class="cls-6" points="49.75 21.87 49.75 35.4 64.87 21.87 64.87 8.3 49.75 21.87"/>
|
||||
<polygon class="cls-3" points="33.17 12.87 25.08 14.56 31.96 17.27 40.04 15.58 33.17 12.87"/>
|
||||
<polygon class="cls-3" points="24.77 15.66 28.21 17.02 14.88 19.81 16.6 20.49 9.1 19.98 9.73 17.78 11.45 18.46 24.77 15.66"/>
|
||||
<polygon class="cls-3" points="36.9 13.12 40.33 14.48 53.69 11.68 55.41 12.35 56 10.15 48.54 9.64 50.26 10.32 36.9 13.12"/>
|
||||
<polygon class="cls-3" points="35.71 17.52 39.75 16.68 44.9 18.71 46.92 18.29 46.33 20.49 38.83 19.98 40.86 19.56 35.71 17.52"/>
|
||||
<polygon class="cls-3" points="25.39 13.46 29.44 12.61 24.28 10.58 26.29 10.15 18.83 9.64 18.2 11.85 20.24 11.42 25.39 13.46"/>
|
||||
<g class="cls-2">
|
||||
<path class="cls-3" d="m25.84,29.93c0-.2-.07-.35-.21-.46-.14-.11-.39-.22-.74-.34s-.64-.23-.86-.34c-.73-.36-1.09-.85-1.09-1.47,0-.31.09-.58.27-.82.18-.24.44-.42.77-.56s.7-.2,1.12-.2.77.07,1.09.21c.32.15.57.35.74.62.18.26.26.57.26.91h-1.35c0-.23-.07-.41-.21-.53-.14-.13-.33-.19-.57-.19s-.43.05-.57.16c-.14.1-.21.24-.21.41,0,.15.08.27.23.39.16.12.42.24.81.36.39.12.71.26.95.4.61.35.91.83.91,1.45,0,.49-.18.88-.56,1.15-.37.28-.88.42-1.52.42-.46,0-.87-.08-1.24-.25s-.65-.39-.83-.67c-.19-.28-.28-.61-.28-.98h1.35c0,.3.08.52.23.67.16.14.41.21.76.21.22,0,.4-.05.53-.15.13-.1.2-.23.2-.41"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.3 KiB |
498
gns3server/custom_symbols/cisco-fmcv.svg
Normal file
@ -0,0 +1,498 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="svg1998"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.92.1 r15371"
|
||||
width="78"
|
||||
height="60"
|
||||
version="1.0"
|
||||
sodipodi:docname="Cisco-FMCv.svg"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape">
|
||||
<title
|
||||
id="title3303">ASA</title>
|
||||
<metadata
|
||||
id="metadata2003">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
|
||||
<dc:title>ASA</dc:title>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Jeremy Grossmann</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:description>Created for the GNS-3 project (www.gns3.net)</dc:description>
|
||||
<dc:publisher>
|
||||
<cc:Agent>
|
||||
<dc:title>GNS-3</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:publisher>
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/SourceCode" />
|
||||
</cc:License>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2001">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 23.815346 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="51.358818 : 23.815346 : 1"
|
||||
inkscape:persp3d-origin="25.679409 : 15.876897 : 1"
|
||||
id="perspective43" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient10123">
|
||||
<stop
|
||||
style="stop-color:#e4405c;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop10125" />
|
||||
<stop
|
||||
style="stop-color:#e4405c;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop10127" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient8331">
|
||||
<stop
|
||||
style="stop-color:#6e8caa;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop8333" />
|
||||
<stop
|
||||
style="stop-color:#dde3ef;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop8335" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient6603">
|
||||
<stop
|
||||
style="stop-color:#506eaa;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop6605" />
|
||||
<stop
|
||||
style="stop-color:#506eaa;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop6607" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient6587">
|
||||
<stop
|
||||
style="stop-color:#506eaa;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop6589" />
|
||||
<stop
|
||||
style="stop-color:#506eaa;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop6591" />
|
||||
</linearGradient>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow2Lstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path11918"
|
||||
style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
transform="matrix(1.1,0,0,1.1,1.1,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Send"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Send"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path11921"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;marker-start:none"
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Lstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path11936"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;marker-start:none"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6587"
|
||||
id="linearGradient6593"
|
||||
x1="3.95626"
|
||||
y1="0.64267641"
|
||||
x2="-1.2664427"
|
||||
y2="0.62730032"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.060042,0,0,1.074658,-0.00394248,-0.356572)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6603"
|
||||
id="linearGradient6609"
|
||||
x1="2.2801981"
|
||||
y1="1.4519272"
|
||||
x2="-0.41311559"
|
||||
y2="1.4649135"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.060042,0,0,1.074658,-0.00394248,-0.356572)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient10123"
|
||||
id="linearGradient10129"
|
||||
x1="1.3990936"
|
||||
y1="1.4711363"
|
||||
x2="0.49966058"
|
||||
y2="0.56367606"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.117962,0,0,1.035008,-0.040973,-0.00678868)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient8331"
|
||||
id="linearGradient6875"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(25.476818,0,0,24.653619,16.134224,-3.6500723)"
|
||||
x1="2.1178279"
|
||||
y1="0.30649999"
|
||||
x2="-0.4954865"
|
||||
y2="0.30649999" />
|
||||
<inkscape:perspective
|
||||
id="perspective418"
|
||||
inkscape:persp3d-origin="283.46457 : 188.97638 : 1"
|
||||
inkscape:vp_z="566.92914 : 283.46457 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 283.46457 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3145"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient8331"
|
||||
id="linearGradient6875-3"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(36.770425,0,0,24.653619,-12.632753,-3.5809148)"
|
||||
x1="2.1178279"
|
||||
y1="0.30649999"
|
||||
x2="-0.4954865"
|
||||
y2="0.30649999" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient8331"
|
||||
id="linearGradient6875-35"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(25.476818,0,0,24.653619,-8.67999,-3.71127)"
|
||||
x1="2.1178279"
|
||||
y1="0.30649999"
|
||||
x2="-0.4954865"
|
||||
y2="0.30649999" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-height="1031"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
guidetolerance="10.0"
|
||||
gridtolerance="10.0"
|
||||
objecttolerance="10.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
inkscape:zoom="11.313708"
|
||||
inkscape:cx="68.617052"
|
||||
inkscape:cy="48.72766"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="25"
|
||||
inkscape:current-layer="svg1998"
|
||||
showgrid="false"
|
||||
inkscape:window-maximized="1"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0" />
|
||||
<path
|
||||
id="path11907"
|
||||
d="m 3.5551186,56.156296 v 2.959818 H 70.766282 V 56.156296 H 3.5551186"
|
||||
style="fill:#000000;fill-opacity:0.39215686;stroke:none;stroke-width:1.23817813"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path11020"
|
||||
d="M 70.872922,8.6798666 77.855353,2.4891617 77.840347,53.678671 70.766282,59.116114 70.872856,8.6798666"
|
||||
style="fill:#000000;fill-opacity:0.39215686;stroke:none;stroke-width:0.99648201"
|
||||
sodipodi:nodetypes="ccccc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path2037"
|
||||
d="M 0.22635933,6.2224304 V 55.734506 H 70.747763 V 6.2224304 H 0.22635933"
|
||||
style="fill:#6e8caa;fill-opacity:1;stroke:none;stroke-width:1.38291967"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path2041"
|
||||
d="m 25.05111,6.5318764 5.808715,-5.251224 h 45.883749 l -5.859667,5.251224 H 25.05111"
|
||||
style="fill:url(#linearGradient6875);fill-opacity:1;stroke:none;stroke-width:0.99648201"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path2045"
|
||||
d="M 70.747763,6.2224304 76.53739,1.2372012 V 42.663756 l -5.789627,4.985229 V 6.2224304"
|
||||
style="fill:#6e8296;fill-opacity:1;stroke:none;stroke-width:1.01408982"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99412811"
|
||||
d="M 63.650138,-114.23927 H 93.96577 v -2.43552 l 6.51758,4.87105 -6.51758,5.27408 v -2.43553 H 63.650138 v -5.27408"
|
||||
id="path39" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:none;stroke:#ffffff;stroke-width:0.99412817;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"
|
||||
d="M 53.221305,-111.80373 H 65.932861"
|
||||
id="path61" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ff545c;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99063075"
|
||||
d="M 40.583264,56.043952 H 25.452717 v -5.604136 h 15.130547 v 5.604136"
|
||||
id="path99" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:none;stroke:#e1e1e1;stroke-width:0.44807994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"
|
||||
d="M 40.583264,56.043952 H 25.599726"
|
||||
id="path101" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:none;stroke:#e1e1e1;stroke-width:0.44672814;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"
|
||||
d="m 25.689994,50.439816 h 14.89327 v 5.604136"
|
||||
id="path103" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ff545c;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.44672814;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"
|
||||
d="M 70.883907,56.043952 H 55.737538 v -5.604136 h 15.146369 v 5.604136"
|
||||
id="path105" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ff545c;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.44672814;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"
|
||||
d="M 63.688395,56.043952 H 48.526214 v -5.604136 h 15.162181 v 5.604136"
|
||||
id="path107" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ff545c;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.44672814;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"
|
||||
d="M 48.526214,56.043952 H 33.387752 v -5.604136 h 15.138462 v 5.604136"
|
||||
id="path109" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ff2833;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.46981236;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"
|
||||
d="m 73.772792,48.48091 2.530987,-2.488522 v -6.191459 l -2.530987,2.474883 v 6.205098"
|
||||
id="path111" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ff2833;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.44672814;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"
|
||||
d="m 73.772792,53.812465 2.530987,-1.971233 v -5.610305 l -2.530987,1.965074 v 5.616464"
|
||||
id="path125" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ff2833;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.44672814;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"
|
||||
d="m 70.883907,56.043952 2.888885,-2.231487 v -5.616464 l -2.888885,2.243815 v 5.604136"
|
||||
id="path127" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ff545c;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.44672814;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"
|
||||
d="M 55.737538,50.439816 H 40.583264 v -5.610295 h 15.154274 v 5.610295"
|
||||
id="path133" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ff545c;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99063075"
|
||||
d="M 40.583264,50.439816 H 25.452717 v -5.610305 h 15.130547 v 5.610305"
|
||||
id="path135" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:none;stroke:#e1e1e1;stroke-width:0.44942763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"
|
||||
d="M 40.583264,50.439816 H 25.509457"
|
||||
id="path137" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:none;stroke:#e1e1e1;stroke-width:0.44878906;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"
|
||||
d="m 25.552266,44.829521 h 15.030998 v 5.610295"
|
||||
id="path139" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ff545c;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.44672814;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"
|
||||
d="M 70.883907,50.439816 H 55.737538 v -5.610295 h 15.146369 v 5.610295"
|
||||
id="path141" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ff2833;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.45488474;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"
|
||||
d="m 70.883907,50.439816 2.888885,-2.326496 v -5.810658 l -2.888885,2.320122 v 5.817032"
|
||||
id="path145" />
|
||||
<path
|
||||
id="path2041-9"
|
||||
d="M 0.23689523,6.4706772 6.0456103,1.2194547 H 51.92936 L 46.069691,6.4706772 H 0.23689523"
|
||||
style="fill:url(#linearGradient6875-35);fill-opacity:1;stroke:none;stroke-width:0.99648201"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path2041-5"
|
||||
d="M 0.23689523,6.6010339 8.6205533,1.3498071 H 74.84408 L 66.386884,6.6010339 H 0.23689523"
|
||||
style="fill:url(#linearGradient6875-3);fill-opacity:1;stroke:none;stroke-width:1.19714344"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.43419823;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 25.4631,6.6345316 25.34143,56.257182 25.4631,6.6345316"
|
||||
id="path987"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.45158434;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 32.697436,1.4761415 25.481582,6.6155667 32.697436,1.4761415"
|
||||
id="path987-2"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.44617558;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 25.397623,28.812118 0.47800664,28.706997 25.397623,28.812118"
|
||||
id="path987-7"
|
||||
inkscape:connector-curvature="0" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:22.19543457px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#e1e1e1;fill-opacity:1;stroke:#e1e1e1;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="3.4368773"
|
||||
y="27.197458"
|
||||
id="text1030"
|
||||
transform="scale(1.1150382,0.89683024)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan1028"
|
||||
x="3.4368773"
|
||||
y="27.197458"
|
||||
style="fill:#e1e1e1;fill-opacity:1;stroke:#e1e1e1;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">X</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:cmex10;-inkscape-font-specification:cmex10;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="-20.137201"
|
||||
y="37.709763"
|
||||
id="text1038"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan1036"
|
||||
x="-20.137201"
|
||||
y="50.984001" /></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.4306345px;line-height:125%;font-family:cmex10;-inkscape-font-specification:cmex10;letter-spacing:0px;word-spacing:0px;fill:#e1e1e1;fill-opacity:1;stroke:#e1e1e1;stroke-width:1.10999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="7.406137"
|
||||
y="41.795387"
|
||||
id="text1042"
|
||||
transform="matrix(1.2652956,0.14571288,-0.10430839,0.77831689,0,0)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan1040"
|
||||
x="7.406137"
|
||||
y="41.795387"
|
||||
style="fill:#e1e1e1;fill-opacity:1;stroke:#e1e1e1;stroke-width:1.10999999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">q</tspan></text>
|
||||
<path
|
||||
id="path3151"
|
||||
d="m 31.317035,20.132255 h 19.167626 v -1.277787 l 4.122053,2.556266 -4.122053,2.768616 V 22.901598 H 31.317035 Z"
|
||||
style="fill:#000000;fill-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#ffffff"
|
||||
d="m 31.443673,19.752306 h 18.646458 v -1.277787 l 4.009979,2.556266 -4.009979,2.768616 V 22.521649 H 31.443673 Z"
|
||||
id="path134"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path3943"
|
||||
d="M 59.823791,27.288424 H 43.953868 v -1.278496 l -4.32815,2.556284 4.32815,2.769324 v -1.278478 h 15.869923 z"
|
||||
style="fill:#000000;fill-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#ffffff"
|
||||
d="M 60.077102,26.781838 H 44.207179 v -1.278496 l -4.32815,2.556283 4.32815,2.769325 v -1.278478 h 15.869923 z"
|
||||
id="path136"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#ffffff"
|
||||
d="m 67.290672,40.200944 -2.679324,3.40859 -9.686817,-8.09495 2.679307,-3.620941 z"
|
||||
id="path142"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.27946547"
|
||||
d="m 67.290672,40.200944 -2.679324,3.40859 -9.686817,-8.09495 2.679307,-3.620941 9.686834,8.307301"
|
||||
id="path144"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#ffffff"
|
||||
d="M 32.253177,22.308554 C 31.428756,30.615855 37.199634,38.070849 45.0316,38.923174 53.069574,39.987867 60.283198,34.023737 61.313751,25.716436 62.138084,17.409117 56.367259,9.9541413 48.329196,9.1018153 40.497354,8.0371403 33.077616,14.001236 32.253177,22.308554 l 2.061053,0.213095 c 0.824439,-7.029531 7.007457,-12.141354 13.80887,-11.289738 7.007545,0.63923 11.954002,7.242608 11.129563,14.271431 -0.824404,7.029549 -7.00751,12.141354 -14.014967,11.502814 C 38.436283,36.153832 33.489809,29.550472 34.31423,22.521649 Z"
|
||||
id="path146"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.27946547"
|
||||
d="M 32.253177,22.308554 C 31.428756,30.615855 37.199634,38.070849 45.0316,38.923174 53.069574,39.987867 60.283198,34.023737 61.313751,25.716436 62.138084,17.409117 56.367259,9.9541413 48.329196,9.1018153 40.497354,8.0371403 33.077616,14.001236 32.253177,22.308554"
|
||||
id="path148"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.27946547"
|
||||
d="m 34.31423,22.521649 c 0.824439,-7.029531 7.007457,-12.141354 13.80887,-11.289738 7.007545,0.63923 11.954002,7.242608 11.129563,14.271431 -0.824404,7.029549 -7.00751,12.141354 -14.014967,11.502814 C 38.436283,36.153832 33.489809,29.550472 34.31423,22.521649"
|
||||
id="path150"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#ffffff"
|
||||
d="M 30.398291,22.947802 C 29.573887,31.255103 35.344766,38.71008 43.38274,39.77479 51.214688,40.627115 58.634356,34.662985 59.458794,26.355684 60.283198,18.048365 54.718417,10.593389 46.680372,9.7410633 38.642397,8.6763713 31.428756,14.640501 30.398291,22.947802 l 2.061,0.212368 c 0.824421,-7.028804 7.007528,-12.141318 14.014984,-11.289029 6.801413,0.639248 11.74787,7.241917 10.923466,14.271449 C 56.573373,33.172139 50.390285,38.283926 43.588854,37.644696 36.581327,36.79308 31.634852,30.402779 32.459291,23.16017 Z"
|
||||
id="path152"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.27946547"
|
||||
d="M 30.398291,22.947802 C 29.573887,31.255103 35.344766,38.71008 43.38274,39.77479 51.214688,40.627115 58.634356,34.662985 59.458794,26.355684 60.283198,18.048365 54.718417,10.593389 46.680372,9.7410633 38.642397,8.6763713 31.428756,14.640501 30.398291,22.947802"
|
||||
id="path154"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.27946547"
|
||||
d="m 32.459291,23.16017 c 0.824421,-7.028804 7.007528,-12.141318 14.014984,-11.289029 6.801413,0.639248 11.74787,7.241917 10.923466,14.271449 C 56.573373,33.172139 50.390285,38.283926 43.588854,37.644696 36.581327,36.79308 31.634852,30.402779 32.459291,23.16017"
|
||||
id="path156"
|
||||
inkscape:connector-curvature="0" />
|
||||
</svg>
|
After Width: | Height: | Size: 22 KiB |
244
gns3server/custom_symbols/cisco-ise.svg
Normal file
After Width: | Height: | Size: 216 KiB |
38
gns3server/custom_symbols/csr1000v_bybaro.svg
Normal file
@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg id="svg1998" width="66.000435" height="44.5159" version="1.0" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs id="defs2001">
|
||||
<marker orient="auto" refY="0" refX="0" id="Arrow2Lstart" style="overflow:visible">
|
||||
<path id="path11918" style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " transform="matrix(1.1,0,0,1.1,1.1,0)"/>
|
||||
</marker>
|
||||
<marker orient="auto" refY="0" refX="0" id="Arrow1Send" style="overflow:visible">
|
||||
<path id="path11921" d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none" transform="matrix(-0.2,0,0,-0.2,-1.2,0)"/>
|
||||
</marker>
|
||||
<marker orient="auto" refY="0" refX="0" id="Arrow1Lstart" style="overflow:visible">
|
||||
<path id="path11936" d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none" transform="matrix(0.8,0,0,0.8,10,0)"/>
|
||||
</marker>
|
||||
<linearGradient id="linearGradient2216" gradientUnits="userSpaceOnUse" gradientTransform="matrix(15.252829,0,0,14.082619,53.467529,3.4188377)" x1="-1.0929121" y1="0.63145506" x2="-4.5832458" y2="0.070047863">
|
||||
<stop style="stop-opacity: 1; stop-color: rgb(68, 70, 84);" offset="0" id="stop9314"/>
|
||||
<stop style="stop-color:#ffffff;stop-opacity:0.94117647;" offset="1" id="stop9316"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<rect style="opacity:1;fill:#000000;fill-opacity:0.39215687;fill-rule:evenodd;stroke:none;stroke-width:0.2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="rect4558" width="64.552505" height="41.53862" x="1.4479325" y="2.9772801" ry="11.631706" rx="32.212925"/>
|
||||
<rect style="opacity: 1; fill-opacity: 1; fill-rule: evenodd; stroke: none; stroke-width: 0.015; stroke-linecap: square; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1; fill: rgb(68, 70, 84);" id="rect9971" width="64.499474" height="42.154343" x="0.0625" y="0.18084908" ry="11.557454" rx="32.249737"/>
|
||||
<g id="g4160">
|
||||
<path id="path4815" d="M 64.514069,11.541297 L 64.457031,10.955643 L 64.342949,10.36999 L 64.152814,9.8038604 L 63.867612,9.2182077 L 63.487345,8.6520765 L 63.050034,8.0859452 L 62.517657,7.5393369 L 61.909226,7.0122499 L 61.224742,6.4851607 L 60.464203,5.9775955 L 59.646626,5.4700289 L 58.752993,4.9819859 L 57.783307,4.4939413 L 56.75658,4.0644625 L 55.6538,3.6349838 L 54.493981,3.2055052 L 53.296132,2.8150692 L 52.022232,2.4636777 L 50.710303,2.1122862 L 49.341334,1.7999375 L 47.934339,1.5071117 L 46.489316,1.2338059 L 45.006267,0.99954576 L 43.504204,0.76528425 L 41.964114,0.58958842 L 40.385997,0.43341443 L 38.788867,0.29676153 L 37.191738,0.19915292 L 35.575597,0.12106555 L 33.940437,0.06250017 L 32.324296,0.06250017 L 32.324296,0.06250017 L 30.689136,0.06250017 L 29.053981,0.12106555 L 27.45685,0.19915292 L 25.840705,0.29676153 L 24.243576,0.43341443 L 22.684472,0.58958842 L 21.125372,0.76528425 L 19.623307,0.99954576 L 18.140258,1.2338059 L 16.695234,1.5071117 L 15.28824,1.7999375 L 13.919273,2.1122862 L 12.607342,2.4636777 L 11.333442,2.8150692 L 10.135592,3.2055052 L 8.9757693,3.6349838 L 7.8729941,4.0644625 L 6.8462664,4.4939413 L 5.8765785,4.9819859 L 4.9829488,5.4700289 L 4.1653682,5.9775955 L 3.4048335,6.4851607 L 2.7203448,7.0122499 L 2.1309311,7.5393369 L 1.5795405,8.0859452 L 1.1422325,8.6520765 L 0.76195982,9.2182077 L 0.47676065,9.8038604 L 0.26760898,10.36999 L 0.15353084,10.955643 L 0.11550327,11.541297 L 0.11550327,11.541297 L 0.15353084,12.12695 L 0.26760898,12.693081 L 0.47676065,13.278734 L 0.76195982,13.825344 L 1.1422325,14.410996 L 1.5795405,14.957605 L 2.1309311,15.523736 L 2.7203448,16.070348 L 3.4048335,16.597435 L 4.1653682,17.085479 L 4.9829488,17.593043 L 5.8765785,18.100608 L 6.8462664,18.549609 L 7.8729941,18.998611 L 8.9757693,19.447613 L 10.135592,19.857571 L 11.333442,20.248007 L 12.607342,20.599396 L 13.919273,20.950787 L 15.28824,21.263135 L 16.695234,21.575486 L 18.140258,21.829265 L 19.623307,22.083049 L 21.125372,22.297787 L 22.684472,22.473485 L 24.243576,22.629661 L 25.840705,22.766312 L 27.45685,22.863921 L 29.053981,22.942009 L 30.689136,23.000574 L 32.324296,23.000574 L 32.324296,23.000574 L 33.940437,23.000574 L 35.575597,22.942009 L 37.191738,22.863921 L 38.788867,22.766312 L 40.385997,22.629661 L 41.964114,22.473485 L 43.504204,22.297787 L 45.006267,22.083049 L 46.489316,21.829265 L 47.934339,21.575486 L 49.341334,21.263135 L 50.710303,20.950787 L 52.022232,20.599396 L 53.296132,20.248007 L 54.493981,19.857571 L 55.6538,19.447613 L 56.75658,18.998611 L 57.783307,18.549609 L 58.752993,18.100608 L 59.646626,17.593043 L 60.464203,17.085479 L 61.224742,16.597435 L 61.909226,16.070348 L 62.517657,15.523736 L 63.050034,14.957605 L 63.487345,14.410996 L 63.867612,13.825344 L 64.152814,13.278734 L 64.342949,12.693081 L 64.457031,12.12695 L 64.514069,11.541297" style="fill:url(#linearGradient2216);fill-opacity:1;stroke:none;stroke-width:0.01928605;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
|
||||
<path id="path4819" d="M 33.023738,8.6936939 L 37.664889,10.327433 L 48.909313,5.4458969 L 53.946665,7.0599533 L 51.229891,3.0248142 L 38.061087,3.0248142 L 43.475766,4.225514 L 33.023738,8.6936939" style="fill:#000000;stroke:none;stroke-width:0.001"/>
|
||||
<path id="path4821" d="M 31.08049,13.161874 L 26.439334,11.528132 L 15.591104,16.429352 L 10.176425,14.775929 L 12.874332,19.244109 L 26.439334,19.244109 L 20.628458,17.630052 L 31.08049,13.161874" style="fill:#000000;stroke:none;stroke-width:0.001"/>
|
||||
<path id="path4823" d="M 11.327278,4.225514 L 15.968435,2.611458 L 27.212859,7.0599533 L 32.25021,5.8592533 L 29.552303,9.8943939 L 16.364632,9.8943939 L 21.779313,8.6936939 L 11.327278,4.225514" style="fill:#000000;stroke:none;stroke-width:0.001"/>
|
||||
<path id="path4825" d="M 53.154272,18.023723 L 48.513117,19.657467 L 37.664889,14.775929 L 32.25021,16.429352 L 34.966985,12.33516 L 48.513117,12.33516 L 42.70224,13.555544 L 53.154272,18.023723" style="fill:#000000;stroke:none;stroke-width:0.001"/>
|
||||
<path id="path4827" d="M 33.419936,9.1070493 L 38.061087,10.721105 L 49.286643,5.8592533 L 54.323994,7.4929926 L 51.60722,3.4184854 L 38.438415,3.4184854 L 43.871962,4.6191872 L 33.419936,9.1070493" style="fill:#ffffff;stroke:none;stroke-width:0.001"/>
|
||||
<path id="path4829" d="M 31.476681,13.555544 L 26.816665,11.941487 L 15.968435,16.803341 L 10.553753,15.189284 L 13.25166,19.657467 L 26.816665,19.657467 L 21.005786,18.023723 L 31.476681,13.555544" style="fill:#ffffff;stroke:none;stroke-width:0.001"/>
|
||||
<path id="path4831" d="M 11.723476,4.6191872 L 16.364632,3.0248142 L 27.609055,7.4929926 L 32.627541,6.2529266 L 29.929634,10.327433 L 16.741963,10.327433 L 22.175509,9.1070493 L 11.723476,4.6191872" style="fill:#ffffff;stroke:none;stroke-width:0.001"/>
|
||||
<path id="path4833" d="M 53.531602,18.43708 L 48.909313,20.070823 L 38.061087,15.189284 L 32.627541,16.803341 L 35.344315,12.7682 L 48.909313,12.7682 L 43.098437,13.9689 L 53.531602,18.43708" style="fill:#ffffff;stroke:none;stroke-width:0.001"/>
|
||||
</g>
|
||||
<g transform="matrix(0.059769, 0, 0, 0.066697, 21.302736, 26.330629)">
|
||||
<g transform="matrix(1,0,0,1,7.5,7.5)">
|
||||
<g>
|
||||
<path d="M 125.25 40.347 C 140.522 14.219 168.408 -3.654 200.529 -4.892 C 201.714 -4.938 202.904 -4.961 204.1 -4.961 L 217.098 -4.041 C 251.366 0.854 279.522 24.815 290.461 56.74 C 294.455 55.896 298.597 55.453 302.841 55.453 C 335.818 55.453 362.591 82.226 362.591 115.203 C 362.591 148.18 335.818 174.953 302.841 174.953 L 158.914 174.956 L 55.471 174.958 C 26.28 174.958 2.58 151.258 2.58 122.067 C 2.58 92.876 26.28 69.176 55.471 69.176 C 59.085 69.176 62.615 69.539 66.026 70.232 C 78.145 52.171 98.752 40.275 122.116 40.275 C 123.167 40.275 124.212 40.299 125.25 40.347 Z" style="fill: none; stroke-width: 14px; stroke: rgb(255, 255, 255);"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 7.9 KiB |
27
gns3server/custom_symbols/cumulus_bybaro.svg
Normal file
@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg id="svg1998" width="51.358818" height="47.630692" version="1.0" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs id="defs2001">
|
||||
<marker orient="auto" refY="0" refX="0" id="Arrow2Lstart" style="overflow:visible">
|
||||
<path id="path11918" style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " transform="matrix(1.1,0,0,1.1,1.1,0)"/>
|
||||
</marker>
|
||||
<marker orient="auto" refY="0" refX="0" id="Arrow1Send" style="overflow:visible">
|
||||
<path id="path11921" d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none" transform="matrix(-0.2,0,0,-0.2,-1.2,0)"/>
|
||||
</marker>
|
||||
<marker orient="auto" refY="0" refX="0" id="Arrow1Lstart" style="overflow:visible">
|
||||
<path id="path11936" d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none" transform="matrix(0.8,0,0,0.8,10,0)"/>
|
||||
</marker>
|
||||
<linearGradient id="linearGradient9199" gradientUnits="userSpaceOnUse" gradientTransform="matrix(24.666332,1.3331909e-2,-1.2883406e-2,23.708747,-8.6563136,-4.6316275)" x1="2.1178279" y1="0.30649999" x2="-0.4954865" y2="0.30649999">
|
||||
<stop style="stop-opacity: 1; stop-color: rgb(0, 173, 105);" offset="0" id="stop8333"/>
|
||||
<stop style="stop-opacity: 1; stop-color: rgb(154, 238, 204);" offset="1" id="stop8335"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<path id="path11907" d="M 1.8402723,44.565612 L 1.8402723,47.615693 L 44.293781,47.615693 L 44.293781,44.565612 L 1.8402723,44.565612" style="fill:#000000;fill-opacity:0.39215686;stroke:none;stroke-width:0.001"/>
|
||||
<path id="path11020" d="M 44.370594,6.1851672 L 51.194316,1.0980117 L 51.358819,41.344844 L 44.266438,47.63069 L 44.370594,6.1851672" style="fill:#000000;fill-opacity:0.39215686;stroke:none;stroke-width:0.001"/>
|
||||
<path id="path2037" d="M 0.062500355,5.0439492 L 0.062500355,46.326915 L 44.31814,46.326915 L 44.31814,5.0439492 L 0.062500355,5.0439492" style="fill-opacity: 1; stroke: none; stroke-width: 0.001; fill: rgb(0, 173, 105);"/>
|
||||
<path id="path2041" d="M -0.028418806,5.1647552 L 5.5982489,0.11782966 L 50.022311,0.14184042 L 44.346312,5.1887393 L -0.028418806,5.1647552" style="fill: url(#linearGradient9199); fill-opacity: 1; stroke: none; stroke-width: 0.001;"/>
|
||||
<path id="path2045" d="M 44.228586,5.0887264 L 49.976169,0.12831483 L 49.976169,41.348635 L 44.228586,46.309047 L 44.228586,5.0887264" style="fill-opacity: 1; stroke: none; stroke-width: 0.001; fill: rgb(16, 139, 90);"/>
|
||||
<g id="Logos" transform="matrix(0.276292, 0, 0, 0.276292, -12.575964, -8.873246)">
|
||||
<path class="cls-2" d="M147,170c-25.91,0-47-20.83-47-46.43,0,0,0-2.08,0-2.48,0-2.15.48-5.87,3.18-11.35l.38-.77.14.85c1.18,7.34,2.65,14.71,2.66,14.77,4.2,20.3,21.29,35,40.64,35a36.15,36.15,0,0,0,3.45-72.14h-.12l-.07-.1A68.76,68.76,0,0,0,143.89,80c-.75-.74-1.59-1.51-2.48-2.28l-.47-.4.61-.07A46.53,46.53,0,1,1,147,170Z" transform="translate(0 1.53)" style="fill: rgb(255, 255, 255);"/>
|
||||
<path class="cls-2" d="M102.91,170a46.53,46.53,0,0,1,0-93.07c25.91,0,47,20.83,47,46.43,0,0,0,2.08,0,2.48,0,2.15-.48,5.87-3.18,11.35l-.38.77-.14-.85c-1.17-7.32-2.65-14.71-2.66-14.76-4.2-20.3-21.29-35-40.64-35a36.15,36.15,0,0,0-3.45,72.14h.12l.07.1a68.8,68.8,0,0,0,6.39,7.36c.76.75,1.59,1.52,2.48,2.28l.47.4-.61.07A46.76,46.76,0,0,1,102.91,170Z" transform="translate(0 1.53)" style="fill: rgb(255, 255, 255);"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.5 KiB |
1
gns3server/custom_symbols/firefox.svg
Normal file
After Width: | Height: | Size: 16 KiB |
42
gns3server/custom_symbols/fortigate_bybaro.svg
Normal file
@ -0,0 +1,42 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg id="svg1998" width="55.044277" height="63.620274" version="1.0" xmlns="http://www.w3.org/2000/svg">
|
||||
<title id="title3303">ASA</title>
|
||||
<defs id="defs2001">
|
||||
<marker orient="auto" refY="0" refX="0" id="Arrow2Lstart" style="overflow:visible">
|
||||
<path id="path11918" style="font-size:12px;fill-rule:evenodd;stroke-width:0.73333335;stroke-linejoin:round" d="M 11.403143,4.732916 -1.416553,0.01878889 11.403144,-4.6953372 c -2.0480517,2.7832182 -2.0362508,6.5911436 -10e-7,9.4282532 z"/>
|
||||
</marker>
|
||||
<marker orient="auto" refY="0" refX="0" id="Arrow1Send" style="overflow:visible">
|
||||
<path id="path11921" d="M -1.28,0 -2.3466667,1.0666667 1.3866667,0 -2.3466667,-1.0666667 Z" style="fill-rule:evenodd;stroke:#000000;stroke-width:0.21333334pt;marker-start:none"/>
|
||||
</marker>
|
||||
<marker orient="auto" refY="0" refX="0" id="Arrow1Lstart" style="overflow:visible">
|
||||
<path id="path11936" d="M 10.666667,0 14.933333,-4.2666667 0,0 14.933333,4.2666667 Z" style="fill-rule:evenodd;stroke:#000000;stroke-width:0.85333335pt;marker-start:none"/>
|
||||
</marker>
|
||||
<linearGradient id="linearGradient6875" gradientUnits="userSpaceOnUse" gradientTransform="matrix(26.557584,0,0,27.099161,-9.2951537,-5.3720715)" x1="2.1178279" y1="0.30649999" x2="-0.4954865" y2="0.30649999">
|
||||
<stop style="stop-opacity: 1; stop-color: rgb(239, 239, 239);" offset="0" id="stop8333"/>
|
||||
<stop style="stop-opacity: 1; stop-color: rgb(255, 255, 255);" offset="1" id="stop8335"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<path id="path11907" d="m 2.277686,60.343382 v 3.25342 h 45.379267 v -3.25342 H 2.277686" style="fill:#000000;fill-opacity:0.39215686;stroke:none;stroke-width:1.06666672"/>
|
||||
<path id="path11020" d="M 47.765643,8.1809483 55.044279,1.3761504 55.028695,57.643455 47.654539,63.62027 47.765638,8.1809483" style="fill:#000000;fill-opacity:0.39215686;stroke:none;stroke-width:1.06666672"/>
|
||||
<path id="path2037" d="M 0.47692057,5.3149867 V 49.230745 H 47.778461 V 5.3149867 H 0.47692057" style="fill-opacity: 1; stroke: none; stroke-width: 1.06667; fill: rgb(239, 239, 239);"/>
|
||||
<path id="path2041" d="M 0,5.8198859 6.0551291,0.04776213 H 53.885337 L 47.777093,5.8198859 H 0" style="fill:url(#linearGradient6875);fill-opacity:1;stroke:none;stroke-width:1.06666672"/>
|
||||
<path id="path2045" d="M 47.635174,5.2911061 53.670405,0 v 43.968341 l -6.035231,5.291106 V 5.2911061" style="fill-opacity: 1; stroke: none; stroke-width: 1.06667; fill: rgb(223, 223, 223);"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06040335" d="m 68.017411,-124.00618 h 32.336679 v -2.5979 l 6.95208,5.19579 -6.95208,5.62568 v -2.59789 H 68.017411 v -5.62568" id="path39"/>
|
||||
<path style="fill:#000000;stroke:#ffffff;stroke-width:1.06040335;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="M 56.893321,-121.40829 H 70.452314" id="path61"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06040335" d="M 16.19484,61.82555 H 0.42243277 V 55.665507 H 16.19484 v 6.160043" id="path99"/>
|
||||
<path style="fill:#000000;stroke:#e1e1e1;stroke-width:0.47963932;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="M 16.19484,61.82555 H 0.57567743" id="path101"/>
|
||||
<path style="fill:#000000;stroke:#e1e1e1;stroke-width:0.47819233;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="M 0.66977537,55.665507 H 16.19484 v 6.160043" id="path103"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.47819233;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="M 47.780883,61.82555 H 31.991982 v -6.160043 h 15.788901 v 6.160043" id="path105"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.47819233;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="M 40.280128,61.82555 H 24.474743 v -6.160043 h 15.805385 v 6.160043" id="path107"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.47819233;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="M 24.474743,61.82555 H 8.6940847 V 55.665507 H 24.474743 v 6.160043" id="path109"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.50290239;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="m 50.792321,53.512289 2.638353,-2.735375 v -6.805626 l -2.638353,2.720386 v 6.820615" id="path111"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.47819233;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="m 50.792321,59.372711 2.638353,-2.166775 v -6.166822 l -2.638353,2.160008 v 6.173589" id="path125"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.47819233;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="m 47.780883,61.82555 3.011438,-2.452839 v -6.173589 l -3.011438,2.466385 v 6.160043" id="path127"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.47819233;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="M 31.991982,55.665507 H 16.19484 v -6.166811 h 15.797142 v 6.166811" id="path133"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06040335" d="M 16.19484,55.665507 H 0.42243277 V 49.498685 H 16.19484 v 6.166822" id="path135"/>
|
||||
<path style="fill:#000000;stroke:#e1e1e1;stroke-width:0.48108193;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="M 16.19484,55.665507 H 0.48158037" id="path137"/>
|
||||
<path style="fill:#000000;stroke:#e1e1e1;stroke-width:0.48039833;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="M 0.52620409,49.498696 H 16.19484 v 6.166811" id="path139"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.47819233;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="M 47.780883,55.665507 H 31.991982 v -6.166811 h 15.788901 v 6.166811" id="path141"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.48692337;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="m 47.780883,55.665507 3.011438,-2.557269 v -6.387053 l -3.011438,2.550268 v 6.394054" id="path145"/>
|
||||
<path d="M 5.129 23.9 L 15.893 23.9 L 15.893 30.974 L 5.129 30.974 Z M 18.834 13.881 L 29.395 13.881 L 29.395 20.952 L 18.834 20.952 Z M 18.834 33.92 L 29.395 33.92 L 29.395 40.987 L 18.834 40.987 Z M 32.331 23.9 L 43.128 23.9 L 43.128 30.974 L 32.331 30.974 Z M 9.547 13.881 C 7.305 14.472 5.541 16.98 5.129 20.161 L 5.129 20.952 L 15.893 20.952 L 15.893 13.881 Z M 5.129 33.92 L 5.129 34.791 C 5.519 37.844 7.16 40.27 9.272 40.985 L 15.895 40.985 L 15.895 33.919 L 5.13 33.919 Z M 43.129 20.952 L 43.129 20.157 C 42.717 16.974 40.956 14.472 38.711 13.881 L 32.336 13.881 L 32.336 20.952 Z M 38.988 40.99 C 41.093 40.275 42.734 37.849 43.126 34.798 L 43.126 33.92 L 32.334 33.92 L 32.334 40.99 L 38.989 40.99 Z" fill="#e2231a"/>
|
||||
</svg>
|
After Width: | Height: | Size: 7.2 KiB |
72
gns3server/custom_symbols/fortinet.svg
Normal file
@ -0,0 +1,72 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) by Marsupilami -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
width="70"
|
||||
height="50"
|
||||
viewBox="-0.5330211 -0.5330211 10.665723 7.5941177"
|
||||
id="svg4441"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="Fortinet_logo.svg">
|
||||
<metadata
|
||||
id="metadata9">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="2495"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview7"
|
||||
showgrid="false"
|
||||
inkscape:snap-page="true"
|
||||
inkscape:zoom="3.2924659"
|
||||
inkscape:cx="164.79393"
|
||||
inkscape:cy="31.941697"
|
||||
inkscape:window-x="1985"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4441" />
|
||||
<defs
|
||||
id="defs4443" />
|
||||
<rect
|
||||
style="stroke:#ffffff;stroke-width:0.15236747;stroke-opacity:1;fill:#ffffff"
|
||||
id="rect3339"
|
||||
width="10.665723"
|
||||
height="7.6183734"
|
||||
x="-0.53302109"
|
||||
y="-0.54514885" />
|
||||
<path
|
||||
d="m 8.9771066,7.0637696 c 0.5909941,-0.200745 1.0508344,-0.881137 1.1616464,-1.737115 l 0,-0.247318 -3.0299144,0 0,1.984433 1.868268,0 z m 1.1618084,-5.6233777 0,-0.223764 C 10.022751,0.32371345 9.5286497,-0.37969755 8.8985776,-0.54511155 l -1.789576,0 0,1.98550345 3.0299134,0 z m -10.66545725,3.6390517 0,0.245177 c 0.1097407,0.856513 0.5695809,1.538511 1.16218056,1.739256 l 1.85863229,0 0,-1.984433 -3.02081285,0 z m 1.23990906,-5.62428915 c -0.62900136,0.165414 -1.12470806,0.86936 -1.23980196,1.76334495 l 0,0.222158 3.02081275,0 0,-1.98550295 -1.78101079,0 z m 9.42576219,2.81198615 -3.0299134,0 0,1.9855032 3.0299134,0 0,-1.9855032 z m -6.8194454,4.79647 2.964068,0 0,-1.984432 -2.964068,0 0,1.984432 z m 2.964068,-7.60850815 -2.964068,0 0,1.98550355 2.964068,0 0,-1.98550355 z m -6.81034515,4.79754135 3.02081315,0 0,-1.9855032 -3.02081315,0 0,1.9855032 z"
|
||||
id="path4408"
|
||||
style="fill:#ee2e24;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer2"
|
||||
inkscape:label="Logo" />
|
||||
</svg>
|
||||
<!-- version: 20110311, original size: 154.95825 17.76737, border: 3% -->
|
||||
|
After Width: | Height: | Size: 2.9 KiB |
BIN
gns3server/custom_symbols/innovaphone-ap-icon.jpg
Normal file
After Width: | Height: | Size: 46 KiB |
BIN
gns3server/custom_symbols/innovaphone-pbx-green.png
Normal file
After Width: | Height: | Size: 5.1 KiB |
284
gns3server/custom_symbols/juniper-vmx.svg
Normal file
@ -0,0 +1,284 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="svg1998"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.91 r13725"
|
||||
width="51.358818"
|
||||
height="47.630692"
|
||||
version="1.0"
|
||||
sodipodi:docname="vmx.svg"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||
sodipodi:modified="true">
|
||||
<metadata
|
||||
id="metadata2003">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
|
||||
<dc:title />
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Jeremy Grossmann</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:description>Created for the GNS-3 project (www.gns3.net)</dc:description>
|
||||
<dc:publisher>
|
||||
<cc:Agent>
|
||||
<dc:title>GNS-3</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:publisher>
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/SourceCode" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2001">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient10123">
|
||||
<stop
|
||||
style="stop-color:#e4405c;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop10125" />
|
||||
<stop
|
||||
style="stop-color:#e4405c;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop10127" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient8331">
|
||||
<stop
|
||||
style="stop-color:#6e8caa;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop8333" />
|
||||
<stop
|
||||
style="stop-color:#dde3ef;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop8335" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient6603">
|
||||
<stop
|
||||
style="stop-color:#506eaa;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop6605" />
|
||||
<stop
|
||||
style="stop-color:#506eaa;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop6607" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient6587">
|
||||
<stop
|
||||
style="stop-color:#506eaa;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop6589" />
|
||||
<stop
|
||||
style="stop-color:#506eaa;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop6591" />
|
||||
</linearGradient>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow2Lstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path11918"
|
||||
style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
transform="matrix(1.1,0,0,1.1,1.1,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Send"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Send"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path11921"
|
||||
d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
|
||||
style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none"
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Lstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path11936"
|
||||
d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
|
||||
style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)" />
|
||||
</marker>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6587"
|
||||
id="linearGradient6593"
|
||||
x1="3.95626"
|
||||
y1="0.64267641"
|
||||
x2="-1.2664427"
|
||||
y2="0.62730032"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.060042,0,0,1.074658,-3.942481e-3,-0.356572)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6603"
|
||||
id="linearGradient6609"
|
||||
x1="2.2801981"
|
||||
y1="1.4519272"
|
||||
x2="-0.41311559"
|
||||
y2="1.4649135"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.060042,0,0,1.074658,-3.942482e-3,-0.356572)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient10123"
|
||||
id="linearGradient10129"
|
||||
x1="1.3990936"
|
||||
y1="1.4711363"
|
||||
x2="0.49966058"
|
||||
y2="0.56367606"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.117962,0,0,1.035008,-4.0973e-2,-6.788682e-3)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient8331"
|
||||
id="linearGradient6875"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(24.897735,0,0,25.405463,-9.0988193,-4.8632254)"
|
||||
x1="2.1178279"
|
||||
y1="0.30649999"
|
||||
x2="-0.4954865"
|
||||
y2="0.30649999" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-height="670"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
guidetolerance="10.0"
|
||||
gridtolerance="10.0"
|
||||
objecttolerance="10.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
inkscape:zoom="2.7915987"
|
||||
inkscape:cx="23.755426"
|
||||
inkscape:cy="-42.804631"
|
||||
inkscape:window-x="77"
|
||||
inkscape:window-y="25"
|
||||
inkscape:current-layer="svg1998"
|
||||
showgrid="false"
|
||||
inkscape:window-maximized="0" />
|
||||
<path
|
||||
id="path11907"
|
||||
d="M 1.8402723,44.565612 L 1.8402723,47.615693 L 44.293781,47.615693 L 44.293781,44.565612 L 1.8402723,44.565612"
|
||||
style="fill:#000000;fill-opacity:0.39215686;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path11020"
|
||||
d="M 44.370594,6.1851672 L 51.194316,1.0980117 L 51.358819,41.344844 L 44.266438,47.63069 L 44.370594,6.1851672"
|
||||
style="fill:#000000;fill-opacity:0.39215686;stroke:none;stroke-width:0.001"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
id="path2037"
|
||||
d="m 0.31579887,5.6624885 0,41.1710225 44.34519313,0 0,-41.1710225 -44.34519313,0"
|
||||
style="fill:#6e8caa;fill-opacity:1;stroke:none;stroke-width:0.001"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path2041"
|
||||
d="M -0.38461268,5.6292351 L 5.2920708,0.21786924 L 50.13289,0.21786924 L 44.406412,5.6292351 L -0.38461268,5.6292351"
|
||||
style="fill:url(#linearGradient6875);fill-opacity:1;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path2045"
|
||||
d="M 44.273363,5.1335036 L 49.931392,0.17309204 L 49.931392,41.393412 L 44.273363,46.353824 L 44.273363,5.1335036"
|
||||
style="fill:#6e8296;fill-opacity:1;stroke:none;stroke-width:0.001" />
|
||||
<g
|
||||
id="g3381"
|
||||
transform="translate(50.86691,-20.06019)">
|
||||
<g
|
||||
transform="matrix(0.1704237,0,0,0.1704237,-48.337546,-4.9946169)"
|
||||
id="shape2-2"
|
||||
v:mID="2"
|
||||
v:groupContext="shape">
|
||||
<title
|
||||
id="title14">Sheet.2</title>
|
||||
<path
|
||||
d="m 117,420.03 c 64.45,0 117,-52.56 117,-117 0,-64.45 -52.55,-117.02 -117,-117.02 -64.45,0 -117,52.57 -117,117.02 0,64.44 52.55,117 117,117 z"
|
||||
class="st1"
|
||||
id="path16"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#12537c;stroke:none;stroke-width:0.75;stroke-linecap:butt" />
|
||||
</g>
|
||||
<g
|
||||
style="stroke:#84b2dd;stroke-width:2.40000153;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
transform="matrix(0.1704237,0,0,0.1704237,-48.337546,-4.9946169)"
|
||||
id="shape3-4"
|
||||
v:mID="3"
|
||||
v:groupContext="shape">
|
||||
<title
|
||||
id="title19">Sheet.3</title>
|
||||
<path
|
||||
d="m 117,420.03 c 64.45,0 117,-52.56 117,-117 0,-64.45 -52.55,-117.02 -117,-117.02 -64.45,0 -117,52.57 -117,117.02 0,64.44 52.55,117 117,117 z"
|
||||
class="st2"
|
||||
id="path21"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:none;stroke:#84b2dd;stroke-width:2.40000153;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</g>
|
||||
<g
|
||||
style="stroke:#32425f;stroke-width:1.52000105;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="shape4-6"
|
||||
v:mID="4"
|
||||
v:groupContext="shape"
|
||||
transform="matrix(0.1704237,0,0,0.1704237,-43.935853,-8.9257283)">
|
||||
<title
|
||||
id="title24">Sheet.4</title>
|
||||
<path
|
||||
d="m 82.44,318.48 -6.36,0 -72.74,0 0,-17.52 63.98,0 0,-37.34 -9.38,0 9.13,-15.81 7.06,-12.21 2.07,-3.59 9.14,15.8 9.12,15.81 -4.16,0 -5.46,0 0,46.09 0,8.77 -2.4,0 z m 73.95,5.68 0,-5.68 -45.5,0 -8.76,0 0,-2.41 0,-6.36 0,-72.21 17.52,0 0,63.45 36.73,0 0.01,-9.15 15.81,9.14 12.2,7.04 -1.2,2.09 1.2,-2.09 3.6,2.08 -15.8,9.13 -15.82,9.11 0,-4.14 0.01,0 z m -86.67,93.62 0,-2.4 2.4,0 -2.4,0 0,2.4 -2.4,0 0,-63.46 -35.71,0 0,9.59 -15.81,-9.13 -15.8,-9.12 15.8,-9.14 15.81,-9.12 0,4.16 0,5.25 44.47,0 8.76,0 0,2.4 0,6.36 0,72.21 -15.12,0 z m 41.16,-2.56 2.08,-1.2 -2.08,1.2 z m -9.13,-11 -9.12,-15.81 4.16,0 5.34,-0.01 0,-42.83 0,-8.76 2.4,0 6.36,0 72.73,0 0,17.51 -63.96,0 0,34.09 9.48,0 -9.13,15.82 -7.04,12.2 -2.08,3.6 -9.14,-15.81 z"
|
||||
class="st3"
|
||||
id="path26"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffffff;stroke:#32425f;stroke-width:1.52000105;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 10 KiB |
324
gns3server/custom_symbols/juniper-vqfx.svg
Normal file
@ -0,0 +1,324 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="svg1998"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.91 r13725"
|
||||
width="51.358818"
|
||||
height="47.630692"
|
||||
version="1.0"
|
||||
sodipodi:docname="juniper-vqfx.svg"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||
sodipodi:modified="true">
|
||||
<metadata
|
||||
id="metadata2003">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
|
||||
<dc:title />
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Jeremy Grossmann</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:description>Created for the GNS-3 project (www.gns3.net)</dc:description>
|
||||
<dc:publisher>
|
||||
<cc:Agent>
|
||||
<dc:title>GNS-3</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:publisher>
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/SourceCode" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2001">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient10123">
|
||||
<stop
|
||||
style="stop-color:#e4405c;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop10125" />
|
||||
<stop
|
||||
style="stop-color:#e4405c;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop10127" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient8331">
|
||||
<stop
|
||||
style="stop-color:#6e8caa;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop8333" />
|
||||
<stop
|
||||
style="stop-color:#dde3ef;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop8335" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient6603">
|
||||
<stop
|
||||
style="stop-color:#506eaa;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop6605" />
|
||||
<stop
|
||||
style="stop-color:#506eaa;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop6607" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient6587">
|
||||
<stop
|
||||
style="stop-color:#506eaa;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop6589" />
|
||||
<stop
|
||||
style="stop-color:#506eaa;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop6591" />
|
||||
</linearGradient>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow2Lstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path11918"
|
||||
style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
transform="matrix(1.1,0,0,1.1,1.1,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Send"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Send"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path11921"
|
||||
d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
|
||||
style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none"
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Lstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path11936"
|
||||
d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
|
||||
style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)" />
|
||||
</marker>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6587"
|
||||
id="linearGradient6593"
|
||||
x1="3.95626"
|
||||
y1="0.64267641"
|
||||
x2="-1.2664427"
|
||||
y2="0.62730032"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.060042,0,0,1.074658,-3.942481e-3,-0.356572)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6603"
|
||||
id="linearGradient6609"
|
||||
x1="2.2801981"
|
||||
y1="1.4519272"
|
||||
x2="-0.41311559"
|
||||
y2="1.4649135"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.060042,0,0,1.074658,-3.942482e-3,-0.356572)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient10123"
|
||||
id="linearGradient10129"
|
||||
x1="1.3990936"
|
||||
y1="1.4711363"
|
||||
x2="0.49966058"
|
||||
y2="0.56367606"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.117962,0,0,1.035008,-4.0973e-2,-6.788682e-3)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient8331"
|
||||
id="linearGradient6875"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(24.897735,0,0,25.405463,-9.0988193,-4.8632254)"
|
||||
x1="2.1178279"
|
||||
y1="0.30649999"
|
||||
x2="-0.4954865"
|
||||
y2="0.30649999" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-height="719"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
guidetolerance="10.0"
|
||||
gridtolerance="10.0"
|
||||
objecttolerance="10.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
inkscape:zoom="3.9479168"
|
||||
inkscape:cx="55.736282"
|
||||
inkscape:cy="27.781894"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="25"
|
||||
inkscape:current-layer="svg1998"
|
||||
showgrid="false"
|
||||
inkscape:window-maximized="1" />
|
||||
<path
|
||||
id="path11907"
|
||||
d="M 1.8402723,44.565612 L 1.8402723,47.615693 L 44.293781,47.615693 L 44.293781,44.565612 L 1.8402723,44.565612"
|
||||
style="fill:#000000;fill-opacity:0.39215686;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path11020"
|
||||
d="M 44.370594,6.1851672 L 51.194316,1.0980117 L 51.358819,41.344844 L 44.266438,47.63069 L 44.370594,6.1851672"
|
||||
style="fill:#000000;fill-opacity:0.39215686;stroke:none;stroke-width:0.001"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
id="path2037"
|
||||
d="m 0.31579887,5.6624885 0,41.1710225 44.34519313,0 0,-41.1710225 -44.34519313,0"
|
||||
style="fill:#6e8caa;fill-opacity:1;stroke:none;stroke-width:0.001"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path2041"
|
||||
d="M -0.38461268,5.6292351 L 5.2920708,0.21786924 L 50.13289,0.21786924 L 44.406412,5.6292351 L -0.38461268,5.6292351"
|
||||
style="fill:url(#linearGradient6875);fill-opacity:1;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path2045"
|
||||
d="M 44.273363,5.1335036 L 49.931392,0.17309204 L 49.931392,41.393412 L 44.273363,46.353824 L 44.273363,5.1335036"
|
||||
style="fill:#6e8296;fill-opacity:1;stroke:none;stroke-width:0.001" />
|
||||
<g
|
||||
id="shape7-14"
|
||||
v:mID="7"
|
||||
v:groupContext="shape"
|
||||
transform="matrix(1.5233208,0,0,1.3864459,3.6924384,-5.7637956)">
|
||||
<title
|
||||
id="title45">Sheet.7</title>
|
||||
<rect
|
||||
x="0"
|
||||
y="10.973"
|
||||
width="24.75"
|
||||
height="24.75"
|
||||
class="st5"
|
||||
id="rect47"
|
||||
style="fill:#12537c;stroke:none;stroke-width:0.75;stroke-linecap:butt" />
|
||||
</g>
|
||||
<g
|
||||
id="shape8-16"
|
||||
v:mID="8"
|
||||
v:groupContext="shape"
|
||||
transform="matrix(1.5233208,0,0,1.3864459,3.6924384,-5.7637956)">
|
||||
<title
|
||||
id="title50">Sheet.8</title>
|
||||
<rect
|
||||
x="0"
|
||||
y="10.973"
|
||||
width="24.75"
|
||||
height="24.75"
|
||||
class="st6"
|
||||
id="rect52"
|
||||
style="fill:none;stroke:#bcbec0;stroke-width:1.125;stroke-linecap:butt" />
|
||||
</g>
|
||||
<g
|
||||
id="shape9-18"
|
||||
v:mID="9"
|
||||
v:groupContext="shape"
|
||||
transform="matrix(1.5233208,0,0,1.3864459,20.985782,-28.936572)">
|
||||
<title
|
||||
id="title55">Sheet.9</title>
|
||||
<path
|
||||
d="m 7.38,34.34 -7.38,0 0,-1.49 7.38,0 0,-1.3 1.81,1.04 1.8,1.05 -1.8,1.04 -1.81,1.04 0,-1.38 z"
|
||||
class="st7"
|
||||
id="path57"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.75;stroke-linecap:butt" />
|
||||
</g>
|
||||
<g
|
||||
id="shape10-20"
|
||||
v:mID="10"
|
||||
v:groupContext="shape"
|
||||
transform="matrix(1.5233208,0,0,1.3864459,20.985782,-18.328835)">
|
||||
<title
|
||||
id="title60">Sheet.10</title>
|
||||
<path
|
||||
d="m 7.38,34.34 -7.38,0 0,-1.49 7.38,0 0,-1.3 1.81,1.04 1.8,1.05 -1.8,1.04 -1.81,1.04 0,-1.38 z"
|
||||
class="st7"
|
||||
id="path62"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.75;stroke-linecap:butt" />
|
||||
</g>
|
||||
<g
|
||||
id="shape11-22"
|
||||
v:mID="11"
|
||||
v:groupContext="shape"
|
||||
transform="matrix(1.5233208,0,0,1.3864459,8.0357632,-13.02525)">
|
||||
<title
|
||||
id="title65">Sheet.11</title>
|
||||
<path
|
||||
d="m 3.61,32.93 7.38,0 0,1.5 -7.38,0 0,1.29 -1.8,-1.04 -1.81,-1.04 1.81,-1.05 1.8,-1.04 0,1.38 z"
|
||||
class="st7"
|
||||
id="path67"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.75;stroke-linecap:butt" />
|
||||
</g>
|
||||
<g
|
||||
id="shape12-24"
|
||||
v:mID="12"
|
||||
v:groupContext="shape"
|
||||
transform="matrix(1.5233208,0,0,1.3864459,8.0357632,-23.633003)">
|
||||
<title
|
||||
id="title70">Sheet.12</title>
|
||||
<path
|
||||
d="m 3.61,32.93 7.38,0 0,1.5 -7.38,0 0,1.29 -1.8,-1.04 -1.81,-1.04 1.81,-1.05 1.8,-1.04 0,1.38 z"
|
||||
class="st7"
|
||||
id="path72"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.75;stroke-linecap:butt" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 10 KiB |
18
gns3server/custom_symbols/junos_olive_bybaro.svg
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="36 365 38 38" width="38pt" height="38pt" xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<metadata> Produced by OmniGraffle 7.4
|
||||
<dc:date>2017-07-08 22:25:20 +0000</dc:date>
|
||||
</metadata>
|
||||
<defs/>
|
||||
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
|
||||
<title>Canvas 1</title>
|
||||
<rect fill="white" width="1" height="1"/>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<path d="M 55.00075 402.273 C 65.065 402.273 73.2715 394.065 73.2715 384.00075 C 73.2715 373.9365 65.065 365.727 55.00075 365.727 C 44.93575 365.727 36.7285 373.9365 36.7285 384.00075 C 36.7285 394.065 44.93575 402.273 55.00075 402.273 Z" fill="#12537c"/>
|
||||
<path d="M 55.00075 402.273 C 65.065 402.273 73.2715 394.065 73.2715 384.00075 C 73.2715 373.9365 65.065 365.727 55.00075 365.727 C 44.93575 365.727 36.7285 373.9365 36.7285 384.00075 C 36.7285 394.065 44.93575 402.273 55.00075 402.273 Z" stroke="#bcbec0" stroke-linecap="butt" stroke-linejoin="miter" stroke-width="1.125"/>
|
||||
<path d="M 53.194 382.81126 L 52.201 382.81126 L 40.8415 382.81126 L 40.8415 380.07526 L 50.83375 380.07526 L 50.83375 374.24476 L 49.36825 374.24476 L 50.79475 371.775 L 51.89725 369.86926 L 52.2205 369.3075 L 53.64775 371.775 L 55.07125 374.24476 L 54.42175 374.24476 L 53.569 374.24476 L 53.569 381.4425 L 53.569 382.81126 L 53.194 382.81126 L 53.194 382.81126 Z M 64.7425 383.6985 L 64.7425 382.81126 L 57.637 382.81126 L 56.269 382.81126 L 56.269 382.43626 L 56.269 381.4425 L 56.269 370.16626 L 59.005 370.16626 L 59.005 380.07376 L 64.74175 380.07376 L 64.74325 378.645 L 67.2115 380.07226 L 69.118 381.17176 L 68.9305 381.498 L 69.118 381.17176 L 69.67975 381.4965 L 67.2115 382.923 L 64.74175 384.34576 L 64.74175 383.6985 L 64.7425 383.6985 Z M 51.20875 398.31976 L 51.20875 397.94476 L 51.58375 397.94476 L 51.20875 397.94476 L 51.20875 398.31976 L 50.83375 398.31976 L 50.83375 388.4085 L 45.25675 388.4085 L 45.25675 389.907 L 42.787 388.4805 L 40.32025 387.057 L 42.787 385.62976 L 45.25675 384.2055 L 45.25675 384.855 L 45.25675 385.67476 L 52.201 385.67476 L 53.569 385.67476 L 53.569 386.04976 L 53.569 387.042 L 53.569 398.31976 L 51.20875 398.31976 L 51.20875 398.31976 Z M 57.63625 397.92 L 57.961 397.7325 L 57.63625 397.92 L 57.63625 397.92 Z M 56.2105 396.20176 L 54.78625 393.732 L 55.435 393.732 L 56.26975 393.7305 L 56.26975 387.042 L 56.26975 385.67476 L 56.64475 385.67476 L 57.63775 385.67476 L 68.99575 385.67476 L 68.99575 388.40926 L 59.0065 388.40926 L 59.0065 393.73276 L 60.48775 393.73276 L 59.062 396.2025 L 57.96175 398.10826 L 57.637 398.67076 L 56.2105 396.20176 L 56.2105 396.20176 Z" fill="white"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.9 KiB |
1917
gns3server/custom_symbols/linux_guest.svg
Executable file
After Width: | Height: | Size: 63 KiB |
380
gns3server/custom_symbols/loadbalancer.svg
Normal file
@ -0,0 +1,380 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="svg1998"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.91 r13725"
|
||||
width="66.000435"
|
||||
height="44.5159"
|
||||
version="1.0"
|
||||
sodipodi:docname="loadbalancer.svg"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||
sodipodi:modified="true">
|
||||
<metadata
|
||||
id="metadata2003">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Jeremy Grossmann</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:publisher>
|
||||
<cc:Agent>
|
||||
<dc:title>GNS-3</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:publisher>
|
||||
<dc:description>Created for the GNS-3 project (www.gns3.net)</dc:description>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/SourceCode" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2001">
|
||||
<marker
|
||||
inkscape:stockid="TriangleOutL"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="TriangleOutL"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path7835"
|
||||
d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#ffffff;fill-opacity:1"
|
||||
transform="scale(0.8)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="marker8031"
|
||||
style="overflow:visible;"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path8033"
|
||||
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#ffffff;fill-opacity:1"
|
||||
transform="scale(0.8) rotate(180) translate(12.5,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Lend"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow2Lend"
|
||||
style="overflow:visible;"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path7714"
|
||||
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#ffffff;fill-opacity:1"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
transform="scale(1.1) rotate(180) translate(1,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow1Lend"
|
||||
style="overflow:visible;"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path7696"
|
||||
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#ffffff;fill-opacity:1"
|
||||
transform="scale(0.8) rotate(180) translate(12.5,0)" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
effect="powerstroke"
|
||||
id="path-effect7647"
|
||||
is_visible="true"
|
||||
offset_points="0,0.5"
|
||||
sort_points="true"
|
||||
interpolator_type="CubicBezierJohan"
|
||||
interpolator_beta="0.2"
|
||||
start_linecap_type="zerowidth"
|
||||
linejoin_type="round"
|
||||
miter_limit="4"
|
||||
end_linecap_type="zerowidth"
|
||||
cusp_linecap_type="round" />
|
||||
<linearGradient
|
||||
id="linearGradient9312">
|
||||
<stop
|
||||
style="stop-color:#3c8c8c;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop9314" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.94117647;"
|
||||
offset="1"
|
||||
id="stop9316" />
|
||||
</linearGradient>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow2Lstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path11918"
|
||||
style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
transform="matrix(1.1,0,0,1.1,1.1,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Send"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Send"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path11921"
|
||||
d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
|
||||
style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none"
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Lstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path11936"
|
||||
d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
|
||||
style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)" />
|
||||
</marker>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient9312"
|
||||
id="linearGradient2216"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(15.252829,0,0,14.082619,53.467529,3.4188377)"
|
||||
x1="-1.0929121"
|
||||
y1="0.63145506"
|
||||
x2="-4.5832458"
|
||||
y2="0.070047863" />
|
||||
<linearGradient
|
||||
id="linearGradient10123"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop10125"
|
||||
offset="0"
|
||||
style="stop-color:#e4405c;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop10127"
|
||||
offset="1"
|
||||
style="stop-color:#e4405c;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
y2="0.56367606"
|
||||
x2="0.49966058"
|
||||
y1="1.4711363"
|
||||
x1="1.3990936"
|
||||
gradientTransform="matrix(19.859681,0,0,16.579703,65.763316,-33.354621)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient9177"
|
||||
xlink:href="#linearGradient10123"
|
||||
inkscape:collect="always" />
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow2Lstart-4"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Lstart">
|
||||
<path
|
||||
transform="matrix(1.1,0,0,1.1,1.1,0)"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||
id="path11918-6" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Send-3"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Send">
|
||||
<path
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
|
||||
d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
|
||||
id="path11921-9" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Lstart-2"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lstart">
|
||||
<path
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
|
||||
d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
|
||||
id="path11936-8" />
|
||||
</marker>
|
||||
<linearGradient
|
||||
y2="0.070047863"
|
||||
x2="-4.5832458"
|
||||
y1="0.63145506"
|
||||
x1="-1.0929121"
|
||||
gradientTransform="matrix(15.252829,0,0,14.082619,53.467529,3.4188377)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient9890"
|
||||
xlink:href="#linearGradient9312"
|
||||
inkscape:collect="always" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-height="1003"
|
||||
inkscape:window-width="1524"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
guidetolerance="10.0"
|
||||
gridtolerance="10.0"
|
||||
objecttolerance="10.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
inkscape:zoom="7.8958335"
|
||||
inkscape:cx="10.561503"
|
||||
inkscape:cy="-1.722049"
|
||||
inkscape:window-x="1360"
|
||||
inkscape:window-y="0"
|
||||
inkscape:current-layer="g9892"
|
||||
showgrid="false"
|
||||
inkscape:window-maximized="0" />
|
||||
<rect
|
||||
style="opacity:1;fill:#000000;fill-opacity:0.39215687;fill-rule:evenodd;stroke:none;stroke-width:0.2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect4558"
|
||||
width="64.552505"
|
||||
height="41.53862"
|
||||
x="1.4479325"
|
||||
y="2.9772801"
|
||||
ry="11.631706"
|
||||
rx="32.212925"
|
||||
inkscape:transform-center-x="8.4568136" />
|
||||
<rect
|
||||
style="opacity:1;fill:#3c8c8c;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.015;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect9971"
|
||||
width="64.499474"
|
||||
height="42.154343"
|
||||
x="0.0625"
|
||||
y="0.18084908"
|
||||
ry="11.557454"
|
||||
rx="32.249737"
|
||||
inkscape:transform-center-x="8.2952569" />
|
||||
<g
|
||||
id="g4160"
|
||||
transform="translate(-0.05300324,0)">
|
||||
<path
|
||||
id="path4815"
|
||||
d="M 64.514069,11.541297 64.457031,10.955643 64.342949,10.36999 64.152814,9.8038604 63.867612,9.2182077 63.487345,8.6520765 63.050034,8.0859452 62.517657,7.5393369 61.909226,7.0122499 61.224742,6.4851607 60.464203,5.9775955 59.646626,5.4700289 58.752993,4.9819859 57.783307,4.4939413 56.75658,4.0644625 55.6538,3.6349838 54.493981,3.2055052 53.296132,2.8150692 52.022232,2.4636777 50.710303,2.1122862 49.341334,1.7999375 47.934339,1.5071117 46.489316,1.2338059 45.006267,0.99954576 43.504204,0.76528425 41.964114,0.58958842 40.385997,0.43341443 l -1.59713,-0.1366529 -1.597129,-0.0976086 -1.616141,-0.0780874 -1.63516,-0.05856538 -1.616141,0 0,0 -1.63516,0 -1.635155,0.05856538 -1.597131,0.0780874 -1.616145,0.0976086 -1.597129,0.1366529 -1.559104,0.15617399 -1.5591,0.17569583 -1.502065,0.23426151 -1.483049,0.23426014 -1.445024,0.2733058 -1.406994,0.2928258 -1.368967,0.3123487 -1.311931,0.3513915 -1.2739,0.3513915 -1.19785,0.390436 L 8.9757693,3.6349838 7.8729941,4.0644625 6.8462664,4.4939413 5.8765785,4.9819859 4.9829488,5.4700289 4.1653682,5.9775955 3.4048335,6.4851607 2.7203448,7.0122499 2.1309311,7.5393369 1.5795405,8.0859452 1.1422325,8.6520765 0.76195982,9.2182077 0.47676065,9.8038604 0.26760898,10.36999 l -0.11407814,0.585653 -0.0380276,0.585654 0,0 0.0380276,0.585653 0.11407814,0.566131 0.20915167,0.585653 0.28519917,0.54661 0.38027268,0.585652 0.437308,0.546609 0.5513906,0.566131 0.5894137,0.546612 0.6844887,0.527087 0.7605347,0.488044 0.8175806,0.507564 0.8936297,0.507565 0.9696879,0.449001 1.0267277,0.449002 1.1027752,0.449002 1.1598227,0.409958 1.19785,0.390436 1.2739,0.351389 1.311931,0.351391 1.368967,0.312348 1.406994,0.312351 1.445024,0.253779 1.483049,0.253784 1.502065,0.214738 1.5591,0.175698 1.559104,0.156176 1.597129,0.136651 1.616145,0.09761 1.597131,0.07809 1.635155,0.05857 1.63516,0 0,0 1.616141,0 1.63516,-0.05857 1.616141,-0.07809 1.597129,-0.09761 1.59713,-0.136651 1.578117,-0.156176 1.54009,-0.175698 1.502063,-0.214738 1.483049,-0.253784 1.445023,-0.253779 1.406995,-0.312351 1.368969,-0.312348 1.311929,-0.351391 1.2739,-0.351389 1.197849,-0.390436 1.159819,-0.409958 1.10278,-0.449002 1.026727,-0.449002 0.969686,-0.449001 0.893633,-0.507565 0.817577,-0.507564 0.760539,-0.488044 0.684484,-0.527087 0.608431,-0.546612 0.532377,-0.566131 0.437311,-0.546609 0.380267,-0.585652 0.285202,-0.54661 0.190135,-0.585653 0.114082,-0.566131 0.05704,-0.585653"
|
||||
style="fill:url(#linearGradient2216);fill-opacity:1;stroke:none;stroke-width:0.01928605;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1.5224251,11.738982 c 22.4781589,0.179109 22.3886049,0.08956 22.3886049,0.08956 l 0,0"
|
||||
id="path7667"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
id="g9892"
|
||||
transform="translate(-57.894994,22.707717)">
|
||||
<path
|
||||
style="fill:#000000;stroke:none;stroke-width:0.001"
|
||||
d="m 72.358817,-10.103986 9.453197,0.0146 -0.0017,1.0942609 2.902891,-2.1840409 -2.895747,-2.441693 -0.0017,1.077681 -9.453197,-0.0146 -0.0038,2.453792"
|
||||
id="path2049"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#000000;stroke:none;stroke-width:0.001"
|
||||
d="m 93.50729,-13.193692 6.83173,-5.703422 0.95326,0.812405 0,-3.249623 -3.872633,0 0.953265,0.812406 -6.831729,5.70342 1.966107,1.624814"
|
||||
id="path2055"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#000000;stroke:none;stroke-width:0.001"
|
||||
d="m 93.50729,-10.739897 9.73124,0 0,1.0776818 2.62148,-2.4372178 -2.62148,-2.188521 0,1.094262 -9.73124,0 0,2.453795"
|
||||
id="path2057"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#000000;stroke:none;stroke-width:0.001"
|
||||
d="m 91.541183,-9.1150862 6.831729,5.703419 -0.953265,0.828987 3.872633,-0.265276 0,-2.984348 -0.95326,0.812406 -6.83173,-5.7199988 -1.966107,1.6248108"
|
||||
id="path2059"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.001"
|
||||
d="m 72.061358,-10.386298 9.413478,0.01454 -0.0017,1.0942579 2.922724,-2.1674299 -2.91558,-2.458303 -0.0017,1.07768 -9.413478,-0.01454 -0.0038,2.453795"
|
||||
id="path2065"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.001"
|
||||
d="m 93.844905,-12.911839 6.811865,-5.72 0.97313,0.828986 0,-3.266204 -3.912358,0 0.973126,0.812407 -6.811872,5.72 1.966109,1.624811"
|
||||
id="path2071"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.001"
|
||||
d="m 93.844905,-10.458041 9.711385,0 0,1.0776808 2.62148,-2.4537968 -2.62148,-2.171941 0,1.094259 -9.711385,0 0,2.453798"
|
||||
id="path2073"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.001"
|
||||
d="m 91.878796,-8.8332292 6.811872,5.703419 -0.973126,0.812405 3.912358,-0.265275 0,-3.000928 -0.97313,0.812406 -6.811865,-5.6868388 -1.966109,1.6248118"
|
||||
id="path2075"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#000000;stroke:none;stroke-width:0.001"
|
||||
d="m 95.45354,-11.701521 -0.01986,-0.215535 -0.01986,-0.248695 -0.03972,-0.215536 -0.03972,-0.215537 -0.05958,-0.232115 -0.07944,-0.215538 -0.0993,-0.215536 -0.07944,-0.215536 -0.119159,-0.198957 -0.119157,-0.198956 -0.139019,-0.198957 -0.158877,-0.198957 -0.158876,-0.182376 -0.178737,-0.165797 -0.178738,-0.182378 -0.178737,-0.149215 -0.218457,-0.149218 -0.198596,-0.149218 -0.218457,-0.132636 -0.218457,-0.116059 -0.258175,-0.132639 -0.218457,-0.09948 -0.258176,-0.0829 -0.258177,-0.0829 -0.238314,-0.0829 -0.278037,-0.04974 -0.238314,-0.06632 -0.297897,-0.03316 -0.258177,-0.03316 -0.278033,-0.01658 -0.258177,0 0,0 -0.278035,0 -0.258176,0.01658 -0.278036,0.03316 -0.258176,0.03316 -0.278036,0.06632 -0.258176,0.04974 -0.258176,0.0829 -0.258175,0.0829 -0.238315,0.0829 -0.218458,0.09948 -0.258175,0.132639 -0.238316,0.116059 -0.198598,0.132636 -0.218455,0.149218 -0.198598,0.149218 -0.178736,0.149215 -0.198597,0.182378 -0.158877,0.165797 -0.158878,0.182376 -0.158877,0.198957 -0.139019,0.198957 -0.119157,0.198956 -0.11916,0.198957 -0.0993,0.215536 -0.0993,0.215536 -0.05958,0.215538 -0.05958,0.232115 -0.05958,0.215537 -0.03972,0.215536 0,0.248695 -0.01986,0.215535 0,0 0.01986,0.215537 0,0.232117 0.03972,0.232116 0.05958,0.232116 0.05958,0.215536 0.05958,0.215536 0.0993,0.215536 0.0993,0.2155358 0.11916,0.198956 0.119157,0.198956 0.139019,0.198957 0.158877,0.198957 0.158878,0.182377 0.158877,0.165797 0.198597,0.165797 0.178736,0.165798 0.198598,0.149217 0.218455,0.149217 0.198598,0.132638 0.238316,0.116058 0.258175,0.116057 0.218458,0.116058 0.238315,0.09948 0.258175,0.0829 0.258176,0.04974 0.258176,0.06632 0.278036,0.06632 0.258176,0.01658 0.278036,0.04974 0.258176,0.01658 0.278035,0 0,0 0.258177,0 0.278033,-0.01658 0.258177,-0.04974 0.297897,-0.01658 0.238314,-0.06632 0.278037,-0.06632 0.238314,-0.04974 0.258177,-0.0829 0.258176,-0.09948 0.218457,-0.116058 0.258175,-0.116057 0.218457,-0.116058 0.218457,-0.132638 0.198596,-0.149217 0.218457,-0.149217 0.178737,-0.165798 0.178738,-0.165797 0.178737,-0.165797 0.158876,-0.182377 0.158877,-0.198957 0.139019,-0.198957 0.119157,-0.198956 0.119159,-0.198956 0.07944,-0.2155358 0.0993,-0.215536 0.07944,-0.215536 0.05958,-0.215536 0.03972,-0.232116 0.03972,-0.232116 0.01986,-0.232117 0.01986,-0.215537"
|
||||
id="path2081"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.001"
|
||||
d="m 96.089049,-11.154389 -0.01986,-0.215537 -0.01986,-0.232116 -0.03972,-0.232115 -0.01986,-0.232117 -0.07944,-0.215536 -0.07944,-0.215536 -0.07944,-0.215536 -0.0993,-0.198957 -0.11916,-0.215537 -0.119156,-0.198956 -0.139018,-0.198955 -0.139018,-0.198957 -0.178738,-0.182377 -0.178736,-0.165798 -0.158877,-0.165797 -0.198597,-0.165796 -0.218457,-0.149218 -0.198595,-0.149218 -0.218458,-0.132637 -0.218457,-0.116057 -0.238315,-0.116059 -0.238318,-0.116057 -0.258175,-0.09948 -0.238316,-0.0829 -0.258175,-0.06632 -0.258176,-0.04974 -0.258178,-0.06632 -0.278033,-0.03316 -0.258177,-0.03316 -0.278036,-0.01658 -0.278035,0 0,0 -0.278036,0 -0.258175,0.01658 -0.258176,0.03316 -0.278036,0.03316 -0.258175,0.06632 -0.258177,0.04974 -0.278035,0.06632 -0.238316,0.0829 -0.238317,0.09948 -0.258176,0.116057 -0.218456,0.116059 -0.238316,0.116057 -0.218457,0.132637 -0.218457,0.149218 -0.198597,0.149218 -0.178735,0.165796 -0.198599,0.165797 -0.158876,0.165798 -0.158877,0.182377 -0.158878,0.198957 -0.139018,0.198955 -0.119156,0.198956 -0.11916,0.215537 -0.0993,0.198957 -0.07944,0.215536 -0.07944,0.215536 -0.05958,0.215536 -0.03972,0.232117 -0.03972,0.232115 -0.01986,0.232116 0,0.215537 0,0 0,0.232116 0.01986,0.232115 0.03972,0.198957 0.03972,0.232117 0.05958,0.232116 0.07944,0.2155358 0.07944,0.215536 0.0993,0.215536 0.11916,0.198956 0.119156,0.198956 0.139018,0.198957 0.158878,0.182377 0.158877,0.198956 0.158876,0.165798 0.198599,0.165797 0.178735,0.165797 0.198597,0.149217 0.218457,0.132637 0.218457,0.149219 0.238316,0.116057 0.218456,0.116058 0.258176,0.116059 0.238317,0.0829 0.238316,0.0829 0.278035,0.0829 0.258177,0.06632 0.258175,0.04974 0.278036,0.03316 0.258176,0.03316 0.258175,0.01658 0.278036,0 0,0 0.278035,0 0.278036,-0.01658 0.258177,-0.03316 0.278033,-0.03316 0.258178,-0.04974 0.258176,-0.06632 0.258175,-0.0829 0.238316,-0.0829 0.258175,-0.0829 0.238318,-0.116059 0.238315,-0.116058 0.218457,-0.116057 0.218458,-0.149219 0.198595,-0.132637 0.218457,-0.149217 0.198597,-0.165797 0.158877,-0.165797 0.178736,-0.165798 0.178738,-0.198956 0.139018,-0.182377 0.139018,-0.198957 0.119156,-0.198956 0.11916,-0.198956 0.0993,-0.215536 0.07944,-0.215536 0.07944,-0.2155358 0.07944,-0.232116 0.01986,-0.232117 0.03972,-0.198957 0.01986,-0.232115 0.01986,-0.232116"
|
||||
id="path2083"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:url(#linearGradient9177);fill-opacity:1;stroke:none;stroke-width:0.001"
|
||||
d="m 95.751434,-11.419665 -0.01986,-0.232116 0,-0.232116 -0.03972,-0.215536 -0.05958,-0.232116 -0.05958,-0.215536 -0.05958,-0.215536 -0.0993,-0.215537 -0.0993,-0.215534 -0.0993,-0.198958 -0.119148,-0.198957 -0.158878,-0.198956 -0.158878,-0.198957 -0.139019,-0.182376 -0.178736,-0.165797 -0.178738,-0.165798 -0.198596,-0.165797 -0.198597,-0.149218 -0.198596,-0.149217 -0.218457,-0.132637 -0.238318,-0.132639 -0.238314,-0.116057 -0.218458,-0.09948 -0.258175,-0.09948 -0.258176,-0.0829 -0.258176,-0.0829 -0.258176,-0.04974 -0.258175,-0.04974 -0.278036,-0.03316 -0.258176,-0.03316 -0.278035,-0.01658 -0.258175,0 0,0 -0.278037,0 -0.258175,0.01658 -0.278037,0.03316 -0.278036,0.03316 -0.258175,0.04974 -0.258176,0.04974 -0.258176,0.0829 -0.258176,0.0829 -0.238315,0.09948 -0.238318,0.09948 -0.238314,0.116057 -0.238316,0.132639 -0.198598,0.132637 -0.218455,0.149217 -0.198598,0.149218 -0.178737,0.165797 -0.198596,0.165798 -0.178738,0.165797 -0.139017,0.182376 -0.158877,0.198957 -0.158878,0.198956 -0.0993,0.198957 -0.119159,0.198958 -0.0993,0.215534 -0.0993,0.215537 -0.05958,0.215536 -0.05958,0.215536 -0.05958,0.232116 -0.03972,0.215536 0,0.232116 -0.01986,0.232116 0,0 0.01986,0.215537 0,0.232115 0.03972,0.232116 0.05958,0.215536 0.05958,0.232115 0.05958,0.215538 0.0993,0.2155368 0.0993,0.198956 0.119159,0.215536 0.0993,0.198956 0.158878,0.198958 0.158877,0.182375 0.139017,0.182378 0.178738,0.165796 0.198596,0.182377 0.178737,0.149218 0.198598,0.165797 0.218455,0.132638 0.198598,0.149216 0.238316,0.116058 0.238314,0.116059 0.238318,0.116057 0.238315,0.0829 0.258176,0.0829 0.258176,0.0829 0.258176,0.04974 0.258175,0.04974 0.278036,0.04974 0.278037,0.03316 0.258175,0 0.278037,0.01658 0,0 0.258175,-0.01658 0.278035,0 0.258176,-0.03316 0.278036,-0.04974 0.258175,-0.04974 0.258176,-0.04974 0.258176,-0.0829 0.258176,-0.0829 0.258175,-0.0829 0.218458,-0.116057 0.238314,-0.116059 0.238318,-0.116058 0.218457,-0.149216 0.198596,-0.132638 0.198597,-0.165797 0.198596,-0.149218 0.178738,-0.182377 0.178736,-0.165796 0.139019,-0.182378 0.158878,-0.182375 0.158878,-0.198958 0.119156,-0.198956 0.0993,-0.215536 0.0993,-0.198956 0.0993,-0.2155368 0.05958,-0.215538 0.05958,-0.232115 0.05958,-0.215536 0.03972,-0.232116 0,-0.232115 0.01986,-0.215537"
|
||||
id="path2085"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 22 KiB |
387
gns3server/custom_symbols/loadbalancer_docker.svg
Normal file
After Width: | Height: | Size: 57 KiB |
1967
gns3server/custom_symbols/mgmt_station.svg
Normal file
After Width: | Height: | Size: 60 KiB |
1996
gns3server/custom_symbols/mgmt_station_docker.svg
Normal file
After Width: | Height: | Size: 94 KiB |
85
gns3server/custom_symbols/microsoft.svg
Normal file
@ -0,0 +1,85 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
height="70"
|
||||
width="70"
|
||||
id="svg2"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="microsoft.svg">
|
||||
<metadata
|
||||
id="metadata18">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs16" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview14"
|
||||
showgrid="false"
|
||||
inkscape:zoom="6.0820847"
|
||||
inkscape:cx="11.449874"
|
||||
inkscape:cy="32.506345"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2" />
|
||||
<rect
|
||||
height="64.5785798"
|
||||
width="64.5785805"
|
||||
x="2.7154145"
|
||||
y="2.8091612"
|
||||
id="rect0"
|
||||
style="fill:#ffffff" />
|
||||
<rect
|
||||
height="30.933941"
|
||||
width="30.933941"
|
||||
x="2.7154145"
|
||||
y="2.8091612"
|
||||
id="rect6"
|
||||
style="fill:#f35325" />
|
||||
<rect
|
||||
height="30.933941"
|
||||
width="30.933941"
|
||||
x="36.360054"
|
||||
y="2.8091612"
|
||||
id="rect8"
|
||||
style="fill:#81bc06" />
|
||||
<rect
|
||||
height="30.933941"
|
||||
width="30.933941"
|
||||
x="2.7154145"
|
||||
y="36.4538"
|
||||
id="rect10"
|
||||
style="fill:#05a6f0" />
|
||||
<rect
|
||||
height="30.933941"
|
||||
width="30.933941"
|
||||
x="36.360054"
|
||||
y="36.4538"
|
||||
id="rect12"
|
||||
style="fill:#ffba08" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.1 KiB |
332
gns3server/custom_symbols/multilayer_switch_docker.svg
Normal file
After Width: | Height: | Size: 53 KiB |
344
gns3server/custom_symbols/multilayer_switch_green_docker.svg
Normal file
After Width: | Height: | Size: 54 KiB |
344
gns3server/custom_symbols/multilayer_switch_red_docker.svg
Normal file
After Width: | Height: | Size: 54 KiB |
BIN
gns3server/custom_symbols/opennac.png
Normal file
After Width: | Height: | Size: 782 B |
126
gns3server/custom_symbols/opensuse.svg
Normal file
@ -0,0 +1,126 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.0"
|
||||
width="70.00013"
|
||||
height="44.285007"
|
||||
id="svg2"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="opensuse.svg">
|
||||
<metadata
|
||||
id="metadata29">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs27" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="2495"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview25"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="2.6257672"
|
||||
inkscape:cx="10.160224"
|
||||
inkscape:cy="17.860616"
|
||||
inkscape:window-x="1985"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
inkscape:label="Logo">
|
||||
<rect
|
||||
style="fill:#ffffff;stroke:#ffffff;stroke-opacity:1"
|
||||
id="rect4169"
|
||||
width="70.265175"
|
||||
height="44.939247"
|
||||
x="0.19042054"
|
||||
y="-0.27339759" />
|
||||
<path
|
||||
d="m 61.241669,11.174955 c -1.53878,-0.05651 -2.74666,-1.3536628 -2.69527,-2.8946458 0.0237,-0.746062 0.34262,-1.435659 0.88457,-1.944803 0.54415,-0.508997 1.25487,-0.773944 2.00093,-0.745877 1.54098,0.05393 2.7492,1.348923 2.69744,2.892257 -0.0233,0.743712 -0.33788,1.433269 -0.88203,1.9446168 -0.54669,0.506794 -1.25741,0.771779 -2.00568,0.748452 l 4e-5,0 z m 0.64765,-2.5312428 c 0.68485,0 1.24065,-0.370493 1.24065,-0.825521 0,-0.457417 -0.55583,-0.828099 -1.24065,-0.828099 -0.68519,0 -1.23883,0.370682 -1.23883,0.828099 0,0.455028 0.55364,0.825521 1.23883,0.825521"
|
||||
style="fill:#73ba25;fill-rule:nonzero"
|
||||
id="path4"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 29.583689,27.224557 0.099,-0.0093 0.0161,-0.117267 c -0.0254,-0.09207 -0.0851,-0.174814 -0.17734,-1.31622 -0.0783,-1.010192 -0.23705,-3.780477 1.1573,-5.154248 0.54092,-0.536129 1.36682,-1.012503 2.01823,-1.166597 2.67143,-0.651227 6.13906,-0.200223 9.10042,3.223814 1.52805,1.769386 2.27816,2.577052 2.6532,2.938324 l 0.12872,0.119605 0.15658,0.112799 c 0.12192,0.06901 5.08971,2.356252 5.08971,2.356252 l 0.10119,-0.02536 0.003,-0.107964 c -0.0322,-0.03683 -3.14766,-4.061499 -2.59561,-7.377169 0.43723,-2.641561 2.54022,-2.404543 5.44654,-2.073291 0.9503,0.108148 2.03181,0.232405 3.15016,0.257775 3.12225,0.01843 6.48658,-0.554502 8.55987,-1.461199 1.34145,-0.586685 2.19737,-0.973367 2.73364,-1.461201 0.19304,-0.158743 0.29423,-0.420982 0.39791,-0.697174 l 0.0715,-0.186275 c 0.0873,-0.223286 0.21381,-0.701824 0.26924,-0.961904 0.0254,-0.114958 0.0368,-0.239359 -0.044,-0.301379 l -0.28747,0.0529 c -0.90882,0.545386 -3.18482,1.585453 -5.31533,1.6269 -2.63926,0.05506 -7.95921,-2.65551 -8.51375,-2.943157 l -0.0529,-0.06202 c -0.1337,-0.317667 -0.93207,-2.20681 -1.10011,-2.6047298 3.8291,2.5218068 7.00425,3.9163408 9.43651,4.1326328 2.70611,0.24152 4.81623,-1.235605 5.71824,-1.866296 0.17697,-0.119605 0.31067,-0.216291 0.36574,-0.236868 l 0.0575,-0.09438 c -0.14981,-0.9503 -1.56489,-5.5523538 -2.63244,-6.6569298 -0.29674,-0.303721 -0.53379,-0.598143 -1.0125,-0.878983 -3.86805,-2.254915 -13.05144,-3.61726601 -13.48154,-3.67928501 l -0.0737,0.02072 -0.0275,0.06436 c 0,0 -0.0347,1.90524801 -0.0393,2.11707701 -0.93888,-0.31302 -7.75649,-2.51518001 -14.14906,-2.73828401 -5.41861,-0.19096 -12.82114,-0.448735 -23.28162,5.98029301 l -0.30837,0.193229 C 8.301909,9.3132972 4.905588,13.096264 3.129245,17.495785 2.572399,18.878675 1.822322,22.001299 2.5631,24.939623 c 0.322136,1.286385 0.918119,2.574894 1.723624,3.730064 1.815516,2.609233 4.864295,4.342157 8.147825,4.634235 4.63423,0.414027 8.14566,-1.668197 9.39503,-5.566303 0.85822,-2.689846 0,-6.636023 -3.29048,-8.649421 -2.67609,-1.640665 -5.55701,-1.265625 -7.22524,-0.16339 -1.44959,0.961757 -2.27099,2.452795 -2.25492,4.093494 0.0322,2.906146 2.53807,4.452427 4.33751,4.454768 0.52448,0 1.04915,-0.08973 1.64282,-0.282961 0.20953,-0.06454 0.40957,-0.142636 0.62817,-0.278498 l 0.0669,-0.0436 0.0436,-0.02536 -0.0161,0.007 c 0.41187,-0.27619 0.66034,-0.731663 0.66034,-1.219534 0,-0.133517 -0.0207,-0.269233 -0.0575,-0.405058 -0.21165,-0.734002 -0.93888,-1.180362 -1.6936,-1.042375 l -0.10119,0.02071 -0.13803,0.04595 -0.20022,0.06685 c -0.41417,0.103501 -0.72719,0.110495 -0.79155,0.112617 -0.21165,-0.01378 -1.24956,-0.324258 -1.24956,-1.461018 l 0,-0.01375 c 0.003,-0.416521 0.17035,-0.708781 0.26242,-0.867525 0.3198,-0.50625 1.20343,-1.003203 2.39756,-0.897398 1.56488,0.133371 2.69233,0.936537 3.4401,2.450637 0.69502,1.408114 0.51325,3.138548 -0.46711,4.408641 -0.97336,1.258854 -2.70592,1.792635 -5.01162,1.541632 -2.32407,-0.255286 -4.28903,-1.592231 -5.38895,-3.674634 -1.076867,-2.034155 -1.136762,-4.447961 -0.154099,-6.302429 2.353949,-4.441006 6.797079,-4.39506 9.233979,-3.973892 3.60797,0.623516 6.88234,3.511241 8.3389,7.351799 0.2324,0.612089 0.35197,1.097582 0.45547,1.539326 l 0.15658,0.664993 4.0749,1.99033 0.0554,0.03914 1.1e-4,-3.7e-5 z M 58.548909,5.5489272 c -0.76831,0.713245 -1.20807,1.686612 -1.24491,2.735942 -0.0711,2.1628418 1.62709,3.9853128 3.78978,4.0659648 1.05399,0.03449 2.05253,-0.336085 2.81872,-1.05398 0.76619,-0.715592 1.20592,-1.6866118 1.2449,-2.7336368 0.0737,-2.165181 -1.62459,-3.989959 -3.79189,-4.06809 -1.04933,-0.03448 -2.05041,0.335905 -2.8166,1.0538"
|
||||
style="fill:#73ba25;fill-rule:evenodd"
|
||||
id="path6"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 69.880729,32.589151 -0.0455,0 c -0.0526,0 -0.0982,-0.04561 -0.0982,-0.09822 l 0,-0.704859 -0.15433,0.234949 c -0.0175,0.02452 -0.0491,0.03502 -0.0771,0.03502 l -0.0176,0 c -0.028,0 -0.0596,-0.01051 -0.0771,-0.03502 l -0.15784,-0.234949 0,0.704859 c 0,0.05261 -0.0456,0.09822 -0.10172,0.09822 l -0.0455,0 c -0.0526,0 -0.0982,-0.04561 -0.0982,-0.09822 l 0,-0.841684 -0.4735,0 0,0.841684 c 0,0.05261 -0.0491,0.09822 -0.10513,0.09822 l -0.0421,0 c -0.0526,0 -0.0982,-0.04561 -0.0982,-0.09822 l 0,-0.841684 -0.35418,0 c -0.0526,0 -0.0947,-0.03511 -0.0947,-0.09113 l 0,-0.0491 c 0,-0.05611 0.0421,-0.09122 0.0947,-0.09122 l 1.24147,0 c 0.0491,0 0.0806,0.0175 0.0982,0.04561 l 0.23494,0.35418 0.23496,-0.35418 c 0.0175,-0.0246 0.0456,-0.04561 0.0982,-0.04561 l 0.15783,0 0,1.080139 c 0,0.05261 -0.0491,0.09822 -0.10522,0.09822"
|
||||
style="fill:#73ba25"
|
||||
id="path8"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 29.287079,31.112727 c -1.69737,0 -2.63727,1.437818 -2.63727,2.433833 l 0,1.276578 c 0,1.462418 1.19586,2.370719 2.3076,2.370719 l 3.89275,0 c 0.48751,0 0.58922,0.319076 0.58922,0.589128 l 0,0.824177 c 0,0.08763 -0.014,0.880293 -0.58922,0.880293 l -5.31306,0 c -0.52611,0 -0.9083,0.364684 -0.9083,0.866189 l 0,0.227955 c 0,0.498004 0.37869,0.866282 0.9083,0.866282 l 5.60422,0 c 1.46242,0 2.40932,-1.017113 2.40932,-2.595259 l 0,-1.378208 c 0,-1.480014 -1.06613,-2.142767 -2.12176,-2.142767 l -3.82964,0 c -0.57871,0 -0.83818,-0.427891 -0.83818,-0.736464 l 0,-0.757558 c 0,-0.480409 0.31908,-0.753967 0.8802,-0.753967 l 4.24352,0 c 0.51902,0 0.9083,-0.371774 0.9083,-0.866282 l 0,-0.227952 c 0,-0.491002 -0.39629,-0.866195 -0.9258,-0.866195 l -4.5732,0"
|
||||
id="S"
|
||||
style="fill:#73ba25"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 45.219449,31.112727 c -0.50151,0 -0.9083,0.40679 -0.9083,0.908297 l 0,6.523027 c 0,0.519012 -0.42438,0.939901 -0.9399,0.939901 l -2.95994,0 c -0.51902,0 -0.93991,-0.420889 -0.93991,-0.939901 l 0,-6.523027 c 0,-0.501507 -0.40328,-0.908297 -0.9083,-0.908297 l -0.28756,0 c -0.50501,0 -0.9083,0.399788 -0.9083,0.908297 l 0,6.771984 c 0,1.574646 1.23797,2.717986 2.94585,2.717986 l 3.16338,0 c 1.70788,0 2.94585,-1.14334 2.94585,-2.717986 l 0,-6.771984 c 0,-0.508509 -0.39979,-0.908297 -0.9083,-0.908297 l -0.28757,0"
|
||||
style="fill:#73ba25"
|
||||
id="path11"
|
||||
inkscape:connector-curvature="0" />
|
||||
<use
|
||||
style=""
|
||||
transform="translate(21.601409,1.9460253e-7)"
|
||||
xlink:href="#S"
|
||||
id="use13"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
<path
|
||||
d="m 59.843639,31.112727 c -0.50142,0 -0.8872,0.371687 -0.8872,0.866189 l 0,8.602683 c 0,0.491002 0.37169,0.866282 0.86969,0.866282 l 6.8562,0 c 0.52611,0 0.90839,-0.364775 0.90839,-0.866282 l 0,-0.227955 c 0,-0.498005 -0.37878,-0.866189 -0.90839,-0.866189 0,0 -5.36217,0 -5.61472,0 0,-0.22445 0,-1.967432 0,-2.191882 0.25255,0 4.11379,0 4.11379,0 0.52602,0 0.9083,-0.364772 0.9083,-0.869784 l 0,-0.224447 c 0,-0.50151 -0.38228,-0.869695 -0.9083,-0.869695 0,0 -3.86124,0 -4.11379,0 0,-0.224446 0,-2.027045 0,-2.251491 0.25255,0 5.33066,0 5.33066,0 0.52611,0 0.90839,-0.364772 0.90839,-0.866283 l 0,-0.227949 c 0,-0.50151 -0.38228,-0.866192 -0.90839,-0.866192 l -6.55103,0"
|
||||
style="fill:#73ba25"
|
||||
id="path15"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="M 1.553608,35.20533 C 0.697896,35.20533 0,35.87167 0,36.695847 l 0,3.244006 c 0,0.834679 0.673347,1.51503 1.501007,1.51503 l 2.097187,0 c 0.82766,0 1.504508,-0.680351 1.504508,-1.51503 l 0,-3.244006 c 0,-0.820674 -0.697893,-1.490517 -1.553608,-1.490517 l -1.995486,0 z m -0.452408,4.608203 0,-2.959853 c 0,-0.347267 0.284072,-0.63133 0.631267,-0.63133 l 1.634267,0 c 0.340183,0 0.631258,0.287653 0.631258,0.63133 l 0,2.959853 c 0,0.34727 -0.284063,0.631328 -0.631258,0.631328 l -1.6483,0 c -0.347195,0 -0.617234,-0.277055 -0.617234,-0.631328"
|
||||
style="fill:#73ba25"
|
||||
id="path17"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 9.858239,35.166812 c -0.60673,0 -1.05914,0.217447 -1.42738,0.392785 -0.22094,0.105135 -0.41382,0.196349 -0.56463,0.196349 -0.0631,0 -0.12274,-0.02801 -0.15431,-0.07712 l -0.13677,-0.266555 c -0.0316,-0.07012 -0.17185,-0.206939 -0.347194,-0.206939 l -0.203405,0 c -0.196393,0 -0.357718,0.175426 -0.357718,0.396282 l 0,8.223993 c 0,0.25596 0.199904,0.4594 0.45942,0.4594 l 0.178859,0 c 0.252508,0 0.459418,-0.20694 0.459418,-0.4594 l 0,-2.728494 c 0,-0.08062 0.0526,-0.164836 0.1017,-0.164836 0.15081,0 0.34369,0.08422 0.56814,0.189437 0.36473,0.164833 0.82065,0.375187 1.42738,0.375187 l 0.18934,0 c 1.06963,0 1.73598,-0.610142 1.73598,-1.592149 l 0,-3.138784 c 0,-0.967914 -0.68035,-1.595655 -1.73598,-1.595655 l -0.19285,0 0,0 0,-0.0035 z m -2.09722,4.583605 0,-2.830121 c 0,-0.389282 0.30512,-0.694443 0.69439,-0.694443 l 1.52906,0 c 0.38929,0 0.69436,0.305161 0.69436,0.694443 l 0,2.830121 c 0,0.38228 -0.30857,0.694444 -0.69436,0.694444 l -1.52906,0 c -0.38226,0 -0.69439,-0.312164 -0.69439,-0.694444"
|
||||
style="fill:#73ba25"
|
||||
id="path19"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 14.894249,35.20533 c -0.85569,0 -1.55354,0.66634 -1.55354,1.490517 l 0,3.219406 c 0,0.834678 0.67684,1.54313 1.47642,1.54313 l 2.16386,0 c 0.26647,0 0.45941,-0.182431 0.45941,-0.434891 l 0,-0.140328 c 0,-0.25246 -0.19294,-0.434798 -0.45941,-0.434798 l -1.77458,0 c -0.49801,0 -0.76106,-0.242048 -0.76106,-0.708452 0,0 0,-0.810083 0,-0.939903 0.14383,0 3.20549,0 3.20549,0 0.51201,0 0.82059,-0.315574 0.82059,-0.848684 l 0,-1.248475 c 0,-0.820676 -0.69786,-1.490432 -1.55355,-1.490432 l -2.02004,0 -0.004,-0.0071 z m -0.4524,1.634257 c 0,-0.343679 0.27006,-0.617237 0.61723,-0.617237 l 1.68687,0 c 0.34727,0 0.61724,0.270055 0.61724,0.617237 0,0 0,0.873282 0,1.003018 -0.13674,0 -2.78452,0 -2.92134,0 0,-0.129736 0,-1.003018 0,-1.003018"
|
||||
style="fill:#73ba25"
|
||||
id="path21"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 22.932389,35.166812 c -0.60322,0 -1.05913,0.213944 -1.4239,0.389285 -0.22795,0.105135 -0.4243,0.199849 -0.58213,0.199849 -0.0701,0 -0.0982,-0.007 -0.15083,-0.101723 l -0.12623,-0.231452 c -0.0701,-0.143735 -0.19285,-0.217441 -0.36118,-0.217441 l -0.17894,0 c -0.21385,0 -0.36818,0.16483 -0.36818,0.396282 l 0,5.393777 c 0,0.256053 0.20335,0.462994 0.4594,0.462994 l 0.17884,0 c 0.25255,0 0.4594,-0.206941 0.4594,-0.462994 l 0,-4.082095 c 0,-0.38228 0.31217,-0.694444 0.69445,-0.694444 l 1.52904,0 c 0.38228,0 0.69435,0.312164 0.69435,0.694444 l 0,4.082095 c 0,0.256053 0.20344,0.462994 0.45949,0.462994 l 0.17884,0 c 0.25246,0 0.45941,-0.206941 0.45941,-0.462994 l 0,-4.232926 c 0,-0.967911 -0.68035,-1.595651 -1.73598,-1.595651 l -0.19285,0"
|
||||
style="fill:#73ba25"
|
||||
id="path23"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 13 KiB |
26
gns3server/custom_symbols/openvswitch_bybaro.svg
Normal file
@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg id="svg1998" width="51.358818" height="47.630692" version="1.0" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs id="defs2001">
|
||||
<marker orient="auto" refY="0" refX="0" id="Arrow2Lstart" style="overflow:visible">
|
||||
<path id="path11918" style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " transform="matrix(1.1,0,0,1.1,1.1,0)"/>
|
||||
</marker>
|
||||
<marker orient="auto" refY="0" refX="0" id="Arrow1Send" style="overflow:visible">
|
||||
<path id="path11921" d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none" transform="matrix(-0.2,0,0,-0.2,-1.2,0)"/>
|
||||
</marker>
|
||||
<marker orient="auto" refY="0" refX="0" id="Arrow1Lstart" style="overflow:visible">
|
||||
<path id="path11936" d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none" transform="matrix(0.8,0,0,0.8,10,0)"/>
|
||||
</marker>
|
||||
<linearGradient id="linearGradient9199" gradientUnits="userSpaceOnUse" gradientTransform="matrix(24.666332,1.3331909e-2,-1.2883406e-2,23.708747,-8.6563136,-4.6316275)" x1="2.1178279" y1="0.30649999" x2="-0.4954865" y2="0.30649999">
|
||||
<stop style="stop-opacity: 1; stop-color: rgb(239, 239, 239);" offset="0" id="stop8333"/>
|
||||
<stop style="stop-opacity: 1; stop-color: rgb(255, 255, 255);" offset="1" id="stop8335"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<path id="path11907" d="M 1.8402723,44.565612 L 1.8402723,47.615693 L 44.293781,47.615693 L 44.293781,44.565612 L 1.8402723,44.565612" style="fill:#000000;fill-opacity:0.39215686;stroke:none;stroke-width:0.001"/>
|
||||
<path id="path11020" d="M 44.370594,6.1851672 L 51.194316,1.0980117 L 51.358819,41.344844 L 44.266438,47.63069 L 44.370594,6.1851672" style="fill:#000000;fill-opacity:0.39215686;stroke:none;stroke-width:0.001"/>
|
||||
<path id="path2037" d="M 0.062500355,5.0439492 L 0.062500355,46.326915 L 44.31814,46.326915 L 44.31814,5.0439492 L 0.062500355,5.0439492" style="fill-opacity: 1; stroke: none; stroke-width: 0.001; fill: rgb(239, 239, 239);"/>
|
||||
<path id="path2041" d="M -0.028418806,5.1647552 L 5.5982489,0.11782966 L 50.022311,0.14184042 L 44.346312,5.1887393 L -0.028418806,5.1647552" style="fill:url(#linearGradient9199);fill-opacity:1;stroke:none;stroke-width:0.001"/>
|
||||
<path id="path2045" d="M 44.228586,5.0887264 L 49.976169,0.12831483 L 49.976169,41.348635 L 44.228586,46.309047 L 44.228586,5.0887264" style="fill-opacity: 1; stroke: none; stroke-width: 0.001; fill: rgb(223, 223, 223);"/>
|
||||
<path id="path-1" style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 22.02 13.392 C 18.596 13.392 15.66 14.606 13.304 16.992 C 10.94 19.354 9.744 22.31 9.744 25.78 C 9.744 29.424 10.984 32.462 13.428 34.804 C 15.862 37.152 18.706 38.342 21.89 38.342 C 25.346 38.342 28.302 37.132 30.678 34.744 C 33.052 32.326 34.256 29.34 34.256 25.87 C 34.256 22.352 33.068 19.364 30.72 16.992 C 28.39 14.606 25.464 13.392 22.02 13.392 Z M 21.824 43.716 C 17.4 43.716 13.37 42.162 9.85 39.1 C 5.966 35.706 4 31.202 4 25.714 C 4 20.886 5.794 16.684 9.332 13.218 C 12.852 9.756 17.146 8 22.09 8 C 26.972 8 31.22 9.772 34.714 13.266 C 38.22 16.758 40 21.014 40 25.91 C 40 30.842 38.214 35.086 34.69 38.518 C 31.154 41.966 26.824 43.716 21.824 43.716"/>
|
||||
<path id="path-2" style="fill:#458d3e;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 32.134 22.922 L 27.044 18.878 L 27.044 21.402 L 18.01 21.402 L 18.01 24.442 L 27.044 24.442 L 27.044 26.968 L 32.134 22.922"/>
|
||||
<path id="path-3" style="fill:#458d3e;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 11.436 28.122 L 16.532 32.168 L 16.532 29.644 L 25.564 29.644 L 25.564 26.6 L 16.532 26.6 L 16.532 24.074 L 11.436 28.122"/>
|
||||
</svg>
|
After Width: | Height: | Size: 3.8 KiB |
95
gns3server/custom_symbols/ostinato-3d-icon.svg
Normal file
After Width: | Height: | Size: 54 KiB |
BIN
gns3server/custom_symbols/packetfence2.png
Normal file
After Width: | Height: | Size: 20 KiB |
364
gns3server/custom_symbols/pan-vm-fw.svg
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
gns3server/custom_symbols/parrotlogo.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
56
gns3server/custom_symbols/qemu_guest_win10_bybaro.svg
Normal file
@ -0,0 +1,56 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg height="59.253815" id="Andysvg" version="1.0" width="65.414536" x="0.00000000" y="0.00000000" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs id="defs3">
|
||||
<linearGradient id="linearGradient891" x1="92.437965" x2="27.674332" y1="-3.9104078" y2="91.076988" gradientTransform="matrix(0.8184166,0,0,0.530237,-9.8827678,-14.589608)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop889" offset="0" style="stop-color:#626262;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop890" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient905" x1="-77.726181" x2="95.64444" y1="208.43991" y2="11.699047" gradientTransform="matrix(0.7314635,0,0,0.5932693,-9.8827694,-14.589616)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop889" offset="0" style="stop-color:#626262;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop890" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<radialGradient cx="60.004654" cy="56.485935" id="radialGradient1132" r="68.589226" gradientTransform="matrix(0.8184166,0,0,0.530237,-9.8827678,-14.589608)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop1134" offset="0" style="stop-color:#8bb7df;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop1136" offset="0.7621" style="stop-color:#2a6092;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop1135" offset="1" style="stop-color:#375e82;stop-opacity:1.0000000;"/>
|
||||
</radialGradient>
|
||||
<linearGradient id="linearGradient1140" x1="45.685757" x2="41.96706" y1="110.4447" y2="232.24953" gradientTransform="matrix(1.2743811,0,0,0.3405213,-9.8827694,-14.589616)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop889" offset="0" style="stop-color:#626262;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop890" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient1144" x1="31.449743" x2="31.617281" y1="203.49899" y2="251.21892" gradientTransform="matrix(1.4044089,0,0,0.3089952,-9.8827694,-14.589616)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop893" offset="0" style="stop-color:#ffffff;stop-opacity:0.00000000;"/>
|
||||
<stop id="stop894" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient1146" x1="39.810947" x2="17.87653" y1="90.197021" y2="113.71949" gradientTransform="matrix(0.8811179,0,0,0.4925045,-9.8827694,-14.589616)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop893" offset="0" style="stop-color:#ffffff;stop-opacity:0.00000000;"/>
|
||||
<stop id="stop894" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient1156" x1="25.220816" x2="25.220816" y1="178.48862" y2="234.26866" gradientTransform="matrix(1.6156202,0,0,0.2685999,-9.8827678,-14.589608)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop889" offset="0" style="stop-color:#626262;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop890" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient1157" x1="51.46093" x2="-16.224497" y1="269.85831" y2="176.28694" gradientTransform="matrix(1.6156202,0,0,0.2685999,-9.8827678,-14.589608)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop889" offset="0" style="stop-color:#626262;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop890" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient2635" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.8821916,0,0,0.491702,-8.9069314,-15.277305)" x1="39.690613" y1="49.507656" x2="70.224304" y2="20.481863">
|
||||
<stop id="stop893" offset="0" style="stop-color:#ffffff;stop-opacity:0.00000000;"/>
|
||||
<stop id="stop894" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient2637" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.8816883,0,0,0.4919824,-10.701684,-14.28309)" x1="35.190361" y1="76.277557" x2="8.3460579" y2="105.42543">
|
||||
<stop id="stop893" offset="0" style="stop-color:#ffffff;stop-opacity:0.00000000;"/>
|
||||
<stop id="stop894" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<rect height="5.4088969" id="rect1155" style="fill:url(#linearGradient1156);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient1157);stroke-width:0.95344429pt" width="38.405891" x="12.350429" y="36.575089"/>
|
||||
<path d="M 0.19287398,54.885213 C -0.67386281,56.46268 1.5579198,59.253939 3.3933636,59.253939 L 62.069027,59.253939 C 63.628857,59.253939 65.976201,57.281205 65.269522,55.925378 L 58.655165,43.235277 C 58.145696,42.257819 57.005954,41.779036 55.881408,41.779036 L 8.9408812,41.779036 C 8.0135624,41.779036 7.0317541,42.438291 6.5938539,43.235277 L 0.19287398,54.885213 z " id="path1139" style="fill:url(#linearGradient1140);fill-opacity:1;fill-rule:evenodd;stroke-width:1.44734821pt"/>
|
||||
<rect height="39.110481" id="rect1137" rx="3.6272225" ry="3.536587" style="fill:url(#linearGradient905);fill-opacity:1;fill-rule:evenodd;stroke-width:1.62826681" width="48.220726" x="7.4732022" y="-0.010164791"/>
|
||||
<rect height="24.74659" id="rect1131" style="fill:url(#radialGradient1132);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient891);stroke-width:0.96503658pt" width="38.813015" x="12.390426" y="6.027596"/>
|
||||
<path d="M 8.5906358,19.782157 L 8.3772707,34.032521 C 8.3432557,36.304242 9.6712558,37.75887 12.004493,37.777143 L 38.568566,37.985175 L 41.128957,32.160207 L 11.471076,31.952177 L 11.257713,19.678141 L 8.5906358,19.782157 z " id="path1145" style="fill:url(#linearGradient1146);fill-opacity:1;fill-rule:evenodd;stroke-width:1pt"/>
|
||||
<path d="M 2.7205883,54.675124 C 2.1113822,55.866786 2.9089235,57.975349 4.9701318,57.975349 L 60.179981,57.975349 C 61.276346,57.975349 62.926231,56.48511 62.429524,55.460899 L 57.78047,45.874547 C 57.422369,45.136152 56.621274,44.774474 55.830865,44.774474 L 8.8693353,44.774468 C 8.2175462,44.774468 7.5274604,45.272486 7.2196723,45.874547 L 2.7205883,54.675124 z " id="path1143" style="fill:url(#linearGradient1144);fill-opacity:1;fill-rule:evenodd;stroke-width:1pt"/>
|
||||
<path d="M 19.010905,6.5904681 L 42.426675,6.2948726 C 46.041292,6.2492425 50.532134,9.8297185 50.532134,13.389152 L 50.532134,24.030571 L 18.710703,23.734975 L 19.010905,6.5904681 z " id="path1147" style="fill:url(#linearGradient2635);fill-opacity:1;fill-rule:evenodd;stroke-width:1pt"/>
|
||||
<rect x="12.664" y="6.294" width="38.092" height="24.48" style="fill: rgb(255, 255, 255);"/>
|
||||
<path d="M 41.29338,29.915511 L 20.310226,29.977799 C 17.071125,29.987414 13.079277,26.740463 13.111035,23.55121 L 13.205982,14.016504 L 41.715336,14.556637 L 41.29338,29.915511 z " id="path1149" style="fill:url(#linearGradient2637);fill-opacity:1;fill-rule:evenodd;stroke-width:1pt"/>
|
||||
<path d="M 22.129 11.703 L 29.893 10.647 L 29.896 18.134 L 22.138 18.178 Z M 29.891 18.997 L 29.895 26.494 L 22.136 25.428 L 22.135 18.948 Z M 30.832 10.507 L 41.126 9.004 L 41.126 18.039 L 30.832 18.12 Z M 41.129 19.067 L 41.126 28.063 L 30.832 26.608 L 30.818 19.05 Z" fill="#0078d6"/>
|
||||
</svg>
|
After Width: | Height: | Size: 7.0 KiB |
59
gns3server/custom_symbols/qemu_guest_win7_bybaro.svg
Normal file
@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg height="59.253815" id="Andysvg" version="1.0" width="65.414536" x="0.00000000" y="0.00000000" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs id="defs3">
|
||||
<linearGradient id="linearGradient891" x1="92.437965" x2="27.674332" y1="-3.9104078" y2="91.076988" gradientTransform="matrix(0.8184166,0,0,0.530237,-9.8827678,-14.589608)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop889" offset="0" style="stop-color:#626262;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop890" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient905" x1="-77.726181" x2="95.64444" y1="208.43991" y2="11.699047" gradientTransform="matrix(0.7314635,0,0,0.5932693,-9.8827694,-14.589616)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop889" offset="0" style="stop-color:#626262;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop890" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<radialGradient cx="60.004654" cy="56.485935" id="radialGradient1132" r="68.589226" gradientTransform="matrix(0.8184166,0,0,0.530237,-9.8827678,-14.589608)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop1134" offset="0" style="stop-color:#8bb7df;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop1136" offset="0.7621" style="stop-color:#2a6092;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop1135" offset="1" style="stop-color:#375e82;stop-opacity:1.0000000;"/>
|
||||
</radialGradient>
|
||||
<linearGradient id="linearGradient1140" x1="45.685757" x2="41.96706" y1="110.4447" y2="232.24953" gradientTransform="matrix(1.2743811,0,0,0.3405213,-9.8827694,-14.589616)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop889" offset="0" style="stop-color:#626262;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop890" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient1144" x1="31.449743" x2="31.617281" y1="203.49899" y2="251.21892" gradientTransform="matrix(1.4044089,0,0,0.3089952,-9.8827694,-14.589616)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop893" offset="0" style="stop-color:#ffffff;stop-opacity:0.00000000;"/>
|
||||
<stop id="stop894" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient1146" x1="39.810947" x2="17.87653" y1="90.197021" y2="113.71949" gradientTransform="matrix(0.8811179,0,0,0.4925045,-9.8827694,-14.589616)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop893" offset="0" style="stop-color:#ffffff;stop-opacity:0.00000000;"/>
|
||||
<stop id="stop894" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient1156" x1="25.220816" x2="25.220816" y1="178.48862" y2="234.26866" gradientTransform="matrix(1.6156202,0,0,0.2685999,-9.8827678,-14.589608)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop889" offset="0" style="stop-color:#626262;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop890" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient1157" x1="51.46093" x2="-16.224497" y1="269.85831" y2="176.28694" gradientTransform="matrix(1.6156202,0,0,0.2685999,-9.8827678,-14.589608)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop889" offset="0" style="stop-color:#626262;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop890" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient2635" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.8821916,0,0,0.491702,-8.9069314,-15.277305)" x1="39.690613" y1="49.507656" x2="70.224304" y2="20.481863">
|
||||
<stop id="stop893" offset="0" style="stop-color:#ffffff;stop-opacity:0.00000000;"/>
|
||||
<stop id="stop894" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient2637" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.8816883,0,0,0.4919824,-10.701684,-14.28309)" x1="35.190361" y1="76.277557" x2="8.3460579" y2="105.42543">
|
||||
<stop id="stop893" offset="0" style="stop-color:#ffffff;stop-opacity:0.00000000;"/>
|
||||
<stop id="stop894" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<rect height="5.4088969" id="rect1155" style="fill:url(#linearGradient1156);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient1157);stroke-width:0.95344429pt" width="38.405891" x="12.350429" y="36.575089"/>
|
||||
<path d="M 0.19287398,54.885213 C -0.67386281,56.46268 1.5579198,59.253939 3.3933636,59.253939 L 62.069027,59.253939 C 63.628857,59.253939 65.976201,57.281205 65.269522,55.925378 L 58.655165,43.235277 C 58.145696,42.257819 57.005954,41.779036 55.881408,41.779036 L 8.9408812,41.779036 C 8.0135624,41.779036 7.0317541,42.438291 6.5938539,43.235277 L 0.19287398,54.885213 z " id="path1139" style="fill:url(#linearGradient1140);fill-opacity:1;fill-rule:evenodd;stroke-width:1.44734821pt"/>
|
||||
<rect height="39.110481" id="rect1137" rx="3.6272225" ry="3.536587" style="fill:url(#linearGradient905);fill-opacity:1;fill-rule:evenodd;stroke-width:1.62826681" width="48.220726" x="7.4732022" y="-0.010164791"/>
|
||||
<rect height="24.74659" id="rect1131" style="fill:url(#radialGradient1132);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient891);stroke-width:0.96503658pt" width="38.813015" x="12.390426" y="6.027596"/>
|
||||
<path d="M 8.5906358,19.782157 L 8.3772707,34.032521 C 8.3432557,36.304242 9.6712558,37.75887 12.004493,37.777143 L 38.568566,37.985175 L 41.128957,32.160207 L 11.471076,31.952177 L 11.257713,19.678141 L 8.5906358,19.782157 z " id="path1145" style="fill:url(#linearGradient1146);fill-opacity:1;fill-rule:evenodd;stroke-width:1pt"/>
|
||||
<path d="M 2.7205883,54.675124 C 2.1113822,55.866786 2.9089235,57.975349 4.9701318,57.975349 L 60.179981,57.975349 C 61.276346,57.975349 62.926231,56.48511 62.429524,55.460899 L 57.78047,45.874547 C 57.422369,45.136152 56.621274,44.774474 55.830865,44.774474 L 8.8693353,44.774468 C 8.2175462,44.774468 7.5274604,45.272486 7.2196723,45.874547 L 2.7205883,54.675124 z " id="path1143" style="fill:url(#linearGradient1144);fill-opacity:1;fill-rule:evenodd;stroke-width:1pt"/>
|
||||
<path d="M 19.010905,6.5904681 L 42.426675,6.2948726 C 46.041292,6.2492425 50.532134,9.8297185 50.532134,13.389152 L 50.532134,24.030571 L 18.710703,23.734975 L 19.010905,6.5904681 z " id="path1147" style="fill:url(#linearGradient2635);fill-opacity:1;fill-rule:evenodd;stroke-width:1pt"/>
|
||||
<rect x="12.664" y="6.294" width="38.092" height="24.48"/>
|
||||
<path d="M 41.29338,29.915511 L 20.310226,29.977799 C 17.071125,29.987414 13.079277,26.740463 13.111035,23.55121 L 13.205982,14.016504 L 41.715336,14.556637 L 41.29338,29.915511 z " id="path1149" style="fill:url(#linearGradient2637);fill-opacity:1;fill-rule:evenodd;stroke-width:1pt"/>
|
||||
<path d="M 43.036 11.636 C 38.773 13.399 36.722 12.408 34.875 11.164 L 32.77 18.46 C 34.617 19.71 36.846 20.739 40.936 18.908 L 43.036 11.636 Z" style="fill:#91c300;"/>
|
||||
<path style="fill:#00b4f1;" d="M 29.175 26.303 C 27.323 25.056 25.309 24.031 21.036 25.798 L 23.128 18.489 C 27.403 16.721 29.457 17.721 31.307 18.975 L 29.175 26.303 Z"/>
|
||||
<path d="M 31.663 17.656 C 30.548 16.906 29.348 16.205 27.646 16.192 C 26.522 16.183 25.185 16.502 23.486 17.205 L 25.591 9.913 C 29.863 8.147 31.915 9.147 33.763 10.4 L 31.663 17.656 Z" style="fill:#f8682c;"/>
|
||||
<path d="M 32.417 19.679 C 34.266 20.924 36.321 21.916 40.589 20.152 L 38.485 27.419 C 34.216 29.184 32.166 28.184 30.318 26.932 L 32.417 19.679 Z" style="fill:#ffc300;"/>
|
||||
</svg>
|
After Width: | Height: | Size: 7.4 KiB |
56
gns3server/custom_symbols/qemu_guest_win8_bybaro.svg
Normal file
@ -0,0 +1,56 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg height="59.253815" id="Andysvg" version="1.0" width="65.414536" x="0.00000000" y="0.00000000" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs id="defs3">
|
||||
<linearGradient id="linearGradient891" x1="92.437965" x2="27.674332" y1="-3.9104078" y2="91.076988" gradientTransform="matrix(0.8184166,0,0,0.530237,-9.8827678,-14.589608)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop889" offset="0" style="stop-color:#626262;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop890" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient905" x1="-77.726181" x2="95.64444" y1="208.43991" y2="11.699047" gradientTransform="matrix(0.7314635,0,0,0.5932693,-9.8827694,-14.589616)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop889" offset="0" style="stop-color:#626262;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop890" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<radialGradient cx="60.004654" cy="56.485935" id="radialGradient1132" r="68.589226" gradientTransform="matrix(0.8184166,0,0,0.530237,-9.8827678,-14.589608)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop1134" offset="0" style="stop-color:#8bb7df;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop1136" offset="0.7621" style="stop-color:#2a6092;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop1135" offset="1" style="stop-color:#375e82;stop-opacity:1.0000000;"/>
|
||||
</radialGradient>
|
||||
<linearGradient id="linearGradient1140" x1="45.685757" x2="41.96706" y1="110.4447" y2="232.24953" gradientTransform="matrix(1.2743811,0,0,0.3405213,-9.8827694,-14.589616)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop889" offset="0" style="stop-color:#626262;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop890" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient1144" x1="31.449743" x2="31.617281" y1="203.49899" y2="251.21892" gradientTransform="matrix(1.4044089,0,0,0.3089952,-9.8827694,-14.589616)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop893" offset="0" style="stop-color:#ffffff;stop-opacity:0.00000000;"/>
|
||||
<stop id="stop894" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient1146" x1="39.810947" x2="17.87653" y1="90.197021" y2="113.71949" gradientTransform="matrix(0.8811179,0,0,0.4925045,-9.8827694,-14.589616)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop893" offset="0" style="stop-color:#ffffff;stop-opacity:0.00000000;"/>
|
||||
<stop id="stop894" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient1156" x1="25.220816" x2="25.220816" y1="178.48862" y2="234.26866" gradientTransform="matrix(1.6156202,0,0,0.2685999,-9.8827678,-14.589608)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop889" offset="0" style="stop-color:#626262;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop890" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient1157" x1="51.46093" x2="-16.224497" y1="269.85831" y2="176.28694" gradientTransform="matrix(1.6156202,0,0,0.2685999,-9.8827678,-14.589608)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop889" offset="0" style="stop-color:#626262;stop-opacity:1.0000000;"/>
|
||||
<stop id="stop890" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient2635" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.8821916,0,0,0.491702,-8.9069314,-15.277305)" x1="39.690613" y1="49.507656" x2="70.224304" y2="20.481863">
|
||||
<stop id="stop893" offset="0" style="stop-color:#ffffff;stop-opacity:0.00000000;"/>
|
||||
<stop id="stop894" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient2637" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.8816883,0,0,0.4919824,-10.701684,-14.28309)" x1="35.190361" y1="76.277557" x2="8.3460579" y2="105.42543">
|
||||
<stop id="stop893" offset="0" style="stop-color:#ffffff;stop-opacity:0.00000000;"/>
|
||||
<stop id="stop894" offset="1" style="stop-color:#fff;stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<rect height="5.4088969" id="rect1155" style="fill:url(#linearGradient1156);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient1157);stroke-width:0.95344429pt" width="38.405891" x="12.350429" y="36.575089"/>
|
||||
<path d="M 0.19287398,54.885213 C -0.67386281,56.46268 1.5579198,59.253939 3.3933636,59.253939 L 62.069027,59.253939 C 63.628857,59.253939 65.976201,57.281205 65.269522,55.925378 L 58.655165,43.235277 C 58.145696,42.257819 57.005954,41.779036 55.881408,41.779036 L 8.9408812,41.779036 C 8.0135624,41.779036 7.0317541,42.438291 6.5938539,43.235277 L 0.19287398,54.885213 z " id="path1139" style="fill:url(#linearGradient1140);fill-opacity:1;fill-rule:evenodd;stroke-width:1.44734821pt"/>
|
||||
<rect height="39.110481" id="rect1137" rx="3.6272225" ry="3.536587" style="fill:url(#linearGradient905);fill-opacity:1;fill-rule:evenodd;stroke-width:1.62826681" width="48.220726" x="7.4732022" y="-0.010164791"/>
|
||||
<rect height="24.74659" id="rect1131" style="fill:url(#radialGradient1132);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient891);stroke-width:0.96503658pt" width="38.813015" x="12.390426" y="6.027596"/>
|
||||
<path d="M 8.5906358,19.782157 L 8.3772707,34.032521 C 8.3432557,36.304242 9.6712558,37.75887 12.004493,37.777143 L 38.568566,37.985175 L 41.128957,32.160207 L 11.471076,31.952177 L 11.257713,19.678141 L 8.5906358,19.782157 z " id="path1145" style="fill:url(#linearGradient1146);fill-opacity:1;fill-rule:evenodd;stroke-width:1pt"/>
|
||||
<path d="M 2.7205883,54.675124 C 2.1113822,55.866786 2.9089235,57.975349 4.9701318,57.975349 L 60.179981,57.975349 C 61.276346,57.975349 62.926231,56.48511 62.429524,55.460899 L 57.78047,45.874547 C 57.422369,45.136152 56.621274,44.774474 55.830865,44.774474 L 8.8693353,44.774468 C 8.2175462,44.774468 7.5274604,45.272486 7.2196723,45.874547 L 2.7205883,54.675124 z " id="path1143" style="fill:url(#linearGradient1144);fill-opacity:1;fill-rule:evenodd;stroke-width:1pt"/>
|
||||
<path d="M 19.010905,6.5904681 L 42.426675,6.2948726 C 46.041292,6.2492425 50.532134,9.8297185 50.532134,13.389152 L 50.532134,24.030571 L 18.710703,23.734975 L 19.010905,6.5904681 z " id="path1147" style="fill:url(#linearGradient2635);fill-opacity:1;fill-rule:evenodd;stroke-width:1pt"/>
|
||||
<rect x="12.664" y="6.294" width="38.092" height="24.48" style="fill: rgb(255, 255, 255);"/>
|
||||
<path d="M 41.29338,29.915511 L 20.310226,29.977799 C 17.071125,29.987414 13.079277,26.740463 13.111035,23.55121 L 13.205982,14.016504 L 41.715336,14.556637 L 41.29338,29.915511 z " id="path1149" style="fill:url(#linearGradient2637);fill-opacity:1;fill-rule:evenodd;stroke-width:1pt"/>
|
||||
<path style="fill:#00adef;" d="M 22.129 11.699 L 29.894 10.641 L 29.897 18.13 L 22.136 18.175 Z M 29.89 18.993 L 29.896 26.49 L 22.135 25.423 L 22.135 18.944 Z M 30.832 10.503 L 41.127 9 L 41.127 18.035 L 30.832 18.117 Z M 41.129 19.064 L 41.127 28.059 L 30.832 26.606 L 30.817 19.047 Z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 7.0 KiB |
213
gns3server/custom_symbols/router_docker.svg
Normal file
After Width: | Height: | Size: 45 KiB |
206
gns3server/custom_symbols/router_green.svg
Normal file
@ -0,0 +1,206 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="svg1998"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.48.5 r10040"
|
||||
width="66.000435"
|
||||
height="44.5159"
|
||||
version="1.0"
|
||||
sodipodi:docname="router-red.svg"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||
sodipodi:modified="true">
|
||||
<metadata
|
||||
id="metadata2003">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Jeremy Grossmann</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:publisher>
|
||||
<cc:Agent>
|
||||
<dc:title>GNS-3</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:publisher>
|
||||
<dc:description>Created for the GNS-3 project (www.gns3.net)</dc:description>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/SourceCode" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2001">
|
||||
<linearGradient
|
||||
id="linearGradient9312">
|
||||
<stop
|
||||
style="stop-color:#008f00;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop9314" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.94117647;"
|
||||
offset="1"
|
||||
id="stop9316" />
|
||||
</linearGradient>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow2Lstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path11918"
|
||||
style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
transform="matrix(1.1,0,0,1.1,1.1,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Send"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Send"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path11921"
|
||||
d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
|
||||
style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none"
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Lstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path11936"
|
||||
d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
|
||||
style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)" />
|
||||
</marker>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient9312"
|
||||
id="linearGradient2216"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(15.252829,0,0,14.082619,53.467529,3.4188377)"
|
||||
x1="-1.0929121"
|
||||
y1="0.63145506"
|
||||
x2="-4.5832458"
|
||||
y2="0.070047863" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-height="949"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
guidetolerance="10.0"
|
||||
gridtolerance="10.0"
|
||||
objecttolerance="10.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
inkscape:zoom="7.8958335"
|
||||
inkscape:cx="27.967059"
|
||||
inkscape:cy="24.784192"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="31"
|
||||
inkscape:current-layer="svg1998"
|
||||
showgrid="false"
|
||||
inkscape:window-maximized="1" />
|
||||
<rect
|
||||
style="opacity:1;fill:#000000;fill-opacity:0.39215687;fill-rule:evenodd;stroke:none;stroke-width:0.2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect4558"
|
||||
width="64.552505"
|
||||
height="41.53862"
|
||||
x="1.4479325"
|
||||
y="2.9772801"
|
||||
ry="11.631706"
|
||||
rx="32.212925"
|
||||
inkscape:transform-center-x="8.4568136" />
|
||||
<rect
|
||||
style="opacity:1;fill:#0d8800;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01500000000000000;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect9971"
|
||||
width="64.499474"
|
||||
height="42.154343"
|
||||
x="0.0625"
|
||||
y="0.18084908"
|
||||
ry="11.557454"
|
||||
rx="32.249737"
|
||||
inkscape:transform-center-x="8.2952569" />
|
||||
<g
|
||||
id="g4160">
|
||||
<path
|
||||
id="path4815"
|
||||
d="M 64.514069,11.541297 L 64.457031,10.955643 L 64.342949,10.36999 L 64.152814,9.8038604 L 63.867612,9.2182077 L 63.487345,8.6520765 L 63.050034,8.0859452 L 62.517657,7.5393369 L 61.909226,7.0122499 L 61.224742,6.4851607 L 60.464203,5.9775955 L 59.646626,5.4700289 L 58.752993,4.9819859 L 57.783307,4.4939413 L 56.75658,4.0644625 L 55.6538,3.6349838 L 54.493981,3.2055052 L 53.296132,2.8150692 L 52.022232,2.4636777 L 50.710303,2.1122862 L 49.341334,1.7999375 L 47.934339,1.5071117 L 46.489316,1.2338059 L 45.006267,0.99954576 L 43.504204,0.76528425 L 41.964114,0.58958842 L 40.385997,0.43341443 L 38.788867,0.29676153 L 37.191738,0.19915292 L 35.575597,0.12106555 L 33.940437,0.06250017 L 32.324296,0.06250017 L 32.324296,0.06250017 L 30.689136,0.06250017 L 29.053981,0.12106555 L 27.45685,0.19915292 L 25.840705,0.29676153 L 24.243576,0.43341443 L 22.684472,0.58958842 L 21.125372,0.76528425 L 19.623307,0.99954576 L 18.140258,1.2338059 L 16.695234,1.5071117 L 15.28824,1.7999375 L 13.919273,2.1122862 L 12.607342,2.4636777 L 11.333442,2.8150692 L 10.135592,3.2055052 L 8.9757693,3.6349838 L 7.8729941,4.0644625 L 6.8462664,4.4939413 L 5.8765785,4.9819859 L 4.9829488,5.4700289 L 4.1653682,5.9775955 L 3.4048335,6.4851607 L 2.7203448,7.0122499 L 2.1309311,7.5393369 L 1.5795405,8.0859452 L 1.1422325,8.6520765 L 0.76195982,9.2182077 L 0.47676065,9.8038604 L 0.26760898,10.36999 L 0.15353084,10.955643 L 0.11550327,11.541297 L 0.11550327,11.541297 L 0.15353084,12.12695 L 0.26760898,12.693081 L 0.47676065,13.278734 L 0.76195982,13.825344 L 1.1422325,14.410996 L 1.5795405,14.957605 L 2.1309311,15.523736 L 2.7203448,16.070348 L 3.4048335,16.597435 L 4.1653682,17.085479 L 4.9829488,17.593043 L 5.8765785,18.100608 L 6.8462664,18.549609 L 7.8729941,18.998611 L 8.9757693,19.447613 L 10.135592,19.857571 L 11.333442,20.248007 L 12.607342,20.599396 L 13.919273,20.950787 L 15.28824,21.263135 L 16.695234,21.575486 L 18.140258,21.829265 L 19.623307,22.083049 L 21.125372,22.297787 L 22.684472,22.473485 L 24.243576,22.629661 L 25.840705,22.766312 L 27.45685,22.863921 L 29.053981,22.942009 L 30.689136,23.000574 L 32.324296,23.000574 L 32.324296,23.000574 L 33.940437,23.000574 L 35.575597,22.942009 L 37.191738,22.863921 L 38.788867,22.766312 L 40.385997,22.629661 L 41.964114,22.473485 L 43.504204,22.297787 L 45.006267,22.083049 L 46.489316,21.829265 L 47.934339,21.575486 L 49.341334,21.263135 L 50.710303,20.950787 L 52.022232,20.599396 L 53.296132,20.248007 L 54.493981,19.857571 L 55.6538,19.447613 L 56.75658,18.998611 L 57.783307,18.549609 L 58.752993,18.100608 L 59.646626,17.593043 L 60.464203,17.085479 L 61.224742,16.597435 L 61.909226,16.070348 L 62.517657,15.523736 L 63.050034,14.957605 L 63.487345,14.410996 L 63.867612,13.825344 L 64.152814,13.278734 L 64.342949,12.693081 L 64.457031,12.12695 L 64.514069,11.541297"
|
||||
style="fill:url(#linearGradient2216);fill-opacity:1;stroke:none;stroke-width:0.01928605;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
id="path4819"
|
||||
d="M 33.023738,8.6936939 L 37.664889,10.327433 L 48.909313,5.4458969 L 53.946665,7.0599533 L 51.229891,3.0248142 L 38.061087,3.0248142 L 43.475766,4.225514 L 33.023738,8.6936939"
|
||||
style="fill:#000000;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path4821"
|
||||
d="M 31.08049,13.161874 L 26.439334,11.528132 L 15.591104,16.429352 L 10.176425,14.775929 L 12.874332,19.244109 L 26.439334,19.244109 L 20.628458,17.630052 L 31.08049,13.161874"
|
||||
style="fill:#000000;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path4823"
|
||||
d="M 11.327278,4.225514 L 15.968435,2.611458 L 27.212859,7.0599533 L 32.25021,5.8592533 L 29.552303,9.8943939 L 16.364632,9.8943939 L 21.779313,8.6936939 L 11.327278,4.225514"
|
||||
style="fill:#000000;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path4825"
|
||||
d="M 53.154272,18.023723 L 48.513117,19.657467 L 37.664889,14.775929 L 32.25021,16.429352 L 34.966985,12.33516 L 48.513117,12.33516 L 42.70224,13.555544 L 53.154272,18.023723"
|
||||
style="fill:#000000;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path4827"
|
||||
d="M 33.419936,9.1070493 L 38.061087,10.721105 L 49.286643,5.8592533 L 54.323994,7.4929926 L 51.60722,3.4184854 L 38.438415,3.4184854 L 43.871962,4.6191872 L 33.419936,9.1070493"
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path4829"
|
||||
d="M 31.476681,13.555544 L 26.816665,11.941487 L 15.968435,16.803341 L 10.553753,15.189284 L 13.25166,19.657467 L 26.816665,19.657467 L 21.005786,18.023723 L 31.476681,13.555544"
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path4831"
|
||||
d="M 11.723476,4.6191872 L 16.364632,3.0248142 L 27.609055,7.4929926 L 32.627541,6.2529266 L 29.929634,10.327433 L 16.741963,10.327433 L 22.175509,9.1070493 L 11.723476,4.6191872"
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path4833"
|
||||
d="M 53.531602,18.43708 L 48.909313,20.070823 L 38.061087,15.189284 L 32.627541,16.803341 L 35.344315,12.7682 L 48.909313,12.7682 L 43.098437,13.9689 L 53.531602,18.43708"
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.001" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 11 KiB |
665
gns3server/custom_symbols/router_green_docker.svg
Normal file
@ -0,0 +1,665 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="svg1998"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.48.5 r10040"
|
||||
width="66.000435"
|
||||
height="44.5159"
|
||||
version="1.0"
|
||||
sodipodi:docname="router-green-docker.svg"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||
sodipodi:modified="true">
|
||||
<metadata
|
||||
id="metadata2003">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Jeremy Grossmann</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:publisher>
|
||||
<cc:Agent>
|
||||
<dc:title>GNS-3</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:publisher>
|
||||
<dc:description>Created for the GNS-3 project (www.gns3.net)</dc:description>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/SourceCode" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2001">
|
||||
<linearGradient
|
||||
id="linearGradient9312">
|
||||
<stop
|
||||
style="stop-color:#008f00;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop9314" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.94117647;"
|
||||
offset="1"
|
||||
id="stop9316" />
|
||||
</linearGradient>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow2Lstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path11918"
|
||||
style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
transform="matrix(1.1,0,0,1.1,1.1,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Send"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Send"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path11921"
|
||||
d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
|
||||
style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none"
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Lstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path11936"
|
||||
d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
|
||||
style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)" />
|
||||
</marker>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient9312"
|
||||
id="linearGradient2216"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(15.252829,0,0,14.082619,53.467529,3.4188377)"
|
||||
x1="-1.0929121"
|
||||
y1="0.63145506"
|
||||
x2="-4.5832458"
|
||||
y2="0.070047863" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-height="949"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
guidetolerance="10.0"
|
||||
gridtolerance="10.0"
|
||||
objecttolerance="10.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
inkscape:zoom="0.98697919"
|
||||
inkscape:cx="-115.2648"
|
||||
inkscape:cy="133.9562"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="31"
|
||||
inkscape:current-layer="svg1998"
|
||||
showgrid="false"
|
||||
inkscape:window-maximized="1" />
|
||||
<rect
|
||||
style="opacity:1;fill:#000000;fill-opacity:0.39215687;fill-rule:evenodd;stroke:none;stroke-width:0.2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect4558"
|
||||
width="64.552505"
|
||||
height="41.53862"
|
||||
x="1.4479325"
|
||||
y="2.9772801"
|
||||
ry="11.631706"
|
||||
rx="32.212925"
|
||||
inkscape:transform-center-x="8.4568136" />
|
||||
<rect
|
||||
style="opacity:1;fill:#0d8800;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01500000000000000;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect9971"
|
||||
width="64.499474"
|
||||
height="42.154343"
|
||||
x="0.0625"
|
||||
y="0.18084908"
|
||||
ry="11.557454"
|
||||
rx="32.249737"
|
||||
inkscape:transform-center-x="8.2952569" />
|
||||
<g
|
||||
id="g4160">
|
||||
<path
|
||||
id="path4815"
|
||||
d="M 64.514069,11.541297 L 64.457031,10.955643 L 64.342949,10.36999 L 64.152814,9.8038604 L 63.867612,9.2182077 L 63.487345,8.6520765 L 63.050034,8.0859452 L 62.517657,7.5393369 L 61.909226,7.0122499 L 61.224742,6.4851607 L 60.464203,5.9775955 L 59.646626,5.4700289 L 58.752993,4.9819859 L 57.783307,4.4939413 L 56.75658,4.0644625 L 55.6538,3.6349838 L 54.493981,3.2055052 L 53.296132,2.8150692 L 52.022232,2.4636777 L 50.710303,2.1122862 L 49.341334,1.7999375 L 47.934339,1.5071117 L 46.489316,1.2338059 L 45.006267,0.99954576 L 43.504204,0.76528425 L 41.964114,0.58958842 L 40.385997,0.43341443 L 38.788867,0.29676153 L 37.191738,0.19915292 L 35.575597,0.12106555 L 33.940437,0.06250017 L 32.324296,0.06250017 L 32.324296,0.06250017 L 30.689136,0.06250017 L 29.053981,0.12106555 L 27.45685,0.19915292 L 25.840705,0.29676153 L 24.243576,0.43341443 L 22.684472,0.58958842 L 21.125372,0.76528425 L 19.623307,0.99954576 L 18.140258,1.2338059 L 16.695234,1.5071117 L 15.28824,1.7999375 L 13.919273,2.1122862 L 12.607342,2.4636777 L 11.333442,2.8150692 L 10.135592,3.2055052 L 8.9757693,3.6349838 L 7.8729941,4.0644625 L 6.8462664,4.4939413 L 5.8765785,4.9819859 L 4.9829488,5.4700289 L 4.1653682,5.9775955 L 3.4048335,6.4851607 L 2.7203448,7.0122499 L 2.1309311,7.5393369 L 1.5795405,8.0859452 L 1.1422325,8.6520765 L 0.76195982,9.2182077 L 0.47676065,9.8038604 L 0.26760898,10.36999 L 0.15353084,10.955643 L 0.11550327,11.541297 L 0.11550327,11.541297 L 0.15353084,12.12695 L 0.26760898,12.693081 L 0.47676065,13.278734 L 0.76195982,13.825344 L 1.1422325,14.410996 L 1.5795405,14.957605 L 2.1309311,15.523736 L 2.7203448,16.070348 L 3.4048335,16.597435 L 4.1653682,17.085479 L 4.9829488,17.593043 L 5.8765785,18.100608 L 6.8462664,18.549609 L 7.8729941,18.998611 L 8.9757693,19.447613 L 10.135592,19.857571 L 11.333442,20.248007 L 12.607342,20.599396 L 13.919273,20.950787 L 15.28824,21.263135 L 16.695234,21.575486 L 18.140258,21.829265 L 19.623307,22.083049 L 21.125372,22.297787 L 22.684472,22.473485 L 24.243576,22.629661 L 25.840705,22.766312 L 27.45685,22.863921 L 29.053981,22.942009 L 30.689136,23.000574 L 32.324296,23.000574 L 32.324296,23.000574 L 33.940437,23.000574 L 35.575597,22.942009 L 37.191738,22.863921 L 38.788867,22.766312 L 40.385997,22.629661 L 41.964114,22.473485 L 43.504204,22.297787 L 45.006267,22.083049 L 46.489316,21.829265 L 47.934339,21.575486 L 49.341334,21.263135 L 50.710303,20.950787 L 52.022232,20.599396 L 53.296132,20.248007 L 54.493981,19.857571 L 55.6538,19.447613 L 56.75658,18.998611 L 57.783307,18.549609 L 58.752993,18.100608 L 59.646626,17.593043 L 60.464203,17.085479 L 61.224742,16.597435 L 61.909226,16.070348 L 62.517657,15.523736 L 63.050034,14.957605 L 63.487345,14.410996 L 63.867612,13.825344 L 64.152814,13.278734 L 64.342949,12.693081 L 64.457031,12.12695 L 64.514069,11.541297"
|
||||
style="fill:url(#linearGradient2216);fill-opacity:1;stroke:none;stroke-width:0.01928605;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
id="path4819"
|
||||
d="M 33.023738,8.6936939 L 37.664889,10.327433 L 48.909313,5.4458969 L 53.946665,7.0599533 L 51.229891,3.0248142 L 38.061087,3.0248142 L 43.475766,4.225514 L 33.023738,8.6936939"
|
||||
style="fill:#000000;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path4821"
|
||||
d="M 31.08049,13.161874 L 26.439334,11.528132 L 15.591104,16.429352 L 10.176425,14.775929 L 12.874332,19.244109 L 26.439334,19.244109 L 20.628458,17.630052 L 31.08049,13.161874"
|
||||
style="fill:#000000;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path4823"
|
||||
d="M 11.327278,4.225514 L 15.968435,2.611458 L 27.212859,7.0599533 L 32.25021,5.8592533 L 29.552303,9.8943939 L 16.364632,9.8943939 L 21.779313,8.6936939 L 11.327278,4.225514"
|
||||
style="fill:#000000;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path4825"
|
||||
d="M 53.154272,18.023723 L 48.513117,19.657467 L 37.664889,14.775929 L 32.25021,16.429352 L 34.966985,12.33516 L 48.513117,12.33516 L 42.70224,13.555544 L 53.154272,18.023723"
|
||||
style="fill:#000000;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path4827"
|
||||
d="M 33.419936,9.1070493 L 38.061087,10.721105 L 49.286643,5.8592533 L 54.323994,7.4929926 L 51.60722,3.4184854 L 38.438415,3.4184854 L 43.871962,4.6191872 L 33.419936,9.1070493"
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path4829"
|
||||
d="M 31.476681,13.555544 L 26.816665,11.941487 L 15.968435,16.803341 L 10.553753,15.189284 L 13.25166,19.657467 L 26.816665,19.657467 L 21.005786,18.023723 L 31.476681,13.555544"
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path4831"
|
||||
d="M 11.723476,4.6191872 L 16.364632,3.0248142 L 27.609055,7.4929926 L 32.627541,6.2529266 L 29.929634,10.327433 L 16.741963,10.327433 L 22.175509,9.1070493 L 11.723476,4.6191872"
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path4833"
|
||||
d="M 53.531602,18.43708 L 48.909313,20.070823 L 38.061087,15.189284 L 32.627541,16.803341 L 35.344315,12.7682 L 48.909313,12.7682 L 43.098437,13.9689 L 53.531602,18.43708"
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.001" />
|
||||
</g>
|
||||
<image
|
||||
y="23.045622"
|
||||
x="14.084294"
|
||||
id="image4051"
|
||||
xlink:href="data:image/png;base64,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
|
||||
XQAAAABJRU5ErkJggg==
|
||||
"
|
||||
height="19.227247"
|
||||
width="36.265862" />
|
||||
</svg>
|
After Width: | Height: | Size: 45 KiB |
206
gns3server/custom_symbols/router_red.svg
Normal file
@ -0,0 +1,206 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="svg1998"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.48.5 r10040"
|
||||
width="66.000435"
|
||||
height="44.5159"
|
||||
version="1.0"
|
||||
sodipodi:docname="router.svg"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||
sodipodi:modified="true">
|
||||
<metadata
|
||||
id="metadata2003">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Jeremy Grossmann</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:publisher>
|
||||
<cc:Agent>
|
||||
<dc:title>GNS-3</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:publisher>
|
||||
<dc:description>Created for the GNS-3 project (www.gns3.net)</dc:description>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/SourceCode" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2001">
|
||||
<linearGradient
|
||||
id="linearGradient9312">
|
||||
<stop
|
||||
style="stop-color:#ff2600;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop9314" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.94117647;"
|
||||
offset="1"
|
||||
id="stop9316" />
|
||||
</linearGradient>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow2Lstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path11918"
|
||||
style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
transform="matrix(1.1,0,0,1.1,1.1,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Send"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Send"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path11921"
|
||||
d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
|
||||
style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none"
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Lstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path11936"
|
||||
d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
|
||||
style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)" />
|
||||
</marker>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient9312"
|
||||
id="linearGradient2216"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(15.252829,0,0,14.082619,53.467529,3.4188377)"
|
||||
x1="-1.0929121"
|
||||
y1="0.63145506"
|
||||
x2="-4.5832458"
|
||||
y2="0.070047863" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-height="949"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
guidetolerance="10.0"
|
||||
gridtolerance="10.0"
|
||||
objecttolerance="10.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
inkscape:zoom="7.8958335"
|
||||
inkscape:cx="27.967059"
|
||||
inkscape:cy="24.784192"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="31"
|
||||
inkscape:current-layer="g4160"
|
||||
showgrid="false"
|
||||
inkscape:window-maximized="1" />
|
||||
<rect
|
||||
style="opacity:1;fill:#000000;fill-opacity:0.39215687;fill-rule:evenodd;stroke:none;stroke-width:0.2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect4558"
|
||||
width="64.552505"
|
||||
height="41.53862"
|
||||
x="1.4479325"
|
||||
y="2.9772801"
|
||||
ry="11.631706"
|
||||
rx="32.212925"
|
||||
inkscape:transform-center-x="8.4568136" />
|
||||
<rect
|
||||
style="opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01500000000000000;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect9971"
|
||||
width="64.499474"
|
||||
height="42.154343"
|
||||
x="0.0625"
|
||||
y="0.18084908"
|
||||
ry="11.557454"
|
||||
rx="32.249737"
|
||||
inkscape:transform-center-x="8.2952569" />
|
||||
<g
|
||||
id="g4160">
|
||||
<path
|
||||
id="path4815"
|
||||
d="M 64.514069,11.541297 L 64.457031,10.955643 L 64.342949,10.36999 L 64.152814,9.8038604 L 63.867612,9.2182077 L 63.487345,8.6520765 L 63.050034,8.0859452 L 62.517657,7.5393369 L 61.909226,7.0122499 L 61.224742,6.4851607 L 60.464203,5.9775955 L 59.646626,5.4700289 L 58.752993,4.9819859 L 57.783307,4.4939413 L 56.75658,4.0644625 L 55.6538,3.6349838 L 54.493981,3.2055052 L 53.296132,2.8150692 L 52.022232,2.4636777 L 50.710303,2.1122862 L 49.341334,1.7999375 L 47.934339,1.5071117 L 46.489316,1.2338059 L 45.006267,0.99954576 L 43.504204,0.76528425 L 41.964114,0.58958842 L 40.385997,0.43341443 L 38.788867,0.29676153 L 37.191738,0.19915292 L 35.575597,0.12106555 L 33.940437,0.06250017 L 32.324296,0.06250017 L 32.324296,0.06250017 L 30.689136,0.06250017 L 29.053981,0.12106555 L 27.45685,0.19915292 L 25.840705,0.29676153 L 24.243576,0.43341443 L 22.684472,0.58958842 L 21.125372,0.76528425 L 19.623307,0.99954576 L 18.140258,1.2338059 L 16.695234,1.5071117 L 15.28824,1.7999375 L 13.919273,2.1122862 L 12.607342,2.4636777 L 11.333442,2.8150692 L 10.135592,3.2055052 L 8.9757693,3.6349838 L 7.8729941,4.0644625 L 6.8462664,4.4939413 L 5.8765785,4.9819859 L 4.9829488,5.4700289 L 4.1653682,5.9775955 L 3.4048335,6.4851607 L 2.7203448,7.0122499 L 2.1309311,7.5393369 L 1.5795405,8.0859452 L 1.1422325,8.6520765 L 0.76195982,9.2182077 L 0.47676065,9.8038604 L 0.26760898,10.36999 L 0.15353084,10.955643 L 0.11550327,11.541297 L 0.11550327,11.541297 L 0.15353084,12.12695 L 0.26760898,12.693081 L 0.47676065,13.278734 L 0.76195982,13.825344 L 1.1422325,14.410996 L 1.5795405,14.957605 L 2.1309311,15.523736 L 2.7203448,16.070348 L 3.4048335,16.597435 L 4.1653682,17.085479 L 4.9829488,17.593043 L 5.8765785,18.100608 L 6.8462664,18.549609 L 7.8729941,18.998611 L 8.9757693,19.447613 L 10.135592,19.857571 L 11.333442,20.248007 L 12.607342,20.599396 L 13.919273,20.950787 L 15.28824,21.263135 L 16.695234,21.575486 L 18.140258,21.829265 L 19.623307,22.083049 L 21.125372,22.297787 L 22.684472,22.473485 L 24.243576,22.629661 L 25.840705,22.766312 L 27.45685,22.863921 L 29.053981,22.942009 L 30.689136,23.000574 L 32.324296,23.000574 L 32.324296,23.000574 L 33.940437,23.000574 L 35.575597,22.942009 L 37.191738,22.863921 L 38.788867,22.766312 L 40.385997,22.629661 L 41.964114,22.473485 L 43.504204,22.297787 L 45.006267,22.083049 L 46.489316,21.829265 L 47.934339,21.575486 L 49.341334,21.263135 L 50.710303,20.950787 L 52.022232,20.599396 L 53.296132,20.248007 L 54.493981,19.857571 L 55.6538,19.447613 L 56.75658,18.998611 L 57.783307,18.549609 L 58.752993,18.100608 L 59.646626,17.593043 L 60.464203,17.085479 L 61.224742,16.597435 L 61.909226,16.070348 L 62.517657,15.523736 L 63.050034,14.957605 L 63.487345,14.410996 L 63.867612,13.825344 L 64.152814,13.278734 L 64.342949,12.693081 L 64.457031,12.12695 L 64.514069,11.541297"
|
||||
style="fill:url(#linearGradient2216);fill-opacity:1;stroke:none;stroke-width:0.01928605;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
id="path4819"
|
||||
d="M 33.023738,8.6936939 L 37.664889,10.327433 L 48.909313,5.4458969 L 53.946665,7.0599533 L 51.229891,3.0248142 L 38.061087,3.0248142 L 43.475766,4.225514 L 33.023738,8.6936939"
|
||||
style="fill:#000000;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path4821"
|
||||
d="M 31.08049,13.161874 L 26.439334,11.528132 L 15.591104,16.429352 L 10.176425,14.775929 L 12.874332,19.244109 L 26.439334,19.244109 L 20.628458,17.630052 L 31.08049,13.161874"
|
||||
style="fill:#000000;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path4823"
|
||||
d="M 11.327278,4.225514 L 15.968435,2.611458 L 27.212859,7.0599533 L 32.25021,5.8592533 L 29.552303,9.8943939 L 16.364632,9.8943939 L 21.779313,8.6936939 L 11.327278,4.225514"
|
||||
style="fill:#000000;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path4825"
|
||||
d="M 53.154272,18.023723 L 48.513117,19.657467 L 37.664889,14.775929 L 32.25021,16.429352 L 34.966985,12.33516 L 48.513117,12.33516 L 42.70224,13.555544 L 53.154272,18.023723"
|
||||
style="fill:#000000;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path4827"
|
||||
d="M 33.419936,9.1070493 L 38.061087,10.721105 L 49.286643,5.8592533 L 54.323994,7.4929926 L 51.60722,3.4184854 L 38.438415,3.4184854 L 43.871962,4.6191872 L 33.419936,9.1070493"
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path4829"
|
||||
d="M 31.476681,13.555544 L 26.816665,11.941487 L 15.968435,16.803341 L 10.553753,15.189284 L 13.25166,19.657467 L 26.816665,19.657467 L 21.005786,18.023723 L 31.476681,13.555544"
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path4831"
|
||||
d="M 11.723476,4.6191872 L 16.364632,3.0248142 L 27.609055,7.4929926 L 32.627541,6.2529266 L 29.929634,10.327433 L 16.741963,10.327433 L 22.175509,9.1070493 L 11.723476,4.6191872"
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.001" />
|
||||
<path
|
||||
id="path4833"
|
||||
d="M 53.531602,18.43708 L 48.909313,20.070823 L 38.061087,15.189284 L 32.627541,16.803341 L 35.344315,12.7682 L 48.909313,12.7682 L 43.098437,13.9689 L 53.531602,18.43708"
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.001" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 11 KiB |
213
gns3server/custom_symbols/router_red_docker.svg
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
gns3server/custom_symbols/rpi.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
gns3server/custom_symbols/securityonion-logo.png
Normal file
After Width: | Height: | Size: 86 KiB |
BIN
gns3server/custom_symbols/shieldedtux.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
gns3server/custom_symbols/steelhead-vcx.png
Normal file
After Width: | Height: | Size: 193 KiB |
BIN
gns3server/custom_symbols/stormshield.png
Normal file
After Width: | Height: | Size: 6.9 KiB |
1750
gns3server/custom_symbols/ubuntu.svg
Normal file
After Width: | Height: | Size: 53 KiB |
316
gns3server/custom_symbols/vRIN.svg
Normal file
@ -0,0 +1,316 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="70"
|
||||
height="70"
|
||||
viewBox="0 0 70.000002 70.000001"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="vRIN.svg">
|
||||
<defs
|
||||
id="defs4">
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker4924"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path4926"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Mend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow2Mend"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path4185"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
transform="scale(-0.6,-0.6)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="TriangleOutL"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="TriangleOutL"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path4300"
|
||||
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1pt;stroke-opacity:1"
|
||||
transform="scale(0.8,0.8)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Lend"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path4161"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1pt;stroke-opacity:1"
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker4782"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path4784"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow2Lend"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path4179"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker4924-8"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4926-5"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker4924-8-2"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4926-5-7"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker4924-8-20"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4926-5-8"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker4924-7"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4926-7"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker4924-8-2-9"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4926-5-7-4"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker4924-8-20-9"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4926-5-8-8"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker4924-7-5"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4926-7-0"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker4924-7-58"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4926-7-9"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
|
||||
</marker>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="8"
|
||||
inkscape:cx="13.588207"
|
||||
inkscape:cy="41.315689"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1016"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0" />
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="vRIN"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
style="display:inline"
|
||||
transform="translate(0,-892.46783)">
|
||||
<circle
|
||||
style="fill:#1392e8;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="path3346"
|
||||
cx="35"
|
||||
cy="927.48718"
|
||||
r="35" />
|
||||
<circle
|
||||
style="display:inline;fill:#91c2fb;fill-opacity:1;stroke:none"
|
||||
id="path4149"
|
||||
r="30.676126"
|
||||
cy="927.48718"
|
||||
cx="35.233734" />
|
||||
<path
|
||||
style="display:inline;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.93489146;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4924-7)"
|
||||
d="m 22.32053,907.09486 18.69783,0"
|
||||
id="path4152"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="display:inline;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.93489146;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4924-8-2-9)"
|
||||
d="m 38.48734,920.78412 18.69783,0"
|
||||
id="path4152-9-9"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="display:inline;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.93489146;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4924-8-20-9)"
|
||||
d="m 38.6042,934.69063 18.69783,0"
|
||||
id="path4152-9-91"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="display:inline;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.93489146;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4924-7-5)"
|
||||
d="m -265.0259,179.09455 18.69783,0"
|
||||
id="path4152-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="display:inline;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.93489146;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4924-7-58)"
|
||||
d="m 22.32053,947.84486 18.69783,0"
|
||||
id="path4152-2"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4924-8)"
|
||||
d="m 191.34167,32.035246 160,0"
|
||||
id="path4152-9"
|
||||
inkscape:connector-curvature="0" />
|
||||
</svg>
|
After Width: | Height: | Size: 12 KiB |
44
gns3server/custom_symbols/vsrx_bybaro.svg
Normal file
@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg id="svg1998" width="55.044277" height="63.620274" version="1.0" xmlns="http://www.w3.org/2000/svg">
|
||||
<title id="title3303">ASA</title>
|
||||
<defs id="defs2001">
|
||||
<marker orient="auto" refY="0" refX="0" id="Arrow2Lstart" style="overflow:visible">
|
||||
<path id="path11918" style="font-size:12px;fill-rule:evenodd;stroke-width:0.73333335;stroke-linejoin:round" d="M 11.403143,4.732916 -1.416553,0.01878889 11.403144,-4.6953372 c -2.0480517,2.7832182 -2.0362508,6.5911436 -10e-7,9.4282532 z"/>
|
||||
</marker>
|
||||
<marker orient="auto" refY="0" refX="0" id="Arrow1Send" style="overflow:visible">
|
||||
<path id="path11921" d="M -1.28,0 -2.3466667,1.0666667 1.3866667,0 -2.3466667,-1.0666667 Z" style="fill-rule:evenodd;stroke:#000000;stroke-width:0.21333334pt;marker-start:none"/>
|
||||
</marker>
|
||||
<marker orient="auto" refY="0" refX="0" id="Arrow1Lstart" style="overflow:visible">
|
||||
<path id="path11936" d="M 10.666667,0 14.933333,-4.2666667 0,0 14.933333,4.2666667 Z" style="fill-rule:evenodd;stroke:#000000;stroke-width:0.85333335pt;marker-start:none"/>
|
||||
</marker>
|
||||
<linearGradient id="linearGradient6875" gradientUnits="userSpaceOnUse" gradientTransform="matrix(26.557584,0,0,27.099161,-9.2951537,-5.3720715)" x1="2.1178279" y1="0.30649999" x2="-0.4954865" y2="0.30649999">
|
||||
<stop style="stop-color:#6e8caa;stop-opacity:1;" offset="0" id="stop8333"/>
|
||||
<stop style="stop-color:#dde3ef;stop-opacity:1;" offset="1" id="stop8335"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<path id="path11907" d="m 2.277686,60.343382 v 3.25342 h 45.379267 v -3.25342 H 2.277686" style="fill:#000000;fill-opacity:0.39215686;stroke:none;stroke-width:1.06666672"/>
|
||||
<path id="path11020" d="M 47.765643,8.1809483 55.044279,1.3761504 55.028695,57.643455 47.654539,63.62027 47.765638,8.1809483" style="fill:#000000;fill-opacity:0.39215686;stroke:none;stroke-width:1.06666672"/>
|
||||
<path id="path2037" d="M 0.47692057,5.3149867 V 49.230745 H 47.778461 V 5.3149867 H 0.47692057" style="fill:#6e8caa;fill-opacity:1;stroke:none;stroke-width:1.06666672"/>
|
||||
<path id="path2041" d="M 0,5.8198859 6.0551291,0.04776213 H 53.885337 L 47.777093,5.8198859 H 0" style="fill:url(#linearGradient6875);fill-opacity:1;stroke:none;stroke-width:1.06666672"/>
|
||||
<path id="path2045" d="M 47.635174,5.2911061 53.670405,0 v 43.968341 l -6.035231,5.291106 V 5.2911061" style="fill:#6e8296;fill-opacity:1;stroke:none;stroke-width:1.06666672"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06040335" d="m 68.017411,-124.00618 h 32.336679 v -2.5979 l 6.95208,5.19579 -6.95208,5.62568 v -2.59789 H 68.017411 v -5.62568" id="path39"/>
|
||||
<path style="fill:#000000;stroke:#ffffff;stroke-width:1.06040335;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="M 56.893321,-121.40829 H 70.452314" id="path61"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06040335" d="M 16.19484,61.82555 H 0.42243277 V 55.665507 H 16.19484 v 6.160043" id="path99"/>
|
||||
<path style="fill:#000000;stroke:#e1e1e1;stroke-width:0.47963932;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="M 16.19484,61.82555 H 0.57567743" id="path101"/>
|
||||
<path style="fill:#000000;stroke:#e1e1e1;stroke-width:0.47819233;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="M 0.66977537,55.665507 H 16.19484 v 6.160043" id="path103"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.47819233;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="M 47.780883,61.82555 H 31.991982 v -6.160043 h 15.788901 v 6.160043" id="path105"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.47819233;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="M 40.280128,61.82555 H 24.474743 v -6.160043 h 15.805385 v 6.160043" id="path107"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.47819233;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="M 24.474743,61.82555 H 8.6940847 V 55.665507 H 24.474743 v 6.160043" id="path109"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.50290239;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="m 50.792321,53.512289 2.638353,-2.735375 v -6.805626 l -2.638353,2.720386 v 6.820615" id="path111"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.47819233;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="m 50.792321,59.372711 2.638353,-2.166775 v -6.166822 l -2.638353,2.160008 v 6.173589" id="path125"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.47819233;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="m 47.780883,61.82555 3.011438,-2.452839 v -6.173589 l -3.011438,2.466385 v 6.160043" id="path127"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.47819233;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="M 31.991982,55.665507 H 16.19484 v -6.166811 h 15.797142 v 6.166811" id="path133"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06040335" d="M 16.19484,55.665507 H 0.42243277 V 49.498685 H 16.19484 v 6.166822" id="path135"/>
|
||||
<path style="fill:#000000;stroke:#e1e1e1;stroke-width:0.48108193;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="M 16.19484,55.665507 H 0.48158037" id="path137"/>
|
||||
<path style="fill:#000000;stroke:#e1e1e1;stroke-width:0.48039833;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="M 0.52620409,49.498696 H 16.19484 v 6.166811" id="path139"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.47819233;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="M 47.780883,55.665507 H 31.991982 v -6.166811 h 15.788901 v 6.166811" id="path141"/>
|
||||
<path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#e1e1e1;stroke-width:0.48692337;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" d="m 47.780883,55.665507 3.011438,-2.557269 v -6.387053 l -3.011438,2.550268 v 6.394054" id="path145"/>
|
||||
<path d="M 24.272 46.546 C 34.337 46.546 42.543 38.338 42.543 28.274 C 42.543 18.21 34.337 10 24.272 10 C 14.207 10 6 18.21 6 28.274 C 6 38.338 14.207 46.546 24.272 46.546 Z" fill="#12537c"/>
|
||||
<path d="M 24.001 48.003 C 35.017 48.003 44 39.018 44 28.003 C 44 16.987 35.017 8 24.001 8 C 12.984 8 4 16.987 4 28.003 C 4 39.018 12.984 48.003 24.001 48.003 Z" stroke="#bcbec0" stroke-linecap="butt" stroke-linejoin="miter" stroke-width="1.125" style="fill: rgb(18, 83, 124);"/>
|
||||
<path d="M 22.025 26.701 L 20.936 26.701 L 8.503 26.701 L 8.503 23.706 L 19.439 23.706 L 19.439 17.324 L 17.836 17.324 L 19.397 14.621 L 20.604 12.533 L 20.958 11.92 L 22.52 14.621 L 24.078 17.324 L 23.366 17.324 L 22.434 17.324 L 22.434 25.203 L 22.434 26.701 L 22.025 26.701 L 22.025 26.701 Z M 34.665 27.673 L 34.665 26.701 L 26.887 26.701 L 25.39 26.701 L 25.39 26.289 L 25.39 25.203 L 25.39 12.858 L 28.385 12.858 L 28.385 23.705 L 34.664 23.705 L 34.666 22.141 L 37.366 23.703 L 39.453 24.907 L 39.248 25.264 L 39.453 24.907 L 40.069 25.263 L 37.366 26.824 L 34.664 28.381 L 34.664 27.673 L 34.665 27.673 Z M 19.849 43.677 L 19.849 43.267 L 20.261 43.267 L 19.849 43.267 L 19.849 43.677 L 19.439 43.677 L 19.439 32.828 L 13.334 32.828 L 13.334 34.468 L 10.633 32.907 L 7.931 31.348 L 10.633 29.787 L 13.334 28.228 L 13.334 28.937 L 13.334 29.835 L 20.936 29.835 L 22.434 29.835 L 22.434 30.245 L 22.434 31.331 L 22.434 43.677 L 19.849 43.677 L 19.849 43.677 Z M 26.886 43.239 L 27.242 43.034 L 26.886 43.239 L 26.886 43.239 Z M 25.325 41.358 L 23.766 38.654 L 24.477 38.654 L 25.39 38.653 L 25.39 31.331 L 25.39 29.835 L 25.8 29.835 L 26.887 29.835 L 39.32 29.835 L 39.32 32.828 L 28.386 32.828 L 28.386 38.655 L 30.006 38.655 L 28.446 41.359 L 27.242 43.444 L 26.887 44.062 L 25.325 41.358 L 25.325 41.358 Z" fill="white"/>
|
||||
</svg>
|
After Width: | Height: | Size: 8.2 KiB |
35
gns3server/custom_symbols/vyos.svg
Normal file
@ -0,0 +1,35 @@
|
||||
<svg width="60" height="60" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect height="60" width="60" x="0" y="0" style="fill:#ffffff" />
|
||||
<path d="M43.8 7.2H52.8V37.2H60V0H43.8V7.2Z" fill="url(#paint0_linear)"/>
|
||||
<path d="M37.2 0H0V16.2H7.2V7.2H37.2V0Z" fill="url(#paint1_linear)"/>
|
||||
<path d="M7.2 22.8H0V60H16.2V52.8H7.2V22.8Z" fill="url(#paint2_linear)"/>
|
||||
<path d="M22.8 52.8V60H60V43.8H52.8V52.8H22.8Z" fill="url(#paint3_linear)"/>
|
||||
<path d="M13.2 13.2H20.4L33.6 46.8H26.4L13.2 13.2Z" fill="url(#paint4_linear)"/>
|
||||
<path d="M46.8 13.2H39.6L26.4 46.8H33.6L46.8 13.2Z" fill="url(#paint5_linear)"/>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear" x1="0" y1="0" x2="60" y2="60" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FFBF12"/>
|
||||
<stop offset="1" stop-color="#FF9000"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear" x1="0" y1="0" x2="60" y2="60" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FFBF12"/>
|
||||
<stop offset="1" stop-color="#FF9000"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint2_linear" x1="0" y1="0" x2="60" y2="60" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FFBF12"/>
|
||||
<stop offset="1" stop-color="#FF9000"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint3_linear" x1="0" y1="0" x2="60" y2="60" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FFBF12"/>
|
||||
<stop offset="1" stop-color="#FF9000"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint4_linear" x1="0" y1="0" x2="60" y2="60" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FFBF12"/>
|
||||
<stop offset="1" stop-color="#FF9000"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint5_linear" x1="0" y1="0" x2="60" y2="60" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FFBF12"/>
|
||||
<stop offset="1" stop-color="#FF9000"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 1.7 KiB |
@ -30,6 +30,7 @@ import gns3server.utils.get_resource
|
||||
import os
|
||||
import sys
|
||||
import asyncio
|
||||
import argparse
|
||||
|
||||
|
||||
def daemonize():
|
||||
@ -59,6 +60,42 @@ def daemonize():
|
||||
print("Second fork failed: %d (%s)\n" % (e.errno, e.strerror), file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
def parse_arguments(argv):
|
||||
"""
|
||||
Parse command line arguments
|
||||
|
||||
:param argv: Array of command line arguments
|
||||
"""
|
||||
from gns3server.version import __version__
|
||||
parser = argparse.ArgumentParser(description=f"GNS3 server version {__version__}")
|
||||
parser.add_argument("-v", "--version", help="show the version", action="version", version=__version__)
|
||||
parser.add_argument("--host", help="run on the given host/IP address")
|
||||
parser.add_argument("--port", help="run on the given port", type=int)
|
||||
parser.add_argument("--ssl", action="store_true", help="run in SSL mode")
|
||||
parser.add_argument("--config", help="Configuration file")
|
||||
parser.add_argument("--certfile", help="SSL cert file")
|
||||
parser.add_argument("--certkey", help="SSL key file")
|
||||
parser.add_argument("-L", "--local", action="store_true", help="local mode (allows some insecure operations)")
|
||||
parser.add_argument(
|
||||
"-A", "--allow", action="store_true", help="allow remote connections to local console ports"
|
||||
)
|
||||
parser.add_argument("-q", "--quiet", default=False, action="store_true", help="do not show logs on stdout")
|
||||
parser.add_argument("-d", "--debug", default=False, action="store_true", help="show debug logs")
|
||||
parser.add_argument("--logfile", "--log", help="send output to logfile instead of console")
|
||||
parser.add_argument("--logmaxsize", default=10000000, help="maximum logfile size in bytes (default is 10MB)")
|
||||
parser.add_argument(
|
||||
"--logbackupcount", default=10, help="number of historical log files to keep (default is 10)"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--logcompression", default=False, action="store_true", help="compress inactive (historical) logs"
|
||||
)
|
||||
parser.add_argument("--daemon", action="store_true", help="start as a daemon")
|
||||
parser.add_argument("--pid", help="store process pid")
|
||||
parser.add_argument("--profile", help="Settings profile (blank will use default settings files)")
|
||||
|
||||
args = parser.parse_args(argv)
|
||||
return parser, args
|
||||
|
||||
|
||||
def main():
|
||||
"""
|
||||
@ -69,10 +106,11 @@ def main():
|
||||
raise SystemExit("Windows is not a supported platform to run the GNS3 server")
|
||||
if "--daemon" in sys.argv:
|
||||
daemonize()
|
||||
from gns3server.server import Server
|
||||
|
||||
try:
|
||||
asyncio.run(Server().run())
|
||||
parser, args = parse_arguments(sys.argv[1:])
|
||||
from gns3server.server import Server
|
||||
asyncio.run(Server().run(parser, args))
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
|
||||
|
@ -43,8 +43,8 @@ class DockerBase(BaseModel):
|
||||
environment: Optional[str] = Field(None, description="Docker environment variables")
|
||||
extra_hosts: Optional[str] = Field(None, description="Docker extra hosts (added to /etc/hosts)")
|
||||
extra_volumes: Optional[List[str]] = Field(None, description="Additional directories to make persistent")
|
||||
memory: Optional[int] = Field(None, description="Maximum amount of memory the container can use in MB")
|
||||
cpus: Optional[float] = Field(None, description="Maximum amount of CPU resources the container can use")
|
||||
memory: Optional[int] = Field(None, ge=0, description="Maximum amount of memory the container can use in MB")
|
||||
cpus: Optional[float] = Field(None, ge=0, description="Maximum amount of CPU resources the container can use")
|
||||
custom_adapters: Optional[List[CustomAdapter]] = Field(None, description="Custom adapters")
|
||||
|
||||
|
||||
|
@ -124,8 +124,8 @@ class DynamipsBase(BaseModel):
|
||||
name: Optional[str] = None
|
||||
dynamips_id: Optional[int] = Field(None, description="Dynamips internal ID")
|
||||
platform: Optional[DynamipsPlatform] = Field(None, description="Cisco router platform")
|
||||
ram: Optional[int] = Field(None, description="Amount of RAM in MB")
|
||||
nvram: Optional[int] = Field(None, description="Amount of NVRAM in KB")
|
||||
ram: Optional[int] = Field(None, gt=0, description="Amount of RAM in MB")
|
||||
nvram: Optional[int] = Field(None, gt=0, description="Amount of NVRAM in KB")
|
||||
image: Optional[str] = Field(None, description="Path to the IOS image")
|
||||
image_md5sum: Optional[str] = Field(None, description="Checksum of the IOS image")
|
||||
usage: Optional[str] = Field(None, description="How to use the Dynamips VM")
|
||||
@ -139,8 +139,8 @@ class DynamipsBase(BaseModel):
|
||||
idlemax: Optional[int] = Field(None, description="Idlemax value")
|
||||
idlesleep: Optional[int] = Field(None, description="Idlesleep value")
|
||||
exec_area: Optional[int] = Field(None, description="Exec area value")
|
||||
disk0: Optional[int] = Field(None, description="Disk0 size in MB")
|
||||
disk1: Optional[int] = Field(None, description="Disk1 size in MB")
|
||||
disk0: Optional[int] = Field(None, ge=0, description="Disk0 size in MB")
|
||||
disk1: Optional[int] = Field(None, ge=0, description="Disk1 size in MB")
|
||||
auto_delete_disks: Optional[bool] = Field(None, description="Automatically delete nvram and disk files")
|
||||
console: Optional[int] = Field(None, gt=0, le=65535, description="Console TCP port")
|
||||
console_type: Optional[DynamipsConsoleType] = Field(None, description="Console type")
|
||||
@ -176,7 +176,7 @@ class DynamipsCreate(DynamipsBase):
|
||||
name: str
|
||||
platform: str = Field(..., description="Cisco router platform", pattern="^c[0-9]{4}$")
|
||||
image: str = Field(..., description="Path to the IOS image")
|
||||
ram: int = Field(..., description="Amount of RAM in MB")
|
||||
ram: int = Field(..., gt=0, description="Amount of RAM in MB")
|
||||
|
||||
|
||||
class DynamipsUpdate(DynamipsBase):
|
||||
|
@ -36,8 +36,8 @@ class IOUBase(BaseModel):
|
||||
md5sum: Optional[str] = Field(None, description="IOU executable checksum")
|
||||
serial_adapters: Optional[int] = Field(None, description="How many serial adapters are connected to IOU")
|
||||
ethernet_adapters: Optional[int] = Field(None, description="How many Ethernet adapters are connected to IOU")
|
||||
ram: Optional[int] = Field(None, description="Amount of RAM in MB")
|
||||
nvram: Optional[int] = Field(None, description="Amount of NVRAM in KB")
|
||||
ram: Optional[int] = Field(None, gt=0, description="Amount of RAM in MB")
|
||||
nvram: Optional[int] = Field(None, gt=0, description="Amount of NVRAM in KB")
|
||||
l1_keepalives: Optional[bool] = Field(None, description="Use default IOU values")
|
||||
use_default_iou_values: Optional[bool] = Field(None, description="Always up Ethernet interfaces")
|
||||
startup_config_content: Optional[str] = Field(None, description="Content of IOU startup configuration file")
|
||||
|
@ -49,8 +49,8 @@ class DockerTemplate(TemplateBase):
|
||||
)
|
||||
extra_hosts: Optional[str] = Field("", description="Docker extra hosts (added to /etc/hosts)")
|
||||
extra_volumes: Optional[List] = Field([], description="Additional directories to make persistent")
|
||||
memory: Optional[int] = Field(0, description="Maximum amount of memory the container can use in MB")
|
||||
cpus: Optional[float] = Field(0, description="Maximum amount of CPU resources the container can use")
|
||||
memory: Optional[int] = Field(0, ge=0, description="Maximum amount of memory the container can use in MB")
|
||||
cpus: Optional[float] = Field(0, ge=0, description="Maximum amount of CPU resources the container can use")
|
||||
custom_adapters: Optional[List[CustomAdapter]] = Field(default_factory=list, description="Custom adapters")
|
||||
|
||||
|
||||
|
@ -37,7 +37,7 @@ class DynamipsTemplate(TemplateBase):
|
||||
symbol: Optional[str] = "router"
|
||||
platform: DynamipsPlatform = Field(..., description="Cisco router platform")
|
||||
image: str = Field(..., description="Path to the IOS image")
|
||||
exec_area: Optional[int] = Field(64, description="Exec area value")
|
||||
exec_area: Optional[int] = Field(64, ge=0, description="Exec area value")
|
||||
mmap: Optional[bool] = Field(True, description="MMAP feature")
|
||||
mac_addr: Optional[str] = Field(
|
||||
"", description="Base MAC address", pattern="^([0-9a-fA-F]{4}\\.){2}[0-9a-fA-F]{4}$|^$"
|
||||
@ -46,10 +46,10 @@ class DynamipsTemplate(TemplateBase):
|
||||
startup_config: Optional[str] = Field("ios_base_startup-config.txt", description="IOS startup configuration file")
|
||||
private_config: Optional[str] = Field("", description="IOS private configuration file")
|
||||
idlepc: Optional[str] = Field("", description="Idle-PC value", pattern="^(0x[0-9a-fA-F]+)?$|^$")
|
||||
idlemax: Optional[int] = Field(500, description="Idlemax value")
|
||||
idlesleep: Optional[int] = Field(30, description="Idlesleep value")
|
||||
disk0: Optional[int] = Field(0, description="Disk0 size in MB")
|
||||
disk1: Optional[int] = Field(0, description="Disk1 size in MB")
|
||||
idlemax: Optional[int] = Field(500, ge=0, description="Idlemax value")
|
||||
idlesleep: Optional[int] = Field(30, ge=0, description="Idlesleep value")
|
||||
disk0: Optional[int] = Field(0, ge=0, description="Disk0 size in MB")
|
||||
disk1: Optional[int] = Field(0, ge=0, description="Disk1 size in MB")
|
||||
auto_delete_disks: Optional[bool] = Field(False, description="Automatically delete nvram and disk files")
|
||||
console_type: Optional[DynamipsConsoleType] = Field(DynamipsConsoleType.telnet, description="Console type")
|
||||
console_auto_start: Optional[bool] = Field(
|
||||
@ -70,8 +70,8 @@ class DynamipsTemplate(TemplateBase):
|
||||
|
||||
class C7200DynamipsTemplate(DynamipsTemplate):
|
||||
|
||||
ram: Optional[int] = Field(512, description="Amount of RAM in MB")
|
||||
nvram: Optional[int] = Field(512, description="Amount of NVRAM in KB")
|
||||
ram: Optional[int] = Field(512, gt=0, description="Amount of RAM in MB")
|
||||
nvram: Optional[int] = Field(512, gt=0, description="Amount of NVRAM in KB")
|
||||
npe: Optional[DynamipsNPE] = Field(DynamipsNPE.npe_400, description="NPE model")
|
||||
midplane: Optional[DynamipsMidplane] = Field(DynamipsMidplane.vxr, description="Midplane model")
|
||||
sparsemem: Optional[bool] = Field(True, description="Sparse memory feature")
|
||||
@ -85,8 +85,8 @@ class C7200DynamipsTemplateUpdate(C7200DynamipsTemplate):
|
||||
|
||||
class C3725DynamipsTemplate(DynamipsTemplate):
|
||||
|
||||
ram: Optional[int] = Field(128, description="Amount of RAM in MB")
|
||||
nvram: Optional[int] = Field(256, description="Amount of NVRAM in KB")
|
||||
ram: Optional[int] = Field(128, gt=0, description="Amount of RAM in MB")
|
||||
nvram: Optional[int] = Field(256, gt=0, description="Amount of NVRAM in KB")
|
||||
iomem: Optional[int] = Field(5, ge=0, le=100, description="I/O memory percentage")
|
||||
sparsemem: Optional[bool] = Field(True, description="Sparse memory feature")
|
||||
|
||||
@ -99,8 +99,8 @@ class C3725DynamipsTemplateUpdate(C3725DynamipsTemplate):
|
||||
|
||||
class C3745DynamipsTemplate(DynamipsTemplate):
|
||||
|
||||
ram: Optional[int] = Field(256, description="Amount of RAM in MB")
|
||||
nvram: Optional[int] = Field(256, description="Amount of NVRAM in KB")
|
||||
ram: Optional[int] = Field(256, gt=0, description="Amount of RAM in MB")
|
||||
nvram: Optional[int] = Field(256, gt=0, description="Amount of NVRAM in KB")
|
||||
iomem: Optional[int] = Field(5, ge=0, le=100, description="I/O memory percentage")
|
||||
sparsemem: Optional[bool] = Field(True, description="Sparse memory feature")
|
||||
|
||||
@ -121,8 +121,8 @@ class C3600ChassisType(str, Enum):
|
||||
class C3600DynamipsTemplate(DynamipsTemplate):
|
||||
|
||||
chassis: Optional[C3600ChassisType] = Field("c3660", description="Chassis type")
|
||||
ram: Optional[int] = Field(192, description="Amount of RAM in MB")
|
||||
nvram: Optional[int] = Field(128, description="Amount of NVRAM in KB")
|
||||
ram: Optional[int] = Field(192, gt=0, description="Amount of RAM in MB")
|
||||
nvram: Optional[int] = Field(128, gt=0, description="Amount of NVRAM in KB")
|
||||
iomem: Optional[int] = Field(5, ge=0, le=100, description="I/O memory percentage")
|
||||
sparsemem: Optional[bool] = Field(True, description="Sparse memory feature")
|
||||
|
||||
@ -135,8 +135,8 @@ class C3600DynamipsTemplateUpdate(C3600DynamipsTemplate):
|
||||
|
||||
class C2691DynamipsTemplate(DynamipsTemplate):
|
||||
|
||||
ram: Optional[int] = Field(192, description="Amount of RAM in MB")
|
||||
nvram: Optional[int] = Field(256, description="Amount of NVRAM in KB")
|
||||
ram: Optional[int] = Field(192, gt=0, description="Amount of RAM in MB")
|
||||
nvram: Optional[int] = Field(256, gt=0, description="Amount of NVRAM in KB")
|
||||
iomem: Optional[int] = Field(5, ge=0, le=100, description="I/O memory percentage")
|
||||
sparsemem: Optional[bool] = Field(True, description="Sparse memory feature")
|
||||
|
||||
@ -163,8 +163,8 @@ class C2600ChassisType(str, Enum):
|
||||
class C2600DynamipsTemplate(DynamipsTemplate):
|
||||
|
||||
chassis: Optional[C2600ChassisType] = Field("2651XM", description="Chassis type")
|
||||
ram: Optional[int] = Field(160, description="Amount of RAM in MB")
|
||||
nvram: Optional[int] = Field(128, description="Amount of NVRAM in KB")
|
||||
ram: Optional[int] = Field(160, gt=0, description="Amount of RAM in MB")
|
||||
nvram: Optional[int] = Field(128, gt=0, description="Amount of NVRAM in KB")
|
||||
iomem: Optional[int] = Field(15, ge=0, le=100, description="I/O memory percentage")
|
||||
sparsemem: Optional[bool] = Field(True, description="Sparse memory feature")
|
||||
|
||||
@ -187,8 +187,8 @@ class C1700ChassisType(str, Enum):
|
||||
class C1700DynamipsTemplate(DynamipsTemplate):
|
||||
|
||||
chassis: Optional[C1700ChassisType] = Field("1760", description="Chassis type")
|
||||
ram: Optional[int] = Field(160, description="Amount of RAM in MB")
|
||||
nvram: Optional[int] = Field(128, description="Amount of NVRAM in KB")
|
||||
ram: Optional[int] = Field(160, gt=0, description="Amount of RAM in MB")
|
||||
nvram: Optional[int] = Field(128, gt=0, description="Amount of NVRAM in KB")
|
||||
iomem: Optional[int] = Field(15, ge=0, le=100, description="I/O memory percentage")
|
||||
sparsemem: Optional[bool] = Field(False, description="Sparse memory feature")
|
||||
|
||||
|
@ -28,10 +28,10 @@ class IOUTemplate(TemplateBase):
|
||||
default_name_format: Optional[str] = "IOU{0}"
|
||||
symbol: Optional[str] = "multilayer_switch"
|
||||
path: str = Field(..., description="Path of IOU executable")
|
||||
ethernet_adapters: Optional[int] = Field(2, description="Number of ethernet adapters")
|
||||
serial_adapters: Optional[int] = Field(2, description="Number of serial adapters")
|
||||
ram: Optional[int] = Field(256, description="Amount of RAM in MB")
|
||||
nvram: Optional[int] = Field(128, description="Amount of NVRAM in KB")
|
||||
ethernet_adapters: Optional[int] = Field(2, ge=0, description="Number of ethernet adapters")
|
||||
serial_adapters: Optional[int] = Field(2, ge=0, description="Number of serial adapters")
|
||||
ram: Optional[int] = Field(256, gt=0, description="Amount of RAM in MB")
|
||||
nvram: Optional[int] = Field(128, gt=0, description="Amount of NVRAM in KB")
|
||||
use_default_iou_values: Optional[bool] = Field(True, description="Use default IOU values")
|
||||
startup_config: Optional[str] = Field("iou_l3_base_startup-config.txt", description="Startup-config of IOU")
|
||||
private_config: Optional[str] = Field("", description="Private-config of IOU")
|
||||
|
@ -39,7 +39,7 @@ class QemuTemplate(TemplateBase):
|
||||
qemu_path: Optional[str] = Field("", description="Qemu executable path")
|
||||
platform: Optional[QemuPlatform] = Field(QemuPlatform.x86_64, description="Platform to emulate")
|
||||
linked_clone: Optional[bool] = Field(True, description="Whether the VM is a linked clone or not")
|
||||
ram: Optional[int] = Field(256, description="Amount of RAM in MB")
|
||||
ram: Optional[int] = Field(256, gt=0, description="Amount of RAM in MB")
|
||||
cpus: Optional[int] = Field(1, ge=1, le=255, description="Number of vCPUs")
|
||||
maxcpus: Optional[int] = Field(1, ge=1, le=255, description="Maximum number of hotpluggable vCPUs")
|
||||
adapters: Optional[int] = Field(1, ge=0, le=275, description="Number of adapters")
|
||||
|
@ -39,7 +39,7 @@ class UserCreate(UserBase):
|
||||
"""
|
||||
|
||||
username: str = Field(..., min_length=3, pattern="[a-zA-Z0-9_-]+$")
|
||||
password: SecretStr = Field(..., min_length=6, max_length=100)
|
||||
password: SecretStr = Field(..., min_length=8, max_length=100)
|
||||
|
||||
|
||||
class UserUpdate(UserBase):
|
||||
@ -47,7 +47,7 @@ class UserUpdate(UserBase):
|
||||
Properties to update a user.
|
||||
"""
|
||||
|
||||
password: Optional[SecretStr] = Field(None, min_length=6, max_length=100)
|
||||
password: Optional[SecretStr] = Field(None, min_length=8, max_length=100)
|
||||
|
||||
|
||||
class LoggedInUserUpdate(BaseModel):
|
||||
@ -55,7 +55,7 @@ class LoggedInUserUpdate(BaseModel):
|
||||
Properties to update a logged-in user.
|
||||
"""
|
||||
|
||||
password: Optional[SecretStr] = Field(None, min_length=6, max_length=100)
|
||||
password: Optional[SecretStr] = Field(None, min_length=8, max_length=100)
|
||||
email: Optional[EmailStr] = None
|
||||
full_name: Optional[str] = None
|
||||
|
||||
|
@ -23,7 +23,6 @@ Start the program. Use main.py to load it.
|
||||
import os
|
||||
import datetime
|
||||
import locale
|
||||
import argparse
|
||||
import psutil
|
||||
import sys
|
||||
import asyncio
|
||||
@ -33,13 +32,10 @@ import uvicorn
|
||||
import secrets
|
||||
import string
|
||||
|
||||
from gns3server.controller import Controller
|
||||
from gns3server.compute.port_manager import PortManager
|
||||
from gns3server.logger import init_logger
|
||||
from gns3server.version import __version__
|
||||
from gns3server.config import Config
|
||||
from gns3server.crash_report import CrashReport
|
||||
from gns3server.api.server import app
|
||||
from pydantic import ValidationError, SecretStr
|
||||
|
||||
import logging
|
||||
@ -90,40 +86,13 @@ class Server:
|
||||
else:
|
||||
log.info(f"Current locale is {language}.{encoding}")
|
||||
|
||||
def _parse_arguments(self, argv):
|
||||
def _setup_logging(self, args):
|
||||
"""
|
||||
Parse command line arguments and override local configuration
|
||||
Setup logging.
|
||||
|
||||
:params args: Array of command line arguments
|
||||
:param args: command line arguments
|
||||
"""
|
||||
|
||||
parser = argparse.ArgumentParser(description=f"GNS3 server version {__version__}")
|
||||
parser.add_argument("-v", "--version", help="show the version", action="version", version=__version__)
|
||||
parser.add_argument("--host", help="run on the given host/IP address")
|
||||
parser.add_argument("--port", help="run on the given port", type=int)
|
||||
parser.add_argument("--ssl", action="store_true", help="run in SSL mode")
|
||||
parser.add_argument("--config", help="Configuration file")
|
||||
parser.add_argument("--certfile", help="SSL cert file")
|
||||
parser.add_argument("--certkey", help="SSL key file")
|
||||
parser.add_argument("-L", "--local", action="store_true", help="local mode (allows some insecure operations)")
|
||||
parser.add_argument(
|
||||
"-A", "--allow", action="store_true", help="allow remote connections to local console ports"
|
||||
)
|
||||
parser.add_argument("-q", "--quiet", default=False, action="store_true", help="do not show logs on stdout")
|
||||
parser.add_argument("-d", "--debug", default=False, action="store_true", help="show debug logs")
|
||||
parser.add_argument("--logfile", "--log", help="send output to logfile instead of console")
|
||||
parser.add_argument("--logmaxsize", default=10000000, help="maximum logfile size in bytes (default is 10MB)")
|
||||
parser.add_argument(
|
||||
"--logbackupcount", default=10, help="number of historical log files to keep (default is 10)"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--logcompression", default=False, action="store_true", help="compress inactive (historical) logs"
|
||||
)
|
||||
parser.add_argument("--daemon", action="store_true", help="start as a daemon")
|
||||
parser.add_argument("--pid", help="store process pid")
|
||||
parser.add_argument("--profile", help="Settings profile (blank will use default settings files)")
|
||||
|
||||
args = parser.parse_args(argv)
|
||||
level = logging.INFO
|
||||
if args.debug:
|
||||
level = logging.DEBUG
|
||||
@ -137,6 +106,15 @@ class Server:
|
||||
quiet=args.quiet,
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def _load_config_and_set_defaults(parser, args, argv=None):
|
||||
"""
|
||||
Parse command line arguments and override local configuration
|
||||
|
||||
:param parser: ArgumentParser instance
|
||||
:param args: command line arguments
|
||||
"""
|
||||
|
||||
try:
|
||||
if args.config:
|
||||
Config.instance(files=[args.config], profile=args.profile)
|
||||
@ -157,7 +135,10 @@ class Server:
|
||||
}
|
||||
|
||||
parser.set_defaults(**defaults)
|
||||
return parser.parse_args(argv)
|
||||
if argv is None:
|
||||
argv = sys.argv[1:]
|
||||
args = parser.parse_args(argv)
|
||||
return args
|
||||
|
||||
@staticmethod
|
||||
def _set_config_defaults_from_command_line(args):
|
||||
@ -174,6 +155,8 @@ class Server:
|
||||
config.Server.enable_ssl = args.ssl
|
||||
|
||||
def _signal_handling(self):
|
||||
|
||||
from gns3server.controller import Controller
|
||||
def signal_handler(signame, *args):
|
||||
|
||||
try:
|
||||
@ -239,9 +222,10 @@ class Server:
|
||||
log.critical("Can't write pid file %s: %s", path, str(e))
|
||||
sys.exit(1)
|
||||
|
||||
async def run(self):
|
||||
async def run(self, parser, args):
|
||||
|
||||
args = self._parse_arguments(sys.argv[1:])
|
||||
self._setup_logging(args)
|
||||
args = self._load_config_and_set_defaults(parser, args)
|
||||
|
||||
if args.pid:
|
||||
self._pid_lock(args.pid)
|
||||
@ -256,7 +240,6 @@ class Server:
|
||||
|
||||
self._set_config_defaults_from_command_line(args)
|
||||
config = Config.instance().settings
|
||||
|
||||
if not config.Server.compute_password.get_secret_value():
|
||||
alphabet = string.ascii_letters + string.digits + string.punctuation
|
||||
generated_password = ''.join(secrets.choice(alphabet) for _ in range(16))
|
||||
@ -297,11 +280,13 @@ class Server:
|
||||
host = config.Server.host
|
||||
port = config.Server.port
|
||||
|
||||
from gns3server.compute.port_manager import PortManager
|
||||
PortManager.instance().console_host = host
|
||||
self._signal_handling()
|
||||
|
||||
try:
|
||||
log.info(f"Starting server on {host}:{port}")
|
||||
from gns3server.api.server import app
|
||||
|
||||
# only show uvicorn access logs in debug mode
|
||||
access_log = False
|
||||
|
@ -46,6 +46,6 @@
|
||||
|
||||
gtag('config', 'G-0BT7QQV1W1');
|
||||
</script>
|
||||
<script src="runtime.24fa95b7061d7056.js" type="module"></script><script src="polyfills.319c79dd175e50d0.js" type="module"></script><script src="main.62c99707e4709a56.js" type="module"></script>
|
||||
<script src="runtime.24fa95b7061d7056.js" type="module"></script><script src="polyfills.319c79dd175e50d0.js" type="module"></script><script src="main.87178dd64c9c79ba.js" type="module"></script>
|
||||
|
||||
</body></html>
|
1
gns3server/static/web-ui/main.87178dd64c9c79ba.js
Normal file
@ -22,8 +22,8 @@
|
||||
# or negative for a release candidate or beta (after the base version
|
||||
# number has been incremented)
|
||||
|
||||
__version__ = "3.0.3.dev1"
|
||||
__version_info__ = (3, 0, 3, 99)
|
||||
__version__ = "3.0.4"
|
||||
__version_info__ = (3, 0, 4, 0)
|
||||
|
||||
if "dev" in __version__:
|
||||
try:
|
||||
|
@ -1,25 +1,25 @@
|
||||
uvicorn==0.33.0 # uvicorn 0.33 is the last version supporting Python 3.8
|
||||
pydantic==2.10.4
|
||||
fastapi==0.115.6
|
||||
uvicorn==0.34.0 # uvicorn 0.33 is the last version supporting Python 3.8
|
||||
pydantic==2.10.6
|
||||
fastapi==0.115.8
|
||||
python-multipart==0.0.20
|
||||
websockets==14.1
|
||||
aiohttp>=3.10.10,<3.11
|
||||
websockets==15.0
|
||||
aiohttp>=3.11.13,<3.12
|
||||
async-timeout==5.0.1; python_version < '3.11'
|
||||
aiofiles>=24.1.0,<25.0
|
||||
Jinja2>=3.1.5,<3.2
|
||||
sentry-sdk>=2.19.2,<2.20 # optional dependency
|
||||
psutil>=6.1.1
|
||||
sentry-sdk>=2.22,<2.23 # optional dependency
|
||||
psutil>=7.0.0
|
||||
distro>=1.9.0
|
||||
py-cpuinfo>=9.0.0,<10.0
|
||||
greenlet==3.1.1 # necessary to run sqlalchemy on Python 3.13
|
||||
sqlalchemy==2.0.36
|
||||
aiosqlite==0.20.0
|
||||
alembic==1.14.0
|
||||
sqlalchemy==2.0.38
|
||||
aiosqlite==0.21.0
|
||||
alembic==1.14.1
|
||||
bcrypt==4.2.1
|
||||
joserfc==1.0.1
|
||||
joserfc==1.0.3
|
||||
email-validator==2.2.0
|
||||
watchdog==6.0.0
|
||||
zstandard==0.23.0
|
||||
platformdirs>=2.4.0,<3 # platformdirs >=3 conflicts when building Debian packages
|
||||
importlib-resources>=1.3; python_version <= '3.9'
|
||||
truststore>=0.10.0; python_version >= '3.10'
|
||||
truststore>=0.10.1; python_version >= '3.10'
|
||||
|
@ -1,4 +1,4 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
#
|
||||
# Copyright (C) 2016 GNS3 Technologies Inc.
|
||||
#
|
||||
@ -21,10 +21,15 @@
|
||||
|
||||
rm gns3server/appliances/*
|
||||
rmdir gns3server/appliances
|
||||
rm gns3server/custom_symbols/*
|
||||
rmdir gns3server/custom_symbols
|
||||
rm -Rf /tmp/gns3-registry
|
||||
|
||||
git clone https://github.com/GNS3/gns3-registry.git /tmp/gns3-registry
|
||||
mv /tmp/gns3-registry/appliances gns3server/appliances
|
||||
mv /tmp/gns3-registry/symbols gns3server/custom_symbols
|
||||
rm -f gns3server/custom_symbols/*.{txt,rst,md}
|
||||
|
||||
git add gns3server/appliances/*
|
||||
git add gns3server/custom_symbols/*
|
||||
git commit -m "Sync appliances"
|
||||
|
@ -29,27 +29,29 @@ from gns3server.utils.path import get_default_project_directory
|
||||
pytestmark = pytest.mark.asyncio
|
||||
|
||||
|
||||
async def test_get(app: FastAPI, compute_client: AsyncClient, windows_platform) -> None:
|
||||
class TestCapabilitiesRoutes:
|
||||
|
||||
response = await compute_client.get(app.url_path_for("compute:get_capabilities"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json() == {'node_types': ['cloud', 'ethernet_hub', 'ethernet_switch', 'nat', 'vpcs', 'virtualbox', 'dynamips', 'frame_relay_switch', 'atm_switch', 'qemu', 'vmware', 'docker', 'iou'],
|
||||
'version': __version__,
|
||||
'platform': sys.platform,
|
||||
'cpus': psutil.cpu_count(logical=True),
|
||||
'memory': psutil.virtual_memory().total,
|
||||
'disk_size': psutil.disk_usage(get_default_project_directory()).total,
|
||||
}
|
||||
async def test_get(self, app: FastAPI, compute_client: AsyncClient, windows_platform) -> None:
|
||||
|
||||
response = await compute_client.get(app.url_path_for("compute:get_capabilities"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json() == {'node_types': ['cloud', 'ethernet_hub', 'ethernet_switch', 'nat', 'vpcs', 'virtualbox', 'dynamips', 'frame_relay_switch', 'atm_switch', 'qemu', 'vmware', 'docker', 'iou'],
|
||||
'version': __version__,
|
||||
'platform': sys.platform,
|
||||
'cpus': psutil.cpu_count(logical=True),
|
||||
'memory': psutil.virtual_memory().total,
|
||||
'disk_size': psutil.disk_usage(get_default_project_directory()).total,
|
||||
}
|
||||
|
||||
|
||||
async def test_get_on_gns3vm(app: FastAPI, compute_client: AsyncClient, on_gns3vm) -> None:
|
||||
async def test_get_on_gns3vm(self, app: FastAPI, compute_client: AsyncClient, on_gns3vm) -> None:
|
||||
|
||||
response = await compute_client.get(app.url_path_for("compute:get_capabilities"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json() == {'node_types': ['cloud', 'ethernet_hub', 'ethernet_switch', 'nat', 'vpcs', 'virtualbox', 'dynamips', 'frame_relay_switch', 'atm_switch', 'qemu', 'vmware', 'docker', 'iou'],
|
||||
'version': __version__,
|
||||
'platform': sys.platform,
|
||||
'cpus': psutil.cpu_count(logical=True),
|
||||
'memory': psutil.virtual_memory().total,
|
||||
'disk_size': psutil.disk_usage(get_default_project_directory()).total,
|
||||
}
|
||||
response = await compute_client.get(app.url_path_for("compute:get_capabilities"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json() == {'node_types': ['cloud', 'ethernet_hub', 'ethernet_switch', 'nat', 'vpcs', 'virtualbox', 'dynamips', 'frame_relay_switch', 'atm_switch', 'qemu', 'vmware', 'docker', 'iou'],
|
||||
'version': __version__,
|
||||
'platform': sys.platform,
|
||||
'cpus': psutil.cpu_count(logical=True),
|
||||
'memory': psutil.virtual_memory().total,
|
||||
'disk_size': psutil.disk_usage(get_default_project_directory()).total,
|
||||
}
|
||||
|
@ -28,154 +28,193 @@ from gns3server.compute.project import Project
|
||||
pytestmark = pytest.mark.asyncio
|
||||
|
||||
|
||||
@pytest_asyncio.fixture(scope="function")
|
||||
async def vm(app: FastAPI, compute_client: AsyncClient, compute_project: Project, on_gns3vm) -> dict:
|
||||
class TestCloudNodesRoutes:
|
||||
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.cloud.Cloud._start_ubridge"):
|
||||
response = await compute_client.post(app.url_path_for("compute:create_cloud", project_id=compute_project.id),
|
||||
json={"name": "Cloud 1"})
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
return response.json()
|
||||
@pytest_asyncio.fixture
|
||||
async def vm(self, app: FastAPI, compute_client: AsyncClient, compute_project: Project, on_gns3vm) -> dict:
|
||||
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.cloud.Cloud._start_ubridge"):
|
||||
response = await compute_client.post(app.url_path_for("compute:create_cloud", project_id=compute_project.id),
|
||||
json={"name": "Cloud 1"})
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
return response.json()
|
||||
|
||||
|
||||
async def test_cloud_create(app: FastAPI, compute_client: AsyncClient, compute_project: Project) -> None:
|
||||
async def test_cloud_create(
|
||||
self, app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project
|
||||
) -> None:
|
||||
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.cloud.Cloud._start_ubridge"):
|
||||
response = await compute_client.post(app.url_path_for("compute:create_cloud", project_id=compute_project.id),
|
||||
json={"name": "Cloud 1"})
|
||||
assert response.status_code == 201
|
||||
assert response.json()["name"] == "Cloud 1"
|
||||
assert response.json()["project_id"] == compute_project.id
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.cloud.Cloud._start_ubridge"):
|
||||
response = await compute_client.post(app.url_path_for("compute:create_cloud", project_id=compute_project.id),
|
||||
json={"name": "Cloud 1"})
|
||||
assert response.status_code == 201
|
||||
assert response.json()["name"] == "Cloud 1"
|
||||
assert response.json()["project_id"] == compute_project.id
|
||||
|
||||
|
||||
async def test_get_cloud(app: FastAPI, compute_client: AsyncClient, compute_project: Project, vm: dict) -> None:
|
||||
async def test_get_cloud(
|
||||
self, app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
vm: dict
|
||||
) -> None:
|
||||
|
||||
response = await compute_client.get(app.url_path_for("compute:get_cloud", project_id=vm["project_id"], node_id=vm["node_id"]))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json()["name"] == "Cloud 1"
|
||||
assert response.json()["project_id"] == compute_project.id
|
||||
assert response.json()["status"] == "started"
|
||||
|
||||
|
||||
async def test_cloud_nio_create_udp(app: FastAPI, compute_client: AsyncClient, compute_project: Project, vm: dict) -> None:
|
||||
|
||||
params = {"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"}
|
||||
|
||||
url = app.url_path_for("compute:create_cloud_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["type"] == "nio_udp"
|
||||
|
||||
|
||||
async def test_cloud_nio_update_udp(app: FastAPI, compute_client: AsyncClient, compute_project: Project, vm: dict) -> None:
|
||||
|
||||
params = {"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"}
|
||||
|
||||
url = app.url_path_for("compute:create_cloud_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
await compute_client.post(url, json=params)
|
||||
|
||||
params["filters"] = {}
|
||||
url = app.url_path_for("compute:create_cloud_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
response = await compute_client.put(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["type"] == "nio_udp"
|
||||
|
||||
|
||||
async def test_cloud_delete_nio(app: FastAPI, compute_client: AsyncClient, compute_project: Project, vm: dict) -> None:
|
||||
|
||||
params = {"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"}
|
||||
|
||||
url = app.url_path_for("compute:create_cloud_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
await compute_client.post(url, json=params)
|
||||
|
||||
url = app.url_path_for("compute:delete_cloud_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.cloud.Cloud._start_ubridge"):
|
||||
response = await compute_client.delete(url)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_cloud_delete(app: FastAPI, compute_client: AsyncClient, compute_project: Project, vm: dict) -> None:
|
||||
|
||||
response = await compute_client.delete(app.url_path_for("compute:delete_cloud", project_id=vm["project_id"], node_id=vm["node_id"]))
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_cloud_update(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
response = await compute_client.put(app.url_path_for("compute:update_cloud", project_id=vm["project_id"], node_id=vm["node_id"]),
|
||||
json={"name": "test"})
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json()["name"] == "test"
|
||||
|
||||
|
||||
async def test_cloud_start_capture(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
params = {
|
||||
"capture_file_name": "test.pcap",
|
||||
"data_link_type": "DLT_EN10MB"
|
||||
}
|
||||
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.cloud.Cloud.start_capture") as mock:
|
||||
response = await compute_client.post(app.url_path_for("compute:start_cloud_capture",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0"),
|
||||
json=params)
|
||||
response = await compute_client.get(app.url_path_for("compute:get_cloud", project_id=vm["project_id"], node_id=vm["node_id"]))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert mock.called
|
||||
assert "test.pcap" in response.json()["pcap_file_path"]
|
||||
assert response.json()["name"] == "Cloud 1"
|
||||
assert response.json()["project_id"] == compute_project.id
|
||||
assert response.json()["status"] == "started"
|
||||
|
||||
|
||||
async def test_cloud_stop_capture(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
async def test_cloud_nio_create_udp(
|
||||
self, app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
vm: dict
|
||||
) -> None:
|
||||
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.cloud.Cloud.stop_capture") as mock:
|
||||
response = await compute_client.post(app.url_path_for("compute:stop_cloud_capture",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0"))
|
||||
params = {"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"}
|
||||
|
||||
url = app.url_path_for("compute:create_cloud_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["type"] == "nio_udp"
|
||||
|
||||
|
||||
async def test_cloud_nio_update_udp(
|
||||
self, app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
vm: dict
|
||||
) -> None:
|
||||
|
||||
params = {"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"}
|
||||
|
||||
url = app.url_path_for("compute:create_cloud_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
await compute_client.post(url, json=params)
|
||||
|
||||
params["filters"] = {}
|
||||
url = app.url_path_for("compute:create_cloud_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
response = await compute_client.put(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["type"] == "nio_udp"
|
||||
|
||||
|
||||
async def test_cloud_delete_nio(
|
||||
self, app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
vm: dict
|
||||
) -> None:
|
||||
|
||||
params = {"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"}
|
||||
|
||||
url = app.url_path_for("compute:create_cloud_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
await compute_client.post(url, json=params)
|
||||
|
||||
url = app.url_path_for("compute:delete_cloud_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.cloud.Cloud._start_ubridge"):
|
||||
response = await compute_client.delete(url)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
assert mock.called
|
||||
|
||||
|
||||
# @pytest.mark.asyncio
|
||||
# async def test_cloud_pcap(compute_api, vm, compute_project):
|
||||
#
|
||||
# from itertools import repeat
|
||||
# stream = repeat(42, times=10)
|
||||
#
|
||||
# with asyncio_patch("gns3server.compute.builtin.nodes.cloud.Cloud.get_nio"):
|
||||
# with asyncio_patch("gns3server.compute.builtin.Builtin.stream_pcap_file", return_value=stream):
|
||||
# response = await compute_api.get("/projects/{project_id}/cloud/nodes/{node_id}/adapters/0/ports/0/pcap".format(project_id=compute_project.id, node_id=vm["node_id"]))
|
||||
# assert response.status_code == 200
|
||||
#
|
||||
async def test_cloud_delete(
|
||||
self, app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
vm: dict
|
||||
) -> None:
|
||||
|
||||
response = await compute_client.delete(app.url_path_for("compute:delete_cloud", project_id=vm["project_id"], node_id=vm["node_id"]))
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_cloud_update(
|
||||
self, app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
vm: dict
|
||||
) -> None:
|
||||
|
||||
response = await compute_client.put(app.url_path_for("compute:update_cloud", project_id=vm["project_id"], node_id=vm["node_id"]),
|
||||
json={"name": "test"})
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json()["name"] == "test"
|
||||
|
||||
|
||||
async def test_cloud_start_capture(
|
||||
self, app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
vm: dict
|
||||
) -> None:
|
||||
|
||||
params = {
|
||||
"capture_file_name": "test.pcap",
|
||||
"data_link_type": "DLT_EN10MB"
|
||||
}
|
||||
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.cloud.Cloud.start_capture") as mock:
|
||||
response = await compute_client.post(app.url_path_for("compute:start_cloud_capture",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0"),
|
||||
json=params)
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert mock.called
|
||||
assert "test.pcap" in response.json()["pcap_file_path"]
|
||||
|
||||
|
||||
async def test_cloud_stop_capture(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.cloud.Cloud.stop_capture") as mock:
|
||||
response = await compute_client.post(app.url_path_for("compute:stop_cloud_capture",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0"))
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
assert mock.called
|
||||
|
||||
|
||||
# @pytest.mark.asyncio
|
||||
# async def test_cloud_pcap(self, compute_api, vm, compute_project):
|
||||
#
|
||||
# from itertools import repeat
|
||||
# stream = repeat(42, times=10)
|
||||
#
|
||||
# with asyncio_patch("gns3server.compute.builtin.nodes.cloud.Cloud.get_nio"):
|
||||
# with asyncio_patch("gns3server.compute.builtin.Builtin.stream_pcap_file", return_value=stream):
|
||||
# response = await compute_api.get("/projects/{project_id}/cloud/nodes/{node_id}/adapters/0/ports/0/pcap".format(project_id=compute_project.id, node_id=vm["node_id"]))
|
||||
# assert response.status_code == 200
|
||||
#
|
||||
|
@ -26,41 +26,48 @@ from gns3server.compute.project import Project
|
||||
pytestmark = pytest.mark.asyncio
|
||||
|
||||
|
||||
async def test_udp_allocation(app: FastAPI, compute_client: AsyncClient, compute_project: Project) -> None:
|
||||
class TestComputeRoutes:
|
||||
|
||||
response = await compute_client.post(app.url_path_for("compute:allocate_udp_port", project_id=compute_project.id), json={})
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()['udp_port'] is not None
|
||||
async def test_udp_allocation(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project
|
||||
) -> None:
|
||||
|
||||
response = await compute_client.post(app.url_path_for("compute:allocate_udp_port", project_id=compute_project.id), json={})
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()['udp_port'] is not None
|
||||
|
||||
|
||||
async def test_interfaces(app: FastAPI, compute_client: AsyncClient) -> None:
|
||||
async def test_interfaces(self, app: FastAPI, compute_client: AsyncClient) -> None:
|
||||
|
||||
response = await compute_client.get(app.url_path_for("compute:network_interfaces"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert isinstance(response.json(), list)
|
||||
response = await compute_client.get(app.url_path_for("compute:network_interfaces"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert isinstance(response.json(), list)
|
||||
|
||||
|
||||
async def test_version_output(app: FastAPI, compute_client: AsyncClient) -> None:
|
||||
async def test_version_output(self, app: FastAPI, compute_client: AsyncClient) -> None:
|
||||
|
||||
response = await compute_client.get(app.url_path_for("compute:compute_version"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json() == {'version': __version__}
|
||||
response = await compute_client.get(app.url_path_for("compute:compute_version"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json() == {'version': __version__}
|
||||
|
||||
|
||||
async def test_compute_authentication(app: FastAPI, compute_client: AsyncClient) -> None:
|
||||
async def test_compute_authentication(self, app: FastAPI, compute_client: AsyncClient) -> None:
|
||||
|
||||
response = await compute_client.get(app.url_path_for("compute:compute_version"), auth=("admin", "invalid_password"))
|
||||
assert response.status_code == status.HTTP_401_UNAUTHORIZED
|
||||
response = await compute_client.get(app.url_path_for("compute:compute_version"), auth=("admin", "invalid_password"))
|
||||
assert response.status_code == status.HTTP_401_UNAUTHORIZED
|
||||
|
||||
|
||||
# @pytest.mark.asyncio
|
||||
# async def test_debug_output(compute_api):
|
||||
#
|
||||
# response = await compute_api.get('/debug')
|
||||
# assert response.status_code == 200
|
||||
# @pytest.mark.asyncio
|
||||
# async def test_debug_output(compute_api):
|
||||
#
|
||||
# response = await compute_api.get('/debug')
|
||||
# assert response.status_code == 200
|
||||
|
||||
|
||||
async def test_statistics_output(app: FastAPI, compute_client: AsyncClient) -> None:
|
||||
async def test_statistics_output(self, app: FastAPI, compute_client: AsyncClient) -> None:
|
||||
|
||||
response = await compute_client.get(app.url_path_for("compute:compute_statistics"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
response = await compute_client.get(app.url_path_for("compute:compute_statistics"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
|
@ -25,285 +25,299 @@ from unittest.mock import patch
|
||||
|
||||
from gns3server.compute.project import Project
|
||||
|
||||
pytestmark = [pytest.mark.asyncio]
|
||||
pytestmark = pytest.mark.asyncio
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def base_params() -> dict:
|
||||
"""Return standard parameters"""
|
||||
class TestDockerNodesRoutes:
|
||||
|
||||
params = {
|
||||
"name": "DOCKER-TEST-1",
|
||||
"image": "nginx",
|
||||
"start_command": "nginx-daemon",
|
||||
"adapters": 2,
|
||||
"environment": "YES=1\nNO=0",
|
||||
"console_type": "telnet",
|
||||
"console_resolution": "1280x1024",
|
||||
"extra_hosts": "test:127.0.0.1"
|
||||
}
|
||||
return params
|
||||
@pytest.fixture
|
||||
def base_params(self) -> dict:
|
||||
"""Return standard parameters"""
|
||||
|
||||
params = {
|
||||
"name": "DOCKER-TEST-1",
|
||||
"image": "nginx",
|
||||
"start_command": "nginx-daemon",
|
||||
"adapters": 2,
|
||||
"environment": "YES=1\nNO=0",
|
||||
"console_type": "telnet",
|
||||
"console_resolution": "1280x1024",
|
||||
"extra_hosts": "test:127.0.0.1"
|
||||
}
|
||||
return params
|
||||
|
||||
|
||||
# @pytest.yield_fixture(autouse=True)
|
||||
# def mock_connection():
|
||||
#
|
||||
# docker = Docker.instance()
|
||||
# docker._connected = True
|
||||
# docker._connector = MagicMock()
|
||||
# yield
|
||||
# Docker._instance = None
|
||||
# @pytest.yield_fixture(autouse=True)
|
||||
# def mock_connection():
|
||||
#
|
||||
# docker = Docker.instance()
|
||||
# docker._connected = True
|
||||
# docker._connector = MagicMock()
|
||||
# yield
|
||||
# Docker._instance = None
|
||||
|
||||
|
||||
@pytest_asyncio.fixture
|
||||
async def vm(app: FastAPI, compute_client: AsyncClient, compute_project: Project, base_params: dict) -> dict:
|
||||
@pytest_asyncio.fixture
|
||||
async def vm(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
base_params: dict
|
||||
) -> dict:
|
||||
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "nginx"}]):
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value={"Id": "8bd8153ea8f5"}):
|
||||
with asyncio_patch("gns3server.compute.docker.DockerVM._get_container_state", return_value="exited"):
|
||||
response = await compute_client.post(app.url_path_for("compute:create_docker_node", project_id=compute_project.id),
|
||||
json=base_params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
return response.json()
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "nginx"}]):
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value={"Id": "8bd8153ea8f5"}):
|
||||
with asyncio_patch("gns3server.compute.docker.DockerVM._get_container_state", return_value="exited"):
|
||||
response = await compute_client.post(app.url_path_for("compute:create_docker_node", project_id=compute_project.id),
|
||||
json=base_params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
return response.json()
|
||||
|
||||
|
||||
async def test_docker_create(app: FastAPI, compute_client: AsyncClient, compute_project: Project, base_params: dict) -> None:
|
||||
async def test_docker_create(
|
||||
self, app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
base_params: dict
|
||||
) -> None:
|
||||
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "nginx"}]):
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value={"Id": "8bd8153ea8f5"}):
|
||||
response = await compute_client.post(
|
||||
app.url_path_for("compute:create_docker_node", project_id=compute_project.id), json=base_params
|
||||
)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["name"] == "DOCKER-TEST-1"
|
||||
assert response.json()["project_id"] == compute_project.id
|
||||
assert response.json()["container_id"] == "8bd8153ea8f5"
|
||||
assert response.json()["image"] == "nginx:latest"
|
||||
assert response.json()["adapters"] == 2
|
||||
assert response.json()["environment"] == "YES=1\nNO=0"
|
||||
assert response.json()["console_resolution"] == "1280x1024"
|
||||
assert response.json()["extra_hosts"] == "test:127.0.0.1"
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "nginx"}]):
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value={"Id": "8bd8153ea8f5"}):
|
||||
response = await compute_client.post(
|
||||
app.url_path_for("compute:create_docker_node", project_id=compute_project.id), json=base_params
|
||||
)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["name"] == "DOCKER-TEST-1"
|
||||
assert response.json()["project_id"] == compute_project.id
|
||||
assert response.json()["container_id"] == "8bd8153ea8f5"
|
||||
assert response.json()["image"] == "nginx:latest"
|
||||
assert response.json()["adapters"] == 2
|
||||
assert response.json()["environment"] == "YES=1\nNO=0"
|
||||
assert response.json()["console_resolution"] == "1280x1024"
|
||||
assert response.json()["extra_hosts"] == "test:127.0.0.1"
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"name, status_code",
|
||||
(
|
||||
("valid-name.com", status.HTTP_201_CREATED),
|
||||
("42name", status.HTTP_201_CREATED),
|
||||
("424242", status.HTTP_409_CONFLICT),
|
||||
("name42", status.HTTP_201_CREATED),
|
||||
("name.424242", status.HTTP_409_CONFLICT),
|
||||
("-name", status.HTTP_409_CONFLICT),
|
||||
("name%-test", status.HTTP_409_CONFLICT),
|
||||
("x" * 63, status.HTTP_201_CREATED),
|
||||
("x" * 64, status.HTTP_409_CONFLICT),
|
||||
(("x" * 62 + ".") * 4, status.HTTP_201_CREATED),
|
||||
("xx" + ("x" * 62 + ".") * 4, status.HTTP_409_CONFLICT),
|
||||
),
|
||||
)
|
||||
async def test_docker_create_with_invalid_name(
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
base_params: dict,
|
||||
name: str,
|
||||
status_code: int
|
||||
) -> None:
|
||||
@pytest.mark.parametrize(
|
||||
"name, status_code",
|
||||
(
|
||||
("valid-name.com", status.HTTP_201_CREATED),
|
||||
("42name", status.HTTP_201_CREATED),
|
||||
("424242", status.HTTP_409_CONFLICT),
|
||||
("name42", status.HTTP_201_CREATED),
|
||||
("name.424242", status.HTTP_409_CONFLICT),
|
||||
("-name", status.HTTP_409_CONFLICT),
|
||||
("name%-test", status.HTTP_409_CONFLICT),
|
||||
("x" * 63, status.HTTP_201_CREATED),
|
||||
("x" * 64, status.HTTP_409_CONFLICT),
|
||||
(("x" * 62 + ".") * 4, status.HTTP_201_CREATED),
|
||||
("xx" + ("x" * 62 + ".") * 4, status.HTTP_409_CONFLICT),
|
||||
),
|
||||
)
|
||||
async def test_docker_create_with_invalid_name(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
base_params: dict,
|
||||
name: str,
|
||||
status_code: int
|
||||
) -> None:
|
||||
|
||||
base_params["name"] = name
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "nginx"}]):
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value={"Id": "8bd8153ea8f5"}):
|
||||
response = await compute_client.post(
|
||||
app.url_path_for("compute:create_docker_node", project_id=compute_project.id), json=base_params
|
||||
)
|
||||
assert response.status_code == status_code
|
||||
base_params["name"] = name
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "nginx"}]):
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value={"Id": "8bd8153ea8f5"}):
|
||||
response = await compute_client.post(
|
||||
app.url_path_for("compute:create_docker_node", project_id=compute_project.id), json=base_params
|
||||
)
|
||||
assert response.status_code == status_code
|
||||
|
||||
|
||||
async def test_docker_start(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
async def test_docker_start(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.start", return_value=True) as mock:
|
||||
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.start", return_value=True) as mock:
|
||||
|
||||
response = await compute_client.post(app.url_path_for("compute:start_docker_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]))
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_docker_stop(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.stop", return_value=True) as mock:
|
||||
response = await compute_client.post(app.url_path_for("compute:stop_docker_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]))
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_docker_reload(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.restart", return_value=True) as mock:
|
||||
response = await compute_client.post(app.url_path_for("compute:reload_docker_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]))
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_docker_delete(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.delete", return_value=True) as mock:
|
||||
response = await compute_client.delete(app.url_path_for("compute:delete_docker_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]))
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_docker_pause(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.pause", return_value=True) as mock:
|
||||
response = await compute_client.post(app.url_path_for("compute:pause_docker_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]))
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_docker_unpause(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.unpause", return_value=True) as mock:
|
||||
response = await compute_client.post(app.url_path_for("compute:unpause_docker_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]))
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_docker_nio_create_udp(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
params = {
|
||||
"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"}
|
||||
|
||||
url = app.url_path_for("compute:create_docker_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["type"] == "nio_udp"
|
||||
|
||||
|
||||
async def test_docker_update_nio(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
params = {
|
||||
"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"
|
||||
}
|
||||
|
||||
url = app.url_path_for("compute:create_docker_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
|
||||
url = app.url_path_for("compute:update_docker_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.adapter_update_nio_binding"):
|
||||
response = await compute_client.put(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
|
||||
|
||||
async def test_docker_delete_nio(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
url = app.url_path_for("compute:delete_docker_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.adapter_remove_nio_binding"):
|
||||
response = await compute_client.delete(url)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_docker_update(app: FastAPI, compute_client: AsyncClient, vm: dict, free_console_port: int) -> None:
|
||||
|
||||
params = {
|
||||
"name": "test",
|
||||
"console": free_console_port,
|
||||
"start_command": "yes",
|
||||
"environment": "GNS3=1\nGNS4=0",
|
||||
"extra_hosts": "test:127.0.0.1"
|
||||
}
|
||||
|
||||
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.update") as mock:
|
||||
response = await compute_client.put(app.url_path_for("compute:update_docker_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]), json=params)
|
||||
|
||||
assert response.status_code == 200
|
||||
assert mock.called
|
||||
assert response.json()["name"] == "test"
|
||||
assert response.json()["console"] == free_console_port
|
||||
assert response.json()["start_command"] == "yes"
|
||||
assert response.json()["environment"] == "GNS3=1\nGNS4=0"
|
||||
assert response.json()["extra_hosts"] == "test:127.0.0.1"
|
||||
|
||||
|
||||
async def test_docker_start_capture(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
url = app.url_path_for("compute:start_docker_node_capture",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
|
||||
with patch("gns3server.compute.docker.docker_vm.DockerVM.is_running", return_value=True):
|
||||
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.start_capture") as mock:
|
||||
params = {"capture_file_name": "test.pcap", "data_link_type": "DLT_EN10MB"}
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
response = await compute_client.post(app.url_path_for("compute:start_docker_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]))
|
||||
assert mock.called
|
||||
assert "test.pcap" in response.json()["pcap_file_path"]
|
||||
|
||||
|
||||
async def test_docker_stop_capture(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
url = app.url_path_for("compute:stop_docker_node_capture",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
|
||||
with patch("gns3server.compute.docker.docker_vm.DockerVM.is_running", return_value=True):
|
||||
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.stop_capture") as mock:
|
||||
response = await compute_client.post(url)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_docker_stop(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.stop", return_value=True) as mock:
|
||||
response = await compute_client.post(app.url_path_for("compute:stop_docker_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]))
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_docker_duplicate(app: FastAPI, compute_client: AsyncClient, vm: dict, base_params: dict) -> None:
|
||||
async def test_docker_reload(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
# create destination node first
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "nginx"}]):
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value={"Id": "8bd8153ea8f5"}):
|
||||
response = await compute_client.post(app.url_path_for("compute:create_docker_node",
|
||||
project_id=vm["project_id"]), json=base_params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.restart", return_value=True) as mock:
|
||||
response = await compute_client.post(app.url_path_for("compute:reload_docker_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]))
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
params = {"destination_node_id": response.json()["node_id"]}
|
||||
response = await compute_client.post(app.url_path_for("compute:duplicate_docker_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]), json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
|
||||
async def test_docker_delete(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.delete", return_value=True) as mock:
|
||||
response = await compute_client.delete(app.url_path_for("compute:delete_docker_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]))
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_docker_pause(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.pause", return_value=True) as mock:
|
||||
response = await compute_client.post(app.url_path_for("compute:pause_docker_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]))
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_docker_unpause(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.unpause", return_value=True) as mock:
|
||||
response = await compute_client.post(app.url_path_for("compute:unpause_docker_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]))
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_docker_nio_create_udp(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
params = {
|
||||
"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"}
|
||||
|
||||
url = app.url_path_for("compute:create_docker_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["type"] == "nio_udp"
|
||||
|
||||
|
||||
async def test_docker_update_nio(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
params = {
|
||||
"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"
|
||||
}
|
||||
|
||||
url = app.url_path_for("compute:create_docker_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
|
||||
url = app.url_path_for("compute:update_docker_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.adapter_update_nio_binding"):
|
||||
response = await compute_client.put(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
|
||||
|
||||
async def test_docker_delete_nio(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
url = app.url_path_for("compute:delete_docker_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.adapter_remove_nio_binding"):
|
||||
response = await compute_client.delete(url)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_docker_update(self, app: FastAPI, compute_client: AsyncClient, vm: dict, free_console_port: int) -> None:
|
||||
|
||||
params = {
|
||||
"name": "test",
|
||||
"console": free_console_port,
|
||||
"start_command": "yes",
|
||||
"environment": "GNS3=1\nGNS4=0",
|
||||
"extra_hosts": "test:127.0.0.1"
|
||||
}
|
||||
|
||||
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.update") as mock:
|
||||
response = await compute_client.put(app.url_path_for("compute:update_docker_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]), json=params)
|
||||
|
||||
assert response.status_code == 200
|
||||
assert mock.called
|
||||
assert response.json()["name"] == "test"
|
||||
assert response.json()["console"] == free_console_port
|
||||
assert response.json()["start_command"] == "yes"
|
||||
assert response.json()["environment"] == "GNS3=1\nGNS4=0"
|
||||
assert response.json()["extra_hosts"] == "test:127.0.0.1"
|
||||
|
||||
|
||||
async def test_docker_start_capture(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
url = app.url_path_for("compute:start_docker_node_capture",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
|
||||
with patch("gns3server.compute.docker.docker_vm.DockerVM.is_running", return_value=True):
|
||||
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.start_capture") as mock:
|
||||
params = {"capture_file_name": "test.pcap", "data_link_type": "DLT_EN10MB"}
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert mock.called
|
||||
assert "test.pcap" in response.json()["pcap_file_path"]
|
||||
|
||||
|
||||
async def test_docker_stop_capture(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
url = app.url_path_for("compute:stop_docker_node_capture",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
|
||||
with patch("gns3server.compute.docker.docker_vm.DockerVM.is_running", return_value=True):
|
||||
with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.stop_capture") as mock:
|
||||
response = await compute_client.post(url)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
assert mock.called
|
||||
|
||||
|
||||
async def test_docker_duplicate(self, app: FastAPI, compute_client: AsyncClient, vm: dict, base_params: dict) -> None:
|
||||
|
||||
# create destination node first
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "nginx"}]):
|
||||
with asyncio_patch("gns3server.compute.docker.Docker.query", return_value={"Id": "8bd8153ea8f5"}):
|
||||
response = await compute_client.post(app.url_path_for("compute:create_docker_node",
|
||||
project_id=vm["project_id"]), json=base_params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
|
||||
params = {"destination_node_id": response.json()["node_id"]}
|
||||
response = await compute_client.post(app.url_path_for("compute:duplicate_docker_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]), json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
|
@ -26,196 +26,208 @@ from httpx import AsyncClient
|
||||
|
||||
pytestmark = pytest.mark.asyncio
|
||||
|
||||
# @pytest.yield_fixture(scope="module")
|
||||
# async def vm(compute_api, compute_project, fake_image):
|
||||
#
|
||||
# dynamips_path = "/fake/dynamips"
|
||||
# params = {
|
||||
# "name": "My router",
|
||||
# "platform": "c3745",
|
||||
# "image": fake_image,
|
||||
# "ram": 128
|
||||
# }
|
||||
# with asyncio_patch("gns3server.compute.dynamips.nodes.router.Router.create", return_value=True) as mock:
|
||||
# response = await compute_api.post("/projects/{project_id}/dynamips/nodes".format(project_id=compute_project.id), params)
|
||||
# assert mock.called
|
||||
# assert response.status == 201
|
||||
#
|
||||
# #with asyncio_patch("gns3server.compute.dynamips.Dynamips.find_dynamips", return_value=dynamips_path):
|
||||
# # yield response.json
|
||||
|
||||
class TestDynamipsNodesRoutes:
|
||||
|
||||
# @pytest.yield_fixture(scope="module")
|
||||
# async def vm(compute_api, compute_project, fake_image):
|
||||
#
|
||||
# dynamips_path = "/fake/dynamips"
|
||||
# params = {
|
||||
# "name": "My router",
|
||||
# "platform": "c3745",
|
||||
# "image": fake_image,
|
||||
# "ram": 128
|
||||
# }
|
||||
# with asyncio_patch("gns3server.compute.dynamips.nodes.router.Router.create", return_value=True) as mock:
|
||||
# response = await compute_api.post("/projects/{project_id}/dynamips/nodes".format(project_id=compute_project.id), params)
|
||||
# assert mock.called
|
||||
# assert response.status == 201
|
||||
#
|
||||
# #with asyncio_patch("gns3server.compute.dynamips.Dynamips.find_dynamips", return_value=dynamips_path):
|
||||
# # yield response.json
|
||||
|
||||
|
||||
# async def test_dynamips_vm_create(compute_api, compute_project, fake_image):
|
||||
#
|
||||
# params = {
|
||||
# "name": "My router",
|
||||
# "platform": "c3745",
|
||||
# "image": os.path.basename(fake_image),
|
||||
# "ram": 128
|
||||
# }
|
||||
#
|
||||
# print(fake_image)
|
||||
#
|
||||
# with asyncio_patch("gns3server.compute.dynamips.nodes.router.Router.create", return_value=True):
|
||||
# response = await compute_api.post("/projects/{project_id}/dynamips/nodes".format(project_id=compute_project.id), params)
|
||||
# assert response.status == 201
|
||||
# assert response.json["name"] == "My router"
|
||||
# assert response.json["project_id"] == compute_project.id
|
||||
# assert response.json["dynamips_id"]
|
||||
# async def test_dynamips_vm_create(compute_api, compute_project, fake_image):
|
||||
#
|
||||
# params = {
|
||||
# "name": "My router",
|
||||
# "platform": "c3745",
|
||||
# "image": os.path.basename(fake_image),
|
||||
# "ram": 128
|
||||
# }
|
||||
#
|
||||
# print(fake_image)
|
||||
#
|
||||
# with asyncio_patch("gns3server.compute.dynamips.nodes.router.Router.create", return_value=True):
|
||||
# response = await compute_api.post("/projects/{project_id}/dynamips/nodes".format(project_id=compute_project.id), params)
|
||||
# assert response.status == 201
|
||||
# assert response.json["name"] == "My router"
|
||||
# assert response.json["project_id"] == compute_project.id
|
||||
# assert response.json["dynamips_id"]
|
||||
|
||||
|
||||
# def test_dynamips_vm_get(compute_api, project, vm):
|
||||
# response = compute_api.get("/projects/{project_id}/dynamips/nodes/{node_id}".format(project_id=vm["project_id"], node_id=vm["node_id"]), example=True)
|
||||
# assert response.status == 200
|
||||
# assert response.route == "/projects/{project_id}/dynamips/nodes/{node_id}"
|
||||
# assert response.json["name"] == "My router"
|
||||
# assert response.json["project_id"] == project.id
|
||||
#
|
||||
#
|
||||
# def test_dynamips_vm_start(compute_api, vm):
|
||||
# with asyncio_patch("gns3server.compute.dynamips.nodes.router.Router.start", return_value=True) as mock:
|
||||
# response = compute_api.post("/projects/{project_id}/dynamips/nodes/{node_id}/start".format(project_id=vm["project_id"], node_id=vm["node_id"]))
|
||||
# assert mock.called
|
||||
# assert response.status == 204
|
||||
#
|
||||
#
|
||||
# def test_dynamips_vm_stop(compute_api, vm):
|
||||
# with asyncio_patch("gns3server.compute.dynamips.nodes.router.Router.stop", return_value=True) as mock:
|
||||
# response = compute_api.post("/projects/{project_id}/dynamips/nodes/{node_id}/stop".format(project_id=vm["project_id"], node_id=vm["node_id"]))
|
||||
# assert mock.called
|
||||
# assert response.status == 204
|
||||
#
|
||||
#
|
||||
# def test_dynamips_vm_suspend(compute_api, vm):
|
||||
# with asyncio_patch("gns3server.compute.dynamips.nodes.router.Router.suspend", return_value=True) as mock:
|
||||
# response = compute_api.post("/projects/{project_id}/dynamips/nodes/{node_id}/suspend".format(project_id=vm["project_id"], node_id=vm["node_id"]))
|
||||
# assert mock.called
|
||||
# assert response.status == 204
|
||||
#
|
||||
#
|
||||
# def test_dynamips_vm_resume(compute_api, vm):
|
||||
# with asyncio_patch("gns3server.compute.dynamips.nodes.router.Router.resume", return_value=True) as mock:
|
||||
# response = compute_api.post("/projects/{project_id}/dynamips/nodes/{node_id}/resume".format(project_id=vm["project_id"], node_id=vm["node_id"]))
|
||||
# assert mock.called
|
||||
# assert response.status == 204
|
||||
# def test_dynamips_vm_get(compute_api, project, vm):
|
||||
# response = compute_api.get("/projects/{project_id}/dynamips/nodes/{node_id}".format(project_id=vm["project_id"], node_id=vm["node_id"]), example=True)
|
||||
# assert response.status == 200
|
||||
# assert response.route == "/projects/{project_id}/dynamips/nodes/{node_id}"
|
||||
# assert response.json["name"] == "My router"
|
||||
# assert response.json["project_id"] == project.id
|
||||
#
|
||||
#
|
||||
# def test_dynamips_vm_start(compute_api, vm):
|
||||
# with asyncio_patch("gns3server.compute.dynamips.nodes.router.Router.start", return_value=True) as mock:
|
||||
# response = compute_api.post("/projects/{project_id}/dynamips/nodes/{node_id}/start".format(project_id=vm["project_id"], node_id=vm["node_id"]))
|
||||
# assert mock.called
|
||||
# assert response.status == 204
|
||||
#
|
||||
#
|
||||
# def test_dynamips_vm_stop(compute_api, vm):
|
||||
# with asyncio_patch("gns3server.compute.dynamips.nodes.router.Router.stop", return_value=True) as mock:
|
||||
# response = compute_api.post("/projects/{project_id}/dynamips/nodes/{node_id}/stop".format(project_id=vm["project_id"], node_id=vm["node_id"]))
|
||||
# assert mock.called
|
||||
# assert response.status == 204
|
||||
#
|
||||
#
|
||||
# def test_dynamips_vm_suspend(compute_api, vm):
|
||||
# with asyncio_patch("gns3server.compute.dynamips.nodes.router.Router.suspend", return_value=True) as mock:
|
||||
# response = compute_api.post("/projects/{project_id}/dynamips/nodes/{node_id}/suspend".format(project_id=vm["project_id"], node_id=vm["node_id"]))
|
||||
# assert mock.called
|
||||
# assert response.status == 204
|
||||
#
|
||||
#
|
||||
# def test_dynamips_vm_resume(compute_api, vm):
|
||||
# with asyncio_patch("gns3server.compute.dynamips.nodes.router.Router.resume", return_value=True) as mock:
|
||||
# response = compute_api.post("/projects/{project_id}/dynamips/nodes/{node_id}/resume".format(project_id=vm["project_id"], node_id=vm["node_id"]))
|
||||
# assert mock.called
|
||||
# assert response.status == 204
|
||||
|
||||
|
||||
# def test_vbox_nio_create_udp(compute_api, vm):
|
||||
#
|
||||
# with asyncio_patch('gns3server.compute.virtualbox.virtualbox_vm.VirtualBoxVM.adapter_add_nio_binding') as mock:
|
||||
# response = compute_api.post("/projects/{project_id}/virtualbox/nodes/{node_id}/adapters/0/nio".format(project_id=vm["project_id"],
|
||||
# node_id=vm["node_id"]), {"type": "nio_udp",
|
||||
# "lport": 4242,
|
||||
# "rport": 4343,
|
||||
# "rhost": "127.0.0.1"},
|
||||
# example=True)
|
||||
#
|
||||
# assert mock.called
|
||||
# args, kwgars = mock.call_args
|
||||
# assert args[0] == 0
|
||||
#
|
||||
# assert response.status == 201
|
||||
# assert response.route == "/projects/{project_id}/virtualbox/nodes/{node_id}/adapters/{adapter_id:\d+}/nio"
|
||||
# assert response.json["type"] == "nio_udp"
|
||||
#
|
||||
#
|
||||
# def test_vbox_delete_nio(compute_api, vm):
|
||||
#
|
||||
# with asyncio_patch('gns3server.compute.virtualbox.virtualbox_vm.VirtualBoxVM.adapter_remove_nio_binding') as mock:
|
||||
# response = compute_api.delete("/projects/{project_id}/virtualbox/nodes/{node_id}/adapters/0/nio".format(project_id=vm["project_id"], node_id=vm["node_id"]), example=True)
|
||||
#
|
||||
# assert mock.called
|
||||
# args, kwgars = mock.call_args
|
||||
# assert args[0] == 0
|
||||
#
|
||||
# assert response.status == 204
|
||||
# assert response.route == "/projects/{project_id}/virtualbox/nodes/{node_id}/adapters/{adapter_id:\d+}/nio"
|
||||
#
|
||||
#
|
||||
# def test_vbox_update(compute_api, vm, free_console_port):
|
||||
# response = compute_api.put("/projects/{project_id}/virtualbox/nodes/{node_id}".format(project_id=vm["project_id"], node_id=vm["node_id"]), {"name": "test",
|
||||
# "console": free_console_port})
|
||||
# assert response.status == 200
|
||||
# assert response.json["name"] == "test"
|
||||
# assert response.json["console"] == free_console_port
|
||||
# def test_vbox_nio_create_udp(compute_api, vm):
|
||||
#
|
||||
# with asyncio_patch('gns3server.compute.virtualbox.virtualbox_vm.VirtualBoxVM.adapter_add_nio_binding') as mock:
|
||||
# response = compute_api.post("/projects/{project_id}/virtualbox/nodes/{node_id}/adapters/0/nio".format(project_id=vm["project_id"],
|
||||
# node_id=vm["node_id"]), {"type": "nio_udp",
|
||||
# "lport": 4242,
|
||||
# "rport": 4343,
|
||||
# "rhost": "127.0.0.1"},
|
||||
# example=True)
|
||||
#
|
||||
# assert mock.called
|
||||
# args, kwgars = mock.call_args
|
||||
# assert args[0] == 0
|
||||
#
|
||||
# assert response.status == 201
|
||||
# assert response.route == "/projects/{project_id}/virtualbox/nodes/{node_id}/adapters/{adapter_id:\d+}/nio"
|
||||
# assert response.json["type"] == "nio_udp"
|
||||
#
|
||||
#
|
||||
# def test_vbox_delete_nio(compute_api, vm):
|
||||
#
|
||||
# with asyncio_patch('gns3server.compute.virtualbox.virtualbox_vm.VirtualBoxVM.adapter_remove_nio_binding') as mock:
|
||||
# response = compute_api.delete("/projects/{project_id}/virtualbox/nodes/{node_id}/adapters/0/nio".format(project_id=vm["project_id"], node_id=vm["node_id"]), example=True)
|
||||
#
|
||||
# assert mock.called
|
||||
# args, kwgars = mock.call_args
|
||||
# assert args[0] == 0
|
||||
#
|
||||
# assert response.status == 204
|
||||
# assert response.route == "/projects/{project_id}/virtualbox/nodes/{node_id}/adapters/{adapter_id:\d+}/nio"
|
||||
#
|
||||
#
|
||||
# def test_vbox_update(compute_api, vm, free_console_port):
|
||||
# response = compute_api.put("/projects/{project_id}/virtualbox/nodes/{node_id}".format(project_id=vm["project_id"], node_id=vm["node_id"]), {"name": "test",
|
||||
# "console": free_console_port})
|
||||
# assert response.status == 200
|
||||
# assert response.json["name"] == "test"
|
||||
# assert response.json["console"] == free_console_port
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def fake_image(tmpdir) -> str:
|
||||
"""Create a fake Dynamips image on disk"""
|
||||
@pytest.fixture
|
||||
def fake_image(self, tmpdir) -> str:
|
||||
"""Create a fake Dynamips image on disk"""
|
||||
|
||||
path = str(tmpdir / "7200.bin")
|
||||
with open(path, "wb+") as f:
|
||||
f.write(b'\x7fELF\x01\x02\x01')
|
||||
os.chmod(path, stat.S_IREAD)
|
||||
return path
|
||||
path = str(tmpdir / "7200.bin")
|
||||
with open(path, "wb+") as f:
|
||||
f.write(b'\x7fELF\x01\x02\x01')
|
||||
os.chmod(path, stat.S_IREAD)
|
||||
return path
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def fake_file(tmpdir) -> str:
|
||||
"""Create a fake file disk"""
|
||||
@pytest.fixture
|
||||
def fake_file(self, tmpdir) -> str:
|
||||
"""Create a fake file disk"""
|
||||
|
||||
path = str(tmpdir / "7200.txt")
|
||||
with open(path, "w+") as f:
|
||||
f.write('1')
|
||||
os.chmod(path, stat.S_IREAD)
|
||||
return path
|
||||
path = str(tmpdir / "7200.txt")
|
||||
with open(path, "w+") as f:
|
||||
f.write('1')
|
||||
os.chmod(path, stat.S_IREAD)
|
||||
return path
|
||||
|
||||
|
||||
async def test_images(app: FastAPI, compute_client: AsyncClient, tmpdir, fake_image: str, fake_file: str) -> None:
|
||||
async def test_images(
|
||||
self, app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
tmpdir, fake_image: str,
|
||||
fake_file: str
|
||||
) -> None:
|
||||
|
||||
with patch("gns3server.utils.images.default_images_directory", return_value=str(tmpdir)):
|
||||
response = await compute_client.get(app.url_path_for("compute:get_dynamips_images"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json() == [{"filename": "7200.bin",
|
||||
"path": "7200.bin",
|
||||
"filesize": 7,
|
||||
"md5sum": "b0d5aa897d937aced5a6b1046e8f7e2e"}]
|
||||
with patch("gns3server.utils.images.default_images_directory", return_value=str(tmpdir)):
|
||||
response = await compute_client.get(app.url_path_for("compute:get_dynamips_images"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json() == [{"filename": "7200.bin",
|
||||
"path": "7200.bin",
|
||||
"filesize": 7,
|
||||
"md5sum": "b0d5aa897d937aced5a6b1046e8f7e2e"}]
|
||||
|
||||
|
||||
async def test_upload_image(app: FastAPI, compute_client: AsyncClient, images_dir: str) -> None:
|
||||
async def test_upload_image(self, app: FastAPI, compute_client: AsyncClient, images_dir: str) -> None:
|
||||
|
||||
response = await compute_client.post(app.url_path_for("compute:upload_dynamips_image", filename="test2"), content=b"TEST")
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
response = await compute_client.post(app.url_path_for("compute:upload_dynamips_image", filename="test2"), content=b"TEST")
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
with open(os.path.join(images_dir, "IOS", "test2")) as f:
|
||||
assert f.read() == "TEST"
|
||||
with open(os.path.join(images_dir, "IOS", "test2")) as f:
|
||||
assert f.read() == "TEST"
|
||||
|
||||
with open(os.path.join(images_dir, "IOS", "test2.md5sum")) as f:
|
||||
checksum = f.read()
|
||||
assert checksum == "033bd94b1168d7e4f0d644c3c95e35bf"
|
||||
with open(os.path.join(images_dir, "IOS", "test2.md5sum")) as f:
|
||||
checksum = f.read()
|
||||
assert checksum == "033bd94b1168d7e4f0d644c3c95e35bf"
|
||||
|
||||
|
||||
async def test_upload_image_forbidden_location(app: FastAPI, compute_client: AsyncClient) -> None:
|
||||
async def test_upload_image_forbidden_location(self, app: FastAPI, compute_client: AsyncClient) -> None:
|
||||
|
||||
file_path = "%2e%2e/hello"
|
||||
response = await compute_client.post(app.url_path_for("compute:upload_dynamips_image", filename=file_path), content=b"TEST")
|
||||
assert response.status_code == status.HTTP_403_FORBIDDEN
|
||||
file_path = "%2e%2e/hello"
|
||||
response = await compute_client.post(app.url_path_for("compute:upload_dynamips_image", filename=file_path), content=b"TEST")
|
||||
assert response.status_code == status.HTTP_403_FORBIDDEN
|
||||
|
||||
|
||||
async def test_download_image(app: FastAPI, compute_client: AsyncClient, images_dir: str) -> None:
|
||||
async def test_download_image(self, app: FastAPI, compute_client: AsyncClient, images_dir: str) -> None:
|
||||
|
||||
response = await compute_client.post(app.url_path_for("compute:upload_dynamips_image", filename="test3"), content=b"TEST")
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
response = await compute_client.post(app.url_path_for("compute:upload_dynamips_image", filename="test3"), content=b"TEST")
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
response = await compute_client.get(app.url_path_for("compute:download_dynamips_image", filename="test3"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
response = await compute_client.get(app.url_path_for("compute:download_dynamips_image", filename="test3"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
|
||||
|
||||
async def test_download_image_forbidden(app: FastAPI, compute_client: AsyncClient, tmpdir) -> None:
|
||||
async def test_download_image_forbidden(self, app: FastAPI, compute_client: AsyncClient, tmpdir) -> None:
|
||||
|
||||
file_path = "foo/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd"
|
||||
response = await compute_client.get(app.url_path_for("compute:download_dynamips_image", filename=file_path))
|
||||
assert response.status_code == status.HTTP_403_FORBIDDEN
|
||||
file_path = "foo/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd"
|
||||
response = await compute_client.get(app.url_path_for("compute:download_dynamips_image", filename=file_path))
|
||||
assert response.status_code == status.HTTP_403_FORBIDDEN
|
||||
|
||||
|
||||
@pytest.mark.skipif(os.getuid() == 0, reason="Root can delete any image")
|
||||
async def test_upload_image_permission_denied(app: FastAPI, compute_client: AsyncClient, images_dir: str) -> None:
|
||||
@pytest.mark.skipif(os.getuid() == 0, reason="Root can delete any image")
|
||||
async def test_upload_image_permission_denied(
|
||||
self, app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
images_dir: str
|
||||
) -> None:
|
||||
|
||||
os.makedirs(os.path.join(images_dir, "IOS"), exist_ok=True)
|
||||
with open(os.path.join(images_dir, "IOS", "test2.tmp"), "w+") as f:
|
||||
f.write("")
|
||||
os.chmod(os.path.join(images_dir, "IOS", "test2.tmp"), 0)
|
||||
os.makedirs(os.path.join(images_dir, "IOS"), exist_ok=True)
|
||||
with open(os.path.join(images_dir, "IOS", "test2.tmp"), "w+") as f:
|
||||
f.write("")
|
||||
os.chmod(os.path.join(images_dir, "IOS", "test2.tmp"), 0)
|
||||
|
||||
response = await compute_client.post(app.url_path_for("compute:upload_dynamips_image", filename="test2"), content=b"TEST")
|
||||
assert response.status_code == status.HTTP_409_CONFLICT
|
||||
response = await compute_client.post(app.url_path_for("compute:upload_dynamips_image", filename="test2"), content=b"TEST")
|
||||
assert response.status_code == status.HTTP_409_CONFLICT
|
||||
|
@ -28,427 +28,474 @@ from gns3server.compute.project import Project
|
||||
pytestmark = pytest.mark.asyncio
|
||||
|
||||
|
||||
@pytest_asyncio.fixture
|
||||
async def ethernet_switch(app: FastAPI, compute_client: AsyncClient, compute_project: Project) -> dict:
|
||||
class TestEthernetSwitchNodesRoutes:
|
||||
|
||||
params = {"name": "Ethernet Switch"}
|
||||
with asyncio_patch("gns3server.compute.dynamips.nodes.ethernet_switch.EthernetSwitch.create") as mock:
|
||||
response = await compute_client.post(
|
||||
app.url_path_for("compute:create_ethernet_switch", project_id=compute_project.id),
|
||||
json=params
|
||||
@pytest_asyncio.fixture
|
||||
async def ethernet_switch(self, app: FastAPI, compute_client: AsyncClient, compute_project: Project) -> dict:
|
||||
|
||||
params = {"name": "Ethernet Switch"}
|
||||
with asyncio_patch("gns3server.compute.dynamips.nodes.ethernet_switch.EthernetSwitch.create") as mock:
|
||||
response = await compute_client.post(
|
||||
app.url_path_for("compute:create_ethernet_switch", project_id=compute_project.id),
|
||||
json=params
|
||||
)
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
|
||||
json_response = response.json()
|
||||
node = compute_project.get_node(json_response["node_id"])
|
||||
node._hypervisor = AsyncioMagicMock()
|
||||
node._hypervisor.send = AsyncioMagicMock()
|
||||
node._hypervisor.version = "0.2.16"
|
||||
return json_response
|
||||
|
||||
|
||||
async def test_ethernet_switch_create(
|
||||
self, app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project
|
||||
) -> None:
|
||||
|
||||
params = {"name": "Ethernet Switch 1"}
|
||||
with asyncio_patch("gns3server.compute.dynamips.nodes.ethernet_switch.EthernetSwitch.create") as mock:
|
||||
response = await compute_client.post(
|
||||
app.url_path_for("compute:create_ethernet_switch", project_id=compute_project.id),
|
||||
json=params
|
||||
)
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["name"] == "Ethernet Switch 1"
|
||||
assert response.json()["project_id"] == compute_project.id
|
||||
|
||||
|
||||
async def test_ethernet_switch_get(
|
||||
self, app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
ethernet_switch: dict
|
||||
) -> None:
|
||||
|
||||
response = await compute_client.get(
|
||||
app.url_path_for(
|
||||
"compute:get_ethernet_switch",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"]
|
||||
)
|
||||
)
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
|
||||
json_response = response.json()
|
||||
node = compute_project.get_node(json_response["node_id"])
|
||||
node._hypervisor = AsyncioMagicMock()
|
||||
node._hypervisor.send = AsyncioMagicMock()
|
||||
node._hypervisor.version = "0.2.16"
|
||||
return json_response
|
||||
|
||||
|
||||
async def test_ethernet_switch_create(app: FastAPI, compute_client: AsyncClient, compute_project: Project) -> None:
|
||||
|
||||
params = {"name": "Ethernet Switch 1"}
|
||||
with asyncio_patch("gns3server.compute.dynamips.nodes.ethernet_switch.EthernetSwitch.create") as mock:
|
||||
response = await compute_client.post(
|
||||
app.url_path_for("compute:create_ethernet_switch", project_id=compute_project.id),
|
||||
json=params
|
||||
)
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["name"] == "Ethernet Switch 1"
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json()["name"] == "Ethernet Switch"
|
||||
assert response.json()["project_id"] == compute_project.id
|
||||
assert response.json()["status"] == "started"
|
||||
|
||||
|
||||
async def test_ethernet_switch_get(app: FastAPI, compute_client: AsyncClient, compute_project: Project, ethernet_switch: dict) -> None:
|
||||
async def test_ethernet_switch_duplicate(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
ethernet_switch: dict
|
||||
) -> None:
|
||||
|
||||
response = await compute_client.get(
|
||||
app.url_path_for(
|
||||
"compute:get_ethernet_switch",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"]
|
||||
)
|
||||
)
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json()["name"] == "Ethernet Switch"
|
||||
assert response.json()["project_id"] == compute_project.id
|
||||
assert response.json()["status"] == "started"
|
||||
# create destination switch first
|
||||
params = {"name": "Ethernet Switch 2"}
|
||||
with asyncio_patch("gns3server.compute.dynamips.nodes.ethernet_switch.EthernetSwitch.create") as mock:
|
||||
response = await compute_client.post(
|
||||
app.url_path_for(
|
||||
"compute:create_ethernet_switch",
|
||||
project_id=compute_project.id),
|
||||
json=params
|
||||
)
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
|
||||
|
||||
async def test_ethernet_switch_duplicate(
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
ethernet_switch: dict
|
||||
) -> None:
|
||||
|
||||
# create destination switch first
|
||||
params = {"name": "Ethernet Switch 2"}
|
||||
with asyncio_patch("gns3server.compute.dynamips.nodes.ethernet_switch.EthernetSwitch.create") as mock:
|
||||
params = {"destination_node_id": response.json()["node_id"]}
|
||||
response = await compute_client.post(
|
||||
app.url_path_for(
|
||||
"compute:create_ethernet_switch",
|
||||
project_id=compute_project.id),
|
||||
json=params
|
||||
"compute:duplicate_ethernet_switch",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"]), json=params
|
||||
)
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
|
||||
params = {"destination_node_id": response.json()["node_id"]}
|
||||
response = await compute_client.post(
|
||||
app.url_path_for(
|
||||
"compute:duplicate_ethernet_switch",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"]), json=params
|
||||
|
||||
async def test_ethernet_switch_update(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
ethernet_switch: dict
|
||||
) -> None:
|
||||
|
||||
params = {
|
||||
"name": "test",
|
||||
"console_type": "telnet"
|
||||
}
|
||||
|
||||
response = await compute_client.put(
|
||||
app.url_path_for(
|
||||
"compute:update_ethernet_switch",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"]),
|
||||
json=params
|
||||
)
|
||||
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json()["name"] == "test"
|
||||
node = compute_project.get_node(ethernet_switch["node_id"])
|
||||
node._hypervisor.send.assert_called_with("ethsw rename \"Ethernet Switch\" \"test\"")
|
||||
|
||||
|
||||
async def test_ethernet_switch_update_ports(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
ethernet_switch: dict
|
||||
) -> None:
|
||||
|
||||
port_params = {
|
||||
"ports_mapping": [
|
||||
{
|
||||
"name": "Ethernet0",
|
||||
"port_number": 0,
|
||||
"type": "qinq",
|
||||
"vlan": 1
|
||||
},
|
||||
{
|
||||
"name": "Ethernet1",
|
||||
"port_number": 1,
|
||||
"type": "qinq",
|
||||
"vlan": 2,
|
||||
"ethertype": "0x88A8"
|
||||
},
|
||||
{
|
||||
"name": "Ethernet2",
|
||||
"port_number": 2,
|
||||
"type": "dot1q",
|
||||
"vlan": 3,
|
||||
},
|
||||
{
|
||||
"name": "Ethernet3",
|
||||
"port_number": 3,
|
||||
"type": "access",
|
||||
"vlan": 4,
|
||||
}
|
||||
],
|
||||
}
|
||||
|
||||
response = await compute_client.put(
|
||||
app.url_path_for(
|
||||
"compute:update_ethernet_switch",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"]),
|
||||
json=port_params
|
||||
)
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
|
||||
nio_params = {
|
||||
"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"
|
||||
}
|
||||
|
||||
for port_mapping in port_params["ports_mapping"]:
|
||||
port_number = port_mapping["port_number"]
|
||||
vlan = port_mapping["vlan"]
|
||||
port_type = port_mapping["type"]
|
||||
ethertype = port_mapping.get("ethertype", "")
|
||||
url = app.url_path_for(
|
||||
"compute:create_ethernet_switch_nio",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"],
|
||||
adapter_number="0",
|
||||
port_number=f"{port_number}"
|
||||
)
|
||||
await compute_client.post(url, json=nio_params)
|
||||
|
||||
node = compute_project.get_node(ethernet_switch["node_id"])
|
||||
nio = node.get_nio(port_number)
|
||||
calls = [
|
||||
call.send(f'nio create_udp {nio.name} 4242 127.0.0.1 4343'),
|
||||
call.send(f'ethsw add_nio "Ethernet Switch" {nio.name}'),
|
||||
call.send(f'ethsw set_{port_type}_port "Ethernet Switch" {nio.name} {vlan} {ethertype}'.strip())
|
||||
]
|
||||
node._hypervisor.send.assert_has_calls(calls)
|
||||
node._hypervisor.send.reset_mock()
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"ports_settings",
|
||||
(
|
||||
(
|
||||
{
|
||||
"name": "Ethernet0",
|
||||
"port_number": 0,
|
||||
"type": "dot42q", # invalid port type
|
||||
"vlan": 1,
|
||||
}
|
||||
),
|
||||
(
|
||||
{
|
||||
"name": "Ethernet0",
|
||||
"port_number": 0,
|
||||
"type": "access", # missing vlan field
|
||||
}
|
||||
),
|
||||
(
|
||||
{
|
||||
"name": "Ethernet0",
|
||||
"port_number": 0,
|
||||
"type": "dot1q",
|
||||
"vlan": 1,
|
||||
"ethertype": "0x88A8" # EtherType is only for QinQ
|
||||
}
|
||||
),
|
||||
(
|
||||
{
|
||||
"name": "Ethernet0",
|
||||
"port_number": 0,
|
||||
"type": "qinq",
|
||||
"vlan": 1,
|
||||
"ethertype": "0x4242" # not a valid EtherType
|
||||
}
|
||||
),
|
||||
(
|
||||
{
|
||||
"name": "Ethernet0",
|
||||
"port_number": 0,
|
||||
"type": "access",
|
||||
"vlan": 0, # minimum vlan number is 1
|
||||
}
|
||||
),
|
||||
(
|
||||
{
|
||||
"name": "Ethernet0",
|
||||
"port_number": 0,
|
||||
"type": "access",
|
||||
"vlan": 4242, # maximum vlan number is 4094
|
||||
}
|
||||
),
|
||||
)
|
||||
)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
async def test_ethernet_switch_update_ports_invalid(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
ethernet_switch: dict,
|
||||
ports_settings: dict,
|
||||
) -> None:
|
||||
|
||||
port_params = {
|
||||
"ports_mapping": [ports_settings]
|
||||
}
|
||||
|
||||
response = await compute_client.put(
|
||||
app.url_path_for(
|
||||
"compute:update_ethernet_switch",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"]),
|
||||
json=port_params
|
||||
)
|
||||
assert response.status_code == status.HTTP_422_UNPROCESSABLE_ENTITY
|
||||
|
||||
|
||||
async def test_ethernet_switch_update(
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
ethernet_switch: dict
|
||||
) -> None:
|
||||
async def test_ethernet_switch_delete(
|
||||
self, app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
ethernet_switch: dict
|
||||
) -> None:
|
||||
|
||||
params = {
|
||||
"name": "test",
|
||||
"console_type": "telnet"
|
||||
}
|
||||
|
||||
response = await compute_client.put(
|
||||
app.url_path_for(
|
||||
"compute:update_ethernet_switch",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"]),
|
||||
json=params
|
||||
)
|
||||
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json()["name"] == "test"
|
||||
node = compute_project.get_node(ethernet_switch["node_id"])
|
||||
node._hypervisor.send.assert_called_with("ethsw rename \"Ethernet Switch\" \"test\"")
|
||||
response = await compute_client.delete(
|
||||
app.url_path_for(
|
||||
"compute:delete_ethernet_switch",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"]
|
||||
)
|
||||
)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_ethernet_switch_update_ports(
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
ethernet_switch: dict
|
||||
) -> None:
|
||||
async def test_ethernet_switch_start(
|
||||
self, app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
ethernet_switch: dict
|
||||
) -> None:
|
||||
|
||||
port_params = {
|
||||
"ports_mapping": [
|
||||
{
|
||||
"name": "Ethernet0",
|
||||
"port_number": 0,
|
||||
"type": "qinq",
|
||||
"vlan": 1
|
||||
},
|
||||
{
|
||||
"name": "Ethernet1",
|
||||
"port_number": 1,
|
||||
"type": "qinq",
|
||||
"vlan": 2,
|
||||
"ethertype": "0x88A8"
|
||||
},
|
||||
{
|
||||
"name": "Ethernet2",
|
||||
"port_number": 2,
|
||||
"type": "dot1q",
|
||||
"vlan": 3,
|
||||
},
|
||||
{
|
||||
"name": "Ethernet3",
|
||||
"port_number": 3,
|
||||
"type": "access",
|
||||
"vlan": 4,
|
||||
}
|
||||
],
|
||||
}
|
||||
response = await compute_client.post(
|
||||
app.url_path_for(
|
||||
"compute:start_ethernet_switch",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"])
|
||||
)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
response = await compute_client.put(
|
||||
app.url_path_for(
|
||||
"compute:update_ethernet_switch",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"]),
|
||||
json=port_params
|
||||
)
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
|
||||
nio_params = {
|
||||
"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"
|
||||
}
|
||||
async def test_ethernet_switch_stop(
|
||||
self, app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
ethernet_switch: dict
|
||||
) -> None:
|
||||
|
||||
response = await compute_client.post(
|
||||
app.url_path_for(
|
||||
"compute:stop_ethernet_switch",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"])
|
||||
)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_ethernet_switch_suspend(
|
||||
self, app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
ethernet_switch: dict
|
||||
) -> None:
|
||||
|
||||
response = await compute_client.post(
|
||||
app.url_path_for(
|
||||
"compute:suspend_ethernet_switch",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"])
|
||||
)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_ethernet_switch_reload(
|
||||
self, app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
ethernet_switch: dict
|
||||
) -> None:
|
||||
|
||||
response = await compute_client.post(
|
||||
app.url_path_for(
|
||||
"compute:reload_ethernet_switch",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"])
|
||||
)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_ethernet_switch_create_udp(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
ethernet_switch: dict
|
||||
) -> None:
|
||||
|
||||
params = {
|
||||
"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"
|
||||
}
|
||||
|
||||
for port_mapping in port_params["ports_mapping"]:
|
||||
port_number = port_mapping["port_number"]
|
||||
vlan = port_mapping["vlan"]
|
||||
port_type = port_mapping["type"]
|
||||
ethertype = port_mapping.get("ethertype", "")
|
||||
url = app.url_path_for(
|
||||
"compute:create_ethernet_switch_nio",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"],
|
||||
adapter_number="0",
|
||||
port_number=f"{port_number}"
|
||||
port_number="0"
|
||||
)
|
||||
await compute_client.post(url, json=nio_params)
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["type"] == "nio_udp"
|
||||
|
||||
node = compute_project.get_node(ethernet_switch["node_id"])
|
||||
nio = node.get_nio(port_number)
|
||||
nio = node.get_nio(0)
|
||||
calls = [
|
||||
call.send(f'nio create_udp {nio.name} 4242 127.0.0.1 4343'),
|
||||
call.send(f'ethsw add_nio "Ethernet Switch" {nio.name}'),
|
||||
call.send(f'ethsw set_{port_type}_port "Ethernet Switch" {nio.name} {vlan} {ethertype}'.strip())
|
||||
call.send(f'ethsw set_access_port "Ethernet Switch" {nio.name} 1')
|
||||
]
|
||||
node._hypervisor.send.assert_has_calls(calls)
|
||||
node._hypervisor.send.reset_mock()
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"ports_settings",
|
||||
(
|
||||
(
|
||||
{
|
||||
"name": "Ethernet0",
|
||||
"port_number": 0,
|
||||
"type": "dot42q", # invalid port type
|
||||
"vlan": 1,
|
||||
}
|
||||
),
|
||||
(
|
||||
{
|
||||
"name": "Ethernet0",
|
||||
"port_number": 0,
|
||||
"type": "access", # missing vlan field
|
||||
}
|
||||
),
|
||||
(
|
||||
{
|
||||
"name": "Ethernet0",
|
||||
"port_number": 0,
|
||||
"type": "dot1q",
|
||||
"vlan": 1,
|
||||
"ethertype": "0x88A8" # EtherType is only for QinQ
|
||||
}
|
||||
),
|
||||
(
|
||||
{
|
||||
"name": "Ethernet0",
|
||||
"port_number": 0,
|
||||
"type": "qinq",
|
||||
"vlan": 1,
|
||||
"ethertype": "0x4242" # not a valid EtherType
|
||||
}
|
||||
),
|
||||
(
|
||||
{
|
||||
"name": "Ethernet0",
|
||||
"port_number": 0,
|
||||
"type": "access",
|
||||
"vlan": 0, # minimum vlan number is 1
|
||||
}
|
||||
),
|
||||
(
|
||||
{
|
||||
"name": "Ethernet0",
|
||||
"port_number": 0,
|
||||
"type": "access",
|
||||
"vlan": 4242, # maximum vlan number is 4094
|
||||
}
|
||||
),
|
||||
)
|
||||
)
|
||||
async def test_ethernet_switch_update_ports_invalid(
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
ethernet_switch: dict,
|
||||
ports_settings: dict,
|
||||
) -> None:
|
||||
async def test_ethernet_switch_delete_nio(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
ethernet_switch: dict
|
||||
) -> None:
|
||||
|
||||
port_params = {
|
||||
"ports_mapping": [ports_settings]
|
||||
}
|
||||
params = {
|
||||
"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"
|
||||
}
|
||||
|
||||
response = await compute_client.put(
|
||||
app.url_path_for(
|
||||
"compute:update_ethernet_switch",
|
||||
url = app.url_path_for(
|
||||
"compute:create_ethernet_switch_nio",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"]),
|
||||
json=port_params
|
||||
)
|
||||
assert response.status_code == status.HTTP_422_UNPROCESSABLE_ENTITY
|
||||
|
||||
|
||||
async def test_ethernet_switch_delete(app: FastAPI, compute_client: AsyncClient, ethernet_switch: dict) -> None:
|
||||
|
||||
response = await compute_client.delete(
|
||||
app.url_path_for(
|
||||
"compute:delete_ethernet_switch",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"]
|
||||
node_id=ethernet_switch["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0"
|
||||
)
|
||||
)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
await compute_client.post(url, json=params)
|
||||
|
||||
node = compute_project.get_node(ethernet_switch["node_id"])
|
||||
node._hypervisor.send.reset_mock()
|
||||
nio = node.get_nio(0)
|
||||
|
||||
async def test_ethernet_switch_start(app: FastAPI, compute_client: AsyncClient, ethernet_switch: dict) -> None:
|
||||
|
||||
response = await compute_client.post(
|
||||
app.url_path_for(
|
||||
"compute:start_ethernet_switch",
|
||||
url = app.url_path_for(
|
||||
"compute:delete_ethernet_switch_nio",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"])
|
||||
)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_ethernet_switch_stop(app: FastAPI, compute_client: AsyncClient, ethernet_switch: dict) -> None:
|
||||
|
||||
response = await compute_client.post(
|
||||
app.url_path_for(
|
||||
"compute:stop_ethernet_switch",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"])
|
||||
)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_ethernet_switch_suspend(app: FastAPI, compute_client: AsyncClient, ethernet_switch: dict) -> None:
|
||||
|
||||
response = await compute_client.post(
|
||||
app.url_path_for(
|
||||
"compute:suspend_ethernet_switch",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"])
|
||||
)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_ethernet_switch_reload(app: FastAPI, compute_client: AsyncClient, ethernet_switch: dict) -> None:
|
||||
|
||||
response = await compute_client.post(
|
||||
app.url_path_for(
|
||||
"compute:reload_ethernet_switch",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"])
|
||||
)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_ethernet_switch_create_udp(
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
ethernet_switch: dict
|
||||
) -> None:
|
||||
|
||||
params = {
|
||||
"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"
|
||||
}
|
||||
|
||||
url = app.url_path_for(
|
||||
"compute:create_ethernet_switch_nio",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0"
|
||||
)
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["type"] == "nio_udp"
|
||||
|
||||
node = compute_project.get_node(ethernet_switch["node_id"])
|
||||
nio = node.get_nio(0)
|
||||
calls = [
|
||||
call.send(f'nio create_udp {nio.name} 4242 127.0.0.1 4343'),
|
||||
call.send(f'ethsw add_nio "Ethernet Switch" {nio.name}'),
|
||||
call.send(f'ethsw set_access_port "Ethernet Switch" {nio.name} 1')
|
||||
]
|
||||
node._hypervisor.send.assert_has_calls(calls)
|
||||
|
||||
|
||||
async def test_ethernet_switch_delete_nio(
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
ethernet_switch: dict
|
||||
) -> None:
|
||||
|
||||
params = {
|
||||
"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"
|
||||
}
|
||||
|
||||
url = app.url_path_for(
|
||||
"compute:create_ethernet_switch_nio",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0"
|
||||
)
|
||||
await compute_client.post(url, json=params)
|
||||
|
||||
node = compute_project.get_node(ethernet_switch["node_id"])
|
||||
node._hypervisor.send.reset_mock()
|
||||
nio = node.get_nio(0)
|
||||
|
||||
url = app.url_path_for(
|
||||
"compute:delete_ethernet_switch_nio",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0"
|
||||
)
|
||||
response = await compute_client.delete(url)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
calls = [
|
||||
call(f'ethsw remove_nio "Ethernet Switch" {nio.name}'),
|
||||
call(f'nio delete {nio.name}')
|
||||
]
|
||||
node._hypervisor.send.assert_has_calls(calls)
|
||||
|
||||
|
||||
async def test_ethernet_switch_start_capture(app: FastAPI, compute_client: AsyncClient, ethernet_switch: dict) -> None:
|
||||
|
||||
params = {
|
||||
"capture_file_name": "test.pcap",
|
||||
"data_link_type": "DLT_EN10MB"
|
||||
}
|
||||
|
||||
url = app.url_path_for("compute:start_ethernet_switch_capture",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
|
||||
with asyncio_patch("gns3server.compute.dynamips.nodes.ethernet_switch.EthernetSwitch.start_capture") as mock:
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert mock.called
|
||||
assert "test.pcap" in response.json()["pcap_file_path"]
|
||||
|
||||
|
||||
async def test_ethernet_switch_stop_capture(app: FastAPI, compute_client: AsyncClient, ethernet_switch: dict) -> None:
|
||||
|
||||
url = app.url_path_for("compute:stop_ethernet_switch_capture",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
|
||||
with asyncio_patch("gns3server.compute.dynamips.nodes.ethernet_switch.EthernetSwitch.stop_capture") as mock:
|
||||
response = await compute_client.post(url)
|
||||
node_id=ethernet_switch["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0"
|
||||
)
|
||||
response = await compute_client.delete(url)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
assert mock.called
|
||||
|
||||
calls = [
|
||||
call(f'ethsw remove_nio "Ethernet Switch" {nio.name}'),
|
||||
call(f'nio delete {nio.name}')
|
||||
]
|
||||
node._hypervisor.send.assert_has_calls(calls)
|
||||
|
||||
|
||||
async def test_ethernet_switch_start_capture(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
ethernet_switch: dict
|
||||
) -> None:
|
||||
|
||||
params = {
|
||||
"capture_file_name": "test.pcap",
|
||||
"data_link_type": "DLT_EN10MB"
|
||||
}
|
||||
|
||||
url = app.url_path_for("compute:start_ethernet_switch_capture",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
|
||||
with asyncio_patch("gns3server.compute.dynamips.nodes.ethernet_switch.EthernetSwitch.start_capture") as mock:
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert mock.called
|
||||
assert "test.pcap" in response.json()["pcap_file_path"]
|
||||
|
||||
|
||||
async def test_ethernet_switch_stop_capture(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
ethernet_switch: dict
|
||||
) -> None:
|
||||
|
||||
url = app.url_path_for("compute:stop_ethernet_switch_capture",
|
||||
project_id=ethernet_switch["project_id"],
|
||||
node_id=ethernet_switch["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
|
||||
with asyncio_patch("gns3server.compute.dynamips.nodes.ethernet_switch.EthernetSwitch.stop_capture") as mock:
|
||||
response = await compute_client.post(url)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
assert mock.called
|
||||
|
@ -28,452 +28,502 @@ from unittest.mock import patch
|
||||
|
||||
from gns3server.compute.project import Project
|
||||
|
||||
pytestmark = [pytest.mark.asyncio]
|
||||
pytestmark = pytest.mark.asyncio
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def fake_iou_bin(images_dir) -> str:
|
||||
"""Create a fake IOU image on disk"""
|
||||
class TestIOUNodesRoutes:
|
||||
|
||||
path = os.path.join(images_dir, "IOU", "iou.bin")
|
||||
with open(path, "w+") as f:
|
||||
f.write('\x7fELF\x01\x01\x01')
|
||||
os.chmod(path, stat.S_IREAD | stat.S_IEXEC)
|
||||
return path
|
||||
@pytest.fixture
|
||||
def fake_iou_bin(self, images_dir) -> str:
|
||||
"""Create a fake IOU image on disk"""
|
||||
|
||||
path = os.path.join(images_dir, "IOU", "iou.bin")
|
||||
with open(path, "w+") as f:
|
||||
f.write('\x7fELF\x01\x01\x01')
|
||||
os.chmod(path, stat.S_IREAD | stat.S_IEXEC)
|
||||
return path
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def base_params(tmpdir, fake_iou_bin) -> dict:
|
||||
"""Return standard parameters"""
|
||||
@pytest.fixture
|
||||
def base_params(self, tmpdir, fake_iou_bin) -> dict:
|
||||
"""Return standard parameters"""
|
||||
|
||||
return {"application_id": 42, "name": "IOU-TEST-1", "path": "iou.bin"}
|
||||
return {"application_id": 42, "name": "IOU-TEST-1", "path": "iou.bin"}
|
||||
|
||||
|
||||
@pytest_asyncio.fixture
|
||||
async def vm(app: FastAPI, compute_client: AsyncClient, compute_project: Project, base_params: dict) -> dict:
|
||||
@pytest_asyncio.fixture
|
||||
async def vm(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
base_params: dict
|
||||
) -> dict:
|
||||
|
||||
response = await compute_client.post(app.url_path_for("compute:create_iou_node", project_id=compute_project.id), json=base_params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
return response.json()
|
||||
response = await compute_client.post(app.url_path_for("compute:create_iou_node", project_id=compute_project.id), json=base_params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
return response.json()
|
||||
|
||||
|
||||
def startup_config_file(compute_project: Project, vm: dict) -> str:
|
||||
def startup_config_file(self, compute_project: Project, vm: dict) -> str:
|
||||
|
||||
directory = os.path.join(compute_project.path, "project-files", "iou", vm["node_id"])
|
||||
os.makedirs(directory, exist_ok=True)
|
||||
return os.path.join(directory, "startup-config.cfg")
|
||||
directory = os.path.join(compute_project.path, "project-files", "iou", vm["node_id"])
|
||||
os.makedirs(directory, exist_ok=True)
|
||||
return os.path.join(directory, "startup-config.cfg")
|
||||
|
||||
|
||||
async def test_iou_create(app: FastAPI, compute_client: AsyncClient, compute_project: Project, base_params: dict) -> None:
|
||||
async def test_iou_create(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
base_params: dict
|
||||
) -> None:
|
||||
|
||||
response = await compute_client.post(app.url_path_for("compute:create_iou_node", project_id=compute_project.id), json=base_params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["name"] == "IOU-TEST-1"
|
||||
assert response.json()["project_id"] == compute_project.id
|
||||
assert response.json()["serial_adapters"] == 2
|
||||
assert response.json()["ethernet_adapters"] == 2
|
||||
assert response.json()["ram"] == 256
|
||||
assert response.json()["nvram"] == 128
|
||||
assert response.json()["l1_keepalives"] is False
|
||||
response = await compute_client.post(app.url_path_for("compute:create_iou_node", project_id=compute_project.id), json=base_params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["name"] == "IOU-TEST-1"
|
||||
assert response.json()["project_id"] == compute_project.id
|
||||
assert response.json()["serial_adapters"] == 2
|
||||
assert response.json()["ethernet_adapters"] == 2
|
||||
assert response.json()["ram"] == 256
|
||||
assert response.json()["nvram"] == 128
|
||||
assert response.json()["l1_keepalives"] is False
|
||||
|
||||
|
||||
async def test_iou_create_with_params(app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
base_params: dict) -> None:
|
||||
async def test_iou_create_with_params(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
base_params: dict
|
||||
) -> None:
|
||||
|
||||
params = base_params
|
||||
params["ram"] = 1024
|
||||
params["nvram"] = 512
|
||||
params["serial_adapters"] = 4
|
||||
params["ethernet_adapters"] = 0
|
||||
params["l1_keepalives"] = True
|
||||
params["startup_config_content"] = "hostname test"
|
||||
params["use_default_iou_values"] = False
|
||||
params = base_params
|
||||
params["ram"] = 1024
|
||||
params["nvram"] = 512
|
||||
params["serial_adapters"] = 4
|
||||
params["ethernet_adapters"] = 0
|
||||
params["l1_keepalives"] = True
|
||||
params["startup_config_content"] = "hostname test"
|
||||
params["use_default_iou_values"] = False
|
||||
|
||||
response = await compute_client.post(app.url_path_for("compute:create_iou_node", project_id=compute_project.id), json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["name"] == "IOU-TEST-1"
|
||||
assert response.json()["project_id"] == compute_project.id
|
||||
assert response.json()["serial_adapters"] == 4
|
||||
assert response.json()["ethernet_adapters"] == 0
|
||||
assert response.json()["ram"] == 1024
|
||||
assert response.json()["nvram"] == 512
|
||||
assert response.json()["l1_keepalives"] is True
|
||||
assert response.json()["use_default_iou_values"] is False
|
||||
response = await compute_client.post(app.url_path_for("compute:create_iou_node", project_id=compute_project.id), json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["name"] == "IOU-TEST-1"
|
||||
assert response.json()["project_id"] == compute_project.id
|
||||
assert response.json()["serial_adapters"] == 4
|
||||
assert response.json()["ethernet_adapters"] == 0
|
||||
assert response.json()["ram"] == 1024
|
||||
assert response.json()["nvram"] == 512
|
||||
assert response.json()["l1_keepalives"] is True
|
||||
assert response.json()["use_default_iou_values"] is False
|
||||
|
||||
with open(startup_config_file(compute_project, response.json())) as f:
|
||||
assert f.read() == "hostname test"
|
||||
with open(self.startup_config_file(compute_project, response.json())) as f:
|
||||
assert f.read() == "hostname test"
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"name, status_code",
|
||||
(
|
||||
("valid-name", status.HTTP_201_CREATED),
|
||||
("42name", status.HTTP_409_CONFLICT),
|
||||
("name42", status.HTTP_201_CREATED),
|
||||
("-name", status.HTTP_409_CONFLICT),
|
||||
("name%-test", status.HTTP_409_CONFLICT),
|
||||
("x" * 63, status.HTTP_201_CREATED),
|
||||
("x" * 64, status.HTTP_409_CONFLICT),
|
||||
),
|
||||
)
|
||||
async def test_iou_create_with_invalid_name(
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
base_params: dict,
|
||||
name: str,
|
||||
status_code: int
|
||||
) -> None:
|
||||
|
||||
base_params["name"] = name
|
||||
response = await compute_client.post(
|
||||
app.url_path_for("compute:create_iou_node", project_id=compute_project.id), json=base_params
|
||||
@pytest.mark.parametrize(
|
||||
"name, status_code",
|
||||
(
|
||||
("valid-name", status.HTTP_201_CREATED),
|
||||
("42name", status.HTTP_409_CONFLICT),
|
||||
("name42", status.HTTP_201_CREATED),
|
||||
("-name", status.HTTP_409_CONFLICT),
|
||||
("name%-test", status.HTTP_409_CONFLICT),
|
||||
("x" * 63, status.HTTP_201_CREATED),
|
||||
("x" * 64, status.HTTP_409_CONFLICT),
|
||||
),
|
||||
)
|
||||
assert response.status_code == status_code
|
||||
async def test_iou_create_with_invalid_name(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
base_params: dict,
|
||||
name: str,
|
||||
status_code: int
|
||||
) -> None:
|
||||
|
||||
base_params["name"] = name
|
||||
response = await compute_client.post(
|
||||
app.url_path_for("compute:create_iou_node", project_id=compute_project.id), json=base_params
|
||||
)
|
||||
assert response.status_code == status_code
|
||||
|
||||
|
||||
async def test_iou_create_startup_config_already_exist(
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
base_params: dict) -> None:
|
||||
"""We don't erase a startup-config if already exist at project creation"""
|
||||
async def test_iou_create_startup_config_already_exist(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
base_params: dict) -> None:
|
||||
"""We don't erase a startup-config if already exist at project creation"""
|
||||
|
||||
node_id = str(uuid.uuid4())
|
||||
startup_config_file_path = startup_config_file(compute_project, {'node_id': node_id})
|
||||
with open(startup_config_file_path, 'w+') as f:
|
||||
f.write("echo hello")
|
||||
node_id = str(uuid.uuid4())
|
||||
startup_config_file_path = self.startup_config_file(compute_project, {'node_id': node_id})
|
||||
with open(startup_config_file_path, 'w+') as f:
|
||||
f.write("echo hello")
|
||||
|
||||
params = base_params
|
||||
params["node_id"] = node_id
|
||||
params["startup_config_content"] = "hostname test"
|
||||
params = base_params
|
||||
params["node_id"] = node_id
|
||||
params["startup_config_content"] = "hostname test"
|
||||
|
||||
response = await compute_client.post(app.url_path_for("compute:create_iou_node", project_id=compute_project.id), json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
response = await compute_client.post(app.url_path_for("compute:create_iou_node", project_id=compute_project.id), json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
|
||||
with open(startup_config_file(compute_project, response.json())) as f:
|
||||
assert f.read() == "echo hello"
|
||||
with open(self.startup_config_file(compute_project, response.json())) as f:
|
||||
assert f.read() == "echo hello"
|
||||
|
||||
|
||||
async def test_iou_get(app: FastAPI, compute_client: AsyncClient, compute_project: Project, vm: dict) -> None:
|
||||
async def test_iou_get(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
vm: dict
|
||||
) -> None:
|
||||
|
||||
response = await compute_client.get(app.url_path_for("compute:get_iou_node", project_id=vm["project_id"], node_id=vm["node_id"]))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json()["name"] == "IOU-TEST-1"
|
||||
assert response.json()["project_id"] == compute_project.id
|
||||
assert response.json()["serial_adapters"] == 2
|
||||
assert response.json()["ethernet_adapters"] == 2
|
||||
assert response.json()["ram"] == 256
|
||||
assert response.json()["nvram"] == 128
|
||||
assert response.json()["l1_keepalives"] is False
|
||||
response = await compute_client.get(app.url_path_for("compute:get_iou_node", project_id=vm["project_id"], node_id=vm["node_id"]))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json()["name"] == "IOU-TEST-1"
|
||||
assert response.json()["project_id"] == compute_project.id
|
||||
assert response.json()["serial_adapters"] == 2
|
||||
assert response.json()["ethernet_adapters"] == 2
|
||||
assert response.json()["ram"] == 256
|
||||
assert response.json()["nvram"] == 128
|
||||
assert response.json()["l1_keepalives"] is False
|
||||
|
||||
|
||||
async def test_iou_start(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
async def test_iou_start(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM.start", return_value=True) as mock:
|
||||
response = await compute_client.post(app.url_path_for("compute:start_iou_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]), json={})
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM.start", return_value=True) as mock:
|
||||
response = await compute_client.post(app.url_path_for("compute:start_iou_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]), json={})
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_iou_start_with_iourc(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
async def test_iou_start_with_iourc(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
params = {"iourc_content": "test"}
|
||||
with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM.start", return_value=True) as mock:
|
||||
response = await compute_client.post(app.url_path_for("compute:start_iou_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]), json=params)
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
params = {"iourc_content": "test"}
|
||||
with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM.start", return_value=True) as mock:
|
||||
response = await compute_client.post(app.url_path_for("compute:start_iou_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]), json=params)
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_iou_stop(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
async def test_iou_stop(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM.stop", return_value=True) as mock:
|
||||
response = await compute_client.post(app.url_path_for("compute:stop_iou_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]))
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM.stop", return_value=True) as mock:
|
||||
response = await compute_client.post(app.url_path_for("compute:stop_iou_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]))
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_iou_reload(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
async def test_iou_reload(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM.reload", return_value=True) as mock:
|
||||
response = await compute_client.post(app.url_path_for("compute:reload_iou_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]))
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM.reload", return_value=True) as mock:
|
||||
response = await compute_client.post(app.url_path_for("compute:reload_iou_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]))
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_iou_delete(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
async def test_iou_delete(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
with asyncio_patch("gns3server.compute.iou.IOU.delete_node", return_value=True) as mock:
|
||||
response = await compute_client.delete(app.url_path_for("compute:delete_iou_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]))
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
with asyncio_patch("gns3server.compute.iou.IOU.delete_node", return_value=True) as mock:
|
||||
response = await compute_client.delete(app.url_path_for("compute:delete_iou_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]))
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_iou_update(app: FastAPI, compute_client: AsyncClient, vm: dict, free_console_port: int) -> None:
|
||||
async def test_iou_update(
|
||||
self, app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
vm: dict,
|
||||
free_console_port: int
|
||||
) -> None:
|
||||
|
||||
params = {
|
||||
"name": "test",
|
||||
"console": free_console_port,
|
||||
"ram": 512,
|
||||
"nvram": 2048,
|
||||
"ethernet_adapters": 4,
|
||||
"serial_adapters": 0,
|
||||
"l1_keepalives": True,
|
||||
"use_default_iou_values": True,
|
||||
}
|
||||
params = {
|
||||
"name": "test",
|
||||
"console": free_console_port,
|
||||
"ram": 512,
|
||||
"nvram": 2048,
|
||||
"ethernet_adapters": 4,
|
||||
"serial_adapters": 0,
|
||||
"l1_keepalives": True,
|
||||
"use_default_iou_values": True,
|
||||
}
|
||||
|
||||
response = await compute_client.put(app.url_path_for("compute:update_iou_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]), json=params)
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json()["name"] == "test"
|
||||
assert response.json()["console"] == free_console_port
|
||||
assert response.json()["ethernet_adapters"] == 4
|
||||
assert response.json()["serial_adapters"] == 0
|
||||
assert response.json()["ram"] == 512
|
||||
assert response.json()["nvram"] == 2048
|
||||
assert response.json()["l1_keepalives"] is True
|
||||
assert response.json()["use_default_iou_values"] is True
|
||||
response = await compute_client.put(app.url_path_for("compute:update_iou_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]), json=params)
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json()["name"] == "test"
|
||||
assert response.json()["console"] == free_console_port
|
||||
assert response.json()["ethernet_adapters"] == 4
|
||||
assert response.json()["serial_adapters"] == 0
|
||||
assert response.json()["ram"] == 512
|
||||
assert response.json()["nvram"] == 2048
|
||||
assert response.json()["l1_keepalives"] is True
|
||||
assert response.json()["use_default_iou_values"] is True
|
||||
|
||||
|
||||
async def test_iou_nio_create_udp(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
async def test_iou_nio_create_udp(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
params = {"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"}
|
||||
params = {"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"}
|
||||
|
||||
url = app.url_path_for("compute:create_iou_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="1",
|
||||
port_number="0")
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["type"] == "nio_udp"
|
||||
|
||||
|
||||
async def test_iou_nio_update_udp(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
params = {"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"}
|
||||
|
||||
url = app.url_path_for("compute:create_iou_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="1",
|
||||
port_number="0")
|
||||
|
||||
await compute_client.post(url, json=params)
|
||||
params["filters"] = {}
|
||||
|
||||
url = app.url_path_for("compute:update_iou_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="1",
|
||||
port_number="0")
|
||||
response = await compute_client.put(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["type"] == "nio_udp"
|
||||
|
||||
|
||||
async def test_iou_nio_create_ethernet(app: FastAPI, compute_client: AsyncClient, vm: dict, ethernet_device: str) -> None:
|
||||
|
||||
params = {
|
||||
"type": "nio_ethernet",
|
||||
"ethernet_device": ethernet_device
|
||||
}
|
||||
|
||||
url = app.url_path_for("compute:create_iou_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="1",
|
||||
port_number="0")
|
||||
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["type"] == "nio_ethernet"
|
||||
assert response.json()["ethernet_device"] == ethernet_device
|
||||
|
||||
|
||||
async def test_iou_nio_create_ethernet_different_port(app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
vm: dict,
|
||||
ethernet_device: str) -> None:
|
||||
|
||||
params = {
|
||||
"type": "nio_ethernet",
|
||||
"ethernet_device": ethernet_device
|
||||
}
|
||||
|
||||
url = app.url_path_for("compute:create_iou_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="3")
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["type"] == "nio_ethernet"
|
||||
assert response.json()["ethernet_device"] == ethernet_device
|
||||
|
||||
|
||||
async def test_iou_nio_create_tap(app: FastAPI, compute_client: AsyncClient, vm: dict, ethernet_device: str) -> None:
|
||||
|
||||
params = {
|
||||
"type": "nio_tap",
|
||||
"tap_device": ethernet_device
|
||||
}
|
||||
|
||||
url = app.url_path_for("compute:create_iou_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="1",
|
||||
port_number="0")
|
||||
with patch("gns3server.compute.base_manager.BaseManager.has_privileged_access", return_value=True):
|
||||
url = app.url_path_for("compute:create_iou_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="1",
|
||||
port_number="0")
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["type"] == "nio_tap"
|
||||
assert response.json()["type"] == "nio_udp"
|
||||
|
||||
|
||||
async def test_iou_delete_nio(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
async def test_iou_nio_update_udp(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
params = {
|
||||
"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"
|
||||
}
|
||||
params = {"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"}
|
||||
|
||||
url = app.url_path_for("compute:create_iou_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="1",
|
||||
port_number="0")
|
||||
url = app.url_path_for("compute:create_iou_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="1",
|
||||
port_number="0")
|
||||
|
||||
await compute_client.post(url, json=params)
|
||||
await compute_client.post(url, json=params)
|
||||
params["filters"] = {}
|
||||
|
||||
url = app.url_path_for("compute:delete_iou_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="1",
|
||||
port_number="0")
|
||||
|
||||
response = await compute_client.delete(url)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
url = app.url_path_for("compute:update_iou_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="1",
|
||||
port_number="0")
|
||||
response = await compute_client.put(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["type"] == "nio_udp"
|
||||
|
||||
|
||||
async def test_iou_start_capture(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
async def test_iou_nio_create_ethernet(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
vm: dict,
|
||||
ethernet_device: str
|
||||
) -> None:
|
||||
|
||||
params = {
|
||||
"capture_file_name": "test.pcap",
|
||||
"data_link_type": "DLT_EN10MB"
|
||||
}
|
||||
params = {
|
||||
"type": "nio_ethernet",
|
||||
"ethernet_device": ethernet_device
|
||||
}
|
||||
|
||||
url = app.url_path_for("compute:start_iou_node_capture",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
url = app.url_path_for("compute:create_iou_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="1",
|
||||
port_number="0")
|
||||
|
||||
with patch("gns3server.compute.iou.iou_vm.IOUVM.is_running", return_value=True):
|
||||
with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM.start_capture") as mock:
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["type"] == "nio_ethernet"
|
||||
assert response.json()["ethernet_device"] == ethernet_device
|
||||
|
||||
|
||||
async def test_iou_nio_create_ethernet_different_port(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
vm: dict,
|
||||
ethernet_device: str
|
||||
) -> None:
|
||||
|
||||
params = {
|
||||
"type": "nio_ethernet",
|
||||
"ethernet_device": ethernet_device
|
||||
}
|
||||
|
||||
url = app.url_path_for("compute:create_iou_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="3")
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["type"] == "nio_ethernet"
|
||||
assert response.json()["ethernet_device"] == ethernet_device
|
||||
|
||||
|
||||
async def test_iou_nio_create_tap(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
vm: dict,
|
||||
ethernet_device: str
|
||||
) -> None:
|
||||
|
||||
params = {
|
||||
"type": "nio_tap",
|
||||
"tap_device": ethernet_device
|
||||
}
|
||||
|
||||
url = app.url_path_for("compute:create_iou_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="1",
|
||||
port_number="0")
|
||||
with patch("gns3server.compute.base_manager.BaseManager.has_privileged_access", return_value=True):
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert mock.called
|
||||
assert "test.pcap" in response.json()["pcap_file_path"]
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["type"] == "nio_tap"
|
||||
|
||||
|
||||
async def test_iou_stop_capture(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
async def test_iou_delete_nio(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
vm: dict
|
||||
) -> None:
|
||||
|
||||
url = app.url_path_for("compute:stop_iou_node_capture",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
params = {
|
||||
"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"
|
||||
}
|
||||
|
||||
with patch("gns3server.compute.iou.iou_vm.IOUVM.is_running", return_value=True):
|
||||
with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM.stop_capture") as mock:
|
||||
response = await compute_client.post(url)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
assert mock.called
|
||||
url = app.url_path_for("compute:create_iou_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="1",
|
||||
port_number="0")
|
||||
|
||||
await compute_client.post(url, json=params)
|
||||
|
||||
# @pytest.mark.asyncio
|
||||
# async def test_iou_pcap(compute_api, vm, compute_project):
|
||||
#
|
||||
# with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM.get_nio"):
|
||||
# with asyncio_patch("gns3server.compute.iou.IOU.stream_pcap_file"):
|
||||
# response = await compute_client.get("/projects/{project_id}/iou/nodes/{node_id}/adapters/0/ports/0/pcap".format(project_id=compute_project.id, node_id=vm["node_id"]), raw=True)
|
||||
# assert response.status_code == status.HTTP_200_OK
|
||||
url = app.url_path_for("compute:delete_iou_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="1",
|
||||
port_number="0")
|
||||
|
||||
|
||||
async def test_images(app: FastAPI, compute_client: AsyncClient, fake_iou_bin: str) -> None:
|
||||
|
||||
response = await compute_client.get(app.url_path_for("compute:get_iou_images"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json() == [{"filename": "iou.bin", "path": "iou.bin", "filesize": 7, "md5sum": "e573e8f5c93c6c00783f20c7a170aa6c"}]
|
||||
|
||||
|
||||
async def test_upload_image(app: FastAPI, compute_client: AsyncClient, tmpdir) -> None:
|
||||
|
||||
with patch("gns3server.compute.IOU.get_images_directory", return_value=str(tmpdir)):
|
||||
response = await compute_client.post(app.url_path_for("compute:upload_iou_image", filename="test2"), content=b"TEST")
|
||||
response = await compute_client.delete(url)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
with open(str(tmpdir / "test2")) as f:
|
||||
assert f.read() == "TEST"
|
||||
|
||||
with open(str(tmpdir / "test2.md5sum")) as f:
|
||||
checksum = f.read()
|
||||
assert checksum == "033bd94b1168d7e4f0d644c3c95e35bf"
|
||||
async def test_iou_start_capture(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
params = {
|
||||
"capture_file_name": "test.pcap",
|
||||
"data_link_type": "DLT_EN10MB"
|
||||
}
|
||||
|
||||
url = app.url_path_for("compute:start_iou_node_capture",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
|
||||
with patch("gns3server.compute.iou.iou_vm.IOUVM.is_running", return_value=True):
|
||||
with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM.start_capture") as mock:
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert mock.called
|
||||
assert "test.pcap" in response.json()["pcap_file_path"]
|
||||
|
||||
|
||||
async def test_upload_image_forbidden_location(app: FastAPI, compute_client: AsyncClient) -> None:
|
||||
async def test_iou_stop_capture(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
file_path = "%2e%2e/hello"
|
||||
response = await compute_client.post(app.url_path_for("compute:upload_dynamips_image", filename=file_path), content=b"TEST")
|
||||
assert response.status_code == status.HTTP_403_FORBIDDEN
|
||||
url = app.url_path_for("compute:stop_iou_node_capture",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
|
||||
with patch("gns3server.compute.iou.iou_vm.IOUVM.is_running", return_value=True):
|
||||
with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM.stop_capture") as mock:
|
||||
response = await compute_client.post(url)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
assert mock.called
|
||||
|
||||
|
||||
async def test_download_image(app: FastAPI, compute_client: AsyncClient, images_dir: str) -> None:
|
||||
|
||||
response = await compute_client.post(app.url_path_for("compute:upload_dynamips_image", filename="test3"), content=b"TEST")
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
response = await compute_client.get(app.url_path_for("compute:download_dynamips_image", filename="test3"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
# @pytest.mark.asyncio
|
||||
# async def test_iou_pcap(compute_api, vm, compute_project):
|
||||
#
|
||||
# with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM.get_nio"):
|
||||
# with asyncio_patch("gns3server.compute.iou.IOU.stream_pcap_file"):
|
||||
# response = await compute_client.get("/projects/{project_id}/iou/nodes/{node_id}/adapters/0/ports/0/pcap".format(project_id=compute_project.id, node_id=vm["node_id"]), raw=True)
|
||||
# assert response.status_code == status.HTTP_200_OK
|
||||
|
||||
|
||||
async def test_download_image_forbidden(app: FastAPI, compute_client: AsyncClient, tmpdir) -> None:
|
||||
async def test_images(self, app: FastAPI, compute_client: AsyncClient, fake_iou_bin: str) -> None:
|
||||
|
||||
file_path = "foo/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd"
|
||||
response = await compute_client.get(app.url_path_for("compute:download_iou_image", filename=file_path))
|
||||
assert response.status_code == status.HTTP_403_FORBIDDEN
|
||||
response = await compute_client.get(app.url_path_for("compute:get_iou_images"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json() == [{"filename": "iou.bin", "path": "iou.bin", "filesize": 7, "md5sum": "e573e8f5c93c6c00783f20c7a170aa6c"}]
|
||||
|
||||
|
||||
async def test_iou_duplicate(app: FastAPI, compute_client: AsyncClient, vm: dict, base_params: dict) -> None:
|
||||
async def test_upload_image(self, app: FastAPI, compute_client: AsyncClient, tmpdir) -> None:
|
||||
|
||||
# create destination node first
|
||||
response = await compute_client.post(app.url_path_for("compute:create_iou_node", project_id=vm["project_id"]), json=base_params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
with patch("gns3server.compute.IOU.get_images_directory", return_value=str(tmpdir)):
|
||||
response = await compute_client.post(app.url_path_for("compute:upload_iou_image", filename="test2"), content=b"TEST")
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
params = {"destination_node_id": response.json()["node_id"]}
|
||||
with open(str(tmpdir / "test2")) as f:
|
||||
assert f.read() == "TEST"
|
||||
|
||||
response = await compute_client.post(app.url_path_for("compute:duplicate_iou_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]), json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
with open(str(tmpdir / "test2.md5sum")) as f:
|
||||
checksum = f.read()
|
||||
assert checksum == "033bd94b1168d7e4f0d644c3c95e35bf"
|
||||
|
||||
|
||||
async def test_upload_image_forbidden_location(self, app: FastAPI, compute_client: AsyncClient) -> None:
|
||||
|
||||
file_path = "%2e%2e/hello"
|
||||
response = await compute_client.post(app.url_path_for("compute:upload_dynamips_image", filename=file_path), content=b"TEST")
|
||||
assert response.status_code == status.HTTP_403_FORBIDDEN
|
||||
|
||||
|
||||
async def test_download_image(self, app: FastAPI, compute_client: AsyncClient, images_dir: str) -> None:
|
||||
|
||||
response = await compute_client.post(app.url_path_for("compute:upload_dynamips_image", filename="test3"), content=b"TEST")
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
response = await compute_client.get(app.url_path_for("compute:download_dynamips_image", filename="test3"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
|
||||
|
||||
async def test_download_image_forbidden(self, app: FastAPI, compute_client: AsyncClient, tmpdir) -> None:
|
||||
|
||||
file_path = "foo/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd"
|
||||
response = await compute_client.get(app.url_path_for("compute:download_iou_image", filename=file_path))
|
||||
assert response.status_code == status.HTTP_403_FORBIDDEN
|
||||
|
||||
|
||||
async def test_iou_duplicate(self, app: FastAPI, compute_client: AsyncClient, vm: dict, base_params: dict) -> None:
|
||||
|
||||
# create destination node first
|
||||
response = await compute_client.post(app.url_path_for("compute:create_iou_node", project_id=vm["project_id"]), json=base_params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
|
||||
params = {"destination_node_id": response.json()["node_id"]}
|
||||
|
||||
response = await compute_client.post(app.url_path_for("compute:duplicate_iou_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]), json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
|
@ -27,167 +27,188 @@ from gns3server.compute.project import Project
|
||||
pytestmark = pytest.mark.asyncio
|
||||
|
||||
|
||||
@pytest_asyncio.fixture(scope="function")
|
||||
async def vm(app: FastAPI, compute_client: AsyncClient, compute_project: Project, ubridge_path: str, on_gns3vm) -> dict:
|
||||
class TestNATNodesRoutes:
|
||||
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.nat.Nat._start_ubridge"):
|
||||
response = await compute_client.post(app.url_path_for("compute:create_nat_node", project_id=compute_project.id),
|
||||
json={"name": "Nat 1"})
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
return response.json()
|
||||
@pytest_asyncio.fixture
|
||||
async def vm(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
ubridge_path: str,
|
||||
on_gns3vm
|
||||
) -> dict:
|
||||
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.nat.Nat._start_ubridge"):
|
||||
response = await compute_client.post(app.url_path_for("compute:create_nat_node", project_id=compute_project.id),
|
||||
json={"name": "Nat 1"})
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
return response.json()
|
||||
|
||||
|
||||
async def test_nat_create(app: FastAPI, compute_client: AsyncClient, compute_project: Project, on_gns3vm) -> None:
|
||||
async def test_nat_create(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
on_gns3vm
|
||||
) -> None:
|
||||
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.nat.Nat._start_ubridge"):
|
||||
response = await compute_client.post(app.url_path_for("compute:create_nat_node", project_id=compute_project.id),
|
||||
json={"name": "Nat 1"})
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["name"] == "Nat 1"
|
||||
assert response.json()["project_id"] == compute_project.id
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.nat.Nat._start_ubridge"):
|
||||
response = await compute_client.post(app.url_path_for("compute:create_nat_node", project_id=compute_project.id),
|
||||
json={"name": "Nat 1"})
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["name"] == "Nat 1"
|
||||
assert response.json()["project_id"] == compute_project.id
|
||||
|
||||
|
||||
async def test_nat_get(app: FastAPI, compute_client: AsyncClient, compute_project: Project, vm: dict) -> None:
|
||||
async def test_nat_get(
|
||||
self,
|
||||
app: FastAPI,
|
||||
compute_client: AsyncClient,
|
||||
compute_project: Project,
|
||||
vm: dict
|
||||
) -> None:
|
||||
|
||||
response = await compute_client.get(app.url_path_for("compute:get_nat_node", project_id=vm["project_id"], node_id=vm["node_id"]))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json()["name"] == "Nat 1"
|
||||
assert response.json()["project_id"] == compute_project.id
|
||||
assert response.json()["status"] == "started"
|
||||
|
||||
|
||||
async def test_nat_nio_create_udp(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
params = {
|
||||
"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"
|
||||
}
|
||||
|
||||
url = app.url_path_for("compute:create_nat_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.nat.Nat.add_nio"):
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["type"] == "nio_udp"
|
||||
|
||||
|
||||
async def test_nat_nio_update_udp(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
params = {
|
||||
"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"
|
||||
}
|
||||
|
||||
url = app.url_path_for("compute:create_nat_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
|
||||
await compute_client.post(url, json=params)
|
||||
params["filters"] = {}
|
||||
|
||||
url = app.url_path_for("compute:update_nat_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
response = await compute_client.put(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["type"] == "nio_udp"
|
||||
|
||||
|
||||
async def test_nat_delete_nio(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
params = {
|
||||
"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"
|
||||
}
|
||||
|
||||
url = app.url_path_for("compute:create_nat_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.nat.Nat.add_nio"):
|
||||
await compute_client.post(url, json=params)
|
||||
|
||||
url = app.url_path_for("compute:delete_nat_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.nat.Nat.remove_nio") as mock:
|
||||
response = await compute_client.delete(url)
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_nat_delete(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
response = await compute_client.delete(app.url_path_for("compute:delete_nat_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]))
|
||||
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_nat_update(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
response = await compute_client.put(app.url_path_for("compute:update_nat_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]), json={"name": "test"})
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json()["name"] == "test"
|
||||
|
||||
|
||||
async def test_nat_start_capture(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
params = {
|
||||
"capture_file_name": "test.pcap",
|
||||
"data_link_type": "DLT_EN10MB"
|
||||
}
|
||||
|
||||
url = app.url_path_for("compute:start_nat_node_capture",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.nat.Nat.start_capture") as mock:
|
||||
response = await compute_client.post(url, json=params)
|
||||
response = await compute_client.get(app.url_path_for("compute:get_nat_node", project_id=vm["project_id"], node_id=vm["node_id"]))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert mock.called
|
||||
assert "test.pcap" in response.json()["pcap_file_path"]
|
||||
assert response.json()["name"] == "Nat 1"
|
||||
assert response.json()["project_id"] == compute_project.id
|
||||
assert response.json()["status"] == "started"
|
||||
|
||||
|
||||
async def test_nat_stop_capture(app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
async def test_nat_nio_create_udp(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
url = app.url_path_for("compute:stop_nat_node_capture",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
params = {
|
||||
"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"
|
||||
}
|
||||
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.nat.Nat.stop_capture") as mock:
|
||||
response = await compute_client.post(url)
|
||||
url = app.url_path_for("compute:create_nat_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.nat.Nat.add_nio"):
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["type"] == "nio_udp"
|
||||
|
||||
|
||||
async def test_nat_nio_update_udp(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
params = {
|
||||
"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"
|
||||
}
|
||||
|
||||
url = app.url_path_for("compute:create_nat_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
|
||||
await compute_client.post(url, json=params)
|
||||
params["filters"] = {}
|
||||
|
||||
url = app.url_path_for("compute:update_nat_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
response = await compute_client.put(url, json=params)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
assert response.json()["type"] == "nio_udp"
|
||||
|
||||
|
||||
async def test_nat_delete_nio(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
params = {
|
||||
"type": "nio_udp",
|
||||
"lport": 4242,
|
||||
"rport": 4343,
|
||||
"rhost": "127.0.0.1"
|
||||
}
|
||||
|
||||
url = app.url_path_for("compute:create_nat_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.nat.Nat.add_nio"):
|
||||
await compute_client.post(url, json=params)
|
||||
|
||||
url = app.url_path_for("compute:delete_nat_node_nio",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.nat.Nat.remove_nio") as mock:
|
||||
response = await compute_client.delete(url)
|
||||
assert mock.called
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
assert mock.called
|
||||
|
||||
|
||||
# @pytest.mark.asyncio
|
||||
# async def test_nat_pcap(compute_api, vm, compute_project):
|
||||
#
|
||||
# with asyncio_patch("gns3server.compute.builtin.nodes.nat.Nat.get_nio"):
|
||||
# with asyncio_patch("gns3server.compute.builtin.Builtin.stream_pcap_file"):
|
||||
# response = await compute_client.get("/projects/{project_id}/nat/nodes/{node_id}/adapters/0/ports/0/pcap".format(project_id=compute_project.id, node_id=vm["node_id"]), raw=True)
|
||||
# assert response.status_code == status.HTTP_200_OK
|
||||
async def test_nat_delete(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
response = await compute_client.delete(app.url_path_for("compute:delete_nat_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]))
|
||||
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
|
||||
|
||||
async def test_nat_update(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
response = await compute_client.put(app.url_path_for("compute:update_nat_node",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"]), json={"name": "test"})
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.json()["name"] == "test"
|
||||
|
||||
|
||||
async def test_nat_start_capture(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
params = {
|
||||
"capture_file_name": "test.pcap",
|
||||
"data_link_type": "DLT_EN10MB"
|
||||
}
|
||||
|
||||
url = app.url_path_for("compute:start_nat_node_capture",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.nat.Nat.start_capture") as mock:
|
||||
response = await compute_client.post(url, json=params)
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert mock.called
|
||||
assert "test.pcap" in response.json()["pcap_file_path"]
|
||||
|
||||
|
||||
async def test_nat_stop_capture(self, app: FastAPI, compute_client: AsyncClient, vm: dict) -> None:
|
||||
|
||||
url = app.url_path_for("compute:stop_nat_node_capture",
|
||||
project_id=vm["project_id"],
|
||||
node_id=vm["node_id"],
|
||||
adapter_number="0",
|
||||
port_number="0")
|
||||
|
||||
with asyncio_patch("gns3server.compute.builtin.nodes.nat.Nat.stop_capture") as mock:
|
||||
response = await compute_client.post(url)
|
||||
assert response.status_code == status.HTTP_204_NO_CONTENT
|
||||
assert mock.called
|
||||
|
||||
|
||||
# @pytest.mark.asyncio
|
||||
# async def test_nat_pcap(self, compute_api, vm, compute_project):
|
||||
#
|
||||
# with asyncio_patch("gns3server.compute.builtin.nodes.nat.Nat.get_nio"):
|
||||
# with asyncio_patch("gns3server.compute.builtin.Builtin.stream_pcap_file"):
|
||||
# response = await compute_client.get("/projects/{project_id}/nat/nodes/{node_id}/adapters/0/ports/0/pcap".format(project_id=compute_project.id, node_id=vm["node_id"]), raw=True)
|
||||
# assert response.status_code == status.HTTP_200_OK
|
||||
|