|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 |
- package userspace
-
- import (
- "fmt"
- "strconv"
- "strings"
-
- "github.com/chzyer/readline"
- "github.com/spf13/cobra"
- cliapi "gitlink.org.cn/cloudream/jcs-pub/client/sdk/api/v1"
- clitypes "gitlink.org.cn/cloudream/jcs-pub/client/types"
- cortypes "gitlink.org.cn/cloudream/jcs-pub/coordinator/types"
- "gitlink.org.cn/cloudream/jcs-pub/jcsctl/cmd"
- )
-
- type UserSpaceUpdate struct {
- cliapi.UserSpaceUpdate
- }
-
- func init() {
- cmd := cobra.Command{
- Use: "update",
- Short: "update a new cloud storage",
- Run: func(c *cobra.Command, args []string) {
- ctx := cmd.GetCmdCtx(c)
- update(c, ctx)
- },
- }
- UserSpaceCmd.AddCommand(&cmd)
- }
-
- func update(c *cobra.Command, ctx *cmd.CommandContext) {
- rl, err := readline.New("> ")
- if err != nil {
- fmt.Printf("\033[31m初始化命令行失败: %v\033[0m\n", err)
- return
- }
- defer rl.Close()
-
- rl.SetPrompt("\033[36m请输入云存储ID(ID): \033[0m")
- idInput, err := rl.Readline()
- if err != nil || idInput == "" {
- return
- }
-
- id, err := strconv.ParseInt(strings.TrimSpace(idInput), 10, 64)
- if err != nil {
- fmt.Printf("\033[31mID 格式错误: %v\033[0m\n", err)
- return
- }
-
- resp, err := ctx.Client.UserSpace().Get(cliapi.UserSpaceGet{
- UserSpaceID: clitypes.UserSpaceID(id),
- })
- if err != nil {
- fmt.Printf("\033[31m云存储id=%d 不存在: %v\033[0m\n", id, err)
- return
- }
-
- rl.SetPrompt("\033[36m请输入修改后的存储服务名称(Name): \033[0m")
- name, err := rl.Readline()
- if err != nil {
- return
- }
-
- var userSpaceUpdate UserSpaceUpdate
- userSpaceUpdate.UserSpaceID = clitypes.UserSpaceID(id)
- userSpaceUpdate.Name = name
-
- storageType := resp.UserSpace.Storage.GetStorageType()
- switch storageType {
- case "Local":
- err = userSpaceUpdate.collectLocalConfig(rl)
- case "OBS":
- err = userSpaceUpdate.collectObsConfig(rl)
- case "OSS":
- err = userSpaceUpdate.collectOssConfig(rl)
- case "COS":
- err = userSpaceUpdate.collectCosConfig(rl)
- case "EFile":
- err = userSpaceUpdate.collectEfileConfig(rl)
- case "S3":
- err = userSpaceUpdate.collectS3Config(rl)
- }
- if err != nil {
- return
- }
-
- _, err = ctx.Client.UserSpace().Update(userSpaceUpdate.UserSpaceUpdate)
- if err != nil {
- fmt.Printf("\033[31m更新配置失败: %v\033[0m", err)
- return
- }
- fmt.Println("\033[32m配置更新成功!\033[0m")
- }
-
- func (userSpace *UserSpaceUpdate) collectLocalConfig(rl *readline.Instance) error {
- rl.SetPrompt("\033[36m请输入RootDir: \033[0m")
- rootDir, err := rl.Readline()
- if err != nil {
- return err
- }
-
- userSpace.Credential = &cortypes.LocalCred{
- Type: "Local",
- RootDir: rootDir,
- }
- return nil
- }
-
- func (userSpace *UserSpaceUpdate) collectObsConfig(rl *readline.Instance) error {
- rl.SetPrompt("\033[36m请输入AccessKeyID: \033[0m")
- accessKey, err := rl.Readline()
- if err != nil {
- return err
- }
-
- secretBytes, err := rl.ReadPassword("\033[36m请输入AccessKeySecret: \033[0m")
- if err != nil {
- return err
- }
- secretKey := string(secretBytes)
-
- userSpace.Credential = &cortypes.OBSCred{
- Type: "OBS",
- AK: accessKey,
- SK: secretKey,
- }
-
- for {
- rl.SetPrompt("\033[36m是否支持存储服务间直传文件?(y/n): \033[0m")
- input, err := rl.Readline()
- if err != nil {
- return err
- }
-
- switch strings.ToLower(strings.TrimSpace(input)) {
- case "y", "yes":
- userSpace.Features = append(userSpace.Features, &cortypes.S2STransferFeature{
- Type: "S2STransfer",
- })
- return nil
- case "n", "no":
- userSpace.Features = nil
- return nil
- default:
- fmt.Println("\033[31m无效输入!请输入 y/n 或 yes/no \033[0m")
- }
- }
- }
-
- func (userSpace *UserSpaceUpdate) collectOssConfig(rl *readline.Instance) error {
- rl.SetPrompt("\033[36m请输入AccessKeyID: \033[0m")
- accessKey, err := rl.Readline()
- if err != nil {
- return err
- }
-
- secretBytes, err := rl.ReadPassword("\033[36m请输入AccessKeySecret: \033[0m")
- if err != nil {
- return err
- }
- secretKey := string(secretBytes)
-
- userSpace.Credential = &cortypes.OSSCred{
- Type: "OSS",
- AK: accessKey,
- SK: secretKey,
- }
- return nil
- }
-
- func (userSpace *UserSpaceUpdate) collectCosConfig(rl *readline.Instance) error {
- rl.SetPrompt("\033[36m请输入AccessKeyID: \033[0m")
- accessKey, err := rl.Readline()
- if err != nil {
- return err
- }
-
- secretBytes, err := rl.ReadPassword("\033[36m请输入AccessKeySecret: \033[0m")
- if err != nil {
- return err
- }
- secretKey := string(secretBytes)
-
- userSpace.Credential = &cortypes.COSCred{
- Type: "COS",
- AK: accessKey,
- SK: secretKey,
- }
- return nil
- }
-
- func (userSpace *UserSpaceUpdate) collectEfileConfig(rl *readline.Instance) error {
- rl.SetPrompt("\033[36m请输入TokenURL: \033[0m")
- tokenURL, err := rl.Readline()
- if err != nil {
- return err
- }
-
- rl.SetPrompt("\033[36m请输入APIURL: \033[0m")
- apiURL, err := rl.Readline()
- if err != nil {
- return err
- }
-
- tokenExpire := 0
- for {
- rl.SetPrompt("\033[36m请输入TokenExpire: \033[0m")
- valueInt, err := rl.Readline()
- if err != nil {
- return err
- }
- if strings.TrimSpace(valueInt) == "" {
- fmt.Println("\033[31m错误:输入不能为空,请输入正整数\033[0m")
- continue
- }
- num, err := strconv.ParseInt(valueInt, 10, 64)
- if err != nil {
- fmt.Printf("\033[31m错误:'%s' 不是有效整数,请输入正整数\033[0m\n", valueInt)
- continue
- }
- if num <= 0 {
- fmt.Printf("\033[31m错误:%d 不是正整数,请输入大于 0 的整数\033[0m\n", num)
- continue
- }
- tokenExpire = int(num)
- break
- }
-
- rl.SetPrompt("\033[36m请输入User: \033[0m")
- user, err := rl.Readline()
- if err != nil {
- return err
- }
-
- passwordBytes, err := rl.ReadPassword("\033[36m请输入Password: \033[0m")
- if err != nil {
- return err
- }
- password := string(passwordBytes)
-
- rl.SetPrompt("\033[36m请输入OrgID: \033[0m")
- orgID, err := rl.Readline()
- if err != nil {
- return err
- }
-
- userSpace.Credential = &cortypes.EFileCred{
- Type: "EFile",
- TokenURL: tokenURL,
- APIURL: apiURL,
- TokenExpire: tokenExpire,
- User: user,
- Password: password,
- OrgID: orgID,
- }
-
- for {
- rl.SetPrompt("\033[36m是否提供能进行EC计算的接口?(y/n): \033[0m")
- input, err := rl.Readline()
- if err != nil {
- return err
- }
-
- switch strings.ToLower(strings.TrimSpace(input)) {
- case "y", "yes":
- userSpace.Features = append(userSpace.Features, &cortypes.ECMultiplierFeature{
- Type: "ECMultiplier",
- })
- return nil
- case "n", "no":
- userSpace.Features = nil
- return nil
- default:
- fmt.Println("\033[31m无效输入!请输入 y/n 或 yes/no \033[0m")
- }
- }
- }
-
- func (userSpace *UserSpaceUpdate) collectS3Config(rl *readline.Instance) error {
- rl.SetPrompt("\033[36m请输入AccessKeyID: \033[0m")
- accessKey, err := rl.Readline()
- if err != nil {
- return err
- }
-
- secretBytes, err := rl.ReadPassword("\033[36m请输入AccessKeySecret: \033[0m")
- if err != nil {
- return err
- }
- secretKey := string(secretBytes)
-
- userSpace.Credential = &cortypes.S3Cred{
- Type: "S3",
- AK: accessKey,
- SK: secretKey,
- }
-
- for {
- rl.SetPrompt("\033[36m是否支持分段上传?(y/n): \033[0m")
- input, err := rl.Readline()
- if err != nil {
- return err
- }
-
- switch strings.ToLower(strings.TrimSpace(input)) {
- case "y", "yes":
- userSpace.Features = append(userSpace.Features, &cortypes.MultipartUploadFeature{
- Type: "MultipartUpload",
- })
- return nil
- case "n", "no":
- userSpace.Features = nil
- return nil
- default:
- fmt.Println("\033[31m无效输入!请输入 y/n 或 yes/no \033[0m")
- }
- }
- }
|