def upload_file()

in lemur/plugins/lemur_sftp/plugin.py [0:0]


    def upload_file(self, dst_path, files, options):

        try:
            # open the ssh and sftp sessions
            sftp, ssh = self.open_sftp_connection(options)

            # split the path into it's segments, so we can create it recursively
            allparts = []
            path_copy = dst_path
            while True:
                parts = path.split(path_copy)
                if parts[0] == path_copy:  # sentinel for absolute paths
                    allparts.insert(0, parts[0])
                    break
                elif parts[1] == path_copy:  # sentinel for relative paths
                    allparts.insert(0, parts[1])
                    break
                else:
                    path_copy = parts[0]
                    allparts.insert(0, parts[1])

            # make sure that the destination path exists, recursively
            remote_path = allparts[0]
            for part in allparts:
                try:
                    if part != "/" and part != "":
                        remote_path = path.join(remote_path, part)
                    sftp.stat(remote_path)
                except IOError:
                    current_app.logger.debug("{0} doesn't exist, trying to create it".format(remote_path))
                    try:
                        sftp.mkdir(remote_path)
                    except IOError as ioerror:
                        current_app.logger.debug(
                            "Couldn't create {0}, error message: {1}".format(remote_path, ioerror))

            # upload certificate files to the sftp destination
            for filename, data in files.items():
                current_app.logger.debug(
                    "Uploading {0} to {1}".format(filename, dst_path)
                )
                try:
                    with sftp.open(path.join(dst_path, filename), "w") as f:
                        f.write(data)
                except PermissionError as permerror:
                    if permerror.errno == 13:
                        current_app.logger.debug(
                            "Uploading {0} to {1} returned Permission Denied Error, making file writable and retrying".format(
                                filename, dst_path)
                        )
                        sftp.chmod(path.join(dst_path, filename), 0o600)
                        with sftp.open(path.join(dst_path, filename), "w") as f:
                            f.write(data)
                # most likely the upload user isn't the webuser, -rw-r--r--
                sftp.chmod(path.join(dst_path, filename), 0o644)

            ssh.close()

        except (AuthenticationException, NoValidConnectionsError) as e:
            raise e
        except Exception as e:
            current_app.logger.error("ERROR in {0}: {1}".format(e.__class__, e))
            try:
                ssh.close()
            except BaseException:
                pass
            message = ''
            if hasattr(e, 'errors'):
                for _, error in e.errors.items():
                    message = error.strerror
                raise Exception(
                    'Couldn\'t upload file to {}, error message: {}'.format(self.get_option("host", options), message))