aboutsummaryrefslogtreecommitdiffstats
path: root/webapp/src/app/@core-xds
diff options
context:
space:
mode:
Diffstat (limited to 'webapp/src/app/@core-xds')
-rw-r--r--webapp/src/app/@core-xds/services/@core-xds-services.module.ts2
-rw-r--r--webapp/src/app/@core-xds/services/target.service.ts285
-rw-r--r--webapp/src/app/@core-xds/services/xdsagent.service.ts274
3 files changed, 514 insertions, 47 deletions
diff --git a/webapp/src/app/@core-xds/services/@core-xds-services.module.ts b/webapp/src/app/@core-xds/services/@core-xds-services.module.ts
index 7c380eb..a3a67c5 100644
--- a/webapp/src/app/@core-xds/services/@core-xds-services.module.ts
+++ b/webapp/src/app/@core-xds/services/@core-xds-services.module.ts
@@ -23,6 +23,7 @@ import { AlertService } from './alert.service';
import { ConfigService } from './config.service';
import { ProjectService } from './project.service';
import { SdkService } from './sdk.service';
+import { TargetService } from './target.service';
import { UserService } from './users.service';
import { XDSConfigService } from './xds-config.service';
import { XDSAgentService } from './xdsagent.service';
@@ -32,6 +33,7 @@ const SERVICES = [
ConfigService,
ProjectService,
SdkService,
+ TargetService,
UserService,
XDSConfigService,
XDSAgentService,
diff --git a/webapp/src/app/@core-xds/services/target.service.ts b/webapp/src/app/@core-xds/services/target.service.ts
new file mode 100644
index 0000000..9c995ea
--- /dev/null
+++ b/webapp/src/app/@core-xds/services/target.service.ts
@@ -0,0 +1,285 @@
+/**
+* @license
+* Copyright (C) 2018 "IoT.bzh"
+* Author Sebastien Douheret <sebastien@iot.bzh>
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import { Injectable, SecurityContext, isDevMode } from '@angular/core';
+import { Observable } from 'rxjs/Observable';
+import { Subject } from 'rxjs/Subject';
+import { BehaviorSubject } from 'rxjs/BehaviorSubject';
+
+import { XDSAgentService, IXDSTargetConfig, IXDSTargetTerminal } from '../services/xdsagent.service';
+
+/* FIXME: syntax only compatible with TS>2.4.0
+export enum TargetTypeEnum {
+ UNSET = '',
+ STANDARD: 'standard',
+}
+*/
+export type TargetTypeEnum = '' | 'standard';
+export const TargetType = {
+ UNSET: <TargetTypeEnum>'',
+ STANDARD: <TargetTypeEnum>'standard',
+};
+
+export const TargetTypes = [
+ { value: TargetType.STANDARD, display: 'Standard' },
+];
+
+export const TargetStatus = {
+ ErrorConfig: 'ErrorConfig',
+ Disable: 'Disable',
+ Enable: 'Enable',
+};
+
+export type TerminalTypeEnum = '' | 'ssh';
+export const TerminalType = {
+ UNSET: <TerminalTypeEnum>'',
+ SSH: <TerminalTypeEnum>'ssh',
+};
+
+export interface ITarget extends IXDSTargetConfig {
+ isUsable?: boolean;
+}
+
+export interface ITerminal extends IXDSTargetTerminal {
+ targetID?: string;
+}
+
+export interface ITerminalOutput {
+ termID: string;
+ timestamp: string;
+ stdout: string;
+ stderr: string;
+}
+
+export interface ITerminalExit {
+ termID: string;
+ timestamp: string;
+ code: number;
+ error: string;
+}
+
+@Injectable()
+export class TargetService {
+ public targets$: Observable<ITarget[]>;
+ public curTarget$: Observable<ITarget>;
+ public terminalOutput$ = <Subject<ITerminalOutput>>new Subject();
+ public terminalExit$ = <Subject<ITerminalExit>>new Subject();
+
+ private _tgtsList: ITarget[] = [];
+ private tgtsSubject = <BehaviorSubject<ITarget[]>>new BehaviorSubject(this._tgtsList);
+ private _current: ITarget;
+ private curTgtSubject = <BehaviorSubject<ITarget>>new BehaviorSubject(this._current);
+ private curServerID;
+ private termSocket: SocketIOClient.Socket;
+
+ constructor(private xdsSvr: XDSAgentService) {
+ this._current = null;
+ this.targets$ = this.tgtsSubject.asObservable();
+ this.curTarget$ = this.curTgtSubject.asObservable();
+
+ this.xdsSvr.XdsConfig$.subscribe(cfg => {
+ if (!cfg || cfg.servers.length < 1) {
+ return;
+ }
+
+ // FIXME support multiple server
+ this.curServerID = cfg.servers[0].id;
+
+ // Load initial targets list
+ this.xdsSvr.getTargets(this.curServerID).subscribe((targets) => {
+ this._tgtsList = [];
+ targets.forEach(p => {
+ this._addTarget(p, true);
+ });
+
+ // TODO: get previous val from xds-config service / cookie
+ if (this._tgtsList.length > 0) {
+ this._current = this._tgtsList[0];
+ this.curTgtSubject.next(this._current);
+ }
+
+ this.tgtsSubject.next(this._tgtsList);
+ });
+ });
+
+ // Add listener on targets creation, deletion and change events
+ this.xdsSvr.onTargetAdd().subscribe(tgt => this._addTarget(tgt));
+ this.xdsSvr.onTargetDelete().subscribe(tgt => this._delTarget(tgt));
+ this.xdsSvr.onTargetChange().subscribe(tgt => this._updateTarget(tgt));
+
+ // Register events to forward terminal Output and Exit
+ this.xdsSvr.onSocketConnect().subscribe(socket => {
+ this.termSocket = socket;
+
+ // Handle terminal output
+ socket.on('term:output', data => {
+ const termOut = <ITerminalOutput>{
+ termID: data.termID,
+ timestamp: data.timestamp,
+ stdout: atob(data.stdout),
+ stderr: atob(data.stderr),
+ };
+ this.terminalOutput$.next(termOut);
+ });
+
+ // Handle terminal exit event
+ socket.on('term:exit', data => {
+ this.terminalExit$.next(Object.assign({}, <ITerminalExit>data));
+ });
+
+ });
+ }
+
+ setCurrent(p: ITarget): ITarget | undefined {
+ if (!p) {
+ this._current = null;
+ return undefined;
+ }
+ return this.setCurrentById(p.id);
+ }
+
+ setCurrentById(id: string): ITarget | undefined {
+ const p = this._tgtsList.find(item => item.id === id);
+ if (p) {
+ this._current = p;
+ this.curTgtSubject.next(this._current);
+ }
+ return this._current;
+ }
+
+ getCurrent(): ITarget {
+ return this._current;
+ }
+
+ getTargetById(id: string): ITarget | undefined {
+ const t = this._tgtsList.find(item => item.id === id);
+ return t;
+ }
+
+ add(tgt: ITarget): Observable<ITarget> {
+ return this.xdsSvr.addTarget(this.curServerID, tgt);
+ }
+
+ delete(tgt: ITarget): Observable<ITarget> {
+ const idx = this._getTargetIdx(tgt.id);
+ const delTgt = tgt;
+ if (idx === -1) {
+ throw new Error('Invalid target id (id=' + tgt.id + ')');
+ }
+ return this.xdsSvr.deleteTarget(this.curServerID, tgt.id)
+ .map(res => delTgt);
+ }
+
+ setSettings(tgt: ITarget): Observable<ITarget> {
+ return this.xdsSvr.updateTarget(this.curServerID, tgt);
+ }
+
+ terminalOpen(tgtID: string, termID: string, cfg?: IXDSTargetTerminal): Observable<IXDSTargetTerminal> {
+ if (termID === '' || termID === undefined) {
+ // create a new terminal when no termID is set
+ if (cfg === undefined) {
+ cfg = <IXDSTargetTerminal>{
+ name: 'ssh to ' + this.getTargetById(tgtID).name,
+ type: TerminalType.SSH,
+ };
+ }
+ return this.xdsSvr.createTerminalTarget(this.curServerID, tgtID, cfg)
+ .flatMap(res => {
+ return this.xdsSvr.openTerminalTarget(this.curServerID, tgtID, res.id);
+ });
+ } else {
+ return this.xdsSvr.openTerminalTarget(this.curServerID, tgtID, termID);
+ }
+ }
+
+ terminalClose(tgtID, termID: string): Observable<IXDSTargetTerminal> {
+ return this.xdsSvr.closeTerminalTarget(this.curServerID, tgtID, termID);
+ }
+
+ terminalWrite(data: string) {
+ if (this.termSocket) {
+ this.termSocket.emit('term:input', btoa(data));
+ }
+ }
+
+ terminalResize(tgtID, termID: string, cols, rows: number): Observable<IXDSTargetTerminal> {
+ return this.xdsSvr.resizeTerminalTarget(this.curServerID, tgtID, termID, cols, rows);
+ }
+
+ /*** Private functions ***/
+
+ private _isUsableTarget(p) {
+ return p && (p.status === TargetStatus.Enable);
+ }
+
+ private _getTargetIdx(id: string): number {
+ return this._tgtsList.findIndex((item) => item.id === id);
+ }
+
+ private _addTarget(tgt: ITarget, noNext?: boolean): ITarget {
+
+ tgt.isUsable = this._isUsableTarget(tgt);
+
+ // add new target
+ this._tgtsList.push(tgt);
+
+ // sort target array
+ this._tgtsList.sort((a, b) => {
+ if (a.name < b.name) {
+ return -1;
+ }
+ if (a.name > b.name) {
+ return 1;
+ }
+ return 0;
+ });
+
+ if (!noNext) {
+ this.tgtsSubject.next(this._tgtsList);
+ }
+
+ return tgt;
+ }
+
+ private _delTarget(tgt: ITarget) {
+ const idx = this._tgtsList.findIndex(item => item.id === tgt.id);
+ if (idx === -1) {
+ if (isDevMode) {
+ /* tslint:disable:no-console */
+ console.log('Warning: Try to delete target unknown id: tgt=', tgt);
+ }
+ return;
+ }
+ const delId = this._tgtsList[idx].id;
+ this._tgtsList.splice(idx, 1);
+ if (delId === this._current.id) {
+ this.setCurrent(this._tgtsList[0]);
+ }
+ this.tgtsSubject.next(this._tgtsList);
+ }
+
+ private _updateTarget(tgt: ITarget) {
+ const i = this._getTargetIdx(tgt.id);
+ if (i >= 0) {
+ this._tgtsList[i].status = tgt.status;
+ this._tgtsList[i].isUsable = this._isUsableTarget(tgt);
+ this.tgtsSubject.next(this._tgtsList);
+ }
+ }
+
+}
diff --git a/webapp/src/app/@core-xds/services/xdsagent.service.ts b/webapp/src/app/@core-xds/services/xdsagent.service.ts
index 033185b..adbee98 100644
--- a/webapp/src/app/@core-xds/services/xdsagent.service.ts
+++ b/webapp/src/app/@core-xds/services/xdsagent.service.ts
@@ -27,6 +27,7 @@ import * as io from 'socket.io-client';
import { AlertService } from './alert.service';
import { ISdk, ISdkManagementMsg } from './sdk.service';
import { ProjectType, ProjectTypeEnum } from './project.service';
+import { TargetType, TargetTypeEnum } from './target.service';
// Import RxJs required methods
import 'rxjs/add/operator/map';
@@ -65,6 +66,25 @@ export interface IXDSProjectConfig {
clientData?: string;
}
+/** Targets **/
+export interface IXDSTargetConfig {
+ id?: string;
+ name: string;
+ type: TargetTypeEnum;
+ ip: string;
+ status?: string;
+ terms?: IXDSTargetTerminal[];
+}
+
+export interface IXDSTargetTerminal {
+ id?: string;
+ type: string;
+ name: string;
+ status?: string;
+ cols?: number;
+ rows?: number;
+}
+
export interface IXDSVer {
id: string;
version: string;
@@ -124,11 +144,15 @@ export interface IAgentStatus {
@Injectable()
export class XDSAgentService {
+ public Socket: SocketIOClient.Socket;
public XdsConfig$: Observable<IXDSConfig>;
public Status$: Observable<IAgentStatus>;
public CmdOutput$ = <Subject<ICmdOutput>>new Subject();
public CmdExit$ = <Subject<ICmdExit>>new Subject();
+ protected sockConnect$ = new Subject<SocketIOClient.Socket>();
+ protected sockDisconnect$ = new Subject<SocketIOClient.Socket>();
+
protected projectAdd$ = new Subject<IXDSProjectConfig>();
protected projectDel$ = new Subject<IXDSProjectConfig>();
protected projectChange$ = new Subject<IXDSProjectConfig>();
@@ -138,6 +162,15 @@ export class XDSAgentService {
protected sdkChange$ = new Subject<ISdk>();
protected sdkManagement$ = new Subject<ISdkManagementMsg>();
+ protected targetAdd$ = new Subject<IXDSTargetConfig>();
+ protected targetDel$ = new Subject<IXDSTargetConfig>();
+ protected targetChange$ = new Subject<IXDSTargetConfig>();
+
+ protected targetTerminalAdd$ = new Subject<IXDSTargetTerminal>();
+ protected targetTerminalDel$ = new Subject<IXDSTargetTerminal>();
+ protected targetTerminalChange$ = new Subject<IXDSTargetTerminal>();
+
+ private _socket: SocketIOClient.Socket;
private baseUrl: string;
private wsUrl: string;
private httpSessionID: string;
@@ -147,9 +180,9 @@ export class XDSAgentService {
private configSubject = <BehaviorSubject<IXDSConfig>>new BehaviorSubject(this._config);
private statusSubject = <BehaviorSubject<IAgentStatus>>new BehaviorSubject(this._status);
- private socket: SocketIOClient.Socket;
- constructor( @Inject(DOCUMENT) private document: Document,
+
+ constructor(@Inject(DOCUMENT) private document: Document,
private http: HttpClient, private alert: AlertService) {
this.XdsConfig$ = this.configSubject.asObservable();
@@ -161,22 +194,22 @@ export class XDSAgentService {
// Retrieve Session ID / token
this.http.get(this.baseUrl + '/version', { observe: 'response' })
.subscribe(
- resp => {
- this.httpSessionID = resp.headers.get('xds-agent-sid');
-
- const re = originUrl.match(/http[s]?:\/\/([^\/]*)[\/]?/);
- if (re === null || re.length < 2) {
- console.error('ERROR: cannot determine Websocket url');
- } else {
- this.wsUrl = 'ws://' + re[1];
- this._handleIoSocket();
- this._RegisterEvents();
- }
- },
- err => {
- /* tslint:disable:no-console */
- console.error('ERROR while retrieving session id:', err);
- });
+ resp => {
+ this.httpSessionID = resp.headers.get('xds-agent-sid');
+
+ const re = originUrl.match(/http[s]?:\/\/([^\/]*)[\/]?/);
+ if (re === null || re.length < 2) {
+ console.error('ERROR: cannot determine Websocket url');
+ } else {
+ this.wsUrl = 'ws://' + re[1];
+ this._handleIoSocket();
+ this._RegisterEvents();
+ }
+ },
+ err => {
+ /* tslint:disable:no-console */
+ console.error('ERROR while retrieving session id:', err);
+ });
}
private _NotifyXdsAgentState(sts: boolean) {
@@ -201,45 +234,39 @@ export class XDSAgentService {
}
private _handleIoSocket() {
- this.socket = io(this.wsUrl, { transports: ['websocket'] });
+ this.Socket = this._socket = io(this.wsUrl, { transports: ['websocket'] });
- this.socket.on('connect_error', (res) => {
+ this._socket.on('connect_error', (res) => {
this._NotifyXdsAgentState(false);
console.error('XDS Agent WebSocket Connection error !');
});
- this.socket.on('connect', (res) => {
+ this._socket.on('connect', (res) => {
this._NotifyXdsAgentState(true);
+ this.sockConnect$.next(this._socket);
});
- this.socket.on('disconnection', (res) => {
+ this._socket.on('disconnection', (res) => {
this._NotifyXdsAgentState(false);
this.alert.error('WS disconnection: ' + res);
+ this.sockDisconnect$.next(this._socket);
});
- this.socket.on('error', (err) => {
+ this._socket.on('error', (err) => {
console.error('WS error:', err);
});
// XDS Events decoding
- this.socket.on('make:output', data => {
- this.CmdOutput$.next(Object.assign({}, <ICmdOutput>data));
- });
-
- this.socket.on('make:exit', data => {
- this.CmdExit$.next(Object.assign({}, <ICmdExit>data));
- });
-
- this.socket.on('exec:output', data => {
+ this._socket.on('exec:output', data => {
this.CmdOutput$.next(Object.assign({}, <ICmdOutput>data));
});
- this.socket.on('exec:exit', data => {
+ this._socket.on('exec:exit', data => {
this.CmdExit$.next(Object.assign({}, <ICmdExit>data));
});
- this.socket.on('event:server-config', ev => {
+ this._socket.on('event:server-config', ev => {
if (ev && ev.data) {
const cfg: IXDServerCfg = ev.data;
const idx = this._config.servers.findIndex(el => el.id === cfg.id);
@@ -253,7 +280,7 @@ export class XDSAgentService {
/*** Project events ****/
- this.socket.on('event:project-add', (ev) => {
+ this._socket.on('event:project-add', (ev) => {
if (ev && ev.data && ev.data.id) {
this.projectAdd$.next(Object.assign({}, ev.data));
if (ev.sessionID !== '' && ev.sessionID !== this.httpSessionID && ev.data.label) {
@@ -265,7 +292,7 @@ export class XDSAgentService {
}
});
- this.socket.on('event:project-delete', (ev) => {
+ this._socket.on('event:project-delete', (ev) => {
if (ev && ev.data && ev.data.id) {
this.projectDel$.next(Object.assign({}, ev.data));
if (ev.sessionID !== '' && ev.sessionID !== this.httpSessionID && ev.data.label) {
@@ -276,17 +303,17 @@ export class XDSAgentService {
}
});
- this.socket.on('event:project-state-change', ev => {
+ this._socket.on('event:project-state-change', ev => {
if (ev && ev.data) {
this.projectChange$.next(Object.assign({}, ev.data));
} else if (isDevMode) {
- console.log('Warning: received event:project-state-change with unkn220own data: ev=', ev);
+ console.log('Warning: received event:project-state-change with unknown data: ev=', ev);
}
});
/*** SDK Events ***/
- this.socket.on('event:sdk-add', (ev) => {
+ this._socket.on('event:sdk-add', (ev) => {
if (ev && ev.data && ev.data.id) {
const evt = <ISdk>ev.data;
this.sdkAdd$.next(Object.assign({}, evt));
@@ -299,7 +326,7 @@ export class XDSAgentService {
}
});
- this.socket.on('event:sdk-remove', (ev) => {
+ this._socket.on('event:sdk-remove', (ev) => {
if (ev && ev.data && ev.data.id) {
const evt = <ISdk>ev.data;
this.sdkRemove$.next(Object.assign({}, evt));
@@ -312,7 +339,7 @@ export class XDSAgentService {
}
});
- this.socket.on('event:sdk-state-change', (ev) => {
+ this._socket.on('event:sdk-state-change', (ev) => {
if (ev && ev.data && ev.data.id) {
const evt = <ISdk>ev.data;
this.sdkChange$.next(Object.assign({}, evt));
@@ -322,8 +349,7 @@ export class XDSAgentService {
}
});
-
- this.socket.on('event:sdk-management', (ev) => {
+ this._socket.on('event:sdk-management', (ev) => {
if (ev && ev.data && ev.data.sdk) {
const evt = <ISdkManagementMsg>ev.data;
this.sdkManagement$.next(Object.assign({}, evt));
@@ -337,11 +363,86 @@ export class XDSAgentService {
}
});
+ /*** Target events ****/
+
+ this._socket.on('event:target-add', (ev) => {
+ if (ev && ev.data && ev.data.id) {
+ this.targetAdd$.next(Object.assign({}, ev.data));
+ if (ev.sessionID !== '' && ev.sessionID !== this.httpSessionID && ev.data.label) {
+ this.alert.info('Target "' + ev.data.label + '" has been added by another tool.');
+ }
+ } else if (isDevMode) {
+ /* tslint:disable:no-console */
+ console.log('Warning: received event:target-add with unknown data: ev=', ev);
+ }
+ });
+
+ this._socket.on('event:target-remove', (ev) => {
+ if (ev && ev.data && ev.data.id) {
+ this.targetDel$.next(Object.assign({}, ev.data));
+ if (ev.sessionID !== '' && ev.sessionID !== this.httpSessionID && ev.data.label) {
+ this.alert.info('Target "' + ev.data.label + '" has been deleted by another tool.');
+ }
+ } else if (isDevMode) {
+ console.log('Warning: received event:target-remove with unknown data: ev=', ev);
+ }
+ });
+
+ this._socket.on('event:target-state-change', ev => {
+ if (ev && ev.data) {
+ this.targetChange$.next(Object.assign({}, ev.data));
+ } else if (isDevMode) {
+ console.log('Warning: received event:target-state-change with unknown data: ev=', ev);
+ }
+ });
+
+ /*** Target Terminal events ****/
+
+ this._socket.on('event:target-terminal-add', (ev) => {
+ if (ev && ev.data && ev.data.id) {
+ this.targetTerminalAdd$.next(Object.assign({}, ev.data));
+ if (ev.sessionID !== '' && ev.sessionID !== this.httpSessionID && ev.data.label) {
+ this.alert.info('Target terminal "' + ev.data.label + '" has been added by another tool.');
+ }
+ } else if (isDevMode) {
+ /* tslint:disable:no-console */
+ console.log('Warning: received event:target-terminal-add with unknown data: ev=', ev);
+ }
+ });
+
+ this._socket.on('event:target-terminal-delete', (ev) => {
+ if (ev && ev.data && ev.data.id) {
+ this.targetTerminalDel$.next(Object.assign({}, ev.data));
+ if (ev.sessionID !== '' && ev.sessionID !== this.httpSessionID && ev.data.label) {
+ this.alert.info('Target terminal "' + ev.data.label + '" has been deleted by another tool.');
+ }
+ } else if (isDevMode) {
+ console.log('Warning: received event:target-terminal-delete with unknown data: ev=', ev);
+ }
+ });
+
+ this._socket.on('event:target-terminal-state-change', ev => {
+ if (ev && ev.data) {
+ this.targetTerminalChange$.next(Object.assign({}, ev.data));
+ } else if (isDevMode) {
+ console.log('Warning: received event:target-terminal-state-change with unknown data: ev=', ev);
+ }
+ });
+
}
/**
** Events registration
***/
+
+ onSocketConnect(): Observable<any> {
+ return this.sockConnect$.asObservable();
+ }
+
+ onSocketDisconnect(): Observable<any> {
+ return this.sockDisconnect$.asObservable();
+ }
+
onProjectAdd(): Observable<IXDSProjectConfig> {
return this.projectAdd$.asObservable();
}
@@ -370,6 +471,30 @@ export class XDSAgentService {
return this.sdkManagement$.asObservable();
}
+ onTargetAdd(): Observable<IXDSTargetConfig> {
+ return this.targetAdd$.asObservable();
+ }
+
+ onTargetDelete(): Observable<IXDSTargetConfig> {
+ return this.targetDel$.asObservable();
+ }
+
+ onTargetChange(): Observable<IXDSTargetConfig> {
+ return this.targetChange$.asObservable();
+ }
+
+ onTargetTerminalAdd(): Observable<IXDSTargetTerminal> {
+ return this.targetTerminalAdd$.asObservable();
+ }
+
+ onTargetTerminalDelete(): Observable<IXDSTargetTerminal> {
+ return this.targetTerminalDel$.asObservable();
+ }
+
+ onTargetTerminalChange(): Observable<IXDSTargetTerminal> {
+ return this.targetTerminalChange$.asObservable();
+ }
+
/**
** Misc / Version
***/
@@ -485,6 +610,61 @@ export class XDSAgentService {
});
}
+
+ /***
+ ** Targets
+ ***/
+ getTargets(serverID: string): Observable<IXDSTargetConfig[]> {
+ return this._get(this._getServerUrl(serverID) + '/targets');
+ }
+
+ addTarget(serverID: string, cfg: IXDSTargetConfig): Observable<IXDSTargetConfig> {
+ return this._post(this._getServerUrl(serverID) + '/targets', cfg);
+ }
+
+ deleteTarget(serverID: string, id: string): Observable<IXDSTargetConfig> {
+ return this._delete(this._getServerUrl(serverID) + '/targets/' + id);
+ }
+
+ updateTarget(serverID: string, cfg: IXDSTargetConfig): Observable<IXDSTargetConfig> {
+ return this._put(this._getServerUrl(serverID) + '/targets/' + cfg.id, cfg);
+ }
+
+ /***
+ ** Terminals
+ ***/
+ getTerminalsTarget(serverID, targetID: string): Observable<IXDSTargetTerminal[]> {
+ return this._get(this._getServerUrl(serverID) + '/targets/' + targetID + '/terminals');
+ }
+
+ getTerminalTarget(serverID, targetID, termID: string): Observable<IXDSTargetTerminal> {
+ return this._get(this._getServerUrl(serverID) + '/targets/' + targetID + '/terminals/' + termID);
+ }
+
+ createTerminalTarget(serverID, targetID: string, cfg: IXDSTargetTerminal): Observable<IXDSTargetTerminal> {
+ return this._post(this._getServerUrl(serverID) + '/targets/' + targetID + '/terminals', cfg);
+ }
+
+ updateTerminalTarget(serverID, targetID: string, cfg: IXDSTargetTerminal): Observable<IXDSTargetTerminal> {
+ if (cfg && (cfg.id !== '' || cfg.id !== undefined)) {
+ return this._put(this._getServerUrl(serverID) + '/targets/' + targetID + '/terminals/' + cfg.id, cfg);
+ }
+ return Observable.throw('Undefined terminal id');
+ }
+
+ openTerminalTarget(serverID, targetID, termID: string): Observable<IXDSTargetTerminal> {
+ return this._post(this._getServerUrl(serverID) + '/targets/' + targetID + '/terminals/' + termID + '/open', {});
+ }
+
+ closeTerminalTarget(serverID, targetID, termID: string): Observable<IXDSTargetTerminal> {
+ return this._post(this._getServerUrl(serverID) + '/targets/' + targetID + '/terminals/' + termID + '/close', {});
+ }
+
+ resizeTerminalTarget(serverID, targetID, termID: string, cols, rows: number): Observable<IXDSTargetTerminal> {
+ return this._post(this._getServerUrl(serverID) + '/targets/' + targetID + '/terminals/' + termID + '/resize',
+ { cols: cols, rows: rows });
+ }
+
/**
** Private functions
***/
@@ -493,10 +673,10 @@ export class XDSAgentService {
// Register to all existing events
this._post('/events/register', { 'name': 'event:all' })
.subscribe(
- res => { },
- error => {
- this.alert.error('ERROR while registering to all events: ' + error);
- },
+ res => { },
+ error => {
+ this.alert.error('ERROR while registering to all events: ' + error);
+ },
);
}