root.go 3.0 KB

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