mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2024-11-18 22:54:00 +00:00
1507 lines
44 KiB
Diff
1507 lines
44 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: info-cppsp <info@cppsp.de>
|
|
Date: Wed, 13 Sep 2017 13:13:30 +0200
|
|
Subject: [PATCH 1/4] added udisks2 plugin
|
|
|
|
(cherry picked from commit a7e24a66b69f02106db00e5392b68c39f5d4eb59)
|
|
|
|
Conflicts:
|
|
plugins/udisks2/Makefile.am
|
|
---
|
|
autogenclean.sh | 17 +
|
|
configure.ac | 24 ++
|
|
plugins/Makefile.am | 5 +
|
|
plugins/udisks2/Makefile.am | 24 ++
|
|
plugins/udisks2/udisks2-plugin.c | 550 +++++++++++++++++++++++++++++++
|
|
plugins/udisks2/udisks2-plugin.h | 24 ++
|
|
6 files changed, 644 insertions(+)
|
|
create mode 100644 autogenclean.sh
|
|
create mode 100644 plugins/udisks2/Makefile.am
|
|
create mode 100644 plugins/udisks2/udisks2-plugin.c
|
|
create mode 100644 plugins/udisks2/udisks2-plugin.h
|
|
|
|
diff --git a/autogenclean.sh b/autogenclean.sh
|
|
new file mode 100644
|
|
index 0000000..d6a31c8
|
|
--- /dev/null
|
|
+++ b/autogenclean.sh
|
|
@@ -0,0 +1,17 @@
|
|
+#!/bin/bash -e
|
|
+#
|
|
+# deletes compile files, so that I can upload the whole folder to github
|
|
+# use make clean first
|
|
+
|
|
+find . -name "Makefile" -exec rm {} \;
|
|
+find . -name "Makefile.in" -exec rm {} \;
|
|
+find . -name "autom4te.cache" -exec rm -r {} \;
|
|
+find . -name ".deps" -exec rm -r {} \;
|
|
+find . -name "m4" -exec rm -r {} \;
|
|
+find . -name "*.gmo" -exec rm {} \;
|
|
+find . -name "POTFILES" -exec rm {} \;
|
|
+find . -name "Makefile.in.in" -exec rm {} \;
|
|
+find . -name "stamp-it" -exec rm {} \;
|
|
+rm ./sensors-applet/config.h*;
|
|
+rm ./sensors-applet/stamp-h1;
|
|
+rm ./aclocal.m4 ./compile ./config.* ./configure ./depcomp ./install-sh ./libtool ./ltmain.sh ./missing ./omf.make ./xmldocs.make ./INSTALL;
|
|
diff --git a/configure.ac b/configure.ac
|
|
index 5d689f6..239c60b 100644
|
|
--- a/configure.ac
|
|
+++ b/configure.ac
|
|
@@ -100,6 +100,29 @@ fi
|
|
|
|
AM_CONDITIONAL(UDISKS, test -n "$DBUSGLIB_CFLAGS" -a -n "$LIBATASMART_CFLAGS")
|
|
|
|
+# enable support for udisks2 (via dbus) by default if its available
|
|
+AC_ARG_ENABLE(udisks2,
|
|
+ AS_HELP_STRING([--disable-udisks2],
|
|
+ [Disable support for udisks2 sensor readings via DBUS.]),
|
|
+ enable_udisks2=$enableval, enable_udisks2="yes")
|
|
+
|
|
+if test "x$enable_udisks2" = "xno" ; then
|
|
+ echo "Disabling udisks2 support"
|
|
+#else
|
|
+# PKG_CHECK_MODULES(DBUSGLIB, dbus-glib-1 >= $LIBDBUSGLIB_REQUIRED,
|
|
+# HAVE_DBUSGLIB="yes", HAVE_DBUSGLIB="no")
|
|
+# AC_SUBST(DBUSGLIB_CFLAGS)
|
|
+# AC_SUBST(DBUSGLIB_LIBS)
|
|
+
|
|
+# PKG_CHECK_MODULES(LIBATASMART, libatasmart >= $LIBATASMART_REQUIRED,
|
|
+# HAVE_LIBATASMART="yes", HAVE_LIBATASMART="no")
|
|
+# AC_SUBST(LIBATASMART_CFLAGS)
|
|
+# AC_SUBST(LIBATASMART_LIBS)
|
|
+fi
|
|
+
|
|
+# use same test as above, bc AM_CONDITIONAL may not be in if/else
|
|
+AM_CONDITIONAL(UDISKS2, test "x$enable_udisks2" = "xyes")
|
|
+
|
|
# support for libnotify
|
|
LIBNOTIFY_CFLAGS=
|
|
LIBNOTIFY_LIBS=
|
|
@@ -268,6 +291,7 @@ AC_CONFIG_FILES([
|
|
plugins/Makefile
|
|
plugins/acpi/Makefile
|
|
plugins/udisks/Makefile
|
|
+ plugins/udisks2/Makefile
|
|
plugins/eee/Makefile
|
|
plugins/hddtemp/Makefile
|
|
plugins/i2c-proc/Makefile
|
|
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
|
|
index 74161f5..d787000 100644
|
|
--- a/plugins/Makefile.am
|
|
+++ b/plugins/Makefile.am
|
|
@@ -1,6 +1,7 @@
|
|
DIST_SUBDIRS = \
|
|
acpi \
|
|
udisks \
|
|
+ udisks2 \
|
|
eee \
|
|
hddtemp \
|
|
i2c-proc \
|
|
@@ -32,6 +33,10 @@ if UDISKS
|
|
SUBDIRS += udisks
|
|
endif
|
|
|
|
+if UDISKS2
|
|
+SUBDIRS += udisks2
|
|
+endif
|
|
+
|
|
if LIBSENSORS
|
|
SUBDIRS += libsensors
|
|
else
|
|
diff --git a/plugins/udisks2/Makefile.am b/plugins/udisks2/Makefile.am
|
|
new file mode 100644
|
|
index 0000000..90af1fe
|
|
--- /dev/null
|
|
+++ b/plugins/udisks2/Makefile.am
|
|
@@ -0,0 +1,24 @@
|
|
+# UDisks plugin
|
|
+plugindir = $(libdir)/sensors-applet/plugins
|
|
+
|
|
+libudisks2_la_CPPFLAGS = -DGNOMELOCALEDIR=\""$(datadir)/locale/"\" \
|
|
+ -DG_LOG_DOMAIN=\""Sensors Applet"\" \
|
|
+ -DPIXMAPS_DIR=\""$(datadir)/pixmaps/$(PACKAGE)/"\" \
|
|
+ -DDATADIR=\""$(datadir)"\" \
|
|
+ -DLIBDIR=\""$(libdir)"\" \
|
|
+ -DSYSCONFDIR=\""$(sysconfdir)"\" \
|
|
+ -DPREFIX=\""$(prefix)"\" \
|
|
+ -I$(top_srcdir) \
|
|
+ $(GLIB_CFLAGS)
|
|
+
|
|
+
|
|
+
|
|
+plugin_LTLIBRARIES = libudisks2.la
|
|
+
|
|
+libudisks2_la_SOURCES = \
|
|
+ udisks2-plugin.h \
|
|
+ udisks2-plugin.c
|
|
+
|
|
+libudisks2_la_LDFLAGS = $(PLUGIN_LIBTOOL_FLAGS) $(GLIB_LIBS)
|
|
+
|
|
+libudisks2_la_LIBADD = $(top_builddir)/lib/libsensors-applet-plugin.la
|
|
diff --git a/plugins/udisks2/udisks2-plugin.c b/plugins/udisks2/udisks2-plugin.c
|
|
new file mode 100644
|
|
index 0000000..3bc6eef
|
|
--- /dev/null
|
|
+++ b/plugins/udisks2/udisks2-plugin.c
|
|
@@ -0,0 +1,550 @@
|
|
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
|
|
+ * vim: sts=0 sw=8 ts=8 tw=78 noexpandtab
|
|
+ *
|
|
+ * Copyright (C) 2009 Pramod Dematagoda <pmd.lotr.gandalf@gmail.com>
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or modify
|
|
+ * it under the terms of the GNU General Public License as published by
|
|
+ * the Free Software Foundation; either version 2 of the License, or
|
|
+ * (at your option) any later version.
|
|
+ *
|
|
+ * This program is distributed in the hope that it will be useful,
|
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+ * GNU General Public License for more details.
|
|
+ *
|
|
+ * You should have received a copy of the GNU General Public License
|
|
+ * along with this program; if not, write to the Free Software
|
|
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
+ */
|
|
+
|
|
+/*
|
|
+Udisks2 plugin for the mate-sensors-applet
|
|
+
|
|
+written by info@cppsp.de using the structure and code of the previous version
|
|
+from above author
|
|
+
|
|
+fd1 - from doc1 - dbus-glib documentation
|
|
+https://dbus.freedesktop.org/doc/dbus-glib/
|
|
+fd2 - from doc2 - GDBUS documentation
|
|
+https://developer.gnome.org/gio/stable/index.html
|
|
+
|
|
+I couldn't figure out debug, so I used syslog
|
|
+syslog(LOG_ERR, "hellodd");
|
|
+-> /var/log/syslog
|
|
+*/
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+#ifdef HAVE_CONFIG_H
|
|
+#include "config.h"
|
|
+#endif /* HAVE_CONFIG_H */
|
|
+
|
|
+#include <stdio.h>
|
|
+#include <gio/gio.h>
|
|
+#include "udisks2-plugin.h"
|
|
+
|
|
+
|
|
+// remove // from next line for syslog debug
|
|
+//#define UD2PD 1
|
|
+
|
|
+#ifdef UD2PD
|
|
+#include <syslog.h>
|
|
+#endif
|
|
+
|
|
+
|
|
+#define UDISKS2_BUS_NAME "org.freedesktop.UDisks2"
|
|
+#define UDISKS2_INTERFACE_NAME "org.freedesktop.DBus.ObjectManager"
|
|
+#define UDISKS2_DEVICE_INTERFACE_NAME "org.freedesktop.UDisks2.Drive"
|
|
+#define UDISKS2_DEVICE_INTERFACE2_NAME "org.freedesktop.UDisks2.Drive.Ata"
|
|
+
|
|
+#define UDISKS2_PROPERTIES_INTERFACE "org.freedesktop.DBus.Properties"
|
|
+#define UDISKS2_OBJECT_PATH "/org/freedesktop/UDisks2"
|
|
+
|
|
+
|
|
+/*
|
|
+ * Info about a single sensor
|
|
+ */
|
|
+typedef struct _DevInfo{
|
|
+ gchar *path;
|
|
+ gchar *id;
|
|
+ gdouble temp;
|
|
+ GDBusProxy *sensor_proxy; // dbus object
|
|
+ GError *error;
|
|
+} DevInfo;
|
|
+
|
|
+
|
|
+const gchar *plugin_name = "udisks2";
|
|
+
|
|
+// a container for the devices found to have smart enabled
|
|
+GHashTable *devices = NULL;
|
|
+
|
|
+/* This is a global variable for convenience */
|
|
+GDBusConnection *connection;
|
|
+
|
|
+
|
|
+static void update_device(DevInfo *info)
|
|
+{
|
|
+ GError *error = NULL;
|
|
+ GVariant *tempgvar;
|
|
+ gdouble temp;
|
|
+
|
|
+ // check valid input parameter
|
|
+ g_return_if_fail(info != NULL);
|
|
+
|
|
+ // check connection too
|
|
+ g_return_if_fail(connection != NULL);
|
|
+
|
|
+ g_clear_error(&info->error);
|
|
+
|
|
+// for the udisks plugin a new sensor_proxy was created here, which seems stupid, as one is already stored in the DevInfo struct
|
|
+// I only create one direct connect proxy here in this function
|
|
+
|
|
+ // check for sensor_proxy, which should exist at this point, make one if necessary and save it into DevInfo
|
|
+ // this is used to get the temp value the direct way
|
|
+ if(NULL == info->sensor_proxy)
|
|
+ {
|
|
+ info->sensor_proxy = g_dbus_proxy_new_sync(connection, G_DBUS_PROXY_FLAGS_NONE, NULL,
|
|
+ UDISKS2_BUS_NAME,
|
|
+ info->path,
|
|
+ UDISKS2_PROPERTIES_INTERFACE,
|
|
+ NULL, NULL
|
|
+ );
|
|
+
|
|
+ }
|
|
+
|
|
+// "DriveAtaSmartTimeCollected" in ud2 is "drive ata SmartUpdated"
|
|
+// fd: The point in time (seconds since the Unix Epoch) that the SMART status was updated or 0 if never updated.
|
|
+// should we bother getting this time??
|
|
+
|
|
+/*
|
|
+ if (!g_dbus_proxy_call_sync(sensor_proxy, "Get", NULL,
|
|
+ G_TYPE_STRING, UDISKS2_BUS_NAME,
|
|
+ G_TYPE_STRING, "DriveAtaSmartTimeCollected", G_TYPE_INVALID,
|
|
+ G_TYPE_VALUE, &smart_time,
|
|
+ G_TYPE_INVALID) ||
|
|
+ !g_value_get_uint64(&smart_time))
|
|
+ {
|
|
+ g_object_unref(sensor_proxy);
|
|
+ return;
|
|
+ }
|
|
+*/
|
|
+
|
|
+
|
|
+// reading "DriveAtaSmartBlob" doesn't make it refresh
|
|
+// it seems to me that smart updates occur automatically every 10 minutes
|
|
+// mate-sensor-applet has a default refresh of 2 seconds...
|
|
+// it is possible to force a smart update with udisks2: SmartUpdate (IN a{sv} options);
|
|
+
|
|
+// fd: A blob containing the ATA SMART data. This blob can be used with libatasmart to get more information. This property is only valid if DriveAtaSmartTimeCollected is greater than zero.
|
|
+// this smartblob was needed, bc there was no other way to get the smart temperature from udisks
|
|
+/*
|
|
+
|
|
+ if (!g_dbus_proxy_call_sync(sensor_proxy, "Get", &info->error,
|
|
+ G_TYPE_STRING, UDISKS2_BUS_NAME,
|
|
+ G_TYPE_STRING, "DriveAtaSmartBlob", G_TYPE_INVALID,
|
|
+ G_TYPE_VALUE, &smart_blob_val,
|
|
+ G_TYPE_INVALID))
|
|
+ {
|
|
+ g_debug("Error getting DriveAtaSmartBlob %s",
|
|
+ info->error ? info->error->message : "NULL");
|
|
+ g_object_unref(sensor_proxy);
|
|
+ return;
|
|
+ }
|
|
+ smart_blob = g_value_get_boxed(&smart_blob_val);
|
|
+
|
|
+ sk_disk_open(NULL, &sk_disk);
|
|
+ sk_disk_set_blob(sk_disk, smart_blob->data, smart_blob->len);
|
|
+ if (sk_disk_smart_get_temperature(sk_disk, &temperature) < 0)
|
|
+ {
|
|
+ g_debug("Error getting temperature from AtaSmartBlob");
|
|
+ g_free(sk_disk);
|
|
+ g_array_free(smart_blob, TRUE);
|
|
+ g_object_unref(sensor_proxy);
|
|
+ return;
|
|
+ }
|
|
+*/
|
|
+
|
|
+ // directly asking the device's DBus object for the temp
|
|
+ tempgvar = g_dbus_proxy_call_sync(info->sensor_proxy, "Get",
|
|
+ g_variant_new ("(ss)",
|
|
+ UDISKS2_DEVICE_INTERFACE2_NAME,
|
|
+ "SmartTemperature"), // parameters
|
|
+ G_DBUS_CALL_FLAGS_NONE, // flags
|
|
+ -1, // timeout
|
|
+ NULL, // cancellable
|
|
+ &error);
|
|
+
|
|
+ if (NULL == tempgvar)
|
|
+ {
|
|
+
|
|
+#ifdef UD2PD
|
|
+syslog(LOG_ERR, "Failed to get drive temperature");
|
|
+#endif
|
|
+ g_debug("Failed to get drive temperature: %s",
|
|
+ error->message);
|
|
+ g_error_free(error);
|
|
+ // throw away proxy, maybe next time it will be better
|
|
+ g_object_unref(info->sensor_proxy);
|
|
+ return;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+
|
|
+#ifdef UD2PD
|
|
+syslog(LOG_ERR, "tempgvar value: %s", g_variant_print(g_variant_get_variant(g_variant_get_child_value(tempgvar, 0)), TRUE));
|
|
+#endif
|
|
+
|
|
+ // tempgvar comes back as sg along the lines of array(gvariant(tempasdouble))
|
|
+ // hence unpacking
|
|
+ temp = g_variant_get_double(g_variant_get_variant(g_variant_get_child_value(tempgvar, 0)));
|
|
+ // temp in K
|
|
+ info->temp = temp - 273.15;
|
|
+ g_variant_unref(tempgvar);
|
|
+
|
|
+#ifdef UD2PD
|
|
+syslog(LOG_ERR, "Refresh udisks2 device temp: '%f'\n", info->temp);
|
|
+#endif
|
|
+
|
|
+ }
|
|
+
|
|
+
|
|
+}
|
|
+
|
|
+
|
|
+
|
|
+/* This is the handler for the Changed() signal emitted by UDisks. */
|
|
+/*
|
|
+static void udisks2_changed_signal_cb(GDBusProxy *sensor_proxy) {
|
|
+ const gchar *path;
|
|
+ DevInfo *info;
|
|
+
|
|
+ // fd2: Gets the object path sensor_proxy is for.
|
|
+ path = g_dbus_proxy_get_object_path(sensor_proxy);
|
|
+ g_debug("%s changed()", path);
|
|
+ info = g_hash_table_lookup(devices, path);
|
|
+
|
|
+// update_device(info);
|
|
+}
|
|
+*/
|
|
+
|
|
+
|
|
+// in this function we would like to get a list of device (hdd/ssd) paths
|
|
+// then with each path we get the temperature
|
|
+// it is possible with udisks2 to get all the above information in one g_dbus_proxy_call_sync(), so that is how I did it
|
|
+// a better version would be to use GDBusObjectManager Server + Client ??
|
|
+static void udisks2_plugin_get_sensors(GList **sensors) {
|
|
+
|
|
+#ifdef UD2PD
|
|
+syslog(LOG_ERR, "fstart");
|
|
+#endif
|
|
+
|
|
+ GDBusProxy *proxy;
|
|
+ GError *error = NULL;
|
|
+
|
|
+ DevInfo *info;
|
|
+
|
|
+ /* This connection will be used for everything, including the obtaining
|
|
+ * of sensor data
|
|
+ */
|
|
+ // fd1: Returns a connection to the given bus. The connection is a global variable shared with other callers of this function.
|
|
+ // fd2: Synchronously connects to the message bus specified by bus_type . Note that the returned object may shared with other callers, e.g. if two separate parts of a process calls this function with the same bus_type , they will share the same object.
|
|
+ connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
|
|
+ if (connection == NULL)
|
|
+ {
|
|
+
|
|
+#ifdef UD2PD
|
|
+syslog(LOG_ERR, "dbus conn fail");
|
|
+#endif
|
|
+
|
|
+ g_debug("Failed to open connection to DBUS: %s",
|
|
+ error->message);
|
|
+ g_error_free(error);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+#ifdef UD2PD
|
|
+syslog(LOG_ERR, "dbus conn success");
|
|
+#endif
|
|
+
|
|
+ /* This was the proxy which is only used once during the enumeration of
|
|
+ * the device object paths
|
|
+ */
|
|
+ // I use it to get all info of all devices at once
|
|
+ // fd1: Creates a new proxy for a remote interface exported by a connection on a message bus.
|
|
+ // fd2: Creates a proxy for accessing interface_name on the remote object at object_path owned by name at connection and synchronously loads D-Bus properties unless the G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES flag is used.
|
|
+ proxy = g_dbus_proxy_new_sync(connection, G_DBUS_PROXY_FLAGS_NONE, NULL,
|
|
+ UDISKS2_BUS_NAME,
|
|
+ UDISKS2_OBJECT_PATH,
|
|
+ UDISKS2_INTERFACE_NAME,
|
|
+ NULL, NULL
|
|
+ );
|
|
+
|
|
+#ifdef UD2PD
|
|
+syslog(LOG_ERR, "dbus conn proxy success");
|
|
+#endif
|
|
+
|
|
+ /* The object paths of the disks are enumerated and placed in an array
|
|
+ * of object paths
|
|
+ */
|
|
+ // fd1: Function for synchronously invoking a method and receiving reply values.
|
|
+ // fd2: Synchronously invokes the method_name method on proxy.
|
|
+ // called "EnumerateDevices" method on UDisks object through dbus
|
|
+ // which returned an array of objectpaths
|
|
+ // "GetManagedObjects" returns dict of (objectpath, (dict of (string [ie. if. name], dict of(string [ie. property name], variant [ie. prop. value]))))
|
|
+
|
|
+ // g_dbus_proxy_call_sync() returns NULL on error, GVariant * otherwise
|
|
+ GVariant *managed_objects;
|
|
+
|
|
+
|
|
+ managed_objects = g_dbus_proxy_call_sync(proxy, "GetManagedObjects",
|
|
+ NULL, // parameters
|
|
+ G_DBUS_CALL_FLAGS_NONE, // flags
|
|
+ -1, // timeout
|
|
+ NULL, // cancellable
|
|
+ &error);
|
|
+
|
|
+ if (NULL == managed_objects)
|
|
+ {
|
|
+
|
|
+#ifdef UD2PD
|
|
+syslog(LOG_ERR, "Failed to enumerate disk devices");
|
|
+#endif
|
|
+
|
|
+ g_debug("Failed to enumerate disk devices: %s",
|
|
+ error->message);
|
|
+ g_error_free(error);
|
|
+ g_object_unref(proxy);
|
|
+ g_object_unref(connection);
|
|
+ connection = NULL;
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ // the result dictionary is enclosed in an array, unpack
|
|
+ managed_objects = g_variant_get_child_value(managed_objects, 0);
|
|
+
|
|
+#ifdef UD2PD
|
|
+//syslog(LOG_ERR, "managed_objects type: %s", g_variant_print(managed_objects, TRUE));
|
|
+syslog(LOG_ERR, "success to enumerate disk devices");
|
|
+#endif
|
|
+
|
|
+ // iterator for the result dictionary
|
|
+
|
|
+ // iterator code is based on the g_variant_iter_next() documentation
|
|
+ // iter is freed if the GVariant is, when using g_variant_iter_init()
|
|
+ GVariantIter iter;
|
|
+ gchar *key; // object path (like '/org/freedesktop/UDisks2/drives/Samsung_SSD_840_EVO_250GB_*insert drive serial nr.*')
|
|
+ GVariant *value;
|
|
+
|
|
+#ifdef UD2PD
|
|
+// log collection size
|
|
+syslog(LOG_ERR, "iter init count: %d", (int) g_variant_iter_init(&iter, managed_objects));
|
|
+#else
|
|
+ g_variant_iter_init(&iter, managed_objects);
|
|
+#endif
|
|
+
|
|
+ // "{sv}" is a GVariant format string
|
|
+ // {} dictionary of, s string, v GVariant
|
|
+ // changed to "{oa{sa{sv}}}" on error message 'the GVariant format string '{sv}' has a type of '{sv}' but the given value has a type of 'a{oa{sa{sv}}}''
|
|
+ // a is array, o is object path
|
|
+ // NOO!! the right format string is "{o@*}", which means get an object path into the 1st variable (key)
|
|
+ // and get 'everything else' (as a GVariant) into the 2nd variable (value)
|
|
+ // needs the & before the key and value params!
|
|
+ while (g_variant_iter_next(&iter, "{o@*}", &key, &value))
|
|
+ {
|
|
+
|
|
+#ifdef UD2PD
|
|
+syslog(LOG_ERR, "in iter while loop");
|
|
+syslog(LOG_ERR, "key value: %s", key);
|
|
+//syslog(LOG_ERR, "value type: %s", g_variant_print(value, TRUE));
|
|
+#endif
|
|
+
|
|
+ // level 2
|
|
+ // create a dictionary of value
|
|
+ // the two interface names that we are searching for are known and defined
|
|
+ // can't use GVariantDict, it only supports '{sv}' but the given value has a type of '{sa{sv}}'
|
|
+ // using general lookup
|
|
+
|
|
+ GVariant *propdict; // drive data
|
|
+ GVariant *propdict2; // drive smart data
|
|
+
|
|
+ // make two dictionaries that contain the properties of the drive interfaces
|
|
+ propdict = g_variant_lookup_value(value, UDISKS2_DEVICE_INTERFACE_NAME, G_VARIANT_TYPE_DICTIONARY);
|
|
+ propdict2 = g_variant_lookup_value(value, UDISKS2_DEVICE_INTERFACE2_NAME, G_VARIANT_TYPE_DICTIONARY);
|
|
+
|
|
+
|
|
+ // do we have the right ifname keys?
|
|
+ if((NULL != propdict) && (NULL != propdict2))
|
|
+ {
|
|
+
|
|
+#ifdef UD2PD
|
|
+syslog(LOG_ERR, "propdict type: %s", g_variant_print(propdict, TRUE));
|
|
+syslog(LOG_ERR, "propdict2 type: %s", g_variant_print(propdict2, TRUE));
|
|
+#endif
|
|
+
|
|
+ // get data
|
|
+ gchar *id;
|
|
+ gchar *model;
|
|
+
|
|
+ gboolean smartenabled;
|
|
+ gdouble temp;
|
|
+
|
|
+ // NULL, bc we don't care about the length of the string
|
|
+ // typecast bc g_variant_get_string() returns const char*
|
|
+ id = (gchar *) g_variant_get_string(g_variant_lookup_value(propdict, "Id", G_VARIANT_TYPE_STRING), NULL);
|
|
+ model = (gchar *) g_variant_get_string(g_variant_lookup_value(propdict, "Model", G_VARIANT_TYPE_STRING), NULL);
|
|
+
|
|
+ smartenabled = g_variant_get_boolean(g_variant_lookup_value(propdict2, "SmartEnabled", G_VARIANT_TYPE_BOOLEAN));
|
|
+ temp = g_variant_get_double(g_variant_lookup_value(propdict2, "SmartTemperature", G_VARIANT_TYPE_DOUBLE));
|
|
+
|
|
+#ifdef UD2PD
|
|
+syslog(LOG_ERR, "Found udisks2 device id: '%s'\n", id);
|
|
+syslog(LOG_ERR, "Found udisks2 device model: '%s'\n", model);
|
|
+syslog(LOG_ERR, "Found udisks2 device smartenabled: '%d'\n", smartenabled);
|
|
+syslog(LOG_ERR, "Found udisks2 device temp: '%f'\n", temp);
|
|
+#endif
|
|
+
|
|
+
|
|
+ // only go on if smart is enabled
|
|
+ // save data
|
|
+ if(smartenabled)
|
|
+ {
|
|
+
|
|
+ info = g_malloc0(sizeof(DevInfo));
|
|
+ if (devices == NULL)
|
|
+ {
|
|
+ devices = g_hash_table_new(g_str_hash,
|
|
+ g_str_equal);
|
|
+ }
|
|
+
|
|
+ info->id = g_strdup(id);
|
|
+ info->path = g_strdup(key);
|
|
+
|
|
+ // temp in K
|
|
+ // this could be left at 0.0, 2 seconds later it will be refreshed anyway
|
|
+ info->temp = (gdouble)temp - 273.15;
|
|
+ g_hash_table_insert(devices, info->id, info);
|
|
+
|
|
+ // Write the sensor data
|
|
+ sensors_applet_plugin_add_sensor(sensors,
|
|
+ id,
|
|
+ "Disk Temperature",
|
|
+ model,
|
|
+ TEMP_SENSOR,
|
|
+ FALSE,
|
|
+ HDD_ICON,
|
|
+ DEFAULT_GRAPH_COLOR);
|
|
+
|
|
+ g_debug("Added %s", id);
|
|
+
|
|
+#ifdef UD2PD
|
|
+syslog(LOG_ERR, "Added %s", id);
|
|
+#endif
|
|
+
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+
|
|
+#ifdef UD2PD
|
|
+syslog(LOG_ERR, "No temp data for device: %s\n", key);
|
|
+#endif
|
|
+
|
|
+ g_debug ("No temp data for device: %s\n", key);
|
|
+ }
|
|
+
|
|
+#ifdef UD2PD
|
|
+syslog(LOG_ERR, "b4 free1");
|
|
+#endif
|
|
+
|
|
+ g_free(id);
|
|
+ g_free(model);
|
|
+
|
|
+ }
|
|
+
|
|
+#ifdef UD2PD
|
|
+syslog(LOG_ERR, "b4 free2");
|
|
+#endif
|
|
+
|
|
+ // free propdict, propdict2
|
|
+ // g_variant_dict_unref() may not work a few times, gives error
|
|
+ // this one seems to do fine
|
|
+ if(NULL != propdict) {g_variant_unref(propdict);}
|
|
+ if(NULL != propdict2) {g_variant_unref(propdict2);}
|
|
+
|
|
+#ifdef UD2PD
|
|
+syslog(LOG_ERR, "b4 free3");
|
|
+#endif
|
|
+
|
|
+ g_free(key);
|
|
+ g_variant_unref(value);
|
|
+
|
|
+ } // end of while loop
|
|
+
|
|
+
|
|
+ g_variant_unref(managed_objects);
|
|
+ g_object_unref(proxy);
|
|
+ if (devices == NULL)
|
|
+ {
|
|
+ g_object_unref(connection);
|
|
+ connection = NULL;
|
|
+ }
|
|
+}
|
|
+
|
|
+
|
|
+// this is the function called every refresh cycle
|
|
+static gdouble udisks2_plugin_get_sensor_value(const gchar *path,
|
|
+ const gchar *id,
|
|
+ SensorType type,
|
|
+ GError **error) {
|
|
+ DevInfo *info;
|
|
+
|
|
+ // get device stuct from data store
|
|
+ info = (DevInfo *)g_hash_table_lookup(devices, path);
|
|
+ if (info == NULL)
|
|
+ {
|
|
+ g_set_error(error, SENSORS_APPLET_PLUGIN_ERROR, 0,
|
|
+ "Error finding disk with path %s", path);
|
|
+ return 0.0;
|
|
+ }
|
|
+
|
|
+ if (info->error)
|
|
+ {
|
|
+ *error = info->error;
|
|
+ info->error = NULL;
|
|
+ return 0.0;
|
|
+ }
|
|
+
|
|
+ // refresh device temp
|
|
+ /* update value since Changed() signal doesn't fire manually enough so
|
|
+ * poll instead */
|
|
+ update_device(info);
|
|
+ return info->temp;
|
|
+}
|
|
+
|
|
+
|
|
+// API functions
|
|
+const gchar *sensors_applet_plugin_name(void)
|
|
+{
|
|
+ return plugin_name;
|
|
+}
|
|
+
|
|
+static GList *udisks2_plugin_init(void) {
|
|
+ GList *sensors = NULL;
|
|
+
|
|
+ udisks2_plugin_get_sensors(&sensors);
|
|
+
|
|
+ return sensors;
|
|
+}
|
|
+
|
|
+GList *sensors_applet_plugin_init(void)
|
|
+{
|
|
+ return udisks2_plugin_init();
|
|
+}
|
|
+
|
|
+gdouble sensors_applet_plugin_get_sensor_value(const gchar *path,
|
|
+ const gchar *id,
|
|
+ SensorType type,
|
|
+ GError **error) {
|
|
+ return udisks2_plugin_get_sensor_value(path, id, type, error);
|
|
+}
|
|
diff --git a/plugins/udisks2/udisks2-plugin.h b/plugins/udisks2/udisks2-plugin.h
|
|
new file mode 100644
|
|
index 0000000..026ee8c
|
|
--- /dev/null
|
|
+++ b/plugins/udisks2/udisks2-plugin.h
|
|
@@ -0,0 +1,24 @@
|
|
+/*
|
|
+ * Copyright (C) 2009 Pramod Dematagoda <pmd.lotr.gandalf@gmail.com>
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or modify
|
|
+ * it under the terms of the GNU General Public License as published by
|
|
+ * the Free Software Foundation; either version 2 of the License, or
|
|
+ * (at your option) any later version.
|
|
+ *
|
|
+ * This program is distributed in the hope that it will be useful,
|
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+ * GNU General Public License for more details.
|
|
+ *
|
|
+ * You should have received a copy of the GNU General Public License
|
|
+ * along with this program; if not, write to the Free Software
|
|
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
+ */
|
|
+
|
|
+#ifndef UDISKS2_PLUGIN_H
|
|
+#define UDISKS2_PLUGIN_H
|
|
+
|
|
+#include <sensors-applet/sensors-applet-plugin.h>
|
|
+
|
|
+#endif /* UDISKS2_PLUGIN_H */
|
|
--
|
|
2.40.1
|
|
|
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: info-cppsp <info@cppsp.de>
|
|
Date: Tue, 19 Sep 2017 08:25:04 +0200
|
|
Subject: [PATCH 2/4] fixed memory leaks in update_device()
|
|
|
|
(cherry picked from commit b46d8ac24d38b4b1a099fcc237f06ec5d3becfda)
|
|
---
|
|
plugins/udisks2/udisks2-plugin.c | 91 ++++++++++++++++++++++----------
|
|
1 file changed, 63 insertions(+), 28 deletions(-)
|
|
|
|
diff --git a/plugins/udisks2/udisks2-plugin.c b/plugins/udisks2/udisks2-plugin.c
|
|
index 3bc6eef..2fe401e 100644
|
|
--- a/plugins/udisks2/udisks2-plugin.c
|
|
+++ b/plugins/udisks2/udisks2-plugin.c
|
|
@@ -81,13 +81,14 @@ const gchar *plugin_name = "udisks2";
|
|
GHashTable *devices = NULL;
|
|
|
|
/* This is a global variable for convenience */
|
|
-GDBusConnection *connection;
|
|
+GDBusConnection *connection = NULL;
|
|
|
|
|
|
static void update_device(DevInfo *info)
|
|
{
|
|
GError *error = NULL;
|
|
- GVariant *tempgvar;
|
|
+ GVariant *tempgvar = NULL;
|
|
+ GVariant *tempgvar2 = NULL;
|
|
gdouble temp;
|
|
|
|
// check valid input parameter
|
|
@@ -109,9 +110,21 @@ static void update_device(DevInfo *info)
|
|
UDISKS2_BUS_NAME,
|
|
info->path,
|
|
UDISKS2_PROPERTIES_INTERFACE,
|
|
- NULL, NULL
|
|
+ NULL, &error
|
|
);
|
|
|
|
+ // check, just to be sure
|
|
+ if (NULL == info->sensor_proxy)
|
|
+ {
|
|
+
|
|
+#ifdef UD2PD
|
|
+syslog(LOG_ERR, "Failed to get drive temperature 1");
|
|
+#endif
|
|
+ g_debug("Failed to get drive temperature 1: %s",
|
|
+ error->message);
|
|
+ g_clear_error(&error);
|
|
+ return;
|
|
+ }
|
|
}
|
|
|
|
// "DriveAtaSmartTimeCollected" in ud2 is "drive ata SmartUpdated"
|
|
@@ -180,28 +193,37 @@ static void update_device(DevInfo *info)
|
|
{
|
|
|
|
#ifdef UD2PD
|
|
-syslog(LOG_ERR, "Failed to get drive temperature");
|
|
+syslog(LOG_ERR, "Failed to get drive temperature 2");
|
|
#endif
|
|
- g_debug("Failed to get drive temperature: %s",
|
|
+ g_debug("Failed to get drive temperature 2: %s",
|
|
error->message);
|
|
- g_error_free(error);
|
|
+ g_clear_error(&error);
|
|
// throw away proxy, maybe next time it will be better
|
|
- g_object_unref(info->sensor_proxy);
|
|
+ g_clear_object(&info->sensor_proxy);
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
|
|
#ifdef UD2PD
|
|
-syslog(LOG_ERR, "tempgvar value: %s", g_variant_print(g_variant_get_variant(g_variant_get_child_value(tempgvar, 0)), TRUE));
|
|
+syslog(LOG_ERR, "tempgvar value: %s", g_variant_print(tempgvar, TRUE));
|
|
+// leaks memory!
|
|
+//syslog(LOG_ERR, "tempgvar value: %s", g_variant_print(g_variant_get_variant(g_variant_get_child_value(tempgvar, 0)), TRUE));
|
|
#endif
|
|
|
|
// tempgvar comes back as sg along the lines of array(gvariant(tempasdouble))
|
|
// hence unpacking
|
|
- temp = g_variant_get_double(g_variant_get_variant(g_variant_get_child_value(tempgvar, 0)));
|
|
+ // need to free up every param / return value, so can't do it like:
|
|
+ //temp = g_variant_get_double(g_variant_get_variant(g_variant_get_child_value(tempgvar, 0)));
|
|
+ tempgvar2 = g_variant_get_child_value(tempgvar, 0);
|
|
+ g_variant_unref(tempgvar);
|
|
+ tempgvar = g_variant_get_variant(tempgvar2);
|
|
+ g_variant_unref(tempgvar2);
|
|
+ temp = g_variant_get_double(tempgvar);
|
|
+ g_variant_unref(tempgvar);
|
|
+
|
|
// temp in K
|
|
info->temp = temp - 273.15;
|
|
- g_variant_unref(tempgvar);
|
|
|
|
#ifdef UD2PD
|
|
syslog(LOG_ERR, "Refresh udisks2 device temp: '%f'\n", info->temp);
|
|
@@ -240,7 +262,7 @@ static void udisks2_plugin_get_sensors(GList **sensors) {
|
|
syslog(LOG_ERR, "fstart");
|
|
#endif
|
|
|
|
- GDBusProxy *proxy;
|
|
+ GDBusProxy *proxy = NULL;
|
|
GError *error = NULL;
|
|
|
|
DevInfo *info;
|
|
@@ -251,7 +273,7 @@ syslog(LOG_ERR, "fstart");
|
|
// fd1: Returns a connection to the given bus. The connection is a global variable shared with other callers of this function.
|
|
// fd2: Synchronously connects to the message bus specified by bus_type . Note that the returned object may shared with other callers, e.g. if two separate parts of a process calls this function with the same bus_type , they will share the same object.
|
|
connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
|
|
- if (connection == NULL)
|
|
+ if (NULL == connection)
|
|
{
|
|
|
|
#ifdef UD2PD
|
|
@@ -260,7 +282,7 @@ syslog(LOG_ERR, "dbus conn fail");
|
|
|
|
g_debug("Failed to open connection to DBUS: %s",
|
|
error->message);
|
|
- g_error_free(error);
|
|
+ g_clear_error(&error);
|
|
return;
|
|
}
|
|
|
|
@@ -278,9 +300,22 @@ syslog(LOG_ERR, "dbus conn success");
|
|
UDISKS2_BUS_NAME,
|
|
UDISKS2_OBJECT_PATH,
|
|
UDISKS2_INTERFACE_NAME,
|
|
- NULL, NULL
|
|
+ NULL, &error
|
|
);
|
|
|
|
+ if (NULL == proxy)
|
|
+ {
|
|
+
|
|
+#ifdef UD2PD
|
|
+syslog(LOG_ERR, "dbus conn proxy fail");
|
|
+#endif
|
|
+ g_debug("dbus conn proxy fail: %s",
|
|
+ error->message);
|
|
+ g_clear_error(&error);
|
|
+ g_clear_object(&connection);
|
|
+ return;
|
|
+ }
|
|
+
|
|
#ifdef UD2PD
|
|
syslog(LOG_ERR, "dbus conn proxy success");
|
|
#endif
|
|
@@ -295,17 +330,18 @@ syslog(LOG_ERR, "dbus conn proxy success");
|
|
// "GetManagedObjects" returns dict of (objectpath, (dict of (string [ie. if. name], dict of(string [ie. property name], variant [ie. prop. value]))))
|
|
|
|
// g_dbus_proxy_call_sync() returns NULL on error, GVariant * otherwise
|
|
- GVariant *managed_objects;
|
|
+ // need second param to prevent memory leak
|
|
+ GVariant *managed_objects, *managed_objects2;
|
|
|
|
|
|
- managed_objects = g_dbus_proxy_call_sync(proxy, "GetManagedObjects",
|
|
+ managed_objects2 = g_dbus_proxy_call_sync(proxy, "GetManagedObjects",
|
|
NULL, // parameters
|
|
G_DBUS_CALL_FLAGS_NONE, // flags
|
|
-1, // timeout
|
|
NULL, // cancellable
|
|
&error);
|
|
|
|
- if (NULL == managed_objects)
|
|
+ if (NULL == managed_objects2)
|
|
{
|
|
|
|
#ifdef UD2PD
|
|
@@ -314,15 +350,15 @@ syslog(LOG_ERR, "Failed to enumerate disk devices");
|
|
|
|
g_debug("Failed to enumerate disk devices: %s",
|
|
error->message);
|
|
- g_error_free(error);
|
|
- g_object_unref(proxy);
|
|
- g_object_unref(connection);
|
|
- connection = NULL;
|
|
+ g_clear_error(&error);
|
|
+ g_clear_object(&proxy);
|
|
+ g_clear_object(&connection);
|
|
return;
|
|
}
|
|
|
|
// the result dictionary is enclosed in an array, unpack
|
|
- managed_objects = g_variant_get_child_value(managed_objects, 0);
|
|
+ managed_objects = g_variant_get_child_value(managed_objects2, 0);
|
|
+ g_variant_unref(managed_objects2);
|
|
|
|
#ifdef UD2PD
|
|
//syslog(LOG_ERR, "managed_objects type: %s", g_variant_print(managed_objects, TRUE));
|
|
@@ -412,7 +448,7 @@ syslog(LOG_ERR, "Found udisks2 device temp: '%f'\n", temp);
|
|
{
|
|
|
|
info = g_malloc0(sizeof(DevInfo));
|
|
- if (devices == NULL)
|
|
+ if (NULL == devices)
|
|
{
|
|
devices = g_hash_table_new(g_str_hash,
|
|
g_str_equal);
|
|
@@ -483,11 +519,10 @@ syslog(LOG_ERR, "b4 free3");
|
|
|
|
|
|
g_variant_unref(managed_objects);
|
|
- g_object_unref(proxy);
|
|
- if (devices == NULL)
|
|
+ g_clear_object(&proxy);
|
|
+ if (NULL == devices)
|
|
{
|
|
- g_object_unref(connection);
|
|
- connection = NULL;
|
|
+ g_clear_object(&connection);
|
|
}
|
|
}
|
|
|
|
@@ -501,7 +536,7 @@ static gdouble udisks2_plugin_get_sensor_value(const gchar *path,
|
|
|
|
// get device stuct from data store
|
|
info = (DevInfo *)g_hash_table_lookup(devices, path);
|
|
- if (info == NULL)
|
|
+ if (NULL == info)
|
|
{
|
|
g_set_error(error, SENSORS_APPLET_PLUGIN_ERROR, 0,
|
|
"Error finding disk with path %s", path);
|
|
--
|
|
2.40.1
|
|
|
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: info-cppsp <info@cppsp.de>
|
|
Date: Sat, 27 Jan 2018 12:12:32 +0100
|
|
Subject: [PATCH 3/4] Remove deprecated udisks plugin
|
|
|
|
udisks and dbus-glib have been deprecated for at least 5 years.
|
|
Linux Mint 17.3 and therefore Ubuntu 14.04 LTS ship with udisks2 as default.
|
|
I've also made a new plugin for udisks2.
|
|
Let's just get rid of this, shall we?
|
|
|
|
(cherry picked from commit 86b3ec83e0b236b0a1a25bcb12444a6a7ce61a25)
|
|
|
|
Conflicts:
|
|
configure.ac
|
|
plugins/udisks/Makefile.am
|
|
plugins/udisks/udisks-plugin.c
|
|
plugins/udisks/udisks-plugin.h
|
|
---
|
|
configure.ac | 30 ---
|
|
plugins/Makefile.am | 5 -
|
|
plugins/udisks/Makefile.am | 25 ---
|
|
plugins/udisks/udisks-plugin.c | 328 ---------------------------------
|
|
plugins/udisks/udisks-plugin.h | 24 ---
|
|
5 files changed, 412 deletions(-)
|
|
delete mode 100644 plugins/udisks/Makefile.am
|
|
delete mode 100644 plugins/udisks/udisks-plugin.c
|
|
delete mode 100644 plugins/udisks/udisks-plugin.h
|
|
|
|
diff --git a/configure.ac b/configure.ac
|
|
index 239c60b..7704412 100644
|
|
--- a/configure.ac
|
|
+++ b/configure.ac
|
|
@@ -56,8 +56,6 @@ GTK_REQUIRED=3.4.0
|
|
LIBPANEL_REQUIRED=3.0.0
|
|
LIBNOTIFY_REQUIRED=0.3.0
|
|
LIBCAIRO_REQUIRED=1.0.4
|
|
-LIBDBUSGLIB_REQUIRED=0.80
|
|
-LIBATASMART_REQUIRED=0.16
|
|
|
|
PKG_CHECK_MODULES(GLIB, glib-2.0 >= $GLIB_REQUIRED)
|
|
AC_SUBST(GLIB_CFLAGS)
|
|
@@ -78,33 +76,6 @@ PKG_CHECK_MODULES(CAIRO, cairo >= $LIBCAIRO_REQUIRED)
|
|
AC_SUBST(CAIRO_CFLAGS)
|
|
AC_SUBST(CAIRO_LIBS)
|
|
|
|
-# enable support for udisks (via dbus) by default if its available
|
|
-AC_ARG_ENABLE(udisks,
|
|
- AS_HELP_STRING([--disable-udisks],
|
|
- [Disable support for udisks sensor readings via DBUS.]),
|
|
- enable_udisks=$enableval, enable_udisks="yes")
|
|
-
|
|
-if test "x$enable_udisks" = "xno" ; then
|
|
- echo "Disabling udisks support"
|
|
-else
|
|
- PKG_CHECK_MODULES(DBUSGLIB, dbus-glib-1 >= $LIBDBUSGLIB_REQUIRED,
|
|
- HAVE_DBUSGLIB="yes", HAVE_DBUSGLIB="no")
|
|
- AC_SUBST(DBUSGLIB_CFLAGS)
|
|
- AC_SUBST(DBUSGLIB_LIBS)
|
|
-
|
|
- PKG_CHECK_MODULES(LIBATASMART, libatasmart >= $LIBATASMART_REQUIRED,
|
|
- HAVE_LIBATASMART="yes", HAVE_LIBATASMART="no")
|
|
- AC_SUBST(LIBATASMART_CFLAGS)
|
|
- AC_SUBST(LIBATASMART_LIBS)
|
|
-fi
|
|
-
|
|
-AM_CONDITIONAL(UDISKS, test -n "$DBUSGLIB_CFLAGS" -a -n "$LIBATASMART_CFLAGS")
|
|
-
|
|
-# enable support for udisks2 (via dbus) by default if its available
|
|
-AC_ARG_ENABLE(udisks2,
|
|
- AS_HELP_STRING([--disable-udisks2],
|
|
- [Disable support for udisks2 sensor readings via DBUS.]),
|
|
- enable_udisks2=$enableval, enable_udisks2="yes")
|
|
|
|
if test "x$enable_udisks2" = "xno" ; then
|
|
echo "Disabling udisks2 support"
|
|
@@ -290,7 +261,6 @@ AC_CONFIG_FILES([
|
|
lib/Makefile
|
|
plugins/Makefile
|
|
plugins/acpi/Makefile
|
|
- plugins/udisks/Makefile
|
|
plugins/udisks2/Makefile
|
|
plugins/eee/Makefile
|
|
plugins/hddtemp/Makefile
|
|
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
|
|
index d787000..c4a4044 100644
|
|
--- a/plugins/Makefile.am
|
|
+++ b/plugins/Makefile.am
|
|
@@ -1,6 +1,5 @@
|
|
DIST_SUBDIRS = \
|
|
acpi \
|
|
- udisks \
|
|
udisks2 \
|
|
eee \
|
|
hddtemp \
|
|
@@ -29,10 +28,6 @@ SUBDIRS = \
|
|
smu-sys \
|
|
sonypi
|
|
|
|
-if UDISKS
|
|
-SUBDIRS += udisks
|
|
-endif
|
|
-
|
|
if UDISKS2
|
|
SUBDIRS += udisks2
|
|
endif
|
|
diff --git a/plugins/udisks/Makefile.am b/plugins/udisks/Makefile.am
|
|
deleted file mode 100644
|
|
index 8772824..0000000
|
|
--- a/plugins/udisks/Makefile.am
|
|
+++ /dev/null
|
|
@@ -1,25 +0,0 @@
|
|
-# UDisks plugin
|
|
-plugindir = $(libdir)/sensors-applet/plugins
|
|
-
|
|
-libudisks_la_CPPFLAGS = -DGNOMELOCALEDIR=\""$(datadir)/locale/"\" \
|
|
- -DG_LOG_DOMAIN=\""Sensors Applet"\" \
|
|
- -DPIXMAPS_DIR=\""$(datadir)/pixmaps/$(PACKAGE)/"\" \
|
|
- -DDATADIR=\""$(datadir)"\" \
|
|
- -DLIBDIR=\""$(libdir)"\" \
|
|
- -DSYSCONFDIR=\""$(sysconfdir)"\" \
|
|
- -DPREFIX=\""$(prefix)"\" \
|
|
- -I$(top_srcdir) \
|
|
- $(DBUSGLIB_CFLAGS)
|
|
- $(LIBATASMART_CFLAGS)
|
|
-
|
|
-
|
|
-
|
|
-plugin_LTLIBRARIES = libudisks.la
|
|
-
|
|
-libudisks_la_SOURCES = \
|
|
- udisks-plugin.h \
|
|
- udisks-plugin.c
|
|
-
|
|
-libudisks_la_LDFLAGS = $(PLUGIN_LIBTOOL_FLAGS) $(DBUSGLIB_LIBS) $(LIBATASMART_LIBS)
|
|
-
|
|
-libudisks_la_LIBADD = $(top_builddir)/lib/libsensors-applet-plugin.la
|
|
diff --git a/plugins/udisks/udisks-plugin.c b/plugins/udisks/udisks-plugin.c
|
|
deleted file mode 100644
|
|
index f7915da..0000000
|
|
--- a/plugins/udisks/udisks-plugin.c
|
|
+++ /dev/null
|
|
@@ -1,328 +0,0 @@
|
|
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
|
|
- *
|
|
- * Copyright (C) 2009 Pramod Dematagoda <pmd.lotr.gandalf@gmail.com>
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or modify
|
|
- * it under the terms of the GNU General Public License as published by
|
|
- * the Free Software Foundation; either version 2 of the License, or
|
|
- * (at your option) any later version.
|
|
- *
|
|
- * This program is distributed in the hope that it will be useful,
|
|
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
- * GNU General Public License for more details.
|
|
- *
|
|
- * You should have received a copy of the GNU General Public License along
|
|
- * with this program; if not, write to the Free Software Foundation, Inc.,
|
|
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
- */
|
|
-
|
|
-#ifdef HAVE_CONFIG_H
|
|
-#include "config.h"
|
|
-#endif /* HAVE_CONFIG_H */
|
|
-
|
|
-#include <stdio.h>
|
|
-#include <atasmart.h>
|
|
-#include <glib.h>
|
|
-#include <dbus/dbus-glib.h>
|
|
-#include "udisks-plugin.h"
|
|
-
|
|
-#define UDISKS_BUS_NAME "org.freedesktop.UDisks"
|
|
-#define UDISKS_DEVICE_INTERFACE_NAME "org.freedesktop.UDisks.Device"
|
|
-#define UDISKS_INTERFACE_NAME "org.freedesktop.UDisks"
|
|
-#define UDISKS_PROPERTIES_INTERFACE "org.freedesktop.DBus.Properties"
|
|
-#define UDISKS_OBJECT_PATH "/org/freedesktop/UDisks"
|
|
-
|
|
-
|
|
-/*
|
|
- * Info about a single sensor
|
|
- */
|
|
-typedef struct _DevInfo{
|
|
- gchar *path;
|
|
- gdouble temp;
|
|
- DBusGProxy *sensor_proxy;
|
|
- GError *error;
|
|
-} DevInfo;
|
|
-
|
|
-const gchar *plugin_name = "udisks";
|
|
-
|
|
-GHashTable *devices = NULL;
|
|
-
|
|
-/* This is a global variable for convenience */
|
|
-DBusGConnection *connection;
|
|
-
|
|
-static void update_device(DevInfo *info)
|
|
-{
|
|
- DBusGProxy *sensor_proxy;
|
|
- GValue smart_time = { 0, };
|
|
- SkDisk *sk_disk;
|
|
- GValue smart_blob_val = { 0, };
|
|
- GArray *smart_blob;
|
|
- guint64 temperature;
|
|
-
|
|
- g_return_if_fail(info != NULL);
|
|
-
|
|
- g_clear_error(&info->error);
|
|
-
|
|
- sensor_proxy = dbus_g_proxy_new_for_name(connection,
|
|
- UDISKS_BUS_NAME,
|
|
- info->path,
|
|
- UDISKS_PROPERTIES_INTERFACE);
|
|
-
|
|
- if (!dbus_g_proxy_call(sensor_proxy, "Get", NULL,
|
|
- G_TYPE_STRING, UDISKS_BUS_NAME,
|
|
- G_TYPE_STRING, "DriveAtaSmartTimeCollected", G_TYPE_INVALID,
|
|
- G_TYPE_VALUE, &smart_time,
|
|
- G_TYPE_INVALID) ||
|
|
- !g_value_get_uint64(&smart_time))
|
|
- {
|
|
- g_object_unref(sensor_proxy);
|
|
- return;
|
|
- }
|
|
-
|
|
- if (!dbus_g_proxy_call(sensor_proxy, "Get", &info->error,
|
|
- G_TYPE_STRING, UDISKS_BUS_NAME,
|
|
- G_TYPE_STRING, "DriveAtaSmartBlob", G_TYPE_INVALID,
|
|
- G_TYPE_VALUE, &smart_blob_val,
|
|
- G_TYPE_INVALID))
|
|
- {
|
|
- g_debug("Error getting DriveAtaSmartBlob %s",
|
|
- info->error ? info->error->message : "NULL");
|
|
- g_object_unref(sensor_proxy);
|
|
- return;
|
|
- }
|
|
- smart_blob = g_value_get_boxed(&smart_blob_val);
|
|
-
|
|
- sk_disk_open(NULL, &sk_disk);
|
|
- sk_disk_set_blob(sk_disk, smart_blob->data, smart_blob->len);
|
|
- if (sk_disk_smart_get_temperature(sk_disk, &temperature) < 0)
|
|
- {
|
|
- g_debug("Error getting temperature from AtaSmartBlob");
|
|
- g_free(sk_disk);
|
|
- g_array_free(smart_blob, TRUE);
|
|
- g_object_unref(sensor_proxy);
|
|
- return;
|
|
- }
|
|
-
|
|
- /* Temperature is in mK, so convert it to K first */
|
|
- temperature /= 1000;
|
|
- info->temp = (gdouble)temperature - 273.15;
|
|
-
|
|
- g_free(sk_disk);
|
|
- g_array_free(smart_blob, TRUE);
|
|
- g_object_unref(sensor_proxy);
|
|
-}
|
|
-
|
|
-/* This is the handler for the Changed() signal emitted by UDisks. */
|
|
-static void udisks_changed_signal_cb(DBusGProxy *sensor_proxy) {
|
|
- const gchar *path;
|
|
- DevInfo *info;
|
|
-
|
|
- path = dbus_g_proxy_get_path(sensor_proxy);
|
|
- g_debug("%s changed()", path);
|
|
- info = g_hash_table_lookup(devices, path);
|
|
-
|
|
- update_device(info);
|
|
-}
|
|
-
|
|
-static void udisks_plugin_get_sensors(GList **sensors) {
|
|
- DBusGProxy *proxy, *sensor_proxy;
|
|
- GError *error = NULL;
|
|
- GPtrArray *paths;
|
|
- guint i;
|
|
- DevInfo *info;
|
|
-
|
|
- g_type_init();
|
|
-
|
|
- /* This connection will be used for everything, including the obtaining
|
|
- * of sensor data
|
|
- */
|
|
- connection = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error);
|
|
- if (connection == NULL)
|
|
- {
|
|
- g_debug("Failed to open connection to DBUS: %s",
|
|
- error->message);
|
|
- g_error_free(error);
|
|
- return;
|
|
- }
|
|
-
|
|
- /* This is the proxy which is only used once during the enumeration of
|
|
- * the device object paths
|
|
- */
|
|
- proxy = dbus_g_proxy_new_for_name(connection,
|
|
- UDISKS_BUS_NAME,
|
|
- UDISKS_OBJECT_PATH,
|
|
- UDISKS_INTERFACE_NAME);
|
|
-
|
|
- /* The object paths of the disks are enumerated and placed in an array
|
|
- * of object paths
|
|
- */
|
|
- if (!dbus_g_proxy_call(proxy, "EnumerateDevices", &error,
|
|
- G_TYPE_INVALID,
|
|
- dbus_g_type_get_collection("GPtrArray",
|
|
- DBUS_TYPE_G_OBJECT_PATH),
|
|
- &paths,
|
|
- G_TYPE_INVALID))
|
|
- {
|
|
- g_debug("Failed to enumerate disk devices: %s",
|
|
- error->message);
|
|
- g_error_free(error);
|
|
- g_object_unref(proxy);
|
|
- dbus_g_connection_unref(connection);
|
|
- connection = NULL;
|
|
- return;
|
|
- }
|
|
-
|
|
- for (i = 0; i < paths->len; i++) {
|
|
- /* This proxy is used to get the required data in order to build
|
|
- * up the list of sensors
|
|
- */
|
|
- GValue model = {0, }, id = {0, }, smart_available = {0, };
|
|
- gchar *path = (gchar *)g_ptr_array_index(paths, i);
|
|
-
|
|
- sensor_proxy = dbus_g_proxy_new_for_name(connection,
|
|
- UDISKS_BUS_NAME,
|
|
- path,
|
|
- UDISKS_PROPERTIES_INTERFACE);
|
|
-
|
|
- if (dbus_g_proxy_call(sensor_proxy, "Get", &error,
|
|
- G_TYPE_STRING,
|
|
- UDISKS_BUS_NAME,
|
|
- G_TYPE_STRING,
|
|
- "DriveAtaSmartIsAvailable",
|
|
- G_TYPE_INVALID,
|
|
- G_TYPE_VALUE, &smart_available, G_TYPE_INVALID)) {
|
|
- gchar *id_str, *model_str;
|
|
- if (!g_value_get_boolean(&smart_available)) {
|
|
- g_debug("Drive at path '%s' does not support Smart monitoring... ignoring",
|
|
- path);
|
|
- g_object_unref(sensor_proxy);
|
|
- g_free (path);
|
|
- continue;
|
|
- }
|
|
-
|
|
- dbus_g_proxy_call(sensor_proxy, "Get", NULL,
|
|
- G_TYPE_STRING, UDISKS_BUS_NAME,
|
|
- G_TYPE_STRING, "DriveModel",
|
|
- G_TYPE_INVALID,
|
|
- G_TYPE_VALUE, &model,
|
|
- G_TYPE_INVALID);
|
|
-
|
|
- dbus_g_proxy_call(sensor_proxy, "Get", NULL,
|
|
- G_TYPE_STRING, UDISKS_BUS_NAME,
|
|
- G_TYPE_STRING, "DeviceFile",
|
|
- G_TYPE_INVALID,
|
|
- G_TYPE_VALUE, &id,
|
|
- G_TYPE_INVALID);
|
|
-
|
|
- g_object_unref(sensor_proxy);
|
|
-
|
|
- sensor_proxy = dbus_g_proxy_new_for_name(connection,
|
|
- UDISKS_BUS_NAME,
|
|
- path,
|
|
- UDISKS_DEVICE_INTERFACE_NAME);
|
|
-
|
|
- /* Use the Changed() signal emitted from UDisks to
|
|
- * get the temperature immediately if it changes rather
|
|
- * than waiting to poll
|
|
- */
|
|
- dbus_g_proxy_add_signal(sensor_proxy, "Changed",
|
|
- G_TYPE_INVALID);
|
|
-
|
|
- dbus_g_proxy_connect_signal(sensor_proxy, "Changed",
|
|
- G_CALLBACK(udisks_changed_signal_cb),
|
|
- path, NULL);
|
|
-
|
|
- info = g_malloc0(sizeof(DevInfo));
|
|
- if (devices == NULL)
|
|
- {
|
|
- devices = g_hash_table_new(g_str_hash,
|
|
- g_str_equal);
|
|
- }
|
|
- info->path = g_strdup(path);
|
|
- info->sensor_proxy = sensor_proxy;
|
|
- info->temp = 0.0;
|
|
- g_hash_table_insert(devices, info->path, info);
|
|
-
|
|
- /* Write the sensor data */
|
|
- id_str = g_value_dup_string(&id);
|
|
- model_str = g_value_dup_string(&model);
|
|
- sensors_applet_plugin_add_sensor(sensors,
|
|
- path,
|
|
- id_str,
|
|
- model_str,
|
|
- TEMP_SENSOR,
|
|
- FALSE,
|
|
- HDD_ICON,
|
|
- DEFAULT_GRAPH_COLOR);
|
|
- g_free(id_str);
|
|
- g_free(model_str);
|
|
- } else {
|
|
- g_debug ("Cannot obtain data for device: %s\n"
|
|
- "Error: %s\n",
|
|
- path,
|
|
- error->message);
|
|
- g_error_free (error);
|
|
- error = NULL;
|
|
- g_object_unref(sensor_proxy);
|
|
- }
|
|
- g_free(path);
|
|
- }
|
|
- g_ptr_array_free(paths, TRUE);
|
|
- g_object_unref(proxy);
|
|
- if (devices == NULL)
|
|
- {
|
|
- dbus_g_connection_unref(connection);
|
|
- connection = NULL;
|
|
- }
|
|
-}
|
|
-
|
|
-static gdouble udisks_plugin_get_sensor_value(const gchar *path,
|
|
- const gchar *id,
|
|
- SensorType type,
|
|
- GError **error) {
|
|
- DevInfo *info;
|
|
-
|
|
- info = (DevInfo *)g_hash_table_lookup(devices, path);
|
|
- if (info == NULL)
|
|
- {
|
|
- g_set_error(error, SENSORS_APPLET_PLUGIN_ERROR, 0,
|
|
- "Error finding disk with path %s", path);
|
|
- return 0.0;
|
|
- }
|
|
- if (info->error)
|
|
- {
|
|
- *error = info->error;
|
|
- info->error = NULL;
|
|
- return 0.0;
|
|
- }
|
|
- /* update value since Changed() signal doesn't fire manually enough so
|
|
- * poll instead */
|
|
- update_device(info);
|
|
- return info->temp;
|
|
-}
|
|
-
|
|
-static GList *udisks_plugin_init(void) {
|
|
- GList *sensors = NULL;
|
|
-
|
|
- udisks_plugin_get_sensors(&sensors);
|
|
-
|
|
- return sensors;
|
|
-}
|
|
-
|
|
-const gchar *sensors_applet_plugin_name(void)
|
|
-{
|
|
- return plugin_name;
|
|
-}
|
|
-
|
|
-GList *sensors_applet_plugin_init(void)
|
|
-{
|
|
- return udisks_plugin_init();
|
|
-}
|
|
-
|
|
-gdouble sensors_applet_plugin_get_sensor_value(const gchar *path,
|
|
- const gchar *id,
|
|
- SensorType type,
|
|
- GError **error) {
|
|
- return udisks_plugin_get_sensor_value(path, id, type, error);
|
|
-}
|
|
diff --git a/plugins/udisks/udisks-plugin.h b/plugins/udisks/udisks-plugin.h
|
|
deleted file mode 100644
|
|
index 58892eb..0000000
|
|
--- a/plugins/udisks/udisks-plugin.h
|
|
+++ /dev/null
|
|
@@ -1,24 +0,0 @@
|
|
-/*
|
|
- * Copyright (C) 2009 Pramod Dematagoda <pmd.lotr.gandalf@gmail.com>
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or modify
|
|
- * it under the terms of the GNU General Public License as published by
|
|
- * the Free Software Foundation; either version 2 of the License, or
|
|
- * (at your option) any later version.
|
|
- *
|
|
- * This program is distributed in the hope that it will be useful,
|
|
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
- * GNU General Public License for more details.
|
|
- *
|
|
- * You should have received a copy of the GNU General Public License along
|
|
- * with this program; if not, write to the Free Software Foundation, Inc.,
|
|
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
- */
|
|
-
|
|
-#ifndef UDISKS_PLUGIN_H
|
|
-#define UDISKS_PLUGIN_H
|
|
-
|
|
-#include <sensors-applet/sensors-applet-plugin.h>
|
|
-
|
|
-#endif /* UDISKS_PLUGIN_H */
|
|
--
|
|
2.40.1
|
|
|
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: raveit65 <mate@raveit.de>
|
|
Date: Sun, 28 Jan 2018 10:05:23 +0100
|
|
Subject: [PATCH 4/4] build: enable udisk2 plugin again
|
|
|
|
(cherry picked from commit bcd9924b5e561b2af08ec91e5ecbb9ecaf26c13c)
|
|
---
|
|
configure.ac | 6 ++++++
|
|
1 file changed, 6 insertions(+)
|
|
|
|
diff --git a/configure.ac b/configure.ac
|
|
index 7704412..df8dab0 100644
|
|
--- a/configure.ac
|
|
+++ b/configure.ac
|
|
@@ -77,6 +77,12 @@ AC_SUBST(CAIRO_CFLAGS)
|
|
AC_SUBST(CAIRO_LIBS)
|
|
|
|
|
|
+# enable support for udisks2 (via dbus) by default if its available
|
|
+AC_ARG_ENABLE(udisks2,
|
|
+ AS_HELP_STRING([--disable-udisks2],
|
|
+ [Disable support for udisks2 sensor readings via DBUS.]),
|
|
+ enable_udisks2=$enableval, enable_udisks2="yes")
|
|
+
|
|
if test "x$enable_udisks2" = "xno" ; then
|
|
echo "Disabling udisks2 support"
|
|
#else
|
|
diff --git a/sensors-applet/org.gnome.sensors-applet.gschema.xml.in.in b/sensors-applet/org.gnome.sensors-applet.gschema.xml.in.in
|
|
index aeae777..d0b2e53 100644
|
|
--- a/sensors-applet/org.gnome.sensors-applet.gschema.xml.in.in
|
|
+++ b/sensors-applet/org.gnome.sensors-applet.gschema.xml.in.in
|
|
@@ -75,7 +75,7 @@
|
|
<summary></summary>
|
|
<description></description>
|
|
</key>
|
|
- <key name="udisks" type="b">
|
|
+ <key name="udisks2" type="b">
|
|
<default>false</default>
|
|
<summary></summary>
|
|
<description></description>
|
|
--
|
|
2.40.1
|
|
|