From 5b1e46062cfa9f10850acedcff25251708d9a4fe Mon Sep 17 00:00:00 2001 From: Tadas V Date: Thu, 12 Jul 2018 15:44:29 +0300 Subject: [PATCH] Reworked country detection, reduced public ip queries to minimum (1) --- cmd/commands/server/command_server.go | 22 ++++++++-------- cmd/commands/server/factory.go | 37 ++++++++++----------------- cmd/commands/server/options.go | 4 +-- 3 files changed, 26 insertions(+), 37 deletions(-) diff --git a/cmd/commands/server/command_server.go b/cmd/commands/server/command_server.go index e417571a6a..7b7a9ab880 100644 --- a/cmd/commands/server/command_server.go +++ b/cmd/commands/server/command_server.go @@ -43,7 +43,7 @@ type Command struct { ipResolver ip.Resolver mysteriumClient server.Client natService nat.NATService - locationDetector location.Detector + locationResolver location.Resolver dialogWaiterFactory func(identity identity.Identity) communication.DialogWaiter dialogWaiter communication.DialogWaiter @@ -54,7 +54,7 @@ type Command struct { vpnServer openvpn.Process checkOpenvpn func() error - openvpnServiceAddress func() (string, error) + openvpnServiceAddress func(string, string) string protocol string proposalAnnouncementStopped *sync.WaitGroup } @@ -76,6 +76,11 @@ func (cmd *Command) Start() (err error) { cmd.dialogWaiter = cmd.dialogWaiterFactory(providerID) providerContact, err := cmd.dialogWaiter.Start() + publicIP, err := cmd.ipResolver.GetPublicIP() + if err != nil { + return err + } + // if for some reason we will need truly external IP, use GetPublicIP() outboundIP, err := cmd.ipResolver.GetOutboundIP() if err != nil { @@ -92,12 +97,12 @@ func (cmd *Command) Start() (err error) { log.Warn("received nat service error: ", err, " trying to proceed.") } - currentLocation, err := cmd.locationDetector.DetectLocation() + currentCountry, err := cmd.locationResolver.ResolveCountry(publicIP) if err != nil { return err } - log.Info("Country detected: ", currentLocation.Country) - serviceLocation := dto_discovery.Location{Country: currentLocation.Country} + log.Info("Country detected: ", currentCountry) + serviceLocation := dto_discovery.Location{Country: currentCountry} proposal := discovery.NewServiceProposalWithLocation(providerID, providerContact, serviceLocation, cmd.protocol) @@ -106,12 +111,7 @@ func (cmd *Command) Start() (err error) { return err } - openvpnServiceAddress, err := cmd.openvpnServiceAddress() - if err != nil { - return err - } - - sessionManager := cmd.sessionManagerFactory(primitives, openvpnServiceAddress) + sessionManager := cmd.sessionManagerFactory(primitives, cmd.openvpnServiceAddress(outboundIP, publicIP)) dialogHandler := session.NewDialogHandler(proposal.ID, sessionManager) if err := cmd.dialogWaiter.ServeDialogs(dialogHandler); err != nil { diff --git a/cmd/commands/server/factory.go b/cmd/commands/server/factory.go index 58000bb0e8..cb3ecdfc3e 100644 --- a/cmd/commands/server/factory.go +++ b/cmd/commands/server/factory.go @@ -75,23 +75,14 @@ func NewCommandWith( createSigner, ) - var locationResolver location.Resolver - if options.LocationCountry != "" { - locationResolver = location.NewResolverFake(options.LocationCountry) - } else if options.LocationDatabase != "" { - locationResolver = location.NewResolver(filepath.Join(options.DirectoryConfig, options.LocationDatabase)) - } else { - locationResolver = location.NewResolver(filepath.Join(options.DirectoryConfig, defaultLocationDatabase)) - } - - locationDetector := location.NewDetectorWithLocationResolver(ipResolver, locationResolver) + locationResolver := locationResolver(options) return &Command{ identityLoader: func() (identity.Identity, error) { return identity_handler.LoadIdentity(identityHandler, options.Identity, options.Passphrase) }, createSigner: createSigner, - locationDetector: locationDetector, + locationResolver: locationResolver, ipResolver: ipResolver, mysteriumClient: mysteriumClient, natService: natService, @@ -139,17 +130,8 @@ func NewCommandWith( checkOpenvpn: func() error { return openvpn.CheckOpenvpnBinary(options.OpenvpnBinary) }, - openvpnServiceAddress: func() (string, error) { - publicIP, err := ipResolver.GetPublicIP() - if err != nil { - return "", err - } - - outboundIP, err := ipResolver.GetOutboundIP() - if err != nil { - return "", err - } - + openvpnServiceAddress: func(outboundIP, publicIP string) string { + //TODO public ip could be overriden by arg options if needed if publicIP != outboundIP { forwardInfo := fmt.Sprintf("%s:%v -> %s:%v", publicIP, options.OpenvpnPort, outboundIP, options.OpenvpnPort) log.Warnf( @@ -162,13 +144,22 @@ You should probaly need to do port forwarding on your router: %s.`, } - return publicIP, nil + return publicIP }, protocol: options.Protocol, proposalAnnouncementStopped: &sync.WaitGroup{}, } } +func locationResolver(options CommandOptions) location.Resolver { + switch { + case options.LocationCountry != "": + return location.NewResolverFake(options.LocationCountry) + default: + return location.NewResolver(filepath.Join(options.DirectoryConfig, options.LocationDatabase)) + } +} + // TODO this function can be aligned with client function when client and server options will merge into func getNetworkDefinition(options CommandOptions) metadata.NetworkDefinition { network := metadata.DefaultNetwork diff --git a/cmd/commands/server/options.go b/cmd/commands/server/options.go index c09f88366d..15b04caab7 100644 --- a/cmd/commands/server/options.go +++ b/cmd/commands/server/options.go @@ -53,8 +53,6 @@ type CommandOptions struct { Localnet bool } -const defaultLocationDatabase = "GeoLite2-Country.mmdb" - // ParseArguments parses CLI flags and adds to CommandOptions structure func ParseArguments(args []string) (options CommandOptions, err error) { flags := flag.NewFlagSet(args[0], flag.ContinueOnError) @@ -112,7 +110,7 @@ func ParseArguments(args []string) (options CommandOptions, err error) { flags.StringVar( &options.LocationDatabase, "location.database", - defaultLocationDatabase, + "GeoLite2-Country.mmdb", "Service location autodetect database of GeoLite2 format e.g. http://dev.maxmind.com/geoip/geoip2/geolite2/", ) flags.StringVar(