* Copyright (c) 2025 Bocloud Technologies Co., Ltd.
* installer is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain n copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
******************************************************************/
package net
import (
"net"
"strings"
"syscall"
"github.com/pkg/errors"
"github.com/vishvananda/netlink"
)
func RemoveRepIP(ips []net.IP) []net.IP {
result := []net.IP{}
tempMap := map[string]byte{}
for _, e := range ips {
l := len(tempMap)
tempMap[e.String()] = 0
if len(tempMap) != l {
result = append(result, e)
}
}
return result
}
func RemoveRepDomain(domains []string) []string {
result := []string{}
tempMap := map[string]byte{}
for _, e := range domains {
l := len(tempMap)
tempMap[e] = 0
if len(tempMap) != l {
result = append(result, e)
}
}
return result
}
func InterfaceIpExit(intfName, ip string) (string, error) {
intf, err := net.InterfaceByName(intfName)
if err != nil {
return "", err
}
addrs, err := intf.Addrs()
if err != nil {
return "", err
}
for _, addr := range addrs {
if strings.Contains(addr.String(), ip) {
return addr.String(), nil
}
}
return "", nil
}
func GetV4Interface() (string, error) {
routes, err := netlink.RouteList(nil, syscall.AF_INET)
if err != nil {
return "", err
}
for _, route := range routes {
if route.Dst == nil || route.Dst.String() == "0.0.0.0/0" {
link, err := netlink.LinkByIndex(route.LinkIndex)
if err != nil {
return "", err
}
return link.Attrs().Name, nil
}
}
return "", errors.New("no default route found")
}