Merge branch 'hugepages'
authorRuben Kerkhof <ruben@rubenkerkhof.com>
Mon, 22 Aug 2016 20:35:17 +0000 (22:35 +0200)
committerRuben Kerkhof <ruben@rubenkerkhof.com>
Mon, 22 Aug 2016 20:35:17 +0000 (22:35 +0200)
1  2 
README
configure.ac
src/Makefile.am
src/collectd.conf.in
src/collectd.conf.pod
src/types.db

diff --combined README
--- 1/README
--- 2/README
+++ b/README
@@@ -67,9 -67,6 +67,9 @@@ Feature
      - cpufreq
        CPU frequency (For laptops with speed step or a similar technology)
  
 +    - cpusleep
 +      CPU sleep: Time spent in suspend (For mobile devices which enter suspend automatically)
 +
      - curl
        Parse statistics from websites using regular expressions.
  
      - gmond
        Receive multicast traffic from Ganglia instances.
  
 +    - gps
 +      Monitor gps related data through gpsd.
 +
      - grpc
        Receive values over the network using the gRPC framework.
  
      - hddtemp
        Hard disk temperatures using hddtempd.
  
+     - hugepages
+       Report the number of used and free hugepages. More info on
+       hugepages can be found here:
+       https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt.
      - interface
        Interface traffic: Number of octets, packets and errors for each
        interface.
        Detailed CPU statistics of the “Logical Partitions” virtualization
        technique built into IBM's POWER processors.
  
 +    - lua
 +      The Lua plugin implements a Lua interpreter into collectd. This
 +      makes it possible to write plugins in Lua which are executed by
 +      collectd without the need to start a heavy interpreter every interval.
 +      See collectd-lua(5) for details.
 +
      - lvm
        Size of “Logical Volumes” (LV) and “Volume Groups” (VG) of Linux'
        “Logical Volume Manager” (LVM).
        diskspace but is extremely portable and can be analysed with almost
        every program that can analyse anything. Even Microsoft's Excel..
  
 +    - lua
 +      It's possible to implement write plugins in Lua using the Lua
 +      plugin. See collectd-lua(5) for details.
 +
      - network
        Send the data to a remote host to save the data somehow. This is useful
        for large setups where the data should be saved by a dedicated machine.
@@@ -713,10 -702,6 +718,10 @@@ Prerequisite
      Used by the `network' plugin for encryption and authentication.
      <http://www.gnupg.org/>
  
 +  * libgps (optional)
 +    Used by the `gps' plugin.
 +    <http://developer.berlios.de/projects/gpsd/>
 +
    * libhal (optional)
      If present, the `uuid' plugin will check for UUID from HAL.
      <http://hal.freedesktop.org/>
      Used by the `openldap' plugin.
      <http://www.openldap.org/>
  
 +  * liblua (optional)
 +    Used by the `lua' plugin. Currently, Lua 5.1 and later are supported.
 +    <https://www.lua.org/>
 +
    * liblvm2 (optional)
      Used by the `lvm' plugin.
      <ftp://sources.redhat.com/pub/lvm2/>
      <http://code.google.com/p/protobuf-c/>
  
    * libpython (optional)
 -    Used by the `python' plugin. Currently, Python 2.3 and later and Python 3
 +    Used by the `python' plugin. Currently, Python 2.6 and later and Python 3
      are supported.
      <http://www.python.org/>
  
@@@ -1031,5 -1012,6 +1036,5 @@@ Autho
    Sebastian tokkee Harl <sh at tokkee.org>,
    and many contributors (see `AUTHORS').
  
 -  Please send bug reports and patches to the mailing list, see `Contact'
 -  above.
 -
 +  Please use GitHub reporting bugs and submitting pull requests.
 +  See CONTRIBUTING.md for details.
diff --combined configure.ac
@@@ -1,5 -1,4 +1,5 @@@
  dnl Process this file with autoconf to produce a configure script.
 +AC_PREREQ([2.60])
  AC_INIT([collectd],[m4_esyscmd(./version-gen.sh)])
  AC_CONFIG_SRCDIR(src/target_set.c)
  AC_CONFIG_HEADERS(src/config.h)
@@@ -43,9 -42,7 +43,9 @@@ AC_SYS_LARGEFIL
  #
  # Checks for programs.
  #
 -AC_PROG_CC
 +AC_PROG_CC_C99([],
 +  [AC_MSG_ERROR([No compiler found that supports C99])]
 +)
  AC_PROG_CXX
  AC_PROG_CPP
  AC_PROG_EGREP
@@@ -79,12 -76,11 +79,12 @@@ the
        AC_MSG_ERROR([bison is missing and you do not have ${srcdir}/src/liboconfig/parser.c. Please install bison])
  fi
  
 +AC_ARG_VAR([PROTOC], [path to the protoc binary])
  AC_PATH_PROG([PROTOC], [protoc])
  have_protoc3="no"
  if test "x$PROTOC" != "x"; then
        AC_MSG_CHECKING([for protoc 3.0.0+])
 -      if $PROTOC --version | grep -q libprotoc.3; then
 +      if $PROTOC --version | $EGREP libprotoc.3 >/dev/null; then
                protoc3="yes (`$PROTOC --version`)"
                have_protoc3="yes"
        else
  fi
  AM_CONDITIONAL(HAVE_PROTOC3, test "x$have_protoc3" = "xyes")
  
 +AC_ARG_VAR([GRPC_CPP_PLUGIN], [path to the grpc_cpp_plugin binary])
  AC_PATH_PROG([GRPC_CPP_PLUGIN], [grpc_cpp_plugin])
  AM_CONDITIONAL(HAVE_GRPC_CPP, test "x$GRPC_CPP_PLUGIN" != "x")
  
 -AC_CHECK_PROG([have_protoc_c], [protoc-c], [yes], [no])
 -if test "x$have_protoc_c" = "xno"
 -then
 -      have_protoc_c="no (protoc-c compiler not found)"
 -fi
 -
 -if test "x$have_protoc_c" = "xyes"
 -then
 -      AC_CHECK_HEADERS([protobuf-c/protobuf-c.h google/protobuf-c/protobuf-c.h],
 -                       [have_protoc_c="yes"; break],
 -                       [have_protoc_c="no (<google/protobuf-c/protobuf-c.h> not found)"])
 -fi
 -if test "x$have_protoc_c" = "xyes"
 +AC_ARG_VAR([PROTOC_C], [path to the protoc-c binary])
 +AC_PATH_PROG([PROTOC_C], [protoc-c])
 +if test "x$PROTOC_C" = "x"
  then
 -      AC_CHECK_LIB([protobuf-c], [protobuf_c_message_pack],
 -                   [have_protoc_c="yes"],
 -                   [have_protoc_c="no (libprotobuf-c not found)"])
 -
 +  have_protoc_c="no (protoc-c compiler not found)"
 +else
 +  have_protoc_c="yes"
  fi
 -AM_CONDITIONAL(HAVE_PROTOC_C, test "x$have_protoc_c" = "xyes")
  
  AC_MSG_CHECKING([for kernel type ($host_os)])
  case $host_os in
@@@ -486,7 -493,6 +486,7 @@@ the
  #include <linux/major.h>
  #include <linux/types.h>
  ])
 +      AC_CHECK_HEADERS([sys/sysmacros.h])
  else
        have_linux_raid_md_u_h="no"
  fi
@@@ -683,26 -689,10 +683,26 @@@ AC_CHECK_HEADERS([ 
    wordexp.h \
  ])
  
 -AC_CHECK_HEADERS([xfs/xqm.h], [], [],
 -[
 -#define _GNU_SOURCE
 -])
 +# --enable-xfs {{{
 +AC_ARG_ENABLE([xfs],
 +  [AS_HELP_STRING([--enable-xfs], [xfs support in df plugin @<:@default=yes@:>@])],
 +  [],
 +  [enable_xfs="auto"]
 +)
 +
 +if test "x$enable_xfs" != "xno"; then
 +  AC_CHECK_HEADERS([xfs/xqm.h],
 +    [],
 +    [
 +      if test "x$enable_xfs" = "xyes"; then
 +        AC_MSG_ERROR([xfs/xqm.h not found])
 +      fi
 +    ],
 +    [[#define _GNU_SOURCE]]
 +  )
 +fi
 +
 +# }}}
  
  # For the dns plugin
  AC_CHECK_HEADERS(arpa/nameser.h)
@@@ -765,23 -755,6 +765,23 @@@ AC_CHECK_HEADERS(net/pfvar.h
  have_termios_h="no"
  AC_CHECK_HEADERS(termios.h, [have_termios_h="yes"])
  
 +# For cpusleep plugin
 +AC_CACHE_CHECK([whether clock_boottime and clock_monotonic are supported],
 +                     [c_cv_have_clock_boottime_monotonic],
 +                     AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
 +[[
 +#include <time.h>
 +]],
 +[[
 + struct timespec b, m;
 + clock_gettime(CLOCK_BOOTTIME, &b );
 + clock_gettime(CLOCK_MONOTONIC, &m );
 +]]
 +                     )],
 +                     [c_cv_have_clock_boottime_monotonic="yes"],
 +                     [c_cv_have_clock_boottime_monotonic="no"]))
 +
 +
  # For the turbostat plugin
  have_asm_msrindex_h="no"
  AC_CHECK_HEADERS(asm/msr-index.h, [have_asm_msrindex_h="yes"])
@@@ -821,7 -794,7 +821,7 @@@ AC_HEADER_TIM
  #
  # Checks for library functions.
  #
 -AC_CHECK_FUNCS(gettimeofday select strdup strtol getaddrinfo getnameinfo strchr memcpy strstr strcmp strncmp strncpy strlen strncasecmp strcasecmp openlog closelog sysconf setenv if_indextoname setlocale)
 +AC_CHECK_FUNCS(gettimeofday select strdup strtol getaddrinfo getnameinfo strchr memcpy strstr strcmp strncmp strncpy strlen strncasecmp strcasecmp openlog closelog sysconf setenv if_indextoname setlocale asprintf)
  
  AC_FUNC_STRERROR_R
  
@@@ -1387,20 -1360,6 +1387,20 @@@ AC_ARG_WITH(useragent, [AS_HELP_STRING(
  
  # }}}
  
 +# --with-data-max-name-len {{{
 +AC_ARG_WITH(data-max-name-len, [AS_HELP_STRING([--with-data-max-name-len@<:@=VALUE@:>@], [Maximum length of data buffers])],
 +[
 +    if test "x$withval" != "x" && test $withval -gt 0
 +    then
 +        AC_DEFINE_UNQUOTED(DATA_MAX_NAME_LEN, [$withval], [Maximum length of data buffers])
 +    else
 +        AC_MSG_ERROR([DATA_MAX_NAME_LEN must be a positive integer -- $withval given])
 +    fi
 +],
 +[   AC_DEFINE(DATA_MAX_NAME_LEN, 128, [Maximum length of data buffers])]
 +)
 +# }}}
 +
  have_getfsstat="no"
  AC_CHECK_FUNCS(getfsstat, [have_getfsstat="yes"])
  have_getvfsstat="no"
@@@ -1478,15 -1437,15 +1478,15 @@@ if test "x$have_getmntent" = "xc"; the
  fi
  if test "x$have_getmntent" = "xsun"; then
        AC_DEFINE(HAVE_SUN_GETMNTENT, 1,
 -                [Define if the function getmntent exists. It's the version from libsun.])
 +                [Define if the function getmntent exists. It is the version from libsun.])
  fi
  if test "x$have_getmntent" = "xseq"; then
        AC_DEFINE(HAVE_SEQ_GETMNTENT, 1,
 -                [Define if the function getmntent exists. It's the version from libseq.])
 +                [Define if the function getmntent exists. It is the version from libseq.])
  fi
  if test "x$have_getmntent" = "xgen"; then
        AC_DEFINE(HAVE_GEN_GETMNTENT, 1,
 -                [Define if the function getmntent exists. It's the version from libgen.])
 +                [Define if the function getmntent exists. It is the version from libgen.])
  fi
  
  # Check for htonll
@@@ -1662,32 -1621,18 +1662,32 @@@ AC_CHECK_LIB(resolv, res_search
  AM_CONDITIONAL(BUILD_WITH_LIBRESOLV, test "x$with_libresolv" = "xyes")
  
  dnl Check for HAL (hardware abstraction library)
 -with_libhal="yes"
 -AC_CHECK_LIB(hal,libhal_device_property_exists,
 -           [AC_DEFINE(HAVE_LIBHAL, 1, [Define to 1 if you have 'hal' library])],
 -           [with_libhal="no"])
 -if test "x$with_libhal" = "xyes"; then
 -      if test "x$PKG_CONFIG" != "x"; then
 -              BUILD_WITH_LIBHAL_CFLAGS="`$PKG_CONFIG --cflags hal`"
 -              BUILD_WITH_LIBHAL_LIBS="`$PKG_CONFIG --libs hal`"
 -              AC_SUBST(BUILD_WITH_LIBHAL_CFLAGS)
 -              AC_SUBST(BUILD_WITH_LIBHAL_LIBS)
 -      fi
 -fi
 +with_libhal="no"
 +PKG_CHECK_MODULES([HAL], [hal],
 +  [
 +    SAVE_LIBS="$LIBS"
 +    LIBS="$HAL_LIBS $LIBS"
 +    AC_CHECK_LIB([hal], [libhal_device_property_exists],
 +      [
 +        SAVE_CPPFLAGS="$CPPFLAGS"
 +        CPPFLAGS="$HAL_CFLAGS $CPPFLAGS"
 +        AC_CHECK_HEADERS([libhal.h],
 +        [
 +          with_libhal="yes"
 +          BUILD_WITH_LIBHAL_CFLAGS="$HAL_CFLAGS"
 +          BUILD_WITH_LIBHAL_LIBS="$HAL_LIBS"
 +        ])
 +        CPPFLAGS="$SAVE_CPPFLAGS"
 +      ],
 +      [ : ]
 +    )
 +    LIBS="$SAVE_LIBS"
 +  ],
 +  [ : ]
 +)
 +AC_SUBST(BUILD_WITH_LIBHAL_CFLAGS)
 +AC_SUBST(BUILD_WITH_LIBHAL_LIBS)
 +
  
  SAVE_LIBS="$LIBS"
  AC_CHECK_LIB([pthread],
@@@ -2301,144 -2246,60 +2301,144 @@@ AC_SUBST(GCRYPT_LIBS
  AM_CONDITIONAL(BUILD_WITH_LIBGCRYPT, test "x$with_libgcrypt" = "xyes")
  # }}}
  
 -# --with-grpc {{{
 -AC_ARG_WITH(grpc, [AS_HELP_STRING([--without-grpc], [Disable gRPC (default: autodetect).])],
 +# --with-libgps {{{
 +with_libgps_cflags=""
 +with_libgps_ldflags=""
 +AC_ARG_WITH(libgps, [AS_HELP_STRING([--with-libgps@<:@=PREFIX@:>@], [Path to libgps.])],
  [
 -      with_grpc="$withval"
 +      if test "x$withval" != "xno" && test "x$withval" != "xyes"
 +      then
 +              with_libgps_cflags="-I$withval/include"
 +              with_libgps_ldflags="-L$withval/lib"
 +              with_libgps="yes"
 +      else
 +              with_libgps="$withval"
 +      fi
  ],
  [
 -      with_grpc="yes"
 +      with_libgps="yes"
  ])
 +if test "x$with_libgps" = "xyes"
 +then
 +      SAVE_CFLAGS="$CFLAGS"
 +      CFLAGS="$CFLAGS $with_libgps_cflags"
  
 -if test "x$with_grpc" = "xyes"
 +      AC_CHECK_HEADERS(gps.h, [with_libgps="yes"], [with_libgps="no (gps.h not found)"])
 +
 +      CFLAGS="$SAVE_CFLAGS"
 +fi
 +if test "x$with_libgps" = "xyes"
  then
 -      if test "x$have_protoc3" != "xyes"
 -      then
 -              with_grpc="no (requires protoc 3.0.0+)"
 -      else if test "x$GRPC_CPP_PLUGIN" = "x"
 -      then
 -              with_grpc"no (requires grpc_cpp_plugin)"
 -      fi; fi
 +      SAVE_CFLAGS="$CFLAGS"
 +      SAVE_LDFLAGS="$LDFLAGS"
 +      CFLAGS="$CFLAGS $with_libgps_cflags"
 +      LDFLAGS="$LDFLAGS $with_libgps_ldflags"
 +
 +      AC_CHECK_LIB(gps, gps_open, [with_libgps="yes"], [with_libgps="no (symbol gps_open not found)"])
 +
 +      CFLAGS="$SAVE_CFLAGS"
 +      LDFLAGS="$SAVE_LDFLAGS"
  fi
 +if test "x$with_libgps" = "xyes"
 +then
 +      BUILD_WITH_LIBGPS_CFLAGS="$with_libgps_cflags"
 +      BUILD_WITH_LIBGPS_LDFLAGS="$with_libgps_ldflags"
 +      BUILD_WITH_LIBGPS_LIBS="-lgps"
 +      AC_SUBST(BUILD_WITH_LIBGPS_CFLAGS)
 +      AC_SUBST(BUILD_WITH_LIBGPS_LDFLAGS)
 +      AC_SUBST(BUILD_WITH_LIBGPS_LIBS)
 +fi
 +AM_CONDITIONAL(BUILD_WITH_LIBGPS, test "x$with_libgps" = "xyes")
 +# }}}
  
 -if test "x$with_grpc" = "xyes"
 +# --with-libgrpc++ {{{
 +with_libgrpcpp_cppflags=""
 +with_libgrpcpp_ldflags=""
 +AC_ARG_WITH([libgrpc++], [AS_HELP_STRING([--with-libgrpc++@<:@=PREFIX@:>@], [Path to libgrpc++.])],
 +  [
 +    with_grpcpp="$withval"
 +    if test "x$withval" != "xno" && test "x$withval" != "xyes"
 +    then
 +      with_libgrpcpp_cppflags="-I$withval/include"
 +      with_libgrpcpp_ldflags="-L$withval/lib"
 +      with_libgrpcpp="yes"
 +    fi
 +    if test "x$withval" = "xno"
 +    then
 +      with_libgrpcpp="no (disabled on command line)"
 +    fi
 +  ],
 +  [withval="yes"]
 +)
 +if test "x$withval" = "xyes"
  then
 -      AC_MSG_CHECKING([whether $CXX accepts -std=c++11])
 -      if test_cxx_flags -std=c++11; then
 -              AC_MSG_RESULT([yes])
 -      else
 -              AC_MSG_RESULT([no])
 -              with_grpc="no (requires C++11 support)"
 -      fi
 +PKG_CHECK_MODULES([GRPCPP], [grpc++],
 +  [with_libgrpcpp="yes"],
 +  [with_libgrpcpp="no (pkg-config could not find libgrpc++)"]
 +)
  fi
  
 -if test "x$with_grpc" = "xyes"
 +if test "x$withval" != "xno"
  then
 -      AC_LANG_PUSH(C++)
 -      SAVE_CPPFLAGS="$CPPFLAGS"
 -      SAVE_CXXFLAGS="$CXXFLAGS"
 -      CPPFLAGS="$CPPFLAGS -std=c++11"
 -      CXXFLAGS="$CXXFLAGS -std=c++11"
 -      AC_CHECK_HEADERS([grpc++/grpc++.h], [],
 -                      [with_grpc="no (grpc++/grpc++.h not found)"])
 -      CPPFLAGS="$SAVE_CPPFLAGS"
 -      CXXFLAGS="$SAVE_CXXFLAGS"
 -      AC_LANG_POP(C++)
 +  AC_MSG_CHECKING([whether $CXX accepts -std=c++11])
 +  if test_cxx_flags -std=c++11; then
 +    AC_MSG_RESULT([yes])
 +  else
 +    AC_MSG_RESULT([no])
 +    with_libgrpcpp="no (requires C++11 support)"
 +  fi
  fi
 -with_libgrpc="no"
 -if test "x$with_grpc" = "xyes"
 +
 +if test "x$with_libgrpcpp" = "xyes"
  then
 -      AC_LANG_PUSH(C++)
 -      AC_CHECK_LIB([grpc], [grpc_register_plugin],
 -                      [with_libgrpc="yes"],
 -                      [with_grpc="no (libgrpc not found)"],
 -                      [-lgpr -lprotobuf])
 -      AC_LANG_POP(C++)
 +  AC_LANG_PUSH(C++)
 +  SAVE_CPPFLAGS="$CPPFLAGS"
 +  CPPFLAGS="-std=c++11 $with_libgrpcpp_cppflags $GRPCPP_CFLAGS $CPPFLAGS"
 +  AC_CHECK_HEADERS([grpc++/grpc++.h], [],
 +    [with_libgrpcpp="no (<grpc++/grpc++.h> not found)"]
 +  )
 +  CPPFLAGS="$SAVE_CPPFLAGS"
 +  AC_LANG_POP(C++)
  fi
 +if test "x$with_libgrpcpp" = "xyes"
 +then
 +  AC_LANG_PUSH(C++)
 +  SAVE_CPPFLAGS="$CPPFLAGS"
 +  SAVE_LDFLAGS="$LDFLAGS"
 +  SAVE_LIBS="$LIBS"
 +  CPPFLAGS="-std=c++11 $with_libgrpcpp_cppflags $GRPCPP_CFLAGS $CPPFLAGS"
 +  LDFLAGS="$with_libgrpcpp_ldflags"
 +  if test "x$GRPCPP_LIBS" = "x"
 +  then
 +    LIBS="-lgrpc++"
 +  else
 +    LIBS="$GRPCPP_LIBS"
 +  fi
 +  AC_LINK_IFELSE(
 +    [AC_LANG_PROGRAM(
 +      [[#include <grpc++/grpc++.h>]],
 +      [[grpc::ServerBuilder sb;]]
 +    )],
 +    [
 +      with_libgrpcpp="yes"
 +      if test "x$GRPCPP_LIBS" = "x"
 +      then
 +        GRPCPP_LIBS="-lgrpc++"
 +      fi
 +    ],
 +    [with_libgrpcpp="no (libgrpc++ not found)"]
 +  )
 +  CPPFLAGS="$SAVE_CPPFLAGS"
 +  LDFLAGS="$SAVE_LDFLAGS"
 +  LIBS="$SAVE_LIBS"
 +  AC_LANG_POP(C++)
 +fi
 +BUILD_WITH_LIBGRPCPP_CPPFLAGS="-std=c++11 $with_libgrpcpp_cppflags $GRPCPP_CFLAGS"
 +BUILD_WITH_LIBGRPCPP_LDFLAGS="$with_libgrpcpp_ldflags"
 +BUILD_WITH_LIBGRPCPP_LIBS="$GRPCPP_LIBS"
 +AC_SUBST([BUILD_WITH_LIBGRPCPP_CPPFLAGS])
 +AC_SUBST([BUILD_WITH_LIBGRPCPP_LDFLAGS])
 +AC_SUBST([BUILD_WITH_LIBGRPCPP_LIBS])
  # }}}
  
  # --with-libiptc {{{
@@@ -2465,6 -2326,11 +2465,6 @@@ AC_ARG_WITH(libiptc, [AS_HELP_STRING([-
        fi
  ])
  
 -if test "x$with_libiptc" = "xpkgconfig" && test "x$PKG_CONFIG" = "x"
 -then
 -      with_libiptc="no (Don't have pkg-config)"
 -fi
 -
  if test "x$with_libiptc" = "xpkgconfig"
  then
        $PKG_CONFIG --exists 'libiptc' 2>/dev/null
  AM_CONDITIONAL(BUILD_WITH_LIBLDAP, test "x$with_libldap" = "xyes")
  # }}}
  
 +# --with-liblua {{{
 +AC_ARG_VAR([LIBLUA_PKG_CONFIG_NAME], [Name of liblua used by pkg-config])
 +if test "x$LIBLUA_PKG_CONFIG_NAME" != "x"
 +then
 +  PKG_CHECK_MODULES([LUA], [$LIBLUA_PKG_CONFIG_NAME],
 +    [with_liblua="yes"],
 +    [with_liblua="no"]
 +  )
 +else
 +  PKG_CHECK_MODULES([LUA], [lua],
 +    [with_liblua="yes"],
 +    [
 +      PKG_CHECK_MODULES([LUA], [lua-5.3],
 +        [with_liblua="yes"],
 +        [
 +        PKG_CHECK_MODULES([LUA], [lua5.3],
 +            [with_liblua="yes"],
 +            [
 +              PKG_CHECK_MODULES([LUA], [lua-5.2],
 +                [with_liblua="yes"],
 +                [
 +                  PKG_CHECK_MODULES([LUA], [lua5.2],
 +                    [with_liblua="yes"],
 +                    [
 +                      PKG_CHECK_MODULES([LUA], [lua-5.1],
 +                        [with_liblua="yes"],
 +                        [
 +                          PKG_CHECK_MODULES([LUA], [lua5.1],
 +                            [with_liblua="yes"],
 +                            [with_liblua="no (pkg-config cannot find liblua)"]
 +                          )
 +                        ]
 +                      )
 +                    ]
 +                  )
 +                ]
 +              )
 +            ]
 +          )
 +        ]
 +      )
 +    ]
 +  )
 +fi
 +
 +if test "x$with_liblua" = "xyes"
 +then
 +  SAVE_CFLAGS="$CFLAGS"
 +  CFLAGS="$CFLAGS $LUA_CFLAGS"
 +
 +  AC_CHECK_HEADERS([lua.h lauxlib.h lualib.h],
 +    [with_liblua="yes"],
 +    [with_liblua="no (header not found)"]
 +  )
 +
 +  CFLAGS="$SAVE_CFLAGS"
 +fi
 +
 +if test "x$with_liblua" = "xyes"
 +then
 +  SAVE_LIBS="$LIBS"
 +  LIBS="$LIBS $LUA_LIBS"
 +
 +  AC_CHECK_FUNC([lua_settop],
 +    [with_liblua="yes"],
 +    [with_liblua="no (symbol 'lua_settop' not found)"]
 +  )
 +
 +  LIBS="$SAVE_LIBS"
 +fi
 +
 +if test "x$with_liblua" = "xyes"
 +then
 +    BUILD_WITH_LIBLUA_CFLAGS="$LUA_CFLAGS"
 +    BUILD_WITH_LIBLUA_LIBS="$LUA_LIBS"
 +fi
 +AC_SUBST(BUILD_WITH_LIBLUA_CFLAGS)
 +AC_SUBST(BUILD_WITH_LIBLUA_LIBS)
 +# }}}
 +
  # --with-liblvm2app {{{
  with_liblvm2app_cppflags=""
  with_liblvm2app_ldflags=""
@@@ -2982,6 -2768,13 +2982,6 @@@ AC_ARG_WITH(libmodbus, [AS_HELP_STRING(
  # configure using pkg-config
  if test "x$with_libmodbus" = "xuse_pkgconfig"
  then
 -      if test "x$PKG_CONFIG" = "x"
 -      then
 -              with_libmodbus="no (Don't have pkg-config)"
 -      fi
 -fi
 -if test "x$with_libmodbus" = "xuse_pkgconfig"
 -then
        AC_MSG_NOTICE([Checking for libmodbus using $PKG_CONFIG])
        $PKG_CONFIG --exists 'libmodbus' 2>/dev/null
        if test $? -ne 0
@@@ -3272,6 -3065,10 +3272,6 @@@ AC_ARG_WITH(libmnl, [AS_HELP_STRING([--
         with_libmnl="no (Linux only library)"
   fi
  ])
 -if test "x$PKG_CONFIG" = "x"
 -then
 -      with_libmnl="no (Don't have pkg-config)"
 -fi
  if test "x$with_libmnl" = "xyes"
  then
        if $PKG_CONFIG --exists libmnl 2>/dev/null; then
@@@ -3428,6 -3225,9 +3428,6 @@@ AM_CONDITIONAL(BUILD_WITH_LIBNETAPP, te
  # }}}
  
  # --with-libnetsnmp {{{
 -with_snmp_config="net-snmp-config"
 -with_snmp_cflags=""
 -with_snmp_libs=""
  AC_ARG_WITH(libnetsnmp, [AS_HELP_STRING([--with-libnetsnmp@<:@=PREFIX@:>@], [Path to the Net-SNMPD library.])],
  [
        if test "x$withval" = "xno"
        then
                with_libnetsnmp="yes"
        else
 -              if test -x "$withval"
 -              then
 -                      with_snmp_config="$withval"
 -                      with_libnetsnmp="yes"
 -              else
 -                      with_snmp_config="$withval/bin/net-snmp-config"
 -                      with_libnetsnmp="yes"
 -              fi
 +              with_libnetsnmp_cppflags="-I$withval/include"
 +              with_libnetsnmp_ldflags="-I$withval/lib"
 +              with_libnetsnmp="yes"
        fi; fi
  ],
  [with_libnetsnmp="yes"])
  if test "x$with_libnetsnmp" = "xyes"
  then
 -      with_snmp_cflags=`$with_snmp_config --cflags 2>/dev/null`
 -      snmp_config_status=$?
 -
 -      if test $snmp_config_status -ne 0
 -      then
 -              with_libnetsnmp="no ($with_snmp_config failed)"
 -      else
 -              SAVE_CPPFLAGS="$CPPFLAGS"
 -              CPPFLAGS="$CPPFLAGS $with_snmp_cflags"
 +      SAVE_CPPFLAGS="$CPPFLAGS"
 +      CPPFLAGS="$CPPFLAGS $with_libnetsnmp_cppflags"
  
 -              AC_CHECK_HEADERS(net-snmp/net-snmp-config.h, [], [with_libnetsnmp="no (net-snmp/net-snmp-config.h not found)"])
 +      AC_CHECK_HEADERS(net-snmp/net-snmp-config.h, [], [with_libnetsnmp="no (net-snmp/net-snmp-config.h not found)"])
  
 -              CPPFLAGS="$SAVE_CPPFLAGS"
 -      fi
 +      CPPFLAGS="$SAVE_CPPFLAGS"
  fi
  if test "x$with_libnetsnmp" = "xyes"
  then
 -      with_snmp_libs=`$with_snmp_config --libs 2>/dev/null`
 -      snmp_config_status=$?
 +      SAVE_LDFLAGS="$LDFLAGS"
 +      LDFLAGS="$LDFLAGS $with_libnetsnmp_ldflags"
  
 -      if test $snmp_config_status -ne 0
 -      then
 -              with_libnetsnmp="no ($with_snmp_config failed)"
 -      else
 -              AC_CHECK_LIB(netsnmp, init_snmp,
 +      AC_CHECK_LIB(netsnmp, init_snmp,
                [with_libnetsnmp="yes"],
                [with_libnetsnmp="no (libnetsnmp not found)"],
                [$with_snmp_libs])
 -      fi
 +
 +      LDFLAGS="$SAVE_LDFLAGS"
  fi
  if test "x$with_libnetsnmp" = "xyes"
  then
 -      BUILD_WITH_LIBSNMP_CFLAGS="$with_snmp_cflags"
 -      BUILD_WITH_LIBSNMP_LIBS="$with_snmp_libs"
 -      AC_SUBST(BUILD_WITH_LIBSNMP_CFLAGS)
 -      AC_SUBST(BUILD_WITH_LIBSNMP_LIBS)
 +      BUILD_WITH_LIBNETSNMP_CPPFLAGS="$with_libnetsnmp_cppflags"
 +      BUILD_WITH_LIBNETSNMP_LDFLAGS="$with_libnetsnmp_ldflags"
 +      BUILD_WITH_LIBNETSNMP_LIBS="-lnetsnmp"
  fi
 -AM_CONDITIONAL(BUILD_WITH_LIBNETSNMP, test "x$with_libnetsnmp" = "xyes")
 +AC_SUBST(BUILD_WITH_LIBNETSNMP_CPPFLAGS)
 +AC_SUBST(BUILD_WITH_LIBNETSNMP_LDFLAGS)
 +AC_SUBST(BUILD_WITH_LIBNETSNMP_LIBS)
  # }}}
  
  # --with-liboconfig {{{
@@@ -3505,7 -3320,7 +3505,7 @@@ save_LDFLAGS="$LDFLAGS
  save_CPPFLAGS="$CPPFLAGS"
  LDFLAGS="$liboconfig_LDFLAGS"
  CPPFLAGS="$liboconfig_CPPFLAGS"
 -AC_CHECK_LIB(oconfig, oconfig_parse_fh,
 +AC_CHECK_LIB(oconfig, oconfig_parse_file,
  [
        with_liboconfig="yes"
        with_own_liboconfig="no"
@@@ -3789,7 -3604,7 +3789,7 @@@ the
    SAVE_CFLAGS="$CFLAGS"
    SAVE_LIBS="$LIBS"
  dnl ARCHFLAGS="" -> disable multi -arch on OSX (see Config_heavy.pl:fetch_string)
 -  PERL_CFLAGS=`ARCHFLAGS="" $perl_interpreter -MExtUtils::Embed -e ccopts`
 +  PERL_CFLAGS=`ARCHFLAGS="" $perl_interpreter -MExtUtils::Embed -e perl_inc`
    PERL_LIBS=`ARCHFLAGS="" $perl_interpreter -MExtUtils::Embed -e ldopts`
    CFLAGS="$CFLAGS $PERL_CFLAGS"
    LIBS="$LIBS $PERL_LIBS"
  AM_CONDITIONAL(BUILD_WITH_LIBPQ, test "x$with_libpq" = "xyes")
  # }}}
  
 -# --with-python {{{
 -with_python_prog=""
 -with_python_path="$PATH"
 -AC_ARG_WITH(python, [AS_HELP_STRING([--with-python@<:@=PREFIX@:>@], [Path to the python interpreter.])],
 -[
 - if test "x$withval" = "xyes" || test "x$withval" = "xno"
 - then
 -       with_python="$withval"
 - else if test -x "$withval"
 - then
 -       with_python_prog="$withval"
 -       with_python_path="`dirname \"$withval\"`$PATH_SEPARATOR$with_python_path"
 -       with_python="yes"
 - else if test -d "$withval"
 - then
 -       with_python_path="$withval$PATH_SEPARATOR$with_python_path"
 -       with_python="yes"
 - else
 -       AC_MSG_WARN([Argument not recognized: $withval])
 - fi; fi; fi
 -], [with_python="yes"])
 -
 -SAVE_PATH="$PATH"
 -SAVE_CPPFLAGS="$CPPFLAGS"
 -SAVE_LDFLAGS="$LDFLAGS"
 -SAVE_LIBS="$LIBS"
 -
 -PATH="$with_python_path"
 -
 -if test "x$with_python" = "xyes" && test "x$with_python_prog" = "x"
 +# --with-libprotobuf {{{
 +with_libprotobuf_cppflags=""
 +with_libprotobuf_ldflags=""
 +AC_ARG_WITH([libprotobuf], [AS_HELP_STRING([--with-libprotobuf@<:@=PREFIX@:>@], [Path to libprotobuf.])],
 +  [
 +    if test "x$withval" != "xno" && test "x$withval" != "xyes"
 +    then
 +      with_libprotobuf_cppflags="-I$withval/include"
 +      with_libprotobuf_ldflags="-L$withval/lib"
 +      with_libprotobuf="yes"
 +    fi
 +    if test "x$withval" = "xno"
 +    then
 +      with_libprotobuf="no (disabled on command line)"
 +    fi
 +  ],
 +  [withval="yes"]
 +)
 +if test "x$withval" = "xyes"
  then
 -      AC_MSG_CHECKING([for python])
 -      with_python_prog="`which python 2>/dev/null`"
 -      if test "x$with_python_prog" = "x"
 -      then
 -              AC_MSG_RESULT([not found])
 -              with_python="no (interpreter not found)"
 -      else
 -              AC_MSG_RESULT([$with_python_prog])
 -      fi
 +PKG_CHECK_MODULES([PROTOBUF], [protobuf],
 +  [with_libprotobuf="yes"],
 +  [with_libprotobuf="no (pkg-config could not find libprotobuf)"]
 +)
  fi
  
 -if test "x$with_python" = "xyes"
 +if test "x$withval" != "xno"
  then
 -      AC_MSG_CHECKING([for Python CPPFLAGS])
 -      python_include_path=`echo "import distutils.sysconfig;import sys;sys.stdout.write(distutils.sysconfig.get_python_inc())" | "$with_python_prog" 2>&1`
 -      python_config_status=$?
 -
 -      if test "$python_config_status" -ne 0 || test "x$python_include_path" = "x"
 -      then
 -              AC_MSG_RESULT([failed with status $python_config_status (output: $python_include_path)])
 -              with_python="no"
 -      else
 -              AC_MSG_RESULT([$python_include_path])
 -      fi
 +  SAVE_LDFLAGS="$LDFLAGS"
 +  SAVE_LIBS="$LIBS"
 +  LDFLAGS="$with_libprotobuf_ldflags"
 +  LIBS="$PROTOBUF_LIBS $LIBS"
 +  AC_LANG_PUSH([C++])
 +  AC_CHECK_LIB([protobuf], [main],
 +    [
 +      SAVE_CPPFLAGS="$CPPFLAGS"
 +      CPPFLAGS="$with_libprotobuf_cppflags $PROTOBUF_CFLAGS"
 +      if test "x$PROTOBUF_LIBS" = "x"
 +      then
 +        PROTOBUF_LIBS="-lprotobuf"
 +      fi
 +      AC_CHECK_HEADERS([google/protobuf/util/time_util.h],
 +        [with_libprotobuf="yes"],
 +        [with_libprotobuf="no (<google/protobuf/util/time_util.h> not found)"]
 +      )
 +      CPPFLAGS="$SAVE_CPPFLAGS"
 +    ],
 +    [with_libprotobuf="no (libprotobuf not found)"]
 +  )
 +  AC_LANG_POP([C++])
 +  LDFLAGS="$SAVE_LDFLAGS"
 +  LIBS="$SAVE_LIBS"
  fi
 +BUILD_WITH_LIBPROTOBUF_CPPFLAGS="$with_libprotobuf_cppflags $PROTOBUF_CFLAGS"
 +BUILD_WITH_LIBPROTOBUF_LDFLAGS="$with_libprotobuf_ldflags"
 +BUILD_WITH_LIBPROTOBUF_LIBS="$PROTOBUF_LIBS"
 +AC_SUBST([BUILD_WITH_LIBPROTOBUF_CPPFLAGS])
 +AC_SUBST([BUILD_WITH_LIBPROTOBUF_LDFLAGS])
 +AC_SUBST([BUILD_WITH_LIBPROTOBUF_LIBS])
 +# }}}
  
 -if test "x$with_python" = "xyes"
 +# --with-libprotobuf-c {{{
 +with_libprotobuf_c_cppflags=""
 +with_libprotobuf_c_ldflags=""
 +AC_ARG_WITH([libprotobuf-c], [AS_HELP_STRING([--with-libprotobuf-c@<:@=PREFIX@:>@], [Path to libprotobuf-c.])],
 +  [
 +    if test "x$withval" != "xno" && test "x$withval" != "xyes"
 +    then
 +      with_libprotobuf_c_cppflags="-I$withval/include"
 +      with_libprotobuf_c_ldflags="-L$withval/lib"
 +      with_libprotobuf_c="yes"
 +    fi
 +    if test "x$withval" = "xno"
 +    then
 +      with_libprotobuf_c="no (disabled on command line)"
 +    fi
 +  ],
 +  [withval="yes"]
 +)
 +if test "x$withval" = "xyes"
  then
 -      CPPFLAGS="-I$python_include_path $CPPFLAGS"
 -      AC_CHECK_HEADERS(Python.h,
 -                       [with_python="yes"],
 -                       [with_python="no ('Python.h' not found)"])
 +PKG_CHECK_MODULES([PROTOBUF_C], [libprotobuf-c],
 +  [with_libprotobuf_c="yes"],
 +  [with_libprotobuf_c="no (pkg-config could not find libprotobuf-c)"]
 +)
  fi
  
 -if test "x$with_python" = "xyes"
 +if test "x$withval" != "xno"
  then
 -      AC_MSG_CHECKING([for Python LDFLAGS])
 -      python_library_path=`echo "import distutils.sysconfig;import sys;sys.stdout.write(distutils.sysconfig.get_config_vars(\"LIBDIR\").__getitem__(0))" | "$with_python_prog" 2>&1`
 -      python_config_status=$?
 -
 -      if test "$python_config_status" -ne 0 || test "x$python_library_path" = "x"
 -      then
 -              AC_MSG_RESULT([failed with status $python_config_status (output: $python_library_path)])
 -              with_python="no"
 -      else
 -              AC_MSG_RESULT([$python_library_path])
 -      fi
 +  SAVE_LDFLAGS="$LDFLAGS"
 +  SAVE_LIBS="$LIBS"
 +  LDFLAGS="$with_libprotobuf_c_ldflags"
 +  LIBS="$PROTOBUF_C_LIBS $LIBS"
 +  AC_CHECK_LIB([protobuf-c], [protobuf_c_message_pack],
 +    [
 +      SAVE_CPPFLAGS="$CPPFLAGS"
 +      CPPFLAGS="$with_libprotobuf_c_cppflags $PROTOBUF_C_CFLAGS"
 +      if test "x$PROTOBUF_C_LIBS" = "x"
 +      then
 +        PROTOBUF_C_LIBS="-lprotobuf-c"
 +      fi
 +      AC_CHECK_HEADERS([protobuf-c/protobuf-c.h google/protobuf-c/protobuf-c.h],
 +        [
 +          with_libprotobuf_c="yes"
 +          break
 +        ],
 +        [with_libprotobuf_c="no (<protobuf-c.h> not found)"]
 +      )
 +      CPPFLAGS="$SAVE_CPPFLAGS"
 +    ],
 +    [with_libprotobuf_c="no (libprotobuf-c not found)"]
 +  )
 +  LDFLAGS="$SAVE_LDFLAGS"
 +  LIBS="$SAVE_LIBS"
  fi
 +BUILD_WITH_LIBPROTOBUF_C_CPPFLAGS="$with_libprotobuf_c_cppflags $PROTOBUF_C_CFLAGS"
 +BUILD_WITH_LIBPROTOBUF_C_LDFLAGS="$with_libprotobuf_c_ldflags"
 +BUILD_WITH_LIBPROTOBUF_C_LIBS="$PROTOBUF_C_LIBS"
 +AC_SUBST([BUILD_WITH_LIBPROTOBUF_C_CPPFLAGS])
 +AC_SUBST([BUILD_WITH_LIBPROTOBUF_C_LDFLAGS])
 +AC_SUBST([BUILD_WITH_LIBPROTOBUF_C_LIBS])
 +# }}}
  
 -if test "x$with_python" = "xyes"
 -then
 -      AC_MSG_CHECKING([for Python LIBS])
 -      python_library_flags=`echo "import distutils.sysconfig;import sys;sys.stdout.write(distutils.sysconfig.get_config_vars(\"BLDLIBRARY\").__getitem__(0))" | "$with_python_prog" 2>&1`
 -      python_config_status=$?
 +# --with-libpython {{{
 +AC_ARG_VAR([LIBPYTHON_CPPFLAGS], [Preprocessor flags for libpython])
 +AC_ARG_VAR([LIBPYTHON_LDFLAGS], [Linker flags for libpython])
 +AC_ARG_VAR([LIBPYTHON_LIBS], [Libraries for libpython])
  
 -      if test "$python_config_status" -ne 0 || test "x$python_library_flags" = "x"
 -      then
 -              AC_MSG_RESULT([failed with status $python_config_status (output: $python_library_flags)])
 -              with_python="no"
 -      else
 -              AC_MSG_RESULT([$python_library_flags])
 -      fi
 +AC_ARG_WITH([libpython],
 +  [AS_HELP_STRING([--with-libpython],
 +    [if we should build with libpython @<:@default=yes@:>@])
 +  ],
 +  [with_libpython="$withval"],
 +  [with_libpython="check"]
 +)
 +if test "$with_libpython" != "no"; then
 +  if test "$LIBPYTHON_CPPFLAGS" = "" && test "$LIBPYTHON_LDFLAGS" = ""; then
 +    AC_ARG_VAR([PYTHON_CONFIG], [path to python-config])
 +    AC_PATH_PROGS([PYTHON_CONFIG],
 +      [python3-config python2-config python-config]
 +    )
 +    if test "$PYTHON_CONFIG" = ""; then
 +      if test "$with_libpython" = "yes"; then
 +        AC_MSG_ERROR([Unable to find python-config])
 +      fi
 +      with_libpython="no"
 +    fi
 +  fi
  fi
  
 -if test "x$with_python" = "xyes"
 -then
 -      LDFLAGS="-L$python_library_path $LDFLAGS"
 -      LIBS="$python_library_flags $LIBS"
 -
 -      AC_CHECK_FUNC(PyObject_CallFunction,
 -                    [with_python="yes"],
 -                    [with_python="no (Symbol 'PyObject_CallFunction' not found)"])
 +if test "$PYTHON_CONFIG" != ""; then
 +  LIBPYTHON_CPPFLAGS="`${PYTHON_CONFIG} --includes`"
 +  if test $? -ne 0; then
 +    with_libpython="no"
 +  fi
 +  LIBPYTHON_LDFLAGS="`${PYTHON_CONFIG} --ldflags`"
 +  if test $? -ne 0; then
 +    with_libpython="no"
 +  fi
 +  LIBPYTHON_LIBS="`${PYTHON_CONFIG} --libs`"
 +  if test $? -ne 0; then
 +    with_libpython="no"
 +  fi
  fi
  
 -PATH="$SAVE_PATH"
 -CPPFLAGS="$SAVE_CPPFLAGS"
 -LDFLAGS="$SAVE_LDFLAGS"
 -LIBS="$SAVE_LIBS"
 -
 -if test "x$with_python" = "xyes"
 -then
 -      BUILD_WITH_PYTHON_CPPFLAGS="-I$python_include_path"
 -      BUILD_WITH_PYTHON_LDFLAGS="-L$python_library_path"
 -      BUILD_WITH_PYTHON_LIBS="$python_library_flags"
 -      AC_SUBST(BUILD_WITH_PYTHON_CPPFLAGS)
 -      AC_SUBST(BUILD_WITH_PYTHON_LDFLAGS)
 -      AC_SUBST(BUILD_WITH_PYTHON_LIBS)
 +if test "$with_libpython" != "xno"; then
 +  SAVE_CPPFLAGS="$CPPFLAGS"
 +  SAVE_LDFLAGS="$LDFLAGS"
 +  SAVE_LIBS="$LIBS"
 +  CPPFLAGS="$LIBPYTHON_CPPFLAGS $CPPFLAGS"
 +  LDFLAGS="$LIBPYTHON_LDFLAGS $LDFLAGS"
 +  LIBS="$LIBPYTHON_LIBS $LIBS"
 +  AC_CHECK_HEADERS([Python.h],
 +    [
 +      AC_MSG_CHECKING([for libpython])
 +      AC_LINK_IFELSE([AC_LANG_PROGRAM(
 +          [[#include <Python.h>]],
 +          [[Py_Initialize();]])
 +        ],
 +        [with_libpython="yes"],
 +        [with_libpython="no"]
 +      )
 +      AC_MSG_RESULT([$with_libpython])
 +    ],
 +    [with_libpython="no"]
 +  )
 +  CPPFLAGS="$SAVE_CPPFLAGS"
 +  LDFLAGS="$SAVE_LDFLAGS"
 +  LIBS="$SAVE_LIBS"
  fi
 -# }}} --with-python
 +# }}} --with-libpython
  
  # --with-librabbitmq {{{
  with_librabbitmq_cppflags=""
  AM_CONDITIONAL(BUILD_WITH_LM_SENSORS, test "x$with_libsensors" = "xyes")
  # }}}
  
 -# --with-libsigrok {{{
 -with_libsigrok_cflags=""
 -with_libsigrok_ldflags=""
 -AC_ARG_WITH(libsigrok, [AS_HELP_STRING([--with-libsigrok@<:@=PREFIX@:>@], [Path to libsigrok.])],
 -[
 -      if test "x$withval" = "xno"
 -      then
 -              with_libsigrok="no"
 -      else
 -              with_libsigrok="yes"
 -              if test "x$withval" != "xyes"
 -              then
 -                      with_libsigrok_cflags="-I$withval/include"
 -                      with_libsigrok_ldflags="-L$withval/lib"
 -              fi
 -      fi
 -],[with_libsigrok="yes"])
 -
 -# libsigrok has a glib dependency
 -if test "x$with_libsigrok" = "xyes"
 -then
 -m4_ifdef([AM_PATH_GLIB_2_0],
 -      [
 -       AM_PATH_GLIB_2_0([2.28.0],
 -              [with_libsigrok_cflags="$with_libsigrok_cflags $GLIB_CFLAGS"; with_libsigrok_ldflags="$with_libsigrok_ldflags $GLIB_LIBS"])
 -      ],
 -      [
 -       with_libsigrok="no (glib not available)"
 -      ]
 +# libsigrok {{{
 +AC_SUBST([LIBSIGROK_CFLAGS])
 +AC_SUBST([LIBSIGROK_LIBS])
 +PKG_CHECK_MODULES([LIBSIGROK], [libsigrok < 0.4],
 +  [with_libsigrok="yes"],
 +  [with_libsigrok="no (pkg-config could not find libsigrok)"]
  )
 -fi
 -
 -# libsigrok headers
 -if test "x$with_libsigrok" = "xyes"
 -then
 -      SAVE_CPPFLAGS="$CPPFLAGS"
 -      CPPFLAGS="$CPPFLAGS $with_libsigrok_cflags"
 -
 -      AC_CHECK_HEADERS(libsigrok/libsigrok.h, [], [with_libsigrok="no (libsigrok/libsigrok.h not found)"])
 -
 -      CPPFLAGS="$SAVE_CPPFLAGS"
 -fi
 -
 -# libsigrok library
 -if test "x$with_libsigrok" = "xyes"
 -then
 -      SAVE_CPPFLAGS="$CPPFLAGS"
 -      SAVE_LDFLAGS="$LDFLAGS"
 -      CPPFLAGS="$CPPFLAGS $with_libsigrok_cflags"
 -      LDFLAGS="$LDFLAGS $with_libsigrok_ldflags"
 -
 -      AC_CHECK_LIB(sigrok, sr_init,
 -      [
 -              AC_DEFINE(HAVE_LIBSIGROK, 1, [Define to 1 if you have the sigrok library (-lsigrok).])
 -      ],
 -      [with_libsigrok="no (libsigrok not found)"])
 -
 -      CPPFLAGS="$SAVE_CPPFLAGS"
 -      LDFLAGS="$SAVE_LDFLAGS"
 -fi
 -if test "x$with_libsigrok" = "xyes"
 -then
 -      BUILD_WITH_LIBSIGROK_CFLAGS="$with_libsigrok_cflags"
 -      BUILD_WITH_LIBSIGROK_LDFLAGS="$with_libsigrok_ldflags"
 -      AC_SUBST(BUILD_WITH_LIBSIGROK_CFLAGS)
 -      AC_SUBST(BUILD_WITH_LIBSIGROK_LDFLAGS)
 -fi
 -AM_CONDITIONAL(BUILD_WITH_LIBSIGROK, test "x$with_libsigrok" = "xyes")
  # }}}
  
  # --with-libstatgrab {{{
@@@ -4630,16 -4435,23 +4630,16 @@@ AC_ARG_WITH(libstatgrab, [AS_HELP_STRIN
  if test "x$with_libstatgrab" = "xyes" \
    && test "x$with_libstatgrab_pkg_config" = "xyes"
  then
 -  if test "x$PKG_CONFIG" != "x"
 +  AC_MSG_CHECKING([pkg-config for libstatgrab])
 +  temp_result="found"
 +  $PKG_CONFIG --exists libstatgrab 2>/dev/null
 +  if test "$?" != "0"
    then
 -    AC_MSG_CHECKING([pkg-config for libstatgrab])
 -    temp_result="found"
 -    $PKG_CONFIG --exists libstatgrab 2>/dev/null
 -    if test "$?" != "0"
 -    then
 -      with_libstatgrab_pkg_config="no"
 -      with_libstatgrab="no (pkg-config doesn't know libstatgrab)"
 -      temp_result="not found"
 -    fi
 -    AC_MSG_RESULT([$temp_result])
 -  else
 -    AC_MSG_NOTICE([pkg-config not available, trying to guess flags for the statgrab library.])
      with_libstatgrab_pkg_config="no"
 -    with_libstatgrab_ldflags="$with_libstatgrab_ldflags -lstatgrab"
 +    with_libstatgrab="no (pkg-config doesn't know libstatgrab)"
 +    temp_result="not found"
    fi
 +  AC_MSG_RESULT([$temp_result])
  fi
  
  if test "x$with_libstatgrab" = "xyes" \
  # configure using pkg-config
  if test "x$with_libupsclient" = "xuse_pkgconfig"
  then
 -      if test "x$PKG_CONFIG" = "x"
 -      then
 -              with_libupsclient="no (Don't have pkg-config)"
 -      fi
 -fi
 -if test "x$with_libupsclient" = "xuse_pkgconfig"
 -then
        AC_MSG_NOTICE([Checking for libupsclient using $PKG_CONFIG])
        $PKG_CONFIG --exists 'libupsclient' 2>/dev/null
        if test $? -ne 0
@@@ -5259,6 -5078,13 +5259,6 @@@ AC_ARG_WITH(libvarnish, [AS_HELP_STRING
  # configure using pkg-config
  if test "x$with_libvarnish" = "xuse_pkgconfig"
  then
 -      if test "x$PKG_CONFIG" = "x"
 -      then
 -              with_libvarnish="no (Don't have pkg-config)"
 -      fi
 -fi
 -if test "x$with_libvarnish" = "xuse_pkgconfig"
 -then
        AC_MSG_NOTICE([Checking for varnishapi using $PKG_CONFIG])
        $PKG_CONFIG --exists 'varnishapi' 2>/dev/null
        if test $? -ne 0
@@@ -5318,20 -5144,23 +5318,20 @@@ with_libxml2_ldflags="
  with_libvirt="no (pkg-config isn't available)"
  with_libvirt_cflags=""
  with_libvirt_ldflags=""
 -if test "x$PKG_CONFIG" != "x"
 +$PKG_CONFIG --exists 'libxml-2.0' 2>/dev/null
 +if test "$?" = "0"
  then
 -      $PKG_CONFIG --exists 'libxml-2.0' 2>/dev/null
 -      if test "$?" = "0"
 -      then
 -              with_libxml2="yes"
 -      else
 -              with_libxml2="no (pkg-config doesn't know libxml-2.0)"
 -      fi
 +      with_libxml2="yes"
 +else
 +      with_libxml2="no (pkg-config doesn't know libxml-2.0)"
 +fi
  
 -      $PKG_CONFIG --exists libvirt 2>/dev/null
 -      if test "$?" = "0"
 -      then
 -              with_libvirt="yes"
 -      else
 -              with_libvirt="no (pkg-config doesn't know libvirt)"
 -      fi
 +$PKG_CONFIG --exists libvirt 2>/dev/null
 +if test "$?" = "0"
 +then
 +      with_libvirt="yes"
 +else
 +      with_libvirt="no (pkg-config doesn't know libvirt)"
  fi
  if test "x$with_libxml2" = "xyes"
  then
@@@ -5430,6 -5259,17 +5430,6 @@@ with_libopenipmipthread="yes
  with_libopenipmipthread_cflags=""
  with_libopenipmipthread_libs=""
  
 -AC_MSG_CHECKING([for pkg-config])
 -temp_result="no"
 -if test "x$PKG_CONFIG" = "x"
 -then
 -      with_libopenipmipthread="no"
 -      temp_result="no"
 -else
 -      temp_result="$PKG_CONFIG"
 -fi
 -AC_MSG_RESULT([$temp_result])
 -
  if test "x$with_libopenipmipthread" = "xyes"
  then
        AC_MSG_CHECKING([for libOpenIPMIpthread])
@@@ -5556,7 -5396,7 +5556,7 @@@ PKG_CHECK_MODULES([LIBNOTIFY], [libnoti
                [with_libnotify="no (pkg-config doesn't know libnotify)"]
  )
  
 -PKG_CHECK_MODULES([LIBRIEMANN_CLIENT], [riemann-client >= 1.8.0],
 +PKG_CHECK_MODULES([LIBRIEMANN_CLIENT], [riemann-client >= 1.6.0],
   [with_libriemann_client="yes"],
   [with_libriemann_client="no (pkg-config doesn't know libriemann-client)"])
  
@@@ -5697,7 -5537,6 +5697,7 @@@ plugin_conntrack="no
  plugin_contextswitch="no"
  plugin_cpu="no"
  plugin_cpufreq="no"
 +plugin_cpusleep="no"
  plugin_curl_json="no"
  plugin_curl_xml="no"
  plugin_df="no"
@@@ -5707,8 -5546,7 +5707,9 @@@ plugin_entropy="no
  plugin_ethstat="no"
  plugin_fhcount="no"
  plugin_fscache="no"
 +plugin_gps="no"
 +plugin_grpc="no"
+ plugin_hugepages="no"
  plugin_interface="no"
  plugin_ipmi="no"
  plugin_ipvs="no"
@@@ -5720,10 -5558,8 +5721,10 @@@ plugin_multimeter="no
  plugin_nfs="no"
  plugin_numa="no"
  plugin_perl="no"
 +plugin_pinba="no"
  plugin_processes="no"
  plugin_protocols="no"
 +plugin_python="no"
  plugin_serial="no"
  plugin_smart="no"
  plugin_swap="no"
@@@ -5757,6 -5593,7 +5758,7 @@@ the
        plugin_entropy="yes"
        plugin_fhcount="yes"
        plugin_fscache="yes"
+       plugin_hugepages="yes"
        plugin_interface="yes"
        plugin_ipc="yes"
        plugin_irq="yes"
        then
                plugin_turbostat="yes"
        fi
 +      
 +      if test "x$c_cv_have_clock_boottime_monotonic" = "xyes"
 +      then
 +              plugin_cpusleep="yes"
 +      fi
  fi
  
  if test "x$ac_system" = "xOpenBSD"
        plugin_ethstat="yes"
  fi
  
 +if test "x$with_libgrpcpp" = "xyes" && test "x$with_libprotobuf" = "xyes" && test "x$have_protoc3" = "xyes" && test "x$GRPC_CPP_PLUGIN" != "x"
 +then
 +      plugin_grpc="yes"
 +fi
 +
  if test "x$have_getifaddrs" = "xyes"
  then
        plugin_interface="yes"
  fi
  
 +if test "x$with_libgps" = "xyes"
 +then
 +      plugin_gps="yes"
 +fi
 +
  if test "x$have_getloadavg" = "xyes"
  then
        plugin_load="yes"
        plugin_perl="yes"
  fi
  
 +if test "x$have_protoc_c" = "xyes" && test "x$with_libprotobuf_c" = "xyes"
 +then
 +      plugin_pinba="yes"
 +fi
 +
  # Mac OS X memory interface
  if test "x$have_host_statistics" = "xyes"
  then
        plugin_processes="yes"
  fi
  
 +if test "x$with_libpython" != "xno"
 +then
 +      plugin_python="yes"
 +fi
 +
  if test "x$with_libatasmart" = "xyes" && test "x$with_libudev" = "xyes"
  then
        plugin_smart="yes"
@@@ -6142,7 -5954,6 +6144,7 @@@ AC_PLUGIN([conntrack],           [$plug
  AC_PLUGIN([contextswitch],       [$plugin_contextswitch],   [context switch statistics])
  AC_PLUGIN([cpu],                 [$plugin_cpu],             [CPU usage statistics])
  AC_PLUGIN([cpufreq],             [$plugin_cpufreq],         [CPU frequency statistics])
 +AC_PLUGIN([cpusleep],            [$plugin_cpusleep],        [CPU sleep statistics])
  AC_PLUGIN([csv],                 [yes],                     [CSV output plugin])
  AC_PLUGIN([curl],                [$with_libcurl],           [CURL generic web statistics])
  AC_PLUGIN([curl_json],           [$plugin_curl_json],       [CouchDB statistics])
@@@ -6160,9 -5971,9 +6162,10 @@@ AC_PLUGIN([fhcount],             [$plug
  AC_PLUGIN([filecount],           [yes],                     [Count files in directories])
  AC_PLUGIN([fscache],             [$plugin_fscache],         [fscache statistics])
  AC_PLUGIN([gmond],               [$with_libganglia],        [Ganglia plugin])
 -AC_PLUGIN([grpc],                [$with_grpc],              [gRPC plugin])
 +AC_PLUGIN([gps],                 [$plugin_gps],             [GPS plugin])
 +AC_PLUGIN([grpc],                [$plugin_grpc],            [gRPC plugin])
  AC_PLUGIN([hddtemp],             [yes],                     [Query hddtempd])
+ AC_PLUGIN([hugepages],           [$plugin_hugepages],       [Hugepages statistics])
  AC_PLUGIN([interface],           [$plugin_interface],       [Interface traffic statistics])
  AC_PLUGIN([ipc],                 [$plugin_ipc],             [IPC statistics])
  AC_PLUGIN([ipmi],                [$plugin_ipmi],            [IPMI sensor statistics])
@@@ -6174,7 -5985,6 +6177,7 @@@ AC_PLUGIN([load],                [$plug
  AC_PLUGIN([log_logstash],        [$plugin_log_logstash],    [Logstash json_event compatible logging])
  AC_PLUGIN([logfile],             [yes],                     [File logging plugin])
  AC_PLUGIN([lpar],                [$with_perfstat],          [AIX logical partitions statistics])
 +AC_PLUGIN([lua],                 [$with_liblua],            [Lua plugin])
  AC_PLUGIN([lvm],                 [$with_liblvm2app],        [LVM statistics])
  AC_PLUGIN([madwifi],             [$have_linux_wireless_h],  [Madwifi wireless statistics])
  AC_PLUGIN([match_empty_counter], [yes],                     [The empty counter match])
@@@ -6211,13 -6021,13 +6214,13 @@@ AC_PLUGIN([oracle],              [$with
  AC_PLUGIN([perl],                [$plugin_perl],            [Embed a Perl interpreter])
  AC_PLUGIN([pf],                  [$have_net_pfvar_h],       [BSD packet filter (PF) statistics])
  # FIXME: Check for libevent, too.
 -AC_PLUGIN([pinba],               [$have_protoc_c],          [Pinba statistics])
 +AC_PLUGIN([pinba],               [$plugin_pinba],           [Pinba statistics])
  AC_PLUGIN([ping],                [$with_liboping],          [Network latency statistics])
  AC_PLUGIN([postgresql],          [$with_libpq],             [PostgreSQL database statistics])
  AC_PLUGIN([powerdns],            [yes],                     [PowerDNS statistics])
  AC_PLUGIN([processes],           [$plugin_processes],       [Process statistics])
  AC_PLUGIN([protocols],           [$plugin_protocols],       [Protocol (IP, TCP, ...) statistics])
 -AC_PLUGIN([python],              [$with_python],            [Embed a Python interpreter])
 +AC_PLUGIN([python],              [$plugin_python],          [Embed a Python interpreter])
  AC_PLUGIN([redis],               [$with_libhiredis],        [Redis plugin])
  AC_PLUGIN([routeros],            [$with_librouteros],       [RouterOS plugin])
  AC_PLUGIN([rrdcached],           [$librrd_rrdc_update],     [RRDTool output plugin])
@@@ -6393,18 -6203,6 +6396,18 @@@ AC_ARG_WITH(perl-bindings, [AS_HELP_STR
                with_perl_bindings="no (no perl interpreter found)"
        fi
  ])
 +
 +if test "x$with_perl_bindings" = "xyes"
 +then
 +      AC_MSG_CHECKING([for the ExtUtils::MakeMaker module])
 +      if $PERL -MExtUtils::MakeMaker -e '' 2>/dev/null; then
 +              AC_MSG_RESULT([yes])
 +      else
 +              AC_MSG_RESULT([no])
 +              with_perl_bindings="no (ExtUtils::MakeMaker not found)"
 +      fi
 +fi
 +
  if test "x$with_perl_bindings" = "xyes"
  then
        PERL_BINDINGS="perl"
@@@ -6493,8 -6291,7 +6496,8 @@@ AC_MSG_RESULT([    libdbi  . . . . . . 
  AC_MSG_RESULT([    libesmtp  . . . . . . $with_libesmtp])
  AC_MSG_RESULT([    libganglia  . . . . . $with_libganglia])
  AC_MSG_RESULT([    libgcrypt . . . . . . $with_libgcrypt])
 -AC_MSG_RESULT([    libgrpc . . . . . . . $with_libgrpc])
 +AC_MSG_RESULT([    libgps  . . . . . . . $with_libgps])
 +AC_MSG_RESULT([    libgrpc++ . . . . . . $with_libgrpcpp])
  AC_MSG_RESULT([    libhal  . . . . . . . $with_libhal])
  AC_MSG_RESULT([    libhiredis  . . . . . $with_libhiredis])
  AC_MSG_RESULT([    libi2c-dev  . . . . . $with_libi2c])
@@@ -6504,7 -6301,6 +6507,7 @@@ AC_MSG_RESULT([    libjvm  . . . . . . 
  AC_MSG_RESULT([    libkstat  . . . . . . $with_kstat])
  AC_MSG_RESULT([    libkvm  . . . . . . . $with_libkvm])
  AC_MSG_RESULT([    libldap . . . . . . . $with_libldap])
 +AC_MSG_RESULT([    liblua  . . . . . . . $with_liblua])
  AC_MSG_RESULT([    liblvm2app  . . . . . $with_liblvm2app])
  AC_MSG_RESULT([    libmemcached  . . . . $with_libmemcached])
  AC_MSG_RESULT([    libmnl  . . . . . . . $with_libmnl])
@@@ -6523,9 -6319,6 +6526,9 @@@ AC_MSG_RESULT([    libpcap . . . . . . 
  AC_MSG_RESULT([    libperfstat . . . . . $with_perfstat])
  AC_MSG_RESULT([    libperl . . . . . . . $with_libperl])
  AC_MSG_RESULT([    libpq . . . . . . . . $with_libpq])
 +AC_MSG_RESULT([    libprotobuf . . . . . $with_libprotobuf])
 +AC_MSG_RESULT([    libprotobuf-c . . . . $with_libprotobuf_c])
 +AC_MSG_RESULT([    libpython . . . . . . $with_libpython])
  AC_MSG_RESULT([    librabbitmq . . . . . $with_librabbitmq])
  AC_MSG_RESULT([    libriemann-client . . $with_libriemann_client])
  AC_MSG_RESULT([    librdkafka  . . . . . $with_librdkafka])
@@@ -6545,7 -6338,8 +6548,7 @@@ AC_MSG_RESULT([    libxmms . . . . . . 
  AC_MSG_RESULT([    libyajl . . . . . . . $with_libyajl])
  AC_MSG_RESULT([    oracle  . . . . . . . $with_oracle])
  AC_MSG_RESULT([    protobuf-c  . . . . . $have_protoc_c])
 -AC_MSG_RESULT([    protoc 3  . . . . . . $protoc3])
 -AC_MSG_RESULT([    python  . . . . . . . $with_python])
 +AC_MSG_RESULT([    protoc 3  . . . . . . $have_protoc3])
  AC_MSG_RESULT()
  AC_MSG_RESULT([  Features:])
  AC_MSG_RESULT([    daemon mode . . . . . $enable_daemon])
@@@ -6572,7 -6366,6 +6575,7 @@@ AC_MSG_RESULT([    conntrack . . . . . 
  AC_MSG_RESULT([    contextswitch . . . . $enable_contextswitch])
  AC_MSG_RESULT([    cpu . . . . . . . . . $enable_cpu])
  AC_MSG_RESULT([    cpufreq . . . . . . . $enable_cpufreq])
 +AC_MSG_RESULT([    cpusleep  . . . . . . $enable_cpusleep])
  AC_MSG_RESULT([    csv . . . . . . . . . $enable_csv])
  AC_MSG_RESULT([    curl  . . . . . . . . $enable_curl])
  AC_MSG_RESULT([    curl_json . . . . . . $enable_curl_json])
@@@ -6590,9 -6383,9 +6593,10 @@@ AC_MSG_RESULT([    fhcount . . . . . . 
  AC_MSG_RESULT([    filecount . . . . . . $enable_filecount])
  AC_MSG_RESULT([    fscache . . . . . . . $enable_fscache])
  AC_MSG_RESULT([    gmond . . . . . . . . $enable_gmond])
 +AC_MSG_RESULT([    gps . . . . . . . . . $enable_gps])
  AC_MSG_RESULT([    grpc  . . . . . . . . $enable_grpc])
  AC_MSG_RESULT([    hddtemp . . . . . . . $enable_hddtemp])
+ AC_MSG_RESULT([    hugepages . . . . . . $enable_hugepages])
  AC_MSG_RESULT([    interface . . . . . . $enable_interface])
  AC_MSG_RESULT([    ipc . . . . . . . . . $enable_ipc])
  AC_MSG_RESULT([    ipmi  . . . . . . . . $enable_ipmi])
@@@ -6604,7 -6397,6 +6608,7 @@@ AC_MSG_RESULT([    load  . . . . . . . 
  AC_MSG_RESULT([    logfile . . . . . . . $enable_logfile])
  AC_MSG_RESULT([    log_logstash  . . . . $enable_log_logstash])
  AC_MSG_RESULT([    lpar  . . . . . . . . $enable_lpar])
 +AC_MSG_RESULT([    lua . . . . . . . . . $enable_lua])
  AC_MSG_RESULT([    lvm . . . . . . . . . $enable_lvm])
  AC_MSG_RESULT([    madwifi . . . . . . . $enable_madwifi])
  AC_MSG_RESULT([    match_empty_counter . $enable_match_empty_counter])
diff --combined src/Makefile.am
@@@ -27,21 -27,6 +27,21 @@@ noinst_LTLIBRARIES 
  check_PROGRAMS =
  TESTS =
  
 +noinst_LTLIBRARIES += libformat_json.la
 +libformat_json_la_SOURCES   = utils_format_json.c utils_format_json.h
 +libformat_json_la_CPPFLAGS  = $(AM_CPPFLAGS)
 +libformat_json_la_LDFLAGS   = $(AM_LDFLAGS)
 +libformat_json_la_LIBADD    =
 +if BUILD_WITH_LIBYAJL
 +libformat_json_la_CPPFLAGS += $(BUILD_WITH_LIBYAJL_CPPFLAGS)
 +libformat_json_la_LDFLAGS  += $(BUILD_WITH_LIBYAJL_LDFLAGS)
 +libformat_json_la_LIBADD   += $(BUILD_WITH_LIBYAJL_LIBS)
 +check_PROGRAMS += test_format_json
 +TESTS += test_format_json
 +test_format_json_SOURCES = utils_format_json_test.c testing.h
 +test_format_json_LDADD = libformat_json.la daemon/libmetadata.la daemon/libplugin_mock.la -lm
 +endif
 +
  noinst_LTLIBRARIES += liblatency.la
  liblatency_la_SOURCES = utils_latency.c utils_latency.h
  check_PROGRAMS += test_utils_latency
@@@ -156,10 -141,11 +156,10 @@@ pkglib_LTLIBRARIES += amqp.l
  amqp_la_SOURCES = amqp.c \
                  utils_cmd_putval.c utils_cmd_putval.h \
                  utils_parse_option.c utils_parse_option.h \
 -                utils_format_graphite.c utils_format_graphite.h \
 -                utils_format_json.c utils_format_json.h
 +                utils_format_graphite.c utils_format_graphite.h
  amqp_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBRABBITMQ_LDFLAGS)
  amqp_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBRABBITMQ_CPPFLAGS)
 -amqp_la_LIBADD = $(BUILD_WITH_LIBRABBITMQ_LIBS)
 +amqp_la_LIBADD = $(BUILD_WITH_LIBRABBITMQ_LIBS) libformat_json.la
  endif
  
  if BUILD_PLUGIN_APACHE
@@@ -170,7 -156,6 +170,7 @@@ apache_la_CFLAGS = $(AM_CFLAGS) $(BUILD
  apache_la_LIBADD = $(BUILD_WITH_LIBCURL_LIBS)
  endif
  
 +
  if BUILD_PLUGIN_APCUPS
  pkglib_LTLIBRARIES += apcups.la
  apcups_la_SOURCES = apcups.c
@@@ -294,12 -279,6 +294,12 @@@ cpufreq_la_SOURCES = cpufreq.
  cpufreq_la_LDFLAGS = $(PLUGIN_LDFLAGS)
  endif
  
 +if BUILD_PLUGIN_CPUSLEEP
 +pkglib_LTLIBRARIES += cpusleep.la
 +cpusleep_la_SOURCES = cpusleep.c
 +cpusleep_la_LDFLAGS = $(PLUGIN_LDFLAGS)
 +endif
 +
  if BUILD_PLUGIN_CSV
  pkglib_LTLIBRARIES += csv.la
  csv_la_SOURCES = csv.c
@@@ -443,21 -422,14 +443,21 @@@ gmond_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(
  gmond_la_LIBADD = $(GANGLIA_LIBS)
  endif
  
 +if BUILD_PLUGIN_GPS
 +pkglib_LTLIBRARIES += gps.la
 +gps_la_SOURCES = gps.c
 +gps_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBGPS_CFLAGS)
 +gps_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBGPS_LDFLAGS)
 +gps_la_LIBADD = -lpthread $(BUILD_WITH_LIBGPS_LIBS)
 +endif
 +
  if BUILD_PLUGIN_GRPC
  pkglib_LTLIBRARIES += grpc.la
  grpc_la_SOURCES = grpc.cc
  nodist_grpc_la_SOURCES = collectd.grpc.pb.cc collectd.pb.cc types.pb.cc
 -grpc_la_CPPFLAGS = $(AM_CPPFLAGS) -std=c++11
 -grpc_la_CXXFLAGS = $(AM_CXXFLAGS) -std=c++11
 -grpc_la_LDFLAGS = $(PLUGIN_LDFLAGS)
 -grpc_la_LIBADD = -lgrpc++ -lgrpc -lgpr -lprotobuf
 +grpc_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBGRPCPP_CPPFLAGS) $(BUILD_WITH_LIBPROTOBUF_CPPFLAGS)
 +grpc_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBGRPCPP_LDFLAGS) $(BUILD_WITH_LIBPROTOBUF_LDFLAGS)
 +grpc_la_LIBADD = $(BUILD_WITH_LIBGRPCPP_LIBS) $(BUILD_WITH_LIBPROTOBUF_LIBS)
  endif
  
  if BUILD_PLUGIN_HDDTEMP
@@@ -470,6 -442,12 +470,12 @@@ hddtemp_la_LIBADD += -lsocke
  endif
  endif
  
+ if BUILD_PLUGIN_HUGEPAGES
+ pkglib_LTLIBRARIES += hugepages.la
+ hugepages_la_SOURCES = hugepages.c
+ hugepages_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+ endif
  if BUILD_PLUGIN_INTERFACE
  pkglib_LTLIBRARIES += interface.la
  interface_la_SOURCES = interface.c
@@@ -575,15 -553,6 +581,15 @@@ lpar_la_LDFLAGS = $(PLUGIN_LDFLAGS
  lpar_la_LIBADD = -lperfstat
  endif
  
 +if BUILD_PLUGIN_LUA
 +pkglib_LTLIBRARIES += lua.la
 +lua_la_SOURCES = lua.c \
 +               utils_lua.c utils_lua.h
 +lua_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBLUA_CFLAGS)
 +lua_la_LDFLAGS = $(PLUGIN_LDFLAGS)
 +lua_la_LIBADD = $(BUILD_WITH_LIBLUA_LIBS)
 +endif
 +
  if BUILD_PLUGIN_LVM
  pkglib_LTLIBRARIES += lvm.la
  lvm_la_SOURCES = lvm.c
@@@ -866,10 -835,6 +872,10 @@@ perl_la_SOURCES = perl.
  # Despite C99 providing the "bool" type thru stdbool.h, Perl defines its own
  # version of that type if HAS_BOOL is not defined... *sigh*
  perl_la_CPPFLAGS = $(AM_CPPFLAGS) -DHAS_BOOL=1
 +# Despite off_t being 64 bit wide on 64 bit platforms, Perl insist on using
 +# off64_t which is only exposed when _LARGEFILE64_SOURCE is defined... *sigh*
 +# On older platforms we also need _REENTRANT. _GNU_SOURCE sets both of these.
 +perl_la_CPPFLAGS += -D_GNU_SOURCE
  perl_la_CFLAGS  = $(AM_CFLAGS) \
                $(PERL_CFLAGS) \
                -DXS_VERSION=\"$(VERSION)\" -DVERSION=\"$(VERSION)\"
@@@ -893,9 -858,8 +899,9 @@@ if BUILD_PLUGIN_PINB
  pkglib_LTLIBRARIES += pinba.la
  pinba_la_SOURCES = pinba.c
  nodist_pinba_la_SOURCES = pinba.pb-c.c pinba.pb-c.h
 -pinba_la_LDFLAGS = $(PLUGIN_LDFLAGS)
 -pinba_la_LIBADD = -lprotobuf-c
 +pinba_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBPROTOBUF_C_CPPFLAGS)
 +pinba_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBPROTOBUF_C_LDFLAGS)
 +pinba_la_LIBADD = $(BUILD_WITH_LIBPROTOBUF_C_LIBS)
  endif
  
  if BUILD_PLUGIN_PING
@@@ -925,11 -889,13 +931,11 @@@ endi
  if BUILD_PLUGIN_PYTHON
  pkglib_LTLIBRARIES += python.la
  python_la_SOURCES = python.c pyconfig.c pyvalues.c cpython.h
 -python_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_PYTHON_CPPFLAGS)
 -python_la_CFLAGS = $(AM_CFLAGS)
 +python_la_CPPFLAGS = $(AM_CPPFLAGS) $(LIBPYTHON_CPPFLAGS)
  if COMPILER_IS_GCC
 -python_la_CFLAGS += -fno-strict-aliasing -Wno-strict-aliasing
 +python_la_CPPFLAGS += -fno-strict-aliasing -Wno-strict-aliasing
  endif
 -python_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_PYTHON_LDFLAGS)
 -python_la_LIBADD = $(BUILD_WITH_PYTHON_LIBS)
 +python_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(LIBPYTHON_LDFLAGS)
  endif
  
  if BUILD_PLUGIN_PROCESSES
@@@ -997,9 -963,9 +1003,9 @@@ endi
  if BUILD_PLUGIN_SIGROK
  pkglib_LTLIBRARIES += sigrok.la
  sigrok_la_SOURCES = sigrok.c
 -sigrok_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBSIGROK_CFLAGS)
 -sigrok_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBSIGROK_LDFLAGS)
 -sigrok_la_LIBADD = -lsigrok
 +sigrok_la_CFLAGS = $(AM_CFLAGS) $(LIBSIGROK_CFLAGS)
 +sigrok_la_LDFLAGS = $(PLUGIN_LDFLAGS)
 +sigrok_la_LIBADD = $(LIBSIGROK_LIBS)
  endif
  
  if BUILD_PLUGIN_SMART
@@@ -1015,9 -981,13 +1021,9 @@@ endi
  if BUILD_PLUGIN_SNMP
  pkglib_LTLIBRARIES += snmp.la
  snmp_la_SOURCES = snmp.c
 -snmp_la_LDFLAGS = $(PLUGIN_LDFLAGS)
 -snmp_la_CFLAGS = $(AM_CFLAGS)
 -snmp_la_LIBADD =
 -if BUILD_WITH_LIBNETSNMP
 -snmp_la_CFLAGS += $(BUILD_WITH_LIBSNMP_CFLAGS)
 -snmp_la_LIBADD += $(BUILD_WITH_LIBSNMP_LIBS)
 -endif
 +snmp_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBNETSNMP_CPPFLAGS)
 +snmp_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBNETSNMP_LDFLAGS)
 +snmp_la_LIBADD = $(BUILD_WITH_LIBNETSNMP_LIBS)
  endif
  
  if BUILD_PLUGIN_STATSD
@@@ -1249,29 -1219,30 +1255,29 @@@ endi
  if BUILD_PLUGIN_WRITE_GRAPHITE
  pkglib_LTLIBRARIES += write_graphite.la
  write_graphite_la_SOURCES = write_graphite.c \
 -                        utils_format_graphite.c utils_format_graphite.h \
 -                        utils_format_json.c utils_format_json.h
 +                        utils_format_graphite.c utils_format_graphite.h
  write_graphite_la_LDFLAGS = $(PLUGIN_LDFLAGS)
 +write_graphite_la_LIBADD = libformat_json.la
  endif
  
  if BUILD_PLUGIN_WRITE_HTTP
  pkglib_LTLIBRARIES += write_http.la
  write_http_la_SOURCES = write_http.c \
 -                      utils_format_json.c utils_format_json.h
 -write_http_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBCURL_CFLAGS)
 +                      utils_format_kairosdb.c utils_format_kairosdb.h
  write_http_la_LDFLAGS = $(PLUGIN_LDFLAGS)
 -write_http_la_LIBADD = $(BUILD_WITH_LIBCURL_LIBS)
 +write_http_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBCURL_CFLAGS)
 +write_http_la_LIBADD = $(BUILD_WITH_LIBCURL_LIBS) libformat_json.la
  endif
  
  if BUILD_PLUGIN_WRITE_KAFKA
  pkglib_LTLIBRARIES += write_kafka.la
  write_kafka_la_SOURCES = write_kafka.c \
                          utils_format_graphite.c utils_format_graphite.h \
 -                        utils_format_json.c utils_format_json.h \
                          utils_cmd_putval.c utils_cmd_putval.h \
                          utils_crc32.c utils_crc32.h
  write_kafka_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBRDKAFKA_CPPFLAGS)
  write_kafka_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBRDKAFKA_LDFLAGS)
 -write_kafka_la_LIBADD = $(BUILD_WITH_LIBRDKAFKA_LIBS)
 +write_kafka_la_LIBADD = $(BUILD_WITH_LIBRDKAFKA_LIBS) libformat_json.la
  endif
  
  if BUILD_PLUGIN_WRITE_LOG
@@@ -1364,7 -1335,6 +1370,7 @@@ dist_man_MANS = collectd.1 
                collectd-exec.5 \
                collectdctl.1 \
                collectd-java.5 \
 +              collectd-lua.5 \
                collectdmon.1 \
                collectd-nagios.1 \
                collectd-perl.5 \
@@@ -1380,7 -1350,6 +1386,7 @@@ EXTRA_DIST =    collectd.conf.pod 
                collectd-exec.pod \
                collectdctl.pod \
                collectd-java.pod \
 +              collectd-lua.pod \
                collectdmon.pod \
                collectd-nagios.pod \
                collectd-perl.pod \
@@@ -1428,7 -1397,7 +1434,7 @@@ CLEANFILES += pinba.pb-c.c pinba.pb-c.
  BUILT_SOURCES += pinba.pb-c.c pinba.pb-c.h
  
  pinba.pb-c.c pinba.pb-c.h: pinba.proto
 -      $(AM_V_PROTOC_C)protoc-c -I$(srcdir) --c_out . $(srcdir)/pinba.proto
 +      $(AM_V_PROTOC_C)$(PROTOC_C) -I$(srcdir) --c_out . $(srcdir)/pinba.proto
  endif
  
  install-exec-hook:
diff --combined src/collectd.conf.in
  #@BUILD_PLUGIN_CONTEXTSWITCH_TRUE@LoadPlugin contextswitch
  @BUILD_PLUGIN_CPU_TRUE@@BUILD_PLUGIN_CPU_TRUE@LoadPlugin cpu
  #@BUILD_PLUGIN_CPUFREQ_TRUE@LoadPlugin cpufreq
 +#@BUILD_PLUGIN_CPUSLEEP_TRUE@LoadPlugin cpusleep
  @LOAD_PLUGIN_CSV@LoadPlugin csv
  #@BUILD_PLUGIN_CURL_TRUE@LoadPlugin curl
  #@BUILD_PLUGIN_CURL_JSON_TRUE@LoadPlugin curl_json
  #@BUILD_PLUGIN_FILECOUNT_TRUE@LoadPlugin filecount
  #@BUILD_PLUGIN_FSCACHE_TRUE@LoadPlugin fscache
  #@BUILD_PLUGIN_GMOND_TRUE@LoadPlugin gmond
 +#@BUILD_PLUGIN_GPS_TRUE@LoadPlugin gps
  #@BUILD_PLUGIN_GRPC_TRUE@LoadPlugin grpc
  #@BUILD_PLUGIN_HDDTEMP_TRUE@LoadPlugin hddtemp
+ #@BUILD_PLUGIN_HUGEPAGES_TRUE@LoadPlugin hugepages
  @BUILD_PLUGIN_INTERFACE_TRUE@@BUILD_PLUGIN_INTERFACE_TRUE@LoadPlugin interface
  #@BUILD_PLUGIN_IPC_TRUE@LoadPlugin ipc
  #@BUILD_PLUGIN_IPMI_TRUE@LoadPlugin ipmi
  #@BUILD_PLUGIN_JAVA_TRUE@LoadPlugin java
  @BUILD_PLUGIN_LOAD_TRUE@@BUILD_PLUGIN_LOAD_TRUE@LoadPlugin load
  #@BUILD_PLUGIN_LPAR_TRUE@LoadPlugin lpar
 +#@BUILD_PLUGIN_LUA_TRUE@LoadPlugin lua
  #@BUILD_PLUGIN_LVM_TRUE@LoadPlugin lvm
  #@BUILD_PLUGIN_MADWIFI_TRUE@LoadPlugin madwifi
  #@BUILD_PLUGIN_MBMON_TRUE@LoadPlugin mbmon
  #  </Metric>
  #</Plugin>
  
 +#<Plugin gps>
 +#  Host "127.0.0.1"
 +#  Port "2947"
 +#  Timeout 0.015
 +#  PauseConnect 5
 +#</Plugin>
 +
  #<Plugin grpc>
 -#     WorkerThreads 5
 +#     <Server "example.com" "50051">
 +#             EnableSSL true
 +#             SSLCACertificateFile "/path/to/root.pem"
 +#             SSLCertificateFile "/path/to/server.pem"
 +#             SSLCertificateKeyFile "/path/to/server.key"
 +#     </Server>
  #     <Listen "0.0.0.0" "50051">
  #             EnableSSL true
 -#             SSLRootCerts "/path/to/root.pem"
 -#             SSLServerCert "/path/to/server.pem"
 -#             SSLServerKey "/path/to/server.key"
 +#             SSLCACertificateFile "/path/to/root.pem"
 +#             SSLCertificateFile "/path/to/client.pem"
 +#             SSLCertificateKeyFile "/path/to/client.key"
  #     </Listen>
  #</Plugin>
  
  #  Port "7634"
  #</Plugin>
  
+ #<Plugin hugepages>
+ #    ReportPerNodeHP "true"
+ #    ReportRootHP "true"
+ #</Plugin>
  #<Plugin interface>
  #     Interface "eth0"
  #     IgnoreSelected false
 +#     ReportInactive true
  #     UniqueName false
  #</Plugin>
  
  #     ReportBySerial false
  #</Plugin>
  
 +#<Plugin lua>
 +#     BasePath "@prefix@/share/@PACKAGE_NAME@/lua"
 +#     Script "script1.lua"
 +#     Script "script2.lua"
 +#</Plugin>
 +
  #<Plugin madwifi>
  #     Interface "wlan0"
  #     IgnoreSelected false
  #             User "db_user"
  #             Password "secret"
  #             Database "db_name"
 +#             SSLKey "/path/to/key.pem"
 +#             SSLCert "/path/to/cert.pem"
 +#             SSLCA "/path/to/ca.pem"
 +#             SSLCAPath "/path/to/cas/"
 +#             SSLCipher "DHE-RSA-AES256-SHA"
  #             MasterStats true
  #             ConnectTimeout 10
  #             InnodbStats true
  #             SlaveStats true
  #             SlaveNotifications true
  #     </Database>
 +#     <Database galera>
 +#             Alias "galera"
 +#             Host "localhost"
 +#             Socket "/var/run/mysql/mysqld.sock"
 +#             WsrepStats true
 +#     </Database>
  #</Plugin>
  
  #<Plugin netapp>
  #             Header "X-Custom-Header: custom_value"
  #             SSLVersion "TLSv1"
  #             Format "Command"
 +#             Metrics true
 +#             Notifications false
  #             StoreRates false
  #             BufferSize 4096
  #             LowSpeedLimit 0
diff --combined src/collectd.conf.pod
@@@ -1447,11 -1447,6 +1447,11 @@@ are set to B<true>. In this case, by de
  Jiffies. By setting this option to B<true>, you can request percentage values
  in the un-aggregated (per-CPU, per-state) mode as well.
  
 +=item B<ReportNumCpu> B<false>|B<true>
 +
 +When set to B<true>, reports the number of available CPUs.
 +Defaults to B<false>.
 +
  =back
  
  =head2 Plugin C<cpufreq>
@@@ -1462,16 -1457,6 +1462,16 @@@ installed) to get the current CPU frequ
  sure B<cpufreqd> (L<http://cpufreqd.sourceforge.net/>) or a similar tool is
  installed and an "cpu governor" (that's a kernel module) is loaded.
  
 +=head2 Plugin C<cpusleep>
 +
 +This plugin doesn't have any options. It reads CLOCK_BOOTTIME and
 +CLOCK_MONOTONIC and reports the difference between these clocks. Since
 +BOOTTIME clock increments while device is suspended and MONOTONIC
 +clock does not, the derivative of the difference between these clocks
 +gives the relative amount of time the device has spent in suspend
 +state. The recorded value is in milliseconds of sleep per seconds of
 +wall clock.
 +
  =head2 Plugin C<csv>
  
  =over 4
@@@ -1775,11 -1760,6 +1775,11 @@@ The following options are valid within 
  
  =over 4
  
 +=item B<Host> I<Name>
 +
 +Use I<Name> as the host name when submitting values. Defaults to the global
 +host name setting.
 +
  =item B<Instance> I<Instance>
  
  Sets the plugin instance to I<Instance>.
@@@ -2421,7 -2401,7 +2421,7 @@@ I<TypeInstance> will be used
  
  =item B<MappedOnly> B<true>|B<false>
  
 -When set to B<true>, only metrics that can be mapped to to a I<type> will be
 +When set to B<true>, only metrics that can be mapped to a I<type> will be
  collected, all other metrics will be ignored. Defaults to B<false>.
  
  =back
@@@ -2651,78 -2631,6 +2651,78 @@@ source, this is optional. Otherwise th
  
  =back
  
 +=head2 Plugin C<gps>
 +
 +The C<gps plugin> connects to gpsd on the host machine.
 +The host, port, timeout and pause are configurable.
 +
 +This is useful if you run an NTP server using a GPS for source and you want to
 +monitor it.
 +
 +Mind your GPS must send $--GSA for having the data reported!
 +
 +The following elements are collected:
 +
 +=over 4
 +
 +=item B<satellites>
 +
 +Number of satellites used for fix (type instance "used") and in view (type
 +instance "visible"). 0 means no GPS satellites are visible.
 +
 +=item B<dilution_of_precision>
 +
 +Vertical and horizontal dilution (type instance "horizontal" or "vertical").
 +It should be between 0 and 3.
 +Look at the documentation of your GPS to know more.
 +
 +=back
 +
 +Synopsis:
 +
 + LoadPlugin gps
 + <Plugin "gps">
 +   # Connect to localhost on gpsd regular port:
 +   Host "127.0.0.1"
 +   Port "2947"
 +   # 15 ms timeout
 +   Timeout 0.015
 +   # PauseConnect of 5 sec. between connection attempts.
 +   PauseConnect 5
 + </Plugin>
 +
 +Available configuration options:
 +
 +=over 4
 +
 +=item B<Host> I<Host>
 +
 +The host on which gpsd daemon runs. Defaults to B<localhost>.
 +
 +=item B<Port> I<Port>
 +
 +Port to connect to gpsd on the host machine. Defaults to B<2947>.
 +
 +=item B<Timeout> I<Seconds>
 +
 +Timeout in seconds (default 0.015 sec).
 +
 +The GPS data stream is fetch by the plugin form the daemon.
 +It waits for data to be available, if none arrives it times out
 +and loop for another reading.
 +Mind to put a low value gpsd expects value in the micro-seconds area
 +(recommended is 500 us) since the waiting function is blocking.
 +Value must be between 500 us and 5 sec., if outside that range the
 +default value is applied.
 +
 +This only applies from gpsd release-2.95.
 +
 +=item B<PauseConnect> I<Seconds>
 +
 +Pause to apply between attempts of connection to gpsd in seconds (default 5 sec).
 +
 +=back
 +
  =head2 Plugin C<grpc>
  
  The I<grpc> plugin provides an RPC interface to submit values to or query
@@@ -2733,33 -2641,6 +2733,33 @@@ The B<gRPC> homepage can be found at L<
  
  =over 4
  
 +=item B<Server> I<Host> I<Port>
 +
 +The B<Server> statement sets the address of a server to which to send metrics
 +via the C<DispatchValues> function.
 +
 +The argument I<Host> may be a hostname, an IPv4 address, or an IPv6 address.
 +
 +Optionally, B<Server> may be specified as a configuration block which supports
 +the following options:
 +
 +=over 4
 +
 +=item B<EnableSSL> B<false>|B<true>
 +
 +Whether to require SSL for outgoing connections. Default: false.
 +
 +=item B<SSLCACertificateFile> I<Filename>
 +
 +=item B<SSLCertificateFile> I<Filename>
 +
 +=item B<SSLCertificateKeyFile> I<Filename>
 +
 +Filenames specifying SSL certificate and key material to be used with SSL
 +connections.
 +
 +=back
 +
  =item B<Listen> I<Host> I<Port>
  
  The B<Listen> statement sets the network address to bind to. When multiple
@@@ -2777,17 -2658,22 +2777,17 @@@ supports the following options
  
  Whether to enable SSL for incoming connections. Default: false.
  
 -=item B<SSLRootCerts> I<Filename>
 +=item B<SSLCACertificateFile> I<Filename>
  
 -=item B<SSLServerKey> I<Filename>
 +=item B<SSLCertificateFile> I<Filename>
  
 -=item B<SSLServerCert> I<Filename>
 +=item B<SSLCertificateKeyFile> I<Filename>
  
  Filenames specifying SSL certificate and key material to be used with SSL
  connections.
  
  =back
  
 -=item B<WorkerThreads> I<Num>
 -
 -Number of threads to start for handling incoming connections. The default
 -value is B<5>.
 -
  =back
  
  =head2 Plugin C<hddtemp>
@@@ -2813,6 -2699,32 +2813,32 @@@ TCP-Port to connect to. Defaults to B<7
  
  =back
  
+ =head2 Plugin C<hugepages>
+ To collect B<hugepages> information, collectd reads directories
+ "/sys/devices/system/node/*/hugepages" and
+ "/sys/kernel/mm/hugepages".
+ Reading of these directories can be disabled by the following
+ options (default is enabled).
+ =over 4
+ =item B<ReportPerNodeHP> I<true>|I<false>
+ If enabled, information will be collected from the hugepage
+ counters in "/sys/devices/system/node/*/hugepages".
+ This is used to check the per-node hugepage statistics on
+ a NUMA system.
+ =item B<ReportRootHP> I<true>|I<false>
+ If enabled, information will be collected from the hugepage
+ counters in "/sys/kernel/mm/hugepages".
+ This can be used on both NUMA and non-NUMA systems to check
+ the overall hugepage statistics.
+ =back
  =head2 Plugin C<interface>
  
  =over 4
@@@ -2849,18 -2761,6 +2875,18 @@@ This will ignore the loopback interface
  with I<veth> and all interfaces with names starting with I<tun> followed by
  at least one digit.
  
 +=item B<ReportInactive> I<true>|I<false>
 +
 +When set to I<false>, only interfaces with non-zero traffic will be
 +reported. Note that the check is done by looking into whether a
 +package was sent at any time from boot and the corresponding counter
 +is non-zero. So, if the interface has been sending data in the past
 +since boot, but not during the reported time-interval, it will still
 +be reported.
 +
 +The default value is I<true> and results in collection of the data
 +from all interfaces that are selected by B<Interface> and
 +B<IgnoreSelected> options.
  
  =item B<UniqueName> I<true>|I<false>
  
@@@ -3115,12 -3015,6 +3141,12 @@@ Defaults to false
  
  =back
  
 +=head2 Plugin C<lua>
 +
 +This plugin embeds a Lua interpreter into collectd and provides an interface
 +to collectd's plugin system. See L<collectd-lua(5)> for its documentation.
 +
 +
  =head2 Plugin C<mbmon>
  
  The C<mbmon plugin> uses mbmon to retrieve temperature, voltage, etc.
@@@ -3772,11 -3666,6 +3798,11 @@@ Synopsis
        Port "3306"
        MasterStats true
        ConnectTimeout 10
 +      SSLKey "/path/to/key.pem"
 +      SSLCert "/path/to/cert.pem"
 +      SSLCA "/path/to/ca.pem"
 +      SSLCAPath "/path/to/cas/"
 +      SSLCipher "DHE-RSA-AES256-SHA"
      </Database>
  
      <Database bar>
        SlaveStats true
        SlaveNotifications true
      </Database>
 +
 +   <Database galera>
 +      Alias "galera"
 +      Host "localhost"
 +      Socket "/var/run/mysql/mysqld.sock"
 +      WsrepStats true
 +   </Database>
    </Plugin>
  
  A B<Database> block defines one connection to a MySQL database. It accepts a
  single argument which specifies the name of the database. None of the other
  options are required. MySQL will use default values as documented in the
 -section "mysql_real_connect()" in the B<MySQL reference manual>.
 +"mysql_real_connect()" and "mysql_ssl_set()" sections in the
 +B<MySQL reference manual>.
  
  =over 4
  
@@@ -3864,36 -3745,10 +3890,36 @@@ privileges. See the B<User> documentati
  If enabled, the plugin sends a notification if the replication slave I/O and /
  or SQL threads are not running. Defaults to B<false>.
  
 +=item B<WsrepStats> I<true|false>
 + 
 + Enable the collection of wsrep plugin statistics, used in Master-Master
 + replication setups like in MySQL Galera/Percona XtraDB Cluster.
 + User needs only privileges to execute 'SHOW GLOBAL STATUS'
 + 
  =item B<ConnectTimeout> I<Seconds>
  
  Sets the connect timeout for the MySQL client.
  
 +=item B<SSLKey> I<Path>
 +
 +If provided, the X509 key in PEM format.
 +
 +=item B<SSLCert> I<Path>
 +
 +If provided, the X509 cert in PEM format.
 +
 +=item B<SSLCA> I<Path>
 +
 +If provided, the CA file in PEM format (check OpenSSL docs).
 +
 +=item B<SSLCAPath> I<Path>
 +
 +If provided, the CA directory (check OpenSSL docs).
 +
 +=item B<SSLCipher> I<String>
 +
 +If provided, the SSL cipher to use.
 +
  =back
  
  =head2 Plugin C<netapp>
@@@ -6635,14 -6490,6 +6661,14 @@@ from these disks anyway. This is usefu
  reports disks as asleep because it has not been updated to incorporate support
  for newer idle states in the ATA spec.
  
 +=item B<UseSerial> B<true>|B<false>
 +
 +A disk's kernel name (e.g., sda) can change from one boot to the next. If this
 +option is enabled, the C<smart> plugin will use the disk's serial number (e.g.,
 +HGST_HUH728080ALE600_2EJ8VH8X) instead of the kernel name as the key for
 +storing data. This ensures that the data for a given disk will be kept together
 +even if the kernel name changes.
 +
  =back
  
  =head2 Plugin C<snmp>
@@@ -7208,7 -7055,7 +7234,7 @@@ port in numeric form
  =item B<AllPortsSummary> I<true>|I<false>
  
  If this option is set to I<true> a summary of statistics from all connections
 -are collectd. This option defaults to I<false>.
 +are collected. This option defaults to I<false>.
  
  =back
  
@@@ -7980,23 -7827,14 +8006,23 @@@ Define which SSL protocol version must 
  attempt to figure out the remote SSL protocol version. See
  L<curl_easy_setopt(3)> for more details.
  
 -=item B<Format> B<Command>|B<JSON>
 +=item B<Format> B<Command>|B<JSON>|B<KAIROSDB>
  
  Format of the output to generate. If set to B<Command>, will create output that
  is understood by the I<Exec> and I<UnixSock> plugins. When set to B<JSON>, will
 -create output in the I<JavaScript Object Notation> (JSON).
 +create output in the I<JavaScript Object Notation> (JSON). When set to KAIROSDB
 +, will create output in the KairosDB format.
  
  Defaults to B<Command>.
  
 +=item B<Metrics> B<true>|B<false>
 +
 +Controls whether I<metrics> are POSTed to this location. Defaults to B<true>.
 +
 +=item B<Notifications> B<false>|B<true>
 +
 +Controls whether I<notifications> are POSTed to this location. Defaults to B<false>.
 +
  =item B<StoreRates> B<true|false>
  
  If set to B<true>, convert counter values to rates. If set to B<false> (the
diff --combined src/types.db
@@@ -45,7 -45,6 +45,7 @@@ derive                  value:DERIVE:0:
  df                      used:GAUGE:0:1125899906842623, free:GAUGE:0:1125899906842623
  df_complex              value:GAUGE:0:U
  df_inodes               value:GAUGE:0:U
 +dilution_of_precision   value:GAUGE:0:U
  disk_io_time            io_time:DERIVE:0:U, weighted_io_time:DERIVE:0:U
  disk_latency            read:GAUGE:0:U, write:GAUGE:0:U
  disk_merged             read:DERIVE:0:U, write:DERIVE:0:U
@@@ -92,6 -91,7 +92,7 @@@ hash_collisions         value:DERIVE:0:
  http_request_methods    value:DERIVE:0:U
  http_requests           value:DERIVE:0:U
  http_response_codes     value:DERIVE:0:U
+ hugepages               free:GAUGE:0:4294967295, used:GAUGE:0:4294967295
  humidity                value:GAUGE:0:100
  if_collisions           value:DERIVE:0:U
  if_dropped              rx:DERIVE:0:U, tx:DERIVE:0:U
@@@ -151,7 -151,6 +152,7 @@@ node_stat               value:DERIVE:0:
  node_tx_rate            value:GAUGE:0:127
  objects                 value:GAUGE:0:U
  operations              value:DERIVE:0:U
 +operations_per_second   value:GAUGE:0:U
  packets                 value:DERIVE:0:U
  pending_operations      value:GAUGE:0:U
  percent                 value:GAUGE:0:100.1
@@@ -198,7 -197,6 +199,7 @@@ root_dispersion         value:GAUGE:U:
  route_etx               value:GAUGE:0:U
  route_metric            value:GAUGE:0:U
  routes                  value:GAUGE:0:U
 +satellites              value:GAUGE:0:U
  segments                value:GAUGE:0:65535
  serial_octets           rx:DERIVE:0:U, tx:DERIVE:0:U
  signal_noise            value:GAUGE:U:0