xray-manager 1.8.4 → 2.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.
- package/README.md +102 -42
- package/dist/cli.mjs +8587 -0
- package/dist/cli.mjs.map +7 -0
- package/package.json +13 -5
- package/dist/cli.d.ts +0 -11
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -134
- package/dist/cli.js.map +0 -1
- package/dist/commands/clash.d.ts +0 -20
- package/dist/commands/clash.d.ts.map +0 -1
- package/dist/commands/clash.js +0 -156
- package/dist/commands/clash.js.map +0 -1
- package/dist/commands/config.d.ts +0 -56
- package/dist/commands/config.d.ts.map +0 -1
- package/dist/commands/config.js +0 -461
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/interactive.d.ts +0 -55
- package/dist/commands/interactive.d.ts.map +0 -1
- package/dist/commands/interactive.js +0 -418
- package/dist/commands/interactive.js.map +0 -1
- package/dist/commands/logs.d.ts +0 -62
- package/dist/commands/logs.d.ts.map +0 -1
- package/dist/commands/logs.js +0 -389
- package/dist/commands/logs.js.map +0 -1
- package/dist/commands/quota.d.ts +0 -54
- package/dist/commands/quota.d.ts.map +0 -1
- package/dist/commands/quota.js +0 -661
- package/dist/commands/quota.js.map +0 -1
- package/dist/commands/review.d.ts +0 -8
- package/dist/commands/review.d.ts.map +0 -1
- package/dist/commands/review.js +0 -79
- package/dist/commands/review.js.map +0 -1
- package/dist/commands/service.d.ts +0 -43
- package/dist/commands/service.d.ts.map +0 -1
- package/dist/commands/service.js +0 -202
- package/dist/commands/service.js.map +0 -1
- package/dist/commands/user.d.ts +0 -49
- package/dist/commands/user.d.ts.map +0 -1
- package/dist/commands/user.js +0 -371
- package/dist/commands/user.js.map +0 -1
- package/dist/components/dashboard-widget.d.ts +0 -21
- package/dist/components/dashboard-widget.d.ts.map +0 -1
- package/dist/components/dashboard-widget.js +0 -234
- package/dist/components/dashboard-widget.js.map +0 -1
- package/dist/components/progress-bar.d.ts +0 -67
- package/dist/components/progress-bar.d.ts.map +0 -1
- package/dist/components/progress-bar.js +0 -138
- package/dist/components/progress-bar.js.map +0 -1
- package/dist/components/user-table.d.ts +0 -8
- package/dist/components/user-table.d.ts.map +0 -1
- package/dist/components/user-table.js +0 -91
- package/dist/components/user-table.js.map +0 -1
- package/dist/config/i18n.d.ts +0 -136
- package/dist/config/i18n.d.ts.map +0 -1
- package/dist/config/i18n.js +0 -323
- package/dist/config/i18n.js.map +0 -1
- package/dist/constants/error-codes.d.ts +0 -344
- package/dist/constants/error-codes.d.ts.map +0 -1
- package/dist/constants/error-codes.js +0 -462
- package/dist/constants/error-codes.js.map +0 -1
- package/dist/constants/exit-codes.d.ts +0 -49
- package/dist/constants/exit-codes.d.ts.map +0 -1
- package/dist/constants/exit-codes.js +0 -100
- package/dist/constants/exit-codes.js.map +0 -1
- package/dist/constants/paths.d.ts +0 -63
- package/dist/constants/paths.d.ts.map +0 -1
- package/dist/constants/paths.js +0 -78
- package/dist/constants/paths.js.map +0 -1
- package/dist/constants/quota.d.ts +0 -126
- package/dist/constants/quota.d.ts.map +0 -1
- package/dist/constants/quota.js +0 -135
- package/dist/constants/quota.js.map +0 -1
- package/dist/constants/review.d.ts +0 -14
- package/dist/constants/review.d.ts.map +0 -1
- package/dist/constants/review.js +0 -33
- package/dist/constants/review.js.map +0 -1
- package/dist/constants/supported-distros.d.ts +0 -17
- package/dist/constants/supported-distros.d.ts.map +0 -1
- package/dist/constants/supported-distros.js +0 -68
- package/dist/constants/supported-distros.js.map +0 -1
- package/dist/constants/theme.d.ts +0 -34
- package/dist/constants/theme.d.ts.map +0 -1
- package/dist/constants/theme.js +0 -52
- package/dist/constants/theme.js.map +0 -1
- package/dist/constants/timeouts.d.ts +0 -84
- package/dist/constants/timeouts.d.ts.map +0 -1
- package/dist/constants/timeouts.js +0 -111
- package/dist/constants/timeouts.js.map +0 -1
- package/dist/constants/ui-symbols.d.ts +0 -47
- package/dist/constants/ui-symbols.d.ts.map +0 -1
- package/dist/constants/ui-symbols.js +0 -48
- package/dist/constants/ui-symbols.js.map +0 -1
- package/dist/services/clash-config.d.ts +0 -16
- package/dist/services/clash-config.d.ts.map +0 -1
- package/dist/services/clash-config.js +0 -107
- package/dist/services/clash-config.js.map +0 -1
- package/dist/services/config-manager.d.ts +0 -90
- package/dist/services/config-manager.d.ts.map +0 -1
- package/dist/services/config-manager.js +0 -307
- package/dist/services/config-manager.js.map +0 -1
- package/dist/services/layout-manager.d.ts +0 -94
- package/dist/services/layout-manager.d.ts.map +0 -1
- package/dist/services/layout-manager.js +0 -192
- package/dist/services/layout-manager.js.map +0 -1
- package/dist/services/log-manager.d.ts +0 -157
- package/dist/services/log-manager.d.ts.map +0 -1
- package/dist/services/log-manager.js +0 -397
- package/dist/services/log-manager.js.map +0 -1
- package/dist/services/navigation-manager.d.ts +0 -23
- package/dist/services/navigation-manager.d.ts.map +0 -1
- package/dist/services/navigation-manager.js +0 -39
- package/dist/services/navigation-manager.js.map +0 -1
- package/dist/services/platform-detector.d.ts +0 -10
- package/dist/services/platform-detector.d.ts.map +0 -1
- package/dist/services/platform-detector.js +0 -106
- package/dist/services/platform-detector.js.map +0 -1
- package/dist/services/public-ip-manager.d.ts +0 -78
- package/dist/services/public-ip-manager.d.ts.map +0 -1
- package/dist/services/public-ip-manager.js +0 -296
- package/dist/services/public-ip-manager.js.map +0 -1
- package/dist/services/quota-enforcer.d.ts +0 -86
- package/dist/services/quota-enforcer.d.ts.map +0 -1
- package/dist/services/quota-enforcer.js +0 -151
- package/dist/services/quota-enforcer.js.map +0 -1
- package/dist/services/quota-manager.d.ts +0 -101
- package/dist/services/quota-manager.d.ts.map +0 -1
- package/dist/services/quota-manager.js +0 -257
- package/dist/services/quota-manager.js.map +0 -1
- package/dist/services/review/areas/community.d.ts +0 -9
- package/dist/services/review/areas/community.d.ts.map +0 -1
- package/dist/services/review/areas/community.js +0 -59
- package/dist/services/review/areas/community.js.map +0 -1
- package/dist/services/review/areas/contribution.d.ts +0 -9
- package/dist/services/review/areas/contribution.d.ts.map +0 -1
- package/dist/services/review/areas/contribution.js +0 -107
- package/dist/services/review/areas/contribution.js.map +0 -1
- package/dist/services/review/areas/documentation.d.ts +0 -9
- package/dist/services/review/areas/documentation.d.ts.map +0 -1
- package/dist/services/review/areas/documentation.js +0 -110
- package/dist/services/review/areas/documentation.js.map +0 -1
- package/dist/services/review/areas/license.d.ts +0 -9
- package/dist/services/review/areas/license.d.ts.map +0 -1
- package/dist/services/review/areas/license.js +0 -86
- package/dist/services/review/areas/license.js.map +0 -1
- package/dist/services/review/areas/quality.d.ts +0 -9
- package/dist/services/review/areas/quality.d.ts.map +0 -1
- package/dist/services/review/areas/quality.js +0 -84
- package/dist/services/review/areas/quality.js.map +0 -1
- package/dist/services/review/areas/security.d.ts +0 -9
- package/dist/services/review/areas/security.d.ts.map +0 -1
- package/dist/services/review/areas/security.js +0 -64
- package/dist/services/review/areas/security.js.map +0 -1
- package/dist/services/review/evidence.d.ts +0 -10
- package/dist/services/review/evidence.d.ts.map +0 -1
- package/dist/services/review/evidence.js +0 -40
- package/dist/services/review/evidence.js.map +0 -1
- package/dist/services/review/recommendations-filter.d.ts +0 -12
- package/dist/services/review/recommendations-filter.d.ts.map +0 -1
- package/dist/services/review/recommendations-filter.js +0 -20
- package/dist/services/review/recommendations-filter.js.map +0 -1
- package/dist/services/review/repo-scanner.d.ts +0 -8
- package/dist/services/review/repo-scanner.d.ts.map +0 -1
- package/dist/services/review/repo-scanner.js +0 -15
- package/dist/services/review/repo-scanner.js.map +0 -1
- package/dist/services/review/report-renderer.d.ts +0 -15
- package/dist/services/review/report-renderer.d.ts.map +0 -1
- package/dist/services/review/report-renderer.js +0 -120
- package/dist/services/review/report-renderer.js.map +0 -1
- package/dist/services/review/review-engine.d.ts +0 -15
- package/dist/services/review/review-engine.d.ts.map +0 -1
- package/dist/services/review/review-engine.js +0 -61
- package/dist/services/review/review-engine.js.map +0 -1
- package/dist/services/review/summary-builder.d.ts +0 -8
- package/dist/services/review/summary-builder.d.ts.map +0 -1
- package/dist/services/review/summary-builder.js +0 -26
- package/dist/services/review/summary-builder.js.map +0 -1
- package/dist/services/screen-manager.d.ts +0 -13
- package/dist/services/screen-manager.d.ts.map +0 -1
- package/dist/services/screen-manager.js +0 -42
- package/dist/services/screen-manager.js.map +0 -1
- package/dist/services/stats-config-manager.d.ts +0 -110
- package/dist/services/stats-config-manager.d.ts.map +0 -1
- package/dist/services/stats-config-manager.js +0 -443
- package/dist/services/stats-config-manager.js.map +0 -1
- package/dist/services/systemd-manager.d.ts +0 -197
- package/dist/services/systemd-manager.d.ts.map +0 -1
- package/dist/services/systemd-manager.js +0 -458
- package/dist/services/systemd-manager.js.map +0 -1
- package/dist/services/traffic-manager.d.ts +0 -106
- package/dist/services/traffic-manager.d.ts.map +0 -1
- package/dist/services/traffic-manager.js +0 -368
- package/dist/services/traffic-manager.js.map +0 -1
- package/dist/services/user-manager.d.ts +0 -90
- package/dist/services/user-manager.d.ts.map +0 -1
- package/dist/services/user-manager.js +0 -347
- package/dist/services/user-manager.js.map +0 -1
- package/dist/services/user-metadata-manager.d.ts +0 -85
- package/dist/services/user-metadata-manager.d.ts.map +0 -1
- package/dist/services/user-metadata-manager.js +0 -181
- package/dist/services/user-metadata-manager.js.map +0 -1
- package/dist/types/config.d.ts +0 -340
- package/dist/types/config.d.ts.map +0 -1
- package/dist/types/config.js +0 -7
- package/dist/types/config.js.map +0 -1
- package/dist/types/layout.d.ts +0 -119
- package/dist/types/layout.d.ts.map +0 -1
- package/dist/types/layout.js +0 -142
- package/dist/types/layout.js.map +0 -1
- package/dist/types/platform.d.ts +0 -72
- package/dist/types/platform.d.ts.map +0 -1
- package/dist/types/platform.js +0 -38
- package/dist/types/platform.js.map +0 -1
- package/dist/types/quota.d.ts +0 -158
- package/dist/types/quota.d.ts.map +0 -1
- package/dist/types/quota.js +0 -26
- package/dist/types/quota.js.map +0 -1
- package/dist/types/review.d.ts +0 -62
- package/dist/types/review.d.ts.map +0 -1
- package/dist/types/review.js +0 -8
- package/dist/types/review.js.map +0 -1
- package/dist/types/server-config.d.ts +0 -53
- package/dist/types/server-config.d.ts.map +0 -1
- package/dist/types/server-config.js +0 -19
- package/dist/types/server-config.js.map +0 -1
- package/dist/types/service.d.ts +0 -96
- package/dist/types/service.d.ts.map +0 -1
- package/dist/types/service.js +0 -7
- package/dist/types/service.js.map +0 -1
- package/dist/types/terminal.d.ts +0 -35
- package/dist/types/terminal.d.ts.map +0 -1
- package/dist/types/terminal.js +0 -20
- package/dist/types/terminal.js.map +0 -1
- package/dist/types/ui-components.d.ts +0 -53
- package/dist/types/ui-components.d.ts.map +0 -1
- package/dist/types/ui-components.js +0 -3
- package/dist/types/ui-components.js.map +0 -1
- package/dist/types/user-metadata.d.ts +0 -43
- package/dist/types/user-metadata.d.ts.map +0 -1
- package/dist/types/user-metadata.js +0 -17
- package/dist/types/user-metadata.js.map +0 -1
- package/dist/types/user.d.ts +0 -134
- package/dist/types/user.d.ts.map +0 -1
- package/dist/types/user.js +0 -7
- package/dist/types/user.js.map +0 -1
- package/dist/utils/clipboard.d.ts +0 -21
- package/dist/utils/clipboard.d.ts.map +0 -1
- package/dist/utils/clipboard.js +0 -45
- package/dist/utils/clipboard.js.map +0 -1
- package/dist/utils/error-formatter.d.ts +0 -60
- package/dist/utils/error-formatter.d.ts.map +0 -1
- package/dist/utils/error-formatter.js +0 -244
- package/dist/utils/error-formatter.js.map +0 -1
- package/dist/utils/errors.d.ts +0 -92
- package/dist/utils/errors.d.ts.map +0 -1
- package/dist/utils/errors.js +0 -143
- package/dist/utils/errors.js.map +0 -1
- package/dist/utils/firewall.d.ts +0 -14
- package/dist/utils/firewall.d.ts.map +0 -1
- package/dist/utils/firewall.js +0 -78
- package/dist/utils/firewall.js.map +0 -1
- package/dist/utils/format.d.ts +0 -93
- package/dist/utils/format.d.ts.map +0 -1
- package/dist/utils/format.js +0 -240
- package/dist/utils/format.js.map +0 -1
- package/dist/utils/icons.d.ts +0 -53
- package/dist/utils/icons.d.ts.map +0 -1
- package/dist/utils/icons.js +0 -143
- package/dist/utils/icons.js.map +0 -1
- package/dist/utils/layout.d.ts +0 -142
- package/dist/utils/layout.d.ts.map +0 -1
- package/dist/utils/layout.js +0 -381
- package/dist/utils/layout.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -160
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -351
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/network.d.ts +0 -39
- package/dist/utils/network.d.ts.map +0 -1
- package/dist/utils/network.js +0 -227
- package/dist/utils/network.js.map +0 -1
- package/dist/utils/os-detection.d.ts +0 -10
- package/dist/utils/os-detection.d.ts.map +0 -1
- package/dist/utils/os-detection.js +0 -86
- package/dist/utils/os-detection.js.map +0 -1
- package/dist/utils/preflight.d.ts +0 -57
- package/dist/utils/preflight.d.ts.map +0 -1
- package/dist/utils/preflight.js +0 -215
- package/dist/utils/preflight.js.map +0 -1
- package/dist/utils/repo-scan.d.ts +0 -54
- package/dist/utils/repo-scan.d.ts.map +0 -1
- package/dist/utils/repo-scan.js +0 -165
- package/dist/utils/repo-scan.js.map +0 -1
- package/dist/utils/report-output.d.ts +0 -13
- package/dist/utils/report-output.d.ts.map +0 -1
- package/dist/utils/report-output.js +0 -33
- package/dist/utils/report-output.js.map +0 -1
- package/dist/utils/review-id.d.ts +0 -8
- package/dist/utils/review-id.d.ts.map +0 -1
- package/dist/utils/review-id.js +0 -17
- package/dist/utils/review-id.js.map +0 -1
- package/dist/utils/splash.d.ts +0 -21
- package/dist/utils/splash.d.ts.map +0 -1
- package/dist/utils/splash.js +0 -179
- package/dist/utils/splash.js.map +0 -1
- package/dist/utils/terminal.d.ts +0 -32
- package/dist/utils/terminal.d.ts.map +0 -1
- package/dist/utils/terminal.js +0 -93
- package/dist/utils/terminal.js.map +0 -1
- package/dist/utils/traffic-formatter.d.ts +0 -45
- package/dist/utils/traffic-formatter.d.ts.map +0 -1
- package/dist/utils/traffic-formatter.js +0 -131
- package/dist/utils/traffic-formatter.js.map +0 -1
- package/dist/utils/validator.d.ts +0 -102
- package/dist/utils/validator.d.ts.map +0 -1
- package/dist/utils/validator.js +0 -238
- package/dist/utils/validator.js.map +0 -1
- package/dist/utils/vless-link.d.ts +0 -27
- package/dist/utils/vless-link.d.ts.map +0 -1
- package/dist/utils/vless-link.js +0 -69
- package/dist/utils/vless-link.js.map +0 -1
- package/dist/utils/which.d.ts +0 -13
- package/dist/utils/which.d.ts.map +0 -1
- package/dist/utils/which.js +0 -28
- package/dist/utils/which.js.map +0 -1
|
@@ -1,458 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* SystemdManager - Service Management via systemctl
|
|
4
|
-
*
|
|
5
|
-
* Provides safe interface to systemd service management with:
|
|
6
|
-
* - Command injection prevention
|
|
7
|
-
* - Action and service name validation
|
|
8
|
-
* - Graceful shutdown with configurable timeout
|
|
9
|
-
* - Detailed status parsing
|
|
10
|
-
*
|
|
11
|
-
* @module services/systemd-manager
|
|
12
|
-
*/
|
|
13
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.SystemdManager = void 0;
|
|
15
|
-
const child_process_1 = require("child_process");
|
|
16
|
-
const timeouts_1 = require("../constants/timeouts");
|
|
17
|
-
/**
|
|
18
|
-
* SystemdManager - Safe systemctl wrapper
|
|
19
|
-
*/
|
|
20
|
-
class SystemdManager {
|
|
21
|
-
/**
|
|
22
|
-
* Create a new SystemdManager
|
|
23
|
-
*
|
|
24
|
-
* @param serviceName - Service name to manage
|
|
25
|
-
* @throws Error if service name is invalid
|
|
26
|
-
*/
|
|
27
|
-
constructor(serviceName) {
|
|
28
|
-
this.validateServiceName(serviceName);
|
|
29
|
-
this.serviceName = serviceName;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Validate service name
|
|
33
|
-
*
|
|
34
|
-
* @param name - Service name to validate
|
|
35
|
-
* @throws Error if service name is invalid
|
|
36
|
-
*/
|
|
37
|
-
validateServiceName(name) {
|
|
38
|
-
// Prevent empty names
|
|
39
|
-
if (!name || name.trim().length === 0) {
|
|
40
|
-
throw new Error('Service name cannot be empty');
|
|
41
|
-
}
|
|
42
|
-
// Prevent path traversal attempts
|
|
43
|
-
if (name.includes('/') || name.includes('\\') || name.includes('..')) {
|
|
44
|
-
throw new Error(`Invalid service name: ${name} (path traversal detected)`);
|
|
45
|
-
}
|
|
46
|
-
// Prevent command injection attempts
|
|
47
|
-
const dangerousChars = /[;&|`$()]/;
|
|
48
|
-
if (dangerousChars.test(name)) {
|
|
49
|
-
throw new Error(`Invalid service name: ${name} (potentially dangerous characters detected)`);
|
|
50
|
-
}
|
|
51
|
-
// Only allow alphanumeric, dash, underscore
|
|
52
|
-
const validPattern = /^[a-zA-Z0-9_-]+$/;
|
|
53
|
-
if (!validPattern.test(name)) {
|
|
54
|
-
throw new Error(`Invalid service name: ${name} (only alphanumeric, dash, and underscore allowed)`);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Validate systemctl action
|
|
59
|
-
*
|
|
60
|
-
* @param action - Action to validate
|
|
61
|
-
* @throws Error if action is invalid
|
|
62
|
-
*/
|
|
63
|
-
validateAction(action) {
|
|
64
|
-
if (!SystemdManager.VALID_ACTIONS.includes(action)) {
|
|
65
|
-
throw new Error(`Invalid systemctl action: ${action} (must be one of: ${SystemdManager.VALID_ACTIONS.join(', ')})`);
|
|
66
|
-
}
|
|
67
|
-
// Extra paranoia: check for command injection attempts
|
|
68
|
-
const dangerousChars = /[;&|`$()]/;
|
|
69
|
-
if (dangerousChars.test(action)) {
|
|
70
|
-
throw new Error(`Invalid systemctl action: ${action} (potentially dangerous characters detected)`);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Execute systemctl command
|
|
75
|
-
*
|
|
76
|
-
* @param action - Systemctl action to execute
|
|
77
|
-
* @param options - Execution options
|
|
78
|
-
* @returns Command output
|
|
79
|
-
*/
|
|
80
|
-
async executeSystemctl(action, options) {
|
|
81
|
-
// Validate action to prevent command injection
|
|
82
|
-
this.validateAction(action);
|
|
83
|
-
const timeout = options?.timeout || timeouts_1.TIMEOUTS.SYSTEMCTL_DEFAULT;
|
|
84
|
-
return new Promise((resolve, reject) => {
|
|
85
|
-
// Use spawn (not exec) to prevent shell injection
|
|
86
|
-
const child = (0, child_process_1.spawn)('systemctl', [action, this.serviceName], {
|
|
87
|
-
timeout,
|
|
88
|
-
});
|
|
89
|
-
let stdout = '';
|
|
90
|
-
let stderr = '';
|
|
91
|
-
child.stdout?.on('data', (data) => {
|
|
92
|
-
stdout += data.toString();
|
|
93
|
-
});
|
|
94
|
-
child.stderr?.on('data', (data) => {
|
|
95
|
-
stderr += data.toString();
|
|
96
|
-
});
|
|
97
|
-
child.on('close', (code) => {
|
|
98
|
-
if (code === 0) {
|
|
99
|
-
resolve(stdout);
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
const errorMessage = this.parseSystemdError(stderr || stdout, action);
|
|
103
|
-
reject(new Error(errorMessage));
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
child.on('error', (error) => {
|
|
107
|
-
reject(new Error(`Failed to execute systemctl: ${error.message}`));
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Parse systemd error messages and provide suggestions
|
|
113
|
-
*
|
|
114
|
-
* @param errorOutput - Error output from systemctl
|
|
115
|
-
* @param action - Action that was attempted
|
|
116
|
-
* @returns User-friendly error message with suggestions
|
|
117
|
-
*/
|
|
118
|
-
parseSystemdError(errorOutput, action) {
|
|
119
|
-
const lowerError = errorOutput.toLowerCase();
|
|
120
|
-
// Service not found
|
|
121
|
-
if (lowerError.includes('not found') ||
|
|
122
|
-
lowerError.includes('does not exist') ||
|
|
123
|
-
lowerError.includes('could not be found')) {
|
|
124
|
-
return `服务 '${this.serviceName}' 不存在。请确认服务名称是否正确。`;
|
|
125
|
-
}
|
|
126
|
-
// Permission denied
|
|
127
|
-
if (lowerError.includes('permission denied') ||
|
|
128
|
-
lowerError.includes('access denied') ||
|
|
129
|
-
lowerError.includes('authentication required')) {
|
|
130
|
-
return `权限不足: 无法执行 ${action} 操作。请使用 sudo 或以 root 用户运行。`;
|
|
131
|
-
}
|
|
132
|
-
// Timeout
|
|
133
|
-
if (lowerError.includes('timeout') || lowerError.includes('timed out')) {
|
|
134
|
-
return `操作超时: ${action} 操作未能在规定时间内完成。`;
|
|
135
|
-
}
|
|
136
|
-
// Already running/stopped
|
|
137
|
-
if (action === 'start' &&
|
|
138
|
-
(lowerError.includes('already running') || lowerError.includes('already active'))) {
|
|
139
|
-
return `服务 '${this.serviceName}' 已经在运行中。`;
|
|
140
|
-
}
|
|
141
|
-
if (action === 'stop' &&
|
|
142
|
-
(lowerError.includes('already stopped') || lowerError.includes('inactive'))) {
|
|
143
|
-
return `服务 '${this.serviceName}' 已经停止。`;
|
|
144
|
-
}
|
|
145
|
-
// Generic error with original output
|
|
146
|
-
return `执行 systemctl ${action} 失败: ${errorOutput}`;
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Parse systemctl show output
|
|
150
|
-
*
|
|
151
|
-
* @param output - Raw output from systemctl show
|
|
152
|
-
* @returns Parsed service status
|
|
153
|
-
*/
|
|
154
|
-
parseSystemdShow(output) {
|
|
155
|
-
const lines = output.split('\n');
|
|
156
|
-
const props = {};
|
|
157
|
-
// Parse key=value pairs
|
|
158
|
-
for (const line of lines) {
|
|
159
|
-
const trimmed = line.trim();
|
|
160
|
-
if (!trimmed || !trimmed.includes('=')) {
|
|
161
|
-
continue;
|
|
162
|
-
}
|
|
163
|
-
const [key, ...valueParts] = trimmed.split('=');
|
|
164
|
-
const value = valueParts.join('='); // Handle values with '=' in them
|
|
165
|
-
props[key] = value;
|
|
166
|
-
}
|
|
167
|
-
// Validate we have at least basic properties
|
|
168
|
-
if (!props.ActiveState && !props.SubState) {
|
|
169
|
-
throw new Error('Invalid systemctl show output: missing required fields (parse error)');
|
|
170
|
-
}
|
|
171
|
-
// Parse active state
|
|
172
|
-
const activeState = props.ActiveState || 'unknown';
|
|
173
|
-
const subState = props.SubState || 'unknown';
|
|
174
|
-
const active = activeState === 'active';
|
|
175
|
-
// Parse loaded state
|
|
176
|
-
const loaded = props.LoadState === 'loaded';
|
|
177
|
-
// Parse PID
|
|
178
|
-
const pidStr = props.MainPID || '0';
|
|
179
|
-
const pid = parseInt(pidStr, 10);
|
|
180
|
-
const pidValue = pid > 0 ? pid : null;
|
|
181
|
-
// Parse memory usage
|
|
182
|
-
const memoryBytes = parseInt(props.MemoryCurrent || '0', 10);
|
|
183
|
-
const memory = this.formatBytes(memoryBytes);
|
|
184
|
-
// Parse restart count
|
|
185
|
-
const restarts = parseInt(props.NRestarts || '0', 10);
|
|
186
|
-
// Parse start time and calculate uptime
|
|
187
|
-
const startTimestamp = props.ExecMainStartTimestamp;
|
|
188
|
-
let uptime;
|
|
189
|
-
let startTime;
|
|
190
|
-
if (startTimestamp && startTimestamp.trim() !== '') {
|
|
191
|
-
try {
|
|
192
|
-
startTime = new Date(startTimestamp);
|
|
193
|
-
const now = Date.now();
|
|
194
|
-
const startMs = startTime.getTime();
|
|
195
|
-
const uptimeMs = now - startMs;
|
|
196
|
-
uptime = this.formatUptime(uptimeMs);
|
|
197
|
-
}
|
|
198
|
-
catch {
|
|
199
|
-
// Ignore parse errors
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
// Determine health
|
|
203
|
-
const healthy = active && subState === 'running';
|
|
204
|
-
return {
|
|
205
|
-
serviceName: this.serviceName,
|
|
206
|
-
active,
|
|
207
|
-
activeState,
|
|
208
|
-
subState,
|
|
209
|
-
loaded,
|
|
210
|
-
healthy,
|
|
211
|
-
pid: pidValue,
|
|
212
|
-
memory,
|
|
213
|
-
restarts,
|
|
214
|
-
uptime,
|
|
215
|
-
startTime,
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Format bytes to human-readable string
|
|
220
|
-
*
|
|
221
|
-
* @param bytes - Number of bytes
|
|
222
|
-
* @returns Formatted string (e.g., "45.2 MB")
|
|
223
|
-
*/
|
|
224
|
-
formatBytes(bytes) {
|
|
225
|
-
if (bytes === 0)
|
|
226
|
-
return '0 B';
|
|
227
|
-
const units = ['B', 'KB', 'MB', 'GB'];
|
|
228
|
-
const k = 1024;
|
|
229
|
-
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
230
|
-
const value = bytes / Math.pow(k, i);
|
|
231
|
-
return `${value.toFixed(1)} ${units[i]}`;
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* Format uptime in milliseconds to human-readable string
|
|
235
|
-
*
|
|
236
|
-
* @param ms - Uptime in milliseconds
|
|
237
|
-
* @returns Formatted string (e.g., "2小时15分钟")
|
|
238
|
-
*/
|
|
239
|
-
formatUptime(ms) {
|
|
240
|
-
const seconds = Math.floor(ms / 1000);
|
|
241
|
-
const minutes = Math.floor(seconds / 60);
|
|
242
|
-
const hours = Math.floor(minutes / 60);
|
|
243
|
-
const days = Math.floor(hours / 24);
|
|
244
|
-
if (days > 0) {
|
|
245
|
-
return `${days}天${hours % 24}小时`;
|
|
246
|
-
}
|
|
247
|
-
else if (hours > 0) {
|
|
248
|
-
return `${hours}小时${minutes % 60}分钟`;
|
|
249
|
-
}
|
|
250
|
-
else if (minutes > 0) {
|
|
251
|
-
return `${minutes}分钟`;
|
|
252
|
-
}
|
|
253
|
-
else {
|
|
254
|
-
return `${seconds}秒`;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
/**
|
|
258
|
-
* Get service status
|
|
259
|
-
*
|
|
260
|
-
* @returns Service status information
|
|
261
|
-
*/
|
|
262
|
-
async getStatus() {
|
|
263
|
-
const output = await this.executeSystemctl('show');
|
|
264
|
-
return this.parseSystemdShow(output);
|
|
265
|
-
}
|
|
266
|
-
/**
|
|
267
|
-
* Start service
|
|
268
|
-
*
|
|
269
|
-
* @returns Operation result
|
|
270
|
-
*/
|
|
271
|
-
async start() {
|
|
272
|
-
const startTime = Date.now();
|
|
273
|
-
try {
|
|
274
|
-
const stdout = await this.executeSystemctl('start', {
|
|
275
|
-
timeout: timeouts_1.TIMEOUTS.SERVICE_START,
|
|
276
|
-
});
|
|
277
|
-
const duration = Date.now() - startTime;
|
|
278
|
-
return {
|
|
279
|
-
success: true,
|
|
280
|
-
operation: 'start',
|
|
281
|
-
serviceName: this.serviceName,
|
|
282
|
-
exitCode: 0,
|
|
283
|
-
duration,
|
|
284
|
-
stdout,
|
|
285
|
-
};
|
|
286
|
-
}
|
|
287
|
-
catch (error) {
|
|
288
|
-
const duration = Date.now() - startTime;
|
|
289
|
-
return {
|
|
290
|
-
success: false,
|
|
291
|
-
operation: 'start',
|
|
292
|
-
serviceName: this.serviceName,
|
|
293
|
-
exitCode: 1,
|
|
294
|
-
duration,
|
|
295
|
-
stderr: error.message,
|
|
296
|
-
};
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
/**
|
|
300
|
-
* Stop service
|
|
301
|
-
*
|
|
302
|
-
* @returns Operation result
|
|
303
|
-
*/
|
|
304
|
-
async stop() {
|
|
305
|
-
const startTime = Date.now();
|
|
306
|
-
try {
|
|
307
|
-
const stdout = await this.executeSystemctl('stop', {
|
|
308
|
-
timeout: timeouts_1.TIMEOUTS.SERVICE_STOP,
|
|
309
|
-
});
|
|
310
|
-
const duration = Date.now() - startTime;
|
|
311
|
-
return {
|
|
312
|
-
success: true,
|
|
313
|
-
operation: 'stop',
|
|
314
|
-
serviceName: this.serviceName,
|
|
315
|
-
exitCode: 0,
|
|
316
|
-
duration,
|
|
317
|
-
stdout,
|
|
318
|
-
};
|
|
319
|
-
}
|
|
320
|
-
catch (error) {
|
|
321
|
-
const duration = Date.now() - startTime;
|
|
322
|
-
return {
|
|
323
|
-
success: false,
|
|
324
|
-
operation: 'stop',
|
|
325
|
-
serviceName: this.serviceName,
|
|
326
|
-
exitCode: 1,
|
|
327
|
-
duration,
|
|
328
|
-
stderr: error.message,
|
|
329
|
-
};
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
/**
|
|
333
|
-
* Restart service with graceful shutdown
|
|
334
|
-
*
|
|
335
|
-
* @param options - Restart options
|
|
336
|
-
* @returns Operation result
|
|
337
|
-
*/
|
|
338
|
-
async restart(options) {
|
|
339
|
-
const gracefulTimeout = options?.gracefulTimeout || 10000; // Default 10s (FR-016)
|
|
340
|
-
const restartStartTime = Date.now();
|
|
341
|
-
try {
|
|
342
|
-
// Measure service downtime
|
|
343
|
-
const downtimeStart = Date.now();
|
|
344
|
-
// Use systemctl restart which handles graceful shutdown internally
|
|
345
|
-
const stdout = await this.executeSystemctl('restart', {
|
|
346
|
-
timeout: timeouts_1.TIMEOUTS.SERVICE_RESTART,
|
|
347
|
-
});
|
|
348
|
-
// Wait a moment for service to fully start
|
|
349
|
-
await this.waitForServiceReady(gracefulTimeout);
|
|
350
|
-
const downtimeEnd = Date.now();
|
|
351
|
-
const downtime = downtimeEnd - downtimeStart;
|
|
352
|
-
const duration = Date.now() - restartStartTime;
|
|
353
|
-
return {
|
|
354
|
-
success: true,
|
|
355
|
-
operation: 'restart',
|
|
356
|
-
serviceName: this.serviceName,
|
|
357
|
-
exitCode: 0,
|
|
358
|
-
duration,
|
|
359
|
-
downtime,
|
|
360
|
-
stdout,
|
|
361
|
-
};
|
|
362
|
-
}
|
|
363
|
-
catch (error) {
|
|
364
|
-
const duration = Date.now() - restartStartTime;
|
|
365
|
-
return {
|
|
366
|
-
success: false,
|
|
367
|
-
operation: 'restart',
|
|
368
|
-
serviceName: this.serviceName,
|
|
369
|
-
exitCode: 1,
|
|
370
|
-
duration,
|
|
371
|
-
stderr: error.message,
|
|
372
|
-
};
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
/**
|
|
376
|
-
* Wait for service to be ready after start/restart
|
|
377
|
-
*
|
|
378
|
-
* @param maxWait - Maximum time to wait in milliseconds
|
|
379
|
-
*/
|
|
380
|
-
async waitForServiceReady(maxWait) {
|
|
381
|
-
const startTime = Date.now();
|
|
382
|
-
const pollInterval = 100; // Check every 100ms
|
|
383
|
-
while (Date.now() - startTime < maxWait) {
|
|
384
|
-
try {
|
|
385
|
-
const status = await this.getStatus();
|
|
386
|
-
if (status.active && status.subState === 'running') {
|
|
387
|
-
return; // Service is ready
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
catch {
|
|
391
|
-
// Ignore errors during polling
|
|
392
|
-
}
|
|
393
|
-
// Wait before next poll
|
|
394
|
-
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
395
|
-
}
|
|
396
|
-
// If we get here, service didn't become ready in time
|
|
397
|
-
// But don't throw - let caller determine if this is critical
|
|
398
|
-
}
|
|
399
|
-
/**
|
|
400
|
-
* Check if running as root
|
|
401
|
-
*
|
|
402
|
-
* @returns True if running as root
|
|
403
|
-
*/
|
|
404
|
-
isRoot() {
|
|
405
|
-
return !!(process.getuid && process.getuid() === 0);
|
|
406
|
-
}
|
|
407
|
-
/**
|
|
408
|
-
* Check if sudo is available
|
|
409
|
-
*
|
|
410
|
-
* @returns True if sudo is available
|
|
411
|
-
*/
|
|
412
|
-
async canUseSudo() {
|
|
413
|
-
return new Promise((resolve) => {
|
|
414
|
-
const child = (0, child_process_1.spawn)('which', ['sudo']);
|
|
415
|
-
child.on('close', (code) => {
|
|
416
|
-
resolve(code === 0);
|
|
417
|
-
});
|
|
418
|
-
child.on('error', () => {
|
|
419
|
-
resolve(false);
|
|
420
|
-
});
|
|
421
|
-
});
|
|
422
|
-
}
|
|
423
|
-
/**
|
|
424
|
-
* Get permission warning message
|
|
425
|
-
*
|
|
426
|
-
* @returns Warning message if not running with sufficient permissions
|
|
427
|
-
*/
|
|
428
|
-
getPermissionWarning() {
|
|
429
|
-
if (this.isRoot()) {
|
|
430
|
-
return undefined;
|
|
431
|
-
}
|
|
432
|
-
return '当前用户不是 root - 某些操作可能需要 sudo 权限';
|
|
433
|
-
}
|
|
434
|
-
/**
|
|
435
|
-
* Estimate downtime for restart operation
|
|
436
|
-
*
|
|
437
|
-
* @returns Estimated downtime in milliseconds
|
|
438
|
-
*/
|
|
439
|
-
estimateDowntime() {
|
|
440
|
-
// Estimate based on typical graceful shutdown time
|
|
441
|
-
// Conservative estimate: 5 seconds
|
|
442
|
-
return 5000;
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
exports.SystemdManager = SystemdManager;
|
|
446
|
-
/** Valid systemctl actions (whitelist) */
|
|
447
|
-
SystemdManager.VALID_ACTIONS = [
|
|
448
|
-
'start',
|
|
449
|
-
'stop',
|
|
450
|
-
'restart',
|
|
451
|
-
'status',
|
|
452
|
-
'enable',
|
|
453
|
-
'disable',
|
|
454
|
-
'is-active',
|
|
455
|
-
'is-enabled',
|
|
456
|
-
'show',
|
|
457
|
-
];
|
|
458
|
-
//# sourceMappingURL=systemd-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"systemd-manager.js","sourceRoot":"","sources":["../../src/services/systemd-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TrafficManager - 流量统计服务
|
|
3
|
-
*
|
|
4
|
-
* 通过 Xray Stats API 获取用户流量使用情况
|
|
5
|
-
*
|
|
6
|
-
* @module services/traffic-manager
|
|
7
|
-
*/
|
|
8
|
-
import type { TrafficUsage } from '../types/quota';
|
|
9
|
-
/**
|
|
10
|
-
* Stats API 检测结果
|
|
11
|
-
*/
|
|
12
|
-
export interface StatsDetectionResult {
|
|
13
|
-
/** API 是否可用 */
|
|
14
|
-
available: boolean;
|
|
15
|
-
/** 是否检测到 stats 配置 */
|
|
16
|
-
configDetected: boolean;
|
|
17
|
-
/** 检测到的 API 端口 */
|
|
18
|
-
detectedPort?: number;
|
|
19
|
-
/** 服务是否运行 */
|
|
20
|
-
serviceRunning: boolean;
|
|
21
|
-
/** 提示消息 */
|
|
22
|
-
message: string;
|
|
23
|
-
/** 建议操作 */
|
|
24
|
-
suggestion?: string;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* TrafficManager - 管理 Xray 流量统计
|
|
28
|
-
*/
|
|
29
|
-
export declare class TrafficManager {
|
|
30
|
-
private apiServer;
|
|
31
|
-
private apiPort;
|
|
32
|
-
/**
|
|
33
|
-
* 创建 TrafficManager 实例
|
|
34
|
-
*
|
|
35
|
-
* @param apiServer - API 服务器地址(默认 127.0.0.1)
|
|
36
|
-
* @param apiPort - API 端口(默认 10085)
|
|
37
|
-
*/
|
|
38
|
-
constructor(apiServer?: string, apiPort?: number);
|
|
39
|
-
/**
|
|
40
|
-
* 从 Xray 配置中读取 API 端口
|
|
41
|
-
*/
|
|
42
|
-
private detectApiPortFromConfig;
|
|
43
|
-
/**
|
|
44
|
-
* 从配额配置中同步 API 端口
|
|
45
|
-
*/
|
|
46
|
-
private syncApiPort;
|
|
47
|
-
/**
|
|
48
|
-
* 获取 API 服务器地址
|
|
49
|
-
*/
|
|
50
|
-
getServerAddress(): string;
|
|
51
|
-
/**
|
|
52
|
-
* 检查 Xray Stats API 是否可用
|
|
53
|
-
*
|
|
54
|
-
* @returns 是否可用
|
|
55
|
-
*/
|
|
56
|
-
isStatsAvailable(): Promise<boolean>;
|
|
57
|
-
/**
|
|
58
|
-
* 判断流量统计是否可用(含 policy 检查)
|
|
59
|
-
*/
|
|
60
|
-
isUsageAvailable(): Promise<boolean>;
|
|
61
|
-
/**
|
|
62
|
-
* 执行 Xray stats 命令
|
|
63
|
-
*
|
|
64
|
-
* @param name - 统计名称
|
|
65
|
-
* @returns 统计值(字节数)
|
|
66
|
-
*/
|
|
67
|
-
private queryStats;
|
|
68
|
-
/**
|
|
69
|
-
* 检查用户流量统计策略是否启用
|
|
70
|
-
*/
|
|
71
|
-
private hasUserStatsPolicy;
|
|
72
|
-
/**
|
|
73
|
-
* 获取用户流量使用情况
|
|
74
|
-
*
|
|
75
|
-
* @param email - 用户邮箱
|
|
76
|
-
* @returns 流量使用数据,服务未运行时返回 null
|
|
77
|
-
*/
|
|
78
|
-
getUsage(email: string): Promise<TrafficUsage | null>;
|
|
79
|
-
/**
|
|
80
|
-
* 获取所有用户流量使用情况
|
|
81
|
-
*
|
|
82
|
-
* @returns 所有用户的流量数据
|
|
83
|
-
*/
|
|
84
|
-
getAllUsage(): Promise<TrafficUsage[]>;
|
|
85
|
-
/**
|
|
86
|
-
* 重置用户流量统计(查询并重置)
|
|
87
|
-
*
|
|
88
|
-
* @param email - 用户邮箱
|
|
89
|
-
* @returns 重置前的流量数据
|
|
90
|
-
*/
|
|
91
|
-
resetUserStats(email: string): Promise<TrafficUsage | null>;
|
|
92
|
-
/**
|
|
93
|
-
* 检测 Xray Stats API 配置状态
|
|
94
|
-
*
|
|
95
|
-
* @param configPath - Xray 配置文件路径
|
|
96
|
-
* @returns 检测结果
|
|
97
|
-
*/
|
|
98
|
-
detectStatsConfig(configPath?: string): Promise<StatsDetectionResult>;
|
|
99
|
-
/**
|
|
100
|
-
* 获取 Stats API 状态的友好提示信息
|
|
101
|
-
*
|
|
102
|
-
* @returns 状态提示
|
|
103
|
-
*/
|
|
104
|
-
getStatusMessage(): Promise<string>;
|
|
105
|
-
}
|
|
106
|
-
//# sourceMappingURL=traffic-manager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"traffic-manager.d.ts","sourceRoot":"","sources":["../../src/services/traffic-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,gBAAgB,CAAC;AAWtE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,eAAe;IACf,SAAS,EAAE,OAAO,CAAC;IAEnB,qBAAqB;IACrB,cAAc,EAAE,OAAO,CAAC;IAExB,kBAAkB;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,aAAa;IACb,cAAc,EAAE,OAAO,CAAC;IAExB,WAAW;IACX,OAAO,EAAE,MAAM,CAAC;IAEhB,WAAW;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAOD;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;IAExB;;;;;OAKG;gBACS,SAAS,GAAE,MAA2B,EAAE,OAAO,GAAE,MAAyB;IAKtF;;OAEG;YACW,uBAAuB;IAoBrC;;OAEG;YACW,WAAW;IAsBzB;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;;;OAIG;IACG,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IAc1C;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IAS1C;;;;;OAKG;YACW,UAAU;IAYxB;;OAEG;YACW,kBAAkB;IAqBhC;;;;;OAKG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IA4B3D;;;;OAIG;IACG,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAuD5C;;;;;OAKG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAoCjE;;;;;OAKG;IACG,iBAAiB,CACrB,UAAU,GAAE,MAAiC,GAC5C,OAAO,CAAC,oBAAoB,CAAC;IA2FhC;;;;OAIG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;CA0B1C"}
|