diff --git a/agent/testing/test_sftp.py b/agent/testing/test_sftp.py new file mode 100644 index 0000000..67a55e1 --- /dev/null +++ b/agent/testing/test_sftp.py @@ -0,0 +1,18 @@ + + +from twisted.internet import reactor + +from cybertools.agent.transport.file.sftp import FileTransfer + +def output(x): + print x + +ft = FileTransfer('cy05.de', 22, 'scrat', '...') + +d = ft.upload('text.txt', 'text.txt') +d.addCallback(output) + +reactor.callLater(3, ft.close) +reactor.callLater(4, reactor.stop) + +reactor.run() diff --git a/agent/testing/transporter.cfg b/agent/testing/transporter.cfg index 5434374..bcad40a 100644 --- a/agent/testing/transporter.cfg +++ b/agent/testing/transporter.cfg @@ -10,4 +10,5 @@ scheduler(name='core') logger(name='default', standard=30) transport.remote.server = 'testing' transport.remote.url = 'http://localhost:8123' - +transport.remote.ftp.url = 'http://cy05.de' +transport.remote.ftp.user = 'scrat' diff --git a/agent/transport/file/sftp.py b/agent/transport/file/sftp.py index 174d420..a34cb9e 100644 --- a/agent/transport/file/sftp.py +++ b/agent/transport/file/sftp.py @@ -56,6 +56,7 @@ class FileTransfer(protocol.ClientFactory): if len(self.queue) == 1 and self.channel is not None: # the channel has emptied the queue self.channel.execute() + self.deferred = d return d def close(self): @@ -95,19 +96,28 @@ class SFTPChannel(channel.SSHChannel): def command_upload(self): params = self.params remotePath = params['remotePath'] + localPath = params['localPath'] + self.localFile = open(localPath, 'rb') d = self.client.openFile(remotePath, filetransfer.FXF_WRITE | filetransfer.FXF_CREAT, {}) print 'command_upload', params d.addCallbacks(self.writeChunk, self.logError) - def writeChunk(self, clientFile): - print 'writeChunk', clientFile - params = self.params - d = clientFile.writeChunk(0, 'Hello World') + def writeChunk(self, remoteFile): + # data = self.localFile.read(chunkSize) + # if len(data) < chunkSize(): + # write rest + # addCallbacks(self.finished, self.logError) + print 'writeChunk', remoteFile + d = remoteFile.writeChunk(0, 'Hello World') + d.addCallbacks(self.writeChunk, self.logError) def logError(self, reason): print 'error', reason + def finished(self, result): + self.deferred.callback('finished') + # classes for managing the SSH protocol and connection diff --git a/agent/transport/remote.py b/agent/transport/remote.py index 14245f4..3336860 100644 --- a/agent/transport/remote.py +++ b/agent/transport/remote.py @@ -28,6 +28,7 @@ from twisted.internet import defer from zope.interface import implements from cybertools.agent.system import rpcapi +#from cybertools.agent.system import sftpapi from cybertools.agent.base.agent import Master from cybertools.agent.core.agent import QueueableAgent from cybertools.agent.interfaces import ITransporter @@ -55,6 +56,7 @@ class Transporter(QueueableAgent): config = master.config self.serverURL = config.transport.remote.url self.server = rpcapi.xmlrpc.Proxy(self.serverURL) + #self.ftpServer = FileTransfer(host, port, username, password) #self.method = params[method] #self.machineName = params[machineName] #self.userName = params[userName] @@ -69,6 +71,7 @@ class Transporter(QueueableAgent): """ #return self.server.callRemote('getMetadata', resource.metadata) self.deferred = defer.Deferred() + # d = self.ftpServer.upload() d = self.server.callRemote('getMetadata', resource.metadata) d.addCallback(self.transferDone) d.addErrback(self.errorHandler)