github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/service/admin/aria2.go (about)

     1  package admin
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	model "github.com/cloudreve/Cloudreve/v3/models"
     7  	"net/url"
     8  	"time"
     9  
    10  	"github.com/cloudreve/Cloudreve/v3/pkg/aria2"
    11  	"github.com/cloudreve/Cloudreve/v3/pkg/auth"
    12  	"github.com/cloudreve/Cloudreve/v3/pkg/request"
    13  	"github.com/cloudreve/Cloudreve/v3/pkg/serializer"
    14  )
    15  
    16  // Aria2TestService aria2连接测试服务
    17  type Aria2TestService struct {
    18  	Server string          `json:"server"`
    19  	RPC    string          `json:"rpc" binding:"required"`
    20  	Secret string          `json:"secret"`
    21  	Token  string          `json:"token"`
    22  	Type   model.ModelType `json:"type"`
    23  }
    24  
    25  // Test 测试aria2连接
    26  func (service *Aria2TestService) TestMaster() serializer.Response {
    27  	res, err := aria2.TestRPCConnection(service.RPC, service.Token, 5)
    28  	if err != nil {
    29  		return serializer.ParamErr("Failed to connect to RPC server: "+err.Error(), err)
    30  	}
    31  
    32  	if res.Version == "" {
    33  		return serializer.ParamErr("RPC server returns unexpected response", nil)
    34  	}
    35  
    36  	return serializer.Response{Data: res.Version}
    37  }
    38  
    39  func (service *Aria2TestService) TestSlave() serializer.Response {
    40  	slave, err := url.Parse(service.Server)
    41  	if err != nil {
    42  		return serializer.ParamErr("Cannot parse slave server URL, "+err.Error(), nil)
    43  	}
    44  
    45  	controller, _ := url.Parse("/api/v3/slave/ping/aria2")
    46  
    47  	// 请求正文
    48  	service.Type = model.MasterNodeType
    49  	bodyByte, _ := json.Marshal(service)
    50  
    51  	r := request.NewClient()
    52  	res, err := r.Request(
    53  		"POST",
    54  		slave.ResolveReference(controller).String(),
    55  		bytes.NewReader(bodyByte),
    56  		request.WithTimeout(time.Duration(10)*time.Second),
    57  		request.WithCredential(
    58  			auth.HMACAuth{SecretKey: []byte(service.Secret)},
    59  			int64(model.GetIntSetting("slave_api_timeout", 60)),
    60  		),
    61  	).DecodeResponse()
    62  	if err != nil {
    63  		return serializer.ParamErr("Failed to connect to slave node, "+err.Error(), nil)
    64  	}
    65  
    66  	if res.Code != 0 {
    67  		return serializer.ParamErr("Successfully connected to slave, but slave returns: "+res.Msg, nil)
    68  	}
    69  
    70  	return serializer.Response{Data: res.Data.(string)}
    71  }