router_health.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package router
  2. import (
  3. "errors"
  4. "strings"
  5. "github.com/v2fly/v2ray-core/v4/features/routing"
  6. )
  7. // CheckHanlders implements routing.RouterChecker.
  8. func (r *Router) CheckHanlders(tags []string) error {
  9. errs := make([]error, 0)
  10. for _, b := range r.balancers {
  11. checker, ok := b.strategy.(routing.HealthChecker)
  12. if !ok {
  13. continue
  14. }
  15. all, err := b.SelectOutbounds()
  16. if err != nil {
  17. return err
  18. }
  19. ts := getCheckTags(tags, all)
  20. err = checker.Check(ts)
  21. if err != nil {
  22. errs = append(errs, err)
  23. }
  24. }
  25. if len(errs) == 0 {
  26. return nil
  27. }
  28. return getCollectError(errs)
  29. }
  30. func getCheckTags(tags, all []string) []string {
  31. ts := make([]string, 0)
  32. for _, t := range tags {
  33. if findSliceIndex(all, t) >= 0 && findSliceIndex(ts, t) < 0 {
  34. ts = append(ts, t)
  35. }
  36. }
  37. return ts
  38. }
  39. // CheckBalancers implements routing.RouterChecker.
  40. func (r *Router) CheckBalancers(tags []string) error {
  41. errs := make([]error, 0)
  42. for t, b := range r.balancers {
  43. if len(tags) > 0 && findSliceIndex(tags, t) < 0 {
  44. continue
  45. }
  46. checker, ok := b.strategy.(routing.HealthChecker)
  47. if !ok {
  48. continue
  49. }
  50. tags, err := b.SelectOutbounds()
  51. if err != nil {
  52. errs = append(errs, err)
  53. }
  54. err = checker.Check(tags)
  55. if err != nil {
  56. errs = append(errs, err)
  57. }
  58. }
  59. if len(errs) == 0 {
  60. return nil
  61. }
  62. return getCollectError(errs)
  63. }
  64. func getCollectError(errs []error) error {
  65. sb := new(strings.Builder)
  66. sb.WriteString("collect errors:\n")
  67. for _, err := range errs {
  68. sb.WriteString(" * ")
  69. sb.WriteString(err.Error())
  70. sb.WriteString("\n")
  71. }
  72. return errors.New(sb.String())
  73. }
  74. // GetBalancersInfo implements routing.RouterChecker.
  75. func (r *Router) GetBalancersInfo(tags []string) (resp []*routing.BalancerInfo, err error) {
  76. resp = make([]*routing.BalancerInfo, 0)
  77. for t, b := range r.balancers {
  78. if len(tags) > 0 && findSliceIndex(tags, t) < 0 {
  79. continue
  80. }
  81. all, err := b.SelectOutbounds()
  82. if err != nil {
  83. return nil, err
  84. }
  85. var override *routing.BalancingOverrideInfo
  86. if o := b.override.Get(); o != nil {
  87. override = &routing.BalancingOverrideInfo{
  88. Until: o.until,
  89. Selects: o.selects,
  90. }
  91. }
  92. stat := &routing.BalancerInfo{
  93. Tag: t,
  94. Override: override,
  95. Strategy: b.strategy.GetInformation(all),
  96. }
  97. resp = append(resp, stat)
  98. }
  99. return resp, nil
  100. }
  101. func findSliceIndex(slice []string, find string) int {
  102. index := -1
  103. for i, v := range slice {
  104. if find == v {
  105. index = i
  106. break
  107. }
  108. }
  109. return index
  110. }