in vmassist/linux/vmassist.py [0:0]
def checkService(unitName, package=False):
# take in a unit file and check status, enabled, etc.
# output object:
logger.info("Service/Unit check " + unitName)
thisSvc={"svc":unitName}
unitStat=0 # default service status return, we'll set this based on the 'systemctl status' RC
thisSvc["status"]="undef" # this will get changed somewhere
# First off, let us check if the unit even exists
try:
throwawayVal=subprocess.check_output(f"systemctl status {unitName}", shell=True)
#0 program is running or service is OK <<= default value of unitStat
#1 program is dead and /var/run pid file exists
#2 program is dead and /var/lock lock file exists
#3 program is not running
#4 program or service status is unknown
#5-99 reserved for future LSB use
#100-149 reserved for distribution use
#150-199 reserved for application use
#200-254 reserved
except subprocess.CalledProcessError as sysctlErr:
# we will be referencing this return code later, assuming it's not 4 - see table above
unitStat=sysctlErr.returncode
if ( unitStat == 4 ):
thisSvc["status"]="nonExistantService"
else:
logger.info(f"Service {unitName} status returned unexpected value: {sysctlErr.output} with text: {sysctlErr.output}")
# Unit was determined to exist (not rc=4), so lets validate the service status and maybe some other files
if ( unitStat < 4 ):
# Process the configured, active and substate for the service. Active/Sub could be inactive(dead) in an interactive console
# This can be done from systemctl show [service] --property=[UnitFileState|ActiveState|SubState]
config=subprocess.check_output(f"systemctl show {unitName} --property=UnitFileState",shell=True).decode().strip().split("=")[1]
active=subprocess.check_output(f"systemctl show {unitName} --property=ActiveState",shell=True).decode().strip().split("=")[1]
sub=subprocess.check_output(f"systemctl show {unitName} --property=SubState",shell=True).decode().strip().split("=")[1]
thisSvc["config"]=config
# make the 'status' look like the output of `systemctl status`
thisSvc["status"]=f"{active}({sub})"
# more integrety checks based on digging into the files
thisSvc["path"]=subprocess.check_output(f"systemctl show {unitName} -p FragmentPath", shell=True).decode().strip().split("=")[1]
# Which python does the service call?
# # dive into the file in 'path' and logic out what python is being called for validations
# who owns it... maybe?
if ( package ):
# We need to process the owner and path of the unit if (package) was set by the caller
logger.info(f"Checking owners for unit: {unitName} using validateBins")
# No need to re-code all this, just call validateBin(binName)
validateBin(thisSvc["path"])
thisSvc["pkg"]=bins[thisSvc["path"]]['pkg']
thisSvc["repo"]=bins[thisSvc["path"]]['repo']
# get rid of this extra entry in bins caused by calling validateBins()
del bins[thisSvc["path"]]
else:
logger.info(f"package details for {unitName} not requested, skipping")
pass
else:
#set some defaults when the unit wasn't here
pass
unitFile=subprocess.check_output(f"systemctl show {unitName} -p FragmentPath", shell=True).decode().strip().split("=")[1]
logString = unitName + " unit file found at " + thisSvc["path"] + "owned by package '" + thisSvc["pkg"] + "from repo: " + thisSvc["repo"]
logger.info(logString)
services[unitName]=thisSvc