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
Exemplo n.º 2
0
 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
Exemplo n.º 4
0
    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
Exemplo n.º 5
0
 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
Exemplo n.º 6
0
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
Exemplo n.º 8
0
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