| 12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- package gateway
- import (
- "bytes"
- "io/ioutil"
- "net"
- "os/exec"
- )
- func DiscoverGateway() (ip net.IP, err error) {
- routeCmd := exec.Command("route", "print", "0.0.0.0")
- stdOut, err := routeCmd.StdoutPipe()
- if err != nil {
- return
- }
- if err = routeCmd.Start(); err != nil {
- return
- }
- output, err := ioutil.ReadAll(stdOut)
- if err != nil {
- return
- }
- // Windows route output format is always like this:
- // ===========================================================================
- // Active Routes:
- // Network Destination Netmask Gateway Interface Metric
- // 0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.100 20
- // ===========================================================================
- // I'm trying to pick the active route,
- // then jump 2 lines and pick the third IP
- // Not using regex because output is quite standard from Windows XP to 8 (NEEDS TESTING)
- outputLines := bytes.Split(output, []byte("\n"))
- for idx, line := range outputLines {
- if bytes.Contains(line, []byte("Active Routes:")) {
- ipFields := bytes.Fields(outputLines[idx+2])
- ip = net.ParseIP(string(ipFields[2]))
- break
- }
- }
- err = routeCmd.Wait()
- return
- }
|