-
Notifications
You must be signed in to change notification settings - Fork 2.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* fix: minor log typo * fix: #2895 no need to specify listen port in config file, just use system random * drop useless code
- Loading branch information
Showing
22 changed files
with
198 additions
and
67 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,165 @@ | ||
// addr provides functions to retrieve local IP addresses from device interfaces. | ||
package addr | ||
|
||
import ( | ||
"net" | ||
|
||
"github.com/pkg/errors" | ||
) | ||
|
||
var ( | ||
// ErrIPNotFound no IP address found, and explicit IP not provided. | ||
ErrIPNotFound = errors.New("no IP address found, and explicit IP not provided") | ||
) | ||
|
||
// IsLocal checks whether an IP belongs to one of the device's interfaces. | ||
func IsLocal(addr string) bool { | ||
// Extract the host | ||
host, _, err := net.SplitHostPort(addr) | ||
if err == nil { | ||
addr = host | ||
} | ||
|
||
if addr == "localhost" { | ||
return true | ||
} | ||
|
||
// Check against all local ips | ||
for _, ip := range IPs() { | ||
if addr == ip { | ||
return true | ||
} | ||
} | ||
|
||
return false | ||
} | ||
|
||
// Extract returns a valid IP address. If the address provided is a valid | ||
// address, it will be returned directly. Otherwise, the available interfaces | ||
// will be iterated over to find an IP address, preferably private. | ||
func Extract(addr string) (string, error) { | ||
// if addr is already specified then it's directly returned | ||
if len(addr) > 0 && (addr != "0.0.0.0" && addr != "[::]" && addr != "::") { | ||
return addr, nil | ||
} | ||
|
||
var ( | ||
addrs []net.Addr | ||
loAddrs []net.Addr | ||
) | ||
|
||
ifaces, err := net.Interfaces() | ||
if err != nil { | ||
return "", errors.Wrap(err, "failed to get interfaces") | ||
} | ||
|
||
for _, iface := range ifaces { | ||
ifaceAddrs, err := iface.Addrs() | ||
if err != nil { | ||
// ignore error, interface can disappear from system | ||
continue | ||
} | ||
|
||
if iface.Flags&net.FlagLoopback != 0 { | ||
loAddrs = append(loAddrs, ifaceAddrs...) | ||
continue | ||
} | ||
|
||
addrs = append(addrs, ifaceAddrs...) | ||
} | ||
|
||
// Add loopback addresses to the end of the list | ||
addrs = append(addrs, loAddrs...) | ||
|
||
// Try to find private IP in list, public IP otherwise | ||
ip, err := findIP(addrs) | ||
if err != nil { | ||
return "", err | ||
} | ||
|
||
return ip.String(), nil | ||
} | ||
|
||
// IPs returns all available interface IP addresses. | ||
func IPs() []string { | ||
ifaces, err := net.Interfaces() | ||
if err != nil { | ||
return nil | ||
} | ||
|
||
var ipAddrs []string | ||
|
||
for _, i := range ifaces { | ||
addrs, err := i.Addrs() | ||
if err != nil { | ||
continue | ||
} | ||
|
||
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 { | ||
continue | ||
} | ||
|
||
ipAddrs = append(ipAddrs, ip.String()) | ||
} | ||
} | ||
|
||
return ipAddrs | ||
} | ||
|
||
// findIP will return the first private IP available in the list. | ||
// If no private IP is available it will return the first public IP, if present. | ||
// If no public IP is available, it will return the first loopback IP, if present. | ||
func findIP(addresses []net.Addr) (net.IP, error) { | ||
var publicIP net.IP | ||
var localIP net.IP | ||
|
||
for _, rawAddr := range addresses { | ||
var ip net.IP | ||
switch addr := rawAddr.(type) { | ||
case *net.IPAddr: | ||
ip = addr.IP | ||
case *net.IPNet: | ||
ip = addr.IP | ||
default: | ||
continue | ||
} | ||
|
||
if ip.IsLoopback() { | ||
if localIP == nil { | ||
localIP = ip | ||
} | ||
continue | ||
} | ||
|
||
if !ip.IsPrivate() { | ||
if publicIP == nil { | ||
publicIP = ip | ||
} | ||
continue | ||
} | ||
|
||
// Return private IP if available | ||
return ip, nil | ||
} | ||
|
||
// Return public or virtual IP | ||
if len(publicIP) > 0 { | ||
return publicIP, nil | ||
} | ||
|
||
// Return local IP | ||
if len(localIP) > 0 { | ||
return localIP, nil | ||
} | ||
|
||
return nil, ErrIPNotFound | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.