Chore: persistence fakeip pool state
This commit is contained in:
parent
58cd8f9ac1
commit
3ea3653d7a
4 changed files with 64 additions and 18 deletions
|
@ -11,6 +11,11 @@ import (
|
||||||
"github.com/Dreamacro/clash/component/trie"
|
"github.com/Dreamacro/clash/component/trie"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
offsetKey = "key-offset-fake-ip"
|
||||||
|
cycleKey = "key-cycle-fake-ip"
|
||||||
|
)
|
||||||
|
|
||||||
type uint128 struct {
|
type uint128 struct {
|
||||||
hi uint64
|
hi uint64
|
||||||
lo uint64
|
lo uint64
|
||||||
|
@ -98,22 +103,15 @@ func (p *Pool) CloneFrom(o *Pool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Pool) get(host string) netip.Addr {
|
func (p *Pool) get(host string) netip.Addr {
|
||||||
for {
|
p.offset = p.offset.Next()
|
||||||
p.offset = p.offset.Next()
|
|
||||||
|
|
||||||
if !p.offset.Less(p.last) {
|
if !p.offset.Less(p.last) {
|
||||||
p.cycle = true
|
p.cycle = true
|
||||||
p.offset = p.first
|
p.offset = p.first
|
||||||
}
|
}
|
||||||
|
|
||||||
if p.cycle {
|
if p.cycle || p.store.Exist(p.offset) {
|
||||||
p.store.DelByIP(p.offset)
|
p.store.DelByIP(p.offset)
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
if !p.store.Exist(p.offset) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
p.store.PutByIP(p.offset, host)
|
p.store.PutByIP(p.offset, host)
|
||||||
|
@ -121,7 +119,39 @@ func (p *Pool) get(host string) netip.Addr {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Pool) FlushFakeIP() error {
|
func (p *Pool) FlushFakeIP() error {
|
||||||
return p.store.FlushFakeIP()
|
err := p.store.FlushFakeIP()
|
||||||
|
if err == nil {
|
||||||
|
p.cycle = false
|
||||||
|
p.offset = p.first
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Pool) StoreState() {
|
||||||
|
if s, ok := p.store.(*cachefileStore); ok {
|
||||||
|
s.PutByHost(offsetKey, p.offset)
|
||||||
|
if p.cycle {
|
||||||
|
s.PutByHost(cycleKey, p.offset)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Pool) restoreState() {
|
||||||
|
if s, ok := p.store.(*cachefileStore); ok {
|
||||||
|
if _, exist := s.GetByHost(cycleKey); exist {
|
||||||
|
p.cycle = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if offset, exist := s.GetByHost(offsetKey); exist {
|
||||||
|
if p.ipnet.Contains(offset) {
|
||||||
|
p.offset = offset
|
||||||
|
} else {
|
||||||
|
_ = p.FlushFakeIP()
|
||||||
|
}
|
||||||
|
} else if s.Exist(p.first) {
|
||||||
|
_ = p.FlushFakeIP()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type Options struct {
|
type Options struct {
|
||||||
|
@ -167,6 +197,8 @@ func New(options Options) (*Pool, error) {
|
||||||
pool.store = newMemoryStore(options.Size)
|
pool.store = newMemoryStore(options.Size)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pool.restoreState()
|
||||||
|
|
||||||
return pool, nil
|
return pool, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ type Enhancer interface {
|
||||||
FindHostByIP(net.IP) (string, bool)
|
FindHostByIP(net.IP) (string, bool)
|
||||||
FlushFakeIP() error
|
FlushFakeIP() error
|
||||||
InsertHostByIP(net.IP, string)
|
InsertHostByIP(net.IP, string)
|
||||||
|
StoreFakePoolSate()
|
||||||
}
|
}
|
||||||
|
|
||||||
func FakeIPEnabled() bool {
|
func FakeIPEnabled() bool {
|
||||||
|
@ -77,3 +78,9 @@ func FlushFakeIP() error {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func StoreFakePoolSate() {
|
||||||
|
if mapper := DefaultHostMapper; mapper != nil {
|
||||||
|
mapper.StoreFakePoolSate()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -84,6 +84,13 @@ func (h *ResolverEnhancer) InsertHostByIP(ip net.IP, host string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *ResolverEnhancer) FlushFakeIP() error {
|
||||||
|
if h.fakePool != nil {
|
||||||
|
return h.fakePool.FlushFakeIP()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (h *ResolverEnhancer) PatchFrom(o *ResolverEnhancer) {
|
func (h *ResolverEnhancer) PatchFrom(o *ResolverEnhancer) {
|
||||||
if h.mapping != nil && o.mapping != nil {
|
if h.mapping != nil && o.mapping != nil {
|
||||||
o.mapping.CloneTo(h.mapping)
|
o.mapping.CloneTo(h.mapping)
|
||||||
|
@ -94,11 +101,10 @@ func (h *ResolverEnhancer) PatchFrom(o *ResolverEnhancer) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *ResolverEnhancer) FlushFakeIP() error {
|
func (h *ResolverEnhancer) StoreFakePoolSate() {
|
||||||
if h.fakePool != nil {
|
if h.fakePool != nil {
|
||||||
return h.fakePool.FlushFakeIP()
|
h.fakePool.StoreState()
|
||||||
}
|
}
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewEnhancer(cfg Config) *ResolverEnhancer {
|
func NewEnhancer(cfg Config) *ResolverEnhancer {
|
||||||
|
|
|
@ -395,6 +395,7 @@ func updateIPTables(cfg *config.Config) {
|
||||||
func Shutdown() {
|
func Shutdown() {
|
||||||
P.Cleanup()
|
P.Cleanup()
|
||||||
tproxy.CleanupTProxyIPTables()
|
tproxy.CleanupTProxyIPTables()
|
||||||
|
resolver.StoreFakePoolSate()
|
||||||
|
|
||||||
log.Warnln("Clash shutting down")
|
log.Warnln("Clash shutting down")
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue