package cmd import ( initcmd "sunhpc/cmd/init" "sunhpc/cmd/soft" "sunhpc/internal/log" "github.com/spf13/cobra" "github.com/spf13/viper" ) var ( cfgFile string verbose bool noColor bool ) var rootCmd = &cobra.Command{ Use: "sunhpc", Short: "SunHPC - HPC集群一体化运维工具", PersistentPreRun: func(cmd *cobra.Command, args []string) { // 初始化日志 log.Init(verbose) // 是否禁用颜色 if noColor { log.EnableColor(false) } log.Debugf("命令: %s", cmd.Name()) log.Debugf("详细模式: %v", verbose) }, PersistentPostRun: func(cmd *cobra.Command, args []string) { // 同步日志 log.Sync() log.Close() }, } func Execute() error { return rootCmd.Execute() } func init() { cobra.OnInitialize(initConfig) rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "配置文件路径 (默认为 /etc/sunhpc/sunhpc.yaml)") rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "启用详细日志输出") rootCmd.PersistentFlags().BoolVar(&noColor, "no-color", false, "禁用彩色输出") // 注册一级子命令 rootCmd.AddCommand(initcmd.Cmd) rootCmd.AddCommand(soft.Cmd) rootCmd.AddCommand(nodeCmd) } func initConfig() { if cfgFile != "" { viper.SetConfigFile(cfgFile) } else { viper.AddConfigPath("/etc/sunhpc") viper.SetConfigType("yaml") viper.SetConfigName("sunhpc") } viper.AutomaticEnv() if err := viper.ReadInConfig(); err == nil { log.Infof("使用配置文件: %s", viper.ConfigFileUsed()) } else { log.Debugf("未找到配置文件: %v", err) } }