class OperationsManager: def __init__(self, operations_classes, server_name, key_storage=None): self.__operations = {} self.__op_stat = None self.operator_cl = OperatorClient(server_name) self.__self_address = self.operator_cl.get_self_address() home_dir = self.operator_cl.get_home_dir() if key_storage: cert = key_storage.get_node_cert() ckey = key_storage.get_node_cert_key() else: cert = ckey = None self.__fri_client = FriClient(bool(cert), cert, ckey) for op_class in operations_classes: if not issubclass(op_class, OperationBase): raise Exception('Class %s does not inherit OperationBase class'%op_class) logger.debug('registering %s operation class...'% op_class.__name__) lock = RLock() operation = op_class(self.operator_cl, self.__fri_client, self.__self_address, home_dir, lock) self.__operations[op_class.get_name()] = operation def set_operation_stat(self, op_stat): self.__op_stat = op_stat def process(self, packet, role): """process request fabnet packet @param packet - object of FabnetPacketRequest class @param role - requestor role (None for disable auth) """ t0 = None try: rcode = self.operator_cl.register_request(packet.message_id, packet.method, packet.sender) if rcode == RC_ALREADY_PROCESSED: return if packet.method == KEEP_ALIVE_METHOD: return FabnetPacketResponse(ret_code=rcode) if self.__op_stat is not None: t0 = datetime.now() operation_obj = self.__operations.get(packet.method, None) if operation_obj is None: if packet.is_multicast: #transit packet self.operator_cl.call_to_neighbours(packet.message_id, packet.method, packet.parameters, packet.is_multicast) return else: raise Exception('Method "%s" does not implemented! Available methods: %s'%(packet.method, self.__operations.keys())) operation_obj.check_role(role) packet.role = role logger.debug('processing %s'%packet) message_id = packet.message_id n_packet = operation_obj.before_resend(packet) if n_packet: self.operator_cl.call_to_neighbours(message_id, packet.method, packet.parameters, packet.is_multicast) s_packet = operation_obj.process(packet) if s_packet: s_packet.message_id = packet.message_id s_packet.from_node = self.__self_address return s_packet except PermissionDeniedException, err: return FabnetPacketResponse(from_node=self.__self_address, message_id=packet.message_id, ret_code=RC_PERMISSION_DENIED, ret_message='Permission denied!') except Exception, err: err_packet = FabnetPacketResponse(from_node=self.__self_address, message_id=packet.message_id, ret_code=1, ret_message= '[OpPROC] %s'%err) logger.write = logger.debug traceback.print_exc(file=logger) logger.error('[OperationsManager.process] %s'%err) return err_packet