예제 #1
0
파일: server.py 프로젝트: JarodLi/obssftp
 def wrapper(*args, **kwargs):
     start = time.time()
     sftpServer = args[0] if isinstance(args[0], ObsSftpServer) else None
     result = None
     try:
         return func(*args, **kwargs)
     finally:
         end = time.time()
         totalTimeMs = int((end - start) * 1000)
         auditDict = {'obs_ret_detail': 'success' if result not in [SFTP_FAILURE] else 'failed',
                      'obs_start_time': ObsSftpUtil.utcFormater(start),
                      'obs_end_time': ObsSftpUtil.utcFormater(end), 'obs_total_time': totalTimeMs}
         sftpServer._ar.update(auditDict)
예제 #2
0
파일: server.py 프로젝트: JarodLi/obssftp
    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
예제 #3
0
파일: server.py 프로젝트: JarodLi/obssftp
        def wrapper(*args, **kwargs):
            start = time.time()
            sftpServer = args[0] if isinstance(args[0], ObsSftpServer) else None
            result = None
            _path = ''
            try:
                if sftpServer and sftpServer._logClient:
                    sftpServer._ar = {}
                    # record active time for clear connection
                    sftpServer._activeTime = time.time()
                    if len(args) < 1:
                        raise Exception('Function must has a path for operation.')
                    path = args[1]
                    _path = sftpServer._realpath(path)
                    funcName = func.__name__
                    if funcName in ['rename']:
                        newPath = args[2]
                        sftpServer._logClient.log(logging.INFO,
                                                  'Entering [%s] for old path [%s] to new path [%s]  ...' % (
                                                      func.__name__, _path, newPath))
                    else:
                        sftpServer._logClient.log(logging.INFO,
                                                  'Entering [%s] for path [%s] ...', func.__name__, _path)

                    if funcName in ['open', 'rename', 'mkdir', 'rmdir', 'remove']:
                        if ObsSftpUtil.isRoot(_path) or ObsSftpUtil.isBucket(_path):
                            sftpServer._ar.update({'obs_key': _path})
                            sftpServer._logClient.log(logging.ERROR,
                                                      'Sftp operation [%s] is not supported for path [%s]' , func.__name__, _path)
                            result = SFTP_OP_UNSUPPORTED
                            return SFTP_OP_UNSUPPORTED
                result = func(*args, **kwargs)
            except Exception as e:
                result = SFTP_FAILURE
                if sftpServer and sftpServer._logClient:
                    sftpServer._logClient.log(logging.ERROR, "Operation [%s] failed, error message [%s] - %s.",
                                              func.__name__, str(e), traceback.format_exc())
            finally:
                end = time.time()
                totalTimeMs = int((end - start) * 1000)
                operationResult = 'success' if result not in [SFTP_FAILURE, SFTP_OP_UNSUPPORTED, SFTP_NO_SUCH_FILE] else 'failed'
                auditDict = {'session_id': sftpServer._session, 'client_ip_port': sftpServer._connHost,
                             'server_ip_port': sftpServer._listenHost, 'user': sftpServer._userName,
                             'obs_endpoint': sftpServer._endpoint, 'sftp_opt': func.__name__,
                             'result': operationResult, 'client_ak': sftpServer._ak,
                             'sftp_start_time': ObsSftpUtil.utcFormater(start),
                             'sftp_end_time': ObsSftpUtil.utcFormater(end), 'sftp_total_time': totalTimeMs}
                sftpServer._ar.update(auditDict)
                if sftpServer and sftpServer._logClient:
                    sftpServer._logClient.log(logging.INFO,
                                              'End operation [%s] for path [%s] - result [%s]%s - cost [%s] ms', _path,
                                              func.__name__, operationResult, (' - count [%d]' % len(result)) if all(
                            [operationResult == 'success', func.__name__ == 'list_folder']) else '', totalTimeMs)
                try:
                    # record active time for clear connection
                    auditLogger.log(sftpServer._ar)
                    sftpServer._activeTime = time.time()
                except Exception as e:
                    sftpServer._logClient.log(logging.ERROR, 'Log audit failed. error message [%s] - %s', str(e),
                                              traceback.format_exc())
                sftpServer._ar = {}

            return result