v2ray.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package core
  2. import (
  3. "context"
  4. "v2ray.com/core/app"
  5. "v2ray.com/core/app/dispatcher"
  6. "v2ray.com/core/app/dns"
  7. "v2ray.com/core/app/proxyman"
  8. "v2ray.com/core/common/log"
  9. v2net "v2ray.com/core/common/net"
  10. )
  11. // Point shell of V2Ray.
  12. type Point struct {
  13. space app.Space
  14. }
  15. // NewPoint returns a new Point server based on given configuration.
  16. // The server is not started at this point.
  17. func NewPoint(pConfig *Config) (*Point, error) {
  18. var vpoint = new(Point)
  19. if err := pConfig.Transport.Apply(); err != nil {
  20. return nil, err
  21. }
  22. if err := pConfig.Log.Apply(); err != nil {
  23. return nil, err
  24. }
  25. space := app.NewSpace()
  26. ctx := app.ContextWithSpace(context.Background(), space)
  27. vpoint.space = space
  28. outboundHandlerManager := proxyman.OutboundHandlerManagerFromSpace(space)
  29. if outboundHandlerManager == nil {
  30. o, err := app.CreateAppFromConfig(ctx, new(proxyman.OutboundConfig))
  31. if err != nil {
  32. return nil, err
  33. }
  34. space.AddApplication(o)
  35. outboundHandlerManager = o.(proxyman.OutboundHandlerManager)
  36. }
  37. inboundHandlerManager := proxyman.InboundHandlerManagerFromSpace(space)
  38. if inboundHandlerManager == nil {
  39. o, err := app.CreateAppFromConfig(ctx, new(proxyman.InboundConfig))
  40. if err != nil {
  41. return nil, err
  42. }
  43. space.AddApplication(o)
  44. inboundHandlerManager = o.(proxyman.InboundHandlerManager)
  45. }
  46. for _, appSettings := range pConfig.App {
  47. settings, err := appSettings.GetInstance()
  48. if err != nil {
  49. return nil, err
  50. }
  51. application, err := app.CreateAppFromConfig(ctx, settings)
  52. if err != nil {
  53. return nil, err
  54. }
  55. if err := space.AddApplication(application); err != nil {
  56. return nil, err
  57. }
  58. }
  59. dnsServer := dns.FromSpace(space)
  60. if dnsServer == nil {
  61. dnsConfig := &dns.Config{
  62. NameServers: []*v2net.Endpoint{{
  63. Address: v2net.NewIPOrDomain(v2net.LocalHostDomain),
  64. }},
  65. }
  66. d, err := app.CreateAppFromConfig(ctx, dnsConfig)
  67. if err != nil {
  68. return nil, err
  69. }
  70. space.AddApplication(d)
  71. dnsServer = d.(dns.Server)
  72. }
  73. disp := dispatcher.FromSpace(space)
  74. if disp == nil {
  75. d, err := app.CreateAppFromConfig(ctx, new(dispatcher.Config))
  76. if err != nil {
  77. return nil, err
  78. }
  79. space.AddApplication(d)
  80. disp = d.(dispatcher.Interface)
  81. }
  82. for _, inbound := range pConfig.Inbound {
  83. if err := inboundHandlerManager.AddHandler(ctx, inbound); err != nil {
  84. return nil, err
  85. }
  86. }
  87. for _, outbound := range pConfig.Outbound {
  88. if err := outboundHandlerManager.AddHandler(ctx, outbound); err != nil {
  89. return nil, err
  90. }
  91. }
  92. if err := vpoint.space.Initialize(); err != nil {
  93. return nil, err
  94. }
  95. return vpoint, nil
  96. }
  97. func (v *Point) Close() {
  98. ihm := proxyman.InboundHandlerManagerFromSpace(v.space)
  99. ihm.Close()
  100. }
  101. // Start starts the Point server, and return any error during the process.
  102. // In the case of any errors, the state of the server is unpredicatable.
  103. func (v *Point) Start() error {
  104. ihm := proxyman.InboundHandlerManagerFromSpace(v.space)
  105. if err := ihm.Start(); err != nil {
  106. return err
  107. }
  108. log.Warning("V2Ray started.")
  109. return nil
  110. }