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