From 370f0dc81c3a71eb29a3a0f5ea03c23a92173ca5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 27 Nov 2019 11:04:36 +0100 Subject: [PATCH 1/6] doc: drop rhs from transient settings list I don't know why these particular ones had them. --- docs/TRANSIENT-SETTINGS.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/TRANSIENT-SETTINGS.md b/docs/TRANSIENT-SETTINGS.md index 838b90936ec..d7e02c0ad35 100644 --- a/docs/TRANSIENT-SETTINGS.md +++ b/docs/TRANSIENT-SETTINGS.md @@ -44,15 +44,15 @@ Most generic unit settings are available for transient units. ✓ JobRunningTimeoutSec= ✓ JobTimeoutAction= ✓ JobTimeoutRebootArgument= -✓ StartLimitIntervalSec=SECONDS -✓ StartLimitBurst=UNSIGNED -✓ StartLimitAction=ACTION +✓ StartLimitIntervalSec= +✓ StartLimitBurst= +✓ StartLimitAction= ✓ FailureAction= ✓ SuccessAction= ✓ FailureActionExitStatus= ✓ SuccessActionExitStatus= ✓ AddRef= -✓ RebootArgument=STRING +✓ RebootArgument= ✓ ConditionPathExists= ✓ ConditionPathExistsGlob= ✓ ConditionPathIsDirectory= From c57d2a76c51354619701c568becab7a5a51de166 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 27 Nov 2019 11:44:57 +0100 Subject: [PATCH 2/6] shared/bus-unit-util: word wrap Having all the names squished on the same line makes it hard to see what settings are missing. --- src/shared/bus-unit-util.c | 333 ++++++++++++++++++++++++++----------- 1 file changed, 240 insertions(+), 93 deletions(-) diff --git a/src/shared/bus-unit-util.c b/src/shared/bus-unit-util.c index 29dd89d3c19..64c0d128b85 100644 --- a/src/shared/bus-unit-util.c +++ b/src/shared/bus-unit-util.c @@ -421,18 +421,26 @@ static int bus_append_cgroup_property(sd_bus_message *m, const char *field, cons if (STR_IN_SET(field, "DevicePolicy", "Slice")) return bus_append_string(m, field, eq); - if (STR_IN_SET(field, - "CPUAccounting", "MemoryAccounting", "IOAccounting", "BlockIOAccounting", - "TasksAccounting", "IPAccounting")) + if (STR_IN_SET(field, "CPUAccounting", + "MemoryAccounting", + "IOAccounting", + "BlockIOAccounting", + "TasksAccounting", + "IPAccounting")) return bus_append_parse_boolean(m, field, eq); - if (STR_IN_SET(field, "CPUWeight", "StartupCPUWeight", "IOWeight", "StartupIOWeight")) + if (STR_IN_SET(field, "CPUWeight", + "StartupCPUWeight", + "IOWeight", + "StartupIOWeight")) return bus_append_cg_weight_parse(m, field, eq); - if (STR_IN_SET(field, "CPUShares", "StartupCPUShares")) + if (STR_IN_SET(field, "CPUShares", + "StartupCPUShares")) return bus_append_cg_cpu_shares_parse(m, field, eq); - if (STR_IN_SET(field, "AllowedCPUs", "AllowedMemoryNodes")) { + if (STR_IN_SET(field, "AllowedCPUs", + "AllowedMemoryNodes")) { _cleanup_(cpu_set_reset) CPUSet cpuset = {}; _cleanup_free_ uint8_t *array = NULL; size_t allocated; @@ -448,7 +456,8 @@ static int bus_append_cgroup_property(sd_bus_message *m, const char *field, cons return bus_append_byte_array(m, field, array, allocated); } - if (STR_IN_SET(field, "BlockIOWeight", "StartupBlockIOWeight")) + if (STR_IN_SET(field, "BlockIOWeight", + "StartupBlockIOWeight")) return bus_append_cg_blkio_weight_parse(m, field, eq); if (streq(field, "DisableControllers")) @@ -593,7 +602,8 @@ static int bus_append_cgroup_property(sd_bus_message *m, const char *field, cons return 1; } - if (STR_IN_SET(field, "IODeviceWeight", "BlockIODeviceWeight")) { + if (STR_IN_SET(field, "IODeviceWeight", + "BlockIODeviceWeight")) { if (isempty(eq)) r = sd_bus_message_append(m, "(sv)", field, "a(st)", 0); else { @@ -653,7 +663,8 @@ static int bus_append_cgroup_property(sd_bus_message *m, const char *field, cons return 1; } - if (STR_IN_SET(field, "IPAddressAllow", "IPAddressDeny")) { + if (STR_IN_SET(field, "IPAddressAllow", + "IPAddressDeny")) { unsigned char prefixlen; union in_addr_union prefix = {}; int family; @@ -773,7 +784,8 @@ static int bus_append_cgroup_property(sd_bus_message *m, const char *field, cons return 1; } - if (STR_IN_SET(field, "IPIngressFilterPath", "IPEgressFilterPath")) { + if (STR_IN_SET(field, "IPIngressFilterPath", + "IPEgressFilterPath")) { if (isempty(eq)) r = sd_bus_message_append(m, "(sv)", field, "as", 0); else @@ -805,31 +817,68 @@ static int bus_append_execute_property(sd_bus_message *m, const char *field, con const char *suffix; int r; - if (STR_IN_SET(field, - "User", "Group", - "UtmpIdentifier", "UtmpMode", "PAMName", "TTYPath", - "WorkingDirectory", "RootDirectory", "SyslogIdentifier", - "ProtectSystem", "ProtectHome", "SELinuxContext", "RootImage", - "RuntimeDirectoryPreserve", "Personality", "KeyringMode", "NetworkNamespacePath")) + if (STR_IN_SET(field, "User", + "Group", + "UtmpIdentifier", + "UtmpMode", + "PAMName", + "TTYPath", + "WorkingDirectory", + "RootDirectory", + "SyslogIdentifier", + "ProtectSystem", + "ProtectHome", + "SELinuxContext", + "RootImage", + "RuntimeDirectoryPreserve", + "Personality", + "KeyringMode", + "NetworkNamespacePath")) return bus_append_string(m, field, eq); - if (STR_IN_SET(field, - "IgnoreSIGPIPE", "TTYVHangup", "TTYReset", "TTYVTDisallocate", "PrivateTmp", - "PrivateDevices", "PrivateNetwork", "PrivateUsers", "PrivateMounts", - "NoNewPrivileges", "SyslogLevelPrefix", "MemoryDenyWriteExecute", "RestrictRealtime", - "DynamicUser", "RemoveIPC", "ProtectKernelTunables", "ProtectKernelModules", - "ProtectKernelLogs", "ProtectControlGroups", "MountAPIVFS", "CPUSchedulingResetOnFork", - "LockPersonality", "ProtectHostname", "RestrictSUIDSGID")) + if (STR_IN_SET(field, "IgnoreSIGPIPE", + "TTYVHangup", + "TTYReset", + "TTYVTDisallocate", + "PrivateTmp", + "PrivateDevices", + "PrivateNetwork", + "PrivateUsers", + "PrivateMounts", + "NoNewPrivileges", + "SyslogLevelPrefix", + "MemoryDenyWriteExecute", + "RestrictRealtime", + "DynamicUser", + "RemoveIPC", + "ProtectKernelTunables", + "ProtectKernelModules", + "ProtectKernelLogs", + "ProtectControlGroups", + "MountAPIVFS", + "CPUSchedulingResetOnFork", + "LockPersonality", + "ProtectHostname", + "RestrictSUIDSGID")) return bus_append_parse_boolean(m, field, eq); - if (STR_IN_SET(field, - "ReadWriteDirectories", "ReadOnlyDirectories", "InaccessibleDirectories", - "ReadWritePaths", "ReadOnlyPaths", "InaccessiblePaths", - "RuntimeDirectory", "StateDirectory", "CacheDirectory", "LogsDirectory", "ConfigurationDirectory", - "SupplementaryGroups", "SystemCallArchitectures")) + if (STR_IN_SET(field, "ReadWriteDirectories", + "ReadOnlyDirectories", + "InaccessibleDirectories", + "ReadWritePaths", + "ReadOnlyPaths", + "InaccessiblePaths", + "RuntimeDirectory", + "StateDirectory", + "CacheDirectory", + "LogsDirectory", + "ConfigurationDirectory", + "SupplementaryGroups", + "SystemCallArchitectures")) return bus_append_strv(m, field, eq, EXTRACT_UNQUOTE); - if (STR_IN_SET(field, "SyslogLevel", "LogLevelMax")) + if (STR_IN_SET(field, "SyslogLevel", + "LogLevelMax")) return bus_append_log_level_from_string(m, field, eq); if (streq(field, "SyslogFacility")) @@ -841,7 +890,8 @@ static int bus_append_execute_property(sd_bus_message *m, const char *field, con if (streq(field, "CPUSchedulingPolicy")) return bus_append_sched_policy_from_string(m, field, eq); - if (STR_IN_SET(field, "CPUSchedulingPriority", "OOMScoreAdjust")) + if (STR_IN_SET(field, "CPUSchedulingPriority", + "OOMScoreAdjust")) return bus_append_safe_atoi(m, field, eq); if (streq(field, "Nice")) @@ -856,9 +906,12 @@ static int bus_append_execute_property(sd_bus_message *m, const char *field, con if (streq(field, "IOSchedulingPriority")) return bus_append_ioprio_parse_priority(m, field, eq); - if (STR_IN_SET(field, - "RuntimeDirectoryMode", "StateDirectoryMode", "CacheDirectoryMode", - "LogsDirectoryMode", "ConfigurationDirectoryMode", "UMask")) + if (STR_IN_SET(field, "RuntimeDirectoryMode", + "StateDirectoryMode", + "CacheDirectoryMode", + "LogsDirectoryMode", + "ConfigurationDirectoryMode", + "UMask")) return bus_append_parse_mode(m, field, eq); if (streq(field, "TimerSlackNSec")) @@ -873,7 +926,9 @@ static int bus_append_execute_property(sd_bus_message *m, const char *field, con if (streq(field, "MountFlags")) return bus_append_mount_propagation_flags_from_string(m, field, eq); - if (STR_IN_SET(field, "Environment", "UnsetEnvironment", "PassEnvironment")) + if (STR_IN_SET(field, "Environment", + "UnsetEnvironment", + "PassEnvironment")) return bus_append_strv(m, field, eq, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE); if (streq(field, "EnvironmentFile")) { @@ -925,7 +980,9 @@ static int bus_append_execute_property(sd_bus_message *m, const char *field, con return 1; } - if (STR_IN_SET(field, "StandardInput", "StandardOutput", "StandardError")) { + if (STR_IN_SET(field, "StandardInput", + "StandardOutput", + "StandardError")) { const char *n, *appended; if ((n = startswith(eq, "fd:"))) { @@ -997,7 +1054,8 @@ static int bus_append_execute_property(sd_bus_message *m, const char *field, con } } - if (STR_IN_SET(field, "AppArmorProfile", "SmackProcessLabel")) { + if (STR_IN_SET(field, "AppArmorProfile", + "SmackProcessLabel")) { int ignore = 0; const char *s = eq; @@ -1013,7 +1071,8 @@ static int bus_append_execute_property(sd_bus_message *m, const char *field, con return 1; } - if (STR_IN_SET(field, "CapabilityBoundingSet", "AmbientCapabilities")) { + if (STR_IN_SET(field, "CapabilityBoundingSet", + "AmbientCapabilities")) { uint64_t sum = 0; bool invert = false; const char *p = eq; @@ -1080,7 +1139,8 @@ static int bus_append_execute_property(sd_bus_message *m, const char *field, con return bus_append_byte_array(m, field, array, allocated); } - if (STR_IN_SET(field, "RestrictAddressFamilies", "SystemCallFilter")) { + if (STR_IN_SET(field, "RestrictAddressFamilies", + "SystemCallFilter")) { int whitelist = 1; const char *p = eq; @@ -1178,7 +1238,8 @@ static int bus_append_execute_property(sd_bus_message *m, const char *field, con return 1; } - if (STR_IN_SET(field, "BindPaths", "BindReadOnlyPaths")) { + if (STR_IN_SET(field, "BindPaths", + "BindReadOnlyPaths")) { const char *p = eq; r = sd_bus_message_open_container(m, SD_BUS_TYPE_STRUCT, "sv"); @@ -1330,10 +1391,14 @@ static int bus_append_kill_property(sd_bus_message *m, const char *field, const if (streq(field, "KillMode")) return bus_append_string(m, field, eq); - if (STR_IN_SET(field, "SendSIGHUP", "SendSIGKILL")) + if (STR_IN_SET(field, "SendSIGHUP", + "SendSIGKILL")) return bus_append_parse_boolean(m, field, eq); - if (STR_IN_SET(field, "KillSignal", "RestartKillSignal", "FinalKillSignal", "WatchdogSignal")) + if (STR_IN_SET(field, "KillSignal", + "RestartKillSignal", + "FinalKillSignal", + "WatchdogSignal")) return bus_append_signal_from_string(m, field, eq); return 0; @@ -1341,7 +1406,10 @@ static int bus_append_kill_property(sd_bus_message *m, const char *field, const static int bus_append_mount_property(sd_bus_message *m, const char *field, const char *eq) { - if (STR_IN_SET(field, "What", "Where", "Options", "Type")) + if (STR_IN_SET(field, "What", + "Where", + "Options", + "Type")) return bus_append_string(m, field, eq); if (streq(field, "TimeoutSec")) @@ -1350,7 +1418,9 @@ static int bus_append_mount_property(sd_bus_message *m, const char *field, const if (streq(field, "DirectoryMode")) return bus_append_parse_mode(m, field, eq); - if (STR_IN_SET(field, "SloppyOptions", "LazyUnmount", "ForceUnmount")) + if (STR_IN_SET(field, "SloppyOptions", + "LazyUnmount", + "ForceUnmount")) return bus_append_parse_boolean(m, field, eq); return 0; @@ -1365,9 +1435,11 @@ static int bus_append_path_property(sd_bus_message *m, const char *field, const if (streq(field, "DirectoryMode")) return bus_append_parse_mode(m, field, eq); - if (STR_IN_SET(field, - "PathExists", "PathExistsGlob", "PathChanged", - "PathModified", "DirectoryNotEmpty")) { + if (STR_IN_SET(field, "PathExists", + "PathExistsGlob", + "PathChanged", + "PathModified", + "DirectoryNotEmpty")) { if (isempty(eq)) r = sd_bus_message_append(m, "(sv)", "Paths", "a(ss)", 0); else @@ -1383,11 +1455,9 @@ static int bus_append_path_property(sd_bus_message *m, const char *field, const static int bus_append_scope_property(sd_bus_message *m, const char *field, const char *eq) { if (streq(field, "RuntimeMaxSec")) - return bus_append_parse_sec_rename(m, field, eq); if (streq(field, "TimeoutStopSec")) - return bus_append_parse_sec_rename(m, field, eq); return 0; @@ -1396,15 +1466,27 @@ static int bus_append_scope_property(sd_bus_message *m, const char *field, const static int bus_append_service_property(sd_bus_message *m, const char *field, const char *eq) { int r; - if (STR_IN_SET(field, - "PIDFile", "Type", "Restart", "BusName", "NotifyAccess", - "USBFunctionDescriptors", "USBFunctionStrings", "OOMPolicy")) + if (STR_IN_SET(field, "PIDFile", + "Type", + "Restart", + "BusName", + "NotifyAccess", + "USBFunctionDescriptors", + "USBFunctionStrings", + "OOMPolicy")) return bus_append_string(m, field, eq); - if (STR_IN_SET(field, "PermissionsStartOnly", "RootDirectoryStartOnly", "RemainAfterExit", "GuessMainPID")) + if (STR_IN_SET(field, "PermissionsStartOnly", + "RootDirectoryStartOnly", + "RemainAfterExit", + "GuessMainPID")) return bus_append_parse_boolean(m, field, eq); - if (STR_IN_SET(field, "RestartSec", "TimeoutStartSec", "TimeoutStopSec", "RuntimeMaxSec", "WatchdogSec")) + if (STR_IN_SET(field, "RestartSec", + "TimeoutStartSec", + "TimeoutStopSec", + "RuntimeMaxSec", + "WatchdogSec")) return bus_append_parse_sec_rename(m, field, eq); if (streq(field, "TimeoutSec")) { @@ -1418,14 +1500,25 @@ static int bus_append_service_property(sd_bus_message *m, const char *field, con if (streq(field, "FileDescriptorStoreMax")) return bus_append_safe_atou(m, field, eq); - if (STR_IN_SET(field, - "ExecCondition", "ExecStartPre", "ExecStart", "ExecStartPost", - "ExecConditionEx", "ExecStartPreEx", "ExecStartEx", "ExecStartPostEx", - "ExecReload", "ExecStop", "ExecStopPost", - "ExecReloadEx", "ExecStopEx", "ExecStopPostEx")) + if (STR_IN_SET(field, "ExecCondition", + "ExecStartPre", + "ExecStart", + "ExecStartPost", + "ExecConditionEx", + "ExecStartPreEx", + "ExecStartEx", + "ExecStartPostEx", + "ExecReload", + "ExecStop", + "ExecStopPost", + "ExecReloadEx", + "ExecStopEx", + "ExecStopPostEx")) return bus_append_exec_command(m, field, eq); - if (STR_IN_SET(field, "RestartPreventExitStatus", "RestartForceExitStatus", "SuccessExitStatus")) { + if (STR_IN_SET(field, "RestartPreventExitStatus", + "RestartForceExitStatus", + "SuccessExitStatus")) { _cleanup_free_ int *status = NULL, *signal = NULL; size_t n_status = 0, n_signal = 0; const char *p; @@ -1512,39 +1605,70 @@ static int bus_append_service_property(sd_bus_message *m, const char *field, con static int bus_append_socket_property(sd_bus_message *m, const char *field, const char *eq) { int r; - if (STR_IN_SET(field, - "Accept", "Writable", "KeepAlive", "NoDelay", "FreeBind", "Transparent", "Broadcast", - "PassCredentials", "PassSecurity", "ReusePort", "RemoveOnStop", "SELinuxContextFromNet")) + if (STR_IN_SET(field, "Accept", + "Writable", + "KeepAlive", + "NoDelay", + "FreeBind", + "Transparent", + "Broadcast", + "PassCredentials", + "PassSecurity", + "ReusePort", + "RemoveOnStop", + "SELinuxContextFromNet")) return bus_append_parse_boolean(m, field, eq); - if (STR_IN_SET(field, "Priority", "IPTTL", "Mark")) + if (STR_IN_SET(field, "Priority", + "IPTTL", + "Mark")) return bus_append_safe_atoi(m, field, eq); if (streq(field, "IPTOS")) return bus_append_ip_tos_from_string(m, field, eq); - if (STR_IN_SET(field, "Backlog", "MaxConnections", "MaxConnectionsPerSource", "KeepAliveProbes", "TriggerLimitBurst")) + if (STR_IN_SET(field, "Backlog", + "MaxConnections", + "MaxConnectionsPerSource", + "KeepAliveProbes", + "TriggerLimitBurst")) return bus_append_safe_atou(m, field, eq); - if (STR_IN_SET(field, "SocketMode", "DirectoryMode")) + if (STR_IN_SET(field, "SocketMode", + "DirectoryMode")) return bus_append_parse_mode(m, field, eq); - if (STR_IN_SET(field, "MessageQueueMaxMessages", "MessageQueueMessageSize")) + if (STR_IN_SET(field, "MessageQueueMaxMessages", + "MessageQueueMessageSize")) return bus_append_safe_atoi64(m, field, eq); - if (STR_IN_SET(field, "TimeoutSec", "KeepAliveTimeSec", "KeepAliveIntervalSec", "DeferAcceptSec", "TriggerLimitIntervalSec")) + if (STR_IN_SET(field, "TimeoutSec", + "KeepAliveTimeSec", + "KeepAliveIntervalSec", + "DeferAcceptSec", + "TriggerLimitIntervalSec")) return bus_append_parse_sec_rename(m, field, eq); - if (STR_IN_SET(field, "ReceiveBuffer", "SendBuffer", "PipeSize")) + if (STR_IN_SET(field, "ReceiveBuffer", + "SendBuffer", + "PipeSize")) return bus_append_parse_size(m, field, eq, 1024); - if (STR_IN_SET(field, "ExecStartPre", "ExecStartPost", "ExecReload", "ExecStopPost")) + if (STR_IN_SET(field, "ExecStartPre", + "ExecStartPost", + "ExecReload", + "ExecStopPost")) return bus_append_exec_command(m, field, eq); - if (STR_IN_SET(field, - "SmackLabel", "SmackLabelIPIn", "SmackLabelIPOut", "TCPCongestion", - "BindToDevice", "BindIPv6Only", "FileDescriptorName", - "SocketUser", "SocketGroup")) + if (STR_IN_SET(field, "SmackLabel", + "SmackLabelIPIn", + "SmackLabelIPOut", + "TCPCongestion", + "BindToDevice", + "BindIPv6Only", + "FileDescriptorName", + "SocketUser", + "SocketGroup")) return bus_append_string(m, field, eq); if (streq(field, "Symlinks")) @@ -1553,9 +1677,14 @@ static int bus_append_socket_property(sd_bus_message *m, const char *field, cons if (streq(field, "SocketProtocol")) return bus_append_parse_ip_protocol(m, field, eq); - if (STR_IN_SET(field, - "ListenStream", "ListenDatagram", "ListenSequentialPacket", "ListenNetlink", - "ListenSpecial", "ListenMessageQueue", "ListenFIFO", "ListenUSBFunction")) { + if (STR_IN_SET(field, "ListenStream", + "ListenDatagram", + "ListenSequentialPacket", + "ListenNetlink", + "ListenSpecial", + "ListenMessageQueue", + "ListenFIFO", + "ListenUSBFunction")) { if (isempty(eq)) r = sd_bus_message_append(m, "(sv)", "Listen", "a(ss)", 0); else @@ -1571,16 +1700,22 @@ static int bus_append_socket_property(sd_bus_message *m, const char *field, cons static int bus_append_timer_property(sd_bus_message *m, const char *field, const char *eq) { int r; - if (STR_IN_SET(field, "WakeSystem", "RemainAfterElapse", "Persistent", - "OnTimezoneChange", "OnClockChange")) + if (STR_IN_SET(field, "WakeSystem", + "RemainAfterElapse", + "Persistent", + "OnTimezoneChange", + "OnClockChange")) return bus_append_parse_boolean(m, field, eq); - if (STR_IN_SET(field, "AccuracySec", "RandomizedDelaySec")) + if (STR_IN_SET(field, "AccuracySec", + "RandomizedDelaySec")) return bus_append_parse_sec_rename(m, field, eq); - if (STR_IN_SET(field, - "OnActiveSec", "OnBootSec", "OnStartupSec", - "OnUnitActiveSec","OnUnitInactiveSec")) { + if (STR_IN_SET(field, "OnActiveSec", + "OnBootSec", + "OnStartupSec", + "OnUnitActiveSec", + "OnUnitInactiveSec")) { if (isempty(eq)) r = sd_bus_message_append(m, "(sv)", "TimersMonotonic", "a(st)", 0); else { @@ -1616,25 +1751,36 @@ static int bus_append_unit_property(sd_bus_message *m, const char *field, const bool is_condition = false; int r; - if (STR_IN_SET(field, - "Description", "SourcePath", "OnFailureJobMode", - "JobTimeoutAction", "JobTimeoutRebootArgument", - "StartLimitAction", "FailureAction", "SuccessAction", - "RebootArgument", "CollectMode")) + if (STR_IN_SET(field, "Description", + "SourcePath", + "OnFailureJobMode", + "JobTimeoutAction", + "JobTimeoutRebootArgument", + "StartLimitAction", + "FailureAction", + "SuccessAction", + "RebootArgument", + "CollectMode")) return bus_append_string(m, field, eq); - if (STR_IN_SET(field, - "StopWhenUnneeded", "RefuseManualStart", "RefuseManualStop", - "AllowIsolate", "IgnoreOnIsolate", "DefaultDependencies")) + if (STR_IN_SET(field, "StopWhenUnneeded", + "RefuseManualStart", + "RefuseManualStop", + "AllowIsolate", + "IgnoreOnIsolate", + "DefaultDependencies")) return bus_append_parse_boolean(m, field, eq); - if (STR_IN_SET(field, "JobTimeoutSec", "JobRunningTimeoutSec", "StartLimitIntervalSec")) + if (STR_IN_SET(field, "JobTimeoutSec", + "JobRunningTimeoutSec", + "StartLimitIntervalSec")) return bus_append_parse_sec_rename(m, field, eq); if (streq(field, "StartLimitBurst")) return bus_append_safe_atou(m, field, eq); - if (STR_IN_SET(field, "SuccessActionExitStatus", "FailureActionExitStatus")) { + if (STR_IN_SET(field, "SuccessActionExitStatus", + "FailureActionExitStatus")) { if (isempty(eq)) r = sd_bus_message_append(m, "(sv)", field, "i", -1); else { @@ -1653,7 +1799,8 @@ static int bus_append_unit_property(sd_bus_message *m, const char *field, const } if (unit_dependency_from_string(field) >= 0 || - STR_IN_SET(field, "Documentation", "RequiresMountsFor")) + STR_IN_SET(field, "Documentation", + "RequiresMountsFor")) return bus_append_strv(m, field, eq, EXTRACT_UNQUOTE); t = condition_type_from_string(field); From b9d9fbe4112b3a40b94842b7d6a4ca95faa3f946 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 27 Nov 2019 12:33:48 +0100 Subject: [PATCH 3/6] shared/conf-parser: remove unnecessary whitespace skipping The conf-parser machinery already removed whitespace before and after "=", no need to repeat this step. The test is adjusted to pass. It was testing an code path that doesn't happen normally, no point in doing that. --- src/core/load-fragment.c | 3 --- src/test/test-conf-parser.c | 4 ++-- src/test/test-load-fragment.c | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c index 54c71d3579d..eaa3b7bf492 100644 --- a/src/core/load-fragment.c +++ b/src/core/load-fragment.c @@ -614,7 +614,6 @@ int config_parse_exec( assert(e); e += ltype; - rvalue += strspn(rvalue, WHITESPACE); if (isempty(rvalue)) { /* An empty assignment resets the list */ @@ -1951,7 +1950,6 @@ int config_parse_service_timeout_abort( assert(rvalue); assert(s); - rvalue += strspn(rvalue, WHITESPACE); if (isempty(rvalue)) { s->timeout_abort_set = false; return 0; @@ -5002,7 +5000,6 @@ int config_parse_timeout_abort( assert(rvalue); assert(timeout_usec); - rvalue += strspn(rvalue, WHITESPACE); if (isempty(rvalue)) { *timeout_usec = false; return 0; diff --git a/src/test/test-conf-parser.c b/src/test/test-conf-parser.c index 597265efa67..661eb1795a1 100644 --- a/src/test/test-conf-parser.c +++ b/src/test/test-conf-parser.c @@ -227,8 +227,8 @@ static const char* const config_file[] = { "[Section]\n" "[Section]\n" "setting1=1\n" - "setting1=2\n" - "setting1=1\n", /* repeated settings */ + "setting1= 2 \t\n" + "setting1= 1\n", /* repeated settings */ "[Section]\n" "[Section]\n" diff --git a/src/test/test-load-fragment.c b/src/test/test-load-fragment.c index 8d0a4ad2e2c..7de286436d3 100644 --- a/src/test/test-load-fragment.c +++ b/src/test/test-load-fragment.c @@ -146,7 +146,7 @@ static void test_config_parse_exec(void) { log_info("/* no command, whitespace only, reset */"); r = config_parse_exec(NULL, "fake", 3, "section", 1, - "LValue", 0, " ", + "LValue", 0, "", &c, u); assert_se(r == 0); assert_se(c == NULL); From a61d68748afef4814760774eb0458a46d4ea9922 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 27 Nov 2019 13:13:17 +0100 Subject: [PATCH 4/6] pid1: fix setting of DefaultTimeoutAbortSec This partially reverts a07a7324adf504381e9374d1f1a5db6edaa46435. We have two pieces of information: the value and a boolean. config_parse_timeout_abort() added in the reverted commit would write the boolean to the usec_t value, making a mess. The code is reworked to have just one implementation and two wrappers which pass two pointers. --- src/core/load-fragment.c | 88 +++++++++++------------- src/core/main.c | 141 ++++++++++++++++++++++----------------- 2 files changed, 118 insertions(+), 111 deletions(-) diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c index eaa3b7bf492..1679e047dd7 100644 --- a/src/core/load-fragment.c +++ b/src/core/load-fragment.c @@ -1930,6 +1930,40 @@ int config_parse_service_timeout( return 0; } +int config_parse_timeout_abort( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + + usec_t *ret = data; + int r; + + assert(filename); + assert(lvalue); + assert(rvalue); + assert(ret); + + /* Note: apart from setting the arg, this returns an extra bit of information in the return value. */ + + if (isempty(rvalue)) { + *ret = 0; + return 0; /* "not set" */ + } + + r = parse_sec(rvalue, ret); + if (r < 0) + return log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse %s= setting, ignoring: %s", lvalue, rvalue); + + return 1; /* "set" */ +} + int config_parse_service_timeout_abort( const char *unit, const char *filename, @@ -1945,23 +1979,12 @@ int config_parse_service_timeout_abort( Service *s = userdata; int r; - assert(filename); - assert(lvalue); - assert(rvalue); assert(s); - if (isempty(rvalue)) { - s->timeout_abort_set = false; - return 0; - } - - r = parse_sec(rvalue, &s->timeout_abort_usec); - if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse TimeoutAbortSec= setting, ignoring: %s", rvalue); - return 0; - } - - s->timeout_abort_set = true; + r = config_parse_timeout_abort(unit, filename, line, section, section_line, lvalue, ltype, rvalue, + &s->timeout_abort_usec, s); + if (r >= 0) + s->timeout_abort_set = r; return 0; } @@ -4979,38 +5002,3 @@ int config_parse_crash_chvt( return 0; } - -int config_parse_timeout_abort( - const char* unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { - - usec_t *timeout_usec = data; - int r; - - assert(filename); - assert(lvalue); - assert(rvalue); - assert(timeout_usec); - - if (isempty(rvalue)) { - *timeout_usec = false; - return 0; - } - - r = parse_sec(rvalue, timeout_usec); - if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse DefaultTimeoutAbortSec= setting, ignoring: %s", rvalue); - return 0; - } - - *timeout_usec = true; - return 0; -} diff --git a/src/core/main.c b/src/core/main.c index 6e101f02785..c24b696b166 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -539,71 +539,90 @@ DEFINE_SETTER(config_parse_target, log_set_target_from_string, "target"); DEFINE_SETTER(config_parse_color, log_show_color_from_string, "color" ); DEFINE_SETTER(config_parse_location, log_show_location_from_string, "location"); -static int parse_config_file(void) { +static int config_parse_default_timeout_abort( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + int r; + r = config_parse_timeout_abort(unit, filename, line, section, section_line, lvalue, ltype, rvalue, + &arg_default_timeout_abort_usec, userdata); + if (r >= 0) + arg_default_timeout_abort_set = r; + return 0; +} + +static int parse_config_file(void) { const ConfigTableItem items[] = { - { "Manager", "LogLevel", config_parse_level2, 0, NULL }, - { "Manager", "LogTarget", config_parse_target, 0, NULL }, - { "Manager", "LogColor", config_parse_color, 0, NULL }, - { "Manager", "LogLocation", config_parse_location, 0, NULL }, - { "Manager", "DumpCore", config_parse_bool, 0, &arg_dump_core }, - { "Manager", "CrashChVT", /* legacy */ config_parse_crash_chvt, 0, &arg_crash_chvt }, - { "Manager", "CrashChangeVT", config_parse_crash_chvt, 0, &arg_crash_chvt }, - { "Manager", "CrashShell", config_parse_bool, 0, &arg_crash_shell }, - { "Manager", "CrashReboot", config_parse_bool, 0, &arg_crash_reboot }, - { "Manager", "ShowStatus", config_parse_show_status, 0, &arg_show_status }, - { "Manager", "StatusUnitFormat", config_parse_status_unit_format, 0, &arg_status_unit_format }, - { "Manager", "CPUAffinity", config_parse_cpu_affinity2, 0, &arg_cpu_affinity }, - { "Manager", "NUMAPolicy", config_parse_numa_policy, 0, &arg_numa_policy.type }, - { "Manager", "NUMAMask", config_parse_numa_mask, 0, &arg_numa_policy }, - { "Manager", "JoinControllers", config_parse_warn_compat, DISABLED_CONFIGURATION, NULL }, - { "Manager", "RuntimeWatchdogSec", config_parse_sec, 0, &arg_runtime_watchdog }, - { "Manager", "RebootWatchdogSec", config_parse_sec, 0, &arg_reboot_watchdog }, - { "Manager", "ShutdownWatchdogSec", config_parse_sec, 0, &arg_reboot_watchdog }, /* obsolete alias */ - { "Manager", "KExecWatchdogSec", config_parse_sec, 0, &arg_kexec_watchdog }, - { "Manager", "WatchdogDevice", config_parse_path, 0, &arg_watchdog_device }, - { "Manager", "CapabilityBoundingSet", config_parse_capability_set, 0, &arg_capability_bounding_set }, - { "Manager", "NoNewPrivileges", config_parse_bool, 0, &arg_no_new_privs }, + { "Manager", "LogLevel", config_parse_level2, 0, NULL }, + { "Manager", "LogTarget", config_parse_target, 0, NULL }, + { "Manager", "LogColor", config_parse_color, 0, NULL }, + { "Manager", "LogLocation", config_parse_location, 0, NULL }, + { "Manager", "DumpCore", config_parse_bool, 0, &arg_dump_core }, + { "Manager", "CrashChVT", /* legacy */ config_parse_crash_chvt, 0, &arg_crash_chvt }, + { "Manager", "CrashChangeVT", config_parse_crash_chvt, 0, &arg_crash_chvt }, + { "Manager", "CrashShell", config_parse_bool, 0, &arg_crash_shell }, + { "Manager", "CrashReboot", config_parse_bool, 0, &arg_crash_reboot }, + { "Manager", "ShowStatus", config_parse_show_status, 0, &arg_show_status }, + { "Manager", "StatusUnitFormat", config_parse_status_unit_format, 0, &arg_status_unit_format }, + { "Manager", "CPUAffinity", config_parse_cpu_affinity2, 0, &arg_cpu_affinity }, + { "Manager", "NUMAPolicy", config_parse_numa_policy, 0, &arg_numa_policy.type }, + { "Manager", "NUMAMask", config_parse_numa_mask, 0, &arg_numa_policy }, + { "Manager", "JoinControllers", config_parse_warn_compat, DISABLED_CONFIGURATION, NULL }, + { "Manager", "RuntimeWatchdogSec", config_parse_sec, 0, &arg_runtime_watchdog }, + { "Manager", "RebootWatchdogSec", config_parse_sec, 0, &arg_reboot_watchdog }, + { "Manager", "ShutdownWatchdogSec", config_parse_sec, 0, &arg_reboot_watchdog }, /* obsolete alias */ + { "Manager", "KExecWatchdogSec", config_parse_sec, 0, &arg_kexec_watchdog }, + { "Manager", "WatchdogDevice", config_parse_path, 0, &arg_watchdog_device }, + { "Manager", "CapabilityBoundingSet", config_parse_capability_set, 0, &arg_capability_bounding_set }, + { "Manager", "NoNewPrivileges", config_parse_bool, 0, &arg_no_new_privs }, #if HAVE_SECCOMP - { "Manager", "SystemCallArchitectures", config_parse_syscall_archs, 0, &arg_syscall_archs }, + { "Manager", "SystemCallArchitectures", config_parse_syscall_archs, 0, &arg_syscall_archs }, #endif - { "Manager", "TimerSlackNSec", config_parse_nsec, 0, &arg_timer_slack_nsec }, - { "Manager", "DefaultTimerAccuracySec", config_parse_sec, 0, &arg_default_timer_accuracy_usec }, - { "Manager", "DefaultStandardOutput", config_parse_output_restricted, 0, &arg_default_std_output }, - { "Manager", "DefaultStandardError", config_parse_output_restricted, 0, &arg_default_std_error }, - { "Manager", "DefaultTimeoutStartSec", config_parse_sec, 0, &arg_default_timeout_start_usec }, - { "Manager", "DefaultTimeoutStopSec", config_parse_sec, 0, &arg_default_timeout_stop_usec }, - { "Manager", "DefaultTimeoutAbortSec", config_parse_timeout_abort, 0, &arg_default_timeout_abort_set }, - { "Manager", "DefaultRestartSec", config_parse_sec, 0, &arg_default_restart_usec }, - { "Manager", "DefaultStartLimitInterval", config_parse_sec, 0, &arg_default_start_limit_interval }, /* obsolete alias */ - { "Manager", "DefaultStartLimitIntervalSec", config_parse_sec, 0, &arg_default_start_limit_interval }, - { "Manager", "DefaultStartLimitBurst", config_parse_unsigned, 0, &arg_default_start_limit_burst }, - { "Manager", "DefaultEnvironment", config_parse_environ, 0, &arg_default_environment }, - { "Manager", "DefaultLimitCPU", config_parse_rlimit, RLIMIT_CPU, arg_default_rlimit }, - { "Manager", "DefaultLimitFSIZE", config_parse_rlimit, RLIMIT_FSIZE, arg_default_rlimit }, - { "Manager", "DefaultLimitDATA", config_parse_rlimit, RLIMIT_DATA, arg_default_rlimit }, - { "Manager", "DefaultLimitSTACK", config_parse_rlimit, RLIMIT_STACK, arg_default_rlimit }, - { "Manager", "DefaultLimitCORE", config_parse_rlimit, RLIMIT_CORE, arg_default_rlimit }, - { "Manager", "DefaultLimitRSS", config_parse_rlimit, RLIMIT_RSS, arg_default_rlimit }, - { "Manager", "DefaultLimitNOFILE", config_parse_rlimit, RLIMIT_NOFILE, arg_default_rlimit }, - { "Manager", "DefaultLimitAS", config_parse_rlimit, RLIMIT_AS, arg_default_rlimit }, - { "Manager", "DefaultLimitNPROC", config_parse_rlimit, RLIMIT_NPROC, arg_default_rlimit }, - { "Manager", "DefaultLimitMEMLOCK", config_parse_rlimit, RLIMIT_MEMLOCK, arg_default_rlimit }, - { "Manager", "DefaultLimitLOCKS", config_parse_rlimit, RLIMIT_LOCKS, arg_default_rlimit }, - { "Manager", "DefaultLimitSIGPENDING", config_parse_rlimit, RLIMIT_SIGPENDING, arg_default_rlimit }, - { "Manager", "DefaultLimitMSGQUEUE", config_parse_rlimit, RLIMIT_MSGQUEUE, arg_default_rlimit }, - { "Manager", "DefaultLimitNICE", config_parse_rlimit, RLIMIT_NICE, arg_default_rlimit }, - { "Manager", "DefaultLimitRTPRIO", config_parse_rlimit, RLIMIT_RTPRIO, arg_default_rlimit }, - { "Manager", "DefaultLimitRTTIME", config_parse_rlimit, RLIMIT_RTTIME, arg_default_rlimit }, - { "Manager", "DefaultCPUAccounting", config_parse_tristate, 0, &arg_default_cpu_accounting }, - { "Manager", "DefaultIOAccounting", config_parse_bool, 0, &arg_default_io_accounting }, - { "Manager", "DefaultIPAccounting", config_parse_bool, 0, &arg_default_ip_accounting }, - { "Manager", "DefaultBlockIOAccounting", config_parse_bool, 0, &arg_default_blockio_accounting }, - { "Manager", "DefaultMemoryAccounting", config_parse_bool, 0, &arg_default_memory_accounting }, - { "Manager", "DefaultTasksAccounting", config_parse_bool, 0, &arg_default_tasks_accounting }, - { "Manager", "DefaultTasksMax", config_parse_tasks_max, 0, &arg_default_tasks_max }, - { "Manager", "CtrlAltDelBurstAction", config_parse_emergency_action, 0, &arg_cad_burst_action }, - { "Manager", "DefaultOOMPolicy", config_parse_oom_policy, 0, &arg_default_oom_policy }, + { "Manager", "TimerSlackNSec", config_parse_nsec, 0, &arg_timer_slack_nsec }, + { "Manager", "DefaultTimerAccuracySec", config_parse_sec, 0, &arg_default_timer_accuracy_usec }, + { "Manager", "DefaultStandardOutput", config_parse_output_restricted, 0, &arg_default_std_output }, + { "Manager", "DefaultStandardError", config_parse_output_restricted, 0, &arg_default_std_error }, + { "Manager", "DefaultTimeoutStartSec", config_parse_sec, 0, &arg_default_timeout_start_usec }, + { "Manager", "DefaultTimeoutStopSec", config_parse_sec, 0, &arg_default_timeout_stop_usec }, + { "Manager", "DefaultTimeoutAbortSec", config_parse_default_timeout_abort, 0, NULL }, + { "Manager", "DefaultRestartSec", config_parse_sec, 0, &arg_default_restart_usec }, + { "Manager", "DefaultStartLimitInterval", config_parse_sec, 0, &arg_default_start_limit_interval }, /* obsolete alias */ + { "Manager", "DefaultStartLimitIntervalSec", config_parse_sec, 0, &arg_default_start_limit_interval }, + { "Manager", "DefaultStartLimitBurst", config_parse_unsigned, 0, &arg_default_start_limit_burst }, + { "Manager", "DefaultEnvironment", config_parse_environ, 0, &arg_default_environment }, + { "Manager", "DefaultLimitCPU", config_parse_rlimit, RLIMIT_CPU, arg_default_rlimit }, + { "Manager", "DefaultLimitFSIZE", config_parse_rlimit, RLIMIT_FSIZE, arg_default_rlimit }, + { "Manager", "DefaultLimitDATA", config_parse_rlimit, RLIMIT_DATA, arg_default_rlimit }, + { "Manager", "DefaultLimitSTACK", config_parse_rlimit, RLIMIT_STACK, arg_default_rlimit }, + { "Manager", "DefaultLimitCORE", config_parse_rlimit, RLIMIT_CORE, arg_default_rlimit }, + { "Manager", "DefaultLimitRSS", config_parse_rlimit, RLIMIT_RSS, arg_default_rlimit }, + { "Manager", "DefaultLimitNOFILE", config_parse_rlimit, RLIMIT_NOFILE, arg_default_rlimit }, + { "Manager", "DefaultLimitAS", config_parse_rlimit, RLIMIT_AS, arg_default_rlimit }, + { "Manager", "DefaultLimitNPROC", config_parse_rlimit, RLIMIT_NPROC, arg_default_rlimit }, + { "Manager", "DefaultLimitMEMLOCK", config_parse_rlimit, RLIMIT_MEMLOCK, arg_default_rlimit }, + { "Manager", "DefaultLimitLOCKS", config_parse_rlimit, RLIMIT_LOCKS, arg_default_rlimit }, + { "Manager", "DefaultLimitSIGPENDING", config_parse_rlimit, RLIMIT_SIGPENDING, arg_default_rlimit }, + { "Manager", "DefaultLimitMSGQUEUE", config_parse_rlimit, RLIMIT_MSGQUEUE, arg_default_rlimit }, + { "Manager", "DefaultLimitNICE", config_parse_rlimit, RLIMIT_NICE, arg_default_rlimit }, + { "Manager", "DefaultLimitRTPRIO", config_parse_rlimit, RLIMIT_RTPRIO, arg_default_rlimit }, + { "Manager", "DefaultLimitRTTIME", config_parse_rlimit, RLIMIT_RTTIME, arg_default_rlimit }, + { "Manager", "DefaultCPUAccounting", config_parse_tristate, 0, &arg_default_cpu_accounting }, + { "Manager", "DefaultIOAccounting", config_parse_bool, 0, &arg_default_io_accounting }, + { "Manager", "DefaultIPAccounting", config_parse_bool, 0, &arg_default_ip_accounting }, + { "Manager", "DefaultBlockIOAccounting", config_parse_bool, 0, &arg_default_blockio_accounting }, + { "Manager", "DefaultMemoryAccounting", config_parse_bool, 0, &arg_default_memory_accounting }, + { "Manager", "DefaultTasksAccounting", config_parse_bool, 0, &arg_default_tasks_accounting }, + { "Manager", "DefaultTasksMax", config_parse_tasks_max, 0, &arg_default_tasks_max }, + { "Manager", "CtrlAltDelBurstAction", config_parse_emergency_action, 0, &arg_cad_burst_action }, + { "Manager", "DefaultOOMPolicy", config_parse_oom_policy, 0, &arg_default_oom_policy }, {} }; From e737017b856e9c8638a049bb0114eb7d51d6c3cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 27 Nov 2019 13:42:57 +0100 Subject: [PATCH 5/6] pid1: make TimeoutAbortSec settable for transient units It was documented to be, but implementation was missing. --- src/core/dbus-service.c | 7 +++++++ src/shared/bus-unit-util.c | 1 + 2 files changed, 8 insertions(+) diff --git a/src/core/dbus-service.c b/src/core/dbus-service.c index 3a58977c383..5cf9b21890e 100644 --- a/src/core/dbus-service.c +++ b/src/core/dbus-service.c @@ -309,6 +309,13 @@ static int bus_service_set_transient_property( if (streq(name, "TimeoutStopUSec")) return bus_set_transient_usec(u, name, &s->timeout_stop_usec, message, flags, error); + if (streq(name, "TimeoutAbortUSec")) { + r = bus_set_transient_usec(u, name, &s->timeout_abort_usec, message, flags, error); + if (r >= 0 && !UNIT_WRITE_FLAGS_NOOP(flags)) + s->timeout_abort_set = true; + return r; + } + if (streq(name, "RuntimeMaxUSec")) return bus_set_transient_usec(u, name, &s->runtime_max_usec, message, flags, error); diff --git a/src/shared/bus-unit-util.c b/src/shared/bus-unit-util.c index 64c0d128b85..22a15493d7f 100644 --- a/src/shared/bus-unit-util.c +++ b/src/shared/bus-unit-util.c @@ -1485,6 +1485,7 @@ static int bus_append_service_property(sd_bus_message *m, const char *field, con if (STR_IN_SET(field, "RestartSec", "TimeoutStartSec", "TimeoutStopSec", + "TimeoutAbortSec", "RuntimeMaxSec", "WatchdogSec")) return bus_append_parse_sec_rename(m, field, eq); From b096d14c413996c2d2ed2f984dd61b79efee6b08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 27 Nov 2019 13:47:01 +0100 Subject: [PATCH 6/6] doc: update list of transient units Doing this manually seem to work only so well, but it is indeed hard to generate automatically. Let's add the stuff that is missing for now. AddRef= is not a unit file setting, remove it from the list. --- docs/TRANSIENT-SETTINGS.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/TRANSIENT-SETTINGS.md b/docs/TRANSIENT-SETTINGS.md index d7e02c0ad35..6cbd03e1ad4 100644 --- a/docs/TRANSIENT-SETTINGS.md +++ b/docs/TRANSIENT-SETTINGS.md @@ -5,9 +5,9 @@ title: What settings are currently available for transient units? # What settings are currently available for transient units? Our intention is to make all settings that are available as unit file settings -also available for transient units, through the D-Bus API. At the moment, some -unit types (device, swap, target) are not supported at all via unit types, -but most others are pretty well supported, with some notable omissions. +also available for transient units, through the D-Bus API. At the moment, +device, swap, and target units are not supported at all as transient units, but +others are pretty well supported. The lists below contain all settings currently available in unit files. The ones currently available in transient units are prefixed with `✓`. @@ -51,7 +51,6 @@ Most generic unit settings are available for transient units. ✓ SuccessAction= ✓ FailureActionExitStatus= ✓ SuccessActionExitStatus= -✓ AddRef= ✓ RebootArgument= ✓ ConditionPathExists= ✓ ConditionPathExistsGlob= @@ -185,6 +184,7 @@ All execution-related settings are available for transient units. ✓ PrivateMounts= ✓ ProtectKernelTunables= ✓ ProtectKernelModules= +✓ ProtectKernelLogs= ✓ ProtectControlGroups= ✓ PrivateNetwork= ✓ PrivateUsers= @@ -271,6 +271,7 @@ All process killing settings are available for transient units: ✓ SendSIGHUP= ✓ KillMode= ✓ KillSignal= +✓ RestartKillSignal= ✓ FinalKillSignal= ✓ WatchdogSignal= ``` @@ -310,6 +311,7 @@ Most service unit settings are available for transient units. Sockets= ✓ USBFunctionDescriptors= ✓ USBFunctionStrings= +✓ OOMPolicy= ``` ## Mount Unit Settings