diff --git a/cmd/builtininstall/builtininstall.go b/cmd/builtininstall/builtininstall.go index 08ef753..f20011e 100644 --- a/cmd/builtininstall/builtininstall.go +++ b/cmd/builtininstall/builtininstall.go @@ -1,7 +1,8 @@ package builtininstall import ( - + "flag" + "fmt" "os" "os/exec" "path/filepath" @@ -13,6 +14,19 @@ import ( // Run 执行内建包安装逻辑 func Run(args []string) { + fs := flag.NewFlagSet("builtininstall", flag.ExitOnError) + fs.Usage = func() { + fmt.Fprintf(os.Stderr, "\n白虎面板内建依赖安装工具\n\n") + fmt.Fprintf(os.Stderr, "用法:\n") + fmt.Fprintf(os.Stderr, " baihu builtininstall\n\n") + fmt.Fprintf(os.Stderr, "说明:\n") + fmt.Fprintf(os.Stderr, " 此命令将为系统中已安装的 Node.js 和 Python 环境安装白虎面板所需的内建依赖包。\n\n") + } + + if err := fs.Parse(args); err != nil { + return + } + logger.Infof("[Builtin] 开始为 mise 环境安装内建包...") // 1. 确定内建包路径 @@ -30,15 +44,15 @@ func Run(args []string) { } // 2. 安装 Node.js 包 - installForLanguage("node", filepath.Join(builtinPath, "nodejs"), "npm install") + installForLanguage("node", filepath.Join(builtinPath, "nodejs")) // 3. 安装 Python 包 - installForLanguage("python", filepath.Join(builtinPath, "python"), "pip install -e") + installForLanguage("python", filepath.Join(builtinPath, "python")) logger.Infof("[Builtin] 内建包安装流程完成") } -func installForLanguage(lang, pkgPath, installBaseCmd string) { +func installForLanguage(lang, pkgPath string) { if _, err := os.Stat(pkgPath); os.IsNotExist(err) { logger.Warnf("[Builtin] %s 的内建包目录不存在: %s", lang, pkgPath) return diff --git a/cmd/reposync/reposync.go b/cmd/reposync/reposync.go index 965c157..1d0834a 100644 --- a/cmd/reposync/reposync.go +++ b/cmd/reposync/reposync.go @@ -36,6 +36,7 @@ type Config struct { Dependence string // Script dependence file keywords, vertical line separated Extensions string // Script file extensions, vertical line separated TaskID string + RepoTaskID string TaskLanguages string TaskTimeout int CommentToTask string @@ -62,13 +63,31 @@ func Run(args []string) { fs.StringVar(&cfg.Extensions, "extensions", "", "Script extensions (| separated)") fs.StringVar(&cfg.TaskID, "task-id", "", "Task ID for metadata") fs.StringVar(&cfg.TaskLanguages, "task-langs", "", "Configured languages (JSON)") - fs.StringVar(&cfg.TaskID, "repo-task-id", "", "Original Task ID") + fs.StringVar(&cfg.RepoTaskID, "repo-task-id", "", "Original Task ID") fs.IntVar(&cfg.TaskTimeout, "task-timeout", 30, "Task timeout (minutes)") fs.StringVar(&cfg.CommentToTask, "commenttotask", "false", "Compatible with QL format script comment parsing (true/false)") fs.StringVar(&cfg.PreCommand, "pre-command", "", "Default pre-command for discovered tasks") fs.StringVar(&cfg.PostCommand, "post-command", "", "Default post-command for discovered tasks") - fs.Parse(args) + fs.Usage = func() { + fmt.Fprintf(os.Stderr, "\n白虎面板仓库同步工具 (Reposync)\n\n") + fmt.Fprintf(os.Stderr, "用法:\n") + fmt.Fprintf(os.Stderr, " baihu reposync [参数]\n\n") + fmt.Fprintf(os.Stderr, "参数详情:\n") + fs.PrintDefaults() + fmt.Fprintf(os.Stderr, "\n示例:\n") + fmt.Fprintf(os.Stderr, " baihu reposync --source-url https://github.com/xxx/repo.git --target-path $SCRIPTS_DIR$/repo1\n\n") + } + + if err := fs.Parse(args); err != nil { + return + } + + if cfg.SourceURL == "" { + fmt.Fprintf(os.Stderr, "错误: 必须提供 --source-url 参数\n") + fs.Usage() + return + } // 处理 $SCRIPTS_DIR$ 代号替换 if strings.Contains(cfg.TargetPath, constant.ScriptsDirPlaceholder) { diff --git a/cmd/resetpwd/resetpwd.go b/cmd/resetpwd/resetpwd.go index d16230e..531dc54 100644 --- a/cmd/resetpwd/resetpwd.go +++ b/cmd/resetpwd/resetpwd.go @@ -2,6 +2,7 @@ package resetpwd import ( "bufio" + "flag" "fmt" "os" "strings" @@ -12,6 +13,19 @@ import ( ) func Run(args []string) { + fs := flag.NewFlagSet("resetpwd", flag.ExitOnError) + fs.Usage = func() { + fmt.Fprintf(os.Stderr, "\n白虎面板用户密码重置工具\n\n") + fmt.Fprintf(os.Stderr, "用法:\n") + fmt.Fprintf(os.Stderr, " baihu resetpwd [用户名]\n\n") + fmt.Fprintf(os.Stderr, "示例:\n") + fmt.Fprintf(os.Stderr, " baihu resetpwd admin\n\n") + } + + if err := fs.Parse(args); err != nil { + return + } + // 基础环境初始化 bootstrap.InitBasic() settingsService := services.NewSettingsService() @@ -22,9 +36,9 @@ func Run(args []string) { userService := services.NewUserService() var username string - - if len(args) >= 1 { - username = args[0] + parsedArgs := fs.Args() + if len(parsedArgs) >= 1 { + username = parsedArgs[0] } else { username = "admin" } diff --git a/cmd/restore/restore.go b/cmd/restore/restore.go index 5d24319..18391b1 100644 --- a/cmd/restore/restore.go +++ b/cmd/restore/restore.go @@ -1,6 +1,7 @@ package restore import ( + "flag" "fmt" "os" "path/filepath" @@ -10,12 +11,27 @@ import ( ) func Run(args []string) { - if len(args) < 1 { - fmt.Println("用法: baihu restore ") - os.Exit(1) + fs := flag.NewFlagSet("restore", flag.ExitOnError) + fs.Usage = func() { + fmt.Fprintf(os.Stderr, "\n白虎面板系统数据恢复工具\n\n") + fmt.Fprintf(os.Stderr, "用法:\n") + fmt.Fprintf(os.Stderr, " baihu restore <备份文件.zip>\n\n") + fmt.Fprintf(os.Stderr, "示例:\n") + fmt.Fprintf(os.Stderr, " baihu restore backup_20231027.zip\n\n") } - backupFile := args[0] + if err := fs.Parse(args); err != nil { + return + } + + parsedArgs := fs.Args() + if len(parsedArgs) < 1 { + fmt.Fprintf(os.Stderr, "错误: 必须提供备份文件路径\n") + fs.Usage() + return + } + + backupFile := parsedArgs[0] absPath, err := filepath.Abs(backupFile) if err != nil { fmt.Printf("文件路径解析失败: %v\n", err) diff --git a/main.go b/main.go index 77d4a53..64a7cf0 100644 --- a/main.go +++ b/main.go @@ -13,29 +13,29 @@ import ( // @version 1.0 // @description Baihu Panel OpenAPI Server documentation. // @termsOfService http://swagger.io/terms/ - // @contact.name API Support // @contact.url http://www.swagger.io/support // @contact.email support@swagger.io - // @license.name Apache 2.0 // @license.url http://www.apache.org/licenses/LICENSE-2.0.html - // @host localhost:8052 // @BasePath /open2api/v1 // @query.collection.format multi - // @securityDefinitions.apikey BearerAuth // @in header // @name Authorization // @description Type "Bearer" followed by a space and the API token. func printHelp() { - fmt.Println("Usage: baihu [arguments]") - fmt.Println("Available commands:") + fmt.Println("\n白虎面板 (Baihu Panel) - 现代化的服务器管理面板") + fmt.Println("用法:") + fmt.Println(" baihu <命令> [参数]") + fmt.Println("可用命令:") for _, info := range constant.Commands { - fmt.Printf(" %-12s %s\n", info.Name, info.Description) + fmt.Printf(" %-15s %s\n", info.Name, info.Description) } + fmt.Println("\n使用 'baihu <命令> --help' 查看具体命令的参数说明。") + fmt.Println() } func main() {