diff options
Diffstat (limited to 'parallel/ganglia-monitor-core')
-rw-r--r-- | parallel/ganglia-monitor-core/Makefile | 20 | ||||
-rw-r--r-- | parallel/ganglia-monitor-core/distinfo | 15 | ||||
-rw-r--r-- | parallel/ganglia-monitor-core/files/dfly-Makefile.am | 5 | ||||
-rw-r--r-- | parallel/ganglia-monitor-core/files/dfly-Makefile.in | 335 | ||||
-rw-r--r-- | parallel/ganglia-monitor-core/files/dfly-metrics.c | 1149 | ||||
-rw-r--r-- | parallel/ganglia-monitor-core/patches/patch-aa | 16 | ||||
-rw-r--r-- | parallel/ganglia-monitor-core/patches/patch-am | 4 | ||||
-rw-r--r-- | parallel/ganglia-monitor-core/patches/patch-an | 4 | ||||
-rw-r--r-- | parallel/ganglia-monitor-core/patches/patch-ao | 13 | ||||
-rw-r--r-- | parallel/ganglia-monitor-core/patches/patch-ap | 30 | ||||
-rw-r--r-- | parallel/ganglia-monitor-core/patches/patch-aq | 30 | ||||
-rw-r--r-- | parallel/ganglia-monitor-core/patches/patch-ar | 32 | ||||
-rw-r--r-- | parallel/ganglia-monitor-core/patches/patch-as | 45 | ||||
-rw-r--r-- | parallel/ganglia-monitor-core/patches/patch-at | 13 | ||||
-rw-r--r-- | parallel/ganglia-monitor-core/patches/patch-au | 23 |
15 files changed, 1718 insertions, 16 deletions
diff --git a/parallel/ganglia-monitor-core/Makefile b/parallel/ganglia-monitor-core/Makefile index 4878a431869..88ff6664891 100644 --- a/parallel/ganglia-monitor-core/Makefile +++ b/parallel/ganglia-monitor-core/Makefile @@ -1,9 +1,9 @@ -# $NetBSD: Makefile,v 1.9 2006/04/17 13:46:44 wiz Exp $ +# $NetBSD: Makefile,v 1.10 2006/04/30 22:28:44 joerg Exp $ # DISTNAME= ganglia-3.0.1 PKGNAME= ganglia-monitor-core-3.0.1 -PKGREVISION= 3 +PKGREVISION= 4 CATEGORIES= net parallel MASTER_SITES= ${MASTER_SITE_SOURCEFORGE:=ganglia/} EXTRACT_SUFX= .tar.bz2 @@ -12,10 +12,14 @@ MAINTAINER= jschauma@NetBSD.org HOMEPAGE= http://ganglia.sourceforge.net/ COMMENT= Ganglia cluster monitor, monitoring daemon -HAS_CONFIGURE= YES +GNU_CONFIGURE= YES -CONFIGURE_ARGS+= --prefix=${PREFIX:Q} CONFIGURE_ARGS+= --with-gmetad +USE_LIBTOOL= yes +CONFIG_GUESS_OVERRIDE?= \ + config.guess */config.guess */*/config.guess */*/*/config.guess +CONFIG_SUB_OVERRIDE?= \ + config.sub */config.sub */*/config.sub */*/*/config.sub PATCH_ETC= mans/gmetad.1 mans/gmond.1 \ gmetad/cmdline.c gmetad/conf.c \ @@ -32,6 +36,10 @@ RCD_SCRIPTS= gmond gmetad pre-patch: ${MKDIR} ${WRKSRC}/srclib/libmetrics/netbsd + ${MKDIR} ${WRKSRC}/srclib/libmetrics/dragonfly + ${CP} ${FILESDIR}/dfly-metrics.c ${WRKSRC}/srclib/libmetrics/dragonfly/metrics.c + ${CP} ${FILESDIR}/dfly-Makefile.am ${WRKSRC}/srclib/libmetrics/dragonfly/Makefile.am + ${CP} ${FILESDIR}/dfly-Makefile.in ${WRKSRC}/srclib/libmetrics/dragonfly/Makefile.in post-patch: .for pfile in ${PATCH_ETC} @@ -58,6 +66,10 @@ post-install: ${INSTALL_DATA} ${WRKSRC}/gmond.sh ${PREFIX}/${RCD_SCRIPTS_EXAMPLEDIR}/gmond ${INSTALL_DATA} ${WRKSRC}/gmetad.sh ${PREFIX}/${RCD_SCRIPTS_EXAMPLEDIR}/gmetad +BUILDLINK_DEPENDS.apr+= apr>=0.9.7.2.0.55nb3 + +.include "../../devel/apr/buildlink3.mk" +.include "../../textproc/expat/buildlink3.mk" .include "../../databases/rrdtool/buildlink3.mk" .include "../../mk/pthread.buildlink3.mk" diff --git a/parallel/ganglia-monitor-core/distinfo b/parallel/ganglia-monitor-core/distinfo index 9390f914792..af0155e28a4 100644 --- a/parallel/ganglia-monitor-core/distinfo +++ b/parallel/ganglia-monitor-core/distinfo @@ -1,9 +1,9 @@ -$NetBSD: distinfo,v 1.7 2005/06/17 15:46:46 hira Exp $ +$NetBSD: distinfo,v 1.8 2006/04/30 22:28:44 joerg Exp $ SHA1 (ganglia-3.0.1.tar.bz2) = 3e5c4ec4a509713974dd1e8d516127f6aa2c5a20 RMD160 (ganglia-3.0.1.tar.bz2) = 1f0ecc7388f1058d64df9ab98734810a983e6d26 Size (ganglia-3.0.1.tar.bz2) = 2649342 bytes -SHA1 (patch-aa) = 88972d2268ebc76d72d8f2197bb272c6553f7098 +SHA1 (patch-aa) = 4e5bb79a395f1b34062bc62fce80c809d45ae60d SHA1 (patch-ab) = 6b349e90cdbf1a988aceb6222b5d67cacffe0a61 SHA1 (patch-ac) = 23ad60ea06080a6763b21256e20549868110cf54 SHA1 (patch-ad) = 4f03c665800827e1d89d7d76b81b667f0cf82ca6 @@ -15,5 +15,12 @@ SHA1 (patch-ai) = 1ae508692d8160aa202e02612590d329d910f434 SHA1 (patch-aj) = d73aa994a2a6c9441d0b1cbcc9247bdf522b37c4 SHA1 (patch-ak) = 6d84043aaf005e319517e8df61097dc00067ed10 SHA1 (patch-al) = fbcf90d61ab6a160cbce7b90d0cdfcab44a1429c -SHA1 (patch-am) = 89cc8fe1f4da758c5c0c46135e4a4310de75cc32 -SHA1 (patch-an) = f6e2d97fd474b5b00b68c575e0c3e376d772b2c0 +SHA1 (patch-am) = 719f293496f648cd5829ef35edd046120764312f +SHA1 (patch-an) = 5b6c7002ead98dec9c45643be6dc6b69e1133355 +SHA1 (patch-ao) = a25381b4c8858112a46e9b61ff0af317f2472d5e +SHA1 (patch-ap) = 649940b694afd7f10c58f84d323f7b755759f84f +SHA1 (patch-aq) = 22fe789c666df1f4934046f1aa62d3629257c775 +SHA1 (patch-ar) = f652c74bf48528762e06801760753036651f874e +SHA1 (patch-as) = 710abfd3dc6e5836818a0de2ce93d873b4b9b259 +SHA1 (patch-at) = aeb83adbcb798099d6c4cf4da58b164e7cb22c06 +SHA1 (patch-au) = ff58e4e0bcd631e8358c1e7cd7824597e32c5b01 diff --git a/parallel/ganglia-monitor-core/files/dfly-Makefile.am b/parallel/ganglia-monitor-core/files/dfly-Makefile.am new file mode 100644 index 00000000000..ee336f67197 --- /dev/null +++ b/parallel/ganglia-monitor-core/files/dfly-Makefile.am @@ -0,0 +1,5 @@ +AM_CFLAGS=-I.. -I$(top_builddir)/lib + +noinst_LTLIBRARIES = libmetric25.la +libmetric25_la_SOURCES = metrics.c +libmetrics25_LIBS = -lkinfo diff --git a/parallel/ganglia-monitor-core/files/dfly-Makefile.in b/parallel/ganglia-monitor-core/files/dfly-Makefile.in new file mode 100644 index 00000000000..c3f8ee2ae3c --- /dev/null +++ b/parallel/ganglia-monitor-core/files/dfly-Makefile.in @@ -0,0 +1,335 @@ +# Makefile.in generated by automake 1.6.3 from Makefile.am. +# @configure_input@ + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 +# Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ + +EXEEXT = @EXEEXT@ +OBJEXT = @OBJEXT@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +AWK = @AWK@ +CC = @CC@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +ECHO = @ECHO@ +EGREP = @EGREP@ +F77 = @F77@ +GCJ = @GCJ@ +GCJFLAGS = @GCJFLAGS@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +OBJDUMP = @OBJDUMP@ +OS = @OS@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +RC = @RC@ +STRIP = @STRIP@ +VERSION = @VERSION@ +am__include = @am__include@ +am__quote = @am__quote@ +install_sh = @install_sh@ +AM_CFLAGS = -I.. -I$(top_builddir)/lib + +noinst_LTLIBRARIES = libmetric25.la +libmetric25_la_SOURCES = metrics.c +subdir = freebsd +mkinstalldirs = $(SHELL) $(top_srcdir)/build/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) + +libmetric25_la_LDFLAGS = +libmetric25_la_LIBADD = -lkinfo +am_libmetric25_la_OBJECTS = metrics.lo +libmetric25_la_OBJECTS = $(am_libmetric25_la_OBJECTS) + +DEFS = @DEFS@ +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +depcomp = $(SHELL) $(top_srcdir)/build/depcomp +am__depfiles_maybe = depfiles +@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/metrics.Plo +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ + $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +CFLAGS = @CFLAGS@ +DIST_SOURCES = $(libmetric25_la_SOURCES) +DIST_COMMON = Makefile.am Makefile.in +SOURCES = $(libmetric25_la_SOURCES) + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu freebsd/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test -z "$dir" && dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libmetric25.la: $(libmetric25_la_OBJECTS) $(libmetric25_la_DEPENDENCIES) + $(LINK) $(libmetric25_la_LDFLAGS) $(libmetric25_la_OBJECTS) $(libmetric25_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) core *.core + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/metrics.Plo@am__quote@ + +distclean-depend: + -rm -rf ./$(DEPDIR) + +.c.o: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$< + +.c.obj: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `cygpath -w $<` + +.c.lo: +@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(LTCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< +CCDEPMODE = @CCDEPMODE@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ETAGS = etags +ETAGSFLAGS = + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$tags$$unique" \ + || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @list='$(DISTFILES)'; for file in $$list; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkinstalldirs) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) + +installdirs: + +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + +distclean-am: clean-am distclean-compile distclean-depend \ + distclean-generic distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +uninstall-am: uninstall-info-am + +.PHONY: GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES distclean \ + distclean-compile distclean-depend distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am info \ + info-am install install-am install-data install-data-am \ + install-exec install-exec-am install-info install-info-am \ + install-man install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool tags uninstall uninstall-am \ + uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/parallel/ganglia-monitor-core/files/dfly-metrics.c b/parallel/ganglia-monitor-core/files/dfly-metrics.c new file mode 100644 index 00000000000..6a186a0b5fc --- /dev/null +++ b/parallel/ganglia-monitor-core/files/dfly-metrics.c @@ -0,0 +1,1149 @@ +/* + * First stab at support for metrics in FreeBSD + * by Preston Smith <psmith@physics.purdue.edu> + * Wed Feb 27 14:55:33 EST 2002 + * Improved by Brooks Davis <brooks@one-eyed-alien.net>, + * Fixed libkvm code. + * Tue Jul 15 16:42:22 EST 2003 + * + * $Id: dfly-metrics.c,v 1.1 2006/04/30 22:28:44 joerg Exp $ + */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <kvm.h> + +#include <sys/param.h> +#include <sys/mount.h> +#include <sys/sysctl.h> +#include <sys/time.h> +#include <sys/user.h> +#include <kinfo.h> +#include <sys/stat.h> +#include <vm/vm_param.h> + +#include <sys/socket.h> +#include <net/if.h> +#include <net/if_dl.h> +#include <net/route.h> + +#include <unistd.h> +#include <err.h> +#include <fcntl.h> +#include <limits.h> +#include <paths.h> + +#include "interface.h" +#include "libmetrics.h" + +#define MIB_SWAPINFO_SIZE 3 + +#ifndef MIN_NET_POLL_INTERVAL +#define MIN_NET_POLL_INTERVAL 0.5 +#endif + +#ifndef MIN_CPU_POLL_INTERVAL +#define MIN_CPU_POLL_INTERVAL 0.5 +#endif + +#ifndef UINT64_MAX +#define UINT64_MAX ULLONG_MAX +#endif + +#define VFCF_NONLOCAL (VFCF_NETWORK|VFCF_SYNTHETIC|VFCF_LOOPBACK) + +#define timertod(tvp) \ + ((double)(tvp)->tv_sec + (double)(tvp)->tv_usec/(1000*1000)) + +#ifndef XSWDEV_VERSION +#define XSWDEV_VERSION 1 +struct xswdev { + u_int xsw_version; + udev_t xsw_dev; + int xsw_flags; + int xsw_nblks; + int xsw_used; +}; +#endif + +struct traffic { + uint64_t in_bytes; + uint64_t out_bytes; + uint64_t in_pkts; + uint64_t out_pkts; +}; + +static void get_netbw(double *, double *, double *, double *); +static uint64_t counterdiff(uint64_t, uint64_t, uint64_t, uint64_t); + + +static char *makenetvfslist(void); +static size_t regetmntinfo(struct statfs **, long, const char **); +static int checkvfsname(const char *, const char **); +static const char **makevfslist(char *); +static float find_disk_space(double *, double *); + +static int use_vm_swap_info = 0; +static int mibswap[MIB_SWAPINFO_SIZE]; +static size_t mibswap_size; +static kvm_t *kd = NULL; +static int pagesize; +static int skipvfs; + +/* + * This function is called only once by the gmond. Use to + * initialize data structures, etc or just return SYNAPSE_SUCCESS; + */ +g_val_t +metric_init(void) +{ + g_val_t val; + + /* + * Try to use the vm.swap_info sysctl to gather swap data. If it + * isn't implemented, fall back to trying to old kvm based interface. + */ + mibswap_size = MIB_SWAPINFO_SIZE; + if (sysctlnametomib("vm.swap_info", mibswap, &mibswap_size) == -1) { + kd = kvm_open(NULL, NULL, NULL, O_RDONLY, "metric_init()"); + } else { + /* + * RELEASE versions of FreeBSD with the swap mib have a version + * of libkvm that doesn't need root for simple proc access so we + * just open /dev/null to give us a working handle here. + */ + kd = kvm_open(_PATH_DEVNULL, NULL, NULL, O_RDONLY, "metric_init()"); + use_vm_swap_info = 1; + } + pagesize = getpagesize(); + + /* Initalize some counters */ + get_netbw(NULL, NULL, NULL, NULL); + cpu_state(-1); + + val.int32 = SYNAPSE_SUCCESS; + return val; +} + +g_val_t +cpu_num_func ( void ) +{ + g_val_t val; + int ncpu; + + if (kinfo_get_cpus(&ncpu)) + ncpu = 1; + + val.uint16 = ncpu; + return val; +} + +g_val_t +cpu_speed_func ( void ) +{ + g_val_t val; + int cpu_speed; + size_t len = sizeof(cpu_speed); + + /* + * machdep.tsc_freq is an i386/amd64 only feature, but it's the best + * we've got at the moment. + */ + if (sysctlbyname("machdep.tsc_freq", &cpu_speed, &len, NULL, 0) == -1) + cpu_speed = 0; + val.uint16 = cpu_speed /= 1000000; + + return val; +} + +g_val_t +mem_total_func ( void ) +{ + g_val_t val; + size_t len; + long total; + + len = sizeof(total); + + if (sysctlbyname("hw.physmem", &total, &len, NULL, 0) == -1) + total = 0; + val.uint32 = total / 1024; + + return val; +} + +g_val_t +swap_total_func ( void ) +{ + g_val_t val; + struct kvm_swap swap[1]; + struct xswdev xsw; + size_t size; + int totswap, n; + val.uint32 = 0; + totswap = 0; + + if (use_vm_swap_info) { + for (n = 0; ; ++n) { + mibswap[mibswap_size] = n; + size = sizeof(xsw); + if (sysctl(mibswap, mibswap_size + 1, &xsw, &size, NULL, 0) == -1) + break; + if (xsw.xsw_version != XSWDEV_VERSION) + return val; + totswap += xsw.xsw_nblks; + } + } else if(kd != NULL) { + n = kvm_getswapinfo(kd, swap, 1, 0); + if (n < 0 || swap[0].ksw_total == 0) { + val.uint32 = 0; + } + totswap = swap[0].ksw_total; + } + + val.uint32 = totswap * (pagesize / 1024); + return val; +} + +g_val_t +boottime_func ( void ) +{ + g_val_t val; + struct timeval boottime; + size_t size; + + size = sizeof(boottime); + if (sysctlbyname("kern.boottime", &boottime, &size, NULL, 0) == -1) + boottime.tv_sec = 0; + + val.uint32 = (uint32_t) boottime.tv_sec; + + return val; +} + +g_val_t +sys_clock_func ( void ) +{ + g_val_t val; + + val.uint32 = time(NULL); + return val; +} + +g_val_t +machine_type_func ( void ) +{ + g_val_t val; + size_t len = sizeof(val.str); + + if (sysctlbyname("hw.machine", val.str, &len, NULL, 0) == -1 || + (len == 0)) + strlcpy(val.str, "unknown", sizeof(val.str)); + + return val; +} + +g_val_t +os_name_func ( void ) +{ + g_val_t val; + size_t len = sizeof(val.str); + + if (sysctlbyname("kern.ostype", val.str, &len, NULL, 0) == -1 || + (len == 0)) + strlcpy(val.str, "DragonFly (unknown)", sizeof(val.str)); + + return val; +} + +g_val_t +os_release_func ( void ) +{ + g_val_t val; + size_t len = sizeof(val.str); + + if (sysctlbyname("kern.osrelease", val.str, &len, NULL, 0) == -1 || + (len == 0)) + strlcpy(val.str, "unknown", sizeof(val.str)); + + return val; +} + +/* Get the CPU state given by index, from kern.cp_time + * Use the constants in <sys/dkstat.h> + * CP_USER=0, CP_NICE=1, CP_SYS=2, CP_INTR=3, CP_IDLE=4 + */ + +int cpu_state(int which) { + static struct kinfo_cputime cp_old, cp_diff; + static uint64_t total_change, half_change; + static struct timeval this_time, last_time; + + struct kinfo_cputime cp_time; + struct timeval time_diff; + int i; + + if (which == -1) { + bzero(&cp_old, sizeof(cp_old)); + bzero(&cp_diff, sizeof(cp_diff)); + total_change = 1; + half_change = 0; + bzero(&last_time, sizeof(last_time)); + return 0.0; + } + + gettimeofday(&this_time, NULL); + timersub(&this_time, &last_time, &time_diff); + if (timertod(&time_diff) < MIN_CPU_POLL_INTERVAL) { + goto output; + } + last_time = this_time; + + if (kinfo_get_sched_cputime(&cp_time)) { + warn("kinfo_get_sched_cputime"); + return 0.0; + } + cp_diff.cp_user = cp_time.cp_user - cp_old.cp_user; + cp_diff.cp_nice = cp_time.cp_nice - cp_old.cp_nice; + cp_diff.cp_sys = cp_time.cp_sys - cp_old.cp_sys; + cp_diff.cp_intr = cp_time.cp_intr - cp_old.cp_intr; + cp_diff.cp_idle = cp_time.cp_idle - cp_old.cp_idle; + total_change = cp_diff.cp_user + cp_diff.cp_nice + cp_diff.cp_sys + + cp_diff.cp_sys + cp_diff.cp_intr + cp_diff.cp_idle; + if (total_change == 0) + total_change = 1; + half_change = total_change >> 1; + +output: + switch (which) { + case 0: + return (cp_diff.cp_user * 100LL + half_change) / total_change; + case 1: + return (cp_diff.cp_nice * 100LL + half_change) / total_change; + case 2: + return (cp_diff.cp_sys * 100LL + half_change) / total_change; + case 3: + return (cp_diff.cp_intr * 100LL + half_change) / total_change; + case 4: + return (cp_diff.cp_idle * 100LL + half_change) / total_change; + default: + return 0; + } +} + +g_val_t +cpu_user_func ( void ) +{ + g_val_t val; + + val.f = (float) cpu_state(0); + + return val; +} + +g_val_t +cpu_nice_func ( void ) +{ + g_val_t val; + + val.f = (float) cpu_state(1); + + return val; +} + +g_val_t +cpu_system_func ( void ) +{ + g_val_t val; + + val.f = (float) cpu_state(2); + + return val; +} + +g_val_t +cpu_idle_func ( void ) +{ + g_val_t val; + + val.f = (float) cpu_state(4); + + return val; +} + +/* +** FIXME - This metric is not valid on FreeBSD. +*/ +g_val_t +cpu_wio_func ( void ) +{ + g_val_t val; + + val.f = 0.0; + return val; +} + +/* +** FIXME - Idle time since startup. The scheduler apparently knows +** this, but we it's fairly pointless so it's not exported. +*/ +g_val_t +cpu_aidle_func ( void ) +{ + g_val_t val; + val.f = 0.0; + return val; +} + +g_val_t +cpu_intr_func ( void ) +{ + g_val_t val; + + val.f = (float) cpu_state(3); + + return val; +} + +/* +** FIXME - This metric is not valid on FreeBSD. +*/ +g_val_t +cpu_sintr_func ( void ) +{ + g_val_t val; + val.f = 0.0; + return val; +} + +g_val_t +load_one_func ( void ) +{ + g_val_t val; + double load[3]; + + getloadavg(load, 3); + val.f = load[0]; + + return val; +} + +g_val_t +load_five_func ( void ) +{ + g_val_t val; + double load[3]; + + getloadavg(load, 3); + val.f = load[1]; + + return val; +} + +g_val_t +load_fifteen_func ( void ) +{ + g_val_t val; + double load[3]; + + getloadavg(load, 3); + val.f = load[2]; + + return val; +} + +g_val_t +proc_total_func ( void ) +{ + g_val_t val; + size_t len = 0; + + sysctlbyname("kern.proc.all", NULL, &len, NULL, 0); + + val.uint32 = (len / sizeof (struct kinfo_proc)); + + return val; +} + + +g_val_t +proc_run_func( void ) +{ + struct kinfo_proc *kp; + int i; + int state; + int nentries; + int what = KERN_PROC_ALL; + g_val_t val; + + val.uint32 = 0; + + if (kd == NULL) + goto output; +#ifdef KERN_PROC_NOTHREADS + what |= KERN_PROC_NOTHREADS +#endif + if ((kp = kvm_getprocs(kd, what, 0, &nentries)) == 0 || nentries < 0) + goto output; + + for (i = 0; i < nentries; kp++, i++) { +#ifdef KINFO_PROC_SIZE + state = kp->ki_stat; +#else + state = kp->kp_proc.p_stat; +#endif + switch(state) { + case SRUN: + case SIDL: + val.uint32++; + break; + } + } + + if (val.uint32 > 0) + val.uint32--; + +output: + return val; +} + +/* +** FIXME - The whole ganglia model of memory is bogus. Free memory is +** generally a bad idea with a modern VM and so is reporting it. There +** is simply no way to report a value for "free" memory that makes any +** kind of sense. Free+inactive might be a decent value for "free". +*/ +g_val_t +mem_free_func ( void ) +{ + g_val_t val; + size_t len; + int free_pages; + + len = sizeof (free_pages); + if((sysctlbyname("vm.stats.vm.v_free_count", &free_pages, &len, NULL, 0) + == -1) || !len) free_pages = 0; + + val.uint32 = free_pages * (pagesize / 1024); + return val; +} + +/* +** FreeBSD don't seem to report this anywhere. It's actually quite +** complicated as there is SysV shared memory, POSIX shared memory, +** and mmap shared memory at a minimum. +*/ +g_val_t +mem_shared_func ( void ) +{ + g_val_t val; + + val.uint32 = 0; + + return val; +} + +/* +** FIXME - this isn't really valid. It lists some VFS buffer space, +** but the real picture is much more complex. +*/ +g_val_t +mem_buffers_func ( void ) +{ + g_val_t val; + size_t len; + int buffers; + + len = sizeof (buffers); + if((sysctlbyname("vfs.bufspace", &buffers, &len, NULL, 0) == -1) || !len) + buffers = 0; + buffers /= 1024; + + val.uint32 = buffers; + return val; +} + +/* +** FIXME - this isn't really valid. It lists some VM cache space, +** but the real picture is more complex. +*/ +g_val_t +mem_cached_func ( void ) +{ + g_val_t val; + size_t len; + int cache; + + len = sizeof (cache); + if((sysctlbyname("vm.stats.vm.v_cache_count", &cache, &len, NULL, 0) == -1) + || !len) + cache = 0; + + val.uint32 = cache * (pagesize / 1024); + return val; +} + +g_val_t +swap_free_func ( void ) +{ + g_val_t val; + + struct kvm_swap swap[1]; + struct xswdev xsw; + size_t size; + int totswap, usedswap, freeswap, n; + val.uint32 = 0; + totswap = 0; + usedswap = 0; + if (use_vm_swap_info) { + for (n = 0; ; ++n) { + mibswap[mibswap_size] = n; + size = sizeof(xsw); + if (sysctl(mibswap, mibswap_size + 1, &xsw, &size, NULL, 0) == -1) + break; + if (xsw.xsw_version != XSWDEV_VERSION) + return val; + totswap += xsw.xsw_nblks; + usedswap += xsw.xsw_used; + } + } else if(kd != NULL) { + n = kvm_getswapinfo(kd, swap, 1, 0); + totswap = swap[0].ksw_total; + usedswap = swap[0].ksw_used; + } + freeswap = totswap - usedswap; + val.uint32 = freeswap * (pagesize / 1024); + return val; +} + + +g_val_t +mtu_func ( void ) +{ + /* We want to find the minimum MTU (Max packet size) over all UP interfaces. +*/ + g_val_t val; + val.uint32 = get_min_mtu(); + /* A val of 0 means there are no UP interfaces. Shouldn't happen. */ + return val; +} + +g_val_t +pkts_in_func ( void ) +{ + double in_pkts; + g_val_t val; + + get_netbw(NULL, NULL, &in_pkts, NULL); + + val.f = (float)in_pkts; + return val; +} + +g_val_t +pkts_out_func ( void ) +{ + double out_pkts; + g_val_t val; + + get_netbw(NULL, NULL, NULL, &out_pkts); + + val.f = (float)out_pkts; + return val; +} + +g_val_t +bytes_out_func ( void ) +{ + double out_bytes; + g_val_t val; + + get_netbw(NULL, &out_bytes, NULL, NULL); + + val.f = (float)out_bytes; + return val; +} + +g_val_t +bytes_in_func ( void ) +{ + double in_bytes; + g_val_t val; + + get_netbw(&in_bytes, NULL, NULL, NULL); + + val.f = (float)in_bytes; + return val; +} + +/* + * Disk space reporting functions from Linux code. find_disk_space() + * body derived from FreeBSD df and mount code. + */ + +g_val_t +disk_free_func( void ) +{ + double total_free=0.0; + double total_size=0.0; + g_val_t val; + + find_disk_space(&total_size, &total_free); + + val.d = total_free; + return val; +} + +g_val_t +disk_total_func( void ) +{ + double total_free=0.0; + double total_size=0.0; + g_val_t val; + + find_disk_space(&total_size, &total_free); + + val.d = total_size; + return val; +} + +g_val_t +part_max_used_func( void ) +{ + double total_free=0.0; + double total_size=0.0; + float most_full; + g_val_t val; + + most_full = find_disk_space(&total_size, &total_free); + + val.f = most_full; + return val; +} + + +/* + * Copyright (c) 1980, 1983, 1990, 1993, 1994, 1995 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * + * NOTE: The copyright of UC Berkeley's Berkeley Software Distribution + * ("BSD") source has been updated. The copyright addendum may be found + * at ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change. + */ + +static float +find_disk_space(double *total, double *tot_avail) +{ + struct statfs *mntbuf; + const char *fstype; + const char **vfslist; + char *netvfslist; + size_t i, mntsize; + size_t used, availblks; + const double reported_units = 1e9; + double toru; + float pct; + float most_full = 0.0; + + *total = 0.0; + *tot_avail = 0.0; + + fstype = "ufs"; + + netvfslist = makenetvfslist(); + vfslist = makevfslist(netvfslist); + free(netvfslist); + + mntsize = getmntinfo(&mntbuf, MNT_NOWAIT); + mntsize = regetmntinfo(&mntbuf, mntsize, vfslist); + for (i = 0; i < mntsize; i++) { + if ((mntbuf[i].f_flags & MNT_IGNORE) == 0) { + used = mntbuf[i].f_blocks - mntbuf[i].f_bfree; + availblks = mntbuf[i].f_bavail + used; + pct = (availblks == 0 ? 100.0 : + (double)used / (double)availblks * 100.0); + if (pct > most_full) + most_full = pct; + + toru = reported_units/mntbuf[i].f_bsize; + *total += mntbuf[i].f_blocks / toru; + *tot_avail += mntbuf[i].f_bavail / toru; + } + } + + return most_full; +} + +/* + * Make a pass over the file system info in ``mntbuf'' filtering out + * file system types not in vfslist and possibly re-stating to get + * current (not cached) info. Returns the new count of valid statfs bufs. + */ +static size_t +regetmntinfo(struct statfs **mntbufp, long mntsize, const char **vfslist) +{ + int i, j; + struct statfs *mntbuf; + + if (vfslist == NULL) + return (getmntinfo(mntbufp, MNT_WAIT)); + + mntbuf = *mntbufp; + for (j = 0, i = 0; i < mntsize; i++) { + if (checkvfsname(mntbuf[i].f_fstypename, vfslist)) + continue; + (void)statfs(mntbuf[i].f_mntonname,&mntbuf[j]); + j++; + } + return (j); +} + +static int +checkvfsname(vfsname, vfslist) + const char *vfsname; + const char **vfslist; +{ + + if (vfslist == NULL) + return (0); + while (*vfslist != NULL) { + if (strcmp(vfsname, *vfslist) == 0) + return (skipvfs); + ++vfslist; + } + return (!skipvfs); +} + +static const char ** +makevfslist(fslist) + char *fslist; +{ + const char **av; + int i; + char *nextcp; + + if (fslist == NULL) + return (NULL); + if (fslist[0] == 'n' && fslist[1] == 'o') { + fslist += 2; + skipvfs = 1; + } + for (i = 0, nextcp = fslist; *nextcp; nextcp++) + if (*nextcp == ',') + i++; + if ((av = malloc((size_t)(i + 2) * sizeof(char *))) == NULL) { + warnx("malloc failed"); + return (NULL); + } + nextcp = fslist; + i = 0; + av[i++] = nextcp; + while ((nextcp = strchr(nextcp, ',')) != NULL) { + *nextcp++ = '\0'; + av[i++] = nextcp; + } + av[i++] = NULL; + return (av); +} + +static char * +makenetvfslist(void) +{ + char *str = NULL, *strptr, **listptr = NULL; + size_t slen; + int cnt, i; + + int mib[3], maxvfsconf; + size_t miblen; + struct ovfsconf *ptr; + + mib[0] = CTL_VFS; mib[1] = VFS_GENERIC; mib[2] = VFS_MAXTYPENUM; + miblen=sizeof(maxvfsconf); + if (sysctl(mib, (unsigned int)(sizeof(mib) / sizeof(mib[0])), + &maxvfsconf, &miblen, NULL, 0)) { + warnx("sysctl failed"); + goto done; + } + + if ((listptr = malloc(sizeof(char*) * maxvfsconf)) == NULL) { + warnx("malloc failed"); + goto done; + } + + cnt = 0; + while ((ptr = getvfsent()) != NULL && cnt < maxvfsconf) { + if (ptr->vfc_flags & VFCF_NONLOCAL) + continue; + + listptr[cnt] = strdup(ptr->vfc_name); + if (listptr[cnt] == NULL) { + warnx("malloc failed"); + goto done; + } + cnt++; + } + + if (cnt == 0) + goto done; + + /* + * Count up the string lengths, we need a extra byte to hold + * the between entries ',' or the NUL at the end. + */ + for (i = 0; i < cnt; i++) + slen = strlen(listptr[i]) + 1; + /* Add 2 for initial "no". */ + slen += 2; + + if ((str = malloc(slen)) == NULL) { + warnx("malloc failed"); + goto done; + } + + str[0] = 'n'; + str[1] = 'o'; + for (i = 0, strptr = str + 2; i < cnt; i++, strptr++) { + strcpy(strptr, listptr[i]); + strptr += strlen(listptr[i]); + *strptr = ','; + } + *strptr = '\0'; + +done: + if (listptr != NULL) { + for(i = 0; i < cnt && listptr[i] != NULL; i++) + free(listptr[i]); + free(listptr); + } + return (str); + +} + +static void +get_netbw(double *in_bytes, double *out_bytes, + double *in_pkts, double *out_pkts) +{ +#ifdef NETBW_DEBUG + char name[IFNAMSIZ]; +#endif + struct if_msghdr *ifm, *nextifm; + struct sockaddr_dl *sdl; + char *buf, *lim, *next; + size_t needed; + int mib[6]; + int i; + int index; + static double ibytes, obytes, ipkts, opkts; + struct timeval this_time; + struct timeval time_diff; + struct traffic traffic; + static struct timeval last_time = {0,0}; + static int indexes = 0; + static int *seen = NULL; + static struct traffic *lastcount = NULL; + static double o_ibytes, o_obytes, o_ipkts, o_opkts; + + ibytes = obytes = ipkts = opkts = 0.0; + + mib[0] = CTL_NET; + mib[1] = PF_ROUTE; + mib[2] = 0; + mib[3] = 0; /* address family */ + mib[4] = NET_RT_IFLIST; + mib[5] = 0; /* interface index */ + + gettimeofday(&this_time, NULL); + timersub(&this_time, &last_time, &time_diff); + if (timertod(&time_diff) < MIN_NET_POLL_INTERVAL) { + goto output; + } + + if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) + errx(1, "iflist-sysctl-estimate"); + if ((buf = malloc(needed)) == NULL) + errx(1, "malloc"); + if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) + errx(1, "actual retrieval of interface table"); + lim = buf + needed; + + next = buf; + while (next < lim) { + + ifm = (struct if_msghdr *)next; + + if (ifm->ifm_type == RTM_IFINFO) { + sdl = (struct sockaddr_dl *)(ifm + 1); + } else { + fprintf(stderr, "out of sync parsing NET_RT_IFLIST\n"); + fprintf(stderr, "expected %d, got %d\n", RTM_IFINFO, + ifm->ifm_type); + fprintf(stderr, "msglen = %d\n", ifm->ifm_msglen); + fprintf(stderr, "buf:%p, next:%p, lim:%p\n", buf, next, + lim); + exit (1); + } + + next += ifm->ifm_msglen; + while (next < lim) { + nextifm = (struct if_msghdr *)next; + + if (nextifm->ifm_type != RTM_NEWADDR) + break; + + next += nextifm->ifm_msglen; + } + + if ((ifm->ifm_flags & IFF_LOOPBACK) || + !(ifm->ifm_flags & IFF_UP)) + continue; + + index = ifm->ifm_index; + + /* If we don't have a previous value yet, make a slot. */ + if (index >= indexes) { + seen = realloc(seen, sizeof(*seen)*(index+1)); + lastcount = realloc(lastcount, + sizeof(*lastcount)*(index+1)); + + /* Initalize the new slots */ + for (i = indexes; i <= index; i++) { + seen[i] = 0; + } + indexes = index+1; + } + + /* + * If this is the first time we've seen this interface, + * set the last values to the current ones. That causes + * us to see no bandwidth on the interface the first + * time, but that's OK. + */ + if (!seen[index]) { + seen[index] = 1; + lastcount[index].in_bytes = ifm->ifm_data.ifi_ibytes; + lastcount[index].out_bytes = ifm->ifm_data.ifi_obytes; + lastcount[index].in_pkts = ifm->ifm_data.ifi_ipackets; + lastcount[index].out_pkts = ifm->ifm_data.ifi_opackets; + } + + traffic.in_bytes = counterdiff(lastcount[index].in_bytes, + ifm->ifm_data.ifi_ibytes, ULONG_MAX, 0); + traffic.out_bytes = counterdiff(lastcount[index].out_bytes, + ifm->ifm_data.ifi_obytes, ULONG_MAX, 0); + traffic.in_pkts = counterdiff(lastcount[index].in_pkts, + ifm->ifm_data.ifi_ipackets, ULONG_MAX, 0); + traffic.out_pkts = counterdiff(lastcount[index].out_pkts, + ifm->ifm_data.ifi_opackets, ULONG_MAX, 0); + + lastcount[index].in_bytes = ifm->ifm_data.ifi_ibytes; + lastcount[index].out_bytes = ifm->ifm_data.ifi_obytes; + lastcount[index].in_pkts = ifm->ifm_data.ifi_ipackets; + lastcount[index].out_pkts = ifm->ifm_data.ifi_opackets; + +#ifdef NETBW_DEBUG + if_indextoname(index, name); + printf("%s: \n", name); + printf("\topackets=%llu ipackets=%llu\n", + traffic.out_pkts, traffic.in_pkts); + printf("\tobytes=%llu ibytes=%llu\n", + traffic.out_bytes, traffic.in_bytes); +#endif + + if (timerisset(&last_time)) { + ibytes += (double)traffic.in_bytes / timertod(&time_diff); + obytes += (double)traffic.out_bytes / timertod(&time_diff); + ipkts += (double)traffic.in_pkts / timertod(&time_diff); + opkts += (double)traffic.out_pkts / timertod(&time_diff); + } + } + free(buf); + + /* Save the values from this time */ + last_time = this_time; + o_ibytes = ibytes; + o_obytes = obytes; + o_ipkts = ipkts; + o_opkts = opkts; + +output: + if (in_bytes != NULL) + *in_bytes = o_ibytes; + if (out_bytes != NULL) + *out_bytes = o_obytes; + if (in_pkts != NULL) + *in_pkts = o_ipkts; + if (out_pkts != NULL) + *out_pkts = o_opkts; +} + +static uint64_t +counterdiff(uint64_t oldval, uint64_t newval, uint64_t maxval, uint64_t maxdiff) +{ + uint64_t diff; + + if (maxdiff == 0) + maxdiff = maxval; + + /* Paranoia */ + if (oldval > maxval || newval > maxval) + return 0; + + /* + * Tackle the easy case. Don't worry about maxdiff here because + * we're SOL if it happens (i.e. assuming a reset just makes + * matters worse). + */ + if (oldval <= newval) + return (newval - oldval); + + /* + * Now the tricky part. If we assume counters never get reset, + * this is easy. Unfortunaly, they do get reset on some + * systems, so we need to try and deal with that. Our huristic + * is that if out difference is greater then maxdiff and newval + * is less or equal to maxdiff, then we've probably been reset + * rather then actually wrapping. Obviously, you need to be + * careful to poll often enough that you won't exceed maxdiff or + * you will get undersized numbers when you do wrap. + */ + diff = maxval - oldval + newval; + if (diff > maxdiff && newval <= maxdiff) + return newval; + + return diff; +} diff --git a/parallel/ganglia-monitor-core/patches/patch-aa b/parallel/ganglia-monitor-core/patches/patch-aa index 9d18fd9234e..2ede38dde67 100644 --- a/parallel/ganglia-monitor-core/patches/patch-aa +++ b/parallel/ganglia-monitor-core/patches/patch-aa @@ -1,11 +1,19 @@ -$NetBSD: patch-aa,v 1.2 2005/02/10 02:33:53 jschauma Exp $ +$NetBSD: patch-aa,v 1.3 2006/04/30 22:28:44 joerg Exp $ --- srclib/libmetrics/configure.orig 2005-02-02 13:24:14.000000000 -0500 +++ srclib/libmetrics/configure 2005-02-07 22:39:36.000000000 -0500 -@@ -22271,6 +22271,14 @@ +@@ -22271,6 +22271,22 @@ cat >>confdefs.h <<\_ACEOF _ACEOF ;; ++*dragonfly*) OS="dragonfly" ++ varstatedir="/var/db" ++ ++cat >>confdefs.h <<\_ACEOF ++#define DRAGONFLY 1 ++_ACEOF ++ ++ ;; +*netbsd*) OS="netbsd" + varstatedir="/var/db" + @@ -17,12 +25,12 @@ $NetBSD: patch-aa,v 1.2 2005/02/10 02:33:53 jschauma Exp $ *cygwin*) OS="cygwin" cat >>confdefs.h <<\_ACEOF -@@ -22281,7 +22289,7 @@ +@@ -22281,7 +22297,7 @@ _ACEOF esac - ac_config_files="$ac_config_files Makefile tests/Makefile aix/Makefile cygwin/Makefile darwin/Makefile freebsd/Makefile hpux/Makefile irix/Makefile linux/Makefile osf/Makefile solaris/Makefile" -+ ac_config_files="$ac_config_files Makefile tests/Makefile aix/Makefile cygwin/Makefile darwin/Makefile freebsd/Makefile hpux/Makefile irix/Makefile linux/Makefile netbsd/Makefile osf/Makefile solaris/Makefile" ++ ac_config_files="$ac_config_files Makefile tests/Makefile aix/Makefile cygwin/Makefile darwin/Makefile dragonfly/Makefile freebsd/Makefile hpux/Makefile irix/Makefile linux/Makefile netbsd/Makefile osf/Makefile solaris/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure diff --git a/parallel/ganglia-monitor-core/patches/patch-am b/parallel/ganglia-monitor-core/patches/patch-am index 04e822e8be5..8d8d62f5768 100644 --- a/parallel/ganglia-monitor-core/patches/patch-am +++ b/parallel/ganglia-monitor-core/patches/patch-am @@ -1,4 +1,4 @@ -$NetBSD: patch-am,v 1.1 2005/02/10 02:33:53 jschauma Exp $ +$NetBSD: patch-am,v 1.2 2006/04/30 22:28:44 joerg Exp $ --- srclib/libmetrics/Makefile.in.orig 2005-02-07 22:33:09.000000000 -0500 +++ srclib/libmetrics/Makefile.in 2005-02-07 22:33:21.000000000 -0500 @@ -7,7 +7,7 @@ $NetBSD: patch-am,v 1.1 2005/02/10 02:33:53 jschauma Exp $ install_sh = @install_sh@ SUBDIRS = @OS@ . tests -DIST_SUBDIRS = aix cygwin darwin freebsd hpux irix linux osf solaris tests -+DIST_SUBDIRS = aix cygwin darwin freebsd hpux irix linux netbsd osf solaris tests ++DIST_SUBDIRS = aix cygwin darwin dragonfly freebsd hpux irix linux netbsd osf solaris tests #AM_CFLAGS = -I$(top_builddir)/lib diff --git a/parallel/ganglia-monitor-core/patches/patch-an b/parallel/ganglia-monitor-core/patches/patch-an index 25d39d15aa0..9fc123abe61 100644 --- a/parallel/ganglia-monitor-core/patches/patch-an +++ b/parallel/ganglia-monitor-core/patches/patch-an @@ -1,11 +1,11 @@ -$NetBSD: patch-an,v 1.1 2005/02/10 02:33:53 jschauma Exp $ +$NetBSD: patch-an,v 1.2 2006/04/30 22:28:44 joerg Exp $ --- srclib/libmetrics/Makefile.am.orig 2005-02-07 22:35:25.000000000 -0500 +++ srclib/libmetrics/Makefile.am 2005-02-07 22:35:58.000000000 -0500 @@ -1,5 +1,5 @@ SUBDIRS=@OS@ . tests -DIST_SUBDIRS= aix cygwin darwin freebsd hpux irix linux osf solaris tests -+DIST_SUBDIRS= aix cygwin darwin freebsd hpux irix linux netbsd osf solaris tests ++DIST_SUBDIRS= aix cygwin darwin dragonfly freebsd hpux irix linux netbsd osf solaris tests #AM_CFLAGS = -I$(top_builddir)/lib diff --git a/parallel/ganglia-monitor-core/patches/patch-ao b/parallel/ganglia-monitor-core/patches/patch-ao new file mode 100644 index 00000000000..955bc8195a1 --- /dev/null +++ b/parallel/ganglia-monitor-core/patches/patch-ao @@ -0,0 +1,13 @@ +$NetBSD: patch-ao,v 1.1 2006/04/30 22:28:44 joerg Exp $ + +--- lib/Makefile.in.orig 2006-04-30 18:38:28.000000000 +0000 ++++ lib/Makefile.in +@@ -107,7 +107,7 @@ am__quote = @am__quote@ + install_sh = @install_sh@ + varstatedir = @varstatedir@ + +-AM_CFLAGS = -I.. -I. -I$(top_builddir)/srclib/expat/lib/ -I$(top_builddir)/srclib/libmetrics/ -I$(top_builddir)/srclib/apr/include/ -I$(top_builddir)/srclib/apr/include/arch/unix/ -I$(top_builddir)/srclib/confuse/src ++AM_CFLAGS = -I.. -I. -I$(top_builddir)/srclib/libmetrics/ -I$(top_builddir)/srclib/confuse/src -I$(PREFIX)/include/apr-0 -I$(PREFIX)/include/apr-0/arch/unix + + include_HEADERS = ganglia.h + diff --git a/parallel/ganglia-monitor-core/patches/patch-ap b/parallel/ganglia-monitor-core/patches/patch-ap new file mode 100644 index 00000000000..d00148fc6ed --- /dev/null +++ b/parallel/ganglia-monitor-core/patches/patch-ap @@ -0,0 +1,30 @@ +$NetBSD: patch-ap,v 1.1 2006/04/30 22:28:44 joerg Exp $ + +--- gmond/gstat/Makefile.in.orig 2005-02-02 18:24:14.000000000 +0000 ++++ gmond/gstat/Makefile.in +@@ -103,13 +103,13 @@ am__include = @am__include@ + am__quote = @am__quote@ + install_sh = @install_sh@ + varstatedir = @varstatedir@ +-AM_CFLAGS = -I$(top_builddir)/lib -I$(top_builddir)/srclib/expat/lib/ ++AM_CFLAGS = -I$(top_builddir)/lib + + bin_PROGRAMS = gstat + gstat_SOURCES = gstat.c cmdline.c cmdline.h + gstat_LDADD = $(top_builddir)/lib/libganglia.la \ + $(top_builddir)/lib/libgetopthelper.a \ +- $(top_builddir)/srclib/expat/lib/libexpat.la ++ -L$(PREFIX)/lib -lexpat + + gstat_LDFLAGS = -static + subdir = gmond/gstat +@@ -122,8 +122,7 @@ PROGRAMS = $(bin_PROGRAMS) + am_gstat_OBJECTS = gstat.$(OBJEXT) cmdline.$(OBJEXT) + gstat_OBJECTS = $(am_gstat_OBJECTS) + gstat_DEPENDENCIES = $(top_builddir)/lib/libganglia.la \ +- $(top_builddir)/lib/libgetopthelper.a \ +- $(top_builddir)/srclib/expat/lib/libexpat.la ++ $(top_builddir)/lib/libgetopthelper.a + + DEFS = @DEFS@ + DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) diff --git a/parallel/ganglia-monitor-core/patches/patch-aq b/parallel/ganglia-monitor-core/patches/patch-aq new file mode 100644 index 00000000000..5ddc1e4aa8d --- /dev/null +++ b/parallel/ganglia-monitor-core/patches/patch-aq @@ -0,0 +1,30 @@ +$NetBSD: patch-aq,v 1.1 2006/04/30 22:28:44 joerg Exp $ + +--- gmond/Makefile.in.orig 2005-02-02 18:24:14.000000000 +0000 ++++ gmond/Makefile.in +@@ -107,8 +107,7 @@ SUBDIRS = gstat + + EXTRA_DIST = gmond.init gmond.conf.5 gmond.conf.html conf.pod + +-AM_CFLAGS = -I$(top_builddir)/lib -I$(top_builddir)/srclib/libmetrics/ -I$(top_builddir)/srclib/expat/lib/ -I$(top_builddir)/srclib/apr/include/ -I$(top_builddir)/srclib/confuse/src/ +- ++AM_CFLAGS = -I$(top_builddir)/lib -I$(top_builddir)/srclib/libmetrics/ -I$(top_builddir)/srclib/confuse/src/ -I$(PREFIX)/include/apr-0 + sbin_PROGRAMS = gmond + # metric.h and dtd.h are for gmetad/gmetric for now.... + gmond_SOURCES = gmond.c cmdline.c cmdline.h dtd.h metric.h g25_config.c g25_config.h +@@ -122,10 +121,13 @@ gmond_LDADD = $(top_builddir)/lib/libgan + $(top_builddir)/lib/libgetopthelper.a \ + $(top_builddir)/srclib/libmetrics/libmetrics.la \ + $(top_builddir)/srclib/confuse/src/libconfuse.la \ +- $(top_builddir)/srclib/apr/libapr-0.la ++ -lapr-0 + + gmond_LDFLAGS = -static +-gmond_DEPENDENCIES = $(gmond_LDADD) ++gmond_DEPENDENCIES = $(top_builddir)/lib/libganglia.la \ ++ $(top_builddir)/lib/libgetopthelper.a \ ++ $(top_builddir)/srclib/libmetrics/libmetrics.la \ ++ $(top_builddir)/srclib/confuse/src/libconfuse.la + subdir = gmond + mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs + CONFIG_HEADER = $(top_builddir)/config.h diff --git a/parallel/ganglia-monitor-core/patches/patch-ar b/parallel/ganglia-monitor-core/patches/patch-ar new file mode 100644 index 00000000000..ca261eb016d --- /dev/null +++ b/parallel/ganglia-monitor-core/patches/patch-ar @@ -0,0 +1,32 @@ +$NetBSD: patch-ar,v 1.1 2006/04/30 22:28:44 joerg Exp $ + +--- gmetad/Makefile.in.orig 2005-02-02 18:24:14.000000000 +0000 ++++ gmetad/Makefile.in +@@ -103,7 +103,7 @@ am__include = @am__include@ + am__quote = @am__quote@ + install_sh = @install_sh@ + varstatedir = @varstatedir@ +-AM_CFLAGS = -O0 -I$(top_builddir)/lib -I$(top_builddir)/gmond -I$(top_builddir)/srclib/expat/lib/ ++AM_CFLAGS = -O0 -I$(top_builddir)/lib -I$(top_builddir)/gmond + + sbin_PROGRAMS = gmetad + gmetad_SOURCES = gmetad.c cmdline.c cmdline.h gmetad.h data_thread.c \ +@@ -111,7 +111,7 @@ gmetad_SOURCES = gmetad.c cmdline.c cmdl + xml_hash.c cleanup.c + + gmetad_LDADD = $(top_builddir)/lib/libganglia.la -lrrd -lm \ +- $(top_builddir)/srclib/expat/lib/libexpat.la ++ -L$(PREFIX)/lib -lexpat + + gmetad_LDFLAGS = -static + EXTRA_DIST = gmetad.conf gmetad.init +@@ -127,8 +127,7 @@ am_gmetad_OBJECTS = gmetad.$(OBJEXT) cmd + rrd_helpers.$(OBJEXT) conf.$(OBJEXT) type_hash.$(OBJEXT) \ + xml_hash.$(OBJEXT) cleanup.$(OBJEXT) + gmetad_OBJECTS = $(am_gmetad_OBJECTS) +-gmetad_DEPENDENCIES = $(top_builddir)/lib/libganglia.la \ +- $(top_builddir)/srclib/expat/lib/libexpat.la ++gmetad_DEPENDENCIES = $(top_builddir)/lib/libganglia.la + + DEFS = @DEFS@ + DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) diff --git a/parallel/ganglia-monitor-core/patches/patch-as b/parallel/ganglia-monitor-core/patches/patch-as new file mode 100644 index 00000000000..b5b95865bbf --- /dev/null +++ b/parallel/ganglia-monitor-core/patches/patch-as @@ -0,0 +1,45 @@ +$NetBSD: patch-as,v 1.1 2006/04/30 22:28:44 joerg Exp $ + +--- configure.orig 2005-02-02 18:24:14.000000000 +0000 ++++ configure +@@ -2029,14 +2029,6 @@ echo $ac_n "${nl}Configuring libmetrics + cd srclib/libmetrics && ./configure --cache-file=$ganglia_popdir/config.cache + cd $ganglia_popdir + +-echo $ac_n "${nl}Configuring expat ...${nl}" +-cd srclib/expat && ./configure --cache-file=$ganglia_popdir/config.cache +-cd $ganglia_popdir +- +-echo $ac_n "${nl}Configuring apr ...${nl}" +-cd srclib/apr && ./configure --cache-file=$ganglia_popdir/config.cache +-cd $ganglia_popdir +- + echo $ac_n "${nl}Configuring libconfuse ...${nl}" + cd srclib/confuse && ./configure --cache-file=$ganglia_popdir/config.cache --disable-nls + cd $ganglia_popdir +@@ -18734,13 +18726,13 @@ if test "${enable_memcheck+set}" = set; + fi; + + +-echo "$as_me:$LINENO: checking for pthread_create in -lpthread" >&5 +-echo $ECHO_N "checking for pthread_create in -lpthread... $ECHO_C" >&6 ++echo "$as_me:$LINENO: checking for pthread_create in ${PTHREAD_LDFLAGS} ${PTHREAD_LIBS}" >&5 ++echo $ECHO_N "checking for pthread_create in ${PTHREAD_LDFLAGS} ${PTHREAD_LIBS}... $ECHO_C" >&6 + if test "${ac_cv_lib_pthread_pthread_create+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + ac_check_lib_save_LIBS=$LIBS +-LIBS="-lpthread $LIBS" ++LIBS="${PTHREAD_LDFLAGS} ${PTHREAD_LIBS} $LIBS" + cat >conftest.$ac_ext <<_ACEOF + #line $LINENO "configure" + /* confdefs.h. */ +@@ -18793,7 +18785,7 @@ if test $ac_cv_lib_pthread_pthread_creat + #define HAVE_LIBPTHREAD 1 + _ACEOF + +- LIBS="-lpthread $LIBS" ++ LIBS="${PTHREAD_LDFLAGS} ${PTHREAD_LIBS} $LIBS" + + fi + diff --git a/parallel/ganglia-monitor-core/patches/patch-at b/parallel/ganglia-monitor-core/patches/patch-at new file mode 100644 index 00000000000..12f684e2cf3 --- /dev/null +++ b/parallel/ganglia-monitor-core/patches/patch-at @@ -0,0 +1,13 @@ +$NetBSD: patch-at,v 1.1 2006/04/30 22:28:44 joerg Exp $ + +--- srclib/Makefile.in.orig 2006-04-30 19:41:17.000000000 +0000 ++++ srclib/Makefile.in +@@ -103,7 +103,7 @@ am__include = @am__include@ + am__quote = @am__quote@ + install_sh = @install_sh@ + varstatedir = @varstatedir@ +-SUBDIRS = libmetrics expat apr confuse ++SUBDIRS = libmetrics confuse + subdir = srclib + mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs + CONFIG_HEADER = $(top_builddir)/config.h diff --git a/parallel/ganglia-monitor-core/patches/patch-au b/parallel/ganglia-monitor-core/patches/patch-au new file mode 100644 index 00000000000..33179767ef5 --- /dev/null +++ b/parallel/ganglia-monitor-core/patches/patch-au @@ -0,0 +1,23 @@ +$NetBSD: patch-au,v 1.1 2006/04/30 22:28:44 joerg Exp $ + +--- gmetric/Makefile.in.orig 2005-02-02 18:24:14.000000000 +0000 ++++ gmetric/Makefile.in +@@ -111,7 +111,7 @@ gmetric_LDADD = $(top_builddir)/lib/libg + $(top_builddir)/lib/libgetopthelper.a \ + $(top_builddir)/srclib/libmetrics/libmetrics.la \ + $(top_builddir)/srclib/confuse/src/libconfuse.la \ +- $(top_builddir)/srclib/apr/libapr-0.la ++ -lapr-0 + + gmetric_LDFLAGS = -static + subdir = gmetric +@@ -126,8 +126,7 @@ gmetric_OBJECTS = $(am_gmetric_OBJECTS) + gmetric_DEPENDENCIES = $(top_builddir)/lib/libganglia.la \ + $(top_builddir)/lib/libgetopthelper.a \ + $(top_builddir)/srclib/libmetrics/libmetrics.la \ +- $(top_builddir)/srclib/confuse/src/libconfuse.la \ +- $(top_builddir)/srclib/apr/libapr-0.la ++ $(top_builddir)/srclib/confuse/src/libconfuse.la + + DEFS = @DEFS@ + DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) |