import json
import re
import tempfile
-import paramiko
from teuthology import safepath
from .orchestra import run
# get a temp file path on the remote host to write to,
# we don't want to blow away the remote file and then have the
# network drop out
- temp_file_path = remote.remote_mktemp()
+ temp_file_path = remote.mktemp()
# write out the data to a temp file
write_file(remote, temp_file_path, out_data)
Remove_lines_from_list.
"""
- temp_file_path = remote.remote_mktemp()
+ temp_file_path = remote.mktemp()
data = get_file(remote, path, sudo)
append_lines_to_file(remote, path, data, sudo)
-def do_remote_sftp(remote, tempf, sudo=False):
- """
- Make sure file is aways readble if root, and use SFTPClient to
- copy across data.
- """
- if sudo:
- args = []
- args.extend([
- 'sudo',
- 'chmod',
- '0666',
- tempf,
- ])
- remote.run(
- args=args,
- stdout=StringIO(),
- )
- conn = remote.connect()
- transport = conn.get_transport()
- sftp = paramiko.SFTPClient.from_transport(transport)
- with sftp.open(tempf, 'rb') as file_sftp:
- result = file_sftp.read()
- return result
-
def get_file(remote, path, sudo=False):
"""
Copy_remote wrapper.
"""
- return remote.copy_remote(path, sudo)
+ return remote.get_file(path, sudo)
def pull_directory(remote, remotedir, localdir):
"""
remote.shortname, remotedir, localdir)
if not os.path.exists(localdir):
os.mkdir(localdir)
- result = remote.tar_remote(remotedir, sudo=True)
+ result = remote.get_tar(remotedir, sudo=True)
_, local_tarfile = tempfile.mkstemp()
with open(local_tarfile, 'r+') as fb1:
fb1.write(result)
"""
log.debug('Transferring archived files from %s:%s to %s',
remote.shortname, remotedir, localfile)
- tardata = remote.tar_remote(remotedir, zip_flag=True, sudo=True)
+ tardata = remote.get_tar(remotedir, zip_flag=True, sudo=True)
with open(localfile, 'w') as out:
out.write(tardata)
r.remote = self
return r
- def remote_mktemp(self, sudo=False):
+ def mktemp(self):
"""
Make a remote temporary file
+
+ Returns: the name of the temp file created using
+ tempfile.mkstemp
"""
- args = []
- if sudo:
- args.append('sudo')
- args.extend([
+ args = [
'python',
'-c',
'import os; import tempfile; import sys; (fd,fname) = tempfile.mkstemp(); os.close(fd); sys.stdout.write(fname.rstrip()); sys.stdout.flush()'
- ])
+ ]
proc = self.run(
args=args,
stdout=StringIO(),
data = proc.stdout.getvalue()
return data
- def _set_remote_perms(self, tempf, perms):
- args = []
- args.extend([
+ def chmod(self, file_path, permissions):
+ """
+ As super-user, set permissions on the remote file specified.
+ """
+ args = [
'sudo',
'chmod',
- perms,
- tempf,
- ])
+ permissions,
+ file_path,
+ ]
self.run(
args=args,
- stdout=StringIO(),
)
- def _do_sftp_cmd(self, args, tempf, sudo=False):
- self.run(
- args=args,
- stdout=StringIO(),
- )
- if sudo:
- self._set_remote_perms(tempf, '0666')
+ def _sftp_get_file(self, file_path):
+ """
+ Use the Paramiko SFTPClient to copy the data from the remote
+ file. Returns the file's content.
+ """
conn = self.connect()
transport = conn.get_transport()
sftp = paramiko.SFTPClient.from_transport(transport)
- with sftp.open(tempf, 'rb') as file_sftp:
+ with sftp.open(file_path, 'rb') as file_sftp:
result = file_sftp.read()
return result
- def copy_remote(self, path, sudo=False):
+ def remove(self, path):
+ self.run(args=['rm', '-fr', path])
+
+ def get_file(self, path, sudo=False):
"""
Read a file from the remote host into memory.
"""
- tempf = self.remote_mktemp()
+ if not sudo:
+ return self._sftp_get_file(path)
+ temp_file_path = self.mktemp()
+ self.chmod(temp_file_path, '0666')
args = [
'sudo',
'cp',
path,
- tempf,
+ temp_file_path,
]
- return self._do_sftp_cmd(args, tempf, sudo)
+ self.run(args=args)
+ ret = self._sftp_get_file(temp_file_path)
+ self.remove(temp_file_path)
+ return ret
- def tar_remote(self, path, sudo=False, zip_flag=False):
+ def get_tar(self, path, sudo=False, zip_flag=False):
"""
Tar a remote file.
"""
zip_fld = lambda x: 'cz' if x else 'c'
- tempf = self.remote_mktemp()
- args = [
- 'sudo',
+ temp_file_path = self.mktemp()
+ self.chmod(temp_file_path, '0666')
+ args = []
+ if sudo:
+ args.append('sudo')
+ args.extend([
'tar',
zip_fld(zip_flag),
- '-f', tempf,
+ '-f', temp_file_path,
'-C', path,
'--',
'.',
- ]
- return self._do_sftp_cmd(args, tempf, sudo)
+ ])
+ self.run(args=args)
+ ret = self._sftp_get_file(temp_file_path)
+ self.remove(temp_file_path)
+ return ret
def getShortName(name):
newgrub = generate_legacy_grub_entry(remote, newversion)
for line in newgrub:
data += line + '\n'
- temp_file_path = remote.remote_mktemp()
+ temp_file_path = remote.mktemp()
teuthology.sudo_write_file(remote, temp_file_path, StringIO(data), '755')
teuthology.move_file(remote, temp_file_path, '/boot/grub/grub.conf', True)
else: