| 1 | """RPC Server module."""
|
|---|
| 2 |
|
|---|
| 3 | import sys
|
|---|
| 4 | import socket
|
|---|
| 5 | import pickle
|
|---|
| 6 | from fnmatch import fnmatch
|
|---|
| 7 | from repr import repr
|
|---|
| 8 |
|
|---|
| 9 |
|
|---|
| 10 | # Default verbosity (0 = silent, 1 = print connections, 2 = print requests too)
|
|---|
| 11 | VERBOSE = 1
|
|---|
| 12 |
|
|---|
| 13 |
|
|---|
| 14 | class Server:
|
|---|
| 15 |
|
|---|
| 16 | """RPC Server class. Derive a class to implement a particular service."""
|
|---|
| 17 |
|
|---|
| 18 | def __init__(self, address, verbose = VERBOSE):
|
|---|
| 19 | if type(address) == type(0):
|
|---|
| 20 | address = ('', address)
|
|---|
| 21 | self._address = address
|
|---|
| 22 | self._verbose = verbose
|
|---|
| 23 | self._socket = None
|
|---|
| 24 | self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|---|
| 25 | self._socket.bind(address)
|
|---|
| 26 | self._socket.listen(1)
|
|---|
| 27 | self._listening = 1
|
|---|
| 28 |
|
|---|
| 29 | def _setverbose(self, verbose):
|
|---|
| 30 | self._verbose = verbose
|
|---|
| 31 |
|
|---|
| 32 | def __del__(self):
|
|---|
| 33 | self._close()
|
|---|
| 34 |
|
|---|
| 35 | def _close(self):
|
|---|
| 36 | self._listening = 0
|
|---|
| 37 | if self._socket:
|
|---|
| 38 | self._socket.close()
|
|---|
| 39 | self._socket = None
|
|---|
| 40 |
|
|---|
| 41 | def _serverloop(self):
|
|---|
| 42 | while self._listening:
|
|---|
| 43 | self._serve()
|
|---|
| 44 |
|
|---|
| 45 | def _serve(self):
|
|---|
| 46 | if self._verbose: print "Wait for connection ..."
|
|---|
| 47 | conn, address = self._socket.accept()
|
|---|
| 48 | if self._verbose: print "Accepted connection from %s" % repr(address)
|
|---|
| 49 | if not self._verify(conn, address):
|
|---|
| 50 | print "*** Connection from %s refused" % repr(address)
|
|---|
| 51 | conn.close()
|
|---|
| 52 | return
|
|---|
| 53 | rf = conn.makefile('r')
|
|---|
| 54 | wf = conn.makefile('w')
|
|---|
| 55 | ok = 1
|
|---|
| 56 | while ok:
|
|---|
| 57 | wf.flush()
|
|---|
| 58 | if self._verbose > 1: print "Wait for next request ..."
|
|---|
| 59 | ok = self._dorequest(rf, wf)
|
|---|
| 60 |
|
|---|
| 61 | _valid = ['192.16.201.*', '192.16.197.*', '132.151.1.*', '129.6.64.*']
|
|---|
| 62 |
|
|---|
| 63 | def _verify(self, conn, address):
|
|---|
| 64 | host, port = address
|
|---|
| 65 | for pat in self._valid:
|
|---|
| 66 | if fnmatch(host, pat): return 1
|
|---|
| 67 | return 0
|
|---|
| 68 |
|
|---|
| 69 | def _dorequest(self, rf, wf):
|
|---|
| 70 | rp = pickle.Unpickler(rf)
|
|---|
| 71 | try:
|
|---|
| 72 | request = rp.load()
|
|---|
| 73 | except EOFError:
|
|---|
|
|---|