routes_linux.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package local
  2. import (
  3. //"github.com/davecgh/go-spew/spew"
  4. "fmt"
  5. "net"
  6. "strings"
  7. "github.com/c-robinson/iplib"
  8. "github.com/gravitl/netmaker/logger"
  9. "github.com/gravitl/netmaker/netclient/ncutils"
  10. )
  11. // GetDefaultRoute - Gets the default route (ip and interface) on a linux machine
  12. func GetDefaultRoute() (string, string, error) {
  13. var ipaddr string
  14. var iface string
  15. var err error
  16. output, err := ncutils.RunCmd("ip route show default", false)
  17. if err != nil {
  18. return ipaddr, iface, err
  19. }
  20. outputSlice := strings.Split(output, " ")
  21. if !strings.Contains(outputSlice[0], "default") {
  22. return ipaddr, iface, fmt.Errorf("could not find default gateway")
  23. }
  24. for i, outString := range outputSlice {
  25. if outString == "via" {
  26. ipaddr = outputSlice[i+1]
  27. }
  28. if outString == "dev" {
  29. iface = outputSlice[i+1]
  30. }
  31. }
  32. return ipaddr, iface, err
  33. }
  34. func setRoute(iface string, addr *net.IPNet, address string) error {
  35. out, err := ncutils.RunCmd(fmt.Sprintf("ip route get %s", addr.IP.String()), false)
  36. if err != nil || !strings.Contains(out, iface) {
  37. _, err = ncutils.RunCmd(fmt.Sprintf("ip route add %s dev %s", addr.String(), iface), false)
  38. }
  39. return err
  40. }
  41. func SetExplicitRoute(iface string, destination *net.IPNet, gateway string) error {
  42. _, err := ncutils.RunCmd(fmt.Sprintf("ip route add %s via %s dev %s", destination.String(), gateway, iface), false)
  43. return err
  44. }
  45. func deleteRoute(iface string, addr *net.IPNet, address string) error {
  46. var err error
  47. out, _ := ncutils.RunCmd(fmt.Sprintf("ip route get %s", addr.IP.String()), false)
  48. if strings.Contains(out, iface) {
  49. _, err = ncutils.RunCmd(fmt.Sprintf("ip route del %s dev %s", addr.String(), iface), false)
  50. }
  51. return err
  52. }
  53. func setCidr(iface, address string, addr *net.IPNet) {
  54. if iplib.Version(addr.IP) == 4 {
  55. ncutils.RunCmd("ip -4 route add "+addr.String()+" dev "+iface, false)
  56. } else if iplib.Version(addr.IP) == 6 {
  57. ncutils.RunCmd("ip -6 route add "+addr.String()+" dev "+iface, false)
  58. } else {
  59. logger.Log(1, "could not parse address: "+addr.String())
  60. }
  61. }
  62. func removeCidr(iface string, addr *net.IPNet, address string) {
  63. ncutils.RunCmd("ip route delete "+addr.String()+" dev "+iface, false)
  64. }