aiservermanager 0.1.1
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/README.md +31 -0
- package/backend/dist/di/container.js +80 -0
- package/backend/dist/di/container.js.map +1 -0
- package/backend/dist/di/types.js +18 -0
- package/backend/dist/di/types.js.map +1 -0
- package/backend/dist/files/validatePassword.ps1 +10 -0
- package/backend/dist/files/wmiGpuQuery.ps1 +15 -0
- package/backend/dist/helpers/ExecTools.js +101 -0
- package/backend/dist/helpers/ExecTools.js.map +1 -0
- package/backend/dist/index.js +51 -0
- package/backend/dist/index.js.map +1 -0
- package/backend/dist/middleware/authMiddleware.js +32 -0
- package/backend/dist/middleware/authMiddleware.js.map +1 -0
- package/backend/dist/models/GpuInfo.js +3 -0
- package/backend/dist/models/GpuInfo.js.map +1 -0
- package/backend/dist/models/ServiceConfig.js +46 -0
- package/backend/dist/models/ServiceConfig.js.map +1 -0
- package/backend/dist/models/ServiceStatus.js +3 -0
- package/backend/dist/models/ServiceStatus.js.map +1 -0
- package/backend/dist/routes/authRoutes.js +46 -0
- package/backend/dist/routes/authRoutes.js.map +1 -0
- package/backend/dist/routes/gpuRoutes.js +35 -0
- package/backend/dist/routes/gpuRoutes.js.map +1 -0
- package/backend/dist/routes/serviceRoutes.js +206 -0
- package/backend/dist/routes/serviceRoutes.js.map +1 -0
- package/backend/dist/routes/systemRoutes.js +64 -0
- package/backend/dist/routes/systemRoutes.js.map +1 -0
- package/backend/dist/services/auth/linuxPasswordVerifier.js +74 -0
- package/backend/dist/services/auth/linuxPasswordVerifier.js.map +1 -0
- package/backend/dist/services/auth/passwordVerifier.js +3 -0
- package/backend/dist/services/auth/passwordVerifier.js.map +1 -0
- package/backend/dist/services/auth/windowsPasswordVerifier.js +73 -0
- package/backend/dist/services/auth/windowsPasswordVerifier.js.map +1 -0
- package/backend/dist/services/authService.js +240 -0
- package/backend/dist/services/authService.js.map +1 -0
- package/backend/dist/services/configManager.js +96 -0
- package/backend/dist/services/configManager.js.map +1 -0
- package/backend/dist/services/controllers/systemctlController.js +287 -0
- package/backend/dist/services/controllers/systemctlController.js.map +1 -0
- package/backend/dist/services/controllers/windowsServiceController.js +201 -0
- package/backend/dist/services/controllers/windowsServiceController.js.map +1 -0
- package/backend/dist/services/detectors/amdLinuxDetector.js +127 -0
- package/backend/dist/services/detectors/amdLinuxDetector.js.map +1 -0
- package/backend/dist/services/detectors/gpuDetector.js +3 -0
- package/backend/dist/services/detectors/gpuDetector.js.map +1 -0
- package/backend/dist/services/detectors/nvidiaSmiDetector.js +67 -0
- package/backend/dist/services/detectors/nvidiaSmiDetector.js.map +1 -0
- package/backend/dist/services/detectors/wmiDetector.js +125 -0
- package/backend/dist/services/detectors/wmiDetector.js.map +1 -0
- package/backend/dist/services/enrichers/gpuEnricher.js +3 -0
- package/backend/dist/services/enrichers/gpuEnricher.js.map +1 -0
- package/backend/dist/services/enrichers/lspciEnricher.js +92 -0
- package/backend/dist/services/enrichers/lspciEnricher.js.map +1 -0
- package/backend/dist/services/enrichers/vulkanEnricher.js +57 -0
- package/backend/dist/services/enrichers/vulkanEnricher.js.map +1 -0
- package/backend/dist/services/gpuService.js +108 -0
- package/backend/dist/services/gpuService.js.map +1 -0
- package/backend/dist/services/helpers/gpuDedup.js +46 -0
- package/backend/dist/services/helpers/gpuDedup.js.map +1 -0
- package/backend/dist/services/helpers/gpuEngineNames.js +22 -0
- package/backend/dist/services/helpers/gpuEngineNames.js.map +1 -0
- package/backend/dist/services/llamaAutocompleteService.js +277 -0
- package/backend/dist/services/llamaAutocompleteService.js.map +1 -0
- package/backend/dist/services/managedServicesController.js +72 -0
- package/backend/dist/services/managedServicesController.js.map +1 -0
- package/backend/dist/services/managedServicesManager.js +91 -0
- package/backend/dist/services/managedServicesManager.js.map +1 -0
- package/backend/dist/services/probes/amdLinuxUsageProbe.js +109 -0
- package/backend/dist/services/probes/amdLinuxUsageProbe.js.map +1 -0
- package/backend/dist/services/probes/gpuUsageProbe.js +3 -0
- package/backend/dist/services/probes/gpuUsageProbe.js.map +1 -0
- package/backend/dist/services/probes/nvidiaSmiUsageProbe.js +67 -0
- package/backend/dist/services/probes/nvidiaSmiUsageProbe.js.map +1 -0
- package/backend/dist/services/providers/systemInfoLinuxProvider.js +188 -0
- package/backend/dist/services/providers/systemInfoLinuxProvider.js.map +1 -0
- package/backend/dist/services/providers/systemInfoWindowsProvider.js +101 -0
- package/backend/dist/services/providers/systemInfoWindowsProvider.js.map +1 -0
- package/backend/dist/services/serviceConfigController.js +116 -0
- package/backend/dist/services/serviceConfigController.js.map +1 -0
- package/backend/dist/services/serviceController.js +3 -0
- package/backend/dist/services/serviceController.js.map +1 -0
- package/backend/dist/services/serviceManager.js +157 -0
- package/backend/dist/services/serviceManager.js.map +1 -0
- package/backend/dist/services/systemInfoProvider.js +3 -0
- package/backend/dist/services/systemInfoProvider.js.map +1 -0
- package/backend/dist/services/systemService.js +42 -0
- package/backend/dist/services/systemService.js.map +1 -0
- package/backend/public/browser/chunk-34LU6STA.js +1 -0
- package/backend/public/browser/chunk-JGNPKRLU.js +4 -0
- package/backend/public/browser/favicon.svg +11 -0
- package/backend/public/browser/index.html +15 -0
- package/backend/public/browser/main-MUMQYBNS.js +5579 -0
- package/backend/public/browser/polyfills-5CFQRCPP.js +2 -0
- package/backend/public/browser/styles-QBUDNRKH.css +1 -0
- package/bin/aiservermanager.js +2 -0
- package/package.json +45 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SystemInfoWindowsProvider = void 0;
|
|
4
|
+
const ExecTools_1 = require("../../helpers/ExecTools");
|
|
5
|
+
/** Gather system info on Windows via PowerShell (CIM). */
|
|
6
|
+
class SystemInfoWindowsProvider {
|
|
7
|
+
async isAvailable() {
|
|
8
|
+
return process.platform === "win32";
|
|
9
|
+
}
|
|
10
|
+
async getSystemInfo() {
|
|
11
|
+
const [osWithBoot, hostname] = await Promise.all([this.getCimOsInfo(), execStr("hostname")]);
|
|
12
|
+
const uptime = this.formatUptime(osWithBoot.bootTicks);
|
|
13
|
+
return {
|
|
14
|
+
os: osWithBoot.os,
|
|
15
|
+
hostname,
|
|
16
|
+
kernel: osWithBoot.os.version, // reuse version field for build number
|
|
17
|
+
uptime,
|
|
18
|
+
disks: await this.getDiskInfo(),
|
|
19
|
+
logs: await this.getLogSizes(),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/** Single CIM call → OS fields + LastBootUpTime epoch for uptime. */
|
|
23
|
+
async getCimOsInfo() {
|
|
24
|
+
const { stdout } = await ExecTools_1.ExecTools.safeExec("$os = Get-CimInstance Win32_OperatingSystem; [PSCustomObject]@{ Caption=$os.Caption; Version=$os.Version; BuildNumber=$os.BuildNumber; BootTicks=[long](Get-Date).Subtract($os.LastBootUpTime).TotalSeconds } | ConvertTo-Json");
|
|
25
|
+
try {
|
|
26
|
+
const parsed = JSON.parse(stdout);
|
|
27
|
+
return {
|
|
28
|
+
os: {
|
|
29
|
+
name: parsed.Caption ?? "Windows",
|
|
30
|
+
version: parsed.Version ?? "",
|
|
31
|
+
id: parsed.BuildNumber ?? "unknown",
|
|
32
|
+
},
|
|
33
|
+
bootTicks: typeof parsed.BootTicks === "number" ? parsed.BootTicks : 0,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return { os: { name: "Windows", version: "", id: "unknown" }, bootTicks: 0 };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
formatUptime(totalSeconds) {
|
|
41
|
+
if (totalSeconds <= 0)
|
|
42
|
+
return "unknown";
|
|
43
|
+
const days = Math.floor(totalSeconds / 86400);
|
|
44
|
+
const hours = Math.floor((totalSeconds % 86400) / 3600);
|
|
45
|
+
const mins = Math.floor((totalSeconds % 3600) / 60);
|
|
46
|
+
const secs = Math.floor(totalSeconds % 60);
|
|
47
|
+
const time = `${String(hours).padStart(2, "0")}:${String(mins).padStart(2, "0")}:${String(secs).padStart(2, "0")}`;
|
|
48
|
+
return days > 0 ? `${days} days, ${time}` : time;
|
|
49
|
+
}
|
|
50
|
+
async getDiskInfo() {
|
|
51
|
+
const { stdout } = await ExecTools_1.ExecTools.safeExec("Get-CimInstance Win32_LogicalDisk -Filter 'DriveType=3' | Select-Object DeviceID, VolumeName, Size, FreeSpace | ConvertTo-Json");
|
|
52
|
+
const disks = [];
|
|
53
|
+
try {
|
|
54
|
+
const parsed = JSON.parse(stdout);
|
|
55
|
+
// Single disk → object, not array; normalize
|
|
56
|
+
const entries = Array.isArray(parsed) ? parsed : [parsed];
|
|
57
|
+
for (const d of entries) {
|
|
58
|
+
const total = parseFloat(d.Size) || 0;
|
|
59
|
+
const free = parseFloat(d.FreeSpace) || 0;
|
|
60
|
+
const used = total - free;
|
|
61
|
+
disks.push({
|
|
62
|
+
device: d.DeviceID ?? "",
|
|
63
|
+
mountPoint: d.DeviceID ?? "",
|
|
64
|
+
total,
|
|
65
|
+
used,
|
|
66
|
+
available: free,
|
|
67
|
+
usePercent: total > 0 ? Math.round((used / total) * 100) : 0,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// fallback: empty
|
|
73
|
+
}
|
|
74
|
+
return disks;
|
|
75
|
+
}
|
|
76
|
+
async getLogSizes() {
|
|
77
|
+
// Windows event log equivalent: check sizes of common log locations
|
|
78
|
+
const paths = [
|
|
79
|
+
"C:\\Windows\\System32\\winevt\\Logs\\System.evtx",
|
|
80
|
+
"C:\\Windows\\System32\\winevt\\Logs\\Application.evtx",
|
|
81
|
+
];
|
|
82
|
+
const results = [];
|
|
83
|
+
for (const p of paths) {
|
|
84
|
+
try {
|
|
85
|
+
const { stdout } = await ExecTools_1.ExecTools.safeExec(`powershell -Command "(Get-Item '${p.replace(/\\/g, "\\")}' -ErrorAction SilentlyContinue).Length"`);
|
|
86
|
+
const size = parseInt(stdout.trim(), 10);
|
|
87
|
+
results.push({ path: p, size: isNaN(size) ? 0 : size, exists: true });
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
results.push({ path: p, size: 0, exists: false });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return results;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.SystemInfoWindowsProvider = SystemInfoWindowsProvider;
|
|
97
|
+
async function execStr(cmd) {
|
|
98
|
+
const { stdout } = await ExecTools_1.ExecTools.safeExec(cmd);
|
|
99
|
+
return stdout.trim();
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=systemInfoWindowsProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"systemInfoWindowsProvider.js","sourceRoot":"","sources":["../../../src/services/providers/systemInfoWindowsProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.ServiceConfigController = void 0;
|
|
16
|
+
const inversify_1 = require("inversify");
|
|
17
|
+
const ServiceConfig_1 = require("../models/ServiceConfig");
|
|
18
|
+
const configManager_1 = require("./configManager");
|
|
19
|
+
const NAME_REGEX = /^[a-zA-Z][a-zA-Z0-9_-]{0,127}$/;
|
|
20
|
+
/**
|
|
21
|
+
* Orchestrates config CRUD + OS service installation via platform-aware ServiceController.
|
|
22
|
+
* Singleton — shares one ConfigManager and injects ServiceControllers.
|
|
23
|
+
*/
|
|
24
|
+
let ServiceConfigController = class ServiceConfigController {
|
|
25
|
+
controllers;
|
|
26
|
+
configManager = new configManager_1.ConfigManager();
|
|
27
|
+
constructor(controllers) {
|
|
28
|
+
this.controllers = controllers;
|
|
29
|
+
}
|
|
30
|
+
/** List all saved service configs. */
|
|
31
|
+
listConfigs() {
|
|
32
|
+
return this.configManager.list();
|
|
33
|
+
}
|
|
34
|
+
/** Get a single config by name. */
|
|
35
|
+
getConfig(name) {
|
|
36
|
+
return this.configManager.get(name);
|
|
37
|
+
}
|
|
38
|
+
async getActiveController() {
|
|
39
|
+
for (const c of this.controllers) {
|
|
40
|
+
if (await c.isAvailable())
|
|
41
|
+
return c;
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Create or update a service config and its OS service.
|
|
47
|
+
* No name change — that logic lives on the frontend (delete → create).
|
|
48
|
+
* Preserves the enabled state when updating an existing service.
|
|
49
|
+
* @returns { ok, config?, error? }
|
|
50
|
+
*/
|
|
51
|
+
async createOrUpdate(cfg) {
|
|
52
|
+
// Validate name
|
|
53
|
+
if (!NAME_REGEX.test(cfg.name)) {
|
|
54
|
+
return {
|
|
55
|
+
ok: false,
|
|
56
|
+
error: "Name must start with a letter and contain only letters, digits, hyphens, underscores (max 128 chars)",
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Validate command
|
|
60
|
+
if (!cfg.command.trim()) {
|
|
61
|
+
return { ok: false, error: "Command path is required" };
|
|
62
|
+
}
|
|
63
|
+
// Save config file
|
|
64
|
+
this.configManager.save(cfg);
|
|
65
|
+
// Install/update OS service (without changing enabled state)
|
|
66
|
+
const controller = await this.getActiveController();
|
|
67
|
+
if (controller) {
|
|
68
|
+
const execStart = (0, ServiceConfig_1.buildExecStart)(cfg);
|
|
69
|
+
// Check if service was already installed — preserve its enabled state
|
|
70
|
+
const priorStatus = await controller.getStatus(cfg.name);
|
|
71
|
+
const wasInstalled = priorStatus.installed;
|
|
72
|
+
const wasEnabled = wasInstalled && priorStatus.enabled;
|
|
73
|
+
const result = await controller.install(cfg.name, execStart);
|
|
74
|
+
if (result.error) {
|
|
75
|
+
// Config was saved but service install failed — keep config for retry
|
|
76
|
+
return { ok: false, error: result.error };
|
|
77
|
+
}
|
|
78
|
+
// Re-enable only if the service was already installed and enabled
|
|
79
|
+
if (wasInstalled && wasEnabled) {
|
|
80
|
+
const enableResult = await controller.perform(cfg.name, "enable");
|
|
81
|
+
if (enableResult.error) {
|
|
82
|
+
return { ok: false, error: enableResult.error };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return { ok: true, config: cfg };
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Delete a service: stop if running → uninstall OS service → remove config.
|
|
90
|
+
* @returns { ok, error? }
|
|
91
|
+
*/
|
|
92
|
+
async deleteService(name) {
|
|
93
|
+
const cfg = this.configManager.get(name);
|
|
94
|
+
if (!cfg) {
|
|
95
|
+
return { ok: false, error: `Config "${name}" not found` };
|
|
96
|
+
}
|
|
97
|
+
const controller = await this.getActiveController();
|
|
98
|
+
// Uninstall OS service (best-effort)
|
|
99
|
+
if (controller) {
|
|
100
|
+
const uninstallResult = await controller.uninstall(name);
|
|
101
|
+
if (!uninstallResult.ok) {
|
|
102
|
+
// Non-fatal: continue to config deletion
|
|
103
|
+
console.warn(`[ServiceConfigController] uninstall warning for "${name}":`, uninstallResult.error);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Remove config file
|
|
107
|
+
this.configManager.delete(name);
|
|
108
|
+
return { ok: true };
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
exports.ServiceConfigController = ServiceConfigController;
|
|
112
|
+
exports.ServiceConfigController = ServiceConfigController = __decorate([
|
|
113
|
+
__param(0, (0, inversify_1.multiInject)("SERVICE_CONTROLLER")),
|
|
114
|
+
__metadata("design:paramtypes", [Array])
|
|
115
|
+
], ServiceConfigController);
|
|
116
|
+
//# sourceMappingURL=serviceConfigController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serviceConfigController.js","sourceRoot":"","sources":["../../src/services/serviceConfigController.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serviceController.js","sourceRoot":"","sources":["../../src/services/serviceController.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.ServiceManager = void 0;
|
|
16
|
+
const inversify_1 = require("inversify");
|
|
17
|
+
const configManager_1 = require("./configManager");
|
|
18
|
+
const managedServicesManager_1 = require("./managedServicesManager");
|
|
19
|
+
const ServiceConfig_1 = require("../models/ServiceConfig");
|
|
20
|
+
/** Resolve all service names: managed + custom configs. */
|
|
21
|
+
function resolveServiceDefs(configManager, managedServices) {
|
|
22
|
+
const seen = new Set();
|
|
23
|
+
const defs = [];
|
|
24
|
+
// User-managed services from persistent selection
|
|
25
|
+
for (const name of managedServices.list()) {
|
|
26
|
+
if (!seen.has(name)) {
|
|
27
|
+
seen.add(name);
|
|
28
|
+
defs.push({ name });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Custom services from configs
|
|
32
|
+
for (const cfg of configManager.list()) {
|
|
33
|
+
if (!seen.has(cfg.name)) {
|
|
34
|
+
seen.add(cfg.name);
|
|
35
|
+
defs.push({ name: cfg.name });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return defs;
|
|
39
|
+
}
|
|
40
|
+
let ServiceManager = class ServiceManager {
|
|
41
|
+
controllers;
|
|
42
|
+
configManager = new configManager_1.ConfigManager();
|
|
43
|
+
managedServices = new managedServicesManager_1.ManagedServicesManager();
|
|
44
|
+
/** Errors from initial custom install attempts — served on every getStatusList without re-checking. */
|
|
45
|
+
installErrors = new Map();
|
|
46
|
+
constructor(controllers) {
|
|
47
|
+
this.controllers = controllers;
|
|
48
|
+
}
|
|
49
|
+
async getActiveController() {
|
|
50
|
+
for (const c of this.controllers) {
|
|
51
|
+
if (await c.isAvailable())
|
|
52
|
+
return c;
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
getServiceDefs() {
|
|
57
|
+
return resolveServiceDefs(this.configManager, this.managedServices);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Called once at server startup. Attempts to install every custom service
|
|
61
|
+
* that has a config but is not yet registered in the OS. Installation errors
|
|
62
|
+
* are cached so that getStatusList can return them without re-checking.
|
|
63
|
+
*/
|
|
64
|
+
async bootstrap() {
|
|
65
|
+
const controller = await this.getActiveController();
|
|
66
|
+
if (!controller)
|
|
67
|
+
return;
|
|
68
|
+
// Check which custom services are not installed yet
|
|
69
|
+
const customNames = this.configManager.list().map((c) => c.name);
|
|
70
|
+
const statuses = await Promise.all(customNames.map((name) => controller.getStatus(name)));
|
|
71
|
+
// Attempt install in parallel for all missing ones
|
|
72
|
+
await Promise.all(statuses.map(async (status) => {
|
|
73
|
+
if (status.installed)
|
|
74
|
+
return;
|
|
75
|
+
const cfg = this.configManager.get(status.name);
|
|
76
|
+
if (!cfg)
|
|
77
|
+
return;
|
|
78
|
+
const execStart = (0, ServiceConfig_1.buildExecStart)(cfg);
|
|
79
|
+
const result = await controller.install(status.name, execStart);
|
|
80
|
+
// If install failed, cache the error
|
|
81
|
+
if (result.error) {
|
|
82
|
+
this.installErrors.set(status.name, result.error);
|
|
83
|
+
}
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
async getStatusList() {
|
|
87
|
+
const controller = await this.getActiveController();
|
|
88
|
+
const defs = this.getServiceDefs();
|
|
89
|
+
if (!controller) {
|
|
90
|
+
return defs.map((def) => ({
|
|
91
|
+
...def,
|
|
92
|
+
running: false,
|
|
93
|
+
enabled: false,
|
|
94
|
+
installed: false,
|
|
95
|
+
error: "No service controller available on this platform",
|
|
96
|
+
}));
|
|
97
|
+
}
|
|
98
|
+
const results = await Promise.all(defs.map(async (def) => {
|
|
99
|
+
// Skip getStatus if we already know install failed — return cached error directly
|
|
100
|
+
const cached = this.installErrors.get(def.name);
|
|
101
|
+
if (cached) {
|
|
102
|
+
return {
|
|
103
|
+
...def,
|
|
104
|
+
running: false,
|
|
105
|
+
enabled: false,
|
|
106
|
+
installed: false,
|
|
107
|
+
error: cached,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const status = await controller.getStatus(def.name);
|
|
112
|
+
return { ...def, ...status };
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return {
|
|
116
|
+
...def,
|
|
117
|
+
running: false,
|
|
118
|
+
enabled: false,
|
|
119
|
+
installed: false,
|
|
120
|
+
error: `Failed to query service "${def.name}"`,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}));
|
|
124
|
+
return results;
|
|
125
|
+
}
|
|
126
|
+
async performAction(name, action) {
|
|
127
|
+
const defs = this.getServiceDefs();
|
|
128
|
+
const def = defs.find((s) => s.name === name);
|
|
129
|
+
if (!def) {
|
|
130
|
+
throw new Error(`Unknown service: ${name}`);
|
|
131
|
+
}
|
|
132
|
+
const controller = await this.getActiveController();
|
|
133
|
+
if (!controller) {
|
|
134
|
+
throw new Error("No service controller available on this platform");
|
|
135
|
+
}
|
|
136
|
+
const status = await controller.perform(name, action);
|
|
137
|
+
return { ...def, ...status };
|
|
138
|
+
}
|
|
139
|
+
async getJournal(name, count = 100) {
|
|
140
|
+
const defs = this.getServiceDefs();
|
|
141
|
+
const def = defs.find((s) => s.name === name);
|
|
142
|
+
if (!def) {
|
|
143
|
+
return { error: `Unknown service: ${name}` };
|
|
144
|
+
}
|
|
145
|
+
const controller = await this.getActiveController();
|
|
146
|
+
if (!controller) {
|
|
147
|
+
return { error: "No service controller available on this platform" };
|
|
148
|
+
}
|
|
149
|
+
return controller.getJournal(name, count);
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
exports.ServiceManager = ServiceManager;
|
|
153
|
+
exports.ServiceManager = ServiceManager = __decorate([
|
|
154
|
+
__param(0, (0, inversify_1.multiInject)("SERVICE_CONTROLLER")),
|
|
155
|
+
__metadata("design:paramtypes", [Array])
|
|
156
|
+
], ServiceManager);
|
|
157
|
+
//# sourceMappingURL=serviceManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serviceManager.js","sourceRoot":"","sources":["../../src/services/serviceManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"systemInfoProvider.js","sourceRoot":"","sources":["../../src/services/systemInfoProvider.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SystemService = void 0;
|
|
7
|
+
const os_1 = __importDefault(require("os"));
|
|
8
|
+
class SystemService {
|
|
9
|
+
snapshot = null;
|
|
10
|
+
readCpuTimes() {
|
|
11
|
+
let idle = 0;
|
|
12
|
+
let total = 0;
|
|
13
|
+
for (const cpu of os_1.default.cpus()) {
|
|
14
|
+
for (const _key in cpu.times) {
|
|
15
|
+
const val = cpu.times[_key];
|
|
16
|
+
total += val;
|
|
17
|
+
}
|
|
18
|
+
idle += cpu.times.idle;
|
|
19
|
+
}
|
|
20
|
+
return { idle, total };
|
|
21
|
+
}
|
|
22
|
+
async getSystemInfo() {
|
|
23
|
+
const now = this.readCpuTimes();
|
|
24
|
+
let cpuUsage = 0;
|
|
25
|
+
if (this.snapshot) {
|
|
26
|
+
const idleDelta = now.idle - this.snapshot.idle;
|
|
27
|
+
const totalDelta = now.total - this.snapshot.total;
|
|
28
|
+
cpuUsage = totalDelta > 0 ? ((1 - idleDelta / totalDelta) * 100) : 0;
|
|
29
|
+
}
|
|
30
|
+
this.snapshot = now;
|
|
31
|
+
const memoryTotal = os_1.default.totalmem();
|
|
32
|
+
const memoryUsed = memoryTotal - os_1.default.freemem();
|
|
33
|
+
return {
|
|
34
|
+
cpuUsage: Math.round(cpuUsage * 10) / 10,
|
|
35
|
+
memoryTotal,
|
|
36
|
+
memoryUsed,
|
|
37
|
+
memoryPercent: Math.round((memoryUsed / memoryTotal) * 1000) / 10,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.SystemService = SystemService;
|
|
42
|
+
//# sourceMappingURL=systemService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"systemService.js","sourceRoot":"","sources":["../../src/services/systemService.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AAepB,MAAa,aAAa;IAChB,QAAQ,GAAuB,IAAI,CAAC;IAEpC,YAAY;QAClB,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,GAAG,IAAI,YAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,IAA8B,CAAC,CAAC;gBACtD,KAAK,IAAI,GAAG,CAAC;YACf,CAAC;YACD,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;QACzB,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAEhC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAChD,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YACnD,QAAQ,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QAEpB,MAAM,WAAW,GAAG,YAAE,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,WAAW,GAAG,YAAE,CAAC,OAAO,EAAE,CAAC;QAE9C,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,GAAG,EAAE;YACxC,WAAW;YACX,UAAU;YACV,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE;SAClE,CAAC;IACJ,CAAC;CACF;AAtCD,sCAsCC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Ac as k,Bc as l,Cc as m,Dc as n,Ec as o,Fc as p,Gc as q,Hc as r,Ic as s,Jc as t,Kc as u,Lc as v,Mc as w,Nc as x,qc as a,rc as b,sc as c,tc as d,uc as e,vc as f,wc as g,xc as h,yc as i,zc as j}from"./chunk-JGNPKRLU.js";export{l as AnimationDriver,k as NoopAnimationDriver,u as \u0275Animation,q as \u0275AnimationEngine,w as \u0275AnimationRenderer,x as \u0275AnimationRendererFactory,m as \u0275AnimationStyleNormalizer,v as \u0275BaseAnimationRenderer,f as \u0275ENTER_CLASSNAME,g as \u0275LEAVE_CLASSNAME,n as \u0275NoopAnimationStyleNormalizer,p as \u0275TransitionAnimationPlayer,s as \u0275WebAnimationsDriver,r as \u0275WebAnimationsPlayer,o as \u0275WebAnimationsStyleNormalizer,j as \u0275allowPreviousPlayerStylesMerge,i as \u0275camelCaseToDashCase,d as \u0275containsElement,t as \u0275createEngine,a as \u0275getParentElement,e as \u0275invokeQuery,h as \u0275normalizeKeyframes,b as \u0275validateStyleProperty,c as \u0275validateWebAnimatableStyleProperty};
|