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.
Files changed (324) hide show
  1. package/README.md +102 -42
  2. package/dist/cli.mjs +8587 -0
  3. package/dist/cli.mjs.map +7 -0
  4. package/package.json +13 -5
  5. package/dist/cli.d.ts +0 -11
  6. package/dist/cli.d.ts.map +0 -1
  7. package/dist/cli.js +0 -134
  8. package/dist/cli.js.map +0 -1
  9. package/dist/commands/clash.d.ts +0 -20
  10. package/dist/commands/clash.d.ts.map +0 -1
  11. package/dist/commands/clash.js +0 -156
  12. package/dist/commands/clash.js.map +0 -1
  13. package/dist/commands/config.d.ts +0 -56
  14. package/dist/commands/config.d.ts.map +0 -1
  15. package/dist/commands/config.js +0 -461
  16. package/dist/commands/config.js.map +0 -1
  17. package/dist/commands/interactive.d.ts +0 -55
  18. package/dist/commands/interactive.d.ts.map +0 -1
  19. package/dist/commands/interactive.js +0 -418
  20. package/dist/commands/interactive.js.map +0 -1
  21. package/dist/commands/logs.d.ts +0 -62
  22. package/dist/commands/logs.d.ts.map +0 -1
  23. package/dist/commands/logs.js +0 -389
  24. package/dist/commands/logs.js.map +0 -1
  25. package/dist/commands/quota.d.ts +0 -54
  26. package/dist/commands/quota.d.ts.map +0 -1
  27. package/dist/commands/quota.js +0 -661
  28. package/dist/commands/quota.js.map +0 -1
  29. package/dist/commands/review.d.ts +0 -8
  30. package/dist/commands/review.d.ts.map +0 -1
  31. package/dist/commands/review.js +0 -79
  32. package/dist/commands/review.js.map +0 -1
  33. package/dist/commands/service.d.ts +0 -43
  34. package/dist/commands/service.d.ts.map +0 -1
  35. package/dist/commands/service.js +0 -202
  36. package/dist/commands/service.js.map +0 -1
  37. package/dist/commands/user.d.ts +0 -49
  38. package/dist/commands/user.d.ts.map +0 -1
  39. package/dist/commands/user.js +0 -371
  40. package/dist/commands/user.js.map +0 -1
  41. package/dist/components/dashboard-widget.d.ts +0 -21
  42. package/dist/components/dashboard-widget.d.ts.map +0 -1
  43. package/dist/components/dashboard-widget.js +0 -234
  44. package/dist/components/dashboard-widget.js.map +0 -1
  45. package/dist/components/progress-bar.d.ts +0 -67
  46. package/dist/components/progress-bar.d.ts.map +0 -1
  47. package/dist/components/progress-bar.js +0 -138
  48. package/dist/components/progress-bar.js.map +0 -1
  49. package/dist/components/user-table.d.ts +0 -8
  50. package/dist/components/user-table.d.ts.map +0 -1
  51. package/dist/components/user-table.js +0 -91
  52. package/dist/components/user-table.js.map +0 -1
  53. package/dist/config/i18n.d.ts +0 -136
  54. package/dist/config/i18n.d.ts.map +0 -1
  55. package/dist/config/i18n.js +0 -323
  56. package/dist/config/i18n.js.map +0 -1
  57. package/dist/constants/error-codes.d.ts +0 -344
  58. package/dist/constants/error-codes.d.ts.map +0 -1
  59. package/dist/constants/error-codes.js +0 -462
  60. package/dist/constants/error-codes.js.map +0 -1
  61. package/dist/constants/exit-codes.d.ts +0 -49
  62. package/dist/constants/exit-codes.d.ts.map +0 -1
  63. package/dist/constants/exit-codes.js +0 -100
  64. package/dist/constants/exit-codes.js.map +0 -1
  65. package/dist/constants/paths.d.ts +0 -63
  66. package/dist/constants/paths.d.ts.map +0 -1
  67. package/dist/constants/paths.js +0 -78
  68. package/dist/constants/paths.js.map +0 -1
  69. package/dist/constants/quota.d.ts +0 -126
  70. package/dist/constants/quota.d.ts.map +0 -1
  71. package/dist/constants/quota.js +0 -135
  72. package/dist/constants/quota.js.map +0 -1
  73. package/dist/constants/review.d.ts +0 -14
  74. package/dist/constants/review.d.ts.map +0 -1
  75. package/dist/constants/review.js +0 -33
  76. package/dist/constants/review.js.map +0 -1
  77. package/dist/constants/supported-distros.d.ts +0 -17
  78. package/dist/constants/supported-distros.d.ts.map +0 -1
  79. package/dist/constants/supported-distros.js +0 -68
  80. package/dist/constants/supported-distros.js.map +0 -1
  81. package/dist/constants/theme.d.ts +0 -34
  82. package/dist/constants/theme.d.ts.map +0 -1
  83. package/dist/constants/theme.js +0 -52
  84. package/dist/constants/theme.js.map +0 -1
  85. package/dist/constants/timeouts.d.ts +0 -84
  86. package/dist/constants/timeouts.d.ts.map +0 -1
  87. package/dist/constants/timeouts.js +0 -111
  88. package/dist/constants/timeouts.js.map +0 -1
  89. package/dist/constants/ui-symbols.d.ts +0 -47
  90. package/dist/constants/ui-symbols.d.ts.map +0 -1
  91. package/dist/constants/ui-symbols.js +0 -48
  92. package/dist/constants/ui-symbols.js.map +0 -1
  93. package/dist/services/clash-config.d.ts +0 -16
  94. package/dist/services/clash-config.d.ts.map +0 -1
  95. package/dist/services/clash-config.js +0 -107
  96. package/dist/services/clash-config.js.map +0 -1
  97. package/dist/services/config-manager.d.ts +0 -90
  98. package/dist/services/config-manager.d.ts.map +0 -1
  99. package/dist/services/config-manager.js +0 -307
  100. package/dist/services/config-manager.js.map +0 -1
  101. package/dist/services/layout-manager.d.ts +0 -94
  102. package/dist/services/layout-manager.d.ts.map +0 -1
  103. package/dist/services/layout-manager.js +0 -192
  104. package/dist/services/layout-manager.js.map +0 -1
  105. package/dist/services/log-manager.d.ts +0 -157
  106. package/dist/services/log-manager.d.ts.map +0 -1
  107. package/dist/services/log-manager.js +0 -397
  108. package/dist/services/log-manager.js.map +0 -1
  109. package/dist/services/navigation-manager.d.ts +0 -23
  110. package/dist/services/navigation-manager.d.ts.map +0 -1
  111. package/dist/services/navigation-manager.js +0 -39
  112. package/dist/services/navigation-manager.js.map +0 -1
  113. package/dist/services/platform-detector.d.ts +0 -10
  114. package/dist/services/platform-detector.d.ts.map +0 -1
  115. package/dist/services/platform-detector.js +0 -106
  116. package/dist/services/platform-detector.js.map +0 -1
  117. package/dist/services/public-ip-manager.d.ts +0 -78
  118. package/dist/services/public-ip-manager.d.ts.map +0 -1
  119. package/dist/services/public-ip-manager.js +0 -296
  120. package/dist/services/public-ip-manager.js.map +0 -1
  121. package/dist/services/quota-enforcer.d.ts +0 -86
  122. package/dist/services/quota-enforcer.d.ts.map +0 -1
  123. package/dist/services/quota-enforcer.js +0 -151
  124. package/dist/services/quota-enforcer.js.map +0 -1
  125. package/dist/services/quota-manager.d.ts +0 -101
  126. package/dist/services/quota-manager.d.ts.map +0 -1
  127. package/dist/services/quota-manager.js +0 -257
  128. package/dist/services/quota-manager.js.map +0 -1
  129. package/dist/services/review/areas/community.d.ts +0 -9
  130. package/dist/services/review/areas/community.d.ts.map +0 -1
  131. package/dist/services/review/areas/community.js +0 -59
  132. package/dist/services/review/areas/community.js.map +0 -1
  133. package/dist/services/review/areas/contribution.d.ts +0 -9
  134. package/dist/services/review/areas/contribution.d.ts.map +0 -1
  135. package/dist/services/review/areas/contribution.js +0 -107
  136. package/dist/services/review/areas/contribution.js.map +0 -1
  137. package/dist/services/review/areas/documentation.d.ts +0 -9
  138. package/dist/services/review/areas/documentation.d.ts.map +0 -1
  139. package/dist/services/review/areas/documentation.js +0 -110
  140. package/dist/services/review/areas/documentation.js.map +0 -1
  141. package/dist/services/review/areas/license.d.ts +0 -9
  142. package/dist/services/review/areas/license.d.ts.map +0 -1
  143. package/dist/services/review/areas/license.js +0 -86
  144. package/dist/services/review/areas/license.js.map +0 -1
  145. package/dist/services/review/areas/quality.d.ts +0 -9
  146. package/dist/services/review/areas/quality.d.ts.map +0 -1
  147. package/dist/services/review/areas/quality.js +0 -84
  148. package/dist/services/review/areas/quality.js.map +0 -1
  149. package/dist/services/review/areas/security.d.ts +0 -9
  150. package/dist/services/review/areas/security.d.ts.map +0 -1
  151. package/dist/services/review/areas/security.js +0 -64
  152. package/dist/services/review/areas/security.js.map +0 -1
  153. package/dist/services/review/evidence.d.ts +0 -10
  154. package/dist/services/review/evidence.d.ts.map +0 -1
  155. package/dist/services/review/evidence.js +0 -40
  156. package/dist/services/review/evidence.js.map +0 -1
  157. package/dist/services/review/recommendations-filter.d.ts +0 -12
  158. package/dist/services/review/recommendations-filter.d.ts.map +0 -1
  159. package/dist/services/review/recommendations-filter.js +0 -20
  160. package/dist/services/review/recommendations-filter.js.map +0 -1
  161. package/dist/services/review/repo-scanner.d.ts +0 -8
  162. package/dist/services/review/repo-scanner.d.ts.map +0 -1
  163. package/dist/services/review/repo-scanner.js +0 -15
  164. package/dist/services/review/repo-scanner.js.map +0 -1
  165. package/dist/services/review/report-renderer.d.ts +0 -15
  166. package/dist/services/review/report-renderer.d.ts.map +0 -1
  167. package/dist/services/review/report-renderer.js +0 -120
  168. package/dist/services/review/report-renderer.js.map +0 -1
  169. package/dist/services/review/review-engine.d.ts +0 -15
  170. package/dist/services/review/review-engine.d.ts.map +0 -1
  171. package/dist/services/review/review-engine.js +0 -61
  172. package/dist/services/review/review-engine.js.map +0 -1
  173. package/dist/services/review/summary-builder.d.ts +0 -8
  174. package/dist/services/review/summary-builder.d.ts.map +0 -1
  175. package/dist/services/review/summary-builder.js +0 -26
  176. package/dist/services/review/summary-builder.js.map +0 -1
  177. package/dist/services/screen-manager.d.ts +0 -13
  178. package/dist/services/screen-manager.d.ts.map +0 -1
  179. package/dist/services/screen-manager.js +0 -42
  180. package/dist/services/screen-manager.js.map +0 -1
  181. package/dist/services/stats-config-manager.d.ts +0 -110
  182. package/dist/services/stats-config-manager.d.ts.map +0 -1
  183. package/dist/services/stats-config-manager.js +0 -443
  184. package/dist/services/stats-config-manager.js.map +0 -1
  185. package/dist/services/systemd-manager.d.ts +0 -197
  186. package/dist/services/systemd-manager.d.ts.map +0 -1
  187. package/dist/services/systemd-manager.js +0 -458
  188. package/dist/services/systemd-manager.js.map +0 -1
  189. package/dist/services/traffic-manager.d.ts +0 -106
  190. package/dist/services/traffic-manager.d.ts.map +0 -1
  191. package/dist/services/traffic-manager.js +0 -368
  192. package/dist/services/traffic-manager.js.map +0 -1
  193. package/dist/services/user-manager.d.ts +0 -90
  194. package/dist/services/user-manager.d.ts.map +0 -1
  195. package/dist/services/user-manager.js +0 -347
  196. package/dist/services/user-manager.js.map +0 -1
  197. package/dist/services/user-metadata-manager.d.ts +0 -85
  198. package/dist/services/user-metadata-manager.d.ts.map +0 -1
  199. package/dist/services/user-metadata-manager.js +0 -181
  200. package/dist/services/user-metadata-manager.js.map +0 -1
  201. package/dist/types/config.d.ts +0 -340
  202. package/dist/types/config.d.ts.map +0 -1
  203. package/dist/types/config.js +0 -7
  204. package/dist/types/config.js.map +0 -1
  205. package/dist/types/layout.d.ts +0 -119
  206. package/dist/types/layout.d.ts.map +0 -1
  207. package/dist/types/layout.js +0 -142
  208. package/dist/types/layout.js.map +0 -1
  209. package/dist/types/platform.d.ts +0 -72
  210. package/dist/types/platform.d.ts.map +0 -1
  211. package/dist/types/platform.js +0 -38
  212. package/dist/types/platform.js.map +0 -1
  213. package/dist/types/quota.d.ts +0 -158
  214. package/dist/types/quota.d.ts.map +0 -1
  215. package/dist/types/quota.js +0 -26
  216. package/dist/types/quota.js.map +0 -1
  217. package/dist/types/review.d.ts +0 -62
  218. package/dist/types/review.d.ts.map +0 -1
  219. package/dist/types/review.js +0 -8
  220. package/dist/types/review.js.map +0 -1
  221. package/dist/types/server-config.d.ts +0 -53
  222. package/dist/types/server-config.d.ts.map +0 -1
  223. package/dist/types/server-config.js +0 -19
  224. package/dist/types/server-config.js.map +0 -1
  225. package/dist/types/service.d.ts +0 -96
  226. package/dist/types/service.d.ts.map +0 -1
  227. package/dist/types/service.js +0 -7
  228. package/dist/types/service.js.map +0 -1
  229. package/dist/types/terminal.d.ts +0 -35
  230. package/dist/types/terminal.d.ts.map +0 -1
  231. package/dist/types/terminal.js +0 -20
  232. package/dist/types/terminal.js.map +0 -1
  233. package/dist/types/ui-components.d.ts +0 -53
  234. package/dist/types/ui-components.d.ts.map +0 -1
  235. package/dist/types/ui-components.js +0 -3
  236. package/dist/types/ui-components.js.map +0 -1
  237. package/dist/types/user-metadata.d.ts +0 -43
  238. package/dist/types/user-metadata.d.ts.map +0 -1
  239. package/dist/types/user-metadata.js +0 -17
  240. package/dist/types/user-metadata.js.map +0 -1
  241. package/dist/types/user.d.ts +0 -134
  242. package/dist/types/user.d.ts.map +0 -1
  243. package/dist/types/user.js +0 -7
  244. package/dist/types/user.js.map +0 -1
  245. package/dist/utils/clipboard.d.ts +0 -21
  246. package/dist/utils/clipboard.d.ts.map +0 -1
  247. package/dist/utils/clipboard.js +0 -45
  248. package/dist/utils/clipboard.js.map +0 -1
  249. package/dist/utils/error-formatter.d.ts +0 -60
  250. package/dist/utils/error-formatter.d.ts.map +0 -1
  251. package/dist/utils/error-formatter.js +0 -244
  252. package/dist/utils/error-formatter.js.map +0 -1
  253. package/dist/utils/errors.d.ts +0 -92
  254. package/dist/utils/errors.d.ts.map +0 -1
  255. package/dist/utils/errors.js +0 -143
  256. package/dist/utils/errors.js.map +0 -1
  257. package/dist/utils/firewall.d.ts +0 -14
  258. package/dist/utils/firewall.d.ts.map +0 -1
  259. package/dist/utils/firewall.js +0 -78
  260. package/dist/utils/firewall.js.map +0 -1
  261. package/dist/utils/format.d.ts +0 -93
  262. package/dist/utils/format.d.ts.map +0 -1
  263. package/dist/utils/format.js +0 -240
  264. package/dist/utils/format.js.map +0 -1
  265. package/dist/utils/icons.d.ts +0 -53
  266. package/dist/utils/icons.d.ts.map +0 -1
  267. package/dist/utils/icons.js +0 -143
  268. package/dist/utils/icons.js.map +0 -1
  269. package/dist/utils/layout.d.ts +0 -142
  270. package/dist/utils/layout.d.ts.map +0 -1
  271. package/dist/utils/layout.js +0 -381
  272. package/dist/utils/layout.js.map +0 -1
  273. package/dist/utils/logger.d.ts +0 -160
  274. package/dist/utils/logger.d.ts.map +0 -1
  275. package/dist/utils/logger.js +0 -351
  276. package/dist/utils/logger.js.map +0 -1
  277. package/dist/utils/network.d.ts +0 -39
  278. package/dist/utils/network.d.ts.map +0 -1
  279. package/dist/utils/network.js +0 -227
  280. package/dist/utils/network.js.map +0 -1
  281. package/dist/utils/os-detection.d.ts +0 -10
  282. package/dist/utils/os-detection.d.ts.map +0 -1
  283. package/dist/utils/os-detection.js +0 -86
  284. package/dist/utils/os-detection.js.map +0 -1
  285. package/dist/utils/preflight.d.ts +0 -57
  286. package/dist/utils/preflight.d.ts.map +0 -1
  287. package/dist/utils/preflight.js +0 -215
  288. package/dist/utils/preflight.js.map +0 -1
  289. package/dist/utils/repo-scan.d.ts +0 -54
  290. package/dist/utils/repo-scan.d.ts.map +0 -1
  291. package/dist/utils/repo-scan.js +0 -165
  292. package/dist/utils/repo-scan.js.map +0 -1
  293. package/dist/utils/report-output.d.ts +0 -13
  294. package/dist/utils/report-output.d.ts.map +0 -1
  295. package/dist/utils/report-output.js +0 -33
  296. package/dist/utils/report-output.js.map +0 -1
  297. package/dist/utils/review-id.d.ts +0 -8
  298. package/dist/utils/review-id.d.ts.map +0 -1
  299. package/dist/utils/review-id.js +0 -17
  300. package/dist/utils/review-id.js.map +0 -1
  301. package/dist/utils/splash.d.ts +0 -21
  302. package/dist/utils/splash.d.ts.map +0 -1
  303. package/dist/utils/splash.js +0 -179
  304. package/dist/utils/splash.js.map +0 -1
  305. package/dist/utils/terminal.d.ts +0 -32
  306. package/dist/utils/terminal.d.ts.map +0 -1
  307. package/dist/utils/terminal.js +0 -93
  308. package/dist/utils/terminal.js.map +0 -1
  309. package/dist/utils/traffic-formatter.d.ts +0 -45
  310. package/dist/utils/traffic-formatter.d.ts.map +0 -1
  311. package/dist/utils/traffic-formatter.js +0 -131
  312. package/dist/utils/traffic-formatter.js.map +0 -1
  313. package/dist/utils/validator.d.ts +0 -102
  314. package/dist/utils/validator.d.ts.map +0 -1
  315. package/dist/utils/validator.js +0 -238
  316. package/dist/utils/validator.js.map +0 -1
  317. package/dist/utils/vless-link.d.ts +0 -27
  318. package/dist/utils/vless-link.d.ts.map +0 -1
  319. package/dist/utils/vless-link.js +0 -69
  320. package/dist/utils/vless-link.js.map +0 -1
  321. package/dist/utils/which.d.ts +0 -13
  322. package/dist/utils/which.d.ts.map +0 -1
  323. package/dist/utils/which.js +0 -28
  324. 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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"}