diff --git a/docs/ENVIRONMENT.md b/docs/ENVIRONMENT.md index 8068d0d33c..5903617296 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 f3c045b99e..029a7f9d88 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 1f720c6442..dc4486490b 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 85c599c5c6..c75f74a6c6 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 940d34775b..c166054919 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 9366ce111d..3279d147e0 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);