diff --git a/config.go b/config.go index 49532b9..1c80604 100755 --- a/config.go +++ b/config.go @@ -117,6 +117,7 @@ func initConfig() (err error) { httpArgs.ParentKey = http.Flag("parent-key", "the password for auto encrypt/decrypt parent connection data").Short('Z').Default("").String() httpArgs.LocalCompress = http.Flag("local-compress", "auto compress/decompress data on local connection").Short('m').Default("false").Bool() httpArgs.ParentCompress = http.Flag("parent-compress", "auto compress/decompress data on parent connection").Short('M').Default("false").Bool() + httpArgs.CloseIntelligent = http.Flag("close-intelligent", "Close intelligent HTTP, SOCKS5 proxy").Default("false").Bool() httpArgs.LoadBalanceMethod = http.Flag("lb-method", "load balance method when use multiple parent,can be ").Default("roundrobin").Enum("roundrobin", "weight", "leastconn", "leasttime", "hash") httpArgs.LoadBalanceTimeout = http.Flag("lb-timeout", "tcp milliseconds timeout of connecting to parent").Default("500").Int() httpArgs.LoadBalanceRetryTime = http.Flag("lb-retrytime", "sleep time milliseconds after checking").Default("1000").Int() @@ -253,6 +254,7 @@ func initConfig() (err error) { socksArgs.ParentKey = socks.Flag("parent-key", "the password for auto encrypt/decrypt parent connection data").Short('Z').Default("").String() socksArgs.LocalCompress = socks.Flag("local-compress", "auto compress/decompress data on local connection").Short('m').Default("false").Bool() socksArgs.ParentCompress = socks.Flag("parent-compress", "auto compress/decompress data on parent connection").Short('M').Default("false").Bool() + socksArgs.CloseIntelligent = socks.Flag("close-intelligent", "Close intelligent HTTP, SOCKS5 proxy").Default("false").Bool() socksArgs.LoadBalanceMethod = socks.Flag("lb-method", "load balance method when use multiple parent,can be ").Default("roundrobin").Enum("roundrobin", "weight", "leastconn", "leasttime", "hash") socksArgs.LoadBalanceTimeout = socks.Flag("lb-timeout", "tcp milliseconds timeout of connecting to parent").Default("500").Int() socksArgs.LoadBalanceRetryTime = socks.Flag("lb-retrytime", "sleep time milliseconds after checking").Default("1000").Int() diff --git a/services/http/http.go b/services/http/http.go index 405aaed..b6f60c5 100644 --- a/services/http/http.go +++ b/services/http/http.go @@ -66,6 +66,7 @@ type HTTPArgs struct { ParentKey *string LocalCompress *bool ParentCompress *bool + CloseIntelligent *bool LoadBalanceMethod *string LoadBalanceTimeout *int LoadBalanceRetryTime *int @@ -185,7 +186,8 @@ func (s *HTTP) InitService() (err error) { s.InitBasicAuth() //init lb if len(*s.cfg.Parent) > 0 { - s.checker = utils.NewChecker(*s.cfg.HTTPTimeout, int64(*s.cfg.Interval), *s.cfg.Blocked, *s.cfg.Direct, s.log) + s.log.Printf("CloseIntelligent: %v", *s.cfg.CloseIntelligent) + s.checker = utils.NewChecker(*s.cfg.HTTPTimeout, int64(*s.cfg.Interval), *s.cfg.Blocked, *s.cfg.Direct, s.log, *s.cfg.CloseIntelligent) s.InitLB() } if *s.cfg.DNSAddress != "" { diff --git a/services/socks/socks.go b/services/socks/socks.go index 92eefe0..d5bb09f 100644 --- a/services/socks/socks.go +++ b/services/socks/socks.go @@ -64,6 +64,7 @@ type SocksArgs struct { ParentKey *string LocalCompress *bool ParentCompress *bool + CloseIntelligent *bool LoadBalanceMethod *string LoadBalanceTimeout *int LoadBalanceRetryTime *int @@ -180,7 +181,7 @@ func (s *Socks) InitService() (err error) { (*s).domainResolver = dnsx.NewDomainResolver(*s.cfg.DNSAddress, *s.cfg.DNSTTL, s.log) } if len(*s.cfg.Parent) > 0 { - s.checker = utils.NewChecker(*s.cfg.Timeout, int64(*s.cfg.Interval), *s.cfg.Blocked, *s.cfg.Direct, s.log) + s.checker = utils.NewChecker(*s.cfg.Timeout, int64(*s.cfg.Interval), *s.cfg.Blocked, *s.cfg.Direct, s.log, *s.cfg.CloseIntelligent) s.InitLB() } if *s.cfg.ParentType == "ssh" { diff --git a/utils/structs.go b/utils/structs.go index 64f8b5e..ef809aa 100644 --- a/utils/structs.go +++ b/utils/structs.go @@ -24,13 +24,14 @@ import ( ) type Checker struct { - data mapx.ConcurrentMap - blockedMap mapx.ConcurrentMap - directMap mapx.ConcurrentMap - interval int64 - timeout int - isStop bool - log *logger.Logger + data mapx.ConcurrentMap + blockedMap mapx.ConcurrentMap + directMap mapx.ConcurrentMap + interval int64 + timeout int + isStop bool + closeIntelligent bool + log *logger.Logger } type CheckerItem struct { Domain string @@ -43,13 +44,14 @@ type CheckerItem struct { //NewChecker args: //timeout : tcp timeout milliseconds ,connect to host //interval: recheck domain interval seconds -func NewChecker(timeout int, interval int64, blockedFile, directFile string, log *logger.Logger) Checker { +func NewChecker(timeout int, interval int64, blockedFile, directFile string, log *logger.Logger, CloseIntelligent bool) Checker { ch := Checker{ - data: mapx.NewConcurrentMap(), - interval: interval, - timeout: timeout, - isStop: false, - log: log, + data: mapx.NewConcurrentMap(), + interval: interval, + timeout: timeout, + isStop: false, + closeIntelligent: CloseIntelligent, + log: log, } ch.blockedMap = ch.loadMap(blockedFile) ch.directMap = ch.loadMap(directFile) @@ -164,9 +166,11 @@ func (c *Checker) IsBlocked(domain string) (blocked, isInMap bool, failN, succes //log.Printf("%s not in map, blocked true", address) return true, false, 0, 0 } - item := _item.(CheckerItem) - - return (item.FailCount >= item.SuccessCount) && (time.Now().Unix()-item.Lasttime < 1800), true, item.FailCount, item.SuccessCount + if !c.closeIntelligent { + item := _item.(CheckerItem) + return (item.FailCount >= item.SuccessCount) && (time.Now().Unix()-item.Lasttime < 1800), true, item.FailCount, item.SuccessCount + } + return true, false, 0, 0 } func (c *Checker) domainIsInMap(address string, blockedMap bool) bool { u, err := url.Parse("http://" + address)