[gnome-battery-bench] Add system information via GbbSystemInfo
- From: Christian Kellner <gicmo src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-battery-bench] Add system information via GbbSystemInfo
- Date: Mon, 20 Feb 2017 17:28:18 +0000 (UTC)
commit c5266c4d7eb0329c621943788096749d0ac6f4a2
Author: Christian Kellner <gicmo gnome org>
Date: Tue Jan 17 16:33:17 2017 +0100
Add system information via GbbSystemInfo
src/Makefile.am | 6 +-
src/system-info.c | 508 +++++++++++++++++++++++++++++++++++++++++++++++++++++
src/system-info.h | 11 ++
3 files changed, 523 insertions(+), 2 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index a79662e..1cabc03 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -25,6 +25,8 @@ client_sources = \
event-recorder.h \
power-monitor.c \
power-monitor.h \
+ system-info.h \
+ system-info.c \
system-state.c \
system-state.h \
test-run.c \
@@ -34,7 +36,7 @@ client_sources = \
xinput-wait.c \
xinput-wait.h
-gnome_battery_bench_CPPFLAGS = $(APPLICATION_CFLAGS) -DPKGDATADIR=\"$(pkgdatadir)\"
+gnome_battery_bench_CPPFLAGS = $(APPLICATION_CFLAGS) -DPKGDATADIR=\"$(pkgdatadir)\" -DDATADIR=\"$(datadir)\"
gnome_battery_bench_LDADD = $(APPLICATION_LIBS)
gnome_battery_bench_SOURCES = \
@@ -48,7 +50,7 @@ gnome_battery_bench_SOURCES = \
util-gtk.h \
gnome-battery-bench.gresource.c
-gbb_CPPFLAGS = $(COMMANDLINE_CFLAGS) -DPKGDATADIR=\"$(pkgdatadir)\"
+gbb_CPPFLAGS = $(COMMANDLINE_CFLAGS) -DPKGDATADIR=\"$(pkgdatadir)\" -DDATADIR=\"$(datadir)\"
gbb_LDADD = $(COMMANDLINE_LIBS)
gbb_SOURCES = \
diff --git a/src/system-info.c b/src/system-info.c
new file mode 100644
index 0000000..0c55f50
--- /dev/null
+++ b/src/system-info.c
@@ -0,0 +1,508 @@
+/* -*- mode: C; c-file-style: "stroustrup"; indent-tabs-mode: nil; -*- */
+
+#include "system-info.h"
+
+#include <glib.h>
+#include <string.h>
+
+#include "config.h"
+
+struct _GbbSystemInfo {
+ GObject parent;
+
+ /* Hardware*/
+ /* Product */
+ char *sys_vendor;
+ char *product_version;
+ char *product_name;
+
+ /* BIOS */
+ char *bios_version;
+ char *bios_date;
+ char *bios_vendor;
+
+ /* Software */
+
+ /* OS */
+ char *os_type;
+ char *os_kernel;
+
+ /* GNOME */
+ char *gnome_version;
+ char *gnome_distributor;
+ char *gnome_date;
+};
+
+enum {
+ PROP_0,
+
+ PROP_SYS_VENDOR,
+ PROP_PRODUCT_VERSION,
+ PROP_PRODUCT_NAME,
+
+ PROP_BIOS_VERSION,
+ PROP_BIOS_VENDOR,
+ PROP_BIOS_DATE,
+
+ PROP_OS_TYPE,
+ PROP_OS_KERNEL,
+
+ PROP_GNOME_VERSION,
+ PROP_GNOME_DISTRIBUTOR,
+ PROP_GNOME_DATE,
+
+ PROP_LAST
+};
+
+G_DEFINE_TYPE (GbbSystemInfo, gbb_system_info, G_TYPE_OBJECT);
+
+/* prototypes */
+
+static gboolean load_gnome_version (char **version,
+ char **distributor,
+ char **date);
+static char *get_os_type (void);
+/* */
+
+static void
+gbb_system_info_finalize(GbbSystemInfo *info)
+{
+ g_free(info->sys_vendor);
+ g_free(info->product_version);
+ g_free(info->product_name);
+
+ g_free(info->bios_version);
+ g_free(info->bios_date);
+ g_free(info->bios_vendor);
+
+ g_free(info->os_type);
+ g_free(info->os_kernel);
+
+ g_free(info->gnome_version);
+ g_free(info->gnome_distributor);
+ g_free(info->gnome_date);
+
+ G_OBJECT_CLASS(gbb_system_info_parent_class)->finalize(G_OBJECT (info));
+}
+
+static void
+gbb_system_info_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+{
+ GbbSystemInfo *info = GBB_SYSTEM_INFO(object);
+
+ switch (prop_id) {
+ case PROP_SYS_VENDOR:
+ g_value_set_string(value, info->sys_vendor);
+ break;
+
+ case PROP_PRODUCT_VERSION:
+ g_value_set_string(value, info->product_version);
+ break;
+
+ case PROP_PRODUCT_NAME:
+ g_value_set_string(value, info->product_name);
+ break;
+
+ case PROP_BIOS_VERSION:
+ g_value_set_string(value, info->bios_version);
+ break;
+
+ case PROP_BIOS_DATE:
+ g_value_set_string(value, info->bios_date);
+ break;
+
+ case PROP_BIOS_VENDOR:
+ g_value_set_string(value, info->bios_vendor);
+ break;
+
+ case PROP_OS_TYPE:
+ g_value_set_string(value, info->os_type);
+ break;
+
+ case PROP_OS_KERNEL:
+ g_value_set_string(value, info->os_kernel);
+ break;
+
+ case PROP_GNOME_VERSION:
+ g_value_set_string(value, info->gnome_version);
+ break;
+
+ case PROP_GNOME_DISTRIBUTOR:
+ g_value_set_string(value, info->gnome_distributor);
+ break;
+
+ case PROP_GNOME_DATE:
+ g_value_set_string(value, info->gnome_date);
+ break;
+ }
+
+}
+
+static void
+gbb_system_info_class_init (GbbSystemInfoClass *klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
+ gobject_class->finalize = (GObjectFinalizeFunc) gbb_system_info_finalize;
+ gobject_class->get_property = gbb_system_info_get_property;
+
+ g_object_class_install_property (gobject_class,
+ PROP_SYS_VENDOR,
+ g_param_spec_string ("sys-vendor",
+ NULL, NULL,
+ NULL,
+ G_PARAM_READABLE));
+ g_object_class_install_property (gobject_class,
+ PROP_PRODUCT_VERSION,
+ g_param_spec_string ("product-version",
+ NULL, NULL,
+ NULL,
+ G_PARAM_READABLE));
+ g_object_class_install_property (gobject_class,
+ PROP_PRODUCT_NAME,
+ g_param_spec_string ("product-name",
+ NULL, NULL,
+ NULL,
+ G_PARAM_READABLE));
+ g_object_class_install_property (gobject_class,
+ PROP_BIOS_VERSION,
+ g_param_spec_string ("bios-version",
+ NULL, NULL,
+ NULL,
+ G_PARAM_READABLE));
+ g_object_class_install_property (gobject_class,
+ PROP_BIOS_DATE,
+ g_param_spec_string ("bios-date",
+ NULL, NULL,
+ NULL,
+ G_PARAM_READABLE));
+ g_object_class_install_property (gobject_class,
+ PROP_BIOS_VENDOR,
+ g_param_spec_string ("bios-vendor",
+ NULL, NULL,
+ NULL,
+ G_PARAM_READABLE));
+ g_object_class_install_property (gobject_class,
+ PROP_OS_KERNEL,
+ g_param_spec_string ("os-kernel",
+ NULL, NULL,
+ NULL,
+ G_PARAM_READABLE));
+ g_object_class_install_property (gobject_class,
+ PROP_OS_TYPE,
+ g_param_spec_string ("os-type",
+ NULL, NULL,
+ NULL,
+ G_PARAM_READABLE));
+ g_object_class_install_property (gobject_class,
+ PROP_GNOME_VERSION,
+ g_param_spec_string ("gnome-version",
+ NULL, NULL,
+ NULL,
+ G_PARAM_READABLE));
+ g_object_class_install_property (gobject_class,
+ PROP_GNOME_DISTRIBUTOR,
+ g_param_spec_string ("gnome-distributor",
+ NULL, NULL,
+ NULL,
+ G_PARAM_READABLE));
+ g_object_class_install_property (gobject_class,
+ PROP_GNOME_DATE,
+ g_param_spec_string ("gnome-date",
+ NULL, NULL,
+ NULL,
+ G_PARAM_READABLE));
+}
+
+static char *
+read_sysfs_string(const char *node)
+{
+ gboolean ok;
+ char *contents = NULL;
+ GError *error = NULL;
+ gsize len;
+
+ ok = g_file_get_contents (node,
+ &contents,
+ &len,
+ &error);
+
+ if (!ok) {
+ g_log_structured (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
+ "MESSAGE_ID", "3a2690a163c5465bb9ba0cab229bf3cf",
+ "MESSAGE", "Reading sys file '%s' failed: %s.",
+ node, error->message);
+ g_error_free(error);
+ return g_strdup("Unknown");
+ }
+
+ if (len > 1 && contents[len-1] == '\n') {
+ contents[len-1] = '\0';
+ }
+
+ return contents;
+}
+
+static void
+read_dmi_info(GbbSystemInfo *info)
+{
+ info->bios_version = read_sysfs_string("/sys/devices/virtual/dmi/id/bios_version");
+ info->bios_date = read_sysfs_string("/sys/devices/virtual/dmi/id/bios_date");
+ info->bios_vendor = read_sysfs_string("/sys/devices/virtual/dmi/id/bios_vendor");
+
+ info->product_name = read_sysfs_string("/sys/devices/virtual/dmi/id/product_name");
+ info->product_version = read_sysfs_string("/sys/devices/virtual/dmi/id/product_version");
+
+ info->sys_vendor = read_sysfs_string("/sys/devices/virtual/dmi/id/sys_vendor");
+}
+
+static char *
+read_kernel_version(void)
+{
+ g_autofree char *data = read_sysfs_string("/proc/version");
+ g_auto(GStrv) comps = NULL;
+
+ if (data == NULL) {
+ return g_strdup("Unknown");
+ }
+
+ comps = g_strsplit(data, " ", 4);
+ if (g_strv_length (comps) < 3) {
+ char *tmp = data;
+ data = NULL;
+ return tmp;
+ }
+
+ return g_strdup(comps[2]);
+}
+
+
+static void gbb_system_info_init (GbbSystemInfo *info)
+{
+ read_dmi_info(info);
+ load_gnome_version(&info->gnome_version,
+ &info->gnome_distributor,
+ &info->gnome_date);
+ info->os_type = get_os_type();
+ info->os_kernel = read_kernel_version();
+
+}
+
+GbbSystemInfo *
+gbb_system_info_acquire ()
+{
+ GbbSystemInfo *info;
+ info = (GbbSystemInfo *) g_object_new(GBB_TYPE_SYSTEM_INFO, NULL);
+ return info;
+}
+
+/* GNOME system info */
+/* Everything below has been mostly borrowed from
+ * gnome-control-center/panels/info/cc-info-panel.c
+ * with some minor modifications, and reformatting.
+ * License: GPLv2+
+ * Copyright (C) 2010 Red Hat, Inc
+ * Copyright (C) 2008 William Jon McCann <jmccann redhat com>
+ */
+typedef struct {
+ char *major;
+ char *minor;
+ char *micro;
+ char *distributor;
+ char *date;
+ char **current;
+} VersionData;
+
+static void
+version_start_element_handler (GMarkupParseContext *ctx,
+ const char *element_name,
+ const char **attr_names,
+ const char **attr_values,
+ gpointer user_data,
+ GError **error)
+{
+ VersionData *data = user_data;
+
+ if (g_str_equal (element_name, "platform"))
+ data->current = &data->major;
+ else if (g_str_equal (element_name, "minor"))
+ data->current = &data->minor;
+ else if (g_str_equal (element_name, "micro"))
+ data->current = &data->micro;
+ else if (g_str_equal (element_name, "distributor"))
+ data->current = &data->distributor;
+ else if (g_str_equal (element_name, "date"))
+ data->current = &data->date;
+ else
+ data->current = NULL;
+}
+
+static void
+version_end_element_handler (GMarkupParseContext *ctx,
+ const char *element_name,
+ gpointer user_data,
+ GError **error)
+{
+ VersionData *data = user_data;
+ data->current = NULL;
+}
+
+static void
+version_text_handler (GMarkupParseContext *ctx,
+ const char *text,
+ gsize text_len,
+ gpointer user_data,
+ GError **error)
+{
+ VersionData *data = user_data;
+ if (data->current != NULL)
+ *data->current = g_strstrip (g_strdup (text));
+}
+
+static gboolean
+load_gnome_version (char **version,
+ char **distributor,
+ char **date)
+{
+ GMarkupParser version_parser = {
+ version_start_element_handler,
+ version_end_element_handler,
+ version_text_handler,
+ NULL,
+ NULL,
+ };
+ GError *error;
+ GMarkupParseContext *ctx;
+ char *contents;
+ gsize length;
+ VersionData *data;
+ gboolean ret;
+
+ ret = FALSE;
+
+ error = NULL;
+ if (!g_file_get_contents (DATADIR "/gnome/gnome-version.xml",
+ &contents,
+ &length,
+ &error))
+ return FALSE;
+
+ data = g_new0 (VersionData, 1);
+ ctx = g_markup_parse_context_new (&version_parser, 0, data, NULL);
+
+ if (!g_markup_parse_context_parse (ctx, contents, length, &error)) {
+ g_warning ("Invalid version file: '%s'", error->message);
+ } else {
+ if (version != NULL)
+ *version = g_strdup_printf ("%s.%s.%s", data->major, data->minor, data->micro);
+ if (distributor != NULL)
+ *distributor = g_strdup (data->distributor);
+ if (date != NULL)
+ *date = g_strdup (data->date);
+
+ ret = TRUE;
+ }
+
+ g_markup_parse_context_free (ctx);
+ g_free (data->major);
+ g_free (data->minor);
+ g_free (data->micro);
+ g_free (data->distributor);
+ g_free (data->date);
+ g_free (data);
+ g_free (contents);
+
+ return ret;
+};
+
+static GHashTable*
+get_os_info (void)
+{
+ GHashTable *hashtable;
+ gchar *buffer;
+
+ hashtable = NULL;
+
+ if (g_file_get_contents ("/etc/os-release", &buffer, NULL, NULL)) {
+ gchar **lines;
+ gint i;
+
+ lines = g_strsplit (buffer, "\n", -1);
+
+ for (i = 0; lines[i] != NULL; i++) {
+ gchar *delimiter, *key, *value;
+
+ /* Initialize the hash table if needed */
+ if (!hashtable)
+ hashtable = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+
+ delimiter = strstr (lines[i], "=");
+ value = NULL;
+ key = NULL;
+
+ if (delimiter != NULL) {
+ gint size;
+
+ key = g_strndup (lines[i], delimiter - lines[i]);
+
+ /* Jump the '=' */
+ delimiter += strlen ("=");
+
+ /* Eventually jump the ' " ' character */
+ if (g_str_has_prefix (delimiter, "\""))
+ delimiter += strlen ("\"");
+
+ size = strlen (delimiter);
+
+ /* Don't consider the last ' " ' too */
+ if (g_str_has_suffix (delimiter, "\""))
+ size -= strlen ("\"");
+
+ value = g_strndup (delimiter, size);
+
+ g_hash_table_insert (hashtable, key, value);
+ }
+ }
+
+ g_strfreev (lines);
+ g_free (buffer);
+ }
+
+ return hashtable;
+}
+
+static char *
+get_os_type (void)
+{
+ GHashTable *os_info;
+ gchar *name, *result, *build_id;
+ int bits;
+
+ os_info = get_os_info ();
+
+ if (!os_info)
+ return NULL;
+
+ name = g_hash_table_lookup (os_info, "PRETTY_NAME");
+ build_id = g_hash_table_lookup (os_info, "BUILD_ID");
+
+ if (GLIB_SIZEOF_VOID_P == 8)
+ bits = 64;
+ else
+ bits = 32;
+
+ if (build_id) {
+ if (name)
+ result = g_strdup_printf ("%s %d-bit (Build ID: %s)", name, bits, build_id);
+ else
+ result = g_strdup_printf ("%d-bit (Build ID: %s)", bits, build_id);
+ } else {
+ if (name)
+ result = g_strdup_printf ("%s %d-bit", name, bits);
+ else
+ result = g_strdup_printf ("%d-bit", bits);
+ }
+
+ g_clear_pointer (&os_info, g_hash_table_destroy);
+
+ return result;
+}
diff --git a/src/system-info.h b/src/system-info.h
new file mode 100644
index 0000000..27ad333
--- /dev/null
+++ b/src/system-info.h
@@ -0,0 +1,11 @@
+#ifndef __SYSTEM_INFO_H__
+#define __SYSTEM_INFO_H__
+
+#include <glib-object.h>
+
+#define GBB_TYPE_SYSTEM_INFO gbb_system_info_get_type()
+G_DECLARE_FINAL_TYPE(GbbSystemInfo, gbb_system_info, GBB, SYSTEM_INFO, GObject)
+
+GbbSystemInfo *gbb_system_info_acquire (void);
+
+#endif /* __SYSTEM_INFO_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]