Пример #1
0
    def open(self, path, flags, attr):
        """ open just for file

        :param path: file path
        :param flags: SSH_FXF_READ|SSH_FXF_WRITE|SSH_FXF_APPEND|SSH_FXF_CREAT|SSH_FXF_TRUNC|SSH_FXF_EXCL
        :param attr: not useful for obs
        :return: file handler
        """
        perm = config.getConfig().auth.get(self._userName).get('perm')
        # put
        if flags & os.O_WRONLY:
            if 'put' not in perm.split(','):
                self._logClient.log(logging.ERROR,
                                          'user [%s] not supported put operation'  , self._userName)
                return SFTP_OP_UNSUPPORTED
        elif flags == os.O_RDONLY:
            if 'get' not in perm.split(','):
                self._logClient.log(logging.ERROR,
                                            'user [%s] not supported get operation'  , self._userName)
                return SFTP_OP_UNSUPPORTED
        else:
            # TODO read and write and append
            raise Exception('Read and Write| Append operation is not support. flags [%d]' % flags)

        _path = self._realpath(path)
        bucketName, key = ObsSftpUtil.getBucketAndKey(_path)
        auditDict = {'obs_start_time': ObsSftpUtil.utcFormater(time.time()), 'obs_bucket': bucketName, 'obs_key': key}
        obsAdapter = obsadpter.ObsAdapter(client=self._client, bucketName=bucketName, key=key,
                                          logClient=self._logClient, ar=self._ar, connHost=self._connHost)
        if not self._obsAdapters:
            self._obsAdapters = []
        self._obsAdapters.append(obsAdapter)
        self._ar.update(auditDict)
        _key = ObsSftpUtil.maybeAddTrailingSlash(key)
        # TODO just successfully for object bucket. file bucket need mode for jungle folder
        if obsAdapter.dirInfo(bucketName, _key):
            self._logClient.log(logging.WARNING,
                                'Open key [%s] of bucket [%s] failed. error message [Client want to open a dir].', _key,
                                bucketName)
            return SFTP_FAILURE
        try:
            fobj = ObsSftpFileHandle(flags=flags, obsAdapter=obsAdapter, bucketName=bucketName, key=key,
                                     logClient=self._logClient, sftpServer=self)
            return fobj
        except Exception as e:
            self._logClient.log(logging.ERROR, 'Open key [%s] of bucket [%s] failed. error message [%s] - %s.', key,
                                bucketName, str(e), traceback.format_exc())
            if 'not support' in str(e):
                return SFTP_OP_UNSUPPORTED
            return SFTP_FAILURE
Пример #2
0
 def rmdir(self, path):
     obsAdapter = None
     try:
         _path = self._realpath(path)
         bucketName, key = ObsSftpUtil.getBucketAndKey(_path)
         _key = ObsSftpUtil.maybeAddTrailingSlash(key)
         obsAdapter = obsadpter.ObsAdapter(client=self._client, bucketName=bucketName, key=_key,
                                           logClient=self._logClient, ar=self._ar, connHost=self._connHost)
         if not obsAdapter.dirInfo(bucketName, _key):
             self._logClient.log(logging.DEBUG,
                                 'Rmdir key [%s] of bucket [%s] failed. error message [dir is not exists].',
                                 _key, bucketName)
             self._ar.update({'obs_key': _key, 'obs_bucket': bucketName})
             return SFTP_NO_SUCH_FILE
         return SFTP_OK if obsAdapter.rmDir() else SFTP_FAILURE
     finally:
         del obsAdapter