diff --git a/lib/utils/addr.go b/lib/utils/addr.go index 66676d7ca3796..7f447ca894743 100644 --- a/lib/utils/addr.go +++ b/lib/utils/addr.go @@ -276,40 +276,38 @@ func GuessHostIP() (ip net.IP, err error) { if err != nil { return nil, trace.Wrap(err) } - input := make([]netInterface, len(ifaces)) - for i, iface := range ifaces { - input[i] = netInterface(&iface) + adrs := make([]net.Addr, 0) + for _, iface := range ifaces { + ifadrs, err := iface.Addrs() + if err != nil { + log.Warn(err) + } else { + adrs = append(adrs, ifadrs...) + } } - return guessHostIP(input), nil + return guessHostIP(adrs), nil } -func guessHostIP(ifaces []netInterface) (ip net.IP) { +func guessHostIP(addrs []net.Addr) (ip net.IP) { // collect the list of all IPv4s var ips []net.IP - for _, iface := range ifaces { - addrs, err := iface.Addrs() - if err != nil { - log.Warn(err) - continue - } - for _, addr := range addrs { - var ipAddr net.IP - a, ok := addr.(*net.IPAddr) + for _, addr := range addrs { + var ipAddr net.IP + a, ok := addr.(*net.IPAddr) + if ok { + ipAddr = a.IP + } else { + in, ok := addr.(*net.IPNet) if ok { - ipAddr = a.IP + ipAddr = in.IP } else { - in, ok := addr.(*net.IPNet) - if ok { - ipAddr = in.IP - } else { - continue - } - } - if ipAddr.To4() == nil || ipAddr.IsLoopback() || ipAddr.IsMulticast() { continue } - ips = append(ips, ipAddr) } + if ipAddr.To4() == nil || ipAddr.IsLoopback() || ipAddr.IsMulticast() { + continue + } + ips = append(ips, ipAddr) } for i := range ips { switch ips[i][12] { @@ -335,8 +333,3 @@ func guessHostIP(ifaces []netInterface) (ip net.IP) { } return ip } - -// netInterface defines a partial view of net.Interface for testing -type netInterface interface { - Addrs() ([]net.Addr, error) -} diff --git a/lib/utils/addr_test.go b/lib/utils/addr_test.go index 0334afd2f2173..0daa334665ee4 100644 --- a/lib/utils/addr_test.go +++ b/lib/utils/addr_test.go @@ -127,97 +127,66 @@ func (s *AddrTestSuite) TestLoopbackAddrs(c *C) { func (s *AddrTestSuite) TestGuessesIPAddress(c *C) { var testCases = []struct { - ifaces []netInterface + addrs []net.Addr expected net.IP comment string }{ { - ifaces: []netInterface{ - iface{ - addrs: []net.Addr{ - &net.IPAddr{IP: net.ParseIP("10.0.100.80")}, - &net.IPAddr{IP: net.ParseIP("192.13.1.80")}, - &net.IPAddr{IP: net.ParseIP("172.192.12.1")}, - }, - }, + addrs: []net.Addr{ + &net.IPAddr{IP: net.ParseIP("10.0.100.80")}, + &net.IPAddr{IP: net.ParseIP("192.13.1.80")}, + &net.IPAddr{IP: net.ParseIP("172.192.12.1")}, }, expected: net.ParseIP("10.0.100.80"), comment: "prefers 10.x.y.z", }, { - ifaces: []netInterface{ - iface{ - addrs: []net.Addr{ - &net.IPAddr{IP: net.ParseIP("192.13.1.80")}, - &net.IPAddr{IP: net.ParseIP("172.192.12.1")}, - }, - }, + addrs: []net.Addr{ + &net.IPAddr{IP: net.ParseIP("192.13.1.80")}, + &net.IPAddr{IP: net.ParseIP("172.192.12.1")}, }, expected: net.ParseIP("192.13.1.80"), comment: "prefers 192.x.y.z", }, { - ifaces: []netInterface{ - iface{ - addrs: []net.Addr{ - &net.IPAddr{IP: net.ParseIP("172.192.12.1")}, - &net.IPAddr{IP: net.ParseIP("52.35.21.180")}, - }, - }, + addrs: []net.Addr{ + &net.IPAddr{IP: net.ParseIP("172.192.12.1")}, + &net.IPAddr{IP: net.ParseIP("52.35.21.180")}, }, expected: net.ParseIP("172.192.12.1"), comment: "prefers 172.x.y.z", }, { - ifaces: []netInterface{ - iface{ - addrs: []net.Addr{ - &net.IPAddr{IP: net.ParseIP("192.192.12.1")}, - &net.IPAddr{IP: net.ParseIP("192.192.12.2")}, - &net.IPAddr{IP: net.ParseIP("52.35.21.180")}, - }, - }, + addrs: []net.Addr{ + &net.IPAddr{IP: net.ParseIP("192.192.12.1")}, + &net.IPAddr{IP: net.ParseIP("192.192.12.2")}, + &net.IPAddr{IP: net.ParseIP("52.35.21.180")}, }, expected: net.ParseIP("192.192.12.2"), comment: "prefers last", }, { - ifaces: []netInterface{ - iface{ - addrs: []net.Addr{ - &net.IPAddr{IP: net.ParseIP("52.35.21.180")}, - &net.IPAddr{IP: net.ParseIP("fe80::af:6dff:fefd:150f")}, - }, - }, + addrs: []net.Addr{ + &net.IPAddr{IP: net.ParseIP("52.35.21.180")}, + &net.IPAddr{IP: net.ParseIP("fe80::af:6dff:fefd:150f")}, }, expected: net.ParseIP("52.35.21.180"), comment: "ignores IPv6", }, { - ifaces: []netInterface{ - iface{ - addrs: []net.Addr{ - &net.IPAddr{IP: net.ParseIP("fe80::af:6dff:fefd:150f")}, - }, - }, + addrs: []net.Addr{ + &net.IPAddr{IP: net.ParseIP("fe80::af:6dff:fefd:150f")}, }, expected: net.ParseIP("127.0.0.1"), comment: "falls back to loopback", }, } - for _, testCase := range testCases { - ip := guessHostIP(testCase.ifaces) + ip := guessHostIP(testCase.addrs) c.Assert(ip, DeepEquals, testCase.expected, Commentf(testCase.comment)) } } -type iface struct { - addrs []net.Addr -} - -func (r iface) Addrs() ([]net.Addr, error) { return r.addrs, nil } - func (s *AddrTestSuite) TestMarshal(c *C) { testCases := []struct { in *NetAddr