chore(all): return concrete types, accept interfaces
- Remove exported interfaces unused locally - Define interfaces to accept arguments - Return concrete types, not interfaces
This commit is contained in:
88
internal/vpn/interfaces.go
Normal file
88
internal/vpn/interfaces.go
Normal file
@@ -0,0 +1,88 @@
|
||||
package vpn
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net"
|
||||
|
||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||
"github.com/qdm12/gluetun/internal/models"
|
||||
"github.com/qdm12/gluetun/internal/netlink"
|
||||
"github.com/qdm12/gluetun/internal/portforward"
|
||||
"github.com/qdm12/gluetun/internal/provider"
|
||||
publicipmodels "github.com/qdm12/gluetun/internal/publicip/models"
|
||||
)
|
||||
|
||||
type Firewall interface {
|
||||
SetVPNConnection(ctx context.Context, connection models.Connection, interfaceName string) error
|
||||
SetAllowedPort(ctx context.Context, port uint16, interfaceName string) error
|
||||
RemoveAllowedPort(ctx context.Context, port uint16) error
|
||||
}
|
||||
|
||||
type Routing interface {
|
||||
VPNLocalGatewayIP(vpnInterface string) (gateway net.IP, err error)
|
||||
}
|
||||
|
||||
type PortForward interface {
|
||||
Start(ctx context.Context, data portforward.StartData) (outcome string, err error)
|
||||
Stop(ctx context.Context) (outcome string, err error)
|
||||
}
|
||||
|
||||
type OpenVPN interface {
|
||||
WriteConfig(lines []string) error
|
||||
WriteAuthFile(user, password string) error
|
||||
}
|
||||
|
||||
type StateManager interface {
|
||||
GetSettings() (vpn settings.VPN)
|
||||
SetSettings(ctx context.Context, vpn settings.VPN) (outcome string)
|
||||
}
|
||||
|
||||
type Providers interface {
|
||||
Get(providerName string) provider.Provider
|
||||
}
|
||||
|
||||
type Storage interface {
|
||||
FilterServers(provider string, selection settings.ServerSelection) (servers []models.Server, err error)
|
||||
GetServerByName(provider, name string) (server models.Server, ok bool)
|
||||
}
|
||||
|
||||
type NetLinker interface {
|
||||
AddrAdd(link netlink.Link, addr *netlink.Addr) error
|
||||
IsWireguardSupported() (ok bool, err error)
|
||||
RouteList(link netlink.Link, family int) (
|
||||
routes []netlink.Route, err error)
|
||||
RouteAdd(route *netlink.Route) error
|
||||
RuleAdd(rule *netlink.Rule) error
|
||||
RuleDel(rule *netlink.Rule) error
|
||||
LinkList() (links []netlink.Link, err error)
|
||||
LinkByName(name string) (link netlink.Link, err error)
|
||||
LinkAdd(link netlink.Link) (err error)
|
||||
LinkDel(link netlink.Link) (err error)
|
||||
LinkSetUp(link netlink.Link) (err error)
|
||||
LinkSetDown(link netlink.Link) (err error)
|
||||
}
|
||||
|
||||
type DNSLoop interface {
|
||||
ApplyStatus(ctx context.Context, status models.LoopStatus) (
|
||||
outcome string, err error)
|
||||
GetSettings() (settings settings.DNS)
|
||||
}
|
||||
|
||||
type PublicIPLoop interface {
|
||||
ApplyStatus(ctx context.Context, status models.LoopStatus) (
|
||||
outcome string, err error)
|
||||
SetData(data publicipmodels.IPInfoData)
|
||||
}
|
||||
|
||||
type statusManager interface {
|
||||
GetStatus() (status models.LoopStatus)
|
||||
SetStatus(status models.LoopStatus)
|
||||
ApplyStatus(ctx context.Context, status models.LoopStatus) (
|
||||
outcome string, err error)
|
||||
Lock()
|
||||
Unlock()
|
||||
}
|
||||
|
||||
type runner interface {
|
||||
Run(ctx context.Context, waitError chan<- error, tunnelReady chan<- struct{})
|
||||
}
|
||||
@@ -6,33 +6,16 @@ import (
|
||||
|
||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||
"github.com/qdm12/gluetun/internal/constants"
|
||||
"github.com/qdm12/gluetun/internal/dns"
|
||||
"github.com/qdm12/gluetun/internal/firewall"
|
||||
"github.com/qdm12/gluetun/internal/loopstate"
|
||||
"github.com/qdm12/gluetun/internal/models"
|
||||
"github.com/qdm12/gluetun/internal/netlink"
|
||||
"github.com/qdm12/gluetun/internal/openvpn"
|
||||
"github.com/qdm12/gluetun/internal/portforward"
|
||||
"github.com/qdm12/gluetun/internal/provider"
|
||||
"github.com/qdm12/gluetun/internal/publicip"
|
||||
"github.com/qdm12/gluetun/internal/routing"
|
||||
"github.com/qdm12/gluetun/internal/vpn/state"
|
||||
"github.com/qdm12/golibs/command"
|
||||
"github.com/qdm12/log"
|
||||
)
|
||||
|
||||
var _ Looper = (*Loop)(nil)
|
||||
|
||||
type Looper interface {
|
||||
Runner
|
||||
loopstate.Getter
|
||||
loopstate.Applier
|
||||
SettingsGetSetter
|
||||
}
|
||||
|
||||
type Loop struct {
|
||||
statusManager loopstate.Manager
|
||||
state state.Manager
|
||||
statusManager statusManager
|
||||
state StateManager
|
||||
providers Providers
|
||||
storage Storage
|
||||
// Fixed parameters
|
||||
@@ -40,13 +23,13 @@ type Loop struct {
|
||||
versionInfo bool
|
||||
vpnInputPorts []uint16 // TODO make changeable through stateful firewall
|
||||
// Configurators
|
||||
openvpnConf openvpn.Interface
|
||||
netLinker netlink.NetLinker
|
||||
fw firewallConfigurer
|
||||
routing routing.VPNGetter
|
||||
portForward portforward.StartStopper
|
||||
publicip publicip.Looper
|
||||
dnsLooper dns.Looper
|
||||
openvpnConf OpenVPN
|
||||
netLinker NetLinker
|
||||
fw Firewall
|
||||
routing Routing
|
||||
portForward PortForward
|
||||
publicip PublicIPLoop
|
||||
dnsLooper DNSLoop
|
||||
// Other objects
|
||||
starter command.Starter // for OpenVPN
|
||||
logger log.LoggerInterface
|
||||
@@ -61,29 +44,15 @@ type Loop struct {
|
||||
backoffTime time.Duration
|
||||
}
|
||||
|
||||
type firewallConfigurer interface {
|
||||
firewall.VPNConnectionSetter
|
||||
firewall.PortAllower
|
||||
}
|
||||
|
||||
type Providers interface {
|
||||
Get(providerName string) provider.Provider
|
||||
}
|
||||
|
||||
type Storage interface {
|
||||
FilterServers(provider string, selection settings.ServerSelection) (servers []models.Server, err error)
|
||||
GetServerByName(provider, name string) (server models.Server, ok bool)
|
||||
}
|
||||
|
||||
const (
|
||||
defaultBackoffTime = 15 * time.Second
|
||||
)
|
||||
|
||||
func NewLoop(vpnSettings settings.VPN, vpnInputPorts []uint16,
|
||||
providers Providers, storage Storage, openvpnConf openvpn.Interface,
|
||||
netLinker netlink.NetLinker, fw firewallConfigurer, routing routing.VPNGetter,
|
||||
portForward portforward.StartStopper, starter command.Starter,
|
||||
publicip publicip.Looper, dnsLooper dns.Looper,
|
||||
providers Providers, storage Storage, openvpnConf OpenVPN,
|
||||
netLinker NetLinker, fw Firewall, routing Routing,
|
||||
portForward PortForward, starter command.Starter,
|
||||
publicip PublicIPLoop, dnsLooper DNSLoop,
|
||||
logger log.LoggerInterface, client *http.Client,
|
||||
buildInfo models.BuildInformation, versionInfo bool) *Loop {
|
||||
start := make(chan struct{})
|
||||
|
||||
@@ -5,7 +5,6 @@ import (
|
||||
"fmt"
|
||||
|
||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||
"github.com/qdm12/gluetun/internal/firewall"
|
||||
"github.com/qdm12/gluetun/internal/openvpn"
|
||||
"github.com/qdm12/gluetun/internal/provider"
|
||||
"github.com/qdm12/golibs/command"
|
||||
@@ -13,10 +12,10 @@ import (
|
||||
|
||||
// setupOpenVPN sets OpenVPN up using the configurators and settings given.
|
||||
// It returns a serverName for port forwarding (PIA) and an error if it fails.
|
||||
func setupOpenVPN(ctx context.Context, fw firewall.VPNConnectionSetter,
|
||||
openvpnConf openvpn.Interface, providerConf provider.Provider,
|
||||
func setupOpenVPN(ctx context.Context, fw Firewall,
|
||||
openvpnConf OpenVPN, providerConf provider.Provider,
|
||||
settings settings.VPN, starter command.Starter, logger openvpn.Logger) (
|
||||
runner vpnRunner, serverName string, err error) {
|
||||
runner *openvpn.Runner, serverName string, err error) {
|
||||
connection, err := providerConf.GetConnection(settings.Provider.ServerSelection)
|
||||
if err != nil {
|
||||
return nil, "", fmt.Errorf("failed finding a valid server connection: %w", err)
|
||||
|
||||
@@ -8,14 +8,6 @@ import (
|
||||
"github.com/qdm12/log"
|
||||
)
|
||||
|
||||
type Runner interface {
|
||||
Run(ctx context.Context, done chan<- struct{})
|
||||
}
|
||||
|
||||
type vpnRunner interface {
|
||||
Run(ctx context.Context, errCh chan<- error, ready chan<- struct{})
|
||||
}
|
||||
|
||||
func (l *Loop) Run(ctx context.Context, done chan<- struct{}) {
|
||||
defer close(done)
|
||||
|
||||
@@ -31,7 +23,7 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) {
|
||||
providerConf := l.providers.Get(*settings.Provider.Name)
|
||||
|
||||
portForwarding := *settings.Provider.PortForwarding.Enabled
|
||||
var vpnRunner vpnRunner
|
||||
var vpnRunner runner
|
||||
var serverName, vpnInterface string
|
||||
var err error
|
||||
subLogger := l.logger.New(log.SetComponent(settings.Type))
|
||||
|
||||
@@ -4,11 +4,8 @@ import (
|
||||
"context"
|
||||
|
||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||
"github.com/qdm12/gluetun/internal/vpn/state"
|
||||
)
|
||||
|
||||
type SettingsGetSetter = state.SettingsGetSetter
|
||||
|
||||
func (l *Loop) GetSettings() (settings settings.VPN) {
|
||||
return l.state.GetSettings()
|
||||
}
|
||||
|
||||
@@ -1,19 +1,14 @@
|
||||
package state
|
||||
|
||||
import (
|
||||
"context"
|
||||
"sync"
|
||||
|
||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||
"github.com/qdm12/gluetun/internal/loopstate"
|
||||
"github.com/qdm12/gluetun/internal/models"
|
||||
)
|
||||
|
||||
var _ Manager = (*State)(nil)
|
||||
|
||||
type Manager interface {
|
||||
SettingsGetSetter
|
||||
}
|
||||
|
||||
func New(statusApplier loopstate.Applier, vpn settings.VPN) *State {
|
||||
func New(statusApplier StatusApplier, vpn settings.VPN) *State {
|
||||
return &State{
|
||||
statusApplier: statusApplier,
|
||||
vpn: vpn,
|
||||
@@ -21,8 +16,13 @@ func New(statusApplier loopstate.Applier, vpn settings.VPN) *State {
|
||||
}
|
||||
|
||||
type State struct {
|
||||
statusApplier loopstate.Applier
|
||||
statusApplier StatusApplier
|
||||
|
||||
vpn settings.VPN
|
||||
settingsMu sync.RWMutex
|
||||
}
|
||||
|
||||
type StatusApplier interface {
|
||||
ApplyStatus(ctx context.Context, status models.LoopStatus) (
|
||||
outcome string, err error)
|
||||
}
|
||||
|
||||
@@ -8,11 +8,6 @@ import (
|
||||
"github.com/qdm12/gluetun/internal/constants"
|
||||
)
|
||||
|
||||
type SettingsGetSetter interface {
|
||||
GetSettings() (vpn settings.VPN)
|
||||
SetSettings(ctx context.Context, vpn settings.VPN) (outcome string)
|
||||
}
|
||||
|
||||
func (s *State) GetSettings() (vpn settings.VPN) {
|
||||
s.settingsMu.RLock()
|
||||
vpn = s.vpn
|
||||
|
||||
@@ -5,8 +5,6 @@ import (
|
||||
"fmt"
|
||||
|
||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||
"github.com/qdm12/gluetun/internal/firewall"
|
||||
"github.com/qdm12/gluetun/internal/netlink"
|
||||
"github.com/qdm12/gluetun/internal/provider"
|
||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||
"github.com/qdm12/gluetun/internal/wireguard"
|
||||
@@ -14,10 +12,10 @@ import (
|
||||
|
||||
// setupWireguard sets Wireguard up using the configurators and settings given.
|
||||
// It returns a serverName for port forwarding (PIA) and an error if it fails.
|
||||
func setupWireguard(ctx context.Context, netlinker netlink.NetLinker,
|
||||
fw firewall.VPNConnectionSetter, providerConf provider.Provider,
|
||||
func setupWireguard(ctx context.Context, netlinker NetLinker,
|
||||
fw Firewall, providerConf provider.Provider,
|
||||
settings settings.VPN, logger wireguard.Logger) (
|
||||
wireguarder wireguard.Wireguarder, serverName string, err error) {
|
||||
wireguarder *wireguard.Wireguard, serverName string, err error) {
|
||||
connection, err := providerConf.GetConnection(settings.Provider.ServerSelection)
|
||||
if err != nil {
|
||||
return nil, "", fmt.Errorf("failed finding a VPN server: %w", err)
|
||||
|
||||
Reference in New Issue
Block a user