unit: introduce ConditionPathIsReadWrite

This commit is contained in:
Lennart Poettering 2012-04-12 02:39:02 +02:00
parent f33d3ec1d7
commit d051610953
4 changed files with 28 additions and 7 deletions

View file

@ -684,6 +684,7 @@
<term><varname>ConditionPathIsDirectory=</varname></term> <term><varname>ConditionPathIsDirectory=</varname></term>
<term><varname>ConditionPathIsSymbolicLink=</varname></term> <term><varname>ConditionPathIsSymbolicLink=</varname></term>
<term><varname>ConditionPathIsMountPoint=</varname></term> <term><varname>ConditionPathIsMountPoint=</varname></term>
<term><varname>ConditionPathIsReadWrite=</varname></term>
<term><varname>ConditionDirectoryNotEmpty=</varname></term> <term><varname>ConditionDirectoryNotEmpty=</varname></term>
<term><varname>ConditionFileIsExecutable=</varname></term> <term><varname>ConditionFileIsExecutable=</varname></term>
<term><varname>ConditionKernelCommandLine=</varname></term> <term><varname>ConditionKernelCommandLine=</varname></term>
@ -731,7 +732,13 @@
<varname>ConditionPathExists=</varname> <varname>ConditionPathExists=</varname>
but verifies whether a certain path but verifies whether a certain path
exists and is a mount exists and is a mount
point. <varname>ConditionFileIsExecutable=</varname> point. <varname>ConditionPathIsReadWrite=</varname>
is similar to
<varname>ConditionPathExists=</varname>
but verifies whether the underlying
file system is read and writable
(i.e. not mounted
read-only). <varname>ConditionFileIsExecutable=</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
@ -780,12 +787,13 @@
<varname>openvz</varname>, <varname>openvz</varname>,
<varname>lxc</varname>, <varname>lxc</varname>,
<varname>lxc-libvirt</varname>, <varname>lxc-libvirt</varname>,
<varname>systemd-nspawn</varname> to test <varname>systemd-nspawn</varname> to
against a specific implementation. If test against a specific
multiple virtualization technologies implementation. If multiple
are nested only the innermost is virtualization technologies are nested
considered. The test may be negated by only the innermost is considered. The
prepending an exclamation mark. test may be negated by prepending an
exclamation mark.
<varname>ConditionSecurity=</varname> <varname>ConditionSecurity=</varname>
may be used to check whether the given may be used to check whether the given
security module is enabled on the security module is enabled on the

View file

@ -24,6 +24,7 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <sys/capability.h> #include <sys/capability.h>
#include <sys/statvfs.h>
#ifdef HAVE_SELINUX #ifdef HAVE_SELINUX
#include <selinux/selinux.h> #include <selinux/selinux.h>
@ -222,6 +223,15 @@ bool condition_test(Condition *c) {
case CONDITION_PATH_IS_MOUNT_POINT: case CONDITION_PATH_IS_MOUNT_POINT:
return (path_is_mount_point(c->parameter, true) > 0) == !c->negate; return (path_is_mount_point(c->parameter, true) > 0) == !c->negate;
case CONDITION_PATH_IS_READ_WRITE: {
struct statvfs st;
if (statvfs(c->parameter, &st) < 0)
return c->negate;
return !(st.f_flag & ST_RDONLY) == !c->negate;
}
case CONDITION_DIRECTORY_NOT_EMPTY: { case CONDITION_DIRECTORY_NOT_EMPTY: {
int k; int k;
@ -313,6 +323,7 @@ static const char* const condition_type_table[_CONDITION_TYPE_MAX] = {
[CONDITION_PATH_IS_DIRECTORY] = "ConditionPathIsDirectory", [CONDITION_PATH_IS_DIRECTORY] = "ConditionPathIsDirectory",
[CONDITION_PATH_IS_SYMBOLIC_LINK] = "ConditionPathIsSymbolicLink", [CONDITION_PATH_IS_SYMBOLIC_LINK] = "ConditionPathIsSymbolicLink",
[CONDITION_PATH_IS_MOUNT_POINT] = "ConditionPathIsMountPoint", [CONDITION_PATH_IS_MOUNT_POINT] = "ConditionPathIsMountPoint",
[CONDITION_PATH_IS_READ_WRITE] = "ConditionPathIsReadWrite",
[CONDITION_DIRECTORY_NOT_EMPTY] = "ConditionDirectoryNotEmpty", [CONDITION_DIRECTORY_NOT_EMPTY] = "ConditionDirectoryNotEmpty",
[CONDITION_KERNEL_COMMAND_LINE] = "ConditionKernelCommandLine", [CONDITION_KERNEL_COMMAND_LINE] = "ConditionKernelCommandLine",
[CONDITION_VIRTUALIZATION] = "ConditionVirtualization", [CONDITION_VIRTUALIZATION] = "ConditionVirtualization",

View file

@ -32,6 +32,7 @@ typedef enum ConditionType {
CONDITION_PATH_IS_DIRECTORY, CONDITION_PATH_IS_DIRECTORY,
CONDITION_PATH_IS_SYMBOLIC_LINK, CONDITION_PATH_IS_SYMBOLIC_LINK,
CONDITION_PATH_IS_MOUNT_POINT, CONDITION_PATH_IS_MOUNT_POINT,
CONDITION_PATH_IS_READ_WRITE,
CONDITION_DIRECTORY_NOT_EMPTY, CONDITION_DIRECTORY_NOT_EMPTY,
CONDITION_FILE_IS_EXECUTABLE, CONDITION_FILE_IS_EXECUTABLE,
CONDITION_KERNEL_COMMAND_LINE, CONDITION_KERNEL_COMMAND_LINE,

View file

@ -118,6 +118,7 @@ Unit.ConditionPathExistsGlob, config_parse_unit_condition_path, CONDITION_P
Unit.ConditionPathIsDirectory, config_parse_unit_condition_path, CONDITION_PATH_IS_DIRECTORY, 0 Unit.ConditionPathIsDirectory, config_parse_unit_condition_path, CONDITION_PATH_IS_DIRECTORY, 0
Unit.ConditionPathIsSymbolicLink,config_parse_unit_condition_path, CONDITION_PATH_IS_SYMBOLIC_LINK,0 Unit.ConditionPathIsSymbolicLink,config_parse_unit_condition_path, CONDITION_PATH_IS_SYMBOLIC_LINK,0
Unit.ConditionPathIsMountPoint, config_parse_unit_condition_path, CONDITION_PATH_IS_MOUNT_POINT, 0 Unit.ConditionPathIsMountPoint, config_parse_unit_condition_path, CONDITION_PATH_IS_MOUNT_POINT, 0
Unit.ConditionPathIsReadWrite, config_parse_unit_condition_path, CONDITION_PATH_IS_READ_WRITE, 0
Unit.ConditionDirectoryNotEmpty, config_parse_unit_condition_path, CONDITION_DIRECTORY_NOT_EMPTY, 0 Unit.ConditionDirectoryNotEmpty, config_parse_unit_condition_path, CONDITION_DIRECTORY_NOT_EMPTY, 0
Unit.ConditionFileIsExecutable, config_parse_unit_condition_path, CONDITION_FILE_IS_EXECUTABLE, 0 Unit.ConditionFileIsExecutable, config_parse_unit_condition_path, CONDITION_FILE_IS_EXECUTABLE, 0
Unit.ConditionKernelCommandLine, config_parse_unit_condition_string, CONDITION_KERNEL_COMMAND_LINE, 0 Unit.ConditionKernelCommandLine, config_parse_unit_condition_string, CONDITION_KERNEL_COMMAND_LINE, 0