«Отслеживание» telnetlib в python

#python #debugging #telnetlib

#python #отладка #telnetlib

Вопрос:

У меня есть приложение, которое вызывает telnetlib.read_until(). По большей части это работает нормально. Однако, когда происходит сбой подключения к telnet моего приложения, трудно отладить точную причину. Это мой скрипт или подключение к серверу ненадежное? (Это лаборатория разработки, поэтому здесь много сомнительных серверов).

Что я хотел бы сделать, так это иметь возможность легко отслеживать данные, помещенные в подготовленную очередь, прежде чем мое приложение вызовет telnetlib.read_until() (надеюсь, таким образом избегая влияния на работу моего приложения.)

Копаться в telnetlib.py Я обнаружил, что ‘buf[0]’ — это как раз те данные, которые мне нужны: недавно добавленные данные без повторений, вызванных отслеживанием ‘cookedq’. Я могу вставить строку прямо перед концом telnetlib.process_rawq(), чтобы распечатать обработанные данные по мере их получения с сервера.

 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]
  

Это работает хорошо. Я могу видеть данные почти в точности такими, какие были получены моим приложением, вообще не влияя на его работу.

Вот вопрос: есть ли более привлекательный способ добиться этого? Этот подход является базовым и работает, но мне придется не забывать вносить это изменение каждый раз, когда я обновляю библиотеки Python.

Мои попытки просто расширить telnet.process_rawq() не увенчались успехом, поскольку buf является внутренним для telnet.process_rawq()

Есть ли (более питонический) способ отслеживать это telnetlib.process_rawq()-внутреннее значение без изменения telnetlib.py ?

Спасибо.

Ответ №1:

Я только что нашел гораздо лучшее решение (прочитав код, да!)

в telnetlib уже встроена опция вывода отладки. Просто вызовите set_debuglevel(1), и Боб станет вашим дядей.

Ответ №2:

Самый простой способ — обезьяньим способом залатать библиотеку. Скопируйте и вставьте функцию, которую вы хотите изменить, в свой исходный код (к сожалению, process_rawq — довольно большая функция), и измените ее по мере необходимости. Затем вы можете заменить метод в классе своим собственным.

 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
  

В качестве альтернативы вы могли бы попробовать встроенную в модуль telnetlib функцию отладки с set_debuglevel(1) , которая выводит много информации в стандартный вывод.

В этой ситуации я бы предпочел просто захватить wireshark / tshark / tcpdump и напрямую проверить сетевой сеанс.