twisted : savoir quelle méthode appelle une classe

+4 votes

Je cherche à modifier le comportement d'un serveur SSH. Je me base sur le framework twisted en m'inspirant de ça.

Une partie de ce que je veux faire est simple et consiste à surcharcher une méthode du framework twisted:

class UnixSSHdFactory(factory.SSHFactory):
publicKeys = { 
    'ssh-rsa': keys.Key.fromString(data=publicKey)
}   
privateKeys = { 
    'ssh-rsa': keys.Key.fromString(data=privateKey)
}   
services = { 
    'ssh-userauth': userauth.SSHUserAuthServer,
    'ssh-connection': MySSHConnection
}

Je redéfinis la classe SSHConnection avec MySSHConnection qui en hérite et surcharge les méthodes qui m'intéressent. Je m'assure que ma classe est appelée et non pas celle par défaut en attribuant à ssh-connection la valeur MySSHConnection.

Mais je souhaite également agir sur une fonction de la classe SSHChannel. Elle est définit dans le fichier channel.py. Si je modifie directement la méthode dans ce fichier, ça fonctionne mais pose de gros soucis (très sale).

Si je me contente de redéfinir la classe qui implémente cette méthode, ça ne marche pas, je ne sais pas à quel niveau cette classe est appelée, et twisted récupère la classe de sa librairie par défaut (normal).

Existe-il un moyen simple de savoir comment un objet est créé? par quelle fonction l'objet SSHChannel est instancié par twisted? Je cherche à connaitre l'enchainement de classes qui aboutissent à l'utilisation de cette méthode, mais je ne trouve pas. Ma question est d'avantage niveau méthode que de trouver une solution technique.

demandé 20-Jan-2016 par chibollo (170 points)
edité 20-Jan-2016 par chibollo

la réponse se trouve peut-être du côté de la réflexion (= avoir des infos sur une classe donnée).

un exemple tiré de SO, comme ça tu peux connaître d'où vient une classe donnée, connaître ses méthodes, ses attributs etc...

Après twisted je ne connais pas.

En mode sale, tu peux insérer un point de debug pdb (ou ipdb, plus fancy) dans ton fichier channel.py, ca te permettra de naviguer dans le code au runtime.

Sinon en jouant avec le module inspect tu peut extraire des infos du style 'quel est l'objet qui appelle la méthode courante' (cf http://stackoverflow.com/a/2654130 )

En utilisant les deux ensemble, tu devrais pouvoir trouver ton bonheur.

Ok, super, ça me donne des éléments pour mieux comprendre comment investiguer, ce que je cherchais. Je devrais pouvoir m'en sortir avec vos pointeurs.

@ boblinux :

la réponse se trouve peut-être du côté de la réflexion (= avoir des
infos sur une classe donnée).

un exemple tiré de SO, comme ça tu peux connaître d'où vient une
classe donnée, connaître ses méthodes, ses attributs etc...

@ jc :

En mode sale, tu peux insérer un point de debug pdb (ou ipdb, plus
fancy) dans ton fichier channel.py, ca te permettra de naviguer dans
le code au runtime.

Sinon en jouant avec le module inspect tu peut extraire des infos du
style 'quel est l'objet qui appelle la méthode courante' (cf
http://stackoverflow.com/a/2654130 )

En utilisant les deux ensemble, tu devrais pouvoir trouver ton
bonheur.

@ chibolo :

Ok, super, ça me donne des éléments pour mieux comprendre comment
investiguer, ce que je cherchais. Je devrais pouvoir m'en sortir avec
vos pointeurs.

Ca m'intéresse également...

1 Réponse

+2 votes

Edite temporairement channel.py pour y mettre :

def __init__(self, localWindow = 0, localMaxPacket = 0,
                       remoteWindow = 0, remoteMaxPacket = 0,
                       conn = None, data=None, avatar = None):

        import traceback
        where = self.traceback = traceback.extract_stack()[-2]
        print("SSHChannel new instance", self.__class__.__name__, where)

Ca affichera l'endroit où est instancié la classe, ainsi que son nom puisque c'est probablement une classe fille qui est utilisée.

répondu 3-Fev-2016 par Sam (5,000 points)
...