From 7a1d0ff3ec43118bc55f0b135a91b455360b672e Mon Sep 17 00:00:00 2001 From: "Quentin McGaw (desktop)" Date: Wed, 18 Aug 2021 20:43:47 +0000 Subject: [PATCH] Maint: internal/openvpn setup.go file --- internal/openvpn/run.go | 34 ++-------------------- internal/openvpn/setup.go | 59 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 32 deletions(-) create mode 100644 internal/openvpn/setup.go diff --git a/internal/openvpn/run.go b/internal/openvpn/run.go index 252f6460..6c330ff9 100644 --- a/internal/openvpn/run.go +++ b/internal/openvpn/run.go @@ -5,8 +5,6 @@ import ( "time" "github.com/qdm12/gluetun/internal/constants" - "github.com/qdm12/gluetun/internal/models" - "github.com/qdm12/gluetun/internal/openvpn/custom" "github.com/qdm12/gluetun/internal/provider" ) @@ -28,40 +26,12 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) { providerConf := provider.New(providerSettings.Name, allServers, time.Now) - var connection models.OpenVPNConnection - var lines []string - var err error - if openVPNSettings.Config == "" { - connection, err = providerConf.GetOpenVPNConnection(providerSettings.ServerSelection) - if err == nil { - lines = providerConf.BuildConf(connection, openVPNSettings) - } - } else { - lines, connection, err = custom.BuildConfig(openVPNSettings) - } + serverName, err := setup(ctx, l.fw, l.openvpnConf, providerConf, openVPNSettings, providerSettings) if err != nil { l.crashed(ctx, err) continue } - if err := l.openvpnConf.WriteConfig(lines); err != nil { - l.crashed(ctx, err) - continue - } - - if openVPNSettings.User != "" { - err := l.openvpnConf.WriteAuthFile(openVPNSettings.User, openVPNSettings.Password) - if err != nil { - l.crashed(ctx, err) - continue - } - } - - if err := l.fw.SetVPNConnection(ctx, connection); err != nil { - l.crashed(ctx, err) - continue - } - openvpnCtx, openvpnCancel := context.WithCancel(context.Background()) stdoutLines, stderrLines, waitError, err := l.openvpnConf.Start( @@ -76,7 +46,7 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) { lineCollectionDone := make(chan struct{}) tunnelUpData := tunnelUpData{ portForwarding: providerSettings.PortForwarding.Enabled, - serverName: connection.Hostname, + serverName: serverName, portForwarder: providerConf, } go l.collectLines(linesCollectionCtx, lineCollectionDone, diff --git a/internal/openvpn/setup.go b/internal/openvpn/setup.go new file mode 100644 index 00000000..7ccadfaa --- /dev/null +++ b/internal/openvpn/setup.go @@ -0,0 +1,59 @@ +package openvpn + +import ( + "context" + "errors" + "fmt" + + "github.com/qdm12/gluetun/internal/configuration" + "github.com/qdm12/gluetun/internal/firewall" + "github.com/qdm12/gluetun/internal/models" + "github.com/qdm12/gluetun/internal/openvpn/config" + "github.com/qdm12/gluetun/internal/openvpn/custom" + "github.com/qdm12/gluetun/internal/provider" +) + +var ( + errBuildConfig = errors.New("failed building configuration") + errWriteConfig = errors.New("failed writing configuration to file") + errWriteAuth = errors.New("failed writing auth to file") + errFirewall = errors.New("failed allowing VPN connection through firewall") +) + +// setup sets OpenVPN up using the configurators and settings given. +// It returns a serverName for port forwarding (PIA) and an error if it fails. +func setup(ctx context.Context, fw firewall.VPNConnectionSetter, + openvpnConf config.Interface, providerConf provider.Provider, + openVPNSettings configuration.OpenVPN, providerSettings configuration.Provider) ( + serverName string, err error) { + var connection models.OpenVPNConnection + var lines []string + if openVPNSettings.Config == "" { + connection, err = providerConf.GetOpenVPNConnection(providerSettings.ServerSelection) + if err == nil { + lines = providerConf.BuildConf(connection, openVPNSettings) + } + } else { + lines, connection, err = custom.BuildConfig(openVPNSettings) + } + if err != nil { + return "", fmt.Errorf("%w: %s", errBuildConfig, err) + } + + if err := openvpnConf.WriteConfig(lines); err != nil { + return "", fmt.Errorf("%w: %s", errWriteConfig, err) + } + + if openVPNSettings.User != "" { + err := openvpnConf.WriteAuthFile(openVPNSettings.User, openVPNSettings.Password) + if err != nil { + return "", fmt.Errorf("%w: %s", errWriteAuth, err) + } + } + + if err := fw.SetVPNConnection(ctx, connection); err != nil { + return "", fmt.Errorf("%w: %s", errFirewall, err) + } + + return connection.Hostname, nil +}