X-Git-Url: https://git.distorted.org.uk/~mdw/tripe/blobdiff_plain/a5dbeffaa04264432f376782053152dd97c7065b..HEAD:/svc/connect.in diff --git a/svc/connect.in b/svc/connect.in index b6ec4b8c..25c80b0f 100644 --- a/svc/connect.in +++ b/svc/connect.in @@ -425,6 +425,7 @@ class PingPeer (object): me._timeout = peer.get('timeout', filter = T.timespec, default = 10) me._retries = peer.get('retries', filter = int, default = 5) me._connectp = peer.has('connect') + me._knockp = peer.has('knock') return me def _ping(me): @@ -442,10 +443,10 @@ class PingPeer (object): def _reconnect(me): try: peer = Peer(me._peer) - if me._connectp: + if me._connectp or me._knockp: S.warn('connect', 'reconnecting', me._peer) S.forcekx(me._peer) - T.spawn(run_connect, peer, peer.get('connect')) + if me._connectp: T.spawn(run_connect, peer, peer.get('connect')) me._timer = M.SelTimer(time() + me._every, me._time) me._sabotage = False else: @@ -525,7 +526,7 @@ class PingPeer (object): 'min-ping': '%.1fms' % me._min, 'max-ping': '%.1fms' % me._max, 'state': me._timer and 'idle' or 'check', - 'failures': me._failures } + 'failures': str(me._failures) } @T._callback def _time(me): @@ -716,11 +717,12 @@ def disownpeer(peer): T.Coroutine(run_ifupdown, name = 'ifdown %s' % peer.name) \ .switch('ifdown', peer) -def addpeer(peer, addr): +def addpeer(peer, addr, ephemp): """ Process a connect request from a new peer PEER on address ADDR. - Any existing peer with this name is disconnected from the server. + Any existing peer with this name is disconnected from the server. EPHEMP + is the default ephemeral-ness state for the new peer. """ if peer.name in S.list(): S.kill(peer.name) @@ -731,7 +733,10 @@ def addpeer(peer, addr): key = peer.get('key', default = None), priv = peer.get('priv', default = None), mobile = peer.get('mobile', filter = boolean, default = False), + knock = peer.get('knock', default = None), cork = peer.get('cork', filter = boolean, default = False), + ephemeral = peer.get('ephemeral', filter = boolean, + default = ephemp), *addr) except T.TripeError, exc: raise T.TripeJobError(*exc.args) @@ -760,6 +765,23 @@ def notify(_, code, *rest): try: cr = chalmap[chal] except KeyError: pass else: cr.switch(rest[1:]) + elif code == 'KNOCK': + try: p = Peer(rest[0]) + except KeyError: + S.warn(['connect', 'knock-unknown-peer', rest[0]]) + return + if p.get('peer') != 'PASSIVE': + S.warn(['connect', 'knock-active-peer', p.name]) + return + dot = p.name.find('.') + if dot >= 0: kname = p.name[dot + 1:] + else: kname = p.name + ktag = p.get('key', p.name) + if kname != ktag: + S.warn(['connect', 'knock-tag-mismatch', + 'peer', pname, 'public-key-tag', ktag]) + return + T.spawn(addpeer, p, rest[1:], True) ###-------------------------------------------------------------------------- ### Command implementation. @@ -794,7 +816,7 @@ def cmd_active(name): addr = peer.get('peer') if addr == 'PASSIVE': raise T.TripeJobError('passive-peer', name) - addpeer(peer, M.split(addr, quotep = True)[0]) + addpeer(peer, M.split(addr, quotep = True)[0], True) def cmd_listactive(): """ @@ -820,7 +842,7 @@ def cmd_info(name): for i in items: try: v = d[i] except KeyError: v = peer.get(i) - T.svcinfo('%s=%s' % (i, v)) + T.svcinfo('%s=%s' % (i, v.replace('\n', ' '))) def cmd_userpeer(user): """ @@ -856,7 +878,7 @@ def cmd_passive(*args): addr = cr.parent.switch() if addr is None: raise T.TripeJobError('connect-timeout') - addpeer(peer, addr) + addpeer(peer, addr, True) finally: del chalmap[chal] @@ -892,7 +914,7 @@ def setup(): for name in M.split(autos)[0]: try: peer = Peer(name, cdb) - addpeer(peer, M.split(peer.get('peer'), quotep = True)[0]) + addpeer(peer, M.split(peer.get('peer'), quotep = True)[0], False) except T.TripeJobError, err: S.warn('connect', 'auto-add-failed', name, *err.args)