From 2ae9b6d52b4623a7bffec5290882496e7602c0be Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Thu, 5 Oct 2017 14:21:33 +1100 Subject: tester: Telnet console reopens the connection if it fails or closes. Some hardware can drop a USB serial enumeration when power is remove or applied. This changes make the telnet console more fault tolerant. --- tester/rt/telnet.py | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/tester/rt/telnet.py b/tester/rt/telnet.py index a7f16cd..74c9e49 100644 --- a/tester/rt/telnet.py +++ b/tester/rt/telnet.py @@ -32,6 +32,7 @@ # RTEMS Testing Consoles # +import errno import os import sys import telnetlib @@ -44,6 +45,7 @@ class tty: def __init__(self, dev): self.dev = dev + self.timeout = 5 self.conn = None ds = dev.split(':') self.host = ds[0] @@ -54,12 +56,8 @@ class tty: self.port = int(ds[1]) except: raise error.general('invalid port: %s' % (dev)) - try: - self.conn = telnetlib.Telnet(self.host, self.port, 5) - except IOError as ioe: - raise error.general('opening telnet dev: %s: %s' % (dev, ioe)) - except: - raise error.general('opening telnet dev: %s: unknown' % (dev)) + self.conn = telnetlib.Telnet() + self._reopen() def __del__(self): if self.conn: @@ -72,6 +70,14 @@ class tty: s = 'host: %s port: %d' % ((self.host, self.port)) return s + def _reopen(self): + try: + self.conn.open(self.host, self.port, self.timeout) + except IOError as ioe: + raise error.general('opening telnet dev: %s: %s' % (dev, ioe)) + except: + raise error.general('opening telnet dev: %s: unknown' % (dev)) + def off(self): self.is_on = False @@ -82,10 +88,18 @@ class tty: pass def read(self): + reopen = False try: data = self.conn.read_very_eager() + except IOError as ioe: + if ioe.errno == errno.ECONNREFUSED: + reopen = True + data = '' except EOFError: + reopen = True data = '' + if reopen: + self._reopen() return data if __name__ == "__main__": -- cgit v1.2.3