Add SIGINT and SIGTERM signal handler

This commit is contained in:
Andrew Kay 2019-12-01 15:59:49 -06:00
parent c4f45b6ea9
commit 73b5955d60
2 changed files with 35 additions and 4 deletions

View File

@ -1,4 +1,5 @@
import time
import signal
import logging
import argparse
from serial import Serial
@ -12,6 +13,8 @@ from .keymap_3483 import KEYMAP as KEYMAP_3483
logging.basicConfig(level=logging.INFO)
controller = None
def _get_keymap(terminal_id, extended_id):
keymap = KEYMAP_3278_2
@ -31,7 +34,22 @@ def _create_session(args, terminal):
raise ValueError('Unsupported emulator')
def _signal_handler(number, frame):
global controller
print('Stopping controller...')
if controller:
controller.stop()
controller = None
signal.signal(signal.SIGINT, _signal_handler)
signal.signal(signal.SIGTERM, _signal_handler)
def main():
global controller
parser = argparse.ArgumentParser(description=('An open replacement for the IBM 3174 '
'Establishment Controller'))

View File

@ -69,6 +69,14 @@ class Controller:
if poll_response:
self._handle_poll_response(poll_response)
self._terminate_session()
if self.terminal:
self.terminal = None
def stop(self):
self.running = False
def _handle_terminal_attached(self, poll_response):
self.logger.info('Terminal attached')
@ -99,10 +107,7 @@ class Controller:
def _handle_terminal_detached(self):
self.logger.info('Terminal detached')
if self.session:
self.session.terminate()
self.session = None
self._terminate_session()
self.terminal = None
@ -119,6 +124,14 @@ class Controller:
self.session.start()
def _terminate_session(self):
if not self.session:
return
self.session.terminate()
self.session = None
def _handle_poll_response(self, poll_response):
if isinstance(poll_response, KeystrokePollResponse):
self._handle_keystroke_poll_response(poll_response)