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