From: Timo Sirainen Date: Wed, 29 Oct 2008 18:16:40 +0000 (+0200) Subject: dovecot -n/-a: Print some information about the system. X-Git-Tag: 1.2.alpha4~135 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=61b92ea96e8684084975830a64d5f8cc825a2366;p=thirdparty%2Fdovecot%2Fcore.git dovecot -n/-a: Print some information about the system. --HG-- branch : HEAD --- diff --git a/configure.in b/configure.in index 545ed26e73..77c83f56d4 100644 --- a/configure.in +++ b/configure.in @@ -20,7 +20,7 @@ AC_CHECK_HEADERS(strings.h stdint.h unistd.h dirent.h malloc.h inttypes.h \ sys/quota.h sys/fs/ufs_quota.h ufs/ufs/quota.h jfs/quota.h sys/fs/quota_common.h \ mntent.h sys/mnttab.h sys/event.h sys/time.h sys/mkdev.h linux/dqblk_xfs.h \ xfs/xqm.h sasl.h sasl/sasl.h execinfo.h ucontext.h malloc_np.h sys/utsname.h \ - sys/vmount.h) + sys/vmount.h sys/utsname.h) AC_ARG_ENABLE(ipv6, [ --enable-ipv6 Enable IPv6 support (auto)], diff --git a/src/master/Makefile.am b/src/master/Makefile.am index 8f918e51c5..aae3d7ebc0 100644 --- a/src/master/Makefile.am +++ b/src/master/Makefile.am @@ -32,7 +32,8 @@ dovecot_SOURCES = \ main.c \ master-settings.c \ syslog-util.c \ - ssl-init.c + ssl-init.c \ + sysinfo-get.c noinst_HEADERS = \ auth-process.h \ @@ -49,7 +50,8 @@ noinst_HEADERS = \ master-login-interface.h \ master-settings.h \ syslog-util.h \ - ssl-init.h + ssl-init.h \ + sysinfo-get.h EXTRA_DIST = \ master-settings-defs.c diff --git a/src/master/main.c b/src/master/main.c index 74313d78da..bcb4e1e510 100644 --- a/src/master/main.c +++ b/src/master/main.c @@ -20,6 +20,7 @@ #include "listener.h" #include "ssl-init.h" #include "log.h" +#include "sysinfo-get.h" #include #include @@ -527,6 +528,7 @@ int main(int argc, char *argv[]) } if (dump_config) { + /* print the config file path before parsing it, so in case of errors it's still shown */ printf("# "VERSION": %s\n", configfile); @@ -541,6 +543,12 @@ int main(int argc, char *argv[]) } T_END; if (dump_config) { + const char *info; + + info = sysinfo_get(settings_root->defaults->mail_location); + if (*info != '\0') + printf("# %s\n", info); + master_settings_dump(settings_root, dump_config_nondefaults); return 0; } diff --git a/src/master/sysinfo-get.c b/src/master/sysinfo-get.c new file mode 100644 index 0000000000..431774cd15 --- /dev/null +++ b/src/master/sysinfo-get.c @@ -0,0 +1,118 @@ +/* Copyright (c) 2008 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "home-expand.h" +#include "mountpoint.h" +#include "strescape.h" +#include "sysinfo-get.h" + +#include +#include +#include +#ifdef HAVE_SYS_UTSNAME_H +# include +#endif + +static bool readfile(const char *path, const char **data_r) +{ + char buf[1024]; + int fd, ret; + + fd = open(path, O_RDONLY); + if (fd == -1) + return FALSE; + ret = read(fd, buf, sizeof(buf)); + (void)close(fd); + if (ret <= 0) + return FALSE; + + *data_r = t_strndup(buf, ret); + return TRUE; +} + +static bool lsb_distro_get(const char *path, const char **name_r) +{ + const char *data, *const *p, *str, *end; + + if (!readfile(path, &data)) + return FALSE; + + for (p = t_strsplit(data, "\n"); *p != '\0'; p++) { + if (strncmp(*p, "DISTRIB_DESCRIPTION=", 20) == 0) + break; + } + if (*p == '\0') + return FALSE; + + str = t_strcut(*p + 20, '\n'); + if (*str != '"') + *name_r = str; + else { + end = strrchr(++str, '"'); + *name_r = str_unescape(p_strdup_until(unsafe_data_stack_pool, + str, end)); + } + return TRUE; +} + +static const char *distro_get(void) +{ + static const char *files[] = { + "", "/etc/redhat-release", + "", "/etc/SuSE-release", + "", "/etc/mandriva-release", + "", "/etc/fedora-release", + "Debian ", "/etc/debian_version", + NULL + }; + const char *name; + unsigned int i; + + if (lsb_distro_get("/etc/lsb-release", &name)) + return name; + for (i = 0; files[i] != NULL; i += 2) { + if (readfile(files[i+1], &name)) { + return t_strconcat(files[i], t_strcut(name, '\n'), + NULL); + } + } + return ""; +} + +static const char *filesystem_get(const char *mail_location) +{ + struct mountpoint mp; + const char *path; + + path = strchr(mail_location, ':'); + if (path == NULL) + path = mail_location; + else + path = t_strcut(path + 1, ':'); + path = home_expand(path); + + if (mountpoint_get(path, pool_datastack_create(), &mp) < 0) + return ""; + return mp.type == NULL ? "" : mp.type; +} + +const char *sysinfo_get(const char *mail_location) +{ + const char *distro = "", *fs, *uname_info = ""; +#ifdef HAVE_SYS_UTSNAME_H + struct utsname u; + + if (uname(&u) < 0) + i_error("uname() failed: %m"); + else { + uname_info = t_strdup_printf("%s %s %s", + u.sysname, u.release, u.machine); + } + if (strcmp(u.sysname, "Linux") == 0) + distro = distro_get(); +#endif + fs = filesystem_get(mail_location); + if (*uname_info == '\0' && *distro == '\0' && *fs == '\0') + return ""; + return t_strdup_printf("OS: %s %s %s %s %s", u.sysname, u.release, u.machine, distro, fs); +} diff --git a/src/master/sysinfo-get.h b/src/master/sysinfo-get.h new file mode 100644 index 0000000000..0f319cbcc1 --- /dev/null +++ b/src/master/sysinfo-get.h @@ -0,0 +1,6 @@ +#ifndef SYSINFO_GET_H +#define SYSINFO_GET_H + +const char *sysinfo_get(const char *mail_location); + +#endif