routes_darwin.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package local
  2. import (
  3. "fmt"
  4. "github.com/c-robinson/iplib"
  5. "github.com/gravitl/netmaker/logger"
  6. "github.com/gravitl/netmaker/netclient/ncutils"
  7. "net"
  8. "regexp"
  9. "strings"
  10. )
  11. // GetDefaultRoute - Gets the default route (ip and interface) on a mac machine
  12. func GetDefaultRoute() (string, string, error) {
  13. var ipaddr string
  14. var iface string
  15. var err error
  16. var outLine string
  17. output, err := ncutils.RunCmd("netstat -nr", false)
  18. for _, line := range strings.Split(strings.TrimSuffix(output, "\n"), "\n") {
  19. if strings.Contains(line, "default") {
  20. outLine = line
  21. break
  22. }
  23. }
  24. space := regexp.MustCompile(`\s+`)
  25. outFormatted := space.ReplaceAllString(outLine, " ")
  26. if err != nil {
  27. return ipaddr, iface, err
  28. }
  29. outputSlice := strings.Split(string(outFormatted), " ")
  30. if !strings.Contains(outputSlice[0], "default") {
  31. return ipaddr, iface, fmt.Errorf("could not find default gateway")
  32. }
  33. ipaddr = outputSlice[1]
  34. if err = ncutils.CheckIPAddress(ipaddr); err != nil {
  35. return ipaddr, iface, err
  36. }
  37. iface = outputSlice[3]
  38. return ipaddr, iface, err
  39. }
  40. // route -n add -net 10.0.0.0/8 192.168.0.254
  41. // networksetup -setadditionalroutes Ethernet 192.168.1.0 255.255.255.0 10.0.0.2 persistent
  42. func setRoute(iface string, addr *net.IPNet, address string) error {
  43. var err error
  44. var out string
  45. var inetx = "inet"
  46. if strings.Contains(addr.IP.String(), ":") {
  47. inetx = "inet6"
  48. }
  49. out, err = ncutils.RunCmd("route -n get -"+inetx+" "+addr.IP.String(), false)
  50. if err != nil {
  51. return err
  52. }
  53. if !(strings.Contains(out, iface)) {
  54. _, err = ncutils.RunCmd("route -q -n add -"+inetx+" "+addr.String()+" -interface "+iface, false)
  55. }
  56. return err
  57. }
  58. // SetExplicitRoute - sets route via explicit ip address
  59. func SetExplicitRoute(iface string, destination *net.IPNet, gateway string) error {
  60. return setRoute(iface, destination, gateway)
  61. }
  62. func deleteRoute(iface string, addr *net.IPNet, address string) error {
  63. var err error
  64. _, err = ncutils.RunCmd("route -q -n delete "+addr.String(), false)
  65. return err
  66. }
  67. func setCidr(iface, address string, addr *net.IPNet) {
  68. if iplib.Version(addr.IP) == 4 {
  69. ncutils.RunCmd("route -q -n add -net "+addr.String()+" "+address, false)
  70. } else if iplib.Version(addr.IP) == 6 {
  71. ncutils.RunCmd("route -A inet6 -q -n add -net "+addr.String()+" "+address, false)
  72. } else {
  73. logger.Log(1, "could not parse address: "+addr.String())
  74. }
  75. }
  76. func removeCidr(iface string, addr *net.IPNet, address string) {
  77. ncutils.RunCmd("route -q -n delete "+addr.String()+" -interface "+iface, false)
  78. }