mirror of
https://github.com/gravitational/teleport
synced 2024-10-20 09:13:39 +00:00
Merge pull request #492 from gravitational/ev/486
Fixed the regression with GuessAdvertiseIP()
This commit is contained in:
commit
82da884d8e
|
@ -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)
|
||||
}
|
||||
return guessHostIP(input), nil
|
||||
}
|
||||
|
||||
func guessHostIP(ifaces []netInterface) (ip net.IP) {
|
||||
// collect the list of all IPv4s
|
||||
var ips []net.IP
|
||||
adrs := make([]net.Addr, 0)
|
||||
for _, iface := range ifaces {
|
||||
addrs, err := iface.Addrs()
|
||||
ifadrs, err := iface.Addrs()
|
||||
if err != nil {
|
||||
log.Warn(err)
|
||||
continue
|
||||
} else {
|
||||
adrs = append(adrs, ifadrs...)
|
||||
}
|
||||
for _, addr := range addrs {
|
||||
var ipAddr net.IP
|
||||
a, ok := addr.(*net.IPAddr)
|
||||
}
|
||||
return guessHostIP(adrs), nil
|
||||
}
|
||||
|
||||
func guessHostIP(addrs []net.Addr) (ip net.IP) {
|
||||
// collect the list of all IPv4s
|
||||
var ips []net.IP
|
||||
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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue