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)
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 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