M2-PT-DRP/source/behaviors/roles/SlaveRole.py

34 lines
1.2 KiB
Python

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)