Merge branch 'mdw/multi-priv'
[tripe] / svc / watch.in
index 97a12bf..5917c79 100644 (file)
@@ -527,6 +527,7 @@ class Pinger (T.Coroutine):
     """
     if T._debug: print '# rescan peers'
     correct = {}
+    start = {}
     for peer in S.list():
       try:
         info = peerinfo(peer)
@@ -534,14 +535,17 @@ class Pinger (T.Coroutine):
         continue
       if boolean(info, 'watch', False):
         if T._debug: print '# interesting peer %s' % peer
-        correct[peer] = info
+        correct[peer] = start[peer] = info
+      elif startup:
+        if T._debug: print '# peer %s ready for adoption' % peer
+        start[peer] = info
     for peer, obj in me._peers.items():
       if peer in correct:
         obj.update(correct[peer])
       else:
         if T._debug: print '# peer %s vanished' % peer
         del me._peers[peer]
-    for peer, info in correct.iteritems():
+    for peer, info in start.iteritems():
       if peer not in me._peers:
         if startup:
           if T._debug: print '# setting up peer %s' % peer
@@ -573,15 +577,15 @@ def encode_envvars(env, prefix, vars):
     env[prefix + r_bad.sub('_', k.upper())] = v
 
 r_bad = RX.compile(r'[\W_]+')
-def envvars(info):
+def envvars(peer, info):
   """
-  Translate the database INFO dictionary for a peer into a dictionary of
+  Translate the database INFO dictionary for a PEER into a dictionary of
   environment variables with plausible upper-case names and a P_ prefix.
   Also collect the crypto information into A_ variables.
   """
   env = {}
   encode_envvars(env, 'P_', info)
-  encode_envvars(env, 'A_', S.algs())
+  encode_envvars(env, 'A_', S.algs(peer))
   return env
 
 def ifupdown(what, peer, info, *args):
@@ -598,7 +602,7 @@ def ifupdown(what, peer, info, *args):
   c = Command([what, peer], q, what,
               M.split(info[what], quotep = True)[0] +
               [peer] + list(args),
-              envvars(info))
+              envvars(peer, info))
   potwatch(what, peer, q)
 
 def addpeer(info, peer, ifname, *addr):