@meru2802/aux-server 1.0.0

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.
Files changed (74) hide show
  1. package/README.md +168 -0
  2. package/dist/config/index.d.ts +37 -0
  3. package/dist/config/index.d.ts.map +1 -0
  4. package/dist/config/index.js +76 -0
  5. package/dist/config/swagger.d.ts +2 -0
  6. package/dist/config/swagger.d.ts.map +1 -0
  7. package/dist/config/swagger.js +267 -0
  8. package/dist/controllers/BaseController.d.ts +16 -0
  9. package/dist/controllers/BaseController.d.ts.map +1 -0
  10. package/dist/controllers/BaseController.js +28 -0
  11. package/dist/controllers/apiController.d.ts +8 -0
  12. package/dist/controllers/apiController.d.ts.map +1 -0
  13. package/dist/controllers/apiController.js +60 -0
  14. package/dist/controllers/coreController.d.ts +11 -0
  15. package/dist/controllers/coreController.d.ts.map +1 -0
  16. package/dist/controllers/coreController.js +470 -0
  17. package/dist/controllers/healthController.d.ts +9 -0
  18. package/dist/controllers/healthController.d.ts.map +1 -0
  19. package/dist/controllers/healthController.js +35 -0
  20. package/dist/index.d.ts +13 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +97 -0
  23. package/dist/lib/utils/index.d.ts +10 -0
  24. package/dist/lib/utils/index.d.ts.map +1 -0
  25. package/dist/lib/utils/index.js +78 -0
  26. package/dist/lib/utils/index.test.d.ts +3 -0
  27. package/dist/lib/utils/index.test.d.ts.map +1 -0
  28. package/dist/lib/utils/index.test.js +197 -0
  29. package/dist/middleware/BaseMiddleware.d.ts +13 -0
  30. package/dist/middleware/BaseMiddleware.d.ts.map +1 -0
  31. package/dist/middleware/BaseMiddleware.js +22 -0
  32. package/dist/middleware/authMiddleware.d.ts +9 -0
  33. package/dist/middleware/authMiddleware.d.ts.map +1 -0
  34. package/dist/middleware/authMiddleware.js +287 -0
  35. package/dist/middleware/index.d.ts +11 -0
  36. package/dist/middleware/index.d.ts.map +1 -0
  37. package/dist/middleware/index.js +125 -0
  38. package/dist/routes/apiRoutes.d.ts +5 -0
  39. package/dist/routes/apiRoutes.d.ts.map +1 -0
  40. package/dist/routes/apiRoutes.js +46 -0
  41. package/dist/routes/coreRoutes.d.ts +5 -0
  42. package/dist/routes/coreRoutes.d.ts.map +1 -0
  43. package/dist/routes/coreRoutes.js +158 -0
  44. package/dist/routes/healthRoutes.d.ts +4 -0
  45. package/dist/routes/healthRoutes.d.ts.map +1 -0
  46. package/dist/routes/healthRoutes.js +63 -0
  47. package/dist/routes/index.d.ts +3 -0
  48. package/dist/routes/index.d.ts.map +1 -0
  49. package/dist/routes/index.js +31 -0
  50. package/dist/routes/swaggerRoutes.d.ts +3 -0
  51. package/dist/routes/swaggerRoutes.d.ts.map +1 -0
  52. package/dist/routes/swaggerRoutes.js +35 -0
  53. package/dist/services/ApplicationService.d.ts +26 -0
  54. package/dist/services/ApplicationService.d.ts.map +1 -0
  55. package/dist/services/ApplicationService.js +46 -0
  56. package/dist/services/DatabaseService.d.ts +17 -0
  57. package/dist/services/DatabaseService.d.ts.map +1 -0
  58. package/dist/services/DatabaseService.js +38 -0
  59. package/dist/services/HttpServerService.d.ts +29 -0
  60. package/dist/services/HttpServerService.d.ts.map +1 -0
  61. package/dist/services/HttpServerService.js +101 -0
  62. package/dist/services/ServiceContainer.d.ts +26 -0
  63. package/dist/services/ServiceContainer.d.ts.map +1 -0
  64. package/dist/services/ServiceContainer.js +39 -0
  65. package/dist/services/WebSocketService.d.ts +27 -0
  66. package/dist/services/WebSocketService.d.ts.map +1 -0
  67. package/dist/services/WebSocketService.js +180 -0
  68. package/dist/types/index.d.ts +218 -0
  69. package/dist/types/index.d.ts.map +1 -0
  70. package/dist/types/index.js +19 -0
  71. package/dist/types/schemas/index.d.ts +31 -0
  72. package/dist/types/schemas/index.d.ts.map +1 -0
  73. package/dist/types/schemas/index.js +226 -0
  74. package/package.json +55 -0
@@ -0,0 +1,11 @@
1
+ import { Request, Response } from "express";
2
+ import { IServiceContainer } from "../services/ServiceContainer";
3
+ import { BaseController } from "./BaseController";
4
+ export declare class CoreController extends BaseController {
5
+ constructor(serviceContainer?: IServiceContainer);
6
+ getDownloadLink: (req: Request, res: Response) => Promise<void>;
7
+ createDeviceGroup: (req: Request, res: Response) => Promise<void>;
8
+ addUserToGroup: (req: Request, res: Response) => Promise<void>;
9
+ getEndpointInstallScript: (req: Request, res: Response) => void;
10
+ }
11
+ //# sourceMappingURL=coreController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coreController.d.ts","sourceRoot":"","sources":["../../src/controllers/coreController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAelD,qBAAa,cAAe,SAAQ,cAAc;gBACpC,gBAAgB,CAAC,EAAE,iBAAiB;IAIzC,eAAe,GACpB,KAAK,OAAO,EACZ,KAAK,QAAQ,KACZ,OAAO,CAAC,IAAI,CAAC,CAkJd;IAEK,iBAAiB,GACtB,KAAK,OAAO,EACZ,KAAK,QAAQ,KACZ,OAAO,CAAC,IAAI,CAAC,CAoHd;IAEK,cAAc,GACnB,KAAK,OAAO,EACZ,KAAK,QAAQ,KACZ,OAAO,CAAC,IAAI,CAAC,CAyLd;IAEK,wBAAwB,GAAI,KAAK,OAAO,EAAE,KAAK,QAAQ,UAgF5D;CACH"}
@@ -0,0 +1,470 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CoreController = void 0;
4
+ const BaseController_1 = require("./BaseController");
5
+ const types_1 = require("../types");
6
+ const utils_1 = require("../lib/utils");
7
+ class CoreController extends BaseController_1.BaseController {
8
+ constructor(serviceContainer) {
9
+ super(serviceContainer);
10
+ this.getDownloadLink = async (req, res) => {
11
+ try {
12
+ const deviceGroupName = req.body.deviceGroupName;
13
+ const deviceGroupId = req.body.deviceGroupId; // Not required but if given then deviceGroupName is not required
14
+ if (deviceGroupId) {
15
+ const inviteEncryptionKey = (0, utils_1.getBinaryKey)(this.config.meshcentralConfig.inviteEncryptionKey);
16
+ const meshcookie = (0, utils_1.encodeCookie)({ m: deviceGroupId.split("/")[2] }, inviteEncryptionKey);
17
+ const downloadLink = `https://${this.config.meshcentralConfig.server}/meshagents?id=10006&meshid=${meshcookie}&ac=02`;
18
+ const response = {
19
+ download_link: downloadLink,
20
+ timestamp: new Date().toISOString(),
21
+ };
22
+ res.status(200).json(response);
23
+ return;
24
+ }
25
+ if (!deviceGroupName) {
26
+ const errorResponse = {
27
+ error: "'deviceGroupName' body param is required",
28
+ timestamp: new Date().toISOString(),
29
+ };
30
+ res.status(400).json(errorResponse);
31
+ return;
32
+ }
33
+ const meshesMessageSent = this.WebSocketService.sendMessage({
34
+ action: "meshes",
35
+ responseid: "meshctrl",
36
+ });
37
+ if (!meshesMessageSent) {
38
+ const errorResponse = {
39
+ error: "Could Not Send Message Over Socket",
40
+ timestamp: new Date().toISOString(),
41
+ };
42
+ res.status(500).json(errorResponse);
43
+ return;
44
+ }
45
+ if (!this.webSocket) {
46
+ const errorResponse = {
47
+ error: "Socket Not Found",
48
+ timestamp: new Date().toISOString(),
49
+ };
50
+ res.status(500).json(errorResponse);
51
+ return;
52
+ }
53
+ const waitForMeshResponse = new Promise((resolve, reject) => {
54
+ let responseReceived = false;
55
+ // Wait 10 second for ws message to arive
56
+ const timeout = setTimeout(() => {
57
+ if (!responseReceived) {
58
+ responseReceived = true;
59
+ reject(new Error("Timeout waiting for mesh response"));
60
+ }
61
+ }, 10000);
62
+ const messageHandler = (data) => {
63
+ var _a, _b;
64
+ if (responseReceived)
65
+ return;
66
+ try {
67
+ const message = JSON.parse(data.toString());
68
+ if (message.action === types_1.MeshActions.MESH_ES) {
69
+ responseReceived = true;
70
+ clearTimeout(timeout);
71
+ (_a = this.webSocket) === null || _a === void 0 ? void 0 : _a.removeListener("message", messageHandler);
72
+ const meshesMessasge = message;
73
+ const mesh = meshesMessasge.meshes.find((mesh) => mesh.name === deviceGroupName);
74
+ if (!mesh) {
75
+ reject(new Error("Mesh Not Found"));
76
+ return;
77
+ }
78
+ const inviteEncryptionKey = (0, utils_1.getBinaryKey)(this.config.meshcentralConfig.inviteEncryptionKey);
79
+ const meshcookie = (0, utils_1.encodeCookie)({ m: mesh._id.split("/")[2] }, inviteEncryptionKey);
80
+ const downloadLink = `https://${this.config.meshcentralConfig.server}/meshagents?id=10006&meshid=${meshcookie}&ac=02`;
81
+ const response = {
82
+ download_link: downloadLink,
83
+ timestamp: new Date().toISOString(),
84
+ };
85
+ resolve(response);
86
+ }
87
+ }
88
+ catch (parseError) {
89
+ if (!responseReceived) {
90
+ responseReceived = true;
91
+ clearTimeout(timeout);
92
+ (_b = this.webSocket) === null || _b === void 0 ? void 0 : _b.removeListener("message", messageHandler);
93
+ reject(parseError);
94
+ }
95
+ }
96
+ };
97
+ this.webSocket.on("message", messageHandler);
98
+ });
99
+ try {
100
+ const response = await waitForMeshResponse;
101
+ res.status(200).json(response);
102
+ return;
103
+ }
104
+ catch (error) {
105
+ console.error("Error waiting for mesh response:", error);
106
+ const errorResponse = {
107
+ error: error instanceof Error
108
+ ? error.message
109
+ : "Failed to get mesh response",
110
+ timestamp: new Date().toISOString(),
111
+ };
112
+ res.status(500).json(errorResponse);
113
+ return;
114
+ }
115
+ }
116
+ catch (error) {
117
+ console.error("Error creating download link:", error);
118
+ const errorResponse = {
119
+ error: "Internal server error",
120
+ timestamp: new Date().toISOString(),
121
+ };
122
+ res.status(500).json(errorResponse);
123
+ return;
124
+ }
125
+ };
126
+ this.createDeviceGroup = async (req, res) => {
127
+ try {
128
+ const deviceGroupName = req.body.deviceGroupName;
129
+ const description = req.body.description;
130
+ if (!deviceGroupName) {
131
+ const errorResponse = {
132
+ error: "'deviceGroupName' body param is required",
133
+ timestamp: new Date().toISOString(),
134
+ };
135
+ res.status(400).json(errorResponse);
136
+ return;
137
+ }
138
+ const createMeshMessageSent = this.WebSocketService.sendMessage({
139
+ action: "createmesh",
140
+ meshname: deviceGroupName,
141
+ meshtype: 2,
142
+ desc: description ? description : "",
143
+ });
144
+ if (!createMeshMessageSent) {
145
+ const errorResponse = {
146
+ error: "Could Not Send Message Over Socket",
147
+ timestamp: new Date().toISOString(),
148
+ };
149
+ res.status(500).json(errorResponse);
150
+ return;
151
+ }
152
+ if (!this.webSocket) {
153
+ const errorResponse = {
154
+ error: "Socket Not Found",
155
+ timestamp: new Date().toISOString(),
156
+ };
157
+ res.status(500).json(errorResponse);
158
+ return;
159
+ }
160
+ const waitForMeshResponse = new Promise((resolve, reject) => {
161
+ let responseReceived = false;
162
+ // Wait 10 second for ws message to arive
163
+ const timeout = setTimeout(() => {
164
+ if (!responseReceived) {
165
+ responseReceived = true;
166
+ reject(new Error("Timeout waiting for mesh response"));
167
+ }
168
+ }, 10000);
169
+ const messageHandler = (data) => {
170
+ var _a, _b;
171
+ if (responseReceived)
172
+ return;
173
+ try {
174
+ const message = JSON.parse(data.toString());
175
+ if (message.action === types_1.MeshActions.CREATE_MESH) {
176
+ responseReceived = true;
177
+ clearTimeout(timeout);
178
+ (_a = this.webSocket) === null || _a === void 0 ? void 0 : _a.removeListener("message", messageHandler);
179
+ const createMeshMessage = message;
180
+ if (createMeshMessage.result != "ok") {
181
+ reject(new Error(`Could Not Create Device Group with name: ${deviceGroupName}`));
182
+ }
183
+ const response = {
184
+ result: createMeshMessage.result,
185
+ deviceGroupId: createMeshMessage.meshid,
186
+ timestamp: new Date().toISOString(),
187
+ };
188
+ resolve(response);
189
+ }
190
+ }
191
+ catch (parseError) {
192
+ if (!responseReceived) {
193
+ responseReceived = true;
194
+ clearTimeout(timeout);
195
+ (_b = this.webSocket) === null || _b === void 0 ? void 0 : _b.removeListener("message", messageHandler);
196
+ reject(parseError);
197
+ }
198
+ }
199
+ };
200
+ this.webSocket.on("message", messageHandler);
201
+ });
202
+ try {
203
+ const response = await waitForMeshResponse;
204
+ res.status(200).json(response);
205
+ return;
206
+ }
207
+ catch (error) {
208
+ console.error("Error waiting for createmesh response:", error);
209
+ const errorResponse = {
210
+ error: error instanceof Error
211
+ ? error.message
212
+ : "Failed to get createmesh response",
213
+ timestamp: new Date().toISOString(),
214
+ };
215
+ res.status(500).json(errorResponse);
216
+ }
217
+ }
218
+ catch (error) {
219
+ console.error("Error creating device group link:", error);
220
+ const errorResponse = {
221
+ error: "Internal server error",
222
+ timestamp: new Date().toISOString(),
223
+ };
224
+ res.status(500).json(errorResponse);
225
+ }
226
+ };
227
+ this.addUserToGroup = async (req, res) => {
228
+ try {
229
+ const { deviceGroupName, deviceGroupId, users } = req.body;
230
+ if (!users || !Array.isArray(users) || users.length === 0) {
231
+ const errorResponse = {
232
+ error: "'users' body param is required and must be a non-empty array",
233
+ timestamp: new Date().toISOString(),
234
+ };
235
+ res.status(400).json(errorResponse);
236
+ return;
237
+ }
238
+ if (!deviceGroupName && !deviceGroupId) {
239
+ const errorResponse = {
240
+ error: "Either 'deviceGroupName' or 'deviceGroupId' body param is required",
241
+ timestamp: new Date().toISOString(),
242
+ };
243
+ res.status(400).json(errorResponse);
244
+ return;
245
+ }
246
+ const meshUserIds = [];
247
+ const failedUsers = [];
248
+ try {
249
+ const placeholders = users.map((_, index) => `$${index + 1}`).join(",");
250
+ const nexus_epm_user_id_query = `SELECT username, id FROM accounts_user WHERE username IN (${placeholders})`;
251
+ const nexus_epm_user_id = await this.dbPool.query(nexus_epm_user_id_query, users);
252
+ const foundUsers = new Map();
253
+ nexus_epm_user_id.rows.forEach((row) => {
254
+ foundUsers.set(row.username, row.id);
255
+ });
256
+ for (const username of users) {
257
+ const userId = foundUsers.get(username);
258
+ if (userId) {
259
+ const meshUserId = `user//${username}___${userId}`;
260
+ meshUserIds.push(meshUserId);
261
+ }
262
+ else {
263
+ console.warn(`User '${username}' not found in database`);
264
+ failedUsers.push(username);
265
+ }
266
+ }
267
+ }
268
+ catch (error) {
269
+ console.error("Error fetching user IDs from database:", error);
270
+ failedUsers.push(...users);
271
+ }
272
+ if (meshUserIds.length === 0) {
273
+ const errorResponse = {
274
+ error: "No valid users found in the database",
275
+ timestamp: new Date().toISOString(),
276
+ };
277
+ res.status(400).json(errorResponse);
278
+ return;
279
+ }
280
+ const addMeshUserMessage = {
281
+ action: "addmeshuser",
282
+ meshid: deviceGroupId,
283
+ meshname: deviceGroupName,
284
+ userids: meshUserIds,
285
+ meshadmin: 4294967295,
286
+ remove: false,
287
+ };
288
+ const addMeshUserMessageSent = this.WebSocketService.sendMessage(addMeshUserMessage);
289
+ if (!addMeshUserMessageSent) {
290
+ const errorResponse = {
291
+ error: "Could Not Send Message Over Socket",
292
+ timestamp: new Date().toISOString(),
293
+ };
294
+ res.status(500).json(errorResponse);
295
+ return;
296
+ }
297
+ if (!this.webSocket) {
298
+ const errorResponse = {
299
+ error: "Socket Not Found",
300
+ timestamp: new Date().toISOString(),
301
+ };
302
+ res.status(500).json(errorResponse);
303
+ return;
304
+ }
305
+ const waitForAddUserResponse = new Promise((resolve, reject) => {
306
+ let responseReceived = false;
307
+ const addedUsers = [];
308
+ let expectedResponses = meshUserIds.length;
309
+ // Wait 15 seconds for ws message to arrive (longer timeout for multiple users)
310
+ const timeout = setTimeout(() => {
311
+ if (!responseReceived) {
312
+ responseReceived = true;
313
+ if (addedUsers.length > 0) {
314
+ // Partial success
315
+ resolve({
316
+ result: "partial",
317
+ users_added: addedUsers,
318
+ failed_users: failedUsers,
319
+ timestamp: new Date().toISOString(),
320
+ });
321
+ }
322
+ else {
323
+ reject(new Error("Timeout waiting for add mesh user response"));
324
+ }
325
+ }
326
+ }, 15000);
327
+ const messageHandler = (data) => {
328
+ var _a;
329
+ if (responseReceived)
330
+ return;
331
+ try {
332
+ const message = JSON.parse(data.toString());
333
+ if (message.action === types_1.MeshActions.EVENT &&
334
+ message.event.etype === "user" &&
335
+ message.event.action === "accountchange" &&
336
+ message.event.msg.includes("Device group membership changed")) {
337
+ const changedUser = message.event.msgArgs[0];
338
+ if (changedUser &&
339
+ meshUserIds.some((userId) => userId.includes(changedUser))) {
340
+ addedUsers.push(changedUser);
341
+ expectedResponses--;
342
+ if (expectedResponses <= 0) {
343
+ responseReceived = true;
344
+ clearTimeout(timeout);
345
+ (_a = this.webSocket) === null || _a === void 0 ? void 0 : _a.removeListener("message", messageHandler);
346
+ const response = {
347
+ result: "success",
348
+ users_added: addedUsers,
349
+ failed_users: failedUsers.length > 0 ? failedUsers : undefined,
350
+ timestamp: new Date().toISOString(),
351
+ };
352
+ resolve(response);
353
+ }
354
+ }
355
+ }
356
+ }
357
+ catch (parseError) {
358
+ console.error("Error parsing WebSocket message:", parseError);
359
+ }
360
+ };
361
+ this.webSocket.on("message", messageHandler);
362
+ });
363
+ try {
364
+ const response = await waitForAddUserResponse;
365
+ res.status(200).json(response);
366
+ return;
367
+ }
368
+ catch (error) {
369
+ console.error("Error waiting for add mesh user response:", error);
370
+ const errorResponse = {
371
+ error: error instanceof Error
372
+ ? error.message
373
+ : "Failed to add users to device group",
374
+ timestamp: new Date().toISOString(),
375
+ };
376
+ res.status(500).json(errorResponse);
377
+ }
378
+ }
379
+ catch (error) {
380
+ console.error("Error adding users to device group:", error);
381
+ const errorResponse = {
382
+ error: "Internal server error",
383
+ timestamp: new Date().toISOString(),
384
+ };
385
+ res.status(500).json(errorResponse);
386
+ }
387
+ };
388
+ this.getEndpointInstallScript = (req, res) => {
389
+ const { clientId, siteId, agentType, endpointUrl } = req.body;
390
+ const baseUrl = `https://${this.config.epmConfig.server}`;
391
+ const script = `
392
+ $endpointsetup = 'nexus-endpoint-v0.1.0-i32-setup.exe'
393
+ $api = '"${baseUrl}"'
394
+ $clientid = '${clientId}'
395
+ $siteid = '${siteId}'
396
+ $agenttype = '"${agentType}"'
397
+ $power = 0
398
+ $rdp = 1
399
+ $ping = 0
400
+ $auth = '"${this.config.epmConfig.installerToken}"'
401
+ $endpointdownloadlink = '${endpointUrl}'
402
+ $apilink = $endpointdownloadlink.split('/')
403
+ [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
404
+ $serviceName = 'nexusrmm'
405
+ If (Get-Service $serviceName -ErrorAction SilentlyContinue) {
406
+ write-host ('Nexus RMM Agent Is Already Installed')
407
+ } Else {
408
+ $OutPath = $env:TMP
409
+ $installArgs = @('-m install --api ', "$api", '--client-id', $clientid, '--site-id', $siteid, '--agent-type', "$agenttype", '--auth', "$auth", '-silent')
410
+ if ($power) {
411
+ $installArgs += "--power"
412
+ }
413
+ if ($rdp) {
414
+ $installArgs += "--rdp"
415
+ }
416
+ if ($ping) {
417
+ $installArgs += "--ping"
418
+ }
419
+ Try
420
+ {
421
+ $DefenderStatus = Get-MpComputerStatus | select AntivirusEnabled
422
+ if ($DefenderStatus -match "True") {
423
+ Add-MpPreference -ExclusionPath 'C:\\Program Files\\NexusAgent\\*'
424
+ Add-MpPreference -ExclusionPath 'C:\\Program Files\\NexusMeshBackend\\*'
425
+ Add-MpPreference -ExclusionPath 'C:\\Program Files\\Nexus Endpoint\\*'
426
+ Add-MpPreference -ExclusionPath 'C:\\ProgramData\\NexusRMM\\*'
427
+ }
428
+ }
429
+ Catch {
430
+ # pass
431
+ }
432
+
433
+ $X = 0
434
+ do {
435
+ Write-Output "Waiting for network"
436
+ Start-Sleep -s 5
437
+ $X += 1
438
+ } until(($connectresult = Test-NetConnection $apilink[2] -Port 443 | ? { $_.TcpTestSucceeded }) -or $X -eq 3)
439
+
440
+ if ($connectresult.TcpTestSucceeded -eq $true){
441
+ Try{
442
+ Invoke-WebRequest -Uri $endpointdownloadlink -OutFile $OutPath\\$endpointsetup
443
+ Start-Process -FilePath $OutPath\\$endpointsetup -ArgumentList ('/S') -Wait
444
+ write-host ('Extracting Nexus Endpoint...')
445
+ Start-Sleep -s 5
446
+ Start-Process -FilePath "C:\\Program Files\\Nexus Endpoint\\rmmagent.exe" -ArgumentList ('/VERYSILENT /SUPPRESSMSGBOXES') -Wait
447
+ Start-Sleep -s 5
448
+ Start-Process -FilePath "C:\\Program Files\\NexusAgent\\nexusrmm.exe" -ArgumentList $installArgs -Wait
449
+ exit 0
450
+ } Catch {
451
+ $ErrorMessage = $_.Exception.Message
452
+ $FailedItem = $_.Exception.ItemName
453
+ Write-Error -Message "$ErrorMessage $FailedItem"
454
+ exit 1
455
+ }
456
+ Finally{
457
+ Remove-Item -Path $OutPath\\$endpointsetup
458
+ }
459
+ } else {
460
+ Write-Output "Unable to connect to server"
461
+ }
462
+ }
463
+ `;
464
+ res.setHeader("X-Script-Type", "Powershell");
465
+ res.setHeader("Content-Type", "text/plain; charset=utf-8");
466
+ res.status(200).send(script);
467
+ };
468
+ }
469
+ }
470
+ exports.CoreController = CoreController;
@@ -0,0 +1,9 @@
1
+ import { Request, Response } from "express";
2
+ import { BaseController } from "./BaseController";
3
+ import { IServiceContainer } from "../services/ServiceContainer";
4
+ export declare class HealthController extends BaseController {
5
+ constructor(serviceContainer?: IServiceContainer);
6
+ health: (req: Request, res: Response) => void;
7
+ status: (req: Request, res: Response) => void;
8
+ }
9
+ //# sourceMappingURL=healthController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"healthController.d.ts","sourceRoot":"","sources":["../../src/controllers/healthController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,qBAAa,gBAAiB,SAAQ,cAAc;gBACtC,gBAAgB,CAAC,EAAE,iBAAiB;IAIzC,MAAM,GAAI,KAAK,OAAO,EAAE,KAAK,QAAQ,KAAG,IAAI,CASjD;IAEK,MAAM,GAAI,KAAK,OAAO,EAAE,KAAK,QAAQ,KAAG,IAAI,CAgBjD;CACH"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HealthController = void 0;
4
+ const BaseController_1 = require("./BaseController");
5
+ class HealthController extends BaseController_1.BaseController {
6
+ constructor(serviceContainer) {
7
+ super(serviceContainer);
8
+ this.health = (req, res) => {
9
+ const response = {
10
+ status: "ok",
11
+ timestamp: new Date().toISOString(),
12
+ meshConnection: this.isWebSocketConnected,
13
+ dbConnection: !this.dbPool.ended,
14
+ };
15
+ res.json(response);
16
+ };
17
+ this.status = (req, res) => {
18
+ const response = {
19
+ service: "aux-server",
20
+ version: "1.0.0",
21
+ meshCentral: {
22
+ connected: this.isWebSocketConnected,
23
+ server: this.meshServer,
24
+ },
25
+ database: {
26
+ connected: !this.dbPool.ended,
27
+ host: this.dbPool.options.host || "unknown",
28
+ },
29
+ uptime: process.uptime(),
30
+ };
31
+ res.json(response);
32
+ };
33
+ }
34
+ }
35
+ exports.HealthController = HealthController;
@@ -0,0 +1,13 @@
1
+ import { ServiceContainer } from "./services/ServiceContainer";
2
+ export default class AuxServer {
3
+ private static instance;
4
+ private config;
5
+ private serviceContainer;
6
+ private constructor();
7
+ static getInstance(): AuxServer;
8
+ start(port?: number): Promise<void>;
9
+ shutdown(): Promise<void>;
10
+ isHealthy(): Promise<boolean>;
11
+ getServiceContainer(): ServiceContainer;
12
+ }
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,MAAM,CAAC,OAAO,OAAO,SAAS;IAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAY;IACnC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,gBAAgB,CAAmB;IAE3C,OAAO;WAKO,WAAW,IAAI,SAAS;IAQzB,KAAK,CAAC,IAAI,GAAE,MAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAUzB,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAUnC,mBAAmB,IAAI,gBAAgB;CAG/C"}
package/dist/index.js ADDED
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const config_1 = require("./config");
4
+ const ServiceContainer_1 = require("./services/ServiceContainer");
5
+ class AuxServer {
6
+ constructor() {
7
+ this.config = config_1.ConfigManager.getInstance().getConfig();
8
+ this.serviceContainer = ServiceContainer_1.ServiceContainer.initialize(this.config);
9
+ }
10
+ static getInstance() {
11
+ if (this.instance) {
12
+ return this.instance;
13
+ }
14
+ this.instance = new AuxServer();
15
+ return this.instance;
16
+ }
17
+ async start(port = 3003) {
18
+ try {
19
+ const applicationService = this.serviceContainer.getApplicationService();
20
+ await applicationService.start(port);
21
+ }
22
+ catch (error) {
23
+ console.error("Failed to start AuxServer:", error);
24
+ throw error;
25
+ }
26
+ }
27
+ async shutdown() {
28
+ try {
29
+ const applicationService = this.serviceContainer.getApplicationService();
30
+ await applicationService.stop();
31
+ }
32
+ catch (error) {
33
+ console.error("Error during shutdown:", error);
34
+ throw error;
35
+ }
36
+ }
37
+ async isHealthy() {
38
+ try {
39
+ const applicationService = this.serviceContainer.getApplicationService();
40
+ return await applicationService.isHealthy();
41
+ }
42
+ catch (error) {
43
+ console.error("Health check failed:", error);
44
+ return false;
45
+ }
46
+ }
47
+ getServiceContainer() {
48
+ return this.serviceContainer;
49
+ }
50
+ }
51
+ exports.default = AuxServer;
52
+ const auxServer = AuxServer.getInstance();
53
+ async function startServer() {
54
+ try {
55
+ const port = parseInt(process.env.PORT || "3003");
56
+ await auxServer.start(port);
57
+ }
58
+ catch (error) {
59
+ console.error("Failed to start server:", error);
60
+ process.exit(1);
61
+ }
62
+ }
63
+ async function gracefulShutdown(signal) {
64
+ console.log(`Received ${signal}, shutting down gracefully...`);
65
+ try {
66
+ await auxServer.shutdown();
67
+ console.log("Server shutdown completed");
68
+ process.exit(0);
69
+ }
70
+ catch (error) {
71
+ console.error("Error during shutdown:", error);
72
+ process.exit(1);
73
+ }
74
+ }
75
+ process.on("SIGINT", () => gracefulShutdown("SIGINT"));
76
+ process.on("SIGTERM", () => gracefulShutdown("SIGTERM"));
77
+ process.on("uncaughtException", async (error) => {
78
+ console.error("Uncaught Exception:", error);
79
+ try {
80
+ await auxServer.shutdown();
81
+ }
82
+ catch (shutdownError) {
83
+ console.error("Error during emergency shutdown:", shutdownError);
84
+ }
85
+ process.exit(1);
86
+ });
87
+ process.on("unhandledRejection", async (reason, promise) => {
88
+ console.error("Unhandled Rejection at:", promise, "reason:", reason);
89
+ try {
90
+ await auxServer.shutdown();
91
+ }
92
+ catch (shutdownError) {
93
+ console.error("Error during emergency shutdown:", shutdownError);
94
+ }
95
+ process.exit(1);
96
+ });
97
+ startServer();
@@ -0,0 +1,10 @@
1
+ export interface CookieObject {
2
+ time?: number;
3
+ [key: string]: any;
4
+ }
5
+ export declare class CookieEncryptionError extends Error {
6
+ constructor(message: string);
7
+ }
8
+ export declare function encodeCookie(o: CookieObject, key: Buffer | null): string | null;
9
+ export declare function getBinaryKey(key: string): Buffer;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/index.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,YAAY,CAC1B,CAAC,EAAE,YAAY,EACf,GAAG,EAAE,MAAM,GAAG,IAAI,GACjB,MAAM,GAAG,IAAI,CAqCf;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD"}