package server import ( "fmt" "git.yoresee.cc/nightstar/ry/internal/output" "git.yoresee.cc/nightstar/ry/internal/provider" "github.com/spf13/cobra" ) func Cmd(prov *provider.Provider, out **output.Printer, raw *bool) *cobra.Command { serverCmd := &cobra.Command{ Use: "server", Short: "Manage cloud servers", } 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 *raw { var r []any for _, s := range servers { r = append(r, s.Raw) } return (*out).Print(r) } return (*out).Print(servers) }, } 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 *raw { return (*out).Print(s.Raw) } return (*out).Print(s) }, } 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 }, } 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 }, } 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 }, } 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 }, } 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 }, } 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 }, } 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) return serverCmd }