dovecot-1.1: dovecot -n/-a: Print some information about the sys...
dovecot at dovecot.org
dovecot at dovecot.org
Wed Oct 29 19:34:19 EET 2008
details: http://hg.dovecot.org/dovecot-1.1/rev/7948b25f3790
changeset: 7980:7948b25f3790
user: Timo Sirainen <tss at iki.fi>
date: Wed Oct 29 19:34:12 2008 +0200
description:
dovecot -n/-a: Print some information about the system.
diffstat:
5 files changed, 136 insertions(+), 3 deletions(-)
configure.in | 2
src/master/Makefile.am | 6 +-
src/master/main.c | 8 +++
src/master/sysinfo-get.c | 117 ++++++++++++++++++++++++++++++++++++++++++++++
src/master/sysinfo-get.h | 6 ++
diffs (198 lines):
diff -r dcea00b0e290 -r 7948b25f3790 configure.in
--- a/configure.in Wed Oct 29 18:41:26 2008 +0200
+++ b/configure.in Wed Oct 29 19:34:12 2008 +0200
@@ -20,7 +20,7 @@ AC_CHECK_HEADERS(strings.h stdint.h unis
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/vmount.h)
+ sys/vmount.h sys/utsname.h)
AC_ARG_ENABLE(ipv6,
[ --enable-ipv6 Enable IPv6 support (auto)],
diff -r dcea00b0e290 -r 7948b25f3790 src/master/Makefile.am
--- a/src/master/Makefile.am Wed Oct 29 18:41:26 2008 +0200
+++ b/src/master/Makefile.am Wed Oct 29 19:34:12 2008 +0200
@@ -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 -r dcea00b0e290 -r 7948b25f3790 src/master/main.c
--- a/src/master/main.c Wed Oct 29 18:41:26 2008 +0200
+++ b/src/master/main.c Wed Oct 29 19:34:12 2008 +0200
@@ -20,6 +20,7 @@
#include "listener.h"
#include "ssl-init.h"
#include "log.h"
+#include "sysinfo-get.h"
#include <stdio.h>
#include <stdlib.h>
@@ -516,6 +517,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);
@@ -530,6 +532,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 -r dcea00b0e290 -r 7948b25f3790 src/master/sysinfo-get.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/master/sysinfo-get.c Wed Oct 29 19:34:12 2008 +0200
@@ -0,0 +1,117 @@
+/* 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 <unistd.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#ifdef HAVE_SYS_UTSNAME_H
+# include <sys/utsname.h>
+#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 "Unknown";
+}
+
+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);
+ }
+#endif
+ distro = distro_get();
+ 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 -r dcea00b0e290 -r 7948b25f3790 src/master/sysinfo-get.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/master/sysinfo-get.h Wed Oct 29 19:34:12 2008 +0200
@@ -0,0 +1,6 @@
+#ifndef SYSINFO_GET_H
+#define SYSINFO_GET_H
+
+const char *sysinfo_get(const char *mail_location);
+
+#endif
More information about the dovecot-cvs
mailing list