1
0

local.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package runtime
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "sync"
  7. "github.com/mhsanaei/3x-ui/v3/database/model"
  8. "github.com/mhsanaei/3x-ui/v3/xray"
  9. )
  10. type LocalDeps struct {
  11. APIPort func() int
  12. SetNeedRestart func()
  13. }
  14. type Local struct {
  15. deps LocalDeps
  16. mu sync.Mutex
  17. }
  18. func NewLocal(deps LocalDeps) *Local {
  19. return &Local{deps: deps}
  20. }
  21. func (l *Local) Name() string { return "local" }
  22. func (l *Local) withAPI(fn func(api *xray.XrayAPI) error) error {
  23. l.mu.Lock()
  24. defer l.mu.Unlock()
  25. port := l.deps.APIPort()
  26. if port <= 0 {
  27. return errors.New("local xray is not running")
  28. }
  29. var api xray.XrayAPI
  30. if err := api.Init(port); err != nil {
  31. return err
  32. }
  33. defer api.Close()
  34. return fn(&api)
  35. }
  36. func (l *Local) AddInbound(_ context.Context, ib *model.Inbound) error {
  37. body, err := json.MarshalIndent(ib.GenXrayInboundConfig(), "", " ")
  38. if err != nil {
  39. return err
  40. }
  41. return l.withAPI(func(api *xray.XrayAPI) error {
  42. return api.AddInbound(body)
  43. })
  44. }
  45. func (l *Local) DelInbound(_ context.Context, ib *model.Inbound) error {
  46. return l.withAPI(func(api *xray.XrayAPI) error {
  47. return api.DelInbound(ib.Tag)
  48. })
  49. }
  50. func (l *Local) UpdateInbound(ctx context.Context, oldIb, newIb *model.Inbound) error {
  51. _ = l.DelInbound(ctx, oldIb)
  52. if !newIb.Enable {
  53. return nil
  54. }
  55. return l.AddInbound(ctx, newIb)
  56. }
  57. func (l *Local) AddUser(_ context.Context, ib *model.Inbound, userMap map[string]any) error {
  58. return l.withAPI(func(api *xray.XrayAPI) error {
  59. return api.AddUser(string(ib.Protocol), ib.Tag, userMap)
  60. })
  61. }
  62. func (l *Local) RemoveUser(_ context.Context, ib *model.Inbound, email string) error {
  63. return l.withAPI(func(api *xray.XrayAPI) error {
  64. return api.RemoveUser(ib.Tag, email)
  65. })
  66. }
  67. func (l *Local) RestartXray(_ context.Context) error {
  68. if l.deps.SetNeedRestart != nil {
  69. l.deps.SetNeedRestart()
  70. }
  71. return nil
  72. }
  73. func (l *Local) ResetClientTraffic(_ context.Context, _ *model.Inbound, _ string) error {
  74. return nil
  75. }
  76. func (l *Local) ResetInboundClientTraffics(_ context.Context, _ *model.Inbound) error {
  77. return nil
  78. }
  79. func (l *Local) ResetAllTraffics(_ context.Context) error {
  80. return nil
  81. }