mirror of
https://github.com/MikroWizard/mikrofront.git
synced 2025-12-06 01:59:29 +00:00
Add device scan results for admins
This commit is contained in:
parent
f4c785f7f1
commit
d83fb7a575
4 changed files with 168 additions and 29 deletions
|
|
@ -85,7 +85,7 @@ export class dataProvider {
|
||||||
|
|
||||||
return this.MikroWizardRPC.sendJsonRequest("/api/monitoring/devs/get", data);
|
return this.MikroWizardRPC.sendJsonRequest("/api/monitoring/devs/get", data);
|
||||||
}
|
}
|
||||||
|
|
||||||
monitoring_events_fix(event_id:number){
|
monitoring_events_fix(event_id:number){
|
||||||
var data={
|
var data={
|
||||||
'event_id':event_id
|
'event_id':event_id
|
||||||
|
|
@ -206,7 +206,7 @@ export class dataProvider {
|
||||||
'devid':devid
|
'devid':devid
|
||||||
}
|
}
|
||||||
return this.MikroWizardRPC.sendJsonRequest("/api/devlogs/details/list", data);
|
return this.MikroWizardRPC.sendJsonRequest("/api/devlogs/details/list", data);
|
||||||
}
|
}
|
||||||
|
|
||||||
scan_devs(type:string,info:any){
|
scan_devs(type:string,info:any){
|
||||||
var data: any={
|
var data: any={
|
||||||
|
|
@ -218,6 +218,10 @@ export class dataProvider {
|
||||||
return this.MikroWizardRPC.sendJsonRequest("/api/scanner/scan", data);
|
return this.MikroWizardRPC.sendJsonRequest("/api/scanner/scan", data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
scan_results(){
|
||||||
|
return this.MikroWizardRPC.sendJsonRequest("/api/scanner/results", {});
|
||||||
|
}
|
||||||
|
|
||||||
get_groups(searchstr:string=""){
|
get_groups(searchstr:string=""){
|
||||||
var data={
|
var data={
|
||||||
'searchstr':searchstr
|
'searchstr':searchstr
|
||||||
|
|
|
||||||
|
|
@ -166,6 +166,7 @@
|
||||||
</c-row>
|
</c-row>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<c-modal #ScannerModal [visible]="scanwizard_modal" (visibleChange)="handleScanwizard_modal($event)" backdrop="static"
|
<c-modal #ScannerModal [visible]="scanwizard_modal" (visibleChange)="handleScanwizard_modal($event)" backdrop="static"
|
||||||
id="ScannerModal">
|
id="ScannerModal">
|
||||||
<c-modal-header>
|
<c-modal-header>
|
||||||
|
|
@ -255,12 +256,59 @@
|
||||||
</div>
|
</div>
|
||||||
</c-modal-body>
|
</c-modal-body>
|
||||||
<c-modal-footer>
|
<c-modal-footer>
|
||||||
<small *ngIf="scan_type=='ip'" style="margin: 0 auto;">Empty username and password means system default
|
<h6 style="margin: 0 auto;" *ngIf="scanwizard_step==1" ><button cButton color="primary" (click)="show_exec()" style="margin: 0 auto;" variant="outline">Device scan logs</button></h6>
|
||||||
|
<small *ngIf="scan_type=='ip'" >Empty username and password means system default
|
||||||
configuration</small>
|
configuration</small>
|
||||||
</c-modal-footer>
|
</c-modal-footer>
|
||||||
</c-modal>
|
</c-modal>
|
||||||
|
|
||||||
|
|
||||||
|
<c-modal #ExecutedDataModal backdrop="static" size="xl" [(visible)]="ExecutedDataModalVisible" id="ExecutedDataModal">
|
||||||
|
<c-modal-header>
|
||||||
|
<h5 cModalTitle>Editing Group </h5>
|
||||||
|
<button (click)="ExecutedDataModalVisible=!ExecutedDataModalVisible" cButtonClose></button>
|
||||||
|
</c-modal-header>
|
||||||
|
<c-modal-body>
|
||||||
|
<c-input-group class="mb-3">
|
||||||
|
<h5>Group Members :</h5>
|
||||||
|
<gui-grid [autoResizeWidth]="true" *ngIf="ExecutedDataModalVisible" [searching]="searching"
|
||||||
|
[source]="ExecutedData" [columnMenu]="columnMenu" [sorting]="sorting" [infoPanel]="infoPanel"
|
||||||
|
[autoResizeWidth]=true
|
||||||
|
[paging]="paging">
|
||||||
|
<gui-grid-column header="Start time" field="start">
|
||||||
|
<ng-template let-value="item['started']" let-item="item" let-index="index">
|
||||||
|
{{value}} </ng-template>
|
||||||
|
</gui-grid-column>
|
||||||
|
<gui-grid-column header="Start ip" field="start_ip">
|
||||||
|
<ng-template let-value="item['start_ip']" let-item="item" let-index="index">
|
||||||
|
{{value}} </ng-template>
|
||||||
|
</gui-grid-column>
|
||||||
|
<gui-grid-column header="End ip" field="start_ip">
|
||||||
|
<ng-template let-value="item['start_ip']" let-item="item" let-index="index">
|
||||||
|
{{value}} </ng-template>
|
||||||
|
</gui-grid-column>
|
||||||
|
<gui-grid-column header="End time" field="end">
|
||||||
|
<ng-template let-value="item['ended']" let-item="item" let-index="index">
|
||||||
|
{{value}}
|
||||||
|
</ng-template>
|
||||||
|
</gui-grid-column>
|
||||||
|
<gui-grid-column header="Logs" field="mac" align="center">
|
||||||
|
<ng-template let-value="item['result']" let-item="item" let-index="index">
|
||||||
|
<button (click)="exportToCsv(value)" color="primary" cButton>download</button>
|
||||||
|
</ng-template>
|
||||||
|
</gui-grid-column>
|
||||||
|
</gui-grid>
|
||||||
|
<br/>
|
||||||
|
</c-input-group>
|
||||||
|
<hr />
|
||||||
|
</c-modal-body>
|
||||||
|
<c-modal-footer>
|
||||||
|
<button (click)="ExecutedDataModalVisible=!ExecutedDataModalVisible" cButton color="secondary">
|
||||||
|
Close
|
||||||
|
</button>
|
||||||
|
</c-modal-footer>
|
||||||
|
</c-modal>
|
||||||
|
|
||||||
<c-modal #ConfirmModal backdrop="static" [(visible)]="ConfirmModalVisible" id="runConfirmModal">
|
<c-modal #ConfirmModal backdrop="static" [(visible)]="ConfirmModalVisible" id="runConfirmModal">
|
||||||
<c-modal-header>
|
<c-modal-header>
|
||||||
<h6 cModalTitle>Please Confirm Action </h6>
|
<h6 cModalTitle>Please Confirm Action </h6>
|
||||||
|
|
|
||||||
|
|
@ -26,20 +26,9 @@ import {
|
||||||
} from "@generic-ui/ngx-grid";
|
} from "@generic-ui/ngx-grid";
|
||||||
import { ToasterComponent } from "@coreui/angular";
|
import { ToasterComponent } from "@coreui/angular";
|
||||||
import { AppToastComponent } from "../toast-simple/toast.component";
|
import { AppToastComponent } from "../toast-simple/toast.component";
|
||||||
|
import { formatInTimeZone } from "date-fns-tz";
|
||||||
|
|
||||||
|
|
||||||
interface IUser {
|
|
||||||
name: string;
|
|
||||||
state: string;
|
|
||||||
registered: string;
|
|
||||||
country: string;
|
|
||||||
usage: number;
|
|
||||||
period: string;
|
|
||||||
payment: string;
|
|
||||||
activity: string;
|
|
||||||
avatar: string;
|
|
||||||
status: string;
|
|
||||||
color: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
templateUrl: "devices.component.html",
|
templateUrl: "devices.component.html",
|
||||||
|
|
@ -47,6 +36,7 @@ interface IUser {
|
||||||
export class DevicesComponent implements OnInit, OnDestroy {
|
export class DevicesComponent implements OnInit, OnDestroy {
|
||||||
public uid: number;
|
public uid: number;
|
||||||
public uname: string;
|
public uname: string;
|
||||||
|
public tz: string;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private data_provider: dataProvider,
|
private data_provider: dataProvider,
|
||||||
|
|
@ -63,6 +53,7 @@ export class DevicesComponent implements OnInit, OnDestroy {
|
||||||
this.data_provider.getSessionInfo().then((res) => {
|
this.data_provider.getSessionInfo().then((res) => {
|
||||||
_self.uid = res.uid;
|
_self.uid = res.uid;
|
||||||
_self.uname = res.name;
|
_self.uname = res.name;
|
||||||
|
_self.tz = res.tz;
|
||||||
const userId = _self.uid;
|
const userId = _self.uid;
|
||||||
|
|
||||||
if (res.role != "admin") {
|
if (res.role != "admin") {
|
||||||
|
|
@ -99,6 +90,9 @@ export class DevicesComponent implements OnInit, OnDestroy {
|
||||||
public selected_devices: any = {};
|
public selected_devices: any = {};
|
||||||
public selected_device: any = {};
|
public selected_device: any = {};
|
||||||
public show_pass: boolean = false;
|
public show_pass: boolean = false;
|
||||||
|
public ExecutedDataModalVisible: boolean = false;
|
||||||
|
public ExecutedData: any = [];
|
||||||
|
|
||||||
toasterForm = {
|
toasterForm = {
|
||||||
autohide: true,
|
autohide: true,
|
||||||
delay: 3000,
|
delay: 3000,
|
||||||
|
|
@ -192,6 +186,7 @@ export class DevicesComponent implements OnInit, OnDestroy {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
edit_device_form(dev: any) {
|
edit_device_form(dev: any) {
|
||||||
var _self = this;
|
var _self = this;
|
||||||
this.selected_device = dev;
|
this.selected_device = dev;
|
||||||
|
|
@ -210,6 +205,7 @@ export class DevicesComponent implements OnInit, OnDestroy {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
save_device() {
|
save_device() {
|
||||||
var _self = this;
|
var _self = this;
|
||||||
this.data_provider
|
this.data_provider
|
||||||
|
|
@ -452,6 +448,108 @@ export class DevicesComponent implements OnInit, OnDestroy {
|
||||||
if (_self.Selectedrows && _self.Selectedrows.length < 1) _self.initGridTable();
|
if (_self.Selectedrows && _self.Selectedrows.length < 1) _self.initGridTable();
|
||||||
}, 10000);
|
}, 10000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sanitizeString(desc:string) {
|
||||||
|
var itemDesc:string='';
|
||||||
|
if (desc) {
|
||||||
|
itemDesc = desc.toString().replace(/"/g, '\"');
|
||||||
|
itemDesc = itemDesc.replace(/'/g, '\'');
|
||||||
|
} else {
|
||||||
|
itemDesc = '';
|
||||||
|
}
|
||||||
|
return itemDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
exportToCsv(jsonResponse:any) {
|
||||||
|
const data = jsonResponse;
|
||||||
|
const columns = this.getColumns(data);
|
||||||
|
const csvData = this.convertToCsv(data, columns);
|
||||||
|
this.downloadFile(csvData, 'data.csv', 'text/csv');
|
||||||
|
}
|
||||||
|
|
||||||
|
getColumns(data: any[]): string[] {
|
||||||
|
const columns : any = [];
|
||||||
|
data.forEach(row => {
|
||||||
|
Object.keys(row).forEach((col) => {
|
||||||
|
if (!columns.includes(col)) {
|
||||||
|
columns.push(col);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return columns;
|
||||||
|
}
|
||||||
|
|
||||||
|
convertToCsv(data: any[], columns: string[]): string {
|
||||||
|
var _self=this;
|
||||||
|
let csv = '';
|
||||||
|
csv += columns.join(',') + '\n';
|
||||||
|
data.forEach(row => {
|
||||||
|
const values : any = [];
|
||||||
|
columns.forEach((col:any) => {
|
||||||
|
values.push('"'+_self.sanitizeString(row[col])+'"');
|
||||||
|
});
|
||||||
|
csv += values.join(',') + '\n';
|
||||||
|
});
|
||||||
|
return csv;
|
||||||
|
}
|
||||||
|
|
||||||
|
downloadFile(data: string, filename: string, type: string) {
|
||||||
|
const blob = new Blob([data], { type: type });
|
||||||
|
const nav = (window.navigator as any);
|
||||||
|
|
||||||
|
if (nav.msSaveOrOpenBlob) {
|
||||||
|
nav.msSaveBlob(blob, filename);
|
||||||
|
} else {
|
||||||
|
const link = document.createElement('a');
|
||||||
|
link.setAttribute('href', URL.createObjectURL(blob));
|
||||||
|
link.setAttribute('download', filename);
|
||||||
|
link.style.visibility = 'hidden';
|
||||||
|
document.body.appendChild(link);
|
||||||
|
link.click();
|
||||||
|
document.body.removeChild(link);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
show_exec(){
|
||||||
|
var _self=this;
|
||||||
|
this.ExecutedDataModalVisible = true;
|
||||||
|
this.data_provider
|
||||||
|
.scan_results()
|
||||||
|
.then((res) => {
|
||||||
|
console.dir(res);
|
||||||
|
let index = 1;
|
||||||
|
_self.ExecutedData= res.data.map((d: any) => {
|
||||||
|
d.index = index;
|
||||||
|
d.ended = formatInTimeZone(
|
||||||
|
d.created.split(".")[0] + ".000Z",
|
||||||
|
_self.tz,
|
||||||
|
"yyyy-MM-dd HH:mm:ss XXX"
|
||||||
|
);
|
||||||
|
d.info=JSON.parse(d.info);
|
||||||
|
d.started = formatInTimeZone(
|
||||||
|
d.info.created.split(".")[0] + ".000Z",
|
||||||
|
_self.tz,
|
||||||
|
"yyyy-MM-dd HH:mm:ss XXX"
|
||||||
|
);
|
||||||
|
d.start_ip=d.info.start_ip;
|
||||||
|
d.end_ip=d.info.end_ip;
|
||||||
|
d.result=JSON.parse(d.result);
|
||||||
|
index += 1;
|
||||||
|
return d;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ngOnDestroy(): void {
|
ngOnDestroy(): void {
|
||||||
clearTimeout(this.scan_timer);
|
clearTimeout(this.scan_timer);
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@ export class SnippetsComponent implements OnInit, OnDestroy {
|
||||||
// console.dir("res",res)
|
// console.dir("res",res)
|
||||||
_self.uid = res.uid;
|
_self.uid = res.uid;
|
||||||
_self.uname = res.name;
|
_self.uname = res.name;
|
||||||
_self.tz = res.tz;
|
_self.tz = res.tz;
|
||||||
// console.dir("role",res.role);
|
// console.dir("role",res.role);
|
||||||
const userId = _self.uid;
|
const userId = _self.uid;
|
||||||
|
|
||||||
|
|
@ -205,17 +205,6 @@ export class SnippetsComponent implements OnInit, OnDestroy {
|
||||||
index += 1;
|
index += 1;
|
||||||
return d;
|
return d;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
_self.DeleteConfirmModalVisible = false;
|
_self.DeleteConfirmModalVisible = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -298,7 +287,7 @@ export class SnippetsComponent implements OnInit, OnDestroy {
|
||||||
this.current_snippet = item;
|
this.current_snippet = item;
|
||||||
this.current_snippet["task_type"] = "snipet_exec";
|
this.current_snippet["task_type"] = "snipet_exec";
|
||||||
this.current_snippet["selection_type"] = "devices";
|
this.current_snippet["selection_type"] = "devices";
|
||||||
this.form_changed();
|
this.form_changed();
|
||||||
this.ExecSnipetModalVisible = true;
|
this.ExecSnipetModalVisible = true;
|
||||||
this.ModalAction = "exec";
|
this.ModalAction = "exec";
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue