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.

efile.go 2.3 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package efile
  2. import (
  3. "fmt"
  4. "net/url"
  5. "sync"
  6. "time"
  7. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  8. "gitlink.org.cn/cloudream/common/utils/http2"
  9. "gitlink.org.cn/cloudream/common/utils/serder"
  10. stgmod "gitlink.org.cn/cloudream/storage/common/models"
  11. "gitlink.org.cn/cloudream/storage/common/pkgs/storage/factory/reg"
  12. "gitlink.org.cn/cloudream/storage/common/pkgs/storage/types"
  13. "gitlink.org.cn/cloudream/storage/common/pkgs/storage/utils"
  14. )
  15. func init() {
  16. reg.RegisterBuilder[*cdssdk.EFileType](func(detail stgmod.StorageDetail) types.StorageBuilder {
  17. return &builder{
  18. detail: detail,
  19. }
  20. })
  21. }
  22. type builder struct {
  23. types.EmptyBuilder
  24. detail stgmod.StorageDetail
  25. token string
  26. tokenLock sync.Mutex
  27. getTokenTime time.Time
  28. }
  29. func (b *builder) getToken() (string, error) {
  30. stgType := b.detail.Storage.Type.(*cdssdk.EFileType)
  31. b.tokenLock.Lock()
  32. defer b.tokenLock.Unlock()
  33. if b.token != "" {
  34. dt := time.Since(b.getTokenTime)
  35. if dt < time.Second*time.Duration(stgType.TokenExpire) {
  36. return b.token, nil
  37. }
  38. }
  39. u, err := url.JoinPath(stgType.TokenURL, "/ac/openapi/v2/tokens")
  40. if err != nil {
  41. return "", err
  42. }
  43. resp, err := http2.PostJSON(u, http2.RequestParam{
  44. Header: map[string]string{
  45. "user": stgType.User,
  46. "password": stgType.Password,
  47. "orgId": stgType.OrgID,
  48. },
  49. })
  50. if err != nil {
  51. return "", err
  52. }
  53. type Response struct {
  54. Code string `json:"code"`
  55. Msg string `json:"msg"`
  56. Data []struct {
  57. ClusterID string `json:"clusterId"`
  58. Token string `json:"token"`
  59. } `json:"data"`
  60. }
  61. var r Response
  62. err = serder.JSONToObjectStream(resp.Body, &r)
  63. if err != nil {
  64. return "", err
  65. }
  66. if r.Code != "0" {
  67. return "", fmt.Errorf("code:%s, msg:%s", r.Code, r.Msg)
  68. }
  69. for _, d := range r.Data {
  70. if d.ClusterID == stgType.ClusterID {
  71. b.token = d.Token
  72. b.getTokenTime = time.Now()
  73. return d.Token, nil
  74. }
  75. }
  76. return "", fmt.Errorf("clusterID %s not found", stgType.ClusterID)
  77. }
  78. func (b *builder) CreateECMultiplier() (types.ECMultiplier, error) {
  79. feat := utils.FindFeature[*cdssdk.ECMultiplierFeature](b.detail)
  80. if feat == nil {
  81. return nil, fmt.Errorf("feature ECMultiplier not found")
  82. }
  83. return &ECMultiplier{
  84. blder: b,
  85. url: b.detail.Storage.Type.(*cdssdk.EFileType).APIURL,
  86. feat: feat,
  87. }, nil
  88. }

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