예제 #1
0
def findTCPNextHop(Framework, hostIPs, shell, processes, connectivityEndPoints, connections, application, hostOsh):
    warninglist = []
    OSHVResult = ObjectStateHolderVector()
    logger.debug("Start to do tcp discovery for application:", application.getName())

    pids = [x.getPid() for x in application.getProcesses() if x]
    logger.debug("getting pids:", pids)

    endpoints_for_pids = [x for x in connectivityEndPoints if x and x.getKey() in pids]
    processedendpoints = filterEndpointsByPorts(Framework, endpoints_for_pids, connections, warninglist)

    results = reportProcessToPort(application.getProcesses(), processedendpoints, application.getOsh(), shell, hostIPs)
    logger.debug("found %s scp for application: %s via TCP connection" % (getNumOfSCP(results), application.getName()))
    OSHVResult.addAll(results)

    processReporter = process.Reporter()
    for processObject in processes:
        processesVector = processReporter.reportProcess(hostOsh, processObject)
        OSHVResult.addAll(processesVector)

    return OSHVResult, getNumOfSCP(results), warninglist
def DiscoveryMain(Framework):
    vector = ObjectStateHolderVector()
    protocol = Framework.getDestinationAttribute('Protocol')
    client = None
    shell = None
    try:
        try:
            # connect to destination
            client = Framework.createClient()
            # wrap client with Shell
            shell = shellutils.ShellFactory().createShell(client)
        except AuthenticationException, ae:
            errormessages.resolveAndReport(ae.getMessage(), protocol,
                                           Framework)
        except:
            exInfo = logger.prepareJythonStackTrace('')
            errormessages.resolveAndReport(exInfo, protocol, Framework)
        else:

            language = Framework.getDestinationAttribute('language')
            hostCmdbId = Framework.getDestinationAttribute('hostId')

            # configure internationalization support
            if language and language != 'NA':
                langBund = Framework.getEnvironmentInformation().getBundle(
                    'langHost_Resources_By_TTY', language)
            else:
                langBund = Framework.getEnvironmentInformation().getBundle(
                    'langHost_Resources_By_TTY')

            # discovery
            discoverCPUs = Boolean.parseBoolean(
                Framework.getParameter('discoverCPUs'))
            discoverDisks = Boolean.parseBoolean(
                Framework.getParameter('discoverDisks'))
            discoveriSCSIInfo = Boolean.parseBoolean(
                Framework.getParameter('discoveriSCSIInfo'))
            discoverDrivers = Boolean.parseBoolean(
                Framework.getParameter('discoverDrivers'))
            discoverMemory = Boolean.parseBoolean(
                Framework.getParameter('discoverMemory'))
            discoverSoftware = Boolean.parseBoolean(
                Framework.getParameter('discoverInstalledSoftware'))
            discoverUsers = Boolean.parseBoolean(
                Framework.getParameter('discoverUsers'))
            discoverServices = Boolean.parseBoolean(
                Framework.getParameter('discoverServices'))
            discoverShares = Boolean.parseBoolean(
                Framework.getParameter('discoverShares'))
            discoverP2P = Boolean.parseBoolean(
                Framework.getParameter('discoverP2P'))

            try:

                hostOsh = modeling.createOshByCmdbIdString('host', hostCmdbId)

                if discoverShares:
                    try:
                        vector.addAll(_discoverSharedResources(shell, hostOsh))
                    except:
                        errorMessage = 'Failed to discover shared resources'
                        _logWarn(
                            errorcodes.
                            FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE,
                            ['share', protocol], errorMessage)

                if discoverCPUs:
                    try:
                        vector.addAll(
                            TTY_HR_CPU_Lib.disWinOS(hostCmdbId, shell,
                                                    Framework, langBund))
                    except:
                        errorMessage = 'Failed to discover CPUs'
                        _logWarn(
                            errorcodes.
                            FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE,
                            ['cpus', protocol], errorMessage)

                if discoverDisks:
                    try:
                        vector.addAll(TTY_HR_Disk_Lib.disWinOS(hostOsh, shell))
                    except:
                        errorMessage = 'Failed to discover disks'
                        _logWarn(
                            errorcodes.
                            FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE,
                            ['disks', protocol], errorMessage)

                if discoverDrivers and shell.isWinOs():
                    try:
                        vector.addAll(
                            _discoverWindowsDeviceDriver(shell, hostOsh))
                    except:
                        errorMessage = 'Failed to discover windows device driver by powershell'
                        _logWarn(
                            errorcodes.
                            FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE,
                            ['windows device driver', protocol], errorMessage)

                if discoveriSCSIInfo:
                    try:
                        vector.addAll(
                            TTY_HR_Disk_Lib.disWinOSiSCSIInfo(hostOsh, shell))
                    except:
                        errorMessage = 'Failed to discover iSCSI info'
                        _logWarn(
                            errorcodes.
                            FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE,
                            ['iSCSI', protocol], errorMessage)

                if discoverMemory:
                    try:
                        vector.addAll(
                            TTY_HR_Memory_Lib.disWinOS(hostCmdbId, shell,
                                                       Framework, langBund))
                    except:
                        errorMessage = 'Failed to discover memory'
                        _logWarn(
                            errorcodes.
                            FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE,
                            ['memory', protocol], errorMessage)

                processes = []
                try:
                    processesDiscoverer = process_discoverer.DiscovererByShellOnWindows(
                        shell)
                    processes = processesDiscoverer.discoverAllProcesses()
                    if not processes:
                        raise ValueError()
                except:
                    errorMessage = 'Failed to discover processes'
                    _logWarn(
                        errorcodes.
                        FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE,
                        ['processes', protocol], errorMessage)

                if processes:
                    # save processes to DB
                    process_discoverer.saveProcessesToProbeDb(
                        processes, hostCmdbId, Framework)

                    # report processes
                    discoverProcesses = Boolean.parseBoolean(
                        Framework.getParameter('discoverProcesses'))
                    if discoverProcesses:
                        processReporter = process.Reporter()
                        for processObject in processes:
                            processVector = processReporter.reportProcess(
                                hostOsh, processObject)
                            vector.addAll(processVector)

                if discoverUsers:
                    try:
                        vector.addAll(_discoverUsers(hostOsh, shell))
                    except:
                        errorMessage = 'Failed to discover users'
                        _logWarn(
                            errorcodes.
                            FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE,
                            ['users', protocol], errorMessage)

                cmdLineToInstalledSoftware = {}
                softNameToInstSoftOSH = {}
                if discoverSoftware:
                    try:
                        softwareOSHs = TTY_HR_Software_Lib.disWinOS(
                            hostCmdbId, shell, Framework, langBund,
                            softNameToInstSoftOSH)
                        if softwareOSHs:
                            vector.addAll(softwareOSHs)
                    except:
                        errorMessage = 'Failed to discover installed software'
                        _logWarn(errorcodes.FAILED_DISCOVERING_RESOURCE,
                                 ['installed software', protocol],
                                 errorMessage)

                servicesByCmd = Hashtable()
                if discoverServices:
                    try:
                        srvcOSHs = NTCMD_HR_REG_Service_Lib.doService(
                            shell, hostOsh, servicesByCmd, langBund, Framework)
                        vector.addAll(srvcOSHs)
                    except:
                        errorMessage = 'Failed to discover services'
                        _logWarn(errorcodes.FAILED_DISCOVERING_RESOURCE,
                                 ['services', protocol], errorMessage)

                connectivityEndPoints = []
                try:
                    tcpDiscoverer = Dis_TCP.getDiscovererByShell(
                        client, Framework, shell)
                    if tcpDiscoverer is not None:
                        tcpDiscoverer.discoverTCP()
                        connectivityEndPoints = tcpDiscoverer.getProcessEndPoints(
                        )
                except:
                    errorMessage = 'Failed to run TCP discovery'
                    _logWarn(
                        errorcodes.FAILED_RUNNING_DISCOVERY_WITH_CLIENT_TYPE,
                        ['tcp', protocol], errorMessage)

                appSign = applications.createApplicationSignature(
                    Framework, client, shell)

                if processes:
                    appSign.setProcessesManager(
                        applications.ProcessesManager(processes,
                                                      connectivityEndPoints))

                servicesInfo = applications.ServicesInfo(servicesByCmd)
                appSign.setServicesInfo(servicesInfo)

                softwareInfo = applications.InstalledSoftwareInfo(
                    cmdLineToInstalledSoftware, softNameToInstSoftOSH)
                appSign.setInstalledSoftwareInfo(softwareInfo)

                appSign.getApplicationsTopology(hostCmdbId)

                if discoverP2P:
                    try:
                        p2p = process_to_process.ProcessToProcess(Framework)
                        p2p.getProcessesToProcess()
                    except:
                        errorMessage = 'Failed to run p2p discovery'
                        _logWarn(errorcodes.FAILED_RUNNING_DISCOVERY,
                                 ['p2p', protocol], errorMessage)

            except JException, ex:
                exInfo = ex.getMessage()
                errormessages.resolveAndReport(exInfo, protocol, Framework)
            except:
예제 #3
0
def DiscoveryMain(Framework):
    OSHVResult = ObjectStateHolderVector()
    client = None
    try:
        client = createWmiClient(Framework)

        if client:
            protocol = Framework.getDestinationAttribute('Protocol')
            hostId = Framework.getDestinationAttribute('hostId')
            hostOsh = modeling.createOshByCmdbIdString('nt', hostId)

            _, warning = discover_or_warn('fibre channel HBAs',
                                          discover_fc_hbas,
                                          Framework,
                                          hostOsh,
                                          protocol,
                                          OSHVResult,
                                          protocol_name=protocol)
            if warning:
                logger.reportWarningObject(warning)

            discoverUsers = Boolean.parseBoolean(
                Framework.getParameter('discoverUsers'))
            if discoverUsers:
                try:
                    wmi_dis_user_lib.executeWmiQuery(client, Framework,
                                                     OSHVResult, hostOsh)
                except:
                    errobj = errorobject.createError(
                        errorcodes.
                        FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE,
                        ['users', 'wmi'], 'Failed to discover users by wmi')
                    logger.reportErrorObject(errobj)
                    logger.errorException('Failed to discover users by wmi')

            discoverShares = Boolean.parseBoolean(
                Framework.getParameter('discoverShares'))
            if discoverShares:
                try:
                    wmi_dis_share_lib.executeWmiQuery(client, OSHVResult,
                                                      hostOsh)
                except:
                    errobj = errorobject.createError(
                        errorcodes.
                        FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE,
                        ['shares', 'wmi'], 'Failed to discover shares by wmi')
                    logger.reportErrorObject(errobj)
                    logger.errorException('Failed to discover shares by wmi')

            discoverProcesses = Boolean.parseBoolean(
                Framework.getParameter('discoverProcesses'))
            processes = []

            try:
                processDiscoverer = process_discoverer.getDiscovererByWmi(
                    client)
                processes = processDiscoverer.discoverAllProcesses()
                if not processes:
                    raise ValueError()
            except:
                errobj = errorobject.createError(
                    errorcodes.FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE,
                    ['processes', 'wmi'],
                    'Failed to discover processes by wmi')
                logger.reportErrorObject(errobj)
                logger.errorException('Failed to discover processes by wmi')

            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)

            discoverMemory = Boolean.parseBoolean(
                Framework.getParameter('discoverMemory'))
            if discoverMemory:
                try:
                    wmi_dis_memory_lib.executeWmiQuery(client, OSHVResult,
                                                       hostOsh)
                except:
                    errobj = errorobject.createError(
                        errorcodes.
                        FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE,
                        ['memory', 'wmi'], 'Failed to discover memory by wmi')
                    logger.reportErrorObject(errobj)
                    logger.errorException('Failed to discover memory by wmi')

            discoverDisks = Boolean.parseBoolean(
                Framework.getParameter('discoverDisks'))
            if discoverDisks:
                try:
                    containerOsh = hostOsh or modeling.createHostOSH(
                        client.getIpAddress())
                    NTCMD_HR_Dis_Disk_Lib.discoverDiskByWmic(
                        client, OSHVResult, containerOsh)
                    NTCMD_HR_Dis_Disk_Lib.discoverPhysicalDiskByWmi(
                        client, OSHVResult, containerOsh)

                except:
                    errobj = errorobject.createError(
                        errorcodes.
                        FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE,
                        ['disks', 'wmi'], 'Failed to discover disks by wmi')
                    logger.reportErrorObject(errobj)
                    logger.errorException('Failed to discover disks by wmi')

            discoverDrivers = Boolean.parseBoolean(
                Framework.getParameter('discoverDrivers'))
            if discoverDrivers:
                try:
                    containerOsh = hostOsh or modeling.createHostOSH(
                        client.getIpAddress())
                    HR_Dis_Driver_Lib.discoverDriverByWmi(
                        client, OSHVResult, containerOsh)

                except:
                    errobj = errorobject.createError(
                        errorcodes.
                        FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE,
                        ['drivers', 'wmi'],
                        'Failed to discover drivers by wmi')
                    logger.reportErrorObject(errobj)
                    logger.errorException('Failed to discover drivers by wmi')

            discoveriSCSIInfo = Boolean.parseBoolean(
                Framework.getParameter('discoveriSCSIInfo'))
            if discoveriSCSIInfo:
                try:
                    NTCMD_HR_Dis_Disk_Lib.discoveriSCSIInfo(
                        client, OSHVResult, containerOsh)
                except:
                    logger.warn(
                        'Failed to connect with namespace Root\Microsoft\Windows\Storage'
                    )

            discoverCPUs = Boolean.parseBoolean(
                Framework.getParameter('discoverCPUs'))
            if discoverCPUs:
                try:
                    wmi_dis_cpu_lib.executeWmiQuery(client, OSHVResult,
                                                    hostOsh)
                except:
                    errobj = errorobject.createError(
                        errorcodes.
                        FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE,
                        ['cpus', 'wmi'], 'Failed to discover cpus by wmi')
                    logger.reportErrorObject(errobj)
                    logger.errorException('Failed to discover cpus by wmi')

            discoverServices = Boolean.parseBoolean(
                Framework.getParameter('discoverServices'))
            servicesByCmd = Hashtable()
            if discoverServices:
                try:
                    servOSHV = wmi_dis_service_lib.executeWmiQuery(
                        client, OSHVResult, servicesByCmd, hostOsh)
                    OSHVResult.addAll(servOSHV)
                except:
                    errobj = errorobject.createError(
                        errorcodes.
                        FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE,
                        ['services', 'wmi'],
                        'Failed to discover services by wmi')
                    logger.reportErrorObject(errobj)
                    logger.errorException('Failed to discover services by wmi')

            #NOTE: software discovery had to be the last in discovery chain
            discoverSoftware = Boolean.parseBoolean(
                Framework.getParameter('discoverInstalledSoftware'))
            softNameToInstSoftOSH = {}
            if discoverSoftware:
                (softNameToInstSoftOSH,
                 client) = __discoverInstalledSoftware(Framework, OSHVResult,
                                                       client)

            if not client:
                logger.warn(
                    "Application Signature will not be run since the client is not initialized"
                )

            if client:

                appSign = applications.createApplicationSignature(
                    Framework, client)
                if processes:
                    appSign.setProcessesManager(
                        applications.ProcessesManager(processes, []))
                servicesInfo = applications.ServicesInfo(servicesByCmd)
                appSign.setServicesInfo(servicesInfo)

                softwareInfo = applications.InstalledSoftwareInfo(
                    None, softNameToInstSoftOSH)
                appSign.setInstalledSoftwareInfo(softwareInfo)

                appSign.getApplicationsTopology(hostId)

    finally:
        if client != None:
            client.close()
    return OSHVResult
예제 #4
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
예제 #5
0
def doApplication(Framework, ip, OSHVResult, client, shell, hostOsh):
    clientType = client.getClientType()
    language = Framework.getDestinationAttribute('language')
    portToDiscover = Framework.getDestinationAttribute("PORT")
    scp_id = Framework.getDestinationAttribute("SCP_ID")
    portInNetstat = False
    processMapOnPort = {}
    signatureFound = False

    filterRunningSoftwareByPort = Framework.getParameter('filterRunningSoftwareByPort')
    logger.debug("Start to do host application")
    logger.debug("ip:", ip)
    #hostOsh = modeling.createHostOSH(ip)

    platformTrait = None
    processes = []
    packageToExecutablePath = {}
    CLUSTERLIST = ["Microsoft Cluster SW"]

    if shell.isWinOs():
        uname = 'Win'
        #client = shell
        if (language != None) and (language != 'NA'):
            langBund = Framework.getEnvironmentInformation().getBundle('langHost_Resources_By_TTY', language)
        else:
            langBund = Framework.getEnvironmentInformation().getBundle('langHost_Resources_By_TTY')

        try:
            wmicPath = Framework.getParameter('wmicPath')
            if wmicPath:
                shell.execCmd('set PATH=%PATH%;' + wmicPath)
        except:
            logger.debug('Failed to add default wmic location to the PATH variable.')
    else:
        if shell.getClientType() == 'ssh':
            uname = netutils.getOSName(client, 'uname -a')
        else:
            uname = netutils.getOSName(client, 'uname')

        langBund = Framework.getEnvironmentInformation().getBundle('langHost_Resources_By_TTY', 'eng')

        # get platform details
    try:
        platformTrait = process_discoverer.getPlatformTrait(shell)
        if platformTrait is None:
            raise ValueError()
    except:
        logger.warnException("Failed to determine platform")

    # discover processes
    if platformTrait and not uname == 'VMkernel':
        try:
            discoverer = process_discoverer.getDiscovererByShell(shell, platformTrait)
            processes = discoverer.discoverAllProcesses()
            if not processes:
                raise ValueError()
        except:
            errorMessage = 'Failed to discover processes by shell'
            TTY_HR_Main.logWarn(Framework, errorcodes.FAILED_DISCOVERING_RESOURCE_WITH_CLIENT_TYPE,
                                ['processes', clientType], errorMessage)

    if processes:

        # save processes to DB
        #process_discoverer.saveProcessesToProbeDb(processes, hostId, Framework)

        # discover packages info
        try:
            packagesDiscoverer = process_discoverer.getPackagesDiscovererByShell(shell, platformTrait)
            packageToExecutablePath = packagesDiscoverer.getPackagesByProcesses(processes)
        except:
            logger.warn("Failed to get package names by processes path")

            # report processes
            #if discoverProcesses:

    connectivityEndPoints = []
    connections = []
    runningApplications = []
    errorsList = []

    #No tcp and p2p discovery for vmkernel
    if not uname == 'VMkernel':
        try:
            tcpDiscoverer = asm_Disc_TCP.getDiscovererByShell(client, Framework, shell)
            if tcpDiscoverer is not None:
                tcpDiscoverer.pdu = asm_Disc_TCP.TcpStateHolder(None)
                tcpDiscoverer.discoverTCP()
                connections = tcpDiscoverer.pdu.tcp_connections
                connectivityEndPoints = tcpDiscoverer.getProcessEndPoints()
        except:
            errorMessage = 'Failed to run tcp discovery by shell'
            TTY_HR_Main.logWarn(Framework, errorcodes.FAILED_RUNNING_DISCOVERY_WITH_CLIENT_TYPE, ['tcp', clientType],
                                errorMessage)

        #if workInTopDown:
        linkOshv = ObjectStateHolderVector()
        processReporter = process.Reporter()
        processBuilder = process.ProcessBuilder()
        for connectivityEndPoint in connectivityEndPoints:
            processid = connectivityEndPoint.getKey()
            endpoints = connectivityEndPoint.getEndpoints()
            #logger.debug('#processid=', processid)
            #logger.debug('#endpoints=', endpoints)
            for processObject in processes:
                #logger.debug('#processObject.getPid()=', processObject.getPid())
                #logger.debug('#processObject.getName()=', processObject.getName())
                if 4 < processid == processObject.getPid() and processObject.getName() != 'svchost.exe':
                    processOSH, _ = processReporter.report(hostOsh, processObject, processBuilder)
                    for endpoint in endpoints:
                        if str(portToDiscover) == str(endpoint.getPort()):
                            portInNetstat = True
                            processMapOnPort[processid] = processObject
                        builder = netutils.ServiceEndpointBuilder()
                        reporter = netutils.EndpointReporter(builder)
                        ipServerOSH = reporter.reportEndpoint(endpoint, hostOsh)
                        linkOsh = modeling.createLinkOSH('usage', processOSH, ipServerOSH)
                        linkOshv.add(linkOsh)
                    break

        if not portInNetstat:
            errorMessage = errormessages.makeErrorMessage(clientType, message=portToDiscover,
                                                          pattern=errormessages.ERROR_FINDING_PROCESS_BY_PORT)
            logger.debugException("port cannot be found:", portToDiscover)
            errobj = errorobject.createError(errorcodes.FAILED_FINDING_PROCESS_BY_PORT, [portToDiscover], errorMessage)
            errorsList.append(errobj)

        OSHVResult.addAll(linkOshv)

        framework_delegator = Framework_delegator.FrameworkDelegator()

        appSign = asm_applications.createASMApplicationSignature(Framework, framework_delegator, client, shell)
        if processes:
            appSign.setProcessesManager(applications.ProcessesManager(processes, connectivityEndPoints))
        servicesByCmd = Hashtable()
        servicesInfo = applications.ServicesInfo(servicesByCmd)
        appSign.setServicesInfo(servicesInfo)
        cmdLineToInstalledSoftware = {}
        softNameToInstSoftOSH = {}
        softwareInfo = applications.InstalledSoftwareInfo(cmdLineToInstalledSoftware, softNameToInstSoftOSH)
        appSign.setInstalledSoftwareInfo(softwareInfo)

        runningApplications = appSign.getApplicationsTopologyUsingHostOsh(hostOsh)
        logger.debug('runningApplications=%s' % runningApplications)
        logger.debug('adding netstat port results')
        for application in runningApplications:
            pids = [str(x.getPid()) for x in application.getProcesses() if x]
            logger.debug('pids for application:%s %s' % (application.getName(), pids))
            if pids in processMapOnPort.keys():
                signatureFound = True
            for connectivityEndPoint in connectivityEndPoints:
                processid = connectivityEndPoint.getKey()
                endpoints = connectivityEndPoint.getEndpoints()
                if str(processid) in pids:
                    for endpoint in endpoints:
                        logger.debug('adding port:', endpoint.getPort())
                        framework_delegator.addNetstatPortResult(application.getName(), endpoint.getPort())

        if (not signatureFound) and processMapOnPort.values():
            errorMessage = errormessages.makeErrorMessage(
                clientType, message="%s listening on port %s" % (processMapOnPort.values(), portToDiscover),
                pattern=errormessages.ERROR_FINDING_APPSIG_BY_PROCESS)
            logger.debugException("no listening port found for process %s and port %s" % (processMapOnPort.values(), portToDiscover))
            errobj = errorobject.createError(errorcodes.FAILED_FINDING_APPSIG_BY_PROCESS,
                                             [repr(processMapOnPort.values()), portToDiscover], errorMessage)
            errorsList.append(errobj)

        filteredRunningApplications = []
        if filterRunningSoftwareByPort and filterRunningSoftwareByPort == 'true':
            logger.debug('try to filter running applications using port:', portToDiscover)
            logger.debug('application list using port filter',
                         framework_delegator.getApplicationNamesByPort(portToDiscover))

            for runningApplication in runningApplications:
                if runningApplication.getName() in framework_delegator.getApplicationNamesByPort(portToDiscover):
                    logger.debug("adding application: ", runningApplication.getName())
                    filteredRunningApplications.append(runningApplication)
                elif runningApplication.getName() in CLUSTERLIST:
                    logger.debug("include cluster related ci: ", runningApplication.getName())
                    filteredRunningApplications.append(runningApplication)
                    OSHVResult.addAll(
                        framework_delegator.getResultVectorByApplicationName(runningApplication.getName()))
                else:
                    logger.debug("remove application: ", runningApplication.getName())

            logger.debug('filteredRunningApplications=%s' % filteredRunningApplications)

            if not filteredRunningApplications:
                logger.debug("running software for port was not found:", portToDiscover)

            for resultVector in framework_delegator.getResultVectorsByPort(portToDiscover):
                OSHVResult.addAll(resultVector)

            #create ownership between runningsoftware and scp
            logger.debug("create ownership between runningsoftware and scp")
            for runningApplication in filteredRunningApplications:
                logger.debug("APP:", runningApplication.getName())
                OSHVResult.addAll(scp.createOwnerShip(scp_id, runningApplication.getOsh()))

        else:
            logger.debug('filterRunningSoftwareByPort is %s, will report all running software discovered')
            for runningApplication in runningApplications:
                filteredRunningApplications.append(runningApplication)
                OSHVResult.addAll(framework_delegator.getResultVectorByApplicationName(runningApplication.getName()))
                OSHVResult.addAll(scp.createOwnerShip(scp_id, runningApplication.getOsh()))

        logger.debug("crgMap = ", appSign.crgMap)
        vector = ObjectStateHolderVector()
        vector.addAll(OSHVResult)
        if appSign.crgMap:
            for osh in vector:
                oshClass = osh.getObjectClass()
                #weak node
                if oshClass == 'node' and osh.getAttributeValue('host_iscomplete') == 0 and osh.getAttributeValue(
                        'host_key'):
                    ip = osh.getAttributeValue('host_key').split(' ')[0]
                    if ip in appSign.crgMap.keys():
                        logger.debug("replace weak node:", osh.getAttribute("host_key"))
                        OSHVResult.remove(osh)
                        OSHVResult.add(appSign.crgMap[ip])
                #root container
                elif osh.getAttribute('root_container'):
                    obj = osh.getAttribute("root_container").getObjectValue()
                    if obj.getObjectClass() == 'node' and obj.getAttributeValue(
                            'host_iscomplete') == 0 and obj.getAttributeValue('host_key'):
                        logger.debug("replace root_container:", osh)
                        ip = obj.getAttributeValue('host_key').split(' ')[0]
                        if ip in appSign.crgMap.keys():
                            logger.debug("replace root_container:", obj.getAttribute("host_key"))
                            osh.setContainer(appSign.crgMap[ip])


    return filteredRunningApplications, processes, connectivityEndPoints, connections, errorsList
예제 #6
0
def _report(ip, config, version_info, partition_groups, partitions,
            pg_names_by_partition_number, buffer_pools_by_partition_nr,
            tablespaces, partition_numbers_by_pg_name, mountpoint_by_container,
            containers_by_tablespace_id, partition_nr_by_container,
            schemas, tables, sessions, inst_name=None, svcename=None, version=None):
    oshs = []
    add_all_to_result = Fn(_add_vector_and_return, oshs, fptools._)
    add_to_result = Fn(_add_osh_and_return, oshs, fptools._)

    link_reporter = db2_topology.LinkReporter()
    report_usage_link = comp(add_to_result, link_reporter.report_usage)
    report_client_server_link = comp(add_to_result,
                                link_reporter.report_client_server)
    report_dbclient_link = comp(add_to_result,
                                link_reporter.report_dbclient)

    host_reporter = db2_host.Reporter(db2_host.Builder())

    report_host = comp(add_to_result, modeling.createHostOSH, str)
    process_reporter = process.Reporter()
    report_process = Fn(process_reporter.report,
                                            fptools._,
                                            fptools._,
                                            process.ProcessBuilder())
    report_process = comp(add_all_to_result, report_process)

    host_osh = modeling.createOshByCmdbIdString('node', config.host_id)
    db_osh = modeling.createOshByCmdbIdString('db2_database', config.db_id)
    oshs.append(host_osh)
    oshs.append(db_osh)

    endpoint_osh, oshs_ = _report_ipse(config, ip, svcename, host_osh, db_osh)
    oshs.extend(oshs_)

    db2_rs_osh, oshs_ = _report_instance(config, inst_name, version, db_osh, host_osh, endpoint_osh)
    oshs.extend(oshs_)

    if version_info:
        if db2_rs_osh:
            db2_topology.SoftwareBuilder.updateVersionDescription(db2_rs_osh,
                                                                  str(version_info))
        db2_topology.SoftwareBuilder.updateVersionDescription(db_osh,
                                                              str(version_info))

    db2_reporter = db2_topology.Reporter()

    report_dbschema = Fn(db2_reporter.reportDbSchema,
                                          fptools._,
                                          db_osh)
    report_dbschema = comp(add_to_result, report_dbschema)
    report_datafile = comp(add_all_to_result, db2_reporter.reportDatafile)
    report_tablespace = comp(add_all_to_result, db2_reporter.reportTablespace)
    report_table = comp(add_all_to_result, db2_reporter.reportTable)
    report_partition_group = Fn(db2_reporter.reportPartitionGroup,
                                            fptools._,
                                            db_osh)
    report_partition_group = comp(add_to_result, report_partition_group)
    report_partition = comp(add_all_to_result, db2_reporter.reportPartition)
    report_buffer_pool = comp(add_all_to_result,
                              Fn(db2_reporter.reportBufferPool,
                                 fptools._, db_osh, fptools._,))

    file_system_builder = db2_topology.FileSystemBuilder()
    file_system_reporter = db2_topology.FileSystemReporter(file_system_builder)
    report_file_system = comp(add_to_result, file_system_reporter.report_file_system)

    pg_osh_by_pg_name = _report_pgs(partition_groups, report_partition_group)

    partition_osh_by_number, node_osh_by_partition_nr = _report_partitions(partitions, db2_rs_osh, oshs, pg_names_by_partition_number, pg_osh_by_pg_name, report_partition, host_reporter)

    bp_osh_by_partition_nr_and_bp_id = _report_bufferpools(buffer_pools_by_partition_nr,
                                                          partition_osh_by_number,
                                                          report_buffer_pool)

    container_oshes_by_tablespace = _report_data_files(mountpoint_by_container,
                                                       containers_by_tablespace_id,
                                                      partition_nr_by_container,
                                                      tablespaces,
                                                      partition_osh_by_number,
                                                      node_osh_by_partition_nr,
                                                      report_datafile,
                                                      report_file_system)

    tablespace_osh_by_tablespace = _report_tablespaces(tablespaces,
                                                       db_osh,
                                                       pg_osh_by_pg_name,
                                                       partition_numbers_by_pg_name,
                                                       bp_osh_by_partition_nr_and_bp_id,
                                                       container_oshes_by_tablespace,
                                                       report_tablespace,
                                                       report_usage_link)
    schema_osh_by_name = {}
    for schema in schemas:
        schema_osh_by_name[schema.name] = report_dbschema(schema)

    for table, tablespace, schema_name, owner in tables:
        table_pdo = db2_topology.Builder.TablePdo(table.name, owner)
        tablespace_osh = tablespace_osh_by_tablespace.get(tablespace)
        schemaOsh = schema_osh_by_name.get(schema_name)
        if schemaOsh:
            report_table(table_pdo, schemaOsh, tablespaceOsh=tablespace_osh)
        else:
            logger.warn("Schema '%s' not found, table '%s' is not reported" %
                                                    (schema_name, table.name))

    port = config.port or resolve_svcename_to_port_nr(svcename)
    _report_sessions(sessions, endpoint_osh, db2_rs_osh, port, report_host, report_process, report_client_server_link, report_dbclient_link)
    return oshs
예제 #7
0
    def process(self, context):
        r'''
         @types: applications.ApplicationSignatureContext
        '''
        self.__shell = context.client
        osh = context.application.applicationOsh
        hostOsh = context.hostOsh
        processes = context.application.getProcesses()
        vector = context.resultsVector
        layout = emc_autostart_discover.createLayout(self.__shell)
        clusterVersion = None

        for processFtAgent in filter(isFtAgentProcess, processes):
            process = _createFixedFtAgentProcess(processFtAgent)
            reporter = process_module.Reporter()
            builder = process_module.ProcessBuilder()
            processOsh, pVector = reporter.report(hostOsh, process, builder)
            vector.addAll(pVector)
            vector.add(modeling.createLinkOSH('dependency', osh, processOsh))

            if not clusterVersion:
                layout.initWithAgentPath(process.executablePath)
                self.ftCli = emc_autostart_discover.createCli(self.__shell, layout.getBinFolder())
                version = emc_autostart_discover.getVersionByFtCli(self.__shell, self.ftCli)
                clusterVersion = version.fullString or version.shortString
                osh.setAttribute("application_version", clusterVersion)
                osh.setAttribute("application_version_number",
                                 version.shortString)

        if clusterVersion:
            # discover cluster
            domainName = context.application.getOsh().getAttribute("name").getStringValue()
            clusterOsh = buildEMCClusterOsh(domainName, clusterVersion)
            vector.add(clusterOsh)
            vector.add(modeling.createLinkOSH('membership', clusterOsh, osh))

            # discover group
            discoverer = emc_autostart_discover.createDiscoverer(self.__shell, None, layout)
            discoverer.ftCli = self.ftCli
            resourceGroupsByName = discoverer.discoverResourceGroups()

            # discover IP
            managedIpsByName = discoverer.discoverManagedIps()

            if resourceGroupsByName:
                for key in resourceGroupsByName:
                    group = resourceGroupsByName.get(key)
                    resources = group.resources
                    if resources:
                        for resource in resources:
                            if resource.getType() == "IP":
                                ipName = resource.getName()
                                managedIp = managedIpsByName.get(ipName, None)
                                if managedIp:
                                    ipAddress = managedIp.ipAddress
                                    groupOsh = buildResourceGroupOsh(group.getName(), domainName)
                                    vector.add(groupOsh)
                                    vector.add(modeling.createLinkOSH('contained', clusterOsh, groupOsh))

                                    ipOsh = modeling.createIpOSH(ipAddress)
                                    vector.add(modeling.createLinkOSH('contained', groupOsh, ipOsh))
                                    vector.add(ipOsh)
                                    context.crgMap[str(ipAddress)] = groupOsh