def report(self, devicesById, connectivitiesByDeviceId): """ dict(int, Device), list(Connectivity) -> None Main reporting method """ connectivityTokens = set() # track reported connections regardless of direction bulkSentDeviceIds = set() # track reported Devices vector = ObjectStateHolderVector() for deviceId, device in devicesById.iteritems(): if vector.size() > self.bulkThreshold: self.sendVector(vector) vector = ObjectStateHolderVector() bulkSentDeviceIds = set() if device and not deviceId in bulkSentDeviceIds: self.reportDeviceTopology(device, vector) bulkSentDeviceIds.add(deviceId) connectivities = connectivitiesByDeviceId and connectivitiesByDeviceId.get(deviceId) or [] for connectivity in connectivities: connectivityToken = _getConnectivityToken(connectivity) if connectivityToken and not connectivityToken in connectivityTokens: remoteDevice = devicesById.get(connectivity.remoteDeviceId) if remoteDevice: if not remoteDevice.deviceId in bulkSentDeviceIds: self.reportDeviceTopology(remoteDevice, vector) bulkSentDeviceIds.add(remoteDevice.deviceId) port = device.portsById.get(connectivity.portId) remotePort = remoteDevice.portsById.get(connectivity.remotePortId) if port and remotePort: try: self.reportConnectivity(port, remotePort, vector) except ValueError: logger.debugException("Failed to report connectivity") connectivityTokens.add(connectivityToken) # include remote ports in VLANs with matching IDs on the same connection matchingVlans = self.findMatchingVlans(port, remotePort) for vlan in matchingVlans: remoteTargetPorts = self._getTargetVlanPorts(remotePort) for remoteTargetPort in remoteTargetPorts: self.reportMembershipVlanToPort(vlan, remoteTargetPort, vector) if vector.size() > 0: self.sendVector(vector)
def DiscoveryMain(Framework): vector = ObjectStateHolderVector() knownPortsConfigFile = Framework.getConfigFile(CollectorsParameters.KEY_COLLECTORS_SERVERDATA_PORTNUMBERTOPORTNAME) endpoint = Framework.getDestinationAttribute('ip_port_pair') address, port = endpoint.rsplit(':', 1) endpoint = netutils.createTcpEndpoint(address, port) ipServiceName = Framework.getDestinationAttribute('ip_service_name') if ipServiceName == 'sap_jmx': endpoint = convertToHttpEndpoint(endpoint) if endpoint: logger.debug('Current %s' % endpoint) vector, errors, warnings = _discover(Framework, knownPortsConfigFile, endpoint) logger.debug('Result vector size: %d' % vector.size()) logger.debug('Errors: %s' % errors) logger.debug('Warnings: %s' % warnings) fptools.each(logger.reportErrorObject, errors) fptools.each(logger.reportWarningObject, warnings) else: protocolName = 'sapjmxprotocol' protocolLabel = errormessages.protocolNames[protocolName] messagePattern = errormessages.NO_HTTP_ENDPOINTS_TO_PROCESS_ERROR msg = errormessages.makeErrorMessage(protocolName, pattern=messagePattern) errCode = errorcodes.NO_HTTP_ENDPOINTS_TO_PROCESS errobj = errorobject.createError(errCode, [protocolLabel], msg) logger.reportWarningObject(errobj) return vector
def DiscoveryMain(Framework): OSHVResult = ObjectStateHolderVector() configFileList = Framework.getTriggerCIDataAsList('configfile') or [] isDiscoverySuccess = 0 custom_configList = Framework.getParameter('configFiles') or '' for x in custom_configList.split(','): configFileList.append(x.strip()) if configFileList: try: discoverer = TomcatDiscoverer(Framework, OSHVResult) for configFile in configFileList: if configFile and configFile != 'NA': try: discoverer.discoverTomcat(configFile) except Exception, ex: logger.info('Failed to parse:', configFile) logger.info("Exception: ", ex) else: isDiscoverySuccess = 1 except: logger.debugException('Failed to discover Apache Tomcat') Framework.reportError('Failed to discover Apache Tomcat. See logs') if not isDiscoverySuccess or OSHVResult.size() == 0: Framework.reportError('Failed to discover Apache Tomcat. See logs') return OSHVResult
def DiscoveryMain(Framework): OSHVResult = ObjectStateHolderVector() shell = None protocol = Framework.getDestinationAttribute('Protocol') try: try: try: hostName = Framework.getDestinationAttribute('hostname') msMqManagerUcmdbId = Framework.getDestinationAttribute('msmq_id') msMqManagerOsh = modeling.createOshByCmdbIdString('msmqmanager', msMqManagerUcmdbId) client = Framework.createClient() shell = shellutils.ShellUtils(client) msMqDiscoverer = MsMqDiscoverer(shell, msMqManagerOsh, hostName) if msMqDiscoverer: msMqDiscoverer.discover() msMqDiscoverer.addResultsToVector(OSHVResult) finally: try: shell and shell.closeClient() except: logger.debugException('') logger.error('Unable to close shell') if OSHVResult.size() == 0: raise Exception, "Failed getting information about Microsoft Message Queue" except JavaException, ex: msg =ex.getMessage() errormessages.resolveAndReport(msg, protocol, Framework) except: msg = logger.prepareJythonStackTrace('') errormessages.resolveAndReport(msg, protocol, Framework) return OSHVResult
def DiscoveryMain(Framework): OSHVResult = ObjectStateHolderVector() jobId = Framework.getDiscoveryJobId() host_id = Framework.getDestinationAttribute('id') host_name = Framework.getTriggerCIData('host_name') dnsServers = Framework.getTriggerCIDataAsList('dnsServers') or None try: host_name = host_name.split(" ") ips = pi_utils.getIPs(host_name[0], Framework) if not ips: raise ValueError() hostOSH = modeling.createOshByCmdbIdString('node', host_id) modeling.addHostAttributes(hostOSH, None, host_name[0]) #OSHVResult.add(hostOSH) for ip in ips: ipRes = pi_utils.getIPOSHV(Framework, ip, None, dnsServers, False, True) if ipRes.size() > 0: OSHVResult.add(modeling.createLinkOSH('containment',hostOSH,modeling.createIpOSH(ip))) OSHVResult.addAll(ipRes) if OSHVResult.size() <=0: raise ValueError() except Exception, e: msg = logger.prepareJythonStackTrace("Error getting IPs for %s: " % (host_name), e) errormessages.resolveAndReport(msg, jobId, Framework) logger.error(msg)
def DiscoveryMain(Framework): OSHVResult = ObjectStateHolderVector() shell = None protocol = Framework.getDestinationAttribute('Protocol') try: try: try: hostName = Framework.getDestinationAttribute('hostname') msMqManagerUcmdbId = Framework.getDestinationAttribute( 'msmq_id') msMqManagerOsh = modeling.createOshByCmdbIdString( 'msmqmanager', msMqManagerUcmdbId) client = Framework.createClient() shell = shellutils.ShellUtils(client) msMqDiscoverer = MsMqDiscoverer(shell, msMqManagerOsh, hostName) if msMqDiscoverer: msMqDiscoverer.discover() msMqDiscoverer.addResultsToVector(OSHVResult) finally: try: shell and shell.closeClient() except: logger.debugException('') logger.error('Unable to close shell') if OSHVResult.size() == 0: raise Exception, "Failed getting information about Microsoft Message Queue" except JavaException, ex: msg = ex.getMessage() errormessages.resolveAndReport(msg, protocol, Framework) except: msg = logger.prepareJythonStackTrace('') errormessages.resolveAndReport(msg, protocol, Framework) return OSHVResult
def DiscoveryMain(Framework): OSHVResult = ObjectStateHolderVector() configFileList = Framework.getTriggerCIDataAsList('configfile') or [] isDiscoverySuccess = 0 custom_configList = Framework.getParameter('configFiles') or '' for x in custom_configList.split(','): configFileList.append(x.strip()) if configFileList: try: discoverer = TomcatDiscoverer(Framework, OSHVResult) for configFile in configFileList: if configFile and configFile != 'NA': try: discoverer.discoverTomcat(configFile) except Exception, ex: logger.info('Failed to parse:', configFile) logger.info("Exception: ", ex ) else: isDiscoverySuccess = 1 except: logger.debugException('Failed to discover Apache Tomcat') Framework.reportError('Failed to discover Apache Tomcat. See logs') if not isDiscoverySuccess or OSHVResult.size() == 0: Framework.reportError('Failed to discover Apache Tomcat. See logs') return OSHVResult
def DiscoveryMain(Framework): OSHVResult = ObjectStateHolderVector() jobId = Framework.getDiscoveryJobId() host_id = Framework.getDestinationAttribute('id') host_name = Framework.getTriggerCIData('host_name') dnsServers = Framework.getTriggerCIDataAsList('dnsServers') or None try: host_name = host_name.split(" ") ips = pi_utils.getIPs(host_name[0], Framework) if not ips: raise ValueError() hostOSH = modeling.createOshByCmdbIdString('node', host_id) modeling.addHostAttributes(hostOSH, None, host_name[0]) #OSHVResult.add(hostOSH) for ip in ips: ipRes = pi_utils.getIPOSHV(Framework, ip, None, dnsServers, False, True) if ipRes.size() > 0: OSHVResult.add( modeling.createLinkOSH('containment', hostOSH, modeling.createIpOSH(ip))) OSHVResult.addAll(ipRes) if OSHVResult.size() <= 0: raise ValueError() except Exception, e: msg = logger.prepareJythonStackTrace( "Error getting IPs for %s: " % (host_name), e) errormessages.resolveAndReport(msg, jobId, Framework) logger.error(msg)
def DiscoveryMain(Framework): OSHVResult = ObjectStateHolderVector() try: client = Framework.createClient() vendor = Framework.getDestinationAttribute("discovered_vendor") hostId = Framework.getDestinationAttribute("hostId") host_osh = modeling.createOshByCmdbId("firewall", hostId) discoverer = firewall_discoverer.getDiscoverer(vendor, client) if not discoverer: raise ValueError("Unsupported device.") firewall_config = discoverer.discover() OSHVResult.addAll(firewall.reportTopology(firewall_config, host_osh)) except: import sys logger.debugException("") error_str = str(sys.exc_info()[1]).strip() logger.reportError(error_str) finally: client and client.close() ## Write implementation to return new result CIs here... if OSHVResult.size() == 0: logger.debug("No data discovered from destination.") logger.reportWarning("No data discovered from destination.") return OSHVResult
def doService(client, hostOsh, servicesByCmd=None, languageBundle=None, framework=None): ''' Discover Windows services Shell, osh[, java.util.Hashtable, bundle, Framework] -> oshVector ''' resultVector = ObjectStateHolderVector() serviceDiscoverer = None if servicesByCmd is None: servicesByCmd = HashMap() servicePropertiesList = [ SERVICE_NAME, SERVICE_DISPLAY_NAME, SERVICE_DESCRIPTION, SERVICE_COMMAND_LINE, SERVICE_STARTUP_TYPE, SERVICE_OPERATING_STATUS, SERVICE_CAN_BE_PAUSED, SERVICE_START_USER ] discovererClasses = [WmicServiceDiscoverer, RegistryServicesDiscoverer] for discovererClass in discovererClasses: serviceDiscoverer = discovererClass(client, hostOsh, servicePropertiesList, languageBundle, framework) try: serviceDiscoverer.discover() serviceDiscoverer.addResultsToVector(resultVector, servicesByCmd) logger.debug('found ', str(resultVector.size()), ' Service CIs') break except: logger.debugException('') else: framework.reportWarning('Failed getting Services') return resultVector
def doDiscovery(Framework, shell, ip, credentialId, codepage, shellName, warningsList, errorsList, uduid = None): vector = ObjectStateHolderVector() try: try: languageName = shell.osLanguage.bundlePostfix langBund = Framework.getEnvironmentInformation().getBundle('langNetwork', languageName) remoteHostnames = dns_resolver.NsLookupDnsResolver(shell).resolve_hostnames(ip) remoteHostFqdn = None if remoteHostnames: remoteHostFqdn = remoteHostnames[0] shellObj = createShellObj(shell, ip, langBund, languageName, codepage, remoteHostFqdn) try: vector.addAll(discover(shell, shellObj, ip, langBund, Framework, uduid)) finally: # create shell OSH if connection established if shellObj and not vector.size(): hostOsh = modeling.createHostOSH(ip) shellObj.setContainer(hostOsh) vector.add(shellObj) except Exception, ex: strException = ex.getMessage() errormessages.resolveAndAddToObjectsCollections(strException, shellName, warningsList, errorsList) except: msg = str(sys.exc_info()[1]) logger.debugException('') errormessages.resolveAndAddToObjectsCollections(msg, shellName, warningsList, errorsList)
def processWorkbook (self): """ Entry point to the importer -> OSHVResult """ numSheets = self.workbook.getNumberOfSheets() #get all sheets allSheets = [self.workbook.getSheetAt(i) for i in xrange(numSheets)] #get sheet processors to all non-comment sheets allSheetProcessors = [SheetProcessor(sheet) for sheet in allSheets if not sheet.getSheetName().startswith(self.__COMMENT_START)] #list of OSH sheets oshSheetProcessors = [proc for proc in allSheetProcessors if not proc.getSheetName().startswith(self.__RELATIONSHIPS_START)] #list of relationships sheets realtionSheetProcessors = [proc for proc in allSheetProcessors if proc.getSheetName().startswith(self.__RELATIONSHIPS_START)] logger.info ('\t------------------------------------------------------------------') logger.info ('\tProcess all tabs and create OSH from them; Root containers and links will be created lately') logger.info ('\t------------------------------------------------------------------') for processor in oshSheetProcessors: worksheetName = processor.getSheetName() logger.debug('Processing worksheet: %s' % worksheetName) try: colNames = processor.getSheetColumnNames() attrDefs = self.classModelUtils.getTypeDefs(worksheetName) xlsutils.validateSheet(colNames, attrDefs, worksheetName) self.fillOshDict(processor, attrDefs) except: logger.debugException('') logger.reportWarning('Skipping worksheet "%s" due to errors found' %(worksheetName)) logger.info ('\t------------------------------------------------------------------') logger.info ('\tProcess root containers from early created OSHes') logger.info ('\t------------------------------------------------------------------') for processor in oshSheetProcessors: worksheetName = processor.getSheetName() logger.debug('Processing references of worksheet: %s' % worksheetName) self.processReferences(processor) logger.info ('\t------------------------------------------------------------------') logger.info ('\tReport OSH to vector') logger.info ('\t------------------------------------------------------------------') OSHVResult = ObjectStateHolderVector() for key, osh in self.keysToOsh.items(): if self.classModelUtils.isValidOsh(osh): OSHVResult.add (osh) else: logger.warn('OSH at %s does not have all key attributes' % key) logger.reportWarning("Imported file doesn't contain mapping for key attribute") logger.debug('reported %i objects' % OSHVResult.size()) logger.info ('\t------------------------------------------------------------------') logger.info ('\tProcess relationships') logger.info ('\t------------------------------------------------------------------') for processor in realtionSheetProcessors: linksVec = self.processRelationshipTab(processor) OSHVResult.addAll(linksVec) if not len(realtionSheetProcessors): logger.info ('\tNo relationships tab was found for processing') return OSHVResult
def getProcesses(self,hostId,sqlServerId,databases,users): oshv = ObjectStateHolderVector() try: logger.debug('get db processes') rs = self.connection.getTable("SELECT name as dbname,hostname,program_name,count(*) connection_count,sum(blocked) blocked_sum,net_address,net_library,loginame,nt_username,nt_domain FROM master..sysprocesses a, master..sysdatabases b WHERE a.dbid = b.dbid and hostname is not null and hostname != '' and program_name is not null and program_name != '' group by name,hostname,program_name,net_address,net_library,loginame,nt_username,nt_domain order by dbname, hostname, program_name") currentDbOSH = '' currentDatabase = '' currentHostName = '' currentUserName = '' clientsCount = 0 while rs.next(): try: programName = rs.getString('program_name').strip() hostname = rs.getString('hostname') if hostname == None: continue hostname = string.strip(hostname) hostname = netutils.getHostName(hostname, hostname) dbname = rs.getString('dbname') count = int(rs.getInt('connection_count')) loginName = rs.getString('loginame').strip() #create the dbuser: dbuser = users.get(loginName) #create the use link database = databases.get(dbname) if database is not None: #here we have a bug the user might be NULL #If, e.g, some user like DEVLAB\amqa, logined into the database, while login permissions #are given to the BUILTIN\Administrator, in users map we will have BUILTIN\Administrator, #and we will not find there DEVLAB\amqa although DEVLAB\amqa is in BUILTIN\Administrator group if dbuser is None: logger.debug('could not find user: '******'owner', dbuser, database) oshv.add(owner) if (currentDatabase == dbname) and (currentHostName == hostname) and (currentUserName == programName): clientsCount = clientsCount + count else: self.populateResult(oshv, currentHostName, currentUserName, currentDbOSH, clientsCount) currentDbOSH = database currentDatabase = dbname currentHostName = hostname currentUserName = programName clientsCount = count except: logger.debugException(hostId.toString()) self.populateResult(oshv, currentHostName, currentUserName, currentDbOSH, clientsCount) rs.close() logger.debug('got processes: ', oshv.size()) except: logger.debugException(hostId.toString()) return oshv
def discover_vlans(self): bridge_mac_address = self.get_bridge_mac_address() vlan_table_res = self.snmp_client.executeQuery( self.VLAN_TABLE_MIB) #@@CMD_PERMISION snmp protocol execution vlan_table = vlan_table_res.asTable() if len(vlan_table) == 0: raise NoVlansException, "No VLANs Configured on the device." vlan_ports_map = self.get_ports() for i in range(len(vlan_table)): oshv_result = ObjectStateHolderVector() vlan_oid = vlan_table[i][0] vlan_name = vlan_table[i][1] vlan_number = vlan_oid[vlan_oid.find('.') + 1:] port_list = vlan_ports_map.get(vlan_number) bridge_osh = None if not port_list: logger.warn( 'Skipping VLAN %s since it has no ports assigned.' % vlan_number) continue vlan_osh = ObjectStateHolder('vlan') vlan_osh.setContainer(self.host_osh) modeling.setVlanIdAttribute(vlan_osh, vlan_number) vlan_osh.setAttribute('data_name', vlan_name) if bridge_mac_address: vlan_osh.setAttribute('vlan_bridgemac', bridge_mac_address) bridge_osh = ObjectStateHolder('bridge') bridge_osh.setContainer(self.host_osh) bridge_osh.setAttribute('bridge_basemacaddr', bridge_mac_address) oshv_result.add(bridge_osh) depend_link = modeling.createLinkOSH('depend', vlan_osh, bridge_osh) oshv_result.add(depend_link) oshv_result.add(vlan_osh) for port in port_list: port_osh = ObjectStateHolder('port') port_osh.setContainer(self.host_osh) modeling.setPhysicalPortNumber(port_osh, port) oshv_result.add(port_osh) member_link = modeling.createLinkOSH('membership', vlan_osh, port_osh) oshv_result.add(member_link) if bridge_osh: contains_link = modeling.createLinkOSH( 'contains', bridge_osh, port_osh) oshv_result.add(contains_link) self.framework.sendObjects(oshv_result) self.framework.flushObjects() logger.debug( 'Vlan %s successfully discovered. Result vector contains %d objects.' % (vlan_name, oshv_result.size())) if self.snmp_client: self.snmp_client.close()
def mainFunction(Framework): warningsList = [] errorsList = [] _vector = ObjectStateHolderVector() ip_address = Framework.getDestinationAttribute('ip_address') macAddress = Framework.getDestinationAttribute('ip_mac_address') ip_domain = Framework.getDestinationAttribute('ip_domain') host_cmdbid = Framework.getDestinationAttribute('host_cmdbid') host_key = Framework.getDestinationAttribute('host_key') host_macs = Framework.getTriggerCIDataAsList('mac_addrs') ucmdb_version = modeling.CmdbClassModel().version() ip_address = __getIpObjectFromDestinationData(ip_address, macAddress) credentials = netutils.getAvailableProtocols(Framework, ClientsConsts.WMI_PROTOCOL_NAME, str(ip_address), ip_domain) if len(credentials) == 0: msg = errormessages.makeErrorMessage(protocolName, pattern=errormessages.ERROR_NO_CREDENTIALS) errobj = errorobject.createError(errorcodes.NO_CREDENTIALS_FOR_TRIGGERED_IP, [protocolName], msg) warningsList.append(errobj) logger.debug(msg) return (_vector, warningsList, errorsList) for credential in credentials: client = None try: debug_string = ip_domain + "\\" + str(ip_address) props = Properties() props.setProperty(CollectorsConstants.DESTINATION_DATA_IP_ADDRESS, str(ip_address)) logger.debug('try to get wmi agent for: ', debug_string) client = Framework.createClient(credential, props) logger.debug('got wmi agent for: ', debug_string) hostForLinkOSH = modeling.createHostOSH(str(ip_address)) # create wmi OSH wmiOSH = modeling.createWmiOSH(str(ip_address)) wmiOSH.setAttribute('credentials_id', client.getCredentialId()) wmiOSH.setContainer(hostForLinkOSH) _vector = doWMI(client, wmiOSH, ip_address, ip_domain, hostForLinkOSH, host_cmdbid, host_key, host_macs, ucmdb_version) if _vector.size() > 0: Framework.saveState(credential) del warningsList[:] del errorsList[:] break except Exception, ex: strException = str(ex.getMessage()) shouldStop = errormessages.resolveAndAddToObjectsCollections(strException, protocolName, warningsList, errorsList) if shouldStop: break except:
def DiscoveryMain(Framework): OSHVResult = ObjectStateHolderVector() protocolType = Framework.getParameter('protocolType') if protocolType is None: raise Exception, 'Mandatory parameter protocolType is not set' #find protocols for desired DB type acceptedProtocols = [] protocols = Framework.getAvailableProtocols( ClientsConsts.SQL_PROTOCOL_NAME) for protocol in protocols: protocolDbType = Framework.getProtocolProperty( protocol, CollectorsConstants.SQL_PROTOCOL_ATTRIBUTE_DBTYPE, NA) if re.match(protocolType, protocolDbType, re.IGNORECASE): acceptedProtocols.append(protocol) if len(acceptedProtocols) == 0: Framework.reportWarning( 'Protocol not defined or IP out of protocol network range') logger.error( 'Protocol not defined or IP out of protocol network range') return OSHVResult connectionData = getConnectionData(Framework, protocolType, acceptedProtocols) reportedSids = [] warningsList = [] errorsList = [] for connectionDataItem in connectionData: protocolId, ipAddressList, destinationPortList, sidList = connectionDataItem logger.debug('Connecting by protocol %s' % protocolId) errList = [] oshVector = connectByProtocol(Framework, protocolId, ipAddressList, destinationPortList, sidList, protocolType, reportedSids, errList) if oshVector.size() > 0: OSHVResult.addAll(oshVector) for error in errList: if errormessages.resolveAndAddToObjectsCollections( error, ClientsConsts.SQL_PROTOCOL_NAME, warningsList, errorsList): break reportError = OSHVResult.size() == 0 if reportError: Framework.reportError('Failed to connect using all protocols') logger.error('Failed to connect using all protocols') reportErrors(errorsList) reportErrors(warningsList) # else: # reportWarnings(errorsList) # reportWarnings(warningsList) return OSHVResult
def getBackup(self, databases, dbList, hostId): oshv = ObjectStateHolderVector() backupMap = self.getDBBackups(databases, dbList) backupFilesMap = self.getBackupFiles(databases, dbList, hostId, oshv) #create the use link logger.debug("get backup files") for key in backupMap.keySet(): backup = backupMap.get(key) backupFile = backupFilesMap.get(key) if backup is not None and backupFile is not None: oshv.add(backup) oshv.add(backupFile) link = modeling.createLinkOSH("use", backup, backupFile) oshv.add(link) logger.debug("got backup files: ", oshv.size()) return oshv
def getBackup(self,databases,dbList,hostId): oshv = ObjectStateHolderVector() backupMap = self.getDBBackups(databases,dbList) backupFilesMap=self.getBackupFiles(databases,dbList,hostId,oshv) #create the use link logger.debug("get backup files") for key in backupMap.keySet(): backup = backupMap.get(key) backupFile =backupFilesMap.get(key) if backup is not None and backupFile is not None: oshv.add(backup) oshv.add(backupFile) link = modeling.createLinkOSH("use", backup, backupFile) oshv.add(link) logger.debug("got backup files: ", oshv.size()) return oshv
def DiscoveryMain(Framework): OSHVResult = ObjectStateHolderVector() ip = Framework.getDestinationAttribute('ip') port = Framework.getDestinationAttribute('port') scp_id = Framework.getDestinationAttribute('scp_id') apache_id = Framework.getDestinationAttribute('apache_id') apache_ip = Framework.getDestinationAttribute('apache_ip') contexts = Framework.getTriggerCIDataAsList('contexts') context_ids = Framework.getTriggerCIDataAsList('context_ids') localShell = shellutils.ShellUtils(Framework.createClient(ClientsConsts.LOCAL_SHELL_PROTOCOL_NAME)) protocolName = ClientsConsts.HTTP_PROTOCOL_NAME connectionFailedMsgs = [] protocolIds = findProperProtocolIds(ip, netutils.getAvailableProtocols(Framework, protocolName, ip) or []) if not protocolIds: msg = errormessages.makeErrorMessage(protocolName, pattern=errormessages.ERROR_NO_CREDENTIALS) errobj = errorobject.createError(errorcodes.NO_CREDENTIALS_FOR_TRIGGERED_IP, [protocolName], msg) logger.reportErrorObject(errobj) return OSHVResult httpClient, protocolId, version = findHttpProtocol(Framework, protocolName, protocolIds, ip, connectionFailedMsgs) if httpClient: apacheOsh = modeling.createOshByCmdbIdString('apache', apache_id) # create oam running software createOAMRunningSoftwareOsh(scp_id, ip, port, protocolId, version, apacheOsh, OSHVResult) # get oam policy content policy_content = getPolicyContent(httpClient, ip, protocolId, protocolName, version) # parse oam policy, get redirect urls authorization_policies = oam_policy_parser.parse_oam_policy(policy_content) redirect_policies = oam_policy_parser.get_redirect_policies(authorization_policies) # create oam dependency scp for index in range(0, len(contexts)): context, context_id = contexts[index], context_ids[index] if context_id: matched_policies = findMatchedRedirectPolicies(context, redirect_policies) apacheScpOsh = modeling.createOshByCmdbIdString('scp', context_id) for policy in matched_policies: createOAMDependenyScp(localShell, apacheOsh, apacheScpOsh, policy.redirect_url, apache_ip, OSHVResult) if not OSHVResult.size(): for msg in connectionFailedMsgs: errobj = errorobject.createError(errorcodes.CONNECTION_FAILED, [protocolName], msg) logger.reportErrorObject(errobj) return OSHVResult
def executeWmiQuery(client, OSHVResult, servicesByCmd=None, nodeOsh=None): containerOsh = nodeOsh or modeling.createHostOSH(client.getIpAddress()) wmiProvider = wmiutils.getWmiProvider(client) queryBuilder = wmiProvider.getBuilder('Win32_Service') queryBuilder.addWmiObjectProperties('DisplayName', 'Description', \ 'PathName', 'StartMode', 'State', \ 'AcceptPause', 'StartName') wmicAgent = wmiProvider.getAgent() services = wmicAgent.getWmiData(queryBuilder) serviceOshv = ObjectStateHolderVector() for service in services: serviceOsh = modeling.createServiceOSH(containerOsh, service.DisplayName, service.Description, \ service.PathName, service.StartMode, service.State, \ service.AcceptPause, serviceStartUser=service.StartName) if service.PathName != None: servicesByCmd.put(CmdLine(service.PathName.lower()), serviceOsh) serviceOshv.add(serviceOsh) logger.debug('Discovered ', serviceOshv.size(), ' services') return serviceOshv
def doDiscovery(Framework, shell, ip, credentialId, codepage, shellName, warningsList, errorsList, uduid=None): vector = ObjectStateHolderVector() try: try: languageName = shell.osLanguage.bundlePostfix langBund = Framework.getEnvironmentInformation().getBundle( 'langNetwork', languageName) remoteHostnames = dns_resolver.NsLookupDnsResolver( shell).resolve_hostnames(ip) remoteHostFqdn = None if remoteHostnames: remoteHostFqdn = remoteHostnames[0] shellObj = createShellObj(shell, ip, langBund, languageName, codepage, remoteHostFqdn) try: vector.addAll( discover(shell, shellObj, ip, langBund, Framework, uduid)) finally: # create shell OSH if connection established if shellObj and not vector.size(): hostOsh = modeling.createHostOSH(ip) shellObj.setContainer(hostOsh) vector.add(shellObj) except Exception, ex: strException = ex.getMessage() errormessages.resolveAndAddToObjectsCollections( strException, shellName, warningsList, errorsList) except: msg = str(sys.exc_info()[1]) logger.debugException('') errormessages.resolveAndAddToObjectsCollections( msg, shellName, warningsList, errorsList)
def DiscoveryMain(Framework): OSHVResult = ObjectStateHolderVector() protocolType = Framework.getParameter('protocolType') if protocolType is None: raise Exception, 'Mandatory parameter protocolType is not set' #find protocols for desired DB type acceptedProtocols = [] protocols = Framework.getAvailableProtocols(ClientsConsts.SQL_PROTOCOL_NAME) for protocol in protocols: protocolDbType = Framework.getProtocolProperty(protocol, CollectorsConstants.SQL_PROTOCOL_ATTRIBUTE_DBTYPE, NA) if re.match(protocolType, protocolDbType, re.IGNORECASE): acceptedProtocols.append(protocol) if len(acceptedProtocols) == 0: Framework.reportWarning('Protocol not defined or IP out of protocol network range') logger.error('Protocol not defined or IP out of protocol network range') return OSHVResult connectionData = getConnectionData(Framework, protocolType, acceptedProtocols) reportedSids = [] warningsList = [] errorsList = [] for connectionDataItem in connectionData: protocolId, ipAddressList, destinationPortList, sidList = connectionDataItem logger.debug('Connecting by protocol %s' % protocolId) errList = [] oshVector = connectByProtocol(Framework, protocolId, ipAddressList, destinationPortList, sidList, protocolType, reportedSids, errList) if oshVector.size() > 0: OSHVResult.addAll(oshVector) for error in errList: if errormessages.resolveAndAddToObjectsCollections(error, ClientsConsts.SQL_PROTOCOL_NAME, warningsList, errorsList): break reportError = OSHVResult.size() == 0 if reportError: Framework.reportError('Failed to connect using all protocols') logger.error('Failed to connect using all protocols') reportErrors(errorsList) reportErrors(warningsList) # else: # reportWarnings(errorsList) # reportWarnings(warningsList) return OSHVResult
def DiscoveryMain(Framework): protocolName = Framework.getDestinationAttribute('Protocol') OSHVResult = ObjectStateHolderVector() try: HOST_IP = Framework.getDestinationAttribute('ip_address') MANAGER_PORT = Framework.getParameter('port') shellUtils = None try: codePage = Framework.getCodePage() properties = Properties() properties.put( BaseAgent.ENCODING, codePage) shellUtils = shellutils.ShellUtils(Framework, properties) discoveredOracleHomes = [] if shellUtils.isWinOs(): discoveredOracleHomes = OracleIASOracleHomeWindowsDiscoverer(shellUtils).discover() else: discoveredOracleHomes = OracleIASOracleHomeDiscoverer(shellUtils).discover() logger.debug('Discovered Oracle Homes from the running processes: %s' % discoveredOracleHomes) for oracleHomePath in discoveredOracleHomes: pathExists = 0 if oracleHomePath and oracleHomePath.strip(): try: opmnXML = shellUtils.safecat(str(oracleHomePath) + '/opmn/conf/opmn.xml') parseOpmnXml(opmnXML, HOST_IP, oracleHomePath, MANAGER_PORT, shellUtils, OSHVResult, Framework) pathExists = 1 except: logger.debugException('') if not pathExists: Framework.reportWarning("Can't retrieve opmn.xml content.") if OSHVResult.size() == 0: Framework.reportError("Failed to discover Oracle AS") finally: shellUtils and shellUtils.closeClient() except JavaException, ex: logger.debugException('') errormessages.resolveAndReport(ex.getMessage(), protocolName, Framework)
def DiscoveryMain(Framework): OSHVResult = ObjectStateHolderVector() ipAddress = Framework.getDestinationAttribute('ip_address') credentialsId = Framework.getDestinationAttribute('credentials_id') applicationPort = Framework.getDestinationAttribute("application_port") serviceAddressPort = Framework.getDestinationAttribute('port') if not applicationPort or applicationPort == 'NA': applicationPort = serviceAddressPort envBuilder = active_directory_utils.LdapEnvironmentBuilder(applicationPort) client = None daoService = None try: try: client = Framework.createClient(credentialsId, envBuilder.build()) logger.debug("Connected to AD") configurationNamingContext = getConfigurationNamingContext(client) domainSuffix = getDomainSuffix(configurationNamingContext) if not configurationNamingContext: raise ValueError, "Failed fetching configuration naming context from Active Directory" msmqDiscoverer = MsMqDiscoverer(client, Framework, ipAddress, domainSuffix) msmqDiscoverer.discover() msmqDiscoverer.addResultsToVector(OSHVResult) finally: if client is not None: try: client.close() except: logger.warn("Failed to close client") if OSHVResult.size() == 0: raise Exception, "Failed getting information about Microsoft Message Queue" except JException, ex: msg = ex.getMessage() logger.debugException('Unexpected LDAP Exception: ') errormessages.resolveAndReport(msg, LDAP_PROTOCOL_NAME, Framework)
def DiscoveryMain(Framework): OSHVResult = ObjectStateHolderVector() try: client = Framework.createClient() vendor = Framework.getDestinationAttribute('discovered_vendor') hostId = Framework.getDestinationAttribute('hostId') host_osh = modeling.createOshByCmdbId('firewall', hostId) discoverer = firewall_discoverer.getDiscoverer(vendor, client) if not discoverer: raise ValueError('Unsupported device.') firewall_config = discoverer.discover() OSHVResult.addAll(firewall.reportTopology(firewall_config, host_osh)) except: import sys logger.debugException('') error_str = str(sys.exc_info()[1]).strip() logger.reportError(error_str) finally: client and client.close() ## Write implementation to return new result CIs here... if OSHVResult.size() == 0: logger.debug('No data discovered from destination.') logger.reportWarning('No data discovered from destination.') return OSHVResult
def DiscoveryMain(Framework): SHELL_CLIENT_PROTOCOLS = _getSupportedShellProtocols(Framework) ip = Framework.getDestinationAttribute('ip_address') domain = Framework.getDestinationAttribute('ip_domain') codepage = Framework.getCodePage() useLastState = Framework.getParameter('useLastSuccessConnection') vector = ObjectStateHolderVector() warningsList = [] errorsList = [] # preparing empty dictionary for storing credentials later credentialsByType = {} # take the latest used credentials if any lastState = None if useLastState and useLastState.lower() == 'true': lastState = Framework.loadState() if lastState: credentialsByType[None] = [lastState] # try to get ip address by mac address from ARP Cache macAddress = Framework.getDestinationAttribute('ip_mac_address') foundIp = clientdiscoveryutils.getIPAddressOnlyFromMacAddress(macAddress) if foundIp: ip = foundIp # Gather credentials for protocols for clientType in SHELL_CLIENT_PROTOCOLS: # getting an ordered list of credentials for the given client type and storing them in the credentials dictionary protocols = netutils.getAvailableProtocols(Framework, clientType, ip, domain) if protocols: credentialsByType[clientType] = protocols ########################################################################################################## ##################################Start Special processing for Universal Discovery Agent################## # take Universal Discovery Agent credentials if new Universal Discovery Agent installed on that IP connectedDDMAgentCredentials = None if useLastState and useLastState.lower() == 'true': connectedDDMAgentCredentials = Framework.loadGlobalState(ip) client = None udaNotAlive = 0 if connectedDDMAgentCredentials: logger.debug('Found global state credentials ', connectedDDMAgentCredentials, ' of installed agent on ip:', ip) client = createClient(Framework, ClientsConsts.DDM_AGENT_PROTOCOL_NAME, [connectedDDMAgentCredentials], ip, codepage, warningsList, errorsList) # If we are successfully connected if client: logger.debug('Succeeded to connect with global state credentials ', client.getCredentialId(), ' of installed agent') Framework.saveState(client.getCredentialId()) else: logger.debug('Failed to connect with global state credentials ', connectedDDMAgentCredentials, ' on ip:', ip) udaNotAlive = 1 #AgentUtils.clearGlobalState(Framework) # only for case where no connection established before if not client: # checks whether there are credential for specified protocol if credentialsByType: if lastState: client = createClientFromLastState(Framework, lastState, warningsList, errorsList) if not client: logger.debug('Failed to create client using last state properties. Will try to connect using other credentials.') if not client: for clientType in SHELL_CLIENT_PROTOCOLS: credentials = credentialsByType.get(clientType) if credentials: client = createClient(Framework, clientType, credentials, ip, codepage, warningsList, errorsList) if client: warningsList = [] errorsList = [] # save credentials id for further reuse Framework.saveState(client.getCredentialId()) break else: for shellType in SHELL_CLIENT_PROTOCOLS: msg = errormessages.makeErrorMessage(shellType, pattern=errormessages.ERROR_NO_CREDENTIALS) errobj = errorobject.createError(errorcodes.NO_CREDENTIALS_FOR_TRIGGERED_IP, [shellType], msg) warningsList.append(errobj) if not client: Framework.clearState() else: # successfully connected, do discovery shell = None clientType = client.getClientType() connectedOSCredentialID = None try: try: shellFactory = shellutils.ShellFactory() shell = shellFactory.createShell(client, clientType) connectedOSCredentialID = ConnectedOSCredentialFinder.findCredential(Framework, shell, client, errorsList, warningsList) # If we got a default value, we just pass None later # Else - we need to signal the existing client which can be only UDA by now that it has a credential # to take sudo password from, if it needs it if (not connectedOSCredentialID or connectedOSCredentialID == ConnectedOSCredentialFinder.NO_CONNECTED_CRED_ID): connectedOSCredentialID = None else: try: client.setConnectedShellCredentialID(connectedOSCredentialID) except: logger.warn('Failed to setConnectedShellCredentialID, sudo commands may not work in this run') vector.addAll(doDiscovery(Framework, shell, client, ip, codepage, connectedOSCredentialID)) except (Exception, JException), jex: msg = str(jex) logger.debugException(msg) errormessages.resolveAndAddToObjectsCollections(msg, clientType, warningsList, errorsList) finally: if udaNotAlive and client: logger.debug('find another shell can be connected. ', shell) logger.debug('Removing the connected uda shell because it failed to connect') agentOsh = ObjectStateHolder(ClientsConsts.DDM_AGENT_PROTOCOL_NAME) agentOsh.setAttribute('application_ip', ip) agentOsh.setAttribute('data_name', ClientsConsts.DDM_AGENT_PROTOCOL_NAME) #agentOsh.setAttribute('application_port', shell.getPort()) agentOsh.setContainer(modeling.createHostOSH(ip)) Framework.deleteObject(agentOsh) Framework.flushObjects() Framework.clearGlobalState(ip) if shell: try: shell.closeClient() except: errobj = errorobject.createError(errorcodes.CLIENT_NOT_CLOSED_PROPERLY, None, "Client was not closed properly") warningsList.append(errobj) logger.warnException('') # close client anyway if client and client.close(): pass # create shell OSH if connection established but discovery failed if not vector.size(): logger.warn('Discovery failed, though shell object will be created') hostOsh = modeling.createHostOSH(ip, filter_client_ip=True) if hostOsh: languageName = None langBund = Framework.getEnvironmentInformation().getBundle('langNetwork', languageName) shellOsh = createShellObj(client, client, ip, langBund, languageName, codepage, connectedShellCredId=connectedOSCredentialID) shellOsh.setContainer(hostOsh) vector.add(shellOsh) else: logger.warn('Failed to create node and shell since IP is of a Client range type, not enough data for reconciliation.') for errobj in warningsList: logger.reportWarningObject(errobj) for errobj in errorsList: logger.reportErrorObject(errobj) return vector
def getCisByTypeFromOSHV(theOSHV, requestedCiType): try: if not requestedCiType: logger.warn('[' + SCRIPT_NAME + ':getCisByTypeFromOSHV] Received invalid CI Type name!') return None if not theOSHV and theOSHV.size() < 1: logger.warn('[' + SCRIPT_NAME + ':getCisByTypeFromOSHV] Received invalid OSHV!') return None debugPrint(5, '[' + SCRIPT_NAME + ':getCisByTypeFromOSHV] Got requested CI Type <%s> for OSHV with <%s> CIs' % (requestedCiType, theOSHV.size())) returnOSHV = ObjectStateHolderVector() for ciTypeIndex in range(theOSHV.size()): ciType = theOSHV.get(ciTypeIndex).getObjectClass() if ciType == requestedCiType.strip(): returnOSHV.add(theOSHV.get(ciTypeIndex)) debugPrint(4, '[' + SCRIPT_NAME + ':getCisByTypeFromOSHV] Got <%s> <%s> CIs from OSHV' % (returnOSHV.size(), requestedCiType)) return returnOSHV except: excInfo = logger.prepareJythonStackTrace('') logger.warn('[' + SCRIPT_NAME + ':getCisByTypeFromOSHV] Exception: <%s>' % excInfo) pass
def DiscoveryMain(Framework): OSHVResult = ObjectStateHolderVector() ipAddress = Framework.getDestinationAttribute('ip_address') credentialsId = Framework.getDestinationAttribute('credentialsId') ucmdbversion = modeling.CmdbClassModel().version() snmpCommunityPostfixList = '' try: snmpCommunityPostfixList = Framework.getTriggerCIDataAsList('snmpCommunityPostfix') if not snmpCommunityPostfixList: raise Exception, "No Vlans defined on switch" except: Framework.reportError('Failed to discover destination. No Vlans properly configured.') return OSHVResult hostId = Framework.getDestinationAttribute('hostId') hostOSH = modeling.createOshByCmdbIdString('host', hostId) vlan_context_dict = {} snmp_version = Framework.getProtocolProperty(credentialsId, "snmpprotocol_version") if snmp_version == 'version 3': client = Framework.createClient() vlan_context_dict = snmputils.get_snmp_vlan_context_dict(client) client and client.close() vlanOSH = None failedToDiscoverCounter = 0 for snmpCommunityPostfix in snmpCommunityPostfixList: vlanOSH = modeling.createVlanOsh(snmpCommunityPostfix, hostOSH) vlanOSH.setContainer(hostOSH) properties = Properties() if credentialsId and ipAddress: properties.setProperty('ip_address', ipAddress) properties.setProperty(BaseClient.CREDENTIALS_ID, credentialsId) if (snmpCommunityPostfix != None) and (snmpCommunityPostfix != ''): if snmp_version == 'version 3': if not vlan_context_dict: logger.warn("Vlan Conext is not present on the device. No Vlan details might be discovered") continue vlan_context = vlan_context_dict.get(snmpCommunityPostfix) if not vlan_context: logger.warn("Failed to find configured Vlan context for Vlan %s. Vlan will be skipped" % snmpCommunityPostfix) continue properties.setProperty(SnmpQueries._postfix, '%s' % vlan_context) else: properties.setProperty(SnmpQueries._postfix, '%s%s' % ('@', snmpCommunityPostfix)) snmpClient = None try: snmpClient = Framework.createClient(properties) #SnmpConnectionTester(snmpClient).testSnmpConnection() doAll(snmpClient, hostOSH, vlanOSH, OSHVResult, ucmdbversion) Framework.sendObjects(OSHVResult) Framework.flushObjects() logger.debug('Vlan %s successfully discovered. Result vector contains %d objects.' % (snmpCommunityPostfix, OSHVResult.size())) OSHVResult = ObjectStateHolderVector() except: logger.debugException('') failedToDiscoverCounter =+ 1 logger.debugException('Failed to discover ip: %s on Vlan#: %s. ' % (ipAddress, snmpCommunityPostfix)) if snmpClient != None: snmpClient.close() if failedToDiscoverCounter == len(snmpCommunityPostfixList): Framework.reportError('Failed to discover all Vlans on the destination.') elif failedToDiscoverCounter: Framework.reportWarning('Failed to discover one or more Vlans on the destination') if snmpClient != None: snmpClient.close() return OSHVResult
def DiscoveryMain(Framework): OSHVResult = ObjectStateHolderVector() client = None framework = StatisticsFramework(Framework) try: try: client = framework.createClient() except: # No need to report twice, exception msg is sufficient # errobj = errorobject.createError(errorcodes.CONNECTION_FAILED_NO_PROTOCOL, None, 'Connection failed') # logger.reportErrorObject(errobj) errMsg = 'Exception while creating %s client: %s' % ( ClientsConsts.SNMP_PROTOCOL_NAME, sys.exc_info()[1]) errormessages.resolveAndReport(str(sys.exc_info()[1]), ClientsConsts.SNMP_PROTOCOL_NAME, framework) logger.debugException(errMsg) else: config = (flow.DiscoveryConfigBuilder( framework).dest_data_required_params_as_str('ip_address'). dest_data_params_as_list('host_ips')).build() ipaddress = config.ip_address host_ips = filter(None, config.host_ips) ips = set(host_ips) ips.add(ipaddress) hostId = framework.getDestinationAttribute('hostId') hostOsh = modeling.createOshByCmdbIdString('host', hostId) discoverUsers = Boolean.parseBoolean( framework.getParameter('discoverUsers')) if discoverUsers: logger.debug('Starting to discover users') try: snmp_dis_user_lib.doQueryOSUsers(client, OSHVResult) except: errobj = errorobject.createError( errorcodes. FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE, ['users', 'snmp'], 'Failed to discover users by snmp') logger.reportWarningObject(errobj) logger.errorException('Failed to discover users by snmp') discoverDisks = Boolean.parseBoolean( framework.getParameter('discoverDisks')) if discoverDisks: logger.debug('Starting to discover disks') try: snmp_dis_disk_lib.doQueryDisks(client, OSHVResult) except: errobj = errorobject.createError( errorcodes. FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE, ['disks', 'snmp'], 'Failed to discover disks by snmp') logger.reportWarningObject(errobj) logger.errorException('Failed to discover disks by snmp') discoverProcesses = Boolean.parseBoolean( framework.getParameter('discoverProcesses')) processes = [] logger.debug('Starting to discover processes') try: processDiscoverer = process_discoverer.getDiscovererBySnmp( client) processes = processDiscoverer.discoverAllProcesses() if not processes: raise ValueError() except: errobj = errorobject.createError( errorcodes.FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE, ['processes', 'snmp'], 'Failed to discover processes by snmp') logger.reportWarningObject(errobj) logger.errorException('Failed to discover processes by snmp') if processes: # save processes to DB process_discoverer.saveProcessesToProbeDb( processes, hostId, framework) # report processes if discoverProcesses: processReporter = process.Reporter() for processObject in processes: processesVector = processReporter.reportProcess( hostOsh, processObject) OSHVResult.addAll(processesVector) discoverServices = Boolean.parseBoolean( framework.getParameter('discoverServices')) if discoverServices: logger.debug('Starting to discover services') try: snmp_dis_service_lib.doQuerySNMPService(client, OSHVResult) except: errobj = errorobject.createError( errorcodes. FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE, ['services', 'snmp'], 'Failed to discover services by snmp') logger.reportWarningObject(errobj) logger.errorException( 'Failed to discover services by snmp') discoverSoftware = Boolean.parseBoolean( framework.getParameter('discoverInstalledSoftware')) if discoverSoftware: logger.debug('Starting to discover software') try: snmp_dis_software_lib.doQuerySoftware(client, OSHVResult) except: errobj = errorobject.createError( errorcodes. FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE, ['software', 'snmp'], 'Failed to discover software by snmp') logger.reportWarningObject(errobj) logger.errorException( 'Failed to discover software by snmp') connectivityEndPoints = [] try: tcpDiscoverer = Dis_TCP.TCPDisBySNMP(client, framework, ips=tuple(ips)) if tcpDiscoverer is not None: tcpDiscoverer.discoverTCP() connectivityEndPoints = tcpDiscoverer.getProcessEndPoints() except: errorMessage = 'Failed to run tcp discovery by snmp' logger.debugException(errorMessage) errobj = errorobject.createError( errorcodes.FAILED_RUNNING_DISCOVERY_WITH_CLIENT_TYPE, ['tcp', 'snmp'], errorMessage) logger.reportWarningObject(errobj) if processes: appSign = applications.createApplicationSignature( framework, client) appSign.setProcessesManager( applications.ProcessesManager(processes, connectivityEndPoints)) appSign.getApplicationsTopology(hostId) discoverModules = Boolean.parseBoolean( framework.getParameter('discoverModules')) if discoverModules: logger.debug('Begin discover snmp modules...') try: from snmp_model_finder import SnmpStateHolder from snmp_model_finder import SnmpQueryHelper from snmp_model_finder import ModelTypeMatcher import snmp_model_discovery snmpStateHolder = SnmpStateHolder() cacheClient = None # from discovery.client.snmp import SnmpClientCacheProxy # cacheClient = SnmpClientCacheProxy(client, 'cache/'+ipaddress+'.cache') snmpQueryHelper = SnmpQueryHelper(client) mtm = ModelTypeMatcher(snmpStateHolder, snmpQueryHelper) logger.debug('The target is matched:', mtm.match()) logger.debug('The type of the target is:', snmpStateHolder.getTypes()) vector = snmp_model_discovery.discoverAll( hostOsh, snmpStateHolder, snmpQueryHelper) logger.debug('Discovered CI count:', vector.size()) OSHVResult.addAll(vector) if cacheClient: cacheClient.writeCache() except: errobj = errorobject.createError( errorcodes. FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE, ['modules', 'snmp'], 'Failed to discover modules by snmp') logger.reportWarningObject(errobj) logger.errorException('Failed to discover modules by snmp') logger.debug('End discover snmp modules') finally: if client != None: client.close() if OSHVResult.size() == 0 and framework.getSentObjectsCount() == 0: logger.reportWarning('SNMP: No data collected') return OSHVResult
# to prevent creating of deployed link between resource and Domain (container for the resource) # we have to track target type for datasource in datasources: if not namesOfReportedDatasources.get(datasource.getName()): try: targetToReport = (not isinstance(target, jee.Domain)) and target or None vector.addAll( datasourceTopologyReporter.reportDatasourcesWithDeployer(domain, targetToReport, datasource) ) except: logger.warnException("Failed to report %s" % datasource) else: namesOfReportedDatasources[datasource.getName()] = 1 try: websphere_discoverer.addResource(resourcesManager, target, datasource) except Exception: logger.warnException("Failed to add resource %s in scope of %s" % (datasource, target)) if vector.size(): vector.addAll( domainVector ) _sendVectorImmediately(Framework, vector) if jmsResourcesDiscoveryEnabled: discoverer = websphere_discoverer.JmsSourceDiscovererByJmx(provider) datasources = discoverer.discoverDatasources() role = server.getRole(websphere.ServerRole) name = 'WebSphere JMS Server on %s' % role.nodeName jmsServer = jms.Server(name, server.ip.value()) vector = jmsTopologyReporter.reportJmsServer(domain, server, jmsServer) vector.addAll( domainVector ) _sendVectorImmediately(Framework, vector) # application can be deployed on cluster or managed server that is not a cluster member
def DiscoveryMain(Framework): # General variables OSHVResult = ObjectStateHolderVector() protocolName = 'SQL' dbClient = None ## OSH dictionaries to prevent recreation of the same OSHs in different parts of the script # netDeviceOshDict = {} ipAddrList = [] portVlanIdMap = {} ## {'vlanName:;:vlanID':[portOSH]} ## Destination properties ipAddress = Framework.getDestinationAttribute('ip_address') dbPort = Framework.getDestinationAttribute('db_port') ## Job parameters rmeDbName = Framework.getParameter('rmeDbName') if not rmeDbName: excInfo = ( 'Discovery job parameter <rmeDbName> not populated correctly') Framework.reportError(excInfo) logger.error(excInfo) return None ignoreNodesWithoutIP = 1 if Framework.getParameter("ignoreNodesWithoutIP").strip().lower() not in [ 'true', 'yes', 'y', '1' ]: ignoreNodesWithoutIP = 0 allowDnsLookup = 0 if Framework.getParameter("allowDnsLookup").strip().lower() in [ 'true', 'yes', 'y', '1' ]: allowDnsLookup = 1 queryChunkSize = eval(Framework.getParameter("queryChunkSize")) if not (queryChunkSize and type(queryChunkSize) == type(1)): queryChunkSize = 250 try: dbClient = ciscoworks_utils.connectToDb(Framework, ipAddress, dbPort) if dbClient: logger.debug( '[' + SCRIPT_NAME + ':DiscoveryMain] Connected to CiscoWorks LMS Resource Manager Essentials database at port <%s>...' % dbPort) ## Check database state dbState = ciscoworks_utils.verifyDB(dbClient, rmeDbName) ciscoworks_utils.debugPrint( 4, '[' + SCRIPT_NAME + ':DiscoveryMain] Got DB state <%s>...' % dbState) ## Discover... if dbState and dbState == 1: OSHVResult.addAll( getNetworkDevices(dbClient, queryChunkSize, ipAddrList, portVlanIdMap, ignoreNodesWithoutIP, allowDnsLookup, Framework)) OSHVResult.addAll(processVlanPortMap(portVlanIdMap)) #OSHVResult.addAll(buildNodePortLinks(dbClient, netDeviceOshDict, portOshDict)) else: errorMessage = 'This is probably not a CiscoWorks LMS Resource Manager Essentials database' errormessages.resolveAndReport(errorMessage, protocolName, Framework) else: excInfo = ( 'Unable to connect to the CiscoWorks LMS Resource Manager Essentials database' ) Framework.reportError(excInfo) logger.error(excInfo) return None except: excInfo = logger.prepareJythonStackTrace('') logger.warn('[' + SCRIPT_NAME + ':DiscoveryMain] Exception: <%s>' % excInfo) errormessages.resolveAndReport(excInfo, protocolName, Framework) logger.debug('Closing JDBC connections...') if dbClient: dbClient.close() # Close JDBC stuff logger.debug('Closing JDBC connections...') if dbClient: dbClient.close() # Write OSHV to file - only useful for debugging #=========================================================================== # from java.io import FileWriter, BufferedWriter # fileName = 'c:/' + SCRIPT_NAME + '.OSHV.xml' # theFile = FileWriter(fileName) # fileBuffer = BufferedWriter(theFile) # fileBuffer.write(OSHVResult.toXmlString()) # fileBuffer.flush() # fileBuffer.close() # warningMessage = 'Discovery results not sent to server; Writing them to file <%s> on the Data Flow Probe system' % fileName # Framework.reportWarning(warningMessage) # logger.warn(warningMessage) #=========================================================================== ## Print CIT counts from OSHV ciTypeCounts = {} # {'CI Type':Count} for ciTypeIndex in range(OSHVResult.size()): ciType = OSHVResult.get(ciTypeIndex).getObjectClass() if ciType in ciTypeCounts.keys(): ciTypeCounts[ciType] = ciTypeCounts[ciType] + 1 else: ciTypeCounts[ciType] = 1 print ciTypeCounts return OSHVResult
def DiscoveryMain(Framework): SHELL_CLIENT_PROTOCOLS = _getSupportedShellProtocols(Framework) ip = Framework.getDestinationAttribute('ip_address') domain = Framework.getDestinationAttribute('ip_domain') codepage = Framework.getCodePage() useLastState = Framework.getParameter('useLastSuccessConnection') vector = ObjectStateHolderVector() warningsList = [] errorsList = [] # preparing empty dictionary for storing credentials later credentialsByType = {} # take the latest used credentials if any lastState = None if useLastState and useLastState.lower() == 'true': lastState = Framework.loadState() if lastState: credentialsByType[None] = [lastState] # try to get ip address by mac address from ARP Cache macAddress = Framework.getDestinationAttribute('ip_mac_address') foundIp = clientdiscoveryutils.getIPAddressOnlyFromMacAddress(macAddress) if foundIp: ip = foundIp # Gather credentials for protocols for clientType in SHELL_CLIENT_PROTOCOLS: # getting an ordered list of credentials for the given client type and storing them in the credentials dictionary protocols = netutils.getAvailableProtocols(Framework, clientType, ip, domain) if protocols: credentialsByType[clientType] = protocols ########################################################################################################## ##################################Start Special processing for Universal Discovery Agent################## # take Universal Discovery Agent credentials if new Universal Discovery Agent installed on that IP connectedDDMAgentCredentials = None if useLastState and useLastState.lower() == 'true': connectedDDMAgentCredentials = Framework.loadGlobalState(ip) client = None udaNotAlive = 0 if connectedDDMAgentCredentials: logger.debug('Found global state credentials ', connectedDDMAgentCredentials, ' of installed agent on ip:', ip) client = createClient(Framework, ClientsConsts.DDM_AGENT_PROTOCOL_NAME, [connectedDDMAgentCredentials], ip, codepage, warningsList, errorsList) # If we are successfully connected if client: logger.debug('Succeeded to connect with global state credentials ', client.getCredentialId(), ' of installed agent') Framework.saveState(client.getCredentialId()) else: logger.debug('Failed to connect with global state credentials ', connectedDDMAgentCredentials, ' on ip:', ip) udaNotAlive = 1 #AgentUtils.clearGlobalState(Framework) # only for case where no connection established before if not client: # checks whether there are credential for specified protocol if credentialsByType: if lastState: client = createClientFromLastState(Framework, lastState, warningsList, errorsList) if not client: logger.debug( 'Failed to create client using last state properties. Will try to connect using other credentials.' ) if not client: for clientType in SHELL_CLIENT_PROTOCOLS: credentials = credentialsByType.get(clientType) if credentials: client = createClient(Framework, clientType, credentials, ip, codepage, warningsList, errorsList) if client: warningsList = [] errorsList = [] # save credentials id for further reuse Framework.saveState(client.getCredentialId()) break else: for shellType in SHELL_CLIENT_PROTOCOLS: msg = errormessages.makeErrorMessage( shellType, pattern=errormessages.ERROR_NO_CREDENTIALS) errobj = errorobject.createError( errorcodes.NO_CREDENTIALS_FOR_TRIGGERED_IP, [shellType], msg) warningsList.append(errobj) if not client: Framework.clearState() else: # successfully connected, do discovery shell = None clientType = client.getClientType() connectedOSCredentialID = None try: try: shellFactory = shellutils.ShellFactory() shell = shellFactory.createShell(client, clientType) connectedOSCredentialID = ConnectedOSCredentialFinder.findCredential( Framework, shell, client, errorsList, warningsList) # If we got a default value, we just pass None later # Else - we need to signal the existing client which can be only UDA by now that it has a credential # to take sudo password from, if it needs it if (not connectedOSCredentialID or connectedOSCredentialID == ConnectedOSCredentialFinder.NO_CONNECTED_CRED_ID): connectedOSCredentialID = None else: try: client.setConnectedShellCredentialID( connectedOSCredentialID) except: logger.warn( 'Failed to setConnectedShellCredentialID, sudo commands may not work in this run' ) vector.addAll( doDiscovery(Framework, shell, client, ip, codepage, connectedOSCredentialID)) except (Exception, JException), jex: msg = str(jex) logger.debugException(msg) errormessages.resolveAndAddToObjectsCollections( msg, clientType, warningsList, errorsList) finally: if udaNotAlive and client: logger.debug('find another shell can be connected. ', shell) logger.debug( 'Removing the connected uda shell because it failed to connect' ) agentOsh = ObjectStateHolder( ClientsConsts.DDM_AGENT_PROTOCOL_NAME) agentOsh.setAttribute('application_ip', ip) agentOsh.setAttribute('data_name', ClientsConsts.DDM_AGENT_PROTOCOL_NAME) #agentOsh.setAttribute('application_port', shell.getPort()) agentOsh.setContainer(modeling.createHostOSH(ip)) Framework.deleteObject(agentOsh) Framework.flushObjects() Framework.clearGlobalState(ip) if shell: try: shell.closeClient() except: errobj = errorobject.createError( errorcodes.CLIENT_NOT_CLOSED_PROPERLY, None, "Client was not closed properly") warningsList.append(errobj) logger.warnException('') # close client anyway if client and client.close(): pass # create shell OSH if connection established but discovery failed if not vector.size(): logger.warn( 'Discovery failed, though shell object will be created') hostOsh = modeling.createHostOSH(ip, filter_client_ip=True) if hostOsh: languageName = None langBund = Framework.getEnvironmentInformation().getBundle( 'langNetwork', languageName) shellOsh = createShellObj( client, client, ip, langBund, languageName, codepage, connectedShellCredId=connectedOSCredentialID) shellOsh.setContainer(hostOsh) vector.add(shellOsh) else: logger.warn( 'Failed to create node and shell since IP is of a Client range type, not enough data for reconciliation.' ) for errobj in warningsList: logger.reportWarningObject(errobj) for errobj in errorsList: logger.reportErrorObject(errobj) return vector
def DiscoveryMain(Framework): # General variables OSHVResult = ObjectStateHolderVector() protocolName = 'SQL' dbClient = None ## Destination properties ipAddress = Framework.getDestinationAttribute('ip_address') dbPort = Framework.getDestinationAttribute('db_port') ## Job parameters campusDbName = Framework.getParameter('campusDbName') if not campusDbName: excInfo = ('Discovery job parameter <campusDbName> not populated correctly') Framework.reportError(excInfo) logger.error(excInfo) return None allowDnsLookup = 0 if Framework.getParameter("allowDnsLookup").strip().lower() in ['true', 'yes', 'y', '1']: allowDnsLookup = 1 queryChunkSize = eval(Framework.getParameter("queryChunkSize")) if not (queryChunkSize and type(queryChunkSize) == type(1)): queryChunkSize = 1000 try: (netDeviceOSHV, portOSHV) = getNetDeviceAndPortOSHVs(Framework) dbClient = ciscoworks_utils.connectToDb(Framework, ipAddress, dbPort) if dbClient: logger.debug('Connected to CiscoWorks LMS Campus database at port <%s>...' % dbPort) ## Check database state dbState = ciscoworks_utils.verifyDB(dbClient, campusDbName) ciscoworks_utils.debugPrint(4, '[' + SCRIPT_NAME + ':DiscoveryMain] Got DB state <%s>...' % dbState) ## Discover... if dbState and dbState == 1: OSHVResult.addAll(getNodes(dbClient, netDeviceOSHV, portOSHV, allowDnsLookup, queryChunkSize, Framework)) else: errorMessage = 'This is probably not a CiscoWorks LMS Campus database' errormessages.resolveAndReport(errorMessage, protocolName, Framework) else: excInfo = ('Unable to connect to the CiscoWorks LMS Campus database') Framework.reportError(excInfo) logger.error(excInfo) return None except: excInfo = logger.prepareJythonStackTrace('') logger.warn('[' + SCRIPT_NAME + ':DiscoveryMain] Exception: <%s>' % excInfo) errormessages.resolveAndReport(excInfo, protocolName, Framework) logger.debug('Closing JDBC connections...') if dbClient: dbClient.close() # Close JDBC stuff logger.debug('Closing JDBC connections...') if dbClient: dbClient.close() ## Write OSHV to file - only useful for debugging #=========================================================================== # from java.io import FileWriter, BufferedWriter # fileName = 'c:/' + SCRIPT_NAME + '.OSHV.xml' # theFile = FileWriter(fileName) # fileBuffer = BufferedWriter(theFile) # fileBuffer.write(OSHVResult.toXmlString()) # fileBuffer.flush() # fileBuffer.close() # warningMessage = 'Discovery results not sent to server; Writing them to file <%s> on the Data Flow Probe system' % fileName # Framework.reportWarning(warningMessage) # logger.warn(warningMessage) #=========================================================================== ## Print CIT counts from OSHV ciTypeCounts = {} # {'CI Type':Count} for ciTypeIndex in range(OSHVResult.size()): ciType = OSHVResult.get(ciTypeIndex).getObjectClass() if ciType in ciTypeCounts.keys(): ciTypeCounts[ciType] = ciTypeCounts[ciType] + 1 else: ciTypeCounts[ciType] = 1 print ciTypeCounts return OSHVResult
def DiscoveryMain(Framework): OSHVResult = ObjectStateHolderVector() ips = Framework.getTriggerCIDataAsList('ip_address') ip_ids = Framework.getTriggerCIDataAsList('ip_id') host_id = Framework.getTriggerCIData('host_id') host_name = Framework.getTriggerCIData('host_name') hostOSH = modeling.createOshByCmdbIdString('node', host_id) dnsServers = Framework.getParameter('dnsServers') or None localShell = None if dnsServers: dnsServers = [dnsServer for dnsServer in dnsServers.split(',') if dnsServer and dnsServer.strip()] or None if dnsServers: localShell = shellutils.ShellUtils(Framework.createClient(ClientsConsts.LOCAL_SHELL_PROTOCOL_NAME)) smallIp = '255.255.255.255' smallIpDns = None smallPublicIpDns = None primary_dns_name_candidates = [] index=0 for ip in ips: ip_id = ip_ids[index] index = index+1 if dnsServers: dnsName = resolveHostNameByDnsList(ip,localShell,dnsServers) else: dnsName = netutils.getHostName(ip, None) logger.debug('dns, %s:%s'%(ip,dnsName)) if dnsName == None: continue else: # Set ip DNS by dnsName ipOSH = modeling.createOshByCmdbIdString('ip_address', ip_id) ipOSH.setAttribute('name', ip) ipOSH.setAttribute('authoritative_dns_name', dnsName) containmentLink = modeling.createLinkOSH('containment',hostOSH,ipOSH) OSHVResult.add(containmentLink) OSHVResult.add(ipOSH) if host_name and dnsName.split('.')[0] == host_name: #share same short name primary_dns_name_candidates.append(dnsName) if netutils.convertIpToInt(ip) < netutils.convertIpToInt(smallIp): smallIp = ip smallIpDns = dnsName if not netutils.isPrivateIp(ip): smallPublicIpDns = dnsName logger.debug("Primary candidates:", primary_dns_name_candidates) if smallPublicIpDns: logger.debug("Set public dns", smallPublicIpDns) smallIpDns = smallPublicIpDns if smallIpDns and (not primary_dns_name_candidates or smallIpDns in primary_dns_name_candidates): # Set host DNS smallIpDns logger.debug("Set host DNS smallIpDns:", smallIpDns) hostOSH.setAttribute('primary_dns_name', smallIpDns) OSHVResult.add(hostOSH) else: if primary_dns_name_candidates: #if there are multiple candidates, we can only choose one without any prefer logger.debug("Set first primary dns:", primary_dns_name_candidates[0]) hostOSH.setAttribute('primary_dns_name', primary_dns_name_candidates[0]) OSHVResult.add(hostOSH) if not OSHVResult.size(): logger.reportError("Cannot resolve host from DNS") if localShell is not None: try: localShell.close() localShell = None except: pass return OSHVResult
def discover_vlans(self): bridge_mac_address = self.get_bridge_mac_address() vlan_table_res = self.snmp_client.executeQuery(self.VLAN_TABLE_MIB)#@@CMD_PERMISION snmp protocol execution vlan_table = vlan_table_res.asTable() if len(vlan_table) == 0: raise NoVlansException, "No VLANs Configured on the device." vlan_ports_map = self.get_ports() for i in range(len(vlan_table)): oshv_result = ObjectStateHolderVector() vlan_oid = vlan_table[i][0] vlan_name = vlan_table[i][1] vlan_number = vlan_oid[vlan_oid.find('.')+1:] port_list = vlan_ports_map.get(vlan_number) bridge_osh = None if not port_list: logger.warn('Skipping VLAN %s since it has no ports assigned.' % vlan_number) continue vlan_osh = ObjectStateHolder('vlan') vlan_osh.setContainer(self.host_osh) modeling.setVlanIdAttribute(vlan_osh, vlan_number) vlan_osh.setAttribute('data_name', vlan_name) if bridge_mac_address: vlan_osh.setAttribute('vlan_bridgemac', bridge_mac_address) bridge_osh = ObjectStateHolder('bridge') bridge_osh.setContainer(self.host_osh) bridge_osh.setAttribute('bridge_basemacaddr', bridge_mac_address) oshv_result.add(bridge_osh) depend_link = modeling.createLinkOSH('depend',vlan_osh,bridge_osh) oshv_result.add(depend_link) oshv_result.add(vlan_osh) for port in port_list: port_osh = ObjectStateHolder('port') port_osh.setContainer(self.host_osh) modeling.setPhysicalPortNumber(port_osh, port) oshv_result.add(port_osh) member_link = modeling.createLinkOSH('membership', vlan_osh, port_osh) oshv_result.add(member_link) if bridge_osh: contains_link = modeling.createLinkOSH('contains', bridge_osh, port_osh) oshv_result.add(contains_link) self.framework.sendObjects(oshv_result) self.framework.flushObjects() logger.debug('Vlan %s successfully discovered. Result vector contains %d objects.' % (vlan_name, oshv_result.size())) if self.snmp_client: self.snmp_client.close()
def processWorkbook(self): """ Entry point to the importer -> OSHVResult """ numSheets = self.workbook.getNumberOfSheets() #get all sheets allSheets = [self.workbook.getSheetAt(i) for i in xrange(numSheets)] #get sheet processors to all non-comment sheets allSheetProcessors = [ SheetProcessor(sheet) for sheet in allSheets if not sheet.getSheetName().startswith(self.__COMMENT_START) ] #list of OSH sheets oshSheetProcessors = [ proc for proc in allSheetProcessors if not proc.getSheetName().startswith(self.__RELATIONSHIPS_START) ] #list of relationships sheets realtionSheetProcessors = [ proc for proc in allSheetProcessors if proc.getSheetName().startswith(self.__RELATIONSHIPS_START) ] logger.info( '\t------------------------------------------------------------------' ) logger.info( '\tProcess all tabs and create OSH from them; Root containers and links will be created lately' ) logger.info( '\t------------------------------------------------------------------' ) for processor in oshSheetProcessors: worksheetName = processor.getSheetName() logger.debug('Processing worksheet: %s' % worksheetName) try: colNames = processor.getSheetColumnNames() attrDefs = self.classModelUtils.getTypeDefs(worksheetName) xlsutils.validateSheet(colNames, attrDefs, worksheetName) self.fillOshDict(processor, attrDefs) except: logger.debugException('') logger.reportWarning( 'Skipping worksheet "%s" due to errors found' % (worksheetName)) logger.info( '\t------------------------------------------------------------------' ) logger.info('\tProcess root containers from early created OSHes') logger.info( '\t------------------------------------------------------------------' ) for processor in oshSheetProcessors: worksheetName = processor.getSheetName() logger.debug('Processing references of worksheet: %s' % worksheetName) self.processReferences(processor) logger.info( '\t------------------------------------------------------------------' ) logger.info('\tReport OSH to vector') logger.info( '\t------------------------------------------------------------------' ) OSHVResult = ObjectStateHolderVector() for key, osh in self.keysToOsh.items(): if self.classModelUtils.isValidOsh(osh): OSHVResult.add(osh) else: logger.warn('OSH at %s does not have all key attributes' % key) logger.reportWarning( "Imported file doesn't contain mapping for key attribute") logger.debug('reported %i objects' % OSHVResult.size()) logger.info( '\t------------------------------------------------------------------' ) logger.info('\tProcess relationships') logger.info( '\t------------------------------------------------------------------' ) for processor in realtionSheetProcessors: linksVec = self.processRelationshipTab(processor) OSHVResult.addAll(linksVec) if not len(realtionSheetProcessors): logger.info('\tNo relationships tab was found for processing') return OSHVResult
def DiscoveryMain(Framework): OSHVResult = ObjectStateHolderVector() endpoint = Framework.getDestinationAttribute('endpoint') ip = Framework.getDestinationAttribute('ip') protocols = Framework.getAvailableProtocols(ip, "http") if len(protocols) == 0: msg = 'Protocol not defined or IP out of protocol network range' logger.reportWarning(msg) logger.error(msg) return OSHVResult novaApi = None cinderApi = None glanceApi = None neutronApi = None zoneOshDict = {} serverOshDict = {} networkOshDict = {} for protocol in protocols: try: username = Framework.getProtocolProperty(protocol, CollectorsConstants.PROTOCOL_ATTRIBUTE_USERNAME) credential = Framework.getProtocolProperty(protocol, CollectorsConstants.PROTOCOL_ATTRIBUTE_PASSWORD) keystoneApi = buildApi('openstack-keystone', endpoint, username, credential, KeystoneApi) logger.debug('keystoneApi:', keystoneApi) tenant_discover = openstack_discoverer.TenantDiscoverer(keystoneApi) tenants = tenant_discover.discover() if tenants: openstack_software = openstack.OpenStack(ip) openstack_osh, openstack_vector = openstack_software.report() OSHVResult.addAll(openstack_vector) else: continue for tenant in tenants: try: logger.debug("connecting to tenant:", tenant.name) tenant_osh = tenant.report() OSHVResult.add(tenant_osh) OSHVResult.add(modeling.createLinkOSH("composition", openstack_osh, tenant_osh)) identity = tenant.name + ":" + username novaApi = buildApi('openstack-nova', endpoint, identity, credential, NovaApi) cinderApi = buildApi('openstack-cinder', endpoint, identity, credential, CinderApi) glanceApi = buildApi('openstack-glance', endpoint, identity, credential, GlanceApi) neutronApi = buildApi('openstack-neutron', endpoint, identity, credential, NeutronApi) regions = novaApi.getConfiguredRegions() if regions: tenant_osh.setStringAttribute('credentials_id', protocol) for tmp_region in regions: logger.debug("region:", tmp_region) region = openstack.Region(tmp_region) region_osh = region.report(tenant_osh) OSHVResult.add(region_osh) OSHVResult.addAll(getZones(novaApi, region.name, region_osh, zoneOshDict)) logger.debug("zoneOshDict:", zoneOshDict) OSHVResult.addAll(getImages(glanceApi, region.name, region_osh)) OSHVResult.addAll(getHypervisors(novaApi, region.name, region_osh)) OSHVResult.addAll(getVms(novaApi, region.name, region_osh, serverOshDict)) OSHVResult.addAll(getVolumes(cinderApi, region.name, region_osh, zoneOshDict, serverOshDict)) logger.debug("serverOshDict:", serverOshDict) OSHVResult.addAll(getNetworks(neutronApi, region.name, region_osh, networkOshDict, openstack_osh)) logger.debug("networkOshDict:", networkOshDict) OSHVResult.addAll(getPorts(neutronApi, region.name, serverOshDict, networkOshDict)) OSHVResult.addAll(getSubnets(neutronApi, region.name, networkOshDict, openstack_osh)) OSHVResult.addAll(getFlavors(novaApi, region.name, region_osh)) except: strException = str(sys.exc_info()[1]) excInfo = logger.prepareJythonStackTrace('') logger.debug(strException) logger.debug(excInfo) pass except: strException = str(sys.exc_info()[1]) excInfo = logger.prepareJythonStackTrace('') logger.debug(strException) logger.debug(excInfo) pass finally: if novaApi: Closeables.close(novaApi, True) if cinderApi: Closeables.close(cinderApi, True) if glanceApi: Closeables.close(glanceApi, True) if neutronApi: Closeables.close(neutronApi, True) reportError = OSHVResult.size() == 0 if reportError: msg = 'Failed to connect using all protocols' logger.reportError(msg) logger.error(msg) return OSHVResult
def DiscoveryMain(Framework): OSHVResult = ObjectStateHolderVector() ips = Framework.getTriggerCIDataAsList('ip_address') ip_ids = Framework.getTriggerCIDataAsList('ip_id') host_id = Framework.getTriggerCIData('host_id') host_name = Framework.getTriggerCIData('host_name') hostOSH = modeling.createOshByCmdbIdString('node', host_id) dnsServers = Framework.getParameter('dnsServers') or None localShell = None if dnsServers: dnsServers = [ dnsServer for dnsServer in dnsServers.split(',') if dnsServer and dnsServer.strip() ] or None if dnsServers: localShell = shellutils.ShellUtils( Framework.createClient(ClientsConsts.LOCAL_SHELL_PROTOCOL_NAME)) smallIp = '255.255.255.255' smallIpDns = None smallPublicIpDns = None primary_dns_name_candidates = [] index = 0 for ip in ips: ip_id = ip_ids[index] index = index + 1 if dnsServers: dnsName = resolveHostNameByDnsList(ip, localShell, dnsServers) else: dnsName = netutils.getHostName(ip, None) logger.debug('dns, %s:%s' % (ip, dnsName)) if dnsName == None: continue else: # Set ip DNS by dnsName ipOSH = modeling.createOshByCmdbIdString('ip_address', ip_id) ipOSH.setAttribute('name', ip) ipOSH.setAttribute('authoritative_dns_name', dnsName) containmentLink = modeling.createLinkOSH('containment', hostOSH, ipOSH) OSHVResult.add(containmentLink) OSHVResult.add(ipOSH) if host_name and dnsName.split( '.')[0] == host_name: #share same short name primary_dns_name_candidates.append(dnsName) if netutils.convertIpToInt(ip) < netutils.convertIpToInt(smallIp): smallIp = ip smallIpDns = dnsName if not netutils.isPrivateIp(ip): smallPublicIpDns = dnsName logger.debug("Primary candidates:", primary_dns_name_candidates) if smallPublicIpDns: logger.debug("Set public dns", smallPublicIpDns) smallIpDns = smallPublicIpDns if smallIpDns and (not primary_dns_name_candidates or smallIpDns in primary_dns_name_candidates): # Set host DNS smallIpDns logger.debug("Set host DNS smallIpDns:", smallIpDns) hostOSH.setAttribute('primary_dns_name', smallIpDns) OSHVResult.add(hostOSH) else: if primary_dns_name_candidates: #if there are multiple candidates, we can only choose one without any prefer logger.debug("Set first primary dns:", primary_dns_name_candidates[0]) hostOSH.setAttribute('primary_dns_name', primary_dns_name_candidates[0]) OSHVResult.add(hostOSH) if not OSHVResult.size(): logger.reportError("Cannot resolve host from DNS") if localShell is not None: try: localShell.close() localShell = None except: pass return OSHVResult
def report(self, devicesById, connectivitiesByDeviceId): ''' dict(int, Device), list(Connectivity) -> None Main reporting method ''' connectivityTokens = set( ) # track reported connections regardless of direction bulkSentDeviceIds = set() # track reported Devices vector = ObjectStateHolderVector() for deviceId, device in devicesById.iteritems(): if vector.size() > self.bulkThreshold: self.sendVector(vector) vector = ObjectStateHolderVector() bulkSentDeviceIds = set() if device and not deviceId in bulkSentDeviceIds: self.reportDeviceTopology(device, vector) bulkSentDeviceIds.add(deviceId) connectivities = connectivitiesByDeviceId and connectivitiesByDeviceId.get( deviceId) or [] for connectivity in connectivities: connectivityToken = _getConnectivityToken(connectivity) if connectivityToken and not connectivityToken in connectivityTokens: remoteDevice = devicesById.get(connectivity.remoteDeviceId) if remoteDevice: if not remoteDevice.deviceId in bulkSentDeviceIds: self.reportDeviceTopology(remoteDevice, vector) bulkSentDeviceIds.add(remoteDevice.deviceId) port = device.portsById.get(connectivity.portId) remotePort = remoteDevice.portsById.get( connectivity.remotePortId) if port and remotePort: try: self.reportConnectivity( port, remotePort, vector) except ValueError: logger.debugException( 'Failed to report connectivity') connectivityTokens.add(connectivityToken) #include remote ports in VLANs with matching IDs on the same connection matchingVlans = self.findMatchingVlans( port, remotePort) for vlan in matchingVlans: remoteTargetPorts = self._getTargetVlanPorts( remotePort) for remoteTargetPort in remoteTargetPorts: self.reportMembershipVlanToPort( vlan, remoteTargetPort, vector) if vector.size() > 0: self.sendVector(vector)
def mainFunction(Framework, isClient, ip_address = None): _vector = ObjectStateHolderVector() errStr = '' ip_domain = Framework.getDestinationAttribute('ip_domain') host_cmdbid = Framework.getDestinationAttribute('host_cmdbid') host_key = Framework.getDestinationAttribute('host_key') host_macs = Framework.getTriggerCIDataAsList('mac_addrs') ip_arp_mac = Framework.getDestinationAttribute('ip_mac') # try to get ip address by mac address from ARP Cache foundIp = clientdiscoveryutils.getIPAddressOnlyFromMacAddress(ip_arp_mac) if foundIp: ip_address = foundIp if (ip_address == None): ip_address = Framework.getDestinationAttribute('ip_address') if (ip_domain == None): ip_domain = DomainScopeManager.getDomainByIp(ip_address, None) protocols = netutils.getAvailableProtocols(Framework, ClientsConsts.SNMP_PROTOCOL_NAME, ip_address, ip_domain) if len(protocols) == 0: errStr = 'No credentials defined for the triggered ip' logger.debug(errStr) errObj = errorobject.createError(errorcodes.NO_CREDENTIALS_FOR_TRIGGERED_IP, [ClientsConsts.SNMP_PROTOCOL_NAME], errStr) return (_vector, errObj) connected = 0 for protocol in protocols: client = None try: try: logger.debug('try to get snmp agent for: %s:%s' % (ip_address, ip_domain)) if (isClient == TRUE): properties = Properties() properties.setProperty(CollectorsConstants.DESTINATION_DATA_IP_ADDRESS, ip_address) properties.setProperty(CollectorsConstants.DESTINATION_DATA_IP_DOMAIN, ip_domain) client = Framework.createClient(protocol, properties) else: properties = Properties() properties.setProperty(CollectorsConstants.DESTINATION_DATA_IP_ADDRESS, ip_address) client = Framework.createClient(protocol, properties) logger.debug('Running test connection queries') testConnection(client) Framework.saveState(protocol) logger.debug('got snmp agent for: %s:%s' % (ip_address, ip_domain)) isMultiOid = client.supportMultiOid() logger.debug('snmp server isMultiOid state=%s' %isMultiOid) # create snmp OSH snmpOSH = modeling.createSnmpOSH(ip_address, client.getPort()) snmpOSH.setAttribute('application_timeout', client.getTimeout()) snmpOSH.setAttribute('snmp_port', client.getPort()) snmpOSH.setAttribute('credentials_id', client.getCredentialId()) snmpOSH.setAttribute('snmp_retry', client.getRetries()) snmpOSH.setAttribute('snmp_timeout', client.getTimeout()) #obtain SNMP protocol version snmpVersion = definedSnmpProtocolVersion(protocol, Framework) snmpOSH.setAttribute('application_version_number', snmpVersion) if ip_arp_mac and ip_arp_mac != 'NA': snmpOSH.setAttribute('arp_mac', ip_arp_mac) if isMultiOid == 1: snmpOSH.setBoolAttribute('snmp_supportmultioid', 1) else: snmpOSH.setBoolAttribute('snmp_supportmultioid', 0) _vector = doSnmp(client, isClient, snmpOSH, ip_address, ip_domain, Framework, host_cmdbid, host_key, host_macs) client.close() client = None if _vector.size() > 0: connected = 1 break except BroadcastIpDiscoveryException: msg = "Job has been triggered on broadcast IP, no results will be reported" errObj = errorobject.createError(errorcodes.NO_RESULTS_WILL_BE_REPORTED, ["Job has been triggered on broadcast IP"], msg) if client != None: client.close() client = None return (_vector, errObj) except: if client != None: client.close() client = None logger.debugException('Unexpected SNMP_AGENT Exception:') lastExceptionStr = str(sys.exc_info()[1]).strip() finally: if client != None: client.close() client = None error = errorobject.INTERNAL_ERROR if (not connected): errStr = errormessages.makeErrorMessage('SNMP', pattern=errormessages.ERROR_CONNECTION_FAILED) error = errorobject.createError(errorcodes.CONNECTION_FAILED, ['SNMP'], errStr) logger.debug(errStr) Framework.clearState() elif (_vector.size() == 0): error = errormessages.resolveError(lastExceptionStr, 'SNMP') return (_vector, error)
vector.addAll( datasourceTopologyReporter.reportDatasourcesWithDeployer( domain, targetToReport, datasource ) ) except: logger.warnException("Failed to report %s" % datasource) else: namesOfReportedDatasources[datasource.getName()] = 1 try: websphere_discoverer.addResource(resourcesManager, target, datasource) except Exception: logger.warnException( "Failed to add resource %s in scope of %s" % (datasource, target) ) if vector.size(): vector.addAll(domainVector) _sendVectorImmediately(Framework, vector) if jmsResourcesDiscoveryEnabled: discoverer = websphere_discoverer.JmsSourceDiscovererByJmx(provider) datasources = discoverer.discoverDatasources() role = server.getRole(websphere.ServerRole) name = "WebSphere JMS Server on %s" % role.nodeName jmsServer = jms.Server(name, server.ip.value()) vector = jmsTopologyReporter.reportJmsServer(domain, server, jmsServer) vector.addAll(domainVector) _sendVectorImmediately(Framework, vector) # application can be deployed on cluster or managed server that is not a cluster member
def DiscoveryMain(Framework): # General variables OSHVResult = ObjectStateHolderVector() protocolName = 'SQL' dbClient = None ## OSH dictionaries to prevent recreation of the same OSHs in different parts of the script # netDeviceOshDict = {} ipAddrList = [] portVlanIdMap = {} ## {'vlanName:;:vlanID':[portOSH]} ## Destination properties ipAddress = Framework.getDestinationAttribute('ip_address') dbPort = Framework.getDestinationAttribute('db_port') ## Job parameters rmeDbName = Framework.getParameter('rmeDbName') if not rmeDbName: excInfo = ('Discovery job parameter <rmeDbName> not populated correctly') Framework.reportError(excInfo) logger.error(excInfo) return None ignoreNodesWithoutIP = 1 if Framework.getParameter("ignoreNodesWithoutIP").strip().lower() not in ['true', 'yes', 'y', '1']: ignoreNodesWithoutIP = 0 allowDnsLookup = 0 if Framework.getParameter("allowDnsLookup").strip().lower() in ['true', 'yes', 'y', '1']: allowDnsLookup = 1 queryChunkSize = eval(Framework.getParameter("queryChunkSize")) if not (queryChunkSize and type(queryChunkSize) == type(1)): queryChunkSize = 250 try: dbClient = ciscoworks_utils.connectToDb(Framework, ipAddress, dbPort) if dbClient: logger.debug('[' + SCRIPT_NAME + ':DiscoveryMain] Connected to CiscoWorks LMS Resource Manager Essentials database at port <%s>...' % dbPort) ## Check database state dbState = ciscoworks_utils.verifyDB(dbClient, rmeDbName) ciscoworks_utils.debugPrint(4, '[' + SCRIPT_NAME + ':DiscoveryMain] Got DB state <%s>...' % dbState) ## Discover... if dbState and dbState == 1: OSHVResult.addAll(getNetworkDevices(dbClient, queryChunkSize, ipAddrList, portVlanIdMap, ignoreNodesWithoutIP, allowDnsLookup, Framework)) OSHVResult.addAll(processVlanPortMap(portVlanIdMap)) #OSHVResult.addAll(buildNodePortLinks(dbClient, netDeviceOshDict, portOshDict)) else: errorMessage = 'This is probably not a CiscoWorks LMS Resource Manager Essentials database' errormessages.resolveAndReport(errorMessage, protocolName, Framework) else: excInfo = ('Unable to connect to the CiscoWorks LMS Resource Manager Essentials database') Framework.reportError(excInfo) logger.error(excInfo) return None except: excInfo = logger.prepareJythonStackTrace('') logger.warn('[' + SCRIPT_NAME + ':DiscoveryMain] Exception: <%s>' % excInfo) errormessages.resolveAndReport(excInfo, protocolName, Framework) logger.debug('Closing JDBC connections...') if dbClient: dbClient.close() # Close JDBC stuff logger.debug('Closing JDBC connections...') if dbClient: dbClient.close() # Write OSHV to file - only useful for debugging #=========================================================================== # from java.io import FileWriter, BufferedWriter # fileName = 'c:/' + SCRIPT_NAME + '.OSHV.xml' # theFile = FileWriter(fileName) # fileBuffer = BufferedWriter(theFile) # fileBuffer.write(OSHVResult.toXmlString()) # fileBuffer.flush() # fileBuffer.close() # warningMessage = 'Discovery results not sent to server; Writing them to file <%s> on the Data Flow Probe system' % fileName # Framework.reportWarning(warningMessage) # logger.warn(warningMessage) #=========================================================================== ## Print CIT counts from OSHV ciTypeCounts = {} # {'CI Type':Count} for ciTypeIndex in range(OSHVResult.size()): ciType = OSHVResult.get(ciTypeIndex).getObjectClass() if ciType in ciTypeCounts.keys(): ciTypeCounts[ciType] = ciTypeCounts[ciType] + 1 else: ciTypeCounts[ciType] = 1 print ciTypeCounts return OSHVResult
def DiscoveryMain(Framework): OSHVResult = ObjectStateHolderVector() client = None framework = StatisticsFramework(Framework) try: try: client = framework.createClient() except: # No need to report twice, exception msg is sufficient # errobj = errorobject.createError(errorcodes.CONNECTION_FAILED_NO_PROTOCOL, None, 'Connection failed') # logger.reportErrorObject(errobj) errMsg ='Exception while creating %s client: %s' % (ClientsConsts.SNMP_PROTOCOL_NAME, sys.exc_info()[1]) errormessages.resolveAndReport(str(sys.exc_info()[1]), ClientsConsts.SNMP_PROTOCOL_NAME, framework) logger.debugException(errMsg) else: config = (flow.DiscoveryConfigBuilder(framework) .dest_data_required_params_as_str('ip_address') .dest_data_params_as_list('host_ips') ).build() ipaddress = config.ip_address host_ips = filter(None, config.host_ips) ips = set(host_ips) ips.add(ipaddress) hostId = framework.getDestinationAttribute('hostId') hostOsh = modeling.createOshByCmdbIdString('host', hostId) discoverUsers = Boolean.parseBoolean(framework.getParameter('discoverUsers')) if discoverUsers: logger.debug('Starting to discover users') try: snmp_dis_user_lib.doQueryOSUsers(client, OSHVResult) except: errobj = errorobject.createError(errorcodes.FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE, ['users', 'snmp'], 'Failed to discover users by snmp') logger.reportWarningObject(errobj) logger.errorException('Failed to discover users by snmp') discoverDisks = Boolean.parseBoolean(framework.getParameter('discoverDisks')) if discoverDisks: logger.debug('Starting to discover disks') try: snmp_dis_disk_lib.doQueryDisks(client, OSHVResult) except: errobj = errorobject.createError(errorcodes.FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE, ['disks', 'snmp'], 'Failed to discover disks by snmp') logger.reportWarningObject(errobj) logger.errorException('Failed to discover disks by snmp') discoverProcesses = Boolean.parseBoolean(framework.getParameter('discoverProcesses')) processes = [] logger.debug('Starting to discover processes') try: processDiscoverer = process_discoverer.getDiscovererBySnmp(client) processes = processDiscoverer.discoverAllProcesses() if not processes: raise ValueError() except: errobj = errorobject.createError(errorcodes.FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE, ['processes', 'snmp'], 'Failed to discover processes by snmp') logger.reportWarningObject(errobj) logger.errorException('Failed to discover processes by snmp') if processes: # save processes to DB process_discoverer.saveProcessesToProbeDb(processes, hostId, framework) # report processes if discoverProcesses: processReporter = process.Reporter() for processObject in processes: processesVector = processReporter.reportProcess(hostOsh, processObject) OSHVResult.addAll(processesVector) discoverServices = Boolean.parseBoolean(framework.getParameter('discoverServices')) if discoverServices: logger.debug('Starting to discover services') try: snmp_dis_service_lib.doQuerySNMPService(client, OSHVResult) except: errobj = errorobject.createError(errorcodes.FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE, ['services', 'snmp'], 'Failed to discover services by snmp') logger.reportWarningObject(errobj) logger.errorException('Failed to discover services by snmp') discoverSoftware = Boolean.parseBoolean(framework.getParameter('discoverInstalledSoftware')) if discoverSoftware: logger.debug('Starting to discover software') try: snmp_dis_software_lib.doQuerySoftware(client, OSHVResult) except: errobj = errorobject.createError(errorcodes.FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE, ['software', 'snmp'], 'Failed to discover software by snmp') logger.reportWarningObject(errobj) logger.errorException('Failed to discover software by snmp') connectivityEndPoints = [] try: tcpDiscoverer = Dis_TCP.TCPDisBySNMP(client, framework, ips=tuple(ips)) if tcpDiscoverer is not None: tcpDiscoverer.discoverTCP() connectivityEndPoints = tcpDiscoverer.getProcessEndPoints() except: errorMessage = 'Failed to run tcp discovery by snmp' logger.debugException(errorMessage) errobj = errorobject.createError(errorcodes.FAILED_RUNNING_DISCOVERY_WITH_CLIENT_TYPE, ['tcp', 'snmp'], errorMessage) logger.reportWarningObject(errobj) if processes: appSign = applications.createApplicationSignature(framework, client) appSign.setProcessesManager(applications.ProcessesManager(processes, connectivityEndPoints)) appSign.getApplicationsTopology(hostId) discoverModules = Boolean.parseBoolean(framework.getParameter('discoverModules')) if discoverModules: logger.debug('Begin discover snmp modules...') try: from snmp_model_finder import SnmpStateHolder from snmp_model_finder import SnmpQueryHelper from snmp_model_finder import ModelTypeMatcher import snmp_model_discovery snmpStateHolder = SnmpStateHolder() cacheClient = None # from discovery.client.snmp import SnmpClientCacheProxy # cacheClient = SnmpClientCacheProxy(client, 'cache/'+ipaddress+'.cache') snmpQueryHelper = SnmpQueryHelper(client) mtm = ModelTypeMatcher(snmpStateHolder, snmpQueryHelper) logger.debug('The target is matched:', mtm.match()) logger.debug('The type of the target is:', snmpStateHolder.getTypes()) vector = snmp_model_discovery.discoverAll(hostOsh, snmpStateHolder, snmpQueryHelper) logger.debug('Discovered CI count:', vector.size()) OSHVResult.addAll(vector) if cacheClient: cacheClient.writeCache() except: errobj = errorobject.createError(errorcodes.FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE, ['modules', 'snmp'], 'Failed to discover modules by snmp') logger.reportWarningObject(errobj) logger.errorException('Failed to discover modules by snmp') logger.debug('End discover snmp modules') finally: if client != None: client.close() if OSHVResult.size() == 0 and framework.getSentObjectsCount() == 0: logger.reportWarning('SNMP: No data collected') return OSHVResult
def DiscoveryMain(Framework): OSHVResult = ObjectStateHolderVector() endpoint = Framework.getDestinationAttribute('endpoint') ip = Framework.getDestinationAttribute('ip') protocols = Framework.getAvailableProtocols(ip, "http") if len(protocols) == 0: msg = 'Protocol not defined or IP out of protocol network range' logger.reportWarning(msg) logger.error(msg) return OSHVResult novaApi = None cinderApi = None glanceApi = None neutronApi = None zoneOshDict = {} serverOshDict = {} networkOshDict = {} for protocol in protocols: try: username = Framework.getProtocolProperty( protocol, CollectorsConstants.PROTOCOL_ATTRIBUTE_USERNAME) credential = Framework.getProtocolProperty( protocol, CollectorsConstants.PROTOCOL_ATTRIBUTE_PASSWORD) keystoneApi = buildApi('openstack-keystone', endpoint, username, credential, KeystoneApi) logger.debug('keystoneApi:', keystoneApi) tenant_discover = openstack_discoverer.TenantDiscoverer( keystoneApi) tenants = tenant_discover.discover() if tenants: openstack_software = openstack.OpenStack(ip) openstack_osh, openstack_vector = openstack_software.report() OSHVResult.addAll(openstack_vector) else: continue for tenant in tenants: try: logger.debug("connecting to tenant:", tenant.name) tenant_osh = tenant.report() OSHVResult.add(tenant_osh) OSHVResult.add( modeling.createLinkOSH("composition", openstack_osh, tenant_osh)) identity = tenant.name + ":" + username novaApi = buildApi('openstack-nova', endpoint, identity, credential, NovaApi) cinderApi = buildApi('openstack-cinder', endpoint, identity, credential, CinderApi) glanceApi = buildApi('openstack-glance', endpoint, identity, credential, GlanceApi) neutronApi = buildApi('openstack-neutron', endpoint, identity, credential, NeutronApi) regions = novaApi.getConfiguredRegions() if regions: tenant_osh.setStringAttribute('credentials_id', protocol) for tmp_region in regions: logger.debug("region:", tmp_region) region = openstack.Region(tmp_region) region_osh = region.report(tenant_osh) OSHVResult.add(region_osh) OSHVResult.addAll( getZones(novaApi, region.name, region_osh, zoneOshDict)) logger.debug("zoneOshDict:", zoneOshDict) OSHVResult.addAll( getImages(glanceApi, region.name, region_osh)) OSHVResult.addAll( getHypervisors(novaApi, region.name, region_osh)) OSHVResult.addAll( getVms(novaApi, region.name, region_osh, serverOshDict)) OSHVResult.addAll( getVolumes(cinderApi, region.name, region_osh, zoneOshDict, serverOshDict)) logger.debug("serverOshDict:", serverOshDict) OSHVResult.addAll( getNetworks(neutronApi, region.name, region_osh, networkOshDict, openstack_osh)) logger.debug("networkOshDict:", networkOshDict) OSHVResult.addAll( getPorts(neutronApi, region.name, serverOshDict, networkOshDict)) OSHVResult.addAll( getSubnets(neutronApi, region.name, networkOshDict, openstack_osh)) OSHVResult.addAll( getFlavors(novaApi, region.name, region_osh)) except: strException = str(sys.exc_info()[1]) excInfo = logger.prepareJythonStackTrace('') logger.debug(strException) logger.debug(excInfo) pass except: strException = str(sys.exc_info()[1]) excInfo = logger.prepareJythonStackTrace('') logger.debug(strException) logger.debug(excInfo) pass finally: if novaApi: Closeables.close(novaApi, True) if cinderApi: Closeables.close(cinderApi, True) if glanceApi: Closeables.close(glanceApi, True) if neutronApi: Closeables.close(neutronApi, True) reportError = OSHVResult.size() == 0 if reportError: msg = 'Failed to connect using all protocols' logger.reportError(msg) logger.error(msg) return OSHVResult