def discover(self): ''' Main discover function @returns: list of RunningApplicationDiscoverer children ''' oracleInformationList = [] listenerProcessesDict = self._getFullProcessDescription('tnslsnr', '(/.*tnslsnr.*)', '[\w\-]+\s+(\d+)') ipPortDiscoverer = ProcessListeningIpPortDiscoverer(self._shell) for (process, pidMatch) in listenerProcessesDict.items(): pid = None if pidMatch: pid = pidMatch.group(1) envConfigurator = UnixOracleEnvConfig(self._shell) envConfigurator.setOracleHomeEnvVar(process) oracleBinDir = envConfigurator.getOracleBinDir() try: listenerName = self._parseListenerName(process) listenerStatus = self._getListenerStatus(oracleBinDir) or self._getListenerStatus(oracleBinDir, listenerName) if not listenerStatus: raise ValueError('Failed to get listener status output.') oracleSids = self._parseSidsFromListenerStatus(listenerStatus) if not listenerName or not oracleSids: raise ValueError('Not enough information discovered for Oracle.') logger.debug('Discovered Listener with name: %s' % listenerName) endPoints = ipPortDiscoverer.discover(pid) oracleInformationList.append(TnsListener(process, listenerName, endPoints)) for oracleSid in oracleSids: logger.debug('Discovered OracleDB with SID: %s' % oracleSid) oracleInformationList.append(OracleDataBase(process, oracleSid, endPoints)) except: logger.debugException('') return oracleInformationList
def discover(self): if not self.rawOracleHome: #old style ORACLE_HOME guessing flow self.envConf = EnvConfigurator(self.shell, self.defaultOracleHomes, self.shell.isWinOs()) else: #new approach based on the process path if self.shell.isWinOs(): self.envConf = WindowsOracleEnvConfig(self.shell) else: self.envConf = UnixOracleEnvConfig(self.shell) self.envConf.setOracleHomeEnvVar(self.rawOracleHome) listenerConfigFile = self.getOracleTNSListenerConfig() listenedIPsDict = self.__parseConfig(listenerConfigFile) # Retrieve actual serivce names and sids which are managed by the # listener on destination listenerStatusBuffer = self.getListenerStatus(self.listenerName) or self.getListenerStatus() self.fullListenerVersion = self.__parseVersion(listenerStatusBuffer) listenedIPsDict.update(self.__getIPsFromListenerStatus(listenerStatusBuffer)) self.listenedIPs = listenedIPsDict.keys()
def discover(self): processesDict = self._getFullProcessDescription('/opmn ', '(/.*opmn.*)', '\s*[\w\-]+\s+(\d+)') iasList = [] if processesDict: envConfigurator = UnixOracleEnvConfig(self._shell) ipPortDiscoverer = ProcessListeningIpPortDiscoverer(self._shell) for (process, pidMatch) in processesDict.items(): pid = None if pidMatch: pid = pidMatch.group(1) envConfigurator.setOracleHomeEnvVar(process) oracleHome = envConfigurator.getOracleHome() configFile = FileDiscoverer(self._shell).getFileContentWithFilter('%s/opmn/conf/opmn.xml' % oracleHome) names = self.parseServerNamesFromConfig(configFile) if names: endPoints = ipPortDiscoverer.discover(pid) for name in names: iasList.append(OracleIas(process, name, endPoints)) return iasList
def discover(self): ''' Main discover function @returns: list of RunningApplicationDiscoverer children ''' oracleInformationList = [] listenerProcessesDict = self._getFullProcessDescription( 'tnslsnr', '(/.*tnslsnr.*)', '[\w\-]+\s+(\d+)') ipPortDiscoverer = ProcessListeningIpPortDiscoverer(self._shell) for (process, pidMatch) in listenerProcessesDict.items(): pid = None if pidMatch: pid = pidMatch.group(1) envConfigurator = UnixOracleEnvConfig(self._shell) envConfigurator.setOracleHomeEnvVar(process) oracleBinDir = envConfigurator.getOracleBinDir() try: listenerName = self._parseListenerName(process) listenerStatus = self._getListenerStatus( oracleBinDir) or self._getListenerStatus( oracleBinDir, listenerName) if not listenerStatus: raise ValueError('Failed to get listener status output.') oracleSids = self._parseSidsFromListenerStatus(listenerStatus) if not listenerName or not oracleSids: raise ValueError( 'Not enough information discovered for Oracle.') logger.debug('Discovered Listener with name: %s' % listenerName) endPoints = ipPortDiscoverer.discover(pid) oracleInformationList.append( TnsListener(process, listenerName, endPoints)) for oracleSid in oracleSids: logger.debug('Discovered OracleDB with SID: %s' % oracleSid) oracleInformationList.append( OracleDataBase(process, oracleSid, endPoints)) except: logger.debugException('') return oracleInformationList
def discover(self): processesDict = self._getFullProcessDescription( '/opmn ', '(/.*opmn.*)', '\s*[\w\-]+\s+(\d+)') iasList = [] if processesDict: envConfigurator = UnixOracleEnvConfig(self._shell) ipPortDiscoverer = ProcessListeningIpPortDiscoverer(self._shell) for (process, pidMatch) in processesDict.items(): pid = None if pidMatch: pid = pidMatch.group(1) envConfigurator.setOracleHomeEnvVar(process) oracleHome = envConfigurator.getOracleHome() configFile = FileDiscoverer( self._shell).getFileContentWithFilter( '%s/opmn/conf/opmn.xml' % oracleHome) names = self.parseServerNamesFromConfig(configFile) if names: endPoints = ipPortDiscoverer.discover(pid) for name in names: iasList.append(OracleIas(process, name, endPoints)) return iasList
class ListenerConfiguration: LISTENER_CONFIGURATION_FILE = 'listener.ora' def __init__(self, shell, listenerName = None, rawOracleHome = None, defaultOracleHomes = []): '@types: Shell, str' self.listenerName = listenerName self.listenedIPs = None self.shell = shell self.rawOracleHome = rawOracleHome self.defaultOracleHomes = defaultOracleHomes def discover(self): if not self.rawOracleHome: #old style ORACLE_HOME guessing flow self.envConf = EnvConfigurator(self.shell, self.defaultOracleHomes, self.shell.isWinOs()) else: #new approach based on the process path if self.shell.isWinOs(): self.envConf = WindowsOracleEnvConfig(self.shell) else: self.envConf = UnixOracleEnvConfig(self.shell) self.envConf.setOracleHomeEnvVar(self.rawOracleHome) listenerConfigFile = self.getOracleTNSListenerConfig() listenedIPsDict = self.__parseConfig(listenerConfigFile) # Retrieve actual serivce names and sids which are managed by the # listener on destination listenerStatusBuffer = self.getListenerStatus(self.listenerName) or self.getListenerStatus() self.fullListenerVersion = self.__parseVersion(listenerStatusBuffer) listenedIPsDict.update(self.__getIPsFromListenerStatus(listenerStatusBuffer)) self.listenedIPs = listenedIPsDict.keys() def getOracleTNSListenerConfig(self): ''' Get content of configuration file about listeners @usedFile: listener.ora @types: -> str or None''' configDir = self.envConf.getConfigPath() if configDir: try: configFileContent = self.shell.safecat(configDir + ListenerConfiguration.LISTENER_CONFIGURATION_FILE) except: configFileContent = None logger.debug(ListenerConfiguration.LISTENER_CONFIGURATION_FILE + ' wasn\'t found in ' + configDir) if configFileContent and self.shell.getLastCmdReturnCode() == 0: return configFileContent def __parseConfig(self, listenerConfigFile): listenedIPs = {} if listenerConfigFile: hostNode = 'HOST' filter = {hostNode : 'HOST\s*=\s*([\w\-\.]+)[\s\)]*'} parser = OraConfigParser(listenerConfigFile, filter) parsedData = parser.getResultsDict() if parsedData: for listenerName in parsedData.keys(): nodeData = parsedData[listenerName] values = nodeData.get(hostNode) if values: for ipaddr in values: logger.debug('Working with possible ip: ' + ipaddr) if netutils.isValidIp(ipaddr): listenedIPs[ipaddr.strip()] = '' else: resolver = DNSResolver(self.shell, ipaddr) resolvedIP = resolver.getIPAddress() if resolvedIP: listenedIPs[resolvedIP.strip()] = '' if not self.listenerName: self.listenerName = listenerName return listenedIPs def __parseVersion(self, listenerStatusBuffer): if listenerStatusBuffer: for line in listenerStatusBuffer.split('\n'): ver = re.match('.*Version\s+([\d\.]+).*', line) if ver: return ver.group(1).strip() def getListenerStatus(self, listenerName = None): ''' Get status information for specified listener. If not specified - get all info. @command: lsnrctl status <interface name> @types: str -> str or None''' if self.envConf.getOracleHome(): cmd = self.envConf.getOracleBinDir() if cmd: cmd += "%s %s" % (ORACLE_LISTENER_STATUS, listenerName or '') buffer = self.shell.execCmd(cmd) if self.shell.getLastCmdReturnCode() == 0: return buffer else: logger.error('Failed to get listener status. Error executing %s' % cmd) else: logger.error('Failed to get listener status. Couldn\'t get path to the directory with binaries.') else: logger.error('Failed to get listener status. No ORACLE_HOME defined.') def __getIPsFromListenerStatus(self, listenerStatusBuffer): if listenerStatusBuffer: listenedIPs = re.findall(".*HOST\s*=\s*(\d+\.\d+\.\d+\.\d+).*", listenerStatusBuffer) ipdict = {} for ip in listenedIPs: ipdict[ip.strip()] = '' return ipdict return {} def getListenerName(self): return self.listenerName def getListenedIPsAsString(self): if self.listenedIPs: attrValue = '' for ip in self.listenedIPs: attrValue += ip + ';' return attrValue def getVersion(self): return self.fullListenerVersion
def DiscoveryMain(Framework): OSHVResult = ObjectStateHolderVector() shell = None protocol = Framework.getDestinationAttribute("Protocol") listenerName = Framework.getDestinationAttribute("listenerName") listenerPath = Framework.getDestinationAttribute("listener_process_path") defOraHomes = Framework.getParameter("OracleHomes") listenerIp = Framework.getDestinationAttribute("listener_ip") listenedIPs = Framework.getTriggerCIDataAsList("listened_ips") try: try: client = Framework.createClient() shell = shellutils.ShellUtils(client) if listenerPath: envConf = UnixOracleEnvConfig(shell) if shell.isWinOs(): envConf = WindowsOracleEnvConfig(shell) envConf.setOracleHomeEnvVar(listenerPath) else: envConf = EnvConfigurator(shell, defOraHomes) if not listenedIPs: Framework.reportError("No listened_ips attribute values found.") return OSHVResult lookuper = LookupManager(listenedIPs) serviceToNodesMap = {} srvDiscoverer = SrvctlBasedDiscoverer(shell, envConf) databases = srvDiscoverer.getDatabases() for database in databases: instanceAndNodes = srvDiscoverer.getInstancesWithNodes(database) if instanceAndNodes: serviceToNodesMap[database] = instanceAndNodes for elem in instanceAndNodes: resolver = DNSResolver(shell, elem.get("Node")) ipAddr = resolver.resolveNSLookup() if not ipAddr: ipAddr = resolver.resolveNSLookupAliasBased() ipAddr = ipAddr and ipAddr[0] try: if not ipAddr: ipAddr = resolver.resolveHostsFile() except: pass elem["ip"] = ipAddr for (serviceName, params) in serviceToNodesMap.items(): try: listeners = [] oracles = [] for elem in params: ipAddr = elem.get("ip") if not ipAddr: raise ValueError("One of the Node Ip is not discovered. Can not create full topology.") hostOSH = modeling.createHostOSH(ipAddr) OSHVResult.add(hostOSH) listenerOSH = createWeakListener(hostOSH) if listenerIp == ipAddr: listenerOSH.setStringAttribute("name", listenerName) listeners.append(listenerOSH) oracleOsh = modeling.createDatabaseOSH("oracle", elem["Instance"], None, ipAddr, hostOSH) listeners.append(oracleOsh) oracles.append(oracleOsh) racName = "" nodes = [x["Node"] for x in params if x["Node"]] nodes.sort() racName = ":".join(nodes) racOsh = createRacOSH(racName, len(params), serviceName, None) OSHVResult.add(racOsh) for listener in listeners: OSHVResult.add(listener) OSHVResult.add(modeling.createLinkOSH("member", racOsh, listener)) for oracle in oracles: OSHVResult.add(oracle) OSHVResult.add(modeling.createLinkOSH("member", racOsh, oracle)) except: Framework.reportWarning( 'Failed to lookup host name of the node. Probably not all nodes were discovered by "Oracle Listener by Shell" Job. No RAC CI will be created.' ) logger.warn("Failed to lookup host name for node with ip. No RAC CI will be created.") if not serviceToNodesMap: logger.warn("Failed to get information via srvctl. Will use old approach.") else: return OSHVResult # old flow tnsConfig = {} try: tnsConfig = TNSNamesConfig(shell, envConf) except: logger.debug("Failed to get tnsnames.ora. Trying different home.") envConf = EnvConfigurator(shell, defOraHomes) oraHome = envConf.findMatchingDefaultOracleHome() envConf = UnixOracleEnvConfig(shell) envConf.setOracleHomeEnvVar(oraHome) tnsConfig = TNSNamesConfig(shell, envConf) racParams = tnsConfig.getRacParams() servChec = ServiceChecker(shell, envConf, listenerName=listenerName) for racServiceName in racParams.keys(): parametersDict = racParams[racServiceName] racNodeNameList = [] racInstCount = len(parametersDict.keys()) if ( not servChec.isServiceRunning(racServiceName.upper()) or racInstCount == 0 or racInstCount != int(servChec.getServiceInstancesNumber(racServiceName)) ): Framework.reportWarning("Oracle RAC is not running or not all Instances were detected") continue racVersion = servChec.getVersion() shortVersion = servChec.getShortVersion() listeners = [] oracles = [] for ip in parametersDict.keys(): hostName = lookuper.lookupByIp(ip) or " " hostPrimIp = lookuper.getPrimaryIp(ip) actIp = ip if not hostName: Framework.reportError( 'Failed to lookup host name of the node. Probably not all nodes were discovered by "Oracle Listener by Shell" Job. No RAC CI will be created.' ) logger.error("Failed to lookup host name for node with ip %s . No RAC CI will be created." % ip) return ObjectStateHolderVector() racNodeNameList.append(hostName) dbSid = parametersDict[actIp] if hostPrimIp: actIp = hostPrimIp hostOSH = modeling.createHostOSH(actIp) OSHVResult.add(hostOSH) listenerOSH = createWeakListener(hostOSH) listeners.append(listenerOSH) oracleOSH = modeling.createDatabaseOSH( "oracle", dbSid, None, actIp, hostOSH, None, None, None, shortVersion, racVersion, shortVersion ) instanceNumber = servChec.getDbInstanceNumber(dbSid, racServiceName) if instanceNumber: oracleOSH.setAttribute("oracle_instancenumber", instanceNumber) oracles.append(oracleOSH) racNodeNameList.sort() racName = "" for nodeName in racNodeNameList: if racName == "": racName = nodeName else: racName += ":" + nodeName racOSH = createRacOSH(racName, racInstCount, racServiceName, racVersion) OSHVResult.add(racOSH) for listener in listeners: OSHVResult.add(listener) OSHVResult.add(modeling.createLinkOSH("member", racOSH, listener)) for oracle in oracles: OSHVResult.add(oracle) OSHVResult.add(modeling.createLinkOSH("member", racOSH, oracle)) finally: try: shell and shell.closeClient() except: logger.debugException("") logger.error("Unable to close shell") except: msg = logger.prepareFullStackTrace("") errormessages.resolveAndReport(msg, protocol, Framework) return OSHVResult
def DiscoveryMain(Framework): OSHVResult = ObjectStateHolderVector() shell = None protocol = Framework.getDestinationAttribute('Protocol') listenerName = Framework.getDestinationAttribute('listenerName') listenerPath = Framework.getDestinationAttribute('listener_process_path') defOraHomes = Framework.getParameter('OracleHomes') listenerIp = Framework.getDestinationAttribute('listener_ip') listenedIPs = Framework.getTriggerCIDataAsList('listened_ips') try: try: client = Framework.createClient() shell = shellutils.ShellUtils(client) if listenerPath: envConf = UnixOracleEnvConfig(shell) if shell.isWinOs(): envConf = WindowsOracleEnvConfig(shell) envConf.setOracleHomeEnvVar(listenerPath) else: envConf = EnvConfigurator(shell, defOraHomes) if not listenedIPs: Framework.reportError( 'No listened_ips attribute values found.') return OSHVResult lookuper = LookupManager(listenedIPs) serviceToNodesMap = {} srvDiscoverer = SrvctlBasedDiscoverer(shell, envConf) databases = srvDiscoverer.getDatabases() for database in databases: instanceAndNodes = srvDiscoverer.getInstancesWithNodes( database) if instanceAndNodes: serviceToNodesMap[database] = instanceAndNodes for elem in instanceAndNodes: resolver = DNSResolver(shell, elem.get('Node')) ipAddr = resolver.resolveNSLookup() if not ipAddr: ipAddr = resolver.resolveNSLookupAliasBased() ipAddr = ipAddr and ipAddr[0] try: if not ipAddr: ipAddr = resolver.resolveHostsFile() except: pass elem['ip'] = ipAddr for (serviceName, params) in serviceToNodesMap.items(): try: listeners = [] oracles = [] for elem in params: ipAddr = elem.get('ip') if not ipAddr: raise ValueError( 'One of the Node Ip is not discovered. Can not create full topology.' ) hostOSH = modeling.createHostOSH(ipAddr) OSHVResult.add(hostOSH) listenerOSH = createWeakListener(hostOSH) if listenerIp == ipAddr: listenerOSH.setStringAttribute( 'name', listenerName) listeners.append(listenerOSH) oracleOsh = modeling.createDatabaseOSH( 'oracle', elem['Instance'], None, ipAddr, hostOSH) listeners.append(oracleOsh) oracles.append(oracleOsh) racName = '' nodes = [x['Node'] for x in params if x['Node']] nodes.sort() racName = ':'.join(nodes) racOsh = createRacOSH(racName, len(params), serviceName, None) OSHVResult.add(racOsh) for listener in listeners: OSHVResult.add(listener) OSHVResult.add( modeling.createLinkOSH('member', racOsh, listener)) for oracle in oracles: OSHVResult.add(oracle) OSHVResult.add( modeling.createLinkOSH('member', racOsh, oracle)) except: Framework.reportWarning( 'Failed to lookup host name of the node. Probably not all nodes were discovered by \"Oracle Listener by Shell\" Job. No RAC CI will be created.' ) logger.warn( 'Failed to lookup host name for node with ip. No RAC CI will be created.' ) if not serviceToNodesMap: logger.warn( 'Failed to get information via srvctl. Will use old approach.' ) else: return OSHVResult #old flow tnsConfig = {} try: tnsConfig = TNSNamesConfig(shell, envConf) except: logger.debug( 'Failed to get tnsnames.ora. Trying different home.') envConf = EnvConfigurator(shell, defOraHomes) oraHome = envConf.findMatchingDefaultOracleHome() envConf = UnixOracleEnvConfig(shell) envConf.setOracleHomeEnvVar(oraHome) tnsConfig = TNSNamesConfig(shell, envConf) racParams = tnsConfig.getRacParams() servChec = ServiceChecker(shell, envConf, listenerName=listenerName) for racServiceName in racParams.keys(): parametersDict = racParams[racServiceName] racNodeNameList = [] racInstCount = len(parametersDict.keys()) if not servChec.isServiceRunning(racServiceName.upper( )) or racInstCount == 0 or racInstCount != int( servChec.getServiceInstancesNumber(racServiceName)): Framework.reportWarning( 'Oracle RAC is not running or not all Instances were detected' ) continue racVersion = servChec.getVersion() shortVersion = servChec.getShortVersion() listeners = [] oracles = [] for ip in parametersDict.keys(): hostName = lookuper.lookupByIp(ip) or ' ' hostPrimIp = lookuper.getPrimaryIp(ip) actIp = ip if not hostName: Framework.reportError( 'Failed to lookup host name of the node. Probably not all nodes were discovered by \"Oracle Listener by Shell\" Job. No RAC CI will be created.' ) logger.error( 'Failed to lookup host name for node with ip %s . No RAC CI will be created.' % ip) return ObjectStateHolderVector() racNodeNameList.append(hostName) dbSid = parametersDict[actIp] if hostPrimIp: actIp = hostPrimIp hostOSH = modeling.createHostOSH(actIp) OSHVResult.add(hostOSH) listenerOSH = createWeakListener(hostOSH) listeners.append(listenerOSH) oracleOSH = modeling.createDatabaseOSH( 'oracle', dbSid, None, actIp, hostOSH, None, None, None, shortVersion, racVersion, shortVersion) instanceNumber = servChec.getDbInstanceNumber( dbSid, racServiceName) if instanceNumber: oracleOSH.setAttribute('oracle_instancenumber', instanceNumber) oracles.append(oracleOSH) racNodeNameList.sort() racName = '' for nodeName in racNodeNameList: if racName == '': racName = nodeName else: racName += ':' + nodeName racOSH = createRacOSH(racName, racInstCount, racServiceName, racVersion) OSHVResult.add(racOSH) for listener in listeners: OSHVResult.add(listener) OSHVResult.add( modeling.createLinkOSH('member', racOSH, listener)) for oracle in oracles: OSHVResult.add(oracle) OSHVResult.add( modeling.createLinkOSH('member', racOSH, oracle)) finally: try: shell and shell.closeClient() except: logger.debugException('') logger.error('Unable to close shell') except: msg = logger.prepareFullStackTrace('') errormessages.resolveAndReport(msg, protocol, Framework) return OSHVResult