mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-02-03 22:18:39 +00:00
Add context parameter to validInterfacesMap for better error handling and logging. Move Windows-specific network adapter validation logic to the ctrld package. Key changes include: - Add context parameter to validInterfacesMap across all platforms - Move Windows validInterfaces to ctrld.ValidInterfaces - Improve error handling for virtual interface detection on Linux - Update all callers to pass appropriate context This change improves error reporting and makes the interface validation code more maintainable across different platforms.
61 lines
1.5 KiB
Go
61 lines
1.5 KiB
Go
package cli
|
|
|
|
import (
|
|
"context"
|
|
"net"
|
|
"net/netip"
|
|
"os"
|
|
"strings"
|
|
|
|
"tailscale.com/net/netmon"
|
|
|
|
"github.com/Control-D-Inc/ctrld"
|
|
)
|
|
|
|
func patchNetIfaceName(iface *net.Interface) (bool, error) { return true, nil }
|
|
|
|
// validInterface reports whether the *net.Interface is a valid one.
|
|
// Only non-virtual interfaces are considered valid.
|
|
func validInterface(iface *net.Interface, validIfacesMap map[string]struct{}) bool {
|
|
_, ok := validIfacesMap[iface.Name]
|
|
return ok
|
|
}
|
|
|
|
// validInterfacesMap returns a set containing non virtual interfaces.
|
|
func validInterfacesMap(ctx context.Context) map[string]struct{} {
|
|
m := make(map[string]struct{})
|
|
vis := virtualInterfaces(ctx)
|
|
netmon.ForeachInterface(func(i netmon.Interface, prefixes []netip.Prefix) {
|
|
if _, existed := vis[i.Name]; existed {
|
|
return
|
|
}
|
|
m[i.Name] = struct{}{}
|
|
})
|
|
// Fallback to the default route interface if found nothing.
|
|
if len(m) == 0 {
|
|
defaultRoute, err := netmon.DefaultRoute()
|
|
if err != nil {
|
|
return m
|
|
}
|
|
m[defaultRoute.InterfaceName] = struct{}{}
|
|
}
|
|
return m
|
|
}
|
|
|
|
// virtualInterfaces returns a map of virtual interfaces on the current machine.
|
|
func virtualInterfaces(ctx context.Context) map[string]struct{} {
|
|
logger := ctrld.LoggerFromCtx(ctx)
|
|
s := make(map[string]struct{})
|
|
entries, err := os.ReadDir("/sys/devices/virtual/net")
|
|
if err != nil {
|
|
logger.Error().Err(err).Msg("failed to read /sys/devices/virtual/net")
|
|
return nil
|
|
}
|
|
for _, entry := range entries {
|
|
if entry.IsDir() {
|
|
s[strings.TrimSpace(entry.Name())] = struct{}{}
|
|
}
|
|
}
|
|
return s
|
|
}
|