chiark / gitweb /
condition: optionally test against type of virtualization (vm vs. container)
authorLennart Poettering <lennart@poettering.net>
Fri, 23 Sep 2011 15:09:49 +0000 (17:09 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 23 Sep 2011 15:09:49 +0000 (17:09 +0200)
man/systemd.unit.xml
src/condition.c

index 9066e66..bf8de32 100644 (file)
                                 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
                                 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>,
index 1438ea8..e978656 100644 (file)
@@ -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);
 }