def rename(self, oldPath, newPath): obsAdapter = None try: _oldPath = self._realpath(oldPath) _newPath = self._realpath(newPath) oldBucketName, oldKey = ObsSftpUtil.getBucketAndKey(_oldPath) newBucketName, newKey = ObsSftpUtil.getBucketAndKey(_newPath) obsAdapter = obsadpter.ObsAdapter(client=self._client, bucketName=newBucketName, key=newKey, logClient=self._logClient, ar=self._ar, connHost=self._connHost) renameSucceed = obsAdapter.rename(oldBucketName, oldKey) if renameSucceed is None: return SFTP_NO_SUCH_FILE return SFTP_OK if renameSucceed else SFTP_FAILURE finally: del obsAdapter
def stat(self, path): obsAdapter = None try: _path = self._realpath(path) if ObsSftpUtil.isRoot(_path): self._ar.update({'obs_key': _path}) self._logClient.log(logging.DEBUG, 'Stat root path successfully, return a sftp folder SFTPAttributes.') return self._buildSftpFolder() if ObsSftpUtil.isBucket(_path): bucketName = ObsSftpUtil.getBucketName(_path) auditDict = {'obs_bucket': bucketName, 'obs_key': '-'} self._ar.update(auditDict) if self._bucketExists(bucketName): self._logClient.log(logging.DEBUG, 'Stat obs bucket [%s] successfully, return a sftp folder SFTPAttributes.', bucketName) return self._buildSftpFolder() self._logClient.log(logging.ERROR, 'Stat obs bucket [%s] failed, error message [bucket is not exists].', bucketName) return SFTP_NO_SUCH_FILE bucketName, key = ObsSftpUtil.getBucketAndKey(_path) obsAdapter = obsadpter.ObsAdapter(client=self._client, bucketName=bucketName, key=key, logClient=self._logClient, ar=self._ar) pathInfo = obsAdapter.pathInfo() return SFTP_NO_SUCH_FILE if not pathInfo else pathInfo finally: del obsAdapter
def list_folder(self, path): _path = self._realpath(path) if ObsSftpUtil.isRoot(_path): self._ar.update({'obs_bucket': '-', 'obs_key': _path}) return self._listUserBuckets() bucketName, key = ObsSftpUtil.getBucketAndKey(_path) obsAdapter = obsadpter.ObsAdapter(client=self._client, bucketName=bucketName, key=key, logClient=self._logClient, ar=self._ar) return obsAdapter.listDir()
def mkdir(self, path, attr): obsAdapter = None try: _path = self._realpath(path) bucketName, key = ObsSftpUtil.getBucketAndKey(_path) obsAdapter = obsadpter.ObsAdapter(client=self._client, bucketName=bucketName, key=key, logClient=self._logClient, ar=self._ar, connHost=self._connHost) return SFTP_OK if obsAdapter.mkDir() else SFTP_FAILURE finally: del obsAdapter
def remove(self, path): obsAdapter = None try: _path = self._realpath(path) bucketName, key = ObsSftpUtil.getBucketAndKey(_path) obsAdapter = obsadpter.ObsAdapter(client=self._client, bucketName=bucketName, key=key, logClient=self._logClient, ar=self._ar) removeResult = obsAdapter.remove() if removeResult is None: return SFTP_NO_SUCH_FILE return SFTP_OK if removeResult else SFTP_FAILURE finally: del obsAdapter
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
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