xray_setting.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. package controller
  2. import (
  3. "encoding/json"
  4. "github.com/mhsanaei/3x-ui/v2/util/common"
  5. "github.com/mhsanaei/3x-ui/v2/web/service"
  6. "github.com/gin-gonic/gin"
  7. )
  8. // XraySettingController handles Xray configuration and settings operations.
  9. type XraySettingController struct {
  10. XraySettingService service.XraySettingService
  11. SettingService service.SettingService
  12. InboundService service.InboundService
  13. OutboundService service.OutboundService
  14. XrayService service.XrayService
  15. WarpService service.WarpService
  16. }
  17. // NewXraySettingController creates a new XraySettingController and initializes its routes.
  18. func NewXraySettingController(g *gin.RouterGroup) *XraySettingController {
  19. a := &XraySettingController{}
  20. a.initRouter(g)
  21. return a
  22. }
  23. // initRouter sets up the routes for Xray settings management.
  24. func (a *XraySettingController) initRouter(g *gin.RouterGroup) {
  25. g = g.Group("/xray")
  26. g.GET("/getDefaultJsonConfig", a.getDefaultXrayConfig)
  27. g.GET("/getOutboundsTraffic", a.getOutboundsTraffic)
  28. g.GET("/getXrayResult", a.getXrayResult)
  29. g.POST("/", a.getXraySetting)
  30. g.POST("/warp/:action", a.warp)
  31. g.POST("/update", a.updateSetting)
  32. g.POST("/resetOutboundsTraffic", a.resetOutboundsTraffic)
  33. g.POST("/testOutbound", a.testOutbound)
  34. }
  35. // getXraySetting retrieves the Xray configuration template, inbound tags, and outbound test URL.
  36. func (a *XraySettingController) getXraySetting(c *gin.Context) {
  37. xraySetting, err := a.SettingService.GetXrayConfigTemplate()
  38. if err != nil {
  39. jsonMsg(c, I18nWeb(c, "pages.settings.toasts.getSettings"), err)
  40. return
  41. }
  42. inboundTags, err := a.InboundService.GetInboundTags()
  43. if err != nil {
  44. jsonMsg(c, I18nWeb(c, "pages.settings.toasts.getSettings"), err)
  45. return
  46. }
  47. outboundTestUrl, _ := a.SettingService.GetXrayOutboundTestUrl()
  48. if outboundTestUrl == "" {
  49. outboundTestUrl = "https://www.google.com/generate_204"
  50. }
  51. urlJSON, _ := json.Marshal(outboundTestUrl)
  52. xrayResponse := "{ \"xraySetting\": " + xraySetting + ", \"inboundTags\": " + inboundTags + ", \"outboundTestUrl\": " + string(urlJSON) + " }"
  53. jsonObj(c, xrayResponse, nil)
  54. }
  55. // updateSetting updates the Xray configuration settings.
  56. func (a *XraySettingController) updateSetting(c *gin.Context) {
  57. xraySetting := c.PostForm("xraySetting")
  58. if err := a.XraySettingService.SaveXraySetting(xraySetting); err != nil {
  59. jsonMsg(c, I18nWeb(c, "pages.settings.toasts.modifySettings"), err)
  60. return
  61. }
  62. outboundTestUrl := c.PostForm("outboundTestUrl")
  63. if outboundTestUrl == "" {
  64. outboundTestUrl = "https://www.google.com/generate_204"
  65. }
  66. _ = a.SettingService.SetXrayOutboundTestUrl(outboundTestUrl)
  67. jsonMsg(c, I18nWeb(c, "pages.settings.toasts.modifySettings"), nil)
  68. }
  69. // getDefaultXrayConfig retrieves the default Xray configuration.
  70. func (a *XraySettingController) getDefaultXrayConfig(c *gin.Context) {
  71. defaultJsonConfig, err := a.SettingService.GetDefaultXrayConfig()
  72. if err != nil {
  73. jsonMsg(c, I18nWeb(c, "pages.settings.toasts.getSettings"), err)
  74. return
  75. }
  76. jsonObj(c, defaultJsonConfig, nil)
  77. }
  78. // getXrayResult retrieves the current Xray service result.
  79. func (a *XraySettingController) getXrayResult(c *gin.Context) {
  80. jsonObj(c, a.XrayService.GetXrayResult(), nil)
  81. }
  82. // warp handles Warp-related operations based on the action parameter.
  83. func (a *XraySettingController) warp(c *gin.Context) {
  84. action := c.Param("action")
  85. var resp string
  86. var err error
  87. switch action {
  88. case "data":
  89. resp, err = a.WarpService.GetWarpData()
  90. case "del":
  91. err = a.WarpService.DelWarpData()
  92. case "config":
  93. resp, err = a.WarpService.GetWarpConfig()
  94. case "reg":
  95. skey := c.PostForm("privateKey")
  96. pkey := c.PostForm("publicKey")
  97. resp, err = a.WarpService.RegWarp(skey, pkey)
  98. case "license":
  99. license := c.PostForm("license")
  100. resp, err = a.WarpService.SetWarpLicense(license)
  101. }
  102. jsonObj(c, resp, err)
  103. }
  104. // getOutboundsTraffic retrieves the traffic statistics for outbounds.
  105. func (a *XraySettingController) getOutboundsTraffic(c *gin.Context) {
  106. outboundsTraffic, err := a.OutboundService.GetOutboundsTraffic()
  107. if err != nil {
  108. jsonMsg(c, I18nWeb(c, "pages.settings.toasts.getOutboundTrafficError"), err)
  109. return
  110. }
  111. jsonObj(c, outboundsTraffic, nil)
  112. }
  113. // resetOutboundsTraffic resets the traffic statistics for the specified outbound tag.
  114. func (a *XraySettingController) resetOutboundsTraffic(c *gin.Context) {
  115. tag := c.PostForm("tag")
  116. err := a.OutboundService.ResetOutboundTraffic(tag)
  117. if err != nil {
  118. jsonMsg(c, I18nWeb(c, "pages.settings.toasts.resetOutboundTrafficError"), err)
  119. return
  120. }
  121. jsonObj(c, "", nil)
  122. }
  123. // testOutbound tests an outbound configuration and returns the delay/response time.
  124. // Optional form "allOutbounds": JSON array of all outbounds; used to resolve sockopt.dialerProxy dependencies.
  125. func (a *XraySettingController) testOutbound(c *gin.Context) {
  126. outboundJSON := c.PostForm("outbound")
  127. testURL := c.PostForm("testURL")
  128. allOutboundsJSON := c.PostForm("allOutbounds")
  129. if outboundJSON == "" {
  130. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), common.NewError("outbound parameter is required"))
  131. return
  132. }
  133. result, err := a.OutboundService.TestOutbound(outboundJSON, testURL, allOutboundsJSON)
  134. if err != nil {
  135. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  136. return
  137. }
  138. jsonObj(c, result, nil)
  139. }