root.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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/serial"
  10. "github.com/v2fly/v2ray-core/v4/infra/conf/synthetic/log"
  11. "google.golang.org/protobuf/types/known/anypb"
  12. )
  13. func (c RootConfig) BuildV5(ctx context.Context) (proto.Message, error) {
  14. config := &core.Config{
  15. App: []*anypb.Any{
  16. serial.ToTypedMessage(&dispatcher.Config{}),
  17. serial.ToTypedMessage(&proxyman.InboundConfig{}),
  18. serial.ToTypedMessage(&proxyman.OutboundConfig{}),
  19. },
  20. }
  21. var logConfMsg *anypb.Any
  22. if c.LogConfig != nil {
  23. logConfMsg = serial.ToTypedMessage(c.LogConfig.Build())
  24. } else {
  25. logConfMsg = serial.ToTypedMessage(log.DefaultLogConfig())
  26. }
  27. // let logger module be the first App to start,
  28. // so that other modules could print log during initiating
  29. config.App = append([]*anypb.Any{logConfMsg}, config.App...)
  30. if c.RouterConfig != nil {
  31. routerConfig, err := c.RouterConfig.Build()
  32. if err != nil {
  33. return nil, err
  34. }
  35. config.App = append(config.App, serial.ToTypedMessage(routerConfig))
  36. }
  37. if c.DNSConfig != nil {
  38. dnsApp, err := c.DNSConfig.Build()
  39. if err != nil {
  40. return nil, newError("failed to parse DNS config").Base(err)
  41. }
  42. config.App = append(config.App, serial.ToTypedMessage(dnsApp))
  43. }
  44. for _, rawInboundConfig := range c.Inbounds {
  45. ic, err := rawInboundConfig.BuildV5(ctx)
  46. if err != nil {
  47. return nil, err
  48. }
  49. config.Inbound = append(config.Inbound, ic.(*core.InboundHandlerConfig))
  50. }
  51. for _, rawOutboundConfig := range c.Outbounds {
  52. ic, err := rawOutboundConfig.BuildV5(ctx)
  53. if err != nil {
  54. return nil, err
  55. }
  56. config.Outbound = append(config.Outbound, ic.(*core.OutboundHandlerConfig))
  57. }
  58. for serviceName, service := range c.Services {
  59. servicePackedConfig, err := loadHeterogeneousConfigFromRawJson("inbound", serviceName, service)
  60. if err != nil {
  61. return nil, err
  62. }
  63. config.App = append(config.App, serial.ToTypedMessage(servicePackedConfig))
  64. }
  65. return config, nil
  66. }
  67. func loadJsonConfig(data []byte) (*core.Config, error) {
  68. rootConfig := &RootConfig{}
  69. err := json.Unmarshal(data, rootConfig)
  70. if err != nil {
  71. return nil, newError("unable to load json").Base(err)
  72. }
  73. message, err := rootConfig.BuildV5(context.TODO())
  74. if err != nil {
  75. return nil, newError("unable to build config").Base(err)
  76. }
  77. return message.(*core.Config), nil
  78. }