ports/58657: [maintainer update] sysutils/ganglia-monitor-core
Brooks Davis
brooks at one-eye-alien.net
Tue Oct 28 23:30:26 UTC 2003
>Number: 58657
>Category: ports
>Synopsis: [maintainer update] sysutils/ganglia-monitor-core
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: maintainer-update
>Submitter-Id: current-users
>Arrival-Date: Tue Oct 28 15:30:21 PST 2003
>Closed-Date:
>Last-Modified:
>Originator: Brooks Davis
>Release: FreeBSD 5.1-CURRENT i386
>Organization:
Aerospace Corp.
>Environment:
System: FreeBSD minya.sea.one-eyed-alien.net 5.1-CURRENT FreeBSD 5.1-CURRENT #0: Mon Oct 13 21:07:30 PDT 2003 brooks at minya.sea.one-eyed-alien.net:/usr/obj/usr/home/brooks/working/freebsd/p4/xname/sys/GENERIC i386
>Description:
Update to Ganglia Monitor Core 2.5.4, plus enhancements bringing
FreeBSD support up to the level of Linux support.
>How-To-Repeat:
>Fix:
The following files are deleted:
files/patch-gmetad_gmetad.c
files/patch-gmond_gmond.c
files/patch-lib_Makefile.in
The following are added:
files/patch-config.h.in
files/patch-configure
files/patch-gmetad_conf.c
files/patch-gmond_key__metrics.h
files/patch-gmond_metric.h
files/patch-lib_ganglia_net.h
We patch configure rather then using autoconf since the auto* files
depend on automake 1.6 and the configure changes will be in the next
release.
Index: Makefile
===================================================================
RCS file: /usr/cvs/ports/sysutils/ganglia-monitor-core/Makefile,v
retrieving revision 1.2
diff -u -p -u -r1.2 Makefile
--- Makefile 7 Jun 2003 12:59:36 -0000 1.2
+++ Makefile 28 Oct 2003 20:01:35 -0000
@@ -6,7 +6,7 @@
#
PORTNAME= ganglia-monitor-core
-PORTVERSION= 2.5.3
+PORTVERSION= 2.5.4
CATEGORIES= sysutils net parallel
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE}
MASTER_SITE_SUBDIR= ganglia
@@ -24,7 +24,6 @@ LIB_DEPENDS= rrd.0:${PORTSDIR}/net/rrdto
GNU_CONFIGURE= yes
CONFIGURE_ENV= CPPFLAGS="-I${LOCALBASE}/include" \
LIBS="-L${LOCALBASE}/lib"
-CONFIGURE_ARGS+= --includedir=${PREFIX}/include/ganglia
.if !defined (WITHOUT_GMETAD)
CONFIGURE_ARGS+= --with-gmetad
.endif
Index: distinfo
===================================================================
RCS file: /usr/cvs/ports/sysutils/ganglia-monitor-core/distinfo,v
retrieving revision 1.2
diff -u -p -u -r1.2 distinfo
--- distinfo 7 Jun 2003 12:59:36 -0000 1.2
+++ distinfo 28 Oct 2003 00:31:01 -0000
@@ -1 +1 @@
-MD5 (ganglia-monitor-core-2.5.3.tar.gz) = c6bd5f5d21b3b84286d474f7e57f5101
+MD5 (ganglia-monitor-core-2.5.4.tar.gz) = 354b18077ba33738af5bcb9539ae854d
Index: pkg-plist
===================================================================
RCS file: /usr/cvs/ports/sysutils/ganglia-monitor-core/pkg-plist,v
retrieving revision 1.2
diff -u -p -u -r1.2 pkg-plist
--- pkg-plist 7 Jun 2003 12:59:36 -0000 1.2
+++ pkg-plist 28 Oct 2003 19:33:38 -0000
@@ -5,7 +5,7 @@ etc/gmond.conf.sample
%%GMETAD%%etc/gmetad.conf.sample
etc/rc.d/gmond.sh.sample
%%GMETAD%%etc/rc.d/gmetad.sh.sample
-include/ganglia/ganglia.h
+include/ganglia.h
include/ganglia/ascii.h
include/ganglia/asciitab.h
include/ganglia/daemon_inetd.h
Index: files/patch-gmetad_gmetad.conf
===================================================================
RCS file: /usr/cvs/ports/sysutils/ganglia-monitor-core/files/patch-gmetad_gmetad.conf,v
retrieving revision 1.1
diff -u -p -u -r1.1 patch-gmetad_gmetad.conf
--- files/patch-gmetad_gmetad.conf 2 Mar 2003 00:24:16 -0000 1.1
+++ files/patch-gmetad_gmetad.conf 28 Oct 2003 19:11:37 -0000
@@ -1,12 +1,12 @@
-$FreeBSD: ports/sysutils/ganglia-monitor-core/files/patch-gmetad_gmetad.conf,v 1.1 2003/03/02 00:24:16 kris Exp $
+$FreeBSD$
---- gmetad/gmetad.conf.orig Wed Jan 29 10:17:02 2003
-+++ gmetad/gmetad.conf Fri Feb 21 11:52:58 2003
-@@ -55,9 +55,9 @@
- # default: on
+--- gmetad/gmetad.conf.orig Mon May 12 14:58:40 2003
++++ gmetad/gmetad.conf Tue Oct 28 11:11:03 2003
+@@ -80,9 +80,9 @@
# setuid off
#
+ #-------------------------------------------------------------------------------
-# User gmetad will setuid to (defaults to "nobody")
-# default: "nobody"
-# setuid_username "nobody"
@@ -14,5 +14,5 @@ $FreeBSD: ports/sysutils/ganglia-monitor
+# default: "ganglia"
+# setuid_username "ganglia"
#
+ #-------------------------------------------------------------------------------
# The port gmetad will answer requests for XML
- # default: 8651
Index: files/patch-gmond_machines_freebsd.c
===================================================================
RCS file: /usr/cvs/ports/sysutils/ganglia-monitor-core/files/patch-gmond_machines_freebsd.c,v
retrieving revision 1.1
diff -u -p -u -r1.1 patch-gmond_machines_freebsd.c
--- files/patch-gmond_machines_freebsd.c 7 Jun 2003 12:59:36 -0000 1.1
+++ files/patch-gmond_machines_freebsd.c 28 Oct 2003 01:02:58 -0000
@@ -1,176 +1,748 @@
-$FreeBSD: ports/sysutils/ganglia-monitor-core/files/patch-gmond_machines_freebsd.c,v 1.1 2003/06/07 12:59:36 naddy Exp $
+$FreeBSD$
---- gmond/machines/freebsd.c.orig Thu Aug 15 10:17:25 2002
-+++ gmond/machines/freebsd.c Wed May 28 12:51:18 2003
-@@ -10,11 +10,36 @@
+--- gmond/machines/freebsd.c.orig Tue Jul 29 10:56:38 2003
++++ gmond/machines/freebsd.c Mon Oct 27 17:02:26 2003
+@@ -9,9 +9,11 @@
+ */
+
+ #include <kvm.h>
+-#include <fcntl.h>
++
#include <sys/param.h>
++#include <sys/mount.h>
#include <sys/sysctl.h>
++#include <sys/time.h>
#include <sys/user.h>
-+#if __FreeBSD_version < 500101
+ #if __FreeBSD_version < 500101
#include <sys/dkstat.h>
-+#else
-+#include <sys/resource.h>
-+#endif
-+#include <sys/stat.h>
-+#include <vm/vm_param.h>
+@@ -20,12 +22,35 @@
+ #endif
+ #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 "dnet.h"
#include "ganglia.h"
#include "metric_typedefs.h"
-+#define MIB_SWAPINFO_SIZE 3
+ #define MIB_SWAPINFO_SIZE 3
+
++#ifndef MIN_NET_POLL_INTERVAL
++#define MIN_NET_POLL_INTERVAL 0.5
++#endif
+
-+#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;
-+};
++#ifndef UINT64_MAX
++#define UINT64_MAX ULLONG_MAX
+#endif
+
-+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;
++#define timertod(tvp) \
++ ((double)(tvp)->tv_sec + (double)(tvp)->tv_usec/(1000*1000))
++
+ #ifndef XSWDEV_VERSION
+ #define XSWDEV_VERSION 1
+ struct xswdev {
+@@ -37,14 +62,32 @@
+ };
+ #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;
+
/* Function prototypes */
- long percentages(int cnt, int *out, register long *new,
+-long percentages(int cnt, int *out, register long *new,
++static long percentages(int cnt, int *out, register long *new,
register long *old, long *diffs);
-@@ -27,6 +52,19 @@
- metric_init(void)
- {
- g_val_t val;
-+
+
+ /*
+@@ -64,10 +107,25 @@
+ if (sysctlnametomib("vm.swap_info", mibswap, &mibswap_size) == -1) {
+ kd = kvm_open(NULL, NULL, NULL, O_RDONLY, "metric_init()");
+ } else {
++ /*
++ * Versions of FreeBSD with the swap mib generally 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. This is
++ * bogus, but only a few pre-release versions of 5.0 are
++ * affected by the bogosity and people running those should
++ * upgrade.
++ */
++ kd = kvm_open(_PATH_DEVNULL, NULL, NULL, O_RDONLY, "metric_init()");
+ use_vm_swap_info = 1;
+ }
+ pagesize = getpagesize();
+
+ /*
-+ * 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.
++ * Call get_netbw once to initalize the counters.
+ */
-+ 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 {
-+ use_vm_swap_info = 1;
-+ }
-+ pagesize = getpagesize();
++
++ get_netbw(NULL, NULL, NULL, NULL);
+
val.int32 = SYNAPSE_SUCCESS;
return val;
}
-@@ -81,21 +119,33 @@
- swap_total_func ( void )
- {
+@@ -124,7 +182,7 @@
g_val_t val;
--
struct kvm_swap swap[1];
-- kvm_t *kd;
-+ struct xswdev xsw;
-+ size_t mibsize, size;
+ struct xswdev xsw;
+- size_t mibsize, size;
++ size_t size;
int totswap, n;
+ val.uint32 = 0;
+ totswap = 0;
+@@ -366,9 +424,41 @@
+ 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;
-- kd = kvm_open(NULL, NULL, NULL, O_RDONLY, "kvm_open");
-- n = kvm_getswapinfo(kd, swap, 1, 0);
-- if (n < 0 || swap[0].ksw_total == 0) {
-- val.uint32 = 0;
-+ 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, NULL) == -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;
+ 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;
+ }
-+ totswap = swap[0].ksw_total;
- }
-- totswap = swap[0].ksw_total;
-- totswap *= getpagesize() / 1024;
-- val.uint32 = totswap;
-- kvm_close(kd);
-
-+ val.uint32 = totswap * (pagesize / 1024);
++ }
++
++ if (val.uint32 > 0)
++ val.uint32--;
++
++output:
return val;
}
-@@ -330,9 +380,8 @@
- len = sizeof (free_pages);
- if((sysctlbyname("vm.stats.vm.v_free_count", &free_pages, &len, NULL, 0)
- == -1) || !len) free_pages = 0;
-- free_pages *= getpagesize() / 1024;
-
-- val.uint32 = free_pages;
-+ val.uint32 = free_pages * (pagesize / 1024);
+@@ -461,7 +551,6 @@
return val;
}
-@@ -373,9 +422,7 @@
- || !len)
- cache = 0;
-
-- cache *= getpagesize() / 1024;
--
-- val.uint32 = cache;
-+ val.uint32 = cache * (pagesize / 1024);
- return val;
- }
+-#include "dnet.h"
-@@ -383,23 +430,35 @@
- swap_free_func ( void )
- {
- g_val_t val;
-+
- struct kvm_swap swap[1];
-- kvm_t *kd;
-+ struct xswdev xsw;
-+ size_t size;
- int totswap, usedswap, freeswap, n;
-
-- kd = kvm_open(NULL, NULL, NULL, O_RDONLY, "kvm_open");
-- n = kvm_getswapinfo(kd, swap, 1, 0);
-- if (n < 0 || swap[0].ksw_total == 0) {
-- val.uint32 = 0;
-- }
-- totswap = swap[0].ksw_total;
-- usedswap = swap[0].ksw_used;
-- kvm_close(kd);
-+ val.uint32 = 0;
-+ totswap = 0;
-+ usedswap = 0;
-
-- freeswap = totswap-usedswap;
-- freeswap *= getpagesize() / 1024;
-+ 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, NULL) == -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;
-+ val.uint32 = freeswap * (pagesize / 1024);
- return val;
+ static int
+ find_mtu(const struct intf_entry *entry, void *arg)
+@@ -509,8 +598,8 @@
+ * $FreeBSD: src/usr.bin/top/machine.c,v 1.29.2.2 2001/07/31 20:27:05 tmm Exp $
+ */
+
+-long percentages(int cnt, int *out, register long *new,
+- register long *old, long *diffs) {
++static long percentages(int cnt, int *out, register long *new,
++ register long *old, long *diffs) {
+
+ register int i;
+ register long change;
+@@ -549,3 +638,563 @@
+ return(total_change);
}
++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;
++ 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";
++
++ vfslist = makevfslist(makenetvfslist());
++
++ 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)
++{
++#if __FreeBSD_version > 500000
++ char *str, *strptr, **listptr;
++ struct xvfsconf *xvfsp, *keep_xvfsp;
++ size_t buflen;
++ int cnt, i, maxvfsconf;
++
++ if (sysctlbyname("vfs.conflist", NULL, &buflen, NULL, 0) < 0) {
++ warn("sysctl(vfs.conflist)");
++ return (NULL);
++ }
++ xvfsp = malloc(buflen);
++ if (xvfsp == NULL) {
++ warnx("malloc failed");
++ return (NULL);
++ }
++ keep_xvfsp = xvfsp;
++ if (sysctlbyname("vfs.conflist", xvfsp, &buflen, NULL, 0) < 0) {
++ warn("sysctl(vfs.conflist)");
++ free(keep_xvfsp);
++ return (NULL);
++ }
++ maxvfsconf = buflen / sizeof(struct xvfsconf);
++
++ if ((listptr = malloc(sizeof(char*) * maxvfsconf)) == NULL) {
++ warnx("malloc failed");
++ free(keep_xvfsp);
++ return (NULL);
++ }
++
++ for (cnt = 0, i = 0; i < maxvfsconf; i++) {
++ if (xvfsp->vfc_flags & (VFCF_NETWORK|VFCF_SYNTHETIC|VFCF_LOOPBACK)) {
++ listptr[cnt++] = strdup(xvfsp->vfc_name);
++ if (listptr[cnt-1] == NULL) {
++ warnx("malloc failed");
++ free(listptr);
++ free(keep_xvfsp);
++ return (NULL);
++ }
++ }
++ xvfsp++;
++ }
++
++ if (cnt == 0 ||
++ (str = malloc(sizeof(char) * (32 * cnt + cnt + 2))) == NULL) {
++ if (cnt > 0)
++ warnx("malloc failed");
++ free(listptr);
++ free(keep_xvfsp);
++ return (NULL);
++ }
++
++ *str = 'n'; *(str + 1) = 'o';
++ for (i = 0, strptr = str + 2; i < cnt; i++, strptr++) {
++ strncpy(strptr, listptr[i], 32);
++ strptr += strlen(listptr[i]);
++ *strptr = ',';
++ free(listptr[i]);
++ }
++ *(--strptr) = NULL;
++
++ free(keep_xvfsp);
++#else
++ char *str, *strptr, **listptr;
++ int mib[3], maxvfsconf, cnt=0, i;
++ 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");
++ return (NULL);
++ }
++
++ if ((listptr = malloc(sizeof(char*) * maxvfsconf)) == NULL) {
++ warnx("malloc failed");
++ return (NULL);
++ }
++
++ for (ptr = getvfsent(); ptr; ptr = getvfsent())
++ if (ptr->vfc_flags & (VFCF_NETWORK|VFCF_SYNTHETIC|VFCF_LOOPBACK)) {
++ listptr[cnt++] = strdup(ptr->vfc_name);
++ if (listptr[cnt-1] == NULL) {
++ warnx("malloc failed");
++ return (NULL);
++ }
++ }
++
++ if (cnt == 0 ||
++ (str = malloc(sizeof(char) * (32 * cnt + cnt + 2))) == NULL) {
++ if (cnt > 0)
++ warnx("malloc failed");
++ free(listptr);
++ return (NULL);
++ }
++
++ *str = 'n'; *(str + 1) = 'o';
++ for (i = 0, strptr = str + 2; i < cnt; i++, strptr++) {
++ strncpy(strptr, listptr[i], 32);
++ strptr += strlen(listptr[i]);
++ *strptr = ',';
++ free(listptr[i]);
++ }
++ *(--strptr) = NULL;
++
++#endif
++ 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;
++}
--- /dev/null Tue Oct 28 15:00:01 2003
+++ files/patch-config.h.in Tue Oct 28 14:41:59 2003
@@ -0,0 +1,16 @@
+
+$FreeBSD$
+
+--- config.h.in.orig Tue Oct 28 14:41:30 2003
++++ config.h.in Tue Oct 28 14:41:41 2003
+@@ -3,8 +3,8 @@
+ /* AIX */
+ #undef AIX
+
+-/* BSD */
+-#undef BSD
++/* FREEBSD */
++#undef FREEBSD
+
+ /* CPU_VENDOR_OS */
+ #undef CPU_VENDOR_OS
--- /dev/null Tue Oct 28 15:00:01 2003
+++ files/patch-configure Mon Oct 27 16:52:43 2003
@@ -0,0 +1,14 @@
+
+$FreeBSD$
+
+--- configure.orig Mon Oct 27 16:51:34 2003
++++ configure Mon Oct 27 16:52:23 2003
+@@ -11458,7 +11458,7 @@
+
+
+ cat >>confdefs.h <<\_ACEOF
+-#define BSD 1
++#define FREEBSD 1
+ _ACEOF
+ ;;
+ *cygwin*) metric_source="cygwin.c"
--- /dev/null Tue Oct 28 15:00:01 2003
+++ files/patch-gmetad_conf.c Tue Oct 28 11:11:30 2003
@@ -0,0 +1,14 @@
+
+$FreeBSD$
+
+--- gmetad/conf.c.orig Tue May 27 11:02:49 2003
++++ gmetad/conf.c Tue Oct 28 11:10:08 2003
+@@ -251,7 +251,7 @@
+ config->trusted_hosts = NULL;
+ config->debug_level = 0;
+ config->should_setuid = 1;
+- config->setuid_username = "nobody";
++ config->setuid_username = "ganglia";
+ config->rrd_rootdir = "/var/lib/ganglia/rrds";
+ config->scalable_mode = 1;
+ config->all_trusted = 0;
--- /dev/null Tue Oct 28 15:00:01 2003
+++ files/patch-gmond_key__metrics.h Mon Oct 27 16:48:42 2003
@@ -0,0 +1,21 @@
+
+$FreeBSD$
+
+--- gmond/key_metrics.h.orig Mon Oct 27 16:47:42 2003
++++ gmond/key_metrics.h Mon Oct 27 16:48:12 2003
+@@ -69,6 +69,15 @@
+ cpu_avm,
+ cpu_vm,
+ #endif
++#ifdef FREEBSD
++ bytes_in,
++ bytes_out,
++ pkts_in,
++ pkts_out,
++ disk_total,
++ disk_free,
++ part_max_used,
++#endif
+ num_key_metrics
+ } key_metrics;
+ #endif
--- /dev/null Tue Oct 28 15:00:01 2003
+++ files/patch-gmond_metric.h Mon Oct 27 16:48:58 2003
@@ -0,0 +1,65 @@
+
+$FreeBSD$
+
+--- gmond/metric.h.orig Mon Oct 27 16:47:53 2003
++++ gmond/metric.h Mon Oct 27 16:48:15 2003
+@@ -88,6 +88,18 @@
+
+ #endif
+
++#ifdef FREEBSD
++
++extern g_val_t bytes_in_func(void);
++extern g_val_t bytes_out_func(void);
++extern g_val_t pkts_in_func(void);
++extern g_val_t pkts_out_func(void);
++extern g_val_t disk_total_func(void);
++extern g_val_t disk_free_func(void);
++extern g_val_t part_max_used_func(void);
++
++#endif
++
+ #define INIT 0, 0, {0}, {0}
+ #define KEY(NAME) { #NAME, NAME ##_func, INIT
+
+@@ -182,7 +194,8 @@
+ KEY(pkts_in), 256, 30, 40, 200, 300, g_float, "packets/sec", "%.2f" },
+ KEY(pkts_out), 256, 30, 40, 200, 300, g_float, "packets/sec", "%.2f" },
+
+-/* The amount of disk space could change - hot-swap, mounts, etc. check: 30-60min. */
++/*
++ * The amount of disk space could change - hot-swap, mounts, etc. check: 30-60min. */
+ KEY(disk_total), 1, 1800, 3600, 900, 1200, g_double, "GB", "%.3f" },
+ KEY(disk_free), 1, 30, 40, 120, 180, g_double, "GB", "%.3f" },
+ KEY(part_max_used), 1, 30, 40, 120, 180, g_float, "%", "%.1f" }
+@@ -198,6 +211,30 @@
+ KEY(mem_rm), 1024, 30, 40, 120, 180, g_uint32, "KB", "%u" },
+ KEY(mem_avm), 1024, 30, 40, 120, 180, g_uint32, "KB", "%u" },
+ KEY(mem_vm), 1024, 30, 40, 120, 180, g_uint32, "KB", "%u" }
++
++#endif
++
++#ifdef FREEBSD
++
++,
++/*
++ * (sacerdoti) Experiments have shown gmon resting bandwidth is around
++ * 2KB/s for a 128-node cluster. We set the value thresh of these
++ * metrics to double that.
++ *
++ */
++KEY(bytes_out), 4096, 30, 40, 200, 300, g_float, "bytes/sec", "%.2f" },
++KEY(bytes_in), 4096, 30, 40, 200, 300, g_float, "bytes/sec", "%.2f" },
++KEY(pkts_in), 256, 30, 40, 200, 300, g_float, "packets/sec", "%.2f" },
++KEY(pkts_out), 256, 30, 40, 200, 300, g_float, "packets/sec", "%.2f" },
++
++/*
++ * The amount of disk space could change - hot-swap, mounts, etc.
++ * check: 30-60min.
++ */
++KEY(disk_total), 1, 1800, 3600, 900, 1200, g_double, "GB", "%.3f" },
++KEY(disk_free), 1, 30, 40, 120, 180, g_double, "GB", "%.3f" },
++KEY(part_max_used), 1, 30, 40, 120, 180, g_float, "%", "%.1f" }
+
+ #endif
+ };
--- /dev/null Tue Oct 28 15:11:00 2003
+++ files/patch-lib_ganglia_net.h Mon Oct 27 16:57:09 2003
@@ -0,0 +1,14 @@
+
+$FreeBSD$
+
+--- lib/ganglia/net.h.orig Mon Oct 27 16:53:00 2003
++++ lib/ganglia/net.h Mon Oct 27 16:53:07 2003
+@@ -12,7 +12,7 @@
+ #include <netdb.h>
+ #include <ganglia/llist.h>
+ #include <ganglia/net.h>
+-#ifdef BSD
++#ifdef FREEBSD
+ #include <sys/types.h>
+ #endif
+ #include <netinet/in.h>
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list