Отслеживание telnetlib Python

У меня есть приложение, которое вызывает 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?

Спасибо.


person JS.    schedule 06.04.2011    source источник


Ответы (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 и напрямую проверил сетевой сеанс.

person JimB    schedule 06.04.2011

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

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

person JS.    schedule 10.05.2012