Add support for ssh:// to packaging
Risk: Low
Visibility: Low, only admins should see this part
Signed-off-by: Scott Zawalski <scottz@google.com>
git-svn-id: http://test.kernel.org/svn/autotest/trunk@2276 592f7852-d20e-0410-864c-8624ca9c26a4
diff --git a/client/common_lib/packages.py b/client/common_lib/packages.py
index ddd9014..0268716 100644
--- a/client/common_lib/packages.py
+++ b/client/common_lib/packages.py
@@ -339,9 +339,16 @@
basically served by that web server.
'''
try:
- shutil.copy(file_path, upload_path)
- os.chmod(os.path.join(upload_path,
- os.path.basename(file_path)), 0755)
+ if upload_path.startswith('ssh://'):
+ # parse ssh://user@host/usr/local/autotest/packages
+ hostline, remote_path = self._parse_ssh_path(upload_path)
+ utils.run('scp %s %s:%s' % (file_path, hostline, remote_path))
+ r_path = os.path.join(remote_path, os.path.basename(file_path))
+ utils.run("ssh %s 'chmod 644 %s'" % (hostline, r_path))
+ else:
+ shutil.copy(file_path, upload_path)
+ os.chmod(os.path.join(upload_path,
+ os.path.basename(file_path)), 0644)
except (IOError, os.error), why:
raise PackageUploadError("Upload of %s to %s failed: %s"
% (file_path, upload_path, why))
@@ -356,9 +363,18 @@
the method is being called from. The upload_path's files are
basically served by that web server.
'''
+ local_path = os.path.join(dir_path, "*")
try:
- utils.run("cp %s/* %s " % (dir_path, upload_path))
- utils.run("chmod 644 %s/*" % upload_path)
+ if upload_path.startswith('ssh://'):
+ hostline, remote_path = self._parse_ssh_path(upload_path)
+ utils.run('scp %s %s:%s' % (local_path, hostline,
+ remote_path))
+ ssh_path = os.path.join(remote_path, "*")
+ utils.run("ssh %s 'chmod 644 %s'" % (hostline, ssh_path))
+ else:
+ utils.run("cp %s %s " % (local_path, upload_path))
+ up_path = os.path.join(upload_path, "*")
+ utils.run("chmod 644 %s" % up_path)
except (IOError, os.error), why:
raise PackageUploadError("Upload of %s to %s failed: %s"
% (dir_path, upload_path, why))
@@ -396,7 +412,13 @@
'''
try:
# Remove the file
- os.remove(os.path.join(pkg_dir, file_name))
+ if pkg_dir.startswith('ssh://'):
+ hostline, remote_path = self._parse_ssh_path(pkg_dir)
+ path = os.path.join(remote_path, file_name)
+ utils.run("ssh %s 'rm -rf %s/%s'" % (hostline, remote_path,
+ path))
+ else:
+ os.remove(os.path.join(pkg_dir, file_name))
except (IOError, os.error), why:
raise PackageRemoveError("Could not remove %s from %s: %s "
% (file_name, pkg_dir, why))
@@ -472,6 +494,19 @@
self._run_command('echo "%s" > %s' % (checksum_contents,
checksum_path))
+ def _parse_ssh_path(self, pkg_path):
+ '''
+ Parse ssh://xx@xx/path/to/ and return a tuple with host_line and
+ remote path
+ '''
+
+ match = re.search('^ssh://(.*?)(/.*)$', pkg_path)
+ if match:
+ return match.groups()
+ else:
+ raise PackageUploadError("Incorrect SSH path in global_config: %s"
+ % upload_path)
+
def compute_checksum(self, pkg_path):
'''