2017-12-15 10 views
0

が受信したFTPコマンドをログに記録する方法を私はFTPサーバーとしてねじれ使用していますか?ツイストサーバー

+0

この例は役立つでしょうか?あなたが興味を持っているログを追加するために、Twistedにパッチを提供することです。 http://twistedmatrix.com/documents/current/_downloads/ftpclient.py – BoboDarph

答えて

1

FTPRealmは、ファイルシステムへのアクセスを仲介するためにFTPAnonymousShellインスタンスとFTPShellインスタンス(アバター)を作成します。

これらのクラスはどちらもIFTPShellを実装しています。 1つの解決策は、作成するアバターにロギングラッパーを適用するFTPRealmのラッパーを作成することです。

from twisted.python.components import proxyForInterface 

class WrappingRealm(proxyForInterface(IRealm)): 
    wrap = staticmethod(logging_wrapper) 

    def requestAvatar(self, *a, **kw): 
     d = maybeDeferred(
      super(WrappingRealm, self).requestAvatar, 
      *a, **kw 
     ) 
     def got_avatar((iface, avatar, logout)): 
      return (iface, self.wrap(avatar), logout) 
     d.addCallback(got_avatar) 
     return d 

などlogging_wrapper何かを実装:あなたがインターフェイスの各メソッドのロギングを追加する必要がありますので、これは少し面倒です

class _LoggingFTPShell(proxyForInterface(IFTPShell)): 
    def makeDirectory(self, path): 
     log(avatar=self.avatar, operation="makeDirectory", path=path) 
     return super(_LoggingFTPShell, self).makeDirectory(path) 

    # The same for the rest of the methods of IFTPShell 
    # ... 

def logging_wrapper(avatar): 
    return _LoggingFTPShell(avatar) 

を。しかし、TwistedのFTPプロトコルの実装では、必要なロギングを実行するための機能がネイティブに提供されていないので、これを回避するのは難しいです。いくつかのメタプログラミングを使うと、タイピングを省くことができます(ただし、複雑さを犠牲にして)。