util: introduce /etc/os-release so that distros don't need to patch systemd to get a welcome message

This commit is contained in:
Lennart Poettering 2010-11-18 04:46:28 +01:00
parent f81c701649
commit 10aa703482
2 changed files with 82 additions and 51 deletions

4
TODO
View File

@ -53,7 +53,7 @@
* readahead: btrfs/LVM SSD detection * readahead: btrfs/LVM SSD detection
* man pages for: locale.conf, vconsole.conf modules-load.d * man pages for: locale.conf, vconsole.conf, modules-load.d, /etc/os-release
* when processes remain in a service even though the start command failed enter active * when processes remain in a service even though the start command failed enter active
@ -71,8 +71,6 @@
* automatically determine TERM= based on tty name even for /dev/console * automatically determine TERM= based on tty name even for /dev/console
* declare /etc/os-release cross-distro standard
* fix hotplug transactions * fix hotplug transactions
* isolate multi-user.target doesn't start a getty@tty1 if we run it from graphical.target * isolate multi-user.target doesn't start a getty@tty1 if we run it from graphical.target

View File

@ -2979,80 +2979,113 @@ void status_printf(const char *format, ...) {
} }
void status_welcome(void) { void status_welcome(void) {
char *pretty_name = NULL, *ansi_color = NULL;
const char *const_pretty = NULL, *const_color = NULL;
int r;
if ((r = parse_env_file("/etc/os-release", NEWLINE,
"PRETTY_NAME", &pretty_name,
"ANSI_COLOR", &ansi_color,
NULL)) < 0) {
if (r != -ENOENT)
log_warning("Failed to read /etc/os-release: %s", strerror(-r));
}
#if defined(TARGET_FEDORA) #if defined(TARGET_FEDORA)
char *r; if (!pretty_name) {
if ((r = read_one_line_file("/etc/system-release", &pretty_name)) < 0) {
if (read_one_line_file("/etc/system-release", &r) < 0) if (r != -ENOENT)
return; log_warning("Failed to read /etc/system-release: %s", strerror(-r));
} else
truncate_nl(pretty_name);
}
truncate_nl(r); if (!ansi_color && pretty_name) {
/* This tries to mimic the color magic the old Red Hat sysinit /* This tries to mimic the color magic the old Red Hat sysinit
* script did. */ * script did. */
if (startswith(r, "Red Hat")) if (startswith(pretty_name, "Red Hat"))
status_printf("Welcome to \x1B[0;31m%s\x1B[0m!\n", r); /* Red for RHEL */ const_color = "0;31"; /* Red for RHEL */
else if (startswith(r, "Fedora")) else if (startswith(pretty_name, "Fedora"))
status_printf("Welcome to \x1B[0;34m%s\x1B[0m!\n", r); /* Blue for Fedora */ const_color = "0;34"; /* Blue for Fedora */
else }
status_printf("Welcome to \x1B[1m%s\x1B[0m!\n", r); /* Highlight for everything else */
free(r);
#elif defined(TARGET_SUSE) #elif defined(TARGET_SUSE)
char *r;
if (read_one_line_file("/etc/SuSE-release", &r) < 0) if (!pretty_name) {
return; if ((r = read_one_line_file("/etc/SuSE-release", &pretty_name)) < 0) {
truncate_nl(r); if (r != -ENOENT)
log_warning("Failed to read /etc/SuSE-release: %s", strerror(-r));
} else
truncate_nl(pretty_name);
}
status_printf("Welcome to \x1B[0;32m%s\x1B[0m!\n", r); /* Green for SUSE */ if (!ansi_color)
free(r); const_color = "0;32"; /* Green for openSUSE */
#elif defined(TARGET_GENTOO) #elif defined(TARGET_GENTOO)
char *r;
if (read_one_line_file("/etc/gentoo-release", &r) < 0) if (!pretty_name) {
return; if ((r = read_one_line_file("/etc/gentoo-release", &pretty_name)) < 0) {
truncate_nl(r); if (r != -ENOENT)
log_warning("Failed to read /etc/gentoo-release: %s", strerror(-r));
} else
truncate_nl(pretty_name);
}
status_printf("Welcome to \x1B[1;34m%s\x1B[0m!\n", r); /* Light Blue for Gentoo */ if (!ansi_color)
const_color = "1;34"; /* Light Blue for Gentoo */
free(r);
#elif defined(TARGET_DEBIAN) #elif defined(TARGET_DEBIAN)
char *r;
if (read_one_line_file("/etc/debian_version", &r) < 0) if (!pretty_name) {
return; if ((r = read_one_line_file("/etc/debian_version", &pretty_name)) < 0) {
truncate_nl(r); if (r != -ENOENT)
log_warning("Failed to read /etc/debian_version: %s", strerror(-r));
} else
truncate_nl(pretty_name);
}
status_printf("Welcome to Debian \x1B[1;31m%s\x1B[0m!\n", r); /* Light Red for Debian */ if (!ansi_color)
const_color = "1;31"; /* Light Red for Debian */
free(r);
#elif defined(TARGET_UBUNTU) #elif defined(TARGET_UBUNTU)
char *desc = NULL;
char *codename = NULL;
if (parse_env_file("/etc/lsb-release", NEWLINE, if ((r = parse_env_file("/etc/lsb-release", NEWLINE,
"DISTRIB_DESCRIPTION", &desc, "DISTRIB_DESCRIPTION", &pretty_name,
"DISTRIB_CODENAME", &codename, NULL) < 0) NULL)) < 0) {
return;
if (desc && codename) if (r != -ENOENT)
/* Light Red for Ubuntu */ log_warning("Failed to read /etc/lsb-release: %s", strerror(-r));
status_printf("Welcome to \x1B[1;31m%s\x1B[0m (%s)\n", }
desc, codename);
free(desc); if (!ansi_color)
free(codename); const_color = "0;33"; /* Orange/Brown for Ubuntu */
#elif defined(TARGET_ARCH) #elif defined(TARGET_ARCH)
status_printf("Welcome to \x1B[1;36mArch Linux\x1B[0m!\n"); /* Cyan for Arch */
#else if (!pretty_name)
#warning "You probably should add a welcome text logic here." const_pretty = "Arch Linux";
if (!ansi_color)
const_color = "1;36"; /* Cyan for Arch */
#endif #endif
if (!pretty_name && !const_pretty)
const_pretty = "Linux";
if (!ansi_color && !const_color)
const_color = "1";
status_printf("Welcome to \x1B[%sm%s\x1B[0m!\n",
const_color ? const_color : ansi_color,
const_pretty ? const_pretty : pretty_name);
} }
char *replace_env(const char *format, char **env) { char *replace_env(const char *format, char **env) {