2011-08-01 00:43:05 +02:00
|
|
|
%{
|
2017-11-19 19:06:10 +01:00
|
|
|
#if __GNUC__ >= 7
|
|
|
|
_Pragma("GCC diagnostic ignored \"-Wimplicit-fallthrough\"")
|
|
|
|
#endif
|
2011-08-01 00:43:05 +02:00
|
|
|
#include <stddef.h>
|
2019-10-31 03:07:23 +01:00
|
|
|
#include "all-units.h"
|
2011-08-01 00:43:05 +02:00
|
|
|
#include "conf-parser.h"
|
|
|
|
#include "load-fragment.h"
|
|
|
|
%}
|
|
|
|
struct ConfigPerfItem;
|
|
|
|
%null_strings
|
|
|
|
%language=ANSI-C
|
|
|
|
%define slot-name section_and_lvalue
|
|
|
|
%define hash-function-name load_fragment_gperf_hash
|
|
|
|
%define lookup-function-name load_fragment_gperf_lookup
|
|
|
|
%readonly-tables
|
|
|
|
%omit-struct-type
|
|
|
|
%struct-type
|
|
|
|
%includes
|
|
|
|
%%
|
|
|
|
m4_dnl Define the context options only once
|
|
|
|
m4_define(`EXEC_CONTEXT_CONFIG_ITEMS',
|
2015-09-23 19:46:23 +02:00
|
|
|
`$1.WorkingDirectory, config_parse_working_directory, 0, offsetof($1, exec_context)
|
2017-07-06 19:54:42 +02:00
|
|
|
$1.RootDirectory, config_parse_unit_path_printf, true, offsetof($1, exec_context.root_directory)
|
|
|
|
$1.RootImage, config_parse_unit_path_printf, true, offsetof($1, exec_context.root_image)
|
2020-06-29 14:19:31 +02:00
|
|
|
$1.RootImageOptions, config_parse_root_image_options, 0, offsetof($1, exec_context)
|
2020-06-03 10:50:45 +02:00
|
|
|
$1.RootHash, config_parse_exec_root_hash, 0, offsetof($1, exec_context)
|
2020-06-08 15:02:55 +02:00
|
|
|
$1.RootHashSignature, config_parse_exec_root_hash_sig, 0, offsetof($1, exec_context)
|
2020-06-03 10:50:45 +02:00
|
|
|
$1.RootVerity, config_parse_unit_path_printf, true, offsetof($1, exec_context.root_verity)
|
2019-08-01 09:58:27 +02:00
|
|
|
$1.User, config_parse_user_group_compat, 0, offsetof($1, exec_context.user)
|
|
|
|
$1.Group, config_parse_user_group_compat, 0, offsetof($1, exec_context.group)
|
|
|
|
$1.SupplementaryGroups, config_parse_user_group_strv_compat, 0, offsetof($1, exec_context.supplementary_groups)
|
2011-08-01 00:43:05 +02:00
|
|
|
$1.Nice, config_parse_exec_nice, 0, offsetof($1, exec_context)
|
|
|
|
$1.OOMScoreAdjust, config_parse_exec_oom_score_adjust, 0, offsetof($1, exec_context)
|
2020-04-04 16:43:25 +02:00
|
|
|
$1.CoredumpFilter, config_parse_exec_coredump_filter, 0, offsetof($1, exec_context)
|
2011-08-01 00:43:05 +02:00
|
|
|
$1.IOSchedulingClass, config_parse_exec_io_class, 0, offsetof($1, exec_context)
|
|
|
|
$1.IOSchedulingPriority, config_parse_exec_io_priority, 0, offsetof($1, exec_context)
|
|
|
|
$1.CPUSchedulingPolicy, config_parse_exec_cpu_sched_policy, 0, offsetof($1, exec_context)
|
|
|
|
$1.CPUSchedulingPriority, config_parse_exec_cpu_sched_prio, 0, offsetof($1, exec_context)
|
|
|
|
$1.CPUSchedulingResetOnFork, config_parse_bool, 0, offsetof($1, exec_context.cpu_sched_reset_on_fork)
|
|
|
|
$1.CPUAffinity, config_parse_exec_cpu_affinity, 0, offsetof($1, exec_context)
|
2019-03-12 18:58:26 +01:00
|
|
|
$1.NUMAPolicy, config_parse_numa_policy, 0, offsetof($1, exec_context.numa_policy.type)
|
|
|
|
$1.NUMAMask, config_parse_numa_mask, 0, offsetof($1, exec_context.numa_policy)
|
2011-08-01 00:43:05 +02:00
|
|
|
$1.UMask, config_parse_mode, 0, offsetof($1, exec_context.umask)
|
2013-02-11 23:45:59 +01:00
|
|
|
$1.Environment, config_parse_environ, 0, offsetof($1, exec_context.environment)
|
2011-08-01 00:43:05 +02:00
|
|
|
$1.EnvironmentFile, config_parse_unit_env_file, 0, offsetof($1, exec_context.environment_files)
|
2015-09-07 08:06:53 +02:00
|
|
|
$1.PassEnvironment, config_parse_pass_environ, 0, offsetof($1, exec_context.pass_environment)
|
2017-09-10 12:16:44 +02:00
|
|
|
$1.UnsetEnvironment, config_parse_unset_environ, 0, offsetof($1, exec_context.unset_environment)
|
2017-07-06 19:54:42 +02:00
|
|
|
$1.DynamicUser, config_parse_bool, true, offsetof($1, exec_context.dynamic_user)
|
2017-11-10 10:15:55 +01:00
|
|
|
$1.RemoveIPC, config_parse_bool, 0, offsetof($1, exec_context.remove_ipc)
|
2016-10-18 02:05:49 +02:00
|
|
|
$1.StandardInput, config_parse_exec_input, 0, offsetof($1, exec_context)
|
|
|
|
$1.StandardOutput, config_parse_exec_output, 0, offsetof($1, exec_context)
|
|
|
|
$1.StandardError, config_parse_exec_output, 0, offsetof($1, exec_context)
|
2017-10-27 11:33:05 +02:00
|
|
|
$1.StandardInputText, config_parse_exec_input_text, 0, offsetof($1, exec_context)
|
|
|
|
$1.StandardInputData, config_parse_exec_input_data, 0, offsetof($1, exec_context)
|
2011-08-01 00:43:05 +02:00
|
|
|
$1.TTYPath, config_parse_unit_path_printf, 0, offsetof($1, exec_context.tty_path)
|
|
|
|
$1.TTYReset, config_parse_bool, 0, offsetof($1, exec_context.tty_reset)
|
|
|
|
$1.TTYVHangup, config_parse_bool, 0, offsetof($1, exec_context.tty_vhangup)
|
|
|
|
$1.TTYVTDisallocate, config_parse_bool, 0, offsetof($1, exec_context.tty_vt_disallocate)
|
|
|
|
$1.SyslogIdentifier, config_parse_unit_string_printf, 0, offsetof($1, exec_context.syslog_identifier)
|
2014-03-03 21:14:07 +01:00
|
|
|
$1.SyslogFacility, config_parse_log_facility, 0, offsetof($1, exec_context.syslog_priority)
|
|
|
|
$1.SyslogLevel, config_parse_log_level, 0, offsetof($1, exec_context.syslog_priority)
|
2011-08-01 00:43:05 +02:00
|
|
|
$1.SyslogLevelPrefix, config_parse_bool, 0, offsetof($1, exec_context.syslog_level_prefix)
|
core: implement /run/systemd/units/-based path for passing unit info from PID 1 to journald
And let's make use of it to implement two new unit settings with it:
1. LogLevelMax= is a new per-unit setting that may be used to configure
log priority filtering: set it to LogLevelMax=notice and only
messages of level "notice" and lower (i.e. more important) will be
processed, all others are dropped.
2. LogExtraFields= is a new per-unit setting for configuring per-unit
journal fields, that are implicitly included in every log record
generated by the unit's processes. It takes field/value pairs in the
form of FOO=BAR.
Also, related to this, one exisiting unit setting is ported to this new
facility:
3. The invocation ID is now pulled from /run/systemd/units/ instead of
cgroupfs xattrs. This substantially relaxes requirements of systemd
on the kernel version and the privileges it runs with (specifically,
cgroupfs xattrs are not available in containers, since they are
stored in kernel memory, and hence are unsafe to permit to lesser
privileged code).
/run/systemd/units/ is a new directory, which contains a number of files
and symlinks encoding the above information. PID 1 creates and manages
these files, and journald reads them from there.
Note that this is supposed to be a direct path between PID 1 and the
journal only, due to the special runtime environment the journal runs
in. Normally, today we shouldn't introduce new interfaces that (mis-)use
a file system as IPC framework, and instead just an IPC system, but this
is very hard to do between the journal and PID 1, as long as the IPC
system is a subject PID 1 manages, and itself a client to the journal.
This patch cleans up a couple of types used in journal code:
specifically we switch to size_t for a couple of memory-sizing values,
as size_t is the right choice for everything that is memory.
Fixes: #4089
Fixes: #3041
Fixes: #4441
2017-11-02 19:43:32 +01:00
|
|
|
$1.LogLevelMax, config_parse_log_level, 0, offsetof($1, exec_context.log_level_max)
|
2019-09-19 17:49:14 +02:00
|
|
|
$1.LogRateLimitIntervalSec, config_parse_sec, 0, offsetof($1, exec_context.log_ratelimit_interval_usec)
|
|
|
|
$1.LogRateLimitBurst, config_parse_unsigned, 0, offsetof($1, exec_context.log_ratelimit_burst)
|
core: implement /run/systemd/units/-based path for passing unit info from PID 1 to journald
And let's make use of it to implement two new unit settings with it:
1. LogLevelMax= is a new per-unit setting that may be used to configure
log priority filtering: set it to LogLevelMax=notice and only
messages of level "notice" and lower (i.e. more important) will be
processed, all others are dropped.
2. LogExtraFields= is a new per-unit setting for configuring per-unit
journal fields, that are implicitly included in every log record
generated by the unit's processes. It takes field/value pairs in the
form of FOO=BAR.
Also, related to this, one exisiting unit setting is ported to this new
facility:
3. The invocation ID is now pulled from /run/systemd/units/ instead of
cgroupfs xattrs. This substantially relaxes requirements of systemd
on the kernel version and the privileges it runs with (specifically,
cgroupfs xattrs are not available in containers, since they are
stored in kernel memory, and hence are unsafe to permit to lesser
privileged code).
/run/systemd/units/ is a new directory, which contains a number of files
and symlinks encoding the above information. PID 1 creates and manages
these files, and journald reads them from there.
Note that this is supposed to be a direct path between PID 1 and the
journal only, due to the special runtime environment the journal runs
in. Normally, today we shouldn't introduce new interfaces that (mis-)use
a file system as IPC framework, and instead just an IPC system, but this
is very hard to do between the journal and PID 1, as long as the IPC
system is a subject PID 1 manages, and itself a client to the journal.
This patch cleans up a couple of types used in journal code:
specifically we switch to size_t for a couple of memory-sizing values,
as size_t is the right choice for everything that is memory.
Fixes: #4089
Fixes: #3041
Fixes: #4441
2017-11-02 19:43:32 +01:00
|
|
|
$1.LogExtraFields, config_parse_log_extra_fields, 0, offsetof($1, exec_context)
|
2016-02-12 23:29:57 +01:00
|
|
|
$1.Capabilities, config_parse_warn_compat, DISABLED_LEGACY, offsetof($1, exec_context)
|
2018-05-29 05:57:06 +02:00
|
|
|
$1.SecureBits, config_parse_exec_secure_bits, 0, offsetof($1, exec_context.secure_bits)
|
2016-01-07 23:00:04 +01:00
|
|
|
$1.CapabilityBoundingSet, config_parse_capability_set, 0, offsetof($1, exec_context.capability_bounding_set)
|
2015-12-31 13:54:44 +01:00
|
|
|
$1.AmbientCapabilities, config_parse_capability_set, 0, offsetof($1, exec_context.capability_ambient_set)
|
2012-05-31 04:27:03 +02:00
|
|
|
$1.TimerSlackNSec, config_parse_nsec, 0, offsetof($1, exec_context.timer_slack_nsec)
|
2018-05-25 05:52:12 +02:00
|
|
|
$1.NoNewPrivileges, config_parse_bool, 0, offsetof($1, exec_context.no_new_privileges)
|
2017-09-14 21:19:05 +02:00
|
|
|
$1.KeyringMode, config_parse_exec_keyring_mode, 0, offsetof($1, exec_context.keyring_mode)
|
2014-02-12 18:28:21 +01:00
|
|
|
m4_ifdef(`HAVE_SECCOMP',
|
|
|
|
`$1.SystemCallFilter, config_parse_syscall_filter, 0, offsetof($1, exec_context)
|
2014-02-13 01:35:27 +01:00
|
|
|
$1.SystemCallArchitectures, config_parse_syscall_archs, 0, offsetof($1, exec_context.syscall_archs)
|
2014-02-25 20:37:03 +01:00
|
|
|
$1.SystemCallErrorNumber, config_parse_syscall_errno, 0, offsetof($1, exec_context)
|
2016-06-03 17:58:18 +02:00
|
|
|
$1.MemoryDenyWriteExecute, config_parse_bool, 0, offsetof($1, exec_context.memory_deny_write_execute)
|
2016-11-14 09:12:21 +01:00
|
|
|
$1.RestrictNamespaces, config_parse_restrict_namespaces, 0, offsetof($1, exec_context)
|
2016-06-23 01:45:45 +02:00
|
|
|
$1.RestrictRealtime, config_parse_bool, 0, offsetof($1, exec_context.restrict_realtime)
|
2019-03-20 19:09:09 +01:00
|
|
|
$1.RestrictSUIDSGID, config_parse_bool, 0, offsetof($1, exec_context.restrict_suid_sgid)
|
2017-07-04 14:48:18 +02:00
|
|
|
$1.RestrictAddressFamilies, config_parse_address_families, 0, offsetof($1, exec_context)
|
|
|
|
$1.LockPersonality, config_parse_bool, 0, offsetof($1, exec_context.lock_personality)',
|
2014-11-30 16:21:49 +01:00
|
|
|
`$1.SystemCallFilter, config_parse_warn_compat, DISABLED_CONFIGURATION, 0
|
|
|
|
$1.SystemCallArchitectures, config_parse_warn_compat, DISABLED_CONFIGURATION, 0
|
|
|
|
$1.SystemCallErrorNumber, config_parse_warn_compat, DISABLED_CONFIGURATION, 0
|
2016-06-03 17:58:18 +02:00
|
|
|
$1.MemoryDenyWriteExecute, config_parse_warn_compat, DISABLED_CONFIGURATION, 0
|
2016-11-02 03:25:19 +01:00
|
|
|
$1.RestrictNamespaces, config_parse_warn_compat, DISABLED_CONFIGURATION, 0
|
2016-06-23 01:45:45 +02:00
|
|
|
$1.RestrictRealtime, config_parse_warn_compat, DISABLED_CONFIGURATION, 0
|
2019-04-03 02:23:43 +02:00
|
|
|
$1.RestrictSUIDSGID, config_parse_warn_compat, DISABLED_CONFIGURATION, 0
|
2017-07-04 14:48:18 +02:00
|
|
|
$1.RestrictAddressFamilies, config_parse_warn_compat, DISABLED_CONFIGURATION, 0
|
|
|
|
$1.LockPersonality, config_parse_warn_compat, DISABLED_CONFIGURATION, 0')
|
2018-05-03 19:01:21 +02:00
|
|
|
$1.LimitCPU, config_parse_rlimit, RLIMIT_CPU, offsetof($1, exec_context.rlimit)
|
|
|
|
$1.LimitFSIZE, config_parse_rlimit, RLIMIT_FSIZE, offsetof($1, exec_context.rlimit)
|
|
|
|
$1.LimitDATA, config_parse_rlimit, RLIMIT_DATA, offsetof($1, exec_context.rlimit)
|
|
|
|
$1.LimitSTACK, config_parse_rlimit, RLIMIT_STACK, offsetof($1, exec_context.rlimit)
|
|
|
|
$1.LimitCORE, config_parse_rlimit, RLIMIT_CORE, offsetof($1, exec_context.rlimit)
|
|
|
|
$1.LimitRSS, config_parse_rlimit, RLIMIT_RSS, offsetof($1, exec_context.rlimit)
|
|
|
|
$1.LimitNOFILE, config_parse_rlimit, RLIMIT_NOFILE, offsetof($1, exec_context.rlimit)
|
|
|
|
$1.LimitAS, config_parse_rlimit, RLIMIT_AS, offsetof($1, exec_context.rlimit)
|
|
|
|
$1.LimitNPROC, config_parse_rlimit, RLIMIT_NPROC, offsetof($1, exec_context.rlimit)
|
|
|
|
$1.LimitMEMLOCK, config_parse_rlimit, RLIMIT_MEMLOCK, offsetof($1, exec_context.rlimit)
|
|
|
|
$1.LimitLOCKS, config_parse_rlimit, RLIMIT_LOCKS, offsetof($1, exec_context.rlimit)
|
|
|
|
$1.LimitSIGPENDING, config_parse_rlimit, RLIMIT_SIGPENDING, offsetof($1, exec_context.rlimit)
|
|
|
|
$1.LimitMSGQUEUE, config_parse_rlimit, RLIMIT_MSGQUEUE, offsetof($1, exec_context.rlimit)
|
|
|
|
$1.LimitNICE, config_parse_rlimit, RLIMIT_NICE, offsetof($1, exec_context.rlimit)
|
|
|
|
$1.LimitRTPRIO, config_parse_rlimit, RLIMIT_RTPRIO, offsetof($1, exec_context.rlimit)
|
|
|
|
$1.LimitRTTIME, config_parse_rlimit, RLIMIT_RTTIME, offsetof($1, exec_context.rlimit)
|
2016-07-07 11:17:00 +02:00
|
|
|
$1.ReadWriteDirectories, config_parse_namespace_path_strv, 0, offsetof($1, exec_context.read_write_paths)
|
|
|
|
$1.ReadOnlyDirectories, config_parse_namespace_path_strv, 0, offsetof($1, exec_context.read_only_paths)
|
|
|
|
$1.InaccessibleDirectories, config_parse_namespace_path_strv, 0, offsetof($1, exec_context.inaccessible_paths)
|
|
|
|
$1.ReadWritePaths, config_parse_namespace_path_strv, 0, offsetof($1, exec_context.read_write_paths)
|
|
|
|
$1.ReadOnlyPaths, config_parse_namespace_path_strv, 0, offsetof($1, exec_context.read_only_paths)
|
|
|
|
$1.InaccessiblePaths, config_parse_namespace_path_strv, 0, offsetof($1, exec_context.inaccessible_paths)
|
2016-11-23 22:21:40 +01:00
|
|
|
$1.BindPaths, config_parse_bind_paths, 0, offsetof($1, exec_context)
|
|
|
|
$1.BindReadOnlyPaths, config_parse_bind_paths, 0, offsetof($1, exec_context)
|
2018-02-21 01:17:52 +01:00
|
|
|
$1.TemporaryFileSystem, config_parse_temporary_filesystems, 0, offsetof($1, exec_context)
|
2011-08-01 00:43:05 +02:00
|
|
|
$1.PrivateTmp, config_parse_bool, 0, offsetof($1, exec_context.private_tmp)
|
2014-01-20 19:54:51 +01:00
|
|
|
$1.PrivateDevices, config_parse_bool, 0, offsetof($1, exec_context.private_devices)
|
2016-08-22 18:43:59 +02:00
|
|
|
$1.ProtectKernelTunables, config_parse_bool, 0, offsetof($1, exec_context.protect_kernel_tunables)
|
2016-10-12 13:31:21 +02:00
|
|
|
$1.ProtectKernelModules, config_parse_bool, 0, offsetof($1, exec_context.protect_kernel_modules)
|
2019-11-05 02:18:42 +01:00
|
|
|
$1.ProtectKernelLogs, config_parse_bool, 0, offsetof($1, exec_context.protect_kernel_logs)
|
2020-01-26 21:23:33 +01:00
|
|
|
$1.ProtectClock, config_parse_bool, 0, offsetof($1, exec_context.protect_clock)
|
2016-08-22 18:43:59 +02:00
|
|
|
$1.ProtectControlGroups, config_parse_bool, 0, offsetof($1, exec_context.protect_control_groups)
|
2019-03-07 16:39:01 +01:00
|
|
|
$1.NetworkNamespacePath, config_parse_unit_path_printf, 0, offsetof($1, exec_context.network_namespace_path)
|
2019-11-25 16:22:45 +01:00
|
|
|
$1.LogNamespace, config_parse_log_namespace, 0, offsetof($1, exec_context)
|
2016-08-03 18:44:51 +02:00
|
|
|
$1.PrivateNetwork, config_parse_bool, 0, offsetof($1, exec_context.private_network)
|
|
|
|
$1.PrivateUsers, config_parse_bool, 0, offsetof($1, exec_context.private_users)
|
core: add new PrivateMounts= unit setting
This new setting is supposed to be useful in most cases where
"MountFlags=slave" is currently used, i.e. as an explicit way to run a
service in its own mount namespace and decouple propagation from all
mounts of the new mount namespace towards the host.
The effect of MountFlags=slave and PrivateMounts=yes is mostly the same,
as both cause a CLONE_NEWNS namespace to be opened, and both will result
in all mounts within it to be mounted MS_SLAVE. The difference is mostly
on the conceptual/philosophical level: configuring the propagation mode
is nothing people should have to think about, in particular as the
matter is not precisely easyto grok. Moreover, MountFlags= allows configuration
of "private" and "slave" modes which don't really make much sense to use
in real-life and are quite confusing. In particular PrivateMounts=private means
mounts made on the host stay pinned for good by the service which is
particularly nasty for removable media mount. And PrivateMounts=shared
is in most ways a NOP when used a alone...
The main technical difference between setting only MountFlags=slave or
only PrivateMounts=yes in a unit file is that the former remounts all
mounts to MS_SLAVE and leaves them there, while that latter remounts
them to MS_SHARED again right after. The latter is generally a nicer
approach, since it disables propagation, while MS_SHARED is afterwards
in effect, which is really nice as that means further namespacing down
the tree will get MS_SHARED logic by default and we unify how
applications see our mounts as we always pass them as MS_SHARED
regardless whether any mount namespacing is used or not.
The effect of PrivateMounts=yes was implied already by all the other
mount namespacing options. With this new option we add an explicit knob
for it, to request it without any other option used as well.
See: #4393
2018-06-01 11:10:49 +02:00
|
|
|
$1.PrivateMounts, config_parse_bool, 0, offsetof($1, exec_context.private_mounts)
|
2018-05-29 05:44:57 +02:00
|
|
|
$1.ProtectSystem, config_parse_protect_system, 0, offsetof($1, exec_context.protect_system)
|
|
|
|
$1.ProtectHome, config_parse_protect_home, 0, offsetof($1, exec_context.protect_home)
|
2018-05-29 05:57:06 +02:00
|
|
|
$1.MountFlags, config_parse_exec_mount_flags, 0, offsetof($1, exec_context.mount_flags)
|
2016-12-22 23:34:35 +01:00
|
|
|
$1.MountAPIVFS, config_parse_bool, 0, offsetof($1, exec_context.mount_apivfs)
|
2014-02-19 02:15:24 +01:00
|
|
|
$1.Personality, config_parse_personality, 0, offsetof($1, exec_context.personality)
|
2017-07-17 09:22:25 +02:00
|
|
|
$1.RuntimeDirectoryPreserve, config_parse_runtime_preserve_mode, 0, offsetof($1, exec_context.runtime_directory_preserve_mode)
|
core: add {State,Cache,Log,Configuration}Directory= (#6384)
This introduces {State,Cache,Log,Configuration}Directory= those are
similar to RuntimeDirectory=. They create the directories under
/var/lib, /var/cache/, /var/log, or /etc, respectively, with the mode
specified in {State,Cache,Log,Configuration}DirectoryMode=.
This also fixes #6391.
2017-07-18 14:34:52 +02:00
|
|
|
$1.RuntimeDirectoryMode, config_parse_mode, 0, offsetof($1, exec_context.directories[EXEC_DIRECTORY_RUNTIME].mode)
|
|
|
|
$1.RuntimeDirectory, config_parse_exec_directories, 0, offsetof($1, exec_context.directories[EXEC_DIRECTORY_RUNTIME].paths)
|
2017-07-21 10:36:39 +02:00
|
|
|
$1.StateDirectoryMode, config_parse_mode, 0, offsetof($1, exec_context.directories[EXEC_DIRECTORY_STATE].mode)
|
|
|
|
$1.StateDirectory, config_parse_exec_directories, 0, offsetof($1, exec_context.directories[EXEC_DIRECTORY_STATE].paths)
|
core: add {State,Cache,Log,Configuration}Directory= (#6384)
This introduces {State,Cache,Log,Configuration}Directory= those are
similar to RuntimeDirectory=. They create the directories under
/var/lib, /var/cache/, /var/log, or /etc, respectively, with the mode
specified in {State,Cache,Log,Configuration}DirectoryMode=.
This also fixes #6391.
2017-07-18 14:34:52 +02:00
|
|
|
$1.CacheDirectoryMode, config_parse_mode, 0, offsetof($1, exec_context.directories[EXEC_DIRECTORY_CACHE].mode)
|
|
|
|
$1.CacheDirectory, config_parse_exec_directories, 0, offsetof($1, exec_context.directories[EXEC_DIRECTORY_CACHE].paths)
|
|
|
|
$1.LogsDirectoryMode, config_parse_mode, 0, offsetof($1, exec_context.directories[EXEC_DIRECTORY_LOGS].mode)
|
|
|
|
$1.LogsDirectory, config_parse_exec_directories, 0, offsetof($1, exec_context.directories[EXEC_DIRECTORY_LOGS].paths)
|
|
|
|
$1.ConfigurationDirectoryMode, config_parse_mode, 0, offsetof($1, exec_context.directories[EXEC_DIRECTORY_CONFIGURATION].mode)
|
|
|
|
$1.ConfigurationDirectory, config_parse_exec_directories, 0, offsetof($1, exec_context.directories[EXEC_DIRECTORY_CONFIGURATION].paths)
|
2019-08-25 10:47:57 +02:00
|
|
|
$1.TimeoutCleanSec, config_parse_sec, 0, offsetof($1, exec_context.timeout_clean_usec)
|
2019-02-08 18:25:00 +01:00
|
|
|
$1.ProtectHostname, config_parse_bool, 0, offsetof($1, exec_context.protect_hostname)
|
2014-02-17 17:49:09 +01:00
|
|
|
m4_ifdef(`HAVE_PAM',
|
|
|
|
`$1.PAMName, config_parse_unit_string_printf, 0, offsetof($1, exec_context.pam_name)',
|
2014-11-30 16:21:49 +01:00
|
|
|
`$1.PAMName, config_parse_warn_compat, DISABLED_CONFIGURATION, 0')
|
2012-02-09 03:18:04 +01:00
|
|
|
$1.IgnoreSIGPIPE, config_parse_bool, 0, offsetof($1, exec_context.ignore_sigpipe)
|
2014-02-06 10:05:16 +01:00
|
|
|
$1.UtmpIdentifier, config_parse_unit_string_printf, 0, offsetof($1, exec_context.utmp_id)
|
2015-08-23 13:14:04 +02:00
|
|
|
$1.UtmpMode, config_parse_exec_utmp_mode, 0, offsetof($1, exec_context.utmp_mode)
|
2014-02-17 17:49:09 +01:00
|
|
|
m4_ifdef(`HAVE_SELINUX',
|
|
|
|
`$1.SELinuxContext, config_parse_exec_selinux_context, 0, offsetof($1, exec_context)',
|
2014-11-30 16:21:49 +01:00
|
|
|
`$1.SELinuxContext, config_parse_warn_compat, DISABLED_CONFIGURATION, 0')
|
2014-02-20 16:19:44 +01:00
|
|
|
m4_ifdef(`HAVE_APPARMOR',
|
2014-11-24 12:46:20 +01:00
|
|
|
`$1.AppArmorProfile, config_parse_exec_apparmor_profile, 0, offsetof($1, exec_context)',
|
2014-11-30 16:21:49 +01:00
|
|
|
`$1.AppArmorProfile, config_parse_warn_compat, DISABLED_CONFIGURATION, 0')
|
2017-10-03 12:22:40 +02:00
|
|
|
m4_ifdef(`ENABLE_SMACK',
|
2014-11-24 12:46:20 +01:00
|
|
|
`$1.SmackProcessLabel, config_parse_exec_smack_process_label, 0, offsetof($1, exec_context)',
|
2014-11-30 16:21:49 +01:00
|
|
|
`$1.SmackProcessLabel, config_parse_warn_compat, DISABLED_CONFIGURATION, 0')'
|
2011-08-01 00:43:05 +02:00
|
|
|
)m4_dnl
|
2012-07-19 23:47:10 +02:00
|
|
|
m4_define(`KILL_CONTEXT_CONFIG_ITEMS',
|
2013-04-02 20:38:16 +02:00
|
|
|
`$1.SendSIGKILL, config_parse_bool, 0, offsetof($1, kill_context.send_sigkill)
|
2013-07-30 01:54:59 +02:00
|
|
|
$1.SendSIGHUP, config_parse_bool, 0, offsetof($1, kill_context.send_sighup)
|
2012-07-19 23:47:10 +02:00
|
|
|
$1.KillMode, config_parse_kill_mode, 0, offsetof($1, kill_context.kill_mode)
|
2018-07-20 17:22:43 +02:00
|
|
|
$1.KillSignal, config_parse_signal, 0, offsetof($1, kill_context.kill_signal)
|
2019-10-01 15:15:06 +02:00
|
|
|
$1.RestartKillSignal, config_parse_signal, 0, offsetof($1, kill_context.restart_kill_signal)
|
2018-09-19 21:03:01 +02:00
|
|
|
$1.FinalKillSignal, config_parse_signal, 0, offsetof($1, kill_context.final_kill_signal)
|
|
|
|
$1.WatchdogSignal, config_parse_signal, 0, offsetof($1, kill_context.watchdog_signal)'
|
2012-07-19 23:47:10 +02:00
|
|
|
)m4_dnl
|
2013-06-17 21:33:26 +02:00
|
|
|
m4_define(`CGROUP_CONTEXT_CONFIG_ITEMS',
|
2013-07-01 02:52:17 +02:00
|
|
|
`$1.Slice, config_parse_unit_slice, 0, 0
|
2019-11-24 14:14:43 +01:00
|
|
|
$1.AllowedCPUs, config_parse_allowed_cpus, 0, offsetof($1, cgroup_context)
|
|
|
|
$1.AllowedMemoryNodes, config_parse_allowed_mems, 0, offsetof($1, cgroup_context)
|
2013-07-01 02:52:17 +02:00
|
|
|
$1.CPUAccounting, config_parse_bool, 0, offsetof($1, cgroup_context.cpu_accounting)
|
2018-05-29 05:57:06 +02:00
|
|
|
$1.CPUWeight, config_parse_cg_weight, 0, offsetof($1, cgroup_context.cpu_weight)
|
|
|
|
$1.StartupCPUWeight, config_parse_cg_weight, 0, offsetof($1, cgroup_context.startup_cpu_weight)
|
2014-05-22 00:06:16 +02:00
|
|
|
$1.CPUShares, config_parse_cpu_shares, 0, offsetof($1, cgroup_context.cpu_shares)
|
|
|
|
$1.StartupCPUShares, config_parse_cpu_shares, 0, offsetof($1, cgroup_context.startup_cpu_shares)
|
2014-04-25 13:27:25 +02:00
|
|
|
$1.CPUQuota, config_parse_cpu_quota, 0, offsetof($1, cgroup_context)
|
2018-11-02 17:21:57 +01:00
|
|
|
$1.CPUQuotaPeriodSec, config_parse_sec_def_infinity, 0, offsetof($1, cgroup_context.cpu_quota_period_usec)
|
2013-06-27 04:14:27 +02:00
|
|
|
$1.MemoryAccounting, config_parse_bool, 0, offsetof($1, cgroup_context.memory_accounting)
|
2018-06-09 02:33:14 +02:00
|
|
|
$1.MemoryMin, config_parse_memory_limit, 0, offsetof($1, cgroup_context)
|
2019-05-03 14:19:05 +02:00
|
|
|
$1.DefaultMemoryMin, config_parse_memory_limit, 0, offsetof($1, cgroup_context)
|
cgroup: Implement default propagation of MemoryLow with DefaultMemoryLow
In cgroup v2 we have protection tunables -- currently MemoryLow and
MemoryMin (there will be more in future for other resources, too). The
design of these protection tunables requires not only intermediate
cgroups to propagate protections, but also the units at the leaf of that
resource's operation to accept it (by setting MemoryLow or MemoryMin).
This makes sense from an low-level API design perspective, but it's a
good idea to also have a higher-level abstraction that can, by default,
propagate these resources to children recursively. In this patch, this
happens by having descendants set memory.low to N if their ancestor has
DefaultMemoryLow=N -- assuming they don't set a separate MemoryLow
value.
Any affected unit can opt out of this propagation by manually setting
`MemoryLow` to some value in its unit configuration. A unit can also
stop further propagation by setting `DefaultMemoryLow=` with no
argument. This removes further propagation in the subtree, but has no
effect on the unit itself (for that, use `MemoryLow=0`).
Our use case in production is simplifying the configuration of machines
which heavily rely on memory protection tunables, but currently require
tweaking a huge number of unit files to make that a reality. This
directive makes that significantly less fragile, and decreases the risk
of misconfiguration.
After this patch is merged, I will implement DefaultMemoryMin= using the
same principles.
2019-03-28 13:50:50 +01:00
|
|
|
$1.DefaultMemoryLow, config_parse_memory_limit, 0, offsetof($1, cgroup_context)
|
2016-05-27 18:10:18 +02:00
|
|
|
$1.MemoryLow, config_parse_memory_limit, 0, offsetof($1, cgroup_context)
|
|
|
|
$1.MemoryHigh, config_parse_memory_limit, 0, offsetof($1, cgroup_context)
|
|
|
|
$1.MemoryMax, config_parse_memory_limit, 0, offsetof($1, cgroup_context)
|
2016-07-04 09:03:54 +02:00
|
|
|
$1.MemorySwapMax, config_parse_memory_limit, 0, offsetof($1, cgroup_context)
|
2013-06-27 04:14:27 +02:00
|
|
|
$1.MemoryLimit, config_parse_memory_limit, 0, offsetof($1, cgroup_context)
|
|
|
|
$1.DeviceAllow, config_parse_device_allow, 0, offsetof($1, cgroup_context)
|
|
|
|
$1.DevicePolicy, config_parse_device_policy, 0, offsetof($1, cgroup_context.device_policy)
|
2016-05-05 22:42:55 +02:00
|
|
|
$1.IOAccounting, config_parse_bool, 0, offsetof($1, cgroup_context.io_accounting)
|
2018-05-29 05:57:06 +02:00
|
|
|
$1.IOWeight, config_parse_cg_weight, 0, offsetof($1, cgroup_context.io_weight)
|
|
|
|
$1.StartupIOWeight, config_parse_cg_weight, 0, offsetof($1, cgroup_context.startup_io_weight)
|
2016-05-05 22:42:55 +02:00
|
|
|
$1.IODeviceWeight, config_parse_io_device_weight, 0, offsetof($1, cgroup_context)
|
|
|
|
$1.IOReadBandwidthMax, config_parse_io_limit, 0, offsetof($1, cgroup_context)
|
|
|
|
$1.IOWriteBandwidthMax, config_parse_io_limit, 0, offsetof($1, cgroup_context)
|
2016-05-18 22:50:56 +02:00
|
|
|
$1.IOReadIOPSMax, config_parse_io_limit, 0, offsetof($1, cgroup_context)
|
|
|
|
$1.IOWriteIOPSMax, config_parse_io_limit, 0, offsetof($1, cgroup_context)
|
2018-06-13 23:16:35 +02:00
|
|
|
$1.IODeviceLatencyTargetSec, config_parse_io_device_latency, 0, offsetof($1, cgroup_context)
|
2013-06-27 04:14:27 +02:00
|
|
|
$1.BlockIOAccounting, config_parse_bool, 0, offsetof($1, cgroup_context.blockio_accounting)
|
2014-05-22 00:06:16 +02:00
|
|
|
$1.BlockIOWeight, config_parse_blockio_weight, 0, offsetof($1, cgroup_context.blockio_weight)
|
2014-05-22 04:53:12 +02:00
|
|
|
$1.StartupBlockIOWeight, config_parse_blockio_weight, 0, offsetof($1, cgroup_context.startup_blockio_weight)
|
2013-07-11 20:40:18 +02:00
|
|
|
$1.BlockIODeviceWeight, config_parse_blockio_device_weight, 0, offsetof($1, cgroup_context)
|
2013-06-27 04:14:27 +02:00
|
|
|
$1.BlockIOReadBandwidth, config_parse_blockio_bandwidth, 0, offsetof($1, cgroup_context)
|
2014-11-05 17:57:23 +01:00
|
|
|
$1.BlockIOWriteBandwidth, config_parse_blockio_bandwidth, 0, offsetof($1, cgroup_context)
|
2015-09-10 12:32:16 +02:00
|
|
|
$1.TasksAccounting, config_parse_bool, 0, offsetof($1, cgroup_context.tasks_accounting)
|
2015-11-13 17:13:55 +01:00
|
|
|
$1.TasksMax, config_parse_tasks_max, 0, offsetof($1, cgroup_context.tasks_max)
|
2017-11-09 15:29:34 +01:00
|
|
|
$1.Delegate, config_parse_delegate, 0, offsetof($1, cgroup_context)
|
cgroup: Add DisableControllers= directive to disable controller in subtree
Some controllers (like the CPU controller) have a performance cost that
is non-trivial on certain workloads. While this can be mitigated and
improved to an extent, there will for some controllers always be some
overheads associated with the benefits gained from the controller.
Inside Facebook, the fix applied has been to disable the CPU controller
forcibly with `cgroup_disable=cpu` on the kernel command line.
This presents a problem: to disable or reenable the controller, a reboot
is required, but this is quite cumbersome and slow to do for many
thousands of machines, especially machines where disabling/enabling a
stateful service on a machine is a matter of several minutes.
Currently systemd provides some configuration knobs for these in the
form of `[Default]CPUAccounting`, `[Default]MemoryAccounting`, and the
like. The limitation of these is that Default*Accounting is overrideable
by individual services, of which any one could decide to reenable a
controller within the hierarchy at any point just by using a controller
feature implicitly (eg. `CPUWeight`), even if the use of that CPU
feature could just be opportunistic. Since many services are provided by
the distribution, or by upstream teams at a particular organisation,
it's not a sustainable solution to simply try to find and remove
offending directives from these units.
This commit presents a more direct solution -- a DisableControllers=
directive that forcibly disallows a controller from being enabled within
a subtree.
2018-12-03 15:38:06 +01:00
|
|
|
$1.DisableControllers, config_parse_disable_controllers, 0, offsetof($1, cgroup_context)
|
2017-09-05 19:27:53 +02:00
|
|
|
$1.IPAccounting, config_parse_bool, 0, offsetof($1, cgroup_context.ip_accounting)
|
|
|
|
$1.IPAddressAllow, config_parse_ip_address_access, 0, offsetof($1, cgroup_context.ip_address_allow)
|
|
|
|
$1.IPAddressDeny, config_parse_ip_address_access, 0, offsetof($1, cgroup_context.ip_address_deny)
|
2019-04-23 12:14:20 +02:00
|
|
|
$1.IPIngressFilterPath, config_parse_ip_filter_bpf_progs, 0, offsetof($1, cgroup_context.ip_filters_ingress)
|
|
|
|
$1.IPEgressFilterPath, config_parse_ip_filter_bpf_progs, 0, offsetof($1, cgroup_context.ip_filters_egress)
|
2016-02-10 15:44:01 +01:00
|
|
|
$1.NetClass, config_parse_warn_compat, DISABLED_LEGACY, 0'
|
2013-06-17 21:33:26 +02:00
|
|
|
)m4_dnl
|
2012-01-15 12:04:08 +01:00
|
|
|
Unit.Description, config_parse_unit_string_printf, 0, offsetof(Unit, description)
|
2012-05-21 15:12:18 +02:00
|
|
|
Unit.Documentation, config_parse_documentation, 0, offsetof(Unit, documentation)
|
core: enable specifier expansion for What=/Where=/Type=/SourcePath= too
Using specifiers in these settings isn't particularly useful by itself,
but it unifies behaviour a bit. It's kinda surprising that What= in
mount units resolves specifies, but Where= does not. Hence let's add
that too. Also, it's surprising Where=/What= in mount units behaves
differently than in automount and swap units, hence resolve specifiers
there too. Then, Type= in mount units is nowadays an arbitrary,
sometimes non-trivial string (think fuse!), hence let's also expand
specifiers there, to match the rest of the mount settings.
This has the benefit that when writing code that generates unit files,
less care has to be taken to check whether escaping of specifiers is
necessary or not: broadly everything that takes arbitrary user strings
now does specifier expansion, while enums/numerics/booleans do not.
2017-11-21 20:03:51 +01:00
|
|
|
Unit.SourcePath, config_parse_unit_path_printf, 0, offsetof(Unit, source_path)
|
2011-08-01 00:43:05 +02:00
|
|
|
Unit.Requires, config_parse_unit_deps, UNIT_REQUIRES, 0
|
|
|
|
Unit.Requisite, config_parse_unit_deps, UNIT_REQUISITE, 0
|
|
|
|
Unit.Wants, config_parse_unit_deps, UNIT_WANTS, 0
|
2012-07-13 23:34:40 +02:00
|
|
|
Unit.BindsTo, config_parse_unit_deps, UNIT_BINDS_TO, 0
|
|
|
|
Unit.BindTo, config_parse_unit_deps, UNIT_BINDS_TO, 0
|
2011-08-01 00:43:05 +02:00
|
|
|
Unit.Conflicts, config_parse_unit_deps, UNIT_CONFLICTS, 0
|
|
|
|
Unit.Before, config_parse_unit_deps, UNIT_BEFORE, 0
|
|
|
|
Unit.After, config_parse_unit_deps, UNIT_AFTER, 0
|
|
|
|
Unit.OnFailure, config_parse_unit_deps, UNIT_ON_FAILURE, 0
|
2012-07-13 23:34:40 +02:00
|
|
|
Unit.PropagatesReloadTo, config_parse_unit_deps, UNIT_PROPAGATES_RELOAD_TO, 0
|
|
|
|
Unit.PropagateReloadTo, config_parse_unit_deps, UNIT_PROPAGATES_RELOAD_TO, 0
|
|
|
|
Unit.ReloadPropagatedFrom, config_parse_unit_deps, UNIT_RELOAD_PROPAGATED_FROM, 0
|
|
|
|
Unit.PropagateReloadFrom, config_parse_unit_deps, UNIT_RELOAD_PROPAGATED_FROM, 0
|
2012-07-20 15:55:01 +02:00
|
|
|
Unit.PartOf, config_parse_unit_deps, UNIT_PART_OF, 0
|
2013-11-27 20:23:18 +01:00
|
|
|
Unit.JoinsNamespaceOf, config_parse_unit_deps, UNIT_JOINS_NAMESPACE_OF, 0
|
2015-11-12 19:21:47 +01:00
|
|
|
Unit.RequiresOverridable, config_parse_obsolete_unit_deps, UNIT_REQUIRES, 0
|
2017-11-08 06:29:47 +01:00
|
|
|
Unit.RequisiteOverridable, config_parse_obsolete_unit_deps, UNIT_REQUISITE, 0
|
2013-09-26 20:14:24 +02:00
|
|
|
Unit.RequiresMountsFor, config_parse_unit_requires_mounts_for, 0, 0
|
2012-01-15 12:04:08 +01:00
|
|
|
Unit.StopWhenUnneeded, config_parse_bool, 0, offsetof(Unit, stop_when_unneeded)
|
|
|
|
Unit.RefuseManualStart, config_parse_bool, 0, offsetof(Unit, refuse_manual_start)
|
|
|
|
Unit.RefuseManualStop, config_parse_bool, 0, offsetof(Unit, refuse_manual_stop)
|
|
|
|
Unit.AllowIsolate, config_parse_bool, 0, offsetof(Unit, allow_isolate)
|
|
|
|
Unit.DefaultDependencies, config_parse_bool, 0, offsetof(Unit, default_dependencies)
|
2013-11-26 01:39:53 +01:00
|
|
|
Unit.OnFailureJobMode, config_parse_job_mode, 0, offsetof(Unit, on_failure_job_mode)
|
2017-12-29 09:00:40 +01:00
|
|
|
m4_dnl The following is a legacy alias name for compatibility
|
2013-11-26 01:39:53 +01:00
|
|
|
Unit.OnFailureIsolate, config_parse_job_mode_isolate, 0, offsetof(Unit, on_failure_job_mode)
|
2012-01-15 12:04:08 +01:00
|
|
|
Unit.IgnoreOnIsolate, config_parse_bool, 0, offsetof(Unit, ignore_on_isolate)
|
Remove snapshot unit type
Snapshots were never useful or used for anything. Many systemd
developers that I spoke to at systemd.conf2015, didn't even know they
existed, so it is fairly safe to assume that this type can be deleted
without harm.
The fundamental problem with snapshots is that the state of the system
is dynamic, devices come and go, users log in and out, timers fire...
and restoring all units to some state from the past would "undo"
those changes, which isn't really possible.
Tested by creating a snapshot, running the new binary, and checking
that the transition did not cause errors, and the snapshot is gone,
and snapshots cannot be created anymore.
New systemctl says:
Unknown operation snapshot.
Old systemctl says:
Failed to create snapshot: Support for snapshots has been removed.
IgnoreOnSnaphost settings are warned about and ignored:
Support for option IgnoreOnSnapshot= has been removed and it is ignored
http://lists.freedesktop.org/archives/systemd-devel/2015-November/034872.html
2015-11-08 14:12:54 +01:00
|
|
|
Unit.IgnoreOnSnapshot, config_parse_warn_compat, DISABLED_LEGACY, 0
|
2017-09-27 17:30:50 +02:00
|
|
|
Unit.JobTimeoutSec, config_parse_job_timeout_sec, 0, 0
|
|
|
|
Unit.JobRunningTimeoutSec, config_parse_job_running_timeout_sec, 0, 0
|
2016-10-20 15:27:37 +02:00
|
|
|
Unit.JobTimeoutAction, config_parse_emergency_action, 0, offsetof(Unit, job_timeout_action)
|
2016-12-05 19:38:39 +01:00
|
|
|
Unit.JobTimeoutRebootArgument, config_parse_unit_string_printf, 0, offsetof(Unit, job_timeout_reboot_arg)
|
2019-09-19 17:45:41 +02:00
|
|
|
Unit.StartLimitIntervalSec, config_parse_sec, 0, offsetof(Unit, start_ratelimit.interval)
|
2016-04-26 20:46:20 +02:00
|
|
|
m4_dnl The following is a legacy alias name for compatibility
|
2019-09-19 17:45:41 +02:00
|
|
|
Unit.StartLimitInterval, config_parse_sec, 0, offsetof(Unit, start_ratelimit.interval)
|
|
|
|
Unit.StartLimitBurst, config_parse_unsigned, 0, offsetof(Unit, start_ratelimit.burst)
|
2016-10-20 15:27:37 +02:00
|
|
|
Unit.StartLimitAction, config_parse_emergency_action, 0, offsetof(Unit, start_limit_action)
|
2017-11-16 15:02:56 +01:00
|
|
|
Unit.FailureAction, config_parse_emergency_action, 0, offsetof(Unit, failure_action)
|
2017-11-16 15:18:01 +01:00
|
|
|
Unit.SuccessAction, config_parse_emergency_action, 0, offsetof(Unit, success_action)
|
2018-11-16 11:41:18 +01:00
|
|
|
Unit.FailureActionExitStatus, config_parse_exit_status, 0, offsetof(Unit, failure_action_exit_status)
|
|
|
|
Unit.SuccessActionExitStatus, config_parse_exit_status, 0, offsetof(Unit, success_action_exit_status)
|
2016-12-05 19:38:39 +01:00
|
|
|
Unit.RebootArgument, config_parse_unit_string_printf, 0, offsetof(Unit, reboot_arg)
|
2019-06-26 14:58:45 +02:00
|
|
|
m4_dnl Also add any conditions to condition_definitions[] in src/analyze/analyze-condition.c.
|
2014-11-06 13:43:45 +01:00
|
|
|
Unit.ConditionPathExists, config_parse_unit_condition_path, CONDITION_PATH_EXISTS, offsetof(Unit, conditions)
|
|
|
|
Unit.ConditionPathExistsGlob, config_parse_unit_condition_path, CONDITION_PATH_EXISTS_GLOB, offsetof(Unit, conditions)
|
|
|
|
Unit.ConditionPathIsDirectory, config_parse_unit_condition_path, CONDITION_PATH_IS_DIRECTORY, offsetof(Unit, conditions)
|
|
|
|
Unit.ConditionPathIsSymbolicLink,config_parse_unit_condition_path, CONDITION_PATH_IS_SYMBOLIC_LINK,offsetof(Unit, conditions)
|
|
|
|
Unit.ConditionPathIsMountPoint, config_parse_unit_condition_path, CONDITION_PATH_IS_MOUNT_POINT, offsetof(Unit, conditions)
|
|
|
|
Unit.ConditionPathIsReadWrite, config_parse_unit_condition_path, CONDITION_PATH_IS_READ_WRITE, offsetof(Unit, conditions)
|
|
|
|
Unit.ConditionDirectoryNotEmpty, config_parse_unit_condition_path, CONDITION_DIRECTORY_NOT_EMPTY, offsetof(Unit, conditions)
|
|
|
|
Unit.ConditionFileNotEmpty, config_parse_unit_condition_path, CONDITION_FILE_NOT_EMPTY, offsetof(Unit, conditions)
|
|
|
|
Unit.ConditionFileIsExecutable, config_parse_unit_condition_path, CONDITION_FILE_IS_EXECUTABLE, offsetof(Unit, conditions)
|
|
|
|
Unit.ConditionNeedsUpdate, config_parse_unit_condition_path, CONDITION_NEEDS_UPDATE, offsetof(Unit, conditions)
|
|
|
|
Unit.ConditionFirstBoot, config_parse_unit_condition_string, CONDITION_FIRST_BOOT, offsetof(Unit, conditions)
|
|
|
|
Unit.ConditionKernelCommandLine, config_parse_unit_condition_string, CONDITION_KERNEL_COMMAND_LINE, offsetof(Unit, conditions)
|
core,udev,networkd: add ConditionKernelVersion=
This adds a simple condition/assert/match to the service manager, to
udev's .link handling and to networkd, for matching the kernel version
string.
In this version we only do fnmatch() based globbing, but we might want
to extend that to version comparisons later on, if we like, by slightly
extending the syntax with ">=", "<=", ">", "<" and "==" expressions.
2017-12-13 20:34:13 +01:00
|
|
|
Unit.ConditionKernelVersion, config_parse_unit_condition_string, CONDITION_KERNEL_VERSION, offsetof(Unit, conditions)
|
2014-11-06 13:43:45 +01:00
|
|
|
Unit.ConditionArchitecture, config_parse_unit_condition_string, CONDITION_ARCHITECTURE, offsetof(Unit, conditions)
|
|
|
|
Unit.ConditionVirtualization, config_parse_unit_condition_string, CONDITION_VIRTUALIZATION, offsetof(Unit, conditions)
|
|
|
|
Unit.ConditionSecurity, config_parse_unit_condition_string, CONDITION_SECURITY, offsetof(Unit, conditions)
|
|
|
|
Unit.ConditionCapability, config_parse_unit_condition_string, CONDITION_CAPABILITY, offsetof(Unit, conditions)
|
|
|
|
Unit.ConditionHost, config_parse_unit_condition_string, CONDITION_HOST, offsetof(Unit, conditions)
|
|
|
|
Unit.ConditionACPower, config_parse_unit_condition_string, CONDITION_AC_POWER, offsetof(Unit, conditions)
|
2017-04-09 01:32:13 +02:00
|
|
|
Unit.ConditionUser, config_parse_unit_condition_string, CONDITION_USER, offsetof(Unit, conditions)
|
|
|
|
Unit.ConditionGroup, config_parse_unit_condition_string, CONDITION_GROUP, offsetof(Unit, conditions)
|
2017-12-18 08:53:29 +01:00
|
|
|
Unit.ConditionControlGroupController, config_parse_unit_condition_string, CONDITION_CONTROL_GROUP_CONTROLLER, offsetof(Unit, conditions)
|
2014-11-06 13:43:45 +01:00
|
|
|
Unit.ConditionNull, config_parse_unit_condition_null, 0, offsetof(Unit, conditions)
|
|
|
|
Unit.AssertPathExists, config_parse_unit_condition_path, CONDITION_PATH_EXISTS, offsetof(Unit, asserts)
|
|
|
|
Unit.AssertPathExistsGlob, config_parse_unit_condition_path, CONDITION_PATH_EXISTS_GLOB, offsetof(Unit, asserts)
|
|
|
|
Unit.AssertPathIsDirectory, config_parse_unit_condition_path, CONDITION_PATH_IS_DIRECTORY, offsetof(Unit, asserts)
|
|
|
|
Unit.AssertPathIsSymbolicLink, config_parse_unit_condition_path, CONDITION_PATH_IS_SYMBOLIC_LINK,offsetof(Unit, asserts)
|
|
|
|
Unit.AssertPathIsMountPoint, config_parse_unit_condition_path, CONDITION_PATH_IS_MOUNT_POINT, offsetof(Unit, asserts)
|
|
|
|
Unit.AssertPathIsReadWrite, config_parse_unit_condition_path, CONDITION_PATH_IS_READ_WRITE, offsetof(Unit, asserts)
|
|
|
|
Unit.AssertDirectoryNotEmpty, config_parse_unit_condition_path, CONDITION_DIRECTORY_NOT_EMPTY, offsetof(Unit, asserts)
|
|
|
|
Unit.AssertFileNotEmpty, config_parse_unit_condition_path, CONDITION_FILE_NOT_EMPTY, offsetof(Unit, asserts)
|
|
|
|
Unit.AssertFileIsExecutable, config_parse_unit_condition_path, CONDITION_FILE_IS_EXECUTABLE, offsetof(Unit, asserts)
|
|
|
|
Unit.AssertNeedsUpdate, config_parse_unit_condition_path, CONDITION_NEEDS_UPDATE, offsetof(Unit, asserts)
|
|
|
|
Unit.AssertFirstBoot, config_parse_unit_condition_string, CONDITION_FIRST_BOOT, offsetof(Unit, asserts)
|
|
|
|
Unit.AssertKernelCommandLine, config_parse_unit_condition_string, CONDITION_KERNEL_COMMAND_LINE, offsetof(Unit, asserts)
|
core,udev,networkd: add ConditionKernelVersion=
This adds a simple condition/assert/match to the service manager, to
udev's .link handling and to networkd, for matching the kernel version
string.
In this version we only do fnmatch() based globbing, but we might want
to extend that to version comparisons later on, if we like, by slightly
extending the syntax with ">=", "<=", ">", "<" and "==" expressions.
2017-12-13 20:34:13 +01:00
|
|
|
Unit.AssertKernelVersion, config_parse_unit_condition_string, CONDITION_KERNEL_VERSION, offsetof(Unit, asserts)
|
2014-11-06 13:43:45 +01:00
|
|
|
Unit.AssertArchitecture, config_parse_unit_condition_string, CONDITION_ARCHITECTURE, offsetof(Unit, asserts)
|
|
|
|
Unit.AssertVirtualization, config_parse_unit_condition_string, CONDITION_VIRTUALIZATION, offsetof(Unit, asserts)
|
|
|
|
Unit.AssertSecurity, config_parse_unit_condition_string, CONDITION_SECURITY, offsetof(Unit, asserts)
|
|
|
|
Unit.AssertCapability, config_parse_unit_condition_string, CONDITION_CAPABILITY, offsetof(Unit, asserts)
|
|
|
|
Unit.AssertHost, config_parse_unit_condition_string, CONDITION_HOST, offsetof(Unit, asserts)
|
|
|
|
Unit.AssertACPower, config_parse_unit_condition_string, CONDITION_AC_POWER, offsetof(Unit, asserts)
|
2017-04-09 01:32:13 +02:00
|
|
|
Unit.AssertUser, config_parse_unit_condition_string, CONDITION_USER, offsetof(Unit, asserts)
|
|
|
|
Unit.AssertGroup, config_parse_unit_condition_string, CONDITION_GROUP, offsetof(Unit, asserts)
|
2017-12-18 08:53:29 +01:00
|
|
|
Unit.AssertControlGroupController, config_parse_unit_condition_string, CONDITION_CONTROL_GROUP_CONTROLLER, offsetof(Unit, asserts)
|
2014-11-06 13:43:45 +01:00
|
|
|
Unit.AssertNull, config_parse_unit_condition_null, 0, offsetof(Unit, asserts)
|
2017-11-13 17:14:07 +01:00
|
|
|
Unit.CollectMode, config_parse_collect_mode, 0, offsetof(Unit, collect_mode)
|
2011-08-01 00:43:05 +02:00
|
|
|
m4_dnl
|
2018-11-09 18:19:40 +01:00
|
|
|
Service.PIDFile, config_parse_pid_file, 0, offsetof(Service, pid_file)
|
2019-06-29 02:02:30 +02:00
|
|
|
Service.ExecCondition, config_parse_exec, SERVICE_EXEC_CONDITION, offsetof(Service, exec_command)
|
2011-08-01 00:43:05 +02:00
|
|
|
Service.ExecStartPre, config_parse_exec, SERVICE_EXEC_START_PRE, offsetof(Service, exec_command)
|
|
|
|
Service.ExecStart, config_parse_exec, SERVICE_EXEC_START, offsetof(Service, exec_command)
|
|
|
|
Service.ExecStartPost, config_parse_exec, SERVICE_EXEC_START_POST, offsetof(Service, exec_command)
|
|
|
|
Service.ExecReload, config_parse_exec, SERVICE_EXEC_RELOAD, offsetof(Service, exec_command)
|
|
|
|
Service.ExecStop, config_parse_exec, SERVICE_EXEC_STOP, offsetof(Service, exec_command)
|
|
|
|
Service.ExecStopPost, config_parse_exec, SERVICE_EXEC_STOP_POST, offsetof(Service, exec_command)
|
2013-04-02 20:38:16 +02:00
|
|
|
Service.RestartSec, config_parse_sec, 0, offsetof(Service, restart_usec)
|
2016-02-08 23:54:54 +01:00
|
|
|
Service.TimeoutSec, config_parse_service_timeout, 0, 0
|
|
|
|
Service.TimeoutStartSec, config_parse_service_timeout, 0, 0
|
2018-05-25 05:16:24 +02:00
|
|
|
Service.TimeoutStopSec, config_parse_sec_fix_0, 0, offsetof(Service, timeout_stop_usec)
|
2017-11-29 07:43:44 +01:00
|
|
|
Service.TimeoutAbortSec, config_parse_service_timeout_abort, 0, 0
|
2019-04-16 16:45:20 +02:00
|
|
|
Service.TimeoutStartFailureMode, config_parse_service_timeout_failure_mode, 0, offsetof(Service, timeout_start_failure_mode)
|
|
|
|
Service.TimeoutStopFailureMode, config_parse_service_timeout_failure_mode, 0, offsetof(Service, timeout_stop_failure_mode)
|
core: rework unit timeout handling, and add new setting RuntimeMaxSec=
This clean-ups timeout handling in PID 1. Specifically, instead of storing 0 in internal timeout variables as
indication for a disabled timeout, use USEC_INFINITY which is in-line with how we do this in the rest of our code
(following the logic that 0 means "no", and USEC_INFINITY means "never").
This also replace all usec_t additions with invocations to usec_add(), so that USEC_INFINITY is properly propagated,
and sd-event considers it has indication for turning off the event source.
This also alters the deserialization of the units to restart timeouts from the time they were originally started from.
Before this patch timeouts would be restarted beginning with the time of the deserialization, which could lead to
artificially prolonged timeouts if a daemon reload took place.
Finally, a new RuntimeMaxSec= setting is introduced for service units, that specifies a maximum runtime after which a
specific service is forcibly terminated. This is useful to put time limits on time-intensive processing jobs.
This also simplifies the various xyz_spawn() calls of the various types in that explicit distruction of the timers is
removed, as that is done anyway by the state change handlers, and a state change is always done when the xyz_spawn()
calls fail.
Fixes: #2249
2016-02-01 21:48:10 +01:00
|
|
|
Service.RuntimeMaxSec, config_parse_sec, 0, offsetof(Service, runtime_max_usec)
|
2013-04-02 20:38:16 +02:00
|
|
|
Service.WatchdogSec, config_parse_sec, 0, offsetof(Service, watchdog_usec)
|
2017-11-16 15:02:56 +01:00
|
|
|
m4_dnl The following five only exist for compatibility, they moved into Unit, see above
|
2019-09-19 17:45:41 +02:00
|
|
|
Service.StartLimitInterval, config_parse_sec, 0, offsetof(Unit, start_ratelimit.interval)
|
|
|
|
Service.StartLimitBurst, config_parse_unsigned, 0, offsetof(Unit, start_ratelimit.burst)
|
2016-10-20 15:27:37 +02:00
|
|
|
Service.StartLimitAction, config_parse_emergency_action, 0, offsetof(Unit, start_limit_action)
|
2017-11-16 15:02:56 +01:00
|
|
|
Service.FailureAction, config_parse_emergency_action, 0, offsetof(Unit, failure_action)
|
2017-11-21 19:23:31 +01:00
|
|
|
Service.RebootArgument, config_parse_unit_string_printf, 0, offsetof(Unit, reboot_arg)
|
2011-08-01 00:43:05 +02:00
|
|
|
Service.Type, config_parse_service_type, 0, offsetof(Service, type)
|
|
|
|
Service.Restart, config_parse_service_restart, 0, offsetof(Service, restart)
|
|
|
|
Service.PermissionsStartOnly, config_parse_bool, 0, offsetof(Service, permissions_start_only)
|
|
|
|
Service.RootDirectoryStartOnly, config_parse_bool, 0, offsetof(Service, root_directory_start_only)
|
|
|
|
Service.RemainAfterExit, config_parse_bool, 0, offsetof(Service, remain_after_exit)
|
|
|
|
Service.GuessMainPID, config_parse_bool, 0, offsetof(Service, guess_main_pid)
|
2014-07-03 12:47:40 +02:00
|
|
|
Service.RestartPreventExitStatus, config_parse_set_status, 0, offsetof(Service, restart_prevent_status)
|
|
|
|
Service.RestartForceExitStatus, config_parse_set_status, 0, offsetof(Service, restart_force_status)
|
2012-08-13 13:58:01 +02:00
|
|
|
Service.SuccessExitStatus, config_parse_set_status, 0, offsetof(Service, success_status)
|
2014-11-30 16:42:53 +01:00
|
|
|
Service.SysVStartPriority, config_parse_warn_compat, DISABLED_LEGACY, 0
|
2011-08-01 00:43:05 +02:00
|
|
|
Service.NonBlocking, config_parse_bool, 0, offsetof(Service, exec_context.non_blocking)
|
2015-01-07 22:07:09 +01:00
|
|
|
Service.BusName, config_parse_bus_name, 0, offsetof(Service, bus_name)
|
2015-01-06 00:26:25 +01:00
|
|
|
Service.FileDescriptorStoreMax, config_parse_unsigned, 0, offsetof(Service, n_fd_store_max)
|
2011-08-01 00:43:05 +02:00
|
|
|
Service.NotifyAccess, config_parse_notify_access, 0, offsetof(Service, notify_access)
|
|
|
|
Service.Sockets, config_parse_service_sockets, 0, 0
|
2016-02-11 22:12:04 +01:00
|
|
|
Service.BusPolicy, config_parse_warn_compat, DISABLED_LEGACY, 0
|
2016-12-05 19:38:39 +01:00
|
|
|
Service.USBFunctionDescriptors, config_parse_unit_path_printf, 0, offsetof(Service, usb_function_descriptors)
|
|
|
|
Service.USBFunctionStrings, config_parse_unit_path_printf, 0, offsetof(Service, usb_function_strings)
|
2019-03-19 19:05:19 +01:00
|
|
|
Service.OOMPolicy, config_parse_oom_policy, 0, offsetof(Service, oom_policy)
|
2011-08-01 00:43:05 +02:00
|
|
|
EXEC_CONTEXT_CONFIG_ITEMS(Service)m4_dnl
|
2013-06-17 21:33:26 +02:00
|
|
|
CGROUP_CONTEXT_CONFIG_ITEMS(Service)m4_dnl
|
2012-07-19 23:47:10 +02:00
|
|
|
KILL_CONTEXT_CONFIG_ITEMS(Service)m4_dnl
|
2011-08-01 00:43:05 +02:00
|
|
|
m4_dnl
|
2013-01-17 02:27:06 +01:00
|
|
|
Socket.ListenStream, config_parse_socket_listen, SOCKET_SOCKET, 0
|
|
|
|
Socket.ListenDatagram, config_parse_socket_listen, SOCKET_SOCKET, 0
|
|
|
|
Socket.ListenSequentialPacket, config_parse_socket_listen, SOCKET_SOCKET, 0
|
|
|
|
Socket.ListenFIFO, config_parse_socket_listen, SOCKET_FIFO, 0
|
|
|
|
Socket.ListenNetlink, config_parse_socket_listen, SOCKET_SOCKET, 0
|
|
|
|
Socket.ListenSpecial, config_parse_socket_listen, SOCKET_SPECIAL, 0
|
|
|
|
Socket.ListenMessageQueue, config_parse_socket_listen, SOCKET_MQUEUE, 0
|
2015-09-21 15:43:47 +02:00
|
|
|
Socket.ListenUSBFunction, config_parse_socket_listen, SOCKET_USB_FUNCTION, 0
|
2018-05-29 05:49:47 +02:00
|
|
|
Socket.SocketProtocol, config_parse_socket_protocol, 0, offsetof(Socket, socket_protocol)
|
2018-05-29 05:40:28 +02:00
|
|
|
Socket.BindIPv6Only, config_parse_socket_bind, 0, offsetof(Socket, bind_ipv6_only)
|
2011-08-01 00:43:05 +02:00
|
|
|
Socket.Backlog, config_parse_unsigned, 0, offsetof(Socket, backlog)
|
|
|
|
Socket.BindToDevice, config_parse_socket_bindtodevice, 0, 0
|
|
|
|
Socket.ExecStartPre, config_parse_exec, SOCKET_EXEC_START_PRE, offsetof(Socket, exec_command)
|
|
|
|
Socket.ExecStartPost, config_parse_exec, SOCKET_EXEC_START_POST, offsetof(Socket, exec_command)
|
|
|
|
Socket.ExecStopPre, config_parse_exec, SOCKET_EXEC_STOP_PRE, offsetof(Socket, exec_command)
|
|
|
|
Socket.ExecStopPost, config_parse_exec, SOCKET_EXEC_STOP_POST, offsetof(Socket, exec_command)
|
2017-05-23 09:42:26 +02:00
|
|
|
Socket.TimeoutSec, config_parse_sec_fix_0, 0, offsetof(Socket, timeout_usec)
|
2019-08-01 09:58:27 +02:00
|
|
|
Socket.SocketUser, config_parse_user_group_compat, 0, offsetof(Socket, user)
|
|
|
|
Socket.SocketGroup, config_parse_user_group_compat, 0, offsetof(Socket, group)
|
2011-08-01 00:43:05 +02:00
|
|
|
Socket.SocketMode, config_parse_mode, 0, offsetof(Socket, socket_mode)
|
2014-06-05 09:55:53 +02:00
|
|
|
Socket.DirectoryMode, config_parse_mode, 0, offsetof(Socket, directory_mode)
|
2011-08-01 00:43:05 +02:00
|
|
|
Socket.Accept, config_parse_bool, 0, offsetof(Socket, accept)
|
2015-10-01 14:28:13 +02:00
|
|
|
Socket.Writable, config_parse_bool, 0, offsetof(Socket, writable)
|
2011-08-01 00:43:05 +02:00
|
|
|
Socket.MaxConnections, config_parse_unsigned, 0, offsetof(Socket, max_connections)
|
2016-08-02 19:48:23 +02:00
|
|
|
Socket.MaxConnectionsPerSource, config_parse_unsigned, 0, offsetof(Socket, max_connections_per_source)
|
2011-08-01 00:43:05 +02:00
|
|
|
Socket.KeepAlive, config_parse_bool, 0, offsetof(Socket, keep_alive)
|
2014-08-19 21:57:37 +02:00
|
|
|
Socket.KeepAliveTimeSec, config_parse_sec, 0, offsetof(Socket, keep_alive_time)
|
|
|
|
Socket.KeepAliveIntervalSec, config_parse_sec, 0, offsetof(Socket, keep_alive_interval)
|
2014-08-14 19:36:11 +02:00
|
|
|
Socket.KeepAliveProbes, config_parse_unsigned, 0, offsetof(Socket, keep_alive_cnt)
|
2014-08-19 21:57:37 +02:00
|
|
|
Socket.DeferAcceptSec, config_parse_sec, 0, offsetof(Socket, defer_accept)
|
2014-07-28 08:48:29 +02:00
|
|
|
Socket.NoDelay, config_parse_bool, 0, offsetof(Socket, no_delay)
|
2011-08-01 00:43:05 +02:00
|
|
|
Socket.Priority, config_parse_int, 0, offsetof(Socket, priority)
|
2014-02-23 03:13:54 +01:00
|
|
|
Socket.ReceiveBuffer, config_parse_iec_size, 0, offsetof(Socket, receive_buffer)
|
|
|
|
Socket.SendBuffer, config_parse_iec_size, 0, offsetof(Socket, send_buffer)
|
2011-08-01 00:43:05 +02:00
|
|
|
Socket.IPTOS, config_parse_ip_tos, 0, offsetof(Socket, ip_tos)
|
|
|
|
Socket.IPTTL, config_parse_int, 0, offsetof(Socket, ip_ttl)
|
|
|
|
Socket.Mark, config_parse_int, 0, offsetof(Socket, mark)
|
2014-02-23 03:13:54 +01:00
|
|
|
Socket.PipeSize, config_parse_iec_size, 0, offsetof(Socket, pipe_size)
|
2011-08-01 00:43:05 +02:00
|
|
|
Socket.FreeBind, config_parse_bool, 0, offsetof(Socket, free_bind)
|
|
|
|
Socket.Transparent, config_parse_bool, 0, offsetof(Socket, transparent)
|
|
|
|
Socket.Broadcast, config_parse_bool, 0, offsetof(Socket, broadcast)
|
2011-12-31 01:07:49 +01:00
|
|
|
Socket.PassCredentials, config_parse_bool, 0, offsetof(Socket, pass_cred)
|
2012-03-13 00:00:27 +01:00
|
|
|
Socket.PassSecurity, config_parse_bool, 0, offsetof(Socket, pass_sec)
|
2020-05-27 19:36:56 +02:00
|
|
|
Socket.PassPacketInfo, config_parse_bool, 0, offsetof(Socket, pass_pktinfo)
|
2011-08-01 00:43:05 +02:00
|
|
|
Socket.TCPCongestion, config_parse_string, 0, offsetof(Socket, tcp_congestion)
|
2013-11-19 21:12:59 +01:00
|
|
|
Socket.ReusePort, config_parse_bool, 0, offsetof(Socket, reuse_port)
|
2011-08-01 00:43:05 +02:00
|
|
|
Socket.MessageQueueMaxMessages, config_parse_long, 0, offsetof(Socket, mq_maxmsg)
|
|
|
|
Socket.MessageQueueMessageSize, config_parse_long, 0, offsetof(Socket, mq_msgsize)
|
2014-06-04 13:10:43 +02:00
|
|
|
Socket.RemoveOnStop, config_parse_bool, 0, offsetof(Socket, remove_on_stop)
|
2014-06-04 16:19:00 +02:00
|
|
|
Socket.Symlinks, config_parse_unit_path_strv_printf, 0, offsetof(Socket, symlinks)
|
2015-10-04 17:36:19 +02:00
|
|
|
Socket.FileDescriptorName, config_parse_fdname, 0, 0
|
2011-08-01 00:43:05 +02:00
|
|
|
Socket.Service, config_parse_socket_service, 0, 0
|
2016-04-26 20:26:15 +02:00
|
|
|
Socket.TriggerLimitIntervalSec, config_parse_sec, 0, offsetof(Socket, trigger_limit.interval)
|
|
|
|
Socket.TriggerLimitBurst, config_parse_unsigned, 0, offsetof(Socket, trigger_limit.burst)
|
2017-10-03 12:22:40 +02:00
|
|
|
m4_ifdef(`ENABLE_SMACK',
|
2016-12-05 19:38:39 +01:00
|
|
|
`Socket.SmackLabel, config_parse_unit_string_printf, 0, offsetof(Socket, smack)
|
|
|
|
Socket.SmackLabelIPIn, config_parse_unit_string_printf, 0, offsetof(Socket, smack_ip_in)
|
|
|
|
Socket.SmackLabelIPOut, config_parse_unit_string_printf, 0, offsetof(Socket, smack_ip_out)',
|
2014-11-30 16:21:49 +01:00
|
|
|
`Socket.SmackLabel, config_parse_warn_compat, DISABLED_CONFIGURATION, 0
|
|
|
|
Socket.SmackLabelIPIn, config_parse_warn_compat, DISABLED_CONFIGURATION, 0
|
|
|
|
Socket.SmackLabelIPOut, config_parse_warn_compat, DISABLED_CONFIGURATION, 0')
|
2014-07-24 10:40:28 +02:00
|
|
|
m4_ifdef(`HAVE_SELINUX',
|
|
|
|
`Socket.SELinuxContextFromNet, config_parse_bool, 0, offsetof(Socket, selinux_context_from_net)',
|
2014-11-30 16:21:49 +01:00
|
|
|
`Socket.SELinuxContextFromNet, config_parse_warn_compat, DISABLED_CONFIGURATION, 0')
|
2011-08-01 00:43:05 +02:00
|
|
|
EXEC_CONTEXT_CONFIG_ITEMS(Socket)m4_dnl
|
2013-06-17 21:33:26 +02:00
|
|
|
CGROUP_CONTEXT_CONFIG_ITEMS(Socket)m4_dnl
|
2012-07-19 23:47:10 +02:00
|
|
|
KILL_CONTEXT_CONFIG_ITEMS(Socket)m4_dnl
|
2011-08-01 00:43:05 +02:00
|
|
|
m4_dnl
|
2016-12-05 19:38:39 +01:00
|
|
|
Mount.What, config_parse_unit_string_printf, 0, offsetof(Mount, parameters_fragment.what)
|
core: enable specifier expansion for What=/Where=/Type=/SourcePath= too
Using specifiers in these settings isn't particularly useful by itself,
but it unifies behaviour a bit. It's kinda surprising that What= in
mount units resolves specifies, but Where= does not. Hence let's add
that too. Also, it's surprising Where=/What= in mount units behaves
differently than in automount and swap units, hence resolve specifiers
there too. Then, Type= in mount units is nowadays an arbitrary,
sometimes non-trivial string (think fuse!), hence let's also expand
specifiers there, to match the rest of the mount settings.
This has the benefit that when writing code that generates unit files,
less care has to be taken to check whether escaping of specifiers is
necessary or not: broadly everything that takes arbitrary user strings
now does specifier expansion, while enums/numerics/booleans do not.
2017-11-21 20:03:51 +01:00
|
|
|
Mount.Where, config_parse_unit_path_printf, 0, offsetof(Mount, where)
|
2016-12-05 19:38:39 +01:00
|
|
|
Mount.Options, config_parse_unit_string_printf, 0, offsetof(Mount, parameters_fragment.options)
|
core: enable specifier expansion for What=/Where=/Type=/SourcePath= too
Using specifiers in these settings isn't particularly useful by itself,
but it unifies behaviour a bit. It's kinda surprising that What= in
mount units resolves specifies, but Where= does not. Hence let's add
that too. Also, it's surprising Where=/What= in mount units behaves
differently than in automount and swap units, hence resolve specifiers
there too. Then, Type= in mount units is nowadays an arbitrary,
sometimes non-trivial string (think fuse!), hence let's also expand
specifiers there, to match the rest of the mount settings.
This has the benefit that when writing code that generates unit files,
less care has to be taken to check whether escaping of specifiers is
necessary or not: broadly everything that takes arbitrary user strings
now does specifier expansion, while enums/numerics/booleans do not.
2017-11-21 20:03:51 +01:00
|
|
|
Mount.Type, config_parse_unit_string_printf, 0, offsetof(Mount, parameters_fragment.fstype)
|
2017-05-23 09:42:26 +02:00
|
|
|
Mount.TimeoutSec, config_parse_sec_fix_0, 0, offsetof(Mount, timeout_usec)
|
2011-08-01 00:43:05 +02:00
|
|
|
Mount.DirectoryMode, config_parse_mode, 0, offsetof(Mount, directory_mode)
|
2014-06-16 01:02:27 +02:00
|
|
|
Mount.SloppyOptions, config_parse_bool, 0, offsetof(Mount, sloppy_options)
|
2016-08-26 17:57:22 +02:00
|
|
|
Mount.LazyUnmount, config_parse_bool, 0, offsetof(Mount, lazy_unmount)
|
2016-08-27 16:27:49 +02:00
|
|
|
Mount.ForceUnmount, config_parse_bool, 0, offsetof(Mount, force_unmount)
|
2020-05-01 10:20:17 +02:00
|
|
|
Mount.ReadWriteOnly, config_parse_bool, 0, offsetof(Mount, read_write_only)
|
2011-08-01 00:43:05 +02:00
|
|
|
EXEC_CONTEXT_CONFIG_ITEMS(Mount)m4_dnl
|
2013-06-17 21:33:26 +02:00
|
|
|
CGROUP_CONTEXT_CONFIG_ITEMS(Mount)m4_dnl
|
2012-07-19 23:47:10 +02:00
|
|
|
KILL_CONTEXT_CONFIG_ITEMS(Mount)m4_dnl
|
2011-08-01 00:43:05 +02:00
|
|
|
m4_dnl
|
core: enable specifier expansion for What=/Where=/Type=/SourcePath= too
Using specifiers in these settings isn't particularly useful by itself,
but it unifies behaviour a bit. It's kinda surprising that What= in
mount units resolves specifies, but Where= does not. Hence let's add
that too. Also, it's surprising Where=/What= in mount units behaves
differently than in automount and swap units, hence resolve specifiers
there too. Then, Type= in mount units is nowadays an arbitrary,
sometimes non-trivial string (think fuse!), hence let's also expand
specifiers there, to match the rest of the mount settings.
This has the benefit that when writing code that generates unit files,
less care has to be taken to check whether escaping of specifiers is
necessary or not: broadly everything that takes arbitrary user strings
now does specifier expansion, while enums/numerics/booleans do not.
2017-11-21 20:03:51 +01:00
|
|
|
Automount.Where, config_parse_unit_path_printf, 0, offsetof(Automount, where)
|
2011-08-01 00:43:05 +02:00
|
|
|
Automount.DirectoryMode, config_parse_mode, 0, offsetof(Automount, directory_mode)
|
2017-05-23 09:42:26 +02:00
|
|
|
Automount.TimeoutIdleSec, config_parse_sec_fix_0, 0, offsetof(Automount, timeout_idle_usec)
|
2011-08-01 00:43:05 +02:00
|
|
|
m4_dnl
|
core: enable specifier expansion for What=/Where=/Type=/SourcePath= too
Using specifiers in these settings isn't particularly useful by itself,
but it unifies behaviour a bit. It's kinda surprising that What= in
mount units resolves specifies, but Where= does not. Hence let's add
that too. Also, it's surprising Where=/What= in mount units behaves
differently than in automount and swap units, hence resolve specifiers
there too. Then, Type= in mount units is nowadays an arbitrary,
sometimes non-trivial string (think fuse!), hence let's also expand
specifiers there, to match the rest of the mount settings.
This has the benefit that when writing code that generates unit files,
less care has to be taken to check whether escaping of specifiers is
necessary or not: broadly everything that takes arbitrary user strings
now does specifier expansion, while enums/numerics/booleans do not.
2017-11-21 20:03:51 +01:00
|
|
|
Swap.What, config_parse_unit_path_printf, 0, offsetof(Swap, parameters_fragment.what)
|
2020-01-09 17:02:56 +01:00
|
|
|
Swap.Priority, config_parse_swap_priority, 0, 0
|
2016-12-05 19:38:39 +01:00
|
|
|
Swap.Options, config_parse_unit_string_printf, 0, offsetof(Swap, parameters_fragment.options)
|
2017-05-23 09:42:26 +02:00
|
|
|
Swap.TimeoutSec, config_parse_sec_fix_0, 0, offsetof(Swap, timeout_usec)
|
2011-08-01 00:43:05 +02:00
|
|
|
EXEC_CONTEXT_CONFIG_ITEMS(Swap)m4_dnl
|
2013-06-17 21:33:26 +02:00
|
|
|
CGROUP_CONTEXT_CONFIG_ITEMS(Swap)m4_dnl
|
2012-07-19 23:47:10 +02:00
|
|
|
KILL_CONTEXT_CONFIG_ITEMS(Swap)m4_dnl
|
2011-08-01 00:43:05 +02:00
|
|
|
m4_dnl
|
2019-04-01 17:39:11 +02:00
|
|
|
Timer.OnCalendar, config_parse_timer, TIMER_CALENDAR, 0
|
|
|
|
Timer.OnActiveSec, config_parse_timer, TIMER_ACTIVE, 0
|
|
|
|
Timer.OnBootSec, config_parse_timer, TIMER_BOOT, 0
|
|
|
|
Timer.OnStartupSec, config_parse_timer, TIMER_STARTUP, 0
|
|
|
|
Timer.OnUnitActiveSec, config_parse_timer, TIMER_UNIT_ACTIVE, 0
|
|
|
|
Timer.OnUnitInactiveSec, config_parse_timer, TIMER_UNIT_INACTIVE, 0
|
2019-03-14 21:36:47 +01:00
|
|
|
Timer.OnClockChange, config_parse_bool, 0, offsetof(Timer, on_clock_change)
|
|
|
|
Timer.OnTimezoneChange, config_parse_bool, 0, offsetof(Timer, on_timezone_change)
|
2014-03-21 03:25:28 +01:00
|
|
|
Timer.Persistent, config_parse_bool, 0, offsetof(Timer, persistent)
|
2014-03-24 16:09:54 +01:00
|
|
|
Timer.WakeSystem, config_parse_bool, 0, offsetof(Timer, wake_system)
|
2015-11-17 20:13:36 +01:00
|
|
|
Timer.RemainAfterElapse, config_parse_bool, 0, offsetof(Timer, remain_after_elapse)
|
2013-11-21 22:07:51 +01:00
|
|
|
Timer.AccuracySec, config_parse_sec, 0, offsetof(Timer, accuracy_usec)
|
2015-11-26 22:32:41 +01:00
|
|
|
Timer.RandomizedDelaySec, config_parse_sec, 0, offsetof(Timer, random_usec)
|
2013-04-23 20:53:16 +02:00
|
|
|
Timer.Unit, config_parse_trigger_unit, 0, 0
|
2011-08-01 00:43:05 +02:00
|
|
|
m4_dnl
|
|
|
|
Path.PathExists, config_parse_path_spec, 0, 0
|
|
|
|
Path.PathExistsGlob, config_parse_path_spec, 0, 0
|
|
|
|
Path.PathChanged, config_parse_path_spec, 0, 0
|
2011-12-08 12:09:10 +01:00
|
|
|
Path.PathModified, config_parse_path_spec, 0, 0
|
2011-08-01 00:43:05 +02:00
|
|
|
Path.DirectoryNotEmpty, config_parse_path_spec, 0, 0
|
2013-04-23 20:53:16 +02:00
|
|
|
Path.Unit, config_parse_trigger_unit, 0, 0
|
2011-08-01 00:43:05 +02:00
|
|
|
Path.MakeDirectory, config_parse_bool, 0, offsetof(Path, make_directory)
|
|
|
|
Path.DirectoryMode, config_parse_mode, 0, offsetof(Path, directory_mode)
|
2013-06-17 21:33:26 +02:00
|
|
|
m4_dnl
|
|
|
|
CGROUP_CONTEXT_CONFIG_ITEMS(Slice)m4_dnl
|
2013-07-10 21:13:56 +02:00
|
|
|
m4_dnl
|
|
|
|
CGROUP_CONTEXT_CONFIG_ITEMS(Scope)m4_dnl
|
2013-07-30 02:50:44 +02:00
|
|
|
KILL_CONTEXT_CONFIG_ITEMS(Scope)m4_dnl
|
2019-06-12 09:45:26 +02:00
|
|
|
Scope.RuntimeMaxSec, config_parse_sec, 0, offsetof(Scope, runtime_max_usec)
|
2013-07-30 02:50:44 +02:00
|
|
|
Scope.TimeoutStopSec, config_parse_sec, 0, offsetof(Scope, timeout_stop_usec)
|
2011-08-01 00:43:05 +02:00
|
|
|
m4_dnl The [Install] section is ignored here.
|
|
|
|
Install.Alias, NULL, 0, 0
|
|
|
|
Install.WantedBy, NULL, 0, 0
|
2012-05-21 15:27:26 +02:00
|
|
|
Install.RequiredBy, NULL, 0, 0
|
2011-08-01 00:43:05 +02:00
|
|
|
Install.Also, NULL, 0, 0
|
2014-06-17 00:15:31 +02:00
|
|
|
Install.DefaultInstance, NULL, 0, 0
|