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,368 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* TrafficManager - 流量统计服务
|
|
4
|
-
*
|
|
5
|
-
* 通过 Xray Stats API 获取用户流量使用情况
|
|
6
|
-
*
|
|
7
|
-
* @module services/traffic-manager
|
|
8
|
-
*/
|
|
9
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.TrafficManager = void 0;
|
|
11
|
-
const child_process_1 = require("child_process");
|
|
12
|
-
const util_1 = require("util");
|
|
13
|
-
const fs_1 = require("fs");
|
|
14
|
-
const promises_1 = require("fs/promises");
|
|
15
|
-
const quota_manager_1 = require("./quota-manager");
|
|
16
|
-
const quota_1 = require("../constants/quota");
|
|
17
|
-
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
18
|
-
/**
|
|
19
|
-
* 默认 Xray 配置路径
|
|
20
|
-
*/
|
|
21
|
-
const DEFAULT_XRAY_CONFIG_PATH = '/usr/local/etc/xray/config.json';
|
|
22
|
-
/**
|
|
23
|
-
* TrafficManager - 管理 Xray 流量统计
|
|
24
|
-
*/
|
|
25
|
-
class TrafficManager {
|
|
26
|
-
/**
|
|
27
|
-
* 创建 TrafficManager 实例
|
|
28
|
-
*
|
|
29
|
-
* @param apiServer - API 服务器地址(默认 127.0.0.1)
|
|
30
|
-
* @param apiPort - API 端口(默认 10085)
|
|
31
|
-
*/
|
|
32
|
-
constructor(apiServer = quota_1.DEFAULT_API_SERVER, apiPort = quota_1.DEFAULT_API_PORT) {
|
|
33
|
-
this.apiServer = apiServer;
|
|
34
|
-
this.apiPort = apiPort;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* 从 Xray 配置中读取 API 端口
|
|
38
|
-
*/
|
|
39
|
-
async detectApiPortFromConfig(configPath = DEFAULT_XRAY_CONFIG_PATH) {
|
|
40
|
-
try {
|
|
41
|
-
const content = await (0, promises_1.readFile)(configPath, 'utf-8');
|
|
42
|
-
const config = JSON.parse(content);
|
|
43
|
-
const apiTag = config.api?.tag || 'api';
|
|
44
|
-
const apiInbound = config.inbounds?.find((inbound) => inbound.tag === apiTag);
|
|
45
|
-
const port = Number(apiInbound?.port);
|
|
46
|
-
if (Number.isInteger(port) && port >= 1 && port <= 65535) {
|
|
47
|
-
return port;
|
|
48
|
-
}
|
|
49
|
-
return null;
|
|
50
|
-
}
|
|
51
|
-
catch {
|
|
52
|
-
return null;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* 从配额配置中同步 API 端口
|
|
57
|
-
*/
|
|
58
|
-
async syncApiPort() {
|
|
59
|
-
let quotaPort = null;
|
|
60
|
-
try {
|
|
61
|
-
const quotaManager = new quota_manager_1.QuotaManager();
|
|
62
|
-
quotaPort = await quotaManager.getApiPort();
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
quotaPort = null;
|
|
66
|
-
}
|
|
67
|
-
const configPort = await this.detectApiPortFromConfig();
|
|
68
|
-
const resolvedPort = configPort ?? quotaPort;
|
|
69
|
-
if (typeof resolvedPort === 'number' &&
|
|
70
|
-
Number.isInteger(resolvedPort) &&
|
|
71
|
-
resolvedPort >= 1 &&
|
|
72
|
-
resolvedPort <= 65535) {
|
|
73
|
-
this.apiPort = resolvedPort;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* 获取 API 服务器地址
|
|
78
|
-
*/
|
|
79
|
-
getServerAddress() {
|
|
80
|
-
return `${this.apiServer}:${this.apiPort}`;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* 检查 Xray Stats API 是否可用
|
|
84
|
-
*
|
|
85
|
-
* @returns 是否可用
|
|
86
|
-
*/
|
|
87
|
-
async isStatsAvailable() {
|
|
88
|
-
try {
|
|
89
|
-
await this.syncApiPort();
|
|
90
|
-
const { stdout } = await execAsync(`${quota_1.XRAY_STATS_COMMAND} api statsquery --server=${this.getServerAddress()} 2>/dev/null`);
|
|
91
|
-
// 如果命令成功执行并返回 JSON,则 API 可用
|
|
92
|
-
JSON.parse(stdout || '{}');
|
|
93
|
-
return true;
|
|
94
|
-
}
|
|
95
|
-
catch {
|
|
96
|
-
return false;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* 判断流量统计是否可用(含 policy 检查)
|
|
101
|
-
*/
|
|
102
|
-
async isUsageAvailable() {
|
|
103
|
-
const [available, policyEnabled] = await Promise.all([
|
|
104
|
-
this.isStatsAvailable(),
|
|
105
|
-
this.hasUserStatsPolicy(),
|
|
106
|
-
]);
|
|
107
|
-
return available && policyEnabled;
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* 执行 Xray stats 命令
|
|
111
|
-
*
|
|
112
|
-
* @param name - 统计名称
|
|
113
|
-
* @returns 统计值(字节数)
|
|
114
|
-
*/
|
|
115
|
-
async queryStats(name) {
|
|
116
|
-
try {
|
|
117
|
-
const { stdout } = await execAsync(`${quota_1.XRAY_STATS_COMMAND} api stats --server=${this.getServerAddress()} -name "${name}" 2>/dev/null`);
|
|
118
|
-
const result = JSON.parse(stdout || '{}');
|
|
119
|
-
return Number(result.stat?.value) || 0;
|
|
120
|
-
}
|
|
121
|
-
catch {
|
|
122
|
-
return 0;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* 检查用户流量统计策略是否启用
|
|
127
|
-
*/
|
|
128
|
-
async hasUserStatsPolicy(configPath = DEFAULT_XRAY_CONFIG_PATH) {
|
|
129
|
-
try {
|
|
130
|
-
const content = await (0, promises_1.readFile)(configPath, 'utf-8');
|
|
131
|
-
const config = JSON.parse(content);
|
|
132
|
-
const levels = config.policy?.levels;
|
|
133
|
-
if (!levels) {
|
|
134
|
-
return false;
|
|
135
|
-
}
|
|
136
|
-
const levelValues = Object.values(levels);
|
|
137
|
-
return levelValues.some((level) => level?.statsUserUplink === true && level?.statsUserDownlink === true);
|
|
138
|
-
}
|
|
139
|
-
catch {
|
|
140
|
-
return false;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* 获取用户流量使用情况
|
|
145
|
-
*
|
|
146
|
-
* @param email - 用户邮箱
|
|
147
|
-
* @returns 流量使用数据,服务未运行时返回 null
|
|
148
|
-
*/
|
|
149
|
-
async getUsage(email) {
|
|
150
|
-
const available = await this.isStatsAvailable();
|
|
151
|
-
if (!available) {
|
|
152
|
-
return null;
|
|
153
|
-
}
|
|
154
|
-
const policyEnabled = await this.hasUserStatsPolicy();
|
|
155
|
-
if (!policyEnabled) {
|
|
156
|
-
return null;
|
|
157
|
-
}
|
|
158
|
-
const uplinkName = quota_1.STATS_PATTERNS.USER_UPLINK(email);
|
|
159
|
-
const downlinkName = quota_1.STATS_PATTERNS.USER_DOWNLINK(email);
|
|
160
|
-
const [uplink, downlink] = await Promise.all([
|
|
161
|
-
this.queryStats(uplinkName),
|
|
162
|
-
this.queryStats(downlinkName),
|
|
163
|
-
]);
|
|
164
|
-
return {
|
|
165
|
-
email,
|
|
166
|
-
uplink,
|
|
167
|
-
downlink,
|
|
168
|
-
total: uplink + downlink,
|
|
169
|
-
queriedAt: new Date().toISOString(),
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* 获取所有用户流量使用情况
|
|
174
|
-
*
|
|
175
|
-
* @returns 所有用户的流量数据
|
|
176
|
-
*/
|
|
177
|
-
async getAllUsage() {
|
|
178
|
-
const available = await this.isStatsAvailable();
|
|
179
|
-
if (!available) {
|
|
180
|
-
return [];
|
|
181
|
-
}
|
|
182
|
-
const policyEnabled = await this.hasUserStatsPolicy();
|
|
183
|
-
if (!policyEnabled) {
|
|
184
|
-
return [];
|
|
185
|
-
}
|
|
186
|
-
try {
|
|
187
|
-
const { stdout } = await execAsync(`${quota_1.XRAY_STATS_COMMAND} api statsquery --server=${this.getServerAddress()} 2>/dev/null`);
|
|
188
|
-
const response = JSON.parse(stdout || '{"stat":[]}');
|
|
189
|
-
// 解析所有用户流量
|
|
190
|
-
const userStats = new Map();
|
|
191
|
-
for (const stat of response.stat || []) {
|
|
192
|
-
const match = stat.name.match(/^user>>>(.+?)>>>traffic>>>(uplink|downlink)$/);
|
|
193
|
-
if (match) {
|
|
194
|
-
const email = match[1];
|
|
195
|
-
const direction = match[2];
|
|
196
|
-
if (!userStats.has(email)) {
|
|
197
|
-
userStats.set(email, { uplink: 0, downlink: 0 });
|
|
198
|
-
}
|
|
199
|
-
const stats = userStats.get(email);
|
|
200
|
-
stats[direction] = Number(stat.value) || 0;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
// 转换为 TrafficUsage 数组
|
|
204
|
-
const now = new Date().toISOString();
|
|
205
|
-
const usages = [];
|
|
206
|
-
for (const [email, stats] of userStats) {
|
|
207
|
-
usages.push({
|
|
208
|
-
email,
|
|
209
|
-
uplink: stats.uplink,
|
|
210
|
-
downlink: stats.downlink,
|
|
211
|
-
total: stats.uplink + stats.downlink,
|
|
212
|
-
queriedAt: now,
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
return usages;
|
|
216
|
-
}
|
|
217
|
-
catch {
|
|
218
|
-
return [];
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
/**
|
|
222
|
-
* 重置用户流量统计(查询并重置)
|
|
223
|
-
*
|
|
224
|
-
* @param email - 用户邮箱
|
|
225
|
-
* @returns 重置前的流量数据
|
|
226
|
-
*/
|
|
227
|
-
async resetUserStats(email) {
|
|
228
|
-
const available = await this.isStatsAvailable();
|
|
229
|
-
if (!available) {
|
|
230
|
-
return null;
|
|
231
|
-
}
|
|
232
|
-
const uplinkName = quota_1.STATS_PATTERNS.USER_UPLINK(email);
|
|
233
|
-
const downlinkName = quota_1.STATS_PATTERNS.USER_DOWNLINK(email);
|
|
234
|
-
// 使用 -reset 参数查询并重置
|
|
235
|
-
const queryAndReset = async (name) => {
|
|
236
|
-
try {
|
|
237
|
-
const { stdout } = await execAsync(`${quota_1.XRAY_STATS_COMMAND} api stats --server=${this.getServerAddress()} -name "${name}" -reset 2>/dev/null`);
|
|
238
|
-
const result = JSON.parse(stdout || '{}');
|
|
239
|
-
return Number(result.stat?.value) || 0;
|
|
240
|
-
}
|
|
241
|
-
catch {
|
|
242
|
-
return 0;
|
|
243
|
-
}
|
|
244
|
-
};
|
|
245
|
-
const [uplink, downlink] = await Promise.all([
|
|
246
|
-
queryAndReset(uplinkName),
|
|
247
|
-
queryAndReset(downlinkName),
|
|
248
|
-
]);
|
|
249
|
-
return {
|
|
250
|
-
email,
|
|
251
|
-
uplink,
|
|
252
|
-
downlink,
|
|
253
|
-
total: uplink + downlink,
|
|
254
|
-
queriedAt: new Date().toISOString(),
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
/**
|
|
258
|
-
* 检测 Xray Stats API 配置状态
|
|
259
|
-
*
|
|
260
|
-
* @param configPath - Xray 配置文件路径
|
|
261
|
-
* @returns 检测结果
|
|
262
|
-
*/
|
|
263
|
-
async detectStatsConfig(configPath = DEFAULT_XRAY_CONFIG_PATH) {
|
|
264
|
-
const result = {
|
|
265
|
-
available: false,
|
|
266
|
-
configDetected: false,
|
|
267
|
-
serviceRunning: false,
|
|
268
|
-
message: '',
|
|
269
|
-
};
|
|
270
|
-
// 1. 检查服务是否运行
|
|
271
|
-
try {
|
|
272
|
-
await execAsync('systemctl is-active xray');
|
|
273
|
-
result.serviceRunning = true;
|
|
274
|
-
}
|
|
275
|
-
catch {
|
|
276
|
-
result.serviceRunning = false;
|
|
277
|
-
result.message = 'Xray 服务未运行';
|
|
278
|
-
result.suggestion = '请先启动 Xray 服务: systemctl start xray';
|
|
279
|
-
return result;
|
|
280
|
-
}
|
|
281
|
-
// 2. 检查配置文件是否存在
|
|
282
|
-
if (!(0, fs_1.existsSync)(configPath)) {
|
|
283
|
-
result.message = `未找到 Xray 配置文件: ${configPath}`;
|
|
284
|
-
result.suggestion = '请确认 Xray 已正确安装';
|
|
285
|
-
return result;
|
|
286
|
-
}
|
|
287
|
-
// 3. 解析配置文件查找 stats 和 api 配置
|
|
288
|
-
try {
|
|
289
|
-
const content = await (0, promises_1.readFile)(configPath, 'utf-8');
|
|
290
|
-
const config = JSON.parse(content);
|
|
291
|
-
// 检查 stats 配置
|
|
292
|
-
if (!config.stats) {
|
|
293
|
-
result.message = 'Xray 配置中未启用 stats 统计功能';
|
|
294
|
-
result.suggestion = '请在配置文件中添加 "stats": {} 来启用流量统计';
|
|
295
|
-
return result;
|
|
296
|
-
}
|
|
297
|
-
// 检查 policy 配置
|
|
298
|
-
const levels = config.policy?.levels;
|
|
299
|
-
const hasUserStatsPolicy = levels
|
|
300
|
-
? Object.values(levels).some((level) => level?.statsUserUplink === true && level?.statsUserDownlink === true)
|
|
301
|
-
: false;
|
|
302
|
-
if (!hasUserStatsPolicy) {
|
|
303
|
-
result.message = 'Xray 配置中未启用 policy 流量统计';
|
|
304
|
-
result.suggestion = '请在 policy.levels 中启用 statsUserUplink/statsUserDownlink';
|
|
305
|
-
return result;
|
|
306
|
-
}
|
|
307
|
-
result.configDetected = true;
|
|
308
|
-
// 检查 api 配置
|
|
309
|
-
if (!config.api) {
|
|
310
|
-
result.message = 'Xray 配置中未启用 API 接口';
|
|
311
|
-
result.suggestion = '请在配置文件中添加 api 配置来启用 Stats API';
|
|
312
|
-
return result;
|
|
313
|
-
}
|
|
314
|
-
// 查找 api inbound 端口
|
|
315
|
-
const apiTag = config.api.tag || 'api';
|
|
316
|
-
const apiInbound = config.inbounds?.find((inbound) => inbound.tag === apiTag);
|
|
317
|
-
if (apiInbound?.port) {
|
|
318
|
-
result.detectedPort = apiInbound.port;
|
|
319
|
-
}
|
|
320
|
-
// 4. 测试 API 连接
|
|
321
|
-
result.available = await this.isStatsAvailable();
|
|
322
|
-
if (result.available) {
|
|
323
|
-
result.message = 'Stats API 已就绪';
|
|
324
|
-
}
|
|
325
|
-
else {
|
|
326
|
-
result.message = 'Stats API 配置已检测到,但无法连接';
|
|
327
|
-
result.suggestion = `请检查 API 端口 ${this.apiPort} 是否正确,或重启 Xray 服务`;
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
catch (error) {
|
|
331
|
-
if (error instanceof SyntaxError) {
|
|
332
|
-
result.message = 'Xray 配置文件 JSON 格式错误';
|
|
333
|
-
result.suggestion = '请检查配置文件格式';
|
|
334
|
-
}
|
|
335
|
-
else {
|
|
336
|
-
result.message = `读取配置文件失败: ${error.message}`;
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
return result;
|
|
340
|
-
}
|
|
341
|
-
/**
|
|
342
|
-
* 获取 Stats API 状态的友好提示信息
|
|
343
|
-
*
|
|
344
|
-
* @returns 状态提示
|
|
345
|
-
*/
|
|
346
|
-
async getStatusMessage() {
|
|
347
|
-
const [available, policyEnabled] = await Promise.all([
|
|
348
|
-
this.isStatsAvailable(),
|
|
349
|
-
this.hasUserStatsPolicy(),
|
|
350
|
-
]);
|
|
351
|
-
if (available && policyEnabled) {
|
|
352
|
-
return '流量统计功能正常';
|
|
353
|
-
}
|
|
354
|
-
if (available && !policyEnabled) {
|
|
355
|
-
return '流量统计不可用 (需要在 Xray 配置中启用 policy 统计)';
|
|
356
|
-
}
|
|
357
|
-
const detection = await this.detectStatsConfig();
|
|
358
|
-
if (!detection.serviceRunning) {
|
|
359
|
-
return '流量统计不可用 (Xray 服务未运行)';
|
|
360
|
-
}
|
|
361
|
-
if (!detection.configDetected) {
|
|
362
|
-
return '流量统计不可用 (需要在 Xray 配置中启用 stats)';
|
|
363
|
-
}
|
|
364
|
-
return '流量统计不可用 (Stats API 连接失败)';
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
exports.TrafficManager = TrafficManager;
|
|
368
|
-
//# sourceMappingURL=traffic-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"traffic-manager.js","sourceRoot":"","sources":["../../src/services/traffic-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* UserManager - User Management with Auto UUID Generation
|
|
3
|
-
*
|
|
4
|
-
* Provides safe user management with automatic service restart
|
|
5
|
-
*
|
|
6
|
-
* @module services/user-manager
|
|
7
|
-
*/
|
|
8
|
-
import { UserMetadataManager } from './user-metadata-manager';
|
|
9
|
-
import type { User, CreateUserParams, UserShareInfo } from '../types/user';
|
|
10
|
-
/**
|
|
11
|
-
* UserManager - Manage Xray users
|
|
12
|
-
*/
|
|
13
|
-
export declare class UserManager {
|
|
14
|
-
private configManager;
|
|
15
|
-
private systemdManager;
|
|
16
|
-
private publicIpManager;
|
|
17
|
-
private metadataManager;
|
|
18
|
-
private serviceName;
|
|
19
|
-
/**
|
|
20
|
-
* Create a new UserManager
|
|
21
|
-
*
|
|
22
|
-
* @param configPath - Optional config file path
|
|
23
|
-
* @param serviceName - Service name (default: xray)
|
|
24
|
-
*/
|
|
25
|
-
constructor(configPath?: string, serviceName?: string);
|
|
26
|
-
/**
|
|
27
|
-
* Generate a new UUID v4 using crypto.randomUUID()
|
|
28
|
-
*
|
|
29
|
-
* @returns UUID string
|
|
30
|
-
*/
|
|
31
|
-
generateUuid(): string;
|
|
32
|
-
/**
|
|
33
|
-
* Validate email address
|
|
34
|
-
*
|
|
35
|
-
* @param email - Email to validate
|
|
36
|
-
* @throws Error if email is invalid
|
|
37
|
-
*/
|
|
38
|
-
validateEmail(email: string): void;
|
|
39
|
-
/**
|
|
40
|
-
* List all users from config
|
|
41
|
-
*
|
|
42
|
-
* @returns Array of users
|
|
43
|
-
*/
|
|
44
|
-
listUsers(): Promise<User[]>;
|
|
45
|
-
/**
|
|
46
|
-
* Add a new user with auto-generated UUID
|
|
47
|
-
*
|
|
48
|
-
* @param params - User creation parameters
|
|
49
|
-
* @returns Created user
|
|
50
|
-
*/
|
|
51
|
-
addUser(params: CreateUserParams): Promise<User>;
|
|
52
|
-
/**
|
|
53
|
-
* Delete user by ID
|
|
54
|
-
*
|
|
55
|
-
* @param userId - User ID (UUID) to delete
|
|
56
|
-
*/
|
|
57
|
-
deleteUser(userId: string): Promise<void>;
|
|
58
|
-
/**
|
|
59
|
-
* Get share information for a user
|
|
60
|
-
*
|
|
61
|
-
* @param userId - User ID (UUID)
|
|
62
|
-
* @returns Share information including VLESS link
|
|
63
|
-
*/
|
|
64
|
-
getShareInfo(userId: string): Promise<UserShareInfo>;
|
|
65
|
-
/**
|
|
66
|
-
* Check if public IP needs manual input
|
|
67
|
-
*
|
|
68
|
-
* @returns true if manual input is needed
|
|
69
|
-
*/
|
|
70
|
-
needsPublicIpInput(): Promise<boolean>;
|
|
71
|
-
/**
|
|
72
|
-
* Set public IP manually
|
|
73
|
-
*
|
|
74
|
-
* @param ip - Public IP address
|
|
75
|
-
*/
|
|
76
|
-
setPublicIp(ip: string): Promise<void>;
|
|
77
|
-
/**
|
|
78
|
-
* Get current public IP (from cache)
|
|
79
|
-
*
|
|
80
|
-
* @returns Public IP or null if not set
|
|
81
|
-
*/
|
|
82
|
-
getPublicIp(): Promise<string | null>;
|
|
83
|
-
/**
|
|
84
|
-
* Get metadata manager for external access
|
|
85
|
-
*
|
|
86
|
-
* @returns UserMetadataManager instance
|
|
87
|
-
*/
|
|
88
|
-
getMetadataManager(): UserMetadataManager;
|
|
89
|
-
}
|
|
90
|
-
//# sourceMappingURL=user-manager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"user-manager.d.ts","sourceRoot":"","sources":["../../src/services/user-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AA0C3E;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,WAAW,CAAS;IAE5B;;;;;OAKG;gBACS,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,GAAE,MAAe;IAQ7D;;;;OAIG;IACH,YAAY,IAAI,MAAM;IAItB;;;;;OAKG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMlC;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAyBlC;;;;;OAKG;IACG,OAAO,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgFtD;;;;OAIG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkC/C;;;;;OAKG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA4G1D;;;;OAIG;IACG,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;IAI5C;;;;OAIG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C;;;;OAIG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAK3C;;;;OAIG;IACH,kBAAkB,IAAI,mBAAmB;CAG1C"}
|