]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
debug-generator: enable custom systemd.debug_shell tty
authorJan Synacek <jsynacek@redhat.com>
Thu, 25 Apr 2019 10:19:16 +0000 (12:19 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 2 Jul 2019 07:51:27 +0000 (09:51 +0200)
man/custom-entities.ent.in
man/systemd-debug-generator.xml
meson.build
src/debug-generator/debug-generator.c

index e2bd44e5e785b68f84fceb7334e9b80bc2fa56ab..85805777a0d57727973802d0a26d6b7d3333ccb2 100644 (file)
@@ -8,3 +8,4 @@
 <!ENTITY CERTIFICATE_ROOT @CERTIFICATE_ROOT@>
 <!ENTITY MEMORY_ACCOUNTING_DEFAULT @MEMORY_ACCOUNTING_DEFAULT_YES_NO@>
 <!ENTITY KILL_USER_PROCESSES @KILL_USER_PROCESSES_YES_NO@>
+<!ENTITY DEBUGTTY @DEBUGTTY@>
index 1f9a79db82f24a7e3bc38151e605b97f6ebcea7c..305dc2ff371bb92020e90673d5426ecb88f7361f 100644 (file)
@@ -1,7 +1,10 @@
 <?xml version="1.0"?>
 <!--*-nxml-*-->
 <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
-  "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+  "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
 <!-- SPDX-License-Identifier: LGPL-2.1+ -->
 <refentry id="systemd-debug-generator">
 
     <option>rd.systemd.debug_shell</option> option is
     specified, the debug shell service
     <literal>debug-shell.service</literal> is pulled into the boot
-    transaction. It will spawn a debug shell on tty9 during early
-    system startup. Note that the shell may also be turned on
-    persistently by enabling it with
+    transaction and a debug shell will be spawned during early boot.
+    By default, <filename>&DEBUGTTY;</filename> is used, but a specific tty can also be set,
+    either with or without the <filename>/dev/</filename> prefix.
+    Note that the shell may also be turned on persistently by enabling it with
     <citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>'s
     <command>enable</command> command.
     <option>rd.systemd.debug_shell=</option> is honored only by initial
index c60c4ab873af499bacf95a2026ebc74c9a3ad3f1..3988fb76bdefb1c29fa2a77b42accbad7667e051 100644 (file)
@@ -789,6 +789,7 @@ conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
 
 substs.set('SUSHELL', get_option('debug-shell'))
 substs.set('DEBUGTTY', get_option('debug-tty'))
+conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
 
 enable_debug_hashmap = false
 enable_debug_mmap_cache = false
index 5faf8d7ddf47ea04a273b0164ccbd45c4fe7fa7c..09220dc98c7310e3c9b68482cafe39e6a0f23cba 100644 (file)
@@ -3,6 +3,7 @@
 #include <unistd.h>
 
 #include "alloc-util.h"
+#include "dropin.h"
 #include "generator.h"
 #include "mkdir.h"
 #include "parse-util.h"
@@ -17,11 +18,12 @@ static const char *arg_dest = NULL;
 static char *arg_default_unit = NULL;
 static char **arg_mask = NULL;
 static char **arg_wants = NULL;
-static bool arg_debug_shell = false;
+static char *arg_debug_shell = NULL;
 
 STATIC_DESTRUCTOR_REGISTER(arg_default_unit, freep);
 STATIC_DESTRUCTOR_REGISTER(arg_mask, strv_freep);
 STATIC_DESTRUCTOR_REGISTER(arg_wants, strv_freep);
+STATIC_DESTRUCTOR_REGISTER(arg_debug_shell, freep);
 
 static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
         int r;
@@ -57,15 +59,16 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
                         return log_oom();
 
         } else if (proc_cmdline_key_streq(key, "systemd.debug_shell")) {
+                const char *t = NULL;
 
-                if (value) {
-                        r = parse_boolean(value);
-                        if (r < 0)
-                                log_error("Failed to parse systemd.debug_shell= argument '%s', ignoring.", value);
-                        else
-                                arg_debug_shell = r;
-                } else
-                        arg_debug_shell = true;
+                r = value ? parse_boolean(value) : 1;
+                if (r < 0)
+                        t = skip_dev_prefix(value);
+                else if (r > 0)
+                        t = skip_dev_prefix(DEBUGTTY);
+
+                if (free_and_strdup(&arg_debug_shell, t) < 0)
+                        return log_oom();
 
         } else if (streq(key, "systemd.unit")) {
 
@@ -143,6 +146,23 @@ static int generate_wants_symlinks(void) {
         return r;
 }
 
+static void install_debug_shell_dropin(const char *dir) {
+        int r;
+
+        if (streq(arg_debug_shell, skip_dev_prefix(DEBUGTTY)))
+                return;
+
+        r = write_drop_in_format(dir, "debug-shell.service", 50, "tty",
+                        "[Unit]\n"
+                        "Description=Early root shell on /dev/%s FOR DEBUGGING ONLY\n"
+                        "ConditionPathExists=\n"
+                        "[Service]\n"
+                        "TTYPath=/dev/%s",
+                        arg_debug_shell, arg_debug_shell);
+        if (r < 0)
+                log_warning_errno(r, "Failed to write drop-in for debug-shell.service, ignoring: %m");
+}
+
 static int run(const char *dest, const char *dest_early, const char *dest_late) {
         int r, q;
 
@@ -156,6 +176,8 @@ static int run(const char *dest, const char *dest_early, const char *dest_late)
                 r = strv_extend(&arg_wants, "debug-shell.service");
                 if (r < 0)
                         return log_oom();
+
+                install_debug_shell_dropin(arg_dest);
         }
 
         r = generate_mask_symlinks();