Commit 47d374bc authored by Johan Hugé's avatar Johan Hugé

Make nodes ask registry for their country

parent e7229916
......@@ -272,3 +272,9 @@ class Cache(object):
if a != address:
q("INSERT OR REPLACE INTO peer VALUES (?,?)", (prefix, address))
q("INSERT OR REPLACE INTO volatile.stat VALUES (?,0)", (prefix,))
def getCountry(self, ip):
try:
return self._registry.getCountry(self._prefix, ip)
except socket.error, e:
logging.warning('Failed to get country (%s)', ip)
......@@ -67,7 +67,7 @@ def getConfig():
"to access it.")
_('--country', metavar='CODE',
help="Country code that is advertised to other nodes"
"(default: country is fetched from MaxMind database)")
"(default: country is resolved by the registry)")
_ = parser.add_argument_group('routing').add_argument
_('-B', dest='babel_args', metavar='ARG', action='append', default=[],
......
......@@ -213,17 +213,22 @@ class BaseTunnelManager(object):
address_dict = defaultdict(list)
for family, address in address:
address_dict[family] += address
if any(address_dict.itervalues()):
del cache.my_address
else:
address = cache.my_address
if address:
for address in utils.parse_address(address):
try:
proto = proto_dict[address[2]]
except KeyError:
continue
address_dict[proto[0]].append(address)
# Cache may contain our country, we want to use it if possible to
# prevent interaction with registry
cache_address = cache.my_address
if cache_address:
cache_dict = defaultdict(list)
for address in utils.parse_address(cache_address):
try:
proto = proto_dict[address[2]]
except KeyError:
continue
cache_dict[proto[0]].append(address)
if {proto: cache_dict[proto][:3] for proto in cache_dict
} == address_dict:
address_dict = cache_dict
db = os.getenv('GEOIP2_MMDB')
if db:
from geoip2 import database, errors
......@@ -234,6 +239,7 @@ class BaseTunnelManager(object):
except errors.AddressNotFoundError:
return
self._geoiplookup = geoiplookup
if cache.same_country:
self._country = {}
address_dict = {family: self._updateCountry(address)
......@@ -244,6 +250,7 @@ class BaseTunnelManager(object):
self._address = {family: utils.dump_address(address)
for family, address in address_dict.iteritems()
if address}
cache.my_address = ';'.join(self._address.itervalues())
self.sock = socket.socket(socket.AF_INET6,
socket.SOCK_DGRAM | socket.SOCK_CLOEXEC)
......@@ -664,7 +671,7 @@ class BaseTunnelManager(object):
for a in address:
family, ip = resolve(*a[:3])
for ip in ip:
country = a[3] if len(a) > 3 else self._geoiplookup(ip)
country = a[3] if len(a) > 3 else self.cache.getCountry(ip)
if country:
if self._country.get(family) != country:
self._country[family] = country
......@@ -1029,7 +1036,7 @@ class TunnelManager(BaseTunnelManager):
if self._ip_changed:
family, address = self._ip_changed(ip)
if address:
if self._geoiplookup or self._conf_country:
if self.cache.same_country:
address = self._updateCountry(address)
self._address[family] = utils.dump_address(address)
self.cache.my_address = ';'.join(self._address.itervalues())
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment