1
2
3
4
5
6
7
8
9
10
11 import math
12 import re
13 from ipaddr import IPNetwork
14 import logging
15
16 log = logging.getLogger('zen.DiscoverService')
17
18 import Globals
19 import transaction
20 from twisted.spread import pb
21 from ZODB.transact import transact
22
23 from Products.Jobber.exceptions import NoSuchJobException
24 from Products.ZenUtils.IpUtil import strip, ipwrap, ipunwrap, isip
25 from Products.ZenEvents.Event import Event
26 from Products.ZenEvents.ZenEventClasses import Status_Ping
27 from Products.ZenModel.Device import manage_createDevice
28 from Products.ZenHub.PBDaemon import translateError
29 from Products.ZenModel.Exceptions import DeviceExistsError
30 from Products.ZenRelations.ZenPropertyManager import iszprop
31
32 from .ModelerService import ModelerService
33
34
35 DEFAULT_PING_THRESH = 168
40 self.zProperties = {}
41 for prop in jobrecord.__dict__:
42 if iszprop(prop):
43 self.zProperties[prop] = getattr(jobrecord, prop)
44
45 pb.setUnjellyableForClass(JobPropertiesProxy, JobPropertiesProxy)
48 "A class that will represent a ZenModel/IpNetwork in zendisc"
49
50 id = ''
51 _children = None
52 netmask = None
53
55 self.id = ipnet.id
56 self._children = map(IpNetProxy, ipnet.children())
57 self.netmask = ipnet.netmask
58 for prop in 'zAutoDiscover zDefaultNetworkTree zPingFailThresh'.split():
59 if hasattr(ipnet, prop):
60 setattr(self, prop, getattr(ipnet, prop))
61
64
66 "copied from IpNetwork"
67 log.debug("fullIpList: using ipaddr IPNetwork on %s (%s)" % (self.id, ipunwrap(self.id)))
68 net = IPNetwork(ipunwrap(self.id))
69 if self.netmask == net.max_prefixlen: return [ipunwrap(self.id)]
70 ipnumb = long(int(net))
71 maxip = math.pow(2, net.max_prefixlen - self.netmask)
72 start = int(ipnumb+1)
73 end = int(ipnumb+maxip-1)
74 return map(strip, range(start,end))
75
78
79 pb.setUnjellyableForClass(IpNetProxy, IpNetProxy)
83
84 @translateError
86 "Get network objects to scan networks should be in CIDR form 1.1.1.0/24"
87 netObj = self.dmd.Networks.getNetworkRoot().findNet(net)
88 if not netObj:
89 return None
90 nets = [netObj]
91 if includeSubNets:
92 nets += netObj.getSubNetworks()
93 return map(IpNetProxy, nets)
94
95 @translateError
121
122
140
141
142 @translateError
144 """Create a device.
145
146 @param ip: The manageIp of the device
147 @param kw: The args to manage_createDevice.
148 """
149
150
151
152
153
154 deviceName = kw['deviceName']
155 if deviceName:
156 device = self.dmd.Devices.findDeviceByIdExact(deviceName)
157 if device and ip != device.manageIp:
158 kw['deviceName'] = ip
159 kw['title'] = deviceName
160
161 from Products.ZenModel.Device import getNetworkRoot
162 @transact
163 def _doDbWork():
164 """
165 return device object (either new or existing), and flag indicating
166 whether device was newly created, or just updated
167 """
168 try:
169 netroot = getNetworkRoot(self.dmd,
170 kw.get('performanceMonitor', 'localhost'))
171 netobj = netroot.getNet(ip)
172 netmask = 24
173 if netobj is not None:
174 netmask = netobj.netmask
175 else:
176 defaultNetmasks = getattr(netroot, 'zDefaultNetworkTree', [])
177 if defaultNetmasks:
178 netmask = defaultNetmasks[0]
179 netroot.createIp(ip, netmask)
180 autoDiscover = getattr(netobj, 'zAutoDiscover', True)
181
182 if not force and not autoDiscover:
183 return None, False
184 kw['manageIp'] = ipunwrap(ip)
185 dev = manage_createDevice(self.dmd, **kw)
186 return dev, True
187 except DeviceExistsError, e:
188
189 e.dev.setManageIp(kw['manageIp'])
190
191
192 if not e.dev.title or isip(e.dev.title):
193 if not isip(kw.get('deviceName')):
194 e.dev.setTitle(kw['deviceName'])
195
196
197
198 updateAttributes = {}
199 for k,v in kw.items():
200 if k not in ('manageIp', 'deviceName', 'devicePath',
201 'discoverProto'):
202 updateAttributes[k] = v
203
204 e.dev.updateDevice(**updateAttributes)
205 return e.dev, False
206 except Exception, ex:
207 log.exception("IP address %s (kw = %s) encountered error", ipunwrap(ip), kw)
208 raise pb.CopyableFailure(ex)
209
210 dev, deviceIsNew = _doDbWork()
211 if dev is not None:
212 return self.createDeviceProxy(dev), deviceIsNew
213 else:
214 return None, False
215
216 @translateError
218 try:
219 jobrecord = self.dmd.JobManager.getJob(jobid)
220 if jobrecord:
221 return JobPropertiesProxy(jobrecord)
222 except NoSuchJobException:
223 pass
224
225 @translateError
232
233 @translateError
235 """
236 Return the ips that the device's indirect routes point to
237 which aren't currently connected to devices.
238 """
239 dev = self.getPerformanceMonitor().findDevice(device)
240 ips = []
241 for r in dev.os.routes():
242 ipobj = r.nexthop()
243 if ipobj: ips.append(ipobj.id)
244 return ips
245
246
247 @translateError
252
253
254 @translateError
256 "Get the snmp configuration defaults for scanning a device"
257 devroot = self.dmd.Devices.createOrganizer(devicePath)
258 return (devroot.zSnmpCommunities,
259 devroot.zSnmpPort,
260 devroot.zSnmpVer,
261 devroot.zSnmpTimeout,
262 devroot.zSnmpTries)
263
264
265 @translateError
269
270 @translateError
274