From 8aa4e33011e18225d9f7781ed7d1349f0bab32e9 Mon Sep 17 00:00:00 2001 From: ziajka Date: Wed, 9 Jan 2019 09:54:28 +0100 Subject: [PATCH 01/39] Expended list of settings on default --- src/app/components/settings/settings.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/components/settings/settings.component.html b/src/app/components/settings/settings.component.html index b26d263d..3852a97a 100644 --- a/src/app/components/settings/settings.component.html +++ b/src/app/components/settings/settings.component.html @@ -5,7 +5,7 @@
- + Local settings From 77a47e8fd2dc4f991b77f599ae76d046dd33d0b6 Mon Sep 17 00:00:00 2001 From: ziajka Date: Wed, 9 Jan 2019 10:20:17 +0100 Subject: [PATCH 02/39] Installed software link in application menu when in electron --- src/app/app-routing.module.ts | 2 + src/app/app.module.ts | 4 +- .../installed-software.component.html | 48 +++++++++++++++++++ .../installed-software.component.scss | 0 .../installed-software.component.spec.ts | 25 ++++++++++ .../installed-software.component.ts | 15 ++++++ .../settings/settings.component.html | 1 + .../default-layout.component.html | 19 ++++++-- .../default-layout.component.ts | 7 ++- .../installed-software.service.spec.ts | 12 +++++ .../services/installed-software.service.ts | 9 ++++ 11 files changed, 137 insertions(+), 5 deletions(-) create mode 100644 src/app/components/installed-software/installed-software.component.html create mode 100644 src/app/components/installed-software/installed-software.component.scss create mode 100644 src/app/components/installed-software/installed-software.component.spec.ts create mode 100644 src/app/components/installed-software/installed-software.component.ts create mode 100644 src/app/services/installed-software.service.spec.ts create mode 100644 src/app/services/installed-software.service.ts diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index f1c33bd2..2ba47f18 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -7,6 +7,7 @@ import { ProjectsComponent } from "./components/projects/projects.component"; import { DefaultLayoutComponent } from "./layouts/default-layout/default-layout.component"; import { SettingsComponent } from "./components/settings/settings.component"; import { LocalServerComponent } from "./components/local-server/local-server.component"; +import { InstalledSoftwareComponent } from './components/installed-software/installed-software.component'; const routes: Routes = [ @@ -17,6 +18,7 @@ const routes: Routes = [ { path: 'local', component: LocalServerComponent }, { path: 'server/:server_id/projects', component: ProjectsComponent }, { path: 'settings', component: SettingsComponent }, + { path: 'installed-software', component: InstalledSoftwareComponent }, ] }, { path: 'server/:server_id/project/:project_id', component: ProjectMapComponent }, diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 800cf781..5bae2cad 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -74,6 +74,7 @@ import { ProjectNameValidator } from './components/projects/models/projectNameVa import { MatSidenavModule } from '@angular/material'; import { NodeSelectInterfaceComponent } from './components/project-map/node-select-interface/node-select-interface.component'; import { DrawLinkToolComponent } from './components/project-map/draw-link-tool/draw-link-tool.component'; +import { InstalledSoftwareComponent } from './components/installed-software/installed-software.component'; if (environment.production) { @@ -116,7 +117,8 @@ if (environment.production) { ProgressComponent, ServerDiscoveryComponent, NodeSelectInterfaceComponent, - DrawLinkToolComponent + DrawLinkToolComponent, + InstalledSoftwareComponent ], imports: [ BrowserModule, diff --git a/src/app/components/installed-software/installed-software.component.html b/src/app/components/installed-software/installed-software.component.html new file mode 100644 index 00000000..3413213a --- /dev/null +++ b/src/app/components/installed-software/installed-software.component.html @@ -0,0 +1,48 @@ +
+
+

Installed software

+
+
+ +
+
+ \ No newline at end of file diff --git a/src/app/components/installed-software/installed-software.component.scss b/src/app/components/installed-software/installed-software.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/app/components/installed-software/installed-software.component.spec.ts b/src/app/components/installed-software/installed-software.component.spec.ts new file mode 100644 index 00000000..488584ab --- /dev/null +++ b/src/app/components/installed-software/installed-software.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { InstalledSoftwareComponent } from './installed-software.component'; + +describe('InstalledSoftwareComponent', () => { + let component: InstalledSoftwareComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ InstalledSoftwareComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(InstalledSoftwareComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/installed-software/installed-software.component.ts b/src/app/components/installed-software/installed-software.component.ts new file mode 100644 index 00000000..a20d70b2 --- /dev/null +++ b/src/app/components/installed-software/installed-software.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-installed-software', + templateUrl: './installed-software.component.html', + styleUrls: ['./installed-software.component.scss'] +}) +export class InstalledSoftwareComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/app/components/settings/settings.component.html b/src/app/components/settings/settings.component.html index 3852a97a..43f08e88 100644 --- a/src/app/components/settings/settings.component.html +++ b/src/app/components/settings/settings.component.html @@ -35,4 +35,5 @@
+ diff --git a/src/app/layouts/default-layout/default-layout.component.html b/src/app/layouts/default-layout/default-layout.component.html index 0ffd7b58..302e5e5a 100644 --- a/src/app/layouts/default-layout/default-layout.component.html +++ b/src/app/layouts/default-layout/default-layout.component.html @@ -8,9 +8,22 @@ - + + + + + + + @@ -21,6 +34,6 @@ diff --git a/src/app/layouts/default-layout/default-layout.component.ts b/src/app/layouts/default-layout/default-layout.component.ts index ed7bcf4f..f829afc2 100644 --- a/src/app/layouts/default-layout/default-layout.component.ts +++ b/src/app/layouts/default-layout/default-layout.component.ts @@ -1,4 +1,5 @@ import {Component, OnInit, ViewEncapsulation} from '@angular/core'; +import { ElectronService } from 'ngx-electron'; @Component({ selector: 'app-default-layout', @@ -7,10 +8,14 @@ import {Component, OnInit, ViewEncapsulation} from '@angular/core'; styleUrls: ['./default-layout.component.css'] }) export class DefaultLayoutComponent implements OnInit { + public isInstalledSoftwareAvailable = false; - constructor() { } + constructor( + private electronService: ElectronService + ) { } ngOnInit() { + this.isInstalledSoftwareAvailable = this.electronService.isElectronApp; } } diff --git a/src/app/services/installed-software.service.spec.ts b/src/app/services/installed-software.service.spec.ts new file mode 100644 index 00000000..13eee14f --- /dev/null +++ b/src/app/services/installed-software.service.spec.ts @@ -0,0 +1,12 @@ +import { TestBed } from '@angular/core/testing'; + +import { InstalledSoftwareService } from './installed-software.service'; + +describe('InstalledSoftwareService', () => { + beforeEach(() => TestBed.configureTestingModule({})); + + it('should be created', () => { + const service: InstalledSoftwareService = TestBed.get(InstalledSoftwareService); + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/services/installed-software.service.ts b/src/app/services/installed-software.service.ts new file mode 100644 index 00000000..29cba3fc --- /dev/null +++ b/src/app/services/installed-software.service.ts @@ -0,0 +1,9 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class InstalledSoftwareService { + + constructor() { } +} From c1b76d8d4dff24decf16ff6b6439c6c7dd33484b Mon Sep 17 00:00:00 2001 From: ziajka Date: Wed, 9 Jan 2019 13:45:37 +0100 Subject: [PATCH 03/39] Basic list of installed software --- electron-builder.yml | 1 + installed-software.js | 20 +++++++++++++ package.json | 1 + .../installed-software.component.html | 29 ++++--------------- .../installed-software.component.ts | 24 ++++++++++++++- .../services/installed-software.service.ts | 24 ++++++++++++++- yarn.lock | 5 ++++ 7 files changed, 79 insertions(+), 25 deletions(-) create mode 100644 installed-software.js diff --git a/electron-builder.yml b/electron-builder.yml index a09192e4..32a97b09 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -13,6 +13,7 @@ files: - main.js - renderer.js - sentry.js + - installed-software.js - package.json mac: diff --git a/installed-software.js b/installed-software.js new file mode 100644 index 00000000..aaf03fe5 --- /dev/null +++ b/installed-software.js @@ -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; +} + diff --git a/package.json b/package.json index 18a24b70..27de9ca2 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "angular2-hotkeys": "^2.1.4", "angular2-indexeddb": "^1.2.3", "bootstrap": "4.2.1", + "command-exists": "^1.2.8", "core-js": "^2.6.1", "css-tree": "^1.0.0-alpha.29", "d3-ng2-service": "^2.1.0", diff --git a/src/app/components/installed-software/installed-software.component.html b/src/app/components/installed-software/installed-software.component.html index 3413213a..6ca612a9 100644 --- a/src/app/components/installed-software/installed-software.component.html +++ b/src/app/components/installed-software/installed-software.component.html @@ -3,34 +3,20 @@

Installed software

-
\ No newline at end of file diff --git a/src/app/components/installed-software/installed-software.component.ts b/src/app/components/installed-software/installed-software.component.ts index a20d70b2..8cec0f6d 100644 --- a/src/app/components/installed-software/installed-software.component.ts +++ b/src/app/components/installed-software/installed-software.component.ts @@ -1,4 +1,7 @@ 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({ selector: 'app-installed-software', @@ -6,10 +9,29 @@ import { Component, OnInit } from '@angular/core'; styleUrls: ['./installed-software.component.scss'] }) export class InstalledSoftwareComponent implements OnInit { + dataSource: InstalledSoftwareDataSource; + displayedColumns = ['name', 'actions']; - constructor() { } + constructor( + private installedSoftwareService: InstalledSoftwareService + ) { } ngOnInit() { + this.dataSource = new InstalledSoftwareDataSource(this.installedSoftwareService); } } + +export class InstalledSoftwareDataSource extends DataSource { + constructor(private installedSoftwareService: InstalledSoftwareService) { + super(); + } + + connect(): Observable { + const installed = this.installedSoftwareService.list(); + return of(installed); + } + + disconnect() {} + +} diff --git a/src/app/services/installed-software.service.ts b/src/app/services/installed-software.service.ts index 29cba3fc..2b525ee7 100644 --- a/src/app/services/installed-software.service.ts +++ b/src/app/services/installed-software.service.ts @@ -1,9 +1,31 @@ import { Injectable } from '@angular/core'; +import { ElectronService } from 'ngx-electron'; @Injectable({ providedIn: 'root' }) 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 + } + }); + } } diff --git a/yarn.lock b/yarn.lock index 972a0cfc..2b921fe5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2061,6 +2061,11 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: 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: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" From e3ea7f323e71d4d989eeb468437102e8b4422153 Mon Sep 17 00:00:00 2001 From: ziajka Date: Wed, 9 Jan 2019 15:32:19 +0100 Subject: [PATCH 04/39] Fix install button apperance and prepare for installation support --- installed-software.js | 10 ++++++++++ main.js | 1 + .../installed-software.component.html | 2 +- .../installed-software/installed-software.component.ts | 5 +++++ src/app/services/installed-software.service.ts | 6 ++++++ 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/installed-software.js b/installed-software.js index aaf03fe5..9a314e77 100644 --- a/installed-software.js +++ b/installed-software.js @@ -1,4 +1,5 @@ var commandExistsSync = require('command-exists').sync; +var app = require('electron').app; exports.getInstalledSoftware = (softwareList) => { const installed = {}; @@ -18,3 +19,12 @@ exports.getInstalledSoftware = (softwareList) => { return installed; } +exports.install = (software) => { + var type = software.type; + + if (type == 'web') { + + } + + console.log(app.getAppPath()); +} \ No newline at end of file diff --git a/main.js b/main.js index 172bb28c..44bb7ab5 100644 --- a/main.js +++ b/main.js @@ -138,6 +138,7 @@ app.on('activate', function () { } }); + // In this file you can include the rest of your app's specific main process // code. You can also put them in separate files and require them here. diff --git a/src/app/components/installed-software/installed-software.component.html b/src/app/components/installed-software/installed-software.component.html index 6ca612a9..a0929735 100644 --- a/src/app/components/installed-software/installed-software.component.html +++ b/src/app/components/installed-software/installed-software.component.html @@ -14,7 +14,7 @@ - diff --git a/src/app/components/installed-software/installed-software.component.ts b/src/app/components/installed-software/installed-software.component.ts index 8cec0f6d..cf365156 100644 --- a/src/app/components/installed-software/installed-software.component.ts +++ b/src/app/components/installed-software/installed-software.component.ts @@ -20,6 +20,11 @@ export class InstalledSoftwareComponent implements OnInit { this.dataSource = new InstalledSoftwareDataSource(this.installedSoftwareService); } + install(software) { + this.installedSoftwareService.install({ + type: 'web' + }); + } } export class InstalledSoftwareDataSource extends DataSource { diff --git a/src/app/services/installed-software.service.ts b/src/app/services/installed-software.service.ts index 2b525ee7..b113f594 100644 --- a/src/app/services/installed-software.service.ts +++ b/src/app/services/installed-software.service.ts @@ -28,4 +28,10 @@ export class InstalledSoftwareService { } }); } + + install(software) { + const installedSoftware = this.electronService.remote.require('./installed-software.js') + .install(software); + + } } From 25e137a488ddbd7775e3940569ebda93f80a44cb Mon Sep 17 00:00:00 2001 From: ziajka Date: Fri, 11 Jan 2019 08:38:22 +0100 Subject: [PATCH 05/39] Basic definition of installed software --- .../services/installed-software.service.ts | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/app/services/installed-software.service.ts b/src/app/services/installed-software.service.ts index b113f594..feb4e243 100644 --- a/src/app/services/installed-software.service.ts +++ b/src/app/services/installed-software.service.ts @@ -7,11 +7,22 @@ import { ElectronService } from 'ngx-electron'; export class InstalledSoftwareService { private software = [{ name: 'ls', - commands: ['ls'] + commands: ['ls'], + installed: false }, { name: 'telnet', - commands: ['telnet'] - }] + commands: ['telnet'], + installed: false + }, { + name: 'SolarPuTTY', + commands: [ + 'SolarPuTTY.exe' + ], + type: 'web', + resource: 'exe', + binary: 'SolarPuTTY.exe', + installed: false + }]; constructor( private electronService: ElectronService @@ -22,10 +33,8 @@ export class InstalledSoftwareService { .getInstalledSoftware(this.software); return this.software.map((software) => { - return { - name: software.name, - installed: installedSoftware[software.name].length > 0 - } + software.installed = installedSoftware[software.name].length > 0; + return software; }); } From c3e70e7800f1478911391b1055e165ae7920bf8a Mon Sep 17 00:00:00 2001 From: ziajka Date: Fri, 11 Jan 2019 13:51:23 +0100 Subject: [PATCH 06/39] Basic external software download and run --- installed-software.js | 32 +++++++++++++++---- main.js | 4 +-- package.json | 1 + .../installed-software.component.ts | 4 +-- .../services/installed-software.service.ts | 13 +++++--- 5 files changed, 38 insertions(+), 16 deletions(-) diff --git a/installed-software.js b/installed-software.js index 9a314e77..e9458c49 100644 --- a/installed-software.js +++ b/installed-software.js @@ -1,5 +1,16 @@ var commandExistsSync = require('command-exists').sync; var app = require('electron').app; +var fs = require('fs'); +var util = require('util'); +var fetch = require('node-fetch') +var stream = require('stream'); +var path = require('path'); +const { spawn } = require('child_process'); +const { ipcMain } = require('electron') + +var pipeline = util.promisify(stream.pipeline); + + exports.getInstalledSoftware = (softwareList) => { const installed = {}; @@ -19,12 +30,21 @@ exports.getInstalledSoftware = (softwareList) => { return installed; } -exports.install = (software) => { - var type = software.type; - - if (type == 'web') { +ipcMain.on('installed-software-install', async function (event, software) { + const softwarePath = path.join(app.getAppPath(), software.binary); + if (software.type == 'web') { + var response = await fetch(software.resource); + await pipeline( + response.body, + fs.createWriteStream(softwarePath) + ); } - console.log(app.getAppPath()); -} \ No newline at end of file + const command = `${softwarePath}`; + const child = spawn(command, software.installation_arguments); + child.on('exit', () => { + console.log("exited"); + }); + event.sender.send('installed-software-installed', { success: true}); +}); diff --git a/main.js b/main.js index 44bb7ab5..74f42f20 100644 --- a/main.js +++ b/main.js @@ -6,6 +6,8 @@ const path = require('path'); const url = require('url'); const yargs = require('yargs'); +const { ipcMain } = require('electron') + // Keep a global reference of the window object, if you don't, the window will // be closed automatically when the JavaScript object is garbage collected. let mainWindow; @@ -141,5 +143,3 @@ app.on('activate', function () { // In this file you can include the rest of your app's specific main process // code. You can also put them in separate files and require them here. - - diff --git a/package.json b/package.json index 27de9ca2..b36377e1 100644 --- a/package.json +++ b/package.json @@ -89,6 +89,7 @@ "karma-jasmine": "~2.0.1", "karma-jasmine-html-reporter": "^1.4.0", "license-checker": "^24.1.0", + "node-fetch": "^2.3.0", "node-sass": "^4.11.0", "popper.js": "^1.14.6", "prettier": "^1.15.2", diff --git a/src/app/components/installed-software/installed-software.component.ts b/src/app/components/installed-software/installed-software.component.ts index cf365156..3dcc9bff 100644 --- a/src/app/components/installed-software/installed-software.component.ts +++ b/src/app/components/installed-software/installed-software.component.ts @@ -21,9 +21,7 @@ export class InstalledSoftwareComponent implements OnInit { } install(software) { - this.installedSoftwareService.install({ - type: 'web' - }); + this.installedSoftwareService.install(software); } } diff --git a/src/app/services/installed-software.service.ts b/src/app/services/installed-software.service.ts index feb4e243..686993f0 100644 --- a/src/app/services/installed-software.service.ts +++ b/src/app/services/installed-software.service.ts @@ -19,14 +19,19 @@ export class InstalledSoftwareService { 'SolarPuTTY.exe' ], type: 'web', - resource: 'exe', + resource: '.exe', binary: 'SolarPuTTY.exe', + installation_arguments: ['--only-ask'], installed: false }]; constructor( private electronService: ElectronService - ) { } + ) { + this.electronService.ipcRenderer.on('installed-software-installed', (event, data) => { + console.log("installed", data); + }); + } list() { const installedSoftware = this.electronService.remote.require('./installed-software.js') @@ -39,8 +44,6 @@ export class InstalledSoftwareService { } install(software) { - const installedSoftware = this.electronService.remote.require('./installed-software.js') - .install(software); - + this.electronService.ipcRenderer.send('installed-software-install', software); } } From f46caaf5e0304bb3bf78c6652f7af6e677527cc6 Mon Sep 17 00:00:00 2001 From: ziajka Date: Mon, 14 Jan 2019 09:20:07 +0100 Subject: [PATCH 07/39] Error handler for downloading resource and basic WS support --- installed-software.js | 25 ++++++++++++++----- .../services/installed-software.service.ts | 10 ++++++++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/installed-software.js b/installed-software.js index e9458c49..e16443e0 100644 --- a/installed-software.js +++ b/installed-software.js @@ -34,11 +34,21 @@ ipcMain.on('installed-software-install', async function (event, software) { const softwarePath = path.join(app.getAppPath(), software.binary); if (software.type == 'web') { - var response = await fetch(software.resource); - await pipeline( - response.body, - fs.createWriteStream(softwarePath) - ); + try { + var response = await fetch(software.resource); + if (response.status != 200) { + throw new Error(`Cannot download file ${software.resource}, response status = ${response.status}`); + } + await pipeline( + response.body, + fs.createWriteStream(softwarePath) + ); + } catch(error) { + event.sender.send('installed-software-installed', { + success: false, + message: error.message + }); + } } const command = `${softwarePath}`; @@ -46,5 +56,8 @@ ipcMain.on('installed-software-install', async function (event, software) { child.on('exit', () => { console.log("exited"); }); - event.sender.send('installed-software-installed', { success: true}); + + event.sender.send('installed-software-installed', { + success: true + }); }); diff --git a/src/app/services/installed-software.service.ts b/src/app/services/installed-software.service.ts index 686993f0..c94d9ae8 100644 --- a/src/app/services/installed-software.service.ts +++ b/src/app/services/installed-software.service.ts @@ -23,6 +23,16 @@ export class InstalledSoftwareService { binary: 'SolarPuTTY.exe', installation_arguments: ['--only-ask'], installed: false + }, { + name: 'Wireshark', + commands: [ + 'Wireshark.exe' + ], + type: 'web', + resource: 'https://1.na.dl.wireshark.org/win64/all-versions/Wireshark-win64-2.6.3.exe', + binary: 'Wireshark.exe', + installation_arguments: [], + installed: false }]; constructor( From fecc81badf41955356b9e3eb82f05d18a729a5e6 Mon Sep 17 00:00:00 2001 From: ziajka Date: Mon, 14 Jan 2019 12:47:09 +0100 Subject: [PATCH 08/39] Aks for permission when installing Wireshark --- installed-software.js | 71 +++++++++++++------ .../services/installed-software.service.ts | 16 ++--- 2 files changed, 53 insertions(+), 34 deletions(-) diff --git a/installed-software.js b/installed-software.js index e16443e0..783e186a 100644 --- a/installed-software.js +++ b/installed-software.js @@ -10,53 +10,78 @@ const { ipcMain } = require('electron') var pipeline = util.promisify(stream.pipeline); - - exports.getInstalledSoftware = (softwareList) => { const installed = {}; for(var software of softwareList) { var name = software.name; - var commands = software.commands; + var locations = software.locations; installed[name] = []; - for(var command of commands) { - var exists = commandExistsSync(command); + for(var location of locations) { + // var exists = commandExistsSync(command); + var exists = fs.existsSync(location); if(exists) { - installed[name].push(command); + installed[name].push(location); } } } return installed; } +async function downloadFile(resource, softwarePath) { + var response = await fetch(resource); + if (response.status != 200) { + throw new Error(`Cannot download file ${resource}, response status = ${response.status}`); + } + await pipeline( + response.body, + fs.createWriteStream(softwarePath) + ); +} + ipcMain.on('installed-software-install', async function (event, software) { const softwarePath = path.join(app.getAppPath(), software.binary); if (software.type == 'web') { - try { - var response = await fetch(software.resource); - if (response.status != 200) { - throw new Error(`Cannot download file ${software.resource}, response status = ${response.status}`); - } - await pipeline( - response.body, - fs.createWriteStream(softwarePath) - ); - } catch(error) { - event.sender.send('installed-software-installed', { - success: false, - message: error.message - }); + const exists = fs.existsSync(softwarePath); + if (exists) { + console.log(`Skipping downloading file due to '${softwarePath}' path exists`); + } + else { + console.log(`File '${softwarePath}' doesn't exist. Downloading file.`); + try { + await downloadFile(software.resource, softwarePath); + } catch(error) { + event.sender.send('installed-software-installed', { + success: false, + message: error.message + }); + } + } - } - const command = `${softwarePath}`; - const child = spawn(command, software.installation_arguments); + } + + let child; + + if (software.sudo) { + child = spawn('powershell.exe', ['Start-Process', '-FilePath', `"${softwarePath}"`]); + } + else { + child = spawn(softwarePath, software.installation_arguments); + } + child.on('exit', () => { console.log("exited"); }); + child.on('error', (err) => { + console.log(err); + }); + + child.stdin.end(); + event.sender.send('installed-software-installed', { success: true }); diff --git a/src/app/services/installed-software.service.ts b/src/app/services/installed-software.service.ts index c94d9ae8..06128b03 100644 --- a/src/app/services/installed-software.service.ts +++ b/src/app/services/installed-software.service.ts @@ -6,31 +6,25 @@ import { ElectronService } from 'ngx-electron'; }) export class InstalledSoftwareService { private software = [{ - name: 'ls', - commands: ['ls'], - installed: false - }, { - name: 'telnet', - commands: ['telnet'], - installed: false - }, { name: 'SolarPuTTY', - commands: [ + locations: [ 'SolarPuTTY.exe' ], type: 'web', resource: '.exe', binary: 'SolarPuTTY.exe', + sudo: false, installation_arguments: ['--only-ask'], installed: false }, { name: 'Wireshark', - commands: [ - 'Wireshark.exe' + locations: [ + 'C:\\Program Files\\Wireshark\\Wireshark.exe' ], type: 'web', resource: 'https://1.na.dl.wireshark.org/win64/all-versions/Wireshark-win64-2.6.3.exe', binary: 'Wireshark.exe', + sudo: true, installation_arguments: [], installed: false }]; From 157e3150b5cf1fc45df62db92a28763e795ce0de Mon Sep 17 00:00:00 2001 From: ziajka Date: Mon, 14 Jan 2019 13:52:31 +0100 Subject: [PATCH 09/39] Installation flow control --- installed-software.js | 7 ++- src/app/app.module.ts | 4 +- .../install-software.component.html | 3 + .../install-software.component.scss | 0 .../install-software.component.spec.ts | 25 ++++++++ .../install-software.component.ts | 57 +++++++++++++++++++ .../installed-software.component.html | 6 +- .../installed-software.component.ts | 18 ++++-- .../services/installed-software.service.ts | 8 +-- 9 files changed, 109 insertions(+), 19 deletions(-) create mode 100644 src/app/components/installed-software/install-software/install-software.component.html create mode 100644 src/app/components/installed-software/install-software/install-software.component.scss create mode 100644 src/app/components/installed-software/install-software/install-software.component.spec.ts create mode 100644 src/app/components/installed-software/install-software/install-software.component.ts diff --git a/installed-software.js b/installed-software.js index 783e186a..ccba7a8e 100644 --- a/installed-software.js +++ b/installed-software.js @@ -41,7 +41,8 @@ async function downloadFile(resource, softwarePath) { } ipcMain.on('installed-software-install', async function (event, software) { - const softwarePath = path.join(app.getAppPath(), software.binary); + const softwarePath = path.join(app.getPath('temp'), software.binary); + const responseChannel = `installed-software-installed-${software.name}`; if (software.type == 'web') { const exists = fs.existsSync(softwarePath); @@ -53,7 +54,7 @@ ipcMain.on('installed-software-install', async function (event, software) { try { await downloadFile(software.resource, softwarePath); } catch(error) { - event.sender.send('installed-software-installed', { + event.sender.send(responseChannel, { success: false, message: error.message }); @@ -82,7 +83,7 @@ ipcMain.on('installed-software-install', async function (event, software) { child.stdin.end(); - event.sender.send('installed-software-installed', { + event.sender.send(responseChannel, { success: true }); }); diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 1d3fbef6..745586f8 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -86,6 +86,7 @@ import { InterfaceLabelDraggedComponent } from './components/drawings-listeners/ import { ToolsService } from './services/tools.service'; import { TextAddedComponent } from './components/drawings-listeners/text-added/text-added.component'; import { DrawingAddedComponent } from './components/drawings-listeners/drawing-added/drawing-added.component'; +import { InstallSoftwareComponent } from './components/installed-software/install-software/install-software.component'; if (environment.production) { @@ -138,7 +139,8 @@ if (environment.production) { NodeLabelDraggedComponent, DrawingDraggedComponent, LinkCreatedComponent, - InterfaceLabelDraggedComponent + InterfaceLabelDraggedComponent, + InstallSoftwareComponent ], imports: [ BrowserModule, diff --git a/src/app/components/installed-software/install-software/install-software.component.html b/src/app/components/installed-software/install-software/install-software.component.html new file mode 100644 index 00000000..dba60bbf --- /dev/null +++ b/src/app/components/installed-software/install-software/install-software.component.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/app/components/installed-software/install-software/install-software.component.scss b/src/app/components/installed-software/install-software/install-software.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/app/components/installed-software/install-software/install-software.component.spec.ts b/src/app/components/installed-software/install-software/install-software.component.spec.ts new file mode 100644 index 00000000..15bc0cf0 --- /dev/null +++ b/src/app/components/installed-software/install-software/install-software.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { InstallSoftwareComponent } from './install-software.component'; + +describe('InstallSoftwareComponent', () => { + let component: InstallSoftwareComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ InstallSoftwareComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(InstallSoftwareComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/installed-software/install-software/install-software.component.ts b/src/app/components/installed-software/install-software/install-software.component.ts new file mode 100644 index 00000000..aedf2193 --- /dev/null +++ b/src/app/components/installed-software/install-software/install-software.component.ts @@ -0,0 +1,57 @@ +import { Component, OnInit, Output, EventEmitter, Input, OnDestroy } from '@angular/core'; +import { ElectronService } from 'ngx-electron'; + +@Component({ + selector: 'app-install-software', + templateUrl: './install-software.component.html', + styleUrls: ['./install-software.component.scss'] +}) +export class InstallSoftwareComponent implements OnInit, OnDestroy { + @Input('software') + software: any; + + @Output() + installedChanged = new EventEmitter(); + + public disabled = false; + public readyToInstall = true; + public buttonText: string; + + constructor( + private electronService: ElectronService + ) { } + + ngOnInit() { + this.electronService.ipcRenderer.on(this.responseChannel, (event, data) => { + this.updateButton(); + this.installedChanged.emit(data); + }); + this.updateButton(); + } + + ngOnDestroy() { + this.electronService.ipcRenderer.removeAllListeners(this.responseChannel); + } + + + install() { + this.disabled = true; + this.buttonText = "Installing"; + this.electronService.ipcRenderer.send('installed-software-install', this.software); + } + + private get responseChannel() { + return `installed-software-installed-${this.software.name}`; + } + + updateButton() { + this.disabled = this.software.installed; + + if (this.software.installed) { + this.buttonText = "Installed"; + } + else { + this.buttonText = "Install"; + } + } +} diff --git a/src/app/components/installed-software/installed-software.component.html b/src/app/components/installed-software/installed-software.component.html index a0929735..987b7af3 100644 --- a/src/app/components/installed-software/installed-software.component.html +++ b/src/app/components/installed-software/installed-software.component.html @@ -14,10 +14,12 @@ - diff --git a/src/app/components/project-map/drawings-editors/style-editor/style-editor.component.scss b/src/app/components/project-map/drawings-editors/style-editor/style-editor.component.scss index 6bc87183..cc9d349b 100644 --- a/src/app/components/project-map/drawings-editors/style-editor/style-editor.component.scss +++ b/src/app/components/project-map/drawings-editors/style-editor/style-editor.component.scss @@ -38,3 +38,12 @@ input[type="color"]::-webkit-color-swatch-wrapper { input[type="color"]::-webkit-color-swatch { border: none; } + +.modal-form-container { + display: flex; + flex-direction: column; +} + +.modal-form-container > * { + width: 100%; +} diff --git a/src/app/components/project-map/drawings-editors/text-editor/text-editor.component.html b/src/app/components/project-map/drawings-editors/text-editor/text-editor.component.html index fa457c64..97348473 100644 --- a/src/app/components/project-map/drawings-editors/text-editor/text-editor.component.html +++ b/src/app/components/project-map/drawings-editors/text-editor/text-editor.component.html @@ -1,13 +1,17 @@

Text editor

- -
Fill color
- -
- -
Rotation
- -
- + + +
diff --git a/src/app/components/project-map/drawings-editors/text-editor/text-editor.component.scss b/src/app/components/project-map/drawings-editors/text-editor/text-editor.component.scss index 28b6baf4..fa95b1f1 100644 --- a/src/app/components/project-map/drawings-editors/text-editor/text-editor.component.scss +++ b/src/app/components/project-map/drawings-editors/text-editor/text-editor.component.scss @@ -43,3 +43,12 @@ input[type="color"]::-webkit-color-swatch { width: 100%; height: 150px; } + +.modal-form-container { + display: flex; + flex-direction: column; +} + +.modal-form-container > * { + width: 100%; +} From b084677cf7e7f7b9af559c038834e372a334ebb9 Mon Sep 17 00:00:00 2001 From: Piotr Pekala Date: Thu, 17 Jan 2019 02:29:16 -0800 Subject: [PATCH 15/39] Style for import project dialog edited --- .../import-project-dialog.component.css | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/app/components/projects/import-project-dialog/import-project-dialog.component.css b/src/app/components/projects/import-project-dialog/import-project-dialog.component.css index c8b01afb..5485afaa 100644 --- a/src/app/components/projects/import-project-dialog/import-project-dialog.component.css +++ b/src/app/components/projects/import-project-dialog/import-project-dialog.component.css @@ -3,9 +3,9 @@ } .file-button{ - height: 50px; - width: 30%; - margin-top: 10px; + width: 100%; + margin-top: 5px; + margin-bottom: 10px; padding: 0px; } @@ -15,8 +15,7 @@ } .file-name-form-field { - margin-left: 5%; - width: 60%; + width: 100%; } .delete-button { From 347a3de22c2560c4410844435d6ec39d20e8eeea Mon Sep 17 00:00:00 2001 From: Piotr Pekala Date: Thu, 17 Jan 2019 05:02:56 -0800 Subject: [PATCH 16/39] Fixes for context menu & selection --- src/app/components/project-map/project-map.component.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/app/components/project-map/project-map.component.ts b/src/app/components/project-map/project-map.component.ts index 9c4bd4f5..06a79792 100644 --- a/src/app/components/project-map/project-map.component.ts +++ b/src/app/components/project-map/project-map.component.ts @@ -207,6 +207,10 @@ export class ProjectMapComponent implements OnInit, OnDestroy { } setUpMapCallbacks() { + if (!this.readonly) { + this.toolsService.selectionToolActivation(true); + } + const onNodeContextMenu = this.nodeWidget.onContextMenu.subscribe((eventNode: NodeContextMenu) => { const node = this.mapNodeToNode.convert(eventNode.node); this.contextMenu.openMenuForNode(node, eventNode.event.clientY, eventNode.event.clientX); @@ -219,7 +223,7 @@ export class ProjectMapComponent implements OnInit, OnDestroy { const onContextMenu = this.selectionTool.contextMenuOpened.subscribe((event) => { const selectedItems = this.selectionManager.getSelected(); - if (selectedItems.length === 0) return; + if (selectedItems.length === 0 || !(event instanceof MouseEvent)) return; let drawings: Drawing[] = []; let nodes: Node[] = []; From 9ecb6b4a24c1b8c6b87beae590bfc1c74d00310b Mon Sep 17 00:00:00 2001 From: Piotr Pekala Date: Thu, 17 Jan 2019 05:20:39 -0800 Subject: [PATCH 17/39] Fix for text adding --- .../cartography/components/text-editor/text-editor.component.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/cartography/components/text-editor/text-editor.component.ts b/src/app/cartography/components/text-editor/text-editor.component.ts index 3de27fa4..f8b9fa8e 100644 --- a/src/app/cartography/components/text-editor/text-editor.component.ts +++ b/src/app/cartography/components/text-editor/text-editor.component.ts @@ -60,6 +60,7 @@ export class TextEditorComponent implements OnInit, OnDestroy { ); this.deactivateTextAdding(); this.innerText = ''; + this.temporaryTextElement.nativeElement.innerText = ''; this.temporaryTextElement.nativeElement.removeEventListener('focusout', this.textListener); this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'display', 'none'); }; From dc22510d30227e36d78d0342af95655adf040e86 Mon Sep 17 00:00:00 2001 From: ziajka Date: Wed, 23 Jan 2019 15:31:03 +0100 Subject: [PATCH 18/39] Tests for default layout component --- .../default-layout.component.spec.ts | 41 +++++++++++++++++-- .../default-layout.component.ts | 2 +- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/app/layouts/default-layout/default-layout.component.spec.ts b/src/app/layouts/default-layout/default-layout.component.spec.ts index bd44ca4e..47f00002 100644 --- a/src/app/layouts/default-layout/default-layout.component.spec.ts +++ b/src/app/layouts/default-layout/default-layout.component.spec.ts @@ -1,14 +1,35 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { DefaultLayoutComponent } from './default-layout.component'; +import { ElectronService } from 'ngx-electron'; +import { MatIconModule, MatMenuModule, MatToolbarModule, MatProgressSpinnerModule } from '@angular/material'; +import { RouterTestingModule } from '@angular/router/testing'; +import { ProgressComponent } from '../../common/progress/progress.component'; +import { ProgressService } from '../../common/progress/progress.service'; + + +class ElectronServiceMock { + public isElectronApp: boolean; +} describe('DefaultLayoutComponent', () => { let component: DefaultLayoutComponent; let fixture: ComponentFixture; + let electronServiceMock: ElectronServiceMock; beforeEach(async(() => { + electronServiceMock = new ElectronServiceMock(); + TestBed.configureTestingModule({ - declarations: [DefaultLayoutComponent] + declarations: [DefaultLayoutComponent, ProgressComponent], + imports: [MatIconModule, MatMenuModule, MatToolbarModule, RouterTestingModule, MatProgressSpinnerModule], + providers: [ + { + provide: ElectronService, + useValue: electronServiceMock + }, + ProgressService + ] }).compileComponents(); })); @@ -18,7 +39,19 @@ describe('DefaultLayoutComponent', () => { fixture.detectChanges(); }); - // it('should create', () => { - // expect(component).toBeTruthy(); - // }); + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should installed software be available', () => { + electronServiceMock.isElectronApp = true; + component.ngOnInit(); + expect(component.isInstalledSoftwareAvailable).toBeTruthy(); + }); + + it('should installed software be not available', () => { + electronServiceMock.isElectronApp = false; + component.ngOnInit(); + expect(component.isInstalledSoftwareAvailable).toBeFalsy(); + }); }); diff --git a/src/app/layouts/default-layout/default-layout.component.ts b/src/app/layouts/default-layout/default-layout.component.ts index fb974ee4..162f83c6 100644 --- a/src/app/layouts/default-layout/default-layout.component.ts +++ b/src/app/layouts/default-layout/default-layout.component.ts @@ -12,7 +12,7 @@ export class DefaultLayoutComponent implements OnInit { constructor( private electronService: ElectronService - ) { } + ) {} ngOnInit() { this.isInstalledSoftwareAvailable = this.electronService.isElectronApp; From c1bdce4fce5ec8ac1269fc32b0ee586afd1f1485 Mon Sep 17 00:00:00 2001 From: ziajka Date: Wed, 23 Jan 2019 16:08:08 +0100 Subject: [PATCH 19/39] Move definition of external software to separate file --- ...ternal-software-definition.service.spec.ts | 12 ++++ .../external-software-definition.service.ts | 59 +++++++++++++++++++ .../services/installed-software.service.ts | 41 +++---------- src/app/services/platform.service.spec.ts | 12 ++++ src/app/services/platform.service.ts | 22 +++++++ 5 files changed, 114 insertions(+), 32 deletions(-) create mode 100644 src/app/services/external-software-definition.service.spec.ts create mode 100644 src/app/services/external-software-definition.service.ts create mode 100644 src/app/services/platform.service.spec.ts create mode 100644 src/app/services/platform.service.ts diff --git a/src/app/services/external-software-definition.service.spec.ts b/src/app/services/external-software-definition.service.spec.ts new file mode 100644 index 00000000..9939de78 --- /dev/null +++ b/src/app/services/external-software-definition.service.spec.ts @@ -0,0 +1,12 @@ +import { TestBed } from '@angular/core/testing'; + +import { ExternalSoftwareDefinitionService } from './external-software-definition.service'; + +describe('ExternalSoftwareDefinitionService', () => { + beforeEach(() => TestBed.configureTestingModule({})); + + it('should be created', () => { + const service: ExternalSoftwareDefinitionService = TestBed.get(ExternalSoftwareDefinitionService); + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/services/external-software-definition.service.ts b/src/app/services/external-software-definition.service.ts new file mode 100644 index 00000000..e59f33a4 --- /dev/null +++ b/src/app/services/external-software-definition.service.ts @@ -0,0 +1,59 @@ +import { Injectable } from '@angular/core'; +import { PlatformService } from './platform.service'; + +@Injectable() +export class ExternalSoftwareDefinitionService { + + constructor( + private platformService: PlatformService + ) { } + + get() { + if(this.platformService.isWindows()) { + return this.getForWindows(); + } + if(this.platformService.isDarwin()) { + return this.getForDarwin(); + } + return this.getForLinux(); + } + + getForWindows() { + const software = [{ + name: 'Wireshark', + locations: [ + 'C:\\Program Files\\Wireshark\\Wireshark.exe' + ], + type: 'web', + resource: 'https://1.na.dl.wireshark.org/win64/all-versions/Wireshark-win64-2.6.3.exe', + binary: 'Wireshark.exe', + sudo: true, + installation_arguments: [], + installed: false + } + ]; + + const solarPutty = { + name: 'SolarPuTTY', + locations: [ + 'SolarPuTTY.exe' + ], + type: 'web', + resource: '.exe', + binary: 'SolarPuTTY.exe', + sudo: false, + installation_arguments: ['--only-ask'], + installed: false + }; + + return software; + } + + getForLinux() { + return []; + } + + getForDarwin() { + return []; + } +} diff --git a/src/app/services/installed-software.service.ts b/src/app/services/installed-software.service.ts index 29326fb3..1e64eef5 100644 --- a/src/app/services/installed-software.service.ts +++ b/src/app/services/installed-software.service.ts @@ -1,44 +1,21 @@ import { Injectable } from '@angular/core'; import { ElectronService } from 'ngx-electron'; +import { ExternalSoftwareDefinitionService } from './external-software-definition.service'; -@Injectable({ - providedIn: 'root' -}) +@Injectable() export class InstalledSoftwareService { - private software = [{ - name: 'SolarPuTTY', - locations: [ - 'SolarPuTTY.exe' - ], - type: 'web', - resource: '.exe', - binary: 'SolarPuTTY.exe', - sudo: false, - installation_arguments: ['--only-ask'], - installed: false - }, { - name: 'Wireshark', - locations: [ - 'C:\\Program Files\\Wireshark\\Wireshark.exe' - ], - type: 'web', - resource: 'https://1.na.dl.wireshark.org/win64/all-versions/Wireshark-win64-2.6.3.exe', - binary: 'Wireshark.exe', - sudo: true, - installation_arguments: [], - installed: false - }]; - constructor( - private electronService: ElectronService - ) { -} + private electronService: ElectronService, + private externalSoftwareDefinition: ExternalSoftwareDefinitionService + ) { } list() { + const softwareDefinition = this.externalSoftwareDefinition.get(); + const installedSoftware = this.electronService.remote.require('./installed-software.js') - .getInstalledSoftware(this.software); + .getInstalledSoftware(softwareDefinition); - return this.software.map((software) => { + return softwareDefinition.map((software) => { software.installed = installedSoftware[software.name].length > 0; return software; }); diff --git a/src/app/services/platform.service.spec.ts b/src/app/services/platform.service.spec.ts new file mode 100644 index 00000000..ea5d039a --- /dev/null +++ b/src/app/services/platform.service.spec.ts @@ -0,0 +1,12 @@ +import { TestBed } from '@angular/core/testing'; + +import { PlatformService } from './platform.service'; + +describe('PlatformService', () => { + beforeEach(() => TestBed.configureTestingModule({})); + + it('should be created', () => { + const service: PlatformService = TestBed.get(PlatformService); + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/services/platform.service.ts b/src/app/services/platform.service.ts new file mode 100644 index 00000000..58f6b5df --- /dev/null +++ b/src/app/services/platform.service.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@angular/core'; +import { ElectronService } from 'ngx-electron'; + +@Injectable() +export class PlatformService { + + constructor( + private electronService: ElectronService + ) { } + + isWindows() { + return this.electronService.process.platform === 'win32'; + } + + isLinux() { + return this.electronService.process.platform === 'linux'; + } + + isDarwin() { + return this.electronService.process.platform === 'darwin'; + } +} From ef38319b5f75581d3fef6af519166cbd1bbf9896 Mon Sep 17 00:00:00 2001 From: ziajka Date: Fri, 25 Jan 2019 13:48:22 +0100 Subject: [PATCH 20/39] Transport OS ENV into environment.prod.ts --- .gitignore | 3 +++ package.json | 5 ++++- .../services/external-software-definition.service.ts | 10 ++++++++-- src/environments/environment.prod.ts | 4 +++- src/environments/environment.ts | 3 ++- 5 files changed, 20 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 91fd7fb7..ad1e4d1c 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,6 @@ Thumbs.db # Licenses file licenses.csv + +# Temps +.temp-var-file.ts diff --git a/package.json b/package.json index b36377e1..e036c159 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,9 @@ "prettier:base": "prettier", "prettier:check": "yarn prettier:base -- --list-different \"src/**/*.{ts,js,html,scss}\"", "prettier:write": "yarn prettier:base -- --write \"src/**/*.{ts,js,html,scss}\"", - "generate-licenses-file": "yarn license-checker --production --csv --out licenses.csv" + "generate-licenses-file": "yarn license-checker --production --csv --out licenses.csv", + "prebuild": "node set-variables-in-env.js --set src/environments/environment.prod.ts", + "postbuild": "node set-variables-in-env.js --unset src/environments/environment.prod.ts" }, "private": true, "dependencies": { @@ -94,6 +96,7 @@ "popper.js": "^1.14.6", "prettier": "^1.15.2", "protractor": "~5.4.2", + "replace": "^1.0.1", "ts-mockito": "^2.3.1", "ts-node": "~7.0.1", "tslint": "~5.12.0", diff --git a/src/app/services/external-software-definition.service.ts b/src/app/services/external-software-definition.service.ts index e59f33a4..da205e8b 100644 --- a/src/app/services/external-software-definition.service.ts +++ b/src/app/services/external-software-definition.service.ts @@ -1,5 +1,6 @@ import { Injectable } from '@angular/core'; import { PlatformService } from './platform.service'; +import { environment } from '../../environments/environment'; @Injectable() export class ExternalSoftwareDefinitionService { @@ -19,7 +20,7 @@ export class ExternalSoftwareDefinitionService { } getForWindows() { - const software = [{ + let software = [{ name: 'Wireshark', locations: [ 'C:\\Program Files\\Wireshark\\Wireshark.exe' @@ -39,13 +40,18 @@ export class ExternalSoftwareDefinitionService { 'SolarPuTTY.exe' ], type: 'web', - resource: '.exe', + resource: '', binary: 'SolarPuTTY.exe', sudo: false, installation_arguments: ['--only-ask'], installed: false }; + if(environment.solarputty_download_url) { + solarPutty.resource = environment.solarputty_download_url; + software.push(solarPutty); + } + return software; } diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index cbe10f98..d8eafc7b 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -1,5 +1,7 @@ export const environment = { + /* Below configuration is replaced during build time, don't remove. */ + //ENV production: true, electron: false, - githubio: false + githubio: false, }; diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 02712c06..b4dfd930 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -5,7 +5,8 @@ export const environment = { production: false, electron: false, - githubio: false + githubio: false, + solarputty_download_url: '' }; /* From 7e6f64b16a71d577d71026eb03434e5165f939a0 Mon Sep 17 00:00:00 2001 From: ziajka Date: Fri, 25 Jan 2019 13:48:45 +0100 Subject: [PATCH 21/39] Transport OS ENV into environment.prod.ts - Append file --- set-variables-in-env.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 set-variables-in-env.js diff --git a/set-variables-in-env.js b/set-variables-in-env.js new file mode 100644 index 00000000..7054b6c9 --- /dev/null +++ b/set-variables-in-env.js @@ -0,0 +1,24 @@ +const yargs = require('yargs'); +// const tmp = require('tmp'); +const fs = require('fs'); +const path = require('path'); + +const argv = yargs.argv; +const tempFile = `.temp-var-file.ts`; + +if(argv.set) { + const envFile = argv.set; + + console.log(`Backuping up '${envFile}' into '${tempFile}'.`); + fs.copyFileSync(envFile, tempFile); + const content = fs.readFileSync(envFile, "utf8"); + const variables = `solarputty_download_url: '${process.env.SOLARPUTTY_DOWNLOAD_URL}',` + const replaced = content.replace('//ENV', variables); + fs.writeFileSync(envFile, replaced); +} + +if(argv.unset) { + const envFile = argv.unset; + console.log(`Restoring '${tempFile}' into '${envFile}'.`); + fs.copyFileSync(tempFile, envFile); +} \ No newline at end of file From 4ea8c9568f70c9d5526366a4e3311ba1e929043e Mon Sep 17 00:00:00 2001 From: ziajka Date: Fri, 25 Jan 2019 13:49:34 +0100 Subject: [PATCH 22/39] Clean set-variables-in-env.js --- set-variables-in-env.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/set-variables-in-env.js b/set-variables-in-env.js index 7054b6c9..b1e3833e 100644 --- a/set-variables-in-env.js +++ b/set-variables-in-env.js @@ -1,14 +1,11 @@ const yargs = require('yargs'); -// const tmp = require('tmp'); const fs = require('fs'); -const path = require('path'); const argv = yargs.argv; const tempFile = `.temp-var-file.ts`; if(argv.set) { const envFile = argv.set; - console.log(`Backuping up '${envFile}' into '${tempFile}'.`); fs.copyFileSync(envFile, tempFile); const content = fs.readFileSync(envFile, "utf8"); From 65acfbb11cbc2dd2bcd21ae970163b77ab3db36c Mon Sep 17 00:00:00 2001 From: ziajka Date: Mon, 28 Jan 2019 10:24:00 +0100 Subject: [PATCH 23/39] Env definition --- src/app/app.module.ts | 8 +++++++- .../installed-software/installed-software.component.ts | 1 - src/environments/environment.electron.prod.ts | 3 ++- src/environments/environment.electron.ts | 3 ++- src/environments/environment.github.prod.ts | 3 ++- 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/app/app.module.ts b/src/app/app.module.ts index a526f82d..fdab8b00 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -92,6 +92,9 @@ import { InstallSoftwareComponent } from './components/installed-software/instal import { StyleEditorDialogComponent } from './components/project-map/drawings-editors/style-editor/style-editor.component'; import { EditTextActionComponent } from './components/project-map/context-menu/actions/edit-text-action/edit-text-action.component'; import { TextEditorDialogComponent } from './components/project-map/drawings-editors/text-editor/text-editor.component'; +import { InstalledSoftwareService } from './services/installed-software.service'; +import { ExternalSoftwareDefinitionService } from './services/external-software-definition.service'; +import { PlatformService } from './services/platform.service'; if (environment.production) { Raven.config('https://b2b1cfd9b043491eb6b566fd8acee358@sentry.io/842726', { @@ -191,7 +194,10 @@ if (environment.production) { ServerErrorHandler, ServerDatabase, ProjectNameValidator, - ToolsService + ToolsService, + InstalledSoftwareService, + ExternalSoftwareDefinitionService, + PlatformService ], entryComponents: [ AddServerDialogComponent, diff --git a/src/app/components/installed-software/installed-software.component.ts b/src/app/components/installed-software/installed-software.component.ts index 64300e14..2d8e098b 100644 --- a/src/app/components/installed-software/installed-software.component.ts +++ b/src/app/components/installed-software/installed-software.component.ts @@ -23,7 +23,6 @@ export class InstalledSoftwareComponent implements OnInit { onInstalled(event) { this.dataSource.refresh(); - console.log("On installed", event); /** * During software installation we are not performing any user action * in browser hence Angular doesn't know something suppose to change. diff --git a/src/environments/environment.electron.prod.ts b/src/environments/environment.electron.prod.ts index b7954d59..c8f57a95 100644 --- a/src/environments/environment.electron.prod.ts +++ b/src/environments/environment.electron.prod.ts @@ -1,4 +1,5 @@ export const environment = { production: true, - electron: true + electron: true, + solarputty_download_url: "" }; diff --git a/src/environments/environment.electron.ts b/src/environments/environment.electron.ts index 2a4b4a8f..bfe95058 100644 --- a/src/environments/environment.electron.ts +++ b/src/environments/environment.electron.ts @@ -1,4 +1,5 @@ export const environment = { production: false, - electron: true + electron: true, + solarputty_download_url: "" }; diff --git a/src/environments/environment.github.prod.ts b/src/environments/environment.github.prod.ts index bca92dff..2bf4ad5f 100644 --- a/src/environments/environment.github.prod.ts +++ b/src/environments/environment.github.prod.ts @@ -1,5 +1,6 @@ export const environment = { production: true, electron: false, - githubio: true + githubio: true, + solarputty_download_url: "" }; From ed204d3229c51dcd19afe6d401c93bf32ddc3c58 Mon Sep 17 00:00:00 2001 From: ziajka Date: Mon, 28 Jan 2019 11:12:46 +0100 Subject: [PATCH 24/39] PlatformService tests --- src/app/services/platform.service.spec.ts | 49 ++++++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/src/app/services/platform.service.spec.ts b/src/app/services/platform.service.spec.ts index ea5d039a..7a49f5de 100644 --- a/src/app/services/platform.service.spec.ts +++ b/src/app/services/platform.service.spec.ts @@ -1,12 +1,57 @@ import { TestBed } from '@angular/core/testing'; import { PlatformService } from './platform.service'; +import { ElectronService } from 'ngx-electron'; + +class ElectronServiceMock { + process = { + platform: 'unknown' + }; +} describe('PlatformService', () => { - beforeEach(() => TestBed.configureTestingModule({})); + let electronServiceMock: ElectronServiceMock; + let service: PlatformService; + + beforeEach(() => { + electronServiceMock = new ElectronServiceMock(); + }); + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ + PlatformService, + {provide: ElectronService, useValue: electronServiceMock} + ] + }); + }); + + beforeEach(() => { + service = TestBed.get(PlatformService); + }) it('should be created', () => { - const service: PlatformService = TestBed.get(PlatformService); expect(service).toBeTruthy(); }); + + it('should be on windows platform', () => { + electronServiceMock.process.platform = 'win32'; + expect(service.isWindows()).toBeTruthy(); + expect(service.isDarwin()).toBeFalsy(); + expect(service.isLinux()).toBeFalsy(); + }); + + it('should be on linux platform', () => { + electronServiceMock.process.platform = 'linux'; + expect(service.isWindows()).toBeFalsy(); + expect(service.isDarwin()).toBeFalsy(); + expect(service.isLinux()).toBeTruthy(); + }); + + it('should be on darwin platform', () => { + electronServiceMock.process.platform = 'darwin'; + expect(service.isWindows()).toBeFalsy(); + expect(service.isDarwin()).toBeTruthy(); + expect(service.isLinux()).toBeFalsy(); + }); }); From 6da769a79baafe67ea742ec2f425dff39635f302 Mon Sep 17 00:00:00 2001 From: ziajka Date: Mon, 28 Jan 2019 11:12:55 +0100 Subject: [PATCH 25/39] Update yarn.lock --- yarn.lock | 55 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 18 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2b921fe5..ac114b3f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2035,6 +2035,11 @@ colors@1.1.2: resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= +colors@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.2.4.tgz#e0cb41d3e4b20806b3bfc27f4559f01b94bc2f7c" + integrity sha512-6Y+iBnWmXL+AWtlOp2Vr6R2w5MUlNJRwR0ShVFaAb1CqWzhPOpQg4L0jxD+xpw/Nc8QJwaq3KM79QUCriY8CWQ== + colors@^1.1.0: version "1.3.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" @@ -5946,6 +5951,11 @@ node-fetch-npm@^2.0.2: json-parse-better-errors "^1.0.0" safe-buffer "^5.1.1" +node-fetch@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" + integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA== + node-forge@0.7.5: version "0.7.5" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" @@ -7305,6 +7315,15 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" +replace@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/replace/-/replace-1.0.1.tgz#a7838aaf5977d443e903aea4ba52b2c7ac432190" + integrity sha512-Qh0XcLMb3LYa6fs7V30zQHACbJTQJUERl22lVjaq0dJp6B5q1t/vARXDauS1ywpIs3ZkT3APj4EA6aOoHoaHDA== + dependencies: + colors "1.2.4" + minimatch "3.0.4" + yargs "12.0.5" + request@^2.45.0, request@^2.83.0, request@^2.87.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" @@ -9245,6 +9264,24 @@ yargs@12.0.2: y18n "^3.2.1 || ^4.0.0" yargs-parser "^10.1.0" +yargs@12.0.5, yargs@^12.0.5: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" + yargs@9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" @@ -9264,24 +9301,6 @@ yargs@9.0.1: y18n "^3.2.1" yargs-parser "^7.0.0" -yargs@^12.0.5: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== - dependencies: - cliui "^4.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" - yargs@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" From 9073230b2dafc9ac343594cfd4f8b437de3db131 Mon Sep 17 00:00:00 2001 From: ziajka Date: Mon, 28 Jan 2019 11:28:12 +0100 Subject: [PATCH 26/39] ExternalSoftwareDefinitionService tests --- ...ternal-software-definition.service.spec.ts | 89 ++++++++++++++++++- 1 file changed, 87 insertions(+), 2 deletions(-) diff --git a/src/app/services/external-software-definition.service.spec.ts b/src/app/services/external-software-definition.service.spec.ts index 9939de78..de4b073d 100644 --- a/src/app/services/external-software-definition.service.spec.ts +++ b/src/app/services/external-software-definition.service.spec.ts @@ -1,12 +1,97 @@ import { TestBed } from '@angular/core/testing'; import { ExternalSoftwareDefinitionService } from './external-software-definition.service'; +import { PlatformService } from './platform.service'; + +import Spy = jasmine.Spy; + +class PlatformServiceMock { + platform: string; + isWindows() { + return this.platform == 'windows'; + } + isLinux() { + return this.platform == 'linux'; + } + isDarwin() { + return this.platform == 'darwin'; + } +} + describe('ExternalSoftwareDefinitionService', () => { - beforeEach(() => TestBed.configureTestingModule({})); + let platformServiceMock: PlatformServiceMock; + let service: ExternalSoftwareDefinitionService; + + beforeEach(() => { + platformServiceMock = new PlatformServiceMock(); + }); + + beforeEach(() => TestBed.configureTestingModule({ + providers: [ + ExternalSoftwareDefinitionService, + { provide: PlatformService, useValue: platformServiceMock} + ] + })); + + beforeEach(() => { + service = TestBed.get(ExternalSoftwareDefinitionService); + }) it('should be created', () => { - const service: ExternalSoftwareDefinitionService = TestBed.get(ExternalSoftwareDefinitionService); expect(service).toBeTruthy(); }); + + it('should return list for windows', () => { + let software = service.getForWindows(); + expect(software.length).toEqual(1); + }); + + it('should return list for linux', () => { + let software = service.getForLinux(); + expect(software.length).toEqual(0); + }); + + it('should return list for darwin', () => { + let software = service.getForDarwin(); + expect(software.length).toEqual(0); + }); + + describe('ExternalSoftwareDefinitionService.get', () => { + let windowsSpy: Spy; + let darwinSpy: Spy; + let linuxSpy: Spy; + + beforeEach(() => { + windowsSpy = spyOn(service, 'getForWindows').and.callThrough(); + darwinSpy = spyOn(service, 'getForDarwin').and.callThrough(); + linuxSpy = spyOn(service, 'getForLinux').and.callThrough(); + }); + + it('should return list when on windows', () => { + platformServiceMock.platform = 'windows'; + expect(service.get()).toBeDefined(); + expect(windowsSpy).toHaveBeenCalled(); + expect(darwinSpy).not.toHaveBeenCalled(); + expect(linuxSpy).not.toHaveBeenCalled(); + }); + + it('should return list when on linux', () => { + platformServiceMock.platform = 'linux'; + expect(service.get()).toBeDefined(); + expect(windowsSpy).not.toHaveBeenCalled(); + expect(darwinSpy).not.toHaveBeenCalled(); + expect(linuxSpy).toHaveBeenCalled(); + }); + + it('should return list when on darwin', () => { + platformServiceMock.platform = 'darwin'; + expect(service.get()).toBeDefined(); + expect(windowsSpy).not.toHaveBeenCalled(); + expect(darwinSpy).toHaveBeenCalled(); + expect(linuxSpy).not.toHaveBeenCalled(); + }); + + }) + }); From 0476f75dd725144ea3e90d065123d6461d75d73d Mon Sep 17 00:00:00 2001 From: ziajka Date: Mon, 28 Jan 2019 12:55:20 +0100 Subject: [PATCH 27/39] Use Xenial for travis builds --- .travis.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6d2671cd..c074403d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,8 @@ cache: directories: - node_modules +dist: xenial + addons: apt: sources: @@ -31,12 +33,12 @@ before_install: # Ubuntu trusty supports max python3.4, cx_freeze-5.1.1 requires min 3.5 # Remove when goes to xenial - | - curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash - export PATH="~/.pyenv/bin:$PATH" - eval "$(pyenv init -)" - eval "$(pyenv virtualenv-init -)" - pyenv virtualenv 3.6.3 general - pyenv global general + # curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash + # export PATH="~/.pyenv/bin:$PATH" + # eval "$(pyenv init -)" + # eval "$(pyenv virtualenv-init -)" + # pyenv virtualenv 3.6.3 general + # pyenv global general python3 -V pip3 -V From 9f185bd626135890d3060b3cf08d2c98dcedaa73 Mon Sep 17 00:00:00 2001 From: ziajka Date: Mon, 28 Jan 2019 12:57:34 +0100 Subject: [PATCH 28/39] Disable config for XVFB --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index c074403d..60ffa6c4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,9 +24,9 @@ apt: - g++-4.8 before_install: - - export CHROME_BIN=chromium-browser - - export DISPLAY=:99.0 - - sh -e /etc/init.d/xvfb start + # - export CHROME_BIN=chromium-browser + # - export DISPLAY=:99.0 + # - sh -e /etc/init.d/xvfb start # greenkeeper-lockfile support - yarn global add greenkeeper-lockfile@1 From 1a85be06ebb8c256e3ef51db6867b323c6f76348 Mon Sep 17 00:00:00 2001 From: ziajka Date: Mon, 28 Jan 2019 13:02:54 +0100 Subject: [PATCH 29/39] Adjust Python version --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 60ffa6c4..a18d5dcb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,8 +39,8 @@ before_install: # eval "$(pyenv virtualenv-init -)" # pyenv virtualenv 3.6.3 general # pyenv global general - python3 -V - pip3 -V + python -V + pip -V before_script: From 77b4b1213ee4e97880f51ec41732406bd87fccaa Mon Sep 17 00:00:00 2001 From: ziajka Date: Mon, 28 Jan 2019 13:05:10 +0100 Subject: [PATCH 30/39] Use bundled pip tool --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index a18d5dcb..a1b58ba2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,8 +39,8 @@ before_install: # eval "$(pyenv virtualenv-init -)" # pyenv virtualenv 3.6.3 general # pyenv global general - python -V - pip -V + python3 -V + python3 -m pip -V before_script: @@ -72,9 +72,9 @@ after_script: # publish - yarn buildforelectron - - python3 -m venv env + # - python3 -m venv env - | - pip3 install -r scripts/requirements.txt + python3 -m pip install -r scripts/requirements.txt python3 scripts/build.py download python3 scripts/build.py build_exe -b dist/exe.gns3server -s python3 scripts/build.py validate -b dist From 09dacccf38181ad0921d2fb3cebf504a5f7ecb44 Mon Sep 17 00:00:00 2001 From: ziajka Date: Mon, 28 Jan 2019 13:08:02 +0100 Subject: [PATCH 31/39] Install pip from apt-get --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index a1b58ba2..1a2329ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,6 +22,7 @@ apt: - google-chrome-stable - google-chrome-beta - g++-4.8 + - python3-pip before_install: # - export CHROME_BIN=chromium-browser From 47afb8c937138d67aebd0f1fe35fec1da61a6488 Mon Sep 17 00:00:00 2001 From: ziajka Date: Mon, 28 Jan 2019 13:16:00 +0100 Subject: [PATCH 32/39] Install external PIP --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 1a2329ee..9552c8ce 100644 --- a/.travis.yml +++ b/.travis.yml @@ -41,6 +41,7 @@ before_install: # pyenv virtualenv 3.6.3 general # pyenv global general python3 -V + wget -qO- https://bootstrap.pypa.io/get-pip.py | python3 python3 -m pip -V From 0a9c849431928bbba63b67a37c8c1e8bd601c64b Mon Sep 17 00:00:00 2001 From: ziajka Date: Mon, 28 Jan 2019 13:20:55 +0100 Subject: [PATCH 33/39] Install pip from apt-get using sudo --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9552c8ce..367dc241 100644 --- a/.travis.yml +++ b/.travis.yml @@ -41,7 +41,7 @@ before_install: # pyenv virtualenv 3.6.3 general # pyenv global general python3 -V - wget -qO- https://bootstrap.pypa.io/get-pip.py | python3 + wget -qO- https://bootstrap.pypa.io/get-pip.py | sudo python3 python3 -m pip -V From 361a960531d194b12ec1ec21f53865ec21e5c214 Mon Sep 17 00:00:00 2001 From: ziajka Date: Mon, 28 Jan 2019 13:26:56 +0100 Subject: [PATCH 34/39] CHROME_BIN var --- .travis.yml | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index 367dc241..88ab52e8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,24 +22,14 @@ apt: - google-chrome-stable - google-chrome-beta - g++-4.8 - - python3-pip before_install: - # - export CHROME_BIN=chromium-browser + - export CHROME_BIN=chromium-browser # - export DISPLAY=:99.0 # - sh -e /etc/init.d/xvfb start # greenkeeper-lockfile support - yarn global add greenkeeper-lockfile@1 - -# Ubuntu trusty supports max python3.4, cx_freeze-5.1.1 requires min 3.5 -# Remove when goes to xenial - | - # curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash - # export PATH="~/.pyenv/bin:$PATH" - # eval "$(pyenv init -)" - # eval "$(pyenv virtualenv-init -)" - # pyenv virtualenv 3.6.3 general - # pyenv global general python3 -V wget -qO- https://bootstrap.pypa.io/get-pip.py | sudo python3 python3 -m pip -V @@ -74,7 +64,6 @@ after_script: # publish - yarn buildforelectron - # - python3 -m venv env - | python3 -m pip install -r scripts/requirements.txt python3 scripts/build.py download From 7dd74a31e1251ecbe6f599b0bfb44e1b9050e3b0 Mon Sep 17 00:00:00 2001 From: ziajka Date: Mon, 28 Jan 2019 13:54:33 +0100 Subject: [PATCH 35/39] Xvfb as a service --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 88ab52e8..c3b330e6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,6 +23,9 @@ apt: - google-chrome-beta - g++-4.8 +services: + - xvfb + before_install: - export CHROME_BIN=chromium-browser # - export DISPLAY=:99.0 From 2e69c938d7d1fa072184e9c17aa14f7e74eadbf8 Mon Sep 17 00:00:00 2001 From: ziajka Date: Mon, 28 Jan 2019 14:00:22 +0100 Subject: [PATCH 36/39] google_chrome package --- .travis.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index c3b330e6..2e11b91a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,15 +19,14 @@ apt: - google-chrome - ubuntu-toolchain-r-test packages: - - google-chrome-stable - - google-chrome-beta + - google_chrome - g++-4.8 services: - xvfb before_install: - - export CHROME_BIN=chromium-browser + # - export CHROME_BIN=chromium-browser # - export DISPLAY=:99.0 # - sh -e /etc/init.d/xvfb start # greenkeeper-lockfile support From 8fcf3348e2b7c44bd924977b18d960ba22c4b2fb Mon Sep 17 00:00:00 2001 From: ziajka Date: Mon, 28 Jan 2019 14:18:55 +0100 Subject: [PATCH 37/39] Clean .travis.yml --- .travis.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2e11b91a..ddf8de2b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,9 +26,6 @@ services: - xvfb before_install: - # - export CHROME_BIN=chromium-browser - # - export DISPLAY=:99.0 - # - sh -e /etc/init.d/xvfb start # greenkeeper-lockfile support - yarn global add greenkeeper-lockfile@1 - | From 6734776153f4dc6550a6688bb39fc427c03d1a47 Mon Sep 17 00:00:00 2001 From: ziajka Date: Tue, 29 Jan 2019 09:54:26 +0100 Subject: [PATCH 38/39] Update prod env only when variables are defined --- set-variables-in-env.js | 12 ++++++++---- src/environments/environment.prod.ts | 3 +-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/set-variables-in-env.js b/set-variables-in-env.js index b1e3833e..04f4a067 100644 --- a/set-variables-in-env.js +++ b/set-variables-in-env.js @@ -8,10 +8,14 @@ if(argv.set) { const envFile = argv.set; console.log(`Backuping up '${envFile}' into '${tempFile}'.`); fs.copyFileSync(envFile, tempFile); - const content = fs.readFileSync(envFile, "utf8"); - const variables = `solarputty_download_url: '${process.env.SOLARPUTTY_DOWNLOAD_URL}',` - const replaced = content.replace('//ENV', variables); - fs.writeFileSync(envFile, replaced); + let content = fs.readFileSync(envFile, "utf8"); + + if(process.env.SOLARPUTTY_DOWNLOAD_URL) { + const variables = `solarputty_download_url: '${process.env.SOLARPUTTY_DOWNLOAD_URL}',` + content = content.replace('solarputty_download_url: "",', variables); + } + + fs.writeFileSync(envFile, content); } if(argv.unset) { diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index d8eafc7b..cd119730 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -1,7 +1,6 @@ export const environment = { - /* Below configuration is replaced during build time, don't remove. */ - //ENV production: true, electron: false, githubio: false, + solarputty_download_url: "", }; From a12f8e6ddd2e416f3315d93168b34f10f17e6cb9 Mon Sep 17 00:00:00 2001 From: ziajka Date: Tue, 29 Jan 2019 11:39:25 +0100 Subject: [PATCH 39/39] Ignore missing template during creation --- src/app/components/project-map/project-map.component.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/app/components/project-map/project-map.component.ts b/src/app/components/project-map/project-map.component.ts index 06a79792..8dffbcf4 100644 --- a/src/app/components/project-map/project-map.component.ts +++ b/src/app/components/project-map/project-map.component.ts @@ -249,6 +249,10 @@ export class ProjectMapComponent implements OnInit, OnDestroy { } onNodeCreation(template: Template) { + if(!template) { + return; + } + this.nodeService.createFromTemplate(this.server, this.project, template, 0, 0, 'local').subscribe(() => { this.projectService.nodes(this.server, this.project.project_id).subscribe((nodes: Node[]) => { this.nodesDataSource.set(nodes);