_kick = T.Queue()
def kickpeers():
+ lastip = {}
while True:
upness, reason = _kick.get()
addr = localaddr(CF.testaddr)
if addr is None:
upness = False
+ else:
+ addr = None
## 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:
- if p == want:
+ what = map.get(p, 'leave')
+ if what == 'up':
found = True
- elif p.startswith(g) and p != want:
+ elif what == 'down':
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)))
+ lastip[g] = ip
## Commit the changes.
if changes: