def read(self) -> bytes: """Read data via socket/serial interface.""" if self.settings.local_testing_mode: while True: try: return self.interface.recv() except KeyboardInterrupt: pass except EOFError: graceful_exit("IPC client disconnected.") else: while True: try: start_time = 0.0 read_buffer = bytearray() while True: read = self.interface.read(1000) if read: start_time = time.monotonic() read_buffer.extend(read) else: if read_buffer: delta = time.monotonic() - start_time if delta > self.timeout: return bytes(read_buffer) else: time.sleep(0.001) except KeyboardInterrupt: pass except SerialException: self.establish_serial() self.read()
def establish_serial(self): """Create new serial interface object.""" try: serial_nh = self.search_serial_interface() self.interface = serial.Serial(serial_nh, self.settings.session_if_speed, timeout=0) except SerialException: graceful_exit("SerialException. Ensure $USER is in dialout group.")
def __init__(self, operation: str, local_test: bool) -> None: """Create a new MasterKey object.""" self.master_key = None # type: bytes self.file_name = f'{DIR_USER_DATA}/{operation}_login_data' self.local_test = local_test try: if os.path.isfile(self.file_name): self.load_master_key() else: self.new_master_key() except KeyboardInterrupt: graceful_exit()
def exit_tfc(settings: 'Settings', c_queue: 'Queue', gateway: 'Gateway') -> None: """Exit TFC on TxM/RxM/NH.""" queue_command(EXIT_PROGRAM_HEADER, settings, c_queue) time.sleep(0.5) transmit(UNENCRYPTED_PACKET_HEADER + UNENCRYPTED_EXIT_COMMAND, settings, gateway) if settings.local_testing_mode: time.sleep(0.8) if settings.data_diode_sockets: time.sleep(2.2) graceful_exit()
def client_establish_socket(self) -> None: """Establish IPC client.""" try: phase("Waiting for connection to NH", offset=11) while True: try: socket_number = 5000 if self.settings.data_diode_sockets else 5001 self.interface = multiprocessing.connection.Client( ('localhost', socket_number)) phase("Established", done=True) break except socket.error: time.sleep(0.1) except KeyboardInterrupt: graceful_exit()
def test_graceful_exit(self): with self.assertRaises(SystemExit): graceful_exit('test message') graceful_exit('test message', clear=True)