Browse Source

packet stats per node

main
gsd 5 months ago
parent
commit
6923d0922e
  1. 2
      ui/src/app/app-routing.module.ts
  2. 2
      ui/src/app/app.component.ts
  3. 2
      ui/src/app/app.module.ts
  4. 9
      ui/src/app/components/nodes/AllNodes.component.ts
  5. 12
      ui/src/app/components/nodes/nodes-list.component.ts
  6. 307
      ui/src/app/components/packet/NetworkStatus.component.ts

2
ui/src/app/app-routing.module.ts

@ -8,7 +8,7 @@ import {NetworkStatusComponent} from "./components/packet/NetworkStatus.componen
const routes: Routes = [ const routes: Routes = [
{path: "nodes/:type", component: NodesListComponent}, {path: "nodes/:type", component: NodesListComponent},
{path: "messages", component: MessageHistoryComponent}, {path: "messages", component: MessageHistoryComponent},
{path: "network/status", component: NetworkStatusComponent}, {path: "network/status/:num", component: NetworkStatusComponent},
{path: "", component: BotCommandsComponent} {path: "", component: BotCommandsComponent}
]; ];

2
ui/src/app/app.component.ts

@ -22,7 +22,7 @@ export class AppComponent implements OnInit {
userNode!: NodeDTO userNode!: NodeDTO
routes: {name: string, url: string}[] = [ routes: {name: string, url: string}[] = [
{name: "Статистика сети", url:"network/status"}, {name: "Статистика сети", url:"network/status/0"},
{name: "История сообщений", url:"messages"}, {name: "История сообщений", url:"messages"},
{name: "Прямые ноды", url:"nodes/direct"}, {name: "Прямые ноды", url:"nodes/direct"},
{name: "Все ноды", url:"nodes/list"}, {name: "Все ноды", url:"nodes/list"},

2
ui/src/app/app.module.ts

@ -12,7 +12,6 @@ import {HttpClientModule, HTTP_INTERCEPTORS} from "@angular/common/http";
import {BotCommandsComponent} from "./components/botCommands/BotCommands.component"; import {BotCommandsComponent} from "./components/botCommands/BotCommands.component";
import {MessageHistoryComponent} from "./components/messages/MessageHistory.component"; import {MessageHistoryComponent} from "./components/messages/MessageHistory.component";
import {NodesListComponent, NodeDtoSearchPipe, NodeDtoSortPipe} from "./components/nodes/nodes-list.component"; import {NodesListComponent, NodeDtoSearchPipe, NodeDtoSortPipe} from "./components/nodes/nodes-list.component";
import {AllNodesComponent} from "./components/nodes/AllNodes.component";
import {AuthDialog, AuthInterceptor} from "./auth/AuthInterceptor"; import {AuthDialog, AuthInterceptor} from "./auth/AuthInterceptor";
import {MatDialogModule} from "@angular/material/dialog"; import {MatDialogModule} from "@angular/material/dialog";
import {MatTabsModule} from "@angular/material/tabs"; import {MatTabsModule} from "@angular/material/tabs";
@ -31,7 +30,6 @@ import {NetworkStatusComponent} from "./components/packet/NetworkStatus.componen
BotCommandsComponent, BotCommandsComponent,
MessageHistoryComponent, MessageHistoryComponent,
NodesListComponent, NodesListComponent,
AllNodesComponent,
AuthDialog, AuthDialog,
NetworkStatusComponent NetworkStatusComponent
], ],

9
ui/src/app/components/nodes/AllNodes.component.ts

@ -1,9 +0,0 @@
import {Component} from "@angular/core";
@Component({
selector: "app-all-nodes",
template: ``
})
export class AllNodesComponent {
}

12
ui/src/app/components/nodes/nodes-list.component.ts

@ -44,9 +44,10 @@ import {numToColor} from "../../utils/Utils";
</mat-card-content>--> </mat-card-content>-->
<mat-card-actions> <mat-card-actions>
<button mat-button>{{node.ts * 1000 | date:"HH:mm dd.MM.yyyy"}}</button>
<button mat-button *ngIf="node.hops_away > 0">Прыжков: {{node.hops_away}}</button> <button mat-button *ngIf="node.hops_away > 0">Прыжков: {{node.hops_away}}</button>
<button mat-button>SNR: {{node.snr}}</button> <button mat-button>SNR: {{node.snr}}</button>
<button mat-button>{{node.ts * 1000 | date:"HH:mm dd.MM.yyyy"}}</button> <button mat-button (click)="goTo('/network/status/' + node.num)">Статистика</button>
</mat-card-actions> </mat-card-actions>
</mat-card> </mat-card>
</div> </div>
@ -56,7 +57,8 @@ import {numToColor} from "../../utils/Utils";
export class NodesListComponent implements OnInit { export class NodesListComponent implements OnInit {
numToColor = numToColor numToColor = numToColor
constructor(private http: HttpClient, constructor(private http: HttpClient,
private route: ActivatedRoute) { private route: ActivatedRoute,
private router: Router) {
} }
nodes: NodeDTO[] = []; nodes: NodeDTO[] = [];
@ -84,10 +86,14 @@ export class NodesListComponent implements OnInit {
} }
) )
} }
goTo(url: string) {
this.router.navigate([url]);
}
} }
import { Pipe, PipeTransform } from '@angular/core'; import { Pipe, PipeTransform } from '@angular/core';
import {ActivatedRoute} from "@angular/router"; import {ActivatedRoute, Router} from "@angular/router";
@Pipe({ @Pipe({
name: 'NodeDtoSort', name: 'NodeDtoSort',
standalone: true standalone: true

307
ui/src/app/components/packet/NetworkStatus.component.ts

@ -5,17 +5,24 @@ import {Chart} from "chart.js/auto";
import {numToColor} from "../../utils/Utils"; import {numToColor} from "../../utils/Utils";
import {KeyValueMap} from "../../entities/KeyValueMap"; import {KeyValueMap} from "../../entities/KeyValueMap";
import {NodeDTO} from "../../entities/NodeDTO"; import {NodeDTO} from "../../entities/NodeDTO";
import {ActivatedRoute} from "@angular/router";
@Component({ @Component({
selector: "app-network-status", selector: "app-network-status",
template: ` template: `
<div style="width: 80%; padding: 0 10%;"> <div style="width: 80%; padding: 0 10%;">
<div *ngFor="let type of graphs" class="card-wrapper-450" style="padding-top: 12px"> <div [ngSwitch]="MODE">
<mat-card *ngFor="let p1 of type.cards"> <h1 *ngSwitchCase="'ALL'">Статистика всей сети</h1>
<mat-card-content> <h1 *ngSwitchCase="'NODE'">Статистика ноды {{getNumName(NUM)}} в сети</h1>
<canvas [id]="p1.canvasId">{{p1.chart}}</canvas> </div>
</mat-card-content> <div *ngFor="let type of graphs" >
</mat-card> <div *ngIf="MODE == type.requestMode" class="card-wrapper-450" style="padding-top: 12px">
<mat-card *ngFor="let p1 of type.cards">
<mat-card-content>
<canvas [id]="p1.canvasId">{{p1.chart}}</canvas>
</mat-card-content>
</mat-card>
</div>
</div> </div>
</div> </div>
` `
@ -24,66 +31,107 @@ export class NetworkStatusComponent implements OnInit {
DAY = 86400; DAY = 86400;
WEEK = this.DAY * 7; WEEK = this.DAY * 7;
MONTH = this.DAY * 30; MONTH = this.DAY * 30;
MODE: "ALL"|"NODE" = "ALL"
NUM:number = 0;
nodesNames: KeyValueMap<NodeDTO> = {} nodesNames: KeyValueMap<NodeDTO> = {}
//общая статичтика по perPortNum за день\неделю\месяц / ?= //общая статичтика по perPortNum за день\неделю\месяц / ?=
//top кто насрал пакетами всего за день\неделю\месяц / ?=packetsSumNode=true //top кто насрал пакетами всего за день\неделю\месяц / ?=packetsSumNode=true
graphs:any[] = [ graphs:any[] = this.generateGraps();
{ constructor(private http: HttpClient,
header: "Cтатистика пакетов в сети", private route: ActivatedRoute) {}
type: 'perPortNum',
cards:[{ getNumName(num:number) {
chart: Chart, if (`${num}` in this.nodesNames)
canvasId: "DayPerPB", return this.nodesNames[`${num}`].long_name
params: "?=", else return `${num}`
before: new Date().getTime()/1000, }
after: (new Date().getTime()/1000) - this.DAY,
config: this.generateConfigTChart("Cтатистика по пакетам в сети за день") generateGraps() {
},{ return [
chart: Chart, {
canvasId: "WeekPerPB", header: "Cтатистика пакетов в сети",
params: "?=", type: 'perPortNum',
before: new Date().getTime()/1000, requestMode: "ALL",
after: (new Date().getTime()/1000) - this.WEEK, cards:[{
config: this.generateConfigTChart("Cтатистика по пакетам в сети за неделю") chart: Chart,
},{ canvasId: "DayPerPB",
chart: Chart, params: "?=",
canvasId: "MonthPerPB", before: new Date().getTime()/1000,
params: "?=", after: (new Date().getTime()/1000) - this.DAY,
before: new Date().getTime()/1000, config: this.generateConfigTChart("Cтатистика по пакетам в сети за день")
after: (new Date().getTime()/1000) - this.MONTH, },{
config: this.generateConfigTChart("Cтатистика по пакетам в сети за месяц") chart: Chart,
}] canvasId: "WeekPerPB",
}, params: "?=",
{ before: new Date().getTime()/1000,
header: "Общая статистика пакетов в сети", after: (new Date().getTime()/1000) - this.WEEK,
type: 'perSumNode', config: this.generateConfigTChart("Cтатистика по пакетам в сети за неделю")
cards:[{ },{
chart: Chart, chart: Chart,
canvasId: "DaySumPB", canvasId: "MonthPerPB",
params: "?packetsSumNode=true", params: "?=",
before: new Date().getTime()/1000, before: new Date().getTime()/1000,
after: (new Date().getTime()/1000) - this.DAY, after: (new Date().getTime()/1000) - this.MONTH,
config: this.generateConfigTChart("Количество пакетов от пользоватей за день", false) config: this.generateConfigTChart("Cтатистика по пакетам в сети за месяц")
},{ }]
chart: Chart, },
canvasId: "WeekSumPB", {
params: "?packetsSumNode=true", header: "Общая статистика пакетов в сети",
before: new Date().getTime()/1000, type: 'perSumNode',
after: (new Date().getTime()/1000) - this.WEEK, requestMode: "ALL",
config: this.generateConfigTChart("Количество пакетов от пользоватей за неделю", false) cards:[{
chart: Chart,
canvasId: "DaySumPB",
params: "?packetsSumNode=true",
before: new Date().getTime()/1000,
after: (new Date().getTime()/1000) - this.DAY,
config: this.generateConfigTChart("Количество пакетов от пользоватей за день", false)
},{
chart: Chart,
canvasId: "WeekSumPB",
params: "?packetsSumNode=true",
before: new Date().getTime()/1000,
after: (new Date().getTime()/1000) - this.WEEK,
config: this.generateConfigTChart("Количество пакетов от пользоватей за неделю", false)
},{
chart: Chart,
canvasId: "MonthSumPB",
params: "?packetsSumNode=true",
before: new Date().getTime()/1000,
after: (new Date().getTime()/1000) - this.MONTH,
config: this.generateConfigTChart("Количество пакетов от пользоватей за месяц", false)
}]
},{ },{
chart: Chart, header: "Cтатистика пакетов в сети",
canvasId: "MonthSumPB", type: 'packetsPerNode',
params: "?packetsSumNode=true", requestMode: "NODE",
before: new Date().getTime()/1000, cards:[{
after: (new Date().getTime()/1000) - this.MONTH, chart: Chart,
config: this.generateConfigTChart("Количество пакетов от пользоватей за месяц", false) canvasId: "DayPerNodePB",
}] params: "?packetsPerNode=true",
} before: new Date().getTime()/1000,
]; after: (new Date().getTime()/1000) - this.DAY,
constructor(private http: HttpClient) {} config: this.generateConfigTChart("Cтатистика по пакетам в сети за день")
},{
chart: Chart,
canvasId: "WeekPerNodePB",
params: "?packetsPerNode=true",
before: new Date().getTime()/1000,
after: (new Date().getTime()/1000) - this.WEEK,
config: this.generateConfigTChart("Cтатистика по пакетам в сети за неделю")
},{
chart: Chart,
canvasId: "MonthPerNodePB",
params: "?packetsPerNode=true",
before: new Date().getTime()/1000,
after: (new Date().getTime()/1000) - this.MONTH,
config: this.generateConfigTChart("Cтатистика по пакетам в сети за месяц")
}]
}
]
}
generateConfigTChart(name: string, legend: boolean = true) { generateConfigTChart(name: string, legend: boolean = true) {
return { return {
@ -106,58 +154,97 @@ export class NetworkStatusComponent implements OnInit {
} }
ngOnInit(): void { ngOnInit(): void {
this.http.get(`api/nodes/list`).subscribe( this.route.params.subscribe(
(obj) => { (params) => {
(obj as NodeDTO[]).forEach( const num: number = Number.parseInt(params["num"]);
(node) => { console.log(num);
this.nodesNames[`${node.num}`] = node; switch (num) {
case 0: {
this.MODE = "ALL";
this.http.get(`api/nodes/list`).subscribe(
(obj) => {
(obj as NodeDTO[]).forEach(
(node) => {
this.nodesNames[`${node.num}`] = node;
}
)
}
).add(
() => {
this.graphs = this.generateGraps();
this.updateGraphs();
}
)
break;
} }
) default: {
} this.MODE = "NODE";
).add( this.NUM = num;
() => { this.http.get(`api/nodes/${num}`).subscribe(
this.graphs.forEach( (obj) => {
(graph) => { const node: NodeDTO = obj as NodeDTO
graph.cards.forEach((settings:any) => { if (node)
this.http.get(`api/packet/stats${settings.params}&before=${settings.before}&after=${settings.after}`) this.nodesNames[`${node.num}`] = node;
.subscribe((data) => { }
settings.config.data = { ).add(
labels: [], () => {
datasets: [ this.graphs = this.generateGraps();
{ this.updateGraphs();
label: settings.canvasId, }
data: [], )
backgroundColor: [] break;
} }
] }
}; })
(data as Object[]).map((obj) => PacketGroup.fromDto(obj)).sort((p1, p2) => p2.count - p1.count).forEach( }
(d) => {
switch (graph.type) { updateGraphs() {
case "perPortNum": { this.graphs.forEach(
settings.config.data.labels.push(`${d.portnumName} - ${d.count}`) (graph) => {
settings.config.data.datasets[0].data.push(d.count) graph.cards.forEach((settings:any) => {
settings.config.data.datasets[0].backgroundColor.push(numToColor(d.portnum, 0)) if (this.MODE != graph.requestMode) return;
break; this.http.get(`api/packet/stats${settings.params}&before=${settings.before}&after=${settings.after}&${this.NUM == 0?'':('&nums='+this.NUM)}`)
} .subscribe((data) => {
case "perSumNode": { settings.config.data = {
const name = `${d.from}` in this.nodesNames ? this.nodesNames[`${d.from}`].long_name : `${d.from}` labels: [],
settings.config.data.labels.push(`${name} - ${d.count}`) datasets: [
settings.config.data.datasets[0].data.push(d.count) {
settings.config.data.datasets[0].backgroundColor.push(numToColor(d.from, 0)) label: settings.canvasId,
break; data: [],
} backgroundColor: []
} }
} ]
) };
//if (settings.chart) (data as Object[]).map((obj) => PacketGroup.fromDto(obj)).sort((p1, p2) => p2.count - p1.count).forEach(
// settings.chart.destroy() (d) => {
switch (graph.type) {
case "perPortNum":
case "packetsPerNode":{
settings.config.data.labels.push(`${d.portnumName} - ${d.count}`)
settings.config.data.datasets[0].data.push(d.count)
settings.config.data.datasets[0].backgroundColor.push(numToColor(d.portnum, 0))
break;
}
case "perSumNode": {
const name = `${d.from}` in this.nodesNames ? this.nodesNames[`${d.from}`].long_name : `${d.from}`
settings.config.data.labels.push(`${name} - ${d.count}`)
settings.config.data.datasets[0].data.push(d.count)
settings.config.data.datasets[0].backgroundColor.push(numToColor(d.from, 0))
break;
}
default: {
console.log("missing type: " + graph.type);
break;
}
}
}
)
//if (settings.chart)
// settings.chart.destroy()
settings.chart = new Chart(settings.canvasId, settings.config) settings.chart = new Chart(settings.canvasId, settings.config)
}) })
}) })
}
)
} }
) )
} }

Loading…
Cancel
Save