From 6eb436b2d28f7c905a8a1ff87a9993bfdd04dab6 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 8 Feb 2025 23:59:03 +0100 Subject: [PATCH] Add ExternalTrafficURL Post request call --- web/assets/js/model/setting.js | 2 +- web/job/xray_traffic_job.go | 36 ++++++++++++++++++++++++++++++++++ web/service/setting.go | 16 +++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/web/assets/js/model/setting.js b/web/assets/js/model/setting.js index 43046019..4c15f420 100644 --- a/web/assets/js/model/setting.js +++ b/web/assets/js/model/setting.js @@ -31,7 +31,7 @@ class AllSetting { this.subPath = "/sub/"; this.subJsonPath = "/json/"; this.subDomain = ""; - this.externalInformEnable = false; + this.externalTrafficInformEnable = false; this.externalTrafficInformURI = ""; this.subCertFile = ""; this.subKeyFile = ""; diff --git a/web/job/xray_traffic_job.go b/web/job/xray_traffic_job.go index dbbbb059..033f4734 100644 --- a/web/job/xray_traffic_job.go +++ b/web/job/xray_traffic_job.go @@ -1,11 +1,17 @@ package job import ( + "encoding/json" + "fmt" "x-ui/logger" "x-ui/web/service" + "x-ui/xray" + + "github.com/valyala/fasthttp" ) type XrayTrafficJob struct { + settingService service.SettingService xrayService service.XrayService inboundService service.InboundService outboundService service.OutboundService @@ -31,7 +37,37 @@ func (j *XrayTrafficJob) Run() { if err != nil { logger.Warning("add outbound traffic failed:", err) } + if ExternalInformEnable, err := j.settingService.GetExternalTrafficInformEnable(); ExternalInformEnable { + j.informTrafficToExternalAPI(traffics, clientTraffics) + } else if err != nil { + logger.Warning("get ExternalTrafficInformEnable failed:", err) + } if needRestart0 || needRestart1 { j.xrayService.SetToNeedRestart() } } + +func (j *XrayTrafficJob) informTrafficToExternalAPI(inboundTraffics []*xray.Traffic, clientTraffics []*xray.ClientTraffic) { + informURL, err := j.settingService.GetExternalTrafficInformURI() + if err != nil { + logger.Warning("get ExternalTrafficInformURI failed:", err) + return + } + requestBody, err := json.Marshal(map[string]interface{}{"clientTraffics": clientTraffics, "inboundTraffics": inboundTraffics}) + if err != nil { + logger.Warning("parse client/inbound traffic failed:", err) + return + } + request := fasthttp.AcquireRequest() + defer fasthttp.ReleaseRequest(request) + request.Header.SetMethod("POST") + request.Header.SetContentType("application/json; charset=UTF-8") + request.SetBody([]byte(requestBody)) + request.SetRequestURI(informURL) + response := fasthttp.AcquireResponse() + defer fasthttp.ReleaseResponse(response) + if err := fasthttp.Do(request, response); err != nil { + fmt.Println("err ", err) + logger.Warning("POST ExternalTrafficInformURI failed:", err) + } +} diff --git a/web/service/setting.go b/web/service/setting.go index d238c33d..4fe06517 100644 --- a/web/service/setting.go +++ b/web/service/setting.go @@ -496,6 +496,22 @@ func (s *SettingService) SetWarp(data string) error { return s.setString("warp", data) } +func (s *SettingService) GetExternalTrafficInformEnable() (bool, error) { + return s.getBool("externalTrafficInformEnable") +} + +func (s *SettingService) SetExternalTrafficInformEnable(value bool) error { + return s.setBool("externalTrafficInformEnable", value) +} + +func (s *SettingService) GetExternalTrafficInformURI() (string, error) { + return s.getString("externalTrafficInformURI") +} + +func (s *SettingService) SetExternalTrafficInformURI(InformURI string) error { + return s.setString("externalTrafficInformURI", InformURI) +} + func (s *SettingService) GetIpLimitEnable() (bool, error) { accessLogPath, err := xray.GetAccessLogPath() if err != nil {