On 28 September 2012 15:32, Tom Sheffler <tom.sheff...@gmail.com> wrote:
> Hi Paul - > > I'm very new to twisted (I've only just started using it, so I apologise if >> anything I ask is seemingly obvious!). >> I'm looking to try and set up a FTP server which will serve a file >> structure and files which don't exists on the server (the file structure >> information is stored on cassandra, and the files are on s3). The file >> structure and files will also be unique to the user, so different logins >> will generate the file structure for that particular user, but I guess I >> can adress that later. > > > > Here is a quick sketch of some of the steps ... but beware, I haven't > debugged this. You'll want to subclass twisted.protocols.ftp.FTPShell with > a new command interpreter > > class PaulsFTPShell(FTPShell): > .... > > The you'll need to write a Realm that returns an instance of your FTP > Shell: > > class PaulsFTPRealm(FTPRealm): > """ > @type anonymousRoot: L{twisted.python.filepath.FilePath} > @ivar anonymousRoot: Root of the filesystem to which anonymous > users will be granted access. > """ > implements(portal.IRealm) > > def __init__(self, ....) > .... > > def requestAvatar(self, avatarId, mind, *interfaces): > for iface in interfaces: > if iface is IFTPShell: > if avatarId is checkers.ANONYMOUS: > avatar = None > else: > avatar = PaulsFTPShell( ...) > > return IFTPShell, avatar, getattr(avatar, 'logout', > lambda: None) > raise NotImplementedError("Only IFTPShell interface is supported > by this realm") > > > Then you'll stich it all together like this: > > > f = FTPFactory() > r = PaulsFTPRealm() > p = Portal.Portal(r) > p.registerChecker(...) > > f.portal = p > > Hope this helps get you started. > > > _______________________________________________ > Twisted-Python mailing list > Twisted-Python@twistedmatrix.com > http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python > > Thank you. I've made quite a bit of progress and now have my own Portal, CredentialsChecker, Realm, Shell, and FilePath object. One thing I haven't been able to work out is, when I override, lets say listdir for example in FilePath, I need to make a webcall to find out the folder contents, how can I make this call asynchronously? I'm guessing I need to used deferred in someway, but seeing as listdir doesn't return deferred objects I'm not sure how to make it work. As listdir gets called from the Shell I guess I could change how blocking calls in my FilePath object get called?
_______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python