From d7a6caa2acd3422ce83cdb720539caee128d4202 Mon Sep 17 00:00:00 2001 From: "Quentin McGaw (desktop)" Date: Mon, 26 Jul 2021 16:18:53 +0000 Subject: [PATCH] Maint: routing interface composition --- cmd/gluetun/main.go | 2 +- internal/routing/enable.go | 8 ++++++++ internal/routing/outboundsubnets.go | 4 ++++ internal/routing/reader.go | 24 +++++++++++++++++++++++ internal/routing/routing.go | 30 +++++++++++++++++++---------- 5 files changed, 57 insertions(+), 11 deletions(-) diff --git a/cmd/gluetun/main.go b/cmd/gluetun/main.go index b5af2f0f..35a87e3d 100644 --- a/cmd/gluetun/main.go +++ b/cmd/gluetun/main.go @@ -449,7 +449,7 @@ func printVersions(ctx context.Context, logger logging.Logger, func routeReadyEvents(ctx context.Context, done chan<- struct{}, buildInfo models.BuildInformation, tunnelReadyCh <-chan struct{}, unboundLooper dns.Looper, updaterLooper updater.Looper, publicIPLooper publicip.Looper, - routing routing.Routing, logger logging.Logger, httpClient *http.Client, + routing routing.VPNGetter, logger logging.Logger, httpClient *http.Client, versionInformation, portForwardingEnabled bool, startPortForward func(vpnGateway net.IP)) { defer close(done) diff --git a/internal/routing/enable.go b/internal/routing/enable.go index e46d9bac..5ef4b669 100644 --- a/internal/routing/enable.go +++ b/internal/routing/enable.go @@ -20,6 +20,10 @@ var ( ErrSubnetsOutboundSet = errors.New("cannot set outbound subnets routes") ) +type Setuper interface { + Setup() (err error) +} + func (r *routing) Setup() (err error) { defaultIP, err := r.DefaultIP() if err != nil { @@ -59,6 +63,10 @@ func (r *routing) Setup() (err error) { return nil } +type TearDowner interface { + TearDown() error +} + func (r *routing) TearDown() error { defaultIP, err := r.DefaultIP() if err != nil { diff --git a/internal/routing/outboundsubnets.go b/internal/routing/outboundsubnets.go index c003e4cc..e14ebaea 100644 --- a/internal/routing/outboundsubnets.go +++ b/internal/routing/outboundsubnets.go @@ -10,6 +10,10 @@ var ( ErrAddOutboundSubnet = errors.New("cannot add outbound subnet to routes") ) +type OutboundRoutesSetter interface { + SetOutboundRoutes(outboundSubnets []net.IPNet) error +} + func (r *routing) SetOutboundRoutes(outboundSubnets []net.IPNet) error { defaultInterface, defaultGateway, err := r.DefaultRoute() if err != nil { diff --git a/internal/routing/reader.go b/internal/routing/reader.go index 5115385b..8d1f6308 100644 --- a/internal/routing/reader.go +++ b/internal/routing/reader.go @@ -34,6 +34,10 @@ var ( ErrVPNLocalGatewayIPNotFound = errors.New("VPN local gateway IP address not found") ) +type DefaultRouteGetter interface { + DefaultRoute() (defaultInterface string, defaultGateway net.IP, err error) +} + func (r *routing) DefaultRoute() (defaultInterface string, defaultGateway net.IP, err error) { routes, err := netlink.RouteList(nil, netlink.FAMILY_ALL) if err != nil { @@ -57,6 +61,10 @@ func (r *routing) DefaultRoute() (defaultInterface string, defaultGateway net.IP return "", nil, fmt.Errorf("%w: in %d route(s)", ErrRouteDefaultNotFound, len(routes)) } +type DefaultIPGetter interface { + DefaultIP() (defaultIP net.IP, err error) +} + func (r *routing) DefaultIP() (ip net.IP, err error) { routes, err := netlink.RouteList(nil, netlink.FAMILY_ALL) if err != nil { @@ -81,6 +89,10 @@ func (r *routing) DefaultIP() (ip net.IP, err error) { return r.assignedIP(defaultLinkName) } +type LocalSubnetGetter interface { + LocalSubnet() (defaultSubnet net.IPNet, err error) +} + func (r *routing) LocalSubnet() (defaultSubnet net.IPNet, err error) { routes, err := netlink.RouteList(nil, netlink.FAMILY_ALL) if err != nil { @@ -110,6 +122,10 @@ func (r *routing) LocalSubnet() (defaultSubnet net.IPNet, err error) { return defaultSubnet, fmt.Errorf("%w: in %d routes", ErrSubnetDefaultNotFound, len(routes)) } +type LocalNetworksGetter interface { + LocalNetworks() (localNetworks []LocalNetwork, err error) +} + func (r *routing) LocalNetworks() (localNetworks []LocalNetwork, err error) { links, err := netlink.LinkList() if err != nil { @@ -193,6 +209,10 @@ func (r *routing) assignedIP(interfaceName string) (ip net.IP, err error) { ErrInterfaceIPNotFound, interfaceName, len(addresses)) } +type VPNDestinationIPGetter interface { + VPNDestinationIP() (ip net.IP, err error) +} + func (r *routing) VPNDestinationIP() (ip net.IP, err error) { routes, err := netlink.RouteList(nil, netlink.FAMILY_ALL) if err != nil { @@ -221,6 +241,10 @@ func (r *routing) VPNDestinationIP() (ip net.IP, err error) { return nil, fmt.Errorf("%w: in %d routes", ErrVPNDestinationIPNotFound, len(routes)) } +type VPNLocalGatewayIPGetter interface { + VPNLocalGatewayIP() (ip net.IP, err error) +} + func (r *routing) VPNLocalGatewayIP() (ip net.IP, err error) { routes, err := netlink.RouteList(nil, netlink.FAMILY_ALL) if err != nil { diff --git a/internal/routing/routing.go b/internal/routing/routing.go index 7d331331..86246674 100644 --- a/internal/routing/routing.go +++ b/internal/routing/routing.go @@ -9,17 +9,27 @@ import ( ) type Routing interface { - // Mutations - Setup() (err error) - TearDown() error - SetOutboundRoutes(outboundSubnets []net.IPNet) error + Reader + Writer +} - // Read only - DefaultRoute() (defaultInterface string, defaultGateway net.IP, err error) - LocalNetworks() (localNetworks []LocalNetwork, err error) - DefaultIP() (defaultIP net.IP, err error) - VPNDestinationIP() (ip net.IP, err error) - VPNLocalGatewayIP() (ip net.IP, err error) +type Reader interface { + DefaultRouteGetter + DefaultIPGetter + LocalSubnetGetter + LocalNetworksGetter + VPNGetter +} + +type VPNGetter interface { + VPNDestinationIPGetter + VPNLocalGatewayIPGetter +} + +type Writer interface { + Setuper + TearDowner + OutboundRoutesSetter } type routing struct {