full diff: https://github.com/hashicorp/go-sockaddr/compare/6d291a969b86c4b633730bfc6b8b9d64c3aafed9...v1.0.2
Relevant changes:
- hashicorp/go-sockaddr#25 Add android os
- hashicorp/go-sockaddr#28 Add go.mod
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
(cherry picked from commit 492945c2d553c1e8a13ad9c06aa2eb000d03f631)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
| ... | ... |
@@ -47,7 +47,7 @@ github.com/hashicorp/go-msgpack 71c2886f5a673a35f909803f38ec |
| 47 | 47 |
github.com/hashicorp/memberlist 3d8438da9589e7b608a83ffac1ef8211486bcb7c |
| 48 | 48 |
github.com/sean-/seed e2103e2c35297fb7e17febb81e49b312087a2372 |
| 49 | 49 |
github.com/hashicorp/errwrap 8a6fb523712970c966eefc6b39ed2c5e74880354 # v1.0.0 |
| 50 |
-github.com/hashicorp/go-sockaddr 6d291a969b86c4b633730bfc6b8b9d64c3aafed9 |
|
| 50 |
+github.com/hashicorp/go-sockaddr c7188e74f6acae5a989bdc959aa779f8b9f42faf # v1.0.2 |
|
| 51 | 51 |
github.com/hashicorp/go-multierror 886a7fbe3eb1c874d46f623bfa70af45f425b3d1 # v1.0.0 |
| 52 | 52 |
github.com/hashicorp/serf 598c54895cc5a7b1a24a398d635e8c0ea0959870 |
| 53 | 53 |
github.com/docker/libkv 458977154600b9f23984d9f4b82e79570b5ae12b |
| ... | ... |
@@ -1197,23 +1197,46 @@ func parseDefaultIfNameFromRoute(routeOut string) (string, error) {
|
| 1197 | 1197 |
// parseDefaultIfNameFromIPCmd parses the default interface from ip(8) for |
| 1198 | 1198 |
// Linux. |
| 1199 | 1199 |
func parseDefaultIfNameFromIPCmd(routeOut string) (string, error) {
|
| 1200 |
+ parsedLines := parseIfNameFromIPCmd(routeOut) |
|
| 1201 |
+ for _, parsedLine := range parsedLines {
|
|
| 1202 |
+ if parsedLine[0] == "default" && |
|
| 1203 |
+ parsedLine[1] == "via" && |
|
| 1204 |
+ parsedLine[3] == "dev" {
|
|
| 1205 |
+ ifName := strings.TrimSpace(parsedLine[4]) |
|
| 1206 |
+ return ifName, nil |
|
| 1207 |
+ } |
|
| 1208 |
+ } |
|
| 1209 |
+ |
|
| 1210 |
+ return "", errors.New("No default interface found")
|
|
| 1211 |
+} |
|
| 1212 |
+ |
|
| 1213 |
+// parseDefaultIfNameFromIPCmdAndroid parses the default interface from ip(8) for |
|
| 1214 |
+// Android. |
|
| 1215 |
+func parseDefaultIfNameFromIPCmdAndroid(routeOut string) (string, error) {
|
|
| 1216 |
+ parsedLines := parseIfNameFromIPCmd(routeOut) |
|
| 1217 |
+ if (len(parsedLines) > 0) {
|
|
| 1218 |
+ ifName := strings.TrimSpace(parsedLines[0][4]) |
|
| 1219 |
+ return ifName, nil |
|
| 1220 |
+ } |
|
| 1221 |
+ |
|
| 1222 |
+ return "", errors.New("No default interface found")
|
|
| 1223 |
+} |
|
| 1224 |
+ |
|
| 1225 |
+ |
|
| 1226 |
+// parseIfNameFromIPCmd parses interfaces from ip(8) for |
|
| 1227 |
+// Linux. |
|
| 1228 |
+func parseIfNameFromIPCmd(routeOut string) [][]string {
|
|
| 1200 | 1229 |
lines := strings.Split(routeOut, "\n") |
| 1201 | 1230 |
re := whitespaceRE.Copy() |
| 1231 |
+ parsedLines := make([][]string, 0, len(lines)) |
|
| 1202 | 1232 |
for _, line := range lines {
|
| 1203 | 1233 |
kvs := re.Split(line, -1) |
| 1204 | 1234 |
if len(kvs) < 5 {
|
| 1205 | 1235 |
continue |
| 1206 | 1236 |
} |
| 1207 |
- |
|
| 1208 |
- if kvs[0] == "default" && |
|
| 1209 |
- kvs[1] == "via" && |
|
| 1210 |
- kvs[3] == "dev" {
|
|
| 1211 |
- ifName := strings.TrimSpace(kvs[4]) |
|
| 1212 |
- return ifName, nil |
|
| 1213 |
- } |
|
| 1237 |
+ parsedLines = append(parsedLines, kvs) |
|
| 1214 | 1238 |
} |
| 1215 |
- |
|
| 1216 |
- return "", errors.New("No default interface found")
|
|
| 1239 |
+ return parsedLines |
|
| 1217 | 1240 |
} |
| 1218 | 1241 |
|
| 1219 | 1242 |
// parseDefaultIfNameWindows parses the default interface from `netstat -rn` and |
| 1220 | 1243 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,34 @@ |
| 0 |
+package sockaddr |
|
| 1 |
+ |
|
| 2 |
+import ( |
|
| 3 |
+ "errors" |
|
| 4 |
+ "os/exec" |
|
| 5 |
+) |
|
| 6 |
+ |
|
| 7 |
+type routeInfo struct {
|
|
| 8 |
+ cmds map[string][]string |
|
| 9 |
+} |
|
| 10 |
+ |
|
| 11 |
+// NewRouteInfo returns a Android-specific implementation of the RouteInfo |
|
| 12 |
+// interface. |
|
| 13 |
+func NewRouteInfo() (routeInfo, error) {
|
|
| 14 |
+ return routeInfo{
|
|
| 15 |
+ cmds: map[string][]string{"ip": {"/system/bin/ip", "route", "get", "8.8.8.8"}},
|
|
| 16 |
+ }, nil |
|
| 17 |
+} |
|
| 18 |
+ |
|
| 19 |
+// GetDefaultInterfaceName returns the interface name attached to the default |
|
| 20 |
+// route on the default interface. |
|
| 21 |
+func (ri routeInfo) GetDefaultInterfaceName() (string, error) {
|
|
| 22 |
+ out, err := exec.Command(ri.cmds["ip"][0], ri.cmds["ip"][1:]...).Output() |
|
| 23 |
+ if err != nil {
|
|
| 24 |
+ return "", err |
|
| 25 |
+ } |
|
| 26 |
+ |
|
| 27 |
+ |
|
| 28 |
+ var ifName string |
|
| 29 |
+ if ifName, err = parseDefaultIfNameFromIPCmdAndroid(string(out)); err != nil {
|
|
| 30 |
+ return "", errors.New("No default interface found")
|
|
| 31 |
+ } |
|
| 32 |
+ return ifName, nil |
|
| 33 |
+} |