- From now only a single OpenVPN connection is written to the OpenVPN configuration file - If multiple connections are matched given the user parameters (i.e. city, region), it is picked at pseudo random using the current time as the pseudo random seed. - Not relying on Openvpn picking a random remote address, may refer to #229 - Program is aware of which connection is to be used, in order to use its matching CN for port forwarding TLS verification with PIA v4 servers, see #236 - Simplified firewall mechanisms
38 lines
763 B
Go
38 lines
763 B
Go
package provider
|
|
|
|
import (
|
|
"context"
|
|
"math/rand"
|
|
"time"
|
|
|
|
"github.com/qdm12/gluetun/internal/models"
|
|
"github.com/qdm12/golibs/logging"
|
|
)
|
|
|
|
type timeNowFunc func() time.Time
|
|
|
|
func tryUntilSuccessful(ctx context.Context, logger logging.Logger, fn func() error) {
|
|
const retryPeriod = 10 * time.Second
|
|
for {
|
|
err := fn()
|
|
if err == nil {
|
|
break
|
|
}
|
|
logger.Error(err)
|
|
logger.Info("Trying again in %s", retryPeriod)
|
|
timer := time.NewTimer(retryPeriod)
|
|
select {
|
|
case <-timer.C:
|
|
case <-ctx.Done():
|
|
if !timer.Stop() {
|
|
<-timer.C
|
|
}
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
func pickRandomConnection(connections []models.OpenVPNConnection, source rand.Source) models.OpenVPNConnection {
|
|
return connections[rand.New(source).Intn(len(connections))] //nolint:gosec
|
|
}
|