author | Florian Forster <octo@collectd.org> | |
Sun, 18 Aug 2013 10:14:39 +0000 (12:14 +0200) | ||
committer | Florian Forster <octo@collectd.org> | |
Sun, 18 Aug 2013 10:14:39 +0000 (12:14 +0200) |
Conflicts:
configure.in
configure.in
ChangeLog | patch | blob | history | |
configure.in | patch | blob | history | |
contrib/redhat/collectd.spec | patch | blob | history | |
src/csv.c | patch | blob | history | |
src/exec.c | patch | blob | history | |
src/memcached.c | patch | blob | history | |
src/rrdcached.c | patch | blob | history | |
src/rrdtool.c | patch | blob | history | |
version-gen.sh | patch | blob | history |
diff --git a/ChangeLog b/ChangeLog
index 27f58e9a4747a51c51a37bb516f9d55df094a520..acbf7bbad19bc7c4925e49d9e6777acc67317feb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
+2013-07-13, Version 5.3.1
+ * Documentation: Various fixes.
+ * Configuration: Fix error handling: Errors in included files were
+ ignored, causing configuration mistakes to go unnoticed.
+ * dns plugin: Don't abort when PCAP returns an error.
+ * modbus plugin: The reconnection strategy was improved, fixing a
+ segfault in the libmodbud library. Thanks to Stefan Nickl and
+ Fabien Wernli for their patches.
+ * mysql plugin: The notification about a newly running MySQL slave
+ thread has been fixed. Thanks to Joaquín Cuenca Abela for the patch.
+ * snmp plugin: A build issue has been fixed (C99 mixed declaration).
+ The end-of-tree check has been improved by Pierre-Yves Ritschard.
+ * threshold plugin: Handling of the "Interesting" configuration option
+ has been fixed. Thanks to Björn for the patch.
+ * write_riemann plugin: A memory leak has been fixed. Thanks to Dave
+ Cottlehuber for reporting it.
+
2013-04-09, Version 5.3.0
* collectd: The "Include" statements can now be limited to include
only matching files in a directory. Thanks to Sebastian Harl for his
diff --git a/configure.in b/configure.in
index 16bffbaba6e403d0a26ac1ec3d4c8f3cf3dbdbc9..c23df178ca1ac0c9dd464894ca1fb407bd32fb78 100644 (file)
--- a/configure.in
+++ b/configure.in
libvirt . . . . . . . $enable_libvirt
load . . . . . . . . $enable_load
logfile . . . . . . . $enable_logfile
- lpar... . . . . . . . $enable_lpar
+ lpar . . . . . . . . $enable_lpar
lvm . . . . . . . . . $enable_lvm
madwifi . . . . . . . $enable_madwifi
match_empty_counter . $enable_match_empty_counter
index 86f317f7a1b80e43a1555de8912178a2058fdef0..4f70fd694d8902caca6ce4377375d05696345dec 100644 (file)
+#
+# q: What is this ?
+# a: A specfile for building RPM packages of current collectd releases, for
+# RHEL/CentOS versions 5 and 6. By default all the plugins which are
+# buildable based on the libraries available in the distribution + the
+# EPEL repository, will be built. Plugins depending on external libs will
+# be packaged in separate RPMs.
+#
+# q: And how can I do that ?
+# a: By following these instructions, using mock:
+#
+# - install and configure mock (https://fedoraproject.org/wiki/Projects/Mock)
+#
+# - enable the EPEL repository (http://dl.fedoraproject.org/pub/epel/) in the
+# configuration files for your target systems (/etc/mock/*.cfg).
+#
+# - copy this file in your ~/rpmbuild/SPECS/ directory
+#
+# - fetch the desired collectd release file from https://collectd.org/files/
+# and save it in your ~/rpmbuild/SOURCES/ directory
+#
+# - build the SRPM first:
+# mock -r centos-6-x86_64 --buildsrpm --spec ~/rpmbuild/SPECS/collectd.spec \
+# --sources ~/rpmbuild/SOURCES/
+#
+# - then build the RPMs:
+# mock -r centos-6-x86_64 --no-clean --rebuild \
+# /var/lib/mock/centos-6-x86_64/result/collectd-X.Y.Z-NN.src.rpm
+#
+# - you can also optionally enable/disable plugins which are disabled/enabled
+# by default:
+# mock -r centos-6-x86_64 --no-clean --without=java --with=oracle --rebuild \
+# /var/lib/mock/centos-6-x86_64/result/collectd-X.Y.Z-NN.src.rpm
+#
+
%global _hardened_build 1
-# enabled plugins
+# plugins only buildable on RHEL6
+# (NB: %{elN} macro is not available on RHEL < 6)
+%{?el6:%global _has_libyajl 1}
+%{?el6:%global _has_recent_libpcap 1}
+%{?el6:%global _has_recent_sockios_h 1}
+%{?el6:%global _has_recent_libganglia 1}
+%{?el6:%global _has_working_libiptc 1}
+%{?el6:%global _has_ip_vs_h 1}
+%{?el6:%global _has_perl_extutils_embed 1}
+
+# plugins enabled by default
%define with_aggregation 0%{!?_without_aggregation:1}
%define with_amqp 0%{!?_without_amqp:1}
%define with_apache 0%{!?_without_apache:1}
%define with_cpufreq 0%{!?_without_cpufreq:1}
%define with_csv 0%{!?_without_csv:1}
%define with_curl 0%{!?_without_curl:1}
-%define with_curl_json 0%{!?_without_curl_json:1}
+%define with_curl_json 0%{!?_without_curl_json:0%{?_has_libyajl}}
%define with_curl_xml 0%{!?_without_curl_xml:1}
%define with_dbi 0%{!?_without_dbi:1}
%define with_df 0%{!?_without_df:1}
%define with_disk 0%{!?_without_disk:1}
-%define with_dns 0%{!?_without_dns:1}
+%define with_dns 0%{!?_without_dns:0%{?_has_recent_libpcap}}
%define with_email 0%{!?_without_email:1}
%define with_entropy 0%{!?_without_entropy:1}
-%define with_ethstat 0%{!?_without_ethstat:1}
+%define with_ethstat 0%{!?_without_ethstat:0%{?_has_recent_sockios_h}}
%define with_exec 0%{!?_without_exec:1}
%define with_filecount 0%{!?_without_filecount:1}
%define with_fscache 0%{!?_without_fscache:1}
-%define with_gmond 0%{!?_without_gmond:1}
+%define with_gmond 0%{!?_without_gmond:0%{?_has_recent_libganglia}}
%define with_hddtemp 0%{!?_without_hddtemp:1}
%define with_interface 0%{!?_without_interface:1}
%define with_ipmi 0%{!?_without_ipmi:1}
-%define with_iptables 0%{!?_without_iptables:1}
-%define with_ipvs 0%{!?_without_ipvs:1}
+%define with_iptables 0%{!?_without_iptables:0%{?_has_working_libiptc}}
+%define with_ipvs 0%{!?_without_ipvs:0%{?_has_ip_vs_h}}
%define with_irq 0%{!?_without_irq:1}
%define with_java 0%{!?_without_java:1}
%define with_libvirt 0%{!?_without_libvirt:1}
%define with_nut 0%{!?_without_nut:1}
%define with_olsrd 0%{!?_without_olsrd:1}
%define with_openvpn 0%{!?_without_openvpn:1}
-%define with_perl 0%{!?_without_perl:1}
+%define with_perl 0%{!?_without_perl:0%{?_has_perl_extutils_embed}}
%define with_pinba 0%{!?_without_pinba:1}
%define with_ping 0%{!?_without_ping:1}
%define with_postgresql 0%{!?_without_postgresql:1}
%define with_write_http 0%{!?_without_write_http:1}
%define with_write_riemann 0%{!?_without_write_riemann:1}
-# disabled plugins
+# Plugins not built by default because of dependencies on libraries not
+# available in RHEL or EPEL:
+
+# plugin apple_sensors disabled, requires a Mac
%define with_apple_sensors 0%{!?_without_apple_sensors:0}
+# plugin lpar disabled, requires AIX
%define with_lpar 0%{!?_without_lpar:0}
+# plugin modbus disabled, requires libmodbus
%define with_modbus 0%{!?_without_modbus:0}
+# plugin netapp disabled, requires libnetapp
%define with_netapp 0%{!?_without_netapp:0}
+# plugin netlink disabled, requires libnetlink.h
%define with_netlink 0%{!?_without_netlink:0}
+# plugin onewire disabled, requires libowfs
%define with_onewire 0%{!?_without_onewire:0}
+# plugin oracle disabled, requires Oracle
%define with_oracle 0%{!?_without_oracle:0}
+# plugin oracle disabled, requires BSD
%define with_pf 0%{!?_without_pf:0}
+# plugin redis disabled, requires credis
%define with_redis 0%{!?_without_redis:0}
+# plugin routeros disabled, requires librouteros
%define with_routeros 0%{!?_without_routeros:0}
+# plugin rrdcached disabled, requires rrdtool >= 1.4
%define with_rrdcached 0%{!?_without_rrdcached:0}
+# plugin tape disabled, requires libkstat
%define with_tape 0%{!?_without_tape:0}
+# plugin tokyotyrant disabled, requires tcrdb.h
%define with_tokyotyrant 0%{!?_without_tokyotyrant:0}
+# plugin write_mongodb disabled, requires libmongoc
%define with_write_mongodb 0%{!?_without_write_mongodb:0}
+# plugin write_redis disabled, requires credis
%define with_write_redis 0%{!?_without_write_redis:0}
+# plugin xmms disabled, requires xmms
%define with_xmms 0%{!?_without_xmms:0}
+# plugin zfs_arc disabled, requires FreeBSD/Solaris
%define with_zfs_arc 0%{!?_without_zfs_arc:0}
Summary: Statistics collection daemon for filling RRD files
Name: collectd
-Version: 5.3.0
+Version: 5.3.1
Release: 1%{?dist}
URL: http://collectd.org
Source: http://collectd.org/files/%{name}-%{version}.tar.bz2
License: GPLv2
Group: System Environment/Daemons
BuildRoot: %{_tmppath}/%{name}-%{version}-root
-BuildRequires: libgcrypt-devel
+BuildRequires: libgcrypt-devel, kernel-headers
Vendor: collectd development team <collectd@verplant.org>
Requires(post): chkconfig
Summary: Curl_json plugin for collectd
Group: System Environment/Daemons
Requires: %{name}%{?_isa} = %{version}-%{release}
-Buildrequires: curl-devel, yajl-devel
+BuildRequires: curl-devel, yajl-devel
%description curl_json
The cURL-JSON plugin queries JavaScript Object Notation (JSON) data using the
cURL library and parses it according to the user's configuration.
Summary: DBI plugin for collectd
Group: System Environment/Daemons
Requires: %{name}%{?_isa} = %{version}-%{release}
-Buildrequires: libdbi-devel
+BuildRequires: libdbi-devel
%description dbi
The DBI plugin uses libdbi, a database abstraction library, to execute SQL
statements on a database and read back the result.
%package dns
Summary: DNS plugin for collectd
Group: System Environment/Daemons
-Requires: %{name}%{?_isa} = %{version}-%{release}
-Buildrequires: libpcap-devel
+Requires: %{name}%{?_isa} = %{version}-%{release}, libpcap >= 1.0
+BuildRequires: libpcap-devel >= 1.0
%description dns
The DNS plugin has a similar functionality to dnstop: It uses libpcap to get a
copy of all traffic from/to port UDP/53 (that's the DNS port), interprets the
Summary: Notify_desktop plugin for collectd
Group: System Environment/Daemons
Requires: %{name}%{?_isa} = %{version}-%{release}
-BuildRequires: libnotify-devel
+BuildRequires: libnotify-devel, gtk2-devel
%description notify_desktop
The Notify Desktop plugin uses libnotify to display notifications to the user
via the desktop notification specification, i. e. on an X display.
Summary: Python plugin for collectd
Group: System Environment/Daemons
Requires: %{name}%{?_isa} = %{version}-%{release}
-BuildRequires: python-devel
+%if 0%{?rhel} >= 6
+BuildRequires: python-devel
+%else
+BuildRequires: python26-devel
+%endif
%description python
The Python plugin embeds a Python interpreter into collectd and exposes the
application programming interface (API) to Python-scripts.
%package -n libcollectdclient
Summary: Collectd client library
+Group: System Environment/Daemons
%description -n libcollectdclient
Collectd client library
%package -n libcollectdclient-devel
Summary: Development files for libcollectdclient
+Group: System Environment/Daemons
Requires: pkgconfig
Requires: libcollectdclient%{?_isa} = %{version}-%{release}
%description -n libcollectdclient-devel
%endif
%if %{with_python}
+%if 0%{?rhel} >= 6
%define _with_python --enable-python
%else
+%define _with_python --enable-python --with-python=%{_bindir}/python2.6
+%endif
+%else
%define _with_python --disable-python
%endif
--disable-static \
--without-included-ltdl \
--enable-all-plugins=yes \
- --enable-aggregation \
--enable-match_empty_counter \
--enable-match_hashed \
--enable-match_regex \
%if ! %{with_perl}
rm -f %{buildroot}%{_mandir}/man5/collectd-perl.5*
rm -f %{buildroot}%{_mandir}/man3/Collectd::Unixsock.3pm*
+rm -fr perl-examples/
+rm -fr %{buildroot}/usr/lib/perl5/
%endif
%if ! %{with_python}
%{_libdir}/%{name}/write_graphite.so
%endif
-# All plugins not built by default because of dependencies on libraries not
-# available in RHEL or EPEL:
-# plugin modbus disabled, requires libmodbus
-# plugin netlink disabled, requires libnetlink.h
-# plugin numa disabled, requires libnetapp
-# plugin onewire disabled, requires libowfs
-# plugin oracle disabled, requires Oracle
-# plugin redis disabled, requires credis
-# plugin routeros disabled, requires librouteros
-# plugin rrdcached disabled, requires rrdtool >= 1.4
-# plugin tokyotyrant disabled, requires tcrdb.h
-# plugin write_mongodb disabled, requires libmongoc
-# plugin write_redis disabled, requires credis
-# plugin xmms disabled, requires xmms
-
%files -n libcollectdclient-devel
%{_includedir}/collectd/client.h
%if %{with_java}
%files java
-%{_datarootdir}/collectd/java/collectd-api.jar
-%{_datarootdir}/collectd/java/generic-jmx.jar
+%{_prefix}/share/collectd/java/collectd-api.jar
+%{_prefix}/share/collectd/java/generic-jmx.jar
%{_libdir}/%{name}/java.so
%{_mandir}/man5/collectd-java.5*
%endif
%if %{with_postgresql}
%files postgresql
-%{_datarootdir}/collectd/postgresql_default.conf
+%{_prefix}/share/collectd/postgresql_default.conf
%{_libdir}/%{name}/postgresql.so
%endif
%doc contrib/
%changelog
+* Tue Aug 06 2013 Marc Fournier <marc.fournier@camptocamp.com> 5.3.1-1
+- New upstream version
+- Added RHEL5 support:
+ * conditionally disable plugins not building on this platform
+ * add/specify some build dependencies and options
+ * replace some RPM macros not available on this platform
+- Removed duplicate --enable-aggregation
+- Added some comments & usage examples
+- Replaced a couple of "Buildrequires" by "BuildRequires"
+
* Wed Apr 10 2013 Marc Fournier <marc.fournier@camptocamp.com> 5.3.0-1
- New upstream version
- Enabled write_riemann plugin
diff --git a/src/csv.c b/src/csv.c
index afb4f8338c5d7e2611e489338eda5a642f3c56b8..958e34baf0d96d825e8ce9dfa79a21849db6e3d2 100644 (file)
--- a/src/csv.c
+++ b/src/csv.c
{
int status;
- char *ptr;
- size_t ptr_size;
+ char *ptr = buffer;
+ size_t ptr_size = buffer_size;
time_t now;
struct tm struct_tm;
- status = FORMAT_VL (buffer, buffer_size, vl);
+ if (datadir != NULL)
+ {
+ size_t len = strlen (datadir) + 1;
+
+ if (len >= ptr_size)
+ return (ENOBUFS);
+
+ memcpy (ptr, datadir, len);
+ ptr[len-1] = '/';
+ ptr_size -= len;
+ ptr += len;
+ }
+
+ status = FORMAT_VL (ptr, ptr_size, vl);
if (status != 0)
return (status);
if (use_stdio)
return (0);
- ptr_size = buffer_size - strlen (buffer);
- ptr = buffer + strlen (buffer);
+ ptr_size -= strlen (ptr);
+ ptr += strlen (ptr);
/* "-2013-07-12" => 11 bytes */
if (ptr_size < 12)
if (strcasecmp ("DataDir", key) == 0)
{
if (datadir != NULL)
+ {
free (datadir);
+ datadir = NULL;
+ }
if (strcasecmp ("stdout", value) == 0)
{
use_stdio = 1;
diff --git a/src/exec.c b/src/exec.c
index fbd9c268bcd74102ef0381ea11023944a9d59baf..cfd82a31b444adc1ce3ef1553a9d2ccddfd81b05 100644 (file)
--- a/src/exec.c
+++ b/src/exec.c
} /* }}} void set_environment */
__attribute__((noreturn))
-static void exec_child (program_list_t *pl) /* {{{ */
+static void exec_child (program_list_t *pl, int uid, int gid, int egid) /* {{{ */
{
int status;
- int uid;
- int gid;
- int egid;
-
- struct passwd *sp_ptr;
- struct passwd sp;
- char nambuf[2048];
char errbuf[1024];
- sp_ptr = NULL;
- status = getpwnam_r (pl->user, &sp, nambuf, sizeof (nambuf), &sp_ptr);
- if (status != 0)
- {
- ERROR ("exec plugin: Failed to get user information for user ``%s'': %s",
- pl->user, sstrerror (errno, errbuf, sizeof (errbuf)));
- exit (-1);
- }
- if (sp_ptr == NULL)
- {
- ERROR ("exec plugin: No such user: `%s'", pl->user);
- exit (-1);
- }
-
- uid = sp.pw_uid;
- gid = sp.pw_gid;
- if (uid == 0)
- {
- ERROR ("exec plugin: Cowardly refusing to exec program as root.");
- exit (-1);
- }
-
- /* The group configured in the configfile is set as effective group, because
- * this way the forked process can (re-)gain the user's primary group. */
- egid = -1;
- if (NULL != pl->group)
- {
- if ('\0' != *pl->group) {
- struct group *gr_ptr = NULL;
- struct group gr;
-
- status = getgrnam_r (pl->group, &gr, nambuf, sizeof (nambuf), &gr_ptr);
- if (0 != status)
- {
- ERROR ("exec plugin: Failed to get group information "
- "for group ``%s'': %s", pl->group,
- sstrerror (errno, errbuf, sizeof (errbuf)));
- exit (-1);
- }
- if (NULL == gr_ptr)
- {
- ERROR ("exec plugin: No such group: `%s'", pl->group);
- exit (-1);
- }
-
- egid = gr.gr_gid;
- }
- else
- {
- egid = gid;
- }
- } /* if (pl->group == NULL) */
-
#if HAVE_SETGROUPS
if (getuid () == 0)
{
@@ -429,6 +369,14 @@ static int fork_child (program_list_t *pl, int *fd_in, int *fd_out, int *fd_err)
int status;
int pid;
+ int uid;
+ int gid;
+ int egid;
+
+ struct passwd *sp_ptr;
+ struct passwd sp;
+ char nambuf[2048];
+
if (pl->pid != 0)
return (-1);
@@ -456,6 +404,59 @@ static int fork_child (program_list_t *pl, int *fd_in, int *fd_out, int *fd_err)
return (-1);
}
+ sp_ptr = NULL;
+ status = getpwnam_r (pl->user, &sp, nambuf, sizeof (nambuf), &sp_ptr);
+ if (status != 0)
+ {
+ ERROR ("exec plugin: Failed to get user information for user ``%s'': %s",
+ pl->user, sstrerror (errno, errbuf, sizeof (errbuf)));
+ return (-1);
+ }
+ if (sp_ptr == NULL)
+ {
+ ERROR ("exec plugin: No such user: `%s'", pl->user);
+ return (-1);
+ }
+
+ uid = sp.pw_uid;
+ gid = sp.pw_gid;
+ if (uid == 0)
+ {
+ ERROR ("exec plugin: Cowardly refusing to exec program as root.");
+ return (-1);
+ }
+
+ /* The group configured in the configfile is set as effective group, because
+ * this way the forked process can (re-)gain the user's primary group. */
+ egid = -1;
+ if (NULL != pl->group)
+ {
+ if ('\0' != *pl->group) {
+ struct group *gr_ptr = NULL;
+ struct group gr;
+
+ status = getgrnam_r (pl->group, &gr, nambuf, sizeof (nambuf), &gr_ptr);
+ if (0 != status)
+ {
+ ERROR ("exec plugin: Failed to get group information "
+ "for group ``%s'': %s", pl->group,
+ sstrerror (errno, errbuf, sizeof (errbuf)));
+ return (-1);
+ }
+ if (NULL == gr_ptr)
+ {
+ ERROR ("exec plugin: No such group: `%s'", pl->group);
+ return (-1);
+ }
+
+ egid = gr.gr_gid;
+ }
+ else
+ {
+ egid = gid;
+ }
+ } /* if (pl->group == NULL) */
+
pid = fork ();
if (pid < 0)
{
@@ -505,7 +506,7 @@ static int fork_child (program_list_t *pl, int *fd_in, int *fd_out, int *fd_err)
/* Unblock all signals */
reset_signal_mask ();
- exec_child (pl);
+ exec_child (pl, uid, gid, egid);
/* does not return */
}
diff --git a/src/memcached.c b/src/memcached.c
index 535ea84704b3dac328a5af495f69bccdbdfedb9a..d739203655d5fb4b840b6f36128d81efcdfcd8f4 100644 (file)
--- a/src/memcached.c
+++ b/src/memcached.c
return (-1);
}
+ /* connect to the memcached daemon */
+ int status = connect (fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
+ if (status != 0)
+ {
+ shutdown (fd, SHUT_RDWR);
+ close (fd);
+ fd = -1;
+ }
+
return (fd);
} /* int memcached_connect_unix */
diff --git a/src/rrdcached.c b/src/rrdcached.c
index e5e11d4317b045fbb8587a3de3cc3f332653e858..e77be2dd29eddd6af3b2674e35a2ffec967a3cb5 100644 (file)
--- a/src/rrdcached.c
+++ b/src/rrdcached.c
int status;
size_t len;
+ if (datadir != NULL)
+ {
+ size_t datadir_len = strlen (datadir) + 1;
+
+ if (datadir_len >= buffer_size)
+ return (ENOMEM);
+
+ sstrncpy (buffer, datadir, buffer_size);
+ buffer[datadir_len - 1] = '/';
+ buffer[datadir_len] = 0;
+
+ buffer += datadir_len;
+ buffer_size -= datadir_len;
+ }
+
status = FORMAT_VL (buffer, buffer_size, vl);
if (status != 0)
return (status);
diff --git a/src/rrdtool.c b/src/rrdtool.c
index 2f28329f0fbef43f17c70b3b7136a6b4f187e2b8..c795e2656502685ca353937ddda2b9defcd3a518 100644 (file)
--- a/src/rrdtool.c
+++ b/src/rrdtool.c
int status;
size_t len;
+ if (datadir != NULL)
+ {
+ size_t datadir_len = strlen (datadir) + 1;
+
+ if (datadir_len >= buffer_size)
+ return (ENOMEM);
+
+ sstrncpy (buffer, datadir, buffer_size);
+ buffer[datadir_len - 1] = '/';
+ buffer[datadir_len] = 0;
+
+ buffer += datadir_len;
+ buffer_size -= datadir_len;
+ }
+
status = FORMAT_VL (buffer, buffer_size, vl);
if (status != 0)
return (status);
diff --git a/version-gen.sh b/version-gen.sh
index 4be9a4946426f4a370d4880e40695fd53235c543..1ac1bc150cb86682af346cf200a0c4838aa9c927 100755 (executable)
--- a/version-gen.sh
+++ b/version-gen.sh
#!/usr/bin/env bash
-DEFAULT_VERSION="5.3.0.git"
+DEFAULT_VERSION="5.3.1.git"
VERSION="`git describe 2> /dev/null | sed -e 's/^collectd-//'`"