condition: optionally test against type of virtualization (vm vs. container)

This commit is contained in:
Lennart Poettering 2011-09-23 17:09:49 +02:00
parent b52aae1d93
commit 8095200d05
2 changed files with 26 additions and 9 deletions

View file

@ -707,8 +707,8 @@
is similar to is similar to
<varname>ConditionPathExists=</varname> <varname>ConditionPathExists=</varname>
but verifies whether a certain path but verifies whether a certain path
exists and is a exists and is a symbolic
symbolic link. <varname>ConditionPathIsMountPoint=</varname> link. <varname>ConditionPathIsMountPoint=</varname>
is similar to is similar to
<varname>ConditionPathExists=</varname> <varname>ConditionPathExists=</varname>
but verifies whether a certain path but verifies whether a certain path
@ -746,13 +746,19 @@
whether it is a specific whether it is a specific
implementation. Takes either boolean implementation. Takes either boolean
value to check if being executed in 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>qemu</varname>,
<varname>kvm</varname>, <varname>kvm</varname>,
<varname>vmware</varname>, <varname>vmware</varname>,
<varname>microsoft</varname>, <varname>microsoft</varname>,
<varname>oracle</varname>, <varname>oracle</varname>,
<varname>xen</varname>, <varname>xen</varname>,
<varname>bochs</varname>,
<varname>chroot</varname>,
<varname>openvz</varname>, <varname>openvz</varname>,
<varname>lxc</varname>, <varname>lxc</varname>,
<varname>systemd-nspawn</varname>, <varname>systemd-nspawn</varname>,

View file

@ -30,6 +30,7 @@
#include "util.h" #include "util.h"
#include "condition.h" #include "condition.h"
#include "virt.h"
Condition* condition_new(ConditionType type, const char *parameter, bool trigger, bool negate) { Condition* condition_new(ConditionType type, const char *parameter, bool trigger, bool negate) {
Condition *c; Condition *c;
@ -118,25 +119,35 @@ static bool test_kernel_command_line(const char *parameter) {
} }
static bool test_virtualization(const char *parameter) { static bool test_virtualization(const char *parameter) {
int r, b; int b;
Virtualization v;
const char *id; const char *id;
assert(parameter); assert(parameter);
r = detect_virtualization(&id); v = detect_virtualization(&id);
if (r < 0) { if (v < 0) {
log_warning("Failed to detect virtualization, ignoring: %s", strerror(-r)); log_warning("Failed to detect virtualization, ignoring: %s", strerror(-v));
return false; return false;
} }
/* First, compare with yes/no */
b = parse_boolean(parameter); b = parse_boolean(parameter);
if (r > 0 && b > 0) if (v > 0 && b > 0)
return true; return true;
if (r == 0 && b == 0) if (v == 0 && b == 0)
return true; return true;
/* Then, compare categorization */
if (v == VIRTUALIZATION_VM && streq(parameter, "vm"))
return true;
if (v == VIRTUALIZATION_CONTAINER && streq(parameter, "container"))
return true;
/* Finally compare id */
return streq(parameter, id); return streq(parameter, id);
} }