mirror of
https://github.com/luscis/openlan.git
synced 2025-10-22 00:19:49 +08:00
fix: fix qos warn && qos rules redundancy when ip changed (#59)
This commit is contained in:
@@ -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)
|
||||||
|
@@ -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 = ""
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user