You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

update.go 7.4 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. package userspace
  2. import (
  3. "fmt"
  4. "strconv"
  5. "strings"
  6. "github.com/chzyer/readline"
  7. "github.com/spf13/cobra"
  8. cliapi "gitlink.org.cn/cloudream/jcs-pub/client/sdk/api/v1"
  9. jcstypes "gitlink.org.cn/cloudream/jcs-pub/common/types"
  10. "gitlink.org.cn/cloudream/jcs-pub/jcsctl/cmd"
  11. )
  12. type UserSpaceUpdate struct {
  13. cliapi.UserSpaceUpdate
  14. }
  15. func init() {
  16. cmd := cobra.Command{
  17. Use: "update",
  18. Short: "update a new cloud storage",
  19. Run: func(c *cobra.Command, args []string) {
  20. ctx := cmd.GetCmdCtx(c)
  21. update(c, ctx)
  22. },
  23. }
  24. UserSpaceCmd.AddCommand(&cmd)
  25. }
  26. func update(c *cobra.Command, ctx *cmd.CommandContext) {
  27. rl, err := readline.New("> ")
  28. if err != nil {
  29. fmt.Printf("\033[31m初始化命令行失败: %v\033[0m\n", err)
  30. return
  31. }
  32. defer rl.Close()
  33. rl.SetPrompt("\033[36m请输入云存储ID(ID): \033[0m")
  34. idInput, err := rl.Readline()
  35. if err != nil || idInput == "" {
  36. return
  37. }
  38. id, err := strconv.ParseInt(strings.TrimSpace(idInput), 10, 64)
  39. if err != nil {
  40. fmt.Printf("\033[31mID 格式错误: %v\033[0m\n", err)
  41. return
  42. }
  43. resp, err := ctx.Client.UserSpace().Get(cliapi.UserSpaceGet{
  44. UserSpaceID: jcstypes.UserSpaceID(id),
  45. })
  46. if err != nil {
  47. fmt.Printf("\033[31m云存储id=%d 不存在: %v\033[0m\n", id, err)
  48. return
  49. }
  50. rl.SetPrompt("\033[36m请输入修改后的存储服务名称(Name): \033[0m")
  51. name, err := rl.Readline()
  52. if err != nil {
  53. return
  54. }
  55. var userSpaceUpdate UserSpaceUpdate
  56. userSpaceUpdate.UserSpaceID = jcstypes.UserSpaceID(id)
  57. userSpaceUpdate.Name = name
  58. storageType := resp.UserSpace.Storage.GetStorageType()
  59. switch storageType {
  60. case "Local":
  61. err = userSpaceUpdate.collectLocalConfig(rl)
  62. case "OBS":
  63. err = userSpaceUpdate.collectObsConfig(rl)
  64. case "OSS":
  65. err = userSpaceUpdate.collectOssConfig(rl)
  66. case "COS":
  67. err = userSpaceUpdate.collectCosConfig(rl)
  68. case "EFile":
  69. err = userSpaceUpdate.collectEfileConfig(rl)
  70. case "S3":
  71. err = userSpaceUpdate.collectS3Config(rl)
  72. }
  73. if err != nil {
  74. return
  75. }
  76. _, err = ctx.Client.UserSpace().Update(userSpaceUpdate.UserSpaceUpdate)
  77. if err != nil {
  78. fmt.Printf("\033[31m更新配置失败: %v\033[0m", err)
  79. return
  80. }
  81. fmt.Println("\033[32m配置更新成功!\033[0m")
  82. }
  83. func (userSpace *UserSpaceUpdate) collectLocalConfig(rl *readline.Instance) error {
  84. rl.SetPrompt("\033[36m请输入RootDir: \033[0m")
  85. rootDir, err := rl.Readline()
  86. if err != nil {
  87. return err
  88. }
  89. userSpace.Credential = &jcstypes.LocalCred{
  90. Type: "Local",
  91. RootDir: rootDir,
  92. }
  93. return nil
  94. }
  95. func (userSpace *UserSpaceUpdate) collectObsConfig(rl *readline.Instance) error {
  96. rl.SetPrompt("\033[36m请输入AccessKeyID: \033[0m")
  97. accessKey, err := rl.Readline()
  98. if err != nil {
  99. return err
  100. }
  101. secretBytes, err := rl.ReadPassword("\033[36m请输入AccessKeySecret: \033[0m")
  102. if err != nil {
  103. return err
  104. }
  105. secretKey := string(secretBytes)
  106. userSpace.Credential = &jcstypes.OBSCred{
  107. Type: "OBS",
  108. AK: accessKey,
  109. SK: secretKey,
  110. }
  111. for {
  112. rl.SetPrompt("\033[36m是否支持存储服务间直传文件?(y/n): \033[0m")
  113. input, err := rl.Readline()
  114. if err != nil {
  115. return err
  116. }
  117. switch strings.ToLower(strings.TrimSpace(input)) {
  118. case "y", "yes":
  119. userSpace.Features = append(userSpace.Features, &jcstypes.S2STransferFeature{
  120. Type: "S2STransfer",
  121. })
  122. return nil
  123. case "n", "no":
  124. userSpace.Features = nil
  125. return nil
  126. default:
  127. fmt.Println("\033[31m无效输入!请输入 y/n 或 yes/no \033[0m")
  128. }
  129. }
  130. }
  131. func (userSpace *UserSpaceUpdate) collectOssConfig(rl *readline.Instance) error {
  132. rl.SetPrompt("\033[36m请输入AccessKeyID: \033[0m")
  133. accessKey, err := rl.Readline()
  134. if err != nil {
  135. return err
  136. }
  137. secretBytes, err := rl.ReadPassword("\033[36m请输入AccessKeySecret: \033[0m")
  138. if err != nil {
  139. return err
  140. }
  141. secretKey := string(secretBytes)
  142. userSpace.Credential = &jcstypes.OSSCred{
  143. Type: "OSS",
  144. AK: accessKey,
  145. SK: secretKey,
  146. }
  147. return nil
  148. }
  149. func (userSpace *UserSpaceUpdate) collectCosConfig(rl *readline.Instance) error {
  150. rl.SetPrompt("\033[36m请输入AccessKeyID: \033[0m")
  151. accessKey, err := rl.Readline()
  152. if err != nil {
  153. return err
  154. }
  155. secretBytes, err := rl.ReadPassword("\033[36m请输入AccessKeySecret: \033[0m")
  156. if err != nil {
  157. return err
  158. }
  159. secretKey := string(secretBytes)
  160. userSpace.Credential = &jcstypes.COSCred{
  161. Type: "COS",
  162. AK: accessKey,
  163. SK: secretKey,
  164. }
  165. return nil
  166. }
  167. func (userSpace *UserSpaceUpdate) collectEfileConfig(rl *readline.Instance) error {
  168. rl.SetPrompt("\033[36m请输入TokenURL: \033[0m")
  169. tokenURL, err := rl.Readline()
  170. if err != nil {
  171. return err
  172. }
  173. rl.SetPrompt("\033[36m请输入APIURL: \033[0m")
  174. apiURL, err := rl.Readline()
  175. if err != nil {
  176. return err
  177. }
  178. tokenExpire := 0
  179. for {
  180. rl.SetPrompt("\033[36m请输入TokenExpire: \033[0m")
  181. valueInt, err := rl.Readline()
  182. if err != nil {
  183. return err
  184. }
  185. if strings.TrimSpace(valueInt) == "" {
  186. fmt.Println("\033[31m错误:输入不能为空,请输入正整数\033[0m")
  187. continue
  188. }
  189. num, err := strconv.ParseInt(valueInt, 10, 64)
  190. if err != nil {
  191. fmt.Printf("\033[31m错误:'%s' 不是有效整数,请输入正整数\033[0m\n", valueInt)
  192. continue
  193. }
  194. if num <= 0 {
  195. fmt.Printf("\033[31m错误:%d 不是正整数,请输入大于 0 的整数\033[0m\n", num)
  196. continue
  197. }
  198. tokenExpire = int(num)
  199. break
  200. }
  201. rl.SetPrompt("\033[36m请输入User: \033[0m")
  202. user, err := rl.Readline()
  203. if err != nil {
  204. return err
  205. }
  206. passwordBytes, err := rl.ReadPassword("\033[36m请输入Password: \033[0m")
  207. if err != nil {
  208. return err
  209. }
  210. password := string(passwordBytes)
  211. rl.SetPrompt("\033[36m请输入OrgID: \033[0m")
  212. orgID, err := rl.Readline()
  213. if err != nil {
  214. return err
  215. }
  216. userSpace.Credential = &jcstypes.EFileCred{
  217. Type: "EFile",
  218. TokenURL: tokenURL,
  219. APIURL: apiURL,
  220. TokenExpire: tokenExpire,
  221. User: user,
  222. Password: password,
  223. OrgID: orgID,
  224. }
  225. for {
  226. rl.SetPrompt("\033[36m是否提供能进行EC计算的接口?(y/n): \033[0m")
  227. input, err := rl.Readline()
  228. if err != nil {
  229. return err
  230. }
  231. switch strings.ToLower(strings.TrimSpace(input)) {
  232. case "y", "yes":
  233. userSpace.Features = append(userSpace.Features, &jcstypes.ECMultiplierFeature{
  234. Type: "ECMultiplier",
  235. })
  236. return nil
  237. case "n", "no":
  238. userSpace.Features = nil
  239. return nil
  240. default:
  241. fmt.Println("\033[31m无效输入!请输入 y/n 或 yes/no \033[0m")
  242. }
  243. }
  244. }
  245. func (userSpace *UserSpaceUpdate) collectS3Config(rl *readline.Instance) error {
  246. rl.SetPrompt("\033[36m请输入AccessKeyID: \033[0m")
  247. accessKey, err := rl.Readline()
  248. if err != nil {
  249. return err
  250. }
  251. secretBytes, err := rl.ReadPassword("\033[36m请输入AccessKeySecret: \033[0m")
  252. if err != nil {
  253. return err
  254. }
  255. secretKey := string(secretBytes)
  256. userSpace.Credential = &jcstypes.S3Cred{
  257. Type: "S3",
  258. AK: accessKey,
  259. SK: secretKey,
  260. }
  261. for {
  262. rl.SetPrompt("\033[36m是否支持分段上传?(y/n): \033[0m")
  263. input, err := rl.Readline()
  264. if err != nil {
  265. return err
  266. }
  267. switch strings.ToLower(strings.TrimSpace(input)) {
  268. case "y", "yes":
  269. userSpace.Features = append(userSpace.Features, &jcstypes.MultipartUploadFeature{
  270. Type: "MultipartUpload",
  271. })
  272. return nil
  273. case "n", "no":
  274. userSpace.Features = nil
  275. return nil
  276. default:
  277. fmt.Println("\033[31m无效输入!请输入 y/n 或 yes/no \033[0m")
  278. }
  279. }
  280. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。