修改ip pool策略

This commit is contained in:
bjdgyc 2023-04-20 21:07:02 +08:00
parent 9dff39d299
commit 690b4460ad
3 changed files with 94 additions and 106 deletions

View File

@ -7,7 +7,6 @@ import (
"strconv"
"github.com/bjdgyc/anylink/dbdata"
"github.com/bjdgyc/anylink/sessdata"
)
func UserIpMapList(w http.ResponseWriter, r *http.Request) {
@ -81,7 +80,7 @@ func UserIpMapSet(w http.ResponseWriter, r *http.Request) {
return
}
sessdata.IpAllSet(v)
// sessdata.IpAllSet(v)
RespSucess(w, nil)
}
@ -109,7 +108,7 @@ func UserIpMapDel(w http.ResponseWriter, r *http.Request) {
return
}
sessdata.IpAllDel(&data)
// sessdata.IpAllDel(&data)
RespSucess(w, nil)
}

View File

@ -13,8 +13,6 @@ import (
var (
IpPool = &ipPoolConfig{}
ipActive = map[string]bool{}
ipAll = map[string]*dbdata.IpMap{}
ipKeep = map[string]bool{}
// ipKeep and ipLease ipAddr => type
// ipLease = map[string]bool{}
ipPoolMux sync.Mutex
@ -52,7 +50,6 @@ func initIpPool() {
// 获取IpLease数据
// go cronIpLease()
getIpMapAll()
}
// func cronIpLease() {
@ -81,41 +78,6 @@ func initIpPool() {
// ipPoolMux.Unlock()
// }
func IpAllSet(v *dbdata.IpMap) {
ipPoolMux.Lock()
defer ipPoolMux.Unlock()
ipAll[v.IpAddr] = v
if v.Keep {
ipKeep[v.IpAddr] = true
} else {
delete(ipKeep, v.IpAddr)
}
}
func IpAllDel(v *dbdata.IpMap) {
ipPoolMux.Lock()
defer ipPoolMux.Unlock()
delete(ipAll, v.IpAddr)
delete(ipKeep, v.IpAddr)
}
func getIpMapAll() {
xdb := dbdata.GetXdb()
ipMaps := []dbdata.IpMap{}
err := xdb.Find(&ipMaps)
if err != nil {
base.Fatal(err)
}
for _, v := range ipMaps {
ipAll[v.IpAddr] = &v
if v.Keep {
ipKeep[v.IpAddr] = true
}
}
}
// AcquireIp 获取动态ip
func AcquireIp(username, macAddr string, uniqueMac bool) net.IP {
ipPoolMux.Lock()
@ -126,7 +88,6 @@ func AcquireIp(username, macAddr string, uniqueMac bool) net.IP {
tNow = time.Now()
)
// 唯一mac
if uniqueMac {
// 判断是否已经分配过
mi := &dbdata.IpMap{}
@ -148,24 +109,21 @@ func AcquireIp(username, macAddr string, uniqueMac bool) net.IP {
_, ok := ipActive[ipStr]
// 检测原有ip是否在新的ip池内
// IpPool.Ipv4IPNet.Contains(ip) &&
if utils.Ip2long(ip) >= IpPool.IpLongMin &&
utils.Ip2long(ip) <= IpPool.IpLongMax && !ok {
if !ok &&
utils.Ip2long(ip) >= IpPool.IpLongMin &&
utils.Ip2long(ip) <= IpPool.IpLongMax {
mi.Username = username
mi.LastLogin = tNow
mi.UniqueMac = uniqueMac
// 回写db数据
_ = dbdata.Set(mi)
ipActive[ipStr] = true
ipAll[ipStr] = mi
return ip
}
// 原有ip不符合
_ = dbdata.Del(mi)
delete(ipAll, ipStr)
return loopIp(username, macAddr, uniqueMac)
}
// 没有获取到mac
} else {
// 没有获取到mac的情况
ipMaps := []dbdata.IpMap{}
err = dbdata.FindWhere(&ipMaps, 50, 1, "username=? and unique_mac=?", username, false)
if err != nil {
@ -177,11 +135,12 @@ func AcquireIp(username, macAddr string, uniqueMac bool) net.IP {
base.Error(err)
return nil
}
// 遍历 用户的 mac记录
for _, im := range ipMaps {
mi := &im
// 遍历mac记录
for _, mi := range ipMaps {
ipStr := mi.IpAddr
ip := net.ParseIP(ipStr)
// 跳过活跃连接
if _, ok := ipActive[ipStr]; ok {
continue
@ -190,7 +149,8 @@ func AcquireIp(username, macAddr string, uniqueMac bool) net.IP {
if mi.Keep {
continue
}
// 没有租期限制
// 没有mac的 不需要验证租期
// mi.LastLogin.Before(leaseTime) &&
if utils.Ip2long(ip) >= IpPool.IpLongMin &&
utils.Ip2long(ip) <= IpPool.IpLongMax {
mi.LastLogin = tNow
@ -199,23 +159,48 @@ func AcquireIp(username, macAddr string, uniqueMac bool) net.IP {
// 回写db数据
_ = dbdata.Set(mi)
ipActive[ipStr] = true
ipAll[ipStr] = mi
return ip
}
}
}
return loopIp(username, macAddr, uniqueMac)
}
// 遍历ip
// 记录循环点
var loopMin = IpPool.IpLongMin
func loopIp(username, macAddr string, uniqueMac bool) net.IP {
var (
i uint32
ip net.IP
)
i, ip = loopLong(loopMin, IpPool.IpLongMax, username, macAddr, uniqueMac)
if ip != nil {
loopMin = i + 1
return ip
}
i, ip = loopLong(IpPool.IpLongMin, loopMin, username, macAddr, uniqueMac)
if ip != nil {
loopMin = i + 1
return ip
}
base.Warn("no ip available, please see ip_map table row")
return nil
}
func loopLong(start, end uint32, username, macAddr string, uniqueMac bool) (uint32, net.IP) {
var (
err error
tNow = time.Now()
leaseTime = time.Now().Add(-1 * time.Duration(base.Cfg.IpLease) * time.Second)
)
// 全局遍历超过租期和未保留的ip
for i := IpPool.IpLongMin; i <= IpPool.IpLongMax; i++ {
for i := start; i <= end; i++ {
ip := utils.Long2ip(i)
ipStr := ip.String()
@ -223,22 +208,29 @@ func loopIp(username, macAddr string, uniqueMac bool) net.IP {
if _, ok := ipActive[ipStr]; ok {
continue
}
// 跳过保留ip
if _, ok := ipKeep[ipStr]; ok {
continue
}
mi, ok := ipAll[ipStr]
if !ok {
// 该ip没有被使用 直接返回
mi := &dbdata.IpMap{}
err = dbdata.One("ip_addr", ipStr, mi)
if err != nil {
// 没有查询到数据
if dbdata.CheckErrNotFound(err) {
// 该ip没有被使用
mi = &dbdata.IpMap{IpAddr: ipStr, MacAddr: macAddr, UniqueMac: uniqueMac, Username: username, LastLogin: tNow}
_ = dbdata.Add(mi)
ipActive[ipStr] = true
ipAll[ipStr] = mi
return ip
return i, ip
}
// 查询报错
base.Error(err)
return 0, nil
}
// 存在记录
// 查询到已经使用的ip
// 跳过保留ip
if mi.Keep {
continue
}
// 判断租期
if mi.LastLogin.Before(leaseTime) {
// 存在记录,说明已经超过租期,可以直接使用
mi.LastLogin = tNow
@ -247,15 +239,11 @@ func loopIp(username, macAddr string, uniqueMac bool) net.IP {
// 回写db数据
_ = dbdata.Set(mi)
ipActive[ipStr] = true
ipAll[ipStr] = mi
return ip
return i, ip
}
}
// 最后从未超过租期的记录获取一个
base.Warn("no ip available, please see ip_map table row")
return nil
return 0, nil
}
// 回收ip
@ -270,6 +258,5 @@ func ReleaseIp(ip net.IP, macAddr string) {
if err == nil {
mi.LastLogin = time.Now()
_ = dbdata.Set(mi)
ipAll[mi.IpAddr] = mi
}
}

View File

@ -11,12 +11,14 @@
@click="handleEdit('')">添加
</el-button>
</el-form-item>
<!--
<el-form-item>
<el-alert
title="直接操作数据库增删改数据后请重启anylink服务"
type="warning">
</el-alert>
</el-form-item>
-->
</el-form>
<el-table