github.com/hhrutter/nomad@v0.6.0-rc2.0.20170723054333-80c4b03f0705/client/fingerprint/network_windows.go (about)

     1  package fingerprint
     2  
     3  import (
     4  	"fmt"
     5  	"os/exec"
     6  	"strconv"
     7  	"strings"
     8  )
     9  
    10  // linkSpeed returns link speed in Mb/s, or 0 when unable to determine it.
    11  func (f *NetworkFingerprint) linkSpeed(device string) int {
    12  	command := fmt.Sprintf("Get-NetAdapter -IncludeHidden | Where name -eq '%s' | Select -ExpandProperty LinkSpeed", device)
    13  	path := "powershell.exe"
    14  	outBytes, err := exec.Command(path, command).Output()
    15  
    16  	if err != nil {
    17  		f.logger.Printf("[WARN] fingerprint.network: Error calling %s (%s): %v", path, command, err)
    18  		return 0
    19  	}
    20  
    21  	output := strings.TrimSpace(string(outBytes))
    22  
    23  	return f.parseLinkSpeed(output)
    24  }
    25  
    26  func (f *NetworkFingerprint) parseLinkSpeed(commandOutput string) int {
    27  	args := strings.Split(commandOutput, " ")
    28  	if len(args) != 2 {
    29  		f.logger.Printf("[WARN] fingerprint.network: Couldn't split LinkSpeed (%s)", commandOutput)
    30  		return 0
    31  	}
    32  
    33  	unit := strings.Replace(args[1], "\r\n", "", -1)
    34  	value, err := strconv.Atoi(args[0])
    35  	if err != nil {
    36  		f.logger.Printf("[WARN] fingerprint.network: Unable to parse LinkSpeed value (%s)", commandOutput)
    37  		return 0
    38  	}
    39  
    40  	switch unit {
    41  	case "Mbps":
    42  		return value
    43  	case "Kbps":
    44  		return value / 1000
    45  	case "Gbps":
    46  		return value * 1000
    47  	case "bps":
    48  		return value / 1000000
    49  	}
    50  
    51  	return 0
    52  }