mirror of https://github.com/bjdgyc/anylink.git
修改ip pool策略
This commit is contained in:
parent
9dff39d299
commit
690b4460ad
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,74 +109,98 @@ 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 {
|
||||||
ipMaps := []dbdata.IpMap{}
|
// 没有获取到mac的情况
|
||||||
err = dbdata.FindWhere(&ipMaps, 50, 1, "username=? and unique_mac=?", username, false)
|
ipMaps := []dbdata.IpMap{}
|
||||||
if err != nil {
|
err = dbdata.FindWhere(&ipMaps, 50, 1, "username=? and unique_mac=?", username, false)
|
||||||
// 没有查询到数据
|
if err != nil {
|
||||||
if dbdata.CheckErrNotFound(err) {
|
// 没有查询到数据
|
||||||
return loopIp(username, macAddr, uniqueMac)
|
if dbdata.CheckErrNotFound(err) {
|
||||||
|
return loopIp(username, macAddr, uniqueMac)
|
||||||
|
}
|
||||||
|
// 查询报错
|
||||||
|
base.Error(err)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
// 查询报错
|
|
||||||
base.Error(err)
|
// 遍历mac记录
|
||||||
return nil
|
for _, mi := range ipMaps {
|
||||||
}
|
ipStr := mi.IpAddr
|
||||||
// 遍历 用户的 mac记录
|
ip := net.ParseIP(ipStr)
|
||||||
for _, im := range ipMaps {
|
|
||||||
mi := &im
|
// 跳过活跃连接
|
||||||
ipStr := mi.IpAddr
|
if _, ok := ipActive[ipStr]; ok {
|
||||||
ip := net.ParseIP(ipStr)
|
continue
|
||||||
// 跳过活跃连接
|
}
|
||||||
if _, ok := ipActive[ipStr]; ok {
|
// 跳过保留ip
|
||||||
continue
|
if mi.Keep {
|
||||||
}
|
continue
|
||||||
// 跳过保留ip
|
}
|
||||||
if mi.Keep {
|
// 没有mac的 不需要验证租期
|
||||||
continue
|
// mi.LastLogin.Before(leaseTime) &&
|
||||||
}
|
if utils.Ip2long(ip) >= IpPool.IpLongMin &&
|
||||||
// 没有租期限制
|
utils.Ip2long(ip) <= IpPool.IpLongMax {
|
||||||
if utils.Ip2long(ip) >= IpPool.IpLongMin &&
|
mi.LastLogin = tNow
|
||||||
utils.Ip2long(ip) <= IpPool.IpLongMax {
|
mi.MacAddr = macAddr
|
||||||
mi.LastLogin = tNow
|
mi.UniqueMac = uniqueMac
|
||||||
mi.MacAddr = macAddr
|
// 回写db数据
|
||||||
mi.UniqueMac = uniqueMac
|
_ = dbdata.Set(mi)
|
||||||
// 回写db数据
|
ipActive[ipStr] = true
|
||||||
_ = dbdata.Set(mi)
|
return ip
|
||||||
ipActive[ipStr] = true
|
}
|
||||||
ipAll[ipStr] = mi
|
|
||||||
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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
return i, ip
|
||||||
|
}
|
||||||
|
// 查询报错
|
||||||
|
base.Error(err)
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询到已经使用的ip
|
||||||
// 跳过保留ip
|
// 跳过保留ip
|
||||||
if _, ok := ipKeep[ipStr]; ok {
|
if mi.Keep {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
// 判断租期
|
||||||
mi, ok := ipAll[ipStr]
|
|
||||||
if !ok {
|
|
||||||
// 该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
|
|
||||||
}
|
|
||||||
|
|
||||||
// 存在记录
|
|
||||||
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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue