|
|
d0811f |
From 625a164069aff9efb61dcc5916c572f53c2a7ab0 Mon Sep 17 00:00:00 2001
|
|
|
d0811f |
From: Lennart Poettering <lennart@poettering.net>
|
|
|
d0811f |
Date: Thu, 20 Aug 2020 13:43:00 +0200
|
|
|
d0811f |
Subject: [PATCH 1/3] analyze: rework condition testing
|
|
|
d0811f |
|
|
|
d0811f |
Let's drop the private table and just use the generic concepts we have
|
|
|
d0811f |
in place already that make the same information available.
|
|
|
d0811f |
|
|
|
d0811f |
Fixes: #16781
|
|
|
d0811f |
---
|
|
|
d0811f |
src/analyze/analyze-condition.c | 105 +++++++++-----------------------
|
|
|
d0811f |
1 file changed, 28 insertions(+), 77 deletions(-)
|
|
|
d0811f |
|
|
|
d0811f |
diff --git a/src/analyze/analyze-condition.c b/src/analyze/analyze-condition.c
|
|
|
d0811f |
index 52ad382637f..13f75e813a2 100644
|
|
|
d0811f |
--- a/src/analyze/analyze-condition.c
|
|
|
d0811f |
+++ b/src/analyze/analyze-condition.c
|
|
|
d0811f |
@@ -8,83 +8,27 @@
|
|
|
d0811f |
#include "load-fragment.h"
|
|
|
d0811f |
#include "service.h"
|
|
|
d0811f |
|
|
|
d0811f |
-typedef struct condition_definition {
|
|
|
d0811f |
- const char *name;
|
|
|
d0811f |
- ConfigParserCallback parser;
|
|
|
d0811f |
- ConditionType type;
|
|
|
d0811f |
-} condition_definition;
|
|
|
d0811f |
-
|
|
|
d0811f |
-static const condition_definition condition_definitions[] = {
|
|
|
d0811f |
- { "ConditionPathExists", config_parse_unit_condition_path, CONDITION_PATH_EXISTS },
|
|
|
d0811f |
- { "ConditionPathExistsGlob", config_parse_unit_condition_path, CONDITION_PATH_EXISTS_GLOB },
|
|
|
d0811f |
- { "ConditionPathIsDirectory", config_parse_unit_condition_path, CONDITION_PATH_IS_DIRECTORY },
|
|
|
d0811f |
- { "ConditionPathIsSymbolicLink", config_parse_unit_condition_path, CONDITION_PATH_IS_SYMBOLIC_LINK },
|
|
|
d0811f |
- { "ConditionPathIsMountPoint", config_parse_unit_condition_path, CONDITION_PATH_IS_MOUNT_POINT },
|
|
|
d0811f |
- { "ConditionPathIsReadWrite", config_parse_unit_condition_path, CONDITION_PATH_IS_READ_WRITE },
|
|
|
d0811f |
- { "ConditionPathIsEncrypted", config_parse_unit_condition_path, CONDITION_PATH_IS_ENCRYPTED },
|
|
|
d0811f |
- { "ConditionDirectoryNotEmpty", config_parse_unit_condition_path, CONDITION_DIRECTORY_NOT_EMPTY },
|
|
|
d0811f |
- { "ConditionFileNotEmpty", config_parse_unit_condition_path, CONDITION_FILE_NOT_EMPTY },
|
|
|
d0811f |
- { "ConditionFileIsExecutable", config_parse_unit_condition_path, CONDITION_FILE_IS_EXECUTABLE },
|
|
|
d0811f |
- { "ConditionNeedsUpdate", config_parse_unit_condition_path, CONDITION_NEEDS_UPDATE },
|
|
|
d0811f |
- { "ConditionFirstBoot", config_parse_unit_condition_string, CONDITION_FIRST_BOOT },
|
|
|
d0811f |
- { "ConditionKernelCommandLine", config_parse_unit_condition_string, CONDITION_KERNEL_COMMAND_LINE },
|
|
|
d0811f |
- { "ConditionKernelVersion", config_parse_unit_condition_string, CONDITION_KERNEL_VERSION },
|
|
|
d0811f |
- { "ConditionArchitecture", config_parse_unit_condition_string, CONDITION_ARCHITECTURE },
|
|
|
d0811f |
- { "ConditionVirtualization", config_parse_unit_condition_string, CONDITION_VIRTUALIZATION },
|
|
|
d0811f |
- { "ConditionSecurity", config_parse_unit_condition_string, CONDITION_SECURITY },
|
|
|
d0811f |
- { "ConditionCapability", config_parse_unit_condition_string, CONDITION_CAPABILITY },
|
|
|
d0811f |
- { "ConditionHost", config_parse_unit_condition_string, CONDITION_HOST },
|
|
|
d0811f |
- { "ConditionACPower", config_parse_unit_condition_string, CONDITION_AC_POWER },
|
|
|
d0811f |
- { "ConditionUser", config_parse_unit_condition_string, CONDITION_USER },
|
|
|
d0811f |
- { "ConditionGroup", config_parse_unit_condition_string, CONDITION_GROUP },
|
|
|
d0811f |
- { "ConditionControlGroupController", config_parse_unit_condition_string, CONDITION_CONTROL_GROUP_CONTROLLER },
|
|
|
d0811f |
-
|
|
|
d0811f |
- { "AssertPathExists", config_parse_unit_condition_path, CONDITION_PATH_EXISTS },
|
|
|
d0811f |
- { "AssertPathExistsGlob", config_parse_unit_condition_path, CONDITION_PATH_EXISTS_GLOB },
|
|
|
d0811f |
- { "AssertPathIsDirectory", config_parse_unit_condition_path, CONDITION_PATH_IS_DIRECTORY },
|
|
|
d0811f |
- { "AssertPathIsSymbolicLink", config_parse_unit_condition_path, CONDITION_PATH_IS_SYMBOLIC_LINK },
|
|
|
d0811f |
- { "AssertPathIsMountPoint", config_parse_unit_condition_path, CONDITION_PATH_IS_MOUNT_POINT },
|
|
|
d0811f |
- { "AssertPathIsReadWrite", config_parse_unit_condition_path, CONDITION_PATH_IS_READ_WRITE },
|
|
|
d0811f |
- { "AssertPathIsEncrypted", config_parse_unit_condition_path, CONDITION_PATH_IS_ENCRYPTED },
|
|
|
d0811f |
- { "AssertDirectoryNotEmpty", config_parse_unit_condition_path, CONDITION_DIRECTORY_NOT_EMPTY },
|
|
|
d0811f |
- { "AssertFileNotEmpty", config_parse_unit_condition_path, CONDITION_FILE_NOT_EMPTY },
|
|
|
d0811f |
- { "AssertFileIsExecutable", config_parse_unit_condition_path, CONDITION_FILE_IS_EXECUTABLE },
|
|
|
d0811f |
- { "AssertNeedsUpdate", config_parse_unit_condition_path, CONDITION_NEEDS_UPDATE },
|
|
|
d0811f |
- { "AssertFirstBoot", config_parse_unit_condition_string, CONDITION_FIRST_BOOT },
|
|
|
d0811f |
- { "AssertKernelCommandLine", config_parse_unit_condition_string, CONDITION_KERNEL_COMMAND_LINE },
|
|
|
d0811f |
- { "AssertKernelVersion", config_parse_unit_condition_string, CONDITION_KERNEL_VERSION },
|
|
|
d0811f |
- { "AssertArchitecture", config_parse_unit_condition_string, CONDITION_ARCHITECTURE },
|
|
|
d0811f |
- { "AssertVirtualization", config_parse_unit_condition_string, CONDITION_VIRTUALIZATION },
|
|
|
d0811f |
- { "AssertSecurity", config_parse_unit_condition_string, CONDITION_SECURITY },
|
|
|
d0811f |
- { "AssertCapability", config_parse_unit_condition_string, CONDITION_CAPABILITY },
|
|
|
d0811f |
- { "AssertHost", config_parse_unit_condition_string, CONDITION_HOST },
|
|
|
d0811f |
- { "AssertACPower", config_parse_unit_condition_string, CONDITION_AC_POWER },
|
|
|
d0811f |
- { "AssertUser", config_parse_unit_condition_string, CONDITION_USER },
|
|
|
d0811f |
- { "AssertGroup", config_parse_unit_condition_string, CONDITION_GROUP },
|
|
|
d0811f |
- { "AssertControlGroupController", config_parse_unit_condition_string, CONDITION_CONTROL_GROUP_CONTROLLER },
|
|
|
d0811f |
-
|
|
|
d0811f |
- /* deprecated, but we should still parse them */
|
|
|
d0811f |
- { "ConditionNull", config_parse_unit_condition_null, 0 },
|
|
|
d0811f |
- { "AssertNull", config_parse_unit_condition_null, 0 },
|
|
|
d0811f |
-};
|
|
|
d0811f |
-
|
|
|
d0811f |
static int parse_condition(Unit *u, const char *line) {
|
|
|
d0811f |
- const char *p;
|
|
|
d0811f |
- Condition **target;
|
|
|
d0811f |
-
|
|
|
d0811f |
- if ((p = startswith(line, "Condition")))
|
|
|
d0811f |
- target = &u->conditions;
|
|
|
d0811f |
- else if ((p = startswith(line, "Assert")))
|
|
|
d0811f |
- target = &u->asserts;
|
|
|
d0811f |
- else
|
|
|
d0811f |
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Cannot parse \"%s\".", line);
|
|
|
d0811f |
-
|
|
|
d0811f |
- for (size_t i = 0; i < ELEMENTSOF(condition_definitions); i++) {
|
|
|
d0811f |
- const condition_definition *c = &condition_definitions[i];
|
|
|
d0811f |
-
|
|
|
d0811f |
- p = startswith(line, c->name);
|
|
|
d0811f |
- if (!p)
|
|
|
d0811f |
- continue;
|
|
|
d0811f |
+ assert(u);
|
|
|
d0811f |
+ assert(line);
|
|
|
d0811f |
+
|
|
|
d0811f |
+ for (ConditionType t = 0; t < _CONDITION_TYPE_MAX; t++) {
|
|
|
d0811f |
+ ConfigParserCallback callback;
|
|
|
d0811f |
+ Condition **target;
|
|
|
d0811f |
+ const char *p, *name;
|
|
|
d0811f |
+
|
|
|
d0811f |
+ name = condition_type_to_string(t);
|
|
|
d0811f |
+ p = startswith(line, name);
|
|
|
d0811f |
+ if (p)
|
|
|
d0811f |
+ target = &u->conditions;
|
|
|
d0811f |
+ else {
|
|
|
d0811f |
+ name = assert_type_to_string(t);
|
|
|
d0811f |
+ p = startswith(line, name);
|
|
|
d0811f |
+ if (!p)
|
|
|
d0811f |
+ continue;
|
|
|
d0811f |
+
|
|
|
d0811f |
+ target = &u->asserts;
|
|
|
d0811f |
+ }
|
|
|
d0811f |
|
|
|
d0811f |
p += strspn(p, WHITESPACE);
|
|
|
d0811f |
|
|
|
d0811f |
@@ -94,7 +38,14 @@ static int parse_condition(Unit *u, const char *line) {
|
|
|
d0811f |
|
|
|
d0811f |
p += strspn(p, WHITESPACE);
|
|
|
d0811f |
|
|
|
d0811f |
- return c->parser(NULL, "(stdin)", 0, NULL, 0, c->name, c->type, p, target, u);
|
|
|
d0811f |
+ if (t == CONDITION_NULL) /* deprecated, but we should still parse this for now */
|
|
|
d0811f |
+ callback = config_parse_unit_condition_null;
|
|
|
d0811f |
+ else if (condition_takes_path(t))
|
|
|
d0811f |
+ callback = config_parse_unit_condition_path;
|
|
|
d0811f |
+ else
|
|
|
d0811f |
+ callback = config_parse_unit_condition_string;
|
|
|
d0811f |
+
|
|
|
d0811f |
+ return callback(NULL, "(cmdline)", 0, NULL, 0, name, t, p, target, u);
|
|
|
d0811f |
}
|
|
|
d0811f |
|
|
|
d0811f |
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Cannot parse \"%s\".", line);
|
|
|
d0811f |
|
|
|
d0811f |
From 4f55a5b0bf1e68e4595120d8ac4b518654355fc3 Mon Sep 17 00:00:00 2001
|
|
|
d0811f |
From: Lennart Poettering <lennart@poettering.net>
|
|
|
d0811f |
Date: Thu, 20 Aug 2020 13:44:12 +0200
|
|
|
d0811f |
Subject: [PATCH 2/3] core: add missing conditions/asserts to unit file parsing
|
|
|
d0811f |
|
|
|
d0811f |
---
|
|
|
d0811f |
src/core/load-fragment-gperf.gperf.m4 | 24 ++++++++++++++++--------
|
|
|
d0811f |
1 file changed, 16 insertions(+), 8 deletions(-)
|
|
|
d0811f |
|
|
|
d0811f |
diff --git a/src/core/load-fragment-gperf.gperf.m4 b/src/core/load-fragment-gperf.gperf.m4
|
|
|
d0811f |
index b9e7769e4e3..1e6bd6483c2 100644
|
|
|
d0811f |
--- a/src/core/load-fragment-gperf.gperf.m4
|
|
|
d0811f |
+++ b/src/core/load-fragment-gperf.gperf.m4
|
|
|
d0811f |
@@ -272,22 +272,26 @@ Unit.ConditionPathIsDirectory, config_parse_unit_condition_path, CONDITION_P
|
|
|
d0811f |
Unit.ConditionPathIsSymbolicLink,config_parse_unit_condition_path, CONDITION_PATH_IS_SYMBOLIC_LINK,offsetof(Unit, conditions)
|
|
|
d0811f |
Unit.ConditionPathIsMountPoint, config_parse_unit_condition_path, CONDITION_PATH_IS_MOUNT_POINT, offsetof(Unit, conditions)
|
|
|
d0811f |
Unit.ConditionPathIsReadWrite, config_parse_unit_condition_path, CONDITION_PATH_IS_READ_WRITE, offsetof(Unit, conditions)
|
|
|
d0811f |
+Unit.ConditionPathIsEncrypted, config_parse_unit_condition_path, CONDITION_PATH_IS_ENCRYPTED, offsetof(Unit, conditions)
|
|
|
d0811f |
Unit.ConditionDirectoryNotEmpty, config_parse_unit_condition_path, CONDITION_DIRECTORY_NOT_EMPTY, offsetof(Unit, conditions)
|
|
|
d0811f |
Unit.ConditionFileNotEmpty, config_parse_unit_condition_path, CONDITION_FILE_NOT_EMPTY, offsetof(Unit, conditions)
|
|
|
d0811f |
Unit.ConditionFileIsExecutable, config_parse_unit_condition_path, CONDITION_FILE_IS_EXECUTABLE, offsetof(Unit, conditions)
|
|
|
d0811f |
Unit.ConditionNeedsUpdate, config_parse_unit_condition_path, CONDITION_NEEDS_UPDATE, offsetof(Unit, conditions)
|
|
|
d0811f |
Unit.ConditionFirstBoot, config_parse_unit_condition_string, CONDITION_FIRST_BOOT, offsetof(Unit, conditions)
|
|
|
d0811f |
-Unit.ConditionKernelCommandLine, config_parse_unit_condition_string, CONDITION_KERNEL_COMMAND_LINE, offsetof(Unit, conditions)
|
|
|
d0811f |
-Unit.ConditionKernelVersion, config_parse_unit_condition_string, CONDITION_KERNEL_VERSION, offsetof(Unit, conditions)
|
|
|
d0811f |
Unit.ConditionArchitecture, config_parse_unit_condition_string, CONDITION_ARCHITECTURE, offsetof(Unit, conditions)
|
|
|
d0811f |
Unit.ConditionVirtualization, config_parse_unit_condition_string, CONDITION_VIRTUALIZATION, offsetof(Unit, conditions)
|
|
|
d0811f |
+Unit.ConditionHost, config_parse_unit_condition_string, CONDITION_HOST, offsetof(Unit, conditions)
|
|
|
d0811f |
+Unit.ConditionKernelCommandLine, config_parse_unit_condition_string, CONDITION_KERNEL_COMMAND_LINE, offsetof(Unit, conditions)
|
|
|
d0811f |
+Unit.ConditionKernelVersion, config_parse_unit_condition_string, CONDITION_KERNEL_VERSION, offsetof(Unit, conditions)
|
|
|
d0811f |
Unit.ConditionSecurity, config_parse_unit_condition_string, CONDITION_SECURITY, offsetof(Unit, conditions)
|
|
|
d0811f |
Unit.ConditionCapability, config_parse_unit_condition_string, CONDITION_CAPABILITY, offsetof(Unit, conditions)
|
|
|
d0811f |
-Unit.ConditionHost, config_parse_unit_condition_string, CONDITION_HOST, offsetof(Unit, conditions)
|
|
|
d0811f |
Unit.ConditionACPower, config_parse_unit_condition_string, CONDITION_AC_POWER, offsetof(Unit, conditions)
|
|
|
d0811f |
+Unit.ConditionMemory, config_parse_unit_condition_string, CONDITION_MEMORY, offsetof(Unit, conditions)
|
|
|
d0811f |
+Unit.ConditionCPUs, config_parse_unit_condition_string, CONDITION_CPUS, offsetof(Unit, conditions)
|
|
|
d0811f |
+Unit.ConditionEnvironment, config_parse_unit_condition_string, CONDITION_ENVIRONMENT, offsetof(Unit, conditions)
|
|
|
d0811f |
Unit.ConditionUser, config_parse_unit_condition_string, CONDITION_USER, offsetof(Unit, conditions)
|
|
|
d0811f |
Unit.ConditionGroup, config_parse_unit_condition_string, CONDITION_GROUP, offsetof(Unit, conditions)
|
|
|
d0811f |
-Unit.ConditionControlGroupController, config_parse_unit_condition_string, CONDITION_CONTROL_GROUP_CONTROLLER, offsetof(Unit, conditions)
|
|
|
d0811f |
+Unit.ConditionControlGroupController, config_parse_unit_condition_string, CONDITION_CONTROL_GROUP_CONTROLLER, offsetof(Unit, conditions)
|
|
|
d0811f |
Unit.ConditionNull, config_parse_unit_condition_null, 0, offsetof(Unit, conditions)
|
|
|
d0811f |
Unit.AssertPathExists, config_parse_unit_condition_path, CONDITION_PATH_EXISTS, offsetof(Unit, asserts)
|
|
|
d0811f |
Unit.AssertPathExistsGlob, config_parse_unit_condition_path, CONDITION_PATH_EXISTS_GLOB, offsetof(Unit, asserts)
|
|
|
d0811f |
@@ -295,22 +299,26 @@ Unit.AssertPathIsDirectory, config_parse_unit_condition_path, CONDITION_P
|
|
|
d0811f |
Unit.AssertPathIsSymbolicLink, config_parse_unit_condition_path, CONDITION_PATH_IS_SYMBOLIC_LINK,offsetof(Unit, asserts)
|
|
|
d0811f |
Unit.AssertPathIsMountPoint, config_parse_unit_condition_path, CONDITION_PATH_IS_MOUNT_POINT, offsetof(Unit, asserts)
|
|
|
d0811f |
Unit.AssertPathIsReadWrite, config_parse_unit_condition_path, CONDITION_PATH_IS_READ_WRITE, offsetof(Unit, asserts)
|
|
|
d0811f |
+Unit.AssertPathIsEncrypted, config_parse_unit_condition_path, CONDITION_PATH_IS_ENCRYPTED, offsetof(Unit, asserts)
|
|
|
d0811f |
Unit.AssertDirectoryNotEmpty, config_parse_unit_condition_path, CONDITION_DIRECTORY_NOT_EMPTY, offsetof(Unit, asserts)
|
|
|
d0811f |
Unit.AssertFileNotEmpty, config_parse_unit_condition_path, CONDITION_FILE_NOT_EMPTY, offsetof(Unit, asserts)
|
|
|
d0811f |
Unit.AssertFileIsExecutable, config_parse_unit_condition_path, CONDITION_FILE_IS_EXECUTABLE, offsetof(Unit, asserts)
|
|
|
d0811f |
Unit.AssertNeedsUpdate, config_parse_unit_condition_path, CONDITION_NEEDS_UPDATE, offsetof(Unit, asserts)
|
|
|
d0811f |
Unit.AssertFirstBoot, config_parse_unit_condition_string, CONDITION_FIRST_BOOT, offsetof(Unit, asserts)
|
|
|
d0811f |
-Unit.AssertKernelCommandLine, config_parse_unit_condition_string, CONDITION_KERNEL_COMMAND_LINE, offsetof(Unit, asserts)
|
|
|
d0811f |
-Unit.AssertKernelVersion, config_parse_unit_condition_string, CONDITION_KERNEL_VERSION, offsetof(Unit, asserts)
|
|
|
d0811f |
Unit.AssertArchitecture, config_parse_unit_condition_string, CONDITION_ARCHITECTURE, offsetof(Unit, asserts)
|
|
|
d0811f |
Unit.AssertVirtualization, config_parse_unit_condition_string, CONDITION_VIRTUALIZATION, offsetof(Unit, asserts)
|
|
|
d0811f |
+Unit.AssertHost, config_parse_unit_condition_string, CONDITION_HOST, offsetof(Unit, asserts)
|
|
|
d0811f |
+Unit.AssertKernelCommandLine, config_parse_unit_condition_string, CONDITION_KERNEL_COMMAND_LINE, offsetof(Unit, asserts)
|
|
|
d0811f |
+Unit.AssertKernelVersion, config_parse_unit_condition_string, CONDITION_KERNEL_VERSION, offsetof(Unit, asserts)
|
|
|
d0811f |
Unit.AssertSecurity, config_parse_unit_condition_string, CONDITION_SECURITY, offsetof(Unit, asserts)
|
|
|
d0811f |
Unit.AssertCapability, config_parse_unit_condition_string, CONDITION_CAPABILITY, offsetof(Unit, asserts)
|
|
|
d0811f |
-Unit.AssertHost, config_parse_unit_condition_string, CONDITION_HOST, offsetof(Unit, asserts)
|
|
|
d0811f |
Unit.AssertACPower, config_parse_unit_condition_string, CONDITION_AC_POWER, offsetof(Unit, asserts)
|
|
|
d0811f |
+Unit.AssertMemory, config_parse_unit_condition_string, CONDITION_MEMORY, offsetof(Unit, asserts)
|
|
|
d0811f |
+Unit.AssertCPUs, config_parse_unit_condition_string, CONDITION_CPUS, offsetof(Unit, asserts)
|
|
|
d0811f |
+Unit.AssertEnvironment, config_parse_unit_condition_string, CONDITION_ENVIRONMENT, offsetof(Unit, asserts)
|
|
|
d0811f |
Unit.AssertUser, config_parse_unit_condition_string, CONDITION_USER, offsetof(Unit, asserts)
|
|
|
d0811f |
Unit.AssertGroup, config_parse_unit_condition_string, CONDITION_GROUP, offsetof(Unit, asserts)
|
|
|
d0811f |
-Unit.AssertControlGroupController, config_parse_unit_condition_string, CONDITION_CONTROL_GROUP_CONTROLLER, offsetof(Unit, asserts)
|
|
|
d0811f |
+Unit.AssertControlGroupController, config_parse_unit_condition_string, CONDITION_CONTROL_GROUP_CONTROLLER, offsetof(Unit, asserts)
|
|
|
d0811f |
Unit.AssertNull, config_parse_unit_condition_null, 0, offsetof(Unit, asserts)
|
|
|
d0811f |
Unit.CollectMode, config_parse_collect_mode, 0, offsetof(Unit, collect_mode)
|
|
|
d0811f |
m4_dnl
|
|
|
d0811f |
|
|
|
d0811f |
From 476cfe626dac41bb9879116c701333caa2ccec24 Mon Sep 17 00:00:00 2001
|
|
|
d0811f |
From: Lennart Poettering <lennart@poettering.net>
|
|
|
d0811f |
Date: Thu, 20 Aug 2020 14:01:25 +0200
|
|
|
d0811f |
Subject: [PATCH 3/3] core: remove support for ConditionNull=
|
|
|
d0811f |
|
|
|
d0811f |
The concept is flawed, and mostly useless. Let's finally remove it.
|
|
|
d0811f |
|
|
|
d0811f |
It has been deprecated since 90a2ec10f2d43a8530aae856013518eb567c4039 (6
|
|
|
d0811f |
years ago) and we started to warn since
|
|
|
d0811f |
55dadc5c57ef1379dbc984938d124508a454be55 (1.5 years ago).
|
|
|
d0811f |
|
|
|
d0811f |
Let's get rid of it altogether.
|
|
|
d0811f |
---
|
|
|
d0811f |
man/systemd.unit.xml | 3 -
|
|
|
d0811f |
src/analyze/analyze-condition.c | 4 +-
|
|
|
d0811f |
src/core/dbus-unit.c | 22 +++-----
|
|
|
d0811f |
src/core/load-fragment-gperf.gperf.m4 | 2 -
|
|
|
d0811f |
src/core/load-fragment.c | 55 -------------------
|
|
|
d0811f |
src/core/load-fragment.h | 1 -
|
|
|
d0811f |
src/shared/condition.c | 21 +------
|
|
|
d0811f |
src/shared/condition.h | 2 -
|
|
|
d0811f |
src/test/test-condition.c | 15 -----
|
|
|
d0811f |
.../fuzz-unit-file/systemd-machined.service | 3 -
|
|
|
d0811f |
10 files changed, 11 insertions(+), 117 deletions(-)
|
|
|
d0811f |
|
|
|
d0811f |
diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml
|
|
|
d0811f |
index 7ef6080237e..50f35aaa3cc 100644
|
|
|
d0811f |
--- a/man/systemd.unit.xml
|
|
|
d0811f |
+++ b/man/systemd.unit.xml
|
|
|
d0811f |
@@ -1092,9 +1092,6 @@
|
|
|
d0811f |
<para>Except for <varname>ConditionPathIsSymbolicLink=</varname>, all path checks follow symlinks.</para>
|
|
|
d0811f |
|
|
|
d0811f |
<variablelist class='unit-directives'>
|
|
|
d0811f |
-
|
|
|
d0811f |
- confusing. -->
|
|
|
d0811f |
-
|
|
|
d0811f |
<varlistentry>
|
|
|
d0811f |
<term><varname>ConditionArchitecture=</varname></term>
|
|
|
d0811f |
|
|
|
d0811f |
diff --git a/src/analyze/analyze-condition.c b/src/analyze/analyze-condition.c
|
|
|
d0811f |
index 13f75e813a2..e1365e18056 100644
|
|
|
d0811f |
--- a/src/analyze/analyze-condition.c
|
|
|
d0811f |
+++ b/src/analyze/analyze-condition.c
|
|
|
d0811f |
@@ -38,9 +38,7 @@ static int parse_condition(Unit *u, const char *line) {
|
|
|
d0811f |
|
|
|
d0811f |
p += strspn(p, WHITESPACE);
|
|
|
d0811f |
|
|
|
d0811f |
- if (t == CONDITION_NULL) /* deprecated, but we should still parse this for now */
|
|
|
d0811f |
- callback = config_parse_unit_condition_null;
|
|
|
d0811f |
- else if (condition_takes_path(t))
|
|
|
d0811f |
+ if (condition_takes_path(t))
|
|
|
d0811f |
callback = config_parse_unit_condition_path;
|
|
|
d0811f |
else
|
|
|
d0811f |
callback = config_parse_unit_condition_string;
|
|
|
d0811f |
diff --git a/src/core/dbus-unit.c b/src/core/dbus-unit.c
|
|
|
d0811f |
index 9e9d3b101e5..e799771c220 100644
|
|
|
d0811f |
--- a/src/core/dbus-unit.c
|
|
|
d0811f |
+++ b/src/core/dbus-unit.c
|
|
|
d0811f |
@@ -1974,14 +1974,11 @@ static int bus_set_transient_conditions(
|
|
|
d0811f |
if (t < 0)
|
|
|
d0811f |
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid condition type: %s", type_name);
|
|
|
d0811f |
|
|
|
d0811f |
- if (t != CONDITION_NULL) {
|
|
|
d0811f |
- if (isempty(param))
|
|
|
d0811f |
- return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Condition parameter in %s is empty", type_name);
|
|
|
d0811f |
+ if (isempty(param))
|
|
|
d0811f |
+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Condition parameter in %s is empty", type_name);
|
|
|
d0811f |
|
|
|
d0811f |
- if (condition_takes_path(t) && !path_is_absolute(param))
|
|
|
d0811f |
- return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Path in condition %s is not absolute: %s", type_name, param);
|
|
|
d0811f |
- } else
|
|
|
d0811f |
- param = NULL;
|
|
|
d0811f |
+ if (condition_takes_path(t) && !path_is_absolute(param))
|
|
|
d0811f |
+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Path in condition %s is not absolute: %s", type_name, param);
|
|
|
d0811f |
|
|
|
d0811f |
if (!UNIT_WRITE_FLAGS_NOOP(flags)) {
|
|
|
d0811f |
Condition *c;
|
|
|
d0811f |
@@ -1992,14 +1989,9 @@ static int bus_set_transient_conditions(
|
|
|
d0811f |
|
|
|
d0811f |
LIST_PREPEND(conditions, *list, c);
|
|
|
d0811f |
|
|
|
d0811f |
- if (t != CONDITION_NULL)
|
|
|
d0811f |
- unit_write_settingf(u, flags|UNIT_ESCAPE_SPECIFIERS, name,
|
|
|
d0811f |
- "%s=%s%s%s", type_name,
|
|
|
d0811f |
- trigger ? "|" : "", negate ? "!" : "", param);
|
|
|
d0811f |
- else
|
|
|
d0811f |
- unit_write_settingf(u, flags, name,
|
|
|
d0811f |
- "%s=%s%s", type_name,
|
|
|
d0811f |
- trigger ? "|" : "", yes_no(!negate));
|
|
|
d0811f |
+ unit_write_settingf(u, flags|UNIT_ESCAPE_SPECIFIERS, name,
|
|
|
d0811f |
+ "%s=%s%s%s", type_name,
|
|
|
d0811f |
+ trigger ? "|" : "", negate ? "!" : "", param);
|
|
|
d0811f |
}
|
|
|
d0811f |
|
|
|
d0811f |
empty = false;
|
|
|
d0811f |
diff --git a/src/core/load-fragment-gperf.gperf.m4 b/src/core/load-fragment-gperf.gperf.m4
|
|
|
d0811f |
index 1e6bd6483c2..a191de62af3 100644
|
|
|
d0811f |
--- a/src/core/load-fragment-gperf.gperf.m4
|
|
|
d0811f |
+++ b/src/core/load-fragment-gperf.gperf.m4
|
|
|
d0811f |
@@ -292,7 +292,6 @@ Unit.ConditionEnvironment, config_parse_unit_condition_string, CONDITION_E
|
|
|
d0811f |
Unit.ConditionUser, config_parse_unit_condition_string, CONDITION_USER, offsetof(Unit, conditions)
|
|
|
d0811f |
Unit.ConditionGroup, config_parse_unit_condition_string, CONDITION_GROUP, offsetof(Unit, conditions)
|
|
|
d0811f |
Unit.ConditionControlGroupController, config_parse_unit_condition_string, CONDITION_CONTROL_GROUP_CONTROLLER, offsetof(Unit, conditions)
|
|
|
d0811f |
-Unit.ConditionNull, config_parse_unit_condition_null, 0, offsetof(Unit, conditions)
|
|
|
d0811f |
Unit.AssertPathExists, config_parse_unit_condition_path, CONDITION_PATH_EXISTS, offsetof(Unit, asserts)
|
|
|
d0811f |
Unit.AssertPathExistsGlob, config_parse_unit_condition_path, CONDITION_PATH_EXISTS_GLOB, offsetof(Unit, asserts)
|
|
|
d0811f |
Unit.AssertPathIsDirectory, config_parse_unit_condition_path, CONDITION_PATH_IS_DIRECTORY, offsetof(Unit, asserts)
|
|
|
d0811f |
@@ -319,7 +318,6 @@ Unit.AssertEnvironment, config_parse_unit_condition_string, CONDITION_E
|
|
|
d0811f |
Unit.AssertUser, config_parse_unit_condition_string, CONDITION_USER, offsetof(Unit, asserts)
|
|
|
d0811f |
Unit.AssertGroup, config_parse_unit_condition_string, CONDITION_GROUP, offsetof(Unit, asserts)
|
|
|
d0811f |
Unit.AssertControlGroupController, config_parse_unit_condition_string, CONDITION_CONTROL_GROUP_CONTROLLER, offsetof(Unit, asserts)
|
|
|
d0811f |
-Unit.AssertNull, config_parse_unit_condition_null, 0, offsetof(Unit, asserts)
|
|
|
d0811f |
Unit.CollectMode, config_parse_collect_mode, 0, offsetof(Unit, collect_mode)
|
|
|
d0811f |
m4_dnl
|
|
|
d0811f |
Service.PIDFile, config_parse_pid_file, 0, offsetof(Service, pid_file)
|
|
|
d0811f |
diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
|
|
|
d0811f |
index 266382c84c7..cfd04f3b49f 100644
|
|
|
d0811f |
--- a/src/core/load-fragment.c
|
|
|
d0811f |
+++ b/src/core/load-fragment.c
|
|
|
d0811f |
@@ -2999,60 +2999,6 @@ int config_parse_unit_condition_string(
|
|
|
d0811f |
return 0;
|
|
|
d0811f |
}
|
|
|
d0811f |
|
|
|
d0811f |
-int config_parse_unit_condition_null(
|
|
|
d0811f |
- const char *unit,
|
|
|
d0811f |
- const char *filename,
|
|
|
d0811f |
- unsigned line,
|
|
|
d0811f |
- const char *section,
|
|
|
d0811f |
- unsigned section_line,
|
|
|
d0811f |
- const char *lvalue,
|
|
|
d0811f |
- int ltype,
|
|
|
d0811f |
- const char *rvalue,
|
|
|
d0811f |
- void *data,
|
|
|
d0811f |
- void *userdata) {
|
|
|
d0811f |
-
|
|
|
d0811f |
- Condition **list = data, *c;
|
|
|
d0811f |
- bool trigger, negate;
|
|
|
d0811f |
- int b;
|
|
|
d0811f |
-
|
|
|
d0811f |
- assert(filename);
|
|
|
d0811f |
- assert(lvalue);
|
|
|
d0811f |
- assert(rvalue);
|
|
|
d0811f |
- assert(data);
|
|
|
d0811f |
-
|
|
|
d0811f |
- log_syntax(unit, LOG_WARNING, filename, line, 0, "%s= is deprecated, please do not use.", lvalue);
|
|
|
d0811f |
-
|
|
|
d0811f |
- if (isempty(rvalue)) {
|
|
|
d0811f |
- /* Empty assignment resets the list */
|
|
|
d0811f |
- *list = condition_free_list(*list);
|
|
|
d0811f |
- return 0;
|
|
|
d0811f |
- }
|
|
|
d0811f |
-
|
|
|
d0811f |
- trigger = rvalue[0] == '|';
|
|
|
d0811f |
- if (trigger)
|
|
|
d0811f |
- rvalue++;
|
|
|
d0811f |
-
|
|
|
d0811f |
- negate = rvalue[0] == '!';
|
|
|
d0811f |
- if (negate)
|
|
|
d0811f |
- rvalue++;
|
|
|
d0811f |
-
|
|
|
d0811f |
- b = parse_boolean(rvalue);
|
|
|
d0811f |
- if (b < 0) {
|
|
|
d0811f |
- log_syntax(unit, LOG_ERR, filename, line, b, "Failed to parse boolean value in condition, ignoring: %s", rvalue);
|
|
|
d0811f |
- return 0;
|
|
|
d0811f |
- }
|
|
|
d0811f |
-
|
|
|
d0811f |
- if (!b)
|
|
|
d0811f |
- negate = !negate;
|
|
|
d0811f |
-
|
|
|
d0811f |
- c = condition_new(CONDITION_NULL, NULL, trigger, negate);
|
|
|
d0811f |
- if (!c)
|
|
|
d0811f |
- return log_oom();
|
|
|
d0811f |
-
|
|
|
d0811f |
- LIST_PREPEND(conditions, *list, c);
|
|
|
d0811f |
- return 0;
|
|
|
d0811f |
-}
|
|
|
d0811f |
-
|
|
|
d0811f |
int config_parse_unit_requires_mounts_for(
|
|
|
d0811f |
const char *unit,
|
|
|
d0811f |
const char *filename,
|
|
|
d0811f |
@@ -5266,7 +5212,6 @@ void unit_dump_config_items(FILE *f) {
|
|
|
d0811f |
{ config_parse_ip_tos, "TOS" },
|
|
|
d0811f |
{ config_parse_unit_condition_path, "CONDITION" },
|
|
|
d0811f |
{ config_parse_unit_condition_string, "CONDITION" },
|
|
|
d0811f |
- { config_parse_unit_condition_null, "CONDITION" },
|
|
|
d0811f |
{ config_parse_unit_slice, "SLICE" },
|
|
|
d0811f |
{ config_parse_documentation, "URL" },
|
|
|
d0811f |
{ config_parse_service_timeout, "SECONDS" },
|
|
|
d0811f |
diff --git a/src/core/load-fragment.h b/src/core/load-fragment.h
|
|
|
d0811f |
index 2672db5ace2..cee5717d0fb 100644
|
|
|
d0811f |
--- a/src/core/load-fragment.h
|
|
|
d0811f |
+++ b/src/core/load-fragment.h
|
|
|
d0811f |
@@ -58,7 +58,6 @@ CONFIG_PARSER_PROTOTYPE(config_parse_unit_env_file);
|
|
|
d0811f |
CONFIG_PARSER_PROTOTYPE(config_parse_ip_tos);
|
|
|
d0811f |
CONFIG_PARSER_PROTOTYPE(config_parse_unit_condition_path);
|
|
|
d0811f |
CONFIG_PARSER_PROTOTYPE(config_parse_unit_condition_string);
|
|
|
d0811f |
-CONFIG_PARSER_PROTOTYPE(config_parse_unit_condition_null);
|
|
|
d0811f |
CONFIG_PARSER_PROTOTYPE(config_parse_kill_mode);
|
|
|
d0811f |
CONFIG_PARSER_PROTOTYPE(config_parse_notify_access);
|
|
|
d0811f |
CONFIG_PARSER_PROTOTYPE(config_parse_emergency_action);
|
|
|
d0811f |
diff --git a/src/shared/condition.c b/src/shared/condition.c
|
|
|
d0811f |
index bf3b5fa1622..1f6105622a5 100644
|
|
|
d0811f |
--- a/src/shared/condition.c
|
|
|
d0811f |
+++ b/src/shared/condition.c
|
|
|
d0811f |
@@ -52,7 +52,7 @@ Condition* condition_new(ConditionType type, const char *parameter, bool trigger
|
|
|
d0811f |
|
|
|
d0811f |
assert(type >= 0);
|
|
|
d0811f |
assert(type < _CONDITION_TYPE_MAX);
|
|
|
d0811f |
- assert((!parameter) == (type == CONDITION_NULL));
|
|
|
d0811f |
+ assert(parameter);
|
|
|
d0811f |
|
|
|
d0811f |
c = new(Condition, 1);
|
|
|
d0811f |
if (!c)
|
|
|
d0811f |
@@ -776,15 +776,6 @@ static int condition_test_file_is_executable(Condition *c, char **env) {
|
|
|
d0811f |
(st.st_mode & 0111));
|
|
|
d0811f |
}
|
|
|
d0811f |
|
|
|
d0811f |
-static int condition_test_null(Condition *c, char **env) {
|
|
|
d0811f |
- assert(c);
|
|
|
d0811f |
- assert(c->type == CONDITION_NULL);
|
|
|
d0811f |
-
|
|
|
d0811f |
- /* Note that during parsing we already evaluate the string and
|
|
|
d0811f |
- * store it in c->negate */
|
|
|
d0811f |
- return true;
|
|
|
d0811f |
-}
|
|
|
d0811f |
-
|
|
|
d0811f |
int condition_test(Condition *c, char **env) {
|
|
|
d0811f |
|
|
|
d0811f |
static int (*const condition_tests[_CONDITION_TYPE_MAX])(Condition *c, char **env) = {
|
|
|
d0811f |
@@ -811,7 +802,6 @@ int condition_test(Condition *c, char **env) {
|
|
|
d0811f |
[CONDITION_USER] = condition_test_user,
|
|
|
d0811f |
[CONDITION_GROUP] = condition_test_group,
|
|
|
d0811f |
[CONDITION_CONTROL_GROUP_CONTROLLER] = condition_test_control_group_controller,
|
|
|
d0811f |
- [CONDITION_NULL] = condition_test_null,
|
|
|
d0811f |
[CONDITION_CPUS] = condition_test_cpus,
|
|
|
d0811f |
[CONDITION_MEMORY] = condition_test_memory,
|
|
|
d0811f |
[CONDITION_ENVIRONMENT] = condition_test_environment,
|
|
|
d0811f |
@@ -859,23 +849,20 @@ bool condition_test_list(
|
|
|
d0811f |
r = condition_test(c, env);
|
|
|
d0811f |
|
|
|
d0811f |
if (logger) {
|
|
|
d0811f |
- const char *p = c->type == CONDITION_NULL ? "true" : c->parameter;
|
|
|
d0811f |
- assert(p);
|
|
|
d0811f |
-
|
|
|
d0811f |
if (r < 0)
|
|
|
d0811f |
logger(userdata, LOG_WARNING, r, PROJECT_FILE, __LINE__, __func__,
|
|
|
d0811f |
"Couldn't determine result for %s=%s%s%s, assuming failed: %m",
|
|
|
d0811f |
to_string(c->type),
|
|
|
d0811f |
c->trigger ? "|" : "",
|
|
|
d0811f |
c->negate ? "!" : "",
|
|
|
d0811f |
- p);
|
|
|
d0811f |
+ c->parameter);
|
|
|
d0811f |
else
|
|
|
d0811f |
logger(userdata, LOG_DEBUG, 0, PROJECT_FILE, __LINE__, __func__,
|
|
|
d0811f |
"%s=%s%s%s %s.",
|
|
|
d0811f |
to_string(c->type),
|
|
|
d0811f |
c->trigger ? "|" : "",
|
|
|
d0811f |
c->negate ? "!" : "",
|
|
|
d0811f |
- p,
|
|
|
d0811f |
+ c->parameter,
|
|
|
d0811f |
condition_result_to_string(c->result));
|
|
|
d0811f |
}
|
|
|
d0811f |
|
|
|
d0811f |
@@ -937,7 +924,6 @@ static const char* const condition_type_table[_CONDITION_TYPE_MAX] = {
|
|
|
d0811f |
[CONDITION_USER] = "ConditionUser",
|
|
|
d0811f |
[CONDITION_GROUP] = "ConditionGroup",
|
|
|
d0811f |
[CONDITION_CONTROL_GROUP_CONTROLLER] = "ConditionControlGroupController",
|
|
|
d0811f |
- [CONDITION_NULL] = "ConditionNull",
|
|
|
d0811f |
[CONDITION_CPUS] = "ConditionCPUs",
|
|
|
d0811f |
[CONDITION_MEMORY] = "ConditionMemory",
|
|
|
d0811f |
[CONDITION_ENVIRONMENT] = "ConditionEnvironment",
|
|
|
d0811f |
@@ -969,7 +955,6 @@ static const char* const assert_type_table[_CONDITION_TYPE_MAX] = {
|
|
|
d0811f |
[CONDITION_USER] = "AssertUser",
|
|
|
d0811f |
[CONDITION_GROUP] = "AssertGroup",
|
|
|
d0811f |
[CONDITION_CONTROL_GROUP_CONTROLLER] = "AssertControlGroupController",
|
|
|
d0811f |
- [CONDITION_NULL] = "AssertNull",
|
|
|
d0811f |
[CONDITION_CPUS] = "AssertCPUs",
|
|
|
d0811f |
[CONDITION_MEMORY] = "AssertMemory",
|
|
|
d0811f |
[CONDITION_ENVIRONMENT] = "AssertEnvironment",
|
|
|
d0811f |
diff --git a/src/shared/condition.h b/src/shared/condition.h
|
|
|
d0811f |
index fea74d228d8..e5ad43f945b 100644
|
|
|
d0811f |
--- a/src/shared/condition.h
|
|
|
d0811f |
+++ b/src/shared/condition.h
|
|
|
d0811f |
@@ -34,8 +34,6 @@ typedef enum ConditionType {
|
|
|
d0811f |
CONDITION_FILE_NOT_EMPTY,
|
|
|
d0811f |
CONDITION_FILE_IS_EXECUTABLE,
|
|
|
d0811f |
|
|
|
d0811f |
- CONDITION_NULL,
|
|
|
d0811f |
-
|
|
|
d0811f |
CONDITION_USER,
|
|
|
d0811f |
CONDITION_GROUP,
|
|
|
d0811f |
|
|
|
d0811f |
diff --git a/src/test/test-condition.c b/src/test/test-condition.c
|
|
|
d0811f |
index ddf2e669c03..d209c1304c8 100644
|
|
|
d0811f |
--- a/src/test/test-condition.c
|
|
|
d0811f |
+++ b/src/test/test-condition.c
|
|
|
d0811f |
@@ -438,20 +438,6 @@ static void test_condition_test_kernel_version(void) {
|
|
|
d0811f |
condition_free(condition);
|
|
|
d0811f |
}
|
|
|
d0811f |
|
|
|
d0811f |
-static void test_condition_test_null(void) {
|
|
|
d0811f |
- Condition *condition;
|
|
|
d0811f |
-
|
|
|
d0811f |
- condition = condition_new(CONDITION_NULL, NULL, false, false);
|
|
|
d0811f |
- assert_se(condition);
|
|
|
d0811f |
- assert_se(condition_test(condition, environ) > 0);
|
|
|
d0811f |
- condition_free(condition);
|
|
|
d0811f |
-
|
|
|
d0811f |
- condition = condition_new(CONDITION_NULL, NULL, false, true);
|
|
|
d0811f |
- assert_se(condition);
|
|
|
d0811f |
- assert_se(condition_test(condition, environ) == 0);
|
|
|
d0811f |
- condition_free(condition);
|
|
|
d0811f |
-}
|
|
|
d0811f |
-
|
|
|
d0811f |
static void test_condition_test_security(void) {
|
|
|
d0811f |
Condition *condition;
|
|
|
d0811f |
|
|
|
d0811f |
@@ -868,7 +854,6 @@ int main(int argc, char *argv[]) {
|
|
|
d0811f |
test_condition_test_architecture();
|
|
|
d0811f |
test_condition_test_kernel_command_line();
|
|
|
d0811f |
test_condition_test_kernel_version();
|
|
|
d0811f |
- test_condition_test_null();
|
|
|
d0811f |
test_condition_test_security();
|
|
|
d0811f |
print_securities();
|
|
|
d0811f |
test_condition_test_virtualization();
|
|
|
d0811f |
diff --git a/test/fuzz/fuzz-unit-file/systemd-machined.service b/test/fuzz/fuzz-unit-file/systemd-machined.service
|
|
|
d0811f |
index 70b627c5f40..79ee9861d8e 100644
|
|
|
d0811f |
--- a/test/fuzz/fuzz-unit-file/systemd-machined.service
|
|
|
d0811f |
+++ b/test/fuzz/fuzz-unit-file/systemd-machined.service
|
|
|
d0811f |
@@ -15,9 +15,6 @@ Documentation=https://www.freedesktop.org/wiki/Software/systemd/machined
|
|
|
d0811f |
Wants=machine.slice
|
|
|
d0811f |
After=machine.slice
|
|
|
d0811f |
RequiresMountsFor=/var/lib/machines
|
|
|
d0811f |
-ConditionNull=true
|
|
|
d0811f |
-ConditionNull=
|
|
|
d0811f |
-ConditionNull=|!false
|
|
|
d0811f |
OnFailureIsolate=false
|
|
|
d0811f |
FailureActionExitStatus=222
|
|
|
d0811f |
FailureActionExitStatus=
|