diff --git a/server/admin/api_ip_map.go b/server/admin/api_ip_map.go index e36f7a5..a7a9aba 100644 --- a/server/admin/api_ip_map.go +++ b/server/admin/api_ip_map.go @@ -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) } diff --git a/server/sessdata/ip_pool.go b/server/sessdata/ip_pool.go index d029b5b..01e1d8a 100644 --- a/server/sessdata/ip_pool.go +++ b/server/sessdata/ip_pool.go @@ -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,74 +109,98 @@ 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 - ipMaps := []dbdata.IpMap{} - err = dbdata.FindWhere(&ipMaps, 50, 1, "username=? and unique_mac=?", username, false) - if err != nil { - // 没有查询到数据 - if dbdata.CheckErrNotFound(err) { - return loopIp(username, macAddr, uniqueMac) + } else { + // 没有获取到mac的情况 + ipMaps := []dbdata.IpMap{} + err = dbdata.FindWhere(&ipMaps, 50, 1, "username=? and unique_mac=?", username, false) + if err != nil { + // 没有查询到数据 + if dbdata.CheckErrNotFound(err) { + return loopIp(username, macAddr, uniqueMac) + } + // 查询报错 + base.Error(err) + return nil } - // 查询报错 - base.Error(err) - return nil - } - // 遍历 用户的 mac记录 - for _, im := range ipMaps { - mi := &im - ipStr := mi.IpAddr - ip := net.ParseIP(ipStr) - // 跳过活跃连接 - if _, ok := ipActive[ipStr]; ok { - continue - } - // 跳过保留ip - if mi.Keep { - continue - } - // 没有租期限制 - if utils.Ip2long(ip) >= IpPool.IpLongMin && - utils.Ip2long(ip) <= IpPool.IpLongMax { - mi.LastLogin = tNow - mi.MacAddr = macAddr - mi.UniqueMac = uniqueMac - // 回写db数据 - _ = dbdata.Set(mi) - ipActive[ipStr] = true - ipAll[ipStr] = mi - return ip + + // 遍历mac记录 + for _, mi := range ipMaps { + ipStr := mi.IpAddr + ip := net.ParseIP(ipStr) + + // 跳过活跃连接 + if _, ok := ipActive[ipStr]; ok { + continue + } + // 跳过保留ip + if mi.Keep { + continue + } + // 没有mac的 不需要验证租期 + // mi.LastLogin.Before(leaseTime) && + if utils.Ip2long(ip) >= IpPool.IpLongMin && + utils.Ip2long(ip) <= IpPool.IpLongMax { + mi.LastLogin = tNow + mi.MacAddr = macAddr + mi.UniqueMac = uniqueMac + // 回写db数据 + _ = dbdata.Set(mi) + ipActive[ipStr] = true + 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 } + + 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 - if _, ok := ipKeep[ipStr]; ok { + if mi.Keep { 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) { // 存在记录,说明已经超过租期,可以直接使用 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 } } diff --git a/web/src/pages/user/IpMap.vue b/web/src/pages/user/IpMap.vue index fc46d8c..5b4755a 100644 --- a/web/src/pages/user/IpMap.vue +++ b/web/src/pages/user/IpMap.vue @@ -11,12 +11,14 @@ @click="handleEdit('')">添加 +