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

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

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