prepare for test
This commit is contained in:
parent
892cd99eb3
commit
9796c5aad7
17 changed files with 412 additions and 269 deletions
|
@ -9,6 +9,7 @@ DateTimeFormat = 2006-01-02 15:04:05
|
||||||
TimeFormat = 15:04:05
|
TimeFormat = 15:04:05
|
||||||
DateFormat = 2006-01-02
|
DateFormat = 2006-01-02
|
||||||
ProjectPath = /casaOS/server
|
ProjectPath = /casaOS/server
|
||||||
|
RootPath = /casaOS
|
||||||
|
|
||||||
|
|
||||||
[server]
|
[server]
|
||||||
|
@ -44,3 +45,6 @@ ConfigStr =
|
||||||
WidgetList =
|
WidgetList =
|
||||||
Analyse =
|
Analyse =
|
||||||
|
|
||||||
|
[file]
|
||||||
|
ShareDir =
|
||||||
|
DownloadDir = /DATA
|
12
main.go
12
main.go
|
@ -6,6 +6,7 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/IceWhaleTech/CasaOS/model"
|
||||||
"github.com/IceWhaleTech/CasaOS/pkg/cache"
|
"github.com/IceWhaleTech/CasaOS/pkg/cache"
|
||||||
"github.com/IceWhaleTech/CasaOS/pkg/config"
|
"github.com/IceWhaleTech/CasaOS/pkg/config"
|
||||||
"github.com/IceWhaleTech/CasaOS/pkg/sqlite"
|
"github.com/IceWhaleTech/CasaOS/pkg/sqlite"
|
||||||
|
@ -32,9 +33,14 @@ func init() {
|
||||||
//gredis.GetRedisConn(config.RedisInfo),
|
//gredis.GetRedisConn(config.RedisInfo),
|
||||||
service.MyService = service.NewService(sqliteDB, loger2.NewOLoger())
|
service.MyService = service.NewService(sqliteDB, loger2.NewOLoger())
|
||||||
service.Cache = cache.Init()
|
service.Cache = cache.Init()
|
||||||
//go service.UDPConnect([]string{})
|
|
||||||
go service.SocketConnect()
|
go service.UDPService()
|
||||||
//go service.UDPService()
|
|
||||||
|
go service.UDPConnect([]string{})
|
||||||
|
service.Summary = make(map[string]model.FileSummaryModel)
|
||||||
|
service.UDPAddressMap = make(map[string]string)
|
||||||
|
//go service.SocketConnect()
|
||||||
|
|
||||||
route.InitFunction()
|
route.InitFunction()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,6 @@ type FileDetailModel struct {
|
||||||
type FileSummaryModel struct {
|
type FileSummaryModel struct {
|
||||||
Hash string `json:"hash"` //Verify file
|
Hash string `json:"hash"` //Verify file
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Path string `json:"path"`
|
|
||||||
BlockSize int `json:"block_size"`
|
BlockSize int `json:"block_size"`
|
||||||
Length int `json:"length"`
|
Length int `json:"length"`
|
||||||
Size int64 `json:"size"`
|
Size int64 `json:"size"`
|
||||||
|
|
|
@ -39,6 +39,7 @@ type APPModel struct {
|
||||||
TimeFormat string
|
TimeFormat string
|
||||||
DateFormat string
|
DateFormat string
|
||||||
ProjectPath string
|
ProjectPath string
|
||||||
|
RootPath string
|
||||||
}
|
}
|
||||||
|
|
||||||
//公共返回模型
|
//公共返回模型
|
||||||
|
@ -76,3 +77,8 @@ type SystemConfig struct {
|
||||||
type CasaOSGlobalVariables struct {
|
type CasaOSGlobalVariables struct {
|
||||||
AppChange bool
|
AppChange bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type FileSetting struct {
|
||||||
|
ShareDir []string `json:"share_dir" delim:"|"`
|
||||||
|
DownloadDir string `json:"download_dir"`
|
||||||
|
}
|
||||||
|
|
|
@ -35,6 +35,8 @@ var SystemConfigInfo = &model.SystemConfig{}
|
||||||
|
|
||||||
var CasaOSGlobalVariables = &model.CasaOSGlobalVariables{}
|
var CasaOSGlobalVariables = &model.CasaOSGlobalVariables{}
|
||||||
|
|
||||||
|
var FileSettingInfo = &model.FileSetting{}
|
||||||
|
|
||||||
var Cfg *ini.File
|
var Cfg *ini.File
|
||||||
|
|
||||||
//初始化设置,获取系统的部分信息。
|
//初始化设置,获取系统的部分信息。
|
||||||
|
@ -58,6 +60,7 @@ func InitSetup(config string) {
|
||||||
mapTo("redis", RedisInfo)
|
mapTo("redis", RedisInfo)
|
||||||
mapTo("server", ServerInfo)
|
mapTo("server", ServerInfo)
|
||||||
mapTo("system", SystemConfigInfo)
|
mapTo("system", SystemConfigInfo)
|
||||||
|
mapTo("file", FileSettingInfo)
|
||||||
SystemConfigInfo.ConfigPath = configDir
|
SystemConfigInfo.ConfigPath = configDir
|
||||||
// AppInfo.ProjectPath = getCurrentDirectory() //os.Getwd()
|
// AppInfo.ProjectPath = getCurrentDirectory() //os.Getwd()
|
||||||
|
|
||||||
|
|
|
@ -60,9 +60,9 @@ func ComparisonHash(data []byte, hash string) bool {
|
||||||
|
|
||||||
//get prefix byte length
|
//get prefix byte length
|
||||||
func PrefixLength(byteLength int) []byte {
|
func PrefixLength(byteLength int) []byte {
|
||||||
lengthByte := []byte{'0', '0', '0', '0'}
|
lengthByte := []byte{'0', '0', '0', '0', '0', '0'}
|
||||||
bSize := strconv.Itoa(byteLength)
|
bSize := strconv.Itoa(byteLength)
|
||||||
cha := 4 - len(bSize)
|
cha := 6 - len(bSize)
|
||||||
for i := len(bSize); i > 0; i-- {
|
for i := len(bSize); i > 0; i-- {
|
||||||
lengthByte[cha+i-1] = bSize[i-1]
|
lengthByte[cha+i-1] = bSize[i-1]
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@ func InitFunction() {
|
||||||
Update2_3()
|
Update2_3()
|
||||||
CheckSerialDiskMount()
|
CheckSerialDiskMount()
|
||||||
|
|
||||||
CheckToken2_9()
|
CheckToken2_11()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,11 +236,24 @@ func CheckSerialDiskMount() {
|
||||||
func Update2_3() {
|
func Update2_3() {
|
||||||
command.OnlyExec("source " + config.AppInfo.ProjectPath + "/shell/assist.sh")
|
command.OnlyExec("source " + config.AppInfo.ProjectPath + "/shell/assist.sh")
|
||||||
}
|
}
|
||||||
func CheckToken2_9() {
|
func CheckToken2_11() {
|
||||||
if len(config.ServerInfo.Token) == 0 {
|
if len(config.ServerInfo.Token) == 0 {
|
||||||
token := uuid.NewV4().String
|
token := uuid.NewV4().String
|
||||||
config.ServerInfo.Token = token()
|
config.ServerInfo.Token = token()
|
||||||
config.Cfg.Section("server").Key("Token").SetValue(token())
|
config.Cfg.Section("server").Key("Token").SetValue(token())
|
||||||
config.Cfg.SaveTo(config.SystemConfigInfo.ConfigPath)
|
config.Cfg.SaveTo(config.SystemConfigInfo.ConfigPath)
|
||||||
}
|
}
|
||||||
|
if len(config.AppInfo.RootPath) == 0 {
|
||||||
|
config.Cfg.Section("app").Key("RootPath").SetValue("/casaOS")
|
||||||
|
config.AppInfo.RootPath = "/casaOS"
|
||||||
|
config.Cfg.SaveTo(config.SystemConfigInfo.ConfigPath)
|
||||||
|
}
|
||||||
|
// str := []string{}
|
||||||
|
// str = append(str, "ddd")
|
||||||
|
// str = append(str, "aaa")
|
||||||
|
// ddd := strings.Join(str, "|")
|
||||||
|
// config.Cfg.Section("file").Key("ShareDir").SetValue(ddd)
|
||||||
|
|
||||||
|
// config.Cfg.SaveTo(config.SystemConfigInfo.ConfigPath)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -290,13 +290,14 @@ func InitRouter() *gin.Engine {
|
||||||
v1PersonGroup := v1Group.Group("/persion")
|
v1PersonGroup := v1Group.Group("/persion")
|
||||||
v1PersonGroup.Use()
|
v1PersonGroup.Use()
|
||||||
{
|
{
|
||||||
// v1PersonGroup.GET("/test", v1.PersonTest)
|
v1PersonGroup.GET("/test", v1.PersonTest)
|
||||||
v1PersonGroup.GET("/users", v1.GetPersionFriend) //用户列表
|
v1PersonGroup.GET("/users", v1.GetPersionFriend) //用户列表
|
||||||
v1PersonGroup.POST("/user", v1.PostAddPersionFriend) //添加用户
|
v1PersonGroup.POST("/user", v1.PostAddPersionFriend) //添加用户
|
||||||
v1PersonGroup.GET("/directory", v1.GetPersionDirectory) //文件列表
|
v1PersonGroup.GET("/directory", v1.GetPersionDirectory) //文件列表
|
||||||
//v1PersonGroup.GET("/download", v1.GetPersionFile) //下载文件
|
v1PersonGroup.GET("/file", v1.GetPersionFile) //下载文件
|
||||||
v1PersonGroup.PUT("/edit/:token", v1.PutPersionNick) //修改好友
|
v1PersonGroup.PUT("/edit/:token", v1.PutPersionNick) //修改好友
|
||||||
v1PersonGroup.GET("/list", v1.GetPersionDownloadList) //下载列表(需要考虑试试下载速度)
|
v1PersonGroup.GET("/list", v1.GetPersionDownloadList) //下载列表(需要考虑试试下载速度)
|
||||||
|
v1PersonGroup.DELETE("/file/id", v1.DeletePersionDownloadFile)
|
||||||
// v1PersonGroup.PUT("/state/:id", v1.PutPersionCancelDownload) //修改下载状态(开始暂停删除)
|
// v1PersonGroup.PUT("/state/:id", v1.PutPersionCancelDownload) //修改下载状态(开始暂停删除)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,6 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/IceWhaleTech/CasaOS/model"
|
"github.com/IceWhaleTech/CasaOS/model"
|
||||||
"github.com/IceWhaleTech/CasaOS/pkg/config"
|
"github.com/IceWhaleTech/CasaOS/pkg/config"
|
||||||
|
@ -13,75 +12,26 @@ import (
|
||||||
model2 "github.com/IceWhaleTech/CasaOS/service/model"
|
model2 "github.com/IceWhaleTech/CasaOS/service/model"
|
||||||
"github.com/IceWhaleTech/CasaOS/types"
|
"github.com/IceWhaleTech/CasaOS/types"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/gorilla/websocket"
|
|
||||||
uuid "github.com/satori/go.uuid"
|
uuid "github.com/satori/go.uuid"
|
||||||
)
|
)
|
||||||
|
|
||||||
func PersonTest(c *gin.Context) {
|
func PersonTest(c *gin.Context) {
|
||||||
|
|
||||||
|
token := c.Query("token")
|
||||||
//service.MyService.Person().GetPersionInfo("fb2333a1-72b2-4cb4-9e31-61ccaffa55b9")
|
//service.MyService.Person().GetPersionInfo("fb2333a1-72b2-4cb4-9e31-61ccaffa55b9")
|
||||||
|
|
||||||
m := model.ConnectState{}
|
|
||||||
m.CreatedAt = time.Now()
|
|
||||||
m.From = config.ServerInfo.Token
|
|
||||||
m.To = "fb2333a1-72b2-4cb4-9e31-61ccaffa55b9"
|
|
||||||
m.Type = ""
|
|
||||||
m.UUId = uuid.NewV4().String()
|
|
||||||
|
|
||||||
//service.MyService.Person().Handshake(m)
|
|
||||||
msg := model.MessageModel{}
|
msg := model.MessageModel{}
|
||||||
msg.Type = "connection"
|
msg.Type = "hello"
|
||||||
msg.Data = "fb2333a1-72b2-4cb4-9e31-61ccaffa55b9"
|
msg.Data = ""
|
||||||
msg.From = config.ServerInfo.Token
|
msg.From = config.ServerInfo.Token
|
||||||
msg.UUId = "1234567890"
|
msg.To = token
|
||||||
b, _ := json.Marshal(msg)
|
msg.UUId = uuid.NewV4().String()
|
||||||
err := service.WebSocketConn.WriteMessage(websocket.TextMessage, b)
|
|
||||||
|
dd, err := service.Dial("", msg)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
}
|
fmt.Println(dd)
|
||||||
|
|
||||||
//get other persion file
|
|
||||||
func GetPersionFile(c *gin.Context) {
|
|
||||||
path := c.Query("path")
|
|
||||||
persion := c.Query("persion")
|
|
||||||
if len(path) == 0 && len(persion) == 0 {
|
|
||||||
c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
//任务标识
|
|
||||||
uuid := uuid.NewV4().String()
|
|
||||||
|
|
||||||
//1.通知对方需要下载
|
|
||||||
service.MyService.Person().GetFileDetail(uuid, path, persion)
|
|
||||||
|
|
||||||
//2.添加数据库
|
|
||||||
|
|
||||||
task := model2.PersionDownloadDBModel{}
|
|
||||||
task.UUID = uuid
|
|
||||||
task.Name = ""
|
|
||||||
task.Length = 0
|
|
||||||
task.Size = 0
|
|
||||||
task.State = types.DOWNLOADAWAIT
|
|
||||||
task.TempPath = ""
|
|
||||||
task.Type = 0
|
|
||||||
service.MyService.Person().AddDownloadTask(task)
|
|
||||||
|
|
||||||
c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)})
|
|
||||||
}
|
|
||||||
func GetPersionDownloadList(c *gin.Context) {
|
|
||||||
path := c.Query("path")
|
|
||||||
persion := c.Query("persion")
|
|
||||||
if len(path) == 0 && len(persion) == 0 {
|
|
||||||
c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
//任务标识
|
|
||||||
uuid := uuid.NewV4().String()
|
|
||||||
|
|
||||||
//1.通知对方需要下载
|
|
||||||
service.MyService.Person().GetFileDetail(uuid, path, persion)
|
|
||||||
|
|
||||||
c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)})
|
c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,7 +42,87 @@ func GetPersionDownloadList(c *gin.Context) {
|
||||||
// @Param token formData int true "Opponent token"
|
// @Param token formData int true "Opponent token"
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Success 200 {string} string "ok"
|
// @Success 200 {string} string "ok"
|
||||||
// @Router /persion/edit [put]
|
// @Router /persion/file/{id} [delete]
|
||||||
|
func GetPersionFile(c *gin.Context) {
|
||||||
|
|
||||||
|
path := c.Query("path")
|
||||||
|
token := c.Query("token")
|
||||||
|
if len(path) == 0 && len(token) == 0 {
|
||||||
|
c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
//任务标识
|
||||||
|
uuid := uuid.NewV4().String()
|
||||||
|
|
||||||
|
//2.添加数据库
|
||||||
|
|
||||||
|
task := model2.PersionDownloadDBModel{}
|
||||||
|
task.UUID = uuid
|
||||||
|
task.Name = ""
|
||||||
|
task.Length = 0
|
||||||
|
task.Size = 0
|
||||||
|
task.State = types.DOWNLOADAWAIT
|
||||||
|
task.Type = 0
|
||||||
|
service.MyService.Download().AddDownloadTask(task)
|
||||||
|
|
||||||
|
m := model.MessageModel{}
|
||||||
|
m.Data = path
|
||||||
|
m.From = config.ServerInfo.Token
|
||||||
|
m.To = token
|
||||||
|
m.Type = "file_data"
|
||||||
|
m.UUId = uuid
|
||||||
|
_, err := service.Dial("192.168.2.224:9902", m)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)})
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Summary delete download file records
|
||||||
|
// @Produce application/json
|
||||||
|
// @Accept application/json
|
||||||
|
// @Tags persion
|
||||||
|
// @Param token formData int true "Opponent token"
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Success 200 {string} string "ok"
|
||||||
|
// @Router /persion/file/{id} [delete]
|
||||||
|
func DeletePersionDownloadFile(c *gin.Context) {
|
||||||
|
|
||||||
|
id := c.Param("id")
|
||||||
|
if len(id) == 0 {
|
||||||
|
c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
service.MyService.Download().DelDownload(id)
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)})
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Summary get file download list
|
||||||
|
// @Produce application/json
|
||||||
|
// @Accept application/json
|
||||||
|
// @Tags persion
|
||||||
|
// @Param state query int true "wait:1,loading:1,pause:2,finish:3,error:4" Enums(0,1,2,4)
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Success 200 {string} string "ok"
|
||||||
|
// @Router /persion/list [get]
|
||||||
|
func GetPersionDownloadList(c *gin.Context) {
|
||||||
|
state := c.DefaultQuery("state", "")
|
||||||
|
list := service.MyService.Download().GetDownloadListByState(state)
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: list})
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Summary add friend
|
||||||
|
// @Produce application/json
|
||||||
|
// @Accept application/json
|
||||||
|
// @Tags persion
|
||||||
|
// @Param token formData int true "Opponent token"
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Success 200 {string} string "ok"
|
||||||
|
// @Router /persion/edit/{token} [put]
|
||||||
func PutPersionNick(c *gin.Context) {
|
func PutPersionNick(c *gin.Context) {
|
||||||
token := c.Param("token")
|
token := c.Param("token")
|
||||||
nick := c.PostForm("nick")
|
nick := c.PostForm("nick")
|
||||||
|
@ -107,7 +137,7 @@ func PutPersionNick(c *gin.Context) {
|
||||||
c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)})
|
c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)})
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Summary add friend
|
// @Summary get friends list
|
||||||
// @Produce application/json
|
// @Produce application/json
|
||||||
// @Accept application/json
|
// @Accept application/json
|
||||||
// @Tags persion
|
// @Tags persion
|
||||||
|
@ -134,15 +164,16 @@ func PostAddPersionFriend(c *gin.Context) {
|
||||||
c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)})
|
c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
//step:远程验证token是否存在
|
|
||||||
msg := model.MessageModel{}
|
msg := model.MessageModel{}
|
||||||
msg.Type = types.PERSONADDFRIEND
|
msg.Type = "connection"
|
||||||
msg.To = token
|
|
||||||
msg.Data = token
|
msg.Data = token
|
||||||
msg.From = config.ServerInfo.Token
|
msg.From = config.ServerInfo.Token
|
||||||
|
msg.To = token
|
||||||
msg.UUId = uuid.NewV4().String()
|
msg.UUId = uuid.NewV4().String()
|
||||||
b, _ := json.Marshal(msg)
|
|
||||||
err := service.WebSocketConn.WriteMessage(websocket.TextMessage, b)
|
_, err := service.Dial("", msg)
|
||||||
|
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
|
|
||||||
friend := model2.FriendModel{}
|
friend := model2.FriendModel{}
|
||||||
|
@ -151,10 +182,18 @@ func PostAddPersionFriend(c *gin.Context) {
|
||||||
c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)})
|
c.JSON(http.StatusOK, model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS)})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Summary get directory list
|
||||||
|
// @Produce application/json
|
||||||
|
// @Accept application/json
|
||||||
|
// @Tags persion
|
||||||
|
// @Param token query int true "Opponent token"
|
||||||
|
// @Security ApiKeyAuth
|
||||||
|
// @Success 200 {string} string "ok"
|
||||||
|
// @Router /persion/directory [get]
|
||||||
func GetPersionDirectory(c *gin.Context) {
|
func GetPersionDirectory(c *gin.Context) {
|
||||||
path := c.Query("path")
|
path := c.Query("path")
|
||||||
persion := c.Query("persion")
|
token := c.Query("token")
|
||||||
if len(path) == 0 && len(persion) == 0 {
|
if len(path) == 0 && len(token) == 0 {
|
||||||
c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)})
|
c.JSON(http.StatusOK, model.Result{Success: oasis_err2.INVALID_PARAMS, Message: oasis_err2.GetMsg(oasis_err2.INVALID_PARAMS)})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -163,10 +202,10 @@ func GetPersionDirectory(c *gin.Context) {
|
||||||
m := model.MessageModel{}
|
m := model.MessageModel{}
|
||||||
m.Data = path
|
m.Data = path
|
||||||
m.From = config.ServerInfo.Token
|
m.From = config.ServerInfo.Token
|
||||||
m.To = persion
|
m.To = token
|
||||||
m.Type = "directory"
|
m.Type = "directory"
|
||||||
m.UUId = uuid
|
m.UUId = uuid
|
||||||
result, err := service.Dial("192.168.2.225:9902", m)
|
result, err := service.Dial(service.UDPAddressMap[token], m)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
|
|
52
service/download.go
Normal file
52
service/download.go
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
package service
|
||||||
|
|
||||||
|
import (
|
||||||
|
model2 "github.com/IceWhaleTech/CasaOS/service/model"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DownloadService interface {
|
||||||
|
AddDownloadTask(m model2.PersionDownloadDBModel) //添加下载任务
|
||||||
|
EditDownloadState(m model2.PersionDownloadDBModel) //只修改状态
|
||||||
|
SaveDownload(m model2.PersionDownloadDBModel)
|
||||||
|
DelDownload(uuid string)
|
||||||
|
GetDownloadById(uuid string) model2.PersionDownloadDBModel
|
||||||
|
GetDownloadListByState(state string) []model2.PersionDownloadDBModel
|
||||||
|
}
|
||||||
|
type downloadService struct {
|
||||||
|
db *gorm.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *downloadService) AddDownloadTask(m model2.PersionDownloadDBModel) {
|
||||||
|
d.db.Create(&m)
|
||||||
|
}
|
||||||
|
func (d *downloadService) EditDownloadState(m model2.PersionDownloadDBModel) {
|
||||||
|
d.db.Model(&m).Where("uuid = ?", m.UUID).Update("state", m.State)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *downloadService) DelDownload(uuid string) {
|
||||||
|
var m model2.PersionDownloadDBModel
|
||||||
|
d.db.Where("uuid = ?", uuid).Delete(&m)
|
||||||
|
}
|
||||||
|
func (d *downloadService) GetDownloadById(uuid string) model2.PersionDownloadDBModel {
|
||||||
|
var m model2.PersionDownloadDBModel
|
||||||
|
d.db.Model(m).Where("uuid = ?", uuid).First(&m)
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
func (d *downloadService) GetDownloadListByState(state string) (list []model2.PersionDownloadDBModel) {
|
||||||
|
if len(state) == 0 {
|
||||||
|
d.db.Find(&list)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
d.db.Where("state = ?", state).Find(&list)
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *downloadService) SaveDownload(m model2.PersionDownloadDBModel) {
|
||||||
|
d.db.Save(&m)
|
||||||
|
}
|
||||||
|
func NewDownloadService(db *gorm.DB) DownloadService {
|
||||||
|
return &downloadService{db: db}
|
||||||
|
}
|
|
@ -1,6 +1,8 @@
|
||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"reflect"
|
||||||
|
|
||||||
model2 "github.com/IceWhaleTech/CasaOS/service/model"
|
model2 "github.com/IceWhaleTech/CasaOS/service/model"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
)
|
)
|
||||||
|
@ -12,6 +14,7 @@ type FriendService interface {
|
||||||
GetFriendById(m model2.FriendModel) model2.FriendModel
|
GetFriendById(m model2.FriendModel) model2.FriendModel
|
||||||
GetFriendList() (list []model2.FriendModel)
|
GetFriendList() (list []model2.FriendModel)
|
||||||
UpdateAddFriendType(m model2.FriendModel)
|
UpdateAddFriendType(m model2.FriendModel)
|
||||||
|
UpdateOrCreate(m model2.FriendModel)
|
||||||
}
|
}
|
||||||
|
|
||||||
type friendService struct {
|
type friendService struct {
|
||||||
|
@ -38,6 +41,17 @@ func (p *friendService) GetFriendList() (list []model2.FriendModel) {
|
||||||
return list
|
return list
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *friendService) UpdateOrCreate(m model2.FriendModel) {
|
||||||
|
friend := model2.FriendModel{}
|
||||||
|
p.db.Where("token = ?", m.Token).First(&friend)
|
||||||
|
if reflect.DeepEqual(friend, model2.FriendModel{}) {
|
||||||
|
p.db.Create(&m)
|
||||||
|
} else {
|
||||||
|
p.db.Model(&m).Updates(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func (p *friendService) UpdateAddFriendType(m model2.FriendModel) {
|
func (p *friendService) UpdateAddFriendType(m model2.FriendModel) {
|
||||||
p.db.Model(&m).Updates(m)
|
p.db.Model(&m).Updates(m)
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,23 +2,17 @@ package model
|
||||||
|
|
||||||
type PersionDownloadDBModel struct {
|
type PersionDownloadDBModel struct {
|
||||||
UUID string `gorm:"column:uuid;primary_key" json:"uuid"`
|
UUID string `gorm:"column:uuid;primary_key" json:"uuid"`
|
||||||
State int `json:"state"` //
|
State int `json:"state"` //
|
||||||
Type int `json:"type"` //defult 1
|
Type int `json:"type"` //defult 1
|
||||||
Name string `json:"name"` //file name
|
Name string `json:"name"` //file name
|
||||||
TempPath string `json:"temp_path"` //temp path
|
Size int64 `json:"size"` //file size
|
||||||
Size int64 `json:"size"` //file size
|
BlockSize int `json:"block_size"`
|
||||||
Section string `json:"section"`
|
|
||||||
Length int `json:"length"` //slice length
|
Length int `json:"length"` //slice length
|
||||||
Hash string `json:"hash"`
|
Hash string `json:"hash"`
|
||||||
CreatedAt string `gorm:"<-:create;autoCreateTime" json:"created_at"`
|
CreatedAt int64 `gorm:"autoCreateTime" json:"created_at"`
|
||||||
UpdatedAt string `gorm:"<-:create;<-:update;autoUpdateTime" json:"updated_at"`
|
UpdatedAt int64 `gorm:"autoCreateTime;autoUpdateTime" json:"updated_at"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PersionDownloadDBModel) TableName() string {
|
func (p *PersionDownloadDBModel) TableName() string {
|
||||||
return "o_persion_download"
|
return "o_persion_download"
|
||||||
}
|
}
|
||||||
|
|
||||||
type PersionFileSectionModel struct {
|
|
||||||
Index int `json:"index"`
|
|
||||||
Hash string `json:"hash"`
|
|
||||||
}
|
|
||||||
|
|
|
@ -2,8 +2,8 @@ package model
|
||||||
|
|
||||||
type FriendModel struct {
|
type FriendModel struct {
|
||||||
State int `json:"state"` //备用
|
State int `json:"state"` //备用
|
||||||
CreatedAt string `gorm:"<-:create;autoCreateTime" json:"created_at"`
|
CreatedAt int64 `gorm:"autoCreateTime" json:"created_at"`
|
||||||
UpdatedAt string `gorm:"<-:create;<-:update;autoUpdateTime" json:"updated_at"`
|
UpdatedAt int64 `gorm:"autoCreateTime;autoUpdateTime" json:"updated_at"`
|
||||||
NickName string `json:"nick_name"` //custom name
|
NickName string `json:"nick_name"` //custom name
|
||||||
Avatar string `json:"avatar"` //头像
|
Avatar string `json:"avatar"` //头像
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
|
|
|
@ -40,14 +40,6 @@ type PersonService interface {
|
||||||
ReplyGetFileDetail(m model.MessageModel)
|
ReplyGetFileDetail(m model.MessageModel)
|
||||||
ReceiveFileData(m model.MessageModel)
|
ReceiveFileData(m model.MessageModel)
|
||||||
ReceiveGetFileDetail(m model.MessageModel)
|
ReceiveGetFileDetail(m model.MessageModel)
|
||||||
|
|
||||||
//------------ database
|
|
||||||
AddDownloadTask(m model2.PersionDownloadDBModel) //添加下载任务
|
|
||||||
EditDownloadState(m model2.PersionDownloadDBModel) //只修改状态
|
|
||||||
EditDownloading(m model2.PersionDownloadDBModel, section model2.PersionFileSectionModel)
|
|
||||||
SaveDownloadState(m model2.PersionDownloadDBModel)
|
|
||||||
DelDownload(uuid string)
|
|
||||||
GetDownloadById(uuid string) model2.PersionDownloadDBModel
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type personService struct {
|
type personService struct {
|
||||||
|
@ -81,7 +73,7 @@ func (p *personService) Handshake(m model.ConnectState) {
|
||||||
//1先进行udp打通成功
|
//1先进行udp打通成功
|
||||||
|
|
||||||
srcAddr := &net.UDPAddr{
|
srcAddr := &net.UDPAddr{
|
||||||
IP: net.IPv4zero, Port: 9901} //注意端口必须固定
|
IP: net.IPv4zero, Port: 9904} //注意端口必须固定
|
||||||
dstAddr := &net.UDPAddr{
|
dstAddr := &net.UDPAddr{
|
||||||
IP: net.ParseIP(config.ServerInfo.Handshake), Port: 9527}
|
IP: net.ParseIP(config.ServerInfo.Handshake), Port: 9527}
|
||||||
//DialTCP在网络协议net上连接本地地址laddr和远端地址raddr。net必须是"udp"、"udp4"、"udp6";如果laddr不是nil,将使用它作为本地地址,否则自动选择一个本地地址。
|
//DialTCP在网络协议net上连接本地地址laddr和远端地址raddr。net必须是"udp"、"udp4"、"udp6";如果laddr不是nil,将使用它作为本地地址,否则自动选择一个本地地址。
|
||||||
|
@ -101,7 +93,6 @@ func (p *personService) Handshake(m model.ConnectState) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("error during read: %s", err)
|
fmt.Printf("error during read: %s", err)
|
||||||
}
|
}
|
||||||
conn.Close()
|
|
||||||
toPersion := model.PersionModel{}
|
toPersion := model.PersionModel{}
|
||||||
err = json.Unmarshal(data[:n], &toPersion)
|
err = json.Unmarshal(data[:n], &toPersion)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -116,33 +107,6 @@ func (p *personService) Handshake(m model.ConnectState) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *personService) AddDownloadTask(m model2.PersionDownloadDBModel) {
|
|
||||||
p.db.Create(&m)
|
|
||||||
}
|
|
||||||
func (p *personService) EditDownloadState(m model2.PersionDownloadDBModel) {
|
|
||||||
p.db.Model(&m).Where("uuid = ?", m.UUID).Update("state", m.State)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *personService) EditDownloading(m model2.PersionDownloadDBModel, section model2.PersionFileSectionModel) {
|
|
||||||
b, _ := json.Marshal(section)
|
|
||||||
m.Section = string(b)
|
|
||||||
p.db.Model(&m).Where("uuid = ?", m.UUID).Update("section", m.Section)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *personService) DelDownload(uuid string) {
|
|
||||||
var m model2.PersionDownloadDBModel
|
|
||||||
p.db.Where("uuid = ?", uuid).Delete(&m)
|
|
||||||
}
|
|
||||||
func (p *personService) GetDownloadById(uuid string) model2.PersionDownloadDBModel {
|
|
||||||
var m model2.PersionDownloadDBModel
|
|
||||||
p.db.Model(m).Where("uuid = ?", uuid).First(&m)
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *personService) SaveDownloadState(m model2.PersionDownloadDBModel) {
|
|
||||||
p.db.Save(&m)
|
|
||||||
}
|
|
||||||
|
|
||||||
var ipAddress chan string
|
var ipAddress chan string
|
||||||
|
|
||||||
type sysConn struct {
|
type sysConn struct {
|
||||||
|
@ -152,104 +116,11 @@ type sysConn struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func UDPConnect(ips []string) {
|
func UDPConnect(ips []string) {
|
||||||
quicConfig := &quic.Config{
|
|
||||||
ConnectionIDLength: 12,
|
|
||||||
HandshakeIdleTimeout: time.Second * 8,
|
|
||||||
MaxIdleTimeout: time.Second * 45,
|
|
||||||
MaxIncomingStreams: 32,
|
|
||||||
MaxIncomingUniStreams: -1,
|
|
||||||
KeepAlive: true,
|
|
||||||
}
|
|
||||||
fmt.Println(quicConfig)
|
|
||||||
//PersonUDPMap = make(map[string]*net.UDPAddr)
|
|
||||||
ipAddress = make(chan string)
|
|
||||||
|
|
||||||
srcAddr := &net.UDPAddr{
|
//m := model.ConnectState{}
|
||||||
IP: net.IPv4zero, Port: 9901}
|
|
||||||
fmt.Println(srcAddr)
|
|
||||||
//UDPconn, err := net.ListenUDP("udp", srcAddr)
|
|
||||||
// sysconn := &sysConn{
|
|
||||||
// conn: UDPconn,
|
|
||||||
// header: "",
|
|
||||||
// auth: nil,
|
|
||||||
// }
|
|
||||||
// if err != nil {
|
|
||||||
// fmt.Println(err)
|
|
||||||
// }
|
|
||||||
// liste, err := quic.Listen(UDPconn, generateTLSConfig(), nil)
|
|
||||||
// if err != nil {
|
|
||||||
// fmt.Println(err)
|
|
||||||
// }
|
|
||||||
// ssss, err := liste.Accept(context.Background())
|
|
||||||
// if err != nil {
|
|
||||||
// fmt.Println(err)
|
|
||||||
// }
|
|
||||||
// st, err := ssss.AcceptStream(context.Background())
|
|
||||||
// if err != nil {
|
|
||||||
// fmt.Println(err)
|
|
||||||
// }
|
|
||||||
// st.Write([]byte("ssss"))
|
|
||||||
qlister, err := quic.ListenAddr("0.0.0.0:9901", generateTLSConfig(), nil)
|
|
||||||
//qlister, err := quic.Listen(UDPconn, nil, nil)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("quic错误", qlister)
|
|
||||||
}
|
|
||||||
//session, e := qlister.Accept()
|
|
||||||
sess, err := qlister.Accept(context.Background())
|
|
||||||
sess.SendMessage([]byte("aaaa"))
|
|
||||||
stream, err := sess.AcceptStream(context.Background())
|
|
||||||
stream.Write([]byte("bbb"))
|
|
||||||
//quic.Dial()
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("quic错误", qlister)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
//MyService.Person().Handshake(m)
|
||||||
fmt.Println("监听错误", err.Error())
|
|
||||||
}
|
|
||||||
for _, v := range ips {
|
|
||||||
dstAddr := &net.UDPAddr{
|
|
||||||
IP: net.ParseIP(v), Port: 9901}
|
|
||||||
|
|
||||||
fmt.Println(v, "开始监听")
|
|
||||||
|
|
||||||
//quic.Dial()
|
|
||||||
|
|
||||||
go AsyncUDPConnect(dstAddr)
|
|
||||||
}
|
|
||||||
|
|
||||||
for {
|
|
||||||
data := make([]byte, 1024)
|
|
||||||
n, add, err := UDPconn.ReadFromUDP(data)
|
|
||||||
fmt.Println(add)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("error during read:%s\n", err)
|
|
||||||
} else {
|
|
||||||
|
|
||||||
fmt.Println("收到数据:", string(data[:n]))
|
|
||||||
msg := model.MessageModel{}
|
|
||||||
err := json.Unmarshal(data[:n], &msg)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("转义错误:%s\n", err)
|
|
||||||
}
|
|
||||||
//todo:检查数据库是否为合法请求
|
|
||||||
if msg.Type == "hi" {
|
|
||||||
//add ip
|
|
||||||
//PersonUDPMap[msg.From] = add
|
|
||||||
} else if msg.Type == "browse" {
|
|
||||||
//获取目录结构
|
|
||||||
} else if msg.Type == "file_detail" {
|
|
||||||
MyService.Person().ReplyGetFileDetail(msg)
|
|
||||||
} else if msg.Type == "file_detail_reply" {
|
|
||||||
MyService.Person().ReceiveGetFileDetail(msg)
|
|
||||||
} else if msg.Type == "file_data_reply" {
|
|
||||||
MyService.Person().ReceiveFileData(msg)
|
|
||||||
} else {
|
|
||||||
fmt.Println("未知事件")
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup a bare-bones TLS config for the server
|
// Setup a bare-bones TLS config for the server
|
||||||
|
@ -327,7 +198,6 @@ func (p *personService) Download(m model.MessageModel) {
|
||||||
}
|
}
|
||||||
summary := model.FileSummaryModel{}
|
summary := model.FileSummaryModel{}
|
||||||
summary.Hash = file.GetHashByPath(fDetail.Name())
|
summary.Hash = file.GetHashByPath(fDetail.Name())
|
||||||
summary.Path = m.Data.(string)
|
|
||||||
summary.BlockSize, summary.Length = file.GetBlockInfo(fDetail.Size())
|
summary.BlockSize, summary.Length = file.GetBlockInfo(fDetail.Size())
|
||||||
|
|
||||||
msg := model.MessageModel{}
|
msg := model.MessageModel{}
|
||||||
|
@ -349,7 +219,8 @@ func (p *personService) Download(m model.MessageModel) {
|
||||||
|
|
||||||
//receive file data
|
//receive file data
|
||||||
func (p *personService) ReceiveFileData(m model.MessageModel) {
|
func (p *personService) ReceiveFileData(m model.MessageModel) {
|
||||||
task := p.GetDownloadById(m.UUId)
|
//task := p.GetDownloadById(m.UUId)
|
||||||
|
task := model2.PersionDownloadDBModel{}
|
||||||
|
|
||||||
//需要重置参数
|
//需要重置参数
|
||||||
tempPath := "/oasis/download/" + task.UUID
|
tempPath := "/oasis/download/" + task.UUID
|
||||||
|
@ -391,7 +262,7 @@ func (p *personService) ReceiveFileData(m model.MessageModel) {
|
||||||
if h := file.GetHashByPath(filePath); h == task.Hash {
|
if h := file.GetHashByPath(filePath); h == task.Hash {
|
||||||
//最终文件比对成功
|
//最终文件比对成功
|
||||||
task.State = types.DOWNLOADFINISH
|
task.State = types.DOWNLOADFINISH
|
||||||
p.EditDownloadState(task)
|
//p.EditDownloadState(task)
|
||||||
//remove temp path
|
//remove temp path
|
||||||
file.RMDir(tempPath)
|
file.RMDir(tempPath)
|
||||||
}
|
}
|
||||||
|
@ -417,7 +288,6 @@ func (p *personService) ReplyGetFileDetail(m model.MessageModel) {
|
||||||
summary.Name = f.Name()
|
summary.Name = f.Name()
|
||||||
summary.Size = f.Size()
|
summary.Size = f.Size()
|
||||||
summary.Hash = file.GetHashByPath(path)
|
summary.Hash = file.GetHashByPath(path)
|
||||||
summary.Path = path
|
|
||||||
summary.BlockSize, summary.Length = file.GetBlockInfo(f.Size())
|
summary.BlockSize, summary.Length = file.GetBlockInfo(f.Size())
|
||||||
|
|
||||||
msg := model.MessageModel{}
|
msg := model.MessageModel{}
|
||||||
|
@ -477,24 +347,24 @@ func (p *personService) SendFileData(m model.MessageModel, blockSize int, length
|
||||||
// 文件摘要返回
|
// 文件摘要返回
|
||||||
func (p *personService) ReceiveGetFileDetail(m model.MessageModel) {
|
func (p *personService) ReceiveGetFileDetail(m model.MessageModel) {
|
||||||
|
|
||||||
task := p.GetDownloadById("")
|
// task := p.GetDownloadById("")
|
||||||
bss, _ := json.Marshal(m.Data)
|
// bss, _ := json.Marshal(m.Data)
|
||||||
summary := model.FileSummaryModel{}
|
// summary := model.FileSummaryModel{}
|
||||||
err := json.Unmarshal(bss, &summary)
|
// err := json.Unmarshal(bss, &summary)
|
||||||
if err != nil {
|
// if err != nil {
|
||||||
fmt.Println(err)
|
// fmt.Println(err)
|
||||||
}
|
// }
|
||||||
task.Hash = summary.Hash
|
// task.Hash = summary.Hash
|
||||||
task.Length = summary.Length
|
// task.Length = summary.Length
|
||||||
task.Size = summary.Size
|
// task.Size = summary.Size
|
||||||
|
|
||||||
p.SaveDownloadState(task)
|
// p.SaveDownloadState(task)
|
||||||
}
|
}
|
||||||
|
|
||||||
func AsyncUDPConnect(dst *net.UDPAddr) {
|
func AsyncUDPConnect(dst *net.UDPAddr) {
|
||||||
for {
|
for {
|
||||||
time.Sleep(2 * time.Second)
|
time.Sleep(2 * time.Second)
|
||||||
if _, err := UDPconn.WriteToUDP([]byte(dst.IP.String()+" is ok"), dst); err != nil {
|
if _, err := UDPConn.WriteToUDP([]byte(dst.IP.String()+" is ok"), dst); err != nil {
|
||||||
log.Println("send msg fail", err)
|
log.Println("send msg fail", err)
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
|
@ -518,9 +388,13 @@ func UDPService() {
|
||||||
KeepAlive: true,
|
KeepAlive: true,
|
||||||
}
|
}
|
||||||
srcAddr := &net.UDPAddr{
|
srcAddr := &net.UDPAddr{
|
||||||
IP: net.IPv4zero, Port: 9902} //注意端口必须固定
|
IP: net.IPv4zero, Port: 9904} //注意端口必须固定
|
||||||
fmt.Println(srcAddr.String())
|
var err error
|
||||||
listener, err := quic.ListenAddr(srcAddr.String(), generateTLSConfig(), quicConfig)
|
UDPConn, err = net.ListenUDP("udp", srcAddr)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
listener, err := quic.Listen(UDPConn, generateTLSConfig(), quicConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
|
@ -531,6 +405,7 @@ func UDPService() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
|
@ -590,10 +465,8 @@ func UDPService() {
|
||||||
|
|
||||||
//处理内容
|
//处理内容
|
||||||
func ProcessingContent(stream quic.Stream) {
|
func ProcessingContent(stream quic.Stream) {
|
||||||
//需要处理关闭问题
|
|
||||||
|
|
||||||
for {
|
for {
|
||||||
prefixByte := make([]byte, 4)
|
prefixByte := make([]byte, 6)
|
||||||
c1, err := io.ReadFull(stream, prefixByte)
|
c1, err := io.ReadFull(stream, prefixByte)
|
||||||
fmt.Println(c1)
|
fmt.Println(c1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -619,13 +492,22 @@ func ProcessingContent(stream quic.Stream) {
|
||||||
//什么也不做
|
//什么也不做
|
||||||
continue
|
continue
|
||||||
} else if m.Type == "directory" {
|
} else if m.Type == "directory" {
|
||||||
list := MyService.ZiMa().GetDirPath(m.Data.(string))
|
var list []model.Path
|
||||||
|
if m.Data.(string) == "" || m.Data.(string) == "/" {
|
||||||
|
for _, v := range config.FileSettingInfo.ShareDir {
|
||||||
|
tempList := MyService.ZiMa().GetDirPath(v)
|
||||||
|
list = append(list, tempList...)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
list = MyService.ZiMa().GetDirPath(m.Data.(string))
|
||||||
|
}
|
||||||
m.To = m.From
|
m.To = m.From
|
||||||
m.Data = list
|
m.Data = list
|
||||||
m.From = config.ServerInfo.Token
|
m.From = config.ServerInfo.Token
|
||||||
SendData(stream, m)
|
SendData(stream, m)
|
||||||
break
|
break
|
||||||
} else if m.Type == "file_data" {
|
} else if m.Type == "file_data" {
|
||||||
|
|
||||||
SendFileData(stream, m.Data.(string), m.From, m.UUId)
|
SendFileData(stream, m.Data.(string), m.From, m.UUId)
|
||||||
break
|
break
|
||||||
} else if m.Type == types.PERSONADDFRIEND {
|
} else if m.Type == types.PERSONADDFRIEND {
|
||||||
|
@ -636,7 +518,7 @@ func ProcessingContent(stream quic.Stream) {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
go MyService.Friend().UpdateAddFriendType(friend)
|
go MyService.Friend().UpdateOrCreate(friend)
|
||||||
mi := model2.FriendModel{}
|
mi := model2.FriendModel{}
|
||||||
mi.Avatar = config.UserInfo.Avatar
|
mi.Avatar = config.UserInfo.Avatar
|
||||||
mi.Profile = config.UserInfo.Description
|
mi.Profile = config.UserInfo.Description
|
||||||
|
@ -647,6 +529,23 @@ func ProcessingContent(stream quic.Stream) {
|
||||||
m.From = config.ServerInfo.Token
|
m.From = config.ServerInfo.Token
|
||||||
|
|
||||||
SendData(stream, m)
|
SendData(stream, m)
|
||||||
|
break
|
||||||
|
} else if m.Type == "connection" {
|
||||||
|
UDPAddressMap[m.From] = m.Data.(string)
|
||||||
|
fmt.Println("persion", m)
|
||||||
|
mi := model2.FriendModel{}
|
||||||
|
mi.Avatar = config.UserInfo.Avatar
|
||||||
|
mi.Profile = config.UserInfo.Description
|
||||||
|
mi.Name = config.UserInfo.UserName
|
||||||
|
mi.Token = config.ServerInfo.Token
|
||||||
|
msg := model.MessageModel{}
|
||||||
|
msg.Type = types.PERSONADDFRIEND
|
||||||
|
msg.Data = mi
|
||||||
|
msg.To = m.From
|
||||||
|
msg.From = config.ServerInfo.Token
|
||||||
|
msg.UUId = m.UUId
|
||||||
|
Dial(m.Data.(string), msg)
|
||||||
|
|
||||||
break
|
break
|
||||||
} else {
|
} else {
|
||||||
//不应有不做返回的数据
|
//不应有不做返回的数据
|
||||||
|
@ -673,20 +572,43 @@ func SendFileData(stream quic.Stream, filePath, to, uuid string) error {
|
||||||
fmt.Println("读取失败", err)
|
fmt.Println("读取失败", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//先发送文件摘要
|
||||||
|
|
||||||
|
summary := model.FileSummaryModel{}
|
||||||
|
summary.BlockSize = blockSize
|
||||||
|
summary.Hash = file.GetHashByPath(filePath)
|
||||||
|
summary.Length = length
|
||||||
|
summary.Name = fStat.Name()
|
||||||
|
summary.Size = fStat.Size()
|
||||||
|
|
||||||
|
msg := model.MessageModel{}
|
||||||
|
msg.Type = "summary"
|
||||||
|
msg.Data = summary
|
||||||
|
msg.From = config.ServerInfo.Token
|
||||||
|
msg.To = to
|
||||||
|
msg.UUId = uuid
|
||||||
|
|
||||||
|
summaryByte, _ := json.Marshal(msg)
|
||||||
|
summaryPrefixLength := file.PrefixLength(len(summaryByte))
|
||||||
|
summaryData := append(summaryPrefixLength, summaryByte...)
|
||||||
|
stream.Write(summaryData)
|
||||||
|
|
||||||
bufferedReader := bufio.NewReader(f)
|
bufferedReader := bufio.NewReader(f)
|
||||||
buf := make([]byte, blockSize)
|
buf := make([]byte, blockSize)
|
||||||
for i := 0; i < length; i++ {
|
for i := 0; i < length; i++ {
|
||||||
|
|
||||||
tran := model.TranFileModel{}
|
tran := model.TranFileModel{}
|
||||||
|
|
||||||
_, err = bufferedReader.Read(buf)
|
n, err := bufferedReader.Read(buf)
|
||||||
|
|
||||||
if err == io.EOF {
|
if err == io.EOF {
|
||||||
fmt.Println("读取完毕", err)
|
fmt.Println("读取完毕", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
tran.Hash = file.GetHashByContent(buf)
|
tran.Hash = file.GetHashByContent(buf[:n])
|
||||||
tran.Index = i
|
tran.Index = i
|
||||||
|
tran.Length = length
|
||||||
|
|
||||||
msg := model.MessageModel{}
|
msg := model.MessageModel{}
|
||||||
msg.Type = "file_data"
|
msg.Type = "file_data"
|
||||||
|
@ -695,7 +617,10 @@ func SendFileData(stream quic.Stream, filePath, to, uuid string) error {
|
||||||
msg.To = to
|
msg.To = to
|
||||||
msg.UUId = uuid
|
msg.UUId = uuid
|
||||||
b, _ := json.Marshal(msg)
|
b, _ := json.Marshal(msg)
|
||||||
stream.Write(b)
|
prefixLength := file.PrefixLength(len(b))
|
||||||
|
dataLength := file.DataLength(len(buf[:n]))
|
||||||
|
data := append(append(append(prefixLength, b...), dataLength...), buf[:n]...)
|
||||||
|
stream.Write(data)
|
||||||
}
|
}
|
||||||
defer stream.Close()
|
defer stream.Close()
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -34,6 +34,7 @@ type Repository interface {
|
||||||
Search() SearchService
|
Search() SearchService
|
||||||
Person() PersonService
|
Person() PersonService
|
||||||
Friend() FriendService
|
Friend() FriendService
|
||||||
|
Download() DownloadService
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewService(db *gorm.DB, log loger2.OLog) Repository {
|
func NewService(db *gorm.DB, log loger2.OLog) Repository {
|
||||||
|
@ -57,6 +58,7 @@ func NewService(db *gorm.DB, log loger2.OLog) Repository {
|
||||||
search: NewSearchService(),
|
search: NewSearchService(),
|
||||||
person: NewPersonService(db),
|
person: NewPersonService(db),
|
||||||
friend: NewFriendService(db),
|
friend: NewFriendService(db),
|
||||||
|
download: NewDownloadService(db),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,8 +81,12 @@ type store struct {
|
||||||
search SearchService
|
search SearchService
|
||||||
person PersonService
|
person PersonService
|
||||||
friend FriendService
|
friend FriendService
|
||||||
|
download DownloadService
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *store) Download() DownloadService {
|
||||||
|
return c.download
|
||||||
|
}
|
||||||
func (c *store) Friend() FriendService {
|
func (c *store) Friend() FriendService {
|
||||||
return c.friend
|
return c.friend
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,6 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/url"
|
"net/url"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/IceWhaleTech/CasaOS/model"
|
"github.com/IceWhaleTech/CasaOS/model"
|
||||||
|
@ -53,7 +52,7 @@ func SocketConnect() {
|
||||||
m.To = msa.From
|
m.To = msa.From
|
||||||
m.Type = types.PERSONADDFRIEND
|
m.Type = types.PERSONADDFRIEND
|
||||||
m.UUId = uuid
|
m.UUId = uuid
|
||||||
result, err := Dial("192.168.2.225:9902", m)
|
result, err := Dial("192.168.2.224:9902", m)
|
||||||
friend := model2.FriendModel{}
|
friend := model2.FriendModel{}
|
||||||
if err != nil && !reflect.DeepEqual(result, friend) {
|
if err != nil && !reflect.DeepEqual(result, friend) {
|
||||||
dataModelByte, _ := json.Marshal(result.Data)
|
dataModelByte, _ := json.Marshal(result.Data)
|
||||||
|
@ -91,14 +90,14 @@ func SocketConnect() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func Connect() {
|
func Connect() {
|
||||||
host := strings.Split(config.ServerInfo.Handshake, "://")
|
u := url.URL{Scheme: "ws", Host: config.ServerInfo.Handshake + ":8088", Path: "/v1/ws"}
|
||||||
u := url.URL{Scheme: "ws", Host: host[1], Path: "/v1/ws"}
|
|
||||||
for {
|
for {
|
||||||
d, _, e := websocket.DefaultDialer.Dial(u.String(), nil)
|
d, _, e := websocket.DefaultDialer.Dial(u.String(), nil)
|
||||||
if e == nil {
|
if e == nil {
|
||||||
WebSocketConn = d
|
WebSocketConn = d
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
fmt.Println(e)
|
||||||
time.Sleep(time.Second * 5)
|
time.Sleep(time.Second * 5)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,19 +10,23 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net"
|
"net"
|
||||||
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/IceWhaleTech/CasaOS/model"
|
"github.com/IceWhaleTech/CasaOS/model"
|
||||||
"github.com/IceWhaleTech/CasaOS/pkg/config"
|
"github.com/IceWhaleTech/CasaOS/pkg/config"
|
||||||
"github.com/IceWhaleTech/CasaOS/pkg/utils/file"
|
"github.com/IceWhaleTech/CasaOS/pkg/utils/file"
|
||||||
|
model2 "github.com/IceWhaleTech/CasaOS/service/model"
|
||||||
|
"github.com/IceWhaleTech/CasaOS/types"
|
||||||
"github.com/lucas-clemente/quic-go"
|
"github.com/lucas-clemente/quic-go"
|
||||||
uuid "github.com/satori/go.uuid"
|
uuid "github.com/satori/go.uuid"
|
||||||
)
|
)
|
||||||
|
|
||||||
var UDPconn *net.UDPConn
|
var UDPConn *net.UDPConn
|
||||||
var PeopleMap map[string]quic.Stream
|
var PeopleMap map[string]quic.Stream
|
||||||
var Message chan model.MessageModel
|
var Message chan model.MessageModel
|
||||||
|
var UDPAddressMap map[string]string
|
||||||
|
|
||||||
func Dial(addr string, msg model.MessageModel) (m model.MessageModel, err error) {
|
func Dial(addr string, msg model.MessageModel) (m model.MessageModel, err error) {
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||||
|
@ -37,8 +41,18 @@ func Dial(addr string, msg model.MessageModel) (m model.MessageModel, err error)
|
||||||
NextProtos: []string{"bench"},
|
NextProtos: []string{"bench"},
|
||||||
SessionTicketsDisabled: true,
|
SessionTicketsDisabled: true,
|
||||||
}
|
}
|
||||||
|
srcAddr := &net.UDPAddr{
|
||||||
|
IP: net.IPv4zero, Port: 9904} //注意端口必须固定
|
||||||
|
//addr
|
||||||
|
if len(addr) == 0 {
|
||||||
|
addr = config.ServerInfo.Handshake + ":9527"
|
||||||
|
}
|
||||||
|
dstAddr, err := net.ResolveUDPAddr("udp", addr)
|
||||||
|
|
||||||
session, err := quic.DialAddrContext(ctx, addr, tlsConf, quicConfig)
|
//DialTCP在网络协议net上连接本地地址laddr和远端地址raddr。net必须是"udp"、"udp4"、"udp6";如果laddr不是nil,将使用它作为本地地址,否则自动选择一个本地地址。
|
||||||
|
//(conn)UDPConn代表一个UDP网络连接,实现了Conn和PacketConn接口
|
||||||
|
|
||||||
|
session, err := quic.DialContext(ctx, UDPConn, dstAddr, srcAddr.String(), tlsConf, quicConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return m, err
|
return m, err
|
||||||
}
|
}
|
||||||
|
@ -79,11 +93,12 @@ func SendData(stream quic.Stream, m model.MessageModel) {
|
||||||
stream.Write(data)
|
stream.Write(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var Summary map[string]model.FileSummaryModel
|
||||||
|
|
||||||
//读取数据
|
//读取数据
|
||||||
func ReadContent(stream quic.Stream) {
|
func ReadContent(stream quic.Stream) {
|
||||||
path := ""
|
|
||||||
for {
|
for {
|
||||||
prefixByte := make([]byte, 4)
|
prefixByte := make([]byte, 6)
|
||||||
c1, err := io.ReadFull(stream, prefixByte)
|
c1, err := io.ReadFull(stream, prefixByte)
|
||||||
fmt.Println(c1, err, string(prefixByte))
|
fmt.Println(c1, err, string(prefixByte))
|
||||||
prefixLength, err := strconv.Atoi(string(prefixByte))
|
prefixLength, err := strconv.Atoi(string(prefixByte))
|
||||||
|
@ -96,7 +111,7 @@ func ReadContent(stream quic.Stream) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
|
fmt.Println(m)
|
||||||
//传输数据需要继续读取
|
//传输数据需要继续读取
|
||||||
if m.Type == "file_data" {
|
if m.Type == "file_data" {
|
||||||
dataModelByte, _ := json.Marshal(m.Data)
|
dataModelByte, _ := json.Marshal(m.Data)
|
||||||
|
@ -121,13 +136,80 @@ func ReadContent(stream quic.Stream) {
|
||||||
fmt.Println("hash不匹配", hash, dataModel.Hash)
|
fmt.Println("hash不匹配", hash, dataModel.Hash)
|
||||||
}
|
}
|
||||||
|
|
||||||
filepath := path + strconv.Itoa(dataModel.Index)
|
tempPath := config.AppInfo.RootPath + "/temp" + "/" + m.UUId
|
||||||
|
file.IsNotExistMkDir(tempPath)
|
||||||
|
filepath := tempPath + "/" + strconv.Itoa(dataModel.Index)
|
||||||
|
tempFile, err := os.Stat(filepath)
|
||||||
|
|
||||||
|
if os.IsNotExist(err) || tempFile.Size() == 0 {
|
||||||
|
err = ioutil.WriteFile(filepath, dataByte, 0644)
|
||||||
|
} else {
|
||||||
|
if file.GetHashByPath(filepath) != dataModel.Hash {
|
||||||
|
os.Remove(filepath)
|
||||||
|
err = ioutil.WriteFile(filepath, dataByte, 0644)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
files, err := ioutil.ReadDir(tempPath)
|
||||||
|
|
||||||
|
if len(files) >= dataModel.Length {
|
||||||
|
summary := Summary[m.UUId]
|
||||||
|
file.SpliceFiles(tempPath, config.FileSettingInfo.DownloadDir+"/"+summary.Name, dataModel.Length, 0)
|
||||||
|
if file.GetHashByPath(config.FileSettingInfo.DownloadDir+"/"+summary.Name) == summary.Hash {
|
||||||
|
file.RMDir(tempPath)
|
||||||
|
task := model2.PersionDownloadDBModel{}
|
||||||
|
task.UUID = m.UUId
|
||||||
|
task.State = types.DOWNLOADFINISH
|
||||||
|
MyService.Download().EditDownloadState(task)
|
||||||
|
} else {
|
||||||
|
os.Remove(config.FileSettingInfo.DownloadDir + "/" + summary.Name)
|
||||||
|
task := model2.PersionDownloadDBModel{}
|
||||||
|
task.UUID = m.UUId
|
||||||
|
task.State = types.DOWNLOADERROR
|
||||||
|
MyService.Download().EditDownloadState(task)
|
||||||
|
}
|
||||||
|
|
||||||
err = ioutil.WriteFile(filepath, dataByte, 0644)
|
|
||||||
if dataModel.Index >= (dataModel.Length - 1) {
|
|
||||||
//file.SpliceFiles("", path, dataModel.Length)
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
} else if m.Type == "summary" {
|
||||||
|
|
||||||
|
dataModel := model.FileSummaryModel{}
|
||||||
|
if m.UUId == m.UUId {
|
||||||
|
dataModelByte, _ := json.Marshal(m.Data)
|
||||||
|
err := json.Unmarshal(dataModelByte, &dataModel)
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
task := model2.PersionDownloadDBModel{}
|
||||||
|
task.UUID = m.UUId
|
||||||
|
task.Name = dataModel.Name
|
||||||
|
task.Length = dataModel.Length
|
||||||
|
task.Size = dataModel.Size
|
||||||
|
task.State = types.DOWNLOADING
|
||||||
|
task.BlockSize = dataModel.BlockSize
|
||||||
|
task.Hash = dataModel.Hash
|
||||||
|
task.Type = 0
|
||||||
|
MyService.Download().SaveDownload(task)
|
||||||
|
|
||||||
|
Summary[m.UUId] = dataModel
|
||||||
|
|
||||||
|
} else if m.Type == "connection" {
|
||||||
|
UDPAddressMap[m.From] = m.Data.(string)
|
||||||
|
fmt.Println("udpconn", m)
|
||||||
|
mi := model2.FriendModel{}
|
||||||
|
mi.Avatar = config.UserInfo.Avatar
|
||||||
|
mi.Profile = config.UserInfo.Description
|
||||||
|
mi.Name = config.UserInfo.UserName
|
||||||
|
mi.Token = config.ServerInfo.Token
|
||||||
|
msg := model.MessageModel{}
|
||||||
|
msg.Type = types.PERSONADDFRIEND
|
||||||
|
msg.Data = mi
|
||||||
|
msg.To = m.From
|
||||||
|
msg.From = config.ServerInfo.Token
|
||||||
|
msg.UUId = m.UUId
|
||||||
|
Dial(m.Data.(string), msg)
|
||||||
|
Message <- m
|
||||||
|
break
|
||||||
} else {
|
} else {
|
||||||
Message <- m
|
Message <- m
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue