修复ip重复分配问题

This commit is contained in:
bjdgyc 2021-06-26 23:33:15 +08:00
parent b0ff8ba1be
commit 67d44805ce
2 changed files with 29 additions and 29 deletions

View File

@ -58,7 +58,7 @@ func ip2long(ip net.IP) uint32 {
return binary.BigEndian.Uint32(ip) return binary.BigEndian.Uint32(ip)
} }
// 获取动态ip // AcquireIp 获取动态ip
func AcquireIp(username, macAddr string) net.IP { func AcquireIp(username, macAddr string) net.IP {
IpPool.mux.Lock() IpPool.mux.Lock()
defer IpPool.mux.Unlock() defer IpPool.mux.Unlock()
@ -71,37 +71,24 @@ func AcquireIp(username, macAddr string) net.IP {
if err == nil { if err == nil {
ip := mi.IpAddr ip := mi.IpAddr
ipStr := ip.String() ipStr := ip.String()
// 跳过活跃连接
_, ok := ipActive[ipStr]
// 检测原有ip是否在新的ip池内 // 检测原有ip是否在新的ip池内
if IpPool.Ipv4IPNet.Contains(ip) { if IpPool.Ipv4IPNet.Contains(ip) && !ok {
mi.Username = username mi.Username = username
mi.LastLogin = tNow mi.LastLogin = tNow
// 回写db数据 // 回写db数据
_ = dbdata.Save(mi) _ = dbdata.Save(mi)
ipActive[ipStr] = true ipActive[ipStr] = true
return ip return ip
} else {
_ = dbdata.Del(mi)
} }
}
// 全局遍历未分配ip _ = dbdata.Del(mi)
// 优先获取没有使用的ip
for i := IpPool.IpLongMin; i <= IpPool.IpLongMax; i++ {
ip := long2ip(i)
ipStr := ip.String()
mi := &dbdata.IpMap{}
err := dbdata.One("IpAddr", ip, mi)
if err != nil && dbdata.CheckErrNotFound(err) {
// 该ip没有被使用
mi := &dbdata.IpMap{IpAddr: ip, MacAddr: macAddr, Username: username, LastLogin: tNow}
_ = dbdata.Save(mi)
ipActive[ipStr] = true
return ip
}
} }
farIp := &dbdata.IpMap{LastLogin: tNow} farIp := &dbdata.IpMap{LastLogin: tNow}
// 遍历超过租期ip // 全局遍历超过租期ip
for i := IpPool.IpLongMin; i <= IpPool.IpLongMax; i++ { for i := IpPool.IpLongMin; i <= IpPool.IpLongMax; i++ {
ip := long2ip(i) ip := long2ip(i)
ipStr := ip.String() ipStr := ip.String()
@ -112,11 +99,20 @@ func AcquireIp(username, macAddr string) net.IP {
} }
v := &dbdata.IpMap{} v := &dbdata.IpMap{}
err := dbdata.One("IpAddr", ip, v) err = dbdata.One("IpAddr", ip, v)
if err != nil { if err != nil {
if dbdata.CheckErrNotFound(err) {
// 该ip没有被使用
mi = &dbdata.IpMap{IpAddr: ip, MacAddr: macAddr, Username: username, LastLogin: tNow}
_ = dbdata.Save(mi)
ipActive[ipStr] = true
return ip
}
base.Error(err) base.Error(err)
return nil return nil
} }
// 跳过ip保留
if v.Keep { if v.Keep {
continue continue
} }
@ -124,7 +120,7 @@ func AcquireIp(username, macAddr string) net.IP {
// 已经超过租期 // 已经超过租期
if tNow.Sub(v.LastLogin) > time.Duration(base.Cfg.IpLease)*time.Second { if tNow.Sub(v.LastLogin) > time.Duration(base.Cfg.IpLease)*time.Second {
_ = dbdata.Del(v) _ = dbdata.Del(v)
mi := &dbdata.IpMap{IpAddr: ip, MacAddr: macAddr, Username: username, LastLogin: tNow} mi = &dbdata.IpMap{IpAddr: ip, MacAddr: macAddr, Username: username, LastLogin: tNow}
// 重写db数据 // 重写db数据
_ = dbdata.Save(mi) _ = dbdata.Save(mi)
ipActive[ipStr] = true ipActive[ipStr] = true

18
web/package-lock.json generated
View File

@ -3419,10 +3419,14 @@
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001135", "version": "1.0.30001240",
"resolved": "https://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30001135.tgz?cache=0&sync_timestamp=1600754676334&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcaniuse-lite%2Fdownload%2Fcaniuse-lite-1.0.30001135.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001240.tgz",
"integrity": "sha1-mVseuUQEo8mg12AMETybsn8s2Ko=", "integrity": "sha512-nb8mDzfMdxBDN7ZKx8chWafAdBp5DAAlpWvNyUGe5tcDWd838zpzDN3Rah9cjCqhfOKkrvx40G2SDtP0qiWX/w==",
"dev": true "dev": true,
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
}
}, },
"node_modules/case-sensitive-paths-webpack-plugin": { "node_modules/case-sensitive-paths-webpack-plugin": {
"version": "2.3.0", "version": "2.3.0",
@ -17187,9 +17191,9 @@
} }
}, },
"caniuse-lite": { "caniuse-lite": {
"version": "1.0.30001135", "version": "1.0.30001240",
"resolved": "https://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30001135.tgz?cache=0&sync_timestamp=1600754676334&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcaniuse-lite%2Fdownload%2Fcaniuse-lite-1.0.30001135.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001240.tgz",
"integrity": "sha1-mVseuUQEo8mg12AMETybsn8s2Ko=", "integrity": "sha512-nb8mDzfMdxBDN7ZKx8chWafAdBp5DAAlpWvNyUGe5tcDWd838zpzDN3Rah9cjCqhfOKkrvx40G2SDtP0qiWX/w==",
"dev": true "dev": true
}, },
"case-sensitive-paths-webpack-plugin": { "case-sensitive-paths-webpack-plugin": {