From e8f1fb507c74865501936ffee1cd07d4560d55c8 Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 26 Nov 2025 15:55:30 -0500 Subject: [PATCH] Move network to newt to share Former-commit-id: dfe49ad9c97bcf82ceca5eeb705daf0453ff309a --- api/api.go | 2 +- network/interface.go | 165 ------------------- network/interface_notwindows.go | 12 -- network/interface_windows.go | 63 ------- network/route.go | 282 -------------------------------- network/route_notwindows.go | 11 -- network/route_windows.go | 148 ----------------- network/settings.go | 190 --------------------- olm/olm.go | 3 +- olm/util.go | 2 +- peers/manager.go | 2 +- 11 files changed, 5 insertions(+), 875 deletions(-) delete mode 100644 network/interface.go delete mode 100644 network/interface_notwindows.go delete mode 100644 network/interface_windows.go delete mode 100644 network/route.go delete mode 100644 network/route_notwindows.go delete mode 100644 network/route_windows.go delete mode 100644 network/settings.go diff --git a/api/api.go b/api/api.go index 7fe8898..a8c6f29 100644 --- a/api/api.go +++ b/api/api.go @@ -9,7 +9,7 @@ import ( "time" "github.com/fosrl/newt/logger" - "github.com/fosrl/olm/network" + "github.com/fosrl/newt/network" ) // ConnectionRequest defines the structure for an incoming connection request diff --git a/network/interface.go b/network/interface.go deleted file mode 100644 index e110ec1..0000000 --- a/network/interface.go +++ /dev/null @@ -1,165 +0,0 @@ -package network - -import ( - "fmt" - "net" - "os/exec" - "regexp" - "runtime" - "strconv" - "time" - - "github.com/fosrl/newt/logger" - "github.com/vishvananda/netlink" -) - -// ConfigureInterface configures a network interface with an IP address and brings it up -func ConfigureInterface(interfaceName string, tunnelIp string, mtu int) error { - logger.Info("The tunnel IP is: %s", tunnelIp) - - // Parse the IP address and network - ip, ipNet, err := net.ParseCIDR(tunnelIp) - if err != nil { - return fmt.Errorf("invalid IP address: %v", err) - } - - // Convert CIDR mask to dotted decimal format (e.g., 255.255.255.0) - mask := net.IP(ipNet.Mask).String() - destinationAddress := ip.String() - - logger.Debug("The destination address is: %s", destinationAddress) - - // network.SetTunnelRemoteAddress() // what does this do? - SetIPv4Settings([]string{destinationAddress}, []string{mask}) - SetMTU(mtu) - - if interfaceName == "" { - return nil - } - - switch runtime.GOOS { - case "linux": - return configureLinux(interfaceName, ip, ipNet) - case "darwin": - return configureDarwin(interfaceName, ip, ipNet) - case "windows": - return configureWindows(interfaceName, ip, ipNet) - default: - return fmt.Errorf("unsupported operating system: %s", runtime.GOOS) - } -} - -// waitForInterfaceUp polls the network interface until it's up or times out -func waitForInterfaceUp(interfaceName string, expectedIP net.IP, timeout time.Duration) error { - logger.Info("Waiting for interface %s to be up with IP %s", interfaceName, expectedIP) - deadline := time.Now().Add(timeout) - pollInterval := 500 * time.Millisecond - - for time.Now().Before(deadline) { - // Check if interface exists and is up - iface, err := net.InterfaceByName(interfaceName) - if err == nil { - // Check if interface is up - if iface.Flags&net.FlagUp != 0 { - // Check if it has the expected IP - addrs, err := iface.Addrs() - if err == nil { - for _, addr := range addrs { - ipNet, ok := addr.(*net.IPNet) - if ok && ipNet.IP.Equal(expectedIP) { - logger.Info("Interface %s is up with correct IP", interfaceName) - return nil // Interface is up with correct IP - } - } - logger.Info("Interface %s is up but doesn't have expected IP yet", interfaceName) - } - } else { - logger.Info("Interface %s exists but is not up yet", interfaceName) - } - } else { - logger.Info("Interface %s not found yet: %v", interfaceName, err) - } - - // Wait before next check - time.Sleep(pollInterval) - } - - return fmt.Errorf("timed out waiting for interface %s to be up with IP %s", interfaceName, expectedIP) -} - -func FindUnusedUTUN() (string, error) { - ifaces, err := net.Interfaces() - if err != nil { - return "", fmt.Errorf("failed to list interfaces: %v", err) - } - used := make(map[int]bool) - re := regexp.MustCompile(`^utun(\d+)$`) - for _, iface := range ifaces { - if matches := re.FindStringSubmatch(iface.Name); len(matches) == 2 { - if num, err := strconv.Atoi(matches[1]); err == nil { - used[num] = true - } - } - } - // Try utun0 up to utun255. - for i := 0; i < 256; i++ { - if !used[i] { - return fmt.Sprintf("utun%d", i), nil - } - } - return "", fmt.Errorf("no unused utun interface found") -} - -func configureDarwin(interfaceName string, ip net.IP, ipNet *net.IPNet) error { - logger.Info("Configuring darwin interface: %s", interfaceName) - - prefix, _ := ipNet.Mask.Size() - ipStr := fmt.Sprintf("%s/%d", ip.String(), prefix) - - cmd := exec.Command("ifconfig", interfaceName, "inet", ipStr, ip.String(), "alias") - logger.Info("Running command: %v", cmd) - - out, err := cmd.CombinedOutput() - if err != nil { - return fmt.Errorf("ifconfig command failed: %v, output: %s", err, out) - } - - // Bring up the interface - cmd = exec.Command("ifconfig", interfaceName, "up") - logger.Info("Running command: %v", cmd) - - out, err = cmd.CombinedOutput() - if err != nil { - return fmt.Errorf("ifconfig up command failed: %v, output: %s", err, out) - } - - return nil -} - -func configureLinux(interfaceName string, ip net.IP, ipNet *net.IPNet) error { - // Get the interface - link, err := netlink.LinkByName(interfaceName) - if err != nil { - return fmt.Errorf("failed to get interface %s: %v", interfaceName, err) - } - - // Create the IP address attributes - addr := &netlink.Addr{ - IPNet: &net.IPNet{ - IP: ip, - Mask: ipNet.Mask, - }, - } - - // Add the IP address to the interface - if err := netlink.AddrAdd(link, addr); err != nil { - return fmt.Errorf("failed to add IP address: %v", err) - } - - // Bring up the interface - if err := netlink.LinkSetUp(link); err != nil { - return fmt.Errorf("failed to bring up interface: %v", err) - } - - return nil -} diff --git a/network/interface_notwindows.go b/network/interface_notwindows.go deleted file mode 100644 index 5d15ace..0000000 --- a/network/interface_notwindows.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:build !windows - -package network - -import ( - "fmt" - "net" -) - -func configureWindows(interfaceName string, ip net.IP, ipNet *net.IPNet) error { - return fmt.Errorf("configureWindows called on non-Windows platform") -} diff --git a/network/interface_windows.go b/network/interface_windows.go deleted file mode 100644 index 966486b..0000000 --- a/network/interface_windows.go +++ /dev/null @@ -1,63 +0,0 @@ -//go:build windows - -package network - -import ( - "fmt" - "net" - "net/netip" - - "github.com/fosrl/newt/logger" - "golang.zx2c4.com/wireguard/windows/tunnel/winipcfg" -) - -func configureWindows(interfaceName string, ip net.IP, ipNet *net.IPNet) error { - logger.Info("Configuring Windows interface: %s", interfaceName) - - // Get the LUID for the interface - iface, err := net.InterfaceByName(interfaceName) - if err != nil { - return fmt.Errorf("failed to get interface %s: %v", interfaceName, err) - } - - luid, err := winipcfg.LUIDFromIndex(uint32(iface.Index)) - if err != nil { - return fmt.Errorf("failed to get LUID for interface %s: %v", interfaceName, err) - } - - // Create the IP address prefix - maskBits, _ := ipNet.Mask.Size() - - // Ensure we convert to the correct IP version (IPv4 vs IPv6) - var addr netip.Addr - if ip4 := ip.To4(); ip4 != nil { - // IPv4 address - addr, _ = netip.AddrFromSlice(ip4) - } else { - // IPv6 address - addr, _ = netip.AddrFromSlice(ip) - } - if !addr.IsValid() { - return fmt.Errorf("failed to convert IP address") - } - prefix := netip.PrefixFrom(addr, maskBits) - - // Add the IP address to the interface - logger.Info("Adding IP address %s to interface %s", prefix.String(), interfaceName) - err = luid.AddIPAddress(prefix) - if err != nil { - return fmt.Errorf("failed to add IP address: %v", err) - } - - // This was required when we were using the subprocess "netsh" command to bring up the interface. - // With the winipcfg library, the interface should already be up after adding the IP so we dont - // need this step anymore as far as I can tell. - - // // Wait for the interface to be up and have the correct IP - // err = waitForInterfaceUp(interfaceName, ip, 30*time.Second) - // if err != nil { - // return fmt.Errorf("interface did not come up within timeout: %v", err) - // } - - return nil -} diff --git a/network/route.go b/network/route.go deleted file mode 100644 index eb850ee..0000000 --- a/network/route.go +++ /dev/null @@ -1,282 +0,0 @@ -package network - -import ( - "fmt" - "net" - "os/exec" - "runtime" - "strings" - - "github.com/fosrl/newt/logger" - "github.com/vishvananda/netlink" -) - -func DarwinAddRoute(destination string, gateway string, interfaceName string) error { - if runtime.GOOS != "darwin" { - return nil - } - - var cmd *exec.Cmd - - if gateway != "" { - // Route with specific gateway - cmd = exec.Command("route", "-q", "-n", "add", "-inet", destination, "-gateway", gateway) - } else if interfaceName != "" { - // Route via interface - cmd = exec.Command("route", "-q", "-n", "add", "-inet", destination, "-interface", interfaceName) - } else { - return fmt.Errorf("either gateway or interface must be specified") - } - - logger.Info("Running command: %v", cmd) - - out, err := cmd.CombinedOutput() - if err != nil { - return fmt.Errorf("route command failed: %v, output: %s", err, out) - } - - return nil -} - -func DarwinRemoveRoute(destination string) error { - if runtime.GOOS != "darwin" { - return nil - } - - cmd := exec.Command("route", "-q", "-n", "delete", "-inet", destination) - logger.Info("Running command: %v", cmd) - - out, err := cmd.CombinedOutput() - if err != nil { - return fmt.Errorf("route delete command failed: %v, output: %s", err, out) - } - - return nil -} - -func LinuxAddRoute(destination string, gateway string, interfaceName string) error { - if runtime.GOOS != "linux" { - return nil - } - - // Parse destination CIDR - _, ipNet, err := net.ParseCIDR(destination) - if err != nil { - return fmt.Errorf("invalid destination address: %v", err) - } - - // Create route - route := &netlink.Route{ - Dst: ipNet, - } - - if gateway != "" { - // Route with specific gateway - gw := net.ParseIP(gateway) - if gw == nil { - return fmt.Errorf("invalid gateway address: %s", gateway) - } - route.Gw = gw - logger.Info("Adding route to %s via gateway %s", destination, gateway) - } else if interfaceName != "" { - // Route via interface - link, err := netlink.LinkByName(interfaceName) - if err != nil { - return fmt.Errorf("failed to get interface %s: %v", interfaceName, err) - } - route.LinkIndex = link.Attrs().Index - logger.Info("Adding route to %s via interface %s", destination, interfaceName) - } else { - return fmt.Errorf("either gateway or interface must be specified") - } - - // Add the route - if err := netlink.RouteAdd(route); err != nil { - return fmt.Errorf("failed to add route: %v", err) - } - - return nil -} - -func LinuxRemoveRoute(destination string) error { - if runtime.GOOS != "linux" { - return nil - } - - // Parse destination CIDR - _, ipNet, err := net.ParseCIDR(destination) - if err != nil { - return fmt.Errorf("invalid destination address: %v", err) - } - - // Create route to delete - route := &netlink.Route{ - Dst: ipNet, - } - - logger.Info("Removing route to %s", destination) - - // Delete the route - if err := netlink.RouteDel(route); err != nil { - return fmt.Errorf("failed to delete route: %v", err) - } - - return nil -} - -// addRouteForServerIP adds an OS-specific route for the server IP -func AddRouteForServerIP(serverIP, interfaceName string) error { - if err := AddRouteForNetworkConfig(serverIP); err != nil { - return err - } - if interfaceName == "" { - return nil - } - if runtime.GOOS == "darwin" { - return DarwinAddRoute(serverIP, "", interfaceName) - } - // else if runtime.GOOS == "windows" { - // return WindowsAddRoute(serverIP, "", interfaceName) - // } else if runtime.GOOS == "linux" { - // return LinuxAddRoute(serverIP, "", interfaceName) - // } - return nil -} - -// removeRouteForServerIP removes an OS-specific route for the server IP -func RemoveRouteForServerIP(serverIP string, interfaceName string) error { - if err := RemoveRouteForNetworkConfig(serverIP); err != nil { - return err - } - if interfaceName == "" { - return nil - } - if runtime.GOOS == "darwin" { - return DarwinRemoveRoute(serverIP) - } - // else if runtime.GOOS == "windows" { - // return WindowsRemoveRoute(serverIP) - // } else if runtime.GOOS == "linux" { - // return LinuxRemoveRoute(serverIP) - // } - return nil -} - -func AddRouteForNetworkConfig(destination string) error { - // Parse the subnet to extract IP and mask - _, ipNet, err := net.ParseCIDR(destination) - if err != nil { - return fmt.Errorf("failed to parse subnet %s: %v", destination, err) - } - - // Convert CIDR mask to dotted decimal format (e.g., 255.255.255.0) - mask := net.IP(ipNet.Mask).String() - destinationAddress := ipNet.IP.String() - - AddIPv4IncludedRoute(IPv4Route{DestinationAddress: destinationAddress, SubnetMask: mask}) - - return nil -} - -func RemoveRouteForNetworkConfig(destination string) error { - // Parse the subnet to extract IP and mask - _, ipNet, err := net.ParseCIDR(destination) - if err != nil { - return fmt.Errorf("failed to parse subnet %s: %v", destination, err) - } - - // Convert CIDR mask to dotted decimal format (e.g., 255.255.255.0) - mask := net.IP(ipNet.Mask).String() - destinationAddress := ipNet.IP.String() - - RemoveIPv4IncludedRoute(IPv4Route{DestinationAddress: destinationAddress, SubnetMask: mask}) - - return nil -} - -// addRoutes adds routes for each subnet in RemoteSubnets -func AddRoutes(remoteSubnets []string, interfaceName string) error { - if len(remoteSubnets) == 0 { - return nil - } - - // Add routes for each subnet - for _, subnet := range remoteSubnets { - subnet = strings.TrimSpace(subnet) - if subnet == "" { - continue - } - - if err := AddRouteForNetworkConfig(subnet); err != nil { - logger.Error("Failed to add network config for subnet %s: %v", subnet, err) - continue - } - - // Add route based on operating system - if interfaceName == "" { - continue - } - - if runtime.GOOS == "darwin" { - if err := DarwinAddRoute(subnet, "", interfaceName); err != nil { - logger.Error("Failed to add Darwin route for subnet %s: %v", subnet, err) - return err - } - } else if runtime.GOOS == "windows" { - if err := WindowsAddRoute(subnet, "", interfaceName); err != nil { - logger.Error("Failed to add Windows route for subnet %s: %v", subnet, err) - return err - } - } else if runtime.GOOS == "linux" { - if err := LinuxAddRoute(subnet, "", interfaceName); err != nil { - logger.Error("Failed to add Linux route for subnet %s: %v", subnet, err) - return err - } - } - - logger.Info("Added route for remote subnet: %s", subnet) - } - return nil -} - -// removeRoutesForRemoteSubnets removes routes for each subnet in RemoteSubnets -func RemoveRoutes(remoteSubnets []string) error { - if len(remoteSubnets) == 0 { - return nil - } - - // Remove routes for each subnet - for _, subnet := range remoteSubnets { - subnet = strings.TrimSpace(subnet) - if subnet == "" { - continue - } - - if err := RemoveRouteForNetworkConfig(subnet); err != nil { - logger.Error("Failed to remove network config for subnet %s: %v", subnet, err) - continue - } - - // Remove route based on operating system - if runtime.GOOS == "darwin" { - if err := DarwinRemoveRoute(subnet); err != nil { - logger.Error("Failed to remove Darwin route for subnet %s: %v", subnet, err) - return err - } - } else if runtime.GOOS == "windows" { - if err := WindowsRemoveRoute(subnet); err != nil { - logger.Error("Failed to remove Windows route for subnet %s: %v", subnet, err) - return err - } - } else if runtime.GOOS == "linux" { - if err := LinuxRemoveRoute(subnet); err != nil { - logger.Error("Failed to remove Linux route for subnet %s: %v", subnet, err) - return err - } - } - - logger.Info("Removed route for remote subnet: %s", subnet) - } - - return nil -} diff --git a/network/route_notwindows.go b/network/route_notwindows.go deleted file mode 100644 index 6984c71..0000000 --- a/network/route_notwindows.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build !windows - -package network - -func WindowsAddRoute(destination string, gateway string, interfaceName string) error { - return nil -} - -func WindowsRemoveRoute(destination string) error { - return nil -} diff --git a/network/route_windows.go b/network/route_windows.go deleted file mode 100644 index ba613b6..0000000 --- a/network/route_windows.go +++ /dev/null @@ -1,148 +0,0 @@ -//go:build windows - -package network - -import ( - "fmt" - "net" - "net/netip" - "runtime" - - "github.com/fosrl/newt/logger" - "golang.zx2c4.com/wireguard/windows/tunnel/winipcfg" -) - -func WindowsAddRoute(destination string, gateway string, interfaceName string) error { - if runtime.GOOS != "windows" { - return nil - } - - // Parse destination CIDR - _, ipNet, err := net.ParseCIDR(destination) - if err != nil { - return fmt.Errorf("invalid destination address: %v", err) - } - - // Convert to netip.Prefix - maskBits, _ := ipNet.Mask.Size() - - // Ensure we convert to the correct IP version (IPv4 vs IPv6) - var addr netip.Addr - if ip4 := ipNet.IP.To4(); ip4 != nil { - // IPv4 address - addr, _ = netip.AddrFromSlice(ip4) - } else { - // IPv6 address - addr, _ = netip.AddrFromSlice(ipNet.IP) - } - if !addr.IsValid() { - return fmt.Errorf("failed to convert destination IP") - } - prefix := netip.PrefixFrom(addr, maskBits) - - var luid winipcfg.LUID - var nextHop netip.Addr - - if interfaceName != "" { - // Get the interface LUID - needed for both gateway and interface-only routes - iface, err := net.InterfaceByName(interfaceName) - if err != nil { - return fmt.Errorf("failed to get interface %s: %v", interfaceName, err) - } - - luid, err = winipcfg.LUIDFromIndex(uint32(iface.Index)) - if err != nil { - return fmt.Errorf("failed to get LUID for interface %s: %v", interfaceName, err) - } - } - - if gateway != "" { - // Route with specific gateway - gwIP := net.ParseIP(gateway) - if gwIP == nil { - return fmt.Errorf("invalid gateway address: %s", gateway) - } - // Convert to correct IP version - if ip4 := gwIP.To4(); ip4 != nil { - nextHop, _ = netip.AddrFromSlice(ip4) - } else { - nextHop, _ = netip.AddrFromSlice(gwIP) - } - if !nextHop.IsValid() { - return fmt.Errorf("failed to convert gateway IP") - } - logger.Info("Adding route to %s via gateway %s on interface %s", destination, gateway, interfaceName) - } else if interfaceName != "" { - // Route via interface only - if addr.Is4() { - nextHop = netip.IPv4Unspecified() - } else { - nextHop = netip.IPv6Unspecified() - } - logger.Info("Adding route to %s via interface %s", destination, interfaceName) - } else { - return fmt.Errorf("either gateway or interface must be specified") - } - - // Add the route using winipcfg - err = luid.AddRoute(prefix, nextHop, 1) - if err != nil { - return fmt.Errorf("failed to add route: %v", err) - } - - return nil -} - -func WindowsRemoveRoute(destination string) error { - // Parse destination CIDR - _, ipNet, err := net.ParseCIDR(destination) - if err != nil { - return fmt.Errorf("invalid destination address: %v", err) - } - - // Convert to netip.Prefix - maskBits, _ := ipNet.Mask.Size() - - // Ensure we convert to the correct IP version (IPv4 vs IPv6) - var addr netip.Addr - if ip4 := ipNet.IP.To4(); ip4 != nil { - // IPv4 address - addr, _ = netip.AddrFromSlice(ip4) - } else { - // IPv6 address - addr, _ = netip.AddrFromSlice(ipNet.IP) - } - if !addr.IsValid() { - return fmt.Errorf("failed to convert destination IP") - } - prefix := netip.PrefixFrom(addr, maskBits) - - // Get all routes and find the one to delete - // We need to get the LUID from the existing route - var family winipcfg.AddressFamily - if addr.Is4() { - family = 2 // AF_INET - } else { - family = 23 // AF_INET6 - } - - routes, err := winipcfg.GetIPForwardTable2(family) - if err != nil { - return fmt.Errorf("failed to get route table: %v", err) - } - - // Find and delete matching route - for _, route := range routes { - routePrefix := route.DestinationPrefix.Prefix() - if routePrefix == prefix { - logger.Info("Removing route to %s", destination) - err = route.Delete() - if err != nil { - return fmt.Errorf("failed to delete route: %v", err) - } - return nil - } - } - - return fmt.Errorf("route to %s not found", destination) -} diff --git a/network/settings.go b/network/settings.go deleted file mode 100644 index e7792e0..0000000 --- a/network/settings.go +++ /dev/null @@ -1,190 +0,0 @@ -package network - -import ( - "encoding/json" - "sync" - - "github.com/fosrl/newt/logger" -) - -// NetworkSettings represents the network configuration for the tunnel -type NetworkSettings struct { - TunnelRemoteAddress string `json:"tunnel_remote_address,omitempty"` - MTU *int `json:"mtu,omitempty"` - DNSServers []string `json:"dns_servers,omitempty"` - IPv4Addresses []string `json:"ipv4_addresses,omitempty"` - IPv4SubnetMasks []string `json:"ipv4_subnet_masks,omitempty"` - IPv4IncludedRoutes []IPv4Route `json:"ipv4_included_routes,omitempty"` - IPv4ExcludedRoutes []IPv4Route `json:"ipv4_excluded_routes,omitempty"` - IPv6Addresses []string `json:"ipv6_addresses,omitempty"` - IPv6NetworkPrefixes []string `json:"ipv6_network_prefixes,omitempty"` - IPv6IncludedRoutes []IPv6Route `json:"ipv6_included_routes,omitempty"` - IPv6ExcludedRoutes []IPv6Route `json:"ipv6_excluded_routes,omitempty"` -} - -// IPv4Route represents an IPv4 route -type IPv4Route struct { - DestinationAddress string `json:"destination_address"` - SubnetMask string `json:"subnet_mask,omitempty"` - GatewayAddress string `json:"gateway_address,omitempty"` - IsDefault bool `json:"is_default,omitempty"` -} - -// IPv6Route represents an IPv6 route -type IPv6Route struct { - DestinationAddress string `json:"destination_address"` - NetworkPrefixLength int `json:"network_prefix_length,omitempty"` - GatewayAddress string `json:"gateway_address,omitempty"` - IsDefault bool `json:"is_default,omitempty"` -} - -var ( - networkSettings NetworkSettings - networkSettingsMutex sync.RWMutex - incrementor int -) - -// SetTunnelRemoteAddress sets the tunnel remote address -func SetTunnelRemoteAddress(address string) { - networkSettingsMutex.Lock() - defer networkSettingsMutex.Unlock() - networkSettings.TunnelRemoteAddress = address - incrementor++ - logger.Info("Set tunnel remote address: %s", address) -} - -// SetMTU sets the MTU value -func SetMTU(mtu int) { - networkSettingsMutex.Lock() - defer networkSettingsMutex.Unlock() - networkSettings.MTU = &mtu - incrementor++ - logger.Info("Set MTU: %d", mtu) -} - -// SetDNSServers sets the DNS servers -func SetDNSServers(servers []string) { - networkSettingsMutex.Lock() - defer networkSettingsMutex.Unlock() - networkSettings.DNSServers = servers - incrementor++ - logger.Info("Set DNS servers: %v", servers) -} - -// SetIPv4Settings sets IPv4 addresses and subnet masks -func SetIPv4Settings(addresses []string, subnetMasks []string) { - networkSettingsMutex.Lock() - defer networkSettingsMutex.Unlock() - networkSettings.IPv4Addresses = addresses - networkSettings.IPv4SubnetMasks = subnetMasks - incrementor++ - logger.Info("Set IPv4 addresses: %v, subnet masks: %v", addresses, subnetMasks) -} - -// SetIPv4IncludedRoutes sets the included IPv4 routes -func SetIPv4IncludedRoutes(routes []IPv4Route) { - networkSettingsMutex.Lock() - defer networkSettingsMutex.Unlock() - networkSettings.IPv4IncludedRoutes = routes - incrementor++ - logger.Info("Set IPv4 included routes: %d routes", len(routes)) -} - -func AddIPv4IncludedRoute(route IPv4Route) { - networkSettingsMutex.Lock() - defer networkSettingsMutex.Unlock() - - // make sure it does not already exist - for _, r := range networkSettings.IPv4IncludedRoutes { - if r == route { - logger.Info("IPv4 included route already exists: %+v", route) - return - } - } - - networkSettings.IPv4IncludedRoutes = append(networkSettings.IPv4IncludedRoutes, route) - incrementor++ - logger.Info("Added IPv4 included route: %+v", route) -} - -func RemoveIPv4IncludedRoute(route IPv4Route) { - networkSettingsMutex.Lock() - defer networkSettingsMutex.Unlock() - routes := networkSettings.IPv4IncludedRoutes - for i, r := range routes { - if r == route { - networkSettings.IPv4IncludedRoutes = append(routes[:i], routes[i+1:]...) - logger.Info("Removed IPv4 included route: %+v", route) - return - } - } - incrementor++ - logger.Info("IPv4 included route not found for removal: %+v", route) -} - -func SetIPv4ExcludedRoutes(routes []IPv4Route) { - networkSettingsMutex.Lock() - defer networkSettingsMutex.Unlock() - networkSettings.IPv4ExcludedRoutes = routes - incrementor++ - logger.Info("Set IPv4 excluded routes: %d routes", len(routes)) -} - -// SetIPv6Settings sets IPv6 addresses and network prefixes -func SetIPv6Settings(addresses []string, networkPrefixes []string) { - networkSettingsMutex.Lock() - defer networkSettingsMutex.Unlock() - networkSettings.IPv6Addresses = addresses - networkSettings.IPv6NetworkPrefixes = networkPrefixes - incrementor++ - logger.Info("Set IPv6 addresses: %v, network prefixes: %v", addresses, networkPrefixes) -} - -// SetIPv6IncludedRoutes sets the included IPv6 routes -func SetIPv6IncludedRoutes(routes []IPv6Route) { - networkSettingsMutex.Lock() - defer networkSettingsMutex.Unlock() - networkSettings.IPv6IncludedRoutes = routes - incrementor++ - logger.Info("Set IPv6 included routes: %d routes", len(routes)) -} - -// SetIPv6ExcludedRoutes sets the excluded IPv6 routes -func SetIPv6ExcludedRoutes(routes []IPv6Route) { - networkSettingsMutex.Lock() - defer networkSettingsMutex.Unlock() - networkSettings.IPv6ExcludedRoutes = routes - incrementor++ - logger.Info("Set IPv6 excluded routes: %d routes", len(routes)) -} - -// ClearNetworkSettings clears all network settings -func ClearNetworkSettings() { - networkSettingsMutex.Lock() - defer networkSettingsMutex.Unlock() - networkSettings = NetworkSettings{} - incrementor++ - logger.Info("Cleared all network settings") -} - -func GetJSON() (string, error) { - networkSettingsMutex.RLock() - defer networkSettingsMutex.RUnlock() - data, err := json.MarshalIndent(networkSettings, "", " ") - if err != nil { - return "", err - } - return string(data), nil -} - -func GetSettings() NetworkSettings { - networkSettingsMutex.RLock() - defer networkSettingsMutex.RUnlock() - return networkSettings -} - -func GetIncrementor() int { - networkSettingsMutex.Lock() - defer networkSettingsMutex.Unlock() - return incrementor -} diff --git a/olm/olm.go b/olm/olm.go index e128e3a..52ec8c0 100644 --- a/olm/olm.go +++ b/olm/olm.go @@ -14,12 +14,12 @@ import ( "github.com/fosrl/newt/bind" "github.com/fosrl/newt/holepunch" "github.com/fosrl/newt/logger" + "github.com/fosrl/newt/network" "github.com/fosrl/newt/util" "github.com/fosrl/olm/api" olmDevice "github.com/fosrl/olm/device" "github.com/fosrl/olm/dns" dnsOverride "github.com/fosrl/olm/dns/override" - "github.com/fosrl/olm/network" "github.com/fosrl/olm/peermonitor" "github.com/fosrl/olm/peers" "github.com/fosrl/olm/websocket" @@ -770,6 +770,7 @@ func StartTunnel(config TunnelConfig) { "relay": !config.Holepunch, "olmVersion": globalConfig.Version, "orgId": config.OrgID, + "userToken": userToken, // "doNotCreateNewClient": config.DoNotCreateNewClient, }, 1*time.Second) diff --git a/olm/util.go b/olm/util.go index 1f7348f..9da1f00 100644 --- a/olm/util.go +++ b/olm/util.go @@ -7,7 +7,7 @@ import ( "time" "github.com/fosrl/newt/logger" - "github.com/fosrl/olm/network" + "github.com/fosrl/newt/network" "github.com/fosrl/olm/websocket" ) diff --git a/peers/manager.go b/peers/manager.go index acf630a..abccaee 100644 --- a/peers/manager.go +++ b/peers/manager.go @@ -6,8 +6,8 @@ import ( "sync" "github.com/fosrl/newt/logger" + "github.com/fosrl/newt/network" "github.com/fosrl/olm/dns" - "github.com/fosrl/olm/network" "github.com/fosrl/olm/peermonitor" "golang.zx2c4.com/wireguard/device" "golang.zx2c4.com/wireguard/wgctrl/wgtypes"