package vpn import ( "context" "fmt" "github.com/qdm12/gluetun/internal/configuration/settings" "github.com/qdm12/gluetun/internal/models" "github.com/qdm12/gluetun/internal/provider" "github.com/qdm12/gluetun/internal/provider/utils" "github.com/qdm12/gluetun/internal/wireguard" "github.com/qdm12/gosettings" ) // 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 NetLinker, fw Firewall, providerConf provider.Provider, settings settings.VPN, ipv6Supported bool, logger wireguard.Logger) ( wireguarder *wireguard.Wireguard, connection models.Connection, err error, ) { connection, err = providerConf.GetConnection(settings.Provider.ServerSelection, ipv6Supported) if err != nil { return nil, models.Connection{}, fmt.Errorf("finding a VPN server: %w", err) } wireguardSettings := utils.BuildWireguardSettings(connection, settings.Wireguard, ipv6Supported) logger.Debug("Wireguard server public key: " + wireguardSettings.PublicKey) logger.Debug("Wireguard client private key: " + gosettings.ObfuscateKey(wireguardSettings.PrivateKey)) logger.Debug("Wireguard pre-shared key: " + gosettings.ObfuscateKey(wireguardSettings.PreSharedKey)) wireguarder, err = wireguard.New(wireguardSettings, netlinker, logger) if err != nil { return nil, models.Connection{}, fmt.Errorf("creating Wireguard: %w", err) } err = fw.SetVPNConnection(ctx, connection, settings.Wireguard.Interface) if err != nil { return nil, models.Connection{}, fmt.Errorf("setting firewall: %w", err) } return wireguarder, connection, nil }