import repository from arizona
[raven.git] / publish / smbaker-experiment / build / viniexperiment / usr / local / bin / vinirspecparse.py
1 import sys
2 import os
3 import string
4 import xml.sax.saxutils
5 import xml.parsers.expat
6
7 """ a quick and dirty VINI rspec parser
8
9     call parse_rspec() file the filename of the rpsec.
10     you'll get back a dictionary where keys are node ids and values are node dicts
11     each node dict contains fields:
12         nodeid
13         hostname
14         sitename
15         siteid
16 """
17
18 def UTOA(x):
19     """ un-unicode a string """\r
20     return x.encode("utf8")\r
21
22
23 class ViniRspecApplication():
24
25    def __init__(self):
26        self.tagStack = []
27        self.tagData = ""
28        self.nodes = {}
29        self.node = None
30        self.siteid = "unknown"
31        pass
32
33    def parse(self, filename=None, contents=None):
34        p = xml.parsers.expat.ParserCreate()
35        p.StartElementHandler = self.handle_start_tag
36        p.EndElementHandler = self.handle_end_tag
37        p.CharacterDataHandler = self.handle_data_wrapper
38        if filename:
39            f = open(filename)
40            p.ParseFile(f)
41            f.close()
42        else:
43            p.Parse(contents)
44
45    def handle_data_wrapper(self, data):
46        self.handle_data(data, 0, len(data))
47
48    def handle_start_tag(self, tag, attrs):
49        self.tagStack.append(tag)
50        self.tagData=""
51        if tag=="node":
52            nodeid = UTOA(attrs.get("id"))
53            self.node = {"nodeid": nodeid, "siteid": self.siteid, "sitename": self.sitename}
54            self.nodes[nodeid] = self.node
55        elif tag=="site":
56            self.siteid = UTOA(attrs.get("id"))
57
58    def handle_data(self, data, start, end):
59        self.tagData = self.tagData + UTOA(data[start:end])
60
61    def handle_end_tag(self, tag):
62        tag = ".".join(self.tagStack)
63
64        if tag.endswith(".node.hostname"):
65            self.node["hostname"] = self.tagData
66        elif tag.endswith(".site.name"):
67            self.sitename = self.tagData
68
69        self.tagStack = self.tagStack[:-1]
70
71 def parse_rspec(fn):
72     app = ViniRspecApplication()
73     app.parse(fn)
74
75     return app.nodes
76
77 def dump(nodes):
78     for nodeid in nodes.keys():
79         node = nodes[nodeid]
80         print nodeid, ":"
81         for key in node:
82             print "   ", key+":", node[key]
83
84 def main():
85     if len(sys.argv)<2:
86         print "syntax: vinirspecparse fn"
87         sys.exit(-1)
88
89     nodes = parse_rspec(sys.argv[1])
90
91     dump(nodes)
92
93
94
95 if __name__=="__main__":
96     main()