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
127
128
129 @translateError
131 """Create a device.
132
133 @param ip: The manageIp of the device
134 @param kw: The args to manage_createDevice.
135 """
136 from Products.ZenModel.Device import getNetworkRoot
137 try:
138 netroot = getNetworkRoot(self.dmd,
139 kw.get('performanceMonitor', 'localhost'))
140 ipobj = netroot.createIp(ip)
141
142 if not force and not getattr(ipobj, 'zAutoDiscover', True):
143 return None, False
144 kw['manageIp'] = ip
145 dev = manage_createDevice(self.dmd, **kw)
146 except DeviceExistsError, e:
147
148 e.dev.setManageIp(kw['manageIp'])
149 e.dev.setTitle(kw['deviceName'])
150 for key in ('manageIp', 'deviceName', 'devicePath',
151 'discoverProto'):
152 del kw[key]
153 e.dev.manage_editDevice(**kw)
154
155 return self.createDeviceProxy(e.dev), False
156 except Exception, ex:
157 raise pb.CopyableFailure(ex)
158 transaction.commit()
159 return self.createDeviceProxy(dev), True
160
161 @translateError
163 jobstatus = self.dmd.JobManager.getJob(jobid)
164 if jobstatus:
165 return JobStatusProxy(jobstatus)
166
167 @translateError
174
175 @translateError
177 """
178 Return the ips that the device's indirect routes point to
179 which aren't currently connected to devices.
180 """
181 dev = self.getPerformanceMonitor().findDevice(device)
182 ips = []
183 for r in dev.os.routes():
184 ipobj = r.nexthop()
185 if ipobj: ips.append(ipobj.id)
186 return ips
187
188
189 @translateError
194
195
196 @translateError
198 "Get the snmp configuration defaults for scanning a device"
199 devroot = self.dmd.Devices.createOrganizer(devicePath)
200 return (devroot.zSnmpCommunities,
201 devroot.zSnmpPort,
202 devroot.zSnmpVer,
203 devroot.zSnmpTimeout,
204 devroot.zSnmpTries)
205
206
207 @translateError
211
212 @translateError
216