def transfer(self, source, destination, jobs=None): """Transfer a file or directory to the remote side.""" self.log.trace("Remote transfer: %s -> %s", source, destination) # self.rmdir(destination) if os.path.isdir(source): self.mkdir(destination) used_archiving = False if self.archiving_mode: self.log.trace("Remote transfer in archiving mode") import cdist.autil as autil # create archive tarpath, fcnt = autil.tar(source, self.archiving_mode) if tarpath is None: self.log.trace(("Files count {} is lower than {} limit, " "skipping archiving").format( fcnt, autil.FILES_LIMIT)) else: self.log.trace(("Archiving mode, tarpath: %s, file count: " "%s"), tarpath, fcnt) # get archive name tarname = os.path.basename(tarpath) self.log.trace("Archiving mode tarname: %s", tarname) # archive path at the remote desttarpath = os.path.join(destination, tarname) self.log.trace( "Archiving mode desttarpath: %s", desttarpath) # transfer archive to the remote side self.log.trace("Archiving mode: transfering") self._transfer_file(tarpath, desttarpath) # extract archive at the remote self.log.trace("Archiving mode: extracting") self.extract_archive(desttarpath, self.archiving_mode) # remove remote archive self.log.trace("Archiving mode: removing remote archive") self.rmfile(desttarpath) # remove local archive self.log.trace("Archiving mode: removing local archive") os.remove(tarpath) used_archiving = True if not used_archiving: if jobs: self._transfer_dir_parallel(source, destination, jobs) else: self._transfer_dir_sequential(source, destination) elif jobs: raise cdist.Error("Source {} is not a directory".format(source)) else: self._transfer_file(source, destination)
def transfer(self, source, destination, jobs=None): """Transfer a file or directory to the remote side.""" self.log.trace("Remote transfer: %s -> %s", source, destination) # self.rmdir(destination) if os.path.isdir(source): self.mkdir(destination) used_archiving = False if self.archiving_mode: self.log.trace("Remote transfer in archiving mode") import cdist.autil as autil # create archive tarpath, fcnt = autil.tar(source, self.archiving_mode) if tarpath is None: self.log.trace( ("Files count {} is lower than {} limit, " "skipping archiving").format(fcnt, autil.FILES_LIMIT)) else: self.log.trace(("Archiving mode, tarpath: %s, file count: " "%s"), tarpath, fcnt) # get archive name tarname = os.path.basename(tarpath) self.log.trace("Archiving mode tarname: %s", tarname) # archive path at the remote desttarpath = os.path.join(destination, tarname) self.log.trace("Archiving mode desttarpath: %s", desttarpath) # transfer archive to the remote side self.log.trace("Archiving mode: transfering") self._transfer_file(tarpath, desttarpath) # extract archive at the remote self.log.trace("Archiving mode: extracting") self.extract_archive(desttarpath, self.archiving_mode) # remove remote archive self.log.trace("Archiving mode: removing remote archive") self.rmfile(desttarpath) # remove local archive self.log.trace("Archiving mode: removing local archive") os.remove(tarpath) used_archiving = True if not used_archiving: if jobs: self._transfer_dir_parallel(source, destination, jobs) else: self._transfer_dir_sequential(source, destination) elif jobs: raise cdist.Error("Source {} is not a directory".format(source)) else: self._transfer_file(source, destination)
def test_tar(self): test_modes = { 'tar': 'r:', 'tgz': 'r:gz', 'tbz2': 'r:bz2', 'txz': 'r:xz', } source = explorers_path for mode in test_modes: tarpath, fcnt = autil.tar(source, mode) self.assertIsNotNone(tarpath) fcnt = 0 with tarfile.open(tarpath, test_modes[mode]) as tar: for tarinfo in tar: fcnt += 1 os.remove(tarpath) self.assertGreater(fcnt, 0)