root.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package v5cfg
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "github.com/golang/protobuf/proto"
  7. "google.golang.org/protobuf/types/known/anypb"
  8. core "github.com/v2fly/v2ray-core/v5"
  9. "github.com/v2fly/v2ray-core/v5/app/dispatcher"
  10. "github.com/v2fly/v2ray-core/v5/app/proxyman"
  11. "github.com/v2fly/v2ray-core/v5/common/platform"
  12. "github.com/v2fly/v2ray-core/v5/common/serial"
  13. "github.com/v2fly/v2ray-core/v5/infra/conf/cfgcommon"
  14. "github.com/v2fly/v2ray-core/v5/infra/conf/geodata"
  15. "github.com/v2fly/v2ray-core/v5/infra/conf/synthetic/log"
  16. )
  17. func (c RootConfig) BuildV5(ctx context.Context) (proto.Message, error) {
  18. config := &core.Config{
  19. App: []*anypb.Any{
  20. serial.ToTypedMessage(&dispatcher.Config{}),
  21. serial.ToTypedMessage(&proxyman.InboundConfig{}),
  22. serial.ToTypedMessage(&proxyman.OutboundConfig{}),
  23. },
  24. }
  25. var logConfMsg *anypb.Any
  26. if c.LogConfig != nil {
  27. logConfMsgUnpacked, err := loadHeterogeneousConfigFromRawJSON("service", "log", c.LogConfig)
  28. if err != nil {
  29. return nil, newError("failed to parse Log config").Base(err)
  30. }
  31. logConfMsg = serial.ToTypedMessage(logConfMsgUnpacked)
  32. } else {
  33. logConfMsg = serial.ToTypedMessage(log.DefaultLogConfig())
  34. }
  35. // let logger module be the first App to start,
  36. // so that other modules could print log during initiating
  37. config.App = append([]*anypb.Any{logConfMsg}, config.App...)
  38. if c.RouterConfig != nil {
  39. routerConfig, err := loadHeterogeneousConfigFromRawJSON("service", "router", c.RouterConfig)
  40. if err != nil {
  41. return nil, newError("failed to parse Router config").Base(err)
  42. }
  43. config.App = append(config.App, serial.ToTypedMessage(routerConfig))
  44. }
  45. if c.DNSConfig != nil {
  46. dnsApp, err := loadHeterogeneousConfigFromRawJSON("service", "dns", c.DNSConfig)
  47. if err != nil {
  48. return nil, newError("failed to parse DNS config").Base(err)
  49. }
  50. config.App = append(config.App, serial.ToTypedMessage(dnsApp))
  51. }
  52. for _, rawInboundConfig := range c.Inbounds {
  53. ic, err := rawInboundConfig.BuildV5(ctx)
  54. if err != nil {
  55. return nil, err
  56. }
  57. config.Inbound = append(config.Inbound, ic.(*core.InboundHandlerConfig))
  58. }
  59. for _, rawOutboundConfig := range c.Outbounds {
  60. ic, err := rawOutboundConfig.BuildV5(ctx)
  61. if err != nil {
  62. return nil, err
  63. }
  64. config.Outbound = append(config.Outbound, ic.(*core.OutboundHandlerConfig))
  65. }
  66. for serviceName, service := range c.Services {
  67. servicePackedConfig, err := loadHeterogeneousConfigFromRawJSON("service", serviceName, service)
  68. if err != nil {
  69. return nil, newError(fmt.Sprintf("failed to parse %v config in Services", serviceName)).Base(err)
  70. }
  71. config.App = append(config.App, serial.ToTypedMessage(servicePackedConfig))
  72. }
  73. return config, nil
  74. }
  75. func loadJSONConfig(data []byte) (*core.Config, error) {
  76. rootConfig := &RootConfig{}
  77. err := json.Unmarshal(data, rootConfig)
  78. if err != nil {
  79. return nil, newError("unable to load json").Base(err)
  80. }
  81. buildctx := cfgcommon.NewConfigureLoadingContext(context.Background())
  82. geoloadername := platform.NewEnvFlag("v2ray.conf.geoloader").GetValue(func() string {
  83. return "standard"
  84. })
  85. if loader, err := geodata.GetGeoDataLoader(geoloadername); err == nil {
  86. cfgcommon.SetGeoDataLoader(buildctx, loader)
  87. } else {
  88. return nil, newError("unable to create geo data loader ").Base(err)
  89. }
  90. message, err := rootConfig.BuildV5(buildctx)
  91. if err != nil {
  92. return nil, newError("unable to build config").Base(err)
  93. }
  94. return message.(*core.Config), nil
  95. }