collectd: update to 5.9.0

Update collectd to version 5.9.0

* remove backported upstream patches (sensors, modbus)
* remove lua patch that has been been implemented upstream
  (See collectd PR 3144)
* refresh patches and accommodate into upstream path changes
* place the 'stations' datatype for iwinfo in alpbetically
  correct place in types.db
* add libmnl dependency to 'processes' plugin required for the
  new Linux process Delay Accounting capability.
  (Alternatively the capability & requirement might be patched away
   in Makefile.am, HAVE_LIBTASKSTATS from collectd_4ea7a572)

* new plugins (disabled): ampq1, gpu_nvidia, pcie_errors,
                          write_stackdriver, write_syslog

compile-tested: ar71xx/WNDR3700 (all plugins)
run-tested: ar71xx/WNDR3700 (selected plugins)

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
This commit is contained in:
Hannu Nyman 2019-06-16 21:12:52 +03:00
parent 45d40b4a88
commit 08d759f14a
14 changed files with 45 additions and 660 deletions

View File

@ -8,13 +8,13 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=collectd
PKG_VERSION:=5.8.1
PKG_RELEASE:=6
PKG_VERSION:=5.9.0
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
PKG_SOURCE_URL:=https://collectd.org/files/ \
https://github.com/collectd/collectd/releases/download/collectd-$(PKG_VERSION)
PKG_HASH:=e796fda27ce06377f491ad91aa286962a68c2b54076aa77a29673d53204453da
PKG_HASH:=7b220f8898a061f6e7f29a8c16697d1a198277f813da69474a67911097c0626b
PKG_FIXUP:=autoreconf
PKG_REMOVE_FILES:=aclocal.m4 libltdl/aclocal.m4
@ -26,6 +26,7 @@ PKG_USE_MIPS16:=0
COLLECTD_PLUGINS_DISABLED:= \
amqp \
ampq1 \
apple_sensors \
aquaero \
barometer \
@ -43,6 +44,7 @@ COLLECTD_PLUGINS_DISABLED:= \
genericjmx \
gmond \
gps \
gpu_nvidia \
grpc \
hddtemp \
hugepages \
@ -75,6 +77,7 @@ COLLECTD_PLUGINS_DISABLED:= \
oracle \
ovs_events \
ovs_stats \
pcie_errors \
perl \
pf \
pinba \
@ -103,6 +106,8 @@ COLLECTD_PLUGINS_DISABLED:= \
write_redis \
write_riemann \
write_sensu \
write_stackdriver \
write_syslog \
write_tsdb \
xencpu \
xmms \
@ -399,7 +404,7 @@ $(eval $(call BuildPlugin,openvpn,OpenVPN traffic/compression input,openvpn,))
$(eval $(call BuildPlugin,ping,ping status input,ping,+PACKAGE_collectd-mod-ping:liboping))
$(eval $(call BuildPlugin,postgresql,PostgreSQL status input,postgresql,+PACKAGE_collectd-mod-postgresql:libpq))
$(eval $(call BuildPlugin,powerdns,PowerDNS server status input,powerdns,))
$(eval $(call BuildPlugin,processes,process status input,processes,))
$(eval $(call BuildPlugin,processes,process status input,processes,+PACKAGE_collectd-mod-processes:libmnl))
$(eval $(call BuildPlugin,protocols,network protocols input,protocols,))
$(eval $(call BuildPlugin,rrdtool,RRDtool output,rrdtool,+PACKAGE_collectd-mod-rrdtool:librrd1))
$(eval $(call BuildPlugin,sensors,lm_sensors input,sensors,+PACKAGE_collectd-mod-sensors:libsensors))

View File

@ -1,84 +0,0 @@
From d5a3c020d33cc33ee8049f54c7b4dffcd123bf83 Mon Sep 17 00:00:00 2001
From: Pavel Rochnyack <pavel2000@ngs.ru>
Date: Mon, 3 Dec 2018 18:34:14 +0700
Subject: [PATCH] sensors: Removed checks for upper limit of
SENSORS_API_VERSION
That makes no more sense after lm-sensors got new maintainers.
Closes: #3006
---
src/sensors.c | 17 ++++++-----------
1 file changed, 6 insertions(+), 11 deletions(-)
diff --git a/src/sensors.c b/src/sensors.c
index f4ecda5e49..33982e061a 100644
--- a/src/sensors.c
+++ b/src/sensors.c
@@ -149,7 +149,7 @@ typedef struct featurelist {
static char *conffile = SENSORS_CONF_PATH;
/* #endif SENSORS_API_VERSION < 0x400 */
-#elif (SENSORS_API_VERSION >= 0x400) && (SENSORS_API_VERSION < 0x500)
+#elif (SENSORS_API_VERSION >= 0x400)
typedef struct featurelist {
const sensors_chip_name *chip;
const sensors_feature *feature;
@@ -159,11 +159,6 @@ typedef struct featurelist {
static char *conffile = NULL;
static _Bool use_labels = 0;
-/* #endif (SENSORS_API_VERSION >= 0x400) && (SENSORS_API_VERSION < 0x500) */
-
-#else /* if SENSORS_API_VERSION >= 0x500 */
-#error "This version of libsensors is not supported yet. Please report this " \
- "as bug."
#endif
static featurelist_t *first_feature = NULL;
@@ -223,7 +218,7 @@ static int sensors_config(const char *key, const char *value) {
if (IS_TRUE(value))
ignorelist_set_invert(sensor_list, 0);
}
-#if (SENSORS_API_VERSION >= 0x400) && (SENSORS_API_VERSION < 0x500)
+#if (SENSORS_API_VERSION >= 0x400)
else if (strcasecmp(key, "UseLabels") == 0) {
use_labels = IS_TRUE(value) ? 1 : 0;
}
@@ -353,7 +348,7 @@ static int sensors_load_conf(void) {
} /* while sensors_get_detected_chips */
/* #endif SENSORS_API_VERSION < 0x400 */
-#elif (SENSORS_API_VERSION >= 0x400) && (SENSORS_API_VERSION < 0x500)
+#elif (SENSORS_API_VERSION >= 0x400)
chip_num = 0;
while ((chip = sensors_get_detected_chips(NULL, &chip_num)) != NULL) {
const sensors_feature *feature;
@@ -410,7 +405,7 @@ static int sensors_load_conf(void) {
} /* while (subfeature) */
} /* while (feature) */
} /* while (chip) */
-#endif /* (SENSORS_API_VERSION >= 0x400) && (SENSORS_API_VERSION < 0x500) */
+#endif /* (SENSORS_API_VERSION >= 0x400) */
if (first_feature == NULL) {
sensors_cleanup();
@@ -485,7 +480,7 @@ static int sensors_read(void) {
} /* for fl = first_feature .. NULL */
/* #endif SENSORS_API_VERSION < 0x400 */
-#elif (SENSORS_API_VERSION >= 0x400) && (SENSORS_API_VERSION < 0x500)
+#elif (SENSORS_API_VERSION >= 0x400)
for (featurelist_t *fl = first_feature; fl != NULL; fl = fl->next) {
double value;
int status;
@@ -528,7 +523,7 @@ static int sensors_read(void) {
sensors_submit(plugin_instance, type, type_instance, value);
} /* for fl = first_feature .. NULL */
-#endif /* (SENSORS_API_VERSION >= 0x400) && (SENSORS_API_VERSION < 0x500) */
+#endif /* (SENSORS_API_VERSION >= 0x400) */
return 0;
} /* int sensors_read */

View File

@ -1,179 +0,0 @@
From 6028f89df95b12219d735b277863f83e9f5ee9e9 Mon Sep 17 00:00:00 2001
From: PJ Bostley <pbostley@gmail.com>
Date: Sat, 20 Jan 2018 16:39:36 -0700
Subject: [PATCH 1/2] Adding support for CDAB endian 32-bit modbus polls
---
src/modbus.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 56 insertions(+), 5 deletions(-)
diff --git a/src/modbus.c b/src/modbus.c
index 31f0c2da81..daa3c028f5 100644
--- a/src/modbus.c
+++ b/src/modbus.c
@@ -76,9 +76,13 @@
enum mb_register_type_e /* {{{ */
{ REG_TYPE_INT16,
REG_TYPE_INT32,
+ REG_TYPE_INT32_CDAB,
REG_TYPE_UINT16,
REG_TYPE_UINT32,
- REG_TYPE_FLOAT }; /* }}} */
+ REG_TYPE_UINT32_CDAB,
+ REG_TYPE_FLOAT,
+ REG_TYPE_FLOAT_CDAB }; /* }}} */
+
enum mb_mreg_type_e /* {{{ */
{ MREG_HOLDING,
MREG_INPUT }; /* }}} */
@@ -425,7 +429,9 @@ static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
if ((ds->ds[0].type != DS_TYPE_GAUGE) &&
(data->register_type != REG_TYPE_INT32) &&
- (data->register_type != REG_TYPE_UINT32)) {
+ (data->register_type != REG_TYPE_INT32_CDAB) &&
+ (data->register_type != REG_TYPE_UINT32) &&
+ (data->register_type != REG_TYPE_UINT32_CDAB)) {
NOTICE(
"Modbus plugin: The data source of type \"%s\" is %s, not gauge. "
"This will most likely result in problems, because the register type "
@@ -434,8 +440,11 @@ static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
}
if ((data->register_type == REG_TYPE_INT32) ||
+ (data->register_type == REG_TYPE_INT32_CDAB) ||
(data->register_type == REG_TYPE_UINT32) ||
- (data->register_type == REG_TYPE_FLOAT))
+ (data->register_type == REG_TYPE_UINT32_CDAB) ||
+ (data->register_type == REG_TYPE_FLOAT) ||
+ (data->register_type == REG_TYPE_FLOAT_CDAB))
values_num = 2;
else
values_num = 1;
@@ -496,8 +505,8 @@ static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
}
if (status != values_num) {
ERROR("Modbus plugin: modbus read function (%s/%s) failed. "
- " status = %i, values_num = %i. Giving up.",
- host->host, host->node, status, values_num);
+ " status = %i, start_addr = %i, values_num = %i. Giving up.",
+ host->host, host->node, status, data->register_base, values_num);
#if LEGACY_LIBMODBUS
modbus_close(&host->connection);
#else
@@ -521,6 +530,17 @@ static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
"Returned float value is %g",
(double)float_value);
+ CAST_TO_VALUE_T(ds, vt, float_value);
+ mb_submit(host, slave, data, vt);
+ } else if (data->register_type == REG_TYPE_FLOAT_CDAB) {
+ float float_value;
+ value_t vt;
+
+ float_value = mb_register_to_float(values[1], values[0]);
+ DEBUG("Modbus plugin: mb_read_data: "
+ "Returned float value is %g",
+ (double)float_value);
+
CAST_TO_VALUE_T(ds, vt, float_value);
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_INT32) {
@@ -535,6 +555,20 @@ static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
"Returned int32 value is %" PRIi32,
v.i32);
+ CAST_TO_VALUE_T(ds, vt, v.i32);
+ mb_submit(host, slave, data, vt);
+ } else if (data->register_type == REG_TYPE_INT32_CDAB) {
+ union {
+ uint32_t u32;
+ int32_t i32;
+ } v;
+ value_t vt;
+
+ v.u32 = (((uint32_t)values[1]) << 16) | ((uint32_t)values[0]);
+ DEBUG("Modbus plugin: mb_read_data: "
+ "Returned int32 value is %" PRIi32,
+ v.i32);
+
CAST_TO_VALUE_T(ds, vt, v.i32);
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_INT16) {
@@ -561,6 +595,17 @@ static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
"Returned uint32 value is %" PRIu32,
v32);
+ CAST_TO_VALUE_T(ds, vt, v32);
+ mb_submit(host, slave, data, vt);
+ } else if (data->register_type == REG_TYPE_UINT32_CDAB) {
+ uint32_t v32;
+ value_t vt;
+
+ v32 = (((uint32_t)values[1]) << 16) | ((uint32_t)values[0]);
+ DEBUG("Modbus plugin: mb_read_data: "
+ "Returned uint32 value is %" PRIu32,
+ v32);
+
CAST_TO_VALUE_T(ds, vt, v32);
mb_submit(host, slave, data, vt);
} else /* if (data->register_type == REG_TYPE_UINT16) */
@@ -702,12 +747,18 @@ static int mb_config_add_data(oconfig_item_t *ci) /* {{{ */
data.register_type = REG_TYPE_INT16;
else if (strcasecmp("Int32", tmp) == 0)
data.register_type = REG_TYPE_INT32;
+ else if (strcasecmp("Int32LE", tmp) == 0)
+ data.register_type = REG_TYPE_INT32_CDAB;
else if (strcasecmp("Uint16", tmp) == 0)
data.register_type = REG_TYPE_UINT16;
else if (strcasecmp("Uint32", tmp) == 0)
data.register_type = REG_TYPE_UINT32;
+ else if (strcasecmp("Uint32LE", tmp) == 0)
+ data.register_type = REG_TYPE_UINT32_CDAB;
else if (strcasecmp("Float", tmp) == 0)
data.register_type = REG_TYPE_FLOAT;
+ else if (strcasecmp("FloatLE", tmp) == 0)
+ data.register_type = REG_TYPE_FLOAT_CDAB;
else {
ERROR("Modbus plugin: The register type \"%s\" is unknown.", tmp);
status = -1;
From 67afd2685892e69ababb489f48b9033ab5908f4d Mon Sep 17 00:00:00 2001
From: PJ Bostley <pbostley@gmail.com>
Date: Tue, 23 Jan 2018 15:33:23 -0700
Subject: [PATCH 2/2] Adding documentation for the Modbus little endian modes
where 32 bit values have thier registers swapped
---
src/collectd.conf.pod | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/src/collectd.conf.pod b/src/collectd.conf.pod
index dfd785a2c8..e9715126e6 100644
--- a/src/collectd.conf.pod
+++ b/src/collectd.conf.pod
@@ -4139,11 +4139,19 @@ Configures the base register to read from the device. If the option
B<RegisterType> has been set to B<Uint32> or B<Float>, this and the next
register will be read (the register number is increased by one).
-=item B<RegisterType> B<Int16>|B<Int32>|B<Uint16>|B<Uint32>|B<Float>
-
-Specifies what kind of data is returned by the device. If the type is B<Int32>,
-B<Uint32> or B<Float>, two 16E<nbsp>bit registers will be read and the data is
-combined into one value. Defaults to B<Uint16>.
+=item B<RegisterType> B<Int16>|B<Int32>|B<Uint16>|B<Uint32>|B<Float>|B<Int32LE>|B<Uint32LE>|B<FloatLE>
+
+Specifies what kind of data is returned by the device. This defaults to
+B<Uint16>. If the type is B<Int32>, B<Int32LE>, B<Uint32>, B<Uint32LE>,
+B<Float> or B<FloatLE>, two 16E<nbsp>bit registers at B<RegisterBase>
+and B<RegisterBase+1> will be read and the data is combined into one
+32E<nbsp>value. For B<Int32>, B<Uint32> and B<Float> the most significant
+16E<nbsp>bits are in the register at B<RegisterBase> and the least
+significant 16E<nbsp>bits are in the register at B<RegisterBase+1>.
+For B<Int32LE>, B<Uint32LE>, or B<Float32LE>, the high and low order
+registers are swapped with the most significant 16E<nbsp>bits in
+the B<RegisterBase+1> and the least significant 16E<nbsp>bits in
+B<RegisterBase>.
=item B<RegisterCmd> B<ReadHolding>|B<ReadInput>

View File

@ -1,81 +0,0 @@
From eeabc41e703f39cae0ad7eb8a596045a5a2f25b4 Mon Sep 17 00:00:00 2001
From: cekstam <christian.ekstam@gmail.com>
Date: Tue, 27 Mar 2018 13:15:28 +0200
Subject: [PATCH 1/3] Add scale and shift to modbus plugin
Adding a Scale and Shift parameter to the modbus plugin in order to correct amplifed data
---
src/collectd.conf.pod | 10 ++++++++++
src/modbus.c | 18 ++++++++++++++----
2 files changed, 24 insertions(+), 4 deletions(-)
--- a/src/collectd.conf.pod
+++ b/src/collectd.conf.pod
@@ -4169,6 +4169,16 @@ supported.
Sets the type instance to use when dispatching the value to I<collectd>. If
unset, an empty string (no type instance) is used.
+=item B<Scale> I<Value>
+
+The values taken from collectd are multiplied by I<Value>. The field is optional
+and the default is B<1.0>.
+
+=item B<Shift> I<Value>
+
+I<Value> is added to values from collectd after they have been multiplied by
+B<Scale> value. The field is optional and the default value is B<0.0>.
+
=back
=item E<lt>B<Host> I<Name>E<gt> blocks
--- a/src/modbus.c
+++ b/src/modbus.c
@@ -105,6 +105,8 @@ struct mb_data_s /* {{{ */
mb_mreg_type_t modbus_register_type;
char type[DATA_MAX_NAME_LEN];
char instance[DATA_MAX_NAME_LEN];
+ double scale;
+ double shift;
mb_data_t *next;
}; /* }}} */
@@ -395,13 +397,13 @@ static int mb_init_connection(mb_host_t
#define CAST_TO_VALUE_T(ds, vt, raw) \
do { \
if ((ds)->ds[0].type == DS_TYPE_COUNTER) \
- (vt).counter = (counter_t)(raw); \
+ (vt).counter = (((counter_t)(raw) * ds[0].scale) + ds[0].shift); \
else if ((ds)->ds[0].type == DS_TYPE_GAUGE) \
- (vt).gauge = (gauge_t)(raw); \
+ (vt).gauge = (((gauge_t)(raw) * ds[0].scale) + ds[0].shift); \
else if ((ds)->ds[0].type == DS_TYPE_DERIVE) \
- (vt).derive = (derive_t)(raw); \
+ (vt).derive = (((derive_t)(raw) * ds[0].scale) + ds[0].shift); \
else /* if (ds->ds[0].type == DS_TYPE_ABSOLUTE) */ \
- (vt).absolute = (absolute_t)(raw); \
+ (vt).absolute = (((absolute_t)(raw) * ds[0].scale) + ds[0].shift); \
} while (0)
static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
@@ -723,6 +725,8 @@ static int mb_config_add_data(oconfig_it
data.name = NULL;
data.register_type = REG_TYPE_UINT16;
data.next = NULL;
+ data.scale = 1;
+ data.shift = 0;
status = cf_util_get_string(ci, &data.name);
if (status != 0)
@@ -736,6 +740,12 @@ static int mb_config_add_data(oconfig_it
else if (strcasecmp("Instance", child->key) == 0)
status = cf_util_get_string_buffer(child, data.instance,
sizeof(data.instance));
+ else if (strcasecmp("Scale", child->key) == 0)
+ status = cf_util_get_string_buffer(child, data.scale,
+ sizeof(data.scale));
+ else if (strcasecmp("Shift", child->key) == 0)
+ status = cf_util_get_string_buffer(child, data.shift,
+ sizeof(data.shift));
else if (strcasecmp("RegisterBase", child->key) == 0)
status = cf_util_get_int(child, &data.register_base);
else if (strcasecmp("RegisterType", child->key) == 0) {

View File

@ -1,120 +0,0 @@
From e596496f5c783f4bba85c4d559502c98e4050465 Mon Sep 17 00:00:00 2001
From: cekstam <christian.ekstam@gmail.com>
Date: Tue, 27 Mar 2018 14:11:52 +0200
Subject: [PATCH 2/3] correcting all the wrongs
, data->scale, data->shift
---
src/modbus.c | 32 +++++++++++++++-----------------
1 file changed, 15 insertions(+), 17 deletions(-)
--- a/src/modbus.c
+++ b/src/modbus.c
@@ -394,16 +394,16 @@ static int mb_init_connection(mb_host_t
} /* }}} int mb_init_connection */
#endif /* !LEGACY_LIBMODBUS */
-#define CAST_TO_VALUE_T(ds, vt, raw) \
+#define CAST_TO_VALUE_T(ds, vt, raw, scale, shift) \
do { \
if ((ds)->ds[0].type == DS_TYPE_COUNTER) \
- (vt).counter = (((counter_t)(raw) * ds[0].scale) + ds[0].shift); \
+ (vt).counter = (((counter_t)(raw) * scale) + shift); \
else if ((ds)->ds[0].type == DS_TYPE_GAUGE) \
- (vt).gauge = (((gauge_t)(raw) * ds[0].scale) + ds[0].shift); \
+ (vt).gauge = (((gauge_t)(raw) * scale) + shift); \
else if ((ds)->ds[0].type == DS_TYPE_DERIVE) \
- (vt).derive = (((derive_t)(raw) * ds[0].scale) + ds[0].shift); \
+ (vt).derive = (((derive_t)(raw) * scale) + shift); \
else /* if (ds->ds[0].type == DS_TYPE_ABSOLUTE) */ \
- (vt).absolute = (((absolute_t)(raw) * ds[0].scale) + ds[0].shift); \
+ (vt).absolute = (((absolute_t)(raw) * scale) + shift); \
} while (0)
static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
@@ -532,7 +532,7 @@ static int mb_read_data(mb_host_t *host,
"Returned float value is %g",
(double)float_value);
- CAST_TO_VALUE_T(ds, vt, float_value);
+ CAST_TO_VALUE_T(ds, vt, float_value, data->scale, data->shift);
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_FLOAT_CDAB) {
float float_value;
@@ -543,7 +543,7 @@ static int mb_read_data(mb_host_t *host,
"Returned float value is %g",
(double)float_value);
- CAST_TO_VALUE_T(ds, vt, float_value);
+ CAST_TO_VALUE_T(ds, vt, float_value, data->scale, data->shift);
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_INT32) {
union {
@@ -557,7 +557,7 @@ static int mb_read_data(mb_host_t *host,
"Returned int32 value is %" PRIi32,
v.i32);
- CAST_TO_VALUE_T(ds, vt, v.i32);
+ CAST_TO_VALUE_T(ds, vt, v.i32, data->scale, data->shift);
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_INT32_CDAB) {
union {
@@ -571,7 +571,7 @@ static int mb_read_data(mb_host_t *host,
"Returned int32 value is %" PRIi32,
v.i32);
- CAST_TO_VALUE_T(ds, vt, v.i32);
+ CAST_TO_VALUE_T(ds, vt, v.i32, data->scale, data->shift);
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_INT16) {
union {
@@ -586,7 +586,7 @@ static int mb_read_data(mb_host_t *host,
"Returned int16 value is %" PRIi16,
v.i16);
- CAST_TO_VALUE_T(ds, vt, v.i16);
+ CAST_TO_VALUE_T(ds, vt, v.i16, data->scale, data->shift);
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_UINT32) {
uint32_t v32;
@@ -597,7 +597,7 @@ static int mb_read_data(mb_host_t *host,
"Returned uint32 value is %" PRIu32,
v32);
- CAST_TO_VALUE_T(ds, vt, v32);
+ CAST_TO_VALUE_T(ds, vt, v32, data->scale, data->shift);
mb_submit(host, slave, data, vt);
} else if (data->register_type == REG_TYPE_UINT32_CDAB) {
uint32_t v32;
@@ -608,7 +608,7 @@ static int mb_read_data(mb_host_t *host,
"Returned uint32 value is %" PRIu32,
v32);
- CAST_TO_VALUE_T(ds, vt, v32);
+ CAST_TO_VALUE_T(ds, vt, v32, data->scale, data->shift);
mb_submit(host, slave, data, vt);
} else /* if (data->register_type == REG_TYPE_UINT16) */
{
@@ -618,7 +618,7 @@ static int mb_read_data(mb_host_t *host,
"Returned uint16 value is %" PRIu16,
values[0]);
- CAST_TO_VALUE_T(ds, vt, values[0]);
+ CAST_TO_VALUE_T(ds, vt, values[0], data->scale, data->shift);
mb_submit(host, slave, data, vt);
}
@@ -741,11 +741,9 @@ static int mb_config_add_data(oconfig_it
status = cf_util_get_string_buffer(child, data.instance,
sizeof(data.instance));
else if (strcasecmp("Scale", child->key) == 0)
- status = cf_util_get_string_buffer(child, data.scale,
- sizeof(data.scale));
+ status = cf_util_get_double(child, &data.scale);
else if (strcasecmp("Shift", child->key) == 0)
- status = cf_util_get_string_buffer(child, data.shift,
- sizeof(data.shift));
+ status = cf_util_get_double(child, &data.shift);
else if (strcasecmp("RegisterBase", child->key) == 0)
status = cf_util_get_int(child, &data.register_base);
else if (strcasecmp("RegisterType", child->key) == 0) {

View File

@ -1,114 +0,0 @@
From a00ab52931a587cf29c53a945e9295b4d7fe41ba Mon Sep 17 00:00:00 2001
From: Daniel Golle <daniel@makrotopia.org>
Date: Thu, 28 Mar 2019 01:52:04 +0100
Subject: [PATCH] Add support for RS485 to modbus plugin
Allow setting up RS485 mode for Modbus-RTU
---
src/collectd.conf.pod | 6 +++++
src/modbus.c | 55 +++++++++++++++++++++++++++++++++++++++----
2 files changed, 57 insertions(+), 4 deletions(-)
--- a/src/collectd.conf.pod
+++ b/src/collectd.conf.pod
@@ -4234,6 +4234,12 @@ For Modbus/RTU, specifies the path to th
For Modbus/RTU, specifies the baud rate of the serial device.
Note, connections currently support only 8/N/1.
+=item B<UARTType> I<UARTType>
+
+For Modbus/RTU, specifies the type of the serial device.
+RS232, RS422 and RS485 are supported. Defaults to RS232.
+Available only on Linux systems with libmodbus>=2.9.4.
+
=item B<Interval> I<Interval>
Sets the interval (in seconds) in which the values will be collected from this
--- a/src/modbus.c
+++ b/src/modbus.c
@@ -95,6 +95,12 @@ enum mb_conntype_e /* {{{ */
MBCONN_RTU }; /* }}} */
typedef enum mb_conntype_e mb_conntype_t;
+enum mb_uarttype_e /* {{{ */
+{ UARTTYPE_RS232,
+ UARTTYPE_RS422,
+ UARTTYPE_RS485 }; /* }}} */
+typedef enum mb_uarttype_e mb_uarttype_t;
+
struct mb_data_s;
typedef struct mb_data_s mb_data_t;
struct mb_data_s /* {{{ */
@@ -124,8 +130,9 @@ struct mb_host_s /* {{{ */
char host[DATA_MAX_NAME_LEN];
char node[NI_MAXHOST]; /* TCP hostname or RTU serial device */
/* char service[NI_MAXSERV]; */
- int port; /* for Modbus/TCP */
- int baudrate; /* for Modbus/RTU */
+ int port; /* for Modbus/TCP */
+ int baudrate; /* for Modbus/RTU */
+ mb_uarttype_t uarttype; /* UART type for Modbus/RTU */
mb_conntype_t conntype;
cdtime_t interval;
@@ -390,6 +397,22 @@ static int mb_init_connection(mb_host_t
return status;
}
+#if defined(linux) && LIBMODBUS_VERSION_CHECK(2, 9, 4)
+ switch (host->uarttype) {
+ case UARTTYPE_RS485:
+ if (modbus_rtu_set_serial_mode(host->connection, MODBUS_RTU_RS485))
+ DEBUG("Modbus plugin: Setting RS485 mode failed.");
+ break;
+ case UARTTYPE_RS422:
+ /* libmodbus doesn't say anything about full-duplex symmetric RS422 UART */
+ break;
+ case UARTTYPE_RS232:
+ break;
+ default:
+ DEBUG("Modbus plugin: Invalid UART type!.");
+ }
+#endif /* defined(linux) && LIBMODBUS_VERSION_CHECK(2, 9, 4) */
+
return 0;
} /* }}} int mb_init_connection */
#endif /* !LEGACY_LIBMODBUS */
@@ -951,11 +974,35 @@ static int mb_config_add_host(oconfig_it
status = -1;
} else if (strcasecmp("Device", child->key) == 0) {
status = cf_util_get_string_buffer(child, host->node, sizeof(host->node));
- if (status == 0)
+ if (status == 0) {
host->conntype = MBCONN_RTU;
+ host->uarttype = UARTTYPE_RS232;
+ }
} else if (strcasecmp("Baudrate", child->key) == 0)
status = cf_util_get_int(child, &host->baudrate);
- else if (strcasecmp("Interval", child->key) == 0)
+ else if (strcasecmp("UARTType", child->key) == 0) {
+#if defined(linux) && !LEGACY_LIBMODBUS && LIBMODBUS_VERSION_CHECK(2, 9, 4)
+ char buffer[NI_MAXHOST];
+ status = cf_util_get_string_buffer(child, buffer, sizeof(buffer));
+ if (status != 0)
+ break;
+ if (strncmp(buffer, "RS485", 6) == 0)
+ host->uarttype = UARTTYPE_RS485;
+ else if (strncmp(buffer, "RS422", 6) == 0)
+ host->uarttype = UARTTYPE_RS422;
+ else if (strncmp(buffer, "RS232", 6) == 0)
+ host->uarttype = UARTTYPE_RS232;
+ else {
+ ERROR("Modbus plugin: The UARTType \"%s\" is unknown.", buffer);
+ status = -1;
+ break;
+ }
+#else
+ ERROR("Modbus plugin: Option `UARTType' not supported. Please "
+ "upgrade libmodbus to at least 2.9.4");
+ return -1;
+#endif
+ } else if (strcasecmp("Interval", child->key) == 0)
status = cf_util_get_cdtime(child, &host->interval);
else if (strcasecmp("Slave", child->key) == 0)
/* Don't set status: Gracefully continue if a slave fails. */

View File

@ -17,7 +17,7 @@
/* consolidation_functions = */ NULL,
/* consolidation_functions_num = */ 0,
@@ -949,6 +952,12 @@ static int rrd_config(const char *key, c
@@ -944,6 +947,12 @@ static int rrd_config(const char *key, c
/* compar = */ rrd_compare_numeric);
free(value_copy);
@ -30,8 +30,8 @@
} else if (strcasecmp("XFF", key) == 0) {
double tmp = atof(value);
if ((tmp < 0.0) || (tmp >= 1.0)) {
--- a/src/utils_rrdcreate.c
+++ b/src/utils_rrdcreate.c
--- a/src/utils/rrdcreate/rrdcreate.c
+++ b/src/utils/rrdcreate/rrdcreate.c
@@ -180,6 +180,9 @@ static int rra_get(char ***ret, const va
rts_num = rra_timespans_num;
}
@ -42,8 +42,8 @@
rra_max = rts_num * rra_types_num;
assert(rra_max > 0);
--- a/src/utils_rrdcreate.h
+++ b/src/utils_rrdcreate.h
--- a/src/utils/rrdcreate/rrdcreate.h
+++ b/src/utils/rrdcreate/rrdcreate.h
@@ -40,6 +40,8 @@ struct rrdcreate_config_s {
int *timespans;
size_t timespans_num;

View File

@ -1,6 +1,6 @@
--- a/src/daemon/plugin.c
+++ b/src/daemon/plugin.c
@@ -1099,7 +1099,7 @@ static int plugin_insert_read(read_func_
@@ -1085,7 +1085,7 @@ static int plugin_insert_read(read_func_
int status;
llentry_t *le;

View File

@ -1,6 +1,6 @@
--- a/src/olsrd.c
+++ b/src/olsrd.c
@@ -585,7 +585,7 @@ static int olsrd_read(void) /* {{{ */
@@ -582,7 +582,7 @@ static int olsrd_read(void) /* {{{ */
if (fh == NULL)
return -1;

View File

@ -18,7 +18,7 @@ Reversed patch to be applied:
--- a/configure.ac
+++ b/configure.ac
@@ -3327,9 +3327,9 @@ if test "x$with_libmodbus" = "xyes"; the
@@ -3399,9 +3399,9 @@ if test "x$with_libmodbus" = "xyes"; the
SAVE_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $with_libmodbus_cflags"
@ -33,8 +33,8 @@ Reversed patch to be applied:
--- a/src/modbus.c
+++ b/src/modbus.c
@@ -26,7 +26,7 @@
#include "configfile.h"
#include "plugin.h"
#include "utils/common/common.h"
-#include <modbus.h>
+#include <modbus/modbus.h>

View File

@ -1,6 +1,6 @@
--- a/configure.ac
+++ b/configure.ac
@@ -526,11 +526,7 @@ if test "x$ac_system" = "xLinux"; then
@@ -531,11 +531,7 @@ if test "x$ac_system" = "xLinux"; then
[have_cpuid_h="no (cpuid.h not found)"]
)

View File

@ -1,6 +1,6 @@
--- a/configure.ac
+++ b/configure.ac
@@ -710,6 +710,11 @@ AC_CACHE_CHECK([whether clock_boottime a
@@ -721,6 +721,11 @@ AC_CACHE_CHECK([whether clock_boottime a
]
)
@ -12,7 +12,7 @@
#
# Checks for typedefs, structures, and compiler characteristics.
@@ -6127,6 +6132,7 @@ plugin_ipc="no"
@@ -6392,6 +6397,7 @@ plugin_ipc="no"
plugin_ipmi="no"
plugin_ipvs="no"
plugin_irq="no"
@ -20,15 +20,15 @@
plugin_load="no"
plugin_log_logstash="no"
plugin_mcelog="no"
@@ -6538,6 +6544,7 @@ AC_PLUGIN([ipmi], [$plugi
AC_PLUGIN([iptables], [$with_libiptc], [IPTables rule counters])
AC_PLUGIN([ipvs], [$plugin_ipvs], [IPVS connection statistics])
AC_PLUGIN([irq], [$plugin_irq], [IRQ statistics])
+AC_PLUGIN([iwinfo], [$with_iwinfo], [Common iwinfo wireless statistics])
AC_PLUGIN([java], [$with_java], [Embed the Java Virtual Machine])
AC_PLUGIN([load], [$plugin_load], [System load])
AC_PLUGIN([log_logstash], [$plugin_log_logstash], [Logstash json_event compatible logging])
@@ -6899,6 +6906,7 @@ AC_MSG_RESULT([ libyajl . . . . . . .
@@ -6826,6 +6832,7 @@ AC_PLUGIN([ipmi], [$plugi
AC_PLUGIN([iptables], [$with_libiptc], [IPTables rule counters])
AC_PLUGIN([ipvs], [$plugin_ipvs], [IPVS connection statistics])
AC_PLUGIN([irq], [$plugin_irq], [IRQ statistics])
+AC_PLUGIN([iwinfo], [$with_iwinfo], [Common iwinfo wireless statistics])
AC_PLUGIN([java], [$with_java], [Embed the Java Virtual Machine])
AC_PLUGIN([load], [$plugin_load], [System load])
AC_PLUGIN([log_logstash], [$plugin_log_logstash], [Logstash json_event compatible logging])
@@ -7193,6 +7200,7 @@ AC_MSG_RESULT([ libyajl . . . . . . .
AC_MSG_RESULT([ oracle . . . . . . . $with_oracle])
AC_MSG_RESULT([ protobuf-c . . . . . $have_protoc_c])
AC_MSG_RESULT([ protoc 3 . . . . . . $have_protoc3])
@ -36,7 +36,7 @@
AC_MSG_RESULT()
AC_MSG_RESULT([ Features:])
AC_MSG_RESULT([ daemon mode . . . . . $enable_daemon])
@@ -6957,6 +6965,7 @@ AC_MSG_RESULT([ ipmi . . . . . . . .
@@ -7253,6 +7261,7 @@ AC_MSG_RESULT([ ipmi . . . . . . . .
AC_MSG_RESULT([ iptables . . . . . . $enable_iptables])
AC_MSG_RESULT([ ipvs . . . . . . . . $enable_ipvs])
AC_MSG_RESULT([ irq . . . . . . . . . $enable_irq])
@ -46,7 +46,7 @@
AC_MSG_RESULT([ logfile . . . . . . . $enable_logfile])
--- a/src/collectd.conf.in
+++ b/src/collectd.conf.in
@@ -137,6 +137,7 @@
@@ -138,6 +138,7 @@
#@BUILD_PLUGIN_IPTABLES_TRUE@LoadPlugin iptables
#@BUILD_PLUGIN_IPVS_TRUE@LoadPlugin ipvs
#@BUILD_PLUGIN_IRQ_TRUE@LoadPlugin irq
@ -54,7 +54,7 @@
#@BUILD_PLUGIN_JAVA_TRUE@LoadPlugin java
@BUILD_PLUGIN_LOAD_TRUE@@BUILD_PLUGIN_LOAD_TRUE@LoadPlugin load
#@BUILD_PLUGIN_LPAR_TRUE@LoadPlugin lpar
@@ -721,6 +722,12 @@
@@ -767,6 +768,12 @@
# IgnoreSelected true
#</Plugin>
@ -69,7 +69,7 @@
# JVMArg "-Djava.class.path=@prefix@/share/collectd/java/collectd-api.jar"
--- a/src/collectd.conf.pod
+++ b/src/collectd.conf.pod
@@ -3521,6 +3521,27 @@ and all other interrupts are collected.
@@ -3803,6 +3803,27 @@ and all other interrupts are collected.
=back
@ -119,9 +119,9 @@
+ **/
+
+#include "collectd.h"
+#include "common.h"
+#include "plugin.h"
+#include "utils_ignorelist.h"
+#include "utils/common/common.h"
+#include "utils/ignorelist/ignorelist.h"
+
+#include <stdint.h>
+#include <iwinfo.h>
@ -252,17 +252,17 @@
+}
--- a/src/types.db
+++ b/src/types.db
@@ -269,6 +269,7 @@ voltage_threshold value:GAUGE:U:U,
vs_memory value:GAUGE:0:9223372036854775807
vs_processes value:GAUGE:0:65535
vs_threads value:GAUGE:0:65535
@@ -240,6 +240,7 @@ voltage_threshold value:GAUGE:U:U,
spam_check value:GAUGE:0:U
spam_score value:GAUGE:U:U
spl value:GAUGE:U:U
+stations value:GAUGE:0:256
#
# Legacy types
swap value:GAUGE:0:1099511627776
swap_io value:DERIVE:0:U
tcp_connections value:GAUGE:0:4294967295
--- a/Makefile.am
+++ b/Makefile.am
@@ -997,6 +997,14 @@ irq_la_LDFLAGS = $(PLUGIN_LDFLAGS)
@@ -1149,6 +1149,14 @@ irq_la_LDFLAGS = $(PLUGIN_LDFLAGS)
irq_la_LIBADD = libignorelist.la
endif

View File

@ -1,6 +1,6 @@
--- a/src/ping.c
+++ b/src/ping.c
@@ -633,7 +633,7 @@ static int ping_read(void) /* {{{ */
@@ -648,7 +648,7 @@ static int ping_read(void) /* {{{ */
((double)(pkg_recv * (pkg_recv - 1))));
/* Calculate drop rate. */

View File

@ -1,42 +0,0 @@
--- a/src/lua.c
+++ b/src/lua.c
@@ -281,9 +281,6 @@ static int lua_cb_register_read(lua_Stat
luaL_checktype(L, 1, LUA_TFUNCTION);
- char function_name[DATA_MAX_NAME_LEN];
- snprintf(function_name, sizeof(function_name), "lua/%s", lua_tostring(L, 1));
-
int callback_id = clua_store_callback(L, 1);
if (callback_id < 0)
return luaL_error(L, "%s", "Storing callback function failed");
@@ -298,6 +295,9 @@ static int lua_cb_register_read(lua_Stat
if (cb == NULL)
return luaL_error(L, "%s", "calloc failed");
+ char function_name[DATA_MAX_NAME_LEN];
+ snprintf(function_name, sizeof(function_name), "lua/%p", thread);
+
cb->lua_state = thread;
cb->callback_id = callback_id;
cb->lua_function_name = strdup(function_name);
@@ -325,9 +325,6 @@ static int lua_cb_register_write(lua_Sta
luaL_checktype(L, 1, LUA_TFUNCTION);
- char function_name[DATA_MAX_NAME_LEN] = "";
- snprintf(function_name, sizeof(function_name), "lua/%s", lua_tostring(L, 1));
-
int callback_id = clua_store_callback(L, 1);
if (callback_id < 0)
return luaL_error(L, "%s", "Storing callback function failed");
@@ -342,6 +339,9 @@ static int lua_cb_register_write(lua_Sta
if (cb == NULL)
return luaL_error(L, "%s", "calloc failed");
+ char function_name[DATA_MAX_NAME_LEN] = "";
+ snprintf(function_name, sizeof(function_name), "lua/%p", thread);
+
cb->lua_state = thread;
cb->callback_id = callback_id;
cb->lua_function_name = strdup(function_name);