Example #1
0
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