ing
This commit is contained in:
parent
e5f3cb9a76
commit
1c4183c62c
|
@ -100,6 +100,7 @@
|
||||||
"primer-support": "^4.0.0",
|
"primer-support": "^4.0.0",
|
||||||
"protractor": "~5.3.0",
|
"protractor": "~5.3.0",
|
||||||
"rimraf": "^2.6.2",
|
"rimraf": "^2.6.2",
|
||||||
|
"save-svg-as-png": "^1.4.6",
|
||||||
"source-map-support": "^0.5.8",
|
"source-map-support": "^0.5.8",
|
||||||
"ts-node": "~5.0.1",
|
"ts-node": "~5.0.1",
|
||||||
"tslint": "~5.9.1",
|
"tslint": "~5.9.1",
|
||||||
|
@ -110,4 +111,4 @@
|
||||||
"webpack-node-externals": "^1.7.2",
|
"webpack-node-externals": "^1.7.2",
|
||||||
"zone.js": "^0.8.26"
|
"zone.js": "^0.8.26"
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -6,7 +6,7 @@ import { map, catchError, take } from 'rxjs/operators';
|
||||||
import { Host } from '@overflow/model/discovery';
|
import { Host } from '@overflow/model/discovery';
|
||||||
import { PingResult } from '@overflow/model/ping';
|
import { PingResult } from '@overflow/model/ping';
|
||||||
|
|
||||||
import { ProbeService } from '../service/probe.service';
|
import { ProbeService } from '../../service/probe.service';
|
||||||
import { AutoHeightDirective } from '@overflow/commons/ui/directive/auto-height.directive';
|
import { AutoHeightDirective } from '@overflow/commons/ui/directive/auto-height.directive';
|
||||||
|
|
||||||
|
|
4
src/commons/component/detail/index.ts
Normal file
4
src/commons/component/detail/index.ts
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
export * from './host-detail.component';
|
||||||
|
export * from './node-detail.component';
|
||||||
|
export * from './service-detail.component';
|
||||||
|
export * from './zone-detail.component';
|
|
@ -1,7 +1,7 @@
|
||||||
import { Component, Input, OnChanges, SimpleChanges, ViewChildren, QueryList } from '@angular/core';
|
import { Component, Input, OnChanges, SimpleChanges, ViewChildren, QueryList } from '@angular/core';
|
||||||
import { Service } from '@overflow/model/discovery';
|
import { Service } from '@overflow/model/discovery';
|
||||||
import { PingResult } from '@overflow/model/ping';
|
import { PingResult } from '@overflow/model/ping';
|
||||||
import { ProbeService } from '../service/probe.service';
|
import { ProbeService } from '../../service/probe.service';
|
||||||
import { map, catchError, take } from 'rxjs/operators';
|
import { map, catchError, take } from 'rxjs/operators';
|
||||||
import { of } from 'rxjs';
|
import { of } from 'rxjs';
|
||||||
import { AutoHeightDirective } from '@overflow/commons/ui/directive/auto-height.directive';
|
import { AutoHeightDirective } from '@overflow/commons/ui/directive/auto-height.directive';
|
65
src/commons/component/discovery/discovery-map.component.html
Normal file
65
src/commons/component/discovery/discovery-map.component.html
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
<div>
|
||||||
|
<svg #discoveryTarget width="100%" height="100%">
|
||||||
|
<g>
|
||||||
|
<g *ngFor="let link of links">
|
||||||
|
<g class="link-container" [ngClass]="'link-'+link.target.group" [attr.sourceId]="link.source.id"
|
||||||
|
[attr.targetId]="link.target.id">
|
||||||
|
<line class="link" [attr.x1]="link.source.x" [attr.y1]="link.source.y" [attr.x2]="link.target.x" [attr.y2]="link.target.y"></line>
|
||||||
|
<text *ngIf="link.target.group === 'service'" class="linkTextClass" [attr.x]="(link.source.x - link.target.x) / 2 + link.target.x"
|
||||||
|
[attr.y]="(link.source.y - link.target.y) / 2 + link.target.y">{{link.target.target.port.portNumber}}</text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g *ngFor="let node of nodes">
|
||||||
|
<g class="node-container" [ngClass]="node.group" [attr.nodeId]="node.id" [attr.transform]="'translate(' + node.x + ',' + node.y + ')'">
|
||||||
|
<g *ngIf="node.group === 'zone'">
|
||||||
|
<image [attr.x]="-node.r" [attr.y]="-node.r" [attr.width]="node.r * 2" [attr.height]="node.r * 2"
|
||||||
|
xlink:href="assets/image/node/icon/icon_overflow.svg"></image>
|
||||||
|
</g>
|
||||||
|
<g *ngIf="node.group === 'zone'">
|
||||||
|
<text class="textClass" [attr.y]="(node.r - 10) / 10 + 'em'" text-anchor="middle">{{node.target.network}}</text>
|
||||||
|
</g>
|
||||||
|
<g *ngIf="node.group !== 'zone'">
|
||||||
|
<image [attr.x]="-node.r" [attr.y]="-node.r" [attr.width]="node.r * 2" [attr.height]="node.r * 2"
|
||||||
|
xlink:href="assets/image/node/icon/icon_background.svg"></image>
|
||||||
|
</g>
|
||||||
|
<g *ngIf="node.group === 'host'">
|
||||||
|
<image [attr.x]="-node.r" [attr.y]="-node.r" [attr.width]="node.r * 2" [attr.height]="node.r * 2"
|
||||||
|
attr.xlink:href="assets/image/node/icon/icon_{{node.target.hostType | lowercase}}.svg"></image>
|
||||||
|
</g>
|
||||||
|
<g *ngIf="node.group === 'host' && node.target.hostType === 'HOST' && node.target.osType !== 'UNKNOWN'">
|
||||||
|
<image [attr.x]="-node.r" [attr.y]="-node.r" [attr.width]="node.r * 2" [attr.height]="node.r * 2"
|
||||||
|
attr.xlink:href="assets/image/node/logo/logo_{{node.target.osType | lowercase}}.svg"></image>
|
||||||
|
</g>
|
||||||
|
<!-- <g *ngIf="node.group === 'host' && node.target.hostType !== 'HOST' && node.target.hostVendor !== ''">
|
||||||
|
<text class="textClass" [attr.y]="(node.r - 30) / 10 + 'em'" text-anchor="middle">{{node.target.hostVendor}}</text>
|
||||||
|
</g> -->
|
||||||
|
<g *ngIf="node.group === 'host'">
|
||||||
|
<text class="textClass" [attr.y]="(node.r - 10) / 10 + 'em'" text-anchor="middle">{{node.target.address}}</text>
|
||||||
|
</g>
|
||||||
|
<g *ngIf="node.group === 'service'">
|
||||||
|
<image [attr.x]="-node.r" [attr.y]="-node.r" [attr.width]="node.r * 2" [attr.height]="node.r * 2"
|
||||||
|
attr.xlink:href="assets/image/node/icon/icon_{{node.target.serviceType | lowercase}}.svg"></image>
|
||||||
|
</g>
|
||||||
|
<g *ngIf="node.group === 'service' && node.target.key !== 'UNKNOWN'">
|
||||||
|
<image [attr.x]="-node.r" [attr.y]="-node.r" [attr.width]="node.r * 2" [attr.height]="node.r * 2"
|
||||||
|
attr.xlink:href="assets/image/node/logo/logo_{{node.target.key | lowercase}}.svg"></image>
|
||||||
|
</g>
|
||||||
|
<g *ngIf="node.group === 'service'">
|
||||||
|
<text class="textClass" [attr.y]="(node.r - 10) / 10 + 'em'" text-anchor="middle">{{node.target.name}}</text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
<p-card class="ui-map-info" *ngIf="discoveryResult">
|
||||||
|
<div class="ui-map-info-row ui-border-bottom">
|
||||||
|
<div>Total Hosts: </div>{{discoveryResult.totalHosts}}
|
||||||
|
</div>
|
||||||
|
<div class="ui-map-info-row ui-border-bottom">
|
||||||
|
<div>Total Services: </div>{{discoveryResult.totalServices}}
|
||||||
|
</div>
|
||||||
|
<div class="ui-map-info-row">
|
||||||
|
<div>Elapsed: </div>{{discoveryResult.elapsedTime}}
|
||||||
|
</div>
|
||||||
|
</p-card>
|
||||||
|
</div>
|
96
src/commons/component/discovery/discovery-map.component.ts
Normal file
96
src/commons/component/discovery/discovery-map.component.ts
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
import {
|
||||||
|
Component,
|
||||||
|
Input,
|
||||||
|
OnInit,
|
||||||
|
EventEmitter,
|
||||||
|
Output,
|
||||||
|
ViewChild,
|
||||||
|
OnDestroy,
|
||||||
|
ElementRef
|
||||||
|
} from '@angular/core';
|
||||||
|
import { Node } from '../../model/node';
|
||||||
|
import { Link } from '../../model/link';
|
||||||
|
import { Zone } from '@overflow/model/discovery';
|
||||||
|
|
||||||
|
|
||||||
|
export class DiscoveryResult {
|
||||||
|
totalHosts: number;
|
||||||
|
totalServices: number;
|
||||||
|
elapsedTime: string;
|
||||||
|
|
||||||
|
hTimer: any;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.totalHosts = 0;
|
||||||
|
this.totalServices = 0;
|
||||||
|
this.elapsedTime = '00:00:00';
|
||||||
|
}
|
||||||
|
|
||||||
|
start() {
|
||||||
|
const __this = this;
|
||||||
|
const startTime = new Date().getTime();
|
||||||
|
this.hTimer = setInterval(function () {
|
||||||
|
// Get todays date and time
|
||||||
|
const now = new Date().getTime();
|
||||||
|
|
||||||
|
// Find the distance between now and the count down date
|
||||||
|
const distance = now - startTime;
|
||||||
|
|
||||||
|
// Time calculations for days, hours, minutes and seconds
|
||||||
|
const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
|
||||||
|
const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
|
||||||
|
const seconds = Math.floor((distance % (1000 * 60)) / 1000);
|
||||||
|
|
||||||
|
__this.setElapsedTime(hours, minutes, seconds);
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
setElapsedTime(hour: number, minute: number, second: number) {
|
||||||
|
this.elapsedTime = String(hour).padStart(2, '0') + ':' + String(minute).padStart(2, '0') + ':' + String(second).padStart(2, '0');
|
||||||
|
}
|
||||||
|
|
||||||
|
stop(hours: number, minutes: number, seconds: number) {
|
||||||
|
clearInterval(this.hTimer);
|
||||||
|
this.setElapsedTime(hours, minutes, seconds);
|
||||||
|
}
|
||||||
|
|
||||||
|
increaseHost() {
|
||||||
|
this.totalHosts++;
|
||||||
|
}
|
||||||
|
|
||||||
|
increaseService() {
|
||||||
|
this.totalServices++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-discovery-map',
|
||||||
|
templateUrl: './discovery-map.component.html',
|
||||||
|
styleUrls: ['./discovery-map.component.scss']
|
||||||
|
})
|
||||||
|
export class DiscoveryMapComponent implements OnInit {
|
||||||
|
@Input() zone: Zone;
|
||||||
|
|
||||||
|
@Input() nodes: Node[];
|
||||||
|
|
||||||
|
@Input() links: Link[];
|
||||||
|
|
||||||
|
|
||||||
|
@ViewChild('discoveryTarget') set discoveryTarget(content: ElementRef) {
|
||||||
|
this.discoveryTargetRef = content;
|
||||||
|
}
|
||||||
|
|
||||||
|
private discoveryTargetRef: ElementRef;
|
||||||
|
public simulation: d3.Simulation<Node, Link> | undefined;
|
||||||
|
private zoomBehavior: d3.ZoomBehavior<Element, {}>;
|
||||||
|
private discoveryContainerWidth: number;
|
||||||
|
private discoveryContainerHeight: number;
|
||||||
|
private readonly maxScale: number;
|
||||||
|
private readonly minScale: number;
|
||||||
|
|
||||||
|
constructor() { }
|
||||||
|
|
||||||
|
ngOnInit(): void {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,9 +1,9 @@
|
||||||
import { NicDropdownComponent } from './nic-dropdown.component';
|
import {
|
||||||
import { ScannerSettingDropdownComponent } from './scanner-setting-dropdown.component';
|
HostDetailComponent,
|
||||||
import { NodeDetailComponent } from './node-detail.component';
|
NodeDetailComponent,
|
||||||
import { ZoneDetailComponent } from './zone-detail.component';
|
ServiceDetailComponent,
|
||||||
import { HostDetailComponent } from './host-detail.component';
|
ZoneDetailComponent,
|
||||||
import { ServiceDetailComponent } from './service-detail.component';
|
} from './detail';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
AboutComponent,
|
AboutComponent,
|
||||||
|
@ -12,6 +12,10 @@ import {
|
||||||
PrintComponent,
|
PrintComponent,
|
||||||
} from './menu';
|
} from './menu';
|
||||||
|
|
||||||
|
import {
|
||||||
|
NicDropdownComponent,
|
||||||
|
ScannerSettingDropdownComponent,
|
||||||
|
} from './toolbar';
|
||||||
|
|
||||||
export const COMPONENTS = [
|
export const COMPONENTS = [
|
||||||
NicDropdownComponent,
|
NicDropdownComponent,
|
||||||
|
@ -24,5 +28,4 @@ export const COMPONENTS = [
|
||||||
ExportCSVComponent,
|
ExportCSVComponent,
|
||||||
PreferencesComponent,
|
PreferencesComponent,
|
||||||
PrintComponent,
|
PrintComponent,
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|
2
src/commons/component/toolbar/index.ts
Normal file
2
src/commons/component/toolbar/index.ts
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
export * from './nic-dropdown.component';
|
||||||
|
export * from './scanner-setting-dropdown.component';
|
|
@ -11,7 +11,7 @@ import {
|
||||||
import { of } from 'rxjs';
|
import { of } from 'rxjs';
|
||||||
import { catchError, map, take } from 'rxjs/operators';
|
import { catchError, map, take } from 'rxjs/operators';
|
||||||
|
|
||||||
import { ProbeService } from '../service/probe.service';
|
import { ProbeService } from '../../service/probe.service';
|
||||||
import { Interface } from '@overflow/model/net/nic';
|
import { Interface } from '@overflow/model/net/nic';
|
||||||
import { SelectItem } from 'primeng/primeng';
|
import { SelectItem } from 'primeng/primeng';
|
||||||
import { Zone } from '@overflow/model/discovery';
|
import { Zone } from '@overflow/model/discovery';
|
||||||
|
@ -43,7 +43,7 @@ export class NicDropdownComponent implements OnInit {
|
||||||
nics: SelectItem[] = [];
|
nics: SelectItem[] = [];
|
||||||
selected: NICInfo;
|
selected: NICInfo;
|
||||||
|
|
||||||
constructor(private probeService: ProbeService) {}
|
constructor(private probeService: ProbeService) { }
|
||||||
|
|
||||||
ngOnInit(): void {
|
ngOnInit(): void {
|
||||||
this.probeService
|
this.probeService
|
|
@ -2,7 +2,7 @@ import { Component, Input, OnInit, ViewChild, Output, EventEmitter } from '@angu
|
||||||
import { DropdownPanelComponent } from '@overflow/commons/ui/component/primeng';
|
import { DropdownPanelComponent } from '@overflow/commons/ui/component/primeng';
|
||||||
import { DiscoverHost, Zone } from '@overflow/model/discovery';
|
import { DiscoverHost, Zone } from '@overflow/model/discovery';
|
||||||
import { toMetaIPType, MetaIPTypeEnum, MetaPortTypeEnum } from '@overflow/model/meta';
|
import { toMetaIPType, MetaIPTypeEnum, MetaPortTypeEnum } from '@overflow/model/meta';
|
||||||
import { DiscoveryConfigService } from '../service/discovery-config.service';
|
import { DiscoveryConfigService } from '../../service/discovery-config.service';
|
||||||
|
|
||||||
const IPCIDR = require('ip-cidr');
|
const IPCIDR = require('ip-cidr');
|
||||||
|
|
|
@ -7619,6 +7619,11 @@ saucelabs@^1.5.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
https-proxy-agent "^2.2.1"
|
https-proxy-agent "^2.2.1"
|
||||||
|
|
||||||
|
save-svg-as-png@^1.4.6:
|
||||||
|
version "1.4.6"
|
||||||
|
resolved "https://nexus.loafle.net/repository/npm-all/save-svg-as-png/-/save-svg-as-png-1.4.6.tgz#8c66dc0a418ae7574ca9783066303781ede47f4d"
|
||||||
|
integrity sha512-CeN0wtmKW02/qfTtXFfiCCniyGExRzPKpp2xOdY8cbLEeIQPWKhSCd1HUl/dGH7WDu2As6Wecs14rlV2Jaf9lg==
|
||||||
|
|
||||||
sax@0.5.x:
|
sax@0.5.x:
|
||||||
version "0.5.8"
|
version "0.5.8"
|
||||||
resolved "https://nexus.loafle.net/repository/npm-all/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1"
|
resolved "https://nexus.loafle.net/repository/npm-all/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1"
|
||||||
|
|
Loading…
Reference in New Issue
Block a user