Maint: internal/subnet package

This commit is contained in:
Quentin McGaw (desktop) 2021-08-25 17:22:48 +00:00
parent dcaf952986
commit 04fad1b781
4 changed files with 18 additions and 67 deletions

View File

@ -4,6 +4,8 @@ import (
"context" "context"
"fmt" "fmt"
"net" "net"
"github.com/qdm12/gluetun/internal/subnet"
) )
type OutboundSubnetsSetter interface { type OutboundSubnetsSetter interface {
@ -23,8 +25,8 @@ func (c *Config) SetOutboundSubnets(ctx context.Context, subnets []net.IPNet) (e
c.logger.Info("setting allowed subnets through firewall...") c.logger.Info("setting allowed subnets through firewall...")
subnetsToAdd := findSubnetsToAdd(c.outboundSubnets, subnets) subnetsToAdd := subnet.FindSubnetsToAdd(c.outboundSubnets, subnets)
subnetsToRemove := findSubnetsToRemove(c.outboundSubnets, subnets) subnetsToRemove := subnet.FindSubnetsToRemove(c.outboundSubnets, subnets)
if len(subnetsToAdd) == 0 && len(subnetsToRemove) == 0 { if len(subnetsToAdd) == 0 && len(subnetsToRemove) == 0 {
return nil return nil
} }
@ -39,12 +41,12 @@ func (c *Config) SetOutboundSubnets(ctx context.Context, subnets []net.IPNet) (e
func (c *Config) removeOutboundSubnets(ctx context.Context, subnets []net.IPNet) { func (c *Config) removeOutboundSubnets(ctx context.Context, subnets []net.IPNet) {
const remove = true const remove = true
for _, subnet := range subnets { for _, subNet := range subnets {
if err := c.acceptOutputFromIPToSubnet(ctx, c.defaultInterface, c.localIP, subnet, remove); err != nil { if err := c.acceptOutputFromIPToSubnet(ctx, c.defaultInterface, c.localIP, subNet, remove); err != nil {
c.logger.Error("cannot remove outdated outbound subnet through firewall: " + err.Error()) c.logger.Error("cannot remove outdated outbound subnet through firewall: " + err.Error())
continue continue
} }
c.outboundSubnets = removeSubnetFromSubnets(c.outboundSubnets, subnet) c.outboundSubnets = subnet.RemoveSubnetFromSubnets(c.outboundSubnets, subNet)
} }
} }

View File

@ -1,53 +0,0 @@
package firewall
import (
"net"
)
func findSubnetsToAdd(oldSubnets, newSubnets []net.IPNet) (subnetsToAdd []net.IPNet) {
for _, newSubnet := range newSubnets {
found := false
for _, oldSubnet := range oldSubnets {
if subnetsAreEqual(oldSubnet, newSubnet) {
found = true
break
}
}
if !found {
subnetsToAdd = append(subnetsToAdd, newSubnet)
}
}
return subnetsToAdd
}
func findSubnetsToRemove(oldSubnets, newSubnets []net.IPNet) (subnetsToRemove []net.IPNet) {
for _, oldSubnet := range oldSubnets {
found := false
for _, newSubnet := range newSubnets {
if subnetsAreEqual(oldSubnet, newSubnet) {
found = true
break
}
}
if !found {
subnetsToRemove = append(subnetsToRemove, oldSubnet)
}
}
return subnetsToRemove
}
func subnetsAreEqual(a, b net.IPNet) bool {
return a.IP.Equal(b.IP) && a.Mask.String() == b.Mask.String()
}
func removeSubnetFromSubnets(subnets []net.IPNet, subnet net.IPNet) []net.IPNet {
L := len(subnets)
for i := range subnets {
if subnetsAreEqual(subnet, subnets[i]) {
subnets[i] = subnets[L-1]
subnets = subnets[:L-1]
break
}
}
return subnets
}

View File

@ -4,6 +4,8 @@ import (
"errors" "errors"
"fmt" "fmt"
"net" "net"
"github.com/qdm12/gluetun/internal/subnet"
) )
var ( var (
@ -27,8 +29,8 @@ func (r *Routing) setOutboundRoutes(outboundSubnets []net.IPNet,
r.stateMutex.Lock() r.stateMutex.Lock()
defer r.stateMutex.Unlock() defer r.stateMutex.Unlock()
subnetsToRemove := findSubnetsToRemove(r.outboundSubnets, outboundSubnets) subnetsToRemove := subnet.FindSubnetsToRemove(r.outboundSubnets, outboundSubnets)
subnetsToAdd := findSubnetsToAdd(r.outboundSubnets, outboundSubnets) subnetsToAdd := subnet.FindSubnetsToAdd(r.outboundSubnets, outboundSubnets)
if len(subnetsToAdd) == 0 && len(subnetsToRemove) == 0 { if len(subnetsToAdd) == 0 && len(subnetsToRemove) == 0 {
return nil return nil
@ -40,13 +42,13 @@ func (r *Routing) setOutboundRoutes(outboundSubnets []net.IPNet,
func (r *Routing) removeOutboundSubnets(subnets []net.IPNet, func (r *Routing) removeOutboundSubnets(subnets []net.IPNet,
defaultInterfaceName string, defaultGateway net.IP) { defaultInterfaceName string, defaultGateway net.IP) {
for _, subnet := range subnets { for _, subNet := range subnets {
const table = 0 const table = 0
if err := r.deleteRouteVia(subnet, defaultGateway, defaultInterfaceName, table); err != nil { if err := r.deleteRouteVia(subNet, defaultGateway, defaultInterfaceName, table); err != nil {
r.logger.Error("cannot remove outdated outbound subnet from routing: " + err.Error()) r.logger.Error("cannot remove outdated outbound subnet from routing: " + err.Error())
continue continue
} }
r.outboundSubnets = removeSubnetFromSubnets(r.outboundSubnets, subnet) r.outboundSubnets = subnet.RemoveSubnetFromSubnets(r.outboundSubnets, subNet)
} }
} }

View File

@ -1,10 +1,10 @@
package routing package subnet
import ( import (
"net" "net"
) )
func findSubnetsToAdd(oldSubnets, newSubnets []net.IPNet) (subnetsToAdd []net.IPNet) { func FindSubnetsToAdd(oldSubnets, newSubnets []net.IPNet) (subnetsToAdd []net.IPNet) {
for _, newSubnet := range newSubnets { for _, newSubnet := range newSubnets {
found := false found := false
for _, oldSubnet := range oldSubnets { for _, oldSubnet := range oldSubnets {
@ -20,7 +20,7 @@ func findSubnetsToAdd(oldSubnets, newSubnets []net.IPNet) (subnetsToAdd []net.IP
return subnetsToAdd return subnetsToAdd
} }
func findSubnetsToRemove(oldSubnets, newSubnets []net.IPNet) (subnetsToRemove []net.IPNet) { func FindSubnetsToRemove(oldSubnets, newSubnets []net.IPNet) (subnetsToRemove []net.IPNet) {
for _, oldSubnet := range oldSubnets { for _, oldSubnet := range oldSubnets {
found := false found := false
for _, newSubnet := range newSubnets { for _, newSubnet := range newSubnets {
@ -40,7 +40,7 @@ func subnetsAreEqual(a, b net.IPNet) bool {
return a.IP.Equal(b.IP) && a.Mask.String() == b.Mask.String() return a.IP.Equal(b.IP) && a.Mask.String() == b.Mask.String()
} }
func removeSubnetFromSubnets(subnets []net.IPNet, subnet net.IPNet) []net.IPNet { func RemoveSubnetFromSubnets(subnets []net.IPNet, subnet net.IPNet) []net.IPNet {
L := len(subnets) L := len(subnets)
for i := range subnets { for i := range subnets {
if subnetsAreEqual(subnet, subnets[i]) { if subnetsAreEqual(subnet, subnets[i]) {