From d4ffb37bb1a224f0896d86a8a85d9c3924bc0854 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 2 May 2024 17:07:51 +0200 Subject: [PATCH] nspawn, vmspawn, run0: add env var for turning off background tinting Some people are just sad, sad lost souls who don't like even the tiniest ray of color in their life. Let's add an env var knob for allowing them to turn the background tinting off, to drive the last bit of color from their life so that they can stay in their grey grey life. --- docs/ENVIRONMENT.md | 8 ++++++++ src/nspawn/nspawn.c | 2 +- src/run/run.c | 2 +- src/shared/pretty-print.c | 15 +++++++++++++++ src/shared/pretty-print.h | 2 ++ src/vmspawn/vmspawn.c | 2 +- 6 files changed, 28 insertions(+), 3 deletions(-) diff --git a/docs/ENVIRONMENT.md b/docs/ENVIRONMENT.md index 8068d0d33cf..5903617296c 100644 --- a/docs/ENVIRONMENT.md +++ b/docs/ENVIRONMENT.md @@ -705,3 +705,11 @@ Tools using the Varlink protocol (such as `varlinkctl`) or sd-bus (such as placed in a trusted disk image directory (see above), or if suitable polkit authentication was acquired. See `systemd.image-policy(7)` for the valid syntax for image policy strings. + +`systemd-run`, `run0`, `systemd-nspawn`, `systemd-vmspawn`: + +* `$SYSTEMD_TINT_BACKGROUND` – Takes a boolean. When false the automatic + tinting of the background for containers, VMs, and interactive `systemd-run` + and `run0` invocations is turned off. Note that this environment variable has + no effect if the background color is explicitly selected via the relevant + `--background=` switch of the tool. diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index f3c045b99ed..029a7f9d88a 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -5556,7 +5556,7 @@ static int run_container( arg_console_width, arg_console_height); - if (!arg_background) { + if (!arg_background && shall_tint_background()) { _cleanup_free_ char *bg = NULL; r = terminal_tint_color(220 /* blue */, &bg); diff --git a/src/run/run.c b/src/run/run.c index 1f720c64420..dc4486490b0 100644 --- a/src/run/run.c +++ b/src/run/run.c @@ -963,7 +963,7 @@ static int parse_argv_sudo_mode(int argc, char *argv[]) { if (strv_extend(&arg_property, "PAMName=systemd-run0") < 0) return log_oom(); - if (!arg_background && arg_stdio == ARG_STDIO_PTY) { + if (!arg_background && arg_stdio == ARG_STDIO_PTY && shall_tint_background()) { double hue; if (privileged_execution()) diff --git a/src/shared/pretty-print.c b/src/shared/pretty-print.c index 85c599c5c65..c75f74a6c6e 100644 --- a/src/shared/pretty-print.c +++ b/src/shared/pretty-print.c @@ -444,6 +444,21 @@ int terminal_tint_color(double hue, char **ret) { return 0; } +bool shall_tint_background(void) { + static int cache = -1; + + if (cache >= 0) + return cache; + + cache = getenv_bool("SYSTEMD_TINT_BACKGROUND"); + if (cache == -ENXIO) + return (cache = true); + if (cache < 0) + log_debug_errno(cache, "Failed to parse $SYSTEMD_TINT_BACKGROUND, leaving background tinting enabled: %m"); + + return cache != 0; +} + void draw_progress_bar(const char *prefix, double percentage) { fputc('\r', stderr); diff --git a/src/shared/pretty-print.h b/src/shared/pretty-print.h index 940d34775bc..c166054919f 100644 --- a/src/shared/pretty-print.h +++ b/src/shared/pretty-print.h @@ -50,5 +50,7 @@ static inline const char *green_check_mark_internal(char buffer[static GREEN_CHE int terminal_tint_color(double hue, char **ret); +bool shall_tint_background(void); + void draw_progress_bar(const char *prefix, double percentage); void clear_progress_bar(const char *prefix); diff --git a/src/vmspawn/vmspawn.c b/src/vmspawn/vmspawn.c index 9366ce111da..3279d147e05 100644 --- a/src/vmspawn/vmspawn.c +++ b/src/vmspawn/vmspawn.c @@ -1977,7 +1977,7 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) { if (r < 0) return log_error_errno(r, "Failed to create PTY forwarder: %m"); - if (!arg_background) { + if (!arg_background && shall_tint_background()) { _cleanup_free_ char *bg = NULL; r = terminal_tint_color(130 /* green */, &bg);