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,443 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* StatsConfigManager - Xray Stats API 配置管理
|
|
4
|
-
*
|
|
5
|
-
* 提供自动检测、配置、备份和回滚 Stats API 的功能
|
|
6
|
-
*
|
|
7
|
-
* @module services/stats-config-manager
|
|
8
|
-
*/
|
|
9
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.StatsConfigManager = void 0;
|
|
11
|
-
const net_1 = require("net");
|
|
12
|
-
const child_process_1 = require("child_process");
|
|
13
|
-
const util_1 = require("util");
|
|
14
|
-
const config_manager_1 = require("./config-manager");
|
|
15
|
-
const systemd_manager_1 = require("./systemd-manager");
|
|
16
|
-
const paths_1 = require("../constants/paths");
|
|
17
|
-
const quota_1 = require("../constants/quota");
|
|
18
|
-
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
19
|
-
/**
|
|
20
|
-
* StatsConfigManager - Stats API 配置管理服务
|
|
21
|
-
*/
|
|
22
|
-
class StatsConfigManager {
|
|
23
|
-
/**
|
|
24
|
-
* 创建 StatsConfigManager 实例
|
|
25
|
-
*
|
|
26
|
-
* @param configPath - Xray 配置文件路径
|
|
27
|
-
* @param serviceName - systemd 服务名称
|
|
28
|
-
*/
|
|
29
|
-
constructor(configPath, serviceName) {
|
|
30
|
-
this.configPath = configPath || paths_1.DEFAULT_PATHS.CONFIG_FILE;
|
|
31
|
-
this.configManager = new config_manager_1.ConfigManager(this.configPath);
|
|
32
|
-
this.systemdManager = new systemd_manager_1.SystemdManager(serviceName || paths_1.DEFAULT_PATHS.SERVICE_NAME);
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* 检测缺失的 Stats API 配置组件
|
|
36
|
-
*
|
|
37
|
-
* @returns 缺失组件列表
|
|
38
|
-
*/
|
|
39
|
-
async detectMissingComponents() {
|
|
40
|
-
const missing = [];
|
|
41
|
-
try {
|
|
42
|
-
const config = (await this.configManager.readConfig());
|
|
43
|
-
// 检查 stats 配置
|
|
44
|
-
if (!config.stats) {
|
|
45
|
-
missing.push('stats');
|
|
46
|
-
}
|
|
47
|
-
// 检查 policy 配置(用户流量统计)
|
|
48
|
-
const levels = config.policy?.levels;
|
|
49
|
-
const hasUserStatsPolicy = levels
|
|
50
|
-
? Object.values(levels).some((level) => level?.statsUserUplink === true && level?.statsUserDownlink === true)
|
|
51
|
-
: false;
|
|
52
|
-
if (!hasUserStatsPolicy) {
|
|
53
|
-
missing.push('policy');
|
|
54
|
-
}
|
|
55
|
-
// 检查 api 配置
|
|
56
|
-
if (!config.api || !config.api.services?.includes('StatsService')) {
|
|
57
|
-
missing.push('api');
|
|
58
|
-
}
|
|
59
|
-
// 检查 api inbound
|
|
60
|
-
const hasApiInbound = config.inbounds?.some((inbound) => inbound.tag === 'api' && inbound.protocol === 'dokodemo-door');
|
|
61
|
-
if (!hasApiInbound) {
|
|
62
|
-
missing.push('api-inbound');
|
|
63
|
-
}
|
|
64
|
-
// 检查 api outbound
|
|
65
|
-
const hasApiOutbound = config.outbounds?.some((outbound) => outbound.tag === 'api');
|
|
66
|
-
if (!hasApiOutbound) {
|
|
67
|
-
missing.push('api-outbound');
|
|
68
|
-
}
|
|
69
|
-
// 检查 api 路由规则
|
|
70
|
-
const hasApiRouting = config.routing?.rules?.some((rule) => rule.inboundTag?.includes('api') && rule.outboundTag === 'api');
|
|
71
|
-
if (!hasApiRouting) {
|
|
72
|
-
missing.push('api-routing');
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
catch {
|
|
76
|
-
// 配置文件不存在或无法读取,所有组件都缺失
|
|
77
|
-
return ['stats', 'policy', 'api', 'api-inbound', 'api-outbound', 'api-routing'];
|
|
78
|
-
}
|
|
79
|
-
return missing;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* 检测端口是否可用
|
|
83
|
-
*
|
|
84
|
-
* @param port - 要检测的端口
|
|
85
|
-
* @returns 端口是否可用
|
|
86
|
-
*/
|
|
87
|
-
async isPortAvailable(port) {
|
|
88
|
-
return new Promise((resolve) => {
|
|
89
|
-
const server = (0, net_1.createServer)();
|
|
90
|
-
server.once('error', () => {
|
|
91
|
-
resolve(false);
|
|
92
|
-
});
|
|
93
|
-
server.once('listening', () => {
|
|
94
|
-
server.close();
|
|
95
|
-
resolve(true);
|
|
96
|
-
});
|
|
97
|
-
server.listen(port, quota_1.DEFAULT_API_SERVER);
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* 查找可用端口
|
|
102
|
-
*
|
|
103
|
-
* @param startPort - 起始端口
|
|
104
|
-
* @returns 可用端口,如果没有可用端口则返回 null
|
|
105
|
-
*/
|
|
106
|
-
async findAvailablePort(startPort = quota_1.DEFAULT_API_PORT) {
|
|
107
|
-
for (let port = startPort; port <= quota_1.STATS_PORT_RANGE.END; port++) {
|
|
108
|
-
// 检查端口是否被系统占用
|
|
109
|
-
const available = await this.isPortAvailable(port);
|
|
110
|
-
if (!available) {
|
|
111
|
-
continue;
|
|
112
|
-
}
|
|
113
|
-
// 检查端口是否已被 Xray 配置使用
|
|
114
|
-
try {
|
|
115
|
-
const config = (await this.configManager.readConfig());
|
|
116
|
-
const portInUse = config.inbounds?.some((inbound) => inbound.port === port);
|
|
117
|
-
if (portInUse) {
|
|
118
|
-
continue;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
catch {
|
|
122
|
-
// 配置文件不存在,端口可用
|
|
123
|
-
}
|
|
124
|
-
return port;
|
|
125
|
-
}
|
|
126
|
-
return null;
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* 生成 Stats API 配置对象
|
|
130
|
-
*
|
|
131
|
-
* @param port - API 端口
|
|
132
|
-
* @returns Stats API 配置对象
|
|
133
|
-
*/
|
|
134
|
-
generateStatsConfig(port = quota_1.DEFAULT_API_PORT) {
|
|
135
|
-
return {
|
|
136
|
-
stats: {},
|
|
137
|
-
policy: {
|
|
138
|
-
levels: {
|
|
139
|
-
...quota_1.DEFAULT_STATS_CONFIG.policy.levels,
|
|
140
|
-
},
|
|
141
|
-
system: {
|
|
142
|
-
...quota_1.DEFAULT_STATS_CONFIG.policy.system,
|
|
143
|
-
},
|
|
144
|
-
},
|
|
145
|
-
api: {
|
|
146
|
-
tag: quota_1.DEFAULT_STATS_CONFIG.api.tag,
|
|
147
|
-
services: [...quota_1.DEFAULT_STATS_CONFIG.api.services],
|
|
148
|
-
},
|
|
149
|
-
apiInbound: {
|
|
150
|
-
tag: quota_1.DEFAULT_STATS_CONFIG.apiInbound.tag,
|
|
151
|
-
port,
|
|
152
|
-
listen: quota_1.DEFAULT_STATS_CONFIG.apiInbound.listen,
|
|
153
|
-
protocol: quota_1.DEFAULT_STATS_CONFIG.apiInbound.protocol,
|
|
154
|
-
settings: {
|
|
155
|
-
address: quota_1.DEFAULT_STATS_CONFIG.apiInbound.settings.address,
|
|
156
|
-
},
|
|
157
|
-
},
|
|
158
|
-
apiOutbound: {
|
|
159
|
-
protocol: quota_1.DEFAULT_STATS_CONFIG.apiOutbound.protocol,
|
|
160
|
-
tag: quota_1.DEFAULT_STATS_CONFIG.apiOutbound.tag,
|
|
161
|
-
},
|
|
162
|
-
apiRoutingRule: {
|
|
163
|
-
type: quota_1.DEFAULT_STATS_CONFIG.apiRoutingRule.type,
|
|
164
|
-
inboundTag: [...quota_1.DEFAULT_STATS_CONFIG.apiRoutingRule.inboundTag],
|
|
165
|
-
outboundTag: quota_1.DEFAULT_STATS_CONFIG.apiRoutingRule.outboundTag,
|
|
166
|
-
},
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* 智能合并 Stats 配置到现有配置
|
|
171
|
-
*
|
|
172
|
-
* @param config - 现有配置
|
|
173
|
-
* @param statsConfig - Stats 配置
|
|
174
|
-
* @returns 合并后的配置
|
|
175
|
-
*/
|
|
176
|
-
mergeStatsConfig(config, statsConfig) {
|
|
177
|
-
const merged = { ...config };
|
|
178
|
-
// 添加 stats 配置(如果不存在)
|
|
179
|
-
if (!merged.stats) {
|
|
180
|
-
merged.stats = statsConfig.stats;
|
|
181
|
-
}
|
|
182
|
-
// 添加或更新 policy 配置(用户流量统计)
|
|
183
|
-
if (!merged.policy) {
|
|
184
|
-
merged.policy = statsConfig.policy;
|
|
185
|
-
}
|
|
186
|
-
else {
|
|
187
|
-
const hasLevels = !!merged.policy.levels && Object.keys(merged.policy.levels).length > 0;
|
|
188
|
-
const levels = hasLevels ? { ...merged.policy.levels } : { ...statsConfig.policy.levels };
|
|
189
|
-
for (const levelKey of Object.keys(levels)) {
|
|
190
|
-
levels[levelKey] = {
|
|
191
|
-
...levels[levelKey],
|
|
192
|
-
statsUserUplink: true,
|
|
193
|
-
statsUserDownlink: true,
|
|
194
|
-
};
|
|
195
|
-
}
|
|
196
|
-
merged.policy.levels = levels;
|
|
197
|
-
merged.policy.system = {
|
|
198
|
-
...(merged.policy.system || {}),
|
|
199
|
-
statsInboundUplink: true,
|
|
200
|
-
statsInboundDownlink: true,
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
// 添加或更新 api 配置
|
|
204
|
-
if (!merged.api) {
|
|
205
|
-
merged.api = statsConfig.api;
|
|
206
|
-
}
|
|
207
|
-
else if (!merged.api.services.includes('StatsService')) {
|
|
208
|
-
merged.api.services = [...merged.api.services, 'StatsService'];
|
|
209
|
-
}
|
|
210
|
-
// 添加 api inbound(如果不存在)
|
|
211
|
-
const hasApiInbound = merged.inbounds?.some((inbound) => inbound.tag === 'api' && inbound.protocol === 'dokodemo-door');
|
|
212
|
-
if (!hasApiInbound) {
|
|
213
|
-
merged.inbounds = [...(merged.inbounds || []), statsConfig.apiInbound];
|
|
214
|
-
}
|
|
215
|
-
// 添加 api outbound(如果不存在)
|
|
216
|
-
const hasApiOutbound = merged.outbounds?.some((outbound) => outbound.tag === 'api');
|
|
217
|
-
if (!hasApiOutbound) {
|
|
218
|
-
merged.outbounds = [...(merged.outbounds || []), statsConfig.apiOutbound];
|
|
219
|
-
}
|
|
220
|
-
// 添加 api 路由规则(如果不存在)
|
|
221
|
-
if (!merged.routing) {
|
|
222
|
-
merged.routing = { rules: [] };
|
|
223
|
-
}
|
|
224
|
-
if (!merged.routing.rules) {
|
|
225
|
-
merged.routing.rules = [];
|
|
226
|
-
}
|
|
227
|
-
const hasApiRouting = merged.routing.rules.some((rule) => rule.inboundTag?.includes('api') && rule.outboundTag === 'api');
|
|
228
|
-
if (!hasApiRouting) {
|
|
229
|
-
merged.routing.rules = [statsConfig.apiRoutingRule, ...merged.routing.rules];
|
|
230
|
-
}
|
|
231
|
-
return merged;
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* 验证 Stats API 连接
|
|
235
|
-
*
|
|
236
|
-
* @param port - API 端口
|
|
237
|
-
* @returns 是否可连接
|
|
238
|
-
*/
|
|
239
|
-
async verifyStatsApiConnection(port = quota_1.DEFAULT_API_PORT) {
|
|
240
|
-
try {
|
|
241
|
-
const { stdout } = await execAsync(`${quota_1.XRAY_STATS_COMMAND} api statsquery --server=${quota_1.DEFAULT_API_SERVER}:${port} 2>/dev/null`, { timeout: quota_1.STATS_API_TIMEOUT });
|
|
242
|
-
// 如果命令成功执行并返回 JSON,则 API 可用
|
|
243
|
-
JSON.parse(stdout || '{}');
|
|
244
|
-
return true;
|
|
245
|
-
}
|
|
246
|
-
catch {
|
|
247
|
-
return false;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* 备份配置文件
|
|
252
|
-
*
|
|
253
|
-
* @returns 备份文件路径
|
|
254
|
-
*/
|
|
255
|
-
async backupBeforeModify() {
|
|
256
|
-
return await this.configManager.backupConfig();
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* 回滚配置并重启服务
|
|
260
|
-
*
|
|
261
|
-
* @param backupPath - 备份文件路径
|
|
262
|
-
*/
|
|
263
|
-
async rollbackOnFailure(backupPath) {
|
|
264
|
-
await this.configManager.restoreConfig(backupPath);
|
|
265
|
-
await this.systemdManager.restart();
|
|
266
|
-
}
|
|
267
|
-
/**
|
|
268
|
-
* 重启服务并验证状态
|
|
269
|
-
*
|
|
270
|
-
* @returns 服务是否正常运行
|
|
271
|
-
*/
|
|
272
|
-
async restartAndVerify() {
|
|
273
|
-
try {
|
|
274
|
-
await this.systemdManager.restart();
|
|
275
|
-
// 等待服务启动
|
|
276
|
-
await new Promise((resolve) => setTimeout(resolve, quota_1.SERVICE_RESTART_WAIT));
|
|
277
|
-
// 检查服务状态
|
|
278
|
-
const status = await this.systemdManager.getStatus();
|
|
279
|
-
return status.active;
|
|
280
|
-
}
|
|
281
|
-
catch {
|
|
282
|
-
return false;
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* 检测 Stats API 状态
|
|
287
|
-
*
|
|
288
|
-
* @returns 检测结果
|
|
289
|
-
*/
|
|
290
|
-
async detectStatsConfig() {
|
|
291
|
-
const missingComponents = await this.detectMissingComponents();
|
|
292
|
-
let serviceRunning = false;
|
|
293
|
-
try {
|
|
294
|
-
const status = await this.systemdManager.getStatus();
|
|
295
|
-
serviceRunning = status.active;
|
|
296
|
-
}
|
|
297
|
-
catch {
|
|
298
|
-
serviceRunning = false;
|
|
299
|
-
}
|
|
300
|
-
// 如果所有组件都存在,尝试连接 API
|
|
301
|
-
if (missingComponents.length === 0 && serviceRunning) {
|
|
302
|
-
// 获取配置的端口
|
|
303
|
-
let detectedPort = quota_1.DEFAULT_API_PORT;
|
|
304
|
-
try {
|
|
305
|
-
const config = (await this.configManager.readConfig());
|
|
306
|
-
const apiInbound = config.inbounds?.find((inbound) => inbound.tag === 'api' && inbound.protocol === 'dokodemo-door');
|
|
307
|
-
if (apiInbound) {
|
|
308
|
-
detectedPort = apiInbound.port;
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
catch {
|
|
312
|
-
// 使用默认端口
|
|
313
|
-
}
|
|
314
|
-
const available = await this.verifyStatsApiConnection(detectedPort);
|
|
315
|
-
return {
|
|
316
|
-
available,
|
|
317
|
-
configDetected: true,
|
|
318
|
-
detectedPort,
|
|
319
|
-
serviceRunning,
|
|
320
|
-
message: available ? 'Stats API 已配置且可用' : 'Stats API 已配置但无法连接',
|
|
321
|
-
suggestion: available ? undefined : '请检查 Xray 服务状态和防火墙设置',
|
|
322
|
-
missingComponents: [],
|
|
323
|
-
};
|
|
324
|
-
}
|
|
325
|
-
// 有缺失组件
|
|
326
|
-
const componentNames = {
|
|
327
|
-
stats: 'stats 配置块',
|
|
328
|
-
policy: 'policy 配置',
|
|
329
|
-
api: 'API 配置',
|
|
330
|
-
'api-inbound': 'API 入站配置',
|
|
331
|
-
'api-outbound': 'API 出站配置',
|
|
332
|
-
'api-routing': 'API 路由规则',
|
|
333
|
-
};
|
|
334
|
-
const missingNames = missingComponents.map((c) => componentNames[c]).join('、');
|
|
335
|
-
return {
|
|
336
|
-
available: false,
|
|
337
|
-
configDetected: missingComponents.length < 6,
|
|
338
|
-
serviceRunning,
|
|
339
|
-
message: `Stats API 未完全配置,缺少: ${missingNames}`,
|
|
340
|
-
suggestion: '是否自动配置 Stats API?',
|
|
341
|
-
missingComponents,
|
|
342
|
-
};
|
|
343
|
-
}
|
|
344
|
-
/**
|
|
345
|
-
* 启用 Stats API(主方法)
|
|
346
|
-
*
|
|
347
|
-
* @returns 配置结果
|
|
348
|
-
*/
|
|
349
|
-
async enableStatsApi() {
|
|
350
|
-
let backupPath;
|
|
351
|
-
try {
|
|
352
|
-
// 1. 查找可用端口
|
|
353
|
-
const port = await this.findAvailablePort();
|
|
354
|
-
if (!port) {
|
|
355
|
-
return {
|
|
356
|
-
success: false,
|
|
357
|
-
apiPort: quota_1.DEFAULT_API_PORT,
|
|
358
|
-
message: '无法找到可用端口',
|
|
359
|
-
error: `端口范围 ${quota_1.STATS_PORT_RANGE.START}-${quota_1.STATS_PORT_RANGE.END} 均被占用`,
|
|
360
|
-
rolledBack: false,
|
|
361
|
-
};
|
|
362
|
-
}
|
|
363
|
-
// 2. 备份配置
|
|
364
|
-
backupPath = await this.backupBeforeModify();
|
|
365
|
-
// 3. 读取现有配置
|
|
366
|
-
const config = (await this.configManager.readConfig());
|
|
367
|
-
// 4. 生成并合并 Stats 配置
|
|
368
|
-
const statsConfig = this.generateStatsConfig(port);
|
|
369
|
-
const mergedConfig = this.mergeStatsConfig(config, statsConfig);
|
|
370
|
-
// 5. 写入配置 (cast to unknown first to bypass strict type checking)
|
|
371
|
-
await this.configManager.writeConfig(mergedConfig);
|
|
372
|
-
// 6. 重启服务
|
|
373
|
-
const serviceOk = await this.restartAndVerify();
|
|
374
|
-
if (!serviceOk) {
|
|
375
|
-
// 服务重启失败,回滚
|
|
376
|
-
await this.rollbackOnFailure(backupPath);
|
|
377
|
-
return {
|
|
378
|
-
success: false,
|
|
379
|
-
backupPath,
|
|
380
|
-
apiPort: port,
|
|
381
|
-
message: '服务重启失败,已恢复原配置',
|
|
382
|
-
error: 'Xray 服务启动失败,请检查配置文件',
|
|
383
|
-
rolledBack: true,
|
|
384
|
-
};
|
|
385
|
-
}
|
|
386
|
-
// 7. 验证 API 连接
|
|
387
|
-
const apiOk = await this.verifyStatsApiConnection(port);
|
|
388
|
-
if (!apiOk) {
|
|
389
|
-
// API 无法连接,但服务运行正常,不回滚
|
|
390
|
-
return {
|
|
391
|
-
success: true,
|
|
392
|
-
backupPath,
|
|
393
|
-
apiPort: port,
|
|
394
|
-
message: 'Stats API 配置成功,但连接验证失败',
|
|
395
|
-
error: 'API 可能需要几秒钟才能就绪,或检查防火墙设置',
|
|
396
|
-
rolledBack: false,
|
|
397
|
-
};
|
|
398
|
-
}
|
|
399
|
-
return {
|
|
400
|
-
success: true,
|
|
401
|
-
backupPath,
|
|
402
|
-
apiPort: port,
|
|
403
|
-
message: 'Stats API 配置成功!',
|
|
404
|
-
rolledBack: false,
|
|
405
|
-
};
|
|
406
|
-
}
|
|
407
|
-
catch (error) {
|
|
408
|
-
// 发生错误,尝试回滚
|
|
409
|
-
if (backupPath) {
|
|
410
|
-
try {
|
|
411
|
-
await this.rollbackOnFailure(backupPath);
|
|
412
|
-
return {
|
|
413
|
-
success: false,
|
|
414
|
-
backupPath,
|
|
415
|
-
apiPort: quota_1.DEFAULT_API_PORT,
|
|
416
|
-
message: '配置失败,已恢复原配置',
|
|
417
|
-
error: error.message,
|
|
418
|
-
rolledBack: true,
|
|
419
|
-
};
|
|
420
|
-
}
|
|
421
|
-
catch (rollbackError) {
|
|
422
|
-
return {
|
|
423
|
-
success: false,
|
|
424
|
-
backupPath,
|
|
425
|
-
apiPort: quota_1.DEFAULT_API_PORT,
|
|
426
|
-
message: '配置失败,回滚也失败',
|
|
427
|
-
error: `原错误: ${error.message}; 回滚错误: ${rollbackError.message}`,
|
|
428
|
-
rolledBack: false,
|
|
429
|
-
};
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
return {
|
|
433
|
-
success: false,
|
|
434
|
-
apiPort: quota_1.DEFAULT_API_PORT,
|
|
435
|
-
message: '配置失败',
|
|
436
|
-
error: error.message,
|
|
437
|
-
rolledBack: false,
|
|
438
|
-
};
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
exports.StatsConfigManager = StatsConfigManager;
|
|
443
|
-
//# sourceMappingURL=stats-config-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stats-config-manager.js","sourceRoot":"","sources":["../../src/services/stats-config-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SystemdManager - Service Management via systemctl
|
|
3
|
-
*
|
|
4
|
-
* Provides safe interface to systemd service management with:
|
|
5
|
-
* - Command injection prevention
|
|
6
|
-
* - Action and service name validation
|
|
7
|
-
* - Graceful shutdown with configurable timeout
|
|
8
|
-
* - Detailed status parsing
|
|
9
|
-
*
|
|
10
|
-
* @module services/systemd-manager
|
|
11
|
-
*/
|
|
12
|
-
/**
|
|
13
|
-
* Service status information
|
|
14
|
-
*/
|
|
15
|
-
export interface ServiceStatus {
|
|
16
|
-
/** Service name */
|
|
17
|
-
serviceName: string;
|
|
18
|
-
/** Whether service is active */
|
|
19
|
-
active: boolean;
|
|
20
|
-
/** Active state (active, inactive, failed, etc.) */
|
|
21
|
-
activeState: string;
|
|
22
|
-
/** Sub state (running, dead, failed, etc.) */
|
|
23
|
-
subState: string;
|
|
24
|
-
/** Whether service is loaded */
|
|
25
|
-
loaded: boolean;
|
|
26
|
-
/** Whether service is healthy */
|
|
27
|
-
healthy: boolean;
|
|
28
|
-
/** Main process PID (null if not running) */
|
|
29
|
-
pid: number | null;
|
|
30
|
-
/** Memory usage (formatted string) */
|
|
31
|
-
memory?: string;
|
|
32
|
-
/** Number of restarts */
|
|
33
|
-
restarts?: number;
|
|
34
|
-
/** Uptime (formatted string) */
|
|
35
|
-
uptime?: string;
|
|
36
|
-
/** Start timestamp */
|
|
37
|
-
startTime?: Date;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Service operation result
|
|
41
|
-
*/
|
|
42
|
-
export interface ServiceOperationResult {
|
|
43
|
-
/** Whether operation succeeded */
|
|
44
|
-
success: boolean;
|
|
45
|
-
/** Operation type */
|
|
46
|
-
operation: string;
|
|
47
|
-
/** Service name */
|
|
48
|
-
serviceName: string;
|
|
49
|
-
/** Exit code */
|
|
50
|
-
exitCode: number;
|
|
51
|
-
/** Duration in milliseconds */
|
|
52
|
-
duration: number;
|
|
53
|
-
/** Downtime in milliseconds (for restart) */
|
|
54
|
-
downtime?: number;
|
|
55
|
-
/** Standard output */
|
|
56
|
-
stdout?: string;
|
|
57
|
-
/** Standard error */
|
|
58
|
-
stderr?: string;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Systemctl execution options
|
|
62
|
-
*/
|
|
63
|
-
export interface SystemctlOptions {
|
|
64
|
-
/** Timeout in milliseconds */
|
|
65
|
-
timeout?: number;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Restart options
|
|
69
|
-
*/
|
|
70
|
-
export interface RestartOptions {
|
|
71
|
-
/** Graceful shutdown timeout in milliseconds */
|
|
72
|
-
gracefulTimeout?: number;
|
|
73
|
-
/** Whether to wait for active connections to complete */
|
|
74
|
-
waitForConnections?: boolean;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* SystemdManager - Safe systemctl wrapper
|
|
78
|
-
*/
|
|
79
|
-
export declare class SystemdManager {
|
|
80
|
-
private serviceName;
|
|
81
|
-
/** Valid systemctl actions (whitelist) */
|
|
82
|
-
private static readonly VALID_ACTIONS;
|
|
83
|
-
/**
|
|
84
|
-
* Create a new SystemdManager
|
|
85
|
-
*
|
|
86
|
-
* @param serviceName - Service name to manage
|
|
87
|
-
* @throws Error if service name is invalid
|
|
88
|
-
*/
|
|
89
|
-
constructor(serviceName: string);
|
|
90
|
-
/**
|
|
91
|
-
* Validate service name
|
|
92
|
-
*
|
|
93
|
-
* @param name - Service name to validate
|
|
94
|
-
* @throws Error if service name is invalid
|
|
95
|
-
*/
|
|
96
|
-
private validateServiceName;
|
|
97
|
-
/**
|
|
98
|
-
* Validate systemctl action
|
|
99
|
-
*
|
|
100
|
-
* @param action - Action to validate
|
|
101
|
-
* @throws Error if action is invalid
|
|
102
|
-
*/
|
|
103
|
-
validateAction(action: string): void;
|
|
104
|
-
/**
|
|
105
|
-
* Execute systemctl command
|
|
106
|
-
*
|
|
107
|
-
* @param action - Systemctl action to execute
|
|
108
|
-
* @param options - Execution options
|
|
109
|
-
* @returns Command output
|
|
110
|
-
*/
|
|
111
|
-
executeSystemctl(action: string, options?: SystemctlOptions): Promise<string>;
|
|
112
|
-
/**
|
|
113
|
-
* Parse systemd error messages and provide suggestions
|
|
114
|
-
*
|
|
115
|
-
* @param errorOutput - Error output from systemctl
|
|
116
|
-
* @param action - Action that was attempted
|
|
117
|
-
* @returns User-friendly error message with suggestions
|
|
118
|
-
*/
|
|
119
|
-
private parseSystemdError;
|
|
120
|
-
/**
|
|
121
|
-
* Parse systemctl show output
|
|
122
|
-
*
|
|
123
|
-
* @param output - Raw output from systemctl show
|
|
124
|
-
* @returns Parsed service status
|
|
125
|
-
*/
|
|
126
|
-
parseSystemdShow(output: string): ServiceStatus;
|
|
127
|
-
/**
|
|
128
|
-
* Format bytes to human-readable string
|
|
129
|
-
*
|
|
130
|
-
* @param bytes - Number of bytes
|
|
131
|
-
* @returns Formatted string (e.g., "45.2 MB")
|
|
132
|
-
*/
|
|
133
|
-
private formatBytes;
|
|
134
|
-
/**
|
|
135
|
-
* Format uptime in milliseconds to human-readable string
|
|
136
|
-
*
|
|
137
|
-
* @param ms - Uptime in milliseconds
|
|
138
|
-
* @returns Formatted string (e.g., "2小时15分钟")
|
|
139
|
-
*/
|
|
140
|
-
private formatUptime;
|
|
141
|
-
/**
|
|
142
|
-
* Get service status
|
|
143
|
-
*
|
|
144
|
-
* @returns Service status information
|
|
145
|
-
*/
|
|
146
|
-
getStatus(): Promise<ServiceStatus>;
|
|
147
|
-
/**
|
|
148
|
-
* Start service
|
|
149
|
-
*
|
|
150
|
-
* @returns Operation result
|
|
151
|
-
*/
|
|
152
|
-
start(): Promise<ServiceOperationResult>;
|
|
153
|
-
/**
|
|
154
|
-
* Stop service
|
|
155
|
-
*
|
|
156
|
-
* @returns Operation result
|
|
157
|
-
*/
|
|
158
|
-
stop(): Promise<ServiceOperationResult>;
|
|
159
|
-
/**
|
|
160
|
-
* Restart service with graceful shutdown
|
|
161
|
-
*
|
|
162
|
-
* @param options - Restart options
|
|
163
|
-
* @returns Operation result
|
|
164
|
-
*/
|
|
165
|
-
restart(options?: RestartOptions): Promise<ServiceOperationResult>;
|
|
166
|
-
/**
|
|
167
|
-
* Wait for service to be ready after start/restart
|
|
168
|
-
*
|
|
169
|
-
* @param maxWait - Maximum time to wait in milliseconds
|
|
170
|
-
*/
|
|
171
|
-
private waitForServiceReady;
|
|
172
|
-
/**
|
|
173
|
-
* Check if running as root
|
|
174
|
-
*
|
|
175
|
-
* @returns True if running as root
|
|
176
|
-
*/
|
|
177
|
-
isRoot(): boolean;
|
|
178
|
-
/**
|
|
179
|
-
* Check if sudo is available
|
|
180
|
-
*
|
|
181
|
-
* @returns True if sudo is available
|
|
182
|
-
*/
|
|
183
|
-
canUseSudo(): Promise<boolean>;
|
|
184
|
-
/**
|
|
185
|
-
* Get permission warning message
|
|
186
|
-
*
|
|
187
|
-
* @returns Warning message if not running with sufficient permissions
|
|
188
|
-
*/
|
|
189
|
-
getPermissionWarning(): string | undefined;
|
|
190
|
-
/**
|
|
191
|
-
* Estimate downtime for restart operation
|
|
192
|
-
*
|
|
193
|
-
* @returns Estimated downtime in milliseconds
|
|
194
|
-
*/
|
|
195
|
-
estimateDowntime(): number;
|
|
196
|
-
}
|
|
197
|
-
//# sourceMappingURL=systemd-manager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"systemd-manager.d.ts","sourceRoot":"","sources":["../../src/services/systemd-manager.ts"],"names":[],"mappings":"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"}
|