package cluster import ( "bufio" "fmt" "net" "os/exec" "strings" ) func (c *Cluster) resolveSystemAddr() (net.IP, error) { defRouteCmd := "/usr/sbin/ipadm show-addr -p -o addr " + "`/usr/sbin/route get default | /usr/bin/grep interface | " + "/usr/bin/awk '{print $2}'`" out, err := exec.Command("/usr/bin/bash", "-c", defRouteCmd).Output() if err != nil { return nil, fmt.Errorf("cannot get default route: %v", err) } defInterface := strings.SplitN(string(out), "/", 2) defInterfaceIP := net.ParseIP(defInterface[0]) return defInterfaceIP, nil } func listSystemIPs() []net.IP { var systemAddrs []net.IP cmd := exec.Command("/usr/sbin/ipadm", "show-addr", "-p", "-o", "addr") cmdReader, err := cmd.StdoutPipe() if err != nil { return nil } if err := cmd.Start(); err != nil { return nil } scanner := bufio.NewScanner(cmdReader) go func() { for scanner.Scan() { text := scanner.Text() nameAddrPair := strings.SplitN(text, "/", 2) // Let go of loopback interfaces and docker interfaces systemAddrs = append(systemAddrs, net.ParseIP(nameAddrPair[0])) } }() if err := scanner.Err(); err != nil { fmt.Printf("scan underwent err: %+v\n", err) } if err := cmd.Wait(); err != nil { fmt.Printf("run command wait: %+v\n", err) } return systemAddrs }