def do_file_copy(credential_id, remote_host_id, datafile_map, base_dir=None): if base_dir is None: base_dir = ["mytardis-data"] elif isinstance(base_dir, basestring): base_dir = split_path(base_dir) + ["mytardis-data"] credential = Credential.objects.get(pk=credential_id) ssh = credential.get_client_for_host(RemoteHost.objects.get(pk=remote_host_id)) sftp_client = ssh.open_sftp() def unique_base_path(base, increment=0): base_copy = list(base) try: if increment > 0: suffix = "_%i" % increment else: suffix = "" base_copy[-1] += suffix sftp_client.stat("/".join(base_copy)) return unique_base_path(base, increment + 1) except IOError: return base_copy base_dir = unique_base_path(base_dir) make_dirs(sftp_client, base_dir) for (_path, datafile) in datafile_map: path = list(_path) if datafile.directory is not None: path += datafile.directory.split("/") path = base_dir + path path_str = "/".join(path + [datafile.filename]) make_dirs(sftp_client, path) sftp_client.putfo(datafile.file_object, path_str, datafile.size)
def get_leaf(self, path, update=False): path = path.strip('/') elems = collections.deque(split_path(path)) leaf = self.children.get(elems.popleft()) if leaf and update: leaf.update() while elems: leaf = leaf.children.get(elems.popleft()) if leaf and update: leaf.update() return leaf
def do_file_copy(credential_id, remote_host_id, datafile_map, base_dir=None): if base_dir is None: base_dir = ['mytardis-data'] elif isinstance(base_dir, basestring): base_dir = split_path(base_dir) + ['mytardis-data'] credential = Credential.objects.get(pk=credential_id) ssh = credential.get_client_for_host( RemoteHost.objects.get(pk=remote_host_id)) sftp_client = ssh.open_sftp() def unique_base_path(base, increment=0): base_copy = list(base) try: if increment > 0: suffix = "_%i" % increment else: suffix = "" base_copy[-1] += suffix sftp_client.stat('/'.join(base_copy)) return unique_base_path(base, increment + 1) except IOError: return base_copy base_dir = unique_base_path(base_dir) make_dirs(sftp_client, base_dir) for (_path, datafile) in datafile_map: path = list(_path) if datafile.directory is not None: path += datafile.directory.split('/') path = base_dir + path path_str = '/'.join(path + [datafile.filename]) make_dirs(sftp_client, path) sftp_client.putfo(datafile.file_object, path_str, datafile.size)
def add_path(self, path): path = path.strip('/') elems = split_path(path) return self.add_path_elems(elems)