Fixed relative paths in Linux Application
[nepi.git] / src / neco / resources / linux / node.py
index f7c9daa..39107cb 100644 (file)
@@ -14,8 +14,10 @@ import threading
 
 # TODO: Verify files and dirs exists already
 # TODO: Blacklist nodes!
+# TODO: Unify delays!!
+
+reschedule_delay = "0.5s"
 
-DELAY ="1s"
 
 @clsinit
 class LinuxNode(ResourceManager):
@@ -78,17 +80,16 @@ class LinuxNode(ResourceManager):
 
     @property
     def home(self):
-        return self.get("home") or "/tmp"
+        return self.get("home") or ""
 
     @property
-    def exp_dir(self):
-        exp_dir = os.path.join(self.home, self.ec.exp_id)
-        return exp_dir if exp_dir.startswith('/') else "${HOME}/"
+    def exp_home(self):
+        return os.path.join(self.home, self.ec.exp_id)
 
     @property
-    def node_dir(self):
-        node_dir = "node-%d" % self.guid
-        return os.path.join(self.exp_dir, node_dir)
+    def node_home(self):
+        node_home = "node-%d" % self.guid
+        return os.path.join(self.exp_home, node_home)
 
     @property
     def os(self):
@@ -138,7 +139,7 @@ class LinuxNode(ResourceManager):
         if self.get("cleanHome"):
             self.clean_home()
        
-        self.mkdir(self.node_dir)
+        self.mkdir(self.node_home)
 
         super(LinuxNode, self).provision()
 
@@ -157,7 +158,7 @@ class LinuxNode(ResourceManager):
         ifaces = self.get_connected(LinuxInterface.rtype())
         for iface in ifaces:
             if iface.state < ResourceState.READY:
-                self.ec.schedule(DELAY, self.deploy)
+                self.ec.schedule(reschedule_delay, self.deploy)
                 return 
 
         super(LinuxNode, self).deploy()
@@ -190,16 +191,20 @@ class LinuxNode(ResourceManager):
                 "sudo -S killall -u %s || /bin/true ; " % self.get("username") +
                 "sudo -S killall -u %s || /bin/true ; " % self.get("username"))
 
-
         out = err = ""
         (out, err), proc = self.execute(cmd, retry = 1, with_lock = True) 
             
     def clean_home(self):
         self.info("Cleaning up home")
-
-        cmd = ("cd %s ; " % self.home +
-            "find . -maxdepth 1  \( -name '.cache' -o -name '.local' -o -name '.config' -o -name 'nepi-*' \)"+
-            " -execdir rm -rf {} + ")
+        
+        cmd = (
+            # "find . -maxdepth 1  \( -name '.cache' -o -name '.local' -o -name '.config' -o -name 'nepi-*' \)" +
+            "find . -maxdepth 1 -name 'nepi-*' " +
+            " -execdir rm -rf {} + "
+            )
+            
+        if self.home:
+            cmd = "cd %s ; " % self.home + cmd
 
         out = err = ""
         (out, err), proc = self.execute(cmd, with_lock = True)
@@ -242,7 +247,7 @@ class LinuxNode(ResourceManager):
         return self.copy(src, dst)
 
     def install_packages(self, packages, home = None):
-        home = home or self.node_dir
+        home = home or self.node_home
 
         cmd = ""
         if self.os in ["f12", "f14"]:
@@ -257,14 +262,14 @@ class LinuxNode(ResourceManager):
         out = err = ""
         (out, err), proc = self.run_and_wait(cmd, home, 
             pidfile = "instpkg_pid",
-            stdout = "instpkg_log", 
-            stderr = "instpkg_err", 
+            stdout = "instpkg_out", 
+            stderr = "instpkg_err",
             raise_on_error = True)
 
         return (out, err), proc 
 
     def remove_packages(self, packages, home = None):
-        home = home or self.node_dir
+        home = home or self.node_home
 
         cmd = ""
         if self.os in ["f12", "f14"]:
@@ -279,8 +284,8 @@ class LinuxNode(ResourceManager):
         out = err = ""
         (out, err), proc = self.run_and_wait(cmd, home, 
             pidfile = "rmpkg_pid",
-            stdout = "rmpkg_log", 
-            stderr = "rmpkg_err", 
+            stdout = "rmpkg_out", 
+            stderr = "rmpkg_err",
             raise_on_error = True)
          
         return (out, err), proc 
@@ -301,6 +306,7 @@ class LinuxNode(ResourceManager):
             stdout = 'stdout', 
             stderr = 'stderr', 
             sudo = False,
+            tty = False,
             raise_on_error = False):
         """ runs a command in background on the remote host, but waits
             until the command finishes execution.
@@ -314,7 +320,8 @@ class LinuxNode(ResourceManager):
                 stdin = stdin, 
                 stdout = stdout, 
                 stderr = stderr, 
-                sudo = sudo)
+                sudo = sudo,
+                tty = tty)
 
         # check no errors occurred
         if proc.poll() and err:
@@ -395,7 +402,7 @@ class LinuxNode(ResourceManager):
     def check_output(self, home, filename):
         """ checks file content """
         (out, err), proc = self.execute("cat %s" % 
-            os.path.join(home, filename), with_lock = True)
+            os.path.join(home, filename), retry = 1, with_lock = True)
         return (out, err), proc
 
     def is_alive(self):
@@ -508,14 +515,15 @@ class LinuxNode(ResourceManager):
 
     def run(self, command, 
             home = None,
-            create_home = True,
+            create_home = False,
             pidfile = "pid",
             stdin = None, 
             stdout = 'stdout', 
             stderr = 'stderr', 
-            sudo = False):
+            sudo = False,
+            tty = False):
 
-        self.debug("Running %s" % command)
+        self.debug("Running command '%s'" % command)
         
         if self.localhost:
             (out, err), proc = execfuncs.lspawn(command, pidfile, 
@@ -544,7 +552,8 @@ class LinuxNode(ResourceManager):
                     port = self.get("port"),
                     agent = True,
                     identity = self.get("identity"),
-                    server_key = self.get("serverKey")
+                    server_key = self.get("serverKey"),
+                    tty = tty
                     )
 
         return (out, err), proc