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.mktemp()
+ temp_file_path = remote.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.mktemp()
+ temp_file_path = remote.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.get_file(path, sudo)
+ return remote.copy_remote(path, sudo)
def pull_directory(remote, remotedir, localdir):
"""
remote.shortname, remotedir, localdir)
if not os.path.exists(localdir):
os.mkdir(localdir)
- result = remote.get_tar(remotedir, sudo=True)
+ result = remote.tar_remote(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.get_tar(remotedir, zip_flag=True, sudo=True)
+ tardata = remote.tar_remote(remotedir, zip_flag=True, sudo=True)
with open(localfile, 'w') as out:
out.write(tardata)
r.remote = self
return r
- def mktemp(self):
+ def remote_mktemp(self, sudo=False):
"""
Make a remote temporary file
-
- Returns: the name of the temp file created using
- tempfile.mkstemp
"""
- args = [
+ args = []
+ if sudo:
+ args.append('sudo')
+ args.extend([
'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 chmod(self, file_path, permissions):
- """
- As super-user, set permissions on the remote file specified.
- """
- args = [
+ def _set_remote_perms(self, tempf, perms):
+ args = []
+ args.extend([
'sudo',
'chmod',
- permissions,
- file_path,
- ]
+ perms,
+ tempf,
+ ])
self.run(
args=args,
+ stdout=StringIO(),
)
- def _sftp_get_file(self, file_path):
- """
- Use the Paramiko SFTPClient to copy the data from the remote
- file. Returns the file's content.
- """
+ def _do_sftp_cmd(self, args, tempf, sudo=False):
+ self.run(
+ args=args,
+ stdout=StringIO(),
+ )
+ if sudo:
+ self._set_remote_perms(tempf, '0666')
conn = self.connect()
transport = conn.get_transport()
sftp = paramiko.SFTPClient.from_transport(transport)
- with sftp.open(file_path, 'rb') as file_sftp:
+ with sftp.open(tempf, 'rb') as file_sftp:
result = file_sftp.read()
return result
- def remove(self, path):
- self.run(args=['rm', '-fr', path])
-
- def get_file(self, path, sudo=False):
+ def copy_remote(self, path, sudo=False):
"""
Read a file from the remote host into memory.
"""
- if not sudo:
- return self._sftp_get_file(path)
- temp_file_path = self.mktemp()
- self.chmod(temp_file_path, '0666')
+ tempf = self.remote_mktemp()
args = [
'sudo',
'cp',
path,
- temp_file_path,
+ tempf,
]
- self.run(args=args)
- ret = self._sftp_get_file(temp_file_path)
- self.remove(temp_file_path)
- return ret
+ return self._do_sftp_cmd(args, tempf, sudo)
- def get_tar(self, path, sudo=False, zip_flag=False):
+ def tar_remote(self, path, sudo=False, zip_flag=False):
"""
Tar a remote file.
"""
zip_fld = lambda x: 'cz' if x else 'c'
- temp_file_path = self.mktemp()
- self.chmod(temp_file_path, '0666')
- args = []
- if sudo:
- args.append('sudo')
- args.extend([
+ tempf = self.remote_mktemp()
+ args = [
+ 'sudo',
'tar',
zip_fld(zip_flag),
- '-f', temp_file_path,
+ '-f', tempf,
'-C', path,
'--',
'.',
- ])
- self.run(args=args)
- ret = self._sftp_get_file(temp_file_path)
- self.remove(temp_file_path)
- return ret
+ ]
+ return self._do_sftp_cmd(args, tempf, sudo)
def getShortName(name):
newgrub = generate_legacy_grub_entry(remote, newversion)
for line in newgrub:
data += line + '\n'
- temp_file_path = remote.mktemp()
+ temp_file_path = remote.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: