Trees | Indices | Help |
|
---|
|
1 ########################################################################### 2 # 3 # This program is part of Zenoss Core, an open source monitoring platform. 4 # Copyright (C) 2007, Zenoss Inc. 5 # 6 # This program is free software; you can redistribute it and/or modify it 7 # under the terms of the GNU General Public License version 2 or (at your 8 # option) any later version as published by the Free Software Foundation. 9 # 10 # For complete information please visit: http://www.zenoss.com/oss/ 11 # 12 ########################################################################### 13 from Products.ZenUtils.Utils import binPath 14 15 __doc__="""RRDDataSource 16 17 Base class for DataSources 18 """ 19 20 import os 21 import zope.component 22 23 from DateTime import DateTime 24 from AccessControl import ClassSecurityInfo, Permissions 25 from Products.ZenModel.ZenossSecurity import ZEN_MANAGE_DMD 26 27 from Products.PageTemplates.Expressions import getEngine 28 29 from Products.ZenUtils.ZenTales import talesCompile 30 from Products.ZenRelations.RelSchema import * 31 from Products.ZenWidgets import messaging 32 33 from ZenModelRM import ZenModelRM 34 from ZenPackable import ZenPackable 35 3638 39 meta_type = 'RRDDataSource' 40 41 paramtypes = ('integer', 'string', 'float') 42 sourcetypes = () 43 44 sourcetype = None 45 enabled = True 46 component = '' 47 eventClass = '' 48 eventKey = '' 49 severity = 3 50 commandTemplate = "" 51 cycletime = 300 52 53 _properties = ( 54 {'id':'sourcetype', 'type':'selection', 55 'select_variable' : 'sourcetypes', 'mode':'w'}, 56 {'id':'enabled', 'type':'boolean', 'mode':'w'}, 57 {'id':'component', 'type':'string', 'mode':'w'}, 58 {'id':'eventClass', 'type':'string', 'mode':'w'}, 59 {'id':'eventKey', 'type':'string', 'mode':'w'}, 60 {'id':'severity', 'type':'int', 'mode':'w'}, 61 {'id':'commandTemplate', 'type':'string', 'mode':'w'}, 62 {'id':'cycletime', 'type':'int', 'mode':'w'}, 63 ) 64 65 _relations = ZenPackable._relations + ( 66 ("rrdTemplate", ToOne(ToManyCont,"Products.ZenModel.RRDTemplate","datasources")), 67 ("datapoints", ToManyCont(ToOne,"Products.ZenModel.RRDDataPoint","datasource")), 68 ) 69 70 # Screen action bindings (and tab definitions) 71 factory_type_information = ( 72 { 73 'immediate_view' : 'editRRDDataSource', 74 'actions' : 75 ( 76 { 'id' : 'edit' 77 , 'name' : 'Data Source' 78 , 'action' : 'editRRDDataSource' 79 , 'permissions' : ( Permissions.view, ) 80 }, 81 ) 82 }, 83 ) 84 85 security = ClassSecurityInfo() 86 87158 159 160 security.declareProtected(ZEN_MANAGE_DMD, 'manage_addDataPointsToGraphs')89 """Return the breadcrumb links for this object add ActionRules list. 90 [('url','id'), ...] 91 """ 92 from RRDTemplate import crumbspath 93 crumbs = super(RRDDataSource, self).breadCrumbs(terminator) 94 return crumbspath(self.rrdTemplate(), crumbs, -2)95 96 99 100102 return self.datapoints()103 104 107 111 112 security.declareProtected(ZEN_MANAGE_DMD, 'manage_addRRDDataPoint')114 """make a RRDDataPoint""" 115 if not id: 116 return self.callZenScreen(REQUEST) 117 from Products.ZenModel.RRDDataPoint import RRDDataPoint 118 dp = RRDDataPoint(id) 119 self.datapoints._setObject(dp.id, dp) 120 dp = self.datapoints._getOb(dp.id) 121 if REQUEST: 122 if dp: 123 url = '%s/datapoints/%s' % (self.getPrimaryUrlPath(), dp.id) 124 REQUEST['RESPONSE'].redirect(url) 125 return self.callZenScreen(REQUEST) 126 return dp127 128 129 security.declareProtected(ZEN_MANAGE_DMD, 'manage_deleteRRDDataPoints')131 """Delete RRDDataPoints from this RRDDataSource""" 132 133 def clean(rel, id): 134 for obj in rel(): 135 if id in obj.dsnames: 136 obj.dsnames.remove(id) 137 if not obj.dsnames: 138 rel._delObject(obj.id)139 140 if not ids: return self.callZenScreen(REQUEST) 141 for id in ids: 142 dp = getattr(self.datapoints,id,False) 143 if dp: 144 if getattr(self, 'device', False): 145 perfConf = self.device().getPerformanceServer() 146 perfConf.deleteRRDFiles(device=self.device().id, datapoint=dp.name()) 147 else: 148 for d in self.deviceClass.obj.getSubDevicesGen(): 149 perfConf = d.getPerformanceServer() 150 perfConf.deleteRRDFiles(device=d.id, datapoint=dp.name()) 151 152 clean(self.graphs, dp.name()) 153 clean(self.thresholds, dp.name()) 154 self.datapoints._delObject(dp.id) 155 156 if REQUEST: 157 return self.callZenScreen(REQUEST)162 """ 163 Create GraphPoints for all datapoints given datapoints (ids) 164 in each of the graphDefs (graphIds.) 165 If a graphpoint already exists for a datapoint in a graphDef then 166 don't create a 2nd one. 167 """ 168 newGps = [] 169 for graphDefId in graphIds: 170 graphDef = self.rrdTemplate.graphDefs._getOb(graphDefId, None) 171 if graphDef: 172 for dpId in ids: 173 dp = self.datapoints._getOb(dpId, None) 174 if dp and not graphDef.isDataPointGraphed(dp.name()): 175 newGps += graphDef.manage_addDataPointGraphPoints( 176 [dp.name()]) 177 if REQUEST: 178 numNew = len(newGps) 179 messaging.IMessageSender(self).sendToBrowser( 180 'Graph Points Added', 181 '%s GraphPoint%s added' % (numNew, numNew != 1 and 's' or '') 182 ) 183 return self.callZenScreen(REQUEST) 184 return newGps185 186188 """Return localized command target. 189 """ 190 # Perform a TALES eval on the expression using self 191 if cmd is None: 192 cmd = self.commandTemplate 193 if not cmd.startswith('string:') and not cmd.startswith('python:'): 194 cmd = 'string:%s' % cmd 195 compiled = talesCompile(cmd) 196 d = context.device() 197 environ = {'dev' : d, 198 'device': d, 199 'devname': d.id, 200 'ds': self, 201 'datasource': self, 202 'here' : context, 203 'zCommandPath' : context.zCommandPath, 204 'nothing' : None, 205 'now' : DateTime() } 206 res = compiled(getEngine().getContext(environ)) 207 if isinstance(res, Exception): 208 raise res 209 res = self.checkCommandPrefix(context, res) 210 return res211 212214 """Return localized component. 215 """ 216 if component is None: 217 component = self.component 218 if not component.startswith('string:') and \ 219 not component.startswith('python:'): 220 component = 'string:%s' % component 221 compiled = talesCompile(component) 222 d = context.device() 223 environ = {'dev' : d, 224 'device': d, 225 'devname': d.id, 226 'here' : context, 227 'nothing' : None, 228 'now' : DateTime() } 229 res = compiled(getEngine().getContext(environ)) 230 if isinstance(res, Exception): 231 raise res 232 return res233235 if not cmd.startswith('/') and not cmd.startswith('$'): 236 if context.zCommandPath and not cmd.startswith(context.zCommandPath): 237 cmd = os.path.join(context.zCommandPath, cmd) 238 elif binPath(cmd.split(" ",1)[0]): 239 #if we get here it is because cmd is not absolute, doesn't 240 #start with $, zCommandPath is not set and we found cmd in 241 #one of the zenoss bin dirs 242 cmdList = cmd.split(" ",1) #split into command and args 243 cmd = binPath(cmdList[0]) 244 if len(cmdList) > 1: 245 cmd = "%s %s" % (cmd, cmdList[1]) 246 247 return cmd248 251 252 255 256258 """ 259 A SimpleRRDDataSource has a single datapoint that shares the name of the 260 data source. 261 """ 262 security = ClassSecurityInfo() 263 264377 378 from Products.ZenModel.interfaces import IZenDocProvider 379 from Products.ZenModel.ZenModelBase import ZenModelZenDocProvider 380266 """ 267 Make sure there is exactly one datapoint and that it has the same name 268 as the datasource. 269 """ 270 dpid = self.prepId(self.id) 271 remove = [d for d in self.datapoints() if d.id != dpid] 272 for dp in remove: 273 self.datapoints._delObject(dp.id) 274 if not self.datapoints._getOb(dpid, None): 275 self.manage_addRRDDataPoint(dpid)276 277 security.declareProtected(ZEN_MANAGE_DMD, 'zmanage_editProperties')279 """ 280 Overrides the method defined in RRDDataSource. Called when user clicks 281 the Save button on the Data Source editor page. 282 """ 283 self.addDataPoints() 284 285 if REQUEST and self.datapoints(): 286 287 datapoint = self.soleDataPoint() 288 289 if REQUEST.has_key('rrdtype'): 290 if REQUEST['rrdtype'] in datapoint.rrdtypes: 291 datapoint.rrdtype = REQUEST['rrdtype'] 292 else: 293 messaging.IMessageSender(self).sendToBrowser( 294 'Error', 295 "%s is an invalid Type" % rrdtype, 296 priority=messaging.WARNING 297 ) 298 return self.callZenScreen(REQUEST) 299 300 if REQUEST.has_key('rrdmin'): 301 value = REQUEST['rrdmin'] 302 if value != '': 303 try: 304 value = long(value) 305 except ValueError: 306 messaging.IMessageSender(self).sendToBrowser( 307 'Error', 308 "%s is an invalid RRD Min" % value, 309 priority=messaging.WARNING 310 ) 311 return self.callZenScreen(REQUEST) 312 datapoint.rrdmin = value 313 314 if REQUEST.has_key('rrdmax'): 315 value = REQUEST['rrdmax'] 316 if value != '': 317 try: 318 value = long(value) 319 except ValueError: 320 messaging.IMessageSender(self).sendToBrowser( 321 'Error', 322 "%s is an invalid RRD Max" % value, 323 priority=messaging.WARNING 324 ) 325 return self.callZenScreen(REQUEST) 326 datapoint.rrdmax = value 327 328 if REQUEST.has_key('createCmd'): 329 datapoint.createCmd = REQUEST['createCmd'] 330 331 return RRDDataSource.zmanage_editProperties(self, REQUEST)332334 """ 335 Return the datasource's only datapoint 336 """ 337 dps = self.datapoints() 338 if dps: 339 return dps[0]340342 """ 343 Return the datapoint aliases that belong to the datasource's only 344 datapoint 345 """ 346 dp = self.soleDataPoint() 347 if dp: 348 return dp.aliases()349 350 security.declareProtected(ZEN_MANAGE_DMD, 'manage_addDataPointsToGraphs')352 """ 353 Override method in super class. ids will always be an empty tuple, so 354 call the super class's method with the single datapoint as the ids. 355 """ 356 return RRDDataSource.manage_addDataPointsToGraphs(self, 357 (self.soleDataPoint().id,), graphIds, REQUEST)358 359 security.declareProtected(ZEN_MANAGE_DMD, 'manage_addDataPointAlias')361 """ 362 Add a datapoint alias to the datasource's only datapoint 363 """ 364 alias = self.soleDataPoint().manage_addDataPointAlias( id, formula ) 365 if REQUEST: 366 return self.callZenScreen( REQUEST ) 367 return alias368 369 security.declareProtected(ZEN_MANAGE_DMD, 'manage_removeDataPointAliases')371 """ 372 Remove the passed aliases from the datasource's only datapoint 373 """ 374 self.soleDataPoint().manage_removeDataPointAliases( ids ) 375 if REQUEST: 376 return self.callZenScreen(REQUEST)382 zope.component.adapts(SimpleRRDDataSource) 383406385 return self._underlyingObject.datapoints()386388 return self._underlyingObject.soleDataPoint()389391 if len( self.datapoints() ) == 1: 392 dataPointAdapter = zope.component.queryAdapter( self.soleDataPoint(), 393 IZenDocProvider ) 394 return dataPointAdapter.getZendoc() 395 else: 396 return super( SimpleRRDDataSourceZenDocProvider, self ).getZendoc()397399 """Set zendoc text""" 400 if len( self.datapoints() ) == 1: 401 dataPointAdapter = zope.component.queryAdapter( self.soleDataPoint(), 402 IZenDocProvider ) 403 dataPointAdapter.setZendoc( zendocText ) 404 else: 405 return super( SimpleRRDDataSourceZenDocProvider, self ).setZendoc( zendocText )
Trees | Indices | Help |
|
---|
Generated by Epydoc 3.0.1.1812 on Tue Oct 11 12:51:40 2011 | http://epydoc.sourceforge.net |