forked from pneymrl2f/nightingale
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
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
|
|
}
|
|
}
|