ICd or NetworkManager might roam to a new network, and tell us about it;
but if we decided that we wanted to stick with the same peer
specification then our peer will continue with the wrong IP address until
watch gets a ping timeout.
Of course, this doesn't trap other reasons we might change IP addresses
without anyone noticing, such as roaming to a different 3G NAT thingummy.
_kick = T.Queue()
def kickpeers():
_kick = T.Queue()
def kickpeers():
while True:
upness, reason = _kick.get()
while True:
upness, reason = _kick.get()
addr = localaddr(CF.testaddr)
if addr is None:
upness = False
addr = localaddr(CF.testaddr)
if addr is None:
upness = False
## Now decide what to do.
changes = []
for g, pp in CF.groups:
## Find out which peer in the group ought to be active.
## Now decide what to do.
changes = []
for g, pp in CF.groups:
## Find out which peer in the group ought to be active.
- want = None # unequal to any string
- if upness:
- for t, p, a, m in pp:
- if p is None:
- aq = addr
- else:
- aq = localaddr(p)
- if aq is not None and (aq & m) == a:
- want = t
- break
+ ip = None
+ map = {}
+ want = None
+ for t, p, a, m in pp:
+ if p is None or not upness:
+ ipq = addr
+ else:
+ ipq = localaddr(p)
+ if upness and ip is None and \
+ ipq is not None and (ipq & m) == a:
+ map[t] = 'up'
+ want = t
+ ip = ipq
+ else:
+ map[t] = 'down'
## Shut down the wrong ones.
found = False
for p in peers:
## Shut down the wrong ones.
found = False
for p in peers:
+ what = map.get(p, 'leave')
+ if what == 'up':
- elif p.startswith(g) and p != want:
changes.append(lambda p=p: SM.kill(p))
## Start the right one if necessary.
changes.append(lambda p=p: SM.kill(p))
## Start the right one if necessary.
- if want is not None and not found:
+ if want is not None and (not found or ip != lastip.get(g, None)):
changes.append(lambda: T._simple(SM.svcsubmit('connect', 'active',
want)))
changes.append(lambda: T._simple(SM.svcsubmit('connect', 'active',
want)))
## Commit the changes.
if changes:
## Commit the changes.
if changes: