import typing from datetime import timedelta, datetime from source import managers, packets, structures from source.behaviors.roles import base, UndefinedRole from source.utils.crypto.type import CipherType class SlaveRole(base.BaseActiveRole): """ Role used when the machine is declared as a slave. It shall listen for a master and check if everything is working properly """ def __init__(self, manager: "managers.Manager", master_address: tuple): super().__init__(manager) # the address of the server self.master_address = master_address def handle(self): # get our master peer master_peer: structures.Peer = self.manager.peer.peers[self.master_address] # check if we know the network secret key if self.secret_key is None: # if we don't know it, request it packet = packets.RequestKeyPacket() self.manager.communication.send(packet, CipherType.RSA, self.master_address) # check if the master interacted recently if datetime.now() - master_peer.last_interaction > timedelta(seconds=10): # if the master didn't react in a moment, return to undefined mode self.manager.role.current = UndefinedRole(self.manager)