]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
condition: introduce systemd.condition-first-boot= kernel command line switch
authorLennart Poettering <lennart@poettering.net>
Thu, 14 May 2020 08:11:56 +0000 (10:11 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 18 May 2020 18:20:50 +0000 (20:20 +0200)
Much like systemd.condition-needs-update= this new switch allows
overriding of a unit file condition, but this time its
ConditionFirstBoot=.

Usecase is also primarily debugging, but could be useful for other
schemes too.

man/kernel-command-line.xml
man/systemd.unit.xml
src/shared/condition.c

index b0cc3fea01c65fdf5c9b9078f03e0f4dec3dc9d5..8a899aee56a24fa1be53589f4037014fce0a04ae 100644 (file)
 
         <listitem><para>Takes a boolean argument, defaults to on. If off,
         <citerefentry><refentrytitle>systemd-firstboot.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
-        will not query the user for basic system settings, even if the system boots up for the first time and the
-        relevant settings are not initialized yet.</para></listitem>
+        will not query the user for basic system settings, even if the system boots up for the first time and
+        the relevant settings are not initialized yet. Not to be confused with
+        <varname>systemd.condition-first-boot=</varname> (see below), which overrides the result of the
+        <varname>ConditionFirstBoot=</varname> unit file condition, and thus controls more than just
+        <filename>systemd-firstboot.service</filename> behaviour.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry> for
         details.</para></listitem>
       </varlistentry>
+
+      <varlistentry>
+        <term><varname>systemd.condition-first-boot=</varname></term>
+
+        <listitem><para>Takes a boolean argument. If specified, overrides the result of
+        <varname>ConditionFirstBoot=</varname> unit condition checks. See
+        <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry> for
+        details. Not to be confused with <varname>systemd.firstboot=</varname> which only controls behaviour
+        of the <filename>systemd-firstboot.service</filename> system service but has no effect on the
+        condition check (see above).</para></listitem>
+      </varlistentry>
     </variablelist>
 
   </refsect1>
index e8563bcc0a08e59d285f459702d90b6355814192..fa8ed1b47bbeb89d113bdbb8779f4b269b9371e9 100644 (file)
           (specifically: an <filename>/etc</filename> with no <filename>/etc/machine-id</filename>). This may
           be used to populate <filename>/etc</filename> on the first boot after factory reset, or when a new
           system instance boots up for the first time.</para>
+
+          <para>If the <varname>systemd.condition-first-boot=</varname> option is specified on the kernel
+          command line (taking a boolean), it will override the result of this condition check, taking
+          precedence over <filename>/etc/machine-id</filename> existence checks.</para>
           </listitem>
         </varlistentry>
 
index b17403855a4b68ef886fbb5b928b4f17089390ee..bf3b5fa1622800a26edfedaf75720bb03d61600c 100644 (file)
@@ -627,11 +627,18 @@ static int condition_test_needs_update(Condition *c, char **env) {
 
 static int condition_test_first_boot(Condition *c, char **env) {
         int r, q;
+        bool b;
 
         assert(c);
         assert(c->parameter);
         assert(c->type == CONDITION_FIRST_BOOT);
 
+        r = proc_cmdline_get_bool("systemd.condition-first-boot", &b);
+        if (r < 0)
+                log_debug_errno(r, "Failed to parse systemd.condition-first-boot= kernel command line argument, ignoring: %m");
+        if (r > 0)
+                return b == !!r;
+
         r = parse_boolean(c->parameter);
         if (r < 0)
                 return r;