34 lines
1.2 KiB
Python
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)
|