MOON
Server: Apache
System: Linux vps.erhabenn.com.br 3.10.0-1160.119.1.el7.tuxcare.els2.x86_64 #1 SMP Mon Jul 15 12:09:18 UTC 2024 x86_64
User: sonne (1011)
PHP: 8.2.31
Disabled: NONE
Upload Files
File: //opt/microsoft/omsagent/tst/modules/high_cpu_mem/check_cpu.py
import os
import subprocess

from error_codes import *
from errors      import error_info
from helpers     import geninfo_lookup

SCRIPT_DIR = "/opt/microsoft/omsagent/tst/modules/high_cpu_mem"
SCRIPT_FILE = os.path.join(SCRIPT_DIR, 'omiHighCPUDiagnosticsTST.sh')
TST_OUTPUT_FILE = os.path.join(SCRIPT_DIR, 'tst_omiagent_trace')
OUTPUT_FILE = os.path.join(SCRIPT_DIR, 'omiagent_trace')    



def get_pkg_ver(pkg):
    version = None
    try:
        pkg_manager = geninfo_lookup('PKG_MANAGER')

        # check using rpm
        if (pkg_manager == 'rpm'):
            pkg_info = subprocess.check_output(['rpm', '-qi', pkg], universal_newlines=True,\
                            stderr=subprocess.STDOUT)
            for line in pkg_info.split('\n'):
                # parse line
                parsed_line = line.split(': ')
                if (len(parsed_line > 2)):
                    parsed_line = [parsed_line[0]] + [parsed_line[1:].join(': ')]
                # check info
                if (parsed_line[0].startswith('Name') and parsed_line[1] != pkg):
                    # wrong package
                    return None
                if (parsed_line[0].startswith('Version')):
                    version = parsed_line[1]
                    continue
                if (parsed_line[0].startswith('Release')):
                    version = version + '-' + parsed_line[1]
                    break
        
        # check using dpkg
        elif (pkg_manager == 'dpkg'):
            pkg_info = subprocess.check_output(['dpkg', '-s', pkg], universal_newlines=True,\
                            stderr=subprocess.STDOUT)
            for line in pkg_info.split('\n'):
                # parse line
                parsed_line = line.split(': ')
                if (len(parsed_line > 2)):
                    parsed_line = [parsed_line[0]] + [parsed_line[1:].join(': ')]
                # check info
                if (parsed_line[0] == 'Package' and parsed_line[1] != pkg):
                    # wrong package
                    return None
                if (parsed_line[0] == 'Version'):
                    version = parsed_line[1]
                    break

        return version
    
    # no pkg
    except subprocess.CalledProcessError:
        return None
    





def check_output_file():
    with open(TST_OUTPUT_FILE, 'r') as f:
        lines = f.readlines()
        # no threads over 80% threshold
        if (lines[0] == "No threads with high CPU utilization.\n"):
            return NO_ERROR
        # some threads over 80% threshold, check permissions
        else:
            all_root = True
            for line in lines:
                parsed_line = line.split()

                # OMS running OMI too hot
                if ((parsed_line[-1] == 'omiagent') and (parsed_line[1] == 'omsagent')):
                    nss_ver = get_pkg_ver('nss-pem')
                    if (nss_ver == None):
                        error_info.append(('nss-pem',))
                        return ERR_PKG
                    # check nss-pem version
                    if (nss_ver == '1.0.3-5.el7'):
                        return ERR_OMICPU_NSSPEM
                    else:
                        return ERR_OMICPU_NSSPEM_LIKE

            # OMI running itself too hot
            error_info.append((OUTPUT_FILE,))
            # TODO: include profile #s, distro, oms/omi versions; in some file
            return ERR_OMICPU_HOT




def check_omi_cpu():
    # Run script
    try:
        script_output = subprocess.check_output(['bash',SCRIPT_FILE,'--runtime-in-min','1',\
                            '--cpu-threshold','80'], universal_newlines=True, stderr=subprocess.STDOUT)
        script_lines = script_output.split('\n')
        for script_line in script_lines:
            if (script_line.startswith("Traces will be saved to this file: ")):
                # started running successfully
                return check_output_file()
        # script didn't start running successfully
        error_info.append((script_output,))
        return ERR_OMICPU
    # process errored out
    except subprocess.CalledProcessError as e:
        error_info.append((e.output,))
        return ERR_OMICPU