Skip to content

Commit

Permalink
Reworked country detection, reduced public ip queries to minimum (1)
Browse files Browse the repository at this point in the history
tadovas committed Jul 12, 2018

Verified

This commit was signed with the committer’s verified signature. The key has expired.
tadovas Tadas Valiukas
1 parent d1d5d37 commit 5b1e460
Showing 3 changed files with 26 additions and 37 deletions.
22 changes: 11 additions & 11 deletions cmd/commands/server/command_server.go
Original file line number Diff line number Diff line change
@@ -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 {
37 changes: 14 additions & 23 deletions cmd/commands/server/factory.go
Original file line number Diff line number Diff line change
@@ -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
4 changes: 1 addition & 3 deletions cmd/commands/server/options.go
Original file line number Diff line number Diff line change
@@ -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(

0 comments on commit 5b1e460

Please sign in to comment.