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.5 kB

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

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