From ddd47d69da63920831d54cc2889d29450d3b8e48 Mon Sep 17 00:00:00 2001 From: fgsfds <4870330+fgsfds@users.noreply.github.com> Date: Tue, 5 Aug 2025 02:49:53 +0500 Subject: [PATCH] better freedom/blackhole tags handling --- web/controller/server.go | 39 +++++++++++++++++++++++++++++++++++++-- web/service/server.go | 31 ++++++++++++++++++++++++------- 2 files changed, 61 insertions(+), 9 deletions(-) diff --git a/web/controller/server.go b/web/controller/server.go index a4f2e8c4..17b25cdc 100644 --- a/web/controller/server.go +++ b/web/controller/server.go @@ -17,7 +17,8 @@ var filenameRegex = regexp.MustCompile(`^[a-zA-Z0-9_\-.]+$`) type ServerController struct { BaseController - serverService service.ServerService + serverService service.ServerService + settingService service.SettingService lastStatus *service.Status lastGetStatusTime time.Time @@ -141,7 +142,41 @@ func (a *ServerController) getXrayLogs(c *gin.Context) { showDirect := c.PostForm("showDirect") showBlocked := c.PostForm("showBlocked") showProxy := c.PostForm("showProxy") - logs := a.serverService.GetXrayLogs(count, filter, showDirect, showBlocked, showProxy) + + var freedoms []string + var blackholes []string + + //getting tags for freedom and blackhole outbounds + config, err := a.settingService.GetDefaultXrayConfig() + if err == nil && config != nil { + if cfgMap, ok := config.(map[string]interface{}); ok { + if outbounds, ok := cfgMap["outbounds"].([]interface{}); ok { + for _, outbound := range outbounds { + if obMap, ok := outbound.(map[string]interface{}); ok { + switch obMap["protocol"] { + case "freedom": + if tag, ok := obMap["tag"].(string); ok { + freedoms = append(freedoms, tag) + } + case "blackhole": + if tag, ok := obMap["tag"].(string); ok { + blackholes = append(blackholes, tag) + } + } + } + } + } + } + } + + if len(freedoms) == 0 { + freedoms = []string{"direct"} + } + if len(blackholes) == 0 { + blackholes = []string{"blocked"} + } + + logs := a.serverService.GetXrayLogs(count, filter, showDirect, showBlocked, showProxy, freedoms, blackholes) jsonObj(c, logs, nil) } diff --git a/web/service/server.go b/web/service/server.go index 3630bcd2..cd51f2f2 100644 --- a/web/service/server.go +++ b/web/service/server.go @@ -482,7 +482,14 @@ func (s *ServerService) GetLogs(count string, level string, syslog string) []str return lines } -func (s *ServerService) GetXrayLogs(count string, filter string, showDirect string, showBlocked string, showProxy string) []string { +func (s *ServerService) GetXrayLogs( + count string, + filter string, + showDirect string, + showBlocked string, + showProxy string, + freedoms []string, + blackholes []string) []string { c, _ := strconv.Atoi(count) var lines []string @@ -498,22 +505,23 @@ func (s *ServerService) GetXrayLogs(count string, filter string, showDirect stri defer file.Close() scanner := bufio.NewScanner(file) - for scanner.Scan() { - line := scanner.Text() - if strings.TrimSpace(line) == "" || strings.Contains(line, "api -> api") { + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" || strings.Contains(line, "api -> api") { continue } if filter != "" && !strings.Contains(line, filter) { continue } - if showDirect == "false" && strings.HasSuffix(line, "direct]") { + + if showDirect == "false" && hasSuffix(line, freedoms) { continue } - if showBlocked == "false" && strings.HasSuffix(line, "blocked]") { + if showBlocked == "false" && hasSuffix(line, blackholes) { continue } - if showProxy == "false" && !strings.HasSuffix(line, "blocked]") && !strings.HasSuffix(line, "direct]") { + if showProxy == "false" && !hasSuffix(line, append(freedoms, blackholes...)) { continue } @@ -527,6 +535,15 @@ func (s *ServerService) GetXrayLogs(count string, filter string, showDirect stri return lines } +func hasSuffix(line string, suffixes []string) bool { + for _, sfx := range suffixes { + if strings.HasSuffix(line, sfx+"]") { + return true + } + } + return false +} + func (s *ServerService) GetConfigJson() (any, error) { config, err := s.xrayService.GetXrayConfig() if err != nil {