iface.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package ip
  2. import (
  3. "errors"
  4. "net"
  5. "github.com/coreos/rudder/Godeps/_workspace/src/github.com/docker/libcontainer/netlink"
  6. )
  7. func GetIfaceIP4Addr(iface *net.Interface) (net.IP, error) {
  8. addrs, err := iface.Addrs()
  9. if err != nil {
  10. return nil, err
  11. }
  12. for _, addr := range addrs {
  13. // Attempt to parse the address in CIDR notation
  14. // and assert it is IPv4
  15. ip, _, err := net.ParseCIDR(addr.String())
  16. if err == nil && ip.To4() != nil {
  17. return ip.To4(), nil
  18. }
  19. }
  20. return nil, errors.New("No IPv4 address found for given interface")
  21. }
  22. func GetIfaceIP4AddrMatch(iface *net.Interface, matchAddr net.IP) (error) {
  23. addrs, err := iface.Addrs()
  24. if err != nil {
  25. return err
  26. }
  27. for _, addr := range addrs {
  28. // Attempt to parse the address in CIDR notation
  29. // and assert it is IPv4
  30. ip, _, err := net.ParseCIDR(addr.String())
  31. if err == nil && ip.To4() != nil {
  32. if ip.To4().Equal(matchAddr) {
  33. return nil
  34. }
  35. }
  36. }
  37. return errors.New("No IPv4 address found for given interface")
  38. }
  39. func GetDefaultGatewayIface() (*net.Interface, error) {
  40. routes, err := netlink.NetworkGetRoutes()
  41. if err != nil {
  42. return nil, err
  43. }
  44. for _, route := range routes {
  45. if route.Default {
  46. if route.Iface == nil {
  47. return nil, errors.New("Found default route but could not determine interface")
  48. }
  49. return route.Iface, nil
  50. }
  51. }
  52. return nil, errors.New("Unable to find default route")
  53. }
  54. func GetInterfaceByIP(ip net.IP) (*net.Interface, error) {
  55. ifaces, err := net.Interfaces()
  56. if err != nil {
  57. return nil, err
  58. }
  59. for _, iface := range ifaces {
  60. err := GetIfaceIP4AddrMatch(&iface, ip)
  61. if err == nil {
  62. return &iface, nil
  63. }
  64. }
  65. return nil, errors.New("No interface with given IP found")
  66. }