1
2
3
4
5
6
7
8
9
10
11
12
13
14 __doc__="""ZDeviceLoader.py
15
16 load devices from a GUI screen in the ZMI
17
18 $Id: ZDeviceLoader.py,v 1.19 2004/04/22 02:14:12 edahl Exp $"""
19
20 __version__ = "$Revision: 1.19 $"[11:-2]
21
22 import socket
23 from logging import StreamHandler, Formatter, getLogger
24 log = getLogger("zen.DeviceLoader")
25
26 import transaction
27 from zope.interface import implements
28 from AccessControl import ClassSecurityInfo
29 from AccessControl import Permissions as permissions
30
31 from OFS.SimpleItem import SimpleItem
32
33 from Products.ZenUtils.Utils import isXmlRpc, setupLoggingHeader
34 from Products.ZenUtils.Utils import binPath, clearWebLoggingStream
35 from Products.ZenUtils.Exceptions import ZentinelException
36 from Products.ZenModel.Exceptions import DeviceExistsError, NoSnmp
37 from Products.ZenModel.Device import manage_createDevice
38 from Products.ZenWidgets import messaging
39 from Products.Jobber.interfaces import IJobStatus
40 from Products.Jobber.jobs import ShellCommandJob
41 from Products.Jobber.status import SUCCESS, FAILURE
42 from ZenModelItem import ZenModelItem
43 from zExceptions import BadRequest
44 from Products.ZenModel.interfaces import IDeviceLoader
45
46
56
58 implements(IDeviceLoader)
59
60 context = None
61 request = None
62 deviceobj = None
63
66
67 - def run_zendisc(self, deviceName, devicePath, performanceMonitor):
68 """
69 Various ways of doing this should be implemented in subclasses.
70 """
71 raise NotImplementedError
72
88
89 - def load_device(self, deviceName, devicePath='/Discovered',
90 discoverProto='snmp', performanceMonitor='localhost',
91 manageIp="", zProperties=None, deviceProperties=None):
92 """
93 Load a single device into the database.
94 """
95
96 try:
97 if zProperties is None:
98 zProperties = {}
99 if deviceProperties is None:
100 deviceProperties = {}
101
102
103 deviceName = deviceName.replace(' ', '')
104 manageIp = manageIp.replace(' ', '')
105
106
107
108 if discoverProto=='none':
109 if not manageIp:
110 try:
111 manageIp = socket.gethostbyname(deviceName)
112 except socket.error:
113 pass
114
115
116
117 for key in 'zSnmpCommunity', 'zSnmpPort', 'zSnmpVer':
118 if zProperties.has_key(key):
119 deviceProperties[key] = zProperties.pop(key)
120
121
122 self.deviceobj = manage_createDevice(self.context, deviceName,
123 devicePath,
124 performanceMonitor=performanceMonitor,
125 manageIp=manageIp,
126 zProperties=zProperties,
127 **deviceProperties)
128
129
130
131 self.deviceobj._temp_device = True
132
133
134 if discoverProto=='none':
135 return self.deviceobj
136
137
138 self.run_zendisc(deviceName, devicePath, performanceMonitor)
139
140 finally:
141
142 self.cleanup()
143
144 return self.deviceobj
145
146
148 implements(IDeviceLoader)
149
150 - def run_zendisc(self, deviceName, devicePath, performanceMonitor):
151 """
152 In this subclass, just commit to database,
153 so everybody can find the new device
154 """
155 transaction.commit()
156
158 """
159 Delegate cleanup to the Job itself.
160 """
161 pass
162
163
165 - def __init__(self, jobid, deviceName, devicePath="/Discovered", tag="",
166 serialNumber="", rackSlot=0, productionState=1000,
167 comments="", hwManufacturer="", hwProductName="",
168 osManufacturer="", osProductName="", locationPath="",
169 groupPaths=[], systemPaths=[], performanceMonitor="localhost",
170 discoverProto="snmp", priority=3, manageIp="",
171 zProperties=None, title=None, zendiscCmd=[]):
172
173
174 self.deviceName = deviceName
175 self.devicePath = devicePath
176 self.performanceMonitor = performanceMonitor
177 self.discoverProto = discoverProto
178 self.manageIp = manageIp.replace(' ', '')
179
180
181 self.zProperties = zProperties
182 self.deviceProps = dict(tag=tag,
183 serialNumber=serialNumber,
184 rackSlot=rackSlot,
185 productionState=productionState,
186 comments=comments,
187 hwManufacturer=hwManufacturer,
188 hwProductName = hwProductName,
189 osManufacturer = osManufacturer,
190 osProductName = osProductName,
191 locationPath = locationPath,
192 groupPaths = groupPaths,
193 systemPaths = systemPaths,
194 priority = priority,
195 title= title)
196
197 zendiscCmd.extend(['--job', jobid])
198 super(DeviceCreationJob, self).__init__(jobid, zendiscCmd)
199
200
236
237 -class WeblogDeviceLoader(BaseDeviceLoader):
238 - def __init__(self, context, request):
241
242 - def run_zendisc(self, deviceName, devicePath, performanceMonitor):
243
244 transaction.commit()
245 collector = self.deviceobj.getPerformanceServer()
246 collector._executeZenDiscCommand(deviceName, devicePath,
247 performanceMonitor,
248 REQUEST=self.request)
249
250
252 """Load devices into the DMD database"""
253
254 portal_type = meta_type = 'DeviceLoader'
255
256 manage_options = ((
257 {'label':'ManualDeviceLoader', 'action':'manualDeviceLoader'},
258 ) + SimpleItem.manage_options)
259
260
261 security = ClassSecurityInfo()
262
263 factory_type_information = (
264 {
265 'immediate_view' : 'addDevice',
266 'actions' :
267 (
268 { 'id' : 'status'
269 , 'name' : 'Status'
270 , 'action' : 'addDevice'
271 , 'permissions' : (
272 permissions.view, )
273 },
274 )
275 },
276 )
277
280
281
282 - def loadDevice(self, deviceName, devicePath="/Discovered",
283 tag="", serialNumber="",
284 zSnmpCommunity="", zSnmpPort=161, zSnmpVer=None,
285 rackSlot=0, productionState=1000, comments="",
286 hwManufacturer="", hwProductName="",
287 osManufacturer="", osProductName="",
288 locationPath="", groupPaths=[], systemPaths=[],
289 performanceMonitor="localhost",
290 discoverProto="snmp",priority=3,REQUEST=None):
291 """
292 Load a device into the database connecting its major relations
293 and collecting its configuration.
294 """
295 device = None
296 if not deviceName: return self.callZenScreen(REQUEST)
297 xmlrpc = isXmlRpc(REQUEST)
298 if REQUEST and not xmlrpc:
299 handler = setupLoggingHeader(self, REQUEST)
300
301 loader = WeblogDeviceLoader(self, REQUEST)
302
303 try:
304 device = loader.load_device(deviceName, devicePath, discoverProto,
305 performanceMonitor,
306 zProperties=dict(
307 zSnmpCommunity=zSnmpCommunity,
308 zSnmpPort=zSnmpPort,
309 zSnmpVer=zSnmpVer
310 ),
311 deviceProperties=dict(
312 tag=tag,
313 serialNumber=serialNumber,
314 rackSlot=rackSlot,
315 productionState=productionState,
316 comments=comments,
317 hwManufacturer=hwManufacturer,
318 hwProductName=hwProductName,
319 osManufacturer=osManufacturer,
320 osProductName=osProductName,
321 locationPath=locationPath,
322 groupPaths=groupPaths,
323 systemPaths=systemPaths,
324 priority=priority
325 ))
326 except (SystemExit, KeyboardInterrupt):
327 raise
328 except ZentinelException, e:
329 log.info(e)
330 if xmlrpc: return 1
331 except DeviceExistsError, e:
332 log.info(e)
333 if xmlrpc: return 2
334 except NoSnmp, e:
335 log.info(e)
336 if xmlrpc: return 3
337 except Exception, e:
338 log.exception(e)
339 log.exception('load of device %s failed' % deviceName)
340 transaction.abort()
341 if device is None:
342 log.error("Unable to add the device %s" % deviceName)
343 else:
344 log.info("Device %s loaded!" % deviceName)
345
346 if REQUEST and not xmlrpc:
347 self.loaderFooter(device, REQUEST.RESPONSE)
348 clearWebLoggingStream(handler)
349 if xmlrpc: return 0
350
351 - def addManufacturer(self, newHWManufacturerName=None,
352 newSWManufacturerName=None, REQUEST=None):
374
375
376 security.declareProtected('Change Device', 'setHWProduct')
377 - def setHWProduct(self, newHWProductName, hwManufacturer, REQUEST=None):
392
393
394 security.declareProtected('Change Device', 'setOSProduct')
395 - def setOSProduct(self, newOSProductName, osManufacturer, REQUEST=None):
410
411
412 security.declareProtected('Change Device', 'addLocation')
430
431
432 security.declareProtected('Change Device', 'addSystem')
433 - def addSystem(self, newSystemPath, REQUEST=None):
452
453
454 security.declareProtected('Change Device', 'addDeviceGroup')
474
475
476 security.declareProtected('Change Device', 'setPerformanceMonitor')
493
494
496 """setup logging package to send to browser"""
497 root = getLogger()
498 self._v_handler = StreamHandler(response)
499 fmt = Formatter("""<tr class="tablevalues">
500 <td>%(asctime)s</td><td>%(levelname)s</td>
501 <td>%(name)s</td><td>%(message)s</td></tr>
502 """, "%Y-%m-%d %H:%M:%S")
503 self._v_handler.setFormatter(fmt)
504 root.addHandler(self._v_handler)
505 root.setLevel(10)
506
507
509 alog = getLogger()
510 if getattr(self, "_v_handler", False):
511 alog.removeHandler(self._v_handler)
512
513
522