803fb7
From 5f273838f41f27e0045395c1677272d9dd12496c Mon Sep 17 00:00:00 2001
803fb7
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
803fb7
Date: Thu, 21 Apr 2016 20:04:21 -0400
803fb7
Subject: [PATCH] systemctl,pid1: do not warn about missing install info with
803fb7
 "preset"
803fb7
803fb7
When "preset" was executed for a unit without install info, we'd warn similarly
803fb7
as for "enable" and "disable". But "preset" is usually called for all units,
803fb7
because the preset files are provided by the distribution, and the units are under
803fb7
control of individual programs, and it's reasonable to call "preset" for all units
803fb7
rather then try to do it only for the ones that can be installed.
803fb7
We also don't warn about missing info for "preset-all". Thus it seems reasonable
803fb7
to silently ignore units w/o install info when presetting.
803fb7
803fb7
(In addition, when more than one unit was specified, we'd issue the warning
803fb7
only if none of them had install info. But this is probably something to fix
803fb7
for enable/disable too.)
803fb7
803fb7
Cherry-picked from: 39207373dd638e548019ddb49929f15795b8b404
803fb7
Resolves: #1373950
803fb7
---
803fb7
 man/systemctl.xml         | 26 +++++++++++++-------------
803fb7
 src/systemctl/systemctl.c |  7 ++++---
803fb7
 2 files changed, 17 insertions(+), 16 deletions(-)
803fb7
803fb7
diff --git a/man/systemctl.xml b/man/systemctl.xml
803fb7
index 2d0678d18..bb21f3a88 100644
803fb7
--- a/man/systemctl.xml
803fb7
+++ b/man/systemctl.xml
803fb7
@@ -1012,22 +1012,22 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
803fb7
           <term><command>preset <replaceable>NAME</replaceable>...</command></term>
803fb7
 
803fb7
           <listitem>
803fb7
-            <para>Reset one or more unit files, as specified on the
803fb7
-            command line, to the defaults configured in the preset
803fb7
-            policy files. This has the same effect as
803fb7
-            <command>disable</command> or <command>enable</command>,
803fb7
-            depending how the unit is listed in the preset files.</para>
803fb7
+            <para>Reset the enable/disable status one or more unit files, as specified on
803fb7
+            the command line, to the defaults configured in the preset policy files. This
803fb7
+            has the same effect as <command>disable</command> or
803fb7
+            <command>enable</command>, depending how the unit is listed in the preset
803fb7
+            files.</para>
803fb7
 
803fb7
-            <para>Use <option>--preset-mode=</option> to control
803fb7
-            whether units shall be enabled and disabled, or only
803fb7
-            enabled, or only disabled.</para>
803fb7
+            <para>Use <option>--preset-mode=</option> to control whether units shall be
803fb7
+            enabled and disabled, or only enabled, or only disabled.</para>
803fb7
+
803fb7
+            <para>If the unit carries no install information, it will be silently ignored
803fb7
+            by this command.</para>
803fb7
 
803fb7
-            <para>For more information on the preset policy format,
803fb7
-            see
803fb7
+            <para>For more information on the preset policy format, see
803fb7
             <citerefentry><refentrytitle>systemd.preset</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
803fb7
-            For more information on the concept of presets, please
803fb7
-            consult the 
803fb7
-            url="http://freedesktop.org/wiki/Software/systemd/Preset">Preset</ulink>
803fb7
+            For more information on the concept of presets, please consult the
803fb7
+            <ulink url="http://freedesktop.org/wiki/Software/systemd/Preset">Preset</ulink>
803fb7
             document.</para>
803fb7
           </listitem>
803fb7
         </varlistentry>
803fb7
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
803fb7
index e4b404abc..e854508d9 100644
803fb7
--- a/src/systemctl/systemctl.c
803fb7
+++ b/src/systemctl/systemctl.c
803fb7
@@ -5367,6 +5367,7 @@ static int enable_unit(sd_bus *bus, char **args) {
803fb7
         UnitFileChange *changes = NULL;
803fb7
         unsigned n_changes = 0;
803fb7
         int carries_install_info = -1;
803fb7
+        bool ignore_carries_install_info = false;
803fb7
         int r;
803fb7
 
803fb7
         if (!args[1])
803fb7
@@ -5404,7 +5405,6 @@ static int enable_unit(sd_bus *bus, char **args) {
803fb7
                         r = unit_file_link(arg_scope, arg_runtime, arg_root, names, arg_force, &changes, &n_changes);
803fb7
                 else if (streq(verb, "preset")) {
803fb7
                         r = unit_file_preset(arg_scope, arg_runtime, arg_root, names, arg_preset_mode, arg_force, &changes, &n_changes);
803fb7
-                        carries_install_info = r;
803fb7
                 } else if (streq(verb, "mask"))
803fb7
                         r = unit_file_mask(arg_scope, arg_runtime, arg_root, names, arg_force, &changes, &n_changes);
803fb7
                 else if (streq(verb, "unmask"))
803fb7
@@ -5424,7 +5424,7 @@ static int enable_unit(sd_bus *bus, char **args) {
803fb7
         } else {
803fb7
                 _cleanup_bus_message_unref_ sd_bus_message *reply = NULL, *m = NULL;
803fb7
                 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
803fb7
-                int expect_carries_install_info = false;
803fb7
+                bool expect_carries_install_info = false;
803fb7
                 bool send_force = true, send_preset_mode = false;
803fb7
                 const char *method;
803fb7
 
803fb7
@@ -5450,6 +5450,7 @@ static int enable_unit(sd_bus *bus, char **args) {
803fb7
                                 method = "PresetUnitFiles";
803fb7
 
803fb7
                         expect_carries_install_info = true;
803fb7
+                        ignore_carries_install_info = true;
803fb7
                 } else if (streq(verb, "mask"))
803fb7
                         method = "MaskUnitFiles";
803fb7
                 else if (streq(verb, "unmask")) {
803fb7
@@ -5515,7 +5516,7 @@ static int enable_unit(sd_bus *bus, char **args) {
803fb7
                         r = 0;
803fb7
         }
803fb7
 
803fb7
-        if (carries_install_info == 0)
803fb7
+        if (carries_install_info == 0 && !ignore_carries_install_info)
803fb7
                 log_warning("The unit files have no [Install] section. They are not meant to be enabled\n"
803fb7
                             "using systemctl.\n"
803fb7
                             "Possible reasons for having this kind of units are:\n"