Initial revision
[python-rwhoisd.git] / rwhoisd / RwhoisServer.py
1 #! /usr/bin/python
2
3 import sys, socket, SocketServer
4
5 import config, Session
6 import QueryParser, QueryProcessor, DirectiveProcessor, Rwhois
7
8
9 # server-wide variables
10
11 query_processor     = None
12 directive_processor = None
13
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,
18                                         RequestHandlerClass)
19
20     def verify_request(self, request, client_address):
21         # implement access control here
22         return True
23
24 class RwhoisHandler(SocketServer.StreamRequestHandler):
25
26     def readline(self):
27         try:
28             return self.rfile.readline().strip()[:1024]
29         except KeyboardInterrupt:
30             self.quit_flag = True
31             return
32
33     def handle(self):
34
35         self.quit_flag = False
36
37         # output a banner
38         self.wfile.write(config.banner_string);
39         self.wfile.write("\r\n");
40
41         # get a session.
42         session = Session.Context()
43         session.rfile = self.rfile
44         session.wfile = self.wfile
45
46         # first line
47         line = self.readline()
48
49         while not self.rfile.closed:
50             if not line:
51                 line = self.readline()
52                 continue
53
54             if line.startswith("-"):
55                 self.handle_directive(session, line)
56             else:
57                 self.handle_query(session, line)
58                 if not session.holdconnect:
59                     self.quit_flag = True
60
61             self.wfile.flush()
62
63             # check to see if we were asked to quit
64             if self.quit_flag: break
65
66             # next line of input
67             line = self.readline()
68
69         print "done with", self.client_address
70
71     def handle_directive(self, session, line):
72         if (line.startswith("-quit")):
73             self.quit_flag = True
74             self.wfile.write(Rwhois.ok())
75             return
76         directive_processor.process_directive(session, line)
77
78     def handle_query(self, session, line):
79         query_processor.process_query(session, line)
80
81
82 def usage(pname):
83     print """usage: %s schema_file data_file [data_file ...]""" % pname
84     sys.exit(64)
85     
86 def init(argv):
87     import MemDB
88
89     if len(argv) < 3: usage(argv[0])
90     schema_file = argv[1]
91     data_files  = argv[2:]
92     
93     db = MemDB.MemDB()
94
95     db.init_schema(schema_file)
96     for df in data_files:
97         db.load_data(df)
98     db.index_data()
99
100     QueryParser.db = db
101
102     global query_processor, directive_processor
103     
104     query_processor     = QueryProcessor.QueryProcessor(db)
105     directive_processor = DirectiveProcessor.DirectiveProcessor(db)
106
107 def serve():
108     # initialize the TCP server
109     server = RwhoisTCPServer((config.server_address, config.port),
110                              RwhoisHandler)
111
112     # and handle incoming connections
113     try:
114         if not config.server_address:
115             print "listening on port %d" % config.port
116         else:
117             print "listening on %s port %d" % \
118                   (config.server_address, config.port)
119         server.serve_forever()
120     except (KeyboardInterrupt, SystemExit):
121         print "interrupted. exiting."
122
123     print "finished serving"
124     sys.exit(0)
125
126 if __name__ == "__main__":
127
128     init(sys.argv)
129     serve()
130