iface.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package ip
  2. import (
  3. "errors"
  4. "net"
  5. "github.com/coreos-inc/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 GetDefaultGatewayIface() (*net.Interface, error) {
  23. routes, err := netlink.NetworkGetRoutes()
  24. if err != nil {
  25. return nil, err
  26. }
  27. for _, route := range routes {
  28. if route.Default {
  29. if route.Iface == nil {
  30. return nil, errors.New("Found default route but could not determine interface")
  31. }
  32. return route.Iface, nil
  33. }
  34. }
  35. return nil, errors.New("Unable to find default route")
  36. }
  37. func GetInterfaceByIP(ip net.IP) (*net.Interface, error) {
  38. ifaces, err := net.Interfaces()
  39. if err != nil {
  40. return nil, err
  41. }
  42. for _, iface := range ifaces {
  43. addr, err := GetIfaceIP4Addr(&iface)
  44. if err != nil && ip.Equal(addr) {
  45. return &iface, nil
  46. }
  47. }
  48. return nil, errors.New("No interface with given IP found")
  49. }