From 59b0e627d075e68d711241398beff889ec8dd416 Mon Sep 17 00:00:00 2001 From: Michal Wieczorek Date: Wed, 20 Jul 2016 22:13:50 +0200 Subject: [PATCH] Link speed for windows network fingerprinting --- client/fingerprint/network_default.go | 2 +- client/fingerprint/network_windows.go | 47 +++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 client/fingerprint/network_windows.go diff --git a/client/fingerprint/network_default.go b/client/fingerprint/network_default.go index f24479b85..3faa93881 100644 --- a/client/fingerprint/network_default.go +++ b/client/fingerprint/network_default.go @@ -1,4 +1,4 @@ -// +build !linux +// +build !linux,!windows package fingerprint diff --git a/client/fingerprint/network_windows.go b/client/fingerprint/network_windows.go new file mode 100644 index 000000000..4d17b57b3 --- /dev/null +++ b/client/fingerprint/network_windows.go @@ -0,0 +1,47 @@ +package fingerprint + +import ( + "fmt" + "os/exec" + "strconv" + "strings" +) + +// linkSpeed returns link speed in Mb/s, or 0 when unable to determine it. +func (f *NetworkFingerprint) linkSpeed(device string) int { + command := fmt.Sprintf("Get-NetAdapter -IncludeHidden | Where name -eq '%s' | Select -ExpandProperty LinkSpeed", device) + path := "powershell.exe" + outBytes, err := exec.Command(path, command).Output() + + if err != nil { + f.logger.Printf("[WARN] fingerprint.network: Error calling %s (%s): %v", path, command, err) + return 0 + } + + output := strings.TrimSpace(string(outBytes)) + args := strings.Split(output, " ") + if len(args) != 2 { + f.logger.Printf("[WARN] fingerprint.network: Couldn't split LinkSpeed (%s)", output) + return 0 + } + + unit := strings.Replace(args[1], "\r\n", "", -1) + value, err := strconv.Atoi(args[0]) + if err != nil { + f.logger.Printf("[WARN] fingerprint.network: Unable to parse LinkSpeed value (%s)", output) + return 0 + } + + switch unit { + case "Mbps": + return value + case "Kbps": + return value / 1000 + case "Gbps": + return value * 1000 + case "bps": + return value / 1000000 + } + + return 0 +}