mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-02-03 22:18:39 +00:00
80 lines
2.3 KiB
Go
80 lines
2.3 KiB
Go
package cli
|
|
|
|
import (
|
|
"io"
|
|
"log"
|
|
"net"
|
|
"os"
|
|
|
|
"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 {
|
|
return nil
|
|
}
|
|
|
|
// validInterface reports whether the *net.Interface is a valid one.
|
|
// On Windows, only physical interfaces are considered valid.
|
|
func validInterface(iface *net.Interface, validIfacesMap map[string]struct{}) bool {
|
|
_, ok := validIfacesMap[iface.Name]
|
|
return ok
|
|
}
|
|
|
|
// validInterfacesMap returns a set of all physical interfaces.
|
|
func validInterfacesMap() map[string]struct{} {
|
|
m := make(map[string]struct{})
|
|
for _, ifaceName := range validInterfaces() {
|
|
m[ifaceName] = struct{}{}
|
|
}
|
|
return m
|
|
}
|
|
|
|
// validInterfaces returns a list of all physical interfaces.
|
|
func validInterfaces() []string {
|
|
log.SetOutput(io.Discard)
|
|
defer log.SetOutput(os.Stderr)
|
|
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
|
|
}
|