mirror of
https://github.com/GNS3/gns3-web-ui.git
synced 2025-06-14 13:08:07 +00:00
Basic list of installed software
This commit is contained in:
@ -13,6 +13,7 @@ files:
|
|||||||
- main.js
|
- main.js
|
||||||
- renderer.js
|
- renderer.js
|
||||||
- sentry.js
|
- sentry.js
|
||||||
|
- installed-software.js
|
||||||
- package.json
|
- package.json
|
||||||
|
|
||||||
mac:
|
mac:
|
||||||
|
20
installed-software.js
Normal file
20
installed-software.js
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
var commandExistsSync = require('command-exists').sync;
|
||||||
|
|
||||||
|
exports.getInstalledSoftware = (softwareList) => {
|
||||||
|
const installed = {};
|
||||||
|
for(var software of softwareList) {
|
||||||
|
var name = software.name;
|
||||||
|
var commands = software.commands;
|
||||||
|
|
||||||
|
installed[name] = [];
|
||||||
|
|
||||||
|
for(var command of commands) {
|
||||||
|
var exists = commandExistsSync(command);
|
||||||
|
if(exists) {
|
||||||
|
installed[name].push(command);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return installed;
|
||||||
|
}
|
||||||
|
|
@ -51,6 +51,7 @@
|
|||||||
"angular2-hotkeys": "^2.1.4",
|
"angular2-hotkeys": "^2.1.4",
|
||||||
"angular2-indexeddb": "^1.2.3",
|
"angular2-indexeddb": "^1.2.3",
|
||||||
"bootstrap": "4.2.1",
|
"bootstrap": "4.2.1",
|
||||||
|
"command-exists": "^1.2.8",
|
||||||
"core-js": "^2.6.1",
|
"core-js": "^2.6.1",
|
||||||
"css-tree": "^1.0.0-alpha.29",
|
"css-tree": "^1.0.0-alpha.29",
|
||||||
"d3-ng2-service": "^2.1.0",
|
"d3-ng2-service": "^2.1.0",
|
||||||
|
@ -3,34 +3,20 @@
|
|||||||
<h1>Installed software</h1>
|
<h1>Installed software</h1>
|
||||||
</div>
|
</div>
|
||||||
<div class="default-content">
|
<div class="default-content">
|
||||||
<!-- <div class="example-container mat-elevation-z8">
|
<div class="example-container mat-elevation-z8">
|
||||||
<mat-table #table [dataSource]="dataSource">
|
<mat-table #table [dataSource]="dataSource">
|
||||||
|
|
||||||
<ng-container matColumnDef="id">
|
|
||||||
<mat-header-cell *matHeaderCellDef> ID </mat-header-cell>
|
|
||||||
<mat-cell *matCellDef="let row;"> {{row.id}} </mat-cell>
|
|
||||||
</ng-container>
|
|
||||||
|
|
||||||
<ng-container matColumnDef="name">
|
<ng-container matColumnDef="name">
|
||||||
<mat-header-cell *matHeaderCellDef> Name </mat-header-cell>
|
<mat-header-cell *matHeaderCellDef> Name </mat-header-cell>
|
||||||
<mat-cell *matCellDef="let row;"> <a [routerLink]="['/server', row.id, 'projects']" class="table-link">{{row.name}}</a></mat-cell>
|
<mat-cell *matCellDef="let row;">{{ row.name }}</mat-cell>
|
||||||
</ng-container>
|
|
||||||
|
|
||||||
<ng-container matColumnDef="ip">
|
|
||||||
<mat-header-cell *matHeaderCellDef> IP </mat-header-cell>
|
|
||||||
<mat-cell *matCellDef="let row;"> {{row.ip}} </mat-cell>
|
|
||||||
</ng-container>
|
|
||||||
|
|
||||||
<ng-container matColumnDef="port">
|
|
||||||
<mat-header-cell *matHeaderCellDef> Port </mat-header-cell>
|
|
||||||
<mat-cell *matCellDef="let row;"> {{row.port}} </mat-cell>
|
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ng-container matColumnDef="actions">
|
<ng-container matColumnDef="actions">
|
||||||
<mat-header-cell *matHeaderCellDef> Actions </mat-header-cell>
|
<mat-header-cell *matHeaderCellDef></mat-header-cell>
|
||||||
<mat-cell *matCellDef="let row;" style="text-align: right">
|
<mat-cell *matCellDef="let row;" style="text-align: right">
|
||||||
<button mat-icon-button (click)="deleteServer(row)">
|
<button mat-button color="primary" (click)="install(row)" disabled="row.installed">
|
||||||
<mat-icon aria-label="Remove server">delete</mat-icon>
|
<ng-container *ngIf="row.installed">Installed</ng-container>
|
||||||
|
<ng-container *ngIf="!row.installed">Install</ng-container>
|
||||||
</button>
|
</button>
|
||||||
</mat-cell>
|
</mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
@ -40,9 +26,6 @@
|
|||||||
</mat-table>
|
</mat-table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="buttons-bar">
|
|
||||||
<button mat-raised-button color="primary" (click)="createModal()">Add server</button>
|
|
||||||
</div> -->
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1,4 +1,7 @@
|
|||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
import { InstalledSoftwareService } from '../../services/installed-software.service';
|
||||||
|
import { DataSource } from '@angular/cdk/table';
|
||||||
|
import { Observable, of } from 'rxjs';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-installed-software',
|
selector: 'app-installed-software',
|
||||||
@ -6,10 +9,29 @@ import { Component, OnInit } from '@angular/core';
|
|||||||
styleUrls: ['./installed-software.component.scss']
|
styleUrls: ['./installed-software.component.scss']
|
||||||
})
|
})
|
||||||
export class InstalledSoftwareComponent implements OnInit {
|
export class InstalledSoftwareComponent implements OnInit {
|
||||||
|
dataSource: InstalledSoftwareDataSource;
|
||||||
|
displayedColumns = ['name', 'actions'];
|
||||||
|
|
||||||
constructor() { }
|
constructor(
|
||||||
|
private installedSoftwareService: InstalledSoftwareService
|
||||||
|
) { }
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
|
this.dataSource = new InstalledSoftwareDataSource(this.installedSoftwareService);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class InstalledSoftwareDataSource extends DataSource<any> {
|
||||||
|
constructor(private installedSoftwareService: InstalledSoftwareService) {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(): Observable<any[]> {
|
||||||
|
const installed = this.installedSoftwareService.list();
|
||||||
|
return of(installed);
|
||||||
|
}
|
||||||
|
|
||||||
|
disconnect() {}
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -1,9 +1,31 @@
|
|||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
|
import { ElectronService } from 'ngx-electron';
|
||||||
|
|
||||||
@Injectable({
|
@Injectable({
|
||||||
providedIn: 'root'
|
providedIn: 'root'
|
||||||
})
|
})
|
||||||
export class InstalledSoftwareService {
|
export class InstalledSoftwareService {
|
||||||
|
private software = [{
|
||||||
|
name: 'ls',
|
||||||
|
commands: ['ls']
|
||||||
|
}, {
|
||||||
|
name: 'telnet',
|
||||||
|
commands: ['telnet']
|
||||||
|
}]
|
||||||
|
|
||||||
constructor() { }
|
constructor(
|
||||||
|
private electronService: ElectronService
|
||||||
|
) { }
|
||||||
|
|
||||||
|
list() {
|
||||||
|
const installedSoftware = this.electronService.remote.require('./installed-software.js')
|
||||||
|
.getInstalledSoftware(this.software);
|
||||||
|
|
||||||
|
return this.software.map((software) => {
|
||||||
|
return {
|
||||||
|
name: software.name,
|
||||||
|
installed: installedSoftware[software.name].length > 0
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2061,6 +2061,11 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
|
|||||||
dependencies:
|
dependencies:
|
||||||
delayed-stream "~1.0.0"
|
delayed-stream "~1.0.0"
|
||||||
|
|
||||||
|
command-exists@^1.2.8:
|
||||||
|
version "1.2.8"
|
||||||
|
resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.8.tgz#715acefdd1223b9c9b37110a149c6392c2852291"
|
||||||
|
integrity sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==
|
||||||
|
|
||||||
commander@2, commander@^2.12.1:
|
commander@2, commander@^2.12.1:
|
||||||
version "2.19.0"
|
version "2.19.0"
|
||||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
|
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
|
||||||
|
Reference in New Issue
Block a user