1
2
3
4
5
6
7
8
9
10
11
12
13
14 import logging
15 log = logging.getLogger('zen.DiscoverService')
16
17 from Products.ZenUtils.IpUtil import numbip, strip
18 from Products.ZenEvents.Event import Event
19 from Products.ZenEvents.ZenEventClasses import Status_Ping
20 from Products.ZenModel.Device import manage_createDevice
21 from Products.Jobber.status import JobStatusProxy
22 from Products.ZenHub.PBDaemon import translateError
23 from Products.ZenModel.Exceptions import DeviceExistsError
24
25 import transaction
26
27 from twisted.spread import pb
28 import math
29 import re
30
31 from ModelerService import ModelerService
32
33 DEFAULT_PING_THRESH = 168
34
35
36 -class IpNetProxy(pb.Copyable, pb.RemoteCopy):
37 "A class that will represent a ZenModel/IpNetwork in zendisc"
38
39 id = ''
40 _children = None
41 netmask = None
42
44 self.id = ipnet.id
45 self._children = map(IpNetProxy, ipnet.children())
46 self.netmask = ipnet.netmask
47 for prop in 'zAutoDiscover zDefaultNetworkTree zPingFailThresh'.split():
48 if hasattr(ipnet, prop):
49 setattr(self, prop, getattr(ipnet, prop))
50
53
55 "copied from IpNetwork"
56 if (self.netmask == 32): return [self.id]
57 ipnumb = numbip(self.id)
58 maxip = math.pow(2, 32 - self.netmask)
59 start = int(ipnumb + 1)
60 end = int(ipnumb + maxip - 1)
61 return map(strip, range(start,end))
62
65
66 pb.setUnjellyableForClass(IpNetProxy, IpNetProxy)
69
70 @translateError
72 "Get network objects to scan networks should be in CIDR form 1.1.1.0/24"
73 netObj = self.dmd.Networks.getNetworkRoot().findNet(net)
74 if not netObj:
75 return None
76 nets = [netObj]
77 if includeSubNets:
78 nets += netObj.getSubNetworks()
79 return map(IpNetProxy, nets)
80
81
82 @translateError
109
110
128
129
130 @translateError
132 """Create a device.
133
134 @param ip: The manageIp of the device
135 @param kw: The args to manage_createDevice.
136 """
137 from Products.ZenModel.Device import getNetworkRoot
138 try:
139 netroot = getNetworkRoot(self.dmd,
140 kw.get('performanceMonitor', 'localhost'))
141 netobj = netroot.getNet(ip)
142 netmask = 24
143 if netobj is not None:
144 netmask = netobj.netmask
145 else:
146 defaultNetmasks = getattr(netroot, 'zDefaultNetworkTree', [])
147 if defaultNetmasks:
148 netmask = defaultNetmasks[0]
149 netroot.createIp(ip, netmask)
150 autoDiscover = getattr(netobj, 'zAutoDiscover', True)
151
152 if not force and not autoDiscover:
153 return None, False
154 kw['manageIp'] = ip
155 dev = manage_createDevice(self.dmd, **kw)
156 except DeviceExistsError, e:
157
158 e.dev.setManageIp(kw['manageIp'])
159
160 if e.dev.title is None or len(e.dev.title) <= 0 or \
161 re.match('^(0*([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}0*([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5]){1}$', e.dev.title):
162 e.dev.setTitle(kw['deviceName'])
163 for key in ('manageIp', 'deviceName', 'devicePath',
164 'discoverProto'):
165 del kw[key]
166
167 e.dev.updateDevice(**kw)
168
169 return self.createDeviceProxy(e.dev), False
170 except Exception, ex:
171 log.exception("IP address %s (kw = %s) encountered error", ip, kw)
172 raise pb.CopyableFailure(ex)
173 transaction.commit()
174 return self.createDeviceProxy(dev), True
175
176 @translateError
178 jobstatus = self.dmd.JobManager.getJob(jobid)
179 if jobstatus:
180 return JobStatusProxy(jobstatus)
181
182 @translateError
189
190 @translateError
192 """
193 Return the ips that the device's indirect routes point to
194 which aren't currently connected to devices.
195 """
196 dev = self.getPerformanceMonitor().findDevice(device)
197 ips = []
198 for r in dev.os.routes():
199 ipobj = r.nexthop()
200 if ipobj: ips.append(ipobj.id)
201 return ips
202
203
204 @translateError
209
210
211 @translateError
213 "Get the snmp configuration defaults for scanning a device"
214 devroot = self.dmd.Devices.createOrganizer(devicePath)
215 return (devroot.zSnmpCommunities,
216 devroot.zSnmpPort,
217 devroot.zSnmpVer,
218 devroot.zSnmpTimeout,
219 devroot.zSnmpTries)
220
221
222 @translateError
226
227 @translateError
231