xray-manager 1.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 (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +798 -0
  3. package/dist/cli.d.ts +11 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +113 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/config.d.ts +49 -0
  8. package/dist/commands/config.d.ts.map +1 -0
  9. package/dist/commands/config.js +295 -0
  10. package/dist/commands/config.js.map +1 -0
  11. package/dist/commands/interactive.d.ts +83 -0
  12. package/dist/commands/interactive.d.ts.map +1 -0
  13. package/dist/commands/interactive.js +362 -0
  14. package/dist/commands/interactive.js.map +1 -0
  15. package/dist/commands/logs.d.ts +43 -0
  16. package/dist/commands/logs.d.ts.map +1 -0
  17. package/dist/commands/logs.js +257 -0
  18. package/dist/commands/logs.js.map +1 -0
  19. package/dist/commands/service.d.ts +43 -0
  20. package/dist/commands/service.d.ts.map +1 -0
  21. package/dist/commands/service.js +177 -0
  22. package/dist/commands/service.js.map +1 -0
  23. package/dist/commands/user.d.ts +43 -0
  24. package/dist/commands/user.d.ts.map +1 -0
  25. package/dist/commands/user.js +212 -0
  26. package/dist/commands/user.js.map +1 -0
  27. package/dist/constants/exit-codes.d.ts +49 -0
  28. package/dist/constants/exit-codes.d.ts.map +1 -0
  29. package/dist/constants/exit-codes.js +100 -0
  30. package/dist/constants/exit-codes.js.map +1 -0
  31. package/dist/constants/paths.d.ts +57 -0
  32. package/dist/constants/paths.d.ts.map +1 -0
  33. package/dist/constants/paths.js +72 -0
  34. package/dist/constants/paths.js.map +1 -0
  35. package/dist/constants/timeouts.d.ts +84 -0
  36. package/dist/constants/timeouts.d.ts.map +1 -0
  37. package/dist/constants/timeouts.js +111 -0
  38. package/dist/constants/timeouts.js.map +1 -0
  39. package/dist/services/config-manager.d.ts +66 -0
  40. package/dist/services/config-manager.d.ts.map +1 -0
  41. package/dist/services/config-manager.js +206 -0
  42. package/dist/services/config-manager.js.map +1 -0
  43. package/dist/services/log-manager.d.ts +113 -0
  44. package/dist/services/log-manager.d.ts.map +1 -0
  45. package/dist/services/log-manager.js +288 -0
  46. package/dist/services/log-manager.js.map +1 -0
  47. package/dist/services/systemd-manager.d.ts +197 -0
  48. package/dist/services/systemd-manager.d.ts.map +1 -0
  49. package/dist/services/systemd-manager.js +458 -0
  50. package/dist/services/systemd-manager.js.map +1 -0
  51. package/dist/services/user-manager.d.ts +63 -0
  52. package/dist/services/user-manager.d.ts.map +1 -0
  53. package/dist/services/user-manager.js +219 -0
  54. package/dist/services/user-manager.js.map +1 -0
  55. package/dist/types/config.d.ts +256 -0
  56. package/dist/types/config.d.ts.map +1 -0
  57. package/dist/types/config.js +7 -0
  58. package/dist/types/config.js.map +1 -0
  59. package/dist/types/service.d.ts +96 -0
  60. package/dist/types/service.d.ts.map +1 -0
  61. package/dist/types/service.js +7 -0
  62. package/dist/types/service.js.map +1 -0
  63. package/dist/types/user.d.ts +114 -0
  64. package/dist/types/user.d.ts.map +1 -0
  65. package/dist/types/user.js +7 -0
  66. package/dist/types/user.js.map +1 -0
  67. package/dist/utils/clipboard.d.ts +21 -0
  68. package/dist/utils/clipboard.d.ts.map +1 -0
  69. package/dist/utils/clipboard.js +45 -0
  70. package/dist/utils/clipboard.js.map +1 -0
  71. package/dist/utils/format.d.ts +93 -0
  72. package/dist/utils/format.d.ts.map +1 -0
  73. package/dist/utils/format.js +242 -0
  74. package/dist/utils/format.js.map +1 -0
  75. package/dist/utils/logger.d.ts +113 -0
  76. package/dist/utils/logger.d.ts.map +1 -0
  77. package/dist/utils/logger.js +260 -0
  78. package/dist/utils/logger.js.map +1 -0
  79. package/dist/utils/preflight.d.ts +57 -0
  80. package/dist/utils/preflight.d.ts.map +1 -0
  81. package/dist/utils/preflight.js +215 -0
  82. package/dist/utils/preflight.js.map +1 -0
  83. package/dist/utils/validator.d.ts +102 -0
  84. package/dist/utils/validator.d.ts.map +1 -0
  85. package/dist/utils/validator.js +238 -0
  86. package/dist/utils/validator.js.map +1 -0
  87. package/dist/utils/which.d.ts +13 -0
  88. package/dist/utils/which.d.ts.map +1 -0
  89. package/dist/utils/which.js +28 -0
  90. package/dist/utils/which.js.map +1 -0
  91. package/package.json +69 -0
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ /**
3
+ * 日志工具函数(使用 chalk 颜色)
4
+ * @module utils/logger
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.LogLevel = void 0;
11
+ exports.configureLogger = configureLogger;
12
+ exports.debug = debug;
13
+ exports.info = info;
14
+ exports.success = success;
15
+ exports.warn = warn;
16
+ exports.error = error;
17
+ exports.title = title;
18
+ exports.separator = separator;
19
+ exports.tableHeader = tableHeader;
20
+ exports.loading = loading;
21
+ exports.progress = progress;
22
+ exports.hint = hint;
23
+ exports.keyValue = keyValue;
24
+ exports.newline = newline;
25
+ exports.listItem = listItem;
26
+ exports.code = code;
27
+ const chalk_1 = __importDefault(require("chalk"));
28
+ /**
29
+ * 日志级别
30
+ */
31
+ var LogLevel;
32
+ (function (LogLevel) {
33
+ LogLevel["DEBUG"] = "debug";
34
+ LogLevel["INFO"] = "info";
35
+ LogLevel["SUCCESS"] = "success";
36
+ LogLevel["WARN"] = "warn";
37
+ LogLevel["ERROR"] = "error";
38
+ })(LogLevel || (exports.LogLevel = LogLevel = {}));
39
+ /**
40
+ * 全局日志配置
41
+ */
42
+ let globalOptions = {
43
+ color: true,
44
+ timestamp: false,
45
+ level: LogLevel.INFO,
46
+ };
47
+ /**
48
+ * 配置全局日志选项
49
+ */
50
+ function configureLogger(options) {
51
+ globalOptions = { ...globalOptions, ...options };
52
+ }
53
+ /**
54
+ * 获取时间戳字符串
55
+ */
56
+ function getTimestamp() {
57
+ const now = new Date();
58
+ const hours = String(now.getHours()).padStart(2, '0');
59
+ const minutes = String(now.getMinutes()).padStart(2, '0');
60
+ const seconds = String(now.getSeconds()).padStart(2, '0');
61
+ return `[${hours}:${minutes}:${seconds}]`;
62
+ }
63
+ /**
64
+ * 格式化日志消息
65
+ */
66
+ function formatMessage(level, message) {
67
+ let formatted = message;
68
+ if (globalOptions.timestamp) {
69
+ formatted = `${chalk_1.default.gray(getTimestamp())} ${formatted}`;
70
+ }
71
+ return formatted;
72
+ }
73
+ /**
74
+ * 调试日志(灰色)
75
+ */
76
+ function debug(...args) {
77
+ if (globalOptions.color) {
78
+ console.debug(chalk_1.default.gray(formatMessage(LogLevel.DEBUG, args.join(' '))));
79
+ }
80
+ else {
81
+ console.debug('[DEBUG]', ...args);
82
+ }
83
+ }
84
+ /**
85
+ * 信息日志(默认颜色)
86
+ */
87
+ function info(...args) {
88
+ if (globalOptions.color) {
89
+ console.info(formatMessage(LogLevel.INFO, args.join(' ')));
90
+ }
91
+ else {
92
+ console.info('[INFO]', ...args);
93
+ }
94
+ }
95
+ /**
96
+ * 成功日志(绿色,带 ✅ 图标)
97
+ */
98
+ function success(...args) {
99
+ if (globalOptions.color) {
100
+ console.log(chalk_1.default.green(formatMessage(LogLevel.SUCCESS, `✅ ${args.join(' ')}`)));
101
+ }
102
+ else {
103
+ console.log('[SUCCESS]', ...args);
104
+ }
105
+ }
106
+ /**
107
+ * 警告日志(黄色,带 ⚠️ 图标)
108
+ */
109
+ function warn(...args) {
110
+ if (globalOptions.color) {
111
+ console.warn(chalk_1.default.yellow(formatMessage(LogLevel.WARN, `⚠️ ${args.join(' ')}`)));
112
+ }
113
+ else {
114
+ console.warn('[WARN]', ...args);
115
+ }
116
+ }
117
+ /**
118
+ * 错误日志(红色,带 ❌ 图标)
119
+ */
120
+ function error(...args) {
121
+ if (globalOptions.color) {
122
+ console.error(chalk_1.default.red(formatMessage(LogLevel.ERROR, `❌ ${args.join(' ')}`)));
123
+ }
124
+ else {
125
+ console.error('[ERROR]', ...args);
126
+ }
127
+ }
128
+ /**
129
+ * 标题日志(青色,加粗)
130
+ */
131
+ function title(message) {
132
+ if (globalOptions.color) {
133
+ console.log(chalk_1.default.cyan.bold(`\n${message}\n`));
134
+ }
135
+ else {
136
+ console.log(`\n=== ${message} ===\n`);
137
+ }
138
+ }
139
+ /**
140
+ * 分隔线
141
+ */
142
+ function separator(char = '─', length = 50) {
143
+ if (globalOptions.color) {
144
+ console.log(chalk_1.default.gray(char.repeat(length)));
145
+ }
146
+ else {
147
+ console.log(char.repeat(length));
148
+ }
149
+ }
150
+ /**
151
+ * 表格表头(带边框)
152
+ */
153
+ function tableHeader(title) {
154
+ const width = 59; // 符合 contracts 中的宽度
155
+ const border = '═'.repeat(width);
156
+ if (globalOptions.color) {
157
+ console.log(chalk_1.default.cyan(`╔${border}╗`));
158
+ console.log(chalk_1.default.cyan(`║${title.padStart((width + title.length) / 2).padEnd(width)}║`));
159
+ console.log(chalk_1.default.cyan(`╚${border}╝`));
160
+ }
161
+ else {
162
+ console.log(border);
163
+ console.log(title);
164
+ console.log(border);
165
+ }
166
+ }
167
+ /**
168
+ * 加载动画消息(带 ⏳ 图标)
169
+ */
170
+ function loading(message) {
171
+ if (globalOptions.color) {
172
+ console.log(chalk_1.default.cyan(`⏳ ${message}...`));
173
+ }
174
+ else {
175
+ console.log(`[LOADING] ${message}...`);
176
+ }
177
+ }
178
+ /**
179
+ * 进度消息(带 🔄 图标)
180
+ */
181
+ function progress(message) {
182
+ if (globalOptions.color) {
183
+ console.log(chalk_1.default.blue(`🔄 ${message}...`));
184
+ }
185
+ else {
186
+ console.log(`[PROGRESS] ${message}...`);
187
+ }
188
+ }
189
+ /**
190
+ * 提示消息(带 💡 图标)
191
+ */
192
+ function hint(message) {
193
+ if (globalOptions.color) {
194
+ console.log(chalk_1.default.cyan(`💡 提示: ${message}`));
195
+ }
196
+ else {
197
+ console.log(`[HINT] ${message}`);
198
+ }
199
+ }
200
+ /**
201
+ * 带颜色的键值对输出
202
+ */
203
+ function keyValue(key, value, keyColor = chalk_1.default.gray) {
204
+ if (globalOptions.color) {
205
+ console.log(` ${keyColor(key + ':')} ${value}`);
206
+ }
207
+ else {
208
+ console.log(` ${key}: ${value}`);
209
+ }
210
+ }
211
+ /**
212
+ * 打印空行
213
+ */
214
+ function newline(count = 1) {
215
+ console.log('\n'.repeat(count - 1));
216
+ }
217
+ /**
218
+ * 带颜色的列表项
219
+ */
220
+ function listItem(message, symbol = '•') {
221
+ if (globalOptions.color) {
222
+ console.log(chalk_1.default.gray(` ${symbol} `) + message);
223
+ }
224
+ else {
225
+ console.log(` ${symbol} ${message}`);
226
+ }
227
+ }
228
+ /**
229
+ * 代码块(带灰色背景)
230
+ */
231
+ function code(code) {
232
+ if (globalOptions.color) {
233
+ console.log(chalk_1.default.bgGray.white(` ${code} `));
234
+ }
235
+ else {
236
+ console.log(`\`${code}\``);
237
+ }
238
+ }
239
+ /**
240
+ * 默认导出对象
241
+ */
242
+ exports.default = {
243
+ debug,
244
+ info,
245
+ success,
246
+ warn,
247
+ error,
248
+ title,
249
+ separator,
250
+ tableHeader,
251
+ loading,
252
+ progress,
253
+ hint,
254
+ keyValue,
255
+ newline,
256
+ listItem,
257
+ code,
258
+ configure: configureLogger,
259
+ };
260
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Preflight Checks Utility
3
+ *
4
+ * Performs system checks before starting the CLI tool
5
+ *
6
+ * @module utils/preflight
7
+ */
8
+ /**
9
+ * Preflight check options
10
+ */
11
+ export interface PreflightOptions {
12
+ /** Check if systemd is available */
13
+ checkSystemd?: boolean;
14
+ /** Check if Xray binary exists */
15
+ checkXray?: boolean;
16
+ /** Check if config file exists and is readable */
17
+ checkConfig?: boolean;
18
+ /** Config file path (if checking) */
19
+ configPath?: string;
20
+ /** Service name (if checking) */
21
+ serviceName?: string;
22
+ }
23
+ /**
24
+ * Preflight check result
25
+ */
26
+ export interface PreflightResult {
27
+ /** Overall passed status */
28
+ passed: boolean;
29
+ /** Whether failures are critical (should prevent startup) */
30
+ critical: boolean;
31
+ /** List of errors */
32
+ errors: string[];
33
+ /** List of warnings */
34
+ warnings: string[];
35
+ /** Suggestions for fixing issues */
36
+ suggestions: string[];
37
+ /** Individual check results */
38
+ checks: {
39
+ systemd?: boolean;
40
+ xray?: boolean;
41
+ config?: boolean;
42
+ permissions?: boolean;
43
+ };
44
+ }
45
+ /**
46
+ * Perform all preflight checks
47
+ */
48
+ export declare function preflightChecks(options?: PreflightOptions): Promise<PreflightResult>;
49
+ /**
50
+ * Check if running as root
51
+ */
52
+ export declare function isRoot(): boolean;
53
+ /**
54
+ * Check if sudo is available
55
+ */
56
+ export declare function canUseSudo(): Promise<boolean>;
57
+ //# sourceMappingURL=preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/utils/preflight.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,kCAAkC;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,kDAAkD;IAClD,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,4BAA4B;IAC5B,MAAM,EAAE,OAAO,CAAC;IAEhB,6DAA6D;IAC7D,QAAQ,EAAE,OAAO,CAAC;IAElB,qBAAqB;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IAEjB,uBAAuB;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB,oCAAoC;IACpC,WAAW,EAAE,MAAM,EAAE,CAAC;IAEtB,+BAA+B;IAC/B,MAAM,EAAE;QACN,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB,CAAC;CACH;AAuHD;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAuE9F;AAED;;GAEG;AACH,wBAAgB,MAAM,IAAI,OAAO,CAEhC;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAYnD"}
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ /**
3
+ * Preflight Checks Utility
4
+ *
5
+ * Performs system checks before starting the CLI tool
6
+ *
7
+ * @module utils/preflight
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.preflightChecks = preflightChecks;
11
+ exports.isRoot = isRoot;
12
+ exports.canUseSudo = canUseSudo;
13
+ const child_process_1 = require("child_process");
14
+ const promises_1 = require("fs/promises");
15
+ const paths_1 = require("../constants/paths");
16
+ const timeouts_1 = require("../constants/timeouts");
17
+ /**
18
+ * Check if systemd is available
19
+ */
20
+ async function checkSystemd() {
21
+ return new Promise((resolve) => {
22
+ const child = (0, child_process_1.spawn)('systemctl', ['--version'], {
23
+ timeout: timeouts_1.TIMEOUTS.SYSTEMCTL_DEFAULT,
24
+ });
25
+ let stdout = '';
26
+ child.stdout?.on('data', (data) => {
27
+ stdout += data.toString();
28
+ });
29
+ child.on('close', (code) => {
30
+ if (code === 0 && stdout.includes('systemd')) {
31
+ resolve({ passed: true });
32
+ }
33
+ else {
34
+ resolve({
35
+ passed: false,
36
+ error: 'systemd 不可用 - 此工具需要在 systemd 系统上运行',
37
+ });
38
+ }
39
+ });
40
+ child.on('error', (error) => {
41
+ resolve({
42
+ passed: false,
43
+ error: `systemd 检查失败: ${error.message}`,
44
+ });
45
+ });
46
+ });
47
+ }
48
+ /**
49
+ * Check if Xray binary exists and is executable
50
+ */
51
+ async function checkXray(path = paths_1.DEFAULT_PATHS.XRAY_BINARY) {
52
+ try {
53
+ // Check if file exists and is executable
54
+ await (0, promises_1.access)(path, promises_1.constants.F_OK | promises_1.constants.X_OK);
55
+ return { passed: true };
56
+ }
57
+ catch (error) {
58
+ if (error.code === 'ENOENT') {
59
+ return {
60
+ passed: false,
61
+ warning: `Xray 二进制文件不存在: ${path}`,
62
+ };
63
+ }
64
+ else if (error.code === 'EACCES') {
65
+ return {
66
+ passed: false,
67
+ error: `Xray 二进制文件不可执行: ${path}`,
68
+ };
69
+ }
70
+ else {
71
+ return {
72
+ passed: false,
73
+ warning: `Xray 二进制文件检查失败: ${error.message}`,
74
+ };
75
+ }
76
+ }
77
+ }
78
+ /**
79
+ * Check if config file exists and is readable
80
+ */
81
+ async function checkConfig(path = paths_1.DEFAULT_PATHS.CONFIG_FILE) {
82
+ try {
83
+ // Check if file exists and is readable
84
+ await (0, promises_1.access)(path, promises_1.constants.F_OK | promises_1.constants.R_OK);
85
+ // Verify it's a JSON file
86
+ if (!path.endsWith('.json')) {
87
+ return {
88
+ passed: false,
89
+ warning: `配置文件应为 JSON 格式: ${path}`,
90
+ };
91
+ }
92
+ return { passed: true };
93
+ }
94
+ catch (error) {
95
+ if (error.code === 'ENOENT') {
96
+ return {
97
+ passed: false,
98
+ warning: `配置文件不存在: ${path}`,
99
+ };
100
+ }
101
+ else if (error.code === 'EACCES') {
102
+ return {
103
+ passed: false,
104
+ error: `配置文件不可读: ${path}`,
105
+ };
106
+ }
107
+ else {
108
+ return {
109
+ passed: false,
110
+ warning: `配置文件检查失败: ${error.message}`,
111
+ };
112
+ }
113
+ }
114
+ }
115
+ /**
116
+ * Check if current user has necessary permissions
117
+ */
118
+ function checkPermissions() {
119
+ const isRoot = process.getuid && process.getuid() === 0;
120
+ if (isRoot) {
121
+ return { passed: true };
122
+ }
123
+ // Check if sudo is available
124
+ return {
125
+ passed: true,
126
+ warning: '当前用户不是 root - 某些操作可能需要 sudo 权限',
127
+ };
128
+ }
129
+ /**
130
+ * Perform all preflight checks
131
+ */
132
+ async function preflightChecks(options = {}) {
133
+ const result = {
134
+ passed: true,
135
+ critical: false,
136
+ errors: [],
137
+ warnings: [],
138
+ suggestions: [],
139
+ checks: {},
140
+ };
141
+ // Check systemd
142
+ if (options.checkSystemd !== false) {
143
+ const systemdResult = await checkSystemd();
144
+ result.checks.systemd = systemdResult.passed;
145
+ if (!systemdResult.passed) {
146
+ result.passed = false;
147
+ result.critical = true;
148
+ if (systemdResult.error) {
149
+ result.errors.push(systemdResult.error);
150
+ result.suggestions.push('确保在支持 systemd 的 Linux 发行版上运行 (Debian 10+, Ubuntu 20.04+, CentOS 8+)');
151
+ }
152
+ }
153
+ }
154
+ // Check Xray binary
155
+ if (options.checkXray) {
156
+ const xrayResult = await checkXray();
157
+ result.checks.xray = xrayResult.passed;
158
+ if (!xrayResult.passed) {
159
+ result.passed = false;
160
+ if (xrayResult.error) {
161
+ result.errors.push(xrayResult.error);
162
+ result.suggestions.push(`修复 Xray 二进制文件权限: sudo chmod +x ${paths_1.DEFAULT_PATHS.XRAY_BINARY}`);
163
+ }
164
+ else if (xrayResult.warning) {
165
+ result.warnings.push(xrayResult.warning);
166
+ result.suggestions.push(`安装 Xray: https://github.com/XTLS/Xray-install`);
167
+ }
168
+ }
169
+ }
170
+ // Check config file
171
+ if (options.checkConfig) {
172
+ const configPath = options.configPath || paths_1.DEFAULT_PATHS.CONFIG_FILE;
173
+ const configResult = await checkConfig(configPath);
174
+ result.checks.config = configResult.passed;
175
+ if (!configResult.passed) {
176
+ result.passed = false;
177
+ if (configResult.error) {
178
+ result.errors.push(configResult.error);
179
+ result.suggestions.push(`修复配置文件权限: sudo chmod 600 ${configPath}`);
180
+ }
181
+ else if (configResult.warning) {
182
+ result.warnings.push(configResult.warning);
183
+ result.suggestions.push(`创建配置文件: sudo touch ${configPath}`);
184
+ }
185
+ }
186
+ }
187
+ // Check permissions
188
+ const permResult = checkPermissions();
189
+ result.checks.permissions = permResult.passed;
190
+ if (permResult.warning) {
191
+ result.warnings.push(permResult.warning);
192
+ }
193
+ return result;
194
+ }
195
+ /**
196
+ * Check if running as root
197
+ */
198
+ function isRoot() {
199
+ return !!(process.getuid && process.getuid() === 0);
200
+ }
201
+ /**
202
+ * Check if sudo is available
203
+ */
204
+ async function canUseSudo() {
205
+ return new Promise((resolve) => {
206
+ const child = (0, child_process_1.spawn)('which', ['sudo']);
207
+ child.on('close', (code) => {
208
+ resolve(code === 0);
209
+ });
210
+ child.on('error', () => {
211
+ resolve(false);
212
+ });
213
+ });
214
+ }
215
+ //# sourceMappingURL=preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/utils/preflight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * 输入验证工具函数
3
+ * @module utils/validator
4
+ */
5
+ /**
6
+ * 验证邮箱地址
7
+ * @param email 邮箱地址
8
+ * @returns 是否有效
9
+ */
10
+ export declare function isValidEmail(email: string): boolean;
11
+ /**
12
+ * 验证 UUID v4 格式
13
+ * @param uuid UUID 字符串
14
+ * @returns 是否有效
15
+ */
16
+ export declare function isValidUuid(uuid: string): boolean;
17
+ /**
18
+ * 验证端口号(1-65535)
19
+ * @param port 端口号(数字或字符串)
20
+ * @returns 是否有效
21
+ */
22
+ export declare function isValidPort(port: number | string): boolean;
23
+ /**
24
+ * 验证域名
25
+ * @param domain 域名
26
+ * @returns 是否有效
27
+ */
28
+ export declare function isValidDomain(domain: string): boolean;
29
+ /**
30
+ * 验证服务名称
31
+ * @param serviceName 服务名称
32
+ * @returns 是否有效
33
+ */
34
+ export declare function isValidServiceName(serviceName: string): boolean;
35
+ /**
36
+ * 验证 IPv4 地址
37
+ * @param ip IP 地址
38
+ * @returns 是否有效
39
+ */
40
+ export declare function isValidIPv4(ip: string): boolean;
41
+ /**
42
+ * 验证 Unix 路径
43
+ * @param path 路径字符串
44
+ * @returns 是否有效
45
+ */
46
+ export declare function isValidPath(path: string): boolean;
47
+ /**
48
+ * 验证 URL
49
+ * @param url URL 字符串
50
+ * @returns 是否有效
51
+ */
52
+ export declare function isValidUrl(url: string): boolean;
53
+ /**
54
+ * 验证器接口
55
+ */
56
+ export interface Validator {
57
+ validate(value: string): boolean;
58
+ errorMessage: string;
59
+ }
60
+ /**
61
+ * 验证器映射
62
+ */
63
+ export declare const validators: Record<string, Validator>;
64
+ /**
65
+ * 验证结果
66
+ */
67
+ export interface ValidationResult {
68
+ /** 是否有效 */
69
+ valid: boolean;
70
+ /** 错误消息 */
71
+ error?: string;
72
+ /** 字段名称 */
73
+ field?: string;
74
+ }
75
+ /**
76
+ * 通用验证函数
77
+ * @param value 待验证的值
78
+ * @param validatorName 验证器名称
79
+ * @param fieldName 字段名称(用于错误消息)
80
+ * @returns 验证结果
81
+ */
82
+ export declare function validate(value: string, validatorName: keyof typeof validators, fieldName?: string): ValidationResult;
83
+ /**
84
+ * 批量验证
85
+ * @param values 字段和值的映射
86
+ * @param validatorMap 字段和验证器的映射
87
+ * @returns 验证结果列表
88
+ */
89
+ export declare function validateMultiple(values: Record<string, string>, validatorMap: Record<string, keyof typeof validators>): ValidationResult[];
90
+ /**
91
+ * 检查所有验证是否通过
92
+ * @param results 验证结果列表
93
+ * @returns 是否全部通过
94
+ */
95
+ export declare function allValid(results: ValidationResult[]): boolean;
96
+ /**
97
+ * 获取所有错误消息
98
+ * @param results 验证结果列表
99
+ * @returns 错误消息列表
100
+ */
101
+ export declare function getErrors(results: ValidationResult[]): string[];
102
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqCH;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAKnD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKjD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAQ1D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAKrD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAK/D;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAK/C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKjD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO/C;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CA2ChD,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW;IACX,KAAK,EAAE,OAAO,CAAC;IAEf,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,OAAO,UAAU,EACtC,SAAS,CAAC,EAAE,MAAM,GACjB,gBAAgB,CAsBlB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,UAAU,CAAC,GACpD,gBAAgB,EAAE,CAWpB;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAE7D;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,EAAE,CAE/D"}