1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.
"""
An example of using the FTP client
"""
# Standard library imports
from io import BytesIO
from twisted.internet import reactor
from twisted.internet.protocol import ClientCreator, Protocol
# Twisted imports
from twisted.protocols.ftp import FTPClient, FTPFileListProtocol
from twisted.python import usage
class BufferingProtocol(Protocol):
"""Simple utility class that holds all data written to it in a buffer."""
def __init__(self):
self.buffer = BytesIO()
def dataReceived(self, data):
self.buffer.write(data)
# Define some callbacks
def success(response):
print("Success! Got response:")
print("---")
if response is None:
print(None)
else:
print("\n".join(response))
print("---")
def fail(error):
print("Failed. Error was:")
print(error)
def showFiles(result, fileListProtocol):
print("Processed file listing:")
for file in fileListProtocol.files:
print(
" {}: {} bytes, {}".format(file["filename"], file["size"], file["date"])
)
print(f"Total: {len(fileListProtocol.files)} files")
def showBuffer(result, bufferProtocol):
print("Got data:")
print(bufferProtocol.buffer.getvalue())
class Options(usage.Options):
optParameters = [
["host", "h", "localhost"],
["port", "p", 21],
["username", "u", "anonymous"],
["password", None, "twisted@"],
["passive", None, 0],
["debug", "d", 1],
]
def run():
# Get config
config = Options()
config.parseOptions()
config.opts["port"] = int(config.opts["port"])
config.opts["passive"] = int(config.opts["passive"])
config.opts["debug"] = int(config.opts["debug"])
# Create the client
FTPClient.debug = config.opts["debug"]
creator = ClientCreator(
reactor,
FTPClient,
config.opts["username"],
config.opts["password"],
passive=config.opts["passive"],
)
creator.connectTCP(config.opts["host"], config.opts["port"]).addCallback(
connectionMade
).addErrback(connectionFailed)
reactor.run()
def connectionFailed(f):
print("Connection Failed:", f)
reactor.stop()
def connectionMade(ftpClient):
# Get the current working directory
ftpClient.pwd().addCallbacks(success, fail)
# Get a detailed listing of the current directory
fileList = FTPFileListProtocol()
d = ftpClient.list(".", fileList)
d.addCallbacks(showFiles, fail, callbackArgs=(fileList,))
# Change to the parent directory
ftpClient.cdup().addCallbacks(success, fail)
# Create a buffer
proto = BufferingProtocol()
# Get short listing of current directory, and quit when done
d = ftpClient.nlst(".", proto)
d.addCallbacks(showBuffer, fail, callbackArgs=(proto,))
d.addCallback(lambda result: reactor.stop())
# this only runs if the module was *not* imported
if __name__ == "__main__":
run()
|