class Defender(Communicator): RUN_SECONDS = 25 def __init__(self, fingerprint, host, port, other_host, other_port, name=None, match_all_but=0, original=None): super().__init__('defender', host, port, other_host, other_port) self.__fingerprints = fingerprint self.__program = Program(fingerprint, name, match_all_but=match_all_but, original=original) self.__result = None def start(self) -> None: super().start() sleep(1) self.send('DOWNLOAD %s' % self.__program.name) def handle_request(self, data): print('%-10s IN : %s' % (self.name, data)) parts = data.split(' ') if parts[0] == 'DOWNLOAD' and parts[-1] == 'OK': self.send(data.replace('DOWNLOAD', 'RUN').replace('OK', str(Defender.RUN_SECONDS))) elif parts[0] == 'RUN' and parts[-1] == 'SECONDS': self.run_defense(parts[1], parts[2], parts[4]) return False else: print('Invalid message:', data, flush=True) return True def run_defense(self, name, seconds, start_seconds): s = int(seconds) + int(start_seconds) if self.__program.name == name: print('Starting test run for %s seconds' % s, flush=True) self.__result = self.__program.test_run(s, save=True) else: raise AssertionError('Expected program %s to be loaded, got %s instead' % (name, self.__program.name)) print('Printing analysis', flush=True) self.__program.print_analysis(self.__result) def result(self): return self.__result