/Demo/pdist/README
http://unladen-swallow.googlecode.com/ · #! · 121 lines · 91 code · 30 blank · 0 comment · 0 complexity · 0ba61ac915224fa0a88addaae8f339a9 MD5 · raw file
- Filesystem, RCS and CVS client and server classes
- =================================================
- *** See the security warning at the end of this file! ***
- This directory contains various modules and classes that support
- remote file system operations.
- CVS stuff
- ---------
- rcvs Script to put in your bin directory
- rcvs.py Remote CVS client command line interface
- cvslib.py CVS admin files classes (used by rrcs)
- cvslock.py CVS locking algorithms
- RCS stuff
- ---------
- rrcs Script to put in your bin directory
- rrcs.py Remote RCS client command line interface
- rcsclient.py Return an RCSProxyClient instance
- (has reasonable default server/port/directory)
- RCSProxy.py RCS proxy and server classes (on top of rcslib.py)
- rcslib.py Local-only RCS base class (affects stdout &
- local work files)
- FSProxy stuff
- -------------
- sumtree.py Old demo for FSProxy
- cmptree.py First FSProxy client (used to sync from the Mac)
- FSProxy.py Filesystem interface classes
- Generic client/server stuff
- ---------------------------
- client.py Client class
- server.py Server class
- security.py Security mix-in class (not very secure I think)
- Other generic stuff
- -------------------
- cmdfw.py CommandFrameWork class
- (used by rcvs, should be used by rrcs as well)
- Client/Server operation
- -----------------------
- The Client and Server classes implement a simple-minded RPC protocol,
- using Python's pickle module to transfer arguments, return values and
- exceptions with the most generality. The Server class is instantiated
- with a port number on which it should listen for requests; the Client
- class is instantiated with a host name and a port number where it
- should connect to. Once a client is connected, a TCP connection is
- maintained between client and server.
- The Server class currently handles only one connection at a time;
- however it could be rewritten to allow various modes of operations,
- using multiple threads or processes or the select() system call as
- desired to serve multiple clients simultaneously (when using select(),
- still handling one request at a time). This would not require
- rewriting of the Client class. It may also be possible to adapt the
- code to use UDP instead of TCP, but then both classes will have to be
- rewritten (and unless extensive acknowlegements and request serial
- numbers are used, the server should handle duplicate requests, so its
- semantics should be idempotent -- shrudder).
- Even though the FSProxy and RCSProxy modules define client classes,
- the client class is fully generic -- what methods it supports is
- determined entirely by the server. The server class, however, must be
- derived from. This is generally done as follows:
- from server import Server
- from client import Client
- # Define a class that performs the operations locally
- class MyClassLocal:
- def __init__(self): ...
- def _close(self): ...
- # Derive a server class using multiple inheritance
- class MyClassServer(MyClassLocal, Server):
- def __init__(self, address):
- # Must initialize MyClassLocal as well as Server
- MyClassLocal.__init__(self)
- Server.__init__(self, address)
- def _close(self):
- Server._close()
- MyClassLocal._close()
- # A dummy client class
- class MyClassClient(Client): pass
- Note that because MyClassLocal isn't used in the definition of
- MyClassClient, it would actually be better to place it in a separate
- module so the definition of MyClassLocal isn't executed when we only
- instantiate a client.
- The modules client and server should probably be renamed to Client and
- Server in order to match the class names.
- *** Security warning: this version requires that you have a file
- $HOME/.python_keyfile at the server and client side containing two
- comma- separated numbers. The security system at the moment makes no
- guarantees of actuallng being secure -- however it requires that the
- key file exists and contains the same numbers at both ends for this to
- work. (You can specify an alternative keyfile in $PYTHON_KEYFILE).
- Have a look at the Security class in security.py for details;
- basically, if the key file contains (x, y), then the security server
- class chooses a random number z (the challenge) in the range
- 10..100000 and the client must be able to produce pow(z, x, y)
- (i.e. z**x mod y).