1
0

xray_traffic_job.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package job
  2. import (
  3. "encoding/json"
  4. "x-ui/logger"
  5. "x-ui/web/service"
  6. "x-ui/xray"
  7. "github.com/valyala/fasthttp"
  8. )
  9. type XrayTrafficJob struct {
  10. settingService service.SettingService
  11. xrayService service.XrayService
  12. inboundService service.InboundService
  13. outboundService service.OutboundService
  14. }
  15. func NewXrayTrafficJob() *XrayTrafficJob {
  16. return new(XrayTrafficJob)
  17. }
  18. func (j *XrayTrafficJob) Run() {
  19. if !j.xrayService.IsXrayRunning() {
  20. return
  21. }
  22. traffics, clientTraffics, err := j.xrayService.GetXrayTraffic()
  23. if err != nil {
  24. return
  25. }
  26. err, needRestart0 := j.inboundService.AddTraffic(traffics, clientTraffics)
  27. if err != nil {
  28. logger.Warning("add inbound traffic failed:", err)
  29. }
  30. err, needRestart1 := j.outboundService.AddTraffic(traffics, clientTraffics)
  31. if err != nil {
  32. logger.Warning("add outbound traffic failed:", err)
  33. }
  34. if ExternalTrafficInformEnable, err := j.settingService.GetExternalTrafficInformEnable(); ExternalTrafficInformEnable {
  35. j.informTrafficToExternalAPI(traffics, clientTraffics)
  36. } else if err != nil {
  37. logger.Warning("get ExternalTrafficInformEnable failed:", err)
  38. }
  39. if needRestart0 || needRestart1 {
  40. j.xrayService.SetToNeedRestart()
  41. }
  42. }
  43. func (j *XrayTrafficJob) informTrafficToExternalAPI(inboundTraffics []*xray.Traffic, clientTraffics []*xray.ClientTraffic) {
  44. informURL, err := j.settingService.GetExternalTrafficInformURI()
  45. if err != nil {
  46. logger.Warning("get ExternalTrafficInformURI failed:", err)
  47. return
  48. }
  49. requestBody, err := json.Marshal(map[string]interface{}{"clientTraffics": clientTraffics, "inboundTraffics": inboundTraffics})
  50. if err != nil {
  51. logger.Warning("parse client/inbound traffic failed:", err)
  52. return
  53. }
  54. request := fasthttp.AcquireRequest()
  55. defer fasthttp.ReleaseRequest(request)
  56. request.Header.SetMethod("POST")
  57. request.Header.SetContentType("application/json; charset=UTF-8")
  58. request.SetBody([]byte(requestBody))
  59. request.SetRequestURI(informURL)
  60. response := fasthttp.AcquireResponse()
  61. defer fasthttp.ReleaseResponse(response)
  62. if err := fasthttp.Do(request, response); err != nil {
  63. logger.Warning("POST ExternalTrafficInformURI failed:", err)
  64. }
  65. }