chore(errors): review all errors in codebase

This commit is contained in:
Quentin McGaw
2022-02-20 02:58:16 +00:00
parent ac4a4f83fc
commit 920ad8b54b
88 changed files with 254 additions and 460 deletions

View File

@@ -19,7 +19,7 @@ type DefaultRouteGetter interface {
func (r *Routing) DefaultRoute() (defaultInterface string, defaultGateway net.IP, err error) {
routes, err := r.netLinker.RouteList(nil, netlink.FAMILY_ALL)
if err != nil {
return "", nil, fmt.Errorf("%w: %s", ErrRoutesList, err)
return "", nil, fmt.Errorf("cannot list routes: %w", err)
}
for _, route := range routes {
if route.Dst == nil {
@@ -27,7 +27,7 @@ func (r *Routing) DefaultRoute() (defaultInterface string, defaultGateway net.IP
linkIndex := route.LinkIndex
link, err := r.netLinker.LinkByIndex(linkIndex)
if err != nil {
return "", nil, fmt.Errorf("%w: for default route at index %d: %s", ErrLinkByIndex, linkIndex, err)
return "", nil, fmt.Errorf("cannot obtain link by index: for default route at index %d: %w", linkIndex, err)
}
attributes := link.Attrs()
defaultInterface = attributes.Name
@@ -46,7 +46,7 @@ type DefaultIPGetter interface {
func (r *Routing) DefaultIP() (ip net.IP, err error) {
routes, err := r.netLinker.RouteList(nil, netlink.FAMILY_ALL)
if err != nil {
return nil, fmt.Errorf("%w: %s", ErrRoutesList, err)
return nil, fmt.Errorf("cannot list routes: %w", err)
}
defaultLinkName := ""
@@ -55,7 +55,7 @@ func (r *Routing) DefaultIP() (ip net.IP, err error) {
linkIndex := route.LinkIndex
link, err := r.netLinker.LinkByIndex(linkIndex)
if err != nil {
return nil, fmt.Errorf("%w: for default route at index %d: %s", ErrLinkByIndex, linkIndex, err)
return nil, fmt.Errorf("cannot find link by index: for default route at index %d: %w", linkIndex, err)
}
defaultLinkName = link.Attrs().Name
}

View File

@@ -1,17 +1,9 @@
package routing
import (
"errors"
"fmt"
)
var (
ErrDefaultRoute = errors.New("cannot get default route")
ErrAddInboundFromDefault = errors.New("cannot add routes for inbound traffic from default IP")
ErrDelInboundFromDefault = errors.New("cannot remove routes for inbound traffic from default IP")
ErrSubnetsOutboundSet = errors.New("cannot set outbound subnets routes")
)
type Setuper interface {
Setup() (err error)
}
@@ -19,7 +11,7 @@ type Setuper interface {
func (r *Routing) Setup() (err error) {
defaultInterfaceName, defaultGateway, err := r.DefaultRoute()
if err != nil {
return fmt.Errorf("%w: %s", ErrDefaultRoute, err)
return fmt.Errorf("cannot get default route: %w", err)
}
touched := false
@@ -35,14 +27,14 @@ func (r *Routing) Setup() (err error) {
err = r.routeInboundFromDefault(defaultGateway, defaultInterfaceName)
if err != nil {
return fmt.Errorf("%w: %s", ErrAddInboundFromDefault, err)
return fmt.Errorf("cannot add routes for inbound traffic from default IP: %w", err)
}
r.stateMutex.RLock()
outboundSubnets := r.outboundSubnets
r.stateMutex.RUnlock()
if err := r.setOutboundRoutes(outboundSubnets, defaultInterfaceName, defaultGateway); err != nil {
return fmt.Errorf("%w: %s", ErrSubnetsOutboundSet, err)
return fmt.Errorf("cannot set outbound subnets routes: %w", err)
}
return nil
@@ -55,16 +47,16 @@ type TearDowner interface {
func (r *Routing) TearDown() error {
defaultInterfaceName, defaultGateway, err := r.DefaultRoute()
if err != nil {
return fmt.Errorf("%w: %s", ErrDefaultRoute, err)
return fmt.Errorf("cannot get default route: %w", err)
}
err = r.unrouteInboundFromDefault(defaultGateway, defaultInterfaceName)
if err != nil {
return fmt.Errorf("%w: %s", ErrDelInboundFromDefault, err)
return fmt.Errorf("cannot remove routes for inbound traffic from default IP: %w", err)
}
if err := r.setOutboundRoutes(nil, defaultInterfaceName, defaultGateway); err != nil {
return fmt.Errorf("%w: %s", ErrSubnetsOutboundSet, err)
return fmt.Errorf("cannot set outbound subnets routes: %w", err)
}
return nil

View File

@@ -5,7 +5,5 @@ import (
)
var (
ErrLinkByIndex = errors.New("cannot obtain link by index")
ErrLinkDefaultNotFound = errors.New("default link not found")
ErrRoutesList = errors.New("cannot list routes")
)

View File

@@ -1,7 +1,6 @@
package routing
import (
"errors"
"fmt"
"net"
@@ -13,19 +12,15 @@ const (
inboundPriority = 100
)
var (
errDefaultIP = errors.New("cannot get default IP address")
)
func (r *Routing) routeInboundFromDefault(defaultGateway net.IP,
defaultInterface string) (err error) {
if err := r.addRuleInboundFromDefault(inboundTable); err != nil {
return fmt.Errorf("%w: %s", errRuleAdd, err)
return fmt.Errorf("cannot add rule: %w", err)
}
defaultDestination := net.IPNet{IP: net.IPv4(0, 0, 0, 0), Mask: net.IPv4Mask(0, 0, 0, 0)}
if err := r.addRouteVia(defaultDestination, defaultGateway, defaultInterface, inboundTable); err != nil {
return fmt.Errorf("%w: %s", errRouteAdd, err)
return fmt.Errorf("cannot add route: %w", err)
}
return nil
@@ -35,11 +30,11 @@ func (r *Routing) unrouteInboundFromDefault(defaultGateway net.IP,
defaultInterface string) (err error) {
defaultDestination := net.IPNet{IP: net.IPv4(0, 0, 0, 0), Mask: net.IPv4Mask(0, 0, 0, 0)}
if err := r.deleteRouteVia(defaultDestination, defaultGateway, defaultInterface, inboundTable); err != nil {
return fmt.Errorf("%w: %s", errRouteDelete, err)
return fmt.Errorf("cannot delete route: %w", err)
}
if err := r.delRuleInboundFromDefault(inboundTable); err != nil {
return fmt.Errorf("%w: %s", errRuleDelete, err)
return fmt.Errorf("cannot delete rule: %w", err)
}
return nil
@@ -48,14 +43,14 @@ func (r *Routing) unrouteInboundFromDefault(defaultGateway net.IP,
func (r *Routing) addRuleInboundFromDefault(table int) (err error) {
defaultIP, err := r.DefaultIP()
if err != nil {
return fmt.Errorf("%w: %s", errDefaultIP, err)
return fmt.Errorf("cannot find default IP: %w", err)
}
defaultIPMasked32 := netlink.NewIPNet(defaultIP)
ruleDstNet := (*net.IPNet)(nil)
err = r.addIPRule(defaultIPMasked32, ruleDstNet, table, inboundPriority)
if err != nil {
return fmt.Errorf("%w: %s", errRuleAdd, err)
return fmt.Errorf("cannot add rule: %w", err)
}
return nil
@@ -64,14 +59,14 @@ func (r *Routing) addRuleInboundFromDefault(table int) (err error) {
func (r *Routing) delRuleInboundFromDefault(table int) (err error) {
defaultIP, err := r.DefaultIP()
if err != nil {
return fmt.Errorf("%w: %s", errDefaultIP, err)
return fmt.Errorf("cannot find default IP: %w", err)
}
defaultIPMasked32 := netlink.NewIPNet(defaultIP)
ruleDstNet := (*net.IPNet)(nil)
err = r.deleteIPRule(defaultIPMasked32, ruleDstNet, table, inboundPriority)
if err != nil {
return fmt.Errorf("%w: %s", errRuleDelete, err)
return fmt.Errorf("cannot delete rule: %w", err)
}
return nil

View File

@@ -13,18 +13,16 @@ func IPIsPrivate(ip net.IP) bool {
var (
errInterfaceIPNotFound = errors.New("IP address not found for interface")
errInterfaceListAddr = errors.New("cannot list interface addresses")
errInterfaceNotFound = errors.New("network interface not found")
)
func (r *Routing) assignedIP(interfaceName string) (ip net.IP, err error) {
iface, err := net.InterfaceByName(interfaceName)
if err != nil {
return nil, fmt.Errorf("%w: %s: %s", errInterfaceNotFound, interfaceName, err)
return nil, fmt.Errorf("network interface %s not found: %w", interfaceName, err)
}
addresses, err := iface.Addrs()
if err != nil {
return nil, fmt.Errorf("%w: %s: %s", errInterfaceListAddr, interfaceName, err)
return nil, fmt.Errorf("cannot list interface %s addresses: %w", interfaceName, err)
}
for _, address := range addresses {
switch value := address.(type) {

View File

@@ -9,7 +9,6 @@ import (
)
var (
ErrLinkList = errors.New("cannot list links")
ErrLinkLocalNotFound = errors.New("local link not found")
ErrSubnetDefaultNotFound = errors.New("default subnet not found")
ErrSubnetLocalNotFound = errors.New("local subnet not found")
@@ -28,7 +27,7 @@ type LocalSubnetGetter interface {
func (r *Routing) LocalSubnet() (defaultSubnet net.IPNet, err error) {
routes, err := r.netLinker.RouteList(nil, netlink.FAMILY_ALL)
if err != nil {
return defaultSubnet, fmt.Errorf("%w: %s", ErrRoutesList, err)
return defaultSubnet, fmt.Errorf("cannot list routes: %w", err)
}
defaultLinkIndex := -1
@@ -61,7 +60,7 @@ type LocalNetworksGetter interface {
func (r *Routing) LocalNetworks() (localNetworks []LocalNetwork, err error) {
links, err := r.netLinker.LinkList()
if err != nil {
return localNetworks, fmt.Errorf("%w: %s", ErrLinkList, err)
return localNetworks, fmt.Errorf("cannot list links: %w", err)
}
localLinks := make(map[int]struct{})
@@ -81,7 +80,7 @@ func (r *Routing) LocalNetworks() (localNetworks []LocalNetwork, err error) {
routes, err := r.netLinker.RouteList(nil, netlink.FAMILY_V4)
if err != nil {
return localNetworks, fmt.Errorf("%w: %s", ErrRoutesList, err)
return localNetworks, fmt.Errorf("cannot list routes: %w", err)
}
for _, route := range routes {
@@ -98,7 +97,7 @@ func (r *Routing) LocalNetworks() (localNetworks []LocalNetwork, err error) {
link, err := r.netLinker.LinkByIndex(route.LinkIndex)
if err != nil {
return localNetworks, fmt.Errorf("%w: at index %d: %s", ErrLinkByIndex, route.LinkIndex, err)
return localNetworks, fmt.Errorf("cannot find link at index %d: %w", route.LinkIndex, err)
}
localNet.InterfaceName = link.Attrs().Name

View File

@@ -1,7 +1,6 @@
package routing
import (
"errors"
"fmt"
"net"
@@ -13,10 +12,6 @@ const (
outboundPriority = 99
)
var (
errAddOutboundSubnet = errors.New("cannot add outbound subnet to routes")
)
type OutboundRoutesSetter interface {
SetOutboundRoutes(outboundSubnets []net.IPNet) error
}
@@ -48,7 +43,7 @@ func (r *Routing) setOutboundRoutes(outboundSubnets []net.IPNet,
err = r.addOutboundSubnets(subnetsToAdd, defaultInterfaceName, defaultGateway)
if err != nil {
return fmt.Errorf("%w: %s", errAddOutboundSubnet, err)
return fmt.Errorf("cannot add outbound subnet to routes: %w", err)
}
return nil
@@ -68,7 +63,7 @@ func (r *Routing) removeOutboundSubnets(subnets []net.IPNet,
err = r.deleteIPRule(ruleSrcNet, ruleDstNet, outboundTable, outboundPriority)
if err != nil {
warnings = append(warnings,
errRuleDelete.Error()+": for subnet "+subNet.String()+": "+err.Error())
"cannot delete rule: for subnet "+subNet.String()+": "+err.Error())
continue
}
@@ -83,16 +78,14 @@ func (r *Routing) addOutboundSubnets(subnets []net.IPNet,
for i, subnet := range subnets {
err := r.addRouteVia(subnet, defaultGateway, defaultInterfaceName, outboundTable)
if err != nil {
return fmt.Errorf("%w: for subnet %s: %s",
errRouteAdd, subnet, err)
return fmt.Errorf("cannot add route for subnet %s: %w", subnet, err)
}
ruleSrcNet := (*net.IPNet)(nil)
ruleDstNet := &subnets[i]
err = r.addIPRule(ruleSrcNet, ruleDstNet, outboundTable, outboundPriority)
if err != nil {
return fmt.Errorf("%w: for subnet %s: %s",
errRuleAdd, subnet, err)
return fmt.Errorf("cannot add rule: for subnet %s: %w", subnet, err)
}
r.outboundSubnets = append(r.outboundSubnets, subnet)

View File

@@ -1,7 +1,6 @@
package routing
import (
"errors"
"fmt"
"net"
"strconv"
@@ -9,12 +8,6 @@ import (
"github.com/qdm12/gluetun/internal/netlink"
)
var (
errLinkByName = errors.New("cannot obtain link by name")
errRouteAdd = errors.New("cannot add route")
errRouteDelete = errors.New("cannot delete route")
)
func (r *Routing) addRouteVia(destination net.IPNet, gateway net.IP,
iface string, table int) error {
destinationStr := destination.String()
@@ -26,7 +19,7 @@ func (r *Routing) addRouteVia(destination net.IPNet, gateway net.IP,
link, err := r.netLinker.LinkByName(iface)
if err != nil {
return fmt.Errorf("%w: interface %s: %s", errLinkByName, iface, err)
return fmt.Errorf("cannot find link for interface %s: %w", iface, err)
}
route := netlink.Route{
@@ -36,8 +29,8 @@ func (r *Routing) addRouteVia(destination net.IPNet, gateway net.IP,
Table: table,
}
if err := r.netLinker.RouteReplace(&route); err != nil {
return fmt.Errorf("%w: for subnet %s at interface %s",
err, destinationStr, iface)
return fmt.Errorf("cannot replace route for subnet %s at interface %s: %w",
destinationStr, iface, err)
}
return nil
@@ -54,7 +47,7 @@ func (r *Routing) deleteRouteVia(destination net.IPNet, gateway net.IP,
link, err := r.netLinker.LinkByName(iface)
if err != nil {
return fmt.Errorf("%w: for interface %s: %s", errLinkByName, iface, err)
return fmt.Errorf("cannot find link for interface %s: %w", iface, err)
}
route := netlink.Route{
@@ -64,8 +57,8 @@ func (r *Routing) deleteRouteVia(destination net.IPNet, gateway net.IP,
Table: table,
}
if err := r.netLinker.RouteDel(&route); err != nil {
return fmt.Errorf("%w: for subnet %s at interface %s",
err, destinationStr, iface)
return fmt.Errorf("cannot delete route: for subnet %s at interface %s: %w",
destinationStr, iface, err)
}
return nil

View File

@@ -2,19 +2,12 @@ package routing
import (
"bytes"
"errors"
"fmt"
"net"
"github.com/qdm12/gluetun/internal/netlink"
)
var (
errRulesList = errors.New("cannot list rules")
errRuleAdd = errors.New("cannot add rule")
errRuleDelete = errors.New("cannot delete rule")
)
func (r *Routing) addIPRule(src, dst *net.IPNet, table, priority int) error {
const add = true
r.logger.Debug(ruleDbgMsg(add, src, dst, table, priority))
@@ -27,7 +20,7 @@ func (r *Routing) addIPRule(src, dst *net.IPNet, table, priority int) error {
existingRules, err := r.netLinker.RuleList(netlink.FAMILY_ALL)
if err != nil {
return fmt.Errorf("%w: %s", errRulesList, err)
return fmt.Errorf("cannot list rules: %w", err)
}
for i := range existingRules {
if !rulesAreEqual(&existingRules[i], rule) {
@@ -37,7 +30,7 @@ func (r *Routing) addIPRule(src, dst *net.IPNet, table, priority int) error {
}
if err := r.netLinker.RuleAdd(rule); err != nil {
return fmt.Errorf("%w: for rule: %s", err, rule)
return fmt.Errorf("cannot add rule %s: %w", rule, err)
}
return nil
}
@@ -54,14 +47,14 @@ func (r *Routing) deleteIPRule(src, dst *net.IPNet, table, priority int) error {
existingRules, err := r.netLinker.RuleList(netlink.FAMILY_ALL)
if err != nil {
return fmt.Errorf("%w: %s", errRulesList, err)
return fmt.Errorf("cannot list rules: %w", err)
}
for i := range existingRules {
if !rulesAreEqual(&existingRules[i], rule) {
continue
}
if err := r.netLinker.RuleDel(rule); err != nil {
return fmt.Errorf("%w: for rule: %s", err, rule)
return fmt.Errorf("cannot delete rule %s: %w", rule, err)
}
}
return nil

View File

@@ -88,7 +88,7 @@ func Test_Routing_addIPRule(t *testing.T) {
ruleToAdd: makeIPRule(t, makeIPNet(t, 1), makeIPNet(t, 2), 99, 99),
err: errDummy,
},
err: errors.New("dummy error: for rule: ip rule 99: from 1.1.1.0/24 to 2.2.2.0/24 table 99"),
err: errors.New("cannot add rule ip rule 99: from 1.1.1.0/24 to 2.2.2.0/24 table 99: dummy error"),
},
"add rule success": {
src: makeIPNet(t, 1),
@@ -193,7 +193,7 @@ func Test_Routing_deleteIPRule(t *testing.T) {
ruleToDel: makeIPRule(t, makeIPNet(t, 1), makeIPNet(t, 2), 99, 99),
err: errDummy,
},
err: errors.New("dummy error: for rule: ip rule 99: from 1.1.1.0/24 to 2.2.2.0/24 table 99"),
err: errors.New("cannot delete rule ip rule 99: from 1.1.1.0/24 to 2.2.2.0/24 table 99: dummy error"),
},
"rule deleted": {
src: makeIPNet(t, 1),

View File

@@ -21,7 +21,7 @@ type VPNDestinationIPGetter interface {
func (r *Routing) VPNDestinationIP() (ip net.IP, err error) {
routes, err := r.netLinker.RouteList(nil, netlink.FAMILY_ALL)
if err != nil {
return nil, fmt.Errorf("%w: %s", ErrRoutesList, err)
return nil, fmt.Errorf("cannot list routes: %w", err)
}
defaultLinkIndex := -1
@@ -53,12 +53,12 @@ type VPNLocalGatewayIPGetter interface {
func (r *Routing) VPNLocalGatewayIP(vpnIntf string) (ip net.IP, err error) {
routes, err := r.netLinker.RouteList(nil, netlink.FAMILY_ALL)
if err != nil {
return nil, fmt.Errorf("%w: %s", ErrRoutesList, err)
return nil, fmt.Errorf("cannot list routes: %w", err)
}
for _, route := range routes {
link, err := r.netLinker.LinkByIndex(route.LinkIndex)
if err != nil {
return nil, fmt.Errorf("%w: %s", ErrLinkByIndex, err)
return nil, fmt.Errorf("cannot find link at index %d: %w", route.LinkIndex, err)
}
interfaceName := link.Attrs().Name
if interfaceName == vpnIntf &&