@winccoa-tools-pack/npm-winccoa-core 0.1.1 → 0.2.1-33c7c0b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +1 -1
- package/dist/cjs/types/components/WinCCOAComponent.js +17 -2
- package/dist/cjs/types/components/WinCCOAComponent.js.map +1 -1
- package/dist/cjs/types/components/implementations/PmonComponent.js +268 -43
- package/dist/cjs/types/components/implementations/PmonComponent.js.map +1 -1
- package/dist/cjs/types/project/ProjEnvProject.js +94 -8
- package/dist/cjs/types/project/ProjEnvProject.js.map +1 -1
- package/dist/cjs/types/project/ProjEnvProjectConfig.js +17 -7
- package/dist/cjs/types/project/ProjEnvProjectConfig.js.map +1 -1
- package/dist/cjs/types/project/ProjEnvProjectRegistry.js +30 -3
- package/dist/cjs/types/project/ProjEnvProjectRegistry.js.map +1 -1
- package/dist/esm/types/components/WinCCOAComponent.js +17 -2
- package/dist/esm/types/components/WinCCOAComponent.js.map +1 -1
- package/dist/esm/types/components/implementations/PmonComponent.js +267 -43
- package/dist/esm/types/components/implementations/PmonComponent.js.map +1 -1
- package/dist/esm/types/project/ProjEnvProject.js +94 -8
- package/dist/esm/types/project/ProjEnvProject.js.map +1 -1
- package/dist/esm/types/project/ProjEnvProjectConfig.js +17 -7
- package/dist/esm/types/project/ProjEnvProjectConfig.js.map +1 -1
- package/dist/esm/types/project/ProjEnvProjectRegistry.js +30 -3
- package/dist/esm/types/project/ProjEnvProjectRegistry.js.map +1 -1
- package/dist/types/components/WinCCOAComponent.d.ts +1 -0
- package/dist/types/components/WinCCOAComponent.d.ts.map +1 -1
- package/dist/types/components/implementations/PmonComponent.d.ts +46 -3
- package/dist/types/components/implementations/PmonComponent.d.ts.map +1 -1
- package/dist/types/project/ProjEnv.d.ts +1 -1
- package/dist/types/project/ProjEnv.d.ts.map +1 -1
- package/dist/types/project/ProjEnvProject.d.ts +38 -3
- package/dist/types/project/ProjEnvProject.d.ts.map +1 -1
- package/dist/types/project/ProjEnvProjectRegistry.d.ts +1 -0
- package/dist/types/project/ProjEnvProjectRegistry.d.ts.map +1 -1
- package/package.json +9 -9
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -225,7 +225,7 @@ We're excited to be part of your development journey.
|
|
|
225
225
|
|
|
226
226
|
## Quick Links
|
|
227
227
|
|
|
228
|
-
• [📦
|
|
228
|
+
• [📦 npm package](https://www.npmjs.com/package/@winccoa-tools-pack/npm-winccoa-core)
|
|
229
229
|
• [📚 Documentation](docs/dev/README.md)
|
|
230
230
|
• [🐛 Report Issues](https://github.com/winccoa-tools-pack/npm-winccoa-core/issues)
|
|
231
231
|
|
|
@@ -234,16 +234,30 @@ class WinCCOAComponent {
|
|
|
234
234
|
proc.stdout?.on('data', (d) => {
|
|
235
235
|
const str = d.toString();
|
|
236
236
|
this.stdOut += str;
|
|
237
|
-
console.log(
|
|
237
|
+
// console.log(
|
|
238
|
+
// `[${new Date().toISOString()}]`,
|
|
239
|
+
// cmdId,
|
|
240
|
+
// 'STDOUT:',
|
|
241
|
+
// str,
|
|
242
|
+
// ); /* histEntry.stdOut += str; */
|
|
238
243
|
});
|
|
239
244
|
proc.stderr?.on('data', (d) => {
|
|
240
245
|
const str = d.toString();
|
|
241
246
|
this.stdErr += str;
|
|
242
|
-
console.log(
|
|
247
|
+
// console.log(
|
|
248
|
+
// `[${new Date().toISOString()}]`,
|
|
249
|
+
// cmdId,
|
|
250
|
+
// 'STDERR:',
|
|
251
|
+
// str,
|
|
252
|
+
// ); /* histEntry.stdErr += str; */
|
|
243
253
|
});
|
|
244
254
|
proc.on('close', (code) => {
|
|
245
255
|
if (timeoutHandle)
|
|
246
256
|
clearTimeout(timeoutHandle);
|
|
257
|
+
if (options.checkStdout) {
|
|
258
|
+
options.checkStdout(this.stdOut);
|
|
259
|
+
console.log(`[${new Date().toISOString()}]`, cmdId, 'stderr: ' + this.stdErr);
|
|
260
|
+
}
|
|
247
261
|
resolve(code ?? 0);
|
|
248
262
|
});
|
|
249
263
|
proc.on('error', (err) => {
|
|
@@ -272,6 +286,7 @@ class WinCCOAComponent {
|
|
|
272
286
|
* @throws Error if process fails to spawn or timeout is exceeded
|
|
273
287
|
*/
|
|
274
288
|
async execAndCollectLines(cmdPath, args, timeout) {
|
|
289
|
+
console.log(`[${new Date().toISOString()}] Executing command for component ${this.getName()}:`, cmdPath, args, timeout ? `(timeout: ${timeout}ms)` : '');
|
|
275
290
|
return new Promise((resolve, reject) => {
|
|
276
291
|
const proc = (0, child_process_1.spawn)(cmdPath, args, { shell: false });
|
|
277
292
|
let stdout = '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WinCCOAComponent.js","sourceRoot":"","sources":["../../../../src/types/components/WinCCOAComponent.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,2CAA6B;AAC7B,uCAAyB;AACzB,iDAAsC;AACtC,mEAAmF;AACnF,mCAAoC;AAEpC;;;;;;;;;;;;;;EAcE;AAEF,MAAsB,gBAAgB;IAAtC;QACI,qDAAqD;QACrD;;;;WAIG;QACI,WAAM,GAAW,EAAE,CAAC;QAE3B;;WAEG;QACI,WAAM,GAAW,EAAE,CAAC;QAE3B,uBAAuB;QACf,aAAQ,GAAW,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"WinCCOAComponent.js","sourceRoot":"","sources":["../../../../src/types/components/WinCCOAComponent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +1,42 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PmonComponent = void 0;
|
|
3
|
+
exports.PmonComponent = exports.PmonComponentCredential = void 0;
|
|
4
4
|
const WinCCOAComponent_js_1 = require("../WinCCOAComponent.js");
|
|
5
5
|
const ProjEnvPmonStatus_js_1 = require("../../project/ProjEnvPmonStatus.js");
|
|
6
6
|
const ProjEnv_js_1 = require("../../project/ProjEnv.js");
|
|
7
|
+
class PmonComponentCredential {
|
|
8
|
+
constructor(username, password) {
|
|
9
|
+
this.username = username;
|
|
10
|
+
this.password = password;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.PmonComponentCredential = PmonComponentCredential;
|
|
7
14
|
class PmonComponent extends WinCCOAComponent_js_1.WinCCOAComponent {
|
|
15
|
+
constructor() {
|
|
16
|
+
//-------------------------------------------------------------------------
|
|
17
|
+
//@public members
|
|
18
|
+
//-------------------------------------------------------------------------
|
|
19
|
+
super(...arguments);
|
|
20
|
+
//-------------------------------------------------------------------------
|
|
21
|
+
//@private members
|
|
22
|
+
//-------------------------------------------------------------------------
|
|
23
|
+
this.currentCredentials = null;
|
|
24
|
+
}
|
|
25
|
+
//-------------------------------------------------------------------------
|
|
8
26
|
/**
|
|
9
27
|
* Returns the component name
|
|
10
28
|
*/
|
|
11
29
|
getName() {
|
|
12
30
|
return 'WCCILpmon';
|
|
13
31
|
}
|
|
32
|
+
//-------------------------------------------------------------------------
|
|
14
33
|
/**
|
|
15
34
|
* Returns the component description
|
|
16
35
|
*/
|
|
17
36
|
getDescription() {
|
|
18
37
|
return 'Process Monitor';
|
|
19
38
|
}
|
|
39
|
+
//-------------------------------------------------------------------------
|
|
20
40
|
/**
|
|
21
41
|
* Registers a sub-project using pmon's -regsubf option
|
|
22
42
|
* @param projectPath - Path to the sub-project directory
|
|
@@ -24,9 +44,9 @@ class PmonComponent extends WinCCOAComponent_js_1.WinCCOAComponent {
|
|
|
24
44
|
*/
|
|
25
45
|
async registerSubProject(projectPath) {
|
|
26
46
|
const args = ['-regsubf', '-proj', projectPath, '-log', '+stderr'];
|
|
27
|
-
|
|
28
|
-
return code;
|
|
47
|
+
return this.startAndValidateOutput(args, { checkStdout: false });
|
|
29
48
|
}
|
|
49
|
+
//-------------------------------------------------------------------------
|
|
30
50
|
/**
|
|
31
51
|
* Unregisters a project using pmon's -unreg option
|
|
32
52
|
* @param projectName - Name of the project to unregister
|
|
@@ -36,9 +56,9 @@ class PmonComponent extends WinCCOAComponent_js_1.WinCCOAComponent {
|
|
|
36
56
|
async unregisterProject(projectName) {
|
|
37
57
|
// Use -unreg option to unregister project
|
|
38
58
|
const args = ['-unreg', projectName, '-log', '+stderr'];
|
|
39
|
-
|
|
40
|
-
return code;
|
|
59
|
+
return this.startAndValidateOutput(args, { checkStdout: false });
|
|
41
60
|
}
|
|
61
|
+
//-------------------------------------------------------------------------
|
|
42
62
|
/**
|
|
43
63
|
* Registers a runnable project using pmon's -config -autofreg -status options
|
|
44
64
|
* @param configPath - Path to the project config file
|
|
@@ -52,11 +72,12 @@ class PmonComponent extends WinCCOAComponent_js_1.WinCCOAComponent {
|
|
|
52
72
|
// Use -config -autofreg -status options to register runnable project
|
|
53
73
|
const args = ['-config', configPath, '-log', '+stderr', '-autofreg', '-status'];
|
|
54
74
|
super.setVersion(projectVersion);
|
|
55
|
-
const code =
|
|
75
|
+
const code = this.startAndValidateOutput(args, { checkStdout: false });
|
|
56
76
|
// the pmon returns 3 if the project is not running after registrations
|
|
57
77
|
const state = this.pmonStateCodeToStatus(await code);
|
|
58
78
|
return state !== ProjEnvPmonStatus_js_1.ProjEnvPmonStatus.Unknown ? 0 : -1;
|
|
59
79
|
}
|
|
80
|
+
//-------------------------------------------------------------------------
|
|
60
81
|
/**
|
|
61
82
|
* Get pmon status. It check if the pmon is running or not
|
|
62
83
|
*/
|
|
@@ -66,61 +87,89 @@ class PmonComponent extends WinCCOAComponent_js_1.WinCCOAComponent {
|
|
|
66
87
|
0=pmon is running, 3=pmon is stopped, 4=unknown
|
|
67
88
|
*/
|
|
68
89
|
const args = ['-status', '-proj', projectName, '-log', '+stdout'];
|
|
69
|
-
const code =
|
|
90
|
+
const code = this.startAndValidateOutput(args, { checkStdout: () => { } });
|
|
70
91
|
return this.pmonStateCodeToStatus(await code);
|
|
71
92
|
}
|
|
93
|
+
//-------------------------------------------------------------------------
|
|
72
94
|
/**
|
|
73
95
|
* Starts pmon only (without auto-starting managers)
|
|
74
96
|
*/
|
|
75
97
|
async startPmonOnly(projectName) {
|
|
76
98
|
const args = ['-proj', projectName, '-noAutostart'];
|
|
77
|
-
return
|
|
99
|
+
return this.startAndValidateOutput(args, { detached: true, waitForLog: 'WAIT_MODE' });
|
|
78
100
|
}
|
|
101
|
+
//-------------------------------------------------------------------------
|
|
79
102
|
/**
|
|
80
103
|
* Starts a project with all managers
|
|
81
104
|
*/
|
|
82
105
|
async startProject(projectName, startAll = true) {
|
|
83
106
|
let args = ['-proj', projectName];
|
|
84
107
|
if (startAll) {
|
|
85
|
-
args = args.concat(['-command', 'START_ALL:']);
|
|
108
|
+
args = args.concat(['-command', this.makeCliCredentials() + 'START_ALL:']);
|
|
86
109
|
// INFO, 9/pmon, Das Projekt wurde gestartet und läuft. Gehe in den Überwachungsmodus
|
|
87
|
-
return
|
|
110
|
+
return this.startAndValidateOutput(args, { waitForLog: '9/pmon' });
|
|
88
111
|
}
|
|
89
112
|
else {
|
|
90
113
|
// starting pmon only without extra arguments means, it will start the project too.
|
|
91
114
|
// that means the pmon process will never end (hopefully, otherwise it crashed), so we need to detach
|
|
92
|
-
return
|
|
115
|
+
return this.startAndValidateOutput(args, { detached: true, waitForLog: 'WAIT_MODE' });
|
|
93
116
|
}
|
|
94
117
|
}
|
|
118
|
+
//-------------------------------------------------------------------------
|
|
95
119
|
/**
|
|
96
120
|
* Stops all managers in a project
|
|
97
121
|
*/
|
|
98
122
|
async stopProject(projectName) {
|
|
99
|
-
const args = [
|
|
123
|
+
const args = [
|
|
124
|
+
'-proj',
|
|
125
|
+
projectName,
|
|
126
|
+
'-command',
|
|
127
|
+
this.makeCliCredentials() + 'STOP_ALL:',
|
|
128
|
+
'-log',
|
|
129
|
+
'+stderr',
|
|
130
|
+
];
|
|
100
131
|
// INFO, 13/pmon, Projekt wurde komplett gestoppt - warte auf Befehle
|
|
101
|
-
return
|
|
132
|
+
return this.startAndValidateOutput(args, { waitForLog: '13/pmon' });
|
|
102
133
|
}
|
|
134
|
+
//-------------------------------------------------------------------------
|
|
103
135
|
/**
|
|
104
136
|
* Stops all managers and exits pmon
|
|
105
137
|
*/
|
|
106
138
|
async stopProjectAndPmon(projectName, timeout) {
|
|
107
|
-
const args = ['-proj', projectName, '-stopWait'];
|
|
108
|
-
return
|
|
139
|
+
const args = ['-proj', projectName, '-stopWait', '-log', '+stderr'];
|
|
140
|
+
return this.startAndValidateOutput(args, { timeout: timeout, checkStdout: false });
|
|
109
141
|
}
|
|
142
|
+
//-------------------------------------------------------------------------
|
|
110
143
|
/**
|
|
111
144
|
* Restarts all managers in a project
|
|
112
145
|
*/
|
|
113
146
|
async restartProject(projectName) {
|
|
114
|
-
const args = [
|
|
115
|
-
|
|
147
|
+
const args = [
|
|
148
|
+
'-proj',
|
|
149
|
+
projectName,
|
|
150
|
+
'-command',
|
|
151
|
+
this.makeCliCredentials() + 'RESTART_ALL:',
|
|
152
|
+
'-log',
|
|
153
|
+
'+stderr',
|
|
154
|
+
];
|
|
155
|
+
return this.startAndValidateOutput(args);
|
|
116
156
|
}
|
|
157
|
+
//-------------------------------------------------------------------------
|
|
117
158
|
/**
|
|
118
159
|
* Sets pmon wait mode
|
|
119
160
|
*/
|
|
120
161
|
async setWaitMode(projectName) {
|
|
121
|
-
const args = [
|
|
122
|
-
|
|
162
|
+
const args = [
|
|
163
|
+
'-proj',
|
|
164
|
+
projectName,
|
|
165
|
+
'-command',
|
|
166
|
+
this.makeCliCredentials() + 'WAIT_MODE:',
|
|
167
|
+
'-log',
|
|
168
|
+
'+stderr',
|
|
169
|
+
];
|
|
170
|
+
return this.startAndValidateOutput(args);
|
|
123
171
|
}
|
|
172
|
+
//-------------------------------------------------------------------------
|
|
124
173
|
/**
|
|
125
174
|
* Starts a specific manager by index
|
|
126
175
|
*/
|
|
@@ -129,32 +178,62 @@ class PmonComponent extends WinCCOAComponent_js_1.WinCCOAComponent {
|
|
|
129
178
|
'-proj',
|
|
130
179
|
projectName,
|
|
131
180
|
'-command',
|
|
132
|
-
'SINGLE_MGR:START',
|
|
181
|
+
this.makeCliCredentials() + 'SINGLE_MGR:START',
|
|
133
182
|
managerIndex.toString(),
|
|
183
|
+
'-log',
|
|
184
|
+
'+stderr',
|
|
134
185
|
];
|
|
135
|
-
return
|
|
186
|
+
return this.startAndValidateOutput(args);
|
|
136
187
|
}
|
|
188
|
+
//-------------------------------------------------------------------------
|
|
137
189
|
/**
|
|
138
190
|
* Stops a specific manager by index
|
|
139
191
|
*/
|
|
140
192
|
async stopManager(projectName, managerIndex) {
|
|
141
|
-
const args = [
|
|
142
|
-
|
|
193
|
+
const args = [
|
|
194
|
+
'-proj',
|
|
195
|
+
projectName,
|
|
196
|
+
'-command',
|
|
197
|
+
this.makeCliCredentials() + 'SINGLE_MGR:STOP',
|
|
198
|
+
managerIndex.toString(),
|
|
199
|
+
'-log',
|
|
200
|
+
'+stderr',
|
|
201
|
+
];
|
|
202
|
+
return this.startAndValidateOutput(args);
|
|
143
203
|
}
|
|
204
|
+
//-------------------------------------------------------------------------
|
|
144
205
|
/**
|
|
145
206
|
* Kills a specific manager by index
|
|
146
207
|
*/
|
|
147
208
|
async killManager(projectName, managerIndex) {
|
|
148
|
-
const args = [
|
|
149
|
-
|
|
209
|
+
const args = [
|
|
210
|
+
'-proj',
|
|
211
|
+
projectName,
|
|
212
|
+
'-command',
|
|
213
|
+
this.makeCliCredentials() + 'SINGLE_MGR:KILL',
|
|
214
|
+
managerIndex.toString(),
|
|
215
|
+
'-log',
|
|
216
|
+
'+stderr',
|
|
217
|
+
];
|
|
218
|
+
return this.startAndValidateOutput(args);
|
|
150
219
|
}
|
|
220
|
+
//-------------------------------------------------------------------------
|
|
151
221
|
/**
|
|
152
222
|
* Removes a specific manager by index
|
|
153
223
|
*/
|
|
154
224
|
async removeManager(projectName, managerIndex) {
|
|
155
|
-
const args = [
|
|
156
|
-
|
|
225
|
+
const args = [
|
|
226
|
+
'-proj',
|
|
227
|
+
projectName,
|
|
228
|
+
'-command',
|
|
229
|
+
this.makeCliCredentials() + 'SINGLE_MGR:DEL',
|
|
230
|
+
managerIndex.toString(),
|
|
231
|
+
'-log',
|
|
232
|
+
'+stderr',
|
|
233
|
+
];
|
|
234
|
+
return this.startAndValidateOutput(args);
|
|
157
235
|
}
|
|
236
|
+
//-------------------------------------------------------------------------
|
|
158
237
|
/**
|
|
159
238
|
* Gets the list of managers in a project
|
|
160
239
|
*/
|
|
@@ -163,12 +242,20 @@ class PmonComponent extends WinCCOAComponent_js_1.WinCCOAComponent {
|
|
|
163
242
|
if (!pmonPath) {
|
|
164
243
|
throw new Error('WCCILpmon executable not found');
|
|
165
244
|
}
|
|
166
|
-
const args = [
|
|
245
|
+
const args = [
|
|
246
|
+
'-proj',
|
|
247
|
+
projectName,
|
|
248
|
+
'-command',
|
|
249
|
+
this.makeCliCredentials() + 'MGRLIST:LIST',
|
|
250
|
+
'-log',
|
|
251
|
+
'+stdout',
|
|
252
|
+
];
|
|
167
253
|
const callPath = pmonPath ?? '';
|
|
168
254
|
const lines = await this.execAndCollectLines(callPath, args);
|
|
169
255
|
const parsed = this.parseManagerList(lines.join('\n'));
|
|
170
256
|
return parsed;
|
|
171
257
|
}
|
|
258
|
+
//-------------------------------------------------------------------------
|
|
172
259
|
/**
|
|
173
260
|
* Convenience accessor for manager option (from MGRLIST:LIST) by index.
|
|
174
261
|
* If `projectName` is provided, it will refresh the options list first.
|
|
@@ -186,42 +273,61 @@ once 30 3 1 -m gedi -n -num 5` to get the properties. It shall be mu more faster
|
|
|
186
273
|
}
|
|
187
274
|
return undefined;
|
|
188
275
|
}
|
|
276
|
+
//-------------------------------------------------------------------------
|
|
277
|
+
/** Sets manager options at a specific index in project
|
|
278
|
+
*
|
|
279
|
+
* @param options
|
|
280
|
+
* @param projectName
|
|
281
|
+
* @param managerIndex
|
|
282
|
+
* @returns
|
|
283
|
+
*/
|
|
189
284
|
async setManagerOptionsAt(options, projectName, managerIndex) {
|
|
190
285
|
const args = [
|
|
191
286
|
'-proj',
|
|
192
287
|
projectName,
|
|
193
288
|
'-command',
|
|
194
|
-
'SINGLE_MGR:PROP_PUT',
|
|
289
|
+
this.makeCliCredentials() + 'SINGLE_MGR:PROP_PUT',
|
|
195
290
|
managerIndex.toString(),
|
|
196
|
-
options.startMode
|
|
291
|
+
(0, ProjEnv_js_1.startModeToString)(options.startMode),
|
|
197
292
|
options.secondToKill.toString(),
|
|
198
293
|
options.resetStartCounter.toString(),
|
|
199
|
-
options.
|
|
294
|
+
options.resetMin.toString(),
|
|
200
295
|
options.startOptions,
|
|
296
|
+
'-log',
|
|
297
|
+
'+stderr',
|
|
201
298
|
];
|
|
202
|
-
return
|
|
299
|
+
return this.startAndValidateOutput(args);
|
|
203
300
|
}
|
|
301
|
+
//-------------------------------------------------------------------------
|
|
204
302
|
/** Inserts a manager at a specific index into project
|
|
205
303
|
* @param options Manager options
|
|
206
304
|
* @param projectName Project name
|
|
207
305
|
* @param managerIndex Index to insert at
|
|
208
306
|
*/
|
|
209
307
|
async insertManagerAt(options, projectName, managerIndex) {
|
|
308
|
+
if (managerIndex === undefined) {
|
|
309
|
+
managerIndex =
|
|
310
|
+
(await this.getManagerOptionsList(projectName).then((list) => list.length)) + 1;
|
|
311
|
+
}
|
|
312
|
+
// SINGLE_MGR:INS <idx> <manager> <startmode> <seckill> <restartcount> <resetmin> <args>
|
|
210
313
|
const args = [
|
|
211
314
|
'-proj',
|
|
212
315
|
projectName,
|
|
213
316
|
'-command',
|
|
214
|
-
'SINGLE_MGR:INS',
|
|
317
|
+
this.makeCliCredentials() + 'SINGLE_MGR:INS',
|
|
215
318
|
managerIndex.toString(),
|
|
216
319
|
options.component,
|
|
217
|
-
options.startMode
|
|
320
|
+
(0, ProjEnv_js_1.startModeToString)(options.startMode),
|
|
218
321
|
options.secondToKill.toString(),
|
|
219
322
|
options.resetStartCounter.toString(),
|
|
220
|
-
options.
|
|
323
|
+
options.resetMin.toString(),
|
|
221
324
|
options.startOptions,
|
|
325
|
+
'-log',
|
|
326
|
+
'+stderr',
|
|
222
327
|
];
|
|
223
|
-
return
|
|
328
|
+
return this.startAndValidateOutput(args);
|
|
224
329
|
}
|
|
330
|
+
//-------------------------------------------------------------------------
|
|
225
331
|
/** Sends a debug flag to a specific manager
|
|
226
332
|
* @param flag Debug flag to send (e.g., '-dbg http', '-dbg all')
|
|
227
333
|
* @param projectName Project name
|
|
@@ -232,14 +338,19 @@ once 30 3 1 -m gedi -n -num 5` to get the properties. It shall be mu more faster
|
|
|
232
338
|
'-proj',
|
|
233
339
|
projectName,
|
|
234
340
|
'-command',
|
|
235
|
-
'SINGLE_MGR:DEBUG',
|
|
341
|
+
this.makeCliCredentials() + 'SINGLE_MGR:DEBUG',
|
|
236
342
|
managerIndex.toString(),
|
|
237
343
|
flag,
|
|
344
|
+
'-log',
|
|
345
|
+
'+stderr',
|
|
238
346
|
];
|
|
239
|
-
return
|
|
347
|
+
return this.startAndValidateOutput(args);
|
|
240
348
|
}
|
|
241
|
-
|
|
242
|
-
|
|
349
|
+
//-------------------------------------------------------------------------
|
|
350
|
+
/** Gets detailed project and manager status (MGRLIST:STATI) and returns typed
|
|
351
|
+
* managers and optional project state
|
|
352
|
+
* @param projectName Project name
|
|
353
|
+
* @returns Parsed project status
|
|
243
354
|
*/
|
|
244
355
|
async getProjectStatus(projectName) {
|
|
245
356
|
const pmonPath = this.getPath();
|
|
@@ -247,13 +358,21 @@ once 30 3 1 -m gedi -n -num 5` to get the properties. It shall be mu more faster
|
|
|
247
358
|
const errorMsg = 'Could not locate WCCILpmon executable';
|
|
248
359
|
throw new Error(errorMsg);
|
|
249
360
|
}
|
|
250
|
-
const args = [
|
|
361
|
+
const args = [
|
|
362
|
+
'-proj',
|
|
363
|
+
projectName,
|
|
364
|
+
'-command',
|
|
365
|
+
this.makeCliCredentials() + 'MGRLIST:STATI',
|
|
366
|
+
'-log',
|
|
367
|
+
'+stdout',
|
|
368
|
+
];
|
|
251
369
|
const callPath = pmonPath ?? '';
|
|
252
370
|
const lines = await this.execAndCollectLines(callPath, args);
|
|
253
371
|
const raw = lines.join('\n');
|
|
254
372
|
const parsed = this.parseManagerStatus(raw);
|
|
255
373
|
return parsed;
|
|
256
374
|
}
|
|
375
|
+
//-------------------------------------------------------------------------
|
|
257
376
|
/**
|
|
258
377
|
* Convenience method to get a single manager status by index.
|
|
259
378
|
* If `projectName` is provided, it will refresh the list first.
|
|
@@ -269,6 +388,109 @@ once 30 3 1 -m gedi -n -num 5` to get the properties. It shall be mu more faster
|
|
|
269
388
|
// No cached data and no project specified
|
|
270
389
|
return undefined;
|
|
271
390
|
}
|
|
391
|
+
//-------------------------------------------------------------------------
|
|
392
|
+
/** Saves credentials for pmon authentication
|
|
393
|
+
*
|
|
394
|
+
* @param projectName Project name
|
|
395
|
+
* @param credentials Credentials to save
|
|
396
|
+
* @returns
|
|
397
|
+
*/
|
|
398
|
+
async saveCredentials(projectName, credentials) {
|
|
399
|
+
if (!this.currentCredentials) {
|
|
400
|
+
this.currentCredentials = { username: '', password: '' };
|
|
401
|
+
}
|
|
402
|
+
this.validateCredentials(credentials);
|
|
403
|
+
const code = this._storeCredentials(projectName, this.currentCredentials, credentials);
|
|
404
|
+
if ((await code) === 0) {
|
|
405
|
+
this.currentCredentials = credentials;
|
|
406
|
+
console.log('Saved credentials for project', projectName);
|
|
407
|
+
}
|
|
408
|
+
else {
|
|
409
|
+
console.log('Failed to save credentials for project', projectName);
|
|
410
|
+
}
|
|
411
|
+
return code;
|
|
412
|
+
}
|
|
413
|
+
//-------------------------------------------------------------------------
|
|
414
|
+
/** Validates pmon credentials
|
|
415
|
+
*
|
|
416
|
+
* @param credentials
|
|
417
|
+
* throws Error if credentials are invalid
|
|
418
|
+
*/
|
|
419
|
+
validateCredentials(credentials) {
|
|
420
|
+
if (!credentials.username || credentials.username.trim() === '') {
|
|
421
|
+
throw new Error('Username cannot be empty');
|
|
422
|
+
}
|
|
423
|
+
if (!credentials.password || credentials.password.trim() === '') {
|
|
424
|
+
throw new Error('Password cannot be empty');
|
|
425
|
+
}
|
|
426
|
+
if (credentials.username.indexOf('#') !== -1) {
|
|
427
|
+
throw new Error('Username cannot contains the character "#"');
|
|
428
|
+
}
|
|
429
|
+
if (credentials.password.indexOf('#') !== -1) {
|
|
430
|
+
throw new Error('Password cannot contains the character "#"');
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
//-------------------------------------------------------------------------
|
|
434
|
+
/** Gets the currently used credentials
|
|
435
|
+
*
|
|
436
|
+
* @returns
|
|
437
|
+
*/
|
|
438
|
+
getCredentials() {
|
|
439
|
+
return this.currentCredentials;
|
|
440
|
+
}
|
|
441
|
+
//-------------------------------------------------------------------------
|
|
442
|
+
/** Verifies pmon credentials
|
|
443
|
+
*
|
|
444
|
+
* @param projectName Project name
|
|
445
|
+
* @param credentials Credentials to verify
|
|
446
|
+
* @returns
|
|
447
|
+
*/
|
|
448
|
+
verifyCredentials(projectName, credentials) {
|
|
449
|
+
const oldCredentials = credentials;
|
|
450
|
+
// just try to store the same credentials again
|
|
451
|
+
return this._storeCredentials(projectName, oldCredentials, credentials).then((code) => code === 0);
|
|
452
|
+
}
|
|
453
|
+
makeCliCredentials() {
|
|
454
|
+
if (!this.currentCredentials) {
|
|
455
|
+
return '';
|
|
456
|
+
}
|
|
457
|
+
return `${this.currentCredentials.username}#${this.currentCredentials.password}`;
|
|
458
|
+
}
|
|
459
|
+
//-------------------------------------------------------------------------
|
|
460
|
+
_storeCredentials(projectName, oldCredentials, newCredentials) {
|
|
461
|
+
const args = [
|
|
462
|
+
'-proj',
|
|
463
|
+
projectName,
|
|
464
|
+
'-auth',
|
|
465
|
+
oldCredentials.username,
|
|
466
|
+
oldCredentials.password,
|
|
467
|
+
newCredentials.username,
|
|
468
|
+
newCredentials.password,
|
|
469
|
+
'-log',
|
|
470
|
+
'+stderr',
|
|
471
|
+
];
|
|
472
|
+
return this.startAndValidateOutput(args);
|
|
473
|
+
}
|
|
474
|
+
startAndValidateOutput(args = [], options = {}) {
|
|
475
|
+
if (options.checkStdout === undefined) {
|
|
476
|
+
options.checkStdout = (stdout) => {
|
|
477
|
+
if (!stdout) {
|
|
478
|
+
console.warn('WARNING: Pmon command returned empty output. Do you means stdErr: ' +
|
|
479
|
+
this.stdErr);
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
stdout = stdout.trim();
|
|
483
|
+
if (stdout != 'OK') {
|
|
484
|
+
console.error('ERROR: Pmon command failed with output:', stdout);
|
|
485
|
+
}
|
|
486
|
+
else if (stdout.startsWith('ERROR')) {
|
|
487
|
+
throw new Error(`Pmon command failed with error: ${stdout}`);
|
|
488
|
+
}
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
return super.start(args, options);
|
|
492
|
+
}
|
|
493
|
+
//-------------------------------------------------------------------------
|
|
272
494
|
/** Converts pmon exit code to ProjEnvPmonStatus
|
|
273
495
|
*
|
|
274
496
|
* @param code
|
|
@@ -285,6 +507,7 @@ once 30 3 1 -m gedi -n -num 5` to get the properties. It shall be mu more faster
|
|
|
285
507
|
status = ProjEnvPmonStatus_js_1.ProjEnvPmonStatus.Unknown;
|
|
286
508
|
return status;
|
|
287
509
|
}
|
|
510
|
+
//-------------------------------------------------------------------------
|
|
288
511
|
// Private parser for manager list output
|
|
289
512
|
parseManagerList(output) {
|
|
290
513
|
const lines = output
|
|
@@ -327,13 +550,14 @@ once 30 3 1 -m gedi -n -num 5` to get the properties. It shall be mu more faster
|
|
|
327
550
|
component: name,
|
|
328
551
|
startMode: startModeEnum,
|
|
329
552
|
secondToKill: seckill,
|
|
330
|
-
|
|
331
|
-
resetStartCounter:
|
|
553
|
+
resetMin: resetMin,
|
|
554
|
+
resetStartCounter: restartCount,
|
|
332
555
|
startOptions: args,
|
|
333
556
|
});
|
|
334
557
|
}
|
|
335
558
|
return result;
|
|
336
559
|
}
|
|
560
|
+
//-------------------------------------------------------------------------
|
|
337
561
|
// Parse project state line from STATI output
|
|
338
562
|
parseProjectState(line) {
|
|
339
563
|
const parts = line.trim().split(/\s+/);
|
|
@@ -370,6 +594,7 @@ once 30 3 1 -m gedi -n -num 5` to get the properties. It shall be mu more faster
|
|
|
370
594
|
}
|
|
371
595
|
return null;
|
|
372
596
|
}
|
|
597
|
+
//-------------------------------------------------------------------------
|
|
373
598
|
// Parse STATI output into typed managers and project state
|
|
374
599
|
parseManagerStatus(output) {
|
|
375
600
|
const managers = [];
|