From: Florian Forster Date: Sun, 18 Aug 2013 10:14:39 +0000 (+0200) Subject: Merge branch 'collectd-5.3' X-Git-Tag: collectd-5.4.0~1 X-Git-Url: https://git.octo.it/?p=collectd.git;a=commitdiff_plain;h=c27675331d874c85625d2e64ebcc229db588c5f2;hp=bdf4ac4bba349bac128fea28fac13fda784ae78c Merge branch 'collectd-5.3' Conflicts: configure.in --- diff --git a/ChangeLog b/ChangeLog index 27f58e9a..acbf7bba 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +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 16bffbab..c23df178 100644 --- a/configure.in +++ b/configure.in @@ -5452,7 +5452,7 @@ Configuration: 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 diff --git a/contrib/redhat/collectd.spec b/contrib/redhat/collectd.spec index 86f317f7..4f70fd69 100644 --- a/contrib/redhat/collectd.spec +++ b/contrib/redhat/collectd.spec @@ -1,6 +1,51 @@ +# +# 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} @@ -14,24 +59,24 @@ %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} @@ -55,7 +100,7 @@ %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} @@ -89,35 +134,54 @@ %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 Requires(post): chkconfig @@ -192,7 +256,7 @@ the configuration. 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. @@ -214,7 +278,7 @@ Markup Language (XML). 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. @@ -224,8 +288,8 @@ 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 @@ -345,7 +409,7 @@ This plugin gets data provided by nginx. 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. @@ -422,7 +486,11 @@ database. 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. @@ -551,11 +619,13 @@ package. %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 @@ -981,8 +1051,12 @@ Development files for libcollectdclient %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 @@ -1194,7 +1268,6 @@ Development files for libcollectdclient --disable-static \ --without-included-ltdl \ --enable-all-plugins=yes \ - --enable-aggregation \ --enable-match_empty_counter \ --enable-match_hashed \ --enable-match_regex \ @@ -1353,6 +1426,8 @@ rm -f %{buildroot}%{_mandir}/man5/collectd-java.5* %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} @@ -1583,21 +1658,6 @@ fi %{_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 @@ -1682,8 +1742,8 @@ fi %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 @@ -1745,7 +1805,7 @@ fi %if %{with_postgresql} %files postgresql -%{_datarootdir}/collectd/postgresql_default.conf +%{_prefix}/share/collectd/postgresql_default.conf %{_libdir}/%{name}/postgresql.so %endif @@ -1813,6 +1873,16 @@ fi %doc contrib/ %changelog +* Tue Aug 06 2013 Marc Fournier 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 5.3.0-1 - New upstream version - Enabled write_riemann plugin diff --git a/src/csv.c b/src/csv.c index afb4f833..958e34ba 100644 --- a/src/csv.c +++ b/src/csv.c @@ -126,12 +126,25 @@ static int value_list_to_filename (char *buffer, size_t buffer_size, { 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); @@ -140,8 +153,8 @@ static int value_list_to_filename (char *buffer, size_t buffer_size, 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) @@ -202,7 +215,10 @@ static int csv_config (const char *key, const char *value) 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 fbd9c268..cfd82a31 100644 --- a/src/exec.c +++ b/src/exec.c @@ -287,71 +287,11 @@ static void set_environment (void) /* {{{ */ } /* }}} 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 535ea847..d7392036 100644 --- a/src/memcached.c +++ b/src/memcached.c @@ -84,6 +84,15 @@ static int memcached_connect_unix (memcached_t *st) 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 e5e11d43..e77be2dd 100644 --- a/src/rrdcached.c +++ b/src/rrdcached.c @@ -121,6 +121,21 @@ static int value_list_to_filename (char *buffer, size_t buffer_size, 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 2f28329f..c795e265 100644 --- a/src/rrdtool.c +++ b/src/rrdtool.c @@ -290,6 +290,21 @@ static int value_list_to_filename (char *buffer, size_t buffer_size, 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 4be9a494..1ac1bc15 100755 --- a/version-gen.sh +++ b/version-gen.sh @@ -1,6 +1,6 @@ #!/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-//'`"