diff options
author | Lennart Poettering <lennart@poettering.net> | 2011-09-23 17:09:49 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2011-09-23 17:09:49 +0200 |
commit | 8095200d05ad28e84a3480f94f061783150db81e (patch) | |
tree | 6a76fb2b83a7937dbb8afcef74091f316836f2c5 | |
parent | b52aae1d934b006830e7d575e56e2a98b0765ad3 (diff) |
condition: optionally test against type of virtualization (vm vs. container)
-rw-r--r-- | man/systemd.unit.xml | 12 | ||||
-rw-r--r-- | src/condition.c | 23 |
2 files changed, 26 insertions, 9 deletions
diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml index 9066e66cc2..bf8de322dd 100644 --- a/man/systemd.unit.xml +++ b/man/systemd.unit.xml @@ -707,8 +707,8 @@ is similar to <varname>ConditionPathExists=</varname> but verifies whether a certain path - exists and is a - symbolic link. <varname>ConditionPathIsMountPoint=</varname> + exists and is a symbolic + link. <varname>ConditionPathIsMountPoint=</varname> is similar to <varname>ConditionPathExists=</varname> but verifies whether a certain path @@ -746,13 +746,19 @@ whether it is a specific implementation. Takes either boolean value to check if being executed in - any virtual environment or one of + any virtualized environment, or one of + <varname>vm</varname> and + <varname>container</varname> to test against + a specific type of virtualization + solution, or one of <varname>qemu</varname>, <varname>kvm</varname>, <varname>vmware</varname>, <varname>microsoft</varname>, <varname>oracle</varname>, <varname>xen</varname>, + <varname>bochs</varname>, + <varname>chroot</varname>, <varname>openvz</varname>, <varname>lxc</varname>, <varname>systemd-nspawn</varname>, diff --git a/src/condition.c b/src/condition.c index 1438ea85a0..e978656772 100644 --- a/src/condition.c +++ b/src/condition.c @@ -30,6 +30,7 @@ #include "util.h" #include "condition.h" +#include "virt.h" Condition* condition_new(ConditionType type, const char *parameter, bool trigger, bool negate) { Condition *c; @@ -118,25 +119,35 @@ static bool test_kernel_command_line(const char *parameter) { } static bool test_virtualization(const char *parameter) { - int r, b; + int b; + Virtualization v; const char *id; assert(parameter); - r = detect_virtualization(&id); - if (r < 0) { - log_warning("Failed to detect virtualization, ignoring: %s", strerror(-r)); + v = detect_virtualization(&id); + if (v < 0) { + log_warning("Failed to detect virtualization, ignoring: %s", strerror(-v)); return false; } + /* First, compare with yes/no */ b = parse_boolean(parameter); - if (r > 0 && b > 0) + if (v > 0 && b > 0) + return true; + + if (v == 0 && b == 0) + return true; + + /* Then, compare categorization */ + if (v == VIRTUALIZATION_VM && streq(parameter, "vm")) return true; - if (r == 0 && b == 0) + if (v == VIRTUALIZATION_CONTAINER && streq(parameter, "container")) return true; + /* Finally compare id */ return streq(parameter, id); } |