4 class DirectiveProcessor:
6 rwhois_dir_exp = re.compile(r"V-(\d+\.\d+)", re.I)
8 def __init__(self, db):
11 "rwhois" : self.rwhois_directive,
12 "limit" : self.limit_directive,
13 "holdconnect" : self.hold_directive,
14 "directive" : self.directive_directive,
15 "xfer" : self.xfer_directive
18 def process_directive(self, session, line):
19 d_args = line.lstrip("-").split()
21 if not self.directives.has_key(d_args[0]):
22 session.wfile.write(Rwhois.error_message(400))
25 self.directives[d_args[0]](session, d_args[1:])
28 def rwhois_directive(self, session, arglist):
30 session.wfile.write(Rwhois.error_message(338))
33 mo = DirectiveProcessor.rwhois_dir_exp.match(arglist[0])
35 session.wfile.write(Rwhois.error_message(338))
38 # normally we would make sure that the version given was
41 session.wfile.write(config.banner_string)
42 session.wfile.write("\r\n")
44 def limit_directive(self, session, arglist):
46 limit = int(arglist[0])
47 except (IndexError, ValueError):
48 session.wfile.write(Rwhois.error_message(338))
51 if limit > config.max_limit:
52 limit = config.max_limit
53 elif limit < config.min_limit:
54 limit = config.min_limit
57 session.wfile.write(Rwhois.ok())
59 def hold_directive(self, session, arglist):
61 session.wfile.write(Rwhois.error_message(338))
64 arg = arglist[0].lower()
66 session.holdconnect = True
68 session.holdconnect = False
70 session.wfile.write(Rwhois.error_message(338))
73 session.wfile.write(Rwhois.ok())
75 def directive_directive(self, session, arglist):
78 dirs = self.directives.keys()
81 desc = dir.capitalize()
82 reslist.append("%%directive directive:%s" % dir)
83 reslist.append("%%directive description:%s directive" % desc)
84 session.wfile.write("\r\n".join(reslist))
85 session.wfile.write("\r\n")
86 session.wfile.write(Rwhois.ok())
88 if self.directives.has_key(arglist[0]):
90 desc = dir.capitalize()
91 session.wfile.write("%%directive directive:%s\r\n" % dir)
92 session.wfile.write("%%directive description:%s directive\r\n"
95 session.wfile.write(Rwhois.error_message(400))
97 session.wfile.write(Rwhois.ok())
100 def xfer_directive(self, session, arglist):
102 session.wfile.write(Rwhois.error_message(338))
105 aa = arglist[0].lower()
109 for arg in arglist[1:]:
110 if arg.startswith("class="):
112 elif arg.startswith("attribute="):
113 attr = arg[10:].lower()
114 if attr: attr_list.append(attr)
116 # check the constraints
117 if not self.db.is_autharea(aa):
118 session.wfile.write(Rwhois.error_message((340, aa)))
120 if oc and not self.db.is_objectclass(oc):
121 session.wfile.write(Rwhois.error_message((341, oc)))
124 for attr in attr_list:
125 if not self.db.is_attribute(attr):
126 session.wfile.write(Rwhois.error_message((342, attr)))
129 # now iterate over the entire dataset looking for objects that
130 # match our criteria.
132 objs = self.db.object_iterator()
135 # Note: in theory, we should leverage QueryProcessors
137 if obj.get_attr_value("auth-area").lower() != aa:
139 if oc and obj.get_attr_value("class-name").lower() != oc:
143 session.wfile.write(obj.attrs_to_wire_str(attr_list, "%xfer "))
145 session.wfile.write(obj.to_wire_str("%xfer "))
146 session.wfile.write("\r\n%xfer \r\n");
148 session.wfile.write(Rwhois.ok())
151 if __name__ == '__main__':
156 session = Session.Context()
157 session.wfile = sys.stdout
161 db.init_schema(sys.argv[1])
162 for data_file in sys.argv[2:]:
163 db.load_data(data_file)
166 dp = DirectiveProcessor(db)
168 directives = [ "-rwhois",
169 "-rwhois foo bar baz",
170 "-rwhois V-1.6 noise blah",
182 "-xfer a.com class=contact",
183 "-xfer a.com class=domain attribute=domain-name",
184 "-xfer foo class=bar",
185 "-xfer foo class=bar attribute=baz attribute=boo",
188 for dir in directives:
189 print "trying %r:" % dir
190 print dp.process_directive(session, dir)