fix: fix qos warn && qos rules redundancy when ip changed (#59)

This commit is contained in:
Teddy_Zhu
2024-04-16 19:17:15 +08:00
committed by GitHub
parent c7a27a46bf
commit 85bf6595ec
2 changed files with 37 additions and 28 deletions

View File

@@ -129,16 +129,15 @@ func (ru IPRule) Args() []string {
if ru.Output != "" { if ru.Output != "" {
args = append(args, "-o", ru.Output) args = append(args, "-o", ru.Output)
} }
if ru.Comment != "" {
args = append(args, "-m", "comment", "--comment", ru.Comment)
}
if ru.Limit != "" { if ru.Limit != "" {
args = append(args, "-m", "limit", "--limit", ru.Limit) args = append(args, "-m", "limit", "--limit", ru.Limit)
} }
if ru.LimitBurst != "" { if ru.LimitBurst != "" {
args = append(args, "--limit-burst", ru.LimitBurst) args = append(args, "--limit-burst", ru.LimitBurst)
} }
if ru.Comment != "" {
args = append(args, "-m", "comment", "--comment", ru.Comment)
}
if ru.Jump != "" { if ru.Jump != "" {
jump := strings.ToUpper(ru.Jump) jump := strings.ToUpper(ru.Jump)

View File

@@ -62,7 +62,7 @@ func (qr *QosUser) BuildChainIn(chain *cn.FireWallChain) {
} }
func (qr *QosUser) BuildChainInJump(chain *cn.FireWallChain) { func (qr *QosUser) BuildChainInJump(chain *cn.FireWallChain) {
if qr.Ip != "" { if qr.Ip != "" && qr.InSpeed > 0 {
if err := chain.AddRuleX(cn.IPRule{ if err := chain.AddRuleX(cn.IPRule{
Comment: "Qos Jump", Comment: "Qos Jump",
Jump: qr.RuleName("in"), Jump: qr.RuleName("in"),
@@ -74,12 +74,15 @@ func (qr *QosUser) BuildChainInJump(chain *cn.FireWallChain) {
} }
func (qr *QosUser) ClearChainInJump(chain *cn.FireWallChain) { func (qr *QosUser) ClearChainInJump(chain *cn.FireWallChain) {
if err := chain.DelRuleX(cn.IPRule{ if qr.Ip != "" && qr.InSpeed > 0 {
Comment: "Qos Jump", qr.out.Debug("ClearChainInJump: %s", qr.Ip)
Jump: qr.RuleName("in"), if err := chain.DelRuleX(cn.IPRule{
Source: qr.Ip, Comment: "Qos Jump",
}); err != nil { Jump: qr.RuleName("in"),
qr.out.Warn("Qos.Del In Rule: %s", err) Source: qr.Ip,
}); err != nil {
qr.out.Warn("Qos.Del In Rule: %s", err)
}
} }
} }
@@ -94,8 +97,12 @@ func (qr *QosUser) ReBuild(chainIn *cn.FireWallChain) {
func (qr *QosUser) ClearChainIn(chain *cn.FireWallChain) { func (qr *QosUser) ClearChainIn(chain *cn.FireWallChain) {
if qr.qosChainIn != nil { if qr.qosChainIn != nil {
qr.ClearChainInJump(chain) qr.out.Debug("qos chain ClearChainIn start")
if qr.Ip != "" {
qr.ClearChainInJump(chain)
}
qr.qosChainIn.Cancel() qr.qosChainIn.Cancel()
qr.qosChainIn = nil qr.qosChainIn = nil
} }
} }
@@ -105,23 +112,26 @@ func (qr *QosUser) Clear(chainIn *cn.FireWallChain) {
} }
func (qr *QosUser) Update(chainIn *cn.FireWallChain, inSpeed float64, device string, ip string) { func (qr *QosUser) Update(chainIn *cn.FireWallChain, inSpeed float64, device string, ip string) {
changed := false
qr.Device = device qr.Device = device
if qr.Ip != ip {
changed = true
qr.Ip = ip
}
if changed { ipChanged := qr.Ip != ip
qr.ClearChainInJump(chainIn) speedChanged := qr.InSpeed != inSpeed
qr.BuildChainInJump(chainIn)
}
if qr.InSpeed != inSpeed { if speedChanged {
qr.InSpeed = inSpeed // speed will rebuild jump & limit
qr.ClearChainIn(chainIn) qr.ClearChainIn(chainIn)
qr.InSpeed = inSpeed
qr.Ip = ip
qr.BuildChainIn(chainIn) qr.BuildChainIn(chainIn)
return
}
if ipChanged {
qr.ClearChainInJump(chainIn)
qr.Ip = ip
qr.BuildChainInJump(chainIn)
} else {
//ignored
} }
} }
@@ -250,6 +260,8 @@ func (q *QosCtrl) AddOrUpdateQosUser(name string, inSpeed float64) {
} }
func (q *QosCtrl) ClientUpdate() { func (q *QosCtrl) ClientUpdate() {
q.lock.Lock()
defer q.lock.Unlock()
clients := make([]schema.VPNClient, 0, 1024) clients := make([]schema.VPNClient, 0, 1024)
for n := range cache.Network.List() { for n := range cache.Network.List() {
if n == nil { if n == nil {
@@ -273,10 +285,8 @@ func (q *QosCtrl) ClientUpdate() {
if existClient != nil { if existClient != nil {
rule.Update(q.chainIn, rule.InSpeed, existClient.Device, existClient.Address) rule.Update(q.chainIn, rule.InSpeed, existClient.Device, existClient.Address)
} else { } else {
if rule.Ip != "" { rule.ClearChainInJump(q.chainIn)
rule.ClearChainInJump(q.chainIn) rule.Ip = ""
rule.Ip = ""
}
} }
} }