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
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Xray Manager CLI Entry Point
|
|
5
|
+
*
|
|
6
|
+
* This is the main entry point for the CLI tool.
|
|
7
|
+
* It performs preflight checks and launches the interactive menu.
|
|
8
|
+
*
|
|
9
|
+
* @module cli
|
|
10
|
+
*/
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const commander_1 = require("commander");
|
|
16
|
+
const logger_1 = __importDefault(require("./utils/logger"));
|
|
17
|
+
const exit_codes_1 = require("./constants/exit-codes");
|
|
18
|
+
const preflight_1 = require("./utils/preflight");
|
|
19
|
+
const interactive_1 = require("./commands/interactive");
|
|
20
|
+
// Read package.json for version
|
|
21
|
+
const packageJson = require('../package.json');
|
|
22
|
+
/**
|
|
23
|
+
* Main CLI function
|
|
24
|
+
*/
|
|
25
|
+
async function main() {
|
|
26
|
+
// Create Commander program
|
|
27
|
+
const program = new commander_1.Command();
|
|
28
|
+
program
|
|
29
|
+
.name('xray-manager')
|
|
30
|
+
.description('Xray VPN 服务管理 CLI 工具')
|
|
31
|
+
.version(packageJson.version, '-v, --version', '显示版本号')
|
|
32
|
+
.helpOption('-h, --help', '显示帮助信息');
|
|
33
|
+
// Global options
|
|
34
|
+
program
|
|
35
|
+
.option('--config <path>', '指定配置文件路径')
|
|
36
|
+
.option('--service <name>', '指定服务名称', 'xray')
|
|
37
|
+
.option('--json', '以 JSON 格式输出')
|
|
38
|
+
.option('--no-color', '禁用彩色输出')
|
|
39
|
+
.option('--verbose', '详细输出模式');
|
|
40
|
+
// Parse arguments
|
|
41
|
+
program.parse(process.argv);
|
|
42
|
+
const options = program.opts();
|
|
43
|
+
// Configure logger based on options
|
|
44
|
+
if (options.noColor) {
|
|
45
|
+
logger_1.default.configure({ color: false });
|
|
46
|
+
}
|
|
47
|
+
// If no command provided, start interactive menu
|
|
48
|
+
if (process.argv.length === 2 || program.args.length === 0) {
|
|
49
|
+
try {
|
|
50
|
+
// Perform preflight checks
|
|
51
|
+
const preflightResult = await (0, preflight_1.preflightChecks)({
|
|
52
|
+
checkSystemd: true,
|
|
53
|
+
checkXray: false, // Optional for menu startup
|
|
54
|
+
checkConfig: false, // Optional for menu startup
|
|
55
|
+
});
|
|
56
|
+
if (!preflightResult.passed && preflightResult.critical) {
|
|
57
|
+
logger_1.default.error('预检查失败 - 无法启动菜单');
|
|
58
|
+
preflightResult.errors.forEach((error) => logger_1.default.error(` • ${error}`));
|
|
59
|
+
if (preflightResult.suggestions.length > 0) {
|
|
60
|
+
logger_1.default.hint('建议解决方案:');
|
|
61
|
+
preflightResult.suggestions.forEach((suggestion) => logger_1.default.info(` • ${suggestion}`));
|
|
62
|
+
}
|
|
63
|
+
await (0, exit_codes_1.gracefulExit)(exit_codes_1.ExitCode.SERVICE_ERROR);
|
|
64
|
+
}
|
|
65
|
+
// Show warnings but continue
|
|
66
|
+
if (preflightResult.warnings.length > 0) {
|
|
67
|
+
preflightResult.warnings.forEach((warning) => logger_1.default.warn(warning));
|
|
68
|
+
logger_1.default.newline();
|
|
69
|
+
}
|
|
70
|
+
// Start interactive menu
|
|
71
|
+
await (0, interactive_1.startInteractiveMenu)({
|
|
72
|
+
configPath: options.config,
|
|
73
|
+
serviceName: options.service,
|
|
74
|
+
jsonOutput: options.json,
|
|
75
|
+
verbose: options.verbose,
|
|
76
|
+
});
|
|
77
|
+
await (0, exit_codes_1.gracefulExit)(exit_codes_1.ExitCode.SUCCESS);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
logger_1.default.error('启动菜单时出错:');
|
|
81
|
+
logger_1.default.error(error.message);
|
|
82
|
+
if (options.verbose && error instanceof Error) {
|
|
83
|
+
logger_1.default.error('Stack trace:');
|
|
84
|
+
logger_1.default.error(error.stack || 'No stack trace available');
|
|
85
|
+
}
|
|
86
|
+
await (0, exit_codes_1.gracefulExit)(exit_codes_1.ExitCode.GENERAL_ERROR);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Handle SIGINT (Ctrl+C)
|
|
91
|
+
process.on('SIGINT', async () => {
|
|
92
|
+
logger_1.default.newline();
|
|
93
|
+
logger_1.default.info('👋 程序已中断');
|
|
94
|
+
await (0, exit_codes_1.gracefulExit)(exit_codes_1.ExitCode.SIGINT);
|
|
95
|
+
});
|
|
96
|
+
// Handle uncaught errors
|
|
97
|
+
process.on('uncaughtException', async (error) => {
|
|
98
|
+
logger_1.default.error('未捕获的异常:');
|
|
99
|
+
logger_1.default.error(error.message);
|
|
100
|
+
await (0, exit_codes_1.gracefulExit)(exit_codes_1.ExitCode.GENERAL_ERROR);
|
|
101
|
+
});
|
|
102
|
+
process.on('unhandledRejection', async (reason) => {
|
|
103
|
+
logger_1.default.error('未处理的 Promise 拒绝:');
|
|
104
|
+
logger_1.default.error(String(reason));
|
|
105
|
+
await (0, exit_codes_1.gracefulExit)(exit_codes_1.ExitCode.GENERAL_ERROR);
|
|
106
|
+
});
|
|
107
|
+
// Run main function
|
|
108
|
+
main().catch(async (error) => {
|
|
109
|
+
logger_1.default.error('Fatal error:');
|
|
110
|
+
logger_1.default.error(error.message);
|
|
111
|
+
await (0, exit_codes_1.gracefulExit)(exit_codes_1.ExitCode.GENERAL_ERROR);
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Command Handler
|
|
3
|
+
*
|
|
4
|
+
* Handles configuration-related commands (view, backup, restore, modify)
|
|
5
|
+
*
|
|
6
|
+
* @module commands/config
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Config command options
|
|
10
|
+
*/
|
|
11
|
+
export interface ConfigCommandOptions {
|
|
12
|
+
/** Config file path */
|
|
13
|
+
configPath?: string;
|
|
14
|
+
/** Service name */
|
|
15
|
+
serviceName?: string;
|
|
16
|
+
/** JSON output mode */
|
|
17
|
+
json?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Display current configuration
|
|
21
|
+
*
|
|
22
|
+
* @param options - Command options
|
|
23
|
+
*/
|
|
24
|
+
export declare function viewConfig(options?: ConfigCommandOptions): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Create a configuration backup
|
|
27
|
+
*
|
|
28
|
+
* @param options - Command options
|
|
29
|
+
*/
|
|
30
|
+
export declare function backupConfig(options?: ConfigCommandOptions): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* List all configuration backups
|
|
33
|
+
*
|
|
34
|
+
* @param options - Command options
|
|
35
|
+
*/
|
|
36
|
+
export declare function listBackups(options?: ConfigCommandOptions): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Restore configuration from backup
|
|
39
|
+
*
|
|
40
|
+
* @param options - Command options
|
|
41
|
+
*/
|
|
42
|
+
export declare function restoreConfig(options?: ConfigCommandOptions): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Modify configuration item
|
|
45
|
+
*
|
|
46
|
+
* @param options - Command options
|
|
47
|
+
*/
|
|
48
|
+
export declare function modifyConfig(options?: ConfigCommandOptions): Promise<void>;
|
|
49
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,uBAAuB;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,uBAAuB;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+ClF;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBpF;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CnF;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqErF;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsGpF"}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Config Command Handler
|
|
4
|
+
*
|
|
5
|
+
* Handles configuration-related commands (view, backup, restore, modify)
|
|
6
|
+
*
|
|
7
|
+
* @module commands/config
|
|
8
|
+
*/
|
|
9
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
10
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.viewConfig = viewConfig;
|
|
14
|
+
exports.backupConfig = backupConfig;
|
|
15
|
+
exports.listBackups = listBackups;
|
|
16
|
+
exports.restoreConfig = restoreConfig;
|
|
17
|
+
exports.modifyConfig = modifyConfig;
|
|
18
|
+
const config_manager_1 = require("../services/config-manager");
|
|
19
|
+
const systemd_manager_1 = require("../services/systemd-manager");
|
|
20
|
+
const logger_1 = __importDefault(require("../utils/logger"));
|
|
21
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
22
|
+
const ora_1 = __importDefault(require("ora"));
|
|
23
|
+
const prompts_1 = require("@inquirer/prompts");
|
|
24
|
+
const path_1 = require("path");
|
|
25
|
+
/**
|
|
26
|
+
* Display current configuration
|
|
27
|
+
*
|
|
28
|
+
* @param options - Command options
|
|
29
|
+
*/
|
|
30
|
+
async function viewConfig(options = {}) {
|
|
31
|
+
try {
|
|
32
|
+
const manager = new config_manager_1.ConfigManager(options.configPath);
|
|
33
|
+
const config = await manager.readConfig();
|
|
34
|
+
if (options.json) {
|
|
35
|
+
console.log(JSON.stringify(config, null, 2));
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
logger_1.default.newline();
|
|
39
|
+
logger_1.default.separator();
|
|
40
|
+
console.log(chalk_1.default.bold.cyan('⚙️ 当前配置'));
|
|
41
|
+
logger_1.default.separator();
|
|
42
|
+
logger_1.default.newline();
|
|
43
|
+
// Display main config sections
|
|
44
|
+
console.log(chalk_1.default.cyan(' 日志配置:'));
|
|
45
|
+
if (config.log) {
|
|
46
|
+
console.log(chalk_1.default.gray(` 级别: ${config.log.loglevel || 'warning'}`));
|
|
47
|
+
console.log(chalk_1.default.gray(` 路径: ${config.log.access || 'none'}`));
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
console.log(chalk_1.default.gray(' 未配置'));
|
|
51
|
+
}
|
|
52
|
+
logger_1.default.newline();
|
|
53
|
+
console.log(chalk_1.default.cyan(' 入站配置:'));
|
|
54
|
+
for (const inbound of config.inbounds || []) {
|
|
55
|
+
console.log(chalk_1.default.gray(` 协议: ${inbound.protocol}`));
|
|
56
|
+
console.log(chalk_1.default.gray(` 端口: ${inbound.port}`));
|
|
57
|
+
console.log(chalk_1.default.gray(` 标签: ${inbound.tag || 'default'}`));
|
|
58
|
+
if (inbound.settings?.clients) {
|
|
59
|
+
console.log(chalk_1.default.gray(` 用户数: ${inbound.settings.clients.length}`));
|
|
60
|
+
}
|
|
61
|
+
logger_1.default.newline();
|
|
62
|
+
}
|
|
63
|
+
console.log(chalk_1.default.cyan(' 出站配置:'));
|
|
64
|
+
for (const outbound of config.outbounds || []) {
|
|
65
|
+
console.log(chalk_1.default.gray(` 协议: ${outbound.protocol}`));
|
|
66
|
+
console.log(chalk_1.default.gray(` 标签: ${outbound.tag || 'default'}`));
|
|
67
|
+
logger_1.default.newline();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
logger_1.default.error(error.message);
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Create a configuration backup
|
|
77
|
+
*
|
|
78
|
+
* @param options - Command options
|
|
79
|
+
*/
|
|
80
|
+
async function backupConfig(options = {}) {
|
|
81
|
+
try {
|
|
82
|
+
const manager = new config_manager_1.ConfigManager(options.configPath);
|
|
83
|
+
const spinner = (0, ora_1.default)('正在备份配置...').start();
|
|
84
|
+
const backupPath = await manager.backupConfig();
|
|
85
|
+
spinner.succeed(chalk_1.default.green('✅ 配置备份成功!'));
|
|
86
|
+
logger_1.default.newline();
|
|
87
|
+
console.log(chalk_1.default.cyan(' 备份文件: ') + chalk_1.default.white(backupPath));
|
|
88
|
+
logger_1.default.newline();
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
logger_1.default.error(error.message);
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* List all configuration backups
|
|
97
|
+
*
|
|
98
|
+
* @param options - Command options
|
|
99
|
+
*/
|
|
100
|
+
async function listBackups(options = {}) {
|
|
101
|
+
try {
|
|
102
|
+
const manager = new config_manager_1.ConfigManager(options.configPath);
|
|
103
|
+
const backups = await manager.listBackups();
|
|
104
|
+
if (options.json) {
|
|
105
|
+
console.log(JSON.stringify(backups, null, 2));
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
logger_1.default.newline();
|
|
109
|
+
logger_1.default.separator();
|
|
110
|
+
console.log(chalk_1.default.bold.cyan(`💾 配置备份列表 (共 ${backups.length} 个备份)`));
|
|
111
|
+
logger_1.default.separator();
|
|
112
|
+
logger_1.default.newline();
|
|
113
|
+
if (backups.length === 0) {
|
|
114
|
+
console.log(chalk_1.default.gray(' 暂无备份'));
|
|
115
|
+
logger_1.default.newline();
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
// Display backups
|
|
119
|
+
for (let i = 0; i < backups.length; i++) {
|
|
120
|
+
const backup = backups[i];
|
|
121
|
+
const filename = (0, path_1.basename)(backup);
|
|
122
|
+
// Extract timestamp from filename (config.YYYY-MM-DDTHH-MM-SS-sssZ.json)
|
|
123
|
+
const timestampMatch = filename.match(/config\.(.+)\.json/);
|
|
124
|
+
const timestamp = timestampMatch
|
|
125
|
+
? timestampMatch[1].replace(/-/g, ':').replace(/T(\d{2}):(\d{2}):(\d{2})/, 'T$1-$2-$3')
|
|
126
|
+
: 'unknown';
|
|
127
|
+
console.log(chalk_1.default.cyan(` ${i + 1}. ${filename}`));
|
|
128
|
+
console.log(chalk_1.default.gray(` 时间: ${timestamp}`));
|
|
129
|
+
console.log(chalk_1.default.gray(` 路径: ${backup}`));
|
|
130
|
+
logger_1.default.newline();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
logger_1.default.error(error.message);
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Restore configuration from backup
|
|
140
|
+
*
|
|
141
|
+
* @param options - Command options
|
|
142
|
+
*/
|
|
143
|
+
async function restoreConfig(options = {}) {
|
|
144
|
+
try {
|
|
145
|
+
const manager = new config_manager_1.ConfigManager(options.configPath);
|
|
146
|
+
const systemdManager = new systemd_manager_1.SystemdManager(options.serviceName || 'xray');
|
|
147
|
+
// List backups first
|
|
148
|
+
const backups = await manager.listBackups();
|
|
149
|
+
if (backups.length === 0) {
|
|
150
|
+
logger_1.default.warn('暂无备份可恢复');
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
logger_1.default.newline();
|
|
154
|
+
console.log(chalk_1.default.bold('📋 可用备份:'));
|
|
155
|
+
backups.forEach((backup, i) => {
|
|
156
|
+
const filename = (0, path_1.basename)(backup);
|
|
157
|
+
console.log(` ${i + 1}. ${filename}`);
|
|
158
|
+
});
|
|
159
|
+
logger_1.default.newline();
|
|
160
|
+
// Prompt for backup selection
|
|
161
|
+
const backupInput = await (0, prompts_1.input)({
|
|
162
|
+
message: '请输入要恢复的备份序号或完整路径:',
|
|
163
|
+
});
|
|
164
|
+
// Check if input is a number (index)
|
|
165
|
+
let targetBackup = backupInput;
|
|
166
|
+
const index = parseInt(backupInput, 10) - 1;
|
|
167
|
+
if (!isNaN(index) && index >= 0 && index < backups.length) {
|
|
168
|
+
targetBackup = backups[index];
|
|
169
|
+
}
|
|
170
|
+
// Confirm restoration
|
|
171
|
+
const confirmed = await (0, prompts_1.confirm)({
|
|
172
|
+
message: chalk_1.default.yellow(`⚠️ 确定要从备份恢复配置吗?当前配置将被覆盖(会先自动备份)。`),
|
|
173
|
+
default: false,
|
|
174
|
+
});
|
|
175
|
+
if (!confirmed) {
|
|
176
|
+
logger_1.default.info('已取消恢复操作');
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const spinner = (0, ora_1.default)('正在恢复配置...').start();
|
|
180
|
+
await manager.restoreConfig(targetBackup);
|
|
181
|
+
spinner.succeed(chalk_1.default.green('✅ 配置恢复成功!'));
|
|
182
|
+
logger_1.default.newline();
|
|
183
|
+
// Ask if user wants to restart service
|
|
184
|
+
const shouldRestart = await (0, prompts_1.confirm)({
|
|
185
|
+
message: chalk_1.default.yellow('是否立即重启服务以应用新配置?'),
|
|
186
|
+
default: true,
|
|
187
|
+
});
|
|
188
|
+
if (shouldRestart) {
|
|
189
|
+
const restartSpinner = (0, ora_1.default)('正在重启服务...').start();
|
|
190
|
+
await systemdManager.restart();
|
|
191
|
+
restartSpinner.succeed(chalk_1.default.green('✅ 服务重启成功!'));
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
logger_1.default.info('💡 请记得手动重启服务以应用新配置');
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
logger_1.default.error(error.message);
|
|
199
|
+
process.exit(1);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Modify configuration item
|
|
204
|
+
*
|
|
205
|
+
* @param options - Command options
|
|
206
|
+
*/
|
|
207
|
+
async function modifyConfig(options = {}) {
|
|
208
|
+
try {
|
|
209
|
+
const manager = new config_manager_1.ConfigManager(options.configPath);
|
|
210
|
+
const systemdManager = new systemd_manager_1.SystemdManager(options.serviceName || 'xray');
|
|
211
|
+
logger_1.default.newline();
|
|
212
|
+
console.log(chalk_1.default.bold('⚙️ 配置修改'));
|
|
213
|
+
logger_1.default.newline();
|
|
214
|
+
// Common config items
|
|
215
|
+
const configItems = [
|
|
216
|
+
{ name: '日志级别 (log.loglevel)', value: 'log.loglevel' },
|
|
217
|
+
{ name: '访问日志路径 (log.access)', value: 'log.access' },
|
|
218
|
+
{ name: '错误日志路径 (log.error)', value: 'log.error' },
|
|
219
|
+
{ name: '自定义路径', value: 'custom' },
|
|
220
|
+
];
|
|
221
|
+
const itemChoice = await (0, prompts_1.select)({
|
|
222
|
+
message: '请选择要修改的配置项:',
|
|
223
|
+
choices: configItems,
|
|
224
|
+
});
|
|
225
|
+
let path = itemChoice;
|
|
226
|
+
if (itemChoice === 'custom') {
|
|
227
|
+
path = await (0, prompts_1.input)({
|
|
228
|
+
message: '请输入配置项路径 (例如: log.loglevel):',
|
|
229
|
+
validate: (value) => {
|
|
230
|
+
if (!value || value.trim().length === 0) {
|
|
231
|
+
return '配置项路径不能为空';
|
|
232
|
+
}
|
|
233
|
+
return true;
|
|
234
|
+
},
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
// Get current value
|
|
238
|
+
const currentConfig = await manager.readConfig();
|
|
239
|
+
const parts = path.split('.');
|
|
240
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
241
|
+
let currentValue = currentConfig;
|
|
242
|
+
for (const part of parts) {
|
|
243
|
+
currentValue = currentValue?.[part];
|
|
244
|
+
}
|
|
245
|
+
console.log(chalk_1.default.gray(` 当前值: ${currentValue !== undefined ? currentValue : '(未设置)'}`));
|
|
246
|
+
logger_1.default.newline();
|
|
247
|
+
// Prompt for new value
|
|
248
|
+
const newValueStr = await (0, prompts_1.input)({
|
|
249
|
+
message: '请输入新值:',
|
|
250
|
+
});
|
|
251
|
+
// Try to parse as JSON for non-string values
|
|
252
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
253
|
+
let newValue = newValueStr;
|
|
254
|
+
try {
|
|
255
|
+
newValue = JSON.parse(newValueStr);
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
// Keep as string
|
|
259
|
+
}
|
|
260
|
+
// Confirm modification
|
|
261
|
+
const confirmed = await (0, prompts_1.confirm)({
|
|
262
|
+
message: chalk_1.default.yellow(`⚠️ 确定要修改配置项 "${path}" 吗?`),
|
|
263
|
+
default: false,
|
|
264
|
+
});
|
|
265
|
+
if (!confirmed) {
|
|
266
|
+
logger_1.default.info('已取消修改操作');
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
const spinner = (0, ora_1.default)('正在修改配置...').start();
|
|
270
|
+
// Backup first
|
|
271
|
+
await manager.backupConfig();
|
|
272
|
+
// Modify
|
|
273
|
+
await manager.modifyConfigItem(path, newValue);
|
|
274
|
+
spinner.succeed(chalk_1.default.green('✅ 配置修改成功!'));
|
|
275
|
+
logger_1.default.newline();
|
|
276
|
+
// Ask if user wants to restart service
|
|
277
|
+
const shouldRestart = await (0, prompts_1.confirm)({
|
|
278
|
+
message: chalk_1.default.yellow('是否立即重启服务以应用新配置?'),
|
|
279
|
+
default: true,
|
|
280
|
+
});
|
|
281
|
+
if (shouldRestart) {
|
|
282
|
+
const restartSpinner = (0, ora_1.default)('正在重启服务...').start();
|
|
283
|
+
await systemdManager.restart();
|
|
284
|
+
restartSpinner.succeed(chalk_1.default.green('✅ 服务重启成功!'));
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
logger_1.default.info('💡 请记得手动重启服务以应用新配置');
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
logger_1.default.error(error.message);
|
|
292
|
+
process.exit(1);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive Menu Implementation
|
|
3
|
+
*
|
|
4
|
+
* Provides the main interactive menu system for the CLI tool
|
|
5
|
+
*
|
|
6
|
+
* @module commands/interactive
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Menu options configuration
|
|
10
|
+
*/
|
|
11
|
+
export interface MenuOptions {
|
|
12
|
+
/** Config file path */
|
|
13
|
+
configPath?: string;
|
|
14
|
+
/** Service name */
|
|
15
|
+
serviceName?: string;
|
|
16
|
+
/** JSON output mode */
|
|
17
|
+
jsonOutput?: boolean;
|
|
18
|
+
/** Verbose mode */
|
|
19
|
+
verbose?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Menu context information
|
|
23
|
+
*/
|
|
24
|
+
export interface MenuContext {
|
|
25
|
+
/** Service status */
|
|
26
|
+
serviceStatus?: string;
|
|
27
|
+
/** Number of users */
|
|
28
|
+
userCount?: number;
|
|
29
|
+
/** Last updated timestamp */
|
|
30
|
+
lastUpdated?: Date;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Menu stack for navigation
|
|
34
|
+
*/
|
|
35
|
+
export declare class MenuStack {
|
|
36
|
+
private stack;
|
|
37
|
+
push(menu: string): void;
|
|
38
|
+
pop(): string;
|
|
39
|
+
current(): string | undefined;
|
|
40
|
+
depth(): number;
|
|
41
|
+
canGoBack(): boolean;
|
|
42
|
+
clear(): void;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get menu context (service status, user count)
|
|
46
|
+
*/
|
|
47
|
+
export declare function getMenuContext(options?: MenuOptions): Promise<MenuContext>;
|
|
48
|
+
/**
|
|
49
|
+
* Format menu header with context
|
|
50
|
+
*/
|
|
51
|
+
export declare function formatMenuHeader(context: MenuContext): string;
|
|
52
|
+
/**
|
|
53
|
+
* Get main menu options
|
|
54
|
+
*/
|
|
55
|
+
export declare function getMainMenuOptions(): any[];
|
|
56
|
+
/**
|
|
57
|
+
* Get menu depth (for Constitution compliance - max 3 levels)
|
|
58
|
+
*/
|
|
59
|
+
export declare function getMenuDepth(): number;
|
|
60
|
+
/**
|
|
61
|
+
* Format a menu option
|
|
62
|
+
*/
|
|
63
|
+
export declare function formatMenuOption(name: string, value: string): {
|
|
64
|
+
name: string;
|
|
65
|
+
value: string;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Show a menu and get user selection
|
|
69
|
+
*/
|
|
70
|
+
export declare function showMenu(options: any[], message?: string): Promise<string>;
|
|
71
|
+
/**
|
|
72
|
+
* Handle menu selection
|
|
73
|
+
*/
|
|
74
|
+
export declare function handleMenuSelection(selection: string, options: MenuOptions): Promise<boolean>;
|
|
75
|
+
/**
|
|
76
|
+
* Handle SIGINT (Ctrl+C)
|
|
77
|
+
*/
|
|
78
|
+
export declare function handleSigInt(): Promise<boolean>;
|
|
79
|
+
/**
|
|
80
|
+
* Main interactive menu loop
|
|
81
|
+
*/
|
|
82
|
+
export declare function startInteractiveMenu(options: MenuOptions): Promise<void>;
|
|
83
|
+
//# sourceMappingURL=interactive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/commands/interactive.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,uBAAuB;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,uBAAuB;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,mBAAmB;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,qBAAqB;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,6BAA6B;IAC7B,WAAW,CAAC,EAAE,IAAI,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAgB;IAE7B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIxB,GAAG,IAAI,MAAM;IAOb,OAAO,IAAI,MAAM,GAAG,SAAS;IAI7B,KAAK,IAAI,MAAM;IAIf,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,IAAI;CAGd;AAKD;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CAyBpF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAO7D;AAED;;GAEG;AAEH,wBAAgB,kBAAkB,IAAI,GAAG,EAAE,CAqC1C;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAGrC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAa7F;AAED;;GAEG;AAEH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,OAAO,GAAE,MAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAO1F;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAiEnG;AAqED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAQrD;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA+D9E"}
|