diff --git a/package.json b/package.json index df831fe3..92d68d40 100644 --- a/package.json +++ b/package.json @@ -66,6 +66,7 @@ "d3-ng2-service": "^2.2.0", "eev": "^0.1.5", "ini": "^2.0.0", + "ipaddr.js": "^2.1.0", "material-design-icons": "^3.0.1", "mousetrap": "^1.6.5", "ng-circle-progress": "^1.6.0", diff --git a/src/app/components/project-map/context-menu/actions/console-device-action-browser/console-device-action-browser.component.ts b/src/app/components/project-map/context-menu/actions/console-device-action-browser/console-device-action-browser.component.ts index 299eb81f..57f5df01 100644 --- a/src/app/components/project-map/context-menu/actions/console-device-action-browser/console-device-action-browser.component.ts +++ b/src/app/components/project-map/context-menu/actions/console-device-action-browser/console-device-action-browser.component.ts @@ -4,6 +4,7 @@ import { Node } from '../../../../../cartography/models/node'; import { Server } from '../../../../../models/server'; import { NodeService } from '../../../../../services/node.service'; import { ToasterService } from '../../../../../services/toaster.service'; +import * as ipaddr from 'ipaddr.js'; @Component({ selector: 'app-console-device-action-browser', @@ -63,14 +64,18 @@ export class ConsoleDeviceActionBrowserComponent { try { var uri; + var host = this.node.console_host; + if (ipaddr.IPv6.isValid(host)) { + host = `[${host}]`; + } if (this.node.console_type === 'telnet') { - uri = `gns3+telnet://[${this.node.console_host}]:${this.node.console}?name=${this.node.name}&project_id=${this.node.project_id}&node_id=${this.node.node_id}`; + uri = `gns3+telnet://${host}:${this.node.console}?name=${this.node.name}&project_id=${this.node.project_id}&node_id=${this.node.node_id}`; } else if (this.node.console_type === 'vnc') { - uri = `gns3+vnc://[${this.node.console_host}]:${this.node.console}?name=${this.node.name}&project_id=${this.node.project_id}&node_id=${this.node.node_id}`; + uri = `gns3+vnc://${host}:${this.node.console}?name=${this.node.name}&project_id=${this.node.project_id}&node_id=${this.node.node_id}`; } else if (this.node.console_type.startsWith('spice')) { - uri = `gns3+spice://[${this.node.console_host}]:${this.node.console}?name=${this.node.name}&project_id=${this.node.project_id}&node_id=${this.node.node_id}` + uri = `gns3+spice://${host}:${this.node.console}?name=${this.node.name}&project_id=${this.node.project_id}&node_id=${this.node.node_id}` } else if (this.node.console_type.startsWith('http')) { - uri = `${this.node.console_type}://[${this.node.console_host}]:${this.node.console}` + uri = `${this.node.console_type}://${host}:${this.node.console}` return window.open(uri); // open an http console directly in a new window/tab } else { this.toasterService.error('Supported console types are: telnet, vnc, spice and spice+agent.'); diff --git a/src/app/components/project-map/log-console/log-console.component.ts b/src/app/components/project-map/log-console/log-console.component.ts index 5de9592e..59412210 100644 --- a/src/app/components/project-map/log-console/log-console.component.ts +++ b/src/app/components/project-map/log-console/log-console.component.ts @@ -26,6 +26,7 @@ import { NodeConsoleService } from '../../../services/nodeConsole.service'; import { ThemeService } from '../../../services/theme.service'; import { version } from '../../../version'; import { LogEventsDataSource } from './log-events-datasource'; +import * as ipaddr from 'ipaddr.js'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, @@ -224,20 +225,24 @@ export class LogConsoleComponent implements OnInit, AfterViewInit, OnDestroy { } else if (this.regexConsole.test(this.command)) { if (node.status === 'started') { this.showCommand(`Launching console for node ${splittedCommand[1]}...`); + var host = node.console_host; + if (ipaddr.IPv6.isValid(host)) { + host = `[${host}]`; + } if (node.console_type === 'telnet') { location.assign( - `gns3+telnet://[${node.console_host}]:${node.console}?name=${node.name}&project_id=${node.project_id}&node_id=${node.node_id}` + `gns3+telnet://${host}:${node.console}?name=${node.name}&project_id=${node.project_id}&node_id=${node.node_id}` ); } else if (node.console_type === 'vnc') { location.assign( - `gns3+vnc://[${node.console_host}]:${node.console}?name=${node.name}&project_id=${node.project_id}&node_id=${node.node_id}` + `gns3+vnc://${host}:${node.console}?name=${node.name}&project_id=${node.project_id}&node_id=${node.node_id}` ); } else if (node.console_type.startsWith('spice')) { location.assign( - `gns3+spice://[${node.console_host}]:${node.console}?name=${node.name}&project_id=${node.project_id}&node_id=${node.node_id}` + `gns3+spice://${host}:${node.console}?name=${node.name}&project_id=${node.project_id}&node_id=${node.node_id}` ); } else if (node.console_type.startsWith('http')) { - window.open(`${node.console_type}://[${node.console_host}]:${node.console}`); + window.open(`${node.console_type}://${host}:${node.console}`); } else { this.showCommand('Supported console types are: telnet, vnc, spice and spice+agent'); } diff --git a/yarn.lock b/yarn.lock index b7c9fe3d..597441de 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6148,6 +6148,11 @@ ipaddr.js@1.9.1, ipaddr.js@^1.9.0: resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +ipaddr.js@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" + integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== + is-absolute-url@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698"