obj.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. package file
  2. import (
  3. "github.com/cnlh/nps/lib/rate"
  4. "github.com/pkg/errors"
  5. "strings"
  6. "sync"
  7. "time"
  8. )
  9. type Flow struct {
  10. ExportFlow int64 //出口流量
  11. InletFlow int64 //入口流量
  12. FlowLimit int64 //流量限制,出口+入口 /M
  13. sync.RWMutex
  14. }
  15. func (s *Flow) Add(in, out int64) {
  16. s.Lock()
  17. defer s.Unlock()
  18. s.InletFlow += int64(in)
  19. s.ExportFlow += int64(out)
  20. }
  21. type Client struct {
  22. Cnf *Config
  23. Id int //id
  24. VerifyKey string //验证密钥
  25. Addr string //客户端ip地址
  26. Remark string //备注
  27. Status bool //是否开启
  28. IsConnect bool //是否连接
  29. RateLimit int //速度限制 /kb
  30. Flow *Flow //流量
  31. Rate *rate.Rate //速度控制
  32. NoStore bool
  33. NoDisplay bool
  34. MaxConn int //客户端最大连接数
  35. NowConn int //当前连接数
  36. id int
  37. sync.RWMutex
  38. }
  39. func NewClient(vKey string, noStore bool, noDisplay bool) *Client {
  40. return &Client{
  41. Cnf: new(Config),
  42. Id: 0,
  43. VerifyKey: vKey,
  44. Addr: "",
  45. Remark: "",
  46. Status: true,
  47. IsConnect: false,
  48. RateLimit: 0,
  49. Flow: new(Flow),
  50. Rate: nil,
  51. NoStore: noStore,
  52. RWMutex: sync.RWMutex{},
  53. NoDisplay: noDisplay,
  54. }
  55. }
  56. func (s *Client) CutConn() {
  57. s.Lock()
  58. defer s.Unlock()
  59. s.NowConn++
  60. }
  61. func (s *Client) AddConn() {
  62. s.Lock()
  63. defer s.Unlock()
  64. s.NowConn--
  65. }
  66. func (s *Client) GetConn() bool {
  67. if s.MaxConn == 0 || s.NowConn < s.MaxConn {
  68. s.CutConn()
  69. return true
  70. }
  71. return false
  72. }
  73. //modify the hosts and the tunnels by health information
  74. func (s *Client) ModifyTarget() {
  75. }
  76. func (s *Client) HasTunnel(t *Tunnel) bool {
  77. GetCsvDb().Lock()
  78. defer GetCsvDb().Unlock()
  79. for _, v := range GetCsvDb().Tasks {
  80. if v.Client.Id == s.Id && v.Port == t.Port {
  81. return true
  82. }
  83. }
  84. return false
  85. }
  86. func (s *Client) HasHost(h *Host) bool {
  87. GetCsvDb().Lock()
  88. defer GetCsvDb().Unlock()
  89. for _, v := range GetCsvDb().Hosts {
  90. if v.Client.Id == s.Id && v.Host == h.Host && h.Location == v.Location {
  91. return true
  92. }
  93. }
  94. return false
  95. }
  96. type Tunnel struct {
  97. Id int //Id
  98. Port int //服务端监听端口
  99. Mode string //启动方式
  100. Target string //目标
  101. TargetArr []string //目标
  102. Status bool //设置是否开启
  103. RunStatus bool //当前运行状态
  104. Client *Client //所属客户端id
  105. Ports string //客户端与服务端传递
  106. Flow *Flow
  107. Password string //私密模式密码,唯一
  108. Remark string //备注
  109. TargetAddr string
  110. NoStore bool
  111. LocalPath string
  112. StripPre string
  113. NowIndex int
  114. Health
  115. sync.RWMutex
  116. }
  117. type Health struct {
  118. HealthCheckTimeout int
  119. HealthMaxFail int
  120. HealthCheckInterval int
  121. HealthNextTime time.Time
  122. HealthMap map[string]int
  123. HttpHealthUrl string
  124. HealthRemoveArr []string
  125. HealthCheckType string
  126. HealthCheckTarget string
  127. }
  128. func (s *Tunnel) GetRandomTarget() (string, error) {
  129. if s.TargetArr == nil {
  130. s.TargetArr = strings.Split(s.Target, "\n")
  131. }
  132. if len(s.TargetArr) == 1 {
  133. return s.TargetArr[0], nil
  134. }
  135. if len(s.TargetArr) == 0 {
  136. return "", errors.New("all inward-bending targets are offline")
  137. }
  138. s.Lock()
  139. defer s.Unlock()
  140. if s.NowIndex >= len(s.TargetArr)-1 {
  141. s.NowIndex = -1
  142. }
  143. s.NowIndex++
  144. return s.TargetArr[s.NowIndex], nil
  145. }
  146. type Config struct {
  147. U string //socks5验证用户名
  148. P string //socks5验证密码
  149. Compress bool //压缩方式
  150. Crypt bool //是否加密
  151. }
  152. type Host struct {
  153. Id int
  154. Host string //启动方式
  155. Target string //目标
  156. HeaderChange string //host修改
  157. HostChange string //host修改
  158. Location string //url 路由
  159. Flow *Flow
  160. Client *Client
  161. Remark string //备注
  162. NowIndex int
  163. TargetArr []string
  164. NoStore bool
  165. Scheme string //http https all
  166. IsClose bool
  167. Health
  168. sync.RWMutex
  169. }
  170. func (s *Host) GetRandomTarget() (string, error) {
  171. if s.TargetArr == nil {
  172. s.TargetArr = strings.Split(s.Target, "\n")
  173. }
  174. if len(s.TargetArr) == 1 {
  175. return s.TargetArr[0], nil
  176. }
  177. if len(s.TargetArr) == 0 {
  178. return "", errors.New("all inward-bending targets are offline")
  179. }
  180. s.Lock()
  181. defer s.Unlock()
  182. if s.NowIndex >= len(s.TargetArr)-1 {
  183. s.NowIndex = -1
  184. }
  185. s.NowIndex++
  186. return s.TargetArr[s.NowIndex], nil
  187. }