Merge pull request #19941 from bluca/condition_os_release

core: add ConditionOSRelease= directive
This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2021-06-25 09:22:50 +02:00
committed by GitHub
10 changed files with 292 additions and 9 deletions
+146
View File
@@ -23,6 +23,7 @@
#include "log.h"
#include "macro.h"
#include "nulstr-util.h"
#include "os-util.h"
#include "process-util.h"
#include "selinux-util.h"
#include "set.h"
@@ -890,6 +891,150 @@ static void test_condition_test_environment(void) {
test_condition_test_environment_one("EXISTINGENVVAR=", false);
}
static void test_condition_test_os_release(void) {
_cleanup_strv_free_ char **os_release_pairs = NULL;
_cleanup_free_ char *version_id = NULL;
const char *key_value_pair;
Condition *condition;
/* Should not happen, but it's a test so we don't know the environment. */
if (load_os_release_pairs(NULL, &os_release_pairs) < 0)
return;
if (strv_length(os_release_pairs) < 2)
return;
condition = condition_new(CONDITION_OS_RELEASE, "_THISHOPEFULLYWONTEXIST=01234 56789", false, false);
assert_se(condition);
assert_se(condition_test(condition, environ) == 0);
condition_free(condition);
condition = condition_new(CONDITION_OS_RELEASE, "WRONG FORMAT", false, false);
assert_se(condition);
assert_se(condition_test(condition, environ) == -EINVAL);
condition_free(condition);
condition = condition_new(CONDITION_OS_RELEASE, "WRONG!<>=FORMAT", false, false);
assert_se(condition);
assert_se(condition_test(condition, environ) == -EINVAL);
condition_free(condition);
condition = condition_new(CONDITION_OS_RELEASE, "WRONG FORMAT=", false, false);
assert_se(condition);
assert_se(condition_test(condition, environ) == -EINVAL);
condition_free(condition);
condition = condition_new(CONDITION_OS_RELEASE, "WRONG =FORMAT", false, false);
assert_se(condition);
assert_se(condition_test(condition, environ) == -EINVAL);
condition_free(condition);
condition = condition_new(CONDITION_OS_RELEASE, "WRONG = FORMAT", false, false);
assert_se(condition);
assert_se(condition_test(condition, environ) == -EINVAL);
condition_free(condition);
condition = condition_new(CONDITION_OS_RELEASE, "WRONGFORMAT= ", false, false);
assert_se(condition);
assert_se(condition_test(condition, environ) == -EINVAL);
condition_free(condition);
condition = condition_new(CONDITION_OS_RELEASE, "WRO NG=FORMAT", false, false);
assert_se(condition);
assert_se(condition_test(condition, environ) == -EINVAL);
condition_free(condition);
condition = condition_new(CONDITION_OS_RELEASE, "", false, false);
assert_se(condition);
assert_se(condition_test(condition, environ));
condition_free(condition);
/* load_os_release_pairs() removes quotes, we have to add them back,
* otherwise we get a string: "PRETTY_NAME=Debian GNU/Linux 10 (buster)"
* which is wrong, as the value is not quoted anymore. */
const char *quote = strchr(os_release_pairs[1], ' ') ? "\"" : "";
key_value_pair = strjoina(os_release_pairs[0], "=", quote, os_release_pairs[1], quote);
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
assert_se(condition);
assert_se(condition_test(condition, environ));
condition_free(condition);
key_value_pair = strjoina(os_release_pairs[0], "!=", quote, os_release_pairs[1], quote);
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
assert_se(condition);
assert_se(condition_test(condition, environ) == 0);
condition_free(condition);
/* Some distros (eg: Arch) do not set VERSION_ID */
if (parse_os_release(NULL, "VERSION_ID", &version_id) <= 0)
return;
key_value_pair = strjoina("VERSION_ID", "=", version_id);
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
assert_se(condition);
assert_se(condition_test(condition, environ));
condition_free(condition);
key_value_pair = strjoina("VERSION_ID", "!=", version_id);
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
assert_se(condition);
assert_se(condition_test(condition, environ) == 0);
condition_free(condition);
key_value_pair = strjoina("VERSION_ID", "<=", version_id);
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
assert_se(condition);
assert_se(condition_test(condition, environ));
condition_free(condition);
key_value_pair = strjoina("VERSION_ID", ">=", version_id);
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
assert_se(condition);
assert_se(condition_test(condition, environ));
condition_free(condition);
key_value_pair = strjoina("VERSION_ID", "<", version_id, ".1");
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
assert_se(condition);
assert_se(condition_test(condition, environ));
condition_free(condition);
key_value_pair = strjoina("VERSION_ID", ">", version_id, ".1");
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
assert_se(condition);
assert_se(condition_test(condition, environ) == 0);
condition_free(condition);
key_value_pair = strjoina("VERSION_ID", "=", version_id, " ", os_release_pairs[0], "=", quote, os_release_pairs[1], quote);
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
assert_se(condition);
assert_se(condition_test(condition, environ));
condition_free(condition);
key_value_pair = strjoina("VERSION_ID", "!=", version_id, " ", os_release_pairs[0], "=", quote, os_release_pairs[1], quote);
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
assert_se(condition);
assert_se(condition_test(condition, environ) == 0);
condition_free(condition);
key_value_pair = strjoina("VERSION_ID", "=", version_id, " ", os_release_pairs[0], "!=", quote, os_release_pairs[1], quote);
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
assert_se(condition);
assert_se(condition_test(condition, environ) == 0);
condition_free(condition);
key_value_pair = strjoina("VERSION_ID", "!=", version_id, " ", os_release_pairs[0], "!=", quote, os_release_pairs[1], quote);
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
assert_se(condition);
assert_se(condition_test(condition, environ) == 0);
condition_free(condition);
key_value_pair = strjoina("VERSION_ID", "<", version_id, ".1", " ", os_release_pairs[0], "=", quote, os_release_pairs[1], quote);
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
assert_se(condition);
assert_se(condition_test(condition, environ));
condition_free(condition);
}
int main(int argc, char *argv[]) {
test_setup_logging(LOG_DEBUG);
@@ -912,6 +1057,7 @@ int main(int argc, char *argv[]) {
#if defined(__i386__) || defined(__x86_64__)
test_condition_test_cpufeature();
#endif
test_condition_test_os_release();
return 0;
}
+52
View File
@@ -482,6 +482,58 @@ static void test_extract_first_word(void) {
assert_se(extract_first_word(&p, &t, ",", EXTRACT_UNQUOTE) > 0);
assert_se(streq(t, "context=system_u:object_r:svirt_sandbox_file_t:s0:c0,c1"));
free(t);
p = "a:b";
assert_se(extract_first_word(&p, &t, ":", EXTRACT_RETAIN_SEPARATORS) == 1);
assert_se(streq(t, "a"));
assert_se(streq(p, ":b"));
free(t);
assert_se(extract_first_word(&p, &t, ":", EXTRACT_RETAIN_SEPARATORS) == 1);
assert_se(streq(t, "b"));
free(t);
p = "a>:b";
assert_se(extract_first_word(&p, &t, ">:", EXTRACT_RETAIN_SEPARATORS) == 1);
assert_se(streq(t, "a"));
assert_se(streq(p, ">:b"));
free(t);
assert_se(extract_first_word(&p, &t, ">:", EXTRACT_RETAIN_SEPARATORS) == 1);
assert_se(streq(t, "b"));
free(t);
p = "a>:b";
assert_se(extract_first_word(&p, &t, ">:", EXTRACT_RETAIN_SEPARATORS|EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
assert_se(streq(t, "a"));
assert_se(streq(p, ">:b"));
free(t);
assert_se(extract_first_word(&p, &t, ">:", EXTRACT_RETAIN_SEPARATORS|EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
assert_se(streq(t, ""));
assert_se(streq(p, ">:b"));
free(t);
p = "a\\:b";
assert_se(extract_first_word(&p, &t, ":", EXTRACT_RETAIN_SEPARATORS|EXTRACT_RETAIN_ESCAPE) == 1);
assert_se(streq(t, "a\\"));
assert_se(streq(p, ":b"));
free(t);
p = "a\\:b";
assert_se(extract_first_word(&p, &t, ":", EXTRACT_RETAIN_SEPARATORS) == 1);
assert_se(streq(t, "a:b"));
assert_se(!p);
free(t);
p = "a\\:b";
assert_se(extract_first_word(&p, &t, ":", EXTRACT_RETAIN_SEPARATORS|EXTRACT_UNESCAPE_SEPARATORS) == 1);
assert_se(streq(t, "a:b"));
assert_se(!p);
free(t);
p = "a\\:a:b";
assert_se(extract_first_word(&p, &t, ":", EXTRACT_RETAIN_SEPARATORS|EXTRACT_UNESCAPE_SEPARATORS) == 1);
assert_se(streq(t, "a:a"));
assert_se(streq(p, ":b"));
free(t);
}
static void test_extract_first_word_and_warn(void) {