From b0fbc3e71041789d1f971a9e1031b44c75038f7f Mon Sep 17 00:00:00 2001 From: NightStar Date: Tue, 28 Jul 2026 16:08:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20server=20cmd=20=E2=80=94=20list/get/sta?= =?UTF-8?q?rt/stop/reboot/reinstall/reset-password/vnc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/cmd/server.go | 177 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 internal/cmd/server.go diff --git a/internal/cmd/server.go b/internal/cmd/server.go new file mode 100644 index 0000000..d2a3fb7 --- /dev/null +++ b/internal/cmd/server.go @@ -0,0 +1,177 @@ +package cmd + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +var serverCmd = &cobra.Command{ + Use: "server", + Short: "Manage cloud servers", +} + +var serverListCmd = &cobra.Command{ + Use: "list", + Short: "List servers", + RunE: func(cmd *cobra.Command, args []string) error { + svc := prov.Server() + if svc == nil { + return fmt.Errorf("server management not supported by current provider") + } + servers, err := svc.List(cmd.Context()) + if err != nil { + return err + } + if flagRaw { + var raw []any + for _, s := range servers { + raw = append(raw, s.Raw) + } + return out.Print(raw) + } + return out.Print(servers) + }, +} + +var serverGetCmd = &cobra.Command{ + Use: "get ", + Short: "Get server details", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + svc := prov.Server() + if svc == nil { + return fmt.Errorf("server management not supported") + } + s, err := svc.Get(cmd.Context(), args[0]) + if err != nil { + return err + } + if flagRaw { + return out.Print(s.Raw) + } + return out.Print(s) + }, +} + +var serverStartCmd = &cobra.Command{ + Use: "start ", + Short: "Start a server", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + svc := prov.Server() + if svc == nil { + return fmt.Errorf("server management not supported") + } + if err := svc.Start(cmd.Context(), args[0]); err != nil { + return err + } + fmt.Printf("Server %s started\n", args[0]) + return nil + }, +} + +var serverStopCmd = &cobra.Command{ + Use: "stop ", + Short: "Stop a server", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + svc := prov.Server() + if svc == nil { + return fmt.Errorf("server management not supported") + } + if err := svc.Stop(cmd.Context(), args[0]); err != nil { + return err + } + fmt.Printf("Server %s stopped\n", args[0]) + return nil + }, +} + +var serverRebootCmd = &cobra.Command{ + Use: "reboot ", + Short: "Reboot a server", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + svc := prov.Server() + if svc == nil { + return fmt.Errorf("server management not supported") + } + if err := svc.Reboot(cmd.Context(), args[0]); err != nil { + return err + } + fmt.Printf("Server %s rebooted\n", args[0]) + return nil + }, +} + +var serverReinstallCmd = &cobra.Command{ + Use: "reinstall ", + Short: "Reinstall server OS", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + svc := prov.Server() + if svc == nil { + return fmt.Errorf("server management not supported") + } + osTemplate, _ := cmd.Flags().GetString("os") + if osTemplate == "" { + return fmt.Errorf("--os flag is required (e.g. --os ubuntu-22.04)") + } + if err := svc.Reinstall(cmd.Context(), args[0], osTemplate); err != nil { + return err + } + fmt.Printf("Server %s reinstalling with %s\n", args[0], osTemplate) + return nil + }, +} + +var serverResetPasswordCmd = &cobra.Command{ + Use: "reset-password ", + Short: "Reset server password", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + svc := prov.Server() + if svc == nil { + return fmt.Errorf("server management not supported") + } + if err := svc.ResetPassword(cmd.Context(), args[0]); err != nil { + return err + } + fmt.Printf("Password reset for server %s\n", args[0]) + return nil + }, +} + +var serverVNCCmd = &cobra.Command{ + Use: "vnc ", + Short: "Get VNC connection URL", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + svc := prov.Server() + if svc == nil { + return fmt.Errorf("server management not supported") + } + url, err := svc.GetVNC(cmd.Context(), args[0]) + if err != nil { + return err + } + fmt.Println(url) + return nil + }, +} + +func init() { + serverReinstallCmd.Flags().String("os", "", "OS template name (required)") + serverReinstallCmd.MarkFlagRequired("os") + + serverCmd.AddCommand(serverListCmd) + serverCmd.AddCommand(serverGetCmd) + serverCmd.AddCommand(serverStartCmd) + serverCmd.AddCommand(serverStopCmd) + serverCmd.AddCommand(serverRebootCmd) + serverCmd.AddCommand(serverReinstallCmd) + serverCmd.AddCommand(serverResetPasswordCmd) + serverCmd.AddCommand(serverVNCCmd) + rootCmd.AddCommand(serverCmd) +}