2014-01-07 94 views
0

我想在python中創建ftp服務器,它將使用REST API從我的web服務器獲取文件結構並顯示在MAC OS的文件系統中。任何人都可以告訴我如何完成這項任務?我想在OSX的文件系統中顯示文件夾結構,它將成爲Web服務器上文件和文件夾結構的鏡像副本。 任何人都可以告訴我如何將python中的ftp服務器連接到我的web服務器?使用python和扭曲框架的FTP服務器

下面是我找到的獲取列表並建立連接的代碼。

有人可以建議我如何實現我的目標?

class DTP(object, protocol.Protocol): 
    implements(interfaces.IConsumer) 

    isConnected = False 

    _cons = None 
    _onConnLost = None 
    _buffer = None 

    def connectionMade(self): 
     self.isConnected = True 
     self.factory.deferred.callback(None) 
     self._buffer = [] 

    def connectionLost(self, reason): 
     self.isConnected = False 
     if self._onConnLost is not None: 
      self._onConnLost.callback(None) 

    def sendLine(self, line): 
     self.transport.write(line + '\r\n') 


    def _formatOneListResponse(self, name, size, directory, permissions, hardlinks, modified, owner, group): 
     def formatMode(mode): 
      return ''.join([mode & (256 >> n) and 'rwx'[n % 3] or '-' for n in range(9)]) 

     def formatDate(mtime): 
      now = time.gmtime() 
      info = { 
       'month': _months[mtime.tm_mon], 
       'day': mtime.tm_mday, 
       'year': mtime.tm_year, 
       'hour': mtime.tm_hour, 
       'minute': mtime.tm_min 
       } 
      if now.tm_year != mtime.tm_year: 
       return '%(month)s %(day)02d %(year)5d' % info 
      else: 
       return '%(month)s %(day)02d %(hour)02d:%(minute)02d' % info 

     format = ('%(directory)s%(permissions)s%(hardlinks)4d ' 
        '%(owner)-9s %(group)-9s %(size)15d %(date)12s ' 
        '%(name)s') 

     return format % { 
      'directory': directory and 'd' or '-', 
      'permissions': formatMode(permissions), 
      'hardlinks': hardlinks, 
      'owner': owner[:8], 
      'group': group[:8], 
      'size': size, 
      'date': formatDate(time.gmtime(modified)), 
      'name': name} 

    def sendListResponse(self, name, response): 
     self.sendLine(self._formatOneListResponse(name, *response)) 


    # Proxy IConsumer to our transport 
    def registerProducer(self, producer, streaming): 
     return self.transport.registerProducer(producer, streaming) 

    def unregisterProducer(self): 
     self.transport.unregisterProducer() 
     self.transport.loseConnection() 

    def write(self, data): 
     if self.isConnected: 
      return self.transport.write(data) 
     raise Exception("Crap damn crap damn crap damn") 


    # Pretend to be a producer, too. 
    def _conswrite(self, bytes): 
     try: 
      self._cons.write(bytes) 
     except: 
      self._onConnLost.errback() 

    def dataReceived(self, bytes): 
     if self._cons is not None: 
      self._conswrite(bytes) 
     else: 
      self._buffer.append(bytes) 

    def _unregConsumer(self, ignored): 
     self._cons.unregisterProducer() 
     self._cons = None 
     del self._onConnLost 
     return ignored 

    def registerConsumer(self, cons): 
     assert self._cons is None 
     self._cons = cons 
     self._cons.registerProducer(self, True) 
     for chunk in self._buffer: 
      self._conswrite(chunk) 
     self._buffer = None 
     if self.isConnected: 
      self._onConnLost = d = defer.Deferred() 
      d.addBoth(self._unregConsumer) 
      return d 
     else: 
      self._cons.unregisterProducer() 
      self._cons = None 
      return defer.succeed(None) 

    def resumeProducing(self): 
     self.transport.resumeProducing() 

    def pauseProducing(self): 
     self.transport.pauseProducing() 

    def stopProducing(self): 
     self.transport.stopProducing() 

回答

0

除了實施自己的DTP,您應該探索實施twisted.protocols.ftp.IFTPShell。如果你這樣做,Twisted會負責你所有的協議邏輯,包括DTP,你所要做的就是負責製作正確的文件列表和內容。

看看twisted.protocols.ftp.FTPAnonymousShell是如何實現的,以瞭解這種情況。

看看twisted.protocols.ftp.BaseFTPRealmdoc/core/examples/ftpserver.py,看看如何將你的IFTPShell實現集成到基於Twisted的FTP服務器中。

+0

@ Jean-Paul Calderone:感謝您的回覆,您能否提供一些有用的鏈接或任何代碼,以便我如何使用它? – Vijay

+0

我檢查了以下鏈接,但沒有得到任何想法如何使用這與目標C. http://twistedmatrix.com/trac/browser/tags/releases/twisted-8.2.0/twisted/protocols/ftp.py# L1512 – Vijay

+0

該鏈接適用於5年或6年前的8.2.0源代碼。您可能想要瀏覽最新版本。以下是當前的ftp服務器示例,