108 lines
1.7 KiB
Go
108 lines
1.7 KiB
Go
package vm
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"strings"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
const (
|
|
Wired = "Wired"
|
|
Wireless = "Wireless"
|
|
Other = "Other"
|
|
)
|
|
|
|
type InterfaceInfo struct {
|
|
Name string
|
|
Type string
|
|
IP net.IP
|
|
}
|
|
|
|
func GetInterfaceInfos() ([]*InterfaceInfo, error) {
|
|
var interfaceInfos []*InterfaceInfo
|
|
|
|
interfaces, err := net.Interfaces()
|
|
if err != nil {
|
|
log.Errorf("failed to get net interfaces: %s", err)
|
|
return nil, err
|
|
}
|
|
|
|
for _, iface := range interfaces {
|
|
info := getInterfaceInfo(iface)
|
|
if info != nil {
|
|
interfaceInfos = append(interfaceInfos, info)
|
|
}
|
|
}
|
|
|
|
if len(interfaceInfos) == 0 {
|
|
return nil, fmt.Errorf("no valid IP address")
|
|
}
|
|
|
|
return interfaceInfos, nil
|
|
}
|
|
|
|
func getInterfaceInfo(iface net.Interface) *InterfaceInfo {
|
|
if iface.Flags&net.FlagUp == 0 {
|
|
return nil
|
|
}
|
|
|
|
interfaceType := getInterfaceType(iface)
|
|
if interfaceType == Other {
|
|
return nil
|
|
}
|
|
|
|
interfaceIP := getInterfaceIP(iface)
|
|
if interfaceIP == nil {
|
|
return nil
|
|
}
|
|
|
|
return &InterfaceInfo{
|
|
Name: iface.Name,
|
|
Type: interfaceType,
|
|
IP: interfaceIP,
|
|
}
|
|
}
|
|
|
|
func getInterfaceType(iface net.Interface) string {
|
|
if strings.HasPrefix(iface.Name, "eth") || strings.HasPrefix(iface.Name, "en") {
|
|
return Wired
|
|
}
|
|
|
|
if strings.HasPrefix(iface.Name, "wlan") || strings.HasPrefix(iface.Name, "wl") {
|
|
return Wireless
|
|
}
|
|
|
|
return Other
|
|
}
|
|
|
|
func getInterfaceIP(iface net.Interface) net.IP {
|
|
addrs, err := iface.Addrs()
|
|
if err != nil {
|
|
log.Errorf("failed to get interface addresses: %s", err)
|
|
return nil
|
|
}
|
|
|
|
for _, addr := range addrs {
|
|
var ip net.IP
|
|
|
|
switch v := addr.(type) {
|
|
case *net.IPNet:
|
|
ip = v.IP
|
|
case *net.IPAddr:
|
|
ip = v.IP
|
|
default:
|
|
continue
|
|
}
|
|
|
|
if ip == nil {
|
|
continue
|
|
}
|
|
|
|
return ip
|
|
}
|
|
|
|
return nil
|
|
}
|