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
Beispiel #3
0
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
Beispiel #4
0
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)
Beispiel #6
0
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
Beispiel #7
0
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
Beispiel #8
0
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
Beispiel #10
0
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)
Beispiel #12
0
    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
Beispiel #13
0
    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
Beispiel #14
0
 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:
Beispiel #16
0
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
Beispiel #17
0
 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
Beispiel #18
0
 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
Beispiel #19
0
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
Beispiel #20
0
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
Beispiel #21
0
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)
Beispiel #22
0
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
Beispiel #23
0
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)
Beispiel #24
0
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
Beispiel #27
0
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
Beispiel #29
0
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
Beispiel #30
0
                        # 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
Beispiel #31
0
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
Beispiel #33
0
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
Beispiel #34
0
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()
Beispiel #36
0
    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
Beispiel #38
0
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
Beispiel #39
0
    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
Beispiel #43
0
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