3 import sys, socket, SocketServer
6 import QueryParser, QueryProcessor, DirectiveProcessor, Rwhois
9 # server-wide variables
11 query_processor = None
12 directive_processor = None
14 class RwhoisTCPServer(SocketServer.ThreadingTCPServer):
15 def __init__(self, server_address, RequestHandlerClass):
16 self.allow_reuse_address = True
17 SocketServer.TCPServer.__init__(self, server_address,
20 def verify_request(self, request, client_address):
21 # implement access control here
24 class RwhoisHandler(SocketServer.StreamRequestHandler):
27 """Read a line of input from the client."""
28 # a simple way of doing this
29 # return self.rfile.readline()
31 data = self.request.recv(1024)
32 if not data: return None
34 lines = data.splitlines(True)
36 # ugh. this totally defeats any pipelining, not that rwhois
37 # clients should be doing that.
38 if len(lines) > 1 and config.verbose:
39 print "%s discarding additional input lines: %r" \
40 % (self.client_address, lines)
45 print repr(self.request)
46 self.quit_flag = False
49 self.wfile.write(config.banner_string);
50 self.wfile.write("\r\n");
53 session = Session.Context()
54 session.rfile = self.rfile
55 session.wfile = self.wfile
58 print "%s accepted connection" % (self.client_address,)
62 line = self.readline()
66 # we can skip blank lines.
70 if line.startswith("-"):
71 self.handle_directive(session, line)
73 self.handle_query(session, line)
74 if not session.holdconnect:
79 # check to see if we were asked to quit
80 if self.quit_flag: break
83 print "%s disconnected" % (self.client_address,)
85 def handle_directive(self, session, line):
87 print "%s directive %s" % (self.client_address, line)
88 if (line.startswith("-quit")):
90 self.wfile.write(Rwhois.ok())
92 directive_processor.process_directive(session, line)
94 def handle_query(self, session, line):
96 print "%s query %s" % (self.client_address, line)
97 query_processor.process_query(session, line)
102 usage: %s [-v] schema_file data_file [data_file ...]
103 -v: verbose """ % pname
111 opts, argv = getopt.getopt(argv[1:], 'v')
114 config.verbose = True
116 if len(argv) < 2: usage(pname)
117 schema_file = argv[0]
118 data_files = argv[1:]
123 db.init_schema(schema_file)
124 for df in data_files:
130 global query_processor, directive_processor
132 query_processor = QueryProcessor.QueryProcessor(db)
133 directive_processor = DirectiveProcessor.DirectiveProcessor(db)
136 # initialize the TCP server
137 server = RwhoisTCPServer((config.server_address, config.port),
140 # and handle incoming connections
142 if not config.server_address:
143 print "listening on port %d" % config.port
145 print "listening on %s port %d" % \
146 (config.server_address, config.port)
147 server.serve_forever()
151 if __name__ == "__main__":