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
30 from ModelerService import ModelerService
31
32 DEFAULT_PING_THRESH = 168
33
34
36 "A class that will represent a ZenModel/IpNetwork in zendisc"
37
38 id = ''
39 _children = None
40 netmask = None
41
43 self.id = ipnet.id
44 self._children = map(IpNetProxy, ipnet.children())
45 self.netmask = ipnet.netmask
46 for prop in 'zAutoDiscover zDefaultNetworkTree zPingFailThresh'.split():
47 if hasattr(ipnet, prop):
48 setattr(self, prop, getattr(ipnet, prop))
49
52
54 "copied from IpNetwork"
55 if (self.netmask == 32): return [self.id]
56 ipnumb = numbip(self.id)
57 maxip = math.pow(2, 32 - self.netmask)
58 start = int(ipnumb + 1)
59 end = int(ipnumb + maxip - 1)
60 return map(strip, range(start,end))
61
64
65 pb.setUnjellyableForClass(IpNetProxy, IpNetProxy)
66
68
69 @translateError
71 "Get network objects to scan networks should be in CIDR form 1.1.1.0/24"
72 netObj = self.dmd.Networks.getNetworkRoot().findNet(net)
73 if not netObj:
74 return None
75 nets = [netObj]
76 if includeSubNets:
77 nets += netObj.getSubNetworks()
78 return map(IpNetProxy, nets)
79
80
81 @translateError
108
109
129
130
131 @translateError
133 """Create a device.
134
135 @param ip: The manageIp of the device
136 @param kw: The args to manage_createDevice.
137 """
138 from Products.ZenModel.Device import getNetworkRoot
139 try:
140 netroot = getNetworkRoot(self.dmd,
141 kw.get('performanceMonitor', 'localhost'))
142 ipobj = netroot.createIp(ip)
143
144 if not force and not getattr(ipobj, 'zAutoDiscover', True):
145 return None, False
146 kw['manageIp'] = ip
147 dev = manage_createDevice(self.dmd, **kw)
148 except DeviceExistsError, e:
149
150 e.dev.setManageIp(kw['manageIp'])
151 for key in ('manageIp', 'deviceName', 'devicePath',
152 'discoverProto'):
153 del kw[key]
154 e.dev.manage_editDevice(**kw)
155
156 return self.createDeviceProxy(e.dev), False
157 except Exception, ex:
158 raise pb.CopyableFailure(ex)
159 transaction.commit()
160 return self.createDeviceProxy(dev), True
161
162 @translateError
167
168 @translateError
175
176 @translateError
178 """
179 Return the ips that the device's indirect routes point to
180 which aren't currently connected to devices.
181 """
182 dev = self.getPerformanceMonitor().findDevice(device)
183 ips = []
184 for r in dev.os.routes():
185 ipobj = r.nexthop()
186 if ipobj: ips.append(ipobj.id)
187 return ips
188
189
190 @translateError
195
196
197 @translateError
199 "Get the snmp configuration defaults for scanning a device"
200 devroot = self.dmd.Devices.createOrganizer(devicePath)
201 return (devroot.zSnmpCommunities,
202 devroot.zSnmpPort,
203 devroot.zSnmpVer,
204 devroot.zSnmpTimeout,
205 devroot.zSnmpTries)
206
207
208 @translateError
212
213 @translateError
217