gateway_linux.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package gateway
  2. import (
  3. "bytes"
  4. "io/ioutil"
  5. "net"
  6. "os/exec"
  7. )
  8. func discoverGatewayUsingIp() (ip net.IP, err error) {
  9. routeCmd := exec.Command("ip", "route", "show")
  10. stdOut, err := routeCmd.StdoutPipe()
  11. if err != nil {
  12. return
  13. }
  14. if err = routeCmd.Start(); err != nil {
  15. return
  16. }
  17. output, err := ioutil.ReadAll(stdOut)
  18. if err != nil {
  19. return
  20. }
  21. // Linux 'ip route show' format looks like this:
  22. // default via 192.168.178.1 dev wlp3s0 metric 303
  23. // 192.168.178.0/24 dev wlp3s0 proto kernel scope link src 192.168.178.76 metric 303
  24. outputLines := bytes.Split(output, []byte("\n"))
  25. for _, line := range outputLines {
  26. if bytes.Contains(line, []byte("default")) {
  27. ipFields := bytes.Fields(line)
  28. ip = net.ParseIP(string(ipFields[2]))
  29. break
  30. }
  31. }
  32. err = routeCmd.Wait()
  33. return
  34. }
  35. func discoverGatewayUsingRoute() (ip net.IP, err error) {
  36. routeCmd := exec.Command("route", "-n")
  37. stdOut, err := routeCmd.StdoutPipe()
  38. if err != nil {
  39. return
  40. }
  41. if err = routeCmd.Start(); err != nil {
  42. return
  43. }
  44. output, err := ioutil.ReadAll(stdOut)
  45. if err != nil {
  46. return
  47. }
  48. // Linux route out format is always like this:
  49. // Kernel IP routing table
  50. // Destination Gateway Genmask Flags Metric Ref Use Iface
  51. // 0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
  52. outputLines := bytes.Split(output, []byte("\n"))
  53. for _, line := range outputLines {
  54. if bytes.Contains(line, []byte("0.0.0.0")) {
  55. ipFields := bytes.Fields(line)
  56. ip = net.ParseIP(string(ipFields[1]))
  57. break
  58. }
  59. }
  60. err = routeCmd.Wait()
  61. return
  62. }
  63. func DiscoverGateway() (ip net.IP, err error) {
  64. ip, err = discoverGatewayUsingRoute()
  65. if err != nil {
  66. ip, err = discoverGatewayUsingIp()
  67. }
  68. return
  69. }