Merge branch 'ad/aquaero'

This commit is contained in:
Florian Forster
2013-08-18 11:13:32 +02:00
7 changed files with 305 additions and 0 deletions

View File

@@ -21,6 +21,9 @@ Akkarit Sangpetch <asangpet at andrew.cmu.edu>
Alessandro Iurlano <alessandro.iurlano at gmail.com>
- Initial filecount plugin.
Alex Deymo <deymo at chromium.org>
- aquaero plugin.
Alvaro Barcellos <alvaro.barcellos at gmail.com>
- Don't-fork patch.

11
README
View File

@@ -26,6 +26,9 @@ Features
Sensors in Macs running Mac OS X / Darwin: Temperature, fanspeed and
voltage sensors.
- aquaero
Various sensors in the Aquaero 5 watercooling board made by Aquacomputer.
- ascent
Statistics about Ascent, a free server for the game `World of Warcraft'.
@@ -566,6 +569,14 @@ Prerequisites
used and should be found in various implementations for hopefully all
platforms.
* aerotools-ng (optional)
Used by the `aquaero' plugin. Currently, the `libaquaero5' library, which
is used by the `aerotools-ng' toolkit, is not compiled as a shared object
nor does it feature an installation routine. Therefore, you need to point
collectd's configure script at the source directory of the `aerotools-ng'
project.
<https://github.com/lynix/aerotools-ng>
* CoreFoundation.framework and IOKit.framework (optional)
For compiling on Darwin in general and the `apple_sensors' plugin in
particular.

View File

@@ -1480,6 +1480,63 @@ then
fi
AM_CONDITIONAL(BUILD_WITH_LIBKVM_OPENFILES, test "x$with_kvm_openfiles" = "xyes")
# --with-libaquaero5 {{{
AC_ARG_WITH(libaquaero5, [AS_HELP_STRING([--with-libaquaero5@<:@=PREFIX@:>@], [Path to aquatools-ng source code.])],
[
if test "x$withval" = "xyes"
then
with_libaquaero5="yes"
else if test "x$withval" = "xno"
then
with_libaquaero5="no"
else
with_libaquaero5="yes"
LIBAQUAERO5_CFLAGS="$LIBAQUAERO5_CFLAGS -I$withval/src"
LIBAQUAERO5_LDFLAGS="$LIBAQUAERO5_LDFLAGS -L$withval/obj"
fi; fi
],
[with_libaquaero5="yes"])
SAVE_CPPFLAGS="$CPPFLAGS"
SAVE_LDFLAGS="$LDFLAGS"
CPPFLAGS="$CPPFLAGS $LIBAQUAERO5_CFLAGS"
LDFLAGS="$LDFLAGS $LIBAQUAERO5_LDFLAGS"
if test "x$with_libaquaero5" = "xyes"
then
if test "x$LIBAQUAERO5_CFLAGS" != "x"
then
AC_MSG_NOTICE([libaquaero5 CPPFLAGS: $LIBAQUAERO5_CFLAGS])
fi
AC_CHECK_HEADERS(libaquaero5.h,
[with_libaquaero5="yes"],
[with_libaquaero5="no (libaquaero5.h not found)"])
fi
if test "x$with_libaquaero5" = "xyes"
then
if test "x$LIBAQUAERO5_LDFLAGS" != "x"
then
AC_MSG_NOTICE([libaquaero5 LDFLAGS: $LIBAQUAERO5_LDFLAGS])
fi
AC_CHECK_LIB(aquaero5, libaquaero5_poll,
[with_libaquaero5="yes"],
[with_libaquaero5="no (symbol 'libaquaero5_poll' not found)"])
fi
CPPFLAGS="$SAVE_CPPFLAGS"
LDFLAGS="$SAVE_LDFLAGS"
if test "x$with_libaquaero5" = "xyes"
then
BUILD_WITH_LIBAQUAERO5_CFLAGS="$LIBAQUAERO5_CFLAGS"
BUILD_WITH_LIBAQUAERO5_LDFLAGS="$LIBAQUAERO5_LDFLAGS"
AC_SUBST(BUILD_WITH_LIBAQUAERO5_CFLAGS)
AC_SUBST(BUILD_WITH_LIBAQUAERO5_LDFLAGS)
fi
AM_CONDITIONAL(BUILD_WITH_LIBAQUAERO5, test "x$with_libaquaero5" = "xyes")
# }}}
# --with-libcredis {{{
AC_ARG_WITH(libcredis, [AS_HELP_STRING([--with-libcredis@<:@=PREFIX@:>@], [Path to libcredis.])],
[
@@ -5017,6 +5074,7 @@ AC_PLUGIN([amqp], [$with_librabbitmq], [AMQP output plugin])
AC_PLUGIN([apache], [$with_libcurl], [Apache httpd statistics])
AC_PLUGIN([apcups], [yes], [Statistics of UPSes by APC])
AC_PLUGIN([apple_sensors], [$with_libiokit], [Apple's hardware sensors])
AC_PLUGIN([aquaero], [$with_libaquaero5], [Aquaero's hardware sensors])
AC_PLUGIN([ascent], [$plugin_ascent], [AscentEmu player statistics])
AC_PLUGIN([battery], [$plugin_battery], [Battery statistics])
AC_PLUGIN([bind], [$plugin_bind], [ISC Bind nameserver statistics])
@@ -5302,6 +5360,7 @@ cat <<EOF;
Configuration:
Libraries:
intel mic . . . . . . $with_mic
libaquaero5 . . . . . $with_libaquaero5
libcurl . . . . . . . $with_libcurl
libdbi . . . . . . . $with_libdbi
libcredis . . . . . . $with_libcredis
@@ -5358,6 +5417,7 @@ Configuration:
amqp . . . . . . . $enable_amqp
apache . . . . . . . $enable_apache
apcups . . . . . . . $enable_apcups
aquaero . . . . . . . $enable_aquaero
apple_sensors . . . . $enable_apple_sensors
ascent . . . . . . . $enable_ascent
battery . . . . . . . $enable_battery

View File

@@ -196,6 +196,16 @@ collectd_LDADD += "-dlopen" apple_sensors.la
collectd_DEPENDENCIES += apple_sensors.la
endif
if BUILD_PLUGIN_AQUAERO
pkglib_LTLIBRARIES += aquaero.la
aquaero_la_SOURCES = aquaero.c
aquaero_la_LDFLAGS = -module -avoid-version
aquaero_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBAQUAERO5_CFLAGS)
aquaero_la_LIBADD = $(BUILD_WITH_LIBAQUAERO5_LDFLAGS) -laquaero5
collectd_LDADD += "-dlopen" aquaero.la
collectd_DEPENDENCIES += aquaero.la
endif
if BUILD_PLUGIN_ASCENT
pkglib_LTLIBRARIES += ascent.la
ascent_la_SOURCES = ascent.c

193
src/aquaero.c Normal file
View File

@@ -0,0 +1,193 @@
/**
* collectd - src/aquaero.c
* Copyright (C) 2013 Alex Deymo
*
* 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; only version 2 of the License is applicable.
*
* 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
*
* Authors:
* Alex Deymo
**/
#include "collectd.h"
#include "common.h"
#include "plugin.h"
#include <libaquaero5.h>
/*
* Private variables
*/
/* Default values for contacting daemon */
static char *conf_device = NULL;
static int aquaero_config (oconfig_item_t *ci)
{
int i;
for (i = 0; i < ci->children_num; i++)
{
oconfig_item_t *child = ci->children + i;
if (strcasecmp ("Device", child->key))
cf_util_get_string (child, &conf_device);
else
{
ERROR ("aquaero plugin: Unknown config option \"%s\".",
child->key);
}
}
return (0);
}
static int aquaero_shutdown (void)
{
libaquaero5_exit();
return (0);
} /* int aquaero_shutdown */
static void aquaero_submit (const char *type, const char *type_instance,
double value)
{
const char *instance = conf_device?conf_device:"default";
value_t values[1];
value_list_t vl = VALUE_LIST_INIT;
/* Don't report undefined values. */
if (value == AQ5_FLOAT_UNDEF)
return;
values[0].gauge = value;
vl.values = values;
vl.values_len = 1;
sstrncpy (vl.host, hostname_g, sizeof (vl.host));
sstrncpy (vl.plugin, "aquaero", sizeof (vl.plugin));
sstrncpy (vl.plugin_instance, instance, sizeof (vl.plugin_instance));
sstrncpy (vl.type, type, sizeof (vl.type));
sstrncpy (vl.type_instance, type_instance, sizeof (vl.type_instance));
plugin_dispatch_values (&vl);
} /* int aquaero_submit */
/* aquaero_submit_array submits every value of a given array of values */
static void aquaero_submit_array (const char *type,
const char *type_instance_prefix, double *value_array, int len)
{
char type_instance[DATA_MAX_NAME_LEN];
int i;
for (i = 0; i < len; i++)
{
if (value_array[i] == AQ5_FLOAT_UNDEF)
continue;
snprintf (type_instance, sizeof (type_instance), "%s%d",
type_instance_prefix, i + 1);
aquaero_submit (type, type_instance, value_array[i]);
}
}
static int aquaero_read (void)
{
aq5_data_t aq_data;
aq5_settings_t aq_sett;
char *err_msg = NULL;
char type_instance[DATA_MAX_NAME_LEN];
int i;
if (libaquaero5_poll(conf_device, &aq_data, &err_msg) < 0)
{
char errbuf[1024];
ERROR ("aquaero plugin: Failed to poll device \"%s\": %s (%s)",
conf_device ? conf_device : "default", err_msg,
sstrerror (errno, errbuf, sizeof (errbuf)));
return (-1);
}
if (libaquaero5_getsettings(conf_device, &aq_sett, &err_msg) < 0)
{
char errbuf[1024];
ERROR ("aquaero plugin: Failed to get settings "
"for device \"%s\": %s (%s)",
conf_device ? conf_device : "default", err_msg,
sstrerror (errno, errbuf, sizeof (errbuf)));
return (-1);
}
/* CPU Temperature sensor */
aquaero_submit("temperature", "cpu", aq_data.cpu_temp[0]);
/* Temperature sensors */
aquaero_submit_array("temperature", "sensor", aq_data.temp,
AQ5_NUM_TEMP);
/* Virtual temperature sensors */
aquaero_submit_array("temperature", "virtual", aq_data.vtemp,
AQ5_NUM_VIRT_SENSORS);
/* Software temperature sensors */
aquaero_submit_array("temperature", "software", aq_data.stemp,
AQ5_NUM_SOFT_SENSORS);
/* Other temperature sensors */
aquaero_submit_array("temperature", "other", aq_data.otemp,
AQ5_NUM_OTHER_SENSORS);
/* Fans */
for (i = 0; i < AQ5_NUM_FAN; i++)
{
if ((aq_sett.fan_data_source[i] == NONE)
|| (aq_data.fan_vrm_temp[i] != AQ5_FLOAT_UNDEF))
continue;
snprintf (type_instance, sizeof (type_instance),
"fan%d", i + 1);
aquaero_submit ("fanspeed", type_instance,
aq_data.fan_rpm[i]);
aquaero_submit ("percentage", type_instance,
aq_data.fan_duty[i]);
aquaero_submit ("voltage", type_instance,
aq_data.fan_voltage[i]);
aquaero_submit ("current", type_instance,
aq_data.fan_current[i]);
/* Report the voltage reglator module (VRM) temperature with a
* different type instance. */
snprintf (type_instance, sizeof (type_instance),
"fan%d-vrm", i + 1);
aquaero_submit ("temperature", type_instance,
aq_data.fan_vrm_temp[i]);
}
/* Flow sensors */
aquaero_submit_array("flow", "sensor", aq_data.flow, AQ5_NUM_FLOW);
/* Liquid level */
aquaero_submit_array("percentage", "waterlevel",
aq_data.level, AQ5_NUM_LEVEL);
return (0);
}
void module_register (void)
{
plugin_register_complex_config ("aquaero", aquaero_config);
plugin_register_read ("aquaero", aquaero_read);
plugin_register_shutdown ("aquaero", aquaero_shutdown);
} /* void module_register */
/* vim: set sw=8 sts=8 noet : */

View File

@@ -79,6 +79,7 @@
#@BUILD_PLUGIN_APACHE_TRUE@LoadPlugin apache
#@BUILD_PLUGIN_APCUPS_TRUE@LoadPlugin apcups
#@BUILD_PLUGIN_APPLE_SENSORS_TRUE@LoadPlugin apple_sensors
#@BUILD_PLUGIN_AQUAERO_TRUE@LoadPlugin aquaero
#@BUILD_PLUGIN_ASCENT_TRUE@LoadPlugin ascent
#@BUILD_PLUGIN_BATTERY_TRUE@LoadPlugin battery
#@BUILD_PLUGIN_BIND_TRUE@LoadPlugin bind
@@ -240,6 +241,10 @@
# ReportSeconds true
#</Plugin>
#<Plugin aquaero>
# Device ""
#</Plugin>
#<Plugin ascent>
# URL "http://localhost/ascent/status/"
# User "www-user"

View File

@@ -730,6 +730,29 @@ default for backwards compatibility, the time will be reported in minutes.
=back
=head2 Plugin C<aquaero>
This plugin collects the value of the available sensors in an
I<AquaeroE<nbsp>5> board. AquaeroE<nbsp>5 is a water-cooling controller board,
manufactured by Aqua Computer GmbH L<http://www.aquacomputer.de/>, with a USB2
connection for monitoring and configuration. The board can handle multiple
temperature sensors, fans, water pumps and water level sensors and adjust the
output settings such as fan voltage or power used by the water pump based on
the available inputs using a configurable controller included in the board.
This plugin collects all the available inputs as well as some of the output
values chosen by this controller. The plugin is based on the I<libaquaero5>
library provided by I<aquatools-ng>.
=over 4
=item B<Device> I<DevicePath>
Device path of the AquaeroE<nbsp>5's USB HID (human interface device), usually
in the form C</dev/usb/hiddevX>. If this option is no set the plugin will try
to auto-detect the Aquaero 5 USB device based on vendor-ID and product-ID.
=back
=head2 Plugin C<ascent>
This plugin collects information about an Ascent server, a free server for the