1
2
3
4
5
6
7
8
9
10
11
12
13
14 __doc__="""utils
15
16 RRD utility functions
17 """
18
19 from sets import Set
20 from Acquisition import aq_chain
21
22 from Exceptions import RRDObjectNotFound, TooManyArgs
23
25 """
26 Load data into a RRD Object
27
28 @param obj: RRD object
29 @type obj: RRD object
30 @param args: arguments
31 @type args: list of strings
32 """
33 import string
34 arglen = len(args)
35 if arglen > len(obj._properties):
36 raise TooManyArgs( "Too many args" )
37 i = 0
38 for arg in args:
39 if i > arglen: break
40 arg = arg.strip()
41 att = obj._properties[i]['id']
42 try:
43 if arg != '':
44 if obj._properties[i]['type'] == 'lines':
45 value = map(string.strip, arg.split(','))
46 att = '_' + att
47 elif obj._properties[i]['type'] == 'int':
48 value = int(arg)
49 elif obj._properties[i]['type'] == 'long':
50 value = long(arg)
51 elif obj._properties[i]['type'] == 'float':
52 value = float(arg)
53 elif obj._properties[i]['type'] == 'boolean':
54 value = eval(arg)
55 else:
56 value = arg
57 if value is not None: setattr(obj,att,value)
58 except:
59 print "att = %s value = %s" % (att, arg)
60 raise
61 i += 1
62
63
65 """
66 See if prefix needs to be added to id
67
68 @param idprefix: prefix
69 @type idprefix: string
70 @param id: identifier
71 @type id: string
72 @return: add the prefix with a '-' in between
73 @rtype: string
74 """
75 if id.find(idprefix) != 0:
76 id = idprefix + '-' + id
77 return id
78
79
81 """
82 See if prefix needs to be removed from id
83
84 @param idprefix: prefix
85 @type idprefix: string
86 @param id: identifier
87 @type id: string
88 @return: remove the prefix with a '-' in between or return None
89 @rtype: string or None
90 """
91 if idprefix[-1] != '-': idprefix += '-'
92 if id.find(idprefix) == 0:
93 return id[len(idprefix):]
94
95
97 """
98 Given a Zope context, try to find the rrdconfig object
99 for the name.
100 Raises RRDObjectNotFound if not found.
101
102 @param context: Zope context
103 @type context: Zope context object
104 @param name: RRDView name
105 @type name: string
106 @return: rrdconfig object or None
107 @rtype: rrdconfig object
108 """
109 if not name: return
110 while 1:
111 if hasattr(context, 'rrdconfig') and hasattr(context.rrdconfig, name):
112 return getattr(context.rrdconfig, name)
113 context = context.aq_parent
114 if context.id == 'dmd':
115 raise RRDObjectNotFound( "Object %s not found in context %s" % \
116 (name, context.getPrimaryUrlPath()))
117
118
120 """
121 Return template names in the given context
122
123 @param context: Zope context
124 @type context: Zope context object
125 @return: names of the templates
126 @rtype: set of strings
127 """
128 names = Set()
129 for obj in aq_chain(context):
130 rrdconfig = getattr(obj, 'rrdconfig', None)
131 if rrdconfig:
132 names = names.union(rrdconfig.objectIds(spec='RRDTargetType'))
133 return names
134
135
136
138 """
139 Lookup an RRDView based on its name
140
141 @param context: Zope context
142 @type context: Zope context object
143 @param name: RRDView name
144 @type name: string
145 @return: rrdconfig object or None
146 @rtype: rrdconfig object
147 """
148 return walkupconfig(context, 'RRDView-'+name)
149
150
152 """
153 Lookup an rrdtargettype based on its name
154
155 @param context: Zope context
156 @type context: Zope context object
157 @param name: RRDView name
158 @type name: string
159 @return: rrdconfig object or None
160 @rtype: rrdconfig object
161 """
162 return walkupconfig(context, 'RRDTargetType-'+name)
163
164
166 """
167 Lookup an rrddatasource based on its name
168
169 @param context: Zope context
170 @type context: Zope context object
171 @param name: RRDView name
172 @type name: string
173 @return: rrdconfig object or None
174 @rtype: rrdconfig object
175 """
176 return walkupconfig(context, 'RRDDataSource-'+name)
177
178
180 """
181 Totally bogus RPN evaluation only works with one-level stack
182
183 @param value: something that can be used as a number
184 @type value: string
185 @param rpn: Reverse Polish Notatio (RPN) expression
186 @type rpn: string
187 @todo: make unbogus
188 """
189 if type(value) == type(''): return value
190 operators = ('+','-','*','/')
191 rpn = rpn.split(',')
192 operator = ''
193 for i in range(len(rpn)):
194 symbol = rpn.pop()
195 symbol = symbol.strip()
196 if symbol in operators:
197 operator = symbol
198 else:
199 expr = str(value) + operator + symbol
200 value = eval(expr)
201 return value
202