[rtems-tools commit] tester: Telnet console reopens the connection if it fails or closes.

Chris Johns chrisj at rtems.org
Thu Oct 5 03:24:19 UTC 2017


Module:    rtems-tools
Branch:    master
Commit:    2ae9b6d52b4623a7bffec5290882496e7602c0be
Changeset: http://git.rtems.org/rtems-tools/commit/?id=2ae9b6d52b4623a7bffec5290882496e7602c0be

Author:    Chris Johns <chrisj at rtems.org>
Date:      Thu Oct  5 14:21:33 2017 +1100

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__":



More information about the vc mailing list