package sockaddr import ( "errors" "os/exec" ) type routeInfo struct { cmds map[string][]string } // NewRouteInfo returns a Linux-specific implementation of the RouteInfo // interface. func NewRouteInfo() (routeInfo, error) { // CoreOS Container Linux moved ip to /usr/bin/ip, so look it up on // $PATH and fallback to /sbin/ip on error. path, _ := exec.LookPath("ip") if path == "" { path = "/sbin/ip" } return routeInfo{ cmds: map[string][]string{"ip": {path, "route"}}, }, nil } // GetDefaultInterfaceName returns the interface name attached to the default // route on the default interface. func (ri routeInfo) GetDefaultInterfaceName() (string, error) { out, err := exec.Command(ri.cmds["ip"][0], ri.cmds["ip"][1:]...).Output() if err != nil { return "", err } var ifName string if ifName, err = parseDefaultIfNameFromIPCmd(string(out)); err != nil { return "", errors.New("No default interface found") } return ifName, nil }