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.

dataServer.go 5.0 kB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. package main
  2. import (
  3. //"context"
  4. "log"
  5. //"os"
  6. "fmt"
  7. "io"
  8. //"path/filepath"
  9. "bytes"
  10. "io/ioutil"
  11. "gitlink.org.cn/cloudream/agent/config"
  12. agentserver "gitlink.org.cn/cloudream/proto"
  13. shell "github.com/ipfs/go-ipfs-api"
  14. //"sync"
  15. //"net"
  16. //"google.golang.org/grpc"
  17. )
  18. type anyOne struct {
  19. agentserver.TranBlockOrReplicaServer
  20. }
  21. func UploadIPFS(str string) string {
  22. var sh *shell.Shell
  23. sh = shell.NewShell("localhost:5001")
  24. hash, err := sh.Add(bytes.NewBufferString(str))
  25. if err != nil {
  26. fmt.Println("上传ipfs时错误:", err)
  27. }
  28. return hash
  29. }
  30. func CatIPFS(hash string) string {
  31. var sh *shell.Shell
  32. sh = shell.NewShell("localhost:5001")
  33. read, err := sh.Cat(hash)
  34. if err != nil {
  35. fmt.Println(err)
  36. }
  37. body, err := ioutil.ReadAll(read)
  38. return string(body)
  39. }
  40. func (s *anyOne) SendBlockOrReplica(server agentserver.TranBlockOrReplica_SendBlockOrReplicaServer) error {
  41. /*fmt.Println("get a request")
  42. fDir, err := os.Executable()
  43. if err != nil {
  44. panic(err)
  45. }
  46. fURL := filepath.Join(filepath.Dir(fDir), "assets")
  47. print(fURL)
  48. _, err = os.Stat(fURL)
  49. if os.IsNotExist(err) {
  50. log.Println("创建目录")
  51. os.MkdirAll(fURL, os.ModePerm)
  52. }
  53. fmt.Println(filepath.Join(fURL))
  54. i := 0
  55. var file *os.File
  56. for {
  57. fmt.Println("get a request")
  58. data, err := server.Recv()
  59. if i<1 {
  60. blockOrReplicaName := data.BlockOrReplicaHash
  61. fmt.Println(filepath.Join(fURL, blockOrReplicaName))
  62. file, _ = os.Create(filepath.Join(fURL, blockOrReplicaName))
  63. }
  64. if err == io.EOF {
  65. // 发送结果并关闭(主要发hash)
  66. return server.SendAndClose(&agentserver.SendRes{
  67. BlockOrReplicaName: "blockname",
  68. BlockOrReplicaHash: "1235",
  69. })
  70. file.Close()
  71. }
  72. if err != nil {
  73. log.Println("err:", err)
  74. file.Close()
  75. return err
  76. }
  77. fmt.Println(data.BlockOrReplicaData)
  78. file.Write(data.BlockOrReplicaData)
  79. i++
  80. }
  81. */
  82. i := 0
  83. var all_data, all_hash string
  84. var buffer bytes.Buffer //缓存整个块
  85. var blockOrReplicaName string
  86. for {
  87. fmt.Println("get a request")
  88. data, err := server.Recv()
  89. if i == 0 {
  90. blockOrReplicaName = data.BlockOrReplicaName
  91. }
  92. if i < 1 {
  93. //blockOrReplicaName := data.BlockOrReplicaHash
  94. }
  95. if err == io.EOF {
  96. // 发送结果并关闭(主要发hash)
  97. all_data = string(buffer.Bytes())
  98. //上传到ipfs
  99. all_hash = UploadIPFS(all_data)
  100. return server.SendAndClose(&agentserver.SendRes{
  101. BlockOrReplicaName: blockOrReplicaName,
  102. BlockOrReplicaHash: all_hash,
  103. })
  104. }
  105. if err != nil {
  106. log.Println("err:", err)
  107. return err
  108. }
  109. print("!@#!@#@#!@#!@#!#")
  110. buffer.Write(data.BlockOrReplicaData)
  111. i++
  112. }
  113. }
  114. func (s *anyOne) GetBlockOrReplica(req *agentserver.GetReq, server agentserver.TranBlockOrReplica_GetBlockOrReplicaServer) error {
  115. /*
  116. file, err := os.Open("assets/"+req.BlockOrReplicaHash)
  117. fmt.Println("assets/"+req.BlockOrReplicaHash)
  118. if err != nil {
  119. panic(err)
  120. }
  121. fInfo, err := file.Stat()
  122. if err != nil {
  123. panic(err)
  124. }
  125. fSize := fInfo.Size()
  126. fmt.Println(fSize)
  127. numPacket := fSize/packetSizeInBytes
  128. lastPacketInBytes := fSize%packetSizeInBytes
  129. if lastPacketInBytes>0 {
  130. numPacket++
  131. }
  132. for i:=0; int64(i)<numPacket; i++ {
  133. var buf []byte
  134. if int64(i)==numPacket-1 && lastPacketInBytes>0 {
  135. buf = make([]byte, lastPacketInBytes)
  136. } else {
  137. buf = make([]byte, packetSizeInBytes)
  138. }
  139. fmt.Println(len(buf))
  140. _, err := file.Read(buf)
  141. if err != nil && err != io.EOF {
  142. break
  143. }
  144. server.Send(&agentserver.BlockOrReplica{
  145. BlockOrReplicaName: "json",
  146. BlockOrReplicaHash: "json",
  147. BlockOrReplicaData: buf,
  148. })
  149. if err == io.EOF {
  150. log.Println(err)
  151. break
  152. }
  153. }
  154. file.Close()
  155. return err
  156. */
  157. data := CatIPFS(req.BlockOrReplicaHash)
  158. fSize := len(data)
  159. fmt.Println(fSize)
  160. numPacket := fSize / config.Cfg().GRCPPacketSize
  161. lastPacketInBytes := fSize % config.Cfg().GRCPPacketSize
  162. if lastPacketInBytes > 0 {
  163. numPacket++
  164. }
  165. for i := 0; i < numPacket; i++ {
  166. var buf []byte
  167. if i == numPacket-1 && lastPacketInBytes > 0 {
  168. buf = make([]byte, lastPacketInBytes)
  169. } else {
  170. buf = make([]byte, config.Cfg().GRCPPacketSize)
  171. }
  172. fmt.Println(len(buf))
  173. buf = []byte(data[i*config.Cfg().GRCPPacketSize : i*config.Cfg().GRCPPacketSize+config.Cfg().GRCPPacketSize])
  174. fmt.Println(buf)
  175. print("#@#@#@#@#")
  176. server.Send(&agentserver.BlockOrReplica{
  177. BlockOrReplicaName: "json",
  178. BlockOrReplicaHash: "json",
  179. BlockOrReplicaData: buf,
  180. })
  181. }
  182. return nil
  183. }

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