|
|
@ -6,11 +6,11 @@ import (
|
|
|
|
model "github.com/cloudreve/Cloudreve/v3/models"
|
|
|
|
model "github.com/cloudreve/Cloudreve/v3/models"
|
|
|
|
"github.com/cloudreve/Cloudreve/v3/pkg/aria2/common"
|
|
|
|
"github.com/cloudreve/Cloudreve/v3/pkg/aria2/common"
|
|
|
|
"github.com/cloudreve/Cloudreve/v3/pkg/aria2/rpc"
|
|
|
|
"github.com/cloudreve/Cloudreve/v3/pkg/aria2/rpc"
|
|
|
|
"github.com/cloudreve/Cloudreve/v3/pkg/auth"
|
|
|
|
|
|
|
|
"github.com/cloudreve/Cloudreve/v3/pkg/cluster"
|
|
|
|
"github.com/cloudreve/Cloudreve/v3/pkg/cluster"
|
|
|
|
"github.com/cloudreve/Cloudreve/v3/pkg/request"
|
|
|
|
"github.com/cloudreve/Cloudreve/v3/pkg/request"
|
|
|
|
"github.com/cloudreve/Cloudreve/v3/pkg/serializer"
|
|
|
|
"github.com/cloudreve/Cloudreve/v3/pkg/serializer"
|
|
|
|
"net/http"
|
|
|
|
"net/http"
|
|
|
|
|
|
|
|
"net/url"
|
|
|
|
"sync"
|
|
|
|
"sync"
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
@ -36,10 +36,10 @@ type slaveController struct {
|
|
|
|
|
|
|
|
|
|
|
|
// info of master node
|
|
|
|
// info of master node
|
|
|
|
type masterInfo struct {
|
|
|
|
type masterInfo struct {
|
|
|
|
slaveID uint
|
|
|
|
slaveID uint
|
|
|
|
id string
|
|
|
|
id string
|
|
|
|
authClient auth.Auth
|
|
|
|
ttl int
|
|
|
|
ttl int
|
|
|
|
url *url.URL
|
|
|
|
// used to invoke aria2 rpc calls
|
|
|
|
// used to invoke aria2 rpc calls
|
|
|
|
instance cluster.Node
|
|
|
|
instance cluster.Node
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -66,14 +66,18 @@ func (c *slaveController) HandleHeartBeat(req *serializer.NodePingReq) (serializ
|
|
|
|
origin.instance.Kill()
|
|
|
|
origin.instance.Kill()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
masterUrl, err := url.Parse(req.SiteURL)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
return serializer.NodePingResp{}, err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
c.masters[req.SiteID] = masterInfo{
|
|
|
|
c.masters[req.SiteID] = masterInfo{
|
|
|
|
slaveID: req.Node.ID,
|
|
|
|
slaveID: req.Node.ID,
|
|
|
|
id: req.SiteID,
|
|
|
|
id: req.SiteID,
|
|
|
|
authClient: auth.HMACAuth{
|
|
|
|
url: masterUrl,
|
|
|
|
SecretKey: []byte(req.Node.MasterKey),
|
|
|
|
ttl: req.CredentialTTL,
|
|
|
|
},
|
|
|
|
|
|
|
|
ttl: req.CredentialTTL,
|
|
|
|
|
|
|
|
instance: cluster.NewNodeFromDBModel(&model.Node{
|
|
|
|
instance: cluster.NewNodeFromDBModel(&model.Node{
|
|
|
|
|
|
|
|
MasterKey: req.Node.MasterKey,
|
|
|
|
Type: model.MasterNodeType,
|
|
|
|
Type: model.MasterNodeType,
|
|
|
|
Aria2Enabled: req.Node.Aria2Enabled,
|
|
|
|
Aria2Enabled: req.Node.Aria2Enabled,
|
|
|
|
Aria2OptionsSerialized: req.Node.Aria2OptionsSerialized,
|
|
|
|
Aria2OptionsSerialized: req.Node.Aria2OptionsSerialized,
|
|
|
@ -101,12 +105,14 @@ func (c *slaveController) SendAria2Notification(id string, msg common.StatusEven
|
|
|
|
if node, ok := c.masters[id]; ok {
|
|
|
|
if node, ok := c.masters[id]; ok {
|
|
|
|
c.lock.RUnlock()
|
|
|
|
c.lock.RUnlock()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
apiPath, _ := url.Parse(fmt.Sprintf("/api/v3/slave/aria2/%s/%d", msg.GID, msg.Status))
|
|
|
|
|
|
|
|
|
|
|
|
res, err := c.client.Request(
|
|
|
|
res, err := c.client.Request(
|
|
|
|
"PATCH",
|
|
|
|
"PATCH",
|
|
|
|
fmt.Sprintf("/api/v3/slave/aria2/%s/%d", msg.GID, msg.Status),
|
|
|
|
node.url.ResolveReference(apiPath).String(),
|
|
|
|
nil,
|
|
|
|
nil,
|
|
|
|
request.WithHeader(http.Header{"X-Node-ID": []string{fmt.Sprintf("%d", node.slaveID)}}),
|
|
|
|
request.WithHeader(http.Header{"X-Node-Id": []string{fmt.Sprintf("%d", node.slaveID)}}),
|
|
|
|
request.WithCredential(node.authClient, int64(node.ttl)),
|
|
|
|
request.WithCredential(node.instance.GetAuthInstance(), int64(node.ttl)),
|
|
|
|
).CheckHTTPResponse(200).DecodeResponse()
|
|
|
|
).CheckHTTPResponse(200).DecodeResponse()
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|