Skip to content

Commit

Permalink
初步适配sspanel ETag 功能 (XrayR-project#309)
Browse files Browse the repository at this point in the history
在最新sspanel 版本 M1Screw 应该找到正确下发Etag的办法了,如果你是旧版本,可以尝试
修改
res.Header().Get("ETag")
为
res.Header().Get("webapi-etag")

Co-authored-by: admin <[email protected]>
  • Loading branch information
OPPO9008 and admin authored Jun 1, 2023
1 parent 4c651e1 commit a70a0d9
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 5 deletions.
31 changes: 31 additions & 0 deletions api/sspanel/sspanel.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package sspanel
import (
"bufio"
"encoding/json"
"errors"
"fmt"
"log"
"os"
Expand Down Expand Up @@ -40,6 +41,7 @@ type APIClient struct {
LastReportOnline map[int]int
access sync.Mutex
version string
eTag map[string]string
}

// New creat a api instance
Expand Down Expand Up @@ -80,6 +82,7 @@ func New(apiConfig *api.Config) *APIClient {
LocalRuleList: localRuleList,
DisableCustomConfig: apiConfig.DisableCustomConfig,
LastReportOnline: make(map[int]int),
eTag: make(map[string]string),
}
}

Expand Down Expand Up @@ -155,8 +158,17 @@ func (c *APIClient) GetNodeInfo() (nodeInfo *api.NodeInfo, err error) {
path := fmt.Sprintf("/mod_mu/nodes/%d/info", c.NodeID)
res, err := c.client.R().
SetResult(&Response{}).
SetHeader("If-None-Match", c.eTag["NodeInfo"]).
ForceContentType("application/json").
Get(path)
// Etag identifier for a specific version of a resource. StatusCode = 304 means no changed
if res.StatusCode() == 304 {
return nil, errors.New("NodeInfo no change")
}

if res.Header().Get("ETag") != "" && res.Header().Get("ETag") != c.eTag["NodeInfo"] {
c.eTag["NodeInfo"] = res.Header().Get("ETag")
}

response, err := c.parseResponse(res, path, err)
if err != nil {
Expand Down Expand Up @@ -216,9 +228,18 @@ func (c *APIClient) GetUserList() (UserList *[]api.UserInfo, err error) {
path := "/mod_mu/users"
res, err := c.client.R().
SetQueryParam("node_id", strconv.Itoa(c.NodeID)).
SetHeader("If-None-Match", c.eTag["UserList"]).
SetResult(&Response{}).
ForceContentType("application/json").
Get(path)
// Etag identifier for a specific version of a resource. StatusCode = 304 means no changed
if res.StatusCode() == 304 {
return nil, errors.New("users no change")
}

if res.Header().Get("ETag") != "" && res.Header().Get("ETag") != c.eTag["UserList"] {
c.eTag["UserList"] = res.Header().Get("ETag")
}

response, err := c.parseResponse(res, path, err)
if err != nil {
Expand Down Expand Up @@ -328,9 +349,19 @@ func (c *APIClient) GetNodeRule() (*[]api.DetectRule, error) {
path := "/mod_mu/func/detect_rules"
res, err := c.client.R().
SetResult(&Response{}).
SetHeader("If-None-Match", c.eTag["NodeRule"]).
ForceContentType("application/json").
Get(path)

// Etag identifier for a specific version of a resource. StatusCode = 304 means no changed
if res.StatusCode() == 304 {
return nil, errors.New("detect_rules no change")
}

if res.Header().Get("ETag") != "" && res.Header().Get("ETag") != c.eTag["NodeRule"] {
c.eTag["NodeRule"] = res.Header().Get("ETag")
}

response, err := c.parseResponse(res, path, err)
if err != nil {
return nil, err
Expand Down
17 changes: 12 additions & 5 deletions service/controller/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -182,10 +182,16 @@ func (c *Controller) nodeInfoMonitor() (err error) {
}

// First fetch Node Info
var nodeInfoChanged = true
newNodeInfo, err := c.apiClient.GetNodeInfo()
if err != nil {
log.Print(err)
return nil
if err.Error() == "NodeInfo no change" {
nodeInfoChanged = false
newNodeInfo = c.nodeInfo
} else {
log.Print(err)
return nil
}
}
if newNodeInfo.Port == 0 {
return errors.New("server port must > 0")
Expand All @@ -204,9 +210,8 @@ func (c *Controller) nodeInfoMonitor() (err error) {
}
}

var nodeInfoChanged = false
// If nodeInfo changed
if !reflect.DeepEqual(c.nodeInfo, newNodeInfo) {
if nodeInfoChanged && !reflect.DeepEqual(c.nodeInfo, newNodeInfo) {
// Remove old tag
oldTag := c.Tag
err := c.removeOldTag(oldTag)
Expand Down Expand Up @@ -240,7 +245,9 @@ func (c *Controller) nodeInfoMonitor() (err error) {
// Check Rule
if !c.config.DisableGetRule {
if ruleList, err := c.apiClient.GetNodeRule(); err != nil {
log.Printf("Get rule list filed: %s", err)
if err.Error() != "detect_rules no change" {
log.Printf("Get rule list filed: %s", err)
}
} else if len(*ruleList) > 0 {
if err := c.UpdateRule(c.Tag, *ruleList); err != nil {
log.Print(err)
Expand Down

0 comments on commit a70a0d9

Please sign in to comment.