wireguard-dashboard/utils/network.go
2024-08-08 15:30:09 +08:00

129 lines
2.8 KiB
Go

package utils
import (
"fmt"
"gitee.ltd/lxh/logger/log"
"github.com/spf13/cast"
"net"
"strings"
"wireguard-ui/global/client"
)
type network struct{}
func Network() network {
return network{}
}
// GetHostPublicIP
// @description: 获取本机公网地址
// @receiver network
// @return string
func (network) GetHostPublicIP() string {
var response = map[string]string{}
_, err := client.HttpClient.R().SetResult(&response).Get("https://httpbin.org/ip")
if err != nil {
log.Errorf("获取本机公网IP失败: %v", err.Error())
return ""
}
return response["origin"]
}
// IPContains
// @description: 校验ip是否在指定IP段中
// @receiver network
// @param specIp
// @param checkIP
func (network) IPContains(specIp []string, checkIP string) bool {
var isContains bool
for _, sip := range specIp {
ip, _, _ := net.ParseCIDR(checkIP)
sipNet, _, _ := net.ParseCIDR(sip)
ipNet := net.IPNet{IP: sipNet, Mask: net.CIDRMask(24, 32)}
if ipNet.Contains(ip) {
isContains = true
}
}
return isContains
}
// IPContainsByIP
// @description: 校验ip是否在指定IP段中
// @receiver network
// @param specIp
// @param checkIP
func (network) IPContainsByIP(specIp string, checkIP string) bool {
ip, _, _ := net.ParseCIDR(checkIP)
sipNet, _, _ := net.ParseCIDR(specIp)
ipNet := net.IPNet{IP: sipNet, Mask: net.CIDRMask(24, 32)}
if ipNet.Contains(ip) {
return true
}
return false
}
// ParseIP
// @description: 将带有mark的ip解析
// @receiver network
// @param ip
// @return string
func (network) ParseIP(ip string) string {
ipn, _, _ := net.ParseCIDR(ip)
return ipn.String()
}
// GetIPSuffix
// @description: 获取IP后缀 [10.10.10.23] 这里只获取23
// @receiver network
// @param ip
// @return string
func (network) GetIPSuffix(ip string) string {
if strings.Contains(ip, "/") {
ip = strings.Split(ip, "/")[0]
}
// 再次拆分,只取最后一段
return strings.Split(ip, ".")[3]
}
// GetIPPrefix
// @description: 获取IP前缀[10.10.10.23] 这里只获取 10.10.10
// @receiver network
// @param ip
// @return string
func (network) GetIPPrefix(ip string) string {
if strings.Contains(ip, "/") {
ip = strings.Split(ip, "/")[0]
}
return strings.Join(strings.Split(ip, ".")[:3], ".")
}
// GenerateIPByIPS
// @description: 根据指定IP段分配IP
// @receiver n
// @param ips
// @param assignedIPS
// @return string
func (n network) GenerateIPByIPS(ips []string, assignedIPS ...string) []string {
var oips []string
for _, sip := range ips {
// 再次拆分,只取最后一段
suffix := n.GetIPSuffix(sip)
prefix := n.GetIPPrefix(sip)
for _, cip := range assignedIPS {
if n.IPContainsByIP(sip, cip) {
suffix = n.GetIPSuffix(cip)
}
}
suffix = cast.ToString(cast.ToInt64(suffix) + 1)
oips = append(oips, fmt.Sprintf("%s.%s/32", prefix, suffix))
}
return oips
}