@edgible-team/cli 1.0.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/LICENSE +136 -0
- package/README.md +450 -0
- package/dist/client/api-client.js +1057 -0
- package/dist/client/index.js +21 -0
- package/dist/commands/agent.js +1280 -0
- package/dist/commands/ai.js +608 -0
- package/dist/commands/application.js +885 -0
- package/dist/commands/auth.js +570 -0
- package/dist/commands/base/BaseCommand.js +93 -0
- package/dist/commands/base/CommandHandler.js +7 -0
- package/dist/commands/base/command-wrapper.js +58 -0
- package/dist/commands/base/middleware.js +77 -0
- package/dist/commands/config.js +116 -0
- package/dist/commands/connectivity.js +59 -0
- package/dist/commands/debug.js +98 -0
- package/dist/commands/discover.js +144 -0
- package/dist/commands/examples/migrated-command-example.js +180 -0
- package/dist/commands/gateway.js +494 -0
- package/dist/commands/managedGateway.js +787 -0
- package/dist/commands/utils/config-validator.js +76 -0
- package/dist/commands/utils/gateway-prompt.js +79 -0
- package/dist/commands/utils/input-parser.js +120 -0
- package/dist/commands/utils/output-formatter.js +109 -0
- package/dist/config/app-config.js +99 -0
- package/dist/detection/SystemCapabilityDetector.js +1244 -0
- package/dist/detection/ToolDetector.js +305 -0
- package/dist/detection/WorkloadDetector.js +314 -0
- package/dist/di/bindings.js +99 -0
- package/dist/di/container.js +88 -0
- package/dist/di/types.js +32 -0
- package/dist/index.js +52 -0
- package/dist/interfaces/IDaemonManager.js +3 -0
- package/dist/repositories/config-repository.js +62 -0
- package/dist/repositories/gateway-repository.js +35 -0
- package/dist/scripts/postinstall.js +101 -0
- package/dist/services/AgentStatusManager.js +299 -0
- package/dist/services/ConnectivityTester.js +271 -0
- package/dist/services/DependencyInstaller.js +475 -0
- package/dist/services/LocalAgentManager.js +2216 -0
- package/dist/services/application/ApplicationService.js +299 -0
- package/dist/services/auth/AuthService.js +214 -0
- package/dist/services/aws.js +644 -0
- package/dist/services/daemon/DaemonManagerFactory.js +65 -0
- package/dist/services/daemon/DockerDaemonManager.js +395 -0
- package/dist/services/daemon/LaunchdDaemonManager.js +257 -0
- package/dist/services/daemon/PodmanDaemonManager.js +369 -0
- package/dist/services/daemon/SystemdDaemonManager.js +221 -0
- package/dist/services/daemon/WindowsServiceDaemonManager.js +210 -0
- package/dist/services/daemon/index.js +16 -0
- package/dist/services/edgible.js +3060 -0
- package/dist/services/gateway/GatewayService.js +334 -0
- package/dist/state/config.js +146 -0
- package/dist/types/AgentConfig.js +5 -0
- package/dist/types/AgentStatus.js +5 -0
- package/dist/types/ApiClient.js +5 -0
- package/dist/types/ApiRequests.js +5 -0
- package/dist/types/ApiResponses.js +5 -0
- package/dist/types/Application.js +5 -0
- package/dist/types/CaddyJson.js +5 -0
- package/dist/types/UnifiedAgentStatus.js +56 -0
- package/dist/types/WireGuard.js +5 -0
- package/dist/types/Workload.js +5 -0
- package/dist/types/agent.js +5 -0
- package/dist/types/command-options.js +5 -0
- package/dist/types/connectivity.js +5 -0
- package/dist/types/errors.js +250 -0
- package/dist/types/gateway-types.js +5 -0
- package/dist/types/index.js +48 -0
- package/dist/types/models/ApplicationData.js +5 -0
- package/dist/types/models/CertificateData.js +5 -0
- package/dist/types/models/DeviceData.js +5 -0
- package/dist/types/models/DevicePoolData.js +5 -0
- package/dist/types/models/OrganizationData.js +5 -0
- package/dist/types/models/OrganizationInviteData.js +5 -0
- package/dist/types/models/ProviderConfiguration.js +5 -0
- package/dist/types/models/ResourceData.js +5 -0
- package/dist/types/models/ServiceResourceData.js +5 -0
- package/dist/types/models/UserData.js +5 -0
- package/dist/types/route.js +5 -0
- package/dist/types/validation/schemas.js +218 -0
- package/dist/types/validation.js +5 -0
- package/dist/utils/FileIntegrityManager.js +256 -0
- package/dist/utils/PathMigration.js +219 -0
- package/dist/utils/PathResolver.js +235 -0
- package/dist/utils/PlatformDetector.js +277 -0
- package/dist/utils/console-logger.js +130 -0
- package/dist/utils/docker-compose-parser.js +179 -0
- package/dist/utils/errors.js +130 -0
- package/dist/utils/health-checker.js +155 -0
- package/dist/utils/json-logger.js +72 -0
- package/dist/utils/log-formatter.js +293 -0
- package/dist/utils/logger.js +59 -0
- package/dist/utils/network-utils.js +217 -0
- package/dist/utils/output.js +182 -0
- package/dist/utils/passwordValidation.js +91 -0
- package/dist/utils/progress.js +167 -0
- package/dist/utils/sudo-checker.js +22 -0
- package/dist/utils/urls.js +32 -0
- package/dist/utils/validation.js +31 -0
- package/dist/validation/schemas.js +175 -0
- package/dist/validation/validator.js +67 -0
- package/package.json +83 -0
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.SystemdDaemonManager = void 0;
|
|
37
|
+
const child_process_1 = require("child_process");
|
|
38
|
+
const util_1 = require("util");
|
|
39
|
+
const fs = __importStar(require("fs/promises"));
|
|
40
|
+
const PlatformDetector_1 = require("../../utils/PlatformDetector");
|
|
41
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
42
|
+
class SystemdDaemonManager {
|
|
43
|
+
constructor() {
|
|
44
|
+
this.serviceName = 'edgible-agent';
|
|
45
|
+
this.serviceFilePath = `/etc/systemd/system/${this.serviceName}.service`;
|
|
46
|
+
if (PlatformDetector_1.PlatformDetector.getPlatform() !== 'linux') {
|
|
47
|
+
throw new Error('SystemdDaemonManager is only supported on Linux');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async install(config) {
|
|
51
|
+
// Generate systemd service file
|
|
52
|
+
const serviceContent = this.generateServiceFile(config);
|
|
53
|
+
// Write service file (requires root)
|
|
54
|
+
try {
|
|
55
|
+
await fs.writeFile(this.serviceFilePath, serviceContent, 'utf8');
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
throw new Error(`Failed to write systemd service file: ${error instanceof Error ? error.message : String(error)}`);
|
|
59
|
+
}
|
|
60
|
+
// Reload systemd daemon
|
|
61
|
+
try {
|
|
62
|
+
await execAsync('systemctl daemon-reload');
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
throw new Error(`Failed to reload systemd: ${error instanceof Error ? error.message : String(error)}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async start() {
|
|
69
|
+
try {
|
|
70
|
+
await execAsync(`systemctl start ${this.serviceName}`);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
throw new Error(`Failed to start service: ${error instanceof Error ? error.message : String(error)}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async stop() {
|
|
77
|
+
try {
|
|
78
|
+
await execAsync(`systemctl stop ${this.serviceName}`);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
throw new Error(`Failed to stop service: ${error instanceof Error ? error.message : String(error)}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async restart() {
|
|
85
|
+
try {
|
|
86
|
+
await execAsync(`systemctl restart ${this.serviceName}`);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
throw new Error(`Failed to restart service: ${error instanceof Error ? error.message : String(error)}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async status() {
|
|
93
|
+
try {
|
|
94
|
+
const { stdout } = await execAsync(`systemctl status ${this.serviceName}`);
|
|
95
|
+
const isActive = stdout.includes('Active: active');
|
|
96
|
+
const isEnabled = await this.isEnabled();
|
|
97
|
+
// Extract PID if available
|
|
98
|
+
const pidMatch = stdout.match(/Main PID: (\d+)/);
|
|
99
|
+
const pid = pidMatch ? parseInt(pidMatch[1], 10) : undefined;
|
|
100
|
+
return {
|
|
101
|
+
running: isActive,
|
|
102
|
+
enabled: isEnabled,
|
|
103
|
+
pid,
|
|
104
|
+
message: stdout
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
// Service might not exist or be stopped
|
|
109
|
+
return {
|
|
110
|
+
running: false,
|
|
111
|
+
enabled: false,
|
|
112
|
+
message: error instanceof Error ? error.message : String(error)
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async logs(follow, lines = 100) {
|
|
117
|
+
const followFlag = follow ? '-f' : '';
|
|
118
|
+
const command = `journalctl -u ${this.serviceName} -n ${lines} ${followFlag}`;
|
|
119
|
+
if (follow) {
|
|
120
|
+
// For follow mode, spawn the process and pipe to stdout
|
|
121
|
+
const { spawn } = require('child_process');
|
|
122
|
+
const proc = spawn('journalctl', ['-u', this.serviceName, '-n', String(lines), '-f'], {
|
|
123
|
+
stdio: 'inherit'
|
|
124
|
+
});
|
|
125
|
+
// Handle process termination
|
|
126
|
+
process.on('SIGINT', () => {
|
|
127
|
+
proc.kill('SIGTERM');
|
|
128
|
+
process.exit(0);
|
|
129
|
+
});
|
|
130
|
+
// Return empty string for follow mode as logs are streamed to stdout
|
|
131
|
+
return '';
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
try {
|
|
135
|
+
const { stdout } = await execAsync(command);
|
|
136
|
+
return stdout;
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
throw new Error(`Failed to read logs: ${error instanceof Error ? error.message : String(error)}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
async enable() {
|
|
144
|
+
try {
|
|
145
|
+
await execAsync(`systemctl enable ${this.serviceName}`);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
throw new Error(`Failed to enable service: ${error instanceof Error ? error.message : String(error)}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
async disable() {
|
|
152
|
+
try {
|
|
153
|
+
await execAsync(`systemctl disable ${this.serviceName}`);
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
throw new Error(`Failed to disable service: ${error instanceof Error ? error.message : String(error)}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
async uninstall() {
|
|
160
|
+
// Stop and disable service first
|
|
161
|
+
try {
|
|
162
|
+
await this.stop();
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// Ignore if already stopped
|
|
166
|
+
}
|
|
167
|
+
try {
|
|
168
|
+
await this.disable();
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
// Ignore if not enabled
|
|
172
|
+
}
|
|
173
|
+
// Remove service file
|
|
174
|
+
try {
|
|
175
|
+
await fs.unlink(this.serviceFilePath);
|
|
176
|
+
await execAsync('systemctl daemon-reload');
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
throw new Error(`Failed to remove service file: ${error instanceof Error ? error.message : String(error)}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
getPlatform() {
|
|
183
|
+
return 'linux';
|
|
184
|
+
}
|
|
185
|
+
getType() {
|
|
186
|
+
return 'systemd';
|
|
187
|
+
}
|
|
188
|
+
async isEnabled() {
|
|
189
|
+
try {
|
|
190
|
+
const { stdout } = await execAsync(`systemctl is-enabled ${this.serviceName}`);
|
|
191
|
+
return stdout.trim() === 'enabled';
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
generateServiceFile(config) {
|
|
198
|
+
const nodePath = process.execPath; // Path to current Node.js executable
|
|
199
|
+
return `[Unit]
|
|
200
|
+
Description=Edgible Agent
|
|
201
|
+
After=network.target
|
|
202
|
+
|
|
203
|
+
[Service]
|
|
204
|
+
Type=simple
|
|
205
|
+
User=root
|
|
206
|
+
WorkingDirectory=${config.agentPath}
|
|
207
|
+
ExecStart=${nodePath} ${config.agentPath}/index.js start -c ${config.configPath}/agent.config.json
|
|
208
|
+
Restart=always
|
|
209
|
+
RestartSec=10
|
|
210
|
+
Environment=NODE_ENV=production
|
|
211
|
+
Environment=EDGIBLE_CONFIG_PATH=${config.configPath}
|
|
212
|
+
StandardOutput=journal
|
|
213
|
+
StandardError=journal
|
|
214
|
+
|
|
215
|
+
[Install]
|
|
216
|
+
WantedBy=multi-user.target
|
|
217
|
+
`;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
exports.SystemdDaemonManager = SystemdDaemonManager;
|
|
221
|
+
//# sourceMappingURL=SystemdDaemonManager.js.map
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.WindowsServiceDaemonManager = void 0;
|
|
37
|
+
const child_process_1 = require("child_process");
|
|
38
|
+
const util_1 = require("util");
|
|
39
|
+
const fs = __importStar(require("fs/promises"));
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const PlatformDetector_1 = require("../../utils/PlatformDetector");
|
|
42
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
43
|
+
class WindowsServiceDaemonManager {
|
|
44
|
+
constructor() {
|
|
45
|
+
this.serviceName = 'EdgibleAgent';
|
|
46
|
+
this.displayName = 'Edgible Agent';
|
|
47
|
+
this.description = 'Edgible Agent Service for device management and networking';
|
|
48
|
+
if (PlatformDetector_1.PlatformDetector.getPlatform() !== 'win32') {
|
|
49
|
+
throw new Error('WindowsServiceDaemonManager is only supported on Windows');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async install(config) {
|
|
53
|
+
const nodePath = process.execPath;
|
|
54
|
+
const agentScript = path.join(config.agentPath, 'index.js');
|
|
55
|
+
const configFile = path.join(config.configPath, 'agent.config.json');
|
|
56
|
+
// Create a wrapper batch file to run the service
|
|
57
|
+
const wrapperPath = path.join(config.agentPath, 'service-wrapper.bat');
|
|
58
|
+
const wrapperContent = `@echo off
|
|
59
|
+
"${nodePath}" "${agentScript}" start -c "${configFile}"
|
|
60
|
+
`;
|
|
61
|
+
try {
|
|
62
|
+
await fs.writeFile(wrapperPath, wrapperContent, 'utf8');
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
throw new Error(`Failed to create service wrapper: ${error instanceof Error ? error.message : String(error)}`);
|
|
66
|
+
}
|
|
67
|
+
// Create the service using sc.exe
|
|
68
|
+
try {
|
|
69
|
+
const createCommand = `sc create ${this.serviceName} ` +
|
|
70
|
+
`binPath= "\\"${wrapperPath}\\"" ` +
|
|
71
|
+
`DisplayName= "${this.displayName}" ` +
|
|
72
|
+
`start= auto`;
|
|
73
|
+
await execAsync(createCommand);
|
|
74
|
+
// Set service description
|
|
75
|
+
await execAsync(`sc description ${this.serviceName} "${this.description}"`);
|
|
76
|
+
// Set service to restart on failure
|
|
77
|
+
await execAsync(`sc failure ${this.serviceName} reset= 86400 actions= restart/60000/restart/60000/restart/60000`);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
throw new Error(`Failed to create Windows service: ${error instanceof Error ? error.message : String(error)}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async start() {
|
|
84
|
+
try {
|
|
85
|
+
await execAsync(`sc start ${this.serviceName}`);
|
|
86
|
+
// Wait a moment for service to start
|
|
87
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
throw new Error(`Failed to start service: ${error instanceof Error ? error.message : String(error)}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async stop() {
|
|
94
|
+
try {
|
|
95
|
+
await execAsync(`sc stop ${this.serviceName}`);
|
|
96
|
+
// Wait a moment for service to stop
|
|
97
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
throw new Error(`Failed to stop service: ${error instanceof Error ? error.message : String(error)}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async restart() {
|
|
104
|
+
await this.stop();
|
|
105
|
+
await this.start();
|
|
106
|
+
}
|
|
107
|
+
async status() {
|
|
108
|
+
try {
|
|
109
|
+
const { stdout } = await execAsync(`sc query ${this.serviceName}`);
|
|
110
|
+
const isRunning = stdout.includes('STATE') && stdout.includes('RUNNING');
|
|
111
|
+
const isStopped = stdout.includes('STATE') && stdout.includes('STOPPED');
|
|
112
|
+
// Extract PID if available (requires Windows 10+)
|
|
113
|
+
const pidMatch = stdout.match(/PID\s+:\s+(\d+)/);
|
|
114
|
+
const pid = pidMatch ? parseInt(pidMatch[1], 10) : undefined;
|
|
115
|
+
return {
|
|
116
|
+
running: isRunning,
|
|
117
|
+
enabled: true, // If service exists, it's enabled
|
|
118
|
+
pid,
|
|
119
|
+
message: stdout
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
// Service might not exist
|
|
124
|
+
return {
|
|
125
|
+
running: false,
|
|
126
|
+
enabled: false,
|
|
127
|
+
message: error instanceof Error ? error.message : String(error)
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async logs(follow, lines = 100) {
|
|
132
|
+
// Windows Event Log integration would be more complex
|
|
133
|
+
// For now, we'll try to read from a log file if the agent writes one
|
|
134
|
+
const logPath = path.join(process.env.EDGIBLE_CONFIG_PATH || path.join(process.env.USERPROFILE || 'C:\\', '.edgible', 'agent'), 'logs', 'agent.log');
|
|
135
|
+
try {
|
|
136
|
+
if (follow) {
|
|
137
|
+
console.log('Following logs (press Ctrl+C to stop)...');
|
|
138
|
+
// Use PowerShell Get-Content -Wait for following
|
|
139
|
+
const { spawn } = require('child_process');
|
|
140
|
+
const proc = spawn('powershell.exe', [
|
|
141
|
+
'-Command',
|
|
142
|
+
`Get-Content -Path "${logPath}" -Wait -Tail ${lines}`
|
|
143
|
+
], {
|
|
144
|
+
stdio: 'inherit'
|
|
145
|
+
});
|
|
146
|
+
process.on('SIGINT', () => {
|
|
147
|
+
proc.kill();
|
|
148
|
+
process.exit(0);
|
|
149
|
+
});
|
|
150
|
+
// Return empty string for follow mode as logs are streamed to stdout
|
|
151
|
+
return '';
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
// Read last N lines using PowerShell
|
|
155
|
+
const { stdout } = await execAsync(`powershell.exe -Command "Get-Content -Path '${logPath}' -Tail ${lines}"`);
|
|
156
|
+
return stdout;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
// Try Windows Event Log as fallback
|
|
161
|
+
try {
|
|
162
|
+
const { stdout } = await execAsync(`powershell.exe -Command "Get-EventLog -LogName Application -Source '${this.serviceName}' -Newest ${lines} | Format-List"`);
|
|
163
|
+
return stdout;
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
throw new Error(`Failed to read logs: ${error instanceof Error ? error.message : String(error)}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
async enable() {
|
|
171
|
+
try {
|
|
172
|
+
await execAsync(`sc config ${this.serviceName} start= auto`);
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
throw new Error(`Failed to enable service: ${error instanceof Error ? error.message : String(error)}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
async disable() {
|
|
179
|
+
try {
|
|
180
|
+
await execAsync(`sc config ${this.serviceName} start= demand`);
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
throw new Error(`Failed to disable service: ${error instanceof Error ? error.message : String(error)}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
async uninstall() {
|
|
187
|
+
// Stop service first
|
|
188
|
+
try {
|
|
189
|
+
await this.stop();
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
// Ignore if already stopped
|
|
193
|
+
}
|
|
194
|
+
// Delete service
|
|
195
|
+
try {
|
|
196
|
+
await execAsync(`sc delete ${this.serviceName}`);
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
throw new Error(`Failed to remove service: ${error instanceof Error ? error.message : String(error)}`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
getPlatform() {
|
|
203
|
+
return 'win32';
|
|
204
|
+
}
|
|
205
|
+
getType() {
|
|
206
|
+
return 'windows-service';
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
exports.WindowsServiceDaemonManager = WindowsServiceDaemonManager;
|
|
210
|
+
//# sourceMappingURL=WindowsServiceDaemonManager.js.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DaemonManagerFactory = exports.PodmanDaemonManager = exports.DockerDaemonManager = exports.WindowsServiceDaemonManager = exports.LaunchdDaemonManager = exports.SystemdDaemonManager = void 0;
|
|
4
|
+
var SystemdDaemonManager_1 = require("./SystemdDaemonManager");
|
|
5
|
+
Object.defineProperty(exports, "SystemdDaemonManager", { enumerable: true, get: function () { return SystemdDaemonManager_1.SystemdDaemonManager; } });
|
|
6
|
+
var LaunchdDaemonManager_1 = require("./LaunchdDaemonManager");
|
|
7
|
+
Object.defineProperty(exports, "LaunchdDaemonManager", { enumerable: true, get: function () { return LaunchdDaemonManager_1.LaunchdDaemonManager; } });
|
|
8
|
+
var WindowsServiceDaemonManager_1 = require("./WindowsServiceDaemonManager");
|
|
9
|
+
Object.defineProperty(exports, "WindowsServiceDaemonManager", { enumerable: true, get: function () { return WindowsServiceDaemonManager_1.WindowsServiceDaemonManager; } });
|
|
10
|
+
var DockerDaemonManager_1 = require("./DockerDaemonManager");
|
|
11
|
+
Object.defineProperty(exports, "DockerDaemonManager", { enumerable: true, get: function () { return DockerDaemonManager_1.DockerDaemonManager; } });
|
|
12
|
+
var PodmanDaemonManager_1 = require("./PodmanDaemonManager");
|
|
13
|
+
Object.defineProperty(exports, "PodmanDaemonManager", { enumerable: true, get: function () { return PodmanDaemonManager_1.PodmanDaemonManager; } });
|
|
14
|
+
var DaemonManagerFactory_1 = require("./DaemonManagerFactory");
|
|
15
|
+
Object.defineProperty(exports, "DaemonManagerFactory", { enumerable: true, get: function () { return DaemonManagerFactory_1.DaemonManagerFactory; } });
|
|
16
|
+
//# sourceMappingURL=index.js.map
|