[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
|
||||
|
||||
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):
|
||||
cmds = []
|
||||
feature_names, feature_suffixes = self.get_feature_attribute(feature)
|
||||
for feature_name in feature_names:
|
||||
# Check if it is already enabled, if yes skip the system call
|
||||
cmd = "sudo systemctl status {}.{} | grep Loaded".format(feature_name, feature_suffixes[-1])
|
||||
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
(stdout, stderr) = proc.communicate()
|
||||
if "enabled" in str(stdout):
|
||||
unit_file_state = self.get_systemd_unit_state("{}.{}".format(feature_name, feature_suffixes[-1]))
|
||||
if unit_file_state == "enabled":
|
||||
continue
|
||||
|
||||
for suffix in feature_suffixes:
|
||||
cmds.append("sudo systemctl unmask {}.{}".format(feature_name, suffix))
|
||||
|
||||
# If feature has timer associated with it, start/enable corresponding systemd .timer unit
|
||||
# otherwise, start/enable corresponding systemd .service unit
|
||||
|
||||
cmds.append("sudo systemctl enable {}.{}".format(feature_name, feature_suffixes[-1]))
|
||||
cmds.append("sudo systemctl start {}.{}".format(feature_name, feature_suffixes[-1]))
|
||||
|
||||
for cmd in cmds:
|
||||
syslog.syslog(syslog.LOG_INFO, "Running cmd: '{}'".format(cmd))
|
||||
try:
|
||||
@ -267,10 +282,8 @@ class FeatureHandler(object):
|
||||
feature_names, feature_suffixes = self.get_feature_attribute(feature)
|
||||
for feature_name in feature_names:
|
||||
# Check if it is already disabled, if yes skip the system call
|
||||
cmd = "sudo systemctl status {}.{} | grep Loaded".format(feature_name, feature_suffixes[-1])
|
||||
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
(stdout, stderr) = proc.communicate()
|
||||
if "disabled" in str(stdout) or "masked" in str(stdout):
|
||||
unit_file_state = self.get_systemd_unit_state("{}.{}".format(feature_name, feature_suffixes[-1]))
|
||||
if unit_file_state in ("disabled", "masked"):
|
||||
continue
|
||||
|
||||
for suffix in reversed(feature_suffixes):
|
||||
|
Reference in New Issue
Block a user