diff --git a/local-server.js b/local-server.js index d3abe038..2cc5a639 100644 --- a/local-server.js +++ b/local-server.js @@ -1,8 +1,50 @@ const { spawn } = require('child_process'); const kill = require('tree-kill'); +const path = require('path'); +const fs = require('fs'); +const { ipcMain } = require('electron') + +const isWin = /^win/.test(process.platform); let runningServers = {}; + +exports.getLocalServerPath = async () => { + const distDirectory = path.join(__dirname, 'dist'); + if (!fs.existsSync(distDirectory)) { + return; + } + + const files = fs.readdirSync(distDirectory); + + let serverPath = null; + + files.forEach((directory) => { + if(directory.startsWith('exe.')) { + if (isWin) { + serverPath = path.join(__dirname, 'dist', directory, 'gns3server.exe'); + } + else { + serverPath = path.join(__dirname, 'dist', directory, 'gns3server'); + } + } + }); + + if(serverPath !== null && fs.existsSync(serverPath)) { + return serverPath; + } + + return; +} + +exports.startLocalServer = async (server) => { + return await run(server); +} + +exports.stopLocalServer = async (server) => { + return await stop(server); +} + function getServerArguments(server, overrides) { let serverArguments = []; return serverArguments; @@ -41,6 +83,10 @@ async function stop(serverName) { } async function run(server, options) { + if(!options) { + options = {}; + } + const logStdout = options.logStdout || false; console.log(`Running '${server.path}'`); diff --git a/main.js b/main.js index 74f42f20..776cee3a 100644 --- a/main.js +++ b/main.js @@ -1,18 +1,13 @@ const electron = require('electron'); -const fs = require('fs'); const app = electron.app; const BrowserWindow = electron.BrowserWindow; 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; -let serverProc = null; -let isWin = /^win/.test(process.platform); let isDev = false; const argv = yargs @@ -29,49 +24,6 @@ if (argv.e == 'dev') { } -const createServerProc = () => { - const directory = path.join(__dirname, 'dist'); - - if (!fs.existsSync(directory)) { - return; - } - - fs.readdir(path.join(__dirname, 'dist'), (err, files) => { - var serverPath = null; - - files.forEach((filename) => { - if(filename.startsWith('exe.')) { - if (isWin) { - serverPath = path.join(__dirname, 'dist', filename, 'gns3server.exe'); - } - else { - serverPath = path.join(__dirname, 'dist', filename, 'gns3server'); - } - } - }); - - if (serverPath == null) { - console.error('gns3server cannot be found'); - } - - if (serverPath != null) { - serverProc = require('child_process').execFile(serverPath, []); - - if (serverProc != null) { - console.log('gns3server started from path: ' + serverPath); - } - } - }); -} - -const exitServerProc = () => { - if(serverProc) { - serverProc.kill(); - serverProc = null; - } -} - - function createWindow () { // Create the browser window. mainWindow = new BrowserWindow({ diff --git a/src/app/components/servers/add-server-dialog.html b/src/app/components/servers/add-server-dialog.html index a4999abb..489531be 100644 --- a/src/app/components/servers/add-server-dialog.html +++ b/src/app/components/servers/add-server-dialog.html @@ -8,6 +8,10 @@ + + + + diff --git a/src/app/components/servers/servers.component.html b/src/app/components/servers/servers.component.html index 806475a5..8f4ea9f9 100644 --- a/src/app/components/servers/servers.component.html +++ b/src/app/components/servers/servers.component.html @@ -35,6 +35,14 @@ Actions + + + + diff --git a/src/app/components/servers/servers.component.ts b/src/app/components/servers/servers.component.ts index 681ded09..f88cc52c 100644 --- a/src/app/components/servers/servers.component.ts +++ b/src/app/components/servers/servers.component.ts @@ -22,7 +22,8 @@ export class ServersComponent implements OnInit { constructor( private dialog: MatDialog, private serverService: ServerService, - private serverDatabase: ServerDatabase + private serverDatabase: ServerDatabase, + private electronService: ElectronService, ) {} ngOnInit() { @@ -47,11 +48,32 @@ export class ServersComponent implements OnInit { }); } + getServerStatus(server: Server) { + if(server.location === 'local') { + if(server.status === undefined) { + return 'stopped'; + } + return server.status; + } + } + deleteServer(server: Server) { this.serverService.delete(server).then(() => { this.serverDatabase.remove(server); }); } + + async startServer(server: Server) { + await this.electronService.remote.require('./local-server.js').startLocalServer(server); + server.status = 'running'; + this.serverDatabase.update(server); + } + + async stopServer(server: Server) { + await this.electronService.remote.require('./local-server.js').stopLocalServer(server); + server.status = 'stopped'; + this.serverDatabase.update(server); + } } @Component({ @@ -86,13 +108,22 @@ export class AddServerDialogComponent implements OnInit { return 'remote'; } + getDefaultLocalServerPath() { + return this.electronService.remote.require('./local-server.js').getLocalServerPath(); + } + ngOnInit() { this.locations = this.getLocations(); this.server.authorization = 'none'; this.server.location = this.getDefaultLocation(); + this.server.path = this.getDefaultLocalServerPath(); } onAddClick(): void { + // clear path if not local server + if(this.server.location !== 'local') { + this.server.path = null; + } this.dialogRef.close(this.server); } diff --git a/src/app/models/server.ts b/src/app/models/server.ts index 93894147..2ad4ccd1 100644 --- a/src/app/models/server.ts +++ b/src/app/models/server.ts @@ -1,5 +1,6 @@ export type ServerAuthorization = 'basic' | 'none'; export type ServerLocation = 'local' | 'remote'; +export type ServerStatus = 'stopped' | 'starting' | 'running'; export class Server { id: number; @@ -12,4 +13,5 @@ export class Server { login: string; password: string; is_local: boolean; + status: ServerStatus; } diff --git a/src/app/services/server.database.ts b/src/app/services/server.database.ts index 4d8af007..fea41c42 100644 --- a/src/app/services/server.database.ts +++ b/src/app/services/server.database.ts @@ -29,4 +29,12 @@ export class ServerDatabase { this.dataChange.next(this.data.slice()); } } + + public update(server: Server) { + const index = this.data.indexOf(server); + if (index >= 0) { + this.data[index] = server; + this.dataChange.next(this.data.slice()); + } + } }