import { AfterContentInit, Component, Input, EventEmitter, Output, SimpleChanges, OnInit, } from '@angular/core'; import { Anim } from './animation'; import { TreeNode } from 'primeng/primeng'; import { DiscoveryNotify } from '../subscriber/discovery.subscriber'; import { DiscoverZone, Zone, Host, Port, Service } from '@overflow/commons-typescript/model/discovery'; import { Subscription } from 'rxjs'; import { ProbeHost } from '@overflow/commons-typescript/model/probe'; @Component({ selector: 'of-discovery-result', templateUrl: './search-result.component.html', animations: Anim }) export class SearchResultComponent implements OnInit { @Input() probeHost: ProbeHost; @Output() stop = new EventEmitter(); @Input() started: boolean; // Temporary discoverySubscription: Subscription; zoneNode: TreeNode[] = []; hostNode: TreeNode[] = []; selectedItems = []; tempHostId = 0; // Temporary constructor( ) { } ngOnInit(): void { this.zoneNode.push({ label: this.probeHost.probe.cidr, type: 'ZONE', data: { }, children: this.hostNode, expanded: true }); } tempHost() { const idx = Math.floor(Math.random() * (255)); const host: Host = { id: this.tempHostId++, ipv4: '192.168.1.' + idx, }; this.addHostNode(host); } tempService() { const idx = Math.floor(Math.random() * (255)); const hostId = Math.floor(Math.random() * (this.tempHostId - 1)); const service: Service = { id: idx, serviceName: 'Service', port: { portNumber: idx, portType: idx % 2 === 0 ? 'TCP' : 'UDP', host: { id: hostId } } }; this.addServiceNode(service); } addHostNode(host: Host) { const idx = this.findHostIndex(host); this.hostNode.splice(idx, 0, { type: 'HOST', label: host.ipv4, data: { id: host.id, ip: this.convertIPtoNumber(host.ipv4), }, expanded: true, children: [] }); } addServiceNode(service: Service) { const targetHostNode = this.findHostNodeByService(service); const idx = this.findServiceIndex(targetHostNode.children, service); targetHostNode.children[idx] = { type: 'SERVICE', label: service.serviceName, data: { id: service.id, portType: service.port.portType, portNumber: service.port.portNumber, }, }; } onTargetSelect(e, data) { if (e.checked) { this.selectedItems.push(data); } else { const index = this.selectedItems.indexOf(data); this.selectedItems.splice(index, 1); } } findHostIndex(host: Host): number { let index = 0; this.hostNode.forEach(node => { if (node.data.ip < this.convertIPtoNumber(host.ipv4)) { index++; } }); return index; } findServiceIndex(serviceNodes: TreeNode[], service: Service) { let index = 0; serviceNodes.forEach(node => { if (node.data.portNumber < service.port.portNumber) { index++; } }); return index; } findHostNodeByService(service: Service) { let targetHost = null; this.hostNode.forEach((value, i) => { if (value.data.id === service.port.host.id) { targetHost = this.hostNode[i]; return; } }); return targetHost; } convertIPtoNumber(ip: string) { return ip.split('.').map((octet, index, array) => { // tslint:disable-next-line:radix return parseInt(octet) * Math.pow(256, (array.length - index - 1)); }).reduce((prev, curr) => { return prev + curr; }); } }