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