You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
2.1 KiB

package sys
import (
"fmt"
"net"
"strconv"
"strings"
)
func IntranetIP() (ips []string, err error) {
ips = make([]string, 0)
ifaces, e := net.Interfaces()
if e != nil {
return ips, e
}
for _, iface := range ifaces {
if iface.Flags&net.FlagUp == 0 {
continue // interface down
}
if iface.Flags&net.FlagLoopback != 0 {
continue // loopback interface
}
// ignore docker and warden bridge
if strings.HasPrefix(iface.Name, "docker") || strings.HasPrefix(iface.Name, "w-") {
continue
}
addrs, e := iface.Addrs()
if e != nil {
return ips, e
}
for _, addr := range addrs {
var ip net.IP
switch v := addr.(type) {
case *net.IPNet:
ip = v.IP
case *net.IPAddr:
ip = v.IP
}
if ip == nil || ip.IsLoopback() {
continue
}
ip = ip.To4()
if ip == nil {
continue // not an ipv4 address
}
ipStr := ip.String()
if IsIntranet(ipStr) {
ips = append(ips, ipStr)
}
}
}
return ips, nil
}
func IsIntranet(ipStr string) bool {
if strings.HasPrefix(ipStr, "10.") {
return true
}
// for didi
if strings.HasPrefix(ipStr, "100.") {
return true
}
if strings.HasPrefix(ipStr, "192.168.") {
return true
}
if strings.HasPrefix(ipStr, "172.") {
// 172.16.0.0-172.31.255.255
arr := strings.Split(ipStr, ".")
if len(arr) != 4 {
return false
}
second, err := strconv.ParseInt(arr[1], 10, 64)
if err != nil {
return false
}
if second >= 16 && second <= 31 {
return true
}
}
return false
}
// ${sn}-${hostname}-${ip}
func LocalHostIdent() string {
sn, _ := CmdOutTrim("/bin/bash", "-c", "dmidecode -s system-serial-number")
if sn != "" {
arr := strings.Fields(sn)
sn = arr[len(arr)-1]
} else {
sn = "nil"
}
name, _ := CmdOutTrim("hostname")
ips, _ := IntranetIP()
ip := ""
if ips != nil && len(ips) > 0 {
ip = ips[0]
}
return fmt.Sprintf("%s-%s-%s", sn, name, ip)
}
func GetOutboundIpaddr() string {
conn, err := net.Dial("udp4", "1.2.3.4:56")
if err != nil {
return ""
}
defer conn.Close()
localAddr := conn.LocalAddr().String()
if ip, _, err := net.SplitHostPort(localAddr); err != nil {
return ""
} else {
return ip
}
}