1
0
mirror of https://github.com/systemd/systemd synced 2025-10-07 12:44:45 +02:00

Compare commits

..

No commits in common. "d6bf675f0bd047a1f02d9079444efaed1cc3ef8b" and "d0b3039837d610c5c5b8486b864806e578d55a8d" have entirely different histories.

72 changed files with 449 additions and 703 deletions

View File

@ -61,7 +61,7 @@ Value: a JSON string with the structure described below
}
```
A reference implementations of a [build-time tool is provided](https://github.com/systemd/package-notes)
A reference implementations of a [build-time tool is provided](https://github.com/keszybz/rpm-version-note/)
and can be used to generate a linker script, which can then be used at build time via
```LDFLAGS="-Wl,-T,/path/to/generated/script"``` to include the note in the binary.

View File

@ -1,190 +0,0 @@
---
title: Native Journal Protocol
category: Interfaces
layout: default
---
# Native Journal Protocol
`systemd-journald.service` accepts log data via various protocols:
* Classic RFC3164 BSD syslog via the `/dev/log` socket
* STDOUT/STDERR of programs via `StandardOutput=journal` + `StandardError=journal` in service files (both of which are default settings)
* Kernel log messages via the `/dev/kmsg` device node
* Audit records via the kernel's audit subsystem
* Structured log messages via `journald`'s native protocol
The latter is what this document is about: if you are developing a program and
want to pass structured log data to `journald`, it's the Journal's native
protocol what you want to use. The systemd project provides the
[`sd_journal_print(3)`](https://www.freedesktop.org/software/systemd/man/sd_journal_print.html)
API that implements the client side of this protocol. This document explains
what this interface does behind the scenes, in case you'd like to implement a
client for it yourself, without linking to `libsystemd` — for example because
you work in a programming language other than C or otherwise want to avoid the
dependency.
## Basics
The native protocol of `journald` is spoken on the
`/run/systemd/journal/socket` `AF_UNIX`/`SOCK_DGRAM` socket on which
`systemd-journald.service` listens. Each datagram sent to this socket
encapsulates one journal entry that shall be written. Since datagrams are
subject to a size limit and we want to allow large journal entries, datagrams
sent over this socket may come in one of two formats:
* A datagram with the literal journal entry data as payload, without
any file descriptors attached.
* A datagram with an empty payload, but with a single
[`memfd`](https://man7.org/linux/man-pages/man2/memfd_create.2.html)
file descriptor that contains the literal journal entry data.
Other combinations are not permitted, i.e. datagrams with both payload and file
descriptors, or datagrams with neither, or more than one file descriptor. Such
datagrams are ignored. The `memfd` file descriptor should be fully sealed. The
binary format in the datagram payload and in the `memfd` memory is
identical. Typically a client would attempt to first send the data as datagram
payload, but if this fails with an `EMSGSIZE` error it would immediately retry
via the `memfd` logic.
A client probably should bump up the `SO_SNDBUF` socket option of its `AF_UNIX`
socket towards `journald` in order to delay blocking I/O as much as possible.
## Data Format
Each datagram should consist of a number of environment-like key/value
assignments. Unlike environment variable assignments the value may contain NUL
bytes however, as well as any other binary data. Keys may not include the `=`
or newline characters (or any other control characters or non-ASCII characters)
and may not be empty.
Serialization into the datagram payload or `memfd` is straight-forward: each
key/value pair is serialized via one of two methods:
* The first method inserts a `=` character between key and value, and suffixes
the result with `\n` (i.e. the newline character, ASCII code 10). Example: a
key `FOO` with a value `BAR` is serialized `F`, `O`, `O`, `=`, `B`, `A`, `R`,
`\n`.
* The second method should be used if the value of a field contains a `\n`
byte. In this case, the key name is serialized as is, followed by a `\n`
character, followed by a (non-aligned) little-endian unsigned 64bit integer
encoding the size of the value, followed by the literal value data, followed by
`\n`. Example: a key `FOO` with a value `BAR` may be serialized using this
second method as: `F`, `O`, `O`, `\n`, `\003`, `\000`, `\000`, `\000`, `\000`,
`\000`, `\000`, `\000`, `B`, `A`, `R`, `\n`.
If the value of a key/value pair contains a newline character (`\n`), it *must*
be serialized using the second method. If it does not, either method is
permitted. However, it is generally recommended to use the first method if
possible for all key/value pairs where applicable since the generated datagrams
are easily recognized and understood by the human eye this way, without any
manual binary decoding — which improves the debugging experience a lot, in
particular with tools such as `strace` that can show datagram content as text
dump. After all, log messages are highly relevant for debugging programs, hence
optimizing log traffic for readability without special tools is generally
desirable.
Note that keys that begin with `_` have special semantics in `journald`: they
are *trusted* and implicitly appended by `journald` on the receiving
side. Clients should not send them — if they do anyway, they will be ignored.
The most important key/value pair to send is `MESSAGE=`, as that contains the
actual log message text. Other relevant keys a client should send in most cases
are `PRIORITY=`, `CODE_FILE=`, `CODE_LINE=`, `CODE_FUNC=`, `ERRNO=`. It's
recommended to generate these fields implicitly on the client side. For further
information see the [relevant documentation of these
fields](https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html).
The order in which the fields are serialized within one datagram is undefined
and may be freely chosen by the client. The server side might or might not
retain or reorder it when writing it to the Journal.
Some programs might generate multi-line log messages (e.g. a stack unwinder
generating log output about a stack trace, with one line for each stack
frame). It's highly recommended to send these as a single datagram, using a
single `MESSAGE=` field with embedded newline characters between the lines (the
second serialization method described above must hence be used for this
field). If possible do not split up individual events into multiple Journal
events that might then be processed and written into the Journal as separate
entries. The Journal toolchain is capable of handling multi-line log entries
just fine, and it's generally preferred to have a single set of metadata fields
associated with each multi-line message.
Note that the same keys may be used multiple times within the same datagram,
with different values. The Journal supports this and will write such entries to
disk without complaining. This is useful for associating a single log entry
with multiple suitable objects of the same type at once. This should only be
used for specific Journal fields however, where this is expected. Do not use
this for Journal fields where this is not expected and where code reasonably
assumes per-event uniqueness of the keys. In most cases code that consumes and
displays log entries is likely to ignore such non-unique fields or only
consider the first of the specified values. Specifically, if a Journal entry
contains multiple `MESSAGE=` fields, likely only the first one is
displayed. Note that a well-written logging client library thus will not use a
plain dictionary for accepting structured log metadata, but rather a data
structure that allows non-unique keys, for example an array, or a dictionary
that optionally maps to a set of values instead of a single value.
## Example Datagram
Here's an encoded message, with various common fields, all encoded according to
the first serialization method, with the exception of one, where the value
contains a newline character, and thus the second method is needed to be used.
```
PRIORITY=3\n
SYSLOG_FACILITY=3\n
CODE_FILE=src/foobar.c\n
CODE_LINE=77\n
BINARY_BLOB\n
\004\000\000\000\000\000\000\000xx\nx\n
CODE_FUNC=some_func\n
SYSLOG_IDENTIFIER=footool\n
MESSAGE=Something happened.\n
```
(Lines are broken here after each `\n` to make things more readable. C-style
backslash escaping is used.)
## Automatic Protocol Upgrading
It might be wise to automatically upgrade to logging via the Journal's native
protocol in clients that previously used the BSD syslog protocol. Behaviour in
this case should be pretty obvious: try connecting a socket to
`/run/systemd/journal/socket` first (on success use the native Journal
protocol), and if that fails fall back to `/dev/log` (and use the BSD syslog
protocol).
Programs normally logging to STDERR might also choose to upgrade to native
Journal logging in case they are invoked via systemd's service logic, where
STDOUT and STDERR are going to the Journal anyway. By preferring the native
protocol over STDERR-based logging, structured metadata can be passed along,
including priority information and more — which is not available on STDERR
based logging. If a program wants to detect automatically whether its STDERR is
connected to the Journal's stream transport, look for the `$JOURNAL_STREAM`
environment variable. The systemd service logic sets this variable to a
colon-separated pair of device and inode number (formatted in decimal ASCII) of
the STDERR file descriptor. If the `.st_dev` and `.st_ino` fields of the
`struct stat` data returned by `fstat(STDERR_FILENO, …)` match these values a
program can be sure its STDERR is connected to the Journal, and may then opt to
upgrade to the native Journal protocol via an `AF_UNIX` socket of its own, and
cease to use STDERR.
Why bother with this environment variable check? A service program invoked by
systemd might employ shell-style I/O redirection on invoked subprograms, and
those should likely not upgrade to the native Journal protocol, but instead
continue to use the redirected file descriptors passed to them. Thus, by
comparing the device and inode number of the actual STDERR file descriptor with
the one the service manager passed, one can make sure that no I/O redirection
took place for the current program.
## Alternative Implementations
If you are looking for alternative implementations of this protocol (besides
systemd's own in `sd_journal_print()`), consider
[GLib's](https://gitlab.gnome.org/GNOME/glib/-/blob/master/glib/gmessages.c) or
[`dbus-broker`'s](https://github.com/bus1/dbus-broker/blob/main/src/util/log.c).
And that's already all there is to it.

View File

@ -1297,18 +1297,13 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnMicro-Star*:pn*A10SC*:*
# MSI Modern series
evdev:atkbd:dmi:bvn*:bvr*:bd*:svnMicro-StarInternational*:pnModern*:*
KEYBOARD_KEY_56=backslash # secondary backslash key
KEYBOARD_KEY_f1=f20 # Fn+F5 micmute
KEYBOARD_KEY_76=f21 # Fn+F4 touchpad, becomes meta+ctrl+toggle
KEYBOARD_KEY_91=prog1 # Fn+F7 Creation Center, sometime F7
KEYBOARD_KEY_f2=prog2 # Fn+F12 screen rotation
KEYBOARD_KEY_8d=prog3 # Fn+a
KEYBOARD_KEY_8c=prog4 # Fn+z
KEYBOARD_KEY_f5=fn_esc # Fn+esc toggle the behaviour of Fn keys
KEYBOARD_KEY_97=unknown # lid close
KEYBOARD_KEY_98=unknown # lid open
# Fn+PrntScr sends meta+shift+s
#Fn+PrntScr sends meta+shif+s
###########################################################
# MSI

View File

@ -846,10 +846,6 @@
<title>Exit status</title>
<para>On success, 0 is returned, a non-zero failure code otherwise.</para>
<para>When a command is invoked with <command>with</command>, the exit status of the child is
propagated. Effectively, <command>homectl</command> will exit without error if the command is
successfully invoked <emphasis>and</emphasis> finishes successfully.</para>
</refsect1>
<xi:include href="common-variables.xml" />

View File

@ -218,9 +218,6 @@ sd_journal_send("MESSAGE=Hello World, this is PID %lu!", (unsigned long) getpid(
<function>sd_journal_send()</function>. Using
<function>syslog()</function> has the benefit of being
more portable.</para>
<para>These functions implement a client to the <ulink
url="https://systemd.io/JOURNAL_NATIVE_PROTOCOL">Native Journal Protocol</ulink>.</para>
</refsect1>
<refsect1>

View File

@ -17,29 +17,22 @@
<refnamediv>
<refname>systemd-cryptsetup@.service</refname>
<!-- <refname>system-systemd\x2dcryptsetup.slice</refname> — this causes meson to go haywire because it
thinks this is a (windows) path. Let's just not create the alias for this name, and only include it
in the synopsis. -->
<refname>systemd-cryptsetup</refname>
<refpurpose>Full disk decryption logic</refpurpose>
</refnamediv>
<refsynopsisdiv>
<para><filename>systemd-cryptsetup@.service</filename></para>
<para><filename>system-systemd\x2dcryptsetup.slice</filename></para>
<para><filename>/usr/lib/systemd/systemd-cryptsetup</filename></para>
</refsynopsisdiv>
<refsect1>
<title>Description</title>
<para><filename>systemd-cryptsetup@.service</filename> is a service responsible for setting up encrypted
block devices. It is instantiated for each device that requires decryption for access.</para>
<para><filename>systemd-cryptsetup@.service</filename> instances are part of the
<filename>system-systemd\x2dcryptsetup.slice</filename> slice, which is destroyed only very late in the
shutdown procedure. This allows the encrypted devices to remain up until filesystems have been unmounted.
</para>
<para><filename>systemd-cryptsetup@.service</filename> is a
service responsible for setting up encrypted block devices. It is
instantiated for each device that requires decryption for
access.</para>
<para><filename>systemd-cryptsetup@.service</filename> will ask
for hard disk passwords via the <ulink

View File

@ -53,10 +53,9 @@
project='man-pages'><refentrytitle>syslog</refentrytitle><manvolnum>3</manvolnum></citerefentry>
call</para></listitem>
<listitem><para>Structured system log messages via the native Journal API, see
<citerefentry><refentrytitle>sd_journal_print</refentrytitle><manvolnum>3</manvolnum></citerefentry>
and <ulink url="https://systemd.io/JOURNAL_NATIVE_PROTOCOL">Native Journal
Protocol</ulink></para></listitem>
<listitem><para>Structured system log messages via the native
Journal API, see
<citerefentry><refentrytitle>sd_journal_print</refentrytitle><manvolnum>3</manvolnum></citerefentry></para></listitem>
<listitem><para>Standard output and standard error of service units. For further details see
below.</para></listitem>

View File

@ -263,18 +263,16 @@
<refsect1>
<title>Exit status</title>
<para>On success, 0 is returned. If the configuration was syntactically invalid (syntax errors, missing
arguments, …), so some lines had to be ignored, but no other errors occurred, <constant>65</constant> is
returned (<constant>EX_DATAERR</constant> from <filename>/usr/include/sysexits.h</filename>). If the
configuration was syntactically valid, but could not be executed (lack of permissions, creation of files
in missing directories, invalid contents when writing to <filename>/sys/</filename> values, …),
<constant>73</constant> is returned (<constant>EX_CANTCREAT</constant> from
<filename>/usr/include/sysexits.h</filename>). Otherwise, <constant>1</constant> is returned
(<constant>EXIT_FAILURE</constant> from <filename>/usr/include/stdlib.h</filename>).</para>
<para>Note: when creating items, if the target already exists, but is of the wrong type or otherwise does
not match the requested state, and forced operation has not been requested with <literal>+</literal>,
a message is emitted, but the failure is otherwise ignored.</para>
<para>On success, 0 is returned. If the configuration was syntactically invalid (syntax errors,
missing arguments, …), so some lines had to be ignored, but no other errors occurred,
<constant>65</constant> is returned (<constant>EX_DATAERR</constant> from
<filename>/usr/include/sysexits.h</filename>). If the configuration was syntactically valid, but
could not be executed (lack of permissions, creation of files in missing directories, invalid
contents when writing to <filename>/sys/</filename> values, …), <constant>73</constant> is
returned (<constant>EX_CANTCREAT</constant> from <filename>/usr/include/sysexits.h</filename>).
Otherwise, <constant>1</constant> is returned (<constant>EXIT_FAILURE</constant> from
<filename>/usr/include/stdlib.h</filename>).
</para>
</refsect1>
<refsect1>

View File

@ -9,7 +9,7 @@ msgstr ""
"Project-Id-Version: systemd\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-08 17:48+0100\n"
"PO-Revision-Date: 2021-04-09 07:01+0000\n"
"PO-Revision-Date: 2021-03-25 03:01+0000\n"
"Last-Translator: simmon <simmon@nplob.com>\n"
"Language-Team: Korean <https://translate.fedoraproject.org/projects/systemd/"
"master/ko/>\n"
@ -18,7 +18,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.5.3\n"
"X-Generator: Weblate 4.5.1\n"
"X-Poedit-SourceCharset: UTF-8\n"
#: src/core/org.freedesktop.systemd1.policy.in:22
@ -132,7 +132,7 @@ msgstr "정적 호스트 이름 설정"
msgid ""
"Authentication is required to set the statically configured local hostname, "
"as well as the pretty hostname."
msgstr "로컬호스트 이름을 지정 호스트이름 처럼 정적으로 설정하려면 인증이 필요합니다."
msgstr "로컬호스트 이름을 모양새를 갖춘 호스트이름 처럼 정적으로 설정하려면 인증이 필요합니다."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"

View File

@ -427,10 +427,8 @@ const char *special_glyph(SpecialGlyph code) {
},
};
if (code < 0)
return NULL;
assert(code < _SPECIAL_GLYPH_MAX);
return draw_table[code >= _SPECIAL_GLYPH_FIRST_EMOJI ? emoji_enabled() : is_locale_utf8()][code];
}

View File

@ -39,7 +39,7 @@ void init_gettext(void);
bool is_locale_utf8(void);
typedef enum SpecialGlyph {
typedef enum {
SPECIAL_GLYPH_TREE_VERTICAL,
SPECIAL_GLYPH_TREE_BRANCH,
SPECIAL_GLYPH_TREE_RIGHT,
@ -70,7 +70,6 @@ typedef enum SpecialGlyph {
SPECIAL_GLYPH_LOCK_AND_KEY,
SPECIAL_GLYPH_TOUCH,
_SPECIAL_GLYPH_MAX,
_SPECIAL_GLYPH_INVALID = -EINVAL,
} SpecialGlyph;
const char *special_glyph(SpecialGlyph code) _const_;

View File

@ -296,19 +296,22 @@ static const char* const notify_access_table[_NOTIFY_ACCESS_MAX] = {
DEFINE_STRING_TABLE_LOOKUP(notify_access, NotifyAccess);
SpecialGlyph unit_active_state_to_glyph(UnitActiveState state) {
static const SpecialGlyph map[_UNIT_ACTIVE_STATE_MAX] = {
[UNIT_ACTIVE] = SPECIAL_GLYPH_BLACK_CIRCLE,
[UNIT_RELOADING] = SPECIAL_GLYPH_CIRCLE_ARROW,
[UNIT_INACTIVE] = SPECIAL_GLYPH_WHITE_CIRCLE,
[UNIT_FAILED] = SPECIAL_GLYPH_MULTIPLICATION_SIGN,
[UNIT_ACTIVATING] = SPECIAL_GLYPH_BLACK_CIRCLE,
[UNIT_DEACTIVATING] = SPECIAL_GLYPH_BLACK_CIRCLE,
[UNIT_MAINTENANCE] = SPECIAL_GLYPH_WHITE_CIRCLE,
};
switch (state) {
case UNIT_ACTIVE:
return SPECIAL_GLYPH_BLACK_CIRCLE;
case UNIT_RELOADING:
return SPECIAL_GLYPH_CIRCLE_ARROW;
case UNIT_INACTIVE:
return SPECIAL_GLYPH_WHITE_CIRCLE;
case UNIT_FAILED:
return SPECIAL_GLYPH_MULTIPLICATION_SIGN;
case UNIT_ACTIVATING:
case UNIT_DEACTIVATING:
return SPECIAL_GLYPH_BLACK_CIRCLE;
case UNIT_MAINTENANCE:
return SPECIAL_GLYPH_WHITE_CIRCLE;
if (state < 0)
return _SPECIAL_GLYPH_INVALID;
assert(state < _UNIT_ACTIVE_STATE_MAX);
return map[state];
default:
return SPECIAL_GLYPH_BLACK_CIRCLE;
}
}

View File

@ -3362,4 +3362,4 @@ static int run(int argc, char *argv[]) {
return dispatch_verb(argc, argv, verbs, NULL);
}
DEFINE_MAIN_FUNCTION_WITH_POSITIVE_FAILURE(run);
DEFINE_MAIN_FUNCTION(run);

View File

@ -2140,8 +2140,6 @@ static int manager_scheduled_shutdown_handler(
target = SPECIAL_POWEROFF_TARGET;
else if (streq(m->scheduled_shutdown_type, "reboot"))
target = SPECIAL_REBOOT_TARGET;
else if (streq(m->scheduled_shutdown_type, "kexec"))
target = SPECIAL_KEXEC_TARGET;
else if (streq(m->scheduled_shutdown_type, "halt"))
target = SPECIAL_HALT_TARGET;
else
@ -2207,7 +2205,7 @@ static int method_schedule_shutdown(sd_bus_message *message, void *userdata, sd_
action = "org.freedesktop.login1.power-off";
action_multiple_sessions = "org.freedesktop.login1.power-off-multiple-sessions";
action_ignore_inhibit = "org.freedesktop.login1.power-off-ignore-inhibit";
} else if (STR_IN_SET(type, "reboot", "kexec")) {
} else if (streq(type, "reboot")) {
action = "org.freedesktop.login1.reboot";
action_multiple_sessions = "org.freedesktop.login1.reboot-multiple-sessions";
action_ignore_inhibit = "org.freedesktop.login1.reboot-ignore-inhibit";

View File

@ -25,13 +25,6 @@
#include "radv-internal.h"
#include "web-util.h"
bool link_dhcp6_with_address_enabled(Link *link) {
if (!link_dhcp6_enabled(link))
return false;
return link->network->dhcp6_use_address;
}
bool link_dhcp6_pd_is_enabled(Link *link) {
assert(link);

View File

@ -26,7 +26,6 @@ typedef struct DHCP6DelegatedPrefix {
DHCP6DelegatedPrefix *dhcp6_pd_free(DHCP6DelegatedPrefix *p);
DEFINE_TRIVIAL_CLEANUP_FUNC(DHCP6DelegatedPrefix*, dhcp6_pd_free);
bool link_dhcp6_with_address_enabled(Link *link);
bool link_dhcp6_pd_is_enabled(Link *link);
int dhcp6_pd_remove(Link *link);
int dhcp6_configure(Link *link);

View File

@ -779,7 +779,7 @@ void link_check_ready(Link *link) {
break;
}
if ((link_dhcp4_enabled(link) || link_dhcp6_with_address_enabled(link) || link_ipv4ll_enabled(link)) &&
if ((link_dhcp4_enabled(link) || link_dhcp6_enabled(link) || link_ipv4ll_enabled(link)) &&
!link->dhcp_address && set_isempty(link->dhcp6_addresses) && !has_ndisc_address &&
!link->ipv4ll_address_configured)
/* When DHCP[46] or IPv4LL is enabled, at least one address is acquired by them. */

View File

@ -1656,9 +1656,10 @@ static int create_directory_or_subvolume(const char *path, mode_t mode, bool sub
return log_error_errno(r, "%s does not exist and cannot be created as the file system is read-only.", path);
if (k < 0)
return log_error_errno(k, "Failed to check if %s exists: %m", path);
if (!k)
return log_warning_errno(SYNTHETIC_ERRNO(EEXIST),
"\"%s\" already exists and is not a directory.", path);
if (!k) {
log_warning("\"%s\" already exists and is not a directory.", path);
return -EEXIST;
}
*creation = CREATION_EXISTING;
} else
@ -1741,10 +1742,10 @@ static int empty_directory(Item *i, const char *path) {
}
if (r < 0)
return log_error_errno(r, "is_dir() failed on path %s: %m", path);
if (r == 0) {
log_warning("\"%s\" already exists and is not a directory.", path);
return 0;
}
if (r == 0)
return log_error_errno(SYNTHETIC_ERRNO(EEXIST),
"'%s' already exists and is not a directory.",
path);
return path_set_perms(i, path);
}
@ -1803,7 +1804,7 @@ static int create_device(Item *i, mode_t file_type) {
return log_error_errno(r, "Failed to create device node \"%s\": %m", i->path);
creation = CREATION_FORCE;
} else {
log_warning("\"%s\" already exists is not a device node.", i->path);
log_debug("%s is not a device node.", i->path);
return 0;
}
} else
@ -2574,9 +2575,7 @@ static int patch_var_run(const char *fname, unsigned line, char **path) {
/* Also log about this briefly. We do so at LOG_NOTICE level, as we fixed up the situation automatically, hence
* there's no immediate need for action by the user. However, in the interest of making things less confusing
* to the user, let's still inform the user that these snippets should really be updated. */
log_syntax(NULL, LOG_NOTICE, fname, line, 0,
"Line references path below legacy directory /var/run/, updating %s → %s; please update the tmpfiles.d/ drop-in file accordingly.",
*path, n);
log_syntax(NULL, LOG_NOTICE, fname, line, 0, "Line references path below legacy directory /var/run/, updating %s → %s; please update the tmpfiles.d/ drop-in file accordingly.", *path, n);
free_and_replace(*path, n);

View File

@ -19,7 +19,7 @@ systemctl start --job-mode=ignore-dependencies hello
END_SEC=$(date -u '+%s')
ELAPSED=$(($END_SEC-$START_SEC))
test "$ELAPSED" -lt 3
[ "$ELAPSED" -lt 3 ]
# sleep should still be running, hello not.
systemctl list-jobs > /root/list-jobs.txt
@ -28,11 +28,11 @@ grep 'hello\.service' /root/list-jobs.txt && exit 1
systemctl stop sleep.service hello-after-sleep.target
# Some basic testing that --show-transaction does something useful
systemctl is-active systemd-importd && { echo 'unexpected success'; exit 1; }
! systemctl is-active systemd-importd
systemctl -T start systemd-importd
systemctl is-active systemd-importd
systemctl --show-transaction stop systemd-importd
systemctl is-active systemd-importd && { echo 'unexpected success'; exit 1; }
! systemctl is-active systemd-importd
# Test for a crash when enqueuing a JOB_NOP when other job already exists
systemctl start --no-block hello-after-sleep.target
@ -80,7 +80,7 @@ ELAPSED=$(($END_SEC-$START_SEC))
# wait5fail fails, so systemctl should fail
START_SEC=$(date -u '+%s')
systemctl start --wait wait2.service wait5fail.service && { echo 'unexpected success'; exit 1; }
! systemctl start --wait wait2.service wait5fail.service || exit 1
END_SEC=$(date -u '+%s')
ELAPSED=$(($END_SEC-$START_SEC))
[[ "$ELAPSED" -ge 5 ]] && [[ "$ELAPSED" -le 7 ]] || exit 1

View File

@ -59,8 +59,8 @@ journalctl -b -o export --output-fields=MESSAGE,FOO --output-fields=PRIORITY,MES
grep -q '^__CURSOR=' /output
grep -q '^MESSAGE=foo$' /output
grep -q '^PRIORITY=6$' /output
grep '^FOO=' /output && { echo 'unexpected success'; exit 1; }
grep '^SYSLOG_FACILITY=' /output && { echo 'unexpected success'; exit 1; }
! grep -q '^FOO=' /output
! grep -q '^SYSLOG_FACILITY=' /output
# `-b all` negates earlier use of -b (-b and -m are otherwise exclusive)
journalctl -b -1 -b all -m > /dev/null

View File

@ -4,9 +4,12 @@ set -o pipefail
mkdir -p /run/udev/rules.d/
test ! -f /run/udev/tags/added/c1:3
test ! -f /run/udev/tags/changed/c1:3
udevadm info /dev/null | grep -E 'E: (TAGS|CURRENT_TAGS)=.*:(added|changed):' && exit 1
! test -f /run/udev/tags/added/c1:3 &&
! test -f /run/udev/tags/changed/c1:3 &&
udevadm info /dev/null | grep -q -v 'E: TAGS=.*:added:.*' &&
udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:added:.*' &&
udevadm info /dev/null | grep -q -v 'E: TAGS=.*:changed:.*' &&
udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:changed:.*'
cat > /run/udev/rules.d/50-testsuite.rules <<EOF
ACTION=="add", SUBSYSTEM=="mem", KERNEL=="null", TAG+="added"
@ -16,39 +19,45 @@ EOF
udevadm control --reload
udevadm trigger -c add /dev/null
while test ! -f /run/udev/tags/added/c1:3 ||
test -f /run/udev/tags/changed/c1:3 ||
! udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' ||
! udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*' ||
udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*' ||
udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:changed:.*'
do
while : ; do
test -f /run/udev/tags/added/c1:3 &&
! test -f /run/udev/tags/changed/c1:3 &&
udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' &&
udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*' &&
udevadm info /dev/null | grep -q -v 'E: TAGS=.*:changed:.*' &&
udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:changed:.*' &&
break
sleep .5
done
udevadm control --reload
udevadm trigger -c change /dev/null
while test ! -f /run/udev/tags/added/c1:3 ||
test ! -f /run/udev/tags/changed/c1:3 ||
! udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' ||
udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*' ||
! udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*' ||
! udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:changed:.*'
do
while : ; do
test -f /run/udev/tags/added/c1:3 &&
test -f /run/udev/tags/changed/c1:3 &&
udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' &&
udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:added:.*' &&
udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*' &&
udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:changed:.*' &&
break
sleep .5
done
udevadm control --reload
udevadm trigger -c add /dev/null
while test ! -f /run/udev/tags/added/c1:3 ||
test ! -f /run/udev/tags/changed/c1:3 ||
! udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' ||
! udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*' ||
! udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*' ||
udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:changed:.*'
do
while : ; do
test -f /run/udev/tags/added/c1:3 &&
test -f /run/udev/tags/changed/c1:3 &&
udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' &&
udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*' &&
udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*' &&
udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:changed:.*' &&
break
sleep .5
done

View File

@ -3,7 +3,7 @@ set -ex
set -o pipefail
systemd-run --wait -p FailureAction=poweroff true
systemd-run --wait -p SuccessAction=poweroff false && { echo 'unexpected success'; exit 1; }
! systemd-run --wait -p SuccessAction=poweroff false
if ! test -f /firstphase ; then
echo OK > /firstphase

View File

@ -126,21 +126,11 @@ test -f /run/mainpidsh3/pid
EOF
chmod 755 /dev/shm/test20-mainpid3.sh
# This has to fail, as we shouldn't accept the dangerous PID file, and then
# inotify-wait on it to be corrected which we never do.
systemd-run --unit=test20-mainpidsh3.service \
-p StandardOutput=tty \
-p StandardError=tty \
-p Type=forking \
-p RuntimeDirectory=mainpidsh3 \
-p PIDFile=/run/mainpidsh3/pid \
-p DynamicUser=1 \
-p TimeoutStartSec=2s \
/dev/shm/test20-mainpid3.sh \
&& { echo 'unexpected success'; exit 1; }
# This has to fail, as we shouldn't accept the dangerous PID file, and then inotify-wait on it to be corrected which we never do
! systemd-run --unit=test20-mainpidsh3.service -p StandardOutput=tty -p StandardError=tty -p Type=forking -p RuntimeDirectory=mainpidsh3 -p PIDFile=/run/mainpidsh3/pid -p DynamicUser=1 -p TimeoutStartSec=2s /dev/shm/test20-mainpid3.sh
# Test that this failed due to timeout, and not some other error
test $(systemctl show -P Result test20-mainpidsh3.service) = timeout
test `systemctl show -P Result test20-mainpidsh3.service` = timeout
systemd-analyze log-level info

View File

@ -10,4 +10,4 @@ rm -fr /tmp/test
echo "e /tmp/test - root root 1d" | systemd-tmpfiles --create -
test ! -e /tmp/test
! test -e /tmp/test

View File

@ -63,7 +63,7 @@ e /tmp/e/1 0755 daemon daemon - -
e /tmp/e/2/* 0755 daemon daemon - -
EOF
test ! -d /tmp/e/1
! test -d /tmp/e/1
test -d /tmp/e/2
test $(stat -c %U:%G:%a /tmp/e/2) = "root:root:777"
@ -80,7 +80,7 @@ chmod 777 /tmp/e/3/d*
touch /tmp/e/3/f1
chmod 644 /tmp/e/3/f1
systemd-tmpfiles --create - <<EOF
! systemd-tmpfiles --create - <<EOF
e /tmp/e/3/* 0755 daemon daemon - -
EOF
@ -115,7 +115,7 @@ test $(stat -c %U:%G:%a /tmp/C/1/f1) = "daemon:daemon:755"
test -d /tmp/C/2
test $(stat -c %U:%G:%a /tmp/C/2/f1) = "daemon:daemon:755"
systemd-tmpfiles --create - <<EOF
! systemd-tmpfiles --create - <<EOF
C /tmp/C/3 0755 daemon daemon - /tmp/C/3-origin
EOF

View File

@ -19,7 +19,7 @@ f /tmp/f/2 0644 - - - This string should be written
EOF
### '1' should exist and be empty
test -f /tmp/f/1; test ! -s /tmp/f/1
test -f /tmp/f/1; ! test -s /tmp/f/1
test $(stat -c %U:%G:%a /tmp/f/1) = "root:root:644"
test $(stat -c %U:%G:%a /tmp/f/2) = "root:root:644"
@ -31,7 +31,7 @@ f /tmp/f/1 0666 daemon daemon - This string should not be written
EOF
# file should be empty
test ! -s /tmp/f/1
! test -s /tmp/f/1
test $(stat -c %U:%G:%a /tmp/f/1) = "daemon:daemon:666"
### But we shouldn't try to set perms on an existing file which is not a
@ -39,7 +39,7 @@ test $(stat -c %U:%G:%a /tmp/f/1) = "daemon:daemon:666"
mkfifo /tmp/f/fifo
chmod 644 /tmp/f/fifo
systemd-tmpfiles --create - <<EOF && { echo 'unexpected success'; exit 1; }
! systemd-tmpfiles --create - <<EOF
f /tmp/f/fifo 0666 daemon daemon - This string should not be written
EOF
@ -50,11 +50,11 @@ test $(stat -c %U:%G:%a /tmp/f/fifo) = "root:root:644"
ln -s missing /tmp/f/dangling
ln -s /tmp/file-owned-by-root /tmp/f/symlink
systemd-tmpfiles --create - <<EOF && { echo 'unexpected success'; exit 1; }
! systemd-tmpfiles --create - <<EOF
f /tmp/f/dangling 0644 daemon daemon - -
f /tmp/f/symlink 0644 daemon daemon - -
EOF
test ! -e /tmp/f/missing
! test -e /tmp/f/missing
test $(stat -c %U:%G:%a /tmp/file-owned-by-root) = "root:root:644"
### Handle read-only filesystem gracefully: we shouldn't fail if the target
@ -70,27 +70,27 @@ mount -o bind,ro /tmp/f/rw-fs /tmp/f/ro-fs
systemd-tmpfiles --create - <<EOF
f /tmp/f/ro-fs/foo 0644 - - - - This string should not be written
EOF
test -f /tmp/f/ro-fs/foo; test ! -s /tmp/f/ro-fs/foo
test -f /tmp/f/ro-fs/foo; ! test -s /tmp/f/ro-fs/foo
systemd-tmpfiles --create - <<EOF && { echo 'unexpected success'; exit 1; }
! systemd-tmpfiles --create - <<EOF
f /tmp/f/ro-fs/foo 0666 - - - -
EOF
test $(stat -c %U:%G:%a /tmp/f/fifo) = "root:root:644"
systemd-tmpfiles --create - <<EOF && { echo 'unexpected success'; exit 1; }
! systemd-tmpfiles --create - <<EOF
f /tmp/f/ro-fs/bar 0644 - - - -
EOF
test ! -e /tmp/f/ro-fs/bar
! test -e /tmp/f/ro-fs/bar
### 'f' shouldn't follow unsafe paths.
mkdir /tmp/f/daemon
ln -s /root /tmp/f/daemon/unsafe-symlink
chown -R --no-dereference daemon:daemon /tmp/f/daemon
systemd-tmpfiles --create - <<EOF && { echo 'unexpected success'; exit 1; }
! systemd-tmpfiles --create - <<EOF
f /tmp/f/daemon/unsafe-symlink/exploit 0644 daemon daemon - -
EOF
test ! -e /tmp/f/daemon/unsafe-symlink/exploit
! test -e /tmp/f/daemon/unsafe-symlink/exploit
#
# 'F'
@ -105,10 +105,10 @@ F /tmp/F/truncated 0666 daemon daemon - -
F /tmp/F/truncated-with-content 0666 daemon daemon - new content
EOF
test -f /tmp/F/created; test ! -s /tmp/F/created
test -f /tmp/F/created; ! test -s /tmp/F/created
test -f /tmp/F/created-with-content
test "$(< /tmp/F/created-with-content)" = "new content"
test -f /tmp/F/truncated; test ! -s /tmp/F/truncated
test -f /tmp/F/truncated; ! test -s /tmp/F/truncated
test $(stat -c %U:%G:%a /tmp/F/truncated) = "daemon:daemon:666"
test -s /tmp/F/truncated-with-content
test $(stat -c %U:%G:%a /tmp/F/truncated-with-content) = "daemon:daemon:666"
@ -117,7 +117,7 @@ test $(stat -c %U:%G:%a /tmp/F/truncated-with-content) = "daemon:daemon:666"
### unspecified in the other cases.
mkfifo /tmp/F/fifo
systemd-tmpfiles --create - <<EOF && { echo 'unexpected success'; exit 1; }
! systemd-tmpfiles --create - <<EOF
F /tmp/F/fifo 0644 - - - -
EOF
@ -127,11 +127,11 @@ test -p /tmp/F/fifo
ln -s missing /tmp/F/dangling
ln -s /tmp/file-owned-by-root /tmp/F/symlink
systemd-tmpfiles --create - <<EOF && { echo 'unexpected success'; exit 1; }
! systemd-tmpfiles --create - <<EOF
f /tmp/F/dangling 0644 daemon daemon - -
f /tmp/F/symlink 0644 daemon daemon - -
EOF
test ! -e /tmp/F/missing
! test -e /tmp/F/missing
test $(stat -c %U:%G:%a /tmp/file-owned-by-root) = "root:root:644"
### Handle read-only filesystem gracefully: we shouldn't fail if the target
@ -147,41 +147,40 @@ mount -o bind,ro /tmp/F/rw-fs /tmp/F/ro-fs
systemd-tmpfiles --create - <<EOF
F /tmp/F/ro-fs/foo 0644 - - - -
EOF
test -f /tmp/F/ro-fs/foo; test ! -s /tmp/F/ro-fs/foo
test -f /tmp/F/ro-fs/foo; ! test -s /tmp/F/ro-fs/foo
echo "truncating is not allowed anymore" >/tmp/F/rw-fs/foo
systemd-tmpfiles --create - <<EOF && { echo 'unexpected success'; exit 1; }
! systemd-tmpfiles --create - <<EOF
F /tmp/F/ro-fs/foo 0644 - - - -
EOF
systemd-tmpfiles --create - <<EOF && { echo 'unexpected success'; exit 1; }
! systemd-tmpfiles --create - <<EOF
F /tmp/F/ro-fs/foo 0644 - - - - This string should not be written
EOF
test -f /tmp/F/ro-fs/foo
grep -q 'truncating is not allowed' /tmp/F/ro-fs/foo
test -f /tmp/F/ro-fs/foo; ! test -s /tmp/F/ro-fs/foo
# Trying to change the perms should fail.
>/tmp/F/rw-fs/foo
systemd-tmpfiles --create - <<EOF && { echo 'unexpected success'; exit 1; }
! systemd-tmpfiles --create - <<EOF
F /tmp/F/ro-fs/foo 0666 - - - -
EOF
test $(stat -c %U:%G:%a /tmp/F/ro-fs/foo) = "root:root:644"
### Try to create a new file.
systemd-tmpfiles --create - <<EOF && { echo 'unexpected success'; exit 1; }
! systemd-tmpfiles --create - <<EOF
F /tmp/F/ro-fs/bar 0644 - - - -
EOF
test ! -e /tmp/F/ro-fs/bar
! test -e /tmp/F/ro-fs/bar
### 'F' shouldn't follow unsafe paths.
mkdir /tmp/F/daemon
ln -s /root /tmp/F/daemon/unsafe-symlink
chown -R --no-dereference daemon:daemon /tmp/F/daemon
systemd-tmpfiles --create - <<EOF && { echo 'unexpected success'; exit 1; }
! systemd-tmpfiles --create - <<EOF
F /tmp/F/daemon/unsafe-symlink/exploit 0644 daemon daemon - -
EOF
test ! -e /tmp/F/daemon/unsafe-symlink/exploit
! test -e /tmp/F/daemon/unsafe-symlink/exploit
#
# 'w'
@ -192,10 +191,10 @@ touch /tmp/w/overwritten
systemd-tmpfiles --create - <<EOF
w /tmp/w/unexistent 0644 - - - new content
EOF
test ! -e /tmp/w/unexistent
! test -e /tmp/w/unexistent
### no argument given -> fails.
systemd-tmpfiles --create - <<EOF && { echo 'unexpected success'; exit 1; }
! systemd-tmpfiles --create - <<EOF
w /tmp/w/unexistent 0644 - - - -
EOF
@ -231,7 +230,7 @@ mkdir /tmp/w/daemon
ln -s /root /tmp/w/daemon/unsafe-symlink
chown -R --no-dereference daemon:daemon /tmp/w/daemon
systemd-tmpfiles --create - <<EOF && { echo 'unexpected success'; exit 1; }
! systemd-tmpfiles --create - <<EOF
f /tmp/w/daemon/unsafe-symlink/exploit 0644 daemon daemon - -
EOF
test ! -e /tmp/w/daemon/unsafe-symlink/exploit
! test -e /tmp/w/daemon/unsafe-symlink/exploit

View File

@ -17,8 +17,8 @@ EOF
test -p /tmp/p/fifo1
test $(stat -c %U:%G:%a /tmp/p/fifo1) = "root:root:666"
# Refuse to overwrite an existing file. Error is not propagated.
systemd-tmpfiles --create - <<EOF
# it should refuse to overwrite an existing file
! systemd-tmpfiles --create - <<EOF
p /tmp/p/f1 0666 - - - -
EOF

View File

@ -18,8 +18,8 @@ test -d /var/tmp/foobar-test-06
test -d /var/tmp/foobar-test-06/important
test_snippet --remove
test ! -f /var/tmp/foobar-test-06
test ! -f /var/tmp/foobar-test-06/important
! test -f /var/tmp/foobar-test-06
! test -f /var/tmp/foobar-test-06/important
test_snippet --create
test -d /var/tmp/foobar-test-06
@ -35,4 +35,4 @@ test -f /var/tmp/foobar-test-06/something-else
test_snippet --create --remove
test -d /var/tmp/foobar-test-06
test -d /var/tmp/foobar-test-06/important
test ! -f /var/tmp/foobar-test-06/something-else
! test -f /var/tmp/foobar-test-06/something-else

View File

@ -16,8 +16,8 @@ r /tmp/test-prefix
r /tmp/test-prefix/file
EOF
test ! -f /tmp/test-prefix/file
test ! -f /tmp/test-prefix
! test -f /tmp/test-prefix/file
! test -f /tmp/test-prefix
mkdir /tmp/test-prefix
touch /tmp/test-prefix/file
@ -27,5 +27,5 @@ r /tmp/test-prefix/file
r /tmp/test-prefix
EOF
test ! -f /tmp/test-prefix/file
test ! -f /tmp/test-prefix
! test -f /tmp/test-prefix/file
! test -f /tmp/test-prefix

View File

@ -22,12 +22,10 @@ test -d /tmp/root/test2
# Verify the command fails to write to a root-owned subdirectory under an
# unprivileged user's directory when it's not part of the prefix, as expected
# by the unsafe_transition function.
echo 'd /tmp/user/root/test' | systemd-tmpfiles --create - \
&& { echo 'unexpected success'; exit 1; }
test ! -e /tmp/user/root/test
echo 'd /user/root/test' | systemd-tmpfiles --root=/tmp --create - \
&& { echo 'unexpected success'; exit 1; }
test ! -e /tmp/user/root/test
! echo 'd /tmp/user/root/test' | systemd-tmpfiles --create -
! test -e /tmp/user/root/test
! echo 'd /user/root/test' | systemd-tmpfiles --root=/tmp --create -
! test -e /tmp/user/root/test
# Verify the above works when all user-owned directories are in the prefix.
echo 'd /test' | systemd-tmpfiles --root=/tmp/user/root --create -

View File

@ -16,8 +16,8 @@ systemd-run --unit=three -p Type=simple /tmp/brokenbinary
# And now, do the same with Type=exec, where the latter two should fail
systemd-run --unit=four -p Type=exec /bin/sleep infinity
systemd-run --unit=five -p Type=exec -p User=idontexist /bin/sleep infinity && { echo 'unexpected success'; exit 1; }
systemd-run --unit=six -p Type=exec /tmp/brokenbinary && { echo 'unexpected success'; exit 1; }
! systemd-run --unit=five -p Type=exec -p User=idontexist /bin/sleep infinity
! systemd-run --unit=six -p Type=exec /tmp/brokenbinary
systemd-run --unit=seven -p KillSignal=SIGTERM -p RestartKillSignal=SIGINT -p Type=exec /bin/sleep infinity
# Both TERM and SIGINT happen to have the same number on all architectures

View File

@ -34,8 +34,8 @@ cmp /var/tmp/testimage.raw /var/lib/machines/testimage3.raw
# Test removal
machinectl remove testimage
test ! -f /var/lib/machines/testimage.raw
machinectl image-status testimage && { echo 'unexpected success'; exit 1; }
! test -f /var/lib/machines/testimage.raw
! machinectl image-status testimage
# Test export of clone
machinectl export-raw testimage3 /var/tmp/testimage3.raw
@ -46,8 +46,8 @@ rm /var/tmp/testimage3.raw
machinectl rename testimage3 testimage4
test -f /var/lib/machines/testimage4.raw
machinectl image-status testimage4
test ! -f /var/lib/machines/testimage3.raw
machinectl image-status testimage3 && { echo 'unexpected success'; exit 1; }
! test -f /var/lib/machines/testimage3.raw
! machinectl image-status testimage3
cmp /var/tmp/testimage.raw /var/lib/machines/testimage4.raw
# Test export of rename
@ -57,8 +57,8 @@ rm /var/tmp/testimage4.raw
# Test removal
machinectl remove testimage4
test ! -f /var/lib/machines/testimage4.raw
machinectl image-status testimage4 && { echo 'unexpected success'; exit 1; }
! test -f /var/lib/machines/testimage4.raw
! machinectl image-status testimage4
# → And now, let's test directory trees ← #
@ -90,8 +90,8 @@ diff -r /var/tmp/scratch/ /var/lib/machines/scratch2
# Test removal
machinectl remove scratch
test ! -f /var/lib/machines/scratch
machinectl image-status scratchi && { echo 'unexpected success'; exit 1; }
! test -f /var/lib/machines/scratch
! machinectl image-status scratch
# Test clone
machinectl clone scratch2 scratch3
@ -103,21 +103,21 @@ diff -r /var/tmp/scratch/ /var/lib/machines/scratch3
# Test removal
machinectl remove scratch2
test ! -f /var/lib/machines/scratch2
machinectl image-status scratch2 && { echo 'unexpected success'; exit 1; }
! test -f /var/lib/machines/scratch2
! machinectl image-status scratch2
# Test rename
machinectl rename scratch3 scratch4
test -d /var/lib/machines/scratch4
machinectl image-status scratch4
test ! -f /var/lib/machines/scratch3
machinectl image-status scratch3 && { echo 'unexpected success'; exit 1; }
! test -f /var/lib/machines/scratch3
! machinectl image-status scratch3
diff -r /var/tmp/scratch/ /var/lib/machines/scratch4
# Test removal
machinectl remove scratch4
test ! -f /var/lib/machines/scratch4
machinectl image-status scratch4 && { echo 'unexpected success'; exit 1; }
! test -f /var/lib/machines/scratch4
! machinectl image-status scratch4
# Test import-tar hyphen/stdin pipe behavior
cat /var/tmp/scratch.tar.gz | machinectl import-tar - scratch5
@ -135,8 +135,8 @@ rm -rf /var/tmp/scratch
# Test removal
machinectl remove scratch5
test ! -f /var/lib/machines/scratch5
machinectl image-status scratch5 && { echo 'unexpected success'; exit 1; }
! test -f /var/lib/machines/scratch5
! machinectl image-status scratch5
echo OK > /testok

View File

@ -22,8 +22,8 @@ systemctl show-environment | grep -q '^FOO=BAR$'
systemctl unset-environment FOO PATH
# Check that one is gone and the other reverted to the built-in
systemctl show-environment | grep '^FOO=$' && exit 1
systemctl show-environment | grep '^PATH=.*testaddition$' && exit 1
! (systemctl show-environment | grep -q '^FOO=$')
! (systemctl show-environment | grep -q '^PATH=.*testaddition$')
systemctl show-environment | grep -q '^PATH='
echo OK > /testok

View File

@ -13,16 +13,16 @@ timedatectl set-time 1980-10-15
systemd-run --on-timezone-change touch /tmp/timezone-changed
systemd-run --on-clock-change touch /tmp/clock-changed
test ! -f /tmp/timezone-changed
test ! -f /tmp/clock-changed
! test -f /tmp/timezone-changed
! test -f /tmp/clock-changed
timedatectl set-timezone Europe/Kiev
while test ! -f /tmp/timezone-changed ; do sleep .5 ; done
while ! test -f /tmp/timezone-changed ; do sleep .5 ; done
timedatectl set-time 2018-1-1
while test ! -f /tmp/clock-changed ; do sleep .5 ; done
while ! test -f /tmp/clock-changed ; do sleep .5 ; done
systemd-analyze log-level info

View File

@ -18,11 +18,11 @@ EOF
systemctl daemon-reload
test ! -e /etc/testservice
test ! -e /run/testservice
test ! -e /var/lib/testservice
test ! -e /var/cache/testservice
test ! -e /var/log/testservice
! test -e /etc/testservice
! test -e /run/testservice
! test -e /var/lib/testservice
! test -e /var/cache/testservice
! test -e /var/log/testservice
systemctl start testservice
@ -32,7 +32,7 @@ test -d /var/lib/testservice
test -d /var/cache/testservice
test -d /var/log/testservice
systemctl clean testservice && { echo 'unexpected success'; exit 1; }
! systemctl clean testservice
systemctl stop testservice
@ -44,7 +44,7 @@ test -d /var/log/testservice
systemctl clean testservice --what=configuration
test ! -e /etc/testservice
! test -e /etc/testservice
test -d /run/testservice
test -d /var/lib/testservice
test -d /var/cache/testservice
@ -52,27 +52,27 @@ test -d /var/log/testservice
systemctl clean testservice
test ! -e /etc/testservice
test ! -e /run/testservice
! test -e /etc/testservice
! test -e /run/testservice
test -d /var/lib/testservice
test ! -e /var/cache/testservice
! test -e /var/cache/testservice
test -d /var/log/testservice
systemctl clean testservice --what=logs
test ! -e /etc/testservice
test ! -e /run/testservice
! test -e /etc/testservice
! test -e /run/testservice
test -d /var/lib/testservice
test ! -e /var/cache/testservice
test ! -e /var/log/testservice
! test -e /var/cache/testservice
! test -e /var/log/testservice
systemctl clean testservice --what=all
test ! -e /etc/testservice
test ! -e /run/testservice
test ! -e /var/lib/testservice
test ! -e /var/cache/testservice
test ! -e /var/log/testservice
! test -e /etc/testservice
! test -e /run/testservice
! test -e /var/lib/testservice
! test -e /var/cache/testservice
! test -e /var/log/testservice
cat > /etc/systemd/system/testservice.service <<EOF
[Service]
@ -89,11 +89,11 @@ EOF
systemctl daemon-reload
test ! -e /etc/testservice
test ! -e /run/testservice
test ! -e /var/lib/testservice
test ! -e /var/cache/testservice
test ! -e /var/log/testservice
! test -e /etc/testservice
! test -e /run/testservice
! test -e /var/lib/testservice
! test -e /var/cache/testservice
! test -e /var/log/testservice
systemctl restart testservice
@ -107,7 +107,7 @@ test -L /var/lib/testservice
test -L /var/cache/testservice
test -L /var/log/testservice
systemctl clean testservice && { echo 'unexpected success'; exit 1; }
! systemctl clean testservice
systemctl stop testservice
@ -123,7 +123,7 @@ test -L /var/log/testservice
systemctl clean testservice --what=configuration
test ! -d /etc/testservice
! test -d /etc/testservice
test -d /run/private/testservice
test -d /var/lib/private/testservice
test -d /var/cache/private/testservice
@ -135,39 +135,39 @@ test -L /var/log/testservice
systemctl clean testservice
test ! -d /etc/testservice
test ! -d /run/private/testservice
! test -d /etc/testservice
! test -d /run/private/testservice
test -d /var/lib/private/testservice
test ! -d /var/cache/private/testservice
! test -d /var/cache/private/testservice
test -d /var/log/private/testservice
test ! -L /run/testservice
! test -L /run/testservice
test -L /var/lib/testservice
test ! -L /var/cache/testservice
! test -L /var/cache/testservice
test -L /var/log/testservice
systemctl clean testservice --what=logs
test ! -d /etc/testservice
test ! -d /run/private/testservice
! test -d /etc/testservice
! test -d /run/private/testservice
test -d /var/lib/private/testservice
test ! -d /var/cache/private/testservice
test ! -d /var/log/private/testservice
test ! -L /run/testservice
! test -d /var/cache/private/testservice
! test -d /var/log/private/testservice
! test -L /run/testservice
test -L /var/lib/testservice
test ! -L /var/cache/testservice
test ! -L /var/log/testservice
! test -L /var/cache/testservice
! test -L /var/log/testservice
systemctl clean testservice --what=all
test ! -d /etc/testservice
test ! -d /run/private/testservice
test ! -d /var/lib/private/testservice
test ! -d /var/cache/private/testservice
test ! -d /var/log/private/testservice
test ! -L /run/testservice
test ! -L /var/lib/testservice
test ! -L /var/cache/testservice
test ! -L /var/log/testservice
! test -d /etc/testservice
! test -d /run/private/testservice
! test -d /var/lib/private/testservice
! test -d /var/cache/private/testservice
! test -d /var/log/private/testservice
! test -L /run/testservice
! test -L /var/lib/testservice
! test -L /var/cache/testservice
! test -L /var/log/testservice
cat > /etc/systemd/system/tmp-hoge.mount <<EOF
[Mount]
@ -182,11 +182,11 @@ EOF
systemctl daemon-reload
test ! -e /etc/hoge
test ! -e /run/hoge
test ! -e /var/lib/hoge
test ! -e /var/cache/hoge
test ! -e /var/log/hoge
! test -e /etc/hoge
! test -e /run/hoge
! test -e /var/lib/hoge
! test -e /var/cache/hoge
! test -e /var/log/hoge
systemctl start tmp-hoge.mount
@ -196,7 +196,7 @@ test -d /var/lib/hoge
test -d /var/cache/hoge
test -d /var/log/hoge
systemctl clean tmp-hoge.mount && { echo 'unexpected success'; exit 1; }
! systemctl clean tmp-hoge.mount
test -d /etc/hoge
test -d /run/hoge
@ -207,42 +207,42 @@ test -d /var/log/hoge
systemctl stop tmp-hoge.mount
test -d /etc/hoge
test ! -d /run/hoge
! test -d /run/hoge
test -d /var/lib/hoge
test -d /var/cache/hoge
test -d /var/log/hoge
systemctl clean tmp-hoge.mount --what=configuration
test ! -d /etc/hoge
test ! -d /run/hoge
! test -d /etc/hoge
! test -d /run/hoge
test -d /var/lib/hoge
test -d /var/cache/hoge
test -d /var/log/hoge
systemctl clean tmp-hoge.mount
test ! -d /etc/hoge
test ! -d /run/hoge
! test -d /etc/hoge
! test -d /run/hoge
test -d /var/lib/hoge
test ! -d /var/cache/hoge
! test -d /var/cache/hoge
test -d /var/log/hoge
systemctl clean tmp-hoge.mount --what=logs
test ! -d /etc/hoge
test ! -d /run/hoge
! test -d /etc/hoge
! test -d /run/hoge
test -d /var/lib/hoge
test ! -d /var/cache/hoge
test ! -d /var/log/hoge
! test -d /var/cache/hoge
! test -d /var/log/hoge
systemctl clean tmp-hoge.mount --what=all
test ! -d /etc/hoge
test ! -d /run/hoge
test ! -d /var/lib/hoge
test ! -d /var/cache/hoge
test ! -d /var/log/hoge
! test -d /etc/hoge
! test -d /run/hoge
! test -d /var/lib/hoge
! test -d /var/cache/hoge
! test -d /var/log/hoge
cat > /etc/systemd/system/testservice.socket <<EOF
[Socket]
@ -258,61 +258,61 @@ EOF
systemctl daemon-reload
test ! -e /etc/testsocket
test ! -e /run/testsocket
test ! -e /var/lib/testsocket
test ! -e /var/cache/testsocket
test ! -e /var/log/testsocket
! test -e /etc/testsocket
! test -e /run/testsocket
! test -e /var/lib/testsocket
! test -e /var/cache/testsocket
! test -e /var/log/testsocket
systemctl start testservice.socket
test -d /etc/testsocket
test -d /run/testsocket
! test -d /run/testsocket
test -d /var/lib/testsocket
test -d /var/cache/testsocket
test -d /var/log/testsocket
systemctl clean testservice.socket && { echo 'unexpected success'; exit 1; }
! systemctl clean testservice.socket
systemctl stop testservice.socket
test -d /etc/testsocket
test ! -d /run/testsocket
! test -d /run/testsocket
test -d /var/lib/testsocket
test -d /var/cache/testsocket
test -d /var/log/testsocket
systemctl clean testservice.socket --what=configuration
test ! -e /etc/testsocket
test ! -d /run/testsocket
! test -e /etc/testsocket
! test -d /run/testsocket
test -d /var/lib/testsocket
test -d /var/cache/testsocket
test -d /var/log/testsocket
systemctl clean testservice.socket
test ! -e /etc/testsocket
test ! -e /run/testsocket
! test -e /etc/testsocket
! test -e /run/testsocket
test -d /var/lib/testsocket
test ! -e /var/cache/testsocket
! test -e /var/cache/testsocket
test -d /var/log/testsocket
systemctl clean testservice.socket --what=logs
test ! -e /etc/testsocket
test ! -e /run/testsocket
! test -e /etc/testsocket
! test -e /run/testsocket
test -d /var/lib/testsocket
test ! -e /var/cache/testsocket
test ! -e /var/log/testsocket
! test -e /var/cache/testsocket
! test -e /var/log/testsocket
systemctl clean testservice.socket --what=all
test ! -e /etc/testsocket
test ! -e /run/testsocket
test ! -e /var/lib/testsocket
test ! -e /var/cache/testsocket
test ! -e /var/log/testsocket
! test -e /etc/testsocket
! test -e /run/testsocket
! test -e /var/lib/testsocket
! test -e /var/cache/testsocket
! test -e /var/log/testsocket
echo OK > /testok

View File

@ -9,38 +9,35 @@ systemd-analyze log-target console
systemd-run --wait -p DynamicUser=0 -p StateDirectory=zzz touch /var/lib/zzz/test
systemd-run --wait -p DynamicUser=0 -p StateDirectory=zzz test -f /var/lib/zzz/test
systemd-run --wait -p DynamicUser=0 -p StateDirectory=zzz test -f /var/lib/zzz/test-missing \
&& { echo 'unexpected success'; exit 1; }
! systemd-run --wait -p DynamicUser=0 -p StateDirectory=zzz test -f /var/lib/zzz/test-missing
test -d /var/lib/zzz
test ! -L /var/lib/zzz
test ! -e /var/lib/private/zzz
! test -L /var/lib/zzz
! test -e /var/lib/private/zzz
test -f /var/lib/zzz/test
test ! -f /var/lib/zzz/test-missing
! test -f /var/lib/zzz/test-missing
# Convert to DynamicUser=1
systemd-run --wait -p DynamicUser=1 -p StateDirectory=zzz test -f /var/lib/zzz/test
systemd-run --wait -p DynamicUser=1 -p StateDirectory=zzz test -f /var/lib/zzz/test-missing \
&& { echo 'unexpected success'; exit 1; }
! systemd-run --wait -p DynamicUser=1 -p StateDirectory=zzz test -f /var/lib/zzz/test-missing
test -L /var/lib/zzz
test -d /var/lib/private/zzz
test -f /var/lib/zzz/test
test ! -f /var/lib/zzz/test-missing
! test -f /var/lib/zzz/test-missing
# Convert back
systemd-run --wait -p DynamicUser=0 -p StateDirectory=zzz test -f /var/lib/zzz/test
systemd-run --wait -p DynamicUser=0 -p StateDirectory=zzz test -f /var/lib/zzz/test-missing \
&& { echo 'unexpected success'; exit 1; }
! systemd-run --wait -p DynamicUser=0 -p StateDirectory=zzz test -f /var/lib/zzz/test-missing
test -d /var/lib/zzz
test ! -L /var/lib/zzz
test ! -e /var/lib/private/zzz
! test -L /var/lib/zzz
! test -e /var/lib/private/zzz
test -f /var/lib/zzz/test
test ! -f /var/lib/zzz/test-missing
! test -f /var/lib/zzz/test-missing
systemd-analyze log-level info

View File

@ -12,7 +12,7 @@ touch /tmp/aaa/bbb
systemctl restart tmp-aaa.mount
test -e /run/hoge/foo
test ! -e /tmp/aaa/bbb
! test -e /tmp/aaa/bbb
echo OK > /testok

View File

@ -21,7 +21,7 @@ systemctl daemon-reload
systemctl start $SERVICE_NAME
systemctl status $SERVICE_NAME
# The reload SHOULD fail but SHOULD NOT affect the service state
systemctl reload $SERVICE_NAME && { echo 'unexpected success'; exit 1; }
! systemctl reload $SERVICE_NAME
systemctl status $SERVICE_NAME
systemctl stop $SERVICE_NAME
@ -39,7 +39,7 @@ systemctl daemon-reload
systemctl start $SERVICE_NAME
systemctl status $SERVICE_NAME
# The reload SHOULD fail but SHOULD NOT affect the service state
systemctl reload $SERVICE_NAME && { echo 'unexpected success'; exit 1; }
! systemctl reload $SERVICE_NAME
systemctl status $SERVICE_NAME
systemctl stop $SERVICE_NAME

View File

@ -9,8 +9,7 @@ systemd-analyze log-level debug
systemd-analyze log-target console
# test one: Restart=on-failure should restart the service
systemd-run --unit=one -p Type=oneshot -p Restart=on-failure /bin/bash -c "exit 1" \
&& { echo 'unexpected success'; exit 1; }
! systemd-run --unit=one -p Type=oneshot -p Restart=on-failure /bin/bash -c "exit 1"
for ((secs=0; secs<$MAX_SECS; secs++)); do
[[ "$(systemctl show one.service -P NRestarts)" -le 0 ]] || break
@ -26,13 +25,7 @@ TMP_FILE="/tmp/test-41-oneshot-restart-test"
# test two: make sure StartLimitBurst correctly limits the number of restarts
# and restarts execution of the unit from the first ExecStart=
systemd-run --unit=two \
-p StartLimitIntervalSec=120 \
-p StartLimitBurst=3 \
-p Type=oneshot \
-p Restart=on-failure \
-p ExecStart="/bin/bash -c \"printf a >> $TMP_FILE\"" /bin/bash -c "exit 1" \
&& { echo 'unexpected success'; exit 1; }
! systemd-run --unit=two -p StartLimitIntervalSec=120 -p StartLimitBurst=3 -p Type=oneshot -p Restart=on-failure -p ExecStart="/bin/bash -c \"printf a >> $TMP_FILE\"" /bin/bash -c "exit 1"
# wait for at least 3 restarts
for ((secs=0; secs<$MAX_SECS; secs++)); do

View File

@ -6,15 +6,13 @@ systemd-analyze log-level debug
systemd-run --unit=simple1.service --wait -p StandardOutput=tty -p StandardError=tty -p Type=simple -p ExecStopPost='/bin/touch /run/simple1' true
test -f /run/simple1
systemd-run --unit=simple2.service --wait -p StandardOutput=tty -p StandardError=tty -p Type=simple -p ExecStopPost='/bin/touch /run/simple2' false \
&& { echo 'unexpected success'; exit 1; }
! systemd-run --unit=simple2.service --wait -p StandardOutput=tty -p StandardError=tty -p Type=simple -p ExecStopPost='/bin/touch /run/simple2' false
test -f /run/simple2
systemd-run --unit=exec1.service --wait -p StandardOutput=tty -p StandardError=tty -p Type=exec -p ExecStopPost='/bin/touch /run/exec1' sleep 1
test -f /run/exec1
systemd-run --unit=exec2.service --wait -p StandardOutput=tty -p StandardError=tty -p Type=exec -p ExecStopPost='/bin/touch /run/exec2' sh -c 'sleep 1; false' \
&& { echo 'unexpected success'; exit 1; }
! systemd-run --unit=exec2.service --wait -p StandardOutput=tty -p StandardError=tty -p Type=exec -p ExecStopPost='/bin/touch /run/exec2' sh -c 'sleep 1; false'
test -f /run/exec2
cat > /tmp/forking1.sh <<EOF
@ -46,15 +44,13 @@ systemd-notify MAINPID=\$MAINPID
EOF
chmod +x /tmp/forking2.sh
systemd-run --unit=forking2.service --wait -p StandardOutput=tty -p StandardError=tty -p Type=forking -p NotifyAccess=exec -p ExecStopPost='/bin/touch /run/forking2' /tmp/forking2.sh \
&& { echo 'unexpected success'; exit 1; }
! systemd-run --unit=forking2.service --wait -p StandardOutput=tty -p StandardError=tty -p Type=forking -p NotifyAccess=exec -p ExecStopPost='/bin/touch /run/forking2' /tmp/forking2.sh
test -f /run/forking2
systemd-run --unit=oneshot1.service --wait -p StandardOutput=tty -p StandardError=tty -p Type=oneshot -p ExecStopPost='/bin/touch /run/oneshot1' true
test -f /run/oneshot1
systemd-run --unit=oneshot2.service --wait -p StandardOutput=tty -p StandardError=tty -p Type=oneshot -p ExecStopPost='/bin/touch /run/oneshot2' false \
&& { echo 'unexpected success'; exit 1; }
! systemd-run --unit=oneshot2.service --wait -p StandardOutput=tty -p StandardError=tty -p Type=oneshot -p ExecStopPost='/bin/touch /run/oneshot2' false
test -f /run/oneshot2
systemd-run --unit=dbus1.service --wait -p StandardOutput=tty -p StandardError=tty -p Type=dbus -p BusName=systemd.test.ExecStopPost -p ExecStopPost='/bin/touch /run/dbus1' \
@ -62,7 +58,7 @@ systemd-run --unit=dbus1.service --wait -p StandardOutput=tty -p StandardError=t
|| :
test -f /run/dbus1
systemd-run --unit=dbus2.service --wait -p StandardOutput=tty -p StandardError=tty -p Type=dbus -p BusName=systemd.test.ExecStopPost -p ExecStopPost='/bin/touch /run/dbus2' true
! systemd-run --unit=dbus2.service --wait -p StandardOutput=tty -p StandardError=tty -p Type=dbus -p BusName=systemd.test.ExecStopPost -p ExecStopPost='/bin/touch /run/dbus2' true
test -f /run/dbus2
cat > /tmp/notify1.sh <<EOF
@ -77,15 +73,13 @@ chmod +x /tmp/notify1.sh
systemd-run --unit=notify1.service --wait -p StandardOutput=tty -p StandardError=tty -p Type=notify -p ExecStopPost='/bin/touch /run/notify1' /tmp/notify1.sh
test -f /run/notify1
systemd-run --unit=notify2.service --wait -p StandardOutput=tty -p StandardError=tty -p Type=notify -p ExecStopPost='/bin/touch /run/notify2' true \
&& { echo 'unexpected success'; exit 1; }
! systemd-run --unit=notify2.service --wait -p StandardOutput=tty -p StandardError=tty -p Type=notify -p ExecStopPost='/bin/touch /run/notify2' true
test -f /run/notify2
systemd-run --unit=idle1.service --wait -p StandardOutput=tty -p StandardError=tty -p Type=idle -p ExecStopPost='/bin/touch /run/idle1' true
test -f /run/idle1
systemd-run --unit=idle2.service --wait -p StandardOutput=tty -p StandardError=tty -p Type=idle -p ExecStopPost='/bin/touch /run/idle2' false \
&& { echo 'unexpected success'; exit 1; }
! systemd-run --unit=idle2.service --wait -p StandardOutput=tty -p StandardError=tty -p Type=idle -p ExecStopPost='/bin/touch /run/idle2' false
test -f /run/idle2
systemd-analyze log-level info

View File

@ -34,10 +34,9 @@ test -e /home/testuser/works.txt
runas testuser systemd-run --wait --user --unit=test-protect-home-read-only \
-p PrivateUsers=yes -p ProtectHome=read-only \
-P bash -c '
test -e /home/testuser/works.txt || exit 10
touch /home/testuser/blocked.txt && exit 11
' \
&& { echo 'unexpected success'; exit 1; }
test -e /home/testuser/works.txt
! touch /home/testuser/blocked.txt
'
test ! -e /home/testuser/blocked.txt
# Check that tmpfs hides the whole directory
@ -58,10 +57,9 @@ runas testuser systemd-run --wait --user --unit=test-protect-home-yes \
# namespace (no CAP_SETGID in the parent namespace to write the additional
# mapping of the user supplied group and thus cannot change groups to an
# unmapped group ID)
runas testuser systemd-run --wait --user --unit=test-group-fail \
! runas testuser systemd-run --wait --user --unit=test-group-fail \
-p PrivateUsers=yes -p Group=daemon \
-P true \
&& { echo 'unexpected success'; exit 1; }
-P true
systemd-analyze log-level info

View File

@ -6,11 +6,11 @@ systemd-analyze log-level debug
systemd-run -p LogNamespace=foobar echo "hello world"
journalctl --namespace=foobar --sync
journalctl -o cat --namespace=foobar >/tmp/hello-world
journalctl -o cat >/tmp/no-hello-world
journalctl --namespace=foobar > /tmp/hello-world
journalctl > /tmp/no-hello-world
grep "^hello world$" /tmp/hello-world
grep "^hello world$" /tmp/no-hello-world && { echo 'unexpected success'; exit 1; }
grep "hello world" /tmp/hello-world
! grep "hello world" /tmp/no-hello-world
systemd-analyze log-level info

View File

@ -9,16 +9,17 @@ if ! test -x /usr/bin/homectl ; then
fi
inspect() {
# As updating disk-size-related attributes can take some time on some
# filesystems, let's drop these fields before comparing the outputs to
# avoid unexpected fails. To see the full outputs of both homectl &
# userdbctl (for debugging purposes) drop the fields just before the
# comparison.
# As updating disk-size-related attributes can take some time on
# some filesystems, let's drop these fields before comparing the
# outputs to avoid unexpected fails. To see the full outputs of both
# homectl & userdbctl (for debugging purposes) drop the fields just
# before the comparison.
homectl inspect $1 | tee /tmp/a
userdbctl user $1 | tee /tmp/b
diff -I '/^\s*Disk (Size|Free|Floor|Ceiling):/' /tmp/{a,b}
rm /tmp/{a,b}
local PATTERN='/^\s*Disk (Size|Free|Floor|Ceiling):/d'
diff <(sed -r "$PATTERN" /tmp/a) <(sed -r "$PATTERN" /tmp/b)
rm /tmp/a /tmp/b
}
systemd-analyze log-level debug
@ -65,15 +66,11 @@ inspect test-user
PASSWORD=xEhErW0ndafV4s homectl deactivate test-user
inspect test-user
PASSWORD=xEhErW0ndafV4s homectl with test-user -- test ! -f /home/test-user/xyz
PASSWORD=xEhErW0ndafV4s homectl with test-user -- test -f /home/test-user/xyz \
&& { echo 'unexpected success'; exit 1; }
! PASSWORD=xEhErW0ndafV4s homectl with test-user -- test -f /home/test-user/xyz
PASSWORD=xEhErW0ndafV4s homectl with test-user -- touch /home/test-user/xyz
PASSWORD=xEhErW0ndafV4s homectl with test-user -- test -f /home/test-user/xyz
PASSWORD=xEhErW0ndafV4s homectl with test-user -- rm /home/test-user/xyz
PASSWORD=xEhErW0ndafV4s homectl with test-user -- test ! -f /home/test-user/xyz
PASSWORD=xEhErW0ndafV4s homectl with test-user -- test -f /home/test-user/xyz \
&& { echo 'unexpected success'; exit 1; }
! PASSWORD=xEhErW0ndafV4s homectl with test-user -- test -f /home/test-user/xyz
homectl remove test-user

View File

@ -15,16 +15,14 @@ systemd-run -p LoadCredential=passwd:/etc/passwd \
rm /tmp/ts54-concat
# Verify that the creds are immutable
systemd-run -p LoadCredential=passwd:/etc/passwd \
! systemd-run -p LoadCredential=passwd:/etc/passwd \
-p DynamicUser=1 \
--wait \
touch '${CREDENTIALS_DIRECTORY}/passwd' \
&& { echo 'unexpected success'; exit 1; }
systemd-run -p LoadCredential=passwd:/etc/passwd \
touch '${CREDENTIALS_DIRECTORY}/passwd'
! systemd-run -p LoadCredential=passwd:/etc/passwd \
-p DynamicUser=1 \
--wait \
rm '${CREDENTIALS_DIRECTORY}/passwd' \
&& { echo 'unexpected success'; exit 1; }
rm '${CREDENTIALS_DIRECTORY}/passwd'
systemd-analyze log-level info

View File

@ -29,13 +29,11 @@ systemd-run --wait --unit=one -p ExitType=cgroup /tmp/test56-exit-cgroup.sh
systemd-run --wait --unit=two -p ExitType=cgroup -p ExecCondition=true /tmp/test56-exit-cgroup.sh
# false exec condition: systemd-run should exit immediately with status code: 1
systemd-run --wait --unit=three -p ExitType=cgroup -p ExecCondition=false /tmp/test56-exit-cgroup.sh \
&& { echo 'unexpected success'; exit 1; }
! systemd-run --wait --unit=three -p ExitType=cgroup -p ExecCondition=false /tmp/test56-exit-cgroup.sh
# service should exit uncleanly
(sleep 1; systemctl kill --signal 9 four) &
systemd-run --wait --unit=four -p ExitType=cgroup /tmp/test56-exit-cgroup.sh \
&& { echo 'unexpected success'; exit 1; }
! systemd-run --wait --unit=four -p ExitType=cgroup /tmp/test56-exit-cgroup.sh
# Multiple level process tree, parent process exits quickly
@ -57,8 +55,7 @@ systemd-run --wait --unit=five -p ExitType=cgroup /tmp/test56-exit-cgroup-parent
# service should exit uncleanly
(sleep 1; systemctl kill --signal 9 six) &
systemd-run --wait --unit=six -p ExitType=cgroup /tmp/test56-exit-cgroup-parentless.sh \
&& { echo 'unexpected success'; exit 1; }
! systemd-run --wait --unit=six -p ExitType=cgroup /tmp/test56-exit-cgroup-parentless.sh
# Multiple level process tree, parent process exits uncleanly but last process exits cleanly
@ -88,8 +85,7 @@ EOF
chmod +x /tmp/test56-exit-cgroup-unclean.sh
# service should exit uncleanly after 1 second
systemd-run --wait --unit=eight -p ExitType=cgroup /tmp/test56-exit-cgroup-unclean.sh \
&& { echo 'unexpected success'; exit 1; }
! systemd-run --wait --unit=eight -p ExitType=cgroup /tmp/test56-exit-cgroup-unclean.sh
systemd-analyze log-level info

View File

@ -9,5 +9,5 @@
[Unit]
Description=Cryptsetup Units Slice
Documentation=man:systemd-cryptsetup@.service(8)
Documentation=man:systemd.special(7)
DefaultDependencies=no