cmd/cli: get physical interfaces using Windows WMI

This commit is contained in:
Cuong Manh Le
2024-12-19 21:34:26 +07:00
committed by Cuong Manh Le
parent 9b6a308958
commit 5e9b4244e7
4 changed files with 101 additions and 10 deletions
+50 -10
View File
@@ -1,10 +1,13 @@
package cli
import (
"bufio"
"bytes"
"net"
"strings"
"github.com/microsoft/wmi/pkg/base/host"
"github.com/microsoft/wmi/pkg/base/instance"
"github.com/microsoft/wmi/pkg/base/query"
"github.com/microsoft/wmi/pkg/constant"
"github.com/microsoft/wmi/pkg/hardware/network/netadapter"
)
func patchNetIfaceName(iface *net.Interface) error {
@@ -20,15 +23,52 @@ func validInterface(iface *net.Interface, validIfacesMap map[string]struct{}) bo
// validInterfacesMap returns a set of all physical interfaces.
func validInterfacesMap() map[string]struct{} {
out, err := powershell("Get-NetAdapter -Physical | Select-Object -ExpandProperty Name")
if err != nil {
return nil
}
m := make(map[string]struct{})
scanner := bufio.NewScanner(bytes.NewReader(out))
for scanner.Scan() {
ifaceName := strings.TrimSpace(scanner.Text())
for _, ifaceName := range validInterfaces() {
m[ifaceName] = struct{}{}
}
return m
}
// validInterfaces returns a list of all physical interfaces.
func validInterfaces() []string {
whost := host.NewWmiLocalHost()
q := query.NewWmiQuery("MSFT_NetAdapter")
instances, err := instance.GetWmiInstancesFromHost(whost, string(constant.StadardCimV2), q)
if err != nil {
mainLog.Load().Err(err).Msg("failed to get wmi network adapter")
return nil
}
var adapters []string
for _, i := range instances {
adapter, err := netadapter.NewNetworkAdapter(i)
if err != nil {
mainLog.Load().Err(err).Msg("failed to get network adapter")
continue
}
// From: https://learn.microsoft.com/en-us/previous-versions/windows/desktop/legacy/hh968170(v=vs.85)
//
// "Indicates if a connector is present on the network adapter. This value is set to TRUE
// if this is a physical adapter or FALSE if this is not a physical adapter."
physical, err := adapter.GetPropertyConnectorPresent()
if err != nil {
mainLog.Load().Err(err).Msg("failed to get network adapter connector present property")
continue
}
if !physical {
continue
}
ifaceIdx, err := adapter.GetInterfaceIndex()
if err != nil {
mainLog.Load().Err(err).Msg("failed to get interface index")
continue
}
iff, err := net.InterfaceByIndex(int(ifaceIdx))
if err != nil {
mainLog.Load().Err(err).Msg("failed to get interface")
continue
}
adapters = append(adapters, iff.Name)
}
return adapters
}