Compare commits

...

19 Commits

Author SHA1 Message Date
Christian Göttsche 346543d6f9 selinux/systemctl: create unit file with default context on edit 2020-09-02 09:07:59 +02:00
Lennart Poettering e4ec78206c import: make sure gnu tar complains on tar files with trailing garbage
By default GNU tar will only read the first archive if multiple archives
are concatenated and ignore the rest. If an archive contains trailing
garbage this will hence not be recognized by tar as error, it simply
stops reading when the first archive is done (which might escalate to
SIGPIPE when invoked via a pipe).

Let's add --ignore-zeros to the tar command line when extracting. This
means:

1) if a tar archive was concatenated (i.e. generated with tar -A) we'll
   process it correctly.

2) if a tar archive contains trailing garbage tar will now generate an
   error message about it, instead of just throwing EPIPE, which makes
   things easier to debug as broken files are not silently processed.

I think it's OK for gnu tar to ignore trailing garbage when dealing with
classic tapes drives, i.e. mediums that do not have a size limit
built-in. However, this is not what we are dealing with: we are dealing
with OS images here, that hopefully someone generated with a clean build
system, that were signed and validated and hence should not contain
trailing garbage.  Hence it's better to refuse and complain thant to
silently eat up like for classic tape drives.

Fixes: #16605
2020-09-02 08:59:33 +02:00
Lennart Poettering 58cf204730 nspawn: let's make LinkJournal an extended boolean
Let's accept the usual boolean parameters for LinkJournal. It's
confusing otherwise.

Previously we'd accept "no" but not the other values we typically accept
for "false". We'd not accept any values for "true".

With this change we'll accept all true and false values and will do
something somewhat reasonable: any false value is treated like "no"
previously was reated. And any true value is now treated like "auto".

We don't document the new values, since this logic is mostly redundant,
and it's probably better if people consider this an enum rather than a
bool.

Fixes: #16888
2020-09-02 08:57:44 +02:00
Zbigniew Jędrzejewski-Szmek 47be8ddcee
Merge pull request #16882 from weblate/weblate-systemd-master
Translations update from Weblate
2020-09-02 08:55:40 +02:00
Zbigniew Jędrzejewski-Szmek 6ee37b1a7d
Merge pull request #16853 from poettering/udev-current-tag2
udev: make uevents "sticky"
2020-09-02 08:12:56 +02:00
Lennart Poettering 64a5384fd2 coredump: don't convert s → µs twice
We already append 000000 early on when parsing the cmdline args, let's
not do that a second time.

Fixes: #16919
2020-09-02 08:11:07 +02:00
afg ae0d36c161 firstboot: fill empty color if ansi_color unavailable from os-release 2020-09-02 08:10:47 +02:00
Lennart Poettering 278fdd064d man: document the new libudev APIs 2020-09-01 17:40:13 +02:00
Lennart Poettering bf6e5c574b NEWS: explain the "bind"/"unbind" situation a bit 2020-09-01 17:40:13 +02:00
Lennart Poettering 643bb92408 logind: always check current tag list before using a device 2020-09-01 17:40:13 +02:00
Lennart Poettering fccb48b286 logind: only apply ACLs for device currently tagged with "uaccess"
This is about security, hence let's be particularly careful here: only
devices currenlty tagged with "uaccess" will get ACL management, and
it's not sufficient if they once were (though that is used for
filtering).
2020-09-01 17:40:12 +02:00
Lennart Poettering 242c1c075a core: make sure to recheck current udev tag "systemd" before considering a device ready
Let's ensure that a device once tagged can become active/inactive simply
by toggling the current tag.

Note that this means that a device once tagged with "systemd" will
always have a matching .device unit. However, the active/inactive state
of the unit reflects whether it is currently tagged that way (and
doesn't have SYSTEMD_READY=0 set).

Fixes: #7587
2020-09-01 17:40:12 +02:00
Lennart Poettering 31abedbb03 test: add test for new "sticky" tags logic 2020-09-01 17:40:12 +02:00
Lennart Poettering 3b684be04b libudev: also expose API to check for current tags in libudev 2020-09-01 17:40:12 +02:00
Lennart Poettering e77b146f82 udev: make tags "sticky"
This tries to address the "bind"/"unbind" uevent kernel API breakage, by
changing the semantics of device tags.

Previously, tags would be applied on uevents (and the database entries
they result in) only depending on the immediate context. This means that
if one uevent causes the tag to be set and the next to be unset, this
would immediately effect what apps would see and the database entries
would contain each time. This is problematic however, as tags are a
filtering concept, and if tags vanish then clients won't hence notice
when a device stops being relevant to them since not only the tags
disappear but immediately also the uevents for it are filtered including
the one necessary for the app to notice that the device lost its tag and
hence relevance.

With this change tags become "sticky". If a tag is applied is once
applied to a device it will stay in place forever, until the device is
removed. Tags can never be removed again. This means that an app
watching a specific set of devices by filtering for a tag is guaranteed
to not only see the events where the tag is set but also all follow-up
events where the tags might be removed again.

This change of behaviour is unfortunate, but is required due to the
kernel introducing new "bind" and "unbind" uevents that generally have
the effect that tags and properties disappear and apps hence don't
notice when a device looses relevance to it. "bind"/"unbind" events were
introduced in kernel 4.12, and are now used in more and more subsystems.
The introduction broke userspace widely, and this commit is an attempt
to provide a way for apps to deal with it.

While tags are now "sticky" a new automatic device property
CURRENT_TAGS is introduced (matching the existing TAGS property) that
always reflects the precise set of tags applied on the most recent
events. Thus, when subscribing to devices through tags, all devices that
ever had the tag put on them will be be seen, and by CURRENT_TAGS it may
be checked whether the device right at the moment matches the tag
requirements.

See: #7587 #7018 #8221
2020-09-01 17:40:12 +02:00
Lennart Poettering 73484ecff9 test-functions: make sure we test our own libudev instead of the host libudev
When invoking "ldd" to find dependency libraries we already set
$LD_LIBRARY_PATH to point to our own build tree, so that our libraries
are checked, not the host libraries. This is not sufficient howeever, as
libudev is built in a subdir. Add that, too.
2020-09-01 17:40:12 +02:00
Gogo Gogsi 0845afbec8 Translated using Weblate (Croatian)
Currently translated at 100.0% (187 of 187 strings)

Co-authored-by: Gogo Gogsi <linux.hr@protonmail.com>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/master/hr/
Translation: systemd/master
2020-08-29 13:29:25 +02:00
Yuri Chornoivan 892edd1e87 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (187 of 187 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (187 of 187 strings)

Co-authored-by: Yuri Chornoivan <yurchor@ukr.net>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/master/uk/
Translation: systemd/master
2020-08-29 13:29:25 +02:00
Julien Humbert 582b66e1c6 Translated using Weblate (French)
Currently translated at 100.0% (184 of 184 strings)

Co-authored-by: Julien Humbert <julroy67@gmail.com>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/master/fr/
Translation: systemd/master
2020-08-29 13:29:25 +02:00
33 changed files with 815 additions and 413 deletions

85
NEWS
View File

@ -1,5 +1,90 @@
systemd System and Service Manager systemd System and Service Manager
CHANGES WITH 247 in spe:
* KERNEL API INCOMPATIBILTY: Linux 4.12 introduced two new uevents
"bind" and "unbind" to the Linux device model. When this kernel
change was made, systemd-udevd was only minimally updated to handle
and propagate these new event types. The introduction of these new
uevents (which are typically generated for USB devices and devices
needing a firmware upload before being functional) resulted in a
number of software issues, we so far didn't address (mostly because
there was hope the kernel maintainers would themeselves address these
issues in some form which did not happen). To handle them properly,
many (if not most) udev rules files shipped in various packages need
updating, and so do many programs that monitor or enumerate devices
with libudev or sd-device, or otherwise process uevents. Please note
that this incompatibility is not fault of systemd or udev, but caused
by an incompatible kernel change that happened back in Linux 4.12.
To minimize issues resulting from this kernel change (but not avoid
them entirely) starting with systemd-udevd 247 the udev "tags"
concept (which is a concept for marking and filtering devices during
enumeration and monitoring) has been reworked: udev tags are now
"sticky", meaning that once a tag is assigned to a device it will not
be removed from the device again until the device itself is removed
(i.e. unplugged). This makes sure that any application monitoring
devices that match a specific tag is guaranteed to both see uevents
where the device starts being relevant, and those where it stops
being relevant (the latter now regularly happening due to the new
"unbind" uevent type). The udev tags concept is hence now a concept
tied to a *device* instead of a device *event* — unlike for example
udev properties whose lifecycle (as before) is generally tied to a
device event, meaning that the previously determined properties are
forgotten whenever a new uevent is processed.
With the newly redefined udev tags concept, sometimes it's necessary
to determine which tags are the ones applied by the most recent
uevent/database update, in order to discern them from those
originating from earlier uevents/database updates of the same
device. To accommodate for this a new automatic property CURRENT_TAGS
has been added that works similar to the existing TAGS property but
only lists tags set by the most recent uevent/database
update. Similar, the libudev/sd-device API has been updated with new
functions to enumerate these 'current' tags, in addition to the
existing APIs that now enumerate the 'sticky' ones.
To properly handle "bind"/"unbind" on Linux 4.12 and newer it is
essential that all udev rules files and applications are updated to
handle the new events. Specifically:
• All rule files that currently use a header guard similar to
ACTION!="add|change",GOTO="xyz_end" should be updated to use
ACTION=="remove",GOTO="xyz_end" instead, so that the
properties/tags they add are also applied whenever "bind" (or
"unbind") is seen. (This is most important for all physical device
types — as that's for which "bind" and "unbind" are currently
usually generated, for all other device types this change is still
recommended but not as important — but certainly prepares for
future kernel uevent type additions).
• Similar, all code monitoring devices that contains an 'if' branch
discerning the "add" + "change" uevent actions from all other
uevents actions (i.e. considering devices only relevant after "add"
or "change", and irrelevant on all other events) should be reworked
to instead negatively check for "remove" only (i.e. considering
devices relevant after all event types, except for "remove", which
invalidates the device). Note that this also means that devices
should be considered relevant on "unbind", even though conceptually
this — in some form — invalidates the device. Since the precise
effect of "unbind" is not generically defined, devices should be
considered relevant even after "unbind", however I/O errors
accessing the device should then be handled gracefully.
• Any code that uses device tags for deciding whether a device is
relevant or not most likely needs to be updated to use the new
udev_device_has_current_tag() API (or sd_device_has_current_tag()
in case sd-device is used), to check whether the tag is set
at the moment an uevent is seen (as opposed to the existing
udev_device_has_tag() API which checks if the tag ever existed on
the device, following the API concept redefinition explained
above).
We are very sorry for this breakage and the requirement to update
packages using these interfaces. We'd again like to underline that
this is not caused by systemd/udev changes, but result of a kernel
behaviour change.
CHANGES WITH 246: CHANGES WITH 246:
* The service manager gained basic support for cgroup v2 freezer. Units * The service manager gained basic support for cgroup v2 freezer. Units

View File

@ -21,9 +21,11 @@
<refnamediv> <refnamediv>
<refname>udev_device_has_tag</refname> <refname>udev_device_has_tag</refname>
<refname>udev_device_has_current_tag</refname>
<refname>udev_device_get_devlinks_list_entry</refname> <refname>udev_device_get_devlinks_list_entry</refname>
<refname>udev_device_get_properties_list_entry</refname> <refname>udev_device_get_properties_list_entry</refname>
<refname>udev_device_get_tags_list_entry</refname> <refname>udev_device_get_tags_list_entry</refname>
<refname>udev_device_get_current_tags_list_entry</refname>
<refname>udev_device_get_sysattr_list_entry</refname> <refname>udev_device_get_sysattr_list_entry</refname>
<refname>udev_device_get_property_value</refname> <refname>udev_device_get_property_value</refname>
<refname>udev_device_get_sysattr_value</refname> <refname>udev_device_get_sysattr_value</refname>
@ -36,6 +38,18 @@
<funcsynopsis> <funcsynopsis>
<funcsynopsisinfo>#include &lt;libudev.h&gt;</funcsynopsisinfo> <funcsynopsisinfo>#include &lt;libudev.h&gt;</funcsynopsisinfo>
<funcprototype>
<funcdef>int <function>udev_device_has_tag</function></funcdef>
<paramdef>struct udev_device *<parameter>udev_device</parameter></paramdef>
<paramdef>const char *<parameter>tag</parameter></paramdef>
</funcprototype>
<funcprototype>
<funcdef>int <function>udev_device_has_current_tag</function></funcdef>
<paramdef>struct udev_device *<parameter>udev_device</parameter></paramdef>
<paramdef>const char *<parameter>tag</parameter></paramdef>
</funcprototype>
<funcprototype> <funcprototype>
<funcdef>struct udev_list_entry *<function>udev_device_get_devlinks_list_entry</function></funcdef> <funcdef>struct udev_list_entry *<function>udev_device_get_devlinks_list_entry</function></funcdef>
<paramdef>struct udev_device *<parameter>udev_device</parameter></paramdef> <paramdef>struct udev_device *<parameter>udev_device</parameter></paramdef>
@ -51,6 +65,11 @@
<paramdef>struct udev_device *<parameter>udev_device</parameter></paramdef> <paramdef>struct udev_device *<parameter>udev_device</parameter></paramdef>
</funcprototype> </funcprototype>
<funcprototype>
<funcdef>struct udev_list_entry *<function>udev_device_get_current_tags_list_entry</function></funcdef>
<paramdef>struct udev_device *<parameter>udev_device</parameter></paramdef>
</funcprototype>
<funcprototype> <funcprototype>
<funcdef>struct udev_list_entry *<function>udev_device_get_sysattr_list_entry</function></funcdef> <funcdef>struct udev_list_entry *<function>udev_device_get_sysattr_list_entry</function></funcdef>
<paramdef>struct udev_device *<parameter>udev_device</parameter></paramdef> <paramdef>struct udev_device *<parameter>udev_device</parameter></paramdef>
@ -62,12 +81,6 @@
<paramdef>const char *<parameter>key</parameter></paramdef> <paramdef>const char *<parameter>key</parameter></paramdef>
</funcprototype> </funcprototype>
<funcprototype>
<funcdef>int <function>udev_device_has_tag</function></funcdef>
<paramdef>struct udev_device *<parameter>udev_device</parameter></paramdef>
<paramdef>const char *<parameter>tag</parameter></paramdef>
</funcprototype>
<funcprototype> <funcprototype>
<funcdef>const char *<function>udev_device_get_sysattr_value</function></funcdef> <funcdef>const char *<function>udev_device_get_sysattr_value</function></funcdef>
<paramdef>struct udev_device *<parameter>udev_device</parameter></paramdef> <paramdef>struct udev_device *<parameter>udev_device</parameter></paramdef>
@ -84,22 +97,40 @@
</funcsynopsis> </funcsynopsis>
</refsynopsisdiv> </refsynopsisdiv>
<!--<refsect1> <refsect1>
<title>Description</title> <title>Description</title>
<para>XXX: Add short description.</para> <para><function>udev_device_has_tag()</function> returns a valuer larger than zero if the specified
</refsect1>--> device object has the indicated tag assigned to it, and zero otherwise. See
<citerefentry><refentrytitle>udev</refentrytitle><manvolnum>7</manvolnum></citerefentry> for details on
the tags concept. <function>udev_device_has_current_tag()</function> executes a similar check, however
only determines whether the indicated tag was set as result of the most recent event seen for the
device. Tags are "sticky", i.e. once set for a device they remain on the device until the device is
unplugged, even if the rules run for later events of the same device do not set them anymore. Any tag for
which <function>udev_device_has_current_tag()</function> returns true will hence also return true when
passed to <function>udev_device_has_tag()</function>, but the opposite might not be true, in case a tag is
no longer configured by the rules applied to the most recent device even.</para>
<para><function>udev_device_get_tags_list_entry()</function> returns a a
<function>udev_list_entry</function> object, encapsulating a list of tags set for the specified
device. Similar, <function>udev_device_get_current_tags_list_entry()</function> returns a list of tags
set for the specified device as effect of the most recent device event seen (see above for details on the
difference).</para>
</refsect1>
<refsect1> <refsect1>
<title>Return Value</title> <title>Return Value</title>
<para>On success, <para>On success, <function>udev_device_has_tag()</function> and
<function>udev_device_get_devlinks_list_entry()</function>, <function>udev_device_has_current_tag()</function> return positive or <constant>0</constant>, depending
on whether the device has the given tag or not. On failure, a negative error code is returned.</para>
<para>On success, <function>udev_device_get_devlinks_list_entry()</function>,
<function>udev_device_get_properties_list_entry()</function>, <function>udev_device_get_properties_list_entry()</function>,
<function>udev_device_get_tags_list_entry()</function> and <function>udev_device_get_tags_list_entry()</function>,
<function>udev_device_get_sysattr_list_entry()</function> return <function>udev_device_get_current_tags_list_entry()</function> and
a pointer to the first entry of the retrieved list. If that list <function>udev_device_get_sysattr_list_entry()</function> return a pointer to the first entry of the
is empty, or if an error occurred, <constant>NULL</constant> is retrieved list. If that list is empty, or if an error occurred, <constant>NULL</constant> is
returned.</para> returned.</para>
<para>On success, <para>On success,
@ -119,17 +150,13 @@
contain <constant>NUL</constant> bytes should not be set with contain <constant>NUL</constant> bytes should not be set with
this function; instead, write them directly to the files within this function; instead, write them directly to the files within
the device's <property>syspath</property>.</para> the device's <property>syspath</property>.</para>
<para>On success, <function>udev_device_has_tag()</function>
returns <constant>1</constant> or <constant>0</constant>,
depending on whether the device has the given tag or not.
On failure, a negative error code is returned.</para>
</refsect1> </refsect1>
<refsect1> <refsect1>
<title>See Also</title> <title>See Also</title>
<para> <para>
<citerefentry><refentrytitle>udev</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
<citerefentry><refentrytitle>udev_new</refentrytitle><manvolnum>3</manvolnum></citerefentry>, <citerefentry><refentrytitle>udev_new</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
<citerefentry><refentrytitle>udev_device_new_from_syspath</refentrytitle><manvolnum>3</manvolnum></citerefentry>, <citerefentry><refentrytitle>udev_device_new_from_syspath</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
<citerefentry><refentrytitle>udev_device_get_syspath</refentrytitle><manvolnum>3</manvolnum></citerefentry>, <citerefentry><refentrytitle>udev_device_get_syspath</refentrytitle><manvolnum>3</manvolnum></citerefentry>,

View File

@ -14,7 +14,7 @@ project('systemd', 'c',
) )
libsystemd_version = '0.29.0' libsystemd_version = '0.29.0'
libudev_version = '1.6.18' libudev_version = '1.7.0'
# We need the same data in two different formats, ugh! # We need the same data in two different formats, ugh!
# Also, for hysterical reasons, we use different variable # Also, for hysterical reasons, we use different variable

213
po/fr.po
View File

@ -9,7 +9,7 @@ msgstr ""
"Project-Id-Version: systemd\n" "Project-Id-Version: systemd\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-08-19 18:02+0200\n" "POT-Creation-Date: 2020-08-19 18:02+0200\n"
"PO-Revision-Date: 2020-08-27 02:46+0000\n" "PO-Revision-Date: 2020-08-28 05:29+0000\n"
"Last-Translator: Julien Humbert <julroy67@gmail.com>\n" "Last-Translator: Julien Humbert <julroy67@gmail.com>\n"
"Language-Team: French <https://translate.fedoraproject.org/projects/systemd/" "Language-Team: French <https://translate.fedoraproject.org/projects/systemd/"
"master/fr/>\n" "master/fr/>\n"
@ -51,7 +51,7 @@ msgstr ""
#: src/core/org.freedesktop.systemd1.policy.in:54 #: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables" msgid "Set or unset system and service manager environment variables"
msgstr "" msgstr ""
"Définir ou supprimer des variables d'environnement du système ou du " "Définir ou supprimer des variables denvironnement du système ou du "
"gestionnaire de services" "gestionnaire de services"
#: src/core/org.freedesktop.systemd1.policy.in:55 #: src/core/org.freedesktop.systemd1.policy.in:55
@ -59,12 +59,12 @@ msgid ""
"Authentication is required to set or unset system and service manager " "Authentication is required to set or unset system and service manager "
"environment variables." "environment variables."
msgstr "" msgstr ""
"Authentification requise pour définir ou supprimer des variables " "Authentification requise pour définir ou supprimer des variables d"
"d'environnement du système ou du gestionnaire de services." "environnement du système ou du gestionnaire de services."
#: src/core/org.freedesktop.systemd1.policy.in:64 #: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state" msgid "Reload the systemd state"
msgstr "Recharger l'état de systemd" msgstr "Recharger létat de systemd"
#: src/core/org.freedesktop.systemd1.policy.in:65 #: src/core/org.freedesktop.systemd1.policy.in:65
msgid "Authentication is required to reload the systemd state." msgid "Authentication is required to reload the systemd state."
@ -77,7 +77,7 @@ msgstr "Créer un espace personnel"
#: src/home/org.freedesktop.home1.policy:14 #: src/home/org.freedesktop.home1.policy:14
msgid "Authentication is required to create a user's home area." msgid "Authentication is required to create a user's home area."
msgstr "" msgstr ""
"Authentification requise pour créer l'espace personnel d'un utilisateur." "Authentification requise pour créer lespace personnel dun utilisateur."
#: src/home/org.freedesktop.home1.policy:23 #: src/home/org.freedesktop.home1.policy:23
msgid "Remove a home area" msgid "Remove a home area"
@ -86,18 +86,18 @@ msgstr "Retirer un espace personnel"
#: src/home/org.freedesktop.home1.policy:24 #: src/home/org.freedesktop.home1.policy:24
msgid "Authentication is required to remove a user's home area." msgid "Authentication is required to remove a user's home area."
msgstr "" msgstr ""
"Authentification requise pour retirer l'espace personnel d'un utilisateur." "Authentification requise pour retirer lespace personnel dun utilisateur."
#: src/home/org.freedesktop.home1.policy:33 #: src/home/org.freedesktop.home1.policy:33
msgid "Check credentials of a home area" msgid "Check credentials of a home area"
msgstr "Vérifier les identifiants d'un espace personnel" msgstr "Vérifier les identifiants dun espace personnel"
#: src/home/org.freedesktop.home1.policy:34 #: src/home/org.freedesktop.home1.policy:34
msgid "" msgid ""
"Authentication is required to check credentials against a user's home area." "Authentication is required to check credentials against a user's home area."
msgstr "" msgstr ""
"Authentification requise pour vérifier les identifiants de l'espace " "Authentification requise pour vérifier les identifiants de lespace "
"personnel d'un utilisateur." "personnel dun utilisateur."
#: src/home/org.freedesktop.home1.policy:43 #: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area" msgid "Update a home area"
@ -106,7 +106,7 @@ msgstr "Mettre à jour un espace personnel"
#: src/home/org.freedesktop.home1.policy:44 #: src/home/org.freedesktop.home1.policy:44
msgid "Authentication is required to update a user's home area." msgid "Authentication is required to update a user's home area."
msgstr "" msgstr ""
"Authentification requise pour mettre à jour l'espace personnel d'un " "Authentification requise pour mettre à jour lespace personnel dun "
"utilisateur." "utilisateur."
#: src/home/org.freedesktop.home1.policy:53 #: src/home/org.freedesktop.home1.policy:53
@ -119,34 +119,34 @@ msgstr "Authentification requise pour retailler un espace personnel."
#: src/home/org.freedesktop.home1.policy:63 #: src/home/org.freedesktop.home1.policy:63
msgid "Change password of a home area" msgid "Change password of a home area"
msgstr "Changer le mot de passe d'un espace personnel" msgstr "Changer le mot de passe dun espace personnel"
#: src/home/org.freedesktop.home1.policy:64 #: src/home/org.freedesktop.home1.policy:64
msgid "" msgid ""
"Authentication is required to change the password of a user's home area." "Authentication is required to change the password of a user's home area."
msgstr "" msgstr ""
"Authentification requise pour changer le mot de passe de l'espace personnel " "Authentification requise pour changer le mot de passe de lespace personnel "
"d'un utilisateur." "dun utilisateur."
#: src/hostname/org.freedesktop.hostname1.policy:20 #: src/hostname/org.freedesktop.hostname1.policy:20
msgid "Set hostname" msgid "Set hostname"
msgstr "Définir le nom d'hôte" msgstr "Définir le nom dhôte"
#: src/hostname/org.freedesktop.hostname1.policy:21 #: src/hostname/org.freedesktop.hostname1.policy:21
msgid "Authentication is required to set the local hostname." msgid "Authentication is required to set the local hostname."
msgstr "Authentification requise pour définir le nom d'hôte local." msgstr "Authentification requise pour définir le nom dhôte local."
#: src/hostname/org.freedesktop.hostname1.policy:30 #: src/hostname/org.freedesktop.hostname1.policy:30
msgid "Set static hostname" msgid "Set static hostname"
msgstr "Définir le nom d'hôte statique" msgstr "Définir le nom dhôte statique"
#: src/hostname/org.freedesktop.hostname1.policy:31 #: src/hostname/org.freedesktop.hostname1.policy:31
msgid "" msgid ""
"Authentication is required to set the statically configured local hostname, " "Authentication is required to set the statically configured local hostname, "
"as well as the pretty hostname." "as well as the pretty hostname."
msgstr "" msgstr ""
"Authentification requise pour définir le nom d'hôte local de manière " "Authentification requise pour définir le nom dhôte local de manière "
"statique, tout comme le nom d'hôte familier." "statique, tout comme le nom dhôte familier."
#: src/hostname/org.freedesktop.hostname1.policy:41 #: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information" msgid "Set machine information"
@ -159,11 +159,11 @@ msgstr ""
#: src/hostname/org.freedesktop.hostname1.policy:51 #: src/hostname/org.freedesktop.hostname1.policy:51
msgid "Get product UUID" msgid "Get product UUID"
msgstr "Obtenir l'UUID du produit" msgstr "Obtenir lUUID du produit"
#: src/hostname/org.freedesktop.hostname1.policy:52 #: src/hostname/org.freedesktop.hostname1.policy:52
msgid "Authentication is required to get product UUID." msgid "Authentication is required to get product UUID."
msgstr "Authentification requise pour obtenir l'UUID du produit." msgstr "Authentification requise pour obtenir lUUID du produit."
#: src/import/org.freedesktop.import1.policy:22 #: src/import/org.freedesktop.import1.policy:22
msgid "Import a VM or container image" msgid "Import a VM or container image"
@ -214,33 +214,33 @@ msgstr ""
#: src/login/org.freedesktop.login1.policy:22 #: src/login/org.freedesktop.login1.policy:22
msgid "Allow applications to inhibit system shutdown" msgid "Allow applications to inhibit system shutdown"
msgstr "Permet aux applications d'empêcher l'arrêt du système" msgstr "Permet aux applications dempêcher larrêt du système"
#: src/login/org.freedesktop.login1.policy:23 #: src/login/org.freedesktop.login1.policy:23
msgid "" msgid ""
"Authentication is required for an application to inhibit system shutdown." "Authentication is required for an application to inhibit system shutdown."
msgstr "" msgstr ""
"Authentification requise pour permettre à une application d'empêcher l'arrêt " "Authentification requise pour permettre à une application dempêcher larrêt "
"du système." "du système."
#: src/login/org.freedesktop.login1.policy:33 #: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown" msgid "Allow applications to delay system shutdown"
msgstr "Permet aux applications de retarder l'arrêt du système" msgstr "Permet aux applications de retarder larrêt du système"
#: src/login/org.freedesktop.login1.policy:34 #: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown." msgid "Authentication is required for an application to delay system shutdown."
msgstr "" msgstr ""
"Authentification requise pour permettre à une application de retarder " "Authentification requise pour permettre à une application de retarder l"
"l'arrêt du système." "arrêt du système."
#: src/login/org.freedesktop.login1.policy:44 #: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep" msgid "Allow applications to inhibit system sleep"
msgstr "Permet aux applications d'empêcher la mise en veille du système" msgstr "Permet aux applications dempêcher la mise en veille du système"
#: src/login/org.freedesktop.login1.policy:45 #: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep." msgid "Authentication is required for an application to inhibit system sleep."
msgstr "" msgstr ""
"Authentification requise pour permettre à une application d'empêcher la mise " "Authentification requise pour permettre à une application dempêcher la mise "
"en veille du système." "en veille du système."
#: src/login/org.freedesktop.login1.policy:55 #: src/login/org.freedesktop.login1.policy:55
@ -255,21 +255,20 @@ msgstr ""
#: src/login/org.freedesktop.login1.policy:65 #: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend" msgid "Allow applications to inhibit automatic system suspend"
msgstr "" msgstr "Permet aux applications dempêcher lhibernation automatique du système"
"Permet aux applications d'empêcher l'hibernation automatique du système"
#: src/login/org.freedesktop.login1.policy:66 #: src/login/org.freedesktop.login1.policy:66
msgid "" msgid ""
"Authentication is required for an application to inhibit automatic system " "Authentication is required for an application to inhibit automatic system "
"suspend." "suspend."
msgstr "" msgstr ""
"Authentification requise pour permettre à une application d'empêcher " "Authentification requise pour permettre à une application dempêcher l"
"l'hibernation automatique du système." "hibernation automatique du système."
#: src/login/org.freedesktop.login1.policy:75 #: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key" msgid "Allow applications to inhibit system handling of the power key"
msgstr "" msgstr ""
"Permet aux applications d'empêcher la gestion du bouton d'alimentation du " "Permet aux applications dempêcher la gestion du bouton dalimentation du "
"système" "système"
#: src/login/org.freedesktop.login1.policy:76 #: src/login/org.freedesktop.login1.policy:76
@ -277,13 +276,13 @@ msgid ""
"Authentication is required for an application to inhibit system handling of " "Authentication is required for an application to inhibit system handling of "
"the power key." "the power key."
msgstr "" msgstr ""
"Authentification requise pour permettre à une application d'empêcher la " "Authentification requise pour permettre à une application dempêcher la "
"gestion du bouton d'alimentation du système." "gestion du bouton dalimentation du système."
#: src/login/org.freedesktop.login1.policy:86 #: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key" msgid "Allow applications to inhibit system handling of the suspend key"
msgstr "" msgstr ""
"Permet aux applications d'empêcher la gestion du bouton de mise en veille du " "Permet aux applications dempêcher la gestion du bouton de mise en veille du "
"système" "système"
#: src/login/org.freedesktop.login1.policy:87 #: src/login/org.freedesktop.login1.policy:87
@ -291,13 +290,13 @@ msgid ""
"Authentication is required for an application to inhibit system handling of " "Authentication is required for an application to inhibit system handling of "
"the suspend key." "the suspend key."
msgstr "" msgstr ""
"Authentification requise pour permettre à une application d'empêcher la " "Authentification requise pour permettre à une application dempêcher la "
"gestion du bouton de mise en veille du système." "gestion du bouton de mise en veille du système."
#: src/login/org.freedesktop.login1.policy:97 #: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key" msgid "Allow applications to inhibit system handling of the hibernate key"
msgstr "" msgstr ""
"Permet aux applications d'empêcher la gestion du bouton d'hibernation du " "Permet aux applications dempêcher la gestion du bouton dhibernation du "
"système" "système"
#: src/login/org.freedesktop.login1.policy:98 #: src/login/org.freedesktop.login1.policy:98
@ -305,46 +304,46 @@ msgid ""
"Authentication is required for an application to inhibit system handling of " "Authentication is required for an application to inhibit system handling of "
"the hibernate key." "the hibernate key."
msgstr "" msgstr ""
"Authentification requise pour permettre à une application d'empêcher la " "Authentification requise pour permettre à une application dempêcher la "
"gestion du bouton d'hibernation du système." "gestion du bouton dhibernation du système."
#: src/login/org.freedesktop.login1.policy:107 #: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch" msgid "Allow applications to inhibit system handling of the lid switch"
msgstr "" msgstr ""
"Permet aux applications d'empêcher la gestion par le système du rabat de " "Permet aux applications dempêcher la gestion par le système du rabat de "
"l'écran" "lécran"
#: src/login/org.freedesktop.login1.policy:108 #: src/login/org.freedesktop.login1.policy:108
msgid "" msgid ""
"Authentication is required for an application to inhibit system handling of " "Authentication is required for an application to inhibit system handling of "
"the lid switch." "the lid switch."
msgstr "" msgstr ""
"Authentification requise pour permettre à une application d'empêcher la " "Authentification requise pour permettre à une application dempêcher la "
"gestion par le système du rabat de l'écran." "gestion par le système du rabat de lécran."
#: src/login/org.freedesktop.login1.policy:117 #: src/login/org.freedesktop.login1.policy:117
msgid "Allow non-logged-in user to run programs" msgid "Allow non-logged-in user to run programs"
msgstr "Permet à un utilisateur non connecté d'exécuter des programmes" msgstr "Permet à un utilisateur non connecté dexécuter des programmes"
#: src/login/org.freedesktop.login1.policy:118 #: src/login/org.freedesktop.login1.policy:118
msgid "Explicit request is required to run programs as a non-logged-in user." msgid "Explicit request is required to run programs as a non-logged-in user."
msgstr "" msgstr ""
"Requête explicite requise pour exécuter des programmes en tant " "Requête explicite requise pour exécuter des programmes en tant qu"
"qu'utilisateur non connecté." "utilisateur non connecté."
#: src/login/org.freedesktop.login1.policy:127 #: src/login/org.freedesktop.login1.policy:127
msgid "Allow non-logged-in users to run programs" msgid "Allow non-logged-in users to run programs"
msgstr "Permet aux utilisateurs non connectés d'exécuter des programmes" msgstr "Permet aux utilisateurs non connectés dexécuter des programmes"
#: src/login/org.freedesktop.login1.policy:128 #: src/login/org.freedesktop.login1.policy:128
msgid "Authentication is required to run programs as a non-logged-in user." msgid "Authentication is required to run programs as a non-logged-in user."
msgstr "" msgstr ""
"Authentification requise pour exécuter des programmes en tant qu'utilisateur " "Authentification requise pour exécuter des programmes en tant quutilisateur "
"non connecté." "non connecté."
#: src/login/org.freedesktop.login1.policy:137 #: src/login/org.freedesktop.login1.policy:137
msgid "Allow attaching devices to seats" msgid "Allow attaching devices to seats"
msgstr "Permet d'associer des périphériques à des postes (seats)" msgstr "Permet dassocier des périphériques à des postes (seats)"
#: src/login/org.freedesktop.login1.policy:138 #: src/login/org.freedesktop.login1.policy:138
msgid "Authentication is required to attach a device to a seat." msgid "Authentication is required to attach a device to a seat."
@ -371,27 +370,27 @@ msgstr "Authentification requise pour éteindre le système."
#: src/login/org.freedesktop.login1.policy:169 #: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system while other users are logged in" msgid "Power off the system while other users are logged in"
msgstr "Éteindre le système alors que d'autres utilisateurs sont connectés" msgstr "Éteindre le système alors que dautres utilisateurs sont connectés"
#: src/login/org.freedesktop.login1.policy:170 #: src/login/org.freedesktop.login1.policy:170
msgid "" msgid ""
"Authentication is required to power off the system while other users are " "Authentication is required to power off the system while other users are "
"logged in." "logged in."
msgstr "" msgstr ""
"Authentification requise pour éteindre le système alors que d'autres " "Authentification requise pour éteindre le système alors que dautres "
"utilisateurs sont connectés." "utilisateurs sont connectés."
#: src/login/org.freedesktop.login1.policy:180 #: src/login/org.freedesktop.login1.policy:180
msgid "Power off the system while an application is inhibiting this" msgid "Power off the system while an application is inhibiting this"
msgstr "Éteindre le système alors qu'une application a demandé de l'empêcher" msgstr "Éteindre le système alors quune application a demandé de lempêcher"
#: src/login/org.freedesktop.login1.policy:181 #: src/login/org.freedesktop.login1.policy:181
msgid "" msgid ""
"Authentication is required to power off the system while an application is " "Authentication is required to power off the system while an application is "
"inhibiting this." "inhibiting this."
msgstr "" msgstr ""
"Authentification requise pour éteindre le système alors qu'une application a " "Authentification requise pour éteindre le système alors quune application a "
"demandé de l'empêcher." "demandé de lempêcher."
#: src/login/org.freedesktop.login1.policy:191 #: src/login/org.freedesktop.login1.policy:191
msgid "Reboot the system" msgid "Reboot the system"
@ -403,27 +402,27 @@ msgstr "Authentification requise pour redémarrer le système."
#: src/login/org.freedesktop.login1.policy:202 #: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system while other users are logged in" msgid "Reboot the system while other users are logged in"
msgstr "Redémarrer le système alors que d'autres utilisateurs sont connectés" msgstr "Redémarrer le système alors que dautres utilisateurs sont connectés"
#: src/login/org.freedesktop.login1.policy:203 #: src/login/org.freedesktop.login1.policy:203
msgid "" msgid ""
"Authentication is required to reboot the system while other users are logged " "Authentication is required to reboot the system while other users are logged "
"in." "in."
msgstr "" msgstr ""
"Authentification requise pour redémarrer le système alors que d'autres " "Authentification requise pour redémarrer le système alors que dautres "
"utilisateurs sont connectés." "utilisateurs sont connectés."
#: src/login/org.freedesktop.login1.policy:213 #: src/login/org.freedesktop.login1.policy:213
msgid "Reboot the system while an application is inhibiting this" msgid "Reboot the system while an application is inhibiting this"
msgstr "Redémarrer le système alors qu'une application a demandé de l'empêcher" msgstr "Redémarrer le système alors quune application a demandé de lempêcher"
#: src/login/org.freedesktop.login1.policy:214 #: src/login/org.freedesktop.login1.policy:214
msgid "" msgid ""
"Authentication is required to reboot the system while an application is " "Authentication is required to reboot the system while an application is "
"inhibiting this." "inhibiting this."
msgstr "" msgstr ""
"Authentification requise pour redémarrer le système alors qu'une application " "Authentification requise pour redémarrer le système alors quune application "
"a demandé de l'empêcher." "a demandé de lempêcher."
#: src/login/org.freedesktop.login1.policy:224 #: src/login/org.freedesktop.login1.policy:224
msgid "Halt the system" msgid "Halt the system"
@ -435,19 +434,19 @@ msgstr "Authentification requise pour arrêter le système."
#: src/login/org.freedesktop.login1.policy:235 #: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system while other users are logged in" msgid "Halt the system while other users are logged in"
msgstr "Arrêter le système alors que d'autres utilisateurs sont connectés" msgstr "Arrêter le système alors que dautres utilisateurs sont connectés"
#: src/login/org.freedesktop.login1.policy:236 #: src/login/org.freedesktop.login1.policy:236
msgid "" msgid ""
"Authentication is required to halt the system while other users are logged " "Authentication is required to halt the system while other users are logged "
"in." "in."
msgstr "" msgstr ""
"Authentification requise pour arrêter le système alors que d'autres " "Authentification requise pour arrêter le système alors que dautres "
"utilisateurs sont connectés." "utilisateurs sont connectés."
#: src/login/org.freedesktop.login1.policy:246 #: src/login/org.freedesktop.login1.policy:246
msgid "Halt the system while an application is inhibiting this" msgid "Halt the system while an application is inhibiting this"
msgstr "Arrêter le système alors qu'une application a demandé de l'empêcher" msgstr "Arrêter le système alors quune application a demandé de lempêcher"
#: src/login/org.freedesktop.login1.policy:247 #: src/login/org.freedesktop.login1.policy:247
#, fuzzy #, fuzzy
@ -472,28 +471,28 @@ msgstr "Authentification requise pour mettre le système en veille."
#: src/login/org.freedesktop.login1.policy:267 #: src/login/org.freedesktop.login1.policy:267
msgid "Suspend the system while other users are logged in" msgid "Suspend the system while other users are logged in"
msgstr "" msgstr ""
"Mettre le système en veille alors que d'autres utilisateurs sont connectés" "Mettre le système en veille alors que dautres utilisateurs sont connectés"
#: src/login/org.freedesktop.login1.policy:268 #: src/login/org.freedesktop.login1.policy:268
msgid "" msgid ""
"Authentication is required to suspend the system while other users are " "Authentication is required to suspend the system while other users are "
"logged in." "logged in."
msgstr "" msgstr ""
"Authentification requise pour mettre le système en veille alors que d'autres " "Authentification requise pour mettre le système en veille alors que dautres "
"utilisateurs sont connectés." "utilisateurs sont connectés."
#: src/login/org.freedesktop.login1.policy:278 #: src/login/org.freedesktop.login1.policy:278
msgid "Suspend the system while an application is inhibiting this" msgid "Suspend the system while an application is inhibiting this"
msgstr "" msgstr ""
"Mettre le système en veille alors qu'une application a demandé de l'empêcher" "Mettre le système en veille alors quune application a demandé de lempêcher"
#: src/login/org.freedesktop.login1.policy:279 #: src/login/org.freedesktop.login1.policy:279
msgid "" msgid ""
"Authentication is required to suspend the system while an application is " "Authentication is required to suspend the system while an application is "
"inhibiting this." "inhibiting this."
msgstr "" msgstr ""
"Authentification requise pour mettre le système en veille alors qu'une " "Authentification requise pour mettre le système en veille alors quune "
"application a demandé de l'empêcher." "application a demandé de lempêcher."
#: src/login/org.freedesktop.login1.policy:289 #: src/login/org.freedesktop.login1.policy:289
msgid "Hibernate the system" msgid "Hibernate the system"
@ -506,7 +505,7 @@ msgstr "Authentification requise pour mettre le système en hibernation."
#: src/login/org.freedesktop.login1.policy:299 #: src/login/org.freedesktop.login1.policy:299
msgid "Hibernate the system while other users are logged in" msgid "Hibernate the system while other users are logged in"
msgstr "" msgstr ""
"Mettre le système en hibernation alors que d'autres utilisateurs sont " "Mettre le système en hibernation alors que dautres utilisateurs sont "
"connectés" "connectés"
#: src/login/org.freedesktop.login1.policy:300 #: src/login/org.freedesktop.login1.policy:300
@ -514,22 +513,22 @@ msgid ""
"Authentication is required to hibernate the system while other users are " "Authentication is required to hibernate the system while other users are "
"logged in." "logged in."
msgstr "" msgstr ""
"Authentification requise pour mettre le système en hibernation alors que " "Authentification requise pour mettre le système en hibernation alors que d"
"d'autres utilisateurs sont connectés." "autres utilisateurs sont connectés."
#: src/login/org.freedesktop.login1.policy:310 #: src/login/org.freedesktop.login1.policy:310
msgid "Hibernate the system while an application is inhibiting this" msgid "Hibernate the system while an application is inhibiting this"
msgstr "" msgstr ""
"Mettre le système en hibernation alors qu'une application a demandé de " "Mettre le système en hibernation alors quune application a demandé de "
"l'empêcher" "lempêcher"
#: src/login/org.freedesktop.login1.policy:311 #: src/login/org.freedesktop.login1.policy:311
msgid "" msgid ""
"Authentication is required to hibernate the system while an application is " "Authentication is required to hibernate the system while an application is "
"inhibiting this." "inhibiting this."
msgstr "" msgstr ""
"Authentification requise pour mettre le système en hibernation alors qu'une " "Authentification requise pour mettre le système en hibernation alors quune "
"application a demandé de l'empêcher." "application a demandé de lempêcher."
#: src/login/org.freedesktop.login1.policy:321 #: src/login/org.freedesktop.login1.policy:321
msgid "Manage active sessions, users and seats" msgid "Manage active sessions, users and seats"
@ -553,48 +552,48 @@ msgstr ""
#: src/login/org.freedesktop.login1.policy:341 #: src/login/org.freedesktop.login1.policy:341
msgid "Set the reboot \"reason\" in the kernel" msgid "Set the reboot \"reason\" in the kernel"
msgstr "Définir la « raison » du redémarrage dans le noyau" msgstr "Définir la «raison» du redémarrage dans le noyau"
#: src/login/org.freedesktop.login1.policy:342 #: src/login/org.freedesktop.login1.policy:342
msgid "Authentication is required to set the reboot \"reason\" in the kernel." msgid "Authentication is required to set the reboot \"reason\" in the kernel."
msgstr "" msgstr ""
"Authentification requise pour définir la « raison » du redémarrage dans le " "Authentification requise pour définir la «raison» du redémarrage dans le "
"noyau." "noyau."
#: src/login/org.freedesktop.login1.policy:352 #: src/login/org.freedesktop.login1.policy:352
msgid "Indicate to the firmware to boot to setup interface" msgid "Indicate to the firmware to boot to setup interface"
msgstr "Indiquer au micrologiciel de démarrer sur l'interface de configuration" msgstr "Indiquer au micrologiciel de démarrer sur linterface de configuration"
#: src/login/org.freedesktop.login1.policy:353 #: src/login/org.freedesktop.login1.policy:353
msgid "" msgid ""
"Authentication is required to indicate to the firmware to boot to setup " "Authentication is required to indicate to the firmware to boot to setup "
"interface." "interface."
msgstr "" msgstr ""
"Authentification requise pour indiquer au micrologiciel de démarrer sur " "Authentification requise pour indiquer au micrologiciel de démarrer sur l"
"l'interface de configuration." "interface de configuration."
#: src/login/org.freedesktop.login1.policy:363 #: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the boot loader to boot to the boot loader menu" msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "Indiquer au programme d'amorçage d'afficher le menu au démarrage" msgstr "Indiquer au programme damorçage dafficher le menu au démarrage"
#: src/login/org.freedesktop.login1.policy:364 #: src/login/org.freedesktop.login1.policy:364
msgid "" msgid ""
"Authentication is required to indicate to the boot loader to boot to the " "Authentication is required to indicate to the boot loader to boot to the "
"boot loader menu." "boot loader menu."
msgstr "" msgstr ""
"Authentification requise pour indiquer au programme d'amorçage d'afficher le " "Authentification requise pour indiquer au programme damorçage dafficher le "
"menu au démarrage." "menu au démarrage."
#: src/login/org.freedesktop.login1.policy:374 #: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot a specific entry" msgid "Indicate to the boot loader to boot a specific entry"
msgstr "Indiquer au programme d'amorçage de démarrer une entrée spécifique" msgstr "Indiquer au programme damorçage de démarrer une entrée spécifique"
#: src/login/org.freedesktop.login1.policy:375 #: src/login/org.freedesktop.login1.policy:375
msgid "" msgid ""
"Authentication is required to indicate to the boot loader to boot into a " "Authentication is required to indicate to the boot loader to boot into a "
"specific boot loader entry." "specific boot loader entry."
msgstr "" msgstr ""
"Authentification requise pour indiquer au programme d'amorçage de démarrer " "Authentification requise pour indiquer au programme damorçage de démarrer "
"une entrée spécifique." "une entrée spécifique."
#: src/login/org.freedesktop.login1.policy:385 #: src/login/org.freedesktop.login1.policy:385
@ -624,11 +623,11 @@ msgstr ""
#: src/machine/org.freedesktop.machine1.policy:32 #: src/machine/org.freedesktop.machine1.policy:32
msgid "Log into the local host" msgid "Log into the local host"
msgstr "Connexion à l'hôte local" msgstr "Connexion à lhôte local"
#: src/machine/org.freedesktop.machine1.policy:33 #: src/machine/org.freedesktop.machine1.policy:33
msgid "Authentication is required to log into the local host." msgid "Authentication is required to log into the local host."
msgstr "Authentification requise pour permettre la connexion à l'hôte local." msgstr "Authentification requise pour permettre la connexion à lhôte local."
#: src/machine/org.freedesktop.machine1.policy:42 #: src/machine/org.freedesktop.machine1.policy:42
msgid "Acquire a shell in a local container" msgid "Acquire a shell in a local container"
@ -642,12 +641,12 @@ msgstr ""
#: src/machine/org.freedesktop.machine1.policy:53 #: src/machine/org.freedesktop.machine1.policy:53
msgid "Acquire a shell on the local host" msgid "Acquire a shell on the local host"
msgstr "Obtenir une interface système sur l'hôte local" msgstr "Obtenir une interface système sur lhôte local"
#: src/machine/org.freedesktop.machine1.policy:54 #: src/machine/org.freedesktop.machine1.policy:54
msgid "Authentication is required to acquire a shell on the local host." msgid "Authentication is required to acquire a shell on the local host."
msgstr "" msgstr ""
"Authentification requise pour obtenir une interface système sur l'hôte local." "Authentification requise pour obtenir une interface système sur lhôte local."
#: src/machine/org.freedesktop.machine1.policy:64 #: src/machine/org.freedesktop.machine1.policy:64
msgid "Acquire a pseudo TTY in a local container" msgid "Acquire a pseudo TTY in a local container"
@ -662,12 +661,12 @@ msgstr ""
#: src/machine/org.freedesktop.machine1.policy:74 #: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host" msgid "Acquire a pseudo TTY on the local host"
msgstr "Obtenir un pseudo terminal sur l'hôte local" msgstr "Obtenir un pseudo terminal sur lhôte local"
#: src/machine/org.freedesktop.machine1.policy:75 #: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host." msgid "Authentication is required to acquire a pseudo TTY on the local host."
msgstr "" msgstr ""
"Authentification requise pour obtenir un pseudo terminal sur l'hôte local." "Authentification requise pour obtenir un pseudo terminal sur lhôte local."
#: src/machine/org.freedesktop.machine1.policy:84 #: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers" msgid "Manage local virtual machines and containers"
@ -890,11 +889,11 @@ msgstr ""
#: src/timedate/org.freedesktop.timedate1.policy:22 #: src/timedate/org.freedesktop.timedate1.policy:22
msgid "Set system time" msgid "Set system time"
msgstr "Définir l'heure du système" msgstr "Définir lheure du système"
#: src/timedate/org.freedesktop.timedate1.policy:23 #: src/timedate/org.freedesktop.timedate1.policy:23
msgid "Authentication is required to set the system time." msgid "Authentication is required to set the system time."
msgstr "Authentification requise pour définir l'heure du système." msgstr "Authentification requise pour définir lheure du système."
#: src/timedate/org.freedesktop.timedate1.policy:33 #: src/timedate/org.freedesktop.timedate1.policy:33
msgid "Set system timezone" msgid "Set system timezone"
@ -907,7 +906,7 @@ msgstr "Authentification requise pour définir le fuseau horaire du système."
#: src/timedate/org.freedesktop.timedate1.policy:43 #: src/timedate/org.freedesktop.timedate1.policy:43
msgid "Set RTC to local timezone or UTC" msgid "Set RTC to local timezone or UTC"
msgstr "" msgstr ""
"Positionner l'horloge matérielle à l'heure locale ou sur le temps universel " "Positionner lhorloge matérielle à lheure locale ou sur le temps universel "
"coordonné (UTC)" "coordonné (UTC)"
#: src/timedate/org.freedesktop.timedate1.policy:44 #: src/timedate/org.freedesktop.timedate1.policy:44
@ -915,54 +914,54 @@ msgid ""
"Authentication is required to control whether the RTC stores the local or " "Authentication is required to control whether the RTC stores the local or "
"UTC time." "UTC time."
msgstr "" msgstr ""
"Authentification requise pour positionner l'horloge matérielle à l'heure " "Authentification requise pour positionner lhorloge matérielle à lheure "
"locale ou sur le temps universel coordonné (UTC)." "locale ou sur le temps universel coordonné (UTC)."
#: src/timedate/org.freedesktop.timedate1.policy:53 #: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off" msgid "Turn network time synchronization on or off"
msgstr "Activer ou désactiver la synchronisation de l'heure avec le réseau" msgstr "Activer ou désactiver la synchronisation de lheure avec le réseau"
#: src/timedate/org.freedesktop.timedate1.policy:54 #: src/timedate/org.freedesktop.timedate1.policy:54
msgid "" msgid ""
"Authentication is required to control whether network time synchronization " "Authentication is required to control whether network time synchronization "
"shall be enabled." "shall be enabled."
msgstr "" msgstr ""
"Authentification requise pour activer ou désactiver la synchronisation de " "Authentification requise pour activer ou désactiver la synchronisation de l"
"l'heure avec le réseau." "heure avec le réseau."
#: src/core/dbus-unit.c:362 #: src/core/dbus-unit.c:362
msgid "Authentication is required to start '$(unit)'." msgid "Authentication is required to start '$(unit)'."
msgstr "Authentification requise pour démarrer « $(unit) »." msgstr "Authentification requise pour démarrer «$(unit)»."
#: src/core/dbus-unit.c:363 #: src/core/dbus-unit.c:363
msgid "Authentication is required to stop '$(unit)'." msgid "Authentication is required to stop '$(unit)'."
msgstr "Authentification requise pour arrêter « $(unit) »." msgstr "Authentification requise pour arrêter «$(unit)»."
#: src/core/dbus-unit.c:364 #: src/core/dbus-unit.c:364
msgid "Authentication is required to reload '$(unit)'." msgid "Authentication is required to reload '$(unit)'."
msgstr "Authentification requise pour recharger « $(unit) »." msgstr "Authentification requise pour recharger «$(unit)»."
#: src/core/dbus-unit.c:365 src/core/dbus-unit.c:366 #: src/core/dbus-unit.c:365 src/core/dbus-unit.c:366
msgid "Authentication is required to restart '$(unit)'." msgid "Authentication is required to restart '$(unit)'."
msgstr "Authentification requise pour redémarrer « $(unit) »." msgstr "Authentification requise pour redémarrer «$(unit)»."
#: src/core/dbus-unit.c:538 #: src/core/dbus-unit.c:538
msgid "" msgid ""
"Authentication is required to send a UNIX signal to the processes of " "Authentication is required to send a UNIX signal to the processes of "
"'$(unit)'." "'$(unit)'."
msgstr "" msgstr ""
"Authentification requise pour envoyer un signal UNIX aux processus de " "Authentification requise pour envoyer un signal UNIX aux processus de « "
"« $(unit) »." "$(unit)»."
#: src/core/dbus-unit.c:569 #: src/core/dbus-unit.c:569
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'." msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
msgstr "" msgstr ""
"Authentification requise pour réinitialiser l'état d'« échec » de " "Authentification requise pour réinitialiser létat d«échec» de « $(unit)"
"« $(unit) »." "»."
#: src/core/dbus-unit.c:602 #: src/core/dbus-unit.c:602
msgid "Authentication is required to set properties on '$(unit)'." msgid "Authentication is required to set properties on '$(unit)'."
msgstr "Authentification requise pour définir des propriétés de « $(unit) »." msgstr "Authentification requise pour définir des propriétés de «$(unit)»."
#: src/core/dbus-unit.c:711 #: src/core/dbus-unit.c:711
msgid "" msgid ""
@ -970,7 +969,7 @@ msgid ""
"'$(unit)'." "'$(unit)'."
msgstr "" msgstr ""
"Authentification requise pour supprimer les fichiers et les dossiers " "Authentification requise pour supprimer les fichiers et les dossiers "
"associés à « $(unit) »." "associés à «$(unit)»."
#: src/core/dbus-unit.c:760 #: src/core/dbus-unit.c:760
#, fuzzy #, fuzzy

View File

@ -3,22 +3,23 @@
# SOME DESCRIPTIVE TITLE. # SOME DESCRIPTIVE TITLE.
# This file is distributed under the same license as the PACKAGE package. # This file is distributed under the same license as the PACKAGE package.
# gogo <trebelnik2@gmail.com>, 2016. # gogo <trebelnik2@gmail.com>, 2016.
# # Gogo Gogsi <linux.hr@protonmail.com>, 2020.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: systemd master\n" "Project-Id-Version: systemd master\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-08-19 18:02+0200\n" "POT-Creation-Date: 2020-08-19 18:02+0200\n"
"PO-Revision-Date: 2020-03-08 12:57+0100\n" "PO-Revision-Date: 2020-08-29 11:29+0000\n"
"Last-Translator: gogo <linux.hr@protonmail.com>\n" "Last-Translator: Gogo Gogsi <linux.hr@protonmail.com>\n"
"Language-Team: \n" "Language-Team: Croatian <https://translate.fedoraproject.org/projects/"
"systemd/master/hr/>\n"
"Language: hr\n" "Language: hr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.0.6\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Weblate 4.2.1\n"
#: src/core/org.freedesktop.systemd1.policy.in:22 #: src/core/org.freedesktop.systemd1.policy.in:22
msgid "Send passphrase back to system" msgid "Send passphrase back to system"
@ -563,7 +564,7 @@ msgstr "Postavljanje zaslonske pruke"
#: src/login/org.freedesktop.login1.policy:386 #: src/login/org.freedesktop.login1.policy:386
msgid "Authentication is required to set a wall message" msgid "Authentication is required to set a wall message"
msgstr "Potrebna je ovjera za postavljanje zaslonske pruke." msgstr "Potrebna je ovjera za postavljanje zaslonske poruke."
#: src/login/org.freedesktop.login1.policy:395 #: src/login/org.freedesktop.login1.policy:395
msgid "Change Session" msgid "Change Session"
@ -908,14 +909,11 @@ msgid ""
"Authentication is required to delete files and directories associated with " "Authentication is required to delete files and directories associated with "
"'$(unit)'." "'$(unit)'."
msgstr "" msgstr ""
"Potrebna je ovjera za za brisanje datoteka i direktorija pridruženih sa " "Potrebna je ovjera za brisanje datoteka i direktorija pridruženih sa "
"'$(unit)'." "'$(unit)'."
#: src/core/dbus-unit.c:760 #: src/core/dbus-unit.c:760
#, fuzzy
#| msgid ""
#| "Authentication is required to send a UNIX signal to the processes of "
#| "'$(unit)'."
msgid "" msgid ""
"Authentication is required to freeze or thaw the processes of '$(unit)' unit." "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
msgstr "Potrebna je ovjera za slanje UNIX signala u procese '$(unit)'." msgstr ""
"Potrebna je ovjera za zamrzavanje ili odmrzavanje procesa '$(unit)' jedinice."

397
po/uk.po
View File

@ -8,67 +8,68 @@ msgstr ""
"Project-Id-Version: systemd master\n" "Project-Id-Version: systemd master\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-08-19 18:02+0200\n" "POT-Creation-Date: 2020-08-19 18:02+0200\n"
"PO-Revision-Date: 2020-03-25 18:40+0200\n" "PO-Revision-Date: 2020-08-29 11:29+0000\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n" "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <kde-i18n-uk@kde.org>\n" "Language-Team: Ukrainian <https://translate.fedoraproject.org/projects/"
"systemd/master/uk/>\n"
"Language: uk\n" "Language: uk\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Lokalize 20.03.70\n" "X-Generator: Weblate 4.2.1\n"
#: src/core/org.freedesktop.systemd1.policy.in:22 #: src/core/org.freedesktop.systemd1.policy.in:22
msgid "Send passphrase back to system" msgid "Send passphrase back to system"
msgstr "Надіслати пароль назад у систему" msgstr "Надсилання пароля назад у систему"
#: src/core/org.freedesktop.systemd1.policy.in:23 #: src/core/org.freedesktop.systemd1.policy.in:23
msgid "" msgid ""
"Authentication is required to send the entered passphrase back to the system." "Authentication is required to send the entered passphrase back to the system."
msgstr "" msgstr "Для надсилання введеного пароля до системи слід пройти розпізнавання."
"Потрібна автентифікація, щоб надіслати введений пароль назад у систему."
#: src/core/org.freedesktop.systemd1.policy.in:33 #: src/core/org.freedesktop.systemd1.policy.in:33
msgid "Manage system services or other units" msgid "Manage system services or other units"
msgstr "Керувати системними службами й іншими одиницями systemd" msgstr "Керування системними службами й іншими одиницями systemd"
#: src/core/org.freedesktop.systemd1.policy.in:34 #: src/core/org.freedesktop.systemd1.policy.in:34
msgid "Authentication is required to manage system services or other units." msgid "Authentication is required to manage system services or other units."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб керувати системними службами й іншими одиницями " "Для керування системними службами й іншими одиницями systemd слід пройти "
"systemd." "розпізнавання."
#: src/core/org.freedesktop.systemd1.policy.in:43 #: src/core/org.freedesktop.systemd1.policy.in:43
msgid "Manage system service or unit files" msgid "Manage system service or unit files"
msgstr "Керувати системними службами й одиницями systemd" msgstr "Керування системними службами й одиницями systemd"
#: src/core/org.freedesktop.systemd1.policy.in:44 #: src/core/org.freedesktop.systemd1.policy.in:44
msgid "Authentication is required to manage system service or unit files." msgid "Authentication is required to manage system service or unit files."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб керувати системними службами й одиницями " "Для керування системними службами й одиницями systemd слід пройти "
"systemd." "розпізнавання."
#: src/core/org.freedesktop.systemd1.policy.in:54 #: src/core/org.freedesktop.systemd1.policy.in:54
msgid "Set or unset system and service manager environment variables" msgid "Set or unset system and service manager environment variables"
msgstr "" msgstr ""
"Встановити або забрати змінну середовища з керування службами і системою" "Встановлення і скасування встановлення змінних середовища для керування "
"службами і системою"
#: src/core/org.freedesktop.systemd1.policy.in:55 #: src/core/org.freedesktop.systemd1.policy.in:55
msgid "" msgid ""
"Authentication is required to set or unset system and service manager " "Authentication is required to set or unset system and service manager "
"environment variables." "environment variables."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб установити або забрати змінні середовища з " "Для встановлення або скасовування встановлення змінних середовища для "
"керування службами і системою." "керування службами і системою слід пройти розпізнавання."
#: src/core/org.freedesktop.systemd1.policy.in:64 #: src/core/org.freedesktop.systemd1.policy.in:64
msgid "Reload the systemd state" msgid "Reload the systemd state"
msgstr "Перезапустити стан системи" msgstr "Перезавантаження стану systemd"
#: src/core/org.freedesktop.systemd1.policy.in:65 #: src/core/org.freedesktop.systemd1.policy.in:65
msgid "Authentication is required to reload the systemd state." msgid "Authentication is required to reload the systemd state."
msgstr "Потрібна автентифікація, щоб перезапустити стан системи." msgstr "Для перезавантаження стану systemd слід пройти розпізнавання."
#: src/home/org.freedesktop.home1.policy:13 #: src/home/org.freedesktop.home1.policy:13
msgid "Create a home area" msgid "Create a home area"
@ -127,31 +128,31 @@ msgstr ""
#: src/hostname/org.freedesktop.hostname1.policy:20 #: src/hostname/org.freedesktop.hostname1.policy:20
msgid "Set hostname" msgid "Set hostname"
msgstr "Встановити назву вузла" msgstr "Встановлення назви вузла"
#: src/hostname/org.freedesktop.hostname1.policy:21 #: src/hostname/org.freedesktop.hostname1.policy:21
msgid "Authentication is required to set the local hostname." msgid "Authentication is required to set the local hostname."
msgstr "Потрібна автентифікація, щоб встановити назву локального вузла." msgstr "Для встановлення назви локального вузла слід пройти розпізнавання."
#: src/hostname/org.freedesktop.hostname1.policy:30 #: src/hostname/org.freedesktop.hostname1.policy:30
msgid "Set static hostname" msgid "Set static hostname"
msgstr "Встановити статичну назву вузла" msgstr "Встановлення статичної назви вузла"
#: src/hostname/org.freedesktop.hostname1.policy:31 #: src/hostname/org.freedesktop.hostname1.policy:31
msgid "" msgid ""
"Authentication is required to set the statically configured local hostname, " "Authentication is required to set the statically configured local hostname, "
"as well as the pretty hostname." "as well as the pretty hostname."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб вказати статично налаштовану назву локального " "Для встановлення статично налаштованої назви локального вузла і форматованої "
"вузла, так само й форматовану." "назви слід пройти розпізнавання."
#: src/hostname/org.freedesktop.hostname1.policy:41 #: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information" msgid "Set machine information"
msgstr "Встановити інформацію про машину" msgstr "Встановлення даних щодо машини"
#: src/hostname/org.freedesktop.hostname1.policy:42 #: src/hostname/org.freedesktop.hostname1.policy:42
msgid "Authentication is required to set local machine information." msgid "Authentication is required to set local machine information."
msgstr "Потрібна автентифікація, щоб вказати локальну інформацію про машини." msgstr "Для встановлення даних щодо локальної машини слід пройти розпізнавання."
#: src/hostname/org.freedesktop.hostname1.policy:51 #: src/hostname/org.freedesktop.hostname1.policy:51
msgid "Get product UUID" msgid "Get product UUID"
@ -159,371 +160,378 @@ msgstr "Отримання UUID продукту"
#: src/hostname/org.freedesktop.hostname1.policy:52 #: src/hostname/org.freedesktop.hostname1.policy:52
msgid "Authentication is required to get product UUID." msgid "Authentication is required to get product UUID."
msgstr "Потрібна автентифікація, щоб отримати UUID продукту." msgstr "Для отримання UUID продукту слід пройти розпізнавання."
#: src/import/org.freedesktop.import1.policy:22 #: src/import/org.freedesktop.import1.policy:22
msgid "Import a VM or container image" msgid "Import a VM or container image"
msgstr "Імпортувати образ контейнера або віртуальної машини" msgstr "Імпортування образу контейнера або віртуальної машини"
#: src/import/org.freedesktop.import1.policy:23 #: src/import/org.freedesktop.import1.policy:23
msgid "Authentication is required to import a VM or container image" msgid "Authentication is required to import a VM or container image"
msgstr "" msgstr ""
"Потрібна автентифікація, щоб імпортувати образ контейнера або віртуальної " "Для імпортування образу контейнера або віртуальної машини слід пройти "
"машини" "розпізнавання"
#: src/import/org.freedesktop.import1.policy:32 #: src/import/org.freedesktop.import1.policy:32
msgid "Export a VM or container image" msgid "Export a VM or container image"
msgstr "Експортувати образ контейнера або віртуальної машини" msgstr "Експортування образу контейнера або віртуальної машини"
#: src/import/org.freedesktop.import1.policy:33 #: src/import/org.freedesktop.import1.policy:33
msgid "Authentication is required to export a VM or container image" msgid "Authentication is required to export a VM or container image"
msgstr "" msgstr ""
"Потрібна автентифікація, щоб експортувати образ контейнера або віртуальної " "Для експортування образу контейнера або віртуальної машини слід пройти "
"машини" "розпізнавання"
#: src/import/org.freedesktop.import1.policy:42 #: src/import/org.freedesktop.import1.policy:42
msgid "Download a VM or container image" msgid "Download a VM or container image"
msgstr "Звантажити образ контейнера або віртуальної машини" msgstr "Отримання образу контейнера або віртуальної машини"
#: src/import/org.freedesktop.import1.policy:43 #: src/import/org.freedesktop.import1.policy:43
msgid "Authentication is required to download a VM or container image" msgid "Authentication is required to download a VM or container image"
msgstr "" msgstr ""
"Потрібна автентифікація, щоб звантажити образ контейнера або віртуальної " "Для отримання образу контейнера або віртуальної машини слід пройти "
"машини" "розпізнавання"
#: src/locale/org.freedesktop.locale1.policy:22 #: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale" msgid "Set system locale"
msgstr "Вказати системну локаль" msgstr "Визначення системної локалі"
#: src/locale/org.freedesktop.locale1.policy:23 #: src/locale/org.freedesktop.locale1.policy:23
msgid "Authentication is required to set the system locale." msgid "Authentication is required to set the system locale."
msgstr "Потрібна автентифікація, щоб встановити системну локаль." msgstr "Для визначення системної локалі слід пройти розпізнавання."
#: src/locale/org.freedesktop.locale1.policy:33 #: src/locale/org.freedesktop.locale1.policy:33
msgid "Set system keyboard settings" msgid "Set system keyboard settings"
msgstr "Вказати налаштування системної клавіатури" msgstr "Визначення загальносистемних параметрів клавіатури"
#: src/locale/org.freedesktop.locale1.policy:34 #: src/locale/org.freedesktop.locale1.policy:34
msgid "Authentication is required to set the system keyboard settings." msgid "Authentication is required to set the system keyboard settings."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб вказати налаштування системної клавіатури." "Для визначення загальносистемних параметрів клавіатури слід пройти "
"розпізнавання."
#: src/login/org.freedesktop.login1.policy:22 #: src/login/org.freedesktop.login1.policy:22
msgid "Allow applications to inhibit system shutdown" msgid "Allow applications to inhibit system shutdown"
msgstr "Дозволити програмам перешкоджати вимкненню системи" msgstr "Уможливлення перешкоджання вимкненню системи програмами"
#: src/login/org.freedesktop.login1.policy:23 #: src/login/org.freedesktop.login1.policy:23
msgid "" msgid ""
"Authentication is required for an application to inhibit system shutdown." "Authentication is required for an application to inhibit system shutdown."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб дозволити програмам перешкоджати вимкненню " "Для того, щоб уможливити програмам перешкоджання вимкненню системи, слід "
"системи." "пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:33 #: src/login/org.freedesktop.login1.policy:33
msgid "Allow applications to delay system shutdown" msgid "Allow applications to delay system shutdown"
msgstr "Дозволити програмам затримувати вимкнення системи" msgstr "Уможливлення затримки вимкнення системи програмами"
#: src/login/org.freedesktop.login1.policy:34 #: src/login/org.freedesktop.login1.policy:34
msgid "Authentication is required for an application to delay system shutdown." msgid "Authentication is required for an application to delay system shutdown."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб дозволити програмам затримувати вимкнення " "Для того, щоб уможливити програмам затримання вимкнення системи, слід пройти "
"системи." "розпізнавання."
#: src/login/org.freedesktop.login1.policy:44 #: src/login/org.freedesktop.login1.policy:44
msgid "Allow applications to inhibit system sleep" msgid "Allow applications to inhibit system sleep"
msgstr "Дозволити програмам перешкоджати засинанню системи" msgstr "Уможливлення перешкоджання присиплянню системи програмами"
#: src/login/org.freedesktop.login1.policy:45 #: src/login/org.freedesktop.login1.policy:45
msgid "Authentication is required for an application to inhibit system sleep." msgid "Authentication is required for an application to inhibit system sleep."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб дозволити програмам перешкоджати засинанню " "Для того, щоб уможливити програмам перешкоджання присиплянню системи, слід "
"системи." "пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:55 #: src/login/org.freedesktop.login1.policy:55
msgid "Allow applications to delay system sleep" msgid "Allow applications to delay system sleep"
msgstr "Дозволити програмами затримувати засинання системи" msgstr "Уможливлення затримання присипляння системи програмами"
#: src/login/org.freedesktop.login1.policy:56 #: src/login/org.freedesktop.login1.policy:56
msgid "Authentication is required for an application to delay system sleep." msgid "Authentication is required for an application to delay system sleep."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб дозволити програмам затримувати засинання " "Для того, щоб уможливити програмам затримання присипляння системи, слід "
"системи." "пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:65 #: src/login/org.freedesktop.login1.policy:65
msgid "Allow applications to inhibit automatic system suspend" msgid "Allow applications to inhibit automatic system suspend"
msgstr "Дозволити програмам перешкоджати автоматичному призупиненню системи" msgstr ""
"Уможливлення перешкоджання автоматичному призупиненню системи програмами"
#: src/login/org.freedesktop.login1.policy:66 #: src/login/org.freedesktop.login1.policy:66
msgid "" msgid ""
"Authentication is required for an application to inhibit automatic system " "Authentication is required for an application to inhibit automatic system "
"suspend." "suspend."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб дозволити програмам перешкоджати автоматичному " "Для того, щоб уможливити програмам перешкоджання автоматичне призупинення "
"призупиненню системи." "роботи системи, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:75 #: src/login/org.freedesktop.login1.policy:75
msgid "Allow applications to inhibit system handling of the power key" msgid "Allow applications to inhibit system handling of the power key"
msgstr "Дозволити програмам перешкоджати обробленню системою клавіші живлення" msgstr ""
"Уможливлення перешкоджання обробці системою клавіші живлення для програм"
#: src/login/org.freedesktop.login1.policy:76 #: src/login/org.freedesktop.login1.policy:76
msgid "" msgid ""
"Authentication is required for an application to inhibit system handling of " "Authentication is required for an application to inhibit system handling of "
"the power key." "the power key."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб дозволити програмам перешкоджати обробленню " "Для того, щоб дозволити програмам перешкоджати обробленню системою клавіші "
"системою клавіші живлення." "живлення, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:86 #: src/login/org.freedesktop.login1.policy:86
msgid "Allow applications to inhibit system handling of the suspend key" msgid "Allow applications to inhibit system handling of the suspend key"
msgstr "" msgstr ""
"Дозволити програмам перешкоджати обробленню системою клавіші призупинення" "Уможливлення перешкоджання обробці системою клавіші призупинення для програм"
#: src/login/org.freedesktop.login1.policy:87 #: src/login/org.freedesktop.login1.policy:87
msgid "" msgid ""
"Authentication is required for an application to inhibit system handling of " "Authentication is required for an application to inhibit system handling of "
"the suspend key." "the suspend key."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб дозволити програмам перешкоджати обробленню " "Для того, щоб дозволити програмам перешкоджати обробленню системою клавіші "
"системою клавіші призупинення." "призупинення, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:97 #: src/login/org.freedesktop.login1.policy:97
msgid "Allow applications to inhibit system handling of the hibernate key" msgid "Allow applications to inhibit system handling of the hibernate key"
msgstr "" msgstr ""
"Дозволити програмам перешкоджати обробленню системою клавіші присипання" "Уможливлення перешкоджання обробці системою клавіші присипляння для програм"
#: src/login/org.freedesktop.login1.policy:98 #: src/login/org.freedesktop.login1.policy:98
msgid "" msgid ""
"Authentication is required for an application to inhibit system handling of " "Authentication is required for an application to inhibit system handling of "
"the hibernate key." "the hibernate key."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб дозволити програмам перешкоджати обробленню " "Для того, щоб дозволити програмам перешкоджати обробленню системою клавіші "
"системою клавіші присипання." "присипляння, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:107 #: src/login/org.freedesktop.login1.policy:107
msgid "Allow applications to inhibit system handling of the lid switch" msgid "Allow applications to inhibit system handling of the lid switch"
msgstr "" msgstr ""
"Дозволити програмам перешкоджати обробленню системою клавіші перемикання " "Уможливлення перешкоджання обробці системою перемикання кришки для програм"
"кришки"
#: src/login/org.freedesktop.login1.policy:108 #: src/login/org.freedesktop.login1.policy:108
msgid "" msgid ""
"Authentication is required for an application to inhibit system handling of " "Authentication is required for an application to inhibit system handling of "
"the lid switch." "the lid switch."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб дозволити програмам перешкоджати обробленню " "Для того, щоб дозволити програмам перешкоджати обробленню системою "
"системою клавіші перемикання кришки." "перемикання кришки, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:117 #: src/login/org.freedesktop.login1.policy:117
msgid "Allow non-logged-in user to run programs" msgid "Allow non-logged-in user to run programs"
msgstr "Дозволити незареєстрованим користувачам запускати програми" msgstr "Дозвіл для незареєстрованого користувача на запуск програм"
#: src/login/org.freedesktop.login1.policy:118 #: src/login/org.freedesktop.login1.policy:118
msgid "Explicit request is required to run programs as a non-logged-in user." msgid "Explicit request is required to run programs as a non-logged-in user."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб дозволити незареєстрованим користувачам " "Для того, щоб дозволити незареєстрованому користувачеві запускати програми, "
"запускати програми." "потрібен явний запит."
#: src/login/org.freedesktop.login1.policy:127 #: src/login/org.freedesktop.login1.policy:127
msgid "Allow non-logged-in users to run programs" msgid "Allow non-logged-in users to run programs"
msgstr "Дозволити незареєстрованим користувачам запускати програми" msgstr "Дозвіл для незареєстрованих користувачів на запуск програм"
#: src/login/org.freedesktop.login1.policy:128 #: src/login/org.freedesktop.login1.policy:128
msgid "Authentication is required to run programs as a non-logged-in user." msgid "Authentication is required to run programs as a non-logged-in user."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб дозволити незареєстрованим користувачам " "Для того, щоб дозволити незареєстрованому користувачеві запускати програми, "
"запускати програми." "слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:137 #: src/login/org.freedesktop.login1.policy:137
msgid "Allow attaching devices to seats" msgid "Allow attaching devices to seats"
msgstr "Дозволити під'єднання пристроїв до місць" msgstr "Дозвіл на під'єднання пристроїв до місць"
#: src/login/org.freedesktop.login1.policy:138 #: src/login/org.freedesktop.login1.policy:138
msgid "Authentication is required to attach a device to a seat." msgid "Authentication is required to attach a device to a seat."
msgstr "Потрібна автентифікація, щоб під'єднувати пристрої до місць." msgstr ""
"Для того, щоб під'єднувати пристрої до місць, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:148 #: src/login/org.freedesktop.login1.policy:148
msgid "Flush device to seat attachments" msgid "Flush device to seat attachments"
msgstr "Очисний пристрій для під'єднань до місця" msgstr "Вилучення прив'язки пристроїв для місць"
#: src/login/org.freedesktop.login1.policy:149 #: src/login/org.freedesktop.login1.policy:149
msgid "Authentication is required to reset how devices are attached to seats." msgid "Authentication is required to reset how devices are attached to seats."
msgstr "" msgstr "Для скидання прив'язки пристроїв до місць слід пройти розпізнавання."
"Потрібна автентифікація, щоб перезапустити спосіб під'єднання до місць."
#: src/login/org.freedesktop.login1.policy:158 #: src/login/org.freedesktop.login1.policy:158
msgid "Power off the system" msgid "Power off the system"
msgstr "Вимкнути систему" msgstr "Вимикання системи"
#: src/login/org.freedesktop.login1.policy:159 #: src/login/org.freedesktop.login1.policy:159
msgid "Authentication is required to power off the system." msgid "Authentication is required to power off the system."
msgstr "Потрібна автентифікація, щоб вимкнути систему." msgstr "Для вимикання системи слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:169 #: src/login/org.freedesktop.login1.policy:169
msgid "Power off the system while other users are logged in" msgid "Power off the system while other users are logged in"
msgstr "Вимкнути систему, коли інші користувачі ще в ній" msgstr "Вимикання системи, коли інші користувачі ще у ній"
#: src/login/org.freedesktop.login1.policy:170 #: src/login/org.freedesktop.login1.policy:170
msgid "" msgid ""
"Authentication is required to power off the system while other users are " "Authentication is required to power off the system while other users are "
"logged in." "logged in."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб вимкнути систему, коли інші користувачі в ній." "Для вимикання системи, коли у ній ще працюють інші користувачі, слід пройти "
"розпізнавання."
#: src/login/org.freedesktop.login1.policy:180 #: src/login/org.freedesktop.login1.policy:180
msgid "Power off the system while an application is inhibiting this" msgid "Power off the system while an application is inhibiting this"
msgstr "Вимкнути систему, коли програми намагаються перешкодити цьому" msgstr "Вимикання системи, коли програми намагаються перешкодити цьому"
#: src/login/org.freedesktop.login1.policy:181 #: src/login/org.freedesktop.login1.policy:181
msgid "" msgid ""
"Authentication is required to power off the system while an application is " "Authentication is required to power off the system while an application is "
"inhibiting this." "inhibiting this."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб вимкнути систему, коли програми намагаються " "Для того, щоб вимкнути систему, коли програми намагаються перешкодити цьому, "
"перешкодити цьому." "слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:191 #: src/login/org.freedesktop.login1.policy:191
msgid "Reboot the system" msgid "Reboot the system"
msgstr "Перезавантажити систему" msgstr "Перезавантаження системи"
#: src/login/org.freedesktop.login1.policy:192 #: src/login/org.freedesktop.login1.policy:192
msgid "Authentication is required to reboot the system." msgid "Authentication is required to reboot the system."
msgstr "Для перезавантаження системи необхідна ідентифікація." msgstr "Для перезавантаження системи слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:202 #: src/login/org.freedesktop.login1.policy:202
msgid "Reboot the system while other users are logged in" msgid "Reboot the system while other users are logged in"
msgstr "Перезавантажити, якщо інші користувачі в системі" msgstr "Перезавантаження, якщо інші користувачі в системі"
#: src/login/org.freedesktop.login1.policy:203 #: src/login/org.freedesktop.login1.policy:203
msgid "" msgid ""
"Authentication is required to reboot the system while other users are logged " "Authentication is required to reboot the system while other users are logged "
"in." "in."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб перезапустити систему, коли інші користувачі в " "Для перезавантаження системи, коли у ній ще працюють інші користувачі, слід "
"ній." "пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:213 #: src/login/org.freedesktop.login1.policy:213
msgid "Reboot the system while an application is inhibiting this" msgid "Reboot the system while an application is inhibiting this"
msgstr "Перезапустити систему, коли програми намагаються перешкодити цьому" msgstr "Перезапуск системи, коли програми намагаються перешкодити цьому"
#: src/login/org.freedesktop.login1.policy:214 #: src/login/org.freedesktop.login1.policy:214
msgid "" msgid ""
"Authentication is required to reboot the system while an application is " "Authentication is required to reboot the system while an application is "
"inhibiting this." "inhibiting this."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб перезапустити систему, коли програми " "Для того, щоб перезавантажити систему, коли програми намагаються перешкодити "
"намагаються перешкодити цьому." "цьому, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:224 #: src/login/org.freedesktop.login1.policy:224
msgid "Halt the system" msgid "Halt the system"
msgstr "Зупинити систему" msgstr "Зупинення системи"
#: src/login/org.freedesktop.login1.policy:225 #: src/login/org.freedesktop.login1.policy:225
msgid "Authentication is required to halt the system." msgid "Authentication is required to halt the system."
msgstr "Потрібна автентифікація, щоб зупинити систему." msgstr "Для зупинення системи слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:235 #: src/login/org.freedesktop.login1.policy:235
msgid "Halt the system while other users are logged in" msgid "Halt the system while other users are logged in"
msgstr "Зупинити систему, коли інші користувачі в ній" msgstr "Зупинення системи, коли інші користувачі в ній"
#: src/login/org.freedesktop.login1.policy:236 #: src/login/org.freedesktop.login1.policy:236
msgid "" msgid ""
"Authentication is required to halt the system while other users are logged " "Authentication is required to halt the system while other users are logged "
"in." "in."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб зупинити систему, коли інші користувачі в ній." "Для зупинення системи, коли у ній ще працюють інші користувачі, слід пройти "
"розпізнавання."
#: src/login/org.freedesktop.login1.policy:246 #: src/login/org.freedesktop.login1.policy:246
msgid "Halt the system while an application is inhibiting this" msgid "Halt the system while an application is inhibiting this"
msgstr "Зупинити систему, коли програми намагаються перешкодити цьому" msgstr "Зупинення системи, коли програми намагаються перешкодити цьому"
#: src/login/org.freedesktop.login1.policy:247 #: src/login/org.freedesktop.login1.policy:247
msgid "" msgid ""
"Authentication is required to halt the system while an application is " "Authentication is required to halt the system while an application is "
"inhibiting this." "inhibiting this."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб зупинити систему, коли програма намагається " "Для того, щоб зупинити систему, коли програми намагаються перешкодити цьому, "
"перешкодити цьому." "слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:257 #: src/login/org.freedesktop.login1.policy:257
msgid "Suspend the system" msgid "Suspend the system"
msgstr "Призупинити систему" msgstr "Призупинення системи"
#: src/login/org.freedesktop.login1.policy:258 #: src/login/org.freedesktop.login1.policy:258
msgid "Authentication is required to suspend the system." msgid "Authentication is required to suspend the system."
msgstr "Потрібна автентифікація, щоб призупинити систему." msgstr "Для призупинення системи слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:267 #: src/login/org.freedesktop.login1.policy:267
msgid "Suspend the system while other users are logged in" msgid "Suspend the system while other users are logged in"
msgstr "Призупинити систему, коли інші користувачі в ній" msgstr "Призупинення системи, коли інші користувачі в ній"
#: src/login/org.freedesktop.login1.policy:268 #: src/login/org.freedesktop.login1.policy:268
msgid "" msgid ""
"Authentication is required to suspend the system while other users are " "Authentication is required to suspend the system while other users are "
"logged in." "logged in."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб призупинити систему, коли інші користувачі в " "Для призупинення системи, коли у ній ще працюють інші користувачі, слід "
"ній." "пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:278 #: src/login/org.freedesktop.login1.policy:278
msgid "Suspend the system while an application is inhibiting this" msgid "Suspend the system while an application is inhibiting this"
msgstr "Призупинити систему, коли програми намагаються перешкодити цьому" msgstr "Призупинення системи, коли програми намагаються перешкодити цьому"
#: src/login/org.freedesktop.login1.policy:279 #: src/login/org.freedesktop.login1.policy:279
msgid "" msgid ""
"Authentication is required to suspend the system while an application is " "Authentication is required to suspend the system while an application is "
"inhibiting this." "inhibiting this."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб призупинити систему, коли програми намагаються " "Для того, щоб призупинити систему, коли програми намагаються перешкодити "
"перешкодити цьому." "цьому, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:289 #: src/login/org.freedesktop.login1.policy:289
msgid "Hibernate the system" msgid "Hibernate the system"
msgstr "Приспати систему" msgstr "Присипляння системи"
#: src/login/org.freedesktop.login1.policy:290 #: src/login/org.freedesktop.login1.policy:290
msgid "Authentication is required to hibernate the system." msgid "Authentication is required to hibernate the system."
msgstr "Потрібна автентифікація, щоб приспати систему." msgstr "Для присипляння системи слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:299 #: src/login/org.freedesktop.login1.policy:299
msgid "Hibernate the system while other users are logged in" msgid "Hibernate the system while other users are logged in"
msgstr "Приспати систему, коли інші користувачі в ній" msgstr "Присипляння системи, коли інші користувачі в ній"
#: src/login/org.freedesktop.login1.policy:300 #: src/login/org.freedesktop.login1.policy:300
msgid "" msgid ""
"Authentication is required to hibernate the system while other users are " "Authentication is required to hibernate the system while other users are "
"logged in." "logged in."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб присипання систему, коли інші користувачі в ній." "Для присипляння системи, коли у ній ще працюють інші користувачі, слід "
"пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:310 #: src/login/org.freedesktop.login1.policy:310
msgid "Hibernate the system while an application is inhibiting this" msgid "Hibernate the system while an application is inhibiting this"
msgstr "Приспати систему, коли програми намагаються перешкодити цьому" msgstr "Присипляння системи, коли програми намагаються перешкодити цьому"
#: src/login/org.freedesktop.login1.policy:311 #: src/login/org.freedesktop.login1.policy:311
msgid "" msgid ""
"Authentication is required to hibernate the system while an application is " "Authentication is required to hibernate the system while an application is "
"inhibiting this." "inhibiting this."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб приспати систему, коли програми намагаються " "Для того, щоб приспати систему, коли програми намагаються перешкодити цьому, "
"перешкодити цьому." "слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:321 #: src/login/org.freedesktop.login1.policy:321
msgid "Manage active sessions, users and seats" msgid "Manage active sessions, users and seats"
msgstr "Керувати сеансами, користувачами і робочими місцями" msgstr "Керування сеансами, користувачами і робочими місцями"
#: src/login/org.freedesktop.login1.policy:322 #: src/login/org.freedesktop.login1.policy:322
msgid "Authentication is required to manage active sessions, users and seats." msgid "Authentication is required to manage active sessions, users and seats."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб керувати сеансами, користувачами і робочими " "Для того, щоб керувати сеансами, користувачами і робочими місцями, слід "
"місцями." "пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:331 #: src/login/org.freedesktop.login1.policy:331
msgid "Lock or unlock active sessions" msgid "Lock or unlock active sessions"
msgstr "Заблокувати або розблокувати сеанси" msgstr "Блокування і розблоковування сеансів"
#: src/login/org.freedesktop.login1.policy:332 #: src/login/org.freedesktop.login1.policy:332
msgid "Authentication is required to lock or unlock active sessions." msgid "Authentication is required to lock or unlock active sessions."
msgstr "Потрібна автентифікація, щоб заблокувати або розблокувати сеанси." msgstr ""
"Для того, щоб заблокувати або розблокувати активні сеанси, слід пройти "
"розпізнавання."
#: src/login/org.freedesktop.login1.policy:341 #: src/login/org.freedesktop.login1.policy:341
msgid "Set the reboot \"reason\" in the kernel" msgid "Set the reboot \"reason\" in the kernel"
@ -532,7 +540,8 @@ msgstr "Встановлення «причини» перезавантажен
#: src/login/org.freedesktop.login1.policy:342 #: src/login/org.freedesktop.login1.policy:342
msgid "Authentication is required to set the reboot \"reason\" in the kernel." msgid "Authentication is required to set the reboot \"reason\" in the kernel."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб встановити «причину» перезавантаження у ядрі." "Для того, щоб встановити «причину» перезавантаження у ядрі, слід пройти "
"розпізнавання."
#: src/login/org.freedesktop.login1.policy:352 #: src/login/org.freedesktop.login1.policy:352
msgid "Indicate to the firmware to boot to setup interface" msgid "Indicate to the firmware to boot to setup interface"
@ -543,8 +552,8 @@ msgid ""
"Authentication is required to indicate to the firmware to boot to setup " "Authentication is required to indicate to the firmware to boot to setup "
"interface." "interface."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб дозволити мікрокоду визначати, чи завантажувати " "Для того, щоб дозволити мікрокоду визначати, чи завантажувати інтерфейс "
"інтерфейс встановлення." "встановлення, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:363 #: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the boot loader to boot to the boot loader menu" msgid "Indicate to the boot loader to boot to the boot loader menu"
@ -555,8 +564,8 @@ msgid ""
"Authentication is required to indicate to the boot loader to boot to the " "Authentication is required to indicate to the boot loader to boot to the "
"boot loader menu." "boot loader menu."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб вказати завантажувачу, що слід завантажитися до " "Для того, щоб вказати завантажувачу, що слід завантажитися до меню "
"меню завантажувача." "завантажувача, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:374 #: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot a specific entry" msgid "Indicate to the boot loader to boot a specific entry"
@ -567,16 +576,16 @@ msgid ""
"Authentication is required to indicate to the boot loader to boot into a " "Authentication is required to indicate to the boot loader to boot into a "
"specific boot loader entry." "specific boot loader entry."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб вказати завантажувачу, що слід завантажити " "Для того, щоб вказати завантажувачу, що слід завантажити певний пункт меню "
"певний пункт меню завантаження." "завантаження, слід пройти розпізнавання."
#: src/login/org.freedesktop.login1.policy:385 #: src/login/org.freedesktop.login1.policy:385
msgid "Set a wall message" msgid "Set a wall message"
msgstr "Вказати повідомлення на стіні" msgstr "Встановлення повідомлення на стіні"
#: src/login/org.freedesktop.login1.policy:386 #: src/login/org.freedesktop.login1.policy:386
msgid "Authentication is required to set a wall message" msgid "Authentication is required to set a wall message"
msgstr "Потрібна автентифікація, щоб вказати повідомлення на стіні" msgstr "Для встановлення повідомлення на стіні слід пройти розпізнавання"
#: src/login/org.freedesktop.login1.policy:395 #: src/login/org.freedesktop.login1.policy:395
msgid "Change Session" msgid "Change Session"
@ -588,77 +597,81 @@ msgstr "Для зміни віртуального термінала слід
#: src/machine/org.freedesktop.machine1.policy:22 #: src/machine/org.freedesktop.machine1.policy:22
msgid "Log into a local container" msgid "Log into a local container"
msgstr "Увійти в локальний контейнер" msgstr "Вхід до локального контейнера"
#: src/machine/org.freedesktop.machine1.policy:23 #: src/machine/org.freedesktop.machine1.policy:23
msgid "Authentication is required to log into a local container." msgid "Authentication is required to log into a local container."
msgstr "Потрібна автентифікація, щоб увійти в локальний контейнер." msgstr ""
"Для того, щоб увійти до локального контейнера, слід пройти розпізнавання."
#: src/machine/org.freedesktop.machine1.policy:32 #: src/machine/org.freedesktop.machine1.policy:32
msgid "Log into the local host" msgid "Log into the local host"
msgstr "Увійти в локальний вузол" msgstr "Вхід до локального вузла"
#: src/machine/org.freedesktop.machine1.policy:33 #: src/machine/org.freedesktop.machine1.policy:33
msgid "Authentication is required to log into the local host." msgid "Authentication is required to log into the local host."
msgstr "Потрібна автентифікація, щоб увійти в локальний вузол." msgstr "Для входу до локального вузла слід пройти розпізнавання."
#: src/machine/org.freedesktop.machine1.policy:42 #: src/machine/org.freedesktop.machine1.policy:42
msgid "Acquire a shell in a local container" msgid "Acquire a shell in a local container"
msgstr "Перейняти оболонку в локальному контейнері" msgstr "Отримання командної оболонки у локальному контейнері"
#: src/machine/org.freedesktop.machine1.policy:43 #: src/machine/org.freedesktop.machine1.policy:43
msgid "Authentication is required to acquire a shell in a local container." msgid "Authentication is required to acquire a shell in a local container."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб перейняти оболонку в локальному контейнері." "Для отримання командної оболонки у локальному контейнері слід пройти "
"розпізнавання."
#: src/machine/org.freedesktop.machine1.policy:53 #: src/machine/org.freedesktop.machine1.policy:53
msgid "Acquire a shell on the local host" msgid "Acquire a shell on the local host"
msgstr "Перейняти оболонку на локальному вузлі" msgstr "Отримання командної оболонки на локальному вузлі"
#: src/machine/org.freedesktop.machine1.policy:54 #: src/machine/org.freedesktop.machine1.policy:54
msgid "Authentication is required to acquire a shell on the local host." msgid "Authentication is required to acquire a shell on the local host."
msgstr "Потрібна автентифікація, щоб перейняти оболонку на локальному вузлі." msgstr ""
"Для отримання командної оболонки на локальному вузлі слід пройти "
"розпізнавання."
#: src/machine/org.freedesktop.machine1.policy:64 #: src/machine/org.freedesktop.machine1.policy:64
msgid "Acquire a pseudo TTY in a local container" msgid "Acquire a pseudo TTY in a local container"
msgstr "Перейняти псевдо TTY в локальному контейнері" msgstr "Отримання псевдо-TTY у локальному контейнері"
#: src/machine/org.freedesktop.machine1.policy:65 #: src/machine/org.freedesktop.machine1.policy:65
msgid "" msgid ""
"Authentication is required to acquire a pseudo TTY in a local container." "Authentication is required to acquire a pseudo TTY in a local container."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб перейняти псевдо TTY в локальному контейнері." "Для отримання псевдо-TTY в локальному контейнері слід пройти розпізнавання."
#: src/machine/org.freedesktop.machine1.policy:74 #: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host" msgid "Acquire a pseudo TTY on the local host"
msgstr "Перейняти псевдо TTY на локальному вузлі" msgstr "Отримання псевдо-TTY на локальному вузлі"
#: src/machine/org.freedesktop.machine1.policy:75 #: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host." msgid "Authentication is required to acquire a pseudo TTY on the local host."
msgstr "Потрібна автентифікація, щоб перейняти псевдо TTY на локальному вузлі." msgstr "Для отримання псевдо-TTY на локальному вузлі слід пройти розпізнавання."
#: src/machine/org.freedesktop.machine1.policy:84 #: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers" msgid "Manage local virtual machines and containers"
msgstr "Керувати локальними віртуальними машинами і контейнерами" msgstr "Керування локальними віртуальними машинами і контейнерами"
#: src/machine/org.freedesktop.machine1.policy:85 #: src/machine/org.freedesktop.machine1.policy:85
msgid "" msgid ""
"Authentication is required to manage local virtual machines and containers." "Authentication is required to manage local virtual machines and containers."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб керувати локальними віртуальними машинами і " "Для доступу до керування локальними віртуальними машинами і контейнерами "
"контейнерами." "слід пройти розпізнавання."
#: src/machine/org.freedesktop.machine1.policy:95 #: src/machine/org.freedesktop.machine1.policy:95
msgid "Manage local virtual machine and container images" msgid "Manage local virtual machine and container images"
msgstr "Керувати локальними образами віртуальних машин і контейнерів" msgstr "Керування локальними образами віртуальних машин і контейнерів"
#: src/machine/org.freedesktop.machine1.policy:96 #: src/machine/org.freedesktop.machine1.policy:96
msgid "" msgid ""
"Authentication is required to manage local virtual machine and container " "Authentication is required to manage local virtual machine and container "
"images." "images."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб керувати локальними образами віртуальних машин " "Для доступу до керування локальними образами віртуальних машин і контейнерів "
"і контейнерів." "слід пройти розпізнавання."
#: src/network/org.freedesktop.network1.policy:22 #: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers" msgid "Set NTP servers"
@ -666,7 +679,7 @@ msgstr "Встановлення серверів NTP"
#: src/network/org.freedesktop.network1.policy:23 #: src/network/org.freedesktop.network1.policy:23
msgid "Authentication is required to set NTP servers." msgid "Authentication is required to set NTP servers."
msgstr "Потрібна автентифікація, щоб встановити сервери NTP." msgstr "Для встановлення серверів NTP слід пройти розпізнавання."
#: src/network/org.freedesktop.network1.policy:33 #: src/network/org.freedesktop.network1.policy:33
#: src/resolve/org.freedesktop.resolve1.policy:44 #: src/resolve/org.freedesktop.resolve1.policy:44
@ -676,7 +689,7 @@ msgstr "Встановлення серверів DNS"
#: src/network/org.freedesktop.network1.policy:34 #: src/network/org.freedesktop.network1.policy:34
#: src/resolve/org.freedesktop.resolve1.policy:45 #: src/resolve/org.freedesktop.resolve1.policy:45
msgid "Authentication is required to set DNS servers." msgid "Authentication is required to set DNS servers."
msgstr "Потрібна автентифікація, щоб встановити сервери DNS." msgstr "Для встановлення серверів DNS слід пройти розпізнавання."
#: src/network/org.freedesktop.network1.policy:44 #: src/network/org.freedesktop.network1.policy:44
#: src/resolve/org.freedesktop.resolve1.policy:55 #: src/resolve/org.freedesktop.resolve1.policy:55
@ -686,7 +699,7 @@ msgstr "Встановлення доменів"
#: src/network/org.freedesktop.network1.policy:45 #: src/network/org.freedesktop.network1.policy:45
#: src/resolve/org.freedesktop.resolve1.policy:56 #: src/resolve/org.freedesktop.resolve1.policy:56
msgid "Authentication is required to set domains." msgid "Authentication is required to set domains."
msgstr "Потрібна автентифікація, щоб встановити домени." msgstr "Для встановлення доменів слід пройти розпізнавання."
#: src/network/org.freedesktop.network1.policy:55 #: src/network/org.freedesktop.network1.policy:55
#: src/resolve/org.freedesktop.resolve1.policy:66 #: src/resolve/org.freedesktop.resolve1.policy:66
@ -696,7 +709,7 @@ msgstr "Встановлення типового маршруту"
#: src/network/org.freedesktop.network1.policy:56 #: src/network/org.freedesktop.network1.policy:56
#: src/resolve/org.freedesktop.resolve1.policy:67 #: src/resolve/org.freedesktop.resolve1.policy:67
msgid "Authentication is required to set default route." msgid "Authentication is required to set default route."
msgstr "Потрібна автентифікація, щоб встановити типовий маршрут." msgstr "Для встановлення типового маршруту слід пройти розпізнавання."
#: src/network/org.freedesktop.network1.policy:66 #: src/network/org.freedesktop.network1.policy:66
#: src/resolve/org.freedesktop.resolve1.policy:77 #: src/resolve/org.freedesktop.resolve1.policy:77
@ -706,17 +719,17 @@ msgstr "Вмикання або вимикання LLMNR"
#: src/network/org.freedesktop.network1.policy:67 #: src/network/org.freedesktop.network1.policy:67
#: src/resolve/org.freedesktop.resolve1.policy:78 #: src/resolve/org.freedesktop.resolve1.policy:78
msgid "Authentication is required to enable or disable LLMNR." msgid "Authentication is required to enable or disable LLMNR."
msgstr "Потрібна автентифікація, щоб увімкнути або вимкнути LLMNR." msgstr "Для вмикання або вимикання LLMNR слід пройти розпізнавання."
#: src/network/org.freedesktop.network1.policy:77 #: src/network/org.freedesktop.network1.policy:77
#: src/resolve/org.freedesktop.resolve1.policy:88 #: src/resolve/org.freedesktop.resolve1.policy:88
msgid "Enable/disable multicast DNS" msgid "Enable/disable multicast DNS"
msgstr "Вмикання або вимикання трансляційного DNS" msgstr "Вмикання або вимикання трансляційної DNS"
#: src/network/org.freedesktop.network1.policy:78 #: src/network/org.freedesktop.network1.policy:78
#: src/resolve/org.freedesktop.resolve1.policy:89 #: src/resolve/org.freedesktop.resolve1.policy:89
msgid "Authentication is required to enable or disable multicast DNS." msgid "Authentication is required to enable or disable multicast DNS."
msgstr "Потрібна автентифікація, щоб увімкнути або вимкнути трансляційну DNS." msgstr "Для вмикання або вимикання трансляційної DNS слід пройти розпізнавання."
#: src/network/org.freedesktop.network1.policy:88 #: src/network/org.freedesktop.network1.policy:88
#: src/resolve/org.freedesktop.resolve1.policy:99 #: src/resolve/org.freedesktop.resolve1.policy:99
@ -726,7 +739,7 @@ msgstr "Вмикання і вимикання DNS через TLS"
#: src/network/org.freedesktop.network1.policy:89 #: src/network/org.freedesktop.network1.policy:89
#: src/resolve/org.freedesktop.resolve1.policy:100 #: src/resolve/org.freedesktop.resolve1.policy:100
msgid "Authentication is required to enable or disable DNS over TLS." msgid "Authentication is required to enable or disable DNS over TLS."
msgstr "Потрібна автентифікація, щоб увімкнути або вимкнути DNS через TLS." msgstr "Для вмикання або вимикання DNS через TLS слід пройти розпізнавання."
#: src/network/org.freedesktop.network1.policy:99 #: src/network/org.freedesktop.network1.policy:99
#: src/resolve/org.freedesktop.resolve1.policy:110 #: src/resolve/org.freedesktop.resolve1.policy:110
@ -736,7 +749,7 @@ msgstr "Вмикання або вимикання DNSSEC"
#: src/network/org.freedesktop.network1.policy:100 #: src/network/org.freedesktop.network1.policy:100
#: src/resolve/org.freedesktop.resolve1.policy:111 #: src/resolve/org.freedesktop.resolve1.policy:111
msgid "Authentication is required to enable or disable DNSSEC." msgid "Authentication is required to enable or disable DNSSEC."
msgstr "Потрібна автентифікація, щоб увімкнути або вимкнути DNSSEC." msgstr "Для вмикання або вимикання DNSSEC слід пройти розпізнавання."
#: src/network/org.freedesktop.network1.policy:110 #: src/network/org.freedesktop.network1.policy:110
#: src/resolve/org.freedesktop.resolve1.policy:121 #: src/resolve/org.freedesktop.resolve1.policy:121
@ -747,7 +760,7 @@ msgstr "Встановлення прив'язок від'ємної довір
#: src/resolve/org.freedesktop.resolve1.policy:122 #: src/resolve/org.freedesktop.resolve1.policy:122
msgid "Authentication is required to set DNSSEC Negative Trust Anchors." msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб встановити прив'язки від'ємної довіри DNSSEC." "Для встановлення прив'язки від'ємної довіри DNSSEC слід пройти розпізнавання."
#: src/network/org.freedesktop.network1.policy:121 #: src/network/org.freedesktop.network1.policy:121
msgid "Revert NTP settings" msgid "Revert NTP settings"
@ -772,8 +785,8 @@ msgstr "Сервер DHCP надсилає повідомлення щодо п
#: src/network/org.freedesktop.network1.policy:144 #: src/network/org.freedesktop.network1.policy:144
msgid "Authentication is required to send force renew message." msgid "Authentication is required to send force renew message."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб надіслати повідомлення щодо примусового " "Для надсилання повідомлення щодо примусового оновлення слід пройти "
"оновлення" "розпізнавання."
#: src/network/org.freedesktop.network1.policy:154 #: src/network/org.freedesktop.network1.policy:154
msgid "Renew dynamic addresses" msgid "Renew dynamic addresses"
@ -805,7 +818,7 @@ msgstr "Інспектування образу портативної служ
#: src/portable/org.freedesktop.portable1.policy:14 #: src/portable/org.freedesktop.portable1.policy:14
msgid "Authentication is required to inspect a portable service image." msgid "Authentication is required to inspect a portable service image."
msgstr "Потрібна автентифікація, щоб інспектувати образ портативної служби." msgstr "Для інспектування образу портативної служби слід пройти розпізнавання."
#: src/portable/org.freedesktop.portable1.policy:23 #: src/portable/org.freedesktop.portable1.policy:23
msgid "Attach or detach a portable service image" msgid "Attach or detach a portable service image"
@ -815,7 +828,8 @@ msgstr "Долучення або вилучення образу портати
msgid "" msgid ""
"Authentication is required to attach or detach a portable service image." "Authentication is required to attach or detach a portable service image."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб долучити або вилучити образ портативної служби." "Для долучення або вилучення образу портативної служби слід пройти "
"розпізнавання."
#: src/portable/org.freedesktop.portable1.policy:34 #: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image" msgid "Delete or modify portable service image"
@ -825,24 +839,24 @@ msgstr "Вилучення або внесення змін до образу п
msgid "" msgid ""
"Authentication is required to delete or modify a portable service image." "Authentication is required to delete or modify a portable service image."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб вилучити образ портативної служби або внести до " "Для вилучення образу портативної служби або внесення до нього змін слід "
"нього зміни." "пройти розпізнавання."
#: src/resolve/org.freedesktop.resolve1.policy:22 #: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service" msgid "Register a DNS-SD service"
msgstr "Зареєструвати службу DNS-SD" msgstr "Реєстрація служби DNS-SD"
#: src/resolve/org.freedesktop.resolve1.policy:23 #: src/resolve/org.freedesktop.resolve1.policy:23
msgid "Authentication is required to register a DNS-SD service" msgid "Authentication is required to register a DNS-SD service"
msgstr "Потрібна автентифікація, щоб зареєструвати службу DNS-SD" msgstr "Для реєстрації служби DNS-SD слід пройти розпізнавання"
#: src/resolve/org.freedesktop.resolve1.policy:33 #: src/resolve/org.freedesktop.resolve1.policy:33
msgid "Unregister a DNS-SD service" msgid "Unregister a DNS-SD service"
msgstr "Зняти з реєстрації службу DNS-SD" msgstr "Зняття з реєстрації служби DNS-SD"
#: src/resolve/org.freedesktop.resolve1.policy:34 #: src/resolve/org.freedesktop.resolve1.policy:34
msgid "Authentication is required to unregister a DNS-SD service" msgid "Authentication is required to unregister a DNS-SD service"
msgstr "Потрібна автентифікація, щоб зняти з реєстрації службу DNS-SD" msgstr "Для зняття з реєстрації служби DNS-SD слід пройти розпізнавання"
#: src/resolve/org.freedesktop.resolve1.policy:132 #: src/resolve/org.freedesktop.resolve1.policy:132
msgid "Revert name resolution settings" msgid "Revert name resolution settings"
@ -856,89 +870,88 @@ msgstr ""
#: src/timedate/org.freedesktop.timedate1.policy:22 #: src/timedate/org.freedesktop.timedate1.policy:22
msgid "Set system time" msgid "Set system time"
msgstr "Вказати системний час" msgstr "Встановлення загальносистемного часу"
#: src/timedate/org.freedesktop.timedate1.policy:23 #: src/timedate/org.freedesktop.timedate1.policy:23
msgid "Authentication is required to set the system time." msgid "Authentication is required to set the system time."
msgstr "Потрібна автентифікація, щоб вказати системний час." msgstr "Для встановлення загальносистемного часу слід пройти розпізнавання."
#: src/timedate/org.freedesktop.timedate1.policy:33 #: src/timedate/org.freedesktop.timedate1.policy:33
msgid "Set system timezone" msgid "Set system timezone"
msgstr "Вказати системний часовий пояс" msgstr "Встановлення загальносистемного часового поясу"
#: src/timedate/org.freedesktop.timedate1.policy:34 #: src/timedate/org.freedesktop.timedate1.policy:34
msgid "Authentication is required to set the system timezone." msgid "Authentication is required to set the system timezone."
msgstr "Потрібна автентифікація, щоб вказати системний часовий пояс." msgstr ""
"Для встановлення загальносистемного часового поясу слід пройти розпізнавання."
#: src/timedate/org.freedesktop.timedate1.policy:43 #: src/timedate/org.freedesktop.timedate1.policy:43
msgid "Set RTC to local timezone or UTC" msgid "Set RTC to local timezone or UTC"
msgstr "Вкажіть RTC для локального часового поясу або UTC" msgstr "Встановлення для RTC місцевого часового поясу або UTC"
#: src/timedate/org.freedesktop.timedate1.policy:44 #: src/timedate/org.freedesktop.timedate1.policy:44
msgid "" msgid ""
"Authentication is required to control whether the RTC stores the local or " "Authentication is required to control whether the RTC stores the local or "
"UTC time." "UTC time."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб контролювати, чи зберігає RTC локальний час або " "Для керування тим, зберігатиме годинник реального часу локальний час чи час "
"UTC." "UTC, слід пройти розпізнавання."
#: src/timedate/org.freedesktop.timedate1.policy:53 #: src/timedate/org.freedesktop.timedate1.policy:53
msgid "Turn network time synchronization on or off" msgid "Turn network time synchronization on or off"
msgstr "Увімкнути або вимкнути синхронізування часу через мережу" msgstr "Вмикання або вимикання синхронізації часу за допомогою мережі"
#: src/timedate/org.freedesktop.timedate1.policy:54 #: src/timedate/org.freedesktop.timedate1.policy:54
msgid "" msgid ""
"Authentication is required to control whether network time synchronization " "Authentication is required to control whether network time synchronization "
"shall be enabled." "shall be enabled."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб контролювати, чи синхронізування часу через " "Для керування тим, чи слід вмикати синхронізацію часу за допомогою мережі, "
"мережу запущено." "слід пройти розпізнавання."
#: src/core/dbus-unit.c:362 #: src/core/dbus-unit.c:362
msgid "Authentication is required to start '$(unit)'." msgid "Authentication is required to start '$(unit)'."
msgstr "Потрібна автентифікація, щоб запустити «$(unit)»." msgstr "Для запуску «$(unit)» слід пройти розпізнавання."
#: src/core/dbus-unit.c:363 #: src/core/dbus-unit.c:363
msgid "Authentication is required to stop '$(unit)'." msgid "Authentication is required to stop '$(unit)'."
msgstr "Потрібна автентифікація, щоб зупинити «$(unit)»." msgstr "Для зупинення «$(unit)» слід пройти розпізнавання."
#: src/core/dbus-unit.c:364 #: src/core/dbus-unit.c:364
msgid "Authentication is required to reload '$(unit)'." msgid "Authentication is required to reload '$(unit)'."
msgstr "Потрібна автентифікація, щоб перезавантажити «$(unit)»." msgstr "Для перезавантаження «$(unit)» слід пройти розпізнавання."
#: src/core/dbus-unit.c:365 src/core/dbus-unit.c:366 #: src/core/dbus-unit.c:365 src/core/dbus-unit.c:366
msgid "Authentication is required to restart '$(unit)'." msgid "Authentication is required to restart '$(unit)'."
msgstr "Потрібна автентифікація, щоб перезапустити «$(unit)»." msgstr "Для перезапуску «$(unit)» слід пройти розпізнавання."
#: src/core/dbus-unit.c:538 #: src/core/dbus-unit.c:538
msgid "" msgid ""
"Authentication is required to send a UNIX signal to the processes of " "Authentication is required to send a UNIX signal to the processes of "
"'$(unit)'." "'$(unit)'."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб надіслати сигнал UNIX до процесів «$(unit)»." "Для надсилання сигналу UNIX до процесів «$(unit)» слід пройти розпізнавання."
#: src/core/dbus-unit.c:569 #: src/core/dbus-unit.c:569
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'." msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
msgstr "Потрібна автентифікація, щоб скинути «пошкоджений» стан з «$(unit)»." msgstr ""
"Для скидання «пошкодженого» стану з «$(unit)» слід пройти розпізнавання."
#: src/core/dbus-unit.c:602 #: src/core/dbus-unit.c:602
msgid "Authentication is required to set properties on '$(unit)'." msgid "Authentication is required to set properties on '$(unit)'."
msgstr "Потрібна автентифікація, щоб вказати властивості на «$(unit)»." msgstr "Для визначення властивостей на «$(unit)» слід пройти розпізнавання."
#: src/core/dbus-unit.c:711 #: src/core/dbus-unit.c:711
msgid "" msgid ""
"Authentication is required to delete files and directories associated with " "Authentication is required to delete files and directories associated with "
"'$(unit)'." "'$(unit)'."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб вилучити файли і каталоги, які пов'язано із " "Для вилучення файлів і каталогів, які пов'язано із «$(unit)», слід пройти "
"«$(unit)»." "розпізнавання."
#: src/core/dbus-unit.c:760 #: src/core/dbus-unit.c:760
#, fuzzy
#| msgid ""
#| "Authentication is required to send a UNIX signal to the processes of "
#| "'$(unit)'."
msgid "" msgid ""
"Authentication is required to freeze or thaw the processes of '$(unit)' unit." "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
msgstr "" msgstr ""
"Потрібна автентифікація, щоб надіслати сигнал UNIX до процесів «$(unit)»." "Для замороження або розмороження процесів модуля «$(unit)» слід пройти "
"розпізнавання."

View File

@ -736,6 +736,10 @@ static bool device_is_ready(sd_device *dev) {
if (device_is_renaming(dev) > 0) if (device_is_renaming(dev) > 0)
return false; return false;
/* Is it really tagged as 'systemd' right now? */
if (sd_device_has_current_tag(dev, "systemd") <= 0)
return false;
if (sd_device_get_property_value(dev, "SYSTEMD_READY", &ready) < 0) if (sd_device_get_property_value(dev, "SYSTEMD_READY", &ready) < 0)
return true; return true;

View File

@ -77,7 +77,7 @@ enum {
META_ARGV_UID, /* %u: as seen in the initial user namespace */ META_ARGV_UID, /* %u: as seen in the initial user namespace */
META_ARGV_GID, /* %g: as seen in the initial user namespace */ META_ARGV_GID, /* %g: as seen in the initial user namespace */
META_ARGV_SIGNAL, /* %s: number of signal causing dump */ META_ARGV_SIGNAL, /* %s: number of signal causing dump */
META_ARGV_TIMESTAMP, /* %t: time of dump, expressed as seconds since the Epoch */ META_ARGV_TIMESTAMP, /* %t: time of dump, expressed as seconds since the Epoch (we expand this to µs granularity) */
META_ARGV_RLIMIT, /* %c: core file size soft resource limit */ META_ARGV_RLIMIT, /* %c: core file size soft resource limit */
META_ARGV_HOSTNAME, /* %h: hostname */ META_ARGV_HOSTNAME, /* %h: hostname */
_META_ARGV_MAX, _META_ARGV_MAX,
@ -311,7 +311,7 @@ static int make_filename(const Context *context, char **ret) {
return -ENOMEM; return -ENOMEM;
if (asprintf(ret, if (asprintf(ret,
"/var/lib/systemd/coredump/core.%s.%s." SD_ID128_FORMAT_STR ".%s.%s000000", "/var/lib/systemd/coredump/core.%s.%s." SD_ID128_FORMAT_STR ".%s.%s",
c, c,
u, u,
SD_ID128_FORMAT_VAL(boot), SD_ID128_FORMAT_VAL(boot),
@ -1016,8 +1016,11 @@ static int send_iovec(const struct iovec_wrapper *iovw, int input_fd) {
return 0; return 0;
} }
static int gather_pid_metadata_from_argv(struct iovec_wrapper *iovw, Context *context, static int gather_pid_metadata_from_argv(
struct iovec_wrapper *iovw,
Context *context,
int argc, char **argv) { int argc, char **argv) {
_cleanup_free_ char *free_timestamp = NULL; _cleanup_free_ char *free_timestamp = NULL;
int i, r, signo; int i, r, signo;
char *t; char *t;
@ -1035,6 +1038,7 @@ static int gather_pid_metadata_from_argv(struct iovec_wrapper *iovw, Context *co
t = argv[i]; t = argv[i];
switch (i) { switch (i) {
case META_ARGV_TIMESTAMP: case META_ARGV_TIMESTAMP:
/* The journal fields contain the timestamp padded with six /* The journal fields contain the timestamp padded with six
* zeroes, so that the kernel-supplied 1s granularity timestamps * zeroes, so that the kernel-supplied 1s granularity timestamps
@ -1044,12 +1048,14 @@ static int gather_pid_metadata_from_argv(struct iovec_wrapper *iovw, Context *co
if (!t) if (!t)
return log_oom(); return log_oom();
break; break;
case META_ARGV_SIGNAL: case META_ARGV_SIGNAL:
/* For signal, record its pretty name too */ /* For signal, record its pretty name too */
if (safe_atoi(argv[i], &signo) >= 0 && SIGNAL_VALID(signo)) if (safe_atoi(argv[i], &signo) >= 0 && SIGNAL_VALID(signo))
(void) iovw_put_string_field(iovw, "COREDUMP_SIGNAL_NAME=SIG", (void) iovw_put_string_field(iovw, "COREDUMP_SIGNAL_NAME=SIG",
signal_to_string(signo)); signal_to_string(signo));
break; break;
default: default:
break; break;
} }

View File

@ -93,7 +93,7 @@ static bool press_any_key(void) {
static void print_welcome(void) { static void print_welcome(void) {
_cleanup_free_ char *pretty_name = NULL, *ansi_color = NULL; _cleanup_free_ char *pretty_name = NULL, *ansi_color = NULL;
static bool done = false; static bool done = false;
const char *pn; const char *pn, *ac;
int r; int r;
if (!arg_welcome) if (!arg_welcome)
@ -112,9 +112,10 @@ static void print_welcome(void) {
"Failed to read os-release file, ignoring: %m"); "Failed to read os-release file, ignoring: %m");
pn = isempty(pretty_name) ? "Linux" : pretty_name; pn = isempty(pretty_name) ? "Linux" : pretty_name;
ac = isempty(ansi_color) ? "0" : ansi_color;
if (colors_enabled()) if (colors_enabled())
printf("\nWelcome to your new installation of \x1B[%sm%s\x1B[0m!\n", ansi_color, pn); printf("\nWelcome to your new installation of \x1B[%sm%s\x1B[0m!\n", ac, pn);
else else
printf("\nWelcome to your new installation of %s!\n", pn); printf("\nWelcome to your new installation of %s!\n", pn);

View File

@ -81,6 +81,7 @@ int import_fork_tar_x(const char *path, pid_t *ret) {
if (r == 0) { if (r == 0) {
const char *cmdline[] = { const char *cmdline[] = {
"tar", "tar",
"--ignore-zeros",
"--numeric-owner", "--numeric-owner",
"-C", path, "-C", path,
"-px", "-px",

View File

@ -728,4 +728,8 @@ global:
sd_event_source_set_time_relative; sd_event_source_set_time_relative;
sd_bus_error_has_names_sentinel; sd_bus_error_has_names_sentinel;
sd_device_get_current_tag_first;
sd_device_get_current_tag_next;
sd_device_has_current_tag;
} LIBSYSTEMD_246; } LIBSYSTEMD_246;

View File

@ -28,10 +28,10 @@ struct sd_device {
Set *sysattrs; /* names of sysattrs */ Set *sysattrs; /* names of sysattrs */
Iterator sysattrs_iterator; Iterator sysattrs_iterator;
Set *tags; Set *all_tags, *current_tags;
Iterator tags_iterator; Iterator all_tags_iterator, current_tags_iterator;
uint64_t all_tags_iterator_generation, current_tags_iterator_generation; /* generation when iteration was started */
uint64_t tags_generation; /* changes whenever the tags are changed */ uint64_t tags_generation; /* changes whenever the tags are changed */
uint64_t tags_iterator_generation; /* generation when iteration was started */
Set *devlinks; Set *devlinks;
Iterator devlinks_iterator; Iterator devlinks_iterator;
@ -71,7 +71,7 @@ struct sd_device {
bool parent_set:1; /* no need to try to reload parent */ bool parent_set:1; /* no need to try to reload parent */
bool sysattrs_read:1; /* don't try to re-read sysattrs once read */ bool sysattrs_read:1; /* don't try to re-read sysattrs once read */
bool property_tags_outdated:1; /* need to update TAGS= property */ bool property_tags_outdated:1; /* need to update TAGS= or CURRENT_TAGS= property */
bool property_devlinks_outdated:1; /* need to update DEVLINKS= property */ bool property_devlinks_outdated:1; /* need to update DEVLINKS= property */
bool properties_buf_outdated:1; /* need to reread hashmap */ bool properties_buf_outdated:1; /* need to reread hashmap */
bool sysname_set:1; /* don't reread sysname */ bool sysname_set:1; /* don't reread sysname */

View File

@ -329,7 +329,7 @@ static int device_amend(sd_device *device, const char *key, const char *value) {
if (r < 0) if (r < 0)
return log_device_debug_errno(device, r, "sd-device: Failed to add devlink '%s': %m", devlink); return log_device_debug_errno(device, r, "sd-device: Failed to add devlink '%s': %m", devlink);
} }
} else if (streq(key, "TAGS")) { } else if (STR_IN_SET(key, "TAGS", "CURRENT_TAGS")) {
const char *word, *state; const char *word, *state;
size_t l; size_t l;
@ -339,10 +339,11 @@ static int device_amend(sd_device *device, const char *key, const char *value) {
(void) strncpy(tag, word, l); (void) strncpy(tag, word, l);
tag[l] = '\0'; tag[l] = '\0';
r = device_add_tag(device, tag); r = device_add_tag(device, tag, streq(key, "CURRENT_TAGS"));
if (r < 0) if (r < 0)
return log_device_debug_errno(device, r, "sd-device: Failed to add tag '%s': %m", tag); return log_device_debug_errno(device, r, "sd-device: Failed to add tag '%s': %m", tag);
} }
} else { } else {
r = device_add_property_internal(device, key, value); r = device_add_property_internal(device, key, value);
if (r < 0) if (r < 0)
@ -759,8 +760,8 @@ int device_copy_properties(sd_device *device_dst, sd_device *device_src) {
void device_cleanup_tags(sd_device *device) { void device_cleanup_tags(sd_device *device) {
assert(device); assert(device);
set_free_free(device->tags); device->all_tags = set_free_free(device->all_tags);
device->tags = NULL; device->current_tags = set_free_free(device->current_tags);
device->property_tags_outdated = true; device->property_tags_outdated = true;
device->tags_generation++; device->tags_generation++;
} }
@ -778,7 +779,7 @@ void device_remove_tag(sd_device *device, const char *tag) {
assert(device); assert(device);
assert(tag); assert(tag);
free(set_remove(device->tags, tag)); free(set_remove(device->current_tags, tag));
device->property_tags_outdated = true; device->property_tags_outdated = true;
device->tags_generation++; device->tags_generation++;
} }
@ -846,7 +847,10 @@ static bool device_has_info(sd_device *device) {
if (!ordered_hashmap_isempty(device->properties_db)) if (!ordered_hashmap_isempty(device->properties_db))
return true; return true;
if (!set_isempty(device->tags)) if (!set_isempty(device->all_tags))
return true;
if (!set_isempty(device->current_tags))
return true; return true;
if (device->watch_handle >= 0) if (device->watch_handle >= 0)
@ -939,7 +943,10 @@ int device_update_db(sd_device *device) {
fprintf(f, "E:%s=%s\n", property, value); fprintf(f, "E:%s=%s\n", property, value);
FOREACH_DEVICE_TAG(device, tag) FOREACH_DEVICE_TAG(device, tag)
fprintf(f, "G:%s\n", tag); fprintf(f, "G:%s\n", tag); /* Any tag */
SET_FOREACH(tag, device->current_tags, i)
fprintf(f, "Q:%s\n", tag); /* Current tag */
} }
r = fflush_and_check(f); r = fflush_and_check(f);

View File

@ -45,7 +45,7 @@ void device_set_devlink_priority(sd_device *device, int priority);
int device_ensure_usec_initialized(sd_device *device, sd_device *device_old); int device_ensure_usec_initialized(sd_device *device, sd_device *device_old);
int device_add_devlink(sd_device *device, const char *devlink); int device_add_devlink(sd_device *device, const char *devlink);
int device_add_property(sd_device *device, const char *property, const char *value); int device_add_property(sd_device *device, const char *property, const char *value);
int device_add_tag(sd_device *device, const char *tag); int device_add_tag(sd_device *device, const char *tag, bool both);
void device_remove_tag(sd_device *device, const char *tag); void device_remove_tag(sd_device *device, const char *tag);
void device_cleanup_tags(sd_device *device); void device_cleanup_tags(sd_device *device);
void device_cleanup_devlinks(sd_device *device); void device_cleanup_devlinks(sd_device *device);

View File

@ -11,6 +11,11 @@
tag; \ tag; \
tag = sd_device_get_tag_next(device)) tag = sd_device_get_tag_next(device))
#define FOREACH_DEVICE_CURRENT_TAG(device, tag) \
for (tag = sd_device_get_current_tag_first(device); \
tag; \
tag = sd_device_get_current_tag_next(device))
#define FOREACH_DEVICE_SYSATTR(device, attr) \ #define FOREACH_DEVICE_SYSATTR(device, attr) \
for (attr = sd_device_get_sysattr_first(device); \ for (attr = sd_device_get_sysattr_first(device); \
attr; \ attr; \

View File

@ -69,7 +69,8 @@ static sd_device *device_free(sd_device *device) {
ordered_hashmap_free_free_free(device->properties_db); ordered_hashmap_free_free_free(device->properties_db);
hashmap_free_free_free(device->sysattr_values); hashmap_free_free_free(device->sysattr_values);
set_free(device->sysattrs); set_free(device->sysattrs);
set_free(device->tags); set_free(device->all_tags);
set_free(device->current_tags);
set_free(device->devlinks); set_free(device->devlinks);
return mfree(device); return mfree(device);
@ -1062,8 +1063,8 @@ static bool is_valid_tag(const char *tag) {
return !strchr(tag, ':') && !strchr(tag, ' '); return !strchr(tag, ':') && !strchr(tag, ' ');
} }
int device_add_tag(sd_device *device, const char *tag) { int device_add_tag(sd_device *device, const char *tag, bool both) {
int r; int r, added;
assert(device); assert(device);
assert(tag); assert(tag);
@ -1071,9 +1072,21 @@ int device_add_tag(sd_device *device, const char *tag) {
if (!is_valid_tag(tag)) if (!is_valid_tag(tag))
return -EINVAL; return -EINVAL;
r = set_put_strdup(&device->tags, tag); /* Definitely add to the "all" list of tags (i.e. the sticky list) */
if (r < 0) added = set_put_strdup(&device->all_tags, tag);
if (added < 0)
return added;
/* And optionally, also add it to the current list of tags */
if (both) {
r = set_put_strdup(&device->current_tags, tag);
if (r < 0) {
if (added > 0)
(void) set_remove(device->all_tags, tag);
return r; return r;
}
}
device->tags_generation++; device->tags_generation++;
device->property_tags_outdated = true; device->property_tags_outdated = true;
@ -1151,8 +1164,9 @@ static int handle_db_line(sd_device *device, char key, const char *value) {
assert(value); assert(value);
switch (key) { switch (key) {
case 'G': case 'G': /* Any tag */
r = device_add_tag(device, value); case 'Q': /* Current tag */
r = device_add_tag(device, value, key == 'Q');
if (r < 0) if (r < 0)
return r; return r;
@ -1407,10 +1421,10 @@ _public_ const char *sd_device_get_tag_first(sd_device *device) {
(void) device_read_db(device); (void) device_read_db(device);
device->tags_iterator_generation = device->tags_generation; device->all_tags_iterator_generation = device->tags_generation;
device->tags_iterator = ITERATOR_FIRST; device->all_tags_iterator = ITERATOR_FIRST;
(void) set_iterate(device->tags, &device->tags_iterator, &v); (void) set_iterate(device->all_tags, &device->all_tags_iterator, &v);
return v; return v;
} }
@ -1421,10 +1435,38 @@ _public_ const char *sd_device_get_tag_next(sd_device *device) {
(void) device_read_db(device); (void) device_read_db(device);
if (device->tags_iterator_generation != device->tags_generation) if (device->all_tags_iterator_generation != device->tags_generation)
return NULL; return NULL;
(void) set_iterate(device->tags, &device->tags_iterator, &v); (void) set_iterate(device->all_tags, &device->all_tags_iterator, &v);
return v;
}
_public_ const char *sd_device_get_current_tag_first(sd_device *device) {
void *v;
assert_return(device, NULL);
(void) device_read_db(device);
device->current_tags_iterator_generation = device->tags_generation;
device->current_tags_iterator = ITERATOR_FIRST;
(void) set_iterate(device->current_tags, &device->current_tags_iterator, &v);
return v;
}
_public_ const char *sd_device_get_current_tag_next(sd_device *device) {
void *v;
assert_return(device, NULL);
(void) device_read_db(device);
if (device->current_tags_iterator_generation != device->tags_generation)
return NULL;
(void) set_iterate(device->current_tags, &device->current_tags_iterator, &v);
return v; return v;
} }
@ -1456,6 +1498,31 @@ _public_ const char *sd_device_get_devlink_next(sd_device *device) {
return v; return v;
} }
static char *join_string_set(Set *s) {
size_t ret_allocated = 0, ret_len;
_cleanup_free_ char *ret = NULL;
const char *tag;
Iterator i;
if (!GREEDY_REALLOC(ret, ret_allocated, 2))
return NULL;
strcpy(ret, ":");
ret_len = 1;
SET_FOREACH(tag, s, i) {
char *e;
if (!GREEDY_REALLOC(ret, ret_allocated, ret_len + strlen(tag) + 2))
return NULL;
e = stpcpy(stpcpy(ret + ret_len, tag), ":");
ret_len = e - ret;
}
return TAKE_PTR(ret);
}
int device_properties_prepare(sd_device *device) { int device_properties_prepare(sd_device *device) {
int r; int r;
@ -1494,26 +1561,27 @@ int device_properties_prepare(sd_device *device) {
if (device->property_tags_outdated) { if (device->property_tags_outdated) {
_cleanup_free_ char *tags = NULL; _cleanup_free_ char *tags = NULL;
size_t tags_allocated = 0, tags_len = 0;
const char *tag;
if (!GREEDY_REALLOC(tags, tags_allocated, 2)) tags = join_string_set(device->all_tags);
if (!tags)
return -ENOMEM; return -ENOMEM;
stpcpy(tags, ":");
tags_len++;
for (tag = sd_device_get_tag_first(device); tag; tag = sd_device_get_tag_next(device)) {
char *e;
if (!GREEDY_REALLOC(tags, tags_allocated, tags_len + strlen(tag) + 2))
return -ENOMEM;
e = stpcpy(stpcpy(tags + tags_len, tag), ":");
tags_len = e - tags;
}
if (!streq(tags, ":")) {
r = device_add_property_internal(device, "TAGS", tags); r = device_add_property_internal(device, "TAGS", tags);
if (r < 0) if (r < 0)
return r; return r;
}
free(tags);
tags = join_string_set(device->current_tags);
if (!tags)
return -ENOMEM;
if (!streq(tags, ":")) {
r = device_add_property_internal(device, "CURRENT_TAGS", tags);
if (r < 0)
return r;
}
device->property_tags_outdated = false; device->property_tags_outdated = false;
} }
@ -1689,7 +1757,16 @@ _public_ int sd_device_has_tag(sd_device *device, const char *tag) {
(void) device_read_db(device); (void) device_read_db(device);
return !!set_contains(device->tags, tag); return set_contains(device->all_tags, tag);
}
_public_ int sd_device_has_current_tag(sd_device *device, const char *tag) {
assert_return(device, -EINVAL);
assert_return(tag, -EINVAL);
(void) device_read_db(device);
return set_contains(device->current_tags, tag);
} }
_public_ int sd_device_get_property_value(sd_device *device, const char *key, const char **_value) { _public_ int sd_device_get_property_value(sd_device *device, const char *key, const char **_value) {

View File

@ -56,12 +56,13 @@ struct udev_device {
struct udev_list *properties; struct udev_list *properties;
uint64_t properties_generation; uint64_t properties_generation;
struct udev_list *tags; struct udev_list *all_tags, *current_tags;
uint64_t tags_generation; uint64_t all_tags_generation, current_tags_generation;
struct udev_list *devlinks; struct udev_list *devlinks;
uint64_t devlinks_generation; uint64_t devlinks_generation;
bool properties_read:1; bool properties_read:1;
bool tags_read:1; bool all_tags_read:1;
bool current_tags_read:1;
bool devlinks_read:1; bool devlinks_read:1;
struct udev_list *sysattrs; struct udev_list *sysattrs;
bool sysattrs_read; bool sysattrs_read;
@ -199,7 +200,7 @@ _public_ const char *udev_device_get_property_value(struct udev_device *udev_dev
} }
struct udev_device *udev_device_new(struct udev *udev, sd_device *device) { struct udev_device *udev_device_new(struct udev *udev, sd_device *device) {
_cleanup_(udev_list_freep) struct udev_list *properties = NULL, *tags = NULL, *sysattrs = NULL, *devlinks = NULL; _cleanup_(udev_list_freep) struct udev_list *properties = NULL, *all_tags = NULL, *current_tags = NULL, *sysattrs = NULL, *devlinks = NULL;
struct udev_device *udev_device; struct udev_device *udev_device;
assert(device); assert(device);
@ -207,8 +208,11 @@ struct udev_device *udev_device_new(struct udev *udev, sd_device *device) {
properties = udev_list_new(true); properties = udev_list_new(true);
if (!properties) if (!properties)
return_with_errno(NULL, ENOMEM); return_with_errno(NULL, ENOMEM);
tags = udev_list_new(true); all_tags = udev_list_new(true);
if (!tags) if (!all_tags)
return_with_errno(NULL, ENOMEM);
current_tags = udev_list_new(true);
if (!current_tags)
return_with_errno(NULL, ENOMEM); return_with_errno(NULL, ENOMEM);
sysattrs = udev_list_new(true); sysattrs = udev_list_new(true);
if (!sysattrs) if (!sysattrs)
@ -226,7 +230,8 @@ struct udev_device *udev_device_new(struct udev *udev, sd_device *device) {
.udev = udev, .udev = udev,
.device = sd_device_ref(device), .device = sd_device_ref(device),
.properties = TAKE_PTR(properties), .properties = TAKE_PTR(properties),
.tags = TAKE_PTR(tags), .all_tags = TAKE_PTR(all_tags),
.current_tags = TAKE_PTR(current_tags),
.sysattrs = TAKE_PTR(sysattrs), .sysattrs = TAKE_PTR(sysattrs),
.devlinks = TAKE_PTR(devlinks), .devlinks = TAKE_PTR(devlinks),
}; };
@ -475,7 +480,8 @@ static struct udev_device *udev_device_free(struct udev_device *udev_device) {
udev_list_free(udev_device->properties); udev_list_free(udev_device->properties);
udev_list_free(udev_device->sysattrs); udev_list_free(udev_device->sysattrs);
udev_list_free(udev_device->tags); udev_list_free(udev_device->all_tags);
udev_list_free(udev_device->current_tags);
udev_list_free(udev_device->devlinks); udev_list_free(udev_device->devlinks);
return mfree(udev_device); return mfree(udev_device);
@ -834,21 +840,41 @@ _public_ int udev_device_get_is_initialized(struct udev_device *udev_device) {
_public_ struct udev_list_entry *udev_device_get_tags_list_entry(struct udev_device *udev_device) { _public_ struct udev_list_entry *udev_device_get_tags_list_entry(struct udev_device *udev_device) {
assert_return_errno(udev_device, NULL, EINVAL); assert_return_errno(udev_device, NULL, EINVAL);
if (device_get_tags_generation(udev_device->device) != udev_device->tags_generation || if (device_get_tags_generation(udev_device->device) != udev_device->all_tags_generation ||
!udev_device->tags_read) { !udev_device->all_tags_read) {
const char *tag; const char *tag;
udev_list_cleanup(udev_device->tags); udev_list_cleanup(udev_device->all_tags);
FOREACH_DEVICE_TAG(udev_device->device, tag) FOREACH_DEVICE_TAG(udev_device->device, tag)
if (!udev_list_entry_add(udev_device->tags, tag, NULL)) if (!udev_list_entry_add(udev_device->all_tags, tag, NULL))
return_with_errno(NULL, ENOMEM); return_with_errno(NULL, ENOMEM);
udev_device->tags_read = true; udev_device->all_tags_read = true;
udev_device->tags_generation = device_get_tags_generation(udev_device->device); udev_device->all_tags_generation = device_get_tags_generation(udev_device->device);
} }
return udev_list_get_entry(udev_device->tags); return udev_list_get_entry(udev_device->all_tags);
}
_public_ struct udev_list_entry *udev_device_get_current_tags_list_entry(struct udev_device *udev_device) {
assert_return_errno(udev_device, NULL, EINVAL);
if (device_get_tags_generation(udev_device->device) != udev_device->current_tags_generation ||
!udev_device->current_tags_read) {
const char *tag;
udev_list_cleanup(udev_device->current_tags);
FOREACH_DEVICE_CURRENT_TAG(udev_device->device, tag)
if (!udev_list_entry_add(udev_device->current_tags, tag, NULL))
return_with_errno(NULL, ENOMEM);
udev_device->current_tags_read = true;
udev_device->current_tags_generation = device_get_tags_generation(udev_device->device);
}
return udev_list_get_entry(udev_device->current_tags);
} }
/** /**
@ -866,6 +892,12 @@ _public_ int udev_device_has_tag(struct udev_device *udev_device, const char *ta
return sd_device_has_tag(udev_device->device, tag) > 0; return sd_device_has_tag(udev_device->device, tag) > 0;
} }
_public_ int udev_device_has_current_tag(struct udev_device *udev_device, const char *tag) {
assert_return(udev_device, 0);
return sd_device_has_current_tag(udev_device->device, tag) > 0;
}
sd_device *udev_device_get_sd_device(struct udev_device *udev_device) { sd_device *udev_device_get_sd_device(struct udev_device *udev_device) {
assert(udev_device); assert(udev_device);

View File

@ -82,6 +82,7 @@ int udev_device_get_is_initialized(struct udev_device *udev_device);
struct udev_list_entry *udev_device_get_devlinks_list_entry(struct udev_device *udev_device); struct udev_list_entry *udev_device_get_devlinks_list_entry(struct udev_device *udev_device);
struct udev_list_entry *udev_device_get_properties_list_entry(struct udev_device *udev_device); struct udev_list_entry *udev_device_get_properties_list_entry(struct udev_device *udev_device);
struct udev_list_entry *udev_device_get_tags_list_entry(struct udev_device *udev_device); struct udev_list_entry *udev_device_get_tags_list_entry(struct udev_device *udev_device);
struct udev_list_entry *udev_device_get_current_tags_list_entry(struct udev_device *udev_device);
struct udev_list_entry *udev_device_get_sysattr_list_entry(struct udev_device *udev_device); struct udev_list_entry *udev_device_get_sysattr_list_entry(struct udev_device *udev_device);
const char *udev_device_get_property_value(struct udev_device *udev_device, const char *key); const char *udev_device_get_property_value(struct udev_device *udev_device, const char *key);
const char *udev_device_get_driver(struct udev_device *udev_device); const char *udev_device_get_driver(struct udev_device *udev_device);
@ -92,6 +93,7 @@ unsigned long long int udev_device_get_usec_since_initialized(struct udev_device
const char *udev_device_get_sysattr_value(struct udev_device *udev_device, const char *sysattr); const char *udev_device_get_sysattr_value(struct udev_device *udev_device, const char *sysattr);
int udev_device_set_sysattr_value(struct udev_device *udev_device, const char *sysattr, const char *value); int udev_device_set_sysattr_value(struct udev_device *udev_device, const char *sysattr, const char *value);
int udev_device_has_tag(struct udev_device *udev_device, const char *tag); int udev_device_has_tag(struct udev_device *udev_device, const char *tag);
int udev_device_has_current_tag(struct udev_device *udev_device, const char *tag);
/* /*
* udev_monitor * udev_monitor

View File

@ -118,3 +118,9 @@ global:
udev_queue_flush; udev_queue_flush;
udev_queue_get_fd; udev_queue_get_fd;
} LIBUDEV_199; } LIBUDEV_199;
LIBUDEV_247 {
global:
udev_device_has_current_tag;
udev_device_get_current_tags_list_entry;
} LIBUDEV_215;

View File

@ -195,6 +195,10 @@ int devnode_acl_all(const char *seat,
FOREACH_DEVICE(e, d) { FOREACH_DEVICE(e, d) {
const char *node, *sn; const char *node, *sn;
/* Make sure the tag is still in place */
if (sd_device_has_current_tag(d, "uaccess") <= 0)
continue;
if (sd_device_get_property_value(d, "ID_SEAT", &sn) < 0 || isempty(sn)) if (sd_device_get_property_value(d, "ID_SEAT", &sn) < 0 || isempty(sn))
sn = "seat0"; sn = "seat0";

View File

@ -243,7 +243,8 @@ int manager_process_seat_device(Manager *m, sd_device *d) {
assert(m); assert(m);
if (device_for_action(d, DEVICE_ACTION_REMOVE)) { if (device_for_action(d, DEVICE_ACTION_REMOVE) ||
sd_device_has_current_tag(d, "seat") <= 0) {
const char *syspath; const char *syspath;
r = sd_device_get_syspath(d, &syspath); r = sd_device_get_syspath(d, &syspath);
@ -271,7 +272,7 @@ int manager_process_seat_device(Manager *m, sd_device *d) {
} }
seat = hashmap_get(m->seats, sn); seat = hashmap_get(m->seats, sn);
master = sd_device_has_tag(d, "master-of-seat") > 0; master = sd_device_has_current_tag(d, "master-of-seat") > 0;
/* Ignore non-master devices for unknown seats */ /* Ignore non-master devices for unknown seats */
if (!master && !seat) if (!master && !seat)
@ -313,7 +314,8 @@ int manager_process_button_device(Manager *m, sd_device *d) {
if (r < 0) if (r < 0)
return r; return r;
if (device_for_action(d, DEVICE_ACTION_REMOVE)) { if (device_for_action(d, DEVICE_ACTION_REMOVE) ||
sd_device_has_current_tag(d, "power-switch") <= 0) {
b = hashmap_get(m->buttons, sysname); b = hashmap_get(m->buttons, sysname);
if (!b) if (!b)

View File

@ -1361,7 +1361,7 @@ static int attach_device(Manager *m, const char *seat, const char *sysfs) {
if (r < 0) if (r < 0)
return r; return r;
if (sd_device_has_tag(d, "seat") <= 0) if (sd_device_has_current_tag(d, "seat") <= 0)
return -ENODEV; return -ENODEV;
if (sd_device_get_property_value(d, "ID_FOR_SEAT", &id_for_seat) < 0) if (sd_device_get_property_value(d, "ID_FOR_SEAT", &id_for_seat) < 0)

View File

@ -53,14 +53,14 @@ static int show_sysfs_one(
/* Explicitly also check for tag 'seat' here */ /* Explicitly also check for tag 'seat' here */
if (!streq(seat, sn) || if (!streq(seat, sn) ||
sd_device_has_tag(dev_list[*i_dev], "seat") <= 0 || sd_device_has_current_tag(dev_list[*i_dev], "seat") <= 0 ||
sd_device_get_subsystem(dev_list[*i_dev], &subsystem) < 0 || sd_device_get_subsystem(dev_list[*i_dev], &subsystem) < 0 ||
sd_device_get_sysname(dev_list[*i_dev], &sysname) < 0) { sd_device_get_sysname(dev_list[*i_dev], &sysname) < 0) {
(*i_dev)++; (*i_dev)++;
continue; continue;
} }
is_master = sd_device_has_tag(dev_list[*i_dev], "master-of-seat") > 0; is_master = sd_device_has_current_tag(dev_list[*i_dev], "master-of-seat") > 0;
if (sd_device_get_sysattr_value(dev_list[*i_dev], "name", &name) < 0) if (sd_device_get_sysattr_value(dev_list[*i_dev], "name", &name) < 0)
(void) sd_device_get_sysattr_value(dev_list[*i_dev], "id", &name); (void) sd_device_get_sysattr_value(dev_list[*i_dev], "id", &name);
@ -80,7 +80,7 @@ static int show_sysfs_one(
isempty(lookahead_sn)) isempty(lookahead_sn))
lookahead_sn = "seat0"; lookahead_sn = "seat0";
if (streq(seat, lookahead_sn) && sd_device_has_tag(dev_list[lookahead], "seat") > 0) if (streq(seat, lookahead_sn) && sd_device_has_current_tag(dev_list[lookahead], "seat") > 0)
break; break;
} }
} }

View File

@ -809,6 +809,8 @@ static const char *const resolv_conf_mode_table[_RESOLV_CONF_MODE_MAX] = {
DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(resolv_conf_mode, ResolvConfMode, RESOLV_CONF_AUTO); DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(resolv_conf_mode, ResolvConfMode, RESOLV_CONF_AUTO);
int parse_link_journal(const char *s, LinkJournal *ret_mode, bool *ret_try) { int parse_link_journal(const char *s, LinkJournal *ret_mode, bool *ret_try) {
int r;
assert(s); assert(s);
assert(ret_mode); assert(ret_mode);
assert(ret_try); assert(ret_try);
@ -816,9 +818,6 @@ int parse_link_journal(const char *s, LinkJournal *ret_mode, bool *ret_try) {
if (streq(s, "auto")) { if (streq(s, "auto")) {
*ret_mode = LINK_AUTO; *ret_mode = LINK_AUTO;
*ret_try = false; *ret_try = false;
} else if (streq(s, "no")) {
*ret_mode = LINK_NO;
*ret_try = false;
} else if (streq(s, "guest")) { } else if (streq(s, "guest")) {
*ret_mode = LINK_GUEST; *ret_mode = LINK_GUEST;
*ret_try = false; *ret_try = false;
@ -831,8 +830,16 @@ int parse_link_journal(const char *s, LinkJournal *ret_mode, bool *ret_try) {
} else if (streq(s, "try-host")) { } else if (streq(s, "try-host")) {
*ret_mode = LINK_HOST; *ret_mode = LINK_HOST;
*ret_try = true; *ret_try = true;
} else } else {
return -EINVAL; /* Also support boolean values, to make things less confusing. */
r = parse_boolean(s);
if (r < 0)
return r;
/* Let's consider "true" to be equivalent to "auto". */
*ret_mode = r ? LINK_AUTO : LINK_NO;
*ret_try = false;
}
return 0; return 0;
} }

View File

@ -7313,19 +7313,30 @@ static int create_edit_temp_file(const char *new_path, const char *original_path
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to determine temporary filename for \"%s\": %m", new_path); return log_error_errno(r, "Failed to determine temporary filename for \"%s\": %m", new_path);
r = mkdir_parents(new_path, 0755); r = mkdir_parents_label(new_path, 0755);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to create directories for \"%s\": %m", new_path); return log_error_errno(r, "Failed to create directories for \"%s\": %m", new_path);
r = mac_selinux_create_file_prepare(original_path, S_IFREG);
if (r < 0)
return r;
r = copy_file(original_path, t, 0, 0644, 0, 0, COPY_REFLINK); r = copy_file(original_path, t, 0, 0644, 0, 0, COPY_REFLINK);
if (r == -ENOENT) { if (r == -ENOENT) {
r = touch(t); r = touch(t);
mac_selinux_create_file_clear();
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to create temporary file \"%s\": %m", t); return log_error_errno(r, "Failed to create temporary file \"%s\": %m", t);
} else if (r < 0) } else {
mac_selinux_create_file_clear();
if (r < 0)
return log_error_errno(r, "Failed to create temporary file for \"%s\": %m", new_path); return log_error_errno(r, "Failed to create temporary file for \"%s\": %m", new_path);
}
*ret_tmp_fn = TAKE_PTR(t); *ret_tmp_fn = TAKE_PTR(t);
@ -7604,6 +7615,10 @@ static int edit(int argc, char *argv[], void *userdata) {
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to determine unit paths: %m"); return log_error_errno(r, "Failed to determine unit paths: %m");
r = mac_selinux_init();
if (r < 0)
return r;
r = acquire_bus(BUS_MANAGER, &bus); r = acquire_bus(BUS_MANAGER, &bus);
if (r < 0) if (r < 0)
return r; return r;

View File

@ -64,6 +64,8 @@ int sd_device_get_usec_since_initialized(sd_device *device, uint64_t *usec);
const char *sd_device_get_tag_first(sd_device *device); const char *sd_device_get_tag_first(sd_device *device);
const char *sd_device_get_tag_next(sd_device *device); const char *sd_device_get_tag_next(sd_device *device);
const char *sd_device_get_current_tag_first(sd_device *device);
const char *sd_device_get_current_tag_next(sd_device *device);
const char *sd_device_get_devlink_first(sd_device *device); const char *sd_device_get_devlink_first(sd_device *device);
const char *sd_device_get_devlink_next(sd_device *device); const char *sd_device_get_devlink_next(sd_device *device);
const char *sd_device_get_property_first(sd_device *device, const char **value); const char *sd_device_get_property_first(sd_device *device, const char **value);
@ -72,6 +74,7 @@ const char *sd_device_get_sysattr_first(sd_device *device);
const char *sd_device_get_sysattr_next(sd_device *device); const char *sd_device_get_sysattr_next(sd_device *device);
int sd_device_has_tag(sd_device *device, const char *tag); int sd_device_has_tag(sd_device *device, const char *tag);
int sd_device_has_current_tag(sd_device *device, const char *tag);
int sd_device_get_property_value(sd_device *device, const char *key, const char **value); int sd_device_get_property_value(sd_device *device, const char *key, const char **value);
int sd_device_get_sysattr_value(sd_device *device, const char *sysattr, const char **_value); int sd_device_get_sysattr_value(sd_device *device, const char *sysattr, const char **_value);

View File

@ -958,6 +958,24 @@ static int udev_event_on_move(UdevEvent *event) {
return 0; return 0;
} }
static int copy_all_tags(sd_device *d, sd_device *s) {
const char *tag;
int r;
assert(d);
if (!s)
return 0;
for (tag = sd_device_get_tag_first(s); tag; tag = sd_device_get_tag_next(s)) {
r = device_add_tag(d, tag, false);
if (r < 0)
return r;
}
return 0;
}
int udev_event_execute_rules(UdevEvent *event, int udev_event_execute_rules(UdevEvent *event,
usec_t timeout_usec, usec_t timeout_usec,
int timeout_signal, int timeout_signal,
@ -990,6 +1008,10 @@ int udev_event_execute_rules(UdevEvent *event,
if (r < 0) if (r < 0)
return log_device_debug_errno(dev, r, "Failed to clone sd_device object: %m"); return log_device_debug_errno(dev, r, "Failed to clone sd_device object: %m");
r = copy_all_tags(dev, event->dev_db_clone);
if (r < 0)
log_device_warning_errno(dev, r, "Failed to copy all tags from old database entry, ignoring: %m");
if (sd_device_get_devnum(dev, NULL) >= 0) if (sd_device_get_devnum(dev, NULL) >= 0)
/* Disable watch during event processing. */ /* Disable watch during event processing. */
(void) udev_watch_end(event->dev_db_clone); (void) udev_watch_end(event->dev_db_clone);

View File

@ -2017,7 +2017,7 @@ static int udev_rule_apply_token_to_event(
if (token->op == OP_REMOVE) if (token->op == OP_REMOVE)
device_remove_tag(dev, buf); device_remove_tag(dev, buf);
else { else {
r = device_add_tag(dev, buf); r = device_add_tag(dev, buf, true);
if (r < 0) if (r < 0)
return log_rule_error_errno(dev, rules, r, "Failed to add tag '%s': %m", buf); return log_rule_error_errno(dev, rules, r, "Failed to add tag '%s': %m", buf);
} }

View File

@ -0,0 +1 @@
../TEST-01-BASIC/Makefile

8
test/TEST-55-UDEV-TAGS/test.sh Executable file
View File

@ -0,0 +1,8 @@
#!/usr/bin/env bash
set -e
TEST_DESCRIPTION="UDEV tags management"
TEST_NO_NSPAWN=1
. $TEST_BASE_DIR/test-functions
do_test "$@" 55

View File

@ -673,7 +673,7 @@ get_ldpath() {
install_missing_libraries() { install_missing_libraries() {
# install possible missing libraries # install possible missing libraries
for i in $initdir{,/usr}/{sbin,bin}/* $initdir{,/usr}/lib/systemd/{,tests/{,manual/,unsafe/}}*; do for i in $initdir{,/usr}/{sbin,bin}/* $initdir{,/usr}/lib/systemd/{,tests/{,manual/,unsafe/}}*; do
LD_LIBRARY_PATH="${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$(get_ldpath $i)" inst_libs $i LD_LIBRARY_PATH="${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$(get_ldpath $i):$(get_ldpath $i)/src/udev" inst_libs $i
done done
} }

View File

@ -0,0 +1,7 @@
[Unit]
Description=TESTSUITE-55-UDEV-TAGS
[Service]
ExecStartPre=rm -f /failed /testok
ExecStart=/usr/lib/systemd/tests/testdata/units/%N.sh
Type=oneshot

66
test/units/testsuite-55.sh Executable file
View File

@ -0,0 +1,66 @@
#!/bin/bash
set -ex
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 -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"
ACTION=="change", SUBSYSTEM=="mem", KERNEL=="null", TAG+="changed"
EOF
udevadm control --reload
udevadm trigger -c add /dev/null
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 : ; 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 : ; 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
echo OK > /testok
exit 0