|
- 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
- }
- }
|