[hostcfgd] differentiate between UnitFileState and UnitFilePreset (#8169)
It can be that service is not enabled but UnitFilePreset=enabled (case for Application Extension): ``` Loaded: loaded (/lib/systemd/system/cpu-report.service; disabled; vendor preset: enabled) ``` This makes existing logic skip enabling the service. Signed-off-by: Stepan Blyschak <stepanb@nvidia.com>
This commit is contained in:
parent
a328fd24c0
commit
e362cab8ac
@ -236,23 +236,38 @@ class FeatureHandler(object):
|
|||||||
|
|
||||||
return feature_names, feature_suffixes
|
return feature_names, feature_suffixes
|
||||||
|
|
||||||
|
def get_systemd_unit_state(self, unit):
|
||||||
|
""" Returns service configuration """
|
||||||
|
|
||||||
|
cmd = "sudo systemctl show {} --property UnitFileState".format(unit)
|
||||||
|
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
|
stdout, stderr = proc.communicate()
|
||||||
|
if proc.returncode != 0:
|
||||||
|
syslog.syslog(syslog.LOG_ERR, "Failed to get status of {}: rc={} stderr={}".format(unit, proc.returncode, stderr))
|
||||||
|
return 'invalid' # same as systemd's "invalid indicates that it could not be determined whether the unit file is enabled".
|
||||||
|
|
||||||
|
props = dict([line.split("=") for line in stdout.decode().strip().splitlines()])
|
||||||
|
return props["UnitFileState"]
|
||||||
|
|
||||||
|
|
||||||
def enable_feature(self, feature):
|
def enable_feature(self, feature):
|
||||||
cmds = []
|
cmds = []
|
||||||
feature_names, feature_suffixes = self.get_feature_attribute(feature)
|
feature_names, feature_suffixes = self.get_feature_attribute(feature)
|
||||||
for feature_name in feature_names:
|
for feature_name in feature_names:
|
||||||
# Check if it is already enabled, if yes skip the system call
|
# Check if it is already enabled, if yes skip the system call
|
||||||
cmd = "sudo systemctl status {}.{} | grep Loaded".format(feature_name, feature_suffixes[-1])
|
unit_file_state = self.get_systemd_unit_state("{}.{}".format(feature_name, feature_suffixes[-1]))
|
||||||
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
if unit_file_state == "enabled":
|
||||||
(stdout, stderr) = proc.communicate()
|
|
||||||
if "enabled" in str(stdout):
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
for suffix in feature_suffixes:
|
for suffix in feature_suffixes:
|
||||||
cmds.append("sudo systemctl unmask {}.{}".format(feature_name, suffix))
|
cmds.append("sudo systemctl unmask {}.{}".format(feature_name, suffix))
|
||||||
|
|
||||||
# If feature has timer associated with it, start/enable corresponding systemd .timer unit
|
# If feature has timer associated with it, start/enable corresponding systemd .timer unit
|
||||||
# otherwise, start/enable corresponding systemd .service unit
|
# otherwise, start/enable corresponding systemd .service unit
|
||||||
|
|
||||||
cmds.append("sudo systemctl enable {}.{}".format(feature_name, feature_suffixes[-1]))
|
cmds.append("sudo systemctl enable {}.{}".format(feature_name, feature_suffixes[-1]))
|
||||||
cmds.append("sudo systemctl start {}.{}".format(feature_name, feature_suffixes[-1]))
|
cmds.append("sudo systemctl start {}.{}".format(feature_name, feature_suffixes[-1]))
|
||||||
|
|
||||||
for cmd in cmds:
|
for cmd in cmds:
|
||||||
syslog.syslog(syslog.LOG_INFO, "Running cmd: '{}'".format(cmd))
|
syslog.syslog(syslog.LOG_INFO, "Running cmd: '{}'".format(cmd))
|
||||||
try:
|
try:
|
||||||
@ -267,10 +282,8 @@ class FeatureHandler(object):
|
|||||||
feature_names, feature_suffixes = self.get_feature_attribute(feature)
|
feature_names, feature_suffixes = self.get_feature_attribute(feature)
|
||||||
for feature_name in feature_names:
|
for feature_name in feature_names:
|
||||||
# Check if it is already disabled, if yes skip the system call
|
# Check if it is already disabled, if yes skip the system call
|
||||||
cmd = "sudo systemctl status {}.{} | grep Loaded".format(feature_name, feature_suffixes[-1])
|
unit_file_state = self.get_systemd_unit_state("{}.{}".format(feature_name, feature_suffixes[-1]))
|
||||||
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
if unit_file_state in ("disabled", "masked"):
|
||||||
(stdout, stderr) = proc.communicate()
|
|
||||||
if "disabled" in str(stdout) or "masked" in str(stdout):
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
for suffix in reversed(feature_suffixes):
|
for suffix in reversed(feature_suffixes):
|
||||||
|
Reference in New Issue
Block a user