58 lines
1.3 KiB
Go
58 lines
1.3 KiB
Go
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
|
|
}
|