Skip to content

Commit

Permalink
Avoid crash on wrong output of systemctl version (bsc#1229539)
Browse files Browse the repository at this point in the history
* Better handling output of systemctl --version

* Add more cases to test grains.core._systemd
  • Loading branch information
vzhestkov authored Aug 30, 2024
1 parent 4e22642 commit b2faa01
Show file tree
Hide file tree
Showing 2 changed files with 113 additions and 3 deletions.
27 changes: 24 additions & 3 deletions salt/grains/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -2432,10 +2432,31 @@ def _systemd():
"""
Return the systemd grain
"""
systemd_info = __salt__["cmd.run"]("systemctl --version").splitlines()
systemd_version = "UNDEFINED"
systemd_features = ""
try:
systemd_output = __salt__["cmd.run_all"]("systemctl --version")
except Exception: # pylint: disable=broad-except
log.error("Exception while executing `systemctl --version`", exc_info=True)
return {
"version": systemd_version,
"features": systemd_features,
}
if systemd_output.get("retcode") == 0:
systemd_info = systemd_output.get("stdout", "").splitlines()
try:
if systemd_info[0].startswith("systemd "):
systemd_version = systemd_info[0].split()[1]
systemd_features = systemd_info[1]
except IndexError:
pass
if systemd_version == "UNDEFINED" or systemd_features == "":
log.error(
"Unexpected output returned by `systemctl --version`: %s", systemd_output
)
return {
"version": systemd_info[0].split()[1],
"features": systemd_info[1],
"version": systemd_version,
"features": systemd_features,
}


Expand Down
89 changes: 89 additions & 0 deletions tests/pytests/unit/grains/test_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -3593,3 +3593,92 @@ def _mock_is_file(filename):

assert virtual_grains["virtual"] == "Nitro"
assert virtual_grains["virtual_subtype"] == "Amazon EC2"


@pytest.mark.parametrize(
"systemd_data,expected",
(
(
{
"pid": 1234,
"retcode": 0,
"stdout": "systemd 254 (254.3-1)\n+PAM +AUDIT -SELINUX -APPARMOR -IMA +SMACK "
"+SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS "
"+FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 "
"-PWQUALITY +P11KIT -QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD "
"+BPF_FRAMEWORK +XKBCOMMON +UTMP -SYSVINIT default-hierarchy=unified",
"stderr": "",
},
{
"version": "254",
"features": "+PAM +AUDIT -SELINUX -APPARMOR -IMA +SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL "
"+ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP "
"+LIBFDISK +PCRE2 -PWQUALITY +P11KIT -QRENCODE +TPM2 +BZIP2 +LZ4 +XZ "
"+ZLIB +ZSTD +BPF_FRAMEWORK +XKBCOMMON +UTMP -SYSVINIT default-hierarchy=unified",
},
),
(
{
"pid": 2345,
"retcode": 1,
"stdout": "",
"stderr": "some garbage in the output",
},
{
"version": "UNDEFINED",
"features": "",
},
),
(
{
"pid": 3456,
"retcode": 0,
"stdout": "unexpected stdout\none more line",
"stderr": "",
},
{
"version": "UNDEFINED",
"features": "",
},
),
(
{
"pid": 4567,
"retcode": 0,
"stdout": "",
"stderr": "",
},
{
"version": "UNDEFINED",
"features": "",
},
),
(
Exception("Some exception on calling `systemctl --version`"),
{
"version": "UNDEFINED",
"features": "",
},
),
),
)
def test__systemd(systemd_data, expected):
"""
test _systemd
"""

def mock_run_all_systemd(_):
if isinstance(systemd_data, Exception):
raise systemd_data
return systemd_data

with patch.dict(
core.__salt__,
{
"cmd.run_all": mock_run_all_systemd,
},
):
ret = core._systemd()
assert "version" in ret
assert "features" in ret
assert ret == expected

0 comments on commit b2faa01

Please sign in to comment.