diff --git a/devlib/target.py b/devlib/target.py index 5bddad4..35473b4 100644 --- a/devlib/target.py +++ b/devlib/target.py @@ -4,6 +4,7 @@ import time import logging import posixpath import subprocess +import tarfile import tempfile import threading from collections import namedtuple @@ -281,6 +282,33 @@ class Target(object): def pull(self, source, dest, timeout=None): return self.conn.pull(source, dest, timeout=timeout) + def get_directory(self, source_dir, dest): + """ Pull a directory from the device, after compressing dir """ + # Create all file names + tar_file_name = source_dir.lstrip(self.path.sep).replace(self.path.sep, '.') + # Host location of dir + outdir = os.path.join(dest, tar_file_name) + # Host location of archive + tar_file_name = '{}.tar'.format(tar_file_name) + tempfile = os.path.join(dest, tar_file_name) + + # Does the folder exist? + self.execute('ls -la {}'.format(source_dir)) + # Try compressing the folder + try: + self.execute('{} tar -cvf {} {}'.format(self.busybox, tar_file_name, + source_dir)) + except TargetError: + self.logger.debug('Failed to run tar command on target! ' \ + 'Not pulling directory {}'.format(source_dir)) + # Pull the file + os.mkdir(outdir) + self.pull(tar_file_name, tempfile ) + # Decompress + f = tarfile.open(tempfile, 'r') + f.extractall(outdir) + os.remove(tempfile) + # execution def execute(self, command, timeout=None, check_exit_code=True, as_root=False): diff --git a/devlib/utils/ssh.py b/devlib/utils/ssh.py index f87746a..f5fedc1 100644 --- a/devlib/utils/ssh.py +++ b/devlib/utils/ssh.py @@ -442,11 +442,14 @@ class Gem5Connection(TelnetConnection): filename = os.path.basename(source) logger.debug("pull_file {} {}".format(source, filename)) + # writefile needs the file to be copied to be in the current working + # directory so if needed, copy to the working directory # We don't check the exit code here because it is non-zero if the source # and destination are the same. The ls below will cause an error if the # file was not where we expected it to be. - if os.path.dirname(source) != os.getcwd(): - self._gem5_shell("cat '{}' > '{}'".format(source, filename)) + if os.path.isabs(source): + if os.path.dirname(source) != self.execute('pwd',check_exit_code=False): + self._gem5_shell("cat '{}' > '{}'".format(source, filename)) self._gem5_shell("sync") self._gem5_shell("ls -la {}".format(filename)) logger.debug('Finished the copy in the simulator')