2

I have an application that calls telnetlib.read_until(). For the most part, it works fine. However when my app's telnet connection fails, it's hard to debug the exact cause. Is it my script or is the server connection dodgy? (This is a development lab, so there are a lot of dodgy servers).

What I would like to do is to be able to easily snoop the data placed into the cooked queue before my app calls telnetlib.read_until() (thereby hopefully avoiding impacting my app's operation.)

Poking around in telnetlib.py, I found that 'buf[0]' is just the data I want: the newly-added data without the repetition caused by snooping 'cookedq'. I can insert a line right before the end of telnetlib.process_rawq() to print out the processed data as it is received from the server.

telnetlib.process_rawq ...
    ...  
    self.cookedq = self.cookedq + buf[0]
    print("Dbg: Cooked Queue contents = %r" % buf[0]  <= my added debug line
    self.sbdataq = self.sbdataq + buf[1]

This works well. I can see the data almost exactly as received by my app without impacting its operation at all.

Here's the question: Is there a snazzier way to accomplish this? This approach is basic and works, but I'll have to remember to re-make this change every time I upgrade Python's libraries.

My attempts to simply extend telnet.process_rawq() were unsuccessful, as buf is internal to telnet.process_rawq()

Is there a (more pythonic) way to snoop this telnetlib.process_rawq()-internal value without modifying telnetlib.py?

Thanks.

JS.
  • 14,781
  • 13
  • 63
  • 75

2 Answers2

2

I just found a much better solution (by reading the code, duh!)

telnetlib has a debugging output option already built-in. Just call set_debuglevel(1) and Bob's your uncle.

JS.
  • 14,781
  • 13
  • 63
  • 75
1

The easy hack is to monkey patch the library. Copy and paste the function you want to change into your source (unfortunately, process_rawq is a rather large function), and modify it as you need. You can then replace the method in the class with your own.

import telnetlib

def process_rawq(self):
    #existing stuff
    self.cookedq = self.cookedq + buf[0]
    print("Dbg: Cooked Queue contents = %r" % buf[0]
    self.sbdataq = self.sbdataq + buf[1]

telnetlib.Telnet.process_rawq = process_rawq

You could alternatively try the debugging built-in to the telnetlib module with set_debuglevel(1), which prints a lot of info to stdout.

In this situation, I would tend to just grab wireshark/tshark/tcpdump and directly inspect the network session.

JimB
  • 104,193
  • 13
  • 262
  • 255