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

View File

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

View File

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