Files
openlan/pkg/libol/iputils.go
2022-10-08 11:07:43 +08:00

212 lines
5.1 KiB
Go
Executable File

package libol
import (
"net"
"os/exec"
"runtime"
"strings"
)
func IpLinkUp(name string) ([]byte, error) {
switch runtime.GOOS {
case "linux":
args := []string{
"link", "set", "dev", name, "up",
}
return exec.Command("ip", args...).CombinedOutput()
case "windows":
args := []string{
"interface", "set", "interface",
"name=" + name, "admin=ENABLED",
}
return exec.Command("netsh", args...).CombinedOutput()
default:
return nil, NewErr("IpLinkUp %s notSupport", runtime.GOOS)
}
}
func IpLinkDown(name string) ([]byte, error) {
switch runtime.GOOS {
case "linux":
args := []string{
"link", "set", "dev", name, "down",
}
return exec.Command("ip", args...).CombinedOutput()
case "windows":
args := []string{
"interface", "set", "interface",
"name=" + name, "admin=DISABLED",
}
return exec.Command("netsh", args...).CombinedOutput()
default:
return nil, NewErr("IpLinkDown %s notSupport", runtime.GOOS)
}
}
func IpAddrAdd(name, addr string, opts ...string) ([]byte, error) {
switch runtime.GOOS {
case "linux":
args := append([]string{
"address", "add", addr, "dev", name,
}, opts...)
return exec.Command("ip", args...).CombinedOutput()
case "windows":
args := append([]string{
"interface", "ipv4", "add", "address",
"name=" + name, "address=" + addr, "store=active",
}, opts...)
return exec.Command("netsh", args...).CombinedOutput()
case "darwin":
args := append([]string{
name, addr,
}, opts...)
return exec.Command("ifconfig", args...).CombinedOutput()
default:
return nil, NewErr("IpAddrAdd %s notSupport", runtime.GOOS)
}
}
func IpAddrDel(name, addr string) ([]byte, error) {
switch runtime.GOOS {
case "linux":
args := []string{
"address", "del", addr, "dev", name,
}
return exec.Command("ip", args...).CombinedOutput()
case "windows":
ipAddr := strings.SplitN(addr, "/", 1)[0]
args := []string{
"interface", "ipv4", "delete", "address",
"name=" + name, "address=" + ipAddr, "store=active",
}
return exec.Command("netsh", args...).CombinedOutput()
case "darwin":
args := []string{
name, addr, "delete",
}
return exec.Command("ifconfig", args...).CombinedOutput()
default:
return nil, NewErr("IpAddrDel %s notSupport", runtime.GOOS)
}
}
func IpAddrShow(name string) []string {
switch runtime.GOOS {
case "windows":
addrs := make([]string, 0, 4)
args := []string{
"interface", "ipv4", "show", "ipaddress",
"interface=" + name, "level=verbose",
}
out, err := exec.Command("netsh", args...).Output()
if err != nil {
return nil
}
outArr := strings.Split(string(out), "\n")
for _, addrStr := range outArr {
addrArr := strings.SplitN(addrStr, " ", 3)
if len(addrArr) != 3 {
continue
}
if addrArr[0] == "Remote" && strings.Contains(addrArr[2], "Parameters") {
addrs = append(addrs, addrArr[1])
}
}
return addrs
default:
return nil
}
}
func IpRouteAdd(name, prefix, nexthop string, opts ...string) ([]byte, error) {
switch runtime.GOOS {
case "linux":
args := []string{
"route", "address", prefix, "via", nexthop,
}
return exec.Command("ip", args...).CombinedOutput()
case "windows":
args := []string{
"interface", "ipv4", "add", "route",
"prefix=" + prefix, "interface=" + name, "nexthop=" + nexthop,
"store=active",
}
return exec.Command("netsh", args...).CombinedOutput()
case "darwin":
args := append([]string{
"add", "-net", prefix})
if name != "" {
args = append(args, "-iface", name)
}
if nexthop != "" {
args = append(args, nexthop)
}
args = append(args, opts...)
return exec.Command("route", args...).CombinedOutput()
default:
return nil, NewErr("IpRouteAdd %s notSupport", runtime.GOOS)
}
}
func IpRouteDel(name, prefix, nexthop string, opts ...string) ([]byte, error) {
switch runtime.GOOS {
case "linux":
args := []string{
"route", "del", prefix, "via", nexthop,
}
return exec.Command("ip", args...).CombinedOutput()
case "windows":
args := []string{
"interface", "ipv4", "delete", "route",
"prefix=" + prefix, "interface=" + name, "nexthop=" + nexthop,
"store=active",
}
return exec.Command("netsh", args...).CombinedOutput()
case "darwin":
args := append([]string{
"delete", "-net", prefix})
if name != "" {
args = append(args, "-iface", name)
}
if nexthop != "" {
args = append(args, nexthop)
}
args = append(args, opts...)
return exec.Command("route", args...).CombinedOutput()
default:
return nil, NewErr("IpRouteDel %s notSupport", runtime.GOOS)
}
}
func IpRouteShow(name string) []string {
switch runtime.GOOS {
default:
return nil
}
}
func IpMetricSet(name, metric string, opts ...string) ([]byte, error) {
switch runtime.GOOS {
case "linux":
return nil, nil
case "windows":
args := append([]string{
"interface", "ipv4", "set", "interface",
"interface=" + name, "metric=" + metric,
}, opts...)
return exec.Command("netsh", args...).CombinedOutput()
case "darwin":
//TODO
return nil, nil
default:
return nil, NewErr("IpAddrAdd %s notSupport", runtime.GOOS)
}
}
func LookupIP(name string) string {
if addr, _ := net.LookupIP(name); len(addr) > 0 {
return addr[0].String()
}
return ""
}