summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeandro A. F. Pereira <leandro@hardinfo.org>2006-10-15 14:18:58 +0000
committerLeandro A. F. Pereira <leandro@hardinfo.org>2006-10-15 14:18:58 +0000
commit4db081cacf5e5d9f45931396b1477ef03570f7c7 (patch)
tree8e8c7002001ff4b15c9e26ba26616fcefc29c6e2
parent163dbca219f44b3e7a137a7c02474707b4d2bca6 (diff)
Add hard disk temperature monitor
-rw-r--r--hardinfo2/Makefile.in2
-rw-r--r--hardinfo2/arch/common/fib.h3
-rw-r--r--hardinfo2/arch/linux/common/sensors.h89
-rw-r--r--hardinfo2/computer.c4
-rw-r--r--hardinfo2/loadgraph.c21
-rw-r--r--hardinfo2/loadgraph.h4
-rw-r--r--hardinfo2/shell.c8
-rw-r--r--hardinfo2/socket.c81
-rw-r--r--hardinfo2/socket.h35
9 files changed, 229 insertions, 18 deletions
diff --git a/hardinfo2/Makefile.in b/hardinfo2/Makefile.in
index 1eaf0727..554f42ba 100644
--- a/hardinfo2/Makefile.in
+++ b/hardinfo2/Makefile.in
@@ -7,7 +7,7 @@ CFLAGS = -fPIC -pipe -Wall -g $(GTK_CFLAGS) $(GLADE_CFLAGS) -I.
OBJECTS = hardinfo.o shell.o util.o iconcache.o loadgraph.o sha1.o md5.o \
menu.o stock.o callbacks.o expr.o report.o blowfish.o binreloc.o \
- vendor.o
+ vendor.o socket.o
MODULES = computer.so devices.so benchmark.so
all: $(OBJECTS) $(MODULES)
diff --git a/hardinfo2/arch/common/fib.h b/hardinfo2/arch/common/fib.h
index 493cfd0f..9f2d4e77 100644
--- a/hardinfo2/arch/common/fib.h
+++ b/hardinfo2/arch/common/fib.h
@@ -33,7 +33,7 @@ benchmark_fib(void)
gdouble elapsed = 0;
shell_view_set_enabled(FALSE);
- shell_status_update("Calculating the 42<sup>th</sup> Fibonacci number...");
+ shell_status_update("Calculating the 42nd Fibonacci number...");
g_timer_start(timer);
fib(42); /* the answer? :) */
@@ -47,4 +47,3 @@ benchmark_fib(void)
"<b>This Machine</b>=<b>%.2f</b>\n", elapsed);
return benchmark_include_results(retval, "Fibonacci");
}
-
diff --git a/hardinfo2/arch/linux/common/sensors.h b/hardinfo2/arch/linux/common/sensors.h
index af707076..44e2260d 100644
--- a/hardinfo2/arch/linux/common/sensors.h
+++ b/hardinfo2/arch/linux/common/sensors.h
@@ -131,17 +131,13 @@ adjust_sensor(gchar *name, float value)
return math_postfix_eval(postfix, value);
}
+
static void
-read_sensors(void)
+read_sensors_hwmon(void)
{
- gchar *path_hwmon, *path_sensor, *tmp, *driver, *name, *mon;
int hwmon, count;
-
- if (sensors)
- g_free(sensors);
-
+ gchar *path_hwmon, *path_sensor, *tmp, *driver, *name, *mon;
hwmon = 0;
- sensors = g_strdup("");
path_hwmon = g_strdup_printf("/sys/class/hwmon/hwmon%d/device/", hwmon);
while (g_file_test(path_hwmon, G_FILE_TEST_EXISTS)) {
@@ -233,17 +229,24 @@ read_sensors(void)
}
g_free(path_hwmon);
+
+}
+
+static void
+read_sensors_acpi(void)
+{
+ const gchar *path_tz = "/proc/acpi/thermal_zone";
- path_hwmon = g_strdup("/proc/acpi/thermal_zone");
- if (g_file_test(path_hwmon, G_FILE_TEST_EXISTS)) {
+ if (g_file_test(path_tz, G_FILE_TEST_EXISTS)) {
GDir *tz;
- if ((tz = g_dir_open(path_hwmon, 0, NULL))) {
+ if ((tz = g_dir_open(path_tz, 0, NULL))) {
const gchar *entry;
sensors = g_strdup_printf("%s\n[ACPI Thermal Zone]\n", sensors);
+
while ((entry = g_dir_read_name(tz))) {
- gchar *path = g_strdup_printf("%s/%s/temperature", path_hwmon, entry);
+ gchar *path = g_strdup_printf("%s/%s/temperature", path_tz, entry);
gchar *contents;
if (g_file_get_contents(path, &contents, NULL, NULL)) {
@@ -261,7 +264,69 @@ read_sensors(void)
g_dir_close(tz);
}
}
+
+}
+
+static void
+read_sensors_hddtemp(void)
+{
+ Socket *s = sock_connect("127.0.0.1", 7634);
+ static gchar *old = NULL;
+ gchar buffer[1024];
+ gint len;
- g_free(path_hwmon);
+ if (!s)
+ return;
+
+ len = sock_read(s, buffer, sizeof(buffer));
+ sock_close(s);
+
+ if (len > 2 && buffer[0] == '|' && buffer[1] == '/') {
+ gchar **disks;
+ int i;
+
+ if (old)
+ g_free(old);
+
+ old = g_strdup("[Hard Disk Temperature]\n");
+
+ disks = g_strsplit(buffer, "\n", 0);
+ for (i = 0; disks[i]; i++) {
+ gchar **fields = g_strsplit(disks[i] + 1, "|", 5);
+
+ /*
+ * 0 -> /dev/hda
+ * 1 -> FUJITSU MHV2080AH
+ * 2 -> 41
+ * 3 -> C
+ */
+ old = g_strdup_printf("%s\n"
+ "%s (%s)=%s\302\260%s\n",
+ old,
+ fields[1], fields[0],
+ fields[2], fields[3]);
+
+ g_strfreev(fields);
+ }
+
+ g_strfreev(disks);
+ }
+
+ if (old) {
+ sensors = g_strconcat(sensors, "\n", old, NULL);
+ }
+}
+
+static void
+read_sensors(void)
+{
+ if (sensors)
+ g_free(sensors);
+
+ sensors = g_strdup("");
+
+ read_sensors_hwmon();
+ read_sensors_acpi();
+ read_sensors_hddtemp();
}
diff --git a/hardinfo2/computer.c b/hardinfo2/computer.c
index ecc36d16..ee430d77 100644
--- a/hardinfo2/computer.c
+++ b/hardinfo2/computer.c
@@ -32,6 +32,8 @@
#include <vendor.h>
#include <expr.h>
+#include "socket.h"
+
enum {
COMPUTER_SUMMARY,
COMPUTER_PROCESSORS,
@@ -213,7 +215,7 @@ hi_info(gint entry)
"%s\n", human_users, sys_users);
case COMPUTER_SENSORS:
return g_strdup_printf("[$ShellParam$]\n"
- "ReloadInterval=3000\n"
+ "ReloadInterval=5000\n"
"%s", sensors);
case COMPUTER_SHARES:
return g_strdup_printf("[SAMBA]\n"
diff --git a/hardinfo2/loadgraph.c b/hardinfo2/loadgraph.c
index 53fb54f7..18ae08c8 100644
--- a/hardinfo2/loadgraph.c
+++ b/hardinfo2/loadgraph.c
@@ -42,12 +42,24 @@ LoadGraph *load_graph_new(gint size)
lg->width = size * 4;
lg->height = size * 2;
+ lg->max_value = -1;
+
gtk_widget_set_size_request(lg->area, lg->width, lg->height);
gtk_widget_show(lg->area);
return lg;
}
+int load_graph_get_max(LoadGraph *lg)
+{
+ return lg->max_value;
+}
+
+void load_graph_set_max(LoadGraph *lg, gint value)
+{
+ lg->max_value = value;
+}
+
GtkWidget *load_graph_get_framed(LoadGraph *lg)
{
GtkWidget *align, *frame;
@@ -73,6 +85,7 @@ void load_graph_clear(LoadGraph *lg)
lg->data[i] = 0;
lg->scale = 1.0;
+// lg->max_value = -1;
_draw(lg);
}
@@ -196,7 +209,13 @@ load_graph_update(LoadGraph *lg, gint value)
if (value < 0)
return;
- lg->scale = (gfloat)lg->height / (gfloat)_max(lg);
+ if (lg->max_value > 0) {
+ lg->scale = (gfloat)lg->height / (gfloat)_max(lg);
+ } else {
+ lg->scale = (gfloat)lg->height / (gfloat)lg->max_value;
+
+ g_print("using max value %d; scale is %f\n", lg->max_value, lg->scale);
+ }
/* shift-right our data */
for (i = 0; i < lg->size; i++) {
diff --git a/hardinfo2/loadgraph.h b/hardinfo2/loadgraph.h
index fdd967f0..93185af0 100644
--- a/hardinfo2/loadgraph.h
+++ b/hardinfo2/loadgraph.h
@@ -46,6 +46,8 @@ struct _LoadGraph {
gint size;
gint width, height;
LoadGraphColor color;
+
+ gint max_value;
};
LoadGraph *load_graph_new(gint size);
@@ -54,6 +56,8 @@ void load_graph_configure_expose(LoadGraph *lg);
GtkWidget *load_graph_get_framed(LoadGraph *lg);
void load_graph_update(LoadGraph *lg, gint value);
+void load_graph_set_max(LoadGraph *lg, gint value);
+int load_graph_get_max(LoadGraph *lg);
void load_graph_set_color(LoadGraph *lg, LoadGraphColor color);
void load_graph_clear(LoadGraph *lg);
diff --git a/hardinfo2/shell.c b/hardinfo2/shell.c
index 66d83cf9..8f051241 100644
--- a/hardinfo2/shell.c
+++ b/hardinfo2/shell.c
@@ -546,7 +546,7 @@ static gboolean
update_field(gpointer data)
{
ShellFieldUpdate *fu = (ShellFieldUpdate *) data;
-
+
/* if the entry is still selected, update it */
if (fu->entry->selected && fu->entry->fieldfunc) {
gchar *value = fu->entry->fieldfunc(fu->field_name);
@@ -556,6 +556,7 @@ update_field(gpointer data)
SHELL_VIEW_LOAD_GRAPH */
if (fu->loadgraph && shell->view_type == SHELL_VIEW_LOAD_GRAPH) {
GtkTreeSelection *ts;
+
ts = gtk_tree_view_get_selection(GTK_TREE_VIEW
(shell->info->view));
@@ -686,6 +687,11 @@ group_handle_special(GKeyFile * key_file, ShellModuleEntry * entry,
fu->loadgraph = TRUE;
g_timeout_add(ms, update_field, fu);
+ } else if (g_str_equal(key, "LoadGraphMaxValue")) {
+ gint max_value;
+
+ max_value = g_key_file_get_integer(key_file, group, key, NULL);
+ load_graph_set_max(shell->loadgraph, max_value);
} else if (g_str_equal(key, "ReloadInterval")) {
gint ms;
diff --git a/hardinfo2/socket.c b/hardinfo2/socket.c
new file mode 100644
index 00000000..4212c547
--- /dev/null
+++ b/hardinfo2/socket.c
@@ -0,0 +1,81 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * 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, version 2.
+ *
+ * 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
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <arpa/inet.h>
+#include <errno.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <glib.h>
+
+#include "socket.h"
+
+Socket *sock_connect(gchar * host, gint port)
+{
+ struct sockaddr_in server;
+ Socket *s;
+ int sock;
+
+ sock = socket(AF_INET, SOCK_STREAM, 0);
+ if (sock > 0) {
+ memset(&server, 0, sizeof(server));
+ server.sin_family = AF_INET;
+ server.sin_addr.s_addr = inet_addr(host);
+ server.sin_port = htons(port);
+
+ if (connect(sock, (struct sockaddr *) (void *) &server, sizeof(server)) < 0) {
+ return NULL;
+ }
+
+ s = g_new0(Socket, 1);
+ s->host = g_strdup(host);
+ s->port = port;
+ s->sock = sock;
+
+ return s;
+ }
+
+ return NULL;
+}
+
+int sock_write(Socket * s, gchar * str)
+{
+ return write(s->sock, str, strlen(str));
+}
+
+int sock_read(Socket * s, gchar * buffer, gint size)
+{
+ gint n;
+
+ n = read(s->sock, buffer, size);
+ buffer[n] = '\0';
+
+ return n;
+}
+
+void sock_close(Socket * s)
+{
+ close(s->sock);
+ g_free(s->host);
+ g_free(s);
+}
diff --git a/hardinfo2/socket.h b/hardinfo2/socket.h
new file mode 100644
index 00000000..4c8fddb2
--- /dev/null
+++ b/hardinfo2/socket.h
@@ -0,0 +1,35 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
+ *
+ * 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, version 2.
+ *
+ * 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 __HI_SOCKET_H__
+#define __HI_SOCKET_H__
+
+typedef struct _Socket Socket;
+
+struct _Socket {
+ gchar *host;
+ gint port;
+ gint sock;
+};
+
+Socket *sock_connect(gchar * host, gint port);
+int sock_write(Socket * s, gchar * str);
+int sock_read(Socket * s, gchar * buffer, gint size);
+void sock_close(Socket * s);
+
+#endif /* __HI_SOCKET_H__ */