diff --git a/CHANGELOG b/CHANGELOG
index 67e4d395..1ba69b21 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,15 @@
# Change Log
+## 2.2.25 14/09/2021
+
+* Release web UI 2.2.25
+* Fix issue preventing to use custom nested symbols. Fixes #1969
+* Updated affinity symbols
+* Fix qemu-img rebase code to support Qemu 6.1. Ref https://github.com/GNS3/gns3-server/pull/1962
+* Reinstate qemu-img rebase
+* Return disk usage for partition that contains the default project directory. Fixes #1947
+* Explicitly require setuptools, utils/get_resource.py imports pkg_resources
+
## 2.2.24 25/08/2021
* Release web UI 2.2.24
diff --git a/gns3server/appliances/nokia-vsim.gns3a b/gns3server/appliances/nokia-vsim.gns3a
new file mode 100644
index 00000000..d05618cf
--- /dev/null
+++ b/gns3server/appliances/nokia-vsim.gns3a
@@ -0,0 +1,46 @@
+{
+ "name": "Nokia vSIM",
+ "category": "router",
+ "description": "The Nokia Virtualized 7750 SR and 7950 XRS Simulator (vSIM) is a Virtualized Network Function (VNF) that simulates the control, management, and forwarding functions of a 7750 SR or 7950 XRS router. The vSIM runs the same Service Router Operating System (SR OS) as 7750 SR and 7950 XRS hardware-based routers and, therefore, has the same feature set and operational behavior as those platforms.",
+ "vendor_name": "Nokia",
+ "vendor_url": "https://www.nokia.com/networks/",
+ "documentation_url": "https://documentation.nokia.com/",
+ "product_name": "Nokia vSIM",
+ "product_url": "https://www.nokia.com/networks/products/virtualized-service-router/",
+ "registry_version": 4,
+ "status": "experimental",
+ "maintainer": "Vinicius Rocha",
+ "maintainer_email": "viniciusatr@gmail.com",
+ "usage": "Login is admin and password is admin. \n\nWe are using one IOM with one MDA 12x100G (w/ breakout).\n\nYou must add your license: file vi cf3:license.txt",
+ "first_port_name": "A/1",
+ "port_name_format": "1/1/{port1}",
+ "qemu": {
+ "adapter_type": "virtio-net-pci",
+ "adapters": 13,
+ "ram": 4096,
+ "cpus": 2,
+ "hda_disk_interface": "virtio",
+ "arch": "x86_64",
+ "console_type": "telnet",
+ "kvm": "require",
+ "options": "-nographic -smbios type=1,product=TIMOS:license-file=cf3:license.txt\\ slot=A\\ chassis=SR-1\\ card=cpm-1\\ mda/1=me12-100gb-qsfp28"
+ },
+ "images": [
+ {
+ "filename": "sros-vsr-21.7.R1.qcow2",
+ "version": "21.7.R1",
+ "md5sum": "7eed38c01350ebaf9c6105e26ce5307e",
+ "filesize": 568655872,
+ "download_url": "https://customer.nokia.com/support/s/",
+ "compression": "zip"
+ }
+ ],
+ "versions": [
+ {
+ "name": "21.7.R1",
+ "images": {
+ "hda_disk_image": "sros-vsr-21.7.R1.qcow2"
+ }
+ }
+ ]
+}
diff --git a/gns3server/appliances/open-media-vault.gns3a b/gns3server/appliances/open-media-vault.gns3a
index 6bc5ef04..0b68c4b9 100644
--- a/gns3server/appliances/open-media-vault.gns3a
+++ b/gns3server/appliances/open-media-vault.gns3a
@@ -7,7 +7,7 @@
"documentation_url": "hhttps://docs.openmediavault.org",
"product_name": "OpenMediaVault",
"product_url": "https://www.openmediavault.org/",
- "registry_version": 3,
+ "registry_version": 4,
"status": "stable",
"maintainer": "Savio D'souza",
"maintainer_email": "savio2002@yahoo.in",
@@ -17,21 +17,29 @@
"adapter_type": "e1000",
"adapters": 1,
"ram": 2048,
- "hda_disk_interface": "ide",
- "hdb_disk_interface": "ide",
- "arch": "x86_64",
+ "hda_disk_interface": "sata",
+ "hdb_disk_interface": "sata",
+ "arch": "x86_64",
"console_type": "vnc",
"boot_priority": "dc",
"kvm": "require"
},
"images": [
+ {
+ "filename": "openmediavault_5.6.13-amd64.iso",
+ "version": "5.6.13",
+ "md5sum": "f08b41a5111fffca0355d53e26ec47ab",
+ "filesize": 652214272,
+ "download_url": "https://www.openmediavault.org/download.html",
+ "direct_download_url": "https://sourceforge.net/projects/openmediavault/files/5.6.13/openmediavault_5.6.13-amd64.iso/download"
+ },
{
"filename": "openmediavault_5.5.11-amd64.iso",
"version": "5.5.11",
"md5sum": "76baad8e13dd49bee9b4b4a6936b7296",
"filesize": 608174080,
"download_url": "https://www.openmediavault.org/download.html",
- "direct_download_url": "https://sourceforge.net/projects/openmediavault/files/latest/download"
+ "direct_download_url": "https://sourceforge.net/projects/openmediavault/files/5.5.11/openmediavault_5.5.11-amd64.iso/download"
},
{
"filename": "empty30G.qcow2",
@@ -44,12 +52,20 @@
],
"versions": [
{
- "name": "5.5.11",
+ "name": "5.6.13",
"images": {
"hda_disk_image": "empty30G.qcow2",
"hdb_disk_image": "empty30G.qcow2",
- "cdrom_image": "openmediavault_5.5.11-amd64.iso"
+ "cdrom_image": "openmediavault_5.6.13-amd64.iso"
}
+ },
+ {
+ "name": "5.5.11",
+ "images": {
+ "hda_disk_image": "empty30G.qcow2",
+ "hdb_disk_image": "empty30G.qcow2",
+ "cdrom_image": "openmediavault_5.5.11-amd64.iso"
}
+ }
]
}
diff --git a/gns3server/appliances/openwrt.gns3a b/gns3server/appliances/openwrt.gns3a
index a8b8fca8..a7228ea4 100644
--- a/gns3server/appliances/openwrt.gns3a
+++ b/gns3server/appliances/openwrt.gns3a
@@ -22,6 +22,24 @@
"kvm": "allow"
},
"images": [
+ {
+ "filename": "openwrt-21.02.0-x86-64-generic-ext4-combined.img",
+ "version": "21.02.0",
+ "md5sum": "1ba2a5c5c05e592c36a469a8ecd3bcf5",
+ "filesize": 126353408,
+ "download_url": "https://downloads.openwrt.org/releases/21.02.0/targets/x86/64/",
+ "direct_download_url": "https://downloads.openwrt.org/releases/21.02.0/targets/x86/64/openwrt-21.02.0-x86-64-generic-ext4-combined.img.gz",
+ "compression": "gzip"
+ },
+ {
+ "filename": "openwrt-19.07.8-x86-64-combined-ext4.img",
+ "version": "19.07.8",
+ "md5sum": "a9d9776a96968a2042484330f285cae3",
+ "filesize": 285736960,
+ "download_url": "https://downloads.openwrt.org/releases/19.07.8/targets/x86/64/",
+ "direct_download_url": "https://downloads.openwrt.org/releases/19.07.8/targets/x86/64/openwrt-19.07.8-x86-64-combined-ext4.img",
+ "compression": "gzip"
+ },
{
"filename": "openwrt-19.07.7-x86-64-combined-ext4.img",
"version": "19.07.7",
@@ -168,6 +186,18 @@
}
],
"versions": [
+ {
+ "name": "21.02.0",
+ "images": {
+ "hda_disk_image": "openwrt-21.02.0-x86-64-generic-ext4-combined.img"
+ }
+ },
+ {
+ "name": "19.07.8",
+ "images": {
+ "hda_disk_image": "openwrt-19.07.8-x86-64-combined-ext4.img"
+ }
+ },
{
"name": "19.07.7",
"images": {
diff --git a/gns3server/appliances/ostinato.gns3a b/gns3server/appliances/ostinato.gns3a
index 7e72c1e9..2cbd0a87 100644
--- a/gns3server/appliances/ostinato.gns3a
+++ b/gns3server/appliances/ostinato.gns3a
@@ -1,24 +1,27 @@
{
"name": "Ostinato",
"category": "guest",
- "description": "Ostinato is an open-source, cross-platform network packet crafter/traffic generator and analyzer with a friendly GUI. Craft and send packets of several streams with different protocols at different rates.",
+ "description": "Packet crafter and traffic generator for network engineers",
"vendor_name": "Ostinato",
- "vendor_url": "http://ostinato.org/",
- "documentation_url": "http://ostinato.org/docs.html",
+ "vendor_url": "https://ostinato.org/",
+ "documentation_url": "https://ostinato.org/docs",
"product_name": "Ostinato",
- "product_url": "http://ostinato.org/",
- "registry_version": 3,
- "status": "experimental",
- "maintainer": "Bernhard Ehlers",
- "maintainer_email": "be@bernhard-ehlers.de",
- "usage": "Use interfaces starting with eth1 as traffic interfaces, eth0 is only for the (optional) management of the server/drone.",
- "symbol": "ostinato-3d-icon.svg",
- "port_name_format": "eth{0}",
+ "product_url": "https://ostinato.org/",
+ "registry_version": 4,
+ "status": "stable",
+ "availability": "service-contract",
+ "maintainer": "Srivats P",
+ "maintainer_email": "support@ostinato.org",
+ "symbol": ":/symbols/affinity/circle/gray/cog.svg",
+ "first_port_name": "eth0/mgmt",
+ "port_name_format": "eth{port1}",
+ "linked_clone": true,
"qemu": {
"adapter_type": "e1000",
"adapters": 4,
"ram": 256,
- "hda_disk_interface": "ide",
+ "cpus": 2,
+ "hda_disk_interface": "sata",
"arch": "i386",
"console_type": "vnc",
"kvm": "allow",
@@ -26,33 +29,18 @@
},
"images": [
{
- "filename": "ostinato-0.9-1.qcow2",
- "version": "0.9",
- "md5sum": "00b4856ec9fffbcbcab7a8f757355d69",
- "filesize": 101646336,
- "download_url": "http://www.bernhard-ehlers.de/projects/ostinato4gns3/index.html",
- "direct_download_url": "http://www.bernhard-ehlers.de/projects/ostinato4gns3/ostinato-0.9-1.qcow2"
- },
- {
- "filename": "ostinato-0.8-1.qcow2",
- "version": "0.8",
- "md5sum": "12e990ba695103cfac82f8771b8015d4",
- "filesize": 57344000,
- "download_url": "http://www.bernhard-ehlers.de/projects/ostinato4gns3/index.html",
- "direct_download_url": "http://www.bernhard-ehlers.de/projects/ostinato4gns3/ostinato-0.8-1.qcow2"
+ "version": "1.1",
+ "filename": "ostinatostd-1.1-1.qcow2",
+ "filesize": 134217728,
+ "md5sum": "aa027e83cefea1c38d0102eb2f28956e",
+ "download_url": "https://ostinato.org/pricing/gns3"
}
],
"versions": [
{
- "name": "0.9",
+ "name": "1.1",
"images": {
- "hda_disk_image": "ostinato-0.9-1.qcow2"
- }
- },
- {
- "name": "0.8",
- "images": {
- "hda_disk_image": "ostinato-0.8-1.qcow2"
+ "hda_disk_image": "ostinatostd-1.1-1.qcow2"
}
}
]
diff --git a/gns3server/appliances/vyos.gns3a b/gns3server/appliances/vyos.gns3a
index 20a1f3c3..f7157e4c 100644
--- a/gns3server/appliances/vyos.gns3a
+++ b/gns3server/appliances/vyos.gns3a
@@ -11,7 +11,7 @@
"status": "stable",
"maintainer": "GNS3 Team",
"maintainer_email": "developers@gns3.net",
- "usage": "Default username/password is vyos/vyos.\n\nAt first boot of versions 1.1.x/1.2.x the router will start from the cdrom. Login and then type \"install image\" and follow the instructions.",
+ "usage": "Default username/password is vyos/vyos.\n\nAt first boot the router will start from the cdrom. Login and then type \"install image\" and follow the instructions.",
"symbol": "vyos.svg",
"port_name_format": "eth{0}",
"qemu": {
@@ -26,11 +26,12 @@
},
"images": [
{
- "filename": "vyos-1.3.0-rc5-amd64.qcow2",
- "version": "1.3.0-rc5",
- "md5sum": "dd704f59afc0fccdf601cc750bf2c438",
- "filesize": 361955328,
- "direct_download_url": "https://www.mediafire.com/file/taspgxh4vj0a4j1/vyos-1.3.0-rc5-amd64.qcow2/file"
+ "filename": "vyos-1.3.0-rc6-amd64.iso",
+ "version": "1.3.0-rc6",
+ "md5sum": "b3939f82a35b23d428ee0ad4ac8be087",
+ "filesize": 331350016,
+ "download_url": "https://vyos.net/get/snapshots/",
+ "direct_download_url": "https://s3.amazonaws.com/s3-us.vyos.io/snapshot/vyos-1.3.0-rc6/vyos-1.3.0-rc6-amd64.iso"
},
{
"filename": "vyos-1.2.8-amd64.iso",
@@ -65,9 +66,10 @@
],
"versions": [
{
- "name": "1.3.0-rc5",
+ "name": "1.3.0-rc6",
"images": {
- "hda_disk_image": "vyos-1.3.0-rc5-amd64.qcow2"
+ "hda_disk_image": "empty8G.qcow2",
+ "cdrom_image": "vyos-1.3.0-rc6-amd64.iso"
}
},
{
diff --git a/gns3server/crash_report.py b/gns3server/crash_report.py
index 7c143c97..46b31fd8 100644
--- a/gns3server/crash_report.py
+++ b/gns3server/crash_report.py
@@ -59,7 +59,7 @@ class CrashReport:
Report crash to a third party service
"""
- DSN = "https://95f189bae52543e38be226cc1de2c8f3:e06825958e234a3e9ae5a81eaa21993d@o19455.ingest.sentry.io/38482"
+ DSN = "https://54d3363bab36489fb0f7cbbdda6ca7c5:9f1012f8aa1547f683e00c0aac9b99f6@o19455.ingest.sentry.io/38482"
_instance = None
def __init__(self):
diff --git a/gns3server/handlers/api/compute/server_handler.py b/gns3server/handlers/api/compute/server_handler.py
new file mode 100644
index 00000000..f2e15c5f
--- /dev/null
+++ b/gns3server/handlers/api/compute/server_handler.py
@@ -0,0 +1,135 @@
+
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2015 GNS3 Technologies Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+
+import psutil
+import platform
+
+from gns3server.web.route import Route
+from gns3server.config import Config
+from gns3server.schemas.version import VERSION_SCHEMA
+from gns3server.schemas.server_statistics import SERVER_STATISTICS_SCHEMA
+from gns3server.compute.port_manager import PortManager
+from gns3server.utils.cpu_percent import CpuPercent
+from gns3server.utils.path import get_default_project_directory
+from gns3server.version import __version__
+from aiohttp.web import HTTPConflict
+
+
+class ServerHandler:
+
+ @Route.get(
+ r"/version",
+ description="Retrieve the server version number",
+ output=VERSION_SCHEMA)
+ def version(request, response):
+
+ config = Config.instance()
+ local_server = config.get_section_config("Server").getboolean("local", False)
+ response.json({"version": __version__, "local": local_server})
+
+ @Route.get(
+ r"/statistics",
+ description="Retrieve server statistics",
+ output=SERVER_STATISTICS_SCHEMA,
+ status_codes={
+ 200: "Statistics information returned",
+ 409: "Conflict"
+ })
+ def statistics(request, response):
+
+ try:
+ memory_total = psutil.virtual_memory().total
+ memory_free = psutil.virtual_memory().available
+ memory_used = memory_total - memory_free # actual memory usage in a cross platform fashion
+ swap_total = psutil.swap_memory().total
+ swap_free = psutil.swap_memory().free
+ swap_used = psutil.swap_memory().used
+ cpu_percent = int(CpuPercent.get())
+ load_average_percent = [int(x / psutil.cpu_count() * 100) for x in psutil.getloadavg()]
+ memory_percent = int(psutil.virtual_memory().percent)
+ swap_percent = int(psutil.swap_memory().percent)
+ disk_usage_percent = int(psutil.disk_usage(get_default_project_directory()).percent)
+ except psutil.Error as e:
+ raise HTTPConflict(text="Psutil error detected: {}".format(e))
+ response.json({"memory_total": memory_total,
+ "memory_free": memory_free,
+ "memory_used": memory_used,
+ "swap_total": swap_total,
+ "swap_free": swap_free,
+ "swap_used": swap_used,
+ "cpu_usage_percent": cpu_percent,
+ "memory_usage_percent": memory_percent,
+ "swap_usage_percent": swap_percent,
+ "disk_usage_percent": disk_usage_percent,
+ "load_average_percent": load_average_percent})
+
+ @Route.get(
+ r"/debug",
+ description="Return debug information about the compute",
+ status_codes={
+ 201: "Written"
+ })
+ def debug(request, response):
+ response.content_type = "text/plain"
+ response.text = ServerHandler._getDebugData()
+
+ @staticmethod
+ def _getDebugData():
+ try:
+ addrs = ["* {}: {}".format(key, val) for key, val in psutil.net_if_addrs().items()]
+ except UnicodeDecodeError:
+ addrs = ["INVALID ADDR WITH UNICODE CHARACTERS"]
+
+ data = """Version: {version}
+OS: {os}
+Python: {python}
+CPU: {cpu}
+Memory: {memory}
+
+Networks:
+{addrs}
+""".format(
+ version=__version__,
+ os=platform.platform(),
+ python=platform.python_version(),
+ memory=psutil.virtual_memory(),
+ cpu=psutil.cpu_times(),
+ addrs="\n".join(addrs)
+ )
+
+ try:
+ connections = psutil.net_connections()
+ # You need to be root for OSX
+ except psutil.AccessDenied:
+ connections = None
+
+ if connections:
+ data += "\n\nConnections:\n"
+ for port in PortManager.instance().tcp_ports:
+ found = False
+ for open_port in connections:
+ if open_port.laddr[1] == port:
+ found = True
+ data += "TCP {}: {}\n".format(port, found)
+ for port in PortManager.instance().udp_ports:
+ found = False
+ for open_port in connections:
+ if open_port.laddr[1] == port:
+ found = True
+ data += "UDP {}: {}\n".format(port, found)
+ return data
diff --git a/gns3server/static/web-ui/26.b66762bd9b75f566201f.js b/gns3server/static/web-ui/26.30249f0e3aeb3f791226.js
similarity index 85%
rename from gns3server/static/web-ui/26.b66762bd9b75f566201f.js
rename to gns3server/static/web-ui/26.30249f0e3aeb3f791226.js
index 204670a2..40f6feae 100644
--- a/gns3server/static/web-ui/26.b66762bd9b75f566201f.js
+++ b/gns3server/static/web-ui/26.30249f0e3aeb3f791226.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkgns3_web_ui=self.webpackChunkgns3_web_ui||[]).push([[26],{91026:function(q,c,a){a.r(c),a.d(c,{TopologySummaryComponent:function(){return N}});var t=a(65508),d=a(96852),_=a(14200),m=a(36889),h=a(3941),f=a(15132),p=a(40098),v=a(39095),u=a(88802),y=a(73044),g=a(59412),x=a(93386);function T(i,e){if(1&i){var o=t.EpF();t.TgZ(0,"div",2),t.NdJ("mousemove",function(r){return t.CHM(o),t.oxw().dragWidget(r)},!1,t.evT)("mouseup",function(){return t.CHM(o),t.oxw().toggleDragging(!1)},!1,t.evT),t.qZA()}}function C(i,e){1&i&&(t.O4$(),t.TgZ(0,"svg",28),t._UZ(1,"rect",29),t.qZA())}function S(i,e){1&i&&(t.O4$(),t.TgZ(0,"svg",28),t._UZ(1,"rect",30),t.qZA())}function b(i,e){1&i&&(t.O4$(),t.TgZ(0,"svg",28),t._UZ(1,"rect",31),t.qZA())}function E(i,e){if(1&i&&(t.TgZ(0,"div"),t._uU(1),t.qZA()),2&i){var o=t.oxw().$implicit;t.xp6(1),t.lnq(" ",o.console_type," ",o.console_host,":",o.console," ")}}function Z(i,e){1&i&&(t.TgZ(0,"div"),t._uU(1," none "),t.qZA())}function O(i,e){if(1&i&&(t.TgZ(0,"div",25),t.TgZ(1,"div"),t.YNc(2,C,2,0,"svg",26),t.YNc(3,S,2,0,"svg",26),t.YNc(4,b,2,0,"svg",26),t._uU(5),t.qZA(),t.YNc(6,E,2,3,"div",27),t.YNc(7,Z,2,0,"div",27),t.qZA()),2&i){var o=e.$implicit;t.xp6(2),t.Q6J("ngIf","started"===o.status),t.xp6(1),t.Q6J("ngIf","suspended"===o.status),t.xp6(1),t.Q6J("ngIf","stopped"===o.status),t.xp6(1),t.hij(" ",o.name," "),t.xp6(1),t.Q6J("ngIf",null!=o.console&&null!=o.console&&"none"!=o.console_type),t.xp6(1),t.Q6J("ngIf",null==o.console||"none"===o.console_type)}}function M(i,e){1&i&&(t.O4$(),t.TgZ(0,"svg",28),t._UZ(1,"rect",29),t.qZA())}function w(i,e){1&i&&(t.O4$(),t.TgZ(0,"svg",28),t._UZ(1,"rect",31),t.qZA())}function A(i,e){if(1&i&&(t.TgZ(0,"div",25),t.TgZ(1,"div"),t.YNc(2,M,2,0,"svg",26),t.YNc(3,w,2,0,"svg",26),t._uU(4),t.qZA(),t.TgZ(5,"div"),t._uU(6),t.qZA(),t.TgZ(7,"div"),t._uU(8),t.qZA(),t.qZA()),2&i){var o=e.$implicit,s=t.oxw(2);t.xp6(2),t.Q6J("ngIf",o.connected),t.xp6(1),t.Q6J("ngIf",!o.connected),t.xp6(1),t.hij(" ",o.name," "),t.xp6(2),t.hij(" ",o.host," "),t.xp6(2),t.hij(" ",s.server.location," ")}}var P=function(i){return{lightTheme:i}},F=function(){return{right:!0,left:!0,bottom:!0,top:!0}};function D(i,e){if(1&i){var o=t.EpF();t.TgZ(0,"div",3),t.NdJ("mousedown",function(){return t.CHM(o),t.oxw().toggleDragging(!0)})("resizeStart",function(){return t.CHM(o),t.oxw().toggleDragging(!1)})("resizeEnd",function(n){return t.CHM(o),t.oxw().onResizeEnd(n)}),t.TgZ(1,"div",4),t.TgZ(2,"mat-tab-group"),t.TgZ(3,"mat-tab",5),t.NdJ("click",function(){return t.CHM(o),t.oxw().toggleTopologyVisibility(!0)}),t.TgZ(4,"div",6),t.TgZ(5,"div",7),t.TgZ(6,"mat-select",8),t.TgZ(7,"mat-optgroup",9),t.TgZ(8,"mat-option",10),t.NdJ("onSelectionChange",function(){return t.CHM(o),t.oxw().applyStatusFilter("started")}),t._uU(9,"started"),t.qZA(),t.TgZ(10,"mat-option",11),t.NdJ("onSelectionChange",function(){return t.CHM(o),t.oxw().applyStatusFilter("suspended")}),t._uU(11,"suspended"),t.qZA(),t.TgZ(12,"mat-option",12),t.NdJ("onSelectionChange",function(){return t.CHM(o),t.oxw().applyStatusFilter("stopped")}),t._uU(13,"stopped"),t.qZA(),t.qZA(),t.TgZ(14,"mat-optgroup",13),t.TgZ(15,"mat-option",14),t.NdJ("onSelectionChange",function(){return t.CHM(o),t.oxw().applyCaptureFilter("capture")}),t._uU(16,"active capture(s)"),t.qZA(),t.TgZ(17,"mat-option",15),t.NdJ("onSelectionChange",function(){return t.CHM(o),t.oxw().applyCaptureFilter("packet")}),t._uU(18,"active packet captures"),t.qZA(),t.qZA(),t.qZA(),t.qZA(),t.TgZ(19,"div",16),t.TgZ(20,"mat-select",17),t.NdJ("selectionChange",function(){return t.CHM(o),t.oxw().setSortingOrder()})("valueChange",function(n){return t.CHM(o),t.oxw().sortingOrder=n}),t.TgZ(21,"mat-option",18),t._uU(22,"sort by name ascending"),t.qZA(),t.TgZ(23,"mat-option",19),t._uU(24,"sort by name descending"),t.qZA(),t.qZA(),t.qZA(),t._UZ(25,"mat-divider",20),t.TgZ(26,"div",21),t.YNc(27,O,8,6,"div",22),t.qZA(),t.qZA(),t.qZA(),t.TgZ(28,"mat-tab",23),t.NdJ("click",function(){return t.CHM(o),t.oxw().toggleTopologyVisibility(!1)}),t.TgZ(29,"div",6),t.TgZ(30,"div",24),t.YNc(31,A,9,5,"div",22),t.qZA(),t.qZA(),t.qZA(),t.qZA(),t.qZA(),t.qZA()}if(2&i){var s=t.oxw();t.Q6J("ngStyle",s.style)("ngClass",t.VKq(9,P,s.isLightThemeEnabled))("validateResize",s.validate)("resizeEdges",t.DdM(11,F))("enableGhostResize",!0),t.xp6(20),t.Q6J("value",s.sortingOrder),t.xp6(6),t.Q6J("ngStyle",s.styleInside),t.xp6(1),t.Q6J("ngForOf",s.filteredNodes),t.xp6(4),t.Q6J("ngForOf",s.computes)}}var N=function(){function i(e,o,s,r,n){this.nodesDataSource=e,this.projectService=o,this.computeService=s,this.linksDataSource=r,this.themeService=n,this.closeTopologySummary=new t.vpe,this.style={},this.styleInside={height:"280px"},this.subscriptions=[],this.nodes=[],this.filteredNodes=[],this.sortingOrder="asc",this.startedStatusFilterEnabled=!1,this.suspendedStatusFilterEnabled=!1,this.stoppedStatusFilterEnabled=!1,this.captureFilterEnabled=!1,this.packetFilterEnabled=!1,this.computes=[],this.isTopologyVisible=!0,this.isDraggingEnabled=!1,this.isLightThemeEnabled=!1}return i.prototype.ngOnInit=function(){var e=this;this.isLightThemeEnabled="light"===this.themeService.getActualTheme(),this.subscriptions.push(this.nodesDataSource.changes.subscribe(function(o){e.nodes=o,e.nodes.forEach(function(s){("0.0.0.0"===s.console_host||"0:0:0:0:0:0:0:0"===s.console_host||"::"===s.console_host)&&(s.console_host=e.server.host)}),e.filteredNodes=o.sort("asc"===e.sortingOrder?e.compareAsc:e.compareDesc)})),this.projectService.getStatistics(this.server,this.project.project_id).subscribe(function(o){e.projectsStatistics=o}),this.computeService.getComputes(this.server).subscribe(function(o){e.computes=o}),this.style={top:"60px",right:"0px",width:"320px",height:"400px"}},i.prototype.toggleDragging=function(e){this.isDraggingEnabled=e},i.prototype.dragWidget=function(e){var o=Number(e.movementX),s=Number(e.movementY),r=Number(this.style.width.split("px")[0]),n=Number(this.style.height.split("px")[0]),l=Number(this.style.top.split("px")[0])+s;if(this.style.left){var I=Number(this.style.left.split("px")[0])+o;this.style={position:"fixed",left:I+"px",top:l+"px",width:r+"px",height:n+"px"}}else{var U=Number(this.style.right.split("px")[0])-o;this.style={position:"fixed",right:U+"px",top:l+"px",width:r+"px",height:n+"px"}}},i.prototype.validate=function(e){return!(e.rectangle.width&&e.rectangle.height&&(e.rectangle.width<290||e.rectangle.height<260))},i.prototype.onResizeEnd=function(e){this.style={position:"fixed",left:e.rectangle.left+"px",top:e.rectangle.top+"px",width:e.rectangle.width+"px",height:e.rectangle.height+"px"},this.styleInside={height:e.rectangle.height-120+"px"}},i.prototype.toggleTopologyVisibility=function(e){this.isTopologyVisible=e},i.prototype.compareAsc=function(e,o){return e.name
-
+
@@ -46,6 +46,6 @@
gtag('config', 'G-5D6FZL9923');
-
+