list.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package rule
  2. import (
  3. "ehang.io/nps/core/action"
  4. "ehang.io/nps/core/handler"
  5. "ehang.io/nps/core/limiter"
  6. "ehang.io/nps/core/process"
  7. "ehang.io/nps/core/server"
  8. "github.com/fatih/structtag"
  9. "reflect"
  10. "strconv"
  11. )
  12. var orderMap map[string]int
  13. var nowOrder = 2<<8 - 1
  14. type children map[string]*List
  15. var chains children
  16. var limiters children
  17. func init() {
  18. orderMap = make(map[string]int, 0)
  19. chains = make(map[string]*List, 0)
  20. limiters = make(map[string]*List, 0)
  21. chains.Append(&server.TcpServer{}).Append(&handler.HttpHandler{}).Append(&process.HttpServeProcess{}).AppendMany(&action.NpcAction{}, &action.LocalAction{}, &action.AdminAction{})
  22. chains.Append(&server.TcpServer{}).Append(&handler.HttpsHandler{}).Append(&process.HttpsServeProcess{HttpServeProcess: process.HttpServeProcess{}}).AppendMany(&action.NpcAction{}, &action.LocalAction{}, &action.AdminAction{})
  23. chains.Append(&server.TcpServer{}).Append(&handler.HttpsHandler{}).Append(&process.HttpsRedirectProcess{}).AppendMany(&action.NpcAction{}, &action.LocalAction{})
  24. chains.Append(&server.TcpServer{}).Append(&handler.HttpHandler{}).Append(&process.HttpProxyProcess{}).AppendMany(&action.NpcAction{}, &action.LocalAction{})
  25. chains.Append(&server.TcpServer{}).Append(&handler.HttpsHandler{}).Append(&process.HttpsProxyProcess{}).AppendMany(&action.NpcAction{}, &action.LocalAction{})
  26. chains.Append(&server.TcpServer{}).Append(&handler.Socks5Handler{}).Append(&process.Socks5Process{}).AppendMany(&action.LocalAction{}, &action.NpcAction{})
  27. chains.Append(&server.TcpServer{}).Append(&handler.TransparentHandler{}).Append(&process.TransparentProcess{}).AppendMany(&action.NpcAction{})
  28. chains.Append(&server.TcpServer{}).Append(&handler.RdpHandler{}).Append(&process.DefaultProcess{}).AppendMany(&action.NpcAction{}, &action.LocalAction{})
  29. chains.Append(&server.TcpServer{}).Append(&handler.RedisHandler{}).Append(&process.DefaultProcess{}).AppendMany(&action.NpcAction{}, &action.LocalAction{})
  30. chains.Append(&server.UdpServer{}).Append(&handler.DnsHandler{}).Append(&process.DefaultProcess{}).AppendMany(&action.NpcAction{}, &action.LocalAction{})
  31. // TODO p2p
  32. chains.Append(&server.UdpServer{}).Append(&handler.P2PHandler{}).Append(&process.DefaultProcess{}).AppendMany(&action.NpcAction{}, &action.LocalAction{})
  33. chains.Append(&server.UdpServer{}).Append(&handler.QUICHandler{}).Append(&process.DefaultProcess{}).AppendMany(&action.BridgeAction{})
  34. chains.Append(&server.UdpServer{}).Append(&handler.Socks5UdpHandler{}).Append(&process.Socks5Process{}).AppendMany(&action.LocalAction{}, &action.NpcAction{})
  35. chains.Append(&server.TcpServer{}).Append(&handler.DefaultHandler{}).Append(&process.DefaultProcess{}).AppendMany(&action.BridgeAction{}, &action.AdminAction{}, &action.NpcAction{}, &action.LocalAction{})
  36. limiters.AppendMany(&limiter.RateLimiter{}, &limiter.ConnNumLimiter{}, &limiter.FlowLimiter{}, &limiter.IpConnNumLimiter{})
  37. }
  38. func GetLimiters() children {
  39. return limiters
  40. }
  41. func GetChains() children {
  42. return chains
  43. }
  44. type NameInterface interface {
  45. GetName() string
  46. GetZhName() string
  47. }
  48. type List struct {
  49. ZhName string `json:"zh_name"`
  50. Self interface{} `json:"-"`
  51. Field []field `json:"field"`
  52. Children children `json:"children"`
  53. }
  54. func (c children) AppendMany(child ...NameInterface) {
  55. for _, cd := range child {
  56. c.Append(cd)
  57. }
  58. }
  59. func (c children) Append(child NameInterface) children {
  60. if v, ok := c[child.GetName()]; ok {
  61. return v.Children
  62. }
  63. if _, ok := orderMap[child.GetName()]; !ok {
  64. orderMap[child.GetName()] = nowOrder
  65. nowOrder--
  66. }
  67. cd := &List{Self: child, Field: getFieldName(child), Children: make(map[string]*List, 0), ZhName: child.GetZhName()}
  68. c[child.GetName()] = cd
  69. return cd.Children
  70. }
  71. type field struct {
  72. FiledType string `json:"field_type"`
  73. FieldName string `json:"field_name"`
  74. FieldZhName string `json:"field_zh_name"`
  75. FieldRequired bool `json:"field_required"`
  76. FieldExample string `json:"field_example"`
  77. }
  78. func getFieldName(structName interface{}, child ...bool) []field {
  79. result := make([]field, 0)
  80. t := reflect.TypeOf(structName)
  81. if t.Kind() == reflect.Ptr {
  82. t = t.Elem()
  83. }
  84. if t.Kind() != reflect.Struct {
  85. return result
  86. }
  87. fieldNum := t.NumField()
  88. for i := 0; i < fieldNum; i++ {
  89. if len(child) == 0 && t.Field(i).Type.Kind() == reflect.Struct {
  90. value := reflect.ValueOf(structName)
  91. if value.Kind() == reflect.Ptr {
  92. value = value.Elem()
  93. }
  94. if value.Field(i).CanInterface() {
  95. result = append(result, getFieldName(value.Field(i).Interface(), true)...)
  96. }
  97. }
  98. tags, err := structtag.Parse(string(t.Field(i).Tag))
  99. if err == nil {
  100. tag, err := tags.Get("json")
  101. if err == nil {
  102. f := field{}
  103. f.FiledType = t.Field(i).Type.Kind().String()
  104. f.FieldName = tag.Name
  105. tag, err = tags.Get("required")
  106. if err == nil {
  107. f.FieldRequired, _ = strconv.ParseBool(tag.Name)
  108. }
  109. tag, err = tags.Get("placeholder")
  110. if err == nil {
  111. f.FieldExample = tag.Name
  112. }
  113. tag, err = tags.Get("zh_name")
  114. if err == nil {
  115. f.FieldZhName = tag.Name
  116. }
  117. result = append(result, f)
  118. }
  119. }
  120. }
  121. return result
  122. }