import logging from tfw.crypto import KeyManager, verify_message LOG = logging.getLogger(__name__) class FSMAware: """ Base class for stuff that has to be aware of the framework FSM. This is done by processing 'fsm_update' messages. """ def __init__(self): self.fsm_state = None self.fsm_in_accepted_state = False self.fsm_event_log = [] self._auth_key = KeyManager().auth_key def refresh_on_fsm_update(self, message): if message['key'] == 'fsm_update' and verify_message(self._auth_key, message): self._handle_fsm_update(message) return True return False def _handle_fsm_update(self, message): try: update_data = message['data'] new_state = update_data['current_state'] if self.fsm_state != new_state: self.handle_fsm_step(**update_data) self.fsm_state = new_state self.fsm_in_accepted_state = update_data['in_accepted_state'] self.fsm_event_log.append(update_data) except KeyError: LOG.error('Invalid fsm_update message received!') def handle_fsm_step(self, **kwargs): """ Called in case the TFW FSM has stepped. :param kwargs: fsm_update 'data' field """