Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | """handle riesling frontend's '-c config' option |
2 | """ | |
3 | import sys, types | |
4 | ||
5 | OBJECT = 'OBJECT' | |
6 | TYPE = 'TYPE' | |
7 | OTHER = 'other' | |
8 | ||
9 | PLI_SOCKET = 'pli-socket' | |
10 | ||
11 | TYPE_NIAGARA = 'niagara' | |
12 | TYPE_NIAGARA2 = 'niagara2' | |
13 | TYPE_SYS_CONFIG = 'sys_config' | |
14 | ||
15 | class ReadConfigDiag: | |
16 | """handle -c config option | |
17 | """ | |
18 | ||
19 | def __init__ (self): | |
20 | """ | |
21 | """ | |
22 | # data[objType][objId][dataType] | |
23 | self.data = { } | |
24 | # object[objId] = data[objType][objId] | |
25 | self.object = { } | |
26 | self.count = { } | |
27 | ||
28 | ||
29 | def __str__ (self): | |
30 | """ | |
31 | """ | |
32 | #buffer = [ '-----ReadConfigDiag.py-----\n' ] | |
33 | buffer = [ ] | |
34 | klist1 = self.data.keys() | |
35 | klist1.sort() | |
36 | for tkey in klist1: | |
37 | #for tkey in self.data.keys(): | |
38 | klist2 = self.data[tkey].keys() | |
39 | klist2.sort() | |
40 | for okey in klist2: | |
41 | #for okey in self.data[tkey].keys(): | |
42 | buffer.append('%s %s %s %s {\n' % (OBJECT, okey, TYPE, tkey)) | |
43 | klist3 = self.data[tkey][okey].keys() | |
44 | klist3.sort() | |
45 | for ikey in klist3: | |
46 | buffer.append('\t%s : %s\n' % (ikey, self.data[tkey][okey][ikey])) | |
47 | buffer.append('}\n') | |
48 | return ''.join(buffer) | |
49 | ||
50 | ||
51 | def readConfig (self, fname): | |
52 | """ | |
53 | """ | |
54 | try: | |
55 | self.fd = open(fname, 'r') | |
56 | line = self.fd.readline() | |
57 | while line: | |
58 | if line.startswith(OBJECT): | |
59 | self.readObject(line) | |
60 | else: | |
61 | if line.strip(): | |
62 | self.data[OTHER].append(line) | |
63 | # next line | |
64 | line = self.fd.readline() | |
65 | self.fd.close() | |
66 | except IOError, (errno, strerror): | |
67 | print "readConfig : (%s): %s %s" % (errno, strerror,fname) | |
68 | except: | |
69 | raise | |
70 | ||
71 | ||
72 | def readObject (self, line): | |
73 | """read an OBJECT description of format like: | |
74 | OBJECT th00 TYPE niagara2 { | |
75 | ... | |
76 | } | |
77 | """ | |
78 | tokens = line.split() | |
79 | if (not tokens[0] == OBJECT) or (not tokens[2] == TYPE): | |
80 | raise RuntimeError, 'ERROR: wrong format %s' % (line) | |
81 | else: | |
82 | key = tokens[1] | |
83 | type = tokens[3] | |
84 | if not self.data.has_key(type): | |
85 | self.data[type] = { } | |
86 | self.count[type] = 0 | |
87 | ||
88 | if self.data[type].has_key(key): | |
89 | raise RuntimeError, 'ERROR: %s already defined in %s' % (key, type) | |
90 | else: | |
91 | self.count[type] += 1 | |
92 | self.data[type][key] = { } | |
93 | line = self.fd.readline() | |
94 | while line.strip() != '}': | |
95 | if line.strip(): | |
96 | i = line.find(':') | |
97 | if i > -1: | |
98 | kword = line[:i].strip() | |
99 | value = line[i+1:].strip() | |
100 | self.data[type][key][kword] = value | |
101 | else: | |
102 | # a continue data from previous line | |
103 | self.data[type][key][kword] += ' ' + line.strip() | |
104 | line = self.fd.readline() | |
105 | # when done with the object, create a shortcut | |
106 | self.object[key] = self.data[type][key] | |
107 | ||
108 | ||
109 | def getCount (self, type): | |
110 | """ | |
111 | """ | |
112 | if self.count.has_key(type): | |
113 | return self.count[type] | |
114 | else: | |
115 | return 0 | |
116 | ||
117 | ||
118 | def getObjTypes (self): | |
119 | """return a list of object types available in the configuration | |
120 | """ | |
121 | return self.data.keys() | |
122 | ||
123 | ||
124 | def getObjIds (self, objType, silent=0): | |
125 | """return a list of object ids of the specified type | |
126 | """ | |
127 | try: | |
128 | return self.data[objType].keys() | |
129 | except Exception, ex: | |
130 | if not silent: | |
131 | sys.stderr.write('WARNING: ReadConfigDiag: wrong keyword (%s), ex=%s\n' % (objType, ex)) | |
132 | return [] | |
133 | ||
134 | ||
135 | def getObjKeys (self, objType, objId, silent=0): | |
136 | """return a list of data keywords of the specified object type+id | |
137 | """ | |
138 | try: | |
139 | return self.data[objType][objId].keys() | |
140 | except Exception, ex: | |
141 | if not silent: | |
142 | sys.stderr.write('WARNING: ReadConfigDiag: wrong keyword(s) (%s,%s), ex=%s\n' % (objType, objId, ex)) | |
143 | return [] | |
144 | ||
145 | ||
146 | def getObjData (self, objType, objId, key, silent=0): | |
147 | """return the data field of the specified object type+id+keyword | |
148 | """ | |
149 | try: | |
150 | data = self.data[objType][objId][key] | |
151 | if data.startswith('[') and data.endswith(']'): | |
152 | data = self.convertList(data[1:-1]) | |
153 | return data | |
154 | except Exception, ex: | |
155 | if not silent: | |
156 | sys.stderr.write('WARNING: ReadConfigDiag: wrong keyword(s) (%s,%s,%s), ex=%s\n' % (objType, objId, key, ex)) | |
157 | return None | |
158 | ||
159 | ||
160 | def getData (self, objId, key, silent=0): | |
161 | """return the data field of the specified object id+keyword | |
162 | """ | |
163 | try: | |
164 | data = self.object[objId][key] | |
165 | if data.startswith('[') and data.endswith(']'): | |
166 | data = self.convertList(data[1:-1]) | |
167 | return data | |
168 | except Exception, ex: | |
169 | if not silent: | |
170 | sys.stderr.write('WARNING: ReadConfigDiag: wrong keyword(s) (%s,%s), ex=%s\n' % (objId, key, ex)) | |
171 | return None | |
172 | ||
173 | ||
174 | def setDataLine (self, line): | |
175 | """ | |
176 | @conf.mom0.setvar= "THREAD_BASED_STAT=1" | |
177 | @conf.swvmem0.good_trap = get_addr('\.TRAPS\.T0_GoodTrap_0x100') | |
178 | => eval'ed value | |
179 | @conf.mom0.start_cycle= 1 | |
180 | """ | |
181 | AT_CONF = '@conf.' | |
182 | SETVAR = 'setvar' | |
183 | if line.startswith(AT_CONF): | |
184 | #sys.stderr.write('DBX: ReadConfigDiag: @conf: %s\n' % (line)) | |
185 | append = 0 | |
186 | line = line[len(AT_CONF):] | |
187 | i = line.find('.') | |
188 | objId = line[:i] | |
189 | j = line.find('=+', i) | |
190 | if j > -1: | |
191 | append = 1 | |
192 | else: | |
193 | j = line.find('=', i) | |
194 | key = line[i+1:j].strip() | |
195 | if key == SETVAR: | |
196 | # "key=value" | |
197 | if append == 0: | |
198 | expr = line[j+1:].strip() | |
199 | else: | |
200 | expr = line[j+2:].strip() | |
201 | # strip " | |
202 | expr = expr[1:-1] | |
203 | k = expr.find('=') | |
204 | key = expr[:k].strip() | |
205 | value = expr[k+1:].strip() | |
206 | else: | |
207 | if append == 0: | |
208 | value = line[j+1:].strip() | |
209 | else: | |
210 | value = line[j+2:].strip() | |
211 | ||
212 | self.setData(objId, key, value, append=append) | |
213 | ||
214 | else: | |
215 | sys.stderr.write('WARNING: ReadConfigDiag: wrong %s syntax <%s>\n' % (AT_CONF, line)) | |
216 | ||
217 | ||
218 | def setData (self, objId, key, value, append=0): | |
219 | """ | |
220 | """ | |
221 | #sys.stderr.write('DBX: ReadConfigDiag: objId=%s, key=%s, value=%s, append=%s\n' % (objId, key, value, append)) | |
222 | ||
223 | if not self.object.has_key(objId): | |
224 | # OBJECT config0 TYPE sys_config { | |
225 | # # a default system config to store basic system config info | |
226 | # } | |
227 | if not self.data.has_key(TYPE_SYS_CONFIG): | |
228 | self.data[TYPE_SYS_CONFIG] = { } | |
229 | self.count[TYPE_SYS_CONFIG] = 0 | |
230 | ||
231 | self.count[TYPE_SYS_CONFIG] += 1 | |
232 | self.data[TYPE_SYS_CONFIG][objId] = { } | |
233 | self.object[objId] = self.data[TYPE_SYS_CONFIG][objId] | |
234 | ||
235 | try: | |
236 | if self.object[objId].has_key(key) and append == 0: | |
237 | sys.stderr.write('WARNING: ReadConfigDiag: overwrite (%s,%s)=%s, new value=%s\n' % (objId, key, self.object[objId][key], value)) | |
238 | if append == 0: | |
239 | self.object[objId][key] = value | |
240 | else: | |
241 | if not self.object[objId].has_key(key): | |
242 | self.object[objId][key] = [ ] | |
243 | self.object[objId][key].append(value) | |
244 | except Exception, ex: | |
245 | sys.stderr.write('WARNING: ReadConfigDiag: wrong keyword(s) (%s,%s), ex=%s\n' % (objId, key, ex)) | |
246 | ||
247 | ||
248 | def convertList(self, data): | |
249 | """convert string (of list syntax) to real list | |
250 | """ | |
251 | #sys.stderr.write('#DBX: data=%s\n' % (data)) #DBX | |
252 | tokens = data.split(',') | |
253 | datalist = [] | |
254 | for token in tokens: | |
255 | token = token.strip().strip("'") | |
256 | #sys.stderr.write('#DBX: token=%s\n' % (token)) #DBX | |
257 | datalist.append(token) | |
258 | #sys.stderr.write('#DBX: datalist=%s\n' % (datalist)) #DBX | |
259 | return datalist | |
260 | ||
261 | ||
262 | """self-testing | |
263 | """ | |
264 | if __name__ == "__main__": | |
265 | """ | |
266 | """ | |
267 | # unit test here | |
268 | import sys | |
269 | reader = ReadConfigDiag() | |
270 | reader.readConfig(sys.argv[1]) | |
271 | print reader |