chore(all): review error wrappings
- remove repetitive `cannot` and `failed` prefixes - rename `unmarshaling` to `decoding`
This commit is contained in:
@@ -245,7 +245,7 @@ func _main(ctx context.Context, buildInfo models.BuildInformation,
|
|||||||
allSettings.Pprof.HTTPServer.Logger = logger.New(log.SetComponent("pprof"))
|
allSettings.Pprof.HTTPServer.Logger = logger.New(log.SetComponent("pprof"))
|
||||||
pprofServer, err := pprof.New(allSettings.Pprof)
|
pprofServer, err := pprof.New(allSettings.Pprof)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot create Pprof server: %w", err)
|
return fmt.Errorf("creating Pprof server: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
puid, pgid := int(*allSettings.System.PUID), int(*allSettings.System.PGID)
|
puid, pgid := int(*allSettings.System.PUID), int(*allSettings.System.PGID)
|
||||||
@@ -291,7 +291,7 @@ func _main(ctx context.Context, buildInfo models.BuildInformation,
|
|||||||
const defaultUsername = "nonrootuser"
|
const defaultUsername = "nonrootuser"
|
||||||
nonRootUsername, err := alpineConf.CreateUser(defaultUsername, puid)
|
nonRootUsername, err := alpineConf.CreateUser(defaultUsername, puid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot create user: %w", err)
|
return fmt.Errorf("creating user: %w", err)
|
||||||
}
|
}
|
||||||
if nonRootUsername != defaultUsername {
|
if nonRootUsername != defaultUsername {
|
||||||
logger.Info("using existing username " + nonRootUsername + " corresponding to user id " + fmt.Sprint(puid))
|
logger.Info("using existing username " + nonRootUsername + " corresponding to user id " + fmt.Sprint(puid))
|
||||||
@@ -309,7 +309,7 @@ func _main(ctx context.Context, buildInfo models.BuildInformation,
|
|||||||
if strings.Contains(err.Error(), "operation not permitted") {
|
if strings.Contains(err.Error(), "operation not permitted") {
|
||||||
logger.Warn("💡 Tip: Are you passing NET_ADMIN capability to gluetun?")
|
logger.Warn("💡 Tip: Are you passing NET_ADMIN capability to gluetun?")
|
||||||
}
|
}
|
||||||
return fmt.Errorf("cannot setup routing: %w", err)
|
return fmt.Errorf("setting up routing: %w", err)
|
||||||
}
|
}
|
||||||
defer func() {
|
defer func() {
|
||||||
routingLogger.Info("routing cleanup...")
|
routingLogger.Info("routing cleanup...")
|
||||||
@@ -458,7 +458,7 @@ func _main(ctx context.Context, buildInfo models.BuildInformation,
|
|||||||
buildInfo, vpnLooper, portForwardLooper, unboundLooper, updaterLooper, publicIPLooper,
|
buildInfo, vpnLooper, portForwardLooper, unboundLooper, updaterLooper, publicIPLooper,
|
||||||
storage, ipv6Supported)
|
storage, ipv6Supported)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot setup control server: %w", err)
|
return fmt.Errorf("setting up control server: %w", err)
|
||||||
}
|
}
|
||||||
httpServerReady := make(chan struct{})
|
httpServerReady := make(chan struct{})
|
||||||
go httpServer.Run(httpServerCtx, httpServerReady, httpServerDone)
|
go httpServer.Run(httpServerCtx, httpServerReady, httpServerDone)
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ func (c *CLI) FormatServers(args []string) error {
|
|||||||
logger := newNoopLogger()
|
logger := newNoopLogger()
|
||||||
storage, err := storage.New(logger, constants.ServersData)
|
storage, err := storage.New(logger, constants.ServersData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot create servers storage: %w", err)
|
return fmt.Errorf("creating servers storage: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
formatted := storage.FormatToMarkdown(providerToFormat)
|
formatted := storage.FormatToMarkdown(providerToFormat)
|
||||||
@@ -81,18 +81,18 @@ func (c *CLI) FormatServers(args []string) error {
|
|||||||
output = filepath.Clean(output)
|
output = filepath.Clean(output)
|
||||||
file, err := os.OpenFile(output, os.O_TRUNC|os.O_WRONLY|os.O_CREATE, 0644)
|
file, err := os.OpenFile(output, os.O_TRUNC|os.O_WRONLY|os.O_CREATE, 0644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot open output file: %w", err)
|
return fmt.Errorf("opening output file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = fmt.Fprint(file, formatted)
|
_, err = fmt.Fprint(file, formatted)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
_ = file.Close()
|
_ = file.Close()
|
||||||
return fmt.Errorf("cannot write to output file: %w", err)
|
return fmt.Errorf("writing to output file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = file.Close()
|
err = file.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot close output file: %w", err)
|
return fmt.Errorf("closing output file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ func (c *CLI) Update(ctx context.Context, args []string, logger UpdaterLogger) e
|
|||||||
|
|
||||||
storage, err := storage.New(logger, constants.ServersData)
|
storage, err := storage.New(logger, constants.ServersData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot create servers storage: %w", err)
|
return fmt.Errorf("creating servers storage: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
const clientTimeout = 10 * time.Second
|
const clientTimeout = 10 * time.Second
|
||||||
@@ -88,13 +88,13 @@ func (c *CLI) Update(ctx context.Context, args []string, logger UpdaterLogger) e
|
|||||||
updater := updater.New(httpClient, storage, providers, logger)
|
updater := updater.New(httpClient, storage, providers, logger)
|
||||||
err = updater.UpdateServers(ctx, options.Providers, options.MinRatio)
|
err = updater.UpdateServers(ctx, options.Providers, options.MinRatio)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot update server information: %w", err)
|
return fmt.Errorf("updating server information: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if maintainerMode {
|
if maintainerMode {
|
||||||
err := storage.FlushToFile(c.repoServersPath)
|
err := storage.FlushToFile(c.repoServersPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot write servers data to embedded JSON file: %w", err)
|
return fmt.Errorf("writing servers data to embedded JSON file: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ type DNS struct {
|
|||||||
func (d DNS) validate() (err error) {
|
func (d DNS) validate() (err error) {
|
||||||
err = d.DoT.validate()
|
err = d.DoT.validate()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed validating DoT settings: %w", err)
|
return fmt.Errorf("validating DoT settings: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ func validateOpenVPNConfigFilepath(isCustom bool,
|
|||||||
extractor := extract.New()
|
extractor := extract.New()
|
||||||
_, _, err = extractor.Data(confFile)
|
_, _, err = extractor.Data(confFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed extracting information from custom configuration file: %w", err)
|
return fmt.Errorf("extracting information from custom configuration file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ func stringsToIPNets(ss []string) (ipNets []net.IPNet, err error) {
|
|||||||
for i, s := range ss {
|
for i, s := range ss {
|
||||||
ip, ipNet, err := net.ParseCIDR(s)
|
ip, ipNet, err := net.ParseCIDR(s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot parse IP network %q: %w", s, err)
|
return nil, fmt.Errorf("parsing IP network %q: %w", s, err)
|
||||||
}
|
}
|
||||||
ipNet.IP = ip
|
ipNet.IP = ip
|
||||||
ipNets[i] = *ipNet
|
ipNets[i] = *ipNet
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ func unsetEnvKeys(envKeys []string, err error) (newErr error) {
|
|||||||
for _, envKey := range envKeys {
|
for _, envKey := range envKeys {
|
||||||
unsetErr := os.Unsetenv(envKey)
|
unsetErr := os.Unsetenv(envKey)
|
||||||
if unsetErr != nil && newErr == nil {
|
if unsetErr != nil && newErr == nil {
|
||||||
newErr = fmt.Errorf("cannot unset environment variable %s: %w", envKey, unsetErr)
|
newErr = fmt.Errorf("unsetting environment variable %s: %w", envKey, unsetErr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return newErr
|
return newErr
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ func readHTTPProxy() (settings settings.HTTPProxy, err error) {
|
|||||||
"/run/secrets/httpproxy_user",
|
"/run/secrets/httpproxy_user",
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return settings, fmt.Errorf("cannot read HTTP proxy user secret file: %w", err)
|
return settings, fmt.Errorf("reading HTTP proxy user secret file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
settings.Password, err = readSecretFileAsStringPtr(
|
settings.Password, err = readSecretFileAsStringPtr(
|
||||||
@@ -20,7 +20,7 @@ func readHTTPProxy() (settings settings.HTTPProxy, err error) {
|
|||||||
"/run/secrets/httpproxy_password",
|
"/run/secrets/httpproxy_password",
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return settings, fmt.Errorf("cannot read OpenVPN password secret file: %w", err)
|
return settings, fmt.Errorf("reading OpenVPN password secret file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return settings, nil
|
return settings, nil
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ func readOpenVPN() (
|
|||||||
"/run/secrets/openvpn_user",
|
"/run/secrets/openvpn_user",
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return settings, fmt.Errorf("cannot read user file: %w", err)
|
return settings, fmt.Errorf("reading user file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
settings.Password, err = readSecretFileAsStringPtr(
|
settings.Password, err = readSecretFileAsStringPtr(
|
||||||
@@ -21,7 +21,7 @@ func readOpenVPN() (
|
|||||||
"/run/secrets/openvpn_password",
|
"/run/secrets/openvpn_password",
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return settings, fmt.Errorf("cannot read password file: %w", err)
|
return settings, fmt.Errorf("reading password file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
settings.Key, err = readPEMSecretFile(
|
settings.Key, err = readPEMSecretFile(
|
||||||
@@ -29,7 +29,7 @@ func readOpenVPN() (
|
|||||||
"/run/secrets/openvpn_clientkey",
|
"/run/secrets/openvpn_clientkey",
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return settings, fmt.Errorf("cannot read client key file: %w", err)
|
return settings, fmt.Errorf("reading client key file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
settings.EncryptedKey, err = readPEMSecretFile(
|
settings.EncryptedKey, err = readPEMSecretFile(
|
||||||
@@ -53,7 +53,7 @@ func readOpenVPN() (
|
|||||||
"/run/secrets/openvpn_clientcrt",
|
"/run/secrets/openvpn_clientcrt",
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return settings, fmt.Errorf("cannot read client certificate file: %w", err)
|
return settings, fmt.Errorf("reading client certificate file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return settings, nil
|
return settings, nil
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ func readShadowsocks() (settings settings.Shadowsocks, err error) {
|
|||||||
"/run/secrets/shadowsocks_password",
|
"/run/secrets/shadowsocks_password",
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return settings, fmt.Errorf("cannot read Shadowsocks password secret file: %w", err)
|
return settings, fmt.Errorf("reading Shadowsocks password secret file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return settings, nil
|
return settings, nil
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
func readVPN() (vpn settings.VPN, err error) {
|
func readVPN() (vpn settings.VPN, err error) {
|
||||||
vpn.OpenVPN, err = readOpenVPN()
|
vpn.OpenVPN, err = readOpenVPN()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return vpn, fmt.Errorf("cannot read OpenVPN settings: %w", err)
|
return vpn, fmt.Errorf("reading OpenVPN settings: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return vpn, nil
|
return vpn, nil
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ func (c *Config) SetEnabled(ctx context.Context, enabled bool) (err error) {
|
|||||||
if !enabled {
|
if !enabled {
|
||||||
c.logger.Info("disabling...")
|
c.logger.Info("disabling...")
|
||||||
if err = c.disable(ctx); err != nil {
|
if err = c.disable(ctx); err != nil {
|
||||||
return fmt.Errorf("cannot disable firewall: %w", err)
|
return fmt.Errorf("disabling firewall: %w", err)
|
||||||
}
|
}
|
||||||
c.enabled = false
|
c.enabled = false
|
||||||
c.logger.Info("disabled successfully")
|
c.logger.Info("disabled successfully")
|
||||||
@@ -31,7 +31,7 @@ func (c *Config) SetEnabled(ctx context.Context, enabled bool) (err error) {
|
|||||||
c.logger.Info("enabling...")
|
c.logger.Info("enabling...")
|
||||||
|
|
||||||
if err := c.enable(ctx); err != nil {
|
if err := c.enable(ctx); err != nil {
|
||||||
return fmt.Errorf("cannot enable firewall: %w", err)
|
return fmt.Errorf("enabling firewall: %w", err)
|
||||||
}
|
}
|
||||||
c.enabled = true
|
c.enabled = true
|
||||||
c.logger.Info("enabled successfully")
|
c.logger.Info("enabled successfully")
|
||||||
@@ -41,13 +41,13 @@ func (c *Config) SetEnabled(ctx context.Context, enabled bool) (err error) {
|
|||||||
|
|
||||||
func (c *Config) disable(ctx context.Context) (err error) {
|
func (c *Config) disable(ctx context.Context) (err error) {
|
||||||
if err = c.clearAllRules(ctx); err != nil {
|
if err = c.clearAllRules(ctx); err != nil {
|
||||||
return fmt.Errorf("cannot clear all rules: %w", err)
|
return fmt.Errorf("clearing all rules: %w", err)
|
||||||
}
|
}
|
||||||
if err = c.setIPv4AllPolicies(ctx, "ACCEPT"); err != nil {
|
if err = c.setIPv4AllPolicies(ctx, "ACCEPT"); err != nil {
|
||||||
return fmt.Errorf("cannot set ipv4 policies: %w", err)
|
return fmt.Errorf("setting ipv4 policies: %w", err)
|
||||||
}
|
}
|
||||||
if err = c.setIPv6AllPolicies(ctx, "ACCEPT"); err != nil {
|
if err = c.setIPv6AllPolicies(ctx, "ACCEPT"); err != nil {
|
||||||
return fmt.Errorf("cannot set ipv6 policies: %w", err)
|
return fmt.Errorf("setting ipv6 policies: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -123,7 +123,7 @@ func (c *Config) enable(ctx context.Context) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := c.runUserPostRules(ctx, c.customRulesPath, remove); err != nil {
|
if err := c.runUserPostRules(ctx, c.customRulesPath, remove); err != nil {
|
||||||
return fmt.Errorf("cannot run user defined post firewall rules: %w", err)
|
return fmt.Errorf("running user defined post firewall rules: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -138,7 +138,7 @@ func (c *Config) allowVPNIP(ctx context.Context) (err error) {
|
|||||||
for _, defaultRoute := range c.defaultRoutes {
|
for _, defaultRoute := range c.defaultRoutes {
|
||||||
err = c.acceptOutputTrafficToVPN(ctx, defaultRoute.NetInterface, c.vpnConnection, remove)
|
err = c.acceptOutputTrafficToVPN(ctx, defaultRoute.NetInterface, c.vpnConnection, remove)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot accept output traffic through VPN: %w", err)
|
return fmt.Errorf("accepting output traffic through VPN: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,7 +165,7 @@ func (c *Config) allowInputPorts(ctx context.Context) (err error) {
|
|||||||
const remove = false
|
const remove = false
|
||||||
err = c.acceptInputToPort(ctx, netInterface, port, remove)
|
err = c.acceptInputToPort(ctx, netInterface, port, remove)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot accept input port %d on interface %s: %w",
|
return fmt.Errorf("accepting input port %d on interface %s: %w",
|
||||||
port, netInterface, err)
|
port, netInterface, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -257,7 +257,7 @@ func (c *Config) runUserPostRules(ctx context.Context, filepath string, remove b
|
|||||||
case ipv4:
|
case ipv4:
|
||||||
err = c.runIptablesInstruction(ctx, rule)
|
err = c.runIptablesInstruction(ctx, rule)
|
||||||
case c.ip6Tables == "":
|
case c.ip6Tables == "":
|
||||||
err = fmt.Errorf("cannot run user ip6tables rule: %w", ErrNeedIP6Tables)
|
err = fmt.Errorf("running user ip6tables rule: %w", ErrNeedIP6Tables)
|
||||||
default: // ipv6
|
default: // ipv6
|
||||||
err = c.runIP6tablesInstruction(ctx, rule)
|
err = c.runIP6tablesInstruction(ctx, rule)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ func (c *Config) SetOutboundSubnets(ctx context.Context, subnets []net.IPNet) (e
|
|||||||
|
|
||||||
c.removeOutboundSubnets(ctx, subnetsToRemove)
|
c.removeOutboundSubnets(ctx, subnetsToRemove)
|
||||||
if err := c.addOutboundSubnets(ctx, subnetsToAdd); err != nil {
|
if err := c.addOutboundSubnets(ctx, subnetsToAdd); err != nil {
|
||||||
return fmt.Errorf("cannot set allowed outbound subnets: %w", err)
|
return fmt.Errorf("setting allowed outbound subnets: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ func (c *Config) SetAllowedPort(ctx context.Context, port uint16, intf string) (
|
|||||||
|
|
||||||
const remove = false
|
const remove = false
|
||||||
if err := c.acceptInputToPort(ctx, intf, port, remove); err != nil {
|
if err := c.acceptInputToPort(ctx, intf, port, remove); err != nil {
|
||||||
return fmt.Errorf("cannot allow input to port %d through interface %s: %w",
|
return fmt.Errorf("allowing input to port %d through interface %s: %w",
|
||||||
port, intf, err)
|
port, intf, err)
|
||||||
}
|
}
|
||||||
netInterfaces[intf] = struct{}{}
|
netInterfaces[intf] = struct{}{}
|
||||||
@@ -70,7 +70,7 @@ func (c *Config) RemoveAllowedPort(ctx context.Context, port uint16) (err error)
|
|||||||
for netInterface := range interfacesSet {
|
for netInterface := range interfacesSet {
|
||||||
err := c.acceptInputToPort(ctx, netInterface, port, remove)
|
err := c.acceptInputToPort(ctx, netInterface, port, remove)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot remove allowed port %d on interface %s: %w",
|
return fmt.Errorf("removing allowed port %d on interface %s: %w",
|
||||||
port, netInterface, err)
|
port, netInterface, err)
|
||||||
}
|
}
|
||||||
delete(interfacesSet, netInterface)
|
delete(interfacesSet, netInterface)
|
||||||
|
|||||||
@@ -45,13 +45,13 @@ func (c *Config) SetVPNConnection(ctx context.Context,
|
|||||||
|
|
||||||
for _, defaultRoute := range c.defaultRoutes {
|
for _, defaultRoute := range c.defaultRoutes {
|
||||||
if err := c.acceptOutputTrafficToVPN(ctx, defaultRoute.NetInterface, connection, remove); err != nil {
|
if err := c.acceptOutputTrafficToVPN(ctx, defaultRoute.NetInterface, connection, remove); err != nil {
|
||||||
return fmt.Errorf("cannot allow output traffic through VPN connection: %w", err)
|
return fmt.Errorf("allowing output traffic through VPN connection: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
c.vpnConnection = connection
|
c.vpnConnection = connection
|
||||||
|
|
||||||
if err = c.acceptOutputThroughInterface(ctx, vpnIntf, remove); err != nil {
|
if err = c.acceptOutputThroughInterface(ctx, vpnIntf, remove); err != nil {
|
||||||
return fmt.Errorf("cannot accept output traffic through interface %s: %w", vpnIntf, err)
|
return fmt.Errorf("accepting output traffic through interface %s: %w", vpnIntf, err)
|
||||||
}
|
}
|
||||||
c.vpnIntf = vpnIntf
|
c.vpnIntf = vpnIntf
|
||||||
|
|
||||||
|
|||||||
@@ -74,12 +74,12 @@ func (s *Server) healthCheck(ctx context.Context) (err error) {
|
|||||||
const dialNetwork = "tcp4"
|
const dialNetwork = "tcp4"
|
||||||
connection, err := s.dialer.DialContext(ctx, dialNetwork, address)
|
connection, err := s.dialer.DialContext(ctx, dialNetwork, address)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot dial: %w", err)
|
return fmt.Errorf("dialing: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = connection.Close()
|
err = connection.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot close connection: %w", err)
|
return fmt.Errorf("closing connection: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -91,7 +91,7 @@ func makeAddressToDial(address string) (addressToDial string, err error) {
|
|||||||
addrErr := new(net.AddrError)
|
addrErr := new(net.AddrError)
|
||||||
ok := errors.As(err, &addrErr)
|
ok := errors.As(err, &addrErr)
|
||||||
if !ok || addrErr.Err != "missing port in address" {
|
if !ok || addrErr.Err != "missing port in address" {
|
||||||
return "", fmt.Errorf("cannot split host and port from address: %w", err)
|
return "", fmt.Errorf("splitting host and port from address: %w", err)
|
||||||
}
|
}
|
||||||
host = address
|
host = address
|
||||||
const defaultPort = "443"
|
const defaultPort = "443"
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ func Test_makeAddressToDial(t *testing.T) {
|
|||||||
},
|
},
|
||||||
"bad address": {
|
"bad address": {
|
||||||
address: "test.com::",
|
address: "test.com::",
|
||||||
err: fmt.Errorf("cannot split host and port from address: address test.com::: too many colons in address"), //nolint:lll
|
err: fmt.Errorf("splitting host and port from address: address test.com::: too many colons in address"), //nolint:lll
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,13 +27,13 @@ func (a *AllServers) MarshalJSON() (data []byte, err error) {
|
|||||||
|
|
||||||
_, err = buffer.WriteString("{")
|
_, err = buffer.WriteString("{")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot write opening bracket: %w", err)
|
return nil, fmt.Errorf("writing opening bracket: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
versionString := fmt.Sprintf(`"version":%d`, a.Version)
|
versionString := fmt.Sprintf(`"version":%d`, a.Version)
|
||||||
_, err = buffer.WriteString(versionString)
|
_, err = buffer.WriteString(versionString)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot write schema version string: %w", err)
|
return nil, fmt.Errorf("writing schema version string: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
sortedProviders := make(sort.StringSlice, 0, len(a.ProviderToServers))
|
sortedProviders := make(sort.StringSlice, 0, len(a.ProviderToServers))
|
||||||
@@ -46,26 +46,26 @@ func (a *AllServers) MarshalJSON() (data []byte, err error) {
|
|||||||
providerKey := fmt.Sprintf(`,"%s":`, provider)
|
providerKey := fmt.Sprintf(`,"%s":`, provider)
|
||||||
_, err = buffer.WriteString(providerKey)
|
_, err = buffer.WriteString(providerKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot write provider key %s: %w",
|
return nil, fmt.Errorf("writing provider key %s: %w",
|
||||||
providerKey, err)
|
providerKey, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
servers := a.ProviderToServers[provider]
|
servers := a.ProviderToServers[provider]
|
||||||
serversJSON, err := json.Marshal(servers)
|
serversJSON, err := json.Marshal(servers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed encoding servers for provider %s: %w",
|
return nil, fmt.Errorf("encoding servers for provider %s: %w",
|
||||||
provider, err)
|
provider, err)
|
||||||
}
|
}
|
||||||
_, err = buffer.Write(serversJSON)
|
_, err = buffer.Write(serversJSON)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot write JSON servers data for provider %s: %w",
|
return nil, fmt.Errorf("writing JSON servers data for provider %s: %w",
|
||||||
provider, err)
|
provider, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = buffer.WriteString("}")
|
_, err = buffer.WriteString("}")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot write closing bracket: %w", err)
|
return nil, fmt.Errorf("writing closing bracket: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return buffer.Bytes(), nil
|
return buffer.Bytes(), nil
|
||||||
@@ -127,14 +127,14 @@ func (a *AllServers) UnmarshalJSON(data []byte) (err error) {
|
|||||||
|
|
||||||
jsonValue, err := json.Marshal(value)
|
jsonValue, err := json.Marshal(value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot marshal %s servers: %w",
|
return fmt.Errorf("encoding %s servers: %w",
|
||||||
key, err)
|
key, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var servers Servers
|
var servers Servers
|
||||||
err = json.Unmarshal(jsonValue, &servers)
|
err = json.Unmarshal(jsonValue, &servers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot unmarshal %s servers: %w",
|
return fmt.Errorf("decoding %s servers: %w",
|
||||||
key, err)
|
key, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ const (
|
|||||||
func (n *NetLink) IsWireguardSupported() (ok bool, err error) {
|
func (n *NetLink) IsWireguardSupported() (ok bool, err error) {
|
||||||
families, err := netlink.GenlFamilyList()
|
families, err := netlink.GenlFamilyList()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, fmt.Errorf("cannot list gen 1 families: %w", err)
|
return false, fmt.Errorf("listing gen 1 families: %w", err)
|
||||||
}
|
}
|
||||||
for _, family := range families {
|
for _, family := range families {
|
||||||
if family.Name == "wireguard" {
|
if family.Name == "wireguard" {
|
||||||
|
|||||||
@@ -17,12 +17,12 @@ func (e *Extractor) Data(filepath string) (lines []string,
|
|||||||
connection models.Connection, err error) {
|
connection models.Connection, err error) {
|
||||||
lines, err = readCustomConfigLines(filepath)
|
lines, err = readCustomConfigLines(filepath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, connection, fmt.Errorf("cannot read configuration file: %w", err)
|
return nil, connection, fmt.Errorf("reading configuration file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
connection, err = extractDataFromLines(lines)
|
connection, err = extractDataFromLines(lines)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, connection, fmt.Errorf("cannot extract connection from file: %w", err)
|
return nil, connection, fmt.Errorf("extracting connection from file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return lines, connection, nil
|
return lines, connection, nil
|
||||||
|
|||||||
@@ -54,14 +54,14 @@ func extractDataFromLine(line string) (
|
|||||||
case strings.HasPrefix(line, "proto "):
|
case strings.HasPrefix(line, "proto "):
|
||||||
protocol, err = extractProto(line)
|
protocol, err = extractProto(line)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, 0, "", fmt.Errorf("failed extracting protocol from proto line: %w", err)
|
return nil, 0, "", fmt.Errorf("extracting protocol from proto line: %w", err)
|
||||||
}
|
}
|
||||||
return nil, 0, protocol, nil
|
return nil, 0, protocol, nil
|
||||||
|
|
||||||
case strings.HasPrefix(line, "remote "):
|
case strings.HasPrefix(line, "remote "):
|
||||||
ip, port, protocol, err = extractRemote(line)
|
ip, port, protocol, err = extractRemote(line)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, 0, "", fmt.Errorf("failed extracting from remote line: %w", err)
|
return nil, 0, "", fmt.Errorf("extracting from remote line: %w", err)
|
||||||
}
|
}
|
||||||
return ip, port, protocol, nil
|
return ip, port, protocol, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ func Test_extractDataFromLines(t *testing.T) {
|
|||||||
},
|
},
|
||||||
"extraction error": {
|
"extraction error": {
|
||||||
lines: []string{"bla bla", "proto bad", "remote 1.2.3.4 1194 tcp"},
|
lines: []string{"bla bla", "proto bad", "remote 1.2.3.4 1194 tcp"},
|
||||||
err: errors.New("on line 2: failed extracting protocol from proto line: network protocol not supported: bad"),
|
err: errors.New("on line 2: extracting protocol from proto line: network protocol not supported: bad"),
|
||||||
},
|
},
|
||||||
"only use first values found": {
|
"only use first values found": {
|
||||||
lines: []string{"proto udp", "proto tcp", "remote 1.2.3.4 443 tcp", "remote 5.2.3.4 1194 udp"},
|
lines: []string{"proto udp", "proto tcp", "remote 1.2.3.4 443 tcp", "remote 5.2.3.4 1194 udp"},
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ func fetchAPI(ctx context.Context, client *http.Client) (
|
|||||||
decoder := json.NewDecoder(response.Body)
|
decoder := json.NewDecoder(response.Body)
|
||||||
if err := decoder.Decode(&data); err != nil {
|
if err := decoder.Decode(&data); err != nil {
|
||||||
_ = response.Body.Close()
|
_ = response.Body.Close()
|
||||||
return data, fmt.Errorf("unmarshaling response body: %w", err)
|
return data, fmt.Errorf("decoding response body: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := response.Body.Close(); err != nil {
|
if err := response.Body.Close(); err != nil {
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ func getOpenVPNConnection(extractor Extractor,
|
|||||||
connection models.Connection, err error) {
|
connection models.Connection, err error) {
|
||||||
_, connection, err = extractor.Data(*selection.OpenVPN.ConfFile)
|
_, connection, err = extractor.Data(*selection.OpenVPN.ConfFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return connection, fmt.Errorf("cannot extract connection: %w", err)
|
return connection, fmt.Errorf("extracting connection: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
customPort := *selection.OpenVPN.CustomPort
|
customPort := *selection.OpenVPN.CustomPort
|
||||||
|
|||||||
@@ -50,11 +50,11 @@ func fetchAPI(ctx context.Context, client *http.Client) (
|
|||||||
decoder := json.NewDecoder(response.Body)
|
decoder := json.NewDecoder(response.Body)
|
||||||
if err := decoder.Decode(&data); err != nil {
|
if err := decoder.Decode(&data); err != nil {
|
||||||
_ = response.Body.Close()
|
_ = response.Body.Close()
|
||||||
return data, fmt.Errorf("failed unmarshaling response body: %w", err)
|
return data, fmt.Errorf("decoding response body: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := response.Body.Close(); err != nil {
|
if err := response.Body.Close(); err != nil {
|
||||||
return data, fmt.Errorf("cannot close response body: %w", err)
|
return data, fmt.Errorf("closing response body: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return data, nil
|
return data, nil
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ func Test_Provider_GetConnection(t *testing.T) {
|
|||||||
"error": {
|
"error": {
|
||||||
storageErr: errTest,
|
storageErr: errTest,
|
||||||
errWrapped: errTest,
|
errWrapped: errTest,
|
||||||
errMessage: "cannot filter servers: test error",
|
errMessage: "filtering servers: test error",
|
||||||
},
|
},
|
||||||
"default OpenVPN TCP port": {
|
"default OpenVPN TCP port": {
|
||||||
filteredServers: []models.Server{
|
filteredServers: []models.Server{
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ func Test_Provider_GetConnection(t *testing.T) {
|
|||||||
"error": {
|
"error": {
|
||||||
storageErr: errTest,
|
storageErr: errTest,
|
||||||
errWrapped: errTest,
|
errWrapped: errTest,
|
||||||
errMessage: "cannot filter servers: test error",
|
errMessage: "filtering servers: test error",
|
||||||
},
|
},
|
||||||
"default OpenVPN TCP port": {
|
"default OpenVPN TCP port": {
|
||||||
filteredServers: []models.Server{
|
filteredServers: []models.Server{
|
||||||
|
|||||||
@@ -53,11 +53,11 @@ func fetchAPI(ctx context.Context, client *http.Client) (
|
|||||||
decoder := json.NewDecoder(response.Body)
|
decoder := json.NewDecoder(response.Body)
|
||||||
if err := decoder.Decode(&data); err != nil {
|
if err := decoder.Decode(&data); err != nil {
|
||||||
_ = response.Body.Close()
|
_ = response.Body.Close()
|
||||||
return data, fmt.Errorf("failed unmarshaling response body: %w", err)
|
return data, fmt.Errorf("decoding response body: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := response.Body.Close(); err != nil {
|
if err := response.Body.Close(); err != nil {
|
||||||
return data, fmt.Errorf("cannot close response body: %w", err)
|
return data, fmt.Errorf("closing response body: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return data, nil
|
return data, nil
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ func Test_fetchAPI(t *testing.T) {
|
|||||||
},
|
},
|
||||||
"nil body": {
|
"nil body": {
|
||||||
responseStatus: http.StatusOK,
|
responseStatus: http.StatusOK,
|
||||||
err: errors.New("failed unmarshaling response body: EOF"),
|
err: errors.New("decoding response body: EOF"),
|
||||||
},
|
},
|
||||||
"no server": {
|
"no server": {
|
||||||
responseStatus: http.StatusOK,
|
responseStatus: http.StatusOK,
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ func (u *Updater) FetchServers(ctx context.Context, minServers int) (
|
|||||||
servers []models.Server, err error) {
|
servers []models.Server, err error) {
|
||||||
data, err := fetchAPI(ctx, u.client)
|
data, err := fetchAPI(ctx, u.client)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed fetching API: %w", err)
|
return nil, fmt.Errorf("fetching API: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
hosts := make(map[string]struct{}, len(data.Servers))
|
hosts := make(map[string]struct{}, len(data.Servers))
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ func Test_Updater_GetServers(t *testing.T) {
|
|||||||
"http response error": {
|
"http response error": {
|
||||||
warnerBuilder: func(ctrl *gomock.Controller) common.Warner { return nil },
|
warnerBuilder: func(ctrl *gomock.Controller) common.Warner { return nil },
|
||||||
responseStatus: http.StatusNoContent,
|
responseStatus: http.StatusNoContent,
|
||||||
err: errors.New("failed fetching API: HTTP status code not OK: 204 No Content"),
|
err: errors.New("fetching API: HTTP status code not OK: 204 No Content"),
|
||||||
},
|
},
|
||||||
"resolve error": {
|
"resolve error": {
|
||||||
warnerBuilder: func(ctrl *gomock.Controller) common.Warner {
|
warnerBuilder: func(ctrl *gomock.Controller) common.Warner {
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ func Test_Provider_GetConnection(t *testing.T) {
|
|||||||
"error": {
|
"error": {
|
||||||
storageErr: errTest,
|
storageErr: errTest,
|
||||||
errWrapped: errTest,
|
errWrapped: errTest,
|
||||||
errMessage: "cannot filter servers: test error",
|
errMessage: "filtering servers: test error",
|
||||||
},
|
},
|
||||||
"default OpenVPN TCP port": {
|
"default OpenVPN TCP port": {
|
||||||
filteredServers: []models.Server{
|
filteredServers: []models.Server{
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
ErrHTTPStatusCodeNotOK = errors.New("HTTP status code not OK")
|
ErrHTTPStatusCodeNotOK = errors.New("HTTP status code not OK")
|
||||||
ErrUnmarshalResponseBody = errors.New("failed unmarshaling response body")
|
ErrDecodeResponseBody = errors.New("failed decoding response body")
|
||||||
)
|
)
|
||||||
|
|
||||||
type serverData struct {
|
type serverData struct {
|
||||||
@@ -47,7 +47,7 @@ func fetchAPI(ctx context.Context, client *http.Client) (data []serverData, err
|
|||||||
|
|
||||||
decoder := json.NewDecoder(response.Body)
|
decoder := json.NewDecoder(response.Body)
|
||||||
if err := decoder.Decode(&data); err != nil {
|
if err := decoder.Decode(&data); err != nil {
|
||||||
return nil, fmt.Errorf("%w: %s", ErrUnmarshalResponseBody, err)
|
return nil, fmt.Errorf("%w: %s", ErrDecodeResponseBody, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := response.Body.Close(); err != nil {
|
if err := response.Body.Close(); err != nil {
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ func fetchAPI(ctx context.Context, client *http.Client) (data []serverData, err
|
|||||||
|
|
||||||
decoder := json.NewDecoder(response.Body)
|
decoder := json.NewDecoder(response.Body)
|
||||||
if err := decoder.Decode(&data); err != nil {
|
if err := decoder.Decode(&data); err != nil {
|
||||||
return nil, fmt.Errorf("failed unmarshaling response body: %w", err)
|
return nil, fmt.Errorf("decoding response body: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := response.Body.Close(); err != nil {
|
if err := response.Body.Close(); err != nil {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import (
|
|||||||
func newHTTPClient(serverName string) (client *http.Client, err error) {
|
func newHTTPClient(serverName string) (client *http.Client, err error) {
|
||||||
rootCAs, err := x509.SystemCertPool()
|
rootCAs, err := x509.SystemCertPool()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot load system certificates: %w", err)
|
return nil, fmt.Errorf("loading system certificates: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
const piaCertificate = "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" //nolint:lll
|
const piaCertificate = "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" //nolint:lll
|
||||||
|
|||||||
@@ -48,12 +48,12 @@ func (p *Provider) PortForward(ctx context.Context, client *http.Client,
|
|||||||
|
|
||||||
privateIPClient, err := newHTTPClient(serverName)
|
privateIPClient, err := newHTTPClient(serverName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, fmt.Errorf("cannot create custom HTTP client: %w", err)
|
return 0, fmt.Errorf("creating custom HTTP client: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
data, err := readPIAPortForwardData(p.portForwardPath)
|
data, err := readPIAPortForwardData(p.portForwardPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, fmt.Errorf("cannot read saved port forwarded data: %w", err)
|
return 0, fmt.Errorf("reading saved port forwarded data: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
dataFound := data.Port > 0
|
dataFound := data.Port > 0
|
||||||
@@ -72,7 +72,7 @@ func (p *Provider) PortForward(ctx context.Context, client *http.Client,
|
|||||||
data, err = refreshPIAPortForwardData(ctx, client, privateIPClient, gateway,
|
data, err = refreshPIAPortForwardData(ctx, client, privateIPClient, gateway,
|
||||||
p.portForwardPath, p.authFilePath)
|
p.portForwardPath, p.authFilePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, fmt.Errorf("cannot refresh port forward data: %w", err)
|
return 0, fmt.Errorf("refreshing port forward data: %w", err)
|
||||||
}
|
}
|
||||||
durationToExpiration = data.Expiration.Sub(p.timeNow())
|
durationToExpiration = data.Expiration.Sub(p.timeNow())
|
||||||
}
|
}
|
||||||
@@ -80,7 +80,7 @@ func (p *Provider) PortForward(ctx context.Context, client *http.Client,
|
|||||||
|
|
||||||
// First time binding
|
// First time binding
|
||||||
if err := bindPort(ctx, privateIPClient, gateway, data); err != nil {
|
if err := bindPort(ctx, privateIPClient, gateway, data); err != nil {
|
||||||
return 0, fmt.Errorf("cannot bind port: %w", err)
|
return 0, fmt.Errorf("binding port: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return data.Port, nil
|
return data.Port, nil
|
||||||
@@ -94,12 +94,12 @@ func (p *Provider) KeepPortForward(ctx context.Context, client *http.Client,
|
|||||||
port uint16, gateway net.IP, serverName string) (err error) {
|
port uint16, gateway net.IP, serverName string) (err error) {
|
||||||
privateIPClient, err := newHTTPClient(serverName)
|
privateIPClient, err := newHTTPClient(serverName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot create custom HTTP client: %w", err)
|
return fmt.Errorf("creating custom HTTP client: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
data, err := readPIAPortForwardData(p.portForwardPath)
|
data, err := readPIAPortForwardData(p.portForwardPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot read saved port forwarded data: %w", err)
|
return fmt.Errorf("reading saved port forwarded data: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
durationToExpiration := data.Expiration.Sub(p.timeNow())
|
durationToExpiration := data.Expiration.Sub(p.timeNow())
|
||||||
@@ -121,7 +121,7 @@ func (p *Provider) KeepPortForward(ctx context.Context, client *http.Client,
|
|||||||
case <-keepAliveTimer.C:
|
case <-keepAliveTimer.C:
|
||||||
err := bindPort(ctx, privateIPClient, gateway, data)
|
err := bindPort(ctx, privateIPClient, gateway, data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot bind port: %w", err)
|
return fmt.Errorf("binding port: %w", err)
|
||||||
}
|
}
|
||||||
keepAliveTimer.Reset(keepAlivePeriod)
|
keepAliveTimer.Reset(keepAlivePeriod)
|
||||||
case <-expiryTimer.C:
|
case <-expiryTimer.C:
|
||||||
@@ -135,16 +135,16 @@ func refreshPIAPortForwardData(ctx context.Context, client, privateIPClient *htt
|
|||||||
gateway net.IP, portForwardPath, authFilePath string) (data piaPortForwardData, err error) {
|
gateway net.IP, portForwardPath, authFilePath string) (data piaPortForwardData, err error) {
|
||||||
data.Token, err = fetchToken(ctx, client, authFilePath)
|
data.Token, err = fetchToken(ctx, client, authFilePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return data, fmt.Errorf("cannot fetch token: %w", err)
|
return data, fmt.Errorf("fetching token: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
data.Port, data.Signature, data.Expiration, err = fetchPortForwardData(ctx, privateIPClient, gateway, data.Token)
|
data.Port, data.Signature, data.Expiration, err = fetchPortForwardData(ctx, privateIPClient, gateway, data.Token)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return data, fmt.Errorf("cannot fetch port forwarding data: %w", err)
|
return data, fmt.Errorf("fetching port forwarding data: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := writePIAPortForwardData(portForwardPath, data); err != nil {
|
if err := writePIAPortForwardData(portForwardPath, data); err != nil {
|
||||||
return data, fmt.Errorf("cannot persist port forwarding data: %w", err)
|
return data, fmt.Errorf("persisting port forwarding data: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return data, nil
|
return data, nil
|
||||||
@@ -236,7 +236,7 @@ func fetchToken(ctx context.Context, client *http.Client,
|
|||||||
authFilePath string) (token string, err error) {
|
authFilePath string) (token string, err error) {
|
||||||
username, password, err := getOpenvpnCredentials(authFilePath)
|
username, password, err := getOpenvpnCredentials(authFilePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("cannot get username and password: %w", err)
|
return "", fmt.Errorf("getting username and password: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
errSubstitutions := map[string]string{
|
errSubstitutions := map[string]string{
|
||||||
@@ -274,7 +274,7 @@ func fetchToken(ctx context.Context, client *http.Client,
|
|||||||
Token string `json:"token"`
|
Token string `json:"token"`
|
||||||
}
|
}
|
||||||
if err := decoder.Decode(&result); err != nil {
|
if err := decoder.Decode(&result); err != nil {
|
||||||
return "", fmt.Errorf("cannot unmarshal response: %w", err)
|
return "", fmt.Errorf("decoding response: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if result.Token == "" {
|
if result.Token == "" {
|
||||||
@@ -291,13 +291,13 @@ func getOpenvpnCredentials(authFilePath string) (
|
|||||||
username, password string, err error) {
|
username, password string, err error) {
|
||||||
file, err := os.Open(authFilePath)
|
file, err := os.Open(authFilePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", fmt.Errorf("cannot read OpenVPN authentication file: %w", err)
|
return "", "", fmt.Errorf("reading OpenVPN authentication file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
authData, err := io.ReadAll(file)
|
authData, err := io.ReadAll(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
_ = file.Close()
|
_ = file.Close()
|
||||||
return "", "", fmt.Errorf("authentication file is malformed: %w", err)
|
return "", "", fmt.Errorf("reading authentication file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := file.Close(); err != nil {
|
if err := file.Close(); err != nil {
|
||||||
@@ -329,13 +329,13 @@ func fetchPortForwardData(ctx context.Context, client *http.Client, gateway net.
|
|||||||
request, err := http.NewRequestWithContext(ctx, http.MethodGet, url.String(), nil)
|
request, err := http.NewRequestWithContext(ctx, http.MethodGet, url.String(), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = replaceInErr(err, errSubstitutions)
|
err = replaceInErr(err, errSubstitutions)
|
||||||
return 0, "", expiration, fmt.Errorf("cannot obtain signature payload: %w", err)
|
return 0, "", expiration, fmt.Errorf("obtaining signature payload: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
response, err := client.Do(request)
|
response, err := client.Do(request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = replaceInErr(err, errSubstitutions)
|
err = replaceInErr(err, errSubstitutions)
|
||||||
return 0, "", expiration, fmt.Errorf("cannot obtain signature payload: %w", err)
|
return 0, "", expiration, fmt.Errorf("obtaining signature payload: %w", err)
|
||||||
}
|
}
|
||||||
defer response.Body.Close()
|
defer response.Body.Close()
|
||||||
|
|
||||||
@@ -350,7 +350,7 @@ func fetchPortForwardData(ctx context.Context, client *http.Client, gateway net.
|
|||||||
Signature string `json:"signature"`
|
Signature string `json:"signature"`
|
||||||
}
|
}
|
||||||
if err := decoder.Decode(&data); err != nil {
|
if err := decoder.Decode(&data); err != nil {
|
||||||
return 0, "", expiration, fmt.Errorf("cannot unmarshal response: %w", err)
|
return 0, "", expiration, fmt.Errorf("decoding response: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if data.Status != "OK" {
|
if data.Status != "OK" {
|
||||||
@@ -359,7 +359,7 @@ func fetchPortForwardData(ctx context.Context, client *http.Client, gateway net.
|
|||||||
|
|
||||||
port, _, expiration, err = unpackPayload(data.Payload)
|
port, _, expiration, err = unpackPayload(data.Payload)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, "", expiration, fmt.Errorf("cannot unpack payload data: %w", err)
|
return 0, "", expiration, fmt.Errorf("unpacking payload data: %w", err)
|
||||||
}
|
}
|
||||||
return port, data.Signature, expiration, err
|
return port, data.Signature, expiration, err
|
||||||
}
|
}
|
||||||
@@ -371,7 +371,7 @@ var (
|
|||||||
func bindPort(ctx context.Context, client *http.Client, gateway net.IP, data piaPortForwardData) (err error) {
|
func bindPort(ctx context.Context, client *http.Client, gateway net.IP, data piaPortForwardData) (err error) {
|
||||||
payload, err := packPayload(data.Port, data.Token, data.Expiration)
|
payload, err := packPayload(data.Port, data.Token, data.Expiration)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot serialize payload: %w", err)
|
return fmt.Errorf("serializing payload: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
queryParams := make(url.Values)
|
queryParams := make(url.Values)
|
||||||
@@ -410,7 +410,7 @@ func bindPort(ctx context.Context, client *http.Client, gateway net.IP, data pia
|
|||||||
Message string `json:"message"`
|
Message string `json:"message"`
|
||||||
}
|
}
|
||||||
if err := decoder.Decode(&responseData); err != nil {
|
if err := decoder.Decode(&responseData); err != nil {
|
||||||
return fmt.Errorf("cannot unmarshal response: from %s: %w", bindPortURL.String(), err)
|
return fmt.Errorf("decoding response: from %s: %w", bindPortURL.String(), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if responseData.Status != "OK" {
|
if responseData.Status != "OK" {
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ func fetchAPI(ctx context.Context, client *http.Client) (
|
|||||||
|
|
||||||
decoder := json.NewDecoder(response.Body)
|
decoder := json.NewDecoder(response.Body)
|
||||||
if err := decoder.Decode(&data); err != nil {
|
if err := decoder.Decode(&data); err != nil {
|
||||||
return data, fmt.Errorf("failed unmarshaling response body: %w", err)
|
return data, fmt.Errorf("decoding response body: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := response.Body.Close(); err != nil {
|
if err := response.Body.Close(); err != nil {
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ func fetchAPI(ctx context.Context, client *http.Client) (
|
|||||||
|
|
||||||
decoder := json.NewDecoder(response.Body)
|
decoder := json.NewDecoder(response.Body)
|
||||||
if err := decoder.Decode(&servers); err != nil {
|
if err := decoder.Decode(&servers); err != nil {
|
||||||
return nil, fmt.Errorf("failed unmarshaling response body: %w", err)
|
return nil, fmt.Errorf("decoding response body: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := response.Body.Close(); err != nil {
|
if err := response.Body.Close(); err != nil {
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ func Test_fetchAPI(t *testing.T) {
|
|||||||
},
|
},
|
||||||
"nil body": {
|
"nil body": {
|
||||||
responseStatus: http.StatusOK,
|
responseStatus: http.StatusOK,
|
||||||
err: errors.New("failed unmarshaling response body: EOF"),
|
err: errors.New("decoding response body: EOF"),
|
||||||
},
|
},
|
||||||
"no server": {
|
"no server": {
|
||||||
responseStatus: http.StatusOK,
|
responseStatus: http.StatusOK,
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ func (u *Updater) FetchServers(ctx context.Context, minServers int) (
|
|||||||
|
|
||||||
err = addServersFromAPI(ctx, u.client, hts)
|
err = addServersFromAPI(ctx, u.client, hts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot fetch server information from API: %w", err)
|
return nil, fmt.Errorf("fetching server information from API: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
warnings, err := addOpenVPNServersFromZip(ctx, u.unzipper, hts)
|
warnings, err := addOpenVPNServersFromZip(ctx, u.unzipper, hts)
|
||||||
@@ -23,7 +23,7 @@ func (u *Updater) FetchServers(ctx context.Context, minServers int) (
|
|||||||
u.warner.Warn(warning)
|
u.warner.Warn(warning)
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot get OpenVPN ZIP file: %w", err)
|
return nil, fmt.Errorf("getting OpenVPN ZIP file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
getRemainingServers(hts)
|
getRemainingServers(hts)
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ func GetConnection(provider string,
|
|||||||
connection models.Connection, err error) {
|
connection models.Connection, err error) {
|
||||||
servers, err := storage.FilterServers(provider, selection)
|
servers, err := storage.FilterServers(provider, selection)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return connection, fmt.Errorf("cannot filter servers: %w", err)
|
return connection, fmt.Errorf("filtering servers: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
protocol := getProtocol(selection)
|
protocol := getProtocol(selection)
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ func Test_GetConnection(t *testing.T) {
|
|||||||
"storage filter error": {
|
"storage filter error": {
|
||||||
filterError: errTest,
|
filterError: errTest,
|
||||||
errWrapped: errTest,
|
errWrapped: errTest,
|
||||||
errMessage: "cannot filter servers: test error",
|
errMessage: "filtering servers: test error",
|
||||||
},
|
},
|
||||||
"server without IPs": {
|
"server without IPs": {
|
||||||
filteredServers: []models.Server{
|
filteredServers: []models.Server{
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ func (u *Updater) FetchServers(ctx context.Context, minServers int) (
|
|||||||
servers []models.Server, err error) {
|
servers []models.Server, err error) {
|
||||||
servers, err = fetchServers(ctx, u.client, u.warner)
|
servers, err = fetchServers(ctx, u.client, u.warner)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot fetch servers: %w", err)
|
return nil, fmt.Errorf("fetching servers: %w", err)
|
||||||
} else if len(servers) < minServers {
|
} else if len(servers) < minServers {
|
||||||
return nil, fmt.Errorf("%w: %d and expected at least %d",
|
return nil, fmt.Errorf("%w: %d and expected at least %d",
|
||||||
common.ErrNotEnoughServers, len(servers), minServers)
|
common.ErrNotEnoughServers, len(servers), minServers)
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ func Test_Provider_GetConnection(t *testing.T) {
|
|||||||
"error": {
|
"error": {
|
||||||
storageErr: errTest,
|
storageErr: errTest,
|
||||||
errWrapped: errTest,
|
errWrapped: errTest,
|
||||||
errMessage: "cannot filter servers: test error",
|
errMessage: "filtering servers: test error",
|
||||||
},
|
},
|
||||||
"default OpenVPN TCP port": {
|
"default OpenVPN TCP port": {
|
||||||
filteredServers: []models.Server{
|
filteredServers: []models.Server{
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ func Test_Provider_GetConnection(t *testing.T) {
|
|||||||
"error": {
|
"error": {
|
||||||
storageErr: errTest,
|
storageErr: errTest,
|
||||||
errWrapped: errTest,
|
errWrapped: errTest,
|
||||||
errMessage: "cannot filter servers: test error",
|
errMessage: "filtering servers: test error",
|
||||||
},
|
},
|
||||||
"default OpenVPN TCP port": {
|
"default OpenVPN TCP port": {
|
||||||
filteredServers: []models.Server{
|
filteredServers: []models.Server{
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ func fetchAPI(ctx context.Context, client *http.Client) (
|
|||||||
|
|
||||||
decoder := json.NewDecoder(response.Body)
|
decoder := json.NewDecoder(response.Body)
|
||||||
if err := decoder.Decode(&data); err != nil {
|
if err := decoder.Decode(&data); err != nil {
|
||||||
return data, fmt.Errorf("failed unmarshaling response body: %w", err)
|
return data, fmt.Errorf("decoding response body: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return data, nil
|
return data, nil
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ func (f *Fetch) FetchInfo(ctx context.Context, ip net.IP) (
|
|||||||
|
|
||||||
decoder := json.NewDecoder(response.Body)
|
decoder := json.NewDecoder(response.Body)
|
||||||
if err := decoder.Decode(&result); err != nil {
|
if err := decoder.Decode(&result); err != nil {
|
||||||
return result, fmt.Errorf("cannot decode response: %w", err)
|
return result, fmt.Errorf("decoding response: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
countryCode := strings.ToLower(result.Country)
|
countryCode := strings.ToLower(result.Country)
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ func (d DefaultRoute) String() string {
|
|||||||
func (r *Routing) DefaultRoutes() (defaultRoutes []DefaultRoute, err error) {
|
func (r *Routing) DefaultRoutes() (defaultRoutes []DefaultRoute, err error) {
|
||||||
routes, err := r.netLinker.RouteList(nil, netlink.FAMILY_ALL)
|
routes, err := r.netLinker.RouteList(nil, netlink.FAMILY_ALL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot list routes: %w", err)
|
return nil, fmt.Errorf("listing routes: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, route := range routes {
|
for _, route := range routes {
|
||||||
@@ -39,7 +39,7 @@ func (r *Routing) DefaultRoutes() (defaultRoutes []DefaultRoute, err error) {
|
|||||||
linkIndex := route.LinkIndex
|
linkIndex := route.LinkIndex
|
||||||
link, err := r.netLinker.LinkByIndex(linkIndex)
|
link, err := r.netLinker.LinkByIndex(linkIndex)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot obtain link by index: for default route at index %d: %w", linkIndex, err)
|
return nil, fmt.Errorf("obtaining link by index: for default route at index %d: %w", linkIndex, err)
|
||||||
}
|
}
|
||||||
attributes := link.Attrs()
|
attributes := link.Attrs()
|
||||||
defaultRoute.NetInterface = attributes.Name
|
defaultRoute.NetInterface = attributes.Name
|
||||||
@@ -49,7 +49,7 @@ func (r *Routing) DefaultRoutes() (defaultRoutes []DefaultRoute, err error) {
|
|||||||
}
|
}
|
||||||
defaultRoute.AssignedIP, err = r.assignedIP(defaultRoute.NetInterface, family)
|
defaultRoute.AssignedIP, err = r.assignedIP(defaultRoute.NetInterface, family)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot get assigned IP of %s: %w", defaultRoute.NetInterface, err)
|
return nil, fmt.Errorf("getting assigned IP of %s: %w", defaultRoute.NetInterface, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
r.logger.Info("default route found: " + defaultRoute.String())
|
r.logger.Info("default route found: " + defaultRoute.String())
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import (
|
|||||||
func (r *Routing) Setup() (err error) {
|
func (r *Routing) Setup() (err error) {
|
||||||
defaultRoutes, err := r.DefaultRoutes()
|
defaultRoutes, err := r.DefaultRoutes()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot get default routes: %w", err)
|
return fmt.Errorf("getting default routes: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
touched := false
|
touched := false
|
||||||
@@ -23,14 +23,14 @@ func (r *Routing) Setup() (err error) {
|
|||||||
|
|
||||||
err = r.routeInboundFromDefault(defaultRoutes)
|
err = r.routeInboundFromDefault(defaultRoutes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot add routes for inbound traffic from default IP: %w", err)
|
return fmt.Errorf("adding routes for inbound traffic from default IP: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
r.stateMutex.RLock()
|
r.stateMutex.RLock()
|
||||||
outboundSubnets := r.outboundSubnets
|
outboundSubnets := r.outboundSubnets
|
||||||
r.stateMutex.RUnlock()
|
r.stateMutex.RUnlock()
|
||||||
if err := r.setOutboundRoutes(outboundSubnets, defaultRoutes); err != nil {
|
if err := r.setOutboundRoutes(outboundSubnets, defaultRoutes); err != nil {
|
||||||
return fmt.Errorf("cannot set outbound subnets routes: %w", err)
|
return fmt.Errorf("setting outbound subnets routes: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -39,16 +39,16 @@ func (r *Routing) Setup() (err error) {
|
|||||||
func (r *Routing) TearDown() error {
|
func (r *Routing) TearDown() error {
|
||||||
defaultRoutes, err := r.DefaultRoutes()
|
defaultRoutes, err := r.DefaultRoutes()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot get default route: %w", err)
|
return fmt.Errorf("getting default route: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = r.unrouteInboundFromDefault(defaultRoutes)
|
err = r.unrouteInboundFromDefault(defaultRoutes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot remove routes for inbound traffic from default IP: %w", err)
|
return fmt.Errorf("removing routes for inbound traffic from default IP: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := r.setOutboundRoutes(nil, defaultRoutes); err != nil {
|
if err := r.setOutboundRoutes(nil, defaultRoutes); err != nil {
|
||||||
return fmt.Errorf("cannot set outbound subnets routes: %w", err)
|
return fmt.Errorf("setting outbound subnets routes: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ const (
|
|||||||
|
|
||||||
func (r *Routing) routeInboundFromDefault(defaultRoutes []DefaultRoute) (err error) {
|
func (r *Routing) routeInboundFromDefault(defaultRoutes []DefaultRoute) (err error) {
|
||||||
if err := r.addRuleInboundFromDefault(inboundTable, defaultRoutes); err != nil {
|
if err := r.addRuleInboundFromDefault(inboundTable, defaultRoutes); err != nil {
|
||||||
return fmt.Errorf("cannot add rule: %w", err)
|
return fmt.Errorf("adding rule: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
defaultDestinationIPv4 := net.IPNet{IP: net.IPv4(0, 0, 0, 0), Mask: net.IPv4Mask(0, 0, 0, 0)}
|
defaultDestinationIPv4 := net.IPNet{IP: net.IPv4(0, 0, 0, 0), Mask: net.IPv4Mask(0, 0, 0, 0)}
|
||||||
@@ -28,7 +28,7 @@ func (r *Routing) routeInboundFromDefault(defaultRoutes []DefaultRoute) (err err
|
|||||||
|
|
||||||
err := r.addRouteVia(defaultDestination, defaultRoute.Gateway, defaultRoute.NetInterface, inboundTable)
|
err := r.addRouteVia(defaultDestination, defaultRoute.Gateway, defaultRoute.NetInterface, inboundTable)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot add route: %w", err)
|
return fmt.Errorf("adding route: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,12 +47,12 @@ func (r *Routing) unrouteInboundFromDefault(defaultRoutes []DefaultRoute) (err e
|
|||||||
|
|
||||||
err := r.deleteRouteVia(defaultDestination, defaultRoute.Gateway, defaultRoute.NetInterface, inboundTable)
|
err := r.deleteRouteVia(defaultDestination, defaultRoute.Gateway, defaultRoute.NetInterface, inboundTable)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot delete route: %w", err)
|
return fmt.Errorf("deleting route: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := r.delRuleInboundFromDefault(inboundTable, defaultRoutes); err != nil {
|
if err := r.delRuleInboundFromDefault(inboundTable, defaultRoutes); err != nil {
|
||||||
return fmt.Errorf("cannot delete rule: %w", err)
|
return fmt.Errorf("deleting rule: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -64,7 +64,7 @@ func (r *Routing) addRuleInboundFromDefault(table int, defaultRoutes []DefaultRo
|
|||||||
ruleDstNet := (*net.IPNet)(nil)
|
ruleDstNet := (*net.IPNet)(nil)
|
||||||
err = r.addIPRule(defaultIPMasked32, ruleDstNet, table, inboundPriority)
|
err = r.addIPRule(defaultIPMasked32, ruleDstNet, table, inboundPriority)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot add rule for default route %s: %w", defaultRoute, err)
|
return fmt.Errorf("adding rule for default route %s: %w", defaultRoute, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ func (r *Routing) delRuleInboundFromDefault(table int, defaultRoutes []DefaultRo
|
|||||||
ruleDstNet := (*net.IPNet)(nil)
|
ruleDstNet := (*net.IPNet)(nil)
|
||||||
err = r.deleteIPRule(defaultIPMasked32, ruleDstNet, table, inboundPriority)
|
err = r.deleteIPRule(defaultIPMasked32, ruleDstNet, table, inboundPriority)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot delete rule for default route %s: %w", defaultRoute, err)
|
return fmt.Errorf("deleting rule for default route %s: %w", defaultRoute, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ func (r *Routing) assignedIP(interfaceName string, family int) (ip net.IP, err e
|
|||||||
}
|
}
|
||||||
addresses, err := iface.Addrs()
|
addresses, err := iface.Addrs()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot list interface %s addresses: %w", interfaceName, err)
|
return nil, fmt.Errorf("listing interface %s addresses: %w", interfaceName, err)
|
||||||
}
|
}
|
||||||
for _, address := range addresses {
|
for _, address := range addresses {
|
||||||
switch value := address.(type) {
|
switch value := address.(type) {
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ type LocalNetwork struct {
|
|||||||
func (r *Routing) LocalNetworks() (localNetworks []LocalNetwork, err error) {
|
func (r *Routing) LocalNetworks() (localNetworks []LocalNetwork, err error) {
|
||||||
links, err := r.netLinker.LinkList()
|
links, err := r.netLinker.LinkList()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return localNetworks, fmt.Errorf("cannot list links: %w", err)
|
return localNetworks, fmt.Errorf("listing links: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
localLinks := make(map[int]struct{})
|
localLinks := make(map[int]struct{})
|
||||||
@@ -43,7 +43,7 @@ func (r *Routing) LocalNetworks() (localNetworks []LocalNetwork, err error) {
|
|||||||
|
|
||||||
routes, err := r.netLinker.RouteList(nil, netlink.FAMILY_ALL)
|
routes, err := r.netLinker.RouteList(nil, netlink.FAMILY_ALL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return localNetworks, fmt.Errorf("cannot list routes: %w", err)
|
return localNetworks, fmt.Errorf("listing routes: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, route := range routes {
|
for _, route := range routes {
|
||||||
@@ -60,7 +60,7 @@ func (r *Routing) LocalNetworks() (localNetworks []LocalNetwork, err error) {
|
|||||||
|
|
||||||
link, err := r.netLinker.LinkByIndex(route.LinkIndex)
|
link, err := r.netLinker.LinkByIndex(route.LinkIndex)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return localNetworks, fmt.Errorf("cannot find link at index %d: %w", route.LinkIndex, err)
|
return localNetworks, fmt.Errorf("finding link at index %d: %w", route.LinkIndex, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
localNet.InterfaceName = link.Attrs().Name
|
localNet.InterfaceName = link.Attrs().Name
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ func (r *Routing) setOutboundRoutes(outboundSubnets []net.IPNet,
|
|||||||
|
|
||||||
err = r.addOutboundSubnets(subnetsToAdd, defaultRoutes)
|
err = r.addOutboundSubnets(subnetsToAdd, defaultRoutes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot add outbound subnet to routes: %w", err)
|
return fmt.Errorf("adding outbound subnet to routes: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -77,7 +77,7 @@ func (r *Routing) addOutboundSubnets(subnets []net.IPNet,
|
|||||||
for _, defaultRoute := range defaultRoutes {
|
for _, defaultRoute := range defaultRoutes {
|
||||||
err = r.addRouteVia(subnet, defaultRoute.Gateway, defaultRoute.NetInterface, outboundTable)
|
err = r.addRouteVia(subnet, defaultRoute.Gateway, defaultRoute.NetInterface, outboundTable)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot add route for subnet %s: %w", subnet, err)
|
return fmt.Errorf("adding route for subnet %s: %w", subnet, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,7 +85,7 @@ func (r *Routing) addOutboundSubnets(subnets []net.IPNet,
|
|||||||
ruleDstNet := &subnets[i]
|
ruleDstNet := &subnets[i]
|
||||||
err = r.addIPRule(ruleSrcNet, ruleDstNet, outboundTable, outboundPriority)
|
err = r.addIPRule(ruleSrcNet, ruleDstNet, outboundTable, outboundPriority)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot add rule: for subnet %s: %w", subnet, err)
|
return fmt.Errorf("adding rule: for subnet %s: %w", subnet, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
r.outboundSubnets = append(r.outboundSubnets, subnet)
|
r.outboundSubnets = append(r.outboundSubnets, subnet)
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ func (r *Routing) addRouteVia(destination net.IPNet, gateway net.IP,
|
|||||||
|
|
||||||
link, err := r.netLinker.LinkByName(iface)
|
link, err := r.netLinker.LinkByName(iface)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot find link for interface %s: %w", iface, err)
|
return fmt.Errorf("finding link for interface %s: %w", iface, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
route := netlink.Route{
|
route := netlink.Route{
|
||||||
@@ -29,7 +29,7 @@ func (r *Routing) addRouteVia(destination net.IPNet, gateway net.IP,
|
|||||||
Table: table,
|
Table: table,
|
||||||
}
|
}
|
||||||
if err := r.netLinker.RouteReplace(&route); err != nil {
|
if err := r.netLinker.RouteReplace(&route); err != nil {
|
||||||
return fmt.Errorf("cannot replace route for subnet %s at interface %s: %w",
|
return fmt.Errorf("replacing route for subnet %s at interface %s: %w",
|
||||||
destinationStr, iface, err)
|
destinationStr, iface, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ func (r *Routing) deleteRouteVia(destination net.IPNet, gateway net.IP,
|
|||||||
|
|
||||||
link, err := r.netLinker.LinkByName(iface)
|
link, err := r.netLinker.LinkByName(iface)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot find link for interface %s: %w", iface, err)
|
return fmt.Errorf("finding link for interface %s: %w", iface, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
route := netlink.Route{
|
route := netlink.Route{
|
||||||
@@ -57,7 +57,7 @@ func (r *Routing) deleteRouteVia(destination net.IPNet, gateway net.IP,
|
|||||||
Table: table,
|
Table: table,
|
||||||
}
|
}
|
||||||
if err := r.netLinker.RouteDel(&route); err != nil {
|
if err := r.netLinker.RouteDel(&route); err != nil {
|
||||||
return fmt.Errorf("cannot delete route: for subnet %s at interface %s: %w",
|
return fmt.Errorf("deleting route: for subnet %s at interface %s: %w",
|
||||||
destinationStr, iface, err)
|
destinationStr, iface, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ func (r *Routing) addIPRule(src, dst *net.IPNet, table, priority int) error {
|
|||||||
|
|
||||||
existingRules, err := r.netLinker.RuleList(netlink.FAMILY_ALL)
|
existingRules, err := r.netLinker.RuleList(netlink.FAMILY_ALL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot list rules: %w", err)
|
return fmt.Errorf("listing rules: %w", err)
|
||||||
}
|
}
|
||||||
for i := range existingRules {
|
for i := range existingRules {
|
||||||
if !rulesAreEqual(&existingRules[i], rule) {
|
if !rulesAreEqual(&existingRules[i], rule) {
|
||||||
@@ -30,7 +30,7 @@ func (r *Routing) addIPRule(src, dst *net.IPNet, table, priority int) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := r.netLinker.RuleAdd(rule); err != nil {
|
if err := r.netLinker.RuleAdd(rule); err != nil {
|
||||||
return fmt.Errorf("cannot add rule %s: %w", rule, err)
|
return fmt.Errorf("adding rule %s: %w", rule, err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -47,14 +47,14 @@ func (r *Routing) deleteIPRule(src, dst *net.IPNet, table, priority int) error {
|
|||||||
|
|
||||||
existingRules, err := r.netLinker.RuleList(netlink.FAMILY_ALL)
|
existingRules, err := r.netLinker.RuleList(netlink.FAMILY_ALL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot list rules: %w", err)
|
return fmt.Errorf("listing rules: %w", err)
|
||||||
}
|
}
|
||||||
for i := range existingRules {
|
for i := range existingRules {
|
||||||
if !rulesAreEqual(&existingRules[i], rule) {
|
if !rulesAreEqual(&existingRules[i], rule) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if err := r.netLinker.RuleDel(rule); err != nil {
|
if err := r.netLinker.RuleDel(rule); err != nil {
|
||||||
return fmt.Errorf("cannot delete rule %s: %w", rule, err)
|
return fmt.Errorf("deleting rule %s: %w", rule, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ func Test_Routing_addIPRule(t *testing.T) {
|
|||||||
ruleList: ruleListCall{
|
ruleList: ruleListCall{
|
||||||
err: errDummy,
|
err: errDummy,
|
||||||
},
|
},
|
||||||
err: errors.New("cannot list rules: dummy error"),
|
err: errors.New("listing rules: dummy error"),
|
||||||
},
|
},
|
||||||
"rule already exists": {
|
"rule already exists": {
|
||||||
src: makeIPNet(t, 1),
|
src: makeIPNet(t, 1),
|
||||||
@@ -87,7 +87,7 @@ func Test_Routing_addIPRule(t *testing.T) {
|
|||||||
ruleToAdd: makeIPRule(t, makeIPNet(t, 1), makeIPNet(t, 2), 99, 99),
|
ruleToAdd: makeIPRule(t, makeIPNet(t, 1), makeIPNet(t, 2), 99, 99),
|
||||||
err: errDummy,
|
err: errDummy,
|
||||||
},
|
},
|
||||||
err: errors.New("cannot add rule ip rule 99: from 1.1.1.0/24 to 2.2.2.0/24 table 99: dummy error"),
|
err: errors.New("adding rule ip rule 99: from 1.1.1.0/24 to 2.2.2.0/24 table 99: dummy error"),
|
||||||
},
|
},
|
||||||
"add rule success": {
|
"add rule success": {
|
||||||
src: makeIPNet(t, 1),
|
src: makeIPNet(t, 1),
|
||||||
@@ -174,7 +174,7 @@ func Test_Routing_deleteIPRule(t *testing.T) {
|
|||||||
ruleList: ruleListCall{
|
ruleList: ruleListCall{
|
||||||
err: errDummy,
|
err: errDummy,
|
||||||
},
|
},
|
||||||
err: errors.New("cannot list rules: dummy error"),
|
err: errors.New("listing rules: dummy error"),
|
||||||
},
|
},
|
||||||
"rule delete error": {
|
"rule delete error": {
|
||||||
src: makeIPNet(t, 1),
|
src: makeIPNet(t, 1),
|
||||||
@@ -192,7 +192,7 @@ func Test_Routing_deleteIPRule(t *testing.T) {
|
|||||||
ruleToDel: makeIPRule(t, makeIPNet(t, 1), makeIPNet(t, 2), 99, 99),
|
ruleToDel: makeIPRule(t, makeIPNet(t, 1), makeIPNet(t, 2), 99, 99),
|
||||||
err: errDummy,
|
err: errDummy,
|
||||||
},
|
},
|
||||||
err: errors.New("cannot delete rule ip rule 99: from 1.1.1.0/24 to 2.2.2.0/24 table 99: dummy error"),
|
err: errors.New("deleting rule ip rule 99: from 1.1.1.0/24 to 2.2.2.0/24 table 99: dummy error"),
|
||||||
},
|
},
|
||||||
"rule deleted": {
|
"rule deleted": {
|
||||||
src: makeIPNet(t, 1),
|
src: makeIPNet(t, 1),
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ var (
|
|||||||
func (r *Routing) VPNDestinationIP() (ip net.IP, err error) {
|
func (r *Routing) VPNDestinationIP() (ip net.IP, err error) {
|
||||||
routes, err := r.netLinker.RouteList(nil, netlink.FAMILY_ALL)
|
routes, err := r.netLinker.RouteList(nil, netlink.FAMILY_ALL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot list routes: %w", err)
|
return nil, fmt.Errorf("listing routes: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
defaultLinkIndex := -1
|
defaultLinkIndex := -1
|
||||||
@@ -45,12 +45,12 @@ func (r *Routing) VPNDestinationIP() (ip net.IP, err error) {
|
|||||||
func (r *Routing) VPNLocalGatewayIP(vpnIntf string) (ip net.IP, err error) {
|
func (r *Routing) VPNLocalGatewayIP(vpnIntf string) (ip net.IP, err error) {
|
||||||
routes, err := r.netLinker.RouteList(nil, netlink.FAMILY_ALL)
|
routes, err := r.netLinker.RouteList(nil, netlink.FAMILY_ALL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot list routes: %w", err)
|
return nil, fmt.Errorf("listing routes: %w", err)
|
||||||
}
|
}
|
||||||
for _, route := range routes {
|
for _, route := range routes {
|
||||||
link, err := r.netLinker.LinkByIndex(route.LinkIndex)
|
link, err := r.netLinker.LinkByIndex(route.LinkIndex)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot find link at index %d: %w", route.LinkIndex, err)
|
return nil, fmt.Errorf("finding link at index %d: %w", route.LinkIndex, err)
|
||||||
}
|
}
|
||||||
interfaceName := link.Attrs().Name
|
interfaceName := link.Attrs().Name
|
||||||
if interfaceName == vpnIntf &&
|
if interfaceName == vpnIntf &&
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ func New(ctx context.Context, address string, logEnabled bool, logger Logger,
|
|||||||
|
|
||||||
server, err = httpserver.New(httpServerSettings)
|
server, err = httpserver.New(httpServerSettings)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot create server: %w", err)
|
return nil, fmt.Errorf("creating server: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return server, nil
|
return server, nil
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import (
|
|||||||
|
|
||||||
// readFromFile reads the servers from server.json.
|
// readFromFile reads the servers from server.json.
|
||||||
// It only reads servers that have the same version as the hardcoded servers version
|
// It only reads servers that have the same version as the hardcoded servers version
|
||||||
// to avoid JSON unmarshaling errors.
|
// to avoid JSON decoding errors.
|
||||||
func (s *Storage) readFromFile(filepath string, hardcodedVersions map[string]uint16) (
|
func (s *Storage) readFromFile(filepath string, hardcodedVersions map[string]uint16) (
|
||||||
servers models.AllServers, err error) {
|
servers models.AllServers, err error) {
|
||||||
file, err := os.Open(filepath)
|
file, err := os.Open(filepath)
|
||||||
@@ -40,7 +40,7 @@ func (s *Storage) extractServersFromBytes(b []byte, hardcodedVersions map[string
|
|||||||
servers models.AllServers, err error) {
|
servers models.AllServers, err error) {
|
||||||
rawMessages := make(map[string]json.RawMessage)
|
rawMessages := make(map[string]json.RawMessage)
|
||||||
if err := json.Unmarshal(b, &rawMessages); err != nil {
|
if err := json.Unmarshal(b, &rawMessages); err != nil {
|
||||||
return servers, fmt.Errorf("cannot decode servers: %w", err)
|
return servers, fmt.Errorf("decoding servers: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note schema version is at map key "version" as number
|
// Note schema version is at map key "version" as number
|
||||||
@@ -90,7 +90,7 @@ func (s *Storage) readServers(provider string, hardcodedVersion uint16,
|
|||||||
|
|
||||||
err = json.Unmarshal(rawMessage, &versionObject)
|
err = json.Unmarshal(rawMessage, &versionObject)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return servers, false, fmt.Errorf("cannot decode servers version for provider %s: %w",
|
return servers, false, fmt.Errorf("decoding servers version for provider %s: %w",
|
||||||
provider, err)
|
provider, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,7 +107,7 @@ func (s *Storage) readServers(provider string, hardcodedVersion uint16,
|
|||||||
|
|
||||||
err = json.Unmarshal(rawMessage, &servers)
|
err = json.Unmarshal(rawMessage, &servers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return servers, false, fmt.Errorf("cannot decode servers for provider %s: %w",
|
return servers, false, fmt.Errorf("decoding servers for provider %s: %w",
|
||||||
provider, err)
|
provider, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,12 +36,12 @@ func Test_extractServersFromBytes(t *testing.T) {
|
|||||||
}{
|
}{
|
||||||
"bad JSON": {
|
"bad JSON": {
|
||||||
b: []byte("garbage"),
|
b: []byte("garbage"),
|
||||||
errMessage: "cannot decode servers: invalid character 'g' looking for beginning of value",
|
errMessage: "decoding servers: invalid character 'g' looking for beginning of value",
|
||||||
},
|
},
|
||||||
"bad provider JSON": {
|
"bad provider JSON": {
|
||||||
b: []byte(`{"cyberghost": "garbage"}`),
|
b: []byte(`{"cyberghost": "garbage"}`),
|
||||||
hardcodedVersions: populateProviderToVersion(map[string]uint16{}),
|
hardcodedVersions: populateProviderToVersion(map[string]uint16{}),
|
||||||
errMessage: "cannot decode servers version for provider Cyberghost: " +
|
errMessage: "decoding servers version for provider Cyberghost: " +
|
||||||
"json: cannot unmarshal string into Go value of type struct { Version uint16 \"json:\\\"version\\\"\" }",
|
"json: cannot unmarshal string into Go value of type struct { Version uint16 \"json:\\\"version\\\"\" }",
|
||||||
},
|
},
|
||||||
"bad servers array JSON": {
|
"bad servers array JSON": {
|
||||||
@@ -49,7 +49,7 @@ func Test_extractServersFromBytes(t *testing.T) {
|
|||||||
hardcodedVersions: populateProviderToVersion(map[string]uint16{
|
hardcodedVersions: populateProviderToVersion(map[string]uint16{
|
||||||
providers.Cyberghost: 1,
|
providers.Cyberghost: 1,
|
||||||
}),
|
}),
|
||||||
errMessage: "cannot decode servers for provider Cyberghost: " +
|
errMessage: "decoding servers for provider Cyberghost: " +
|
||||||
"json: cannot unmarshal string into Go struct field Servers.servers of type []models.Server",
|
"json: cannot unmarshal string into Go struct field Servers.servers of type []models.Server",
|
||||||
},
|
},
|
||||||
"absent provider keys": {
|
"absent provider keys": {
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ func (s *Storage) SetServers(provider string, servers []models.Server) (err erro
|
|||||||
|
|
||||||
err = s.flushToFile(s.filepath)
|
err = s.flushToFile(s.filepath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot save servers to file: %w", err)
|
return fmt.Errorf("saving servers to file: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ func (s *Storage) syncServers() (err error) {
|
|||||||
|
|
||||||
serversOnFile, err := s.readFromFile(s.filepath, hardcodedVersions)
|
serversOnFile, err := s.readFromFile(s.filepath, hardcodedVersions)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot read servers from file: %w", err)
|
return fmt.Errorf("reading servers from file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
hardcodedCount := countServers(s.hardcodedServers)
|
hardcodedCount := countServers(s.hardcodedServers)
|
||||||
@@ -52,7 +52,7 @@ func (s *Storage) syncServers() (err error) {
|
|||||||
|
|
||||||
err = s.flushToFile(s.filepath)
|
err = s.flushToFile(s.filepath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot write servers to file: %w", err)
|
return fmt.Errorf("writing servers to file: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ func (t *Tun) Check(path string) error {
|
|||||||
|
|
||||||
info, err := f.Stat()
|
info, err := f.Stat()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot stat TUN file: %w", err)
|
return fmt.Errorf("getting stat information for TUN file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
sys, ok := info.Sys().(*syscall.Stat_t)
|
sys, ok := info.Sys().(*syscall.Stat_t)
|
||||||
@@ -37,7 +37,7 @@ func (t *Tun) Check(path string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := f.Close(); err != nil {
|
if err := f.Close(); err != nil {
|
||||||
return fmt.Errorf("cannot close TUN device: %w", err)
|
return fmt.Errorf("closing TUN device: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -22,18 +22,18 @@ func (t *Tun) Create(path string) error {
|
|||||||
dev := unix.Mkdev(major, minor)
|
dev := unix.Mkdev(major, minor)
|
||||||
err := t.mknod(path, unix.S_IFCHR, int(dev))
|
err := t.mknod(path, unix.S_IFCHR, int(dev))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot create TUN device file node: %w", err)
|
return fmt.Errorf("creating TUN device file node: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fd, err := unix.Open(path, 0, 0)
|
fd, err := unix.Open(path, 0, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot Unix Open TUN device file: %w", err)
|
return fmt.Errorf("unix opening TUN device file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
const nonBlocking = true
|
const nonBlocking = true
|
||||||
err = unix.SetNonblock(fd, nonBlocking)
|
err = unix.SetNonblock(fd, nonBlocking)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot set non block to TUN device file descriptor: %w", err)
|
return fmt.Errorf("setting non block to TUN device file descriptor: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ func Test_Tun(t *testing.T) {
|
|||||||
// Create TUN device fail as file exists
|
// Create TUN device fail as file exists
|
||||||
err = tun.Create(path)
|
err = tun.Create(path)
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
require.Equal(t, "cannot create TUN device file node: file exists", err.Error())
|
require.EqualError(t, err, "creating TUN device file node: file exists")
|
||||||
|
|
||||||
// Remove simple file
|
// Remove simple file
|
||||||
err = os.Remove(path)
|
err = os.Remove(path)
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ func (u *Updater) updateProvider(ctx context.Context, provider Provider,
|
|||||||
minServers := int(minRatio * float64(existingServersCount))
|
minServers := int(minRatio * float64(existingServersCount))
|
||||||
servers, err := provider.FetchServers(ctx, minServers)
|
servers, err := provider.FetchServers(ctx, minServers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot get servers: %w", err)
|
return fmt.Errorf("getting servers: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, server := range servers {
|
for _, server := range servers {
|
||||||
@@ -47,7 +47,7 @@ func (u *Updater) updateProvider(ctx context.Context, provider Provider,
|
|||||||
// to avoid accumulating server data in memory.
|
// to avoid accumulating server data in memory.
|
||||||
err = u.storage.SetServers(providerName, servers)
|
err = u.storage.SetServers(providerName, servers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot set servers to storage: %w", err)
|
return fmt.Errorf("setting servers to storage: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,19 +18,19 @@ func setupOpenVPN(ctx context.Context, fw Firewall,
|
|||||||
logger openvpn.Logger) (runner *openvpn.Runner, serverName string, err error) {
|
logger openvpn.Logger) (runner *openvpn.Runner, serverName string, err error) {
|
||||||
connection, err := providerConf.GetConnection(settings.Provider.ServerSelection, ipv6Supported)
|
connection, err := providerConf.GetConnection(settings.Provider.ServerSelection, ipv6Supported)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, "", fmt.Errorf("failed finding a valid server connection: %w", err)
|
return nil, "", fmt.Errorf("finding a valid server connection: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
lines := providerConf.OpenVPNConfig(connection, settings.OpenVPN, ipv6Supported)
|
lines := providerConf.OpenVPNConfig(connection, settings.OpenVPN, ipv6Supported)
|
||||||
|
|
||||||
if err := openvpnConf.WriteConfig(lines); err != nil {
|
if err := openvpnConf.WriteConfig(lines); err != nil {
|
||||||
return nil, "", fmt.Errorf("failed writing configuration to file: %w", err)
|
return nil, "", fmt.Errorf("writing configuration to file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if *settings.OpenVPN.User != "" {
|
if *settings.OpenVPN.User != "" {
|
||||||
err := openvpnConf.WriteAuthFile(*settings.OpenVPN.User, *settings.OpenVPN.Password)
|
err := openvpnConf.WriteAuthFile(*settings.OpenVPN.User, *settings.OpenVPN.Password)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, "", fmt.Errorf("failed writing auth to file: %w", err)
|
return nil, "", fmt.Errorf("writing auth to file: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,7 +42,7 @@ func setupOpenVPN(ctx context.Context, fw Firewall,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := fw.SetVPNConnection(ctx, connection, settings.OpenVPN.Interface); err != nil {
|
if err := fw.SetVPNConnection(ctx, connection, settings.OpenVPN.Interface); err != nil {
|
||||||
return nil, "", fmt.Errorf("failed allowing VPN connection through firewall: %w", err)
|
return nil, "", fmt.Errorf("allowing VPN connection through firewall: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
runner = openvpn.NewRunner(settings.OpenVPN, starter, logger)
|
runner = openvpn.NewRunner(settings.OpenVPN, starter, logger)
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ func (l *Loop) startPortForwarding(ctx context.Context, data tunnelUpData) (err
|
|||||||
// only used for PIA for now
|
// only used for PIA for now
|
||||||
gateway, err := l.routing.VPNLocalGatewayIP(data.vpnIntf)
|
gateway, err := l.routing.VPNLocalGatewayIP(data.vpnIntf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot obtain VPN local gateway IP for interface %s: %w", data.vpnIntf, err)
|
return fmt.Errorf("obtaining VPN local gateway IP for interface %s: %w", data.vpnIntf, err)
|
||||||
}
|
}
|
||||||
l.logger.Info("VPN gateway IP address: " + gateway.String())
|
l.logger.Info("VPN gateway IP address: " + gateway.String())
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ func (l *Loop) startPortForwarding(ctx context.Context, data tunnelUpData) (err
|
|||||||
}
|
}
|
||||||
_, err = l.portForward.Start(ctx, pfData)
|
_, err = l.portForward.Start(ctx, pfData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot start port forwarding: %w", err)
|
return fmt.Errorf("starting port forwarding: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ func setupWireguard(ctx context.Context, netlinker NetLinker,
|
|||||||
wireguarder *wireguard.Wireguard, serverName string, err error) {
|
wireguarder *wireguard.Wireguard, serverName string, err error) {
|
||||||
connection, err := providerConf.GetConnection(settings.Provider.ServerSelection, ipv6Supported)
|
connection, err := providerConf.GetConnection(settings.Provider.ServerSelection, ipv6Supported)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, "", fmt.Errorf("failed finding a VPN server: %w", err)
|
return nil, "", fmt.Errorf("finding a VPN server: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
wireguardSettings := utils.BuildWireguardSettings(connection, settings.Wireguard, ipv6Supported)
|
wireguardSettings := utils.BuildWireguardSettings(connection, settings.Wireguard, ipv6Supported)
|
||||||
@@ -29,12 +29,12 @@ func setupWireguard(ctx context.Context, netlinker NetLinker,
|
|||||||
|
|
||||||
wireguarder, err = wireguard.New(wireguardSettings, netlinker, logger)
|
wireguarder, err = wireguard.New(wireguardSettings, netlinker, logger)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, "", fmt.Errorf("failed creating Wireguard: %w", err)
|
return nil, "", fmt.Errorf("creating Wireguard: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = fw.SetVPNConnection(ctx, connection, settings.Wireguard.Interface)
|
err = fw.SetVPNConnection(ctx, connection, settings.Wireguard.Interface)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, "", fmt.Errorf("failed setting firewall: %w", err)
|
return nil, "", fmt.Errorf("setting firewall: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return wireguarder, connection.ServerName, nil
|
return wireguarder, connection.ServerName, nil
|
||||||
|
|||||||
@@ -11,12 +11,12 @@ import (
|
|||||||
func configureDevice(client *wgctrl.Client, settings Settings) (err error) {
|
func configureDevice(client *wgctrl.Client, settings Settings) (err error) {
|
||||||
deviceConfig, err := makeDeviceConfig(settings)
|
deviceConfig, err := makeDeviceConfig(settings)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot make device configuration: %w", err)
|
return fmt.Errorf("making device configuration: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = client.ConfigureDevice(settings.InterfaceName, deviceConfig)
|
err = client.ConfigureDevice(settings.InterfaceName, deviceConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot configure device: %w", err)
|
return fmt.Errorf("configuring device: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -117,5 +117,5 @@ func Test_netlink_Wireguard_addRule(t *testing.T) {
|
|||||||
_ = nilCleanup() // in case it succeeds
|
_ = nilCleanup() // in case it succeeds
|
||||||
}
|
}
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
assert.Equal(t, "cannot add rule ip rule 10000: from all to all table 999: file exists", err.Error())
|
assert.EqualError(t, err, "adding rule ip rule 10000: from all to all table 999: file exists")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ func (w *Wireguard) addRoute(link netlink.Link, dst *net.IPNet,
|
|||||||
err = w.netlink.RouteAdd(route)
|
err = w.netlink.RouteAdd(route)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf(
|
return fmt.Errorf(
|
||||||
"cannot add route for link %s, destination %s and table %d: %w",
|
"adding route for link %s, destination %s and table %d: %w",
|
||||||
link.Attrs().Name, dst, firewallMark, err)
|
link.Attrs().Name, dst, firewallMark, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ func Test_Wireguard_addRoute(t *testing.T) {
|
|||||||
Table: firewallMark,
|
Table: firewallMark,
|
||||||
},
|
},
|
||||||
routeAddErr: errDummy,
|
routeAddErr: errDummy,
|
||||||
err: errors.New("cannot add route for link a_bridge, destination 1.2.3.4/32 and table 51820: dummy"), //nolint:lll
|
err: errors.New("adding route for link a_bridge, destination 1.2.3.4/32 and table 51820: dummy"), //nolint:lll
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,13 +15,13 @@ func (w *Wireguard) addRule(rulePriority, firewallMark, family int) (
|
|||||||
rule.Table = firewallMark
|
rule.Table = firewallMark
|
||||||
rule.Family = family
|
rule.Family = family
|
||||||
if err := w.netlink.RuleAdd(rule); err != nil {
|
if err := w.netlink.RuleAdd(rule); err != nil {
|
||||||
return nil, fmt.Errorf("cannot add rule %s: %w", rule, err)
|
return nil, fmt.Errorf("adding rule %s: %w", rule, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanup = func() error {
|
cleanup = func() error {
|
||||||
err := w.netlink.RuleDel(rule)
|
err := w.netlink.RuleDel(rule)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot delete rule %s: %w", rule, err)
|
return fmt.Errorf("deleting rule %s: %w", rule, err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ func Test_Wireguard_addRule(t *testing.T) {
|
|||||||
Family: family,
|
Family: family,
|
||||||
},
|
},
|
||||||
ruleAddErr: errDummy,
|
ruleAddErr: errDummy,
|
||||||
err: errors.New("cannot add rule ip rule 987: from all to all table 456: dummy"),
|
err: errors.New("adding rule ip rule 987: from all to all table 456: dummy"),
|
||||||
},
|
},
|
||||||
"rule delete error": {
|
"rule delete error": {
|
||||||
expectedRule: &netlink.Rule{
|
expectedRule: &netlink.Rule{
|
||||||
@@ -71,7 +71,7 @@ func Test_Wireguard_addRule(t *testing.T) {
|
|||||||
Family: family,
|
Family: family,
|
||||||
},
|
},
|
||||||
ruleDelErr: errDummy,
|
ruleDelErr: errDummy,
|
||||||
cleanupErr: errors.New("cannot delete rule ip rule 987: from all to all table 456: dummy"),
|
cleanupErr: errors.New("deleting rule ip rule 987: from all to all table 456: dummy"),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user