Working (and easy to use) multicast forwarding
[nepi.git] / src / nepi / testbeds / planetlab / node.py
index b6641b7..5e1445e 100644 (file)
@@ -113,6 +113,9 @@ class Node(object):
         self.rpmFusion = False
         self.env = collections.defaultdict(list)
         
+        # Some special applications - initialized when connected
+        self.multicast_forwarder = None
+        
         # Testbed-derived attributes
         self.slicename = None
         self.ident_path = None
@@ -404,7 +407,8 @@ class Node(object):
                     user = self.slicename,
                     agent = None,
                     ident_key = self.ident_path,
-                    server_key = self.server_key
+                    server_key = self.server_key,
+                    timeout = 600,
                     )
                 
                 if proc.wait():
@@ -448,7 +452,9 @@ class Node(object):
             user = self.slicename,
             agent = None,
             ident_key = self.ident_path,
-            server_key = self.server_key
+            server_key = self.server_key,
+            timeout = 60,
+            err_on_timeout = False
             )
         
         if proc.wait():
@@ -463,27 +469,39 @@ class Node(object):
             self.do_cleanup()
     
     def do_cleanup(self):
+        if self.testbed().recovering:
+            # WOW - not now
+            return
+            
         self._logger.info("Cleaning up %s", self.hostname)
+        
+        cmds = [
+            "sudo -S killall python tcpdump || /bin/true ; "
+            "sudo -S killall python tcpdump || /bin/true ; "
+            "sudo -S kill $(ps -N -T -o pid --no-heading | grep -v $PPID | sort) || /bin/true ",
+            "sudo -S killall -u %(slicename)s || /bin/true ",
+            "sudo -S killall -u root || /bin/true ",
+            "sudo -S killall -u %(slicename)s || /bin/true ",
+            "sudo -S killall -u root || /bin/true ",
+        ]
 
-        (out,err),proc = server.popen_ssh_command(
-            # Some apps need two kills
-            "sudo -S killall -u %(slicename)s ; "
-            "sudo -S killall -u %(slicename)s ; "
-            "sudo -S killall python tcpdump ; "
-            "sudo -S kill $(ps -N T -o pid --no-heading | sort) ; "
-            "sudo -S killall -u root ; "
-            "sudo -S killall -u root " % {
-                'slicename' : self.slicename ,
-            },
-            host = self.hostname,
-            port = None,
-            user = self.slicename,
-            agent = None,
-            ident_key = self.ident_path,
-            server_key = self.server_key,
-            tty = True, # so that ps -N -T works as advertised...
-            )
-        proc.wait()
+        for cmd in cmds:
+            (out,err),proc = server.popen_ssh_command(
+                # Some apps need two kills
+                cmd % {
+                    'slicename' : self.slicename ,
+                },
+                host = self.hostname,
+                port = None,
+                user = self.slicename,
+                agent = None,
+                ident_key = self.ident_path,
+                server_key = self.server_key,
+                tty = True, # so that ps -N -T works as advertised...
+                timeout = 60,
+                retry = 3
+                )
+            proc.wait()
     
     def prepare_dependencies(self):
         # Configure p2p yum dependency installer
@@ -660,7 +678,8 @@ class Node(object):
             agent = None,
             ident_key = self.ident_path,
             server_key = self.server_key,
-            stdin = '\n'.join(rules)
+            stdin = '\n'.join(rules),
+            timeout = 300
             )
         
         if proc.wait() or err: