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.
- package/LICENSE +21 -0
- package/README.md +798 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +113 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/config.d.ts +49 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +295 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/interactive.d.ts +83 -0
- package/dist/commands/interactive.d.ts.map +1 -0
- package/dist/commands/interactive.js +362 -0
- package/dist/commands/interactive.js.map +1 -0
- package/dist/commands/logs.d.ts +43 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +257 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/service.d.ts +43 -0
- package/dist/commands/service.d.ts.map +1 -0
- package/dist/commands/service.js +177 -0
- package/dist/commands/service.js.map +1 -0
- package/dist/commands/user.d.ts +43 -0
- package/dist/commands/user.d.ts.map +1 -0
- package/dist/commands/user.js +212 -0
- package/dist/commands/user.js.map +1 -0
- package/dist/constants/exit-codes.d.ts +49 -0
- package/dist/constants/exit-codes.d.ts.map +1 -0
- package/dist/constants/exit-codes.js +100 -0
- package/dist/constants/exit-codes.js.map +1 -0
- package/dist/constants/paths.d.ts +57 -0
- package/dist/constants/paths.d.ts.map +1 -0
- package/dist/constants/paths.js +72 -0
- package/dist/constants/paths.js.map +1 -0
- package/dist/constants/timeouts.d.ts +84 -0
- package/dist/constants/timeouts.d.ts.map +1 -0
- package/dist/constants/timeouts.js +111 -0
- package/dist/constants/timeouts.js.map +1 -0
- package/dist/services/config-manager.d.ts +66 -0
- package/dist/services/config-manager.d.ts.map +1 -0
- package/dist/services/config-manager.js +206 -0
- package/dist/services/config-manager.js.map +1 -0
- package/dist/services/log-manager.d.ts +113 -0
- package/dist/services/log-manager.d.ts.map +1 -0
- package/dist/services/log-manager.js +288 -0
- package/dist/services/log-manager.js.map +1 -0
- package/dist/services/systemd-manager.d.ts +197 -0
- package/dist/services/systemd-manager.d.ts.map +1 -0
- package/dist/services/systemd-manager.js +458 -0
- package/dist/services/systemd-manager.js.map +1 -0
- package/dist/services/user-manager.d.ts +63 -0
- package/dist/services/user-manager.d.ts.map +1 -0
- package/dist/services/user-manager.js +219 -0
- package/dist/services/user-manager.js.map +1 -0
- package/dist/types/config.d.ts +256 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +7 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/service.d.ts +96 -0
- package/dist/types/service.d.ts.map +1 -0
- package/dist/types/service.js +7 -0
- package/dist/types/service.js.map +1 -0
- package/dist/types/user.d.ts +114 -0
- package/dist/types/user.d.ts.map +1 -0
- package/dist/types/user.js +7 -0
- package/dist/types/user.js.map +1 -0
- package/dist/utils/clipboard.d.ts +21 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +45 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/format.d.ts +93 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +242 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/logger.d.ts +113 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +260 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/preflight.d.ts +57 -0
- package/dist/utils/preflight.d.ts.map +1 -0
- package/dist/utils/preflight.js +215 -0
- package/dist/utils/preflight.js.map +1 -0
- package/dist/utils/validator.d.ts +102 -0
- package/dist/utils/validator.d.ts.map +1 -0
- package/dist/utils/validator.js +238 -0
- package/dist/utils/validator.js.map +1 -0
- package/dist/utils/which.d.ts +13 -0
- package/dist/utils/which.d.ts.map +1 -0
- package/dist/utils/which.js +28 -0
- package/dist/utils/which.js.map +1 -0
- 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"}
|