Fix bug introduced into paramiko_host by recent changes to selectively disable 
rsync support (SVN rev 4077).  The new code makes SSH calls within 
_initialize(), but paramiko_host wasn't sufficiently initialized when the call 
was being made.  In general, executing remote commands within _initialize() is 
dangerous.  This change removes the new code from _initialize() and instead 
makes AbstractSSHHost compute the new information lazily.

Signed-off-by: Steve Howard <[email protected]>

--- autotest/server/hosts/abstract_ssh.py       2010-01-11 15:32:34.000000000 
-0800
+++ autotest/server/hosts/abstract_ssh.py       2010-01-11 16:37:28.000000000 
-0800
@@ -35,20 +35,26 @@
         self.user = user
         self.port = port
         self.password = password
+        self._use_rsync = None
 
         """
         Master SSH connection background job, socket temp directory and socket
         control path option. If master-SSH is enabled, these fields will be
         initialized by start_master_ssh when a new SSH connection is initiated.
         """
         self.master_ssh_job = None
         self.master_ssh_tempdir = None
         self.master_ssh_option = ''
 
+
+    def use_rsync(self):
+        if self._use_rsync is not None:
+            return self._use_rsync
+
         # Check if rsync is available on the remote host. If it's not,
         # don't try to use it for any future file transfers.
-        self.use_rsync = self._check_rsync()
-        if not self.use_rsync:
+        self._use_rsync = self._check_rsync()
+        if not self._use_rsync:
             logging.warn("rsync not available on remote host %s -- disabled",
                          self.hostname)
 
@@ -223,17 +229,17 @@
         dest = os.path.abspath(dest)
 
         # If rsync is disabled or fails, try scp.
-        try_scp = not self.use_rsync
-        if self.use_rsync:
+        try_scp = True
+        if self.use_rsync():
             try:
                 remote_source = self._encode_remote_paths(source)
                 local_dest = utils.sh_escape(dest)
                 rsync = self._make_rsync_cmd([remote_source], local_dest,
                                              delete_dest, preserve_symlinks)
                 utils.run(rsync)
+                try_scp = False
             except error.CmdError, e:
                 logging.warn("trying scp, rsync failed: %s" % e)
-                try_scp = True
 
         if try_scp:
             # scp has no equivalent to --delete, just drop the entire dest dir
@@ -295,16 +301,16 @@
         remote_dest = self._encode_remote_paths([dest])
 
         # If rsync is disabled or fails, try scp.
-        try_scp = not self.use_rsync
-        if self.use_rsync:
+        try_scp = True
+        if self.use_rsync():
             try:
                 local_sources = [utils.sh_escape(path) for path in source]
                 rsync = self._make_rsync_cmd(local_sources, remote_dest,
                                              delete_dest, preserve_symlinks)
                 utils.run(rsync)
+                try_scp = False
             except error.CmdError, e:
                 logging.warn("trying scp, rsync failed: %s" % e)
-                try_scp = True
 
         if try_scp:
             # scp has no equivalent to --delete, just drop the entire dest dir
_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest

Reply via email to